diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..e1b583d9c --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +/.idea/ +/.gradle/ +/testbed/ +/build/ +gradle.properties \ No newline at end of file diff --git a/.idea/libraries/Maven__org_bukkit_bukkit_1_12_2_R0_1_SNAPSHOT.xml b/.idea/libraries/Maven__org_bukkit_bukkit_1_12_2_R0_1_SNAPSHOT.xml deleted file mode 100644 index 49760b2e5..000000000 --- a/.idea/libraries/Maven__org_bukkit_bukkit_1_12_2_R0_1_SNAPSHOT.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_spigotmc_spigot_api_1_12_2_R0_1_SNAPSHOT.xml b/.idea/libraries/Maven__org_spigotmc_spigot_api_1_12_2_R0_1_SNAPSHOT.xml deleted file mode 100644 index 42f0d6f90..000000000 --- a/.idea/libraries/Maven__org_spigotmc_spigot_api_1_12_2_R0_1_SNAPSHOT.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/libraries/Maven__org_yaml_snakeyaml_1_19.xml b/.idea/libraries/Maven__org_yaml_snakeyaml_1_19.xml deleted file mode 100644 index 33ccf19e2..000000000 --- a/.idea/libraries/Maven__org_yaml_snakeyaml_1_19.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..f288702d2 --- /dev/null +++ b/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 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 General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is 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. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + 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. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + 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 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. Use with the GNU Affero General Public License. + + 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 Affero 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 special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU 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 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 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 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 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + 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 GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/README.md b/README.md index 83b5dcc7f..6e6f553bb 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,317 @@ -# EliteMobs +[![Crowdin](https://badges.crowdin.net/elitemobs/localized.svg)](https://crowdin.com/project/elitemobs) -This is the GitHub project for the Minecraft plugin EliteMobs (Spigot page can be seen here: https://www.spigotmc.org/resources/elitemobs.40090/) +[![BStats](https://bstats.org/signatures/bukkit/EliteMobs.svg)](https://bstats.org/plugin/bukkit/EliteMobs/1081) -Feel free to check the source code and do any edits you might deem necessary for your own servers. +EliteMobs is a Spigot plugin focused around the creation of bosses. It also adds several other features, such as quests, +arenas, items, an extension to in-game progression and dungeons, to name a few. -At this time, I am not interested in accepting contributions to the code. This is my first project of this dimension, and I'd like to have all components of it be written by me. +Feature and configuration documentation: https://github.com/MagmaGuy/EliteMobs/wiki -That being said, I am deeply interested in any suggestions, be they for improving existing features or creating new ones. +Discord support channel: https://discord.gg/QSA2wgh -# There's a wiki, it has a few entries, if you want more info maybe try reading it. +Webapp where you can create content: https://magmaguy.com/webapp/webapp.html -# //TODO: add description of features and how they work, some day, maybe \ No newline at end of file +# Dev notes: + +## Repository + +--- + +Maven repository: + +Maven: +``` + + elitemobs-repo + https://s01.oss.sonatype.org/content/repositories/snapshots + + + + com.magmaguy + EliteMobs + 9.0.2-SNAPSHOT + provided + +``` + +Gradle: +```kotlin +repositories { + //EliteMobs + maven { url = 'https://s01.oss.sonatype.org/content/repositories/snapshots' } +} + +dependencies{ + //EliteMobs + compileOnly group: 'com.magmaguy', name: 'EliteMobs', version: '9.0.2-SNAPSHOT' +} + +``` + +--- + +## Important classes + +The following is a list of key classes for the plugin: + +### EliteItemManager: + +`com.magmaguy.elitemobs.api.utils.EliteItemManager` + +This class is specifically made to be the easiest way to interface with Elite Items. + +### EliteEntity, CustomBossEntity, RegionalBossEntity + +These are the key classes for the boss system. RegionalBossEntity extends CustomBossEntity which extends EliteEntity. + +### EntityTracker + +This is used to check if an entity is from EliteMobs and to get the specific instance of that entity. + +--- + +`Note: This documentation is updated as requested. If you feel like it is incomplete and should further expand on some aspects, request it and it will be updated.` + +--- + +## API Events + +EliteMobs has a few basic APIs to interface with in the `com.magmaguy.elitemobs.api` package. Here's the breakdown: + +### ArenaCompleteEvent + +Fires when an arena is successfully beaten by players. + +### CustomEventStartEvent + +Fires when a Custom Event starts. Note that in this instance Custom Events refers to the mechanic in which bosses +randomly spawn in the Overworld. + +- Can be cancelled + +### DungeonInstallEvent + +Fires when a dungeon is installed by an admin. + +- Can be cancelled + +### DungeonUninstallEvent + +Fires when a dungeon is uninstalled by an admin. + +- Can be cancelled + +### EliteExplosionEvent + +Fires when an Elite Explosion happens. Note that elite explosions have a custom visual effect and regenerate the damage +done to terrain after 2 minutes. + +- Can be cancelled + +### EliteMobDamagedByEliteMobEvent + +Used for listening to moments when one Elite damages another Elite. Uses: + +- Same as Bukkit's EntityDamagedByEntity event but for elites specifically +- Cancelling it might not work. Report if it doesn't. + +### EliteMobDamagedByPlayerAntiExploitEvent + +Used for listening to events which trigger an antiexploit **check** - doesn't necessarily mean that it detected an +exploit. Uses: + +- Same as Bukkit's EntityDamagedByEntity event but for elites specifically +- Can be cancelled + +### EliteMobDamagedByPlayerEvent: + +Used for listening to moments when a player damages an Elite. Uses: + +- Same as Bukkit's EntityDamagedByEntity event but for players damaging elites specifically +- ***Important:*** can't be cancelled as it only fires after applying the damage + +### EliteMobDamagedEvent: + +Used for listening to moments when an elite is damaged in general. Uses: + +- Same as Bukkit's EntityDamageEvent +- ***Important*** Cancelling this event might not 100% work, report if it doesn't + +### EliteMobDeathEvent: + +Used to listening to moments when an elite is killed. Uses: + +- Same as Bukkit's EntityDeathEvent. + +### EliteMobEnterCombatEvent: + +Used for listening to moments when an elite enters combat against a player. Note that bosses only enter combat after +either striking a player or being struck, and not at the moment of targetting. Uses: + +- Get the target (player only) of the Elite +- Get the elite which entered in combat + +### EliteMobExitCombatEvent: + +Used for listening to moments when an elite leaves combat against a player. Uses: + +- Get the elite which just let combat. + +### EliteMobHealEvent: + +Used when an elite gets healed. + +- Can be cancelled. + +### EliteMobRemoveEvent: + +Used when an elite mob gets removed. Please note that not all removals are permanent as bosses can be removed because +the chunks unload while still being persistent. + +### EliteMobsItemDetector: //todo: remove + +Used for detecting whether an ItemStack is an EliteMobs ItemStack (like a custom item or a procedurally generated item). +Uses: + +- Detect if an ItemStack is an EliteMobs custom or dynamic item. + +### EliteMobSpawnEvent: + +Used for detecting when an Elite spawns. Uses: + +- Detect when an Elite spawns. +- Detect which Elite spawned. + +### EliteMobTargetPlayerEvent: + +Used for detecting when an Elite has targetted a player. Uses: + +- Detect when an Elite targets a player. +- Cancel an Elite's detection of a player. + +### GenericAntiExploitEvent: + +Used for listening to moments when the antiexploit runs a check but no players damaged it. Uses: + +- Detect when the antiexploit is doing a non-player based exploit check. +- Cancel an antiexploit check. + +### NPCEntityRemoveEvent: + +Used when an npc gets removed. This removal may not be permanent, as it might just be a chunk unload. + +### NPCEntitySpawnEvent: + +Used when an npc gets spawned. + +### PlayerDamagedByEliteMobEvent: + +Used for listening to moments when players are damaged by an Elite. Uses: + +- Same as Bukkit's EntityDamageEvent. + +### PlayerPreTeleportEvent: + +Used when a player starts teleporting through EliteMobs features. There is a 3 second timer before the teleportation +actually happens. + +- Can be cancelled. + +### PlayerTeleportEvent: + +Used when a player actually teleports through EliteMobs features. + +- Can be cancelled. + +### QuestAcceptEvent: + +Used when a player accepts a quest. + +- Can be cancelled. + +### QuestCompleteEvent: + +Used when a player completes a quest. + +- Can be cancelled. + +### QuestLeaveEvent: + +Used when a player leaves a quest. + +### QuestObjectivesCompletedEvent: + +Used when all quest objectives for a quest are completed. + +### QuestProgressionEvent: + +Used when a player progresses in a quest, such as by killing a quest mob or collecting a quest item. + +### QuestRewardEvent: + +Used when a player gets the reward from a quest. + +### SuperMobDamageEvent: + +Used when a Super Mob gets damaged. + +- Can be cancelled. + +### SuperMobDeathEvent: + +Used when a Super Mob dies. + +### SuperMobRemoveEvent: + +Used when a Super Mob gets removed. Note that removals might be temporary due to chunk unloads. + +### SuperMobSpawnEvent: + +Used when a Super Mob spawns. + +- Can be cancelled. + +--- + +## To add new item enchantments: + +1) Add new enchantment class to the `com.magmaguy.elitemobs.config.enchantments.premade` ** + extending** `EnchantmentsConfigFields` to initialize create its config file (naming convention: [EnchantmentName] + Config) +2) Initialize enchantment in `CustomEnchantment` to initialize the config file +3) Add enchantment class to `com.magmaguy.elitemobs.items.customenchantments` **extending** `CustomEnchantment` to write + the logic for the enchantment (naming convention [EnchantmentName]Enchantment) +4) Add a public static String called "key" to register using the ItemTagger class for persistent enchantment tracking +5) Add an entry to the parseEnchantments() method in `CustomItem` so custom items detect it correctly +6) (Alternative) Add an entry to `generateCustomEnchantments()` method in `EnchantmentGenerator` if the enchantment + should appear in procedurally generated items + +Note: + +- Don't forget to register events in `EventsRegistrer` if the part with logic in it requires events. +- Don't forget to use the damage bypass if the power is supposed to deal custom damage. Damage dealt by the player to an + elite can be overwritten in `CombatSystem` through the static "bypass" boolean field - it makes the next damage dealt + to the elite use the raw damage value. For correctly assigning damage, use + Bukkit's `Damageable#damage(double amount, Entity source)` and assign the source to your player. + +## To add new powers to elites: + +to be documented + +## To add new events: + +to be documented + +## To add new default NPCs: + +to be documented + +## To add new mob types: + +to be documented + +## Special thanks: + +Special Thanks to Illusion for spending a few hours proselytizing enums that are also have anonymous method +implementations on their constructor. + \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 000000000..da02e0566 --- /dev/null +++ b/build.gradle @@ -0,0 +1,171 @@ +plugins { + id 'java-library' + id 'idea' + id 'maven-publish' + id("io.github.goooler.shadow") version "8.1.8" + id 'signing' +} + +//Fixes issues related to special characters being used +compileJava.options.encoding = "UTF-8" +compileTestJava.options.encoding = "UTF-8" + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } +} + +//Fixes issues with utf-8 in the translations files. +processResources { + def props = [version: version] + inputs.properties props + filteringCharset 'UTF-8' + filesMatching('plugin.yml') { + expand props + } +} + +group 'com.magmaguy' +version '9.1.8' + +repositories { + maven { + url = 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' + + // As of Gradle 5.1, you can limit this to only those + // dependencies you expect from it + content { + includeGroup 'org.bukkit' + includeGroup 'org.spigotmc' + } + } + + mavenCentral() + jcenter() + mavenLocal() + + //Spigot API & CloudCommands + maven { url "https://hub.spigotmc.org/nexus/content/repositories/snapshots" } + + //MagmaCore + maven { + url = 'https://repo.magmaguy.com/releases' + } + //MagmaCore + maven { + url = 'https://repo.magmaguy.com/snapshots' + } + + //Bstats API + maven { url = 'https://repo.codemc.org/repository/maven-public' } + //Vault + maven { url = 'https://jitpack.io' } + //DiscordSRV + maven { url = 'https://m2.dv8tion.net/releases/' } + maven { url = 'https://nexus.scarsz.me/content/groups/public/' } + //LibsDisguises + maven { url = 'https://repo.md-5.net/content/groups/public/' } + //PlaceholderAPI + maven { url = 'https://repo.extendedclip.com/content/repositories/placeholderapi/' } + //WorldGuard API + maven { url = 'https://maven.enginehub.org/repo/' } + //Model Engine + maven { + url = 'https://mvn.lumine.io/repository/maven-public/' + metadataSources { + artifact() + } + } +} + +dependencies { + //Spigot API + compileOnly "org.spigotmc:spigot-api:1.21-R0.1-SNAPSHOT" + //WorldGuard API + compileOnly group: 'com.sk89q.worldguard', name: 'worldguard-bukkit', version: '7.0.7' + //Vault + compileOnly("com.github.MilkBowl:VaultAPI:1.7") { + exclude group: 'org.bukkit', module: 'bukkit' + } + //DiscordSRV + compileOnly 'com.discordsrv:discordsrv:1.24.0' + //SQLite + compileOnly group: 'org.xerial', name: 'sqlite-jdbc', version: '3.32.3' + //MySQL + compileOnly 'mysql:mysql-connector-java:8.0.33' + //LibsDisguises + compileOnly group: 'com.comphenix.protocol', name: 'ProtocolLib', version: '4.7.0' + compileOnly group: 'LibsDisguises', name: 'LibsDisguises', version: '10.0.26' + //PlaceholderAPI + compileOnly group: 'me.clip', name: 'placeholderapi', version: '2.10.9' + //lombok + compileOnly 'org.projectlombok:lombok:1.18.34' + annotationProcessor 'org.projectlombok:lombok:1.18.34' + //Model Engine - legacy + compileOnly "com.ticxo.modelengine:api:R3.1.7" + //Free Minecraft Models + compileOnly group: 'com.magmaguy', name: 'FreeMinecraftModels', version: '1.4.2' + // Mythic Mobs integration - currently only for arenas + compileOnly group: 'io.lumine', name: 'Mythic-Dist', version: '5.3.5' + + ///Shaded in + implementation group: 'org.bstats', name: 'bstats-bukkit', version: '2.2.1' + implementation group: 'commons-io', name: 'commons-io', version: '2.7' + implementation group: 'org.apache.commons', name: 'commons-math3', version: '3.6.1' + implementation group: 'com.magmaguy', name: 'EasyMinecraftGoals-dist', version: '1.13.0' + implementation group: 'com.magmaguy', name: 'MagmaCore', version: '1.0-SNAPSHOT' + +} + +artifacts { // task 'build' runs generates uberjar + archives shadowJar +} + +jar { + archiveClassifier.set('min') // we want the Uberjar to be distributed, this is the minified version +} + +String packagePath = 'com.magmaguy.shaded' + +// Relocating a Package +shadowJar { + dependencies { + relocate('org.bstats', packagePath + '.bstats') + } + archiveClassifier.set(null) + archiveFileName.set(project.name + ".jar") + destinationDirectory.set(new File("testbed/plugins")) +} + +publishing { + repositories { + maven { + name = "EliteMobs" + url = "http://magmaguy.com:50001/releases" + credentials { + username = project.hasProperty('ossrhUsername') ? ossrhUsername : "Unknown user" + password = project.hasProperty('ossrhPassword') ? ossrhPassword : "Unknown password" + } + allowInsecureProtocol = true + } + } + + publications { + mavenJava(MavenPublication) { + pom { + groupId = 'com.magmaguy' + name = 'elitemobs' + description = 'EliteMobs repo' + url = 'https://magmaguy.com/' + from components.java + licenses { + license { + name = 'GPLV3' + url = 'https://www.gnu.org/licenses/gpl-3.0.en.html' + } + } + } + } + } +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 000000000..7454180f2 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..a59520664 --- /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-8.5-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/pom.xml b/pom.xml deleted file mode 100644 index e9421a232..000000000 --- a/pom.xml +++ /dev/null @@ -1,109 +0,0 @@ - - - - - 4.0.0 - - com.magmaguy - EliteMobs - 6.6.5 - jar - - - UTF-8 - - - - ${project.artifactId} - clean resources:resources package - - - org.apache.maven.plugins - maven-compiler-plugin - 3.6.2 - - 1.8 - 1.8 - - - - org.apache.maven.plugins - maven-shade-plugin - 2.3 - - false - - - org.bstats:* - - - - - org.bstats - - com.magmaguy.elitemobs - - - - - - package - - shade - - - - - - - - - - spigotmc-repo - https://hub.spigotmc.org/nexus/content/groups/public/ - - - bstats-repo - http://repo.bstats.org/content/repositories/releases/ - - - - - - - org.spigotmc - spigot-api - 1.12.2-R0.1-SNAPSHOT - provided - - - - org.bukkit - bukkit - 1.12.2-R0.1-SNAPSHOT - provided - - - - org.bstats - bstats-bukkit - 1.1 - - - - \ No newline at end of file diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 000000000..7366956e3 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,6 @@ +pluginManagement { + plugins { + id 'org.jetbrains.kotlin.jvm' version '1.9.23' + } +} +rootProject.name = "EliteMobs" \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/ChatColorConverter.java b/src/main/java/com/magmaguy/elitemobs/ChatColorConverter.java deleted file mode 100644 index 59721b1b2..000000000 --- a/src/main/java/com/magmaguy/elitemobs/ChatColorConverter.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs; - -import org.bukkit.ChatColor; - -/** - * Created by MagmaGuy on 13/05/2017. - */ -public class ChatColorConverter { - - public static String convert(String string) { - - return ChatColor.translateAlternateColorCodes('&', string); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/CrashFix.java b/src/main/java/com/magmaguy/elitemobs/CrashFix.java new file mode 100644 index 000000000..978d7bb92 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/CrashFix.java @@ -0,0 +1,88 @@ +package com.magmaguy.elitemobs; + +import com.magmaguy.elitemobs.utils.ChunkVectorizer; +import com.magmaguy.elitemobs.utils.PersistentVanillaData; +import org.bukkit.Bukkit; +import org.bukkit.Chunk; +import org.bukkit.World; +import org.bukkit.entity.Entity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.world.ChunkLoadEvent; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.HashSet; + +public class CrashFix implements Listener { + + private static final HashSet temporarilyCachedChunks = new HashSet<>(); + public static String key = "EliteMobsCullable"; + public static String fallingBlocksKey = "VisualFallingBlocks"; + public static HashSet knownSessionChunks = new HashSet<>(); + + public static void persistentTracker(Entity entity) { + PersistentVanillaData.write(entity, key, "delete_me"); + } + + public static void registerVisualFallingBlock(Entity entity) { + PersistentVanillaData.write(entity, fallingBlocksKey, "delete_me"); + } + + public static boolean isPersistentEntity(Entity entity) { + return PersistentVanillaData.hasString(entity, key); + } + + public static boolean isVisualFallingBlock(Entity entity) { + return PersistentVanillaData.hasString(entity, fallingBlocksKey); + } + + public static void startupCheck() { + for (World world : Bukkit.getWorlds()) + for (Chunk chunk : world.getLoadedChunks()) { + chunkCheck(chunk); + knownSessionChunks.add(ChunkVectorizer.hash(chunk)); + } + } + + private static void chunkCheck(Chunk chunk) { + for (Entity entity : chunk.getEntities()) + if (isPersistentEntity(entity)) + entity.remove(); + } + + /** + * This runs during startup. There is currently an issue with entities not getting scanned correctly when the chunk + * loads, as well as an issue with double chunk loading. Additionally, since all elites are initialized during startup, + * delaying the chunk by 1 tick causes the valid entities to be deleted as soon as they load in. To fix this, entities + * that exist in a chunk when it is loaded are instead cached, and the chunk getting loaded is cached as well. The + * chunk cache prevents a double check from happening, and entity cache prevents the plugin from scanning entities + * other than the ones that persisted through a restart. + * + * @param chunk + */ + private static void delayedChunkCheck(Chunk chunk, int hashedChunk) { + Entity[] entities = chunk.getEntities().clone(); + new BukkitRunnable() { + @Override + public void run() { + for (Entity entity : entities) + if (isPersistentEntity(entity)) + entity.remove(); + temporarilyCachedChunks.remove(hashedChunk); + } + }.runTaskLater(MetadataHandler.PLUGIN, 1); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onChunkLoad(ChunkLoadEvent event) { + int hashedChunk = ChunkVectorizer.hash(event.getChunk()); + //For some reason there is double chunk loading going on, and entities aren't getting detected correctly + if (temporarilyCachedChunks.contains(hashedChunk)) return; + temporarilyCachedChunks.add(hashedChunk); + if (knownSessionChunks.contains(hashedChunk)) return; + knownSessionChunks.add(hashedChunk); + delayedChunkCheck(event.getChunk(), hashedChunk); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/EliteMobs.java b/src/main/java/com/magmaguy/elitemobs/EliteMobs.java index 92a9358e3..e57279907 100644 --- a/src/main/java/com/magmaguy/elitemobs/EliteMobs.java +++ b/src/main/java/com/magmaguy/elitemobs/EliteMobs.java @@ -4,61 +4,190 @@ * Created by MagmaGuy on 07/10/2016. */ +import com.magmaguy.easyminecraftgoals.NMSManager; import com.magmaguy.elitemobs.commands.CommandHandler; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.DefaultConfig; -import com.magmaguy.elitemobs.config.ValidMobsConfig; -import com.magmaguy.elitemobs.events.EventLauncher; -import com.magmaguy.elitemobs.items.CustomItemConstructor; -import com.magmaguy.elitemobs.items.customenchantments.CustomEnchantmentCache; -import com.magmaguy.elitemobs.items.uniqueitems.UniqueItemInitializer; -import com.magmaguy.elitemobs.mobconstructor.CombatSystem; +import com.magmaguy.elitemobs.config.*; +import com.magmaguy.elitemobs.config.commands.CommandsConfig; +import com.magmaguy.elitemobs.config.customarenas.CustomArenasConfig; +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfig; +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import com.magmaguy.elitemobs.config.customevents.CustomEventsConfig; +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfig; +import com.magmaguy.elitemobs.config.customquests.CustomQuestsConfig; +import com.magmaguy.elitemobs.config.customspawns.CustomSpawnConfig; +import com.magmaguy.elitemobs.config.customtreasurechests.CustomTreasureChestsConfig; +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfig; +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfig; +import com.magmaguy.elitemobs.config.menus.MenusConfig; +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import com.magmaguy.elitemobs.config.npcs.NPCsConfig; +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfig; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.config.wormholes.WormholeConfig; +import com.magmaguy.elitemobs.dungeons.EMPackage; +import com.magmaguy.elitemobs.dungeons.EliteMobsWorld; +import com.magmaguy.elitemobs.economy.VaultCompatibility; +import com.magmaguy.elitemobs.entitytracker.CustomProjectileData; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.events.ActionEvent; +import com.magmaguy.elitemobs.events.TimedEvent; +import com.magmaguy.elitemobs.explosionregen.Explosion; +import com.magmaguy.elitemobs.instanced.MatchInstance; +import com.magmaguy.elitemobs.items.LootTables; +import com.magmaguy.elitemobs.items.customenchantments.CustomEnchantment; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import com.magmaguy.elitemobs.menus.ProceduralShopMenu; +import com.magmaguy.elitemobs.mobconstructor.PersistentObjectHandler; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomMusic; +import com.magmaguy.elitemobs.mobconstructor.custombosses.InstancedBossEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.RegionalBossEntity; import com.magmaguy.elitemobs.mobconstructor.mobdata.PluginMobProperties; -import com.magmaguy.elitemobs.mobpowers.majorpowers.SkeletonTrackingArrow; -import com.magmaguy.elitemobs.playerdata.PlayerData; +import com.magmaguy.elitemobs.npcs.NPCEntity; +import com.magmaguy.elitemobs.pathfinding.Navigation; +import com.magmaguy.elitemobs.playerdata.ElitePlayerInventory; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.powers.scripts.ScriptAction; import com.magmaguy.elitemobs.powerstances.MajorPowerStanceMath; import com.magmaguy.elitemobs.powerstances.MinorPowerStanceMath; -import com.magmaguy.elitemobs.runnables.*; +import com.magmaguy.elitemobs.quests.DynamicQuest; +import com.magmaguy.elitemobs.quests.QuestTracking; +import com.magmaguy.elitemobs.thirdparty.bstats.CustomCharts; +import com.magmaguy.elitemobs.thirdparty.custommodels.CustomModel; +import com.magmaguy.elitemobs.thirdparty.custommodels.modelengine.ModelEngineReservedAddresses; +import com.magmaguy.elitemobs.thirdparty.libsdisguises.DisguiseEntity; +import com.magmaguy.elitemobs.thirdparty.placeholderapi.Placeholders; +import com.magmaguy.elitemobs.thirdparty.worldguard.WorldGuardCompatibility; +import com.magmaguy.elitemobs.treasurechest.TreasureChest; +import com.magmaguy.elitemobs.utils.BossBarUtil; +import com.magmaguy.elitemobs.utils.ServerTime; import com.magmaguy.elitemobs.versionnotifier.VersionChecker; -import com.magmaguy.elitemobs.versionnotifier.VersionWarner; -import org.bstats.Metrics; +import com.magmaguy.elitemobs.wormhole.Wormhole; +import com.magmaguy.magmacore.MagmaCore; +import com.magmaguy.magmacore.util.Logger; +import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; import org.bukkit.World; -import org.bukkit.entity.Arrow; +import org.bukkit.event.HandlerList; import org.bukkit.plugin.java.JavaPlugin; +import java.io.File; +import java.io.IOException; +import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; public class EliteMobs extends JavaPlugin { public static List validWorldList = new ArrayList(); + public static boolean worldGuardIsEnabled = false; + public static Metrics metrics; + public Object placeholders = null; + + public static void initializeConfigs() { + //Initialized translations + new DefaultConfig(); + new ItemSettingsConfig(); + new ProceduralItemGenerationSettingsConfig(); + PotionEffectsConfig.initializeConfigs(); + new EconomySettingsConfig(); + new EventsConfig(); + new EnchantmentsConfig(); + new AntiExploitConfig(); + new CombatTagConfig(); + new AntiExploitConfig(); + new AdventurersGuildConfig(); + new ValidWorldsConfig(); + + new MenusConfig(); + new PowersConfig(); + MobPropertiesConfig.initializeConfigs(); + CustomEnchantment.initializeCustomEnchantments(); + + new MobCombatSettingsConfig(); + CommandsConfig.initializeConfigs(); + new DiscordSRVConfig(); + new CustomEventsConfig(); + new QuestsConfig(); + new WormholesConfig(); + new ArenasConfig(); + //ModelsConfig.initializeConfig(); + new DungeonsConfig(); + new SoundsConfig(); + } + + public static void worldScanner() { + for (World world : Bukkit.getWorlds()) + if (ValidWorldsConfig.getInstance().getFileConfiguration().getBoolean("Valid worlds." + world.getName())) { + validWorldList.add(world); + } + + } @Override public void onEnable() { + Bukkit.getLogger().info(" _____ _ _____ _____ ________ ______________ _____"); + Bukkit.getLogger().info("| ___| | |_ _|_ _| ___| \\/ | _ | ___ \\/ ___|"); + Bukkit.getLogger().info("| |__ | | | | | | | |__ | . . | | | | |_/ /\\ `--."); + Bukkit.getLogger().info("| __|| | | | | | | __|| |\\/| | | | | ___ \\ `--. \\"); + Bukkit.getLogger().info("| |___| |_____| |_ | | | |___| | | \\ \\_/ / |_/ //\\__/ /"); + Bukkit.getLogger().info("\\____/\\_____/\\___/ \\_/ \\____/\\_| |_/\\___/\\____/ \\____/"); + Bukkit.getLogger().info("By MagmaGuy - v. " + MetadataHandler.PLUGIN.getDescription().getVersion()); + + if (VersionChecker.serverVersionOlderThan(21, 0)) { + Logger.warn("You are running a Minecraft version older than 1.21.0! EliteMobs 9.0 and later are only compatible with Minecraft 1.21.0 or later, if you are running an older Minecraft version you will need to use a pre-9.0 version of EliteMobs."); + Bukkit.getPluginManager().disablePlugin(this); + return; + } + + ServerTime.startTickCounter(); + + NMSManager.initializeAdapter(this); + + if (Bukkit.getServer().spigot().getConfig().getDouble("settings.attribute.maxHealth.max") < 100000000) { + Bukkit.getServer().spigot().getConfig().set("settings.attribute.maxHealth.max", 100000000); + try { + File spigotConfigContainer = new File(Paths.get(MetadataHandler.PLUGIN.getDataFolder().getParentFile().getCanonicalFile().getParentFile().toString() + "/spigot.yml").toString()); + Bukkit.getServer().spigot().getConfig().save(spigotConfigContainer); + Logger.info("New default max health set correctly!"); + } catch (IOException e) { + Logger.warn("Failed to save max health value! For the plugin to work correctly, you should increase your max health on the spigot.yml config file to " + 100000000); + } + } + + //Remove entities that should not exist + CrashFix.startupCheck(); - //Enable stats - Metrics metrics = new Metrics(this); + /* + New config loading + */ + initializeConfigs(); - //Initialize custom enchantments - CustomEnchantmentCache.initialize(); + if (Bukkit.getPluginManager().isPluginEnabled("LibsDisguises")) DisguiseEntity.initialize(); - //Load loot from config - ConfigValues.intializeConfigurations(); - ConfigValues.initializeCachedConfigurations(); + //Initializes custom models + CustomModel.initialize(); + //Reserves ModelEngine addresses if present + ModelEngineReservedAddresses.reserve(); - //Parse loot - CustomItemConstructor superDrops = new CustomItemConstructor(); - superDrops.superDropParser(); + if (worldGuardIsEnabled) Logger.info("WorldGuard compatibility is enabled!"); + else Logger.info("WorldGuard compatibility is not enabled!"); - UniqueItemInitializer.initialize(); + //Enable Vault + try { + VaultCompatibility.vaultSetup(); + } catch (Exception e) { + Logger.warn("Something went wrong with the vault configuration - your Vault " + "version is probably not compatible with this EliteMobs version. Please contact the dev about this error."); + VaultCompatibility.VAULT_ENABLED = false; + } //Hook up all listeners, some depend on config EventsRegistrer.registerEvents(); //Launch the local data cache - PlayerData.initializePlayerData(); - PlayerData.synchronizeDatabases(); + new DatabaseConfig(); + PlayerData.initializeDatabaseConnection(); + ElitePlayerInventory.initialize(); //Get world list worldScanner(); @@ -66,15 +195,9 @@ public void onEnable() { //Start the repeating tasks such as scanners launchRunnables(); - //Commands - this.getCommand("elitemobs").setExecutor(new CommandHandler()); - //launch events - EventLauncher eventLauncher = new EventLauncher(); - eventLauncher.eventRepeatingTask(); - - //launch internal clock for attack cooldown - CombatSystem.launchInternalClock(); + ActionEvent.initializeBlueprintEvents(); + TimedEvent.initializeBlueprintEvents(); /* Initialize mob values @@ -87,69 +210,150 @@ public void onEnable() { MinorPowerStanceMath.initializeVectorCache(); MajorPowerStanceMath.initializeVectorCache(); - /* - Check for new plugin version - */ - VersionChecker.updateComparer(); - if (!VersionChecker.pluginIsUpToDate) - this.getServer().getPluginManager().registerEvents(new VersionWarner(), this); + // Small check to make sure that PlaceholderAPI is installed + if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) { + Placeholders placeholders = new Placeholders(); + placeholders.register(); + this.placeholders = placeholders; + } - } + //Enable stats + metrics = new Metrics(this, 1081); + //Initialize custom charts + new CustomCharts(); + + //Imports custom configurations and mindungeons from the import folder +// ConfigurationImporter.initializeConfigs(); + MagmaCore.initializeImporter(); + ConfigurationExporter.initializeConfigs(); + + //Import custom items after potentially importing new items + new CustomItemsConfig(); + CustomItem.initializeCustomItems(); + LootTables.initialize(); + + //Initialize em package content, such as world loading + new DungeonPackagerConfig(); + + //Initialize custom & regional bosses + new CustomBossesConfig(); + //Initialize treasure chests + new CustomTreasureChestsConfig(); + //Initialize npcs + new NPCsConfig(); + //Initialize wormholes + new WormholeConfig(); + //Arenas + new CustomArenasConfig(); + + //Initialize em package content + for (EMPackage emPackage : EMPackage.getEmPackages().values()) + try { + if (emPackage.isInstalled()) emPackage.initializeContent(); + } catch (Exception exception) { + Logger.warn("Failed to load EliteMobs Package " + emPackage.getDungeonPackagerConfigFields().getFilename() + " !"); + exception.printStackTrace(); + } + + + //Initialize custom spawn methods, this runs late because it compares loaded worlds against worlds listed in the config + try { + new CustomSpawnConfig(); + } catch (Exception ex) { + Logger.warn("You are using a version of Spigot or a branch thereof (Paper, Purpur, so on) that is (probably) HORRIBLY outdated!" + " This issue will probably be fixed if you update your server version to the latest patch of the version" + + " you are running."); + Logger.warn(" This does not mean that you have to update your Minecraft version, but it does mean you must update your server version to the latest patch" + " available for that Minecraft version. Download from trustworthy sources, as if you download Spigot from some random website other than Spigot," + " you are probably not getting the latest version (and also there's a high chance you'll get a virus)."); + } + + new CustomQuestsConfig(); - @Override - public void onDisable() { + //Commands +// new CommandHandler(); + CommandHandler.registerCommands(); - EntityTracker.shutdownPurger(); + new SpecialItemSystemsConfig(); /* - Flush lingering arrows from the arrow tracking power + Check for new plugin version or for dungeon updates */ - for (Arrow arrow : SkeletonTrackingArrow.trackingArrowList) - arrow.remove(); - SkeletonTrackingArrow.trackingArrowList.clear(); - - CustomItemConstructor.customItemList.clear(); - CustomItemConstructor.staticCustomItemHashMap.clear(); - CustomItemConstructor.dynamicRankedItemStacks.clear(); - UniqueItemInitializer.uniqueItemsList.clear(); - validWorldList.clear(); - - //save cached data - Bukkit.getScheduler().cancelTask(PlayerData.databaseSyncTaskID); - Bukkit.getLogger().info("[EliteMobs] Saving EliteMobs databases..."); - PlayerData.saveDatabases(); - Bukkit.getLogger().info("[EliteMobs] All saved! Good night."); - PlayerData.clearPlayerData(); + VersionChecker.check(); + DynamicQuest.startRandomizingQuests(); + CustomBossEntity.startUpdatingDynamicLevels(); } - public void worldScanner() { + @Override + public void onLoad() { + //Initializes some core utilities that are shared across MagmaGuy's plugins + MetadataHandler.PLUGIN = this; + MagmaCore.createInstance(this); + + //WorldGuard hook + try { + worldGuardIsEnabled = WorldGuardCompatibility.initialize(); + } catch (NoClassDefFoundError | IllegalStateException ex) { + Logger.warn("Error loading WorldGuard. EliteMob-specific flags will not work." + " Except if you just reloaded the plugin, in which case they will totally work."); + worldGuardIsEnabled = false; + } + if (!worldGuardIsEnabled) + if (Bukkit.getPluginManager().getPlugin("WorldGuard") != null) worldGuardIsEnabled = true; - for (World world : Bukkit.getWorlds()) - if (ConfigValues.validWorldsConfig.getBoolean("Valid worlds." + world.getName())) - validWorldList.add(world); + } + @Override + public void onDisable() { + Logger.info("Starting EliteMobs shutdown sequence..."); + Explosion.regenerateAllPendingBlocks(); + Bukkit.getServer().getScheduler().cancelTasks(MetadataHandler.PLUGIN); + Wormhole.shutdown(); + RegionalBossEntity.save(); + RegionalBossEntity.getTrackableCustomBosses().clear(); + RegionalBossEntity.getRegionalBossEntitySet().clear(); + InstancedBossEntity.shutdown(); + NPCEntity.shutdown(); + PersistentObjectHandler.shutdown(); + EntityTracker.wipeShutdown(); + TimedEvent.shutdown(); + ActionEvent.shutdown(); + validWorldList.clear(); + CustomBossesConfigFields.getRegionalElites().clear(); + CustomEnchantment.getCustomEnchantmentMap().clear(); + CustomItem.getCustomItems().clear(); + CustomItem.getCustomItemStackList().clear(); + CustomItem.getCustomItemStackShopList().clear(); + CustomItem.getLimitedItems().clear(); + CustomItem.getScalableItems().clear(); + CustomItem.getFixedItems().clear(); + CustomItem.getTieredLoot().clear(); + CustomItem.getWeighedFixedItems().clear(); + EMPackage.shutdown(); + RegionalBossEntity.regionalBossesShutdown(); + if (this.placeholders != null) ((Placeholders) placeholders).unregister(); + HandlerList.unregisterAll(MetadataHandler.PLUGIN); + TreasureChest.clearTreasureChests(); + QuestTracking.clear(); + MatchInstance.shutdown(); + CustomProjectileData.shutdown(); + DynamicQuest.shutdown(); + ProceduralShopMenu.shutdown(); + EliteMobsWorld.shutdown(); + Navigation.shutdown(); + BossBarUtil.shutdown(); + ScriptAction.shutdown(); + CustomMusic.shutdown(); + CustomBossEntity.shutdown(); + Logger.info("Saving EliteMobs databases..."); + PlayerData.closeConnection(); + MagmaCore.shutdown(); + Logger.info("All done! Good night."); } /* Repeating tasks that run as long as the server is on */ - public void launchRunnables() { - - int eggTimerInterval = 20 * 60 * 10 / ConfigValues.defaultConfig.getInt(DefaultConfig.SUPERMOB_STACK_AMOUNT); - - new EntityScanner().runTaskTimer(this, 20, 20 * 10); - new PotionEffectApplier().runTaskTimer(this, 20, 20); - if (ConfigValues.defaultConfig.getBoolean(DefaultConfig.ENABLE_POWER_SCOREBOARDS)) - new ScoreboardUpdater().runTaskTimer(this, 20, 20); - if (ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_PASSIVE_SUPERMOBS) && - ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.CHICKEN) && - ConfigValues.defaultConfig.getInt(DefaultConfig.SUPERMOB_STACK_AMOUNT) > 0) - new EggRunnable().runTaskTimer(this, eggTimerInterval, eggTimerInterval); - new DynamicLoreUpdater().runTaskTimer(this, 20, 20 * 2); -// new ReapplyDisplayEffects().runTaskTimer(this, 20, 20); -// EntityListUpdater.startUpdating(); - + private void launchRunnables() { + //save regional bosses when the files update + RegionalBossEntity.regionalDataSaver(); } } diff --git a/src/main/java/com/magmaguy/elitemobs/EntityTracker.java b/src/main/java/com/magmaguy/elitemobs/EntityTracker.java deleted file mode 100644 index 2f9f51790..000000000 --- a/src/main/java/com/magmaguy/elitemobs/EntityTracker.java +++ /dev/null @@ -1,319 +0,0 @@ -package com.magmaguy.elitemobs; - -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.DefaultConfig; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs.EliteMobProperties; -import com.magmaguy.elitemobs.mobconstructor.mobdata.passivemobs.SuperMobProperties; -import com.magmaguy.elitemobs.mobpowers.ElitePower; -import org.bukkit.entity.*; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.CreatureSpawnEvent; -import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.event.world.ChunkUnloadEvent; -import org.bukkit.scheduler.BukkitRunnable; - -import java.util.HashSet; -import java.util.Iterator; - -public class EntityTracker implements Listener { - - /* - These HashSets track basically everything for live plugin entities - */ - private static HashSet superMobs = new HashSet<>(); - private static HashSet eliteMobs = new HashSet<>(); - private static HashSet eliteMobsLivingEntities = new HashSet<>(); - - private static HashSet naturalEntities = new HashSet<>(); - private static HashSet armorStands = new HashSet<>(); - private static HashSet itemVisualEffects = new HashSet<>(); - - /* - This HashSet shouldn't really be scanned during runtime for aside from the occasional updates, it mostly exists to - cull entities once the server shuts down - */ - private static HashSet cullablePluginEntities = new HashSet<>(); - - /* - Starts tracking elite mobs - */ - public static void registerEliteMob(EliteMobEntity eliteMobEntity) { - eliteMobs.add(eliteMobEntity); - eliteMobsLivingEntities.add(eliteMobEntity.getLivingEntity()); - registerCullableEntity(eliteMobEntity.getLivingEntity()); - } - - /* - Starts tracking super mob - */ - public static void registerSuperMob(LivingEntity livingEntity) { - if (!SuperMobProperties.isValidSuperMobType(livingEntity)) return; - superMobs.add(livingEntity); - } - - /* - Registers mobs that spawn naturally, necessary for elite mob rewards - */ - public static void registerNaturalEntity(LivingEntity entity) { - if (!EliteMobProperties.isValidEliteMobType(entity)) return; - naturalEntities.add(entity); - } - - - public static void registerArmorStands(ArmorStand armorStand) { - armorStands.add(armorStand); - registerCullableEntity(armorStand); - } - - public static void registerItemVisualEffects(Item item) { - itemVisualEffects.add(item); - registerCullableEntity(item); - } - - /* - Starts tracking any entity generated or managed by EliteMobs, useful for when they need to be culled - Does not include super mobs to avoid culling them by mistake - */ - public static void registerCullableEntity(Entity entity) { - cullablePluginEntities.add(entity); - } - - public static void checkEntityState() { - - new BukkitRunnable() { - @Override - public void run() { - new BukkitRunnable() { - @Override - public void run() { - updateSuperMobs(); - updateEliteMobEntities(); - updateLivingEntities(); - updateCullables(); - updateAmorStands(); - updateItems(); - } - }.runTaskAsynchronously(MetadataHandler.PLUGIN); - } - }.runTaskTimer(MetadataHandler.PLUGIN, 20 * 60 * 5, 20 * 60 * 5); - - } - - private static void updateSuperMobs() { - Iterator iterator = superMobs.iterator(); - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); - if (!entity.isValid()) - iterator.remove(); - } - } - - private static void updateLivingEntities() { - Iterator iterator = naturalEntities.iterator(); - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); - if (!entity.isValid()) - iterator.remove(); - } - } - - private static void updateEliteMobEntities() { - Iterator iterator = eliteMobs.iterator(); - while (iterator.hasNext()) { - Entity entity = ((EliteMobEntity) iterator.next()).getLivingEntity(); - if (entity.isDead() || - !entity.isValid() && ((LivingEntity) entity).getRemoveWhenFarAway()) - iterator.remove(); - } - } - - private static void updateAmorStands() { - Iterator iterator = armorStands.iterator(); - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); - if (!entity.isValid()) - iterator.remove(); - } - } - - private static void updateCullables() { - Iterator iterator = cullablePluginEntities.iterator(); - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); - if (!entity.isValid()) - iterator.remove(); - } - } - - private static void updateItems() { - Iterator iterator = itemVisualEffects.iterator(); - while (iterator.hasNext()) { - Entity entity = (Entity) iterator.next(); - if (!entity.isValid()) - iterator.remove(); - } - } - - public static boolean isSuperMob(Entity entity) { - if (!SuperMobProperties.isValidSuperMobType(entity)) return false; - return superMobs.contains(entity); - } - - public static boolean isEliteMob(Entity entity) { - if (!EliteMobProperties.isValidEliteMobType(entity)) return false; - return eliteMobsLivingEntities.contains(entity); - } - - public static EliteMobEntity getEliteMobEntity(Entity entity) { - if (!EliteMobProperties.isValidEliteMobType(entity)) return null; - for (EliteMobEntity eliteMobEntity : eliteMobs) - if (eliteMobEntity.getLivingEntity().equals(entity)) - return eliteMobEntity; - return null; - } - - public static EliteMobEntity getAsyncEliteMobEntity(Entity entity) { - if (!EliteMobProperties.isValidEliteMobType(entity)) return null; - HashSet localEntities = (HashSet) eliteMobs.clone(); - for (EliteMobEntity eliteMobEntity : localEntities) - if (eliteMobEntity.getLivingEntity().equals(entity)) - return eliteMobEntity; - return null; - } - - public static boolean isNaturalEntity(Entity entity) { - if (!EliteMobProperties.isValidEliteMobType(entity)) return false; - return naturalEntities.contains(entity); - } - - public static boolean isItemVisualEffect(Entity entity) { - return (itemVisualEffects.contains(entity)); - } - - public static boolean hasPower(ElitePower mobPower, Entity entity) { - EliteMobEntity eliteMobEntity = getEliteMobEntity(entity); - if (eliteMobEntity == null) return false; - return eliteMobEntity.hasPower(mobPower); - } - - public static boolean hasPower(ElitePower mobPower, EliteMobEntity eliteMobEntity) { - if (eliteMobEntity == null) return false; - return eliteMobEntity.hasPower(mobPower); - } - - public static void unregisterCullableEntity(Entity entity) { - cullablePluginEntities.remove(entity); - } - - public static void unregisterItemEntity(Item item) { - itemVisualEffects.remove(item); - } - - /* - Used outside this class to remove individual elite mobs - */ - public static void unregisterEliteMob(EliteMobEntity eliteMobEntity) { - eliteMobs.remove(eliteMobEntity); - naturalEntities.remove(eliteMobEntity.getLivingEntity()); - cullablePluginEntities.remove(eliteMobEntity.getLivingEntity()); - } - - /* - Used in this class to do mass wipes of data - */ - private static void unregisterEliteMob(Entity entity) { - if (!isEliteMob(entity)) return; - EliteMobEntity eliteMobEntity = getAsyncEliteMobEntity(entity); - if (eliteMobEntity == null) return; - eliteMobEntity.getLivingEntity().remove(); - eliteMobs.remove(eliteMobEntity); - eliteMobsLivingEntities.remove(eliteMobEntity.getLivingEntity()); - } - - public static void unregisterArmorStand(Entity armorStand) { - if (!armorStand.getType().equals(EntityType.ARMOR_STAND)) return; - armorStands.remove(armorStand); - } - - public static HashSet getEliteMobs() { - return eliteMobs; - } - - public static boolean getIsArmorStand(Entity entity) { - if (!entity.getType().equals(EntityType.ARMOR_STAND)) return false; - return (armorStands.contains(entity)); - } - - public static void unregisterSuperMob(Entity entity) { - if (!SuperMobProperties.isValidSuperMobType(entity)) return; - superMobs.remove(entity); - } - - public static void unregisterNaturalEntity(Entity entity) { - if (EliteMobProperties.isValidEliteMobType(entity)) return; - naturalEntities.remove(entity); - } - - /* - Custom spawn reasons can be considered as natural spawns under specific config options - */ - @EventHandler(priority = EventPriority.LOW) - public void registerNaturalEntity(CreatureSpawnEvent event) { - if (event.isCancelled()) return; - if (event.getSpawnReason().equals(CreatureSpawnEvent.SpawnReason.NATURAL) || - event.getSpawnReason().equals(CreatureSpawnEvent.SpawnReason.CUSTOM) && - !ConfigValues.defaultConfig.getBoolean(DefaultConfig.STRICT_SPAWNING_RULES)) - registerNaturalEntity(event.getEntity()); - } - - /* - Natural entities get unregistered from being natural when exploit abuse is detected from the players - */ - public static void unregisterNaturalEntity(LivingEntity livingEntity) { - naturalEntities.remove(livingEntity); - } - - public static void shutdownPurger() { - - for (Entity entity : cullablePluginEntities) - entity.remove(); - - eliteMobs.clear(); - eliteMobsLivingEntities.clear(); - superMobs.clear(); - itemVisualEffects.clear(); - armorStands.clear(); - naturalEntities.clear(); - cullablePluginEntities.clear(); - - } - - /* - This is run in sync for performance reasons - */ - public static void wipeEntity(Entity entity) { - new BukkitRunnable() { - @Override - public void run() { - unregisterEliteMob(entity); - unregisterSuperMob(entity); - unregisterNaturalEntity(entity); - unregisterArmorStand(entity); - unregisterCullableEntity(entity); - } - }.runTaskAsynchronously(MetadataHandler.PLUGIN); - } - - public static void chunkWiper(ChunkUnloadEvent event) { - for (Entity entity : event.getChunk().getEntities()) - wipeEntity(entity); - } - - public static void deathWipe(EntityDeathEvent event) { - wipeEntity(event.getEntity()); - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/EventsRegistrer.java b/src/main/java/com/magmaguy/elitemobs/EventsRegistrer.java index 1441924a5..246e9a667 100644 --- a/src/main/java/com/magmaguy/elitemobs/EventsRegistrer.java +++ b/src/main/java/com/magmaguy/elitemobs/EventsRegistrer.java @@ -1,206 +1,391 @@ package com.magmaguy.elitemobs; -import com.magmaguy.elitemobs.adventurersguild.AdventurersGuildGUI; +import com.magmaguy.elitemobs.adventurersguild.GuildRank; +import com.magmaguy.elitemobs.adventurersguild.GuildRankMenuHandler; +import com.magmaguy.elitemobs.adventurersguild.WorldSwitchBehavior; +import com.magmaguy.elitemobs.api.*; import com.magmaguy.elitemobs.collateralminecraftchanges.*; -import com.magmaguy.elitemobs.combattag.CombatTag; -import com.magmaguy.elitemobs.commands.LootGUI; -import com.magmaguy.elitemobs.commands.shops.CustomShopHandler; -import com.magmaguy.elitemobs.commands.shops.ItemSaleEvent; -import com.magmaguy.elitemobs.commands.shops.ShopHandler; +import com.magmaguy.elitemobs.combatsystem.EliteMobDamagedByEliteMobHandler; +import com.magmaguy.elitemobs.combatsystem.EliteMobGenericDamagedHandler; +import com.magmaguy.elitemobs.combatsystem.antiexploit.*; +import com.magmaguy.elitemobs.combatsystem.combattag.CombatTag; +import com.magmaguy.elitemobs.combatsystem.displays.HealthDisplay; +import com.magmaguy.elitemobs.combatsystem.displays.PopupDisplay; +import com.magmaguy.elitemobs.commands.admin.RemoveCommand; +import com.magmaguy.elitemobs.commands.setup.SetupMenu; import com.magmaguy.elitemobs.config.*; -import com.magmaguy.elitemobs.events.DeadMoon; -import com.magmaguy.elitemobs.events.SmallTreasureGoblin; -import com.magmaguy.elitemobs.events.actionevents.BalrogEvent; -import com.magmaguy.elitemobs.events.actionevents.FaeEvent; -import com.magmaguy.elitemobs.events.actionevents.KrakenEvent; -import com.magmaguy.elitemobs.events.mobs.*; -import com.magmaguy.elitemobs.events.mobs.sharedeventpowers.SpiritWalk; +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfig; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.dungeons.DungeonProtector; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.events.ActionEvent; +import com.magmaguy.elitemobs.explosionregen.Explosion; +import com.magmaguy.elitemobs.initialsetup.FirstTimeSetup; +import com.magmaguy.elitemobs.instanced.MatchInstance; +import com.magmaguy.elitemobs.instanced.arena.ArenaInstance; +import com.magmaguy.elitemobs.instanced.dungeons.DungeonKillTargetObjective; import com.magmaguy.elitemobs.items.*; -import com.magmaguy.elitemobs.items.customenchantments.FlamethrowerEnchantment; -import com.magmaguy.elitemobs.mobconstructor.CombatSystem; -import com.magmaguy.elitemobs.mobconstructor.MergeHandler; -import com.magmaguy.elitemobs.mobconstructor.displays.DamageDisplay; -import com.magmaguy.elitemobs.mobconstructor.displays.DisplayMob; -import com.magmaguy.elitemobs.mobconstructor.displays.HealthDisplay; -import com.magmaguy.elitemobs.mobpowers.AggroPrevention; -import com.magmaguy.elitemobs.mobpowers.defensivepowers.InvulnerabilityArrow; -import com.magmaguy.elitemobs.mobpowers.defensivepowers.InvulnerabilityFallDamage; -import com.magmaguy.elitemobs.mobpowers.defensivepowers.InvulnerabilityFire; -import com.magmaguy.elitemobs.mobpowers.defensivepowers.InvulnerabilityKnockback; -import com.magmaguy.elitemobs.mobpowers.majorpowers.*; -import com.magmaguy.elitemobs.mobpowers.miscellaneouspowers.BonusLoot; -import com.magmaguy.elitemobs.mobpowers.miscellaneouspowers.Taunt; -import com.magmaguy.elitemobs.mobpowers.offensivepowers.*; -import com.magmaguy.elitemobs.mobs.passive.*; -import com.magmaguy.elitemobs.mobspawning.NaturalEliteMobSpawnEventHandler; +import com.magmaguy.elitemobs.items.customenchantments.*; +import com.magmaguy.elitemobs.items.potioneffects.PlayerPotionEffects; +import com.magmaguy.elitemobs.menus.*; +import com.magmaguy.elitemobs.mobconstructor.PersistentObjectHandler; +import com.magmaguy.elitemobs.mobconstructor.custombosses.*; +import com.magmaguy.elitemobs.mobconstructor.custombosses.transitiveblocks.TransitiveBlockCommand; +import com.magmaguy.elitemobs.mobconstructor.custombosses.transitiveblocks.TransitiveBossBlock; import com.magmaguy.elitemobs.mobspawning.NaturalMobSpawnEventHandler; +import com.magmaguy.elitemobs.npcs.NPCDamageEvent; +import com.magmaguy.elitemobs.npcs.NPCEntity; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import com.magmaguy.elitemobs.npcs.chatter.NPCProximitySensor; +import com.magmaguy.elitemobs.ondeathcommands.OnDeathCommands; +import com.magmaguy.elitemobs.pathfinding.Navigation; +import com.magmaguy.elitemobs.playerdata.ElitePlayerInventory; +import com.magmaguy.elitemobs.playerdata.PlayerStatsTracker; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.playerdata.statusscreen.*; +import com.magmaguy.elitemobs.powers.*; +import com.magmaguy.elitemobs.powers.meta.Bombardment; +import com.magmaguy.elitemobs.powers.meta.CombatEnterScanPower; +import com.magmaguy.elitemobs.powers.meta.CustomSummonPower; +import com.magmaguy.elitemobs.powers.scripts.ScriptListener; +import com.magmaguy.elitemobs.powers.specialpowers.EnderCrystalLightningRod; import com.magmaguy.elitemobs.powerstances.EffectEventHandlers; import com.magmaguy.elitemobs.powerstances.VisualEffectObfuscator; -import com.magmaguy.elitemobs.utils.VersionChecker; +import com.magmaguy.elitemobs.quests.CustomQuest; +import com.magmaguy.elitemobs.quests.QuestTracking; +import com.magmaguy.elitemobs.quests.menus.QuestInventoryMenu; +import com.magmaguy.elitemobs.quests.objectives.ArenaObjective; +import com.magmaguy.elitemobs.quests.objectives.CustomFetchObjective; +import com.magmaguy.elitemobs.quests.objectives.DialogObjective; +import com.magmaguy.elitemobs.quests.objectives.KillObjective; +import com.magmaguy.elitemobs.quests.playercooldowns.PlayerQuestCooldownsLogout; +import com.magmaguy.elitemobs.thirdparty.custommodels.CustomModel; +import com.magmaguy.elitemobs.thirdparty.worldguard.WorldGuardDungeonFlag; +import com.magmaguy.elitemobs.thirdparty.worldguard.WorldGuardEliteMobOnlySpawnFlag; +import com.magmaguy.elitemobs.thirdparty.worldguard.WorldGuardExplosionBlockDamageFlag; +import com.magmaguy.elitemobs.thirdparty.worldguard.WorldGuardSpawnEventBypasser; +import com.magmaguy.elitemobs.treasurechest.TreasureChest; +import com.magmaguy.elitemobs.versionnotifier.VersionChecker; import org.bukkit.Bukkit; +import org.bukkit.event.Listener; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginManager; public class EventsRegistrer { + private static PluginManager pluginManager; + private static Plugin plugin; + + private EventsRegistrer() { + } + public static void registerEvents() { - PluginManager pluginManager = Bukkit.getPluginManager(); - Plugin plugin = MetadataHandler.PLUGIN; + pluginManager = Bukkit.getPluginManager(); + plugin = MetadataHandler.PLUGIN; + + register(new FirstTimeSetup()); + + register(new Navigation()); + + register(new DungeonKillTargetObjective.DungeonKillTargetObjectiveListener()); + + register(new VersionChecker.VersionCheckerEvents()); + + register(new PlayerData.PlayerDataEvents()); + register(new ElitePlayerInventory.ElitePlayerInventoryEvents()); + register(new PlayerStatsTracker()); + register(new PlayerQuestCooldownsLogout()); - //Load passive mobs TODO: find generic alternative to this - pluginManager.registerEvents(new ChickenHandler(), plugin); - pluginManager.registerEvents(new CowHandler(), plugin); - pluginManager.registerEvents(new MushroomCowHandler(), plugin); - pluginManager.registerEvents(new PassiveEliteMobDeathHandler(), plugin); - pluginManager.registerEvents(new PigHandler(), plugin); - pluginManager.registerEvents(new SheepHandler(), plugin); - pluginManager.registerEvents(new FindSuperMobs(), plugin); + if (ItemSettingsConfig.isPreventEliteItemEnchantment()) + register(new ItemEnchantmentPrevention()); + if (ItemSettingsConfig.isPreventEliteItemDisenchantment()) + register(new ItemDisenchantPrevention()); + + if (ItemSettingsConfig.isPreventEliteItemDiamondToNetheriteUpgrade()) + register(new PreventUpgradeDiamondToNetherite()); + + register(new FixPlayerOnLoginOrRespawn()); + register(new EnvironmentalDungeonDamage()); + register(new PlayerQuitCleanup()); //Mob damage - pluginManager.registerEvents(new CombatSystem(), plugin); - if (ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.ENABLE_DEATH_MESSAGES)) - pluginManager.registerEvents(new PlayerDeathMessageByEliteMob(), plugin); + register(new EliteMobGenericDamagedHandler()); + register(new EliteMobDamagedByEliteMobHandler()); + if (MobCombatSettingsConfig.isEnableDeathMessages()) + register(new PlayerDeathMessageByEliteMob()); + + //explosion regenerator + if (DefaultConfig.isDoExplosionRegen()) + register(new Explosion.ExplosionEvent()); //Mob loot - pluginManager.registerEvents(new DefaultDropsHandler(), plugin); + register(new DefaultDropsHandler()); + register(new ItemLootShower.ItemLootShowerEvents()); + + //potion effects - also initializes the task + register(new PlayerPotionEffects()); - //potion effects - pluginManager.registerEvents(new PotionEffectApplier(), plugin); + //getloot AdventurersGuildMenu + register(new GetLootMenu.GetLootMenuListener()); - //getloot AdventurersGuildGUI - pluginManager.registerEvents(new LootGUI(), plugin); + /* + Register API events + */ + register(new EliteMobDeathEvent.EliteMobDeathEventFilter()); + register(new EliteMobTargetPlayerEvent.EliteMobTargetPlayerEventFilter()); + register(new EliteMobDamagedEvent.EliteMobDamageEventFilter()); + register(new PlayerDamagedByEliteMobEvent.PlayerDamagedByEliteMobEventFilter()); + register(new EliteMobDamagedByEliteMobEvent.EliteMobDamagedByEliteMobFilter()); + register(new EliteMobEnterCombatEvent.EliteMobEnterCombatEventFilter()); + register(new PlayerPreTeleportEvent.PlayerPreTeleportEventEvents()); + register(new PlayerTeleportEvent.PlayerTeleportEventExecutor()); + register(new EliteMobDamagedByPlayerEvent.EliteMobDamagedByPlayerEventFilter()); + register(new EliteExplosionEvent.EliteExplosionEvents()); /* While these powers could be registered in a more automated way, I realized that it's also a bad way of getting silent errors without ever noticing, and ultimately the amount of manual input required is pretty minimal */ //Minor mob powers - pluginManager.registerEvents(new InvulnerabilityArrow(), plugin); - pluginManager.registerEvents(new InvulnerabilityFallDamage(), plugin); - pluginManager.registerEvents(new InvulnerabilityFire(), plugin); - pluginManager.registerEvents(new InvulnerabilityKnockback(), plugin); - pluginManager.registerEvents(new BonusLoot(), plugin); - pluginManager.registerEvents(new Taunt(), plugin); - pluginManager.registerEvents(new AttackArrow(), plugin); - pluginManager.registerEvents(new AttackBlinding(), plugin); - pluginManager.registerEvents(new AttackFire(), plugin); - pluginManager.registerEvents(new AttackFireball(), plugin); - pluginManager.registerEvents(new AttackFreeze(), plugin); - pluginManager.registerEvents(new AttackGravity(), plugin); - pluginManager.registerEvents(new AttackPoison(), plugin); - pluginManager.registerEvents(new AttackPush(), plugin); - pluginManager.registerEvents(new AttackWeakness(), plugin); - pluginManager.registerEvents(new AttackWeb(), plugin); - pluginManager.registerEvents(new AttackWither(), plugin); + register(new ScriptListener()); + registerPower(new InvulnerabilityArrow(), "invulnerability_arrow.yml"); + registerPower(new InvulnerabilityFallDamage(), "invulnerability_fall_damage.yml"); + registerPower(new InvulnerabilityKnockback(), "invulnerability_knockback.yml"); + registerPower(new InvulnerabilityFireworks(), "invulnerability_fireworks.yml"); + registerPower(new BonusLoot(), "bonus_loot.yml"); + registerPower(new Taunt(), "taunt.yml"); + registerPower(new Implosion(), "implosion.yml"); + registerPower(new AttackArrow(), "attack_arrow.yml"); + registerPower(new ArrowFireworks(), "arrow_fireworks.yml"); + registerPower(new AttackFireball(), "attack_fireball.yml"); + registerPower(new TrackingFireball.TrackingFireballEvents(), "tracking_fireball.yml"); + registerPower(new AttackLightning(), "attack_lightning.yml"); + registerPower(new AttackPush(), "attack_push.yml"); + registerPower(new AttackVacuum(), "attack_vacuum.yml"); + registerPower(new ArrowRain(), "arrow_rain.yml"); + registerPower(new GroundPound(), "ground_pound.yml"); + registerPower(new LightningBolts(), "lightning_bolts.yml"); + registerPower(new FrostCone(), "frost_cone.yml"); + registerPower(new Thunderstorm(), "thunderstorm.yml"); + registerPower(new Firestorm(), "firestorm.yml"); + register(new Bombardment.BombardmentEvents()); + registerPower(new ShieldWall.ShieldWallEvents(), "shield_wall.yml"); + registerPower(new Taze(), "taze.yml"); //Major mob powers - pluginManager.registerEvents(new SkeletonPillar(), plugin); - pluginManager.registerEvents(new SkeletonTrackingArrow(), plugin); - pluginManager.registerEvents(new ZombieBloat(), plugin); - pluginManager.registerEvents(new ZombieFriends(), plugin); - pluginManager.registerEvents(new ZombieNecronomicon(), plugin); - pluginManager.registerEvents(new ZombieParents(), plugin); - pluginManager.registerEvents(new ZombieTeamRocket(), plugin); + registerPower(new SkeletonPillar(), "skeleton_pillar.yml"); + registerPower(new SkeletonTrackingArrow(), "skeleton_tracking_arrow.yml"); + registerPower(new ZombieBloat(), "zombie_bloat.yml"); + registerPower(new ZombieFriends(), "zombie_friends.yml"); + registerPower(new ZombieNecronomicon(), "zombie_necronomicon.yml"); + registerPower(new ZombieParents(), "zombie_parents.yml"); + + //boss powers + registerPower(new SpiritWalk(), "spirit_walk.yml"); + registerPower(new GoldShotgun(), "gold_shotgun.yml"); + registerPower(new GoldExplosion(), "gold_explosion.yml"); + registerPower(new Flamethrower(), "flamethrower.yml"); + register(new PlasmaBootsEnchantment.PlasmaBootsEnchantmentEvents()); + if (EnchantmentsConfig.getEnchantment(SoulbindEnchantment.key + ".yml").isEnabled()) + register(new SoulbindEnchantment.SoulbindEnchantmentEvents()); + registerPower(new FlamePyre(), "flame_pyre.yml"); + registerPower(new SummonTheReturned(), "summon_the_returned.yml"); + registerPower(new HyperLoot(), "hyper_loot.yml"); + registerPower(new SummonTheReturned(), "summon_the_returned.yml"); + registerPower(new SummonEmbers(), "summon_embers.yml"); + registerPower(new MeteorShower(), "meteor_shower.yml"); + registerPower(new BulletHell(), "bullet_hell.yml"); + registerPower(new DeathSlice(), "death_slice.yml"); + registerPower(new FireworksBarrage.FireworksBarrageEvents(), "fireworks_barrage.yml"); + register(new CustomSummonPower.CustomSummonPowerEvent()); + registerPower(new EnderDragonEmpoweredLightning.EnderDragonEmpoweredLightningEvents(), "ender_dragon_empowered_lightning.yml"); + register(new CombatEnterScanPower.MajorCombatEnterScanningPowerEvents()); + register(new LightningEnchantment.LightningEnchantmentEvents()); + registerPower(new BonusCoins.BonusCoinsEvents(), "bonus_coins.yml"); + + //special powers + register(new EnderCrystalLightningRod.EnderCrystalLightningRodEvents()); + + //Custom bosses + register(new CustomBossEntity.CustomBossEntityEvents()); + register(new CustomBossDeath()); + register(new PersistentObjectHandler.PersistentObjectHandlerEvents()); + register(new CustomBossTaunts()); + register(new PhaseBossEntity.PhaseBossEntityListener()); + register(new AdvancedAggroManager()); + register(new TransitiveBossBlock()); + register(new TransitiveBlockCommand.TemporaryBossBlockCommandEvents()); + register(new CustomModel.ModelEntityEvents()); //Metadata (player purger) - pluginManager.registerEvents(new MetadataHandler(), plugin); - - //Mob merger TODO: maybe add a config scan here? - pluginManager.registerEvents(new MergeHandler(), plugin); + register(new MetadataHandler()); //Natural EliteMobs Spawning - if (ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.NATURAL_MOB_SPAWNING)) { - pluginManager.registerEvents(new NaturalEliteMobSpawnEventHandler(), plugin); - pluginManager.registerEvents(new EntityTracker(), plugin); - } + register(new EntityTracker()); + //Fix lingering entity after crashes + register(new CrashFix()); //Natural Mob Metadata Assigner - pluginManager.registerEvents(new NaturalMobSpawnEventHandler(), plugin); + register(new NaturalMobSpawnEventHandler()); //Visual effects - pluginManager.registerEvents(new EffectEventHandlers(), plugin); - if (ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.OBFUSCATE_MOB_POWERS)) - pluginManager.registerEvents(new VisualEffectObfuscator(), plugin); + register(new EffectEventHandlers()); + if (MobCombatSettingsConfig.isObfuscateMobPowers()) + register(new VisualEffectObfuscator()); //Loot - if (ConfigValues.itemsDropSettingsConfig.getBoolean(ItemsDropSettingsConfig.ENABLE_PLUGIN_LOOT)) { - pluginManager.registerEvents(new LootTables(), plugin); - pluginManager.registerEvents(new PlaceEventPrevent(), plugin); + if (ItemSettingsConfig.isDoEliteMobsLoot()) { + register(new LootTables()); + register(new PlaceEventPrevent()); } + //player status menu + register(new CoverPage.CoverPageEvents()); + register(new StatsPage.StatsPageEvents()); + register(new GearPage.GearPageEvents()); + register(new TeleportsPage.TeleportsPageEvents()); + register(new CommandsPage.CommandsPageEvents()); + register(new BossTrackingPage.BossTrackingPageEvents()); + register(new InstancedDungeonBrowser.InstancedDungeonBrowserEvents()); + //Shops - pluginManager.registerEvents(new ShopHandler(), plugin); - pluginManager.registerEvents(new CustomShopHandler(), plugin); - pluginManager.registerEvents(new ItemSaleEvent(), plugin); + register(new ProceduralShopMenu.ProceduralShopMenuEvents()); + register(new CustomShopMenu.CustomShopMenuEvents()); + register(new BuyOrSellMenu.BuyOrSellMenuEvents()); + register(new SellMenu()); + register(new SetupMenu.SetupMenuListeners()); + register(new ScrapperMenu.ScrapperMenuEvents()); + register(new RepairMenu.RepairMenuEvents()); + register(new UnbindMenu.UnbinderMenuEvents()); + register(new ItemEnchantmentMenu.ItemEnchantMenuEvents()); + + //loot menu + register(new LootMenu.LootMenuEvents()); //Minecraft behavior canceller - pluginManager.registerEvents(new ChunkUnloadMetadataPurge(), plugin); - pluginManager.registerEvents(new EntityDeathDataFlusher(), plugin); - if (ConfigValues.defaultConfig.getBoolean(DefaultConfig.CREEPER_PASSIVE_DAMAGE_PREVENTER)) - pluginManager.registerEvents(new PreventCreeperPassiveEntityDamage(), plugin); - //Prevent exploits - //Prevent mount exploit - if (ConfigValues.defaultConfig.getBoolean(DefaultConfig.PREVENT_MOUNT_EXPLOIT)) - pluginManager.registerEvents(new PreventMountExploit(), plugin); - //Prevent darkroom exploit - if (ConfigValues.defaultConfig.getBoolean(DefaultConfig.PREVENT_DARKROOM_EXPLOIT)) - pluginManager.registerEvents(new PreventDarkroomExploit(), plugin); - //Prevent tower exploit - if (ConfigValues.defaultConfig.getBoolean(DefaultConfig.PREVENT_TOWER_EXPLOIT)) - pluginManager.registerEvents(new PreventTowerExploit(), plugin); - - - if (!VersionChecker.currentVersionIsUnder(11, 0)) { - //Initialize custom events - pluginManager.registerEvents(new SmallTreasureGoblin(), plugin); - pluginManager.registerEvents(new TreasureGoblin(), plugin); - pluginManager.registerEvents(new DeadMoon(), plugin); - pluginManager.registerEvents(new TheReturned(), plugin); - pluginManager.registerEvents(new ZombieKing(), plugin); - pluginManager.registerEvents(new SpiritWalk(), plugin); - - if (ConfigValues.eventsConfig.getBoolean(EventsConfig.KRAKEN_ENABLED)) { - pluginManager.registerEvents(new Kraken(), plugin); - pluginManager.registerEvents(new KrakenEvent(), plugin); - } - if (ConfigValues.eventsConfig.getBoolean(EventsConfig.BALROG_ENABLED)) { - pluginManager.registerEvents(new Balrog(), plugin); - pluginManager.registerEvents(new BalrogEvent(), plugin); - } - if (ConfigValues.eventsConfig.getBoolean(EventsConfig.FAE_ENABLED)) { - pluginManager.registerEvents(new FaeEvent(), plugin); - pluginManager.registerEvents(new Fae(), plugin); - } - } - + register(new PreventEliteBeeHiveEnter()); + register(new EnderDragonUnstuck()); + if (DefaultConfig.isPreventVanillaReinforcementsForEliteEntities()) + register(new VanillaReinforcementsCanceller()); + register(new LightningSpawnBypass()); + if (ItemSettingsConfig.isEliteDurability()) + register(new AlternativeDurabilityLoss()); + register(new EnderCrystalDamageProtectionBypass()); + register(new NPCsBecomeWitches()); + register(new PreventEliteSilverfishBlockEnter()); + + + //Antiexploits + register(new PreventMountExploit()); + register(new PreventDarkroomExploit()); + register(new PreventLargeDarkroomExploit()); + register(new PreventEndermanHeightExploit()); + if (AntiExploitConfig.isNoItemPickup()) + register(new PreventItemPickupByMobs()); + if (AntiExploitConfig.isAmbientDamageExploit()) + register(new AmbientDamageExploit()); + register(new HoneyBlockJumpExploit()); + register(new EliteMobDamagedByPlayerAntiExploitListener()); + if (AntiExploitConfig.isNoPathExploit()) + register(new PreventPathfindingExploit()); + + register(new ActionEvent.ActionEventEvents()); //Set up health and damage displays - if (ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.DISPLAY_HEALTH_ON_HIT)) - pluginManager.registerEvents(new HealthDisplay(), plugin); - if (ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.DISPLAY_DAMAGE_ON_HIT)) - pluginManager.registerEvents(new DamageDisplay(), plugin); + if (MobCombatSettingsConfig.isDisplayHealthOnHit()) + register(new HealthDisplay()); + if (MobCombatSettingsConfig.isDisplayDamageOnHit()) + register(new PopupDisplay()); //Initialize items from custom events - pluginManager.registerEvents(new FlamethrowerEnchantment(), plugin); + register(new FlamethrowerEnchantment.FlamethrowerEnchantmentEvents()); + register(new SummonMerchantEnchantment.SummonMerchantEvents()); + register(new SummonWolfEnchantment.SummonWolfEnchantmentEvent()); + register(new MeteorShowerEnchantment.MeteorShowerEvents()); + register(new DrillingEnchantment.DrillingEnchantmentEvents()); + register(new IceBreakerEnchantment.IceBreakerEnchantmentEvent()); + register(new GrapplingHookEnchantment.GrapplingHookEnchantmentEvents()); + register(new EarthquakeEnchantment.EarthquakeEnchantmentEvents()); + //register(new UnbindEnchantment.UnbindEvents()); //Initialize adventurer's guild - pluginManager.registerEvents(new AdventurersGuildGUI(), plugin); + register(new GuildRankMenuHandler()); + register(new WorldSwitchBehavior()); + //register quests + register(new KillObjective.KillObjectiveEvents()); + register(new CustomFetchObjective.CustomFetchObjectiveEvents()); + register(new DialogObjective.DialogObjectiveEvents()); + register(new ArenaObjective.ArenaObjectiveEvents()); + register(new QuestAcceptEvent.QuestAcceptEventHandler()); + register(new QuestCompleteEvent.QuestCompleteEventHandler()); + register(new QuestLeaveEvent.QuestLeaveEventHandler()); + register(new QuestProgressionEvent.QuestProgressionEventHandler()); + register(new QuestTracking.QuestTrackingEvents()); + register(new CustomQuest.CustomQuestEvents()); + register(new QuestInventoryMenu.QuestInventoryMenuEvents()); + register(new ArenaCompleteEvent.ArenaCompleteEventHandler()); + + //Songs + register(new CustomMusic.CustomMusicEvents()); + + //Arenas + register(new ArenaMenu.ArenaMenuEvents()); + register(new ArenaInstance.ArenaInstanceEvents()); + register(new MatchInstance.MatchInstanceEvents()); //Combat tag - if (ConfigValues.combatTagConfig.getBoolean(CombatTagConfig.ENABLE_COMBAT_TAG)) - pluginManager.registerEvents(new CombatTag(), plugin); + if (CombatTagConfig.isEnableCombatTag()) + register(new CombatTag()); - //Prevent elitemob on elitemob aggro - pluginManager.registerEvents(new AggroPrevention(), plugin); - //Refresh display case Elite Mobs - pluginManager.registerEvents(new DisplayMob(), plugin); + //Prevent elitemob on elitemob aggro + register(new EnderDragonUnstuck.AggroPrevention()); //Player effect when a rare item is on the ground - if (ConfigValues.itemsDropSettingsConfig.getBoolean(ItemsDropSettingsConfig.ENABLE_RARE_DROP_EFFECT)) - pluginManager.registerEvents(new RareDropEffect(), plugin); + register(new RareDropEffect()); + + //NPCs + register(new NPCDamageEvent()); + register(new NPCInteractions()); + register(new NPCProximitySensor()); + register(new NPCEntity.NPCEntityEvents()); + register(new FindNewWorlds()); + if (EliteMobs.worldGuardIsEnabled) { + register(new WorldGuardSpawnEventBypasser()); + register(new WorldGuardEliteMobOnlySpawnFlag()); + register(new WorldGuardDungeonFlag()); + register(new WorldGuardExplosionBlockDamageFlag()); + } + register(new DungeonProtector()); + + register(new EntityTransformHandler()); + register(new EliteBlazeWaterDamagePrevention()); + register(new PreventEliteEquipmentDrop()); + register(new CombustionPrevention()); + register(new EliteSlimeDeathSplit()); + register(new LightningImmunity()); + + register(new TreasureChest.TreasureChestEvents()); + + //On death commands + register(new OnDeathCommands()); + + //Player stuff + register(new GuildRank.GuildRankEvents()); + + //Commands + register(new RemoveCommand.RemoveCommandEvents()); + + } + + private static void registerPower(Listener listener, String config) { + if (PowersConfig.getPower(config).isEnabled()) + register(listener); + } + private static void register(Listener listener) { + pluginManager.registerEvents(listener, plugin); } } diff --git a/src/main/java/com/magmaguy/elitemobs/MetadataHandler.java b/src/main/java/com/magmaguy/elitemobs/MetadataHandler.java index c6ca774fa..69083d1e8 100644 --- a/src/main/java/com/magmaguy/elitemobs/MetadataHandler.java +++ b/src/main/java/com/magmaguy/elitemobs/MetadataHandler.java @@ -1,23 +1,7 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package com.magmaguy.elitemobs; -import org.bukkit.Bukkit; import org.bukkit.event.Listener; -import org.bukkit.plugin.Plugin; +import org.bukkit.plugin.java.JavaPlugin; /** * Created by MagmaGuy on 26/04/2017. @@ -32,13 +16,11 @@ public class MetadataHandler implements Listener { //plugin name public final static String ELITE_MOBS = "EliteMobs"; - - //plugin getter - public final static Plugin PLUGIN = Bukkit.getPluginManager().getPlugin(MetadataHandler.ELITE_MOBS); - //third party compatibility public final static String BETTERDROPS_COMPATIBILITY_MD = "betterdrops_ignore"; - public final static String VANISH_NO_PACKET = "vanished"; + //plugin getter + public static JavaPlugin PLUGIN; + public static int signatureID = 31173; } diff --git a/src/main/java/com/magmaguy/elitemobs/adventurersguild/AdventurersGuildGUI.java b/src/main/java/com/magmaguy/elitemobs/adventurersguild/AdventurersGuildGUI.java deleted file mode 100644 index d0c65720c..000000000 --- a/src/main/java/com/magmaguy/elitemobs/adventurersguild/AdventurersGuildGUI.java +++ /dev/null @@ -1,382 +0,0 @@ -package com.magmaguy.elitemobs.adventurersguild; - -import com.magmaguy.elitemobs.ChatColorConverter; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.EconomySettingsConfig; -import com.magmaguy.elitemobs.economy.EconomyHandler; -import com.magmaguy.elitemobs.playerdata.PlayerData; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemFlag; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.inventory.meta.SkullMeta; - -import java.util.Arrays; -import java.util.List; - -public class AdventurersGuildGUI implements Listener { - - private static ItemStack difficulty = new ItemStack(Material.DIAMOND_SWORD); - private static ItemStack quest = skullItemInitializer("MHF_Question", "Quests", Arrays.asList("Coming soon!")); - - public static void mainMenu(Player player) { - - Inventory mainMenu = Bukkit.createInventory(player, 27, "Adventurer's guild"); - - difficulty = new ItemStack(Material.DIAMOND_SWORD); - ItemMeta difficultyMeta = difficulty.getItemMeta(); - difficultyMeta.setDisplayName("Difficulty"); - difficultyMeta.setLore(Arrays.asList("Press me to select a difficulty!")); - difficultyMeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); - difficulty.setItemMeta(difficultyMeta); - - quest = skullItemInitializer("MHF_Question", "Quests", Arrays.asList("Coming soon!")); - - mainMenu.setItem(11, difficulty); - mainMenu.setItem(15, quest); - - player.openInventory(mainMenu); - - } - - public static void difficultyMenu(Player player) { - - Inventory difficultyMenu = Bukkit.createInventory(player, 27, "Guild rank selector"); - - if (!PlayerData.playerMaxGuildRank.containsKey(player.getUniqueId())) { - PlayerData.playerMaxGuildRank.put(player.getUniqueId(), 10); - PlayerData.playerMaxGuildRankChanged = true; - } - - if (!PlayerData.playerSelectedGuildRank.containsKey(player.getUniqueId())) { - PlayerData.playerSelectedGuildRank.put(player.getUniqueId(), 10); - PlayerData.playerSelectedGuildRankChanged = true; - } - - for (int i = 1; i < 21; i++) { - - ItemStack itemStack = null; - - if (i <= PlayerData.playerMaxGuildRank.get(player.getUniqueId())) - itemStack = difficultyItemStackConstructor(guildRankStatus.UNLOCKED, i, player); - if (i > PlayerData.playerMaxGuildRank.get(player.getUniqueId())) - itemStack = difficultyItemStackConstructor(guildRankStatus.LOCKED, i, player); - if (i == PlayerData.playerSelectedGuildRank.get(player.getUniqueId())) - itemStack = difficultyItemStackConstructor(guildRankStatus.SELECTED, i, player); - if (i == PlayerData.playerMaxGuildRank.get(player.getUniqueId()) + 1) { - itemStack = difficultyItemStackConstructor(guildRankStatus.NEXT_UNLOCK, i, player); - - } - - difficultyMenu.addItem(itemStack); - - } - - player.openInventory(difficultyMenu); - - } - - private static ItemStack difficultyItemStackConstructor(guildRankStatus guildRankStatus, int rank, Player player) { - - ItemStack itemStack = null; - - switch (guildRankStatus) { - - case UNLOCKED: - itemStack = new ItemStack(Material.STAINED_GLASS_PANE, 1, (byte) 7); - ItemMeta unlockedMeta = itemStack.getItemMeta(); - String lowTierWarning = ""; - if (rank < 10) lowTierWarning = ChatColorConverter.convert("&cElites can't drop better loot!"); - else lowTierWarning = ChatColorConverter.convert("&aElites can drop better loot!"); - unlockedMeta.setLore(Arrays.asList( - ChatColorConverter.convert("&f&m-------------------------------"), - ChatColorConverter.convert( "&aThis rank is unlocked!"), - ChatColorConverter.convert("&fYou can select it."), - lowTierWarning, - ChatColorConverter.convert("&f&m-------------------------------"), - lootBonus(rank), - mobSpawning(rank), - difficultyBonus(rank))); - itemStack.setItemMeta(unlockedMeta); - break; - case LOCKED: - itemStack = new ItemStack(Material.STAINED_GLASS_PANE, 1, (byte) 14); - ItemMeta lockedMeta = itemStack.getItemMeta(); - lockedMeta.setLore(Arrays.asList( - ChatColorConverter.convert("&f&m-------------------------------"), - ChatColorConverter.convert("&cThis rank is locked!"), - ChatColorConverter.convert("&cYou need rank " + (PlayerData.playerMaxGuildRank.get(player.getUniqueId()) + 1) + " first!"), - ChatColorConverter.convert("&f&m-------------------------------"), - lootBonus(rank), - mobSpawning(rank), - difficultyBonus(rank))); - itemStack.setItemMeta(lockedMeta); - break; - case SELECTED: - itemStack = new ItemStack(Material.STAINED_GLASS_PANE, 1, (byte) 5); - ItemMeta selectedMeta = itemStack.getItemMeta(); - String tierWarning = ""; - if (rank < 10) tierWarning = ChatColorConverter.convert("&cElites can't drop better loot!"); - else tierWarning = ChatColorConverter.convert("&aElites can drop better loot!"); - selectedMeta.setLore(Arrays.asList( - ChatColorConverter.convert("&f&m-------------------------------"), - ChatColorConverter.convert("&aThis is your current rank!"), - tierWarning, - ChatColorConverter.convert("&f&m-------------------------------"), - lootBonus(rank), - mobSpawning(rank), - difficultyBonus(rank))); - itemStack.setItemMeta(selectedMeta); - PlayerData.playerSelectedGuildRankChanged = true; - break; - case NEXT_UNLOCK: - itemStack = new ItemStack(Material.STAINED_GLASS_PANE, 1, (byte) 1); - ItemMeta nextMeta = itemStack.getItemMeta(); - String priceString = ""; - if (!PlayerData.playerCurrency.containsKey(player.getUniqueId())) PlayerData.playerCurrency.put(player.getUniqueId(), 0.0); - if (tierPriceCalculator(rank) > PlayerData.playerCurrency.get(player.getUniqueId())) - priceString = "&c" + tierPriceCalculator(rank); - else - priceString = "&a" + tierPriceCalculator(rank); - nextMeta.setLore(Arrays.asList( - ChatColorConverter.convert("&f&m-------------------------------"), - ChatColorConverter.convert("&6This is the next rank you can unlock"), - ChatColorConverter.convert("&aSelect it when you're ready!"), - ChatColorConverter.convert("&6Costs " + priceString + " &6" + ConfigValues.economyConfig.getString(EconomySettingsConfig.CURRENCY_NAME)), - ChatColorConverter.convert("&fYou have &a" + PlayerData.playerCurrency.get(player.getUniqueId()) + " &f" + ConfigValues.economyConfig.getString(EconomySettingsConfig.CURRENCY_NAME)), - ChatColorConverter.convert("&f&m-------------------------------"), - lootBonus(rank), - mobSpawning(rank), - difficultyBonus(rank))); - itemStack.setItemMeta(nextMeta); - PlayerData.playerMaxGuildRankChanged = true; - break; - } - - ItemMeta itemMeta = itemStack.getItemMeta(); - itemMeta.setDisplayName(rankNamer(rank) + " rank"); - itemStack.setItemMeta(itemMeta); - - return itemStack; - - } - - private static String rankNamer(int rank) { - - String name = ""; - - if (rank == 1) name = "&8Peaceful Villager"; - if (rank == 2) name = "&8Commoner"; - if (rank == 3) name = "&8Farmer"; - if (rank == 4) name = "&8Bard"; - if (rank == 5) name = "&8Barkeep"; - if (rank == 6) name = "&8Blacksmith"; - if (rank == 7) name = "&8Merchant"; - if (rank == 8) name = "&8Wanderer"; - if (rank == 9) name = "&8Ranger"; - if (rank == 10) name = "&fCasual Adventurer"; - if (rank == 11) name = "&fAdventurer"; - if (rank == 12) name = "&fProfessional Adventurer"; - if (rank == 13) name = "&2Elite Adventurer"; - if (rank == 14) name = "&2Master Adventurer"; - if (rank == 15) name = "&2Raider"; - if (rank == 16) name = "&1Slayer"; - if (rank == 17) name = "&1Exterminator"; - if (rank == 18) name = "&5&lElite HunterEnchantment"; - if (rank == 19) name = "&5Hero"; - if (rank == 20) name = "&6&l&oLegend"; - - return ChatColorConverter.convert(name); - - } - - private static String mobSpawning(int rank) { - - int mobSpawning = 0; - - if (rank == 1) mobSpawning = 10; - if (rank == 2) mobSpawning = 20; - if (rank == 3) mobSpawning = 30; - if (rank == 4) mobSpawning = 40; - if (rank == 5) mobSpawning = 50; - if (rank == 6) mobSpawning = 60; - if (rank == 7) mobSpawning = 70; - if (rank == 8) mobSpawning = 80; - if (rank == 9) mobSpawning = 90; - if (rank == 10) mobSpawning = 100; - if (rank == 11) mobSpawning = 120; - if (rank == 12) mobSpawning = 140; - if (rank == 13) mobSpawning = 160; - if (rank == 14) mobSpawning = 180; - if (rank == 15) mobSpawning = 200; - if (rank == 16) mobSpawning = 220; - if (rank == 17) mobSpawning = 240; - if (rank == 18) mobSpawning = 260; - if (rank == 19) mobSpawning = 280; - if (rank == 20) mobSpawning = 300; - - return ChatColorConverter.convert("&fElite Mob spawn rate modifier: &c" + mobSpawning + "%"); - - } - - private static String lootBonus(int rank) { - - int lootBonus = 0; - - if (rank == 1) lootBonus = 10; - if (rank == 2) lootBonus = 20; - if (rank == 3) lootBonus = 30; - if (rank == 4) lootBonus = 40; - if (rank == 5) lootBonus = 50; - if (rank == 6) lootBonus = 60; - if (rank == 7) lootBonus = 70; - if (rank == 8) lootBonus = 80; - if (rank == 9) lootBonus = 90; - if (rank == 10) lootBonus = 100; - if (rank == 11) lootBonus = 120; - if (rank == 12) lootBonus = 140; - if (rank == 13) lootBonus = 160; - if (rank == 14) lootBonus = 180; - if (rank == 15) lootBonus = 200; - if (rank == 16) lootBonus = 220; - if (rank == 17) lootBonus = 240; - if (rank == 18) lootBonus = 260; - if (rank == 19) lootBonus = 280; - if (rank == 20) lootBonus = 300; - - return ChatColorConverter.convert("&fElite Mob loot modifier: &a" + lootBonus + "%"); - - } - - private static String difficultyBonus(int rank) { - - int difficultyBonus = 0; - - if (rank == 1) difficultyBonus = 10; - if (rank == 2) difficultyBonus = 20; - if (rank == 3) difficultyBonus = 30; - if (rank == 4) difficultyBonus = 40; - if (rank == 5) difficultyBonus = 50; - if (rank == 6) difficultyBonus = 60; - if (rank == 7) difficultyBonus = 70; - if (rank == 8) difficultyBonus = 80; - if (rank == 9) difficultyBonus = 90; - if (rank == 10) difficultyBonus = 100; - if (rank == 11) difficultyBonus = 110; - if (rank == 12) difficultyBonus = 120; - if (rank == 13) difficultyBonus = 130; - if (rank == 14) difficultyBonus = 140; - if (rank == 15) difficultyBonus = 150; - if (rank == 16) difficultyBonus = 160; - if (rank == 17) difficultyBonus = 170; - if (rank == 18) difficultyBonus = 180; - if (rank == 19) difficultyBonus = 190; - if (rank == 20) difficultyBonus = 200; - - return ChatColorConverter.convert("&fElite Mob difficulty modifier: &4" + difficultyBonus + "%"); - - } - - private enum guildRankStatus { - UNLOCKED, - SELECTED, - NEXT_UNLOCK, - LOCKED - } - - private static void questMenu(Player player) { - - player.closeInventory(); - player.sendMessage("Coming soon!"); - - } - - private static ItemStack skullItemInitializer(String mhfValue, String title, List lore) { - - ItemStack item = new ItemStack(Material.SKULL_ITEM, 1, (short) 3); - ItemMeta itemMeta = item.getItemMeta(); - SkullMeta skullMeta = (SkullMeta) itemMeta; - skullMeta.setOwner(mhfValue); - item.setItemMeta(skullMeta); - itemMeta.setDisplayName(title); - itemMeta.setLore(lore); - item.setItemMeta(itemMeta); - - return item; - - } - - private static int tierPriceCalculator(int tier) { - - return (tier - 10) * (tier - 10) * 1000; - - } - - @EventHandler - public void onMainMenuClick(InventoryClickEvent event) { - - if (!(event.getWhoClicked() instanceof Player)) return; - if (!event.getInventory().getName().equalsIgnoreCase("Adventurer's guild")) return; - if (event.getCurrentItem() == null || event.getCurrentItem().getType().equals(Material.AIR)) return; - if (event.getCurrentItem().equals(difficulty)) - difficultyMenu((Player) event.getWhoClicked()); - if (event.getCurrentItem().equals(quest)) { - event.getWhoClicked().closeInventory(); - event.getWhoClicked().sendMessage("Coming soon!"); - } - - event.setCancelled(true); - - } - - @EventHandler - public void onRankSelectorClick(InventoryClickEvent event) { - - if (!(event.getWhoClicked() instanceof Player)) return; - if (!event.getInventory().getName().equalsIgnoreCase("Guild rank selector")) return; - if (event.getCurrentItem() == null || event.getCurrentItem().getType().equals(Material.AIR)) return; - - event.setCancelled(true); - - if (!event.getClickedInventory().getName().equals("Guild rank selector")){ - event.setCancelled(true); - return; - } - - int maxTier = PlayerData.playerMaxGuildRank.get(event.getWhoClicked().getUniqueId()); - int selectedTier = event.getSlot() + 1; - - if (selectedTier < maxTier + 1) { - PlayerData.playerSelectedGuildRank.put(event.getWhoClicked().getUniqueId(), selectedTier); - difficultyMenu((Player) event.getWhoClicked()); - } - - if (selectedTier == maxTier + 1) { - if (EconomyHandler.checkCurrency(event.getWhoClicked().getUniqueId()) < tierPriceCalculator(selectedTier)) - event.getWhoClicked().sendMessage("[EliteMobs] You don't have enough Elite Coins! Sell some Elite Mob loot to [/em shop]!"); - else { - EconomyHandler.subtractCurrency(event.getWhoClicked().getUniqueId(), tierPriceCalculator(selectedTier)); - PlayerData.playerMaxGuildRank.put(event.getWhoClicked().getUniqueId(), selectedTier); - event.getWhoClicked().sendMessage(ChatColorConverter.convert("&aYou have unlocked the " + rankNamer(selectedTier) + " &arank for " + - tierPriceCalculator(selectedTier) + " " + ConfigValues.economyConfig.getString(EconomySettingsConfig.CURRENCY_NAME) + ". \n&6Happy hunting!")); - difficultyMenu((Player) event.getWhoClicked()); - Bukkit.broadcastMessage(ChatColorConverter.convert( - ((Player) event.getWhoClicked()).getDisplayName() + " has reached the " + rankNamer(selectedTier) + " &fguild rank!")); - } - } - - if (selectedTier > maxTier + 1) { - event.getWhoClicked().sendMessage("[EliteMobs] You need to unlock other ranks first!"); - } - - - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/adventurersguild/GuildRank.java b/src/main/java/com/magmaguy/elitemobs/adventurersguild/GuildRank.java index c477230b3..ead9234e5 100644 --- a/src/main/java/com/magmaguy/elitemobs/adventurersguild/GuildRank.java +++ b/src/main/java/com/magmaguy/elitemobs/adventurersguild/GuildRank.java @@ -1,20 +1,249 @@ package com.magmaguy.elitemobs.adventurersguild; -import com.magmaguy.elitemobs.playerdata.PlayerData; +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.AdventurersGuildConfig; +import com.magmaguy.elitemobs.playerdata.ElitePlayerInventory; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.magmacore.util.Round; +import org.bukkit.attribute.Attribute; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.scheduler.BukkitRunnable; import java.util.UUID; public class GuildRank { - public static int getGuildRank (UUID uuid) { + private GuildRank() { + } + + public static void setGuildPrestigeRank(Player player, int prestigeRank) { + PlayerData.setGuildPrestigeLevel(player.getUniqueId(), prestigeRank); + ElitePlayerInventory.playerInventories.get(player.getUniqueId()).getFullPlayerTier(true); + } + + public static int getGuildPrestigeRank(Player player) { + return getGuildPrestigeRank(player.getUniqueId()); + } + + public static int getGuildPrestigeRank(UUID player) { + return PlayerData.getGuildPrestigeLevel(player); + } + + public static int getGuildPrestigeRank(Player player, boolean databaseAccess) { + return PlayerData.getGuildPrestigeLevel(player.getUniqueId(), databaseAccess); + } - if (PlayerData.playerSelectedGuildRank.containsKey(uuid)) - return PlayerData.playerSelectedGuildRank.get(uuid); + public static void setMaxGuildRank(Player player, int maxGuildRank) { + PlayerData.setMaxGuildLevel(player.getUniqueId(), maxGuildRank); + } + + public static int getMaxGuildRank(Player player) { + return PlayerData.getMaxGuildLevel(player.getUniqueId()); + } - PlayerData.playerSelectedGuildRank.put(uuid, 10); + public static int getMaxGuildRank(Player player, boolean databaseAccess) { + return PlayerData.getMaxGuildLevel(player.getUniqueId(), databaseAccess); + } + + public static void setActiveGuildRank(Player player, int activeGuildRank) { + PlayerData.setActiveGuildLevel(player.getUniqueId(), activeGuildRank); + setMaxHealth(player, activeGuildRank, getGuildPrestigeRank(player)); + } + + public static int getActiveGuildRank(Player player) { + return PlayerData.getActiveGuildLevel(player.getUniqueId()); + } + + public static int getActiveGuildRank(Player player, boolean databaseAccess) { + return PlayerData.getActiveGuildLevel(player.getUniqueId(), databaseAccess); + } + + /** + * Returns whether the player's maximum guild rank is below or equal to the rank to be compared. + * + * @param player Player whose maximum rank will be checked + * @param maxGuildLevel Target guild rank + * @return Whether the player's guild rank is below or equal to the target + */ + public static boolean isWithinMaxGuildRank(Player player, int prestigeLevel, int maxGuildLevel) { + return getGuildPrestigeRank(player) >= prestigeLevel && + getMaxGuildRank(player) >= maxGuildLevel; + } + + public static boolean isWithinMaxGuildRankIgnorePrestige(Player player, int maxGuildLevel) { + return getMaxGuildRank(player) >= maxGuildLevel; + } - return PlayerData.playerSelectedGuildRank.get(uuid); + /** + * Checks if the player's active guild rank is below or equal to the target rank. + * + * @param player Player whose active guild rank will be checked + * @param activeGuildLevel Target rank to check + * @return Whether the target rank is equal to or higher than the player's active guild rank + */ + public static boolean isAtOrAboveGuildRank(Player player, int prestigeLevel, int activeGuildLevel) { + return getGuildPrestigeRank(player) <= prestigeLevel && + getActiveGuildRank(player) <= activeGuildLevel; + } + + public static boolean isAtOrAboveGuildRank(Player player, int activeGuildLevel) { + return getActiveGuildRank(player) >= activeGuildLevel; + } + + /** + * Returns the name of the rank as set by the configuration + * + * @return Name of the rank + */ + public static String getRankName(int prestige, int rank) { + return AdventurersGuildConfig.getRankName(prestige, rank); + } + + public static void setMaxHealth(Player player, int activeGuildRank, int prestigeRank) { + if (!AdventurersGuildConfig.isAddMaxHealth()) return; + if (AdventurersGuildConfig.getWorldsWithoutAGBonuses().contains(player.getWorld().getName())) return; + double guildRankBonus = healthBonusValue(prestigeRank, activeGuildRank); + double newMaxHealth = 20 + guildRankBonus; + player.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(newMaxHealth); + } + + public static void setMaxHealth(Player player) { + setMaxHealth(player, PlayerData.getActiveGuildLevel(player.getUniqueId()), PlayerData.getGuildPrestigeLevel(player.getUniqueId())); + } + + public static double lootTierValue(int activeGuildRank) { + return activeGuildRank * 10; + } + + public static double currencyBonusMultiplier(int prestigeLevel) { + return 1D + prestigeLevel * 5; + } + + public static double currencyBonusMultiplier(UUID player) { + return currencyBonusMultiplier(getGuildPrestigeRank(player)); + } + + /** + * Returns the per-tier max health, taking prestige ranks into account + * + * @param prestigeLevel + * @param guildRank + * @return + */ + public static double healthBonusValue(int prestigeLevel, int guildRank) { + if (!AdventurersGuildConfig.isAddMaxHealth()) return 0; + double prestigeBonus = 0; + switch (prestigeLevel) { + case 0: + prestigeBonus = 0; + break; + case 1: + case 2: + case 3: + prestigeBonus = AdventurersGuildConfig.getHealth1(); + break; + case 4: + case 5: + case 6: + prestigeBonus = AdventurersGuildConfig.getHealth2(); + break; + case 7: + case 8: + case 9: + prestigeBonus = AdventurersGuildConfig.getHealth3(); + break; + case 10: + prestigeBonus = AdventurersGuildConfig.getHealth4(); + break; + } + return prestigeBonus * guildRank; + } + + /** + * Returns the per-tier dodge multiplier, taking prestige ranks into account + * + * @param prestigeLevel + * @param guildRank + * @return + */ + public static double dodgeBonusValue(int prestigeLevel, int guildRank) { + if (!AdventurersGuildConfig.isAddDodge()) return 0; + double prestigeBonus = 0; + switch (prestigeLevel) { + case 0: + case 1: + case 2: + prestigeBonus = 0; + break; + case 3: + case 4: + case 5: + prestigeBonus = AdventurersGuildConfig.getDodge1(); + break; + case 6: + case 7: + case 8: + prestigeBonus = AdventurersGuildConfig.getDodge2(); + break; + case 9: + case 10: + prestigeBonus = AdventurersGuildConfig.getDodge3(); + break; + } + return Round.twoDecimalPlaces(guildRank / (10D + prestigeLevel) * prestigeBonus); + } + + /** + * Returns the per-tier crit multiplier, taking prestige ranks into account + * + * @param prestigeLevel + * @param guildRank + * @return + */ + public static double critBonusValue(int prestigeLevel, int guildRank) { + if (!AdventurersGuildConfig.isAddCrit()) return 0; + double prestigeBonus = 0; + switch (prestigeLevel) { + case 0: + case 1: + prestigeBonus = 0; + break; + case 2: + case 3: + case 4: + prestigeBonus = AdventurersGuildConfig.getCrit1(); + break; + case 5: + case 6: + case 7: + prestigeBonus = AdventurersGuildConfig.getCrit2(); + break; + case 8: + case 9: + case 10: + prestigeBonus = AdventurersGuildConfig.getCrit3(); + break; + } + return Round.twoDecimalPlaces(guildRank / (10D + prestigeLevel) * prestigeBonus); + } + + public static class GuildRankEvents implements Listener { + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + new BukkitRunnable() { + @Override + public void run() { + if (event.getPlayer().isOnline()) + setMaxHealth(event.getPlayer(), + GuildRank.getActiveGuildRank(event.getPlayer(), true), + GuildRank.getGuildPrestigeRank(event.getPlayer(), true)); + } + }.runTaskLater(MetadataHandler.PLUGIN, 20 * 3); + } } } diff --git a/src/main/java/com/magmaguy/elitemobs/adventurersguild/GuildRankMenuHandler.java b/src/main/java/com/magmaguy/elitemobs/adventurersguild/GuildRankMenuHandler.java new file mode 100644 index 000000000..3d2525113 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/adventurersguild/GuildRankMenuHandler.java @@ -0,0 +1,360 @@ +package com.magmaguy.elitemobs.adventurersguild; + +import com.magmaguy.elitemobs.config.AdventurersGuildConfig; +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.config.EconomySettingsConfig; +import com.magmaguy.elitemobs.config.SoundsConfig; +import com.magmaguy.elitemobs.config.menus.premade.GuildRankMenuConfig; +import com.magmaguy.elitemobs.economy.EconomyHandler; +import com.magmaguy.elitemobs.quests.playercooldowns.PlayerQuestCooldowns; +import com.magmaguy.magmacore.util.ChatColorConverter; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; + +public class GuildRankMenuHandler implements Listener { + + private static final HashSet inventories = new HashSet<>(); + private static final ArrayList rankSlots = new ArrayList<>(new ArrayList<>(List.of( + 4, 11, 12, 13, 14, 15, 20, 21, 22, 23, 24, 29, 30, 31, 32, 33, 38, 39, 40, 41, 42))); + private static final int prestigeRankSlot = 49; + + private static void selectUnlockedRank(Player player, int guildRank) { + GuildRank.setActiveGuildRank(player, guildRank); + } + + private static void selectRankToUnlock(Player player, int guildRank) { + double price = tierPriceCalculator(guildRank, GuildRank.getGuildPrestigeRank(player)); + if (EconomyHandler.checkCurrency(player.getUniqueId()) < price) { + player.sendMessage(GuildRankMenuConfig.getNotEnoughCurrencyMessage() + .replace("$neededAmount", tierPriceCalculator(guildRank, GuildRank.getGuildPrestigeRank(player)) + "") + .replace("$currentAmount", EconomyHandler.checkCurrency(player.getUniqueId()) + "") + .replace("$currencyName", EconomySettingsConfig.getCurrencyName())); + return; + } + EconomyHandler.subtractCurrency(player.getUniqueId(), price); + GuildRank.setActiveGuildRank(player, guildRank); + GuildRank.setMaxGuildRank(player, guildRank); + player.sendMessage(GuildRankMenuConfig.getUnlockMessage() + .replace("$rankName", GuildRank.getRankName(GuildRank.getGuildPrestigeRank(player), guildRank)) + .replace("$price", tierPriceCalculator(guildRank, GuildRank.getGuildPrestigeRank(player)) + "") + .replace("$currencyName", EconomySettingsConfig.getCurrencyName())); + + Bukkit.broadcastMessage(GuildRankMenuConfig.getBroadcastMessage() + .replace("$player", player.getDisplayName()) + .replace("$rankName", GuildRank.getRankName(GuildRank.getGuildPrestigeRank(player), guildRank))); + if (!AdventurersGuildConfig.getOnRankUpCommand().isEmpty()) + for (String command : AdventurersGuildConfig.getOnRankUpCommand()) + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), + command.replace("$player", player.getName()) + .replace("$prestigeRank", GuildRank.getActiveGuildRank(player) + "") + .replace("$activeRank", GuildRank.getGuildPrestigeRank(player) + "")); + player.playSound(player.getLocation(), SoundsConfig.guildRankUpSound, 1, 1); + } + + private static void selectPrestigeUnlock(Player player) { + if (GuildRank.getGuildPrestigeRank(player) >= 10) return; + if (GuildRank.getActiveGuildRank(player) != 10 + GuildRank.getGuildPrestigeRank(player)) + return; + if (EconomyHandler.checkCurrency(player.getUniqueId()) < tierPriceCalculator(GuildRank.getGuildPrestigeRank(player) + 12, GuildRank.getGuildPrestigeRank(player))) { + player.sendMessage(GuildRankMenuConfig.getNotEnoughCurrencyMessage() + .replace("$neededAmount", tierPriceCalculator(GuildRank.getGuildPrestigeRank(player) + 12, GuildRank.getGuildPrestigeRank(player)) + "") + .replace("$currentAmount", EconomyHandler.checkCurrency(player.getUniqueId()) + "") + .replace("$currencyName", EconomySettingsConfig.getCurrencyName())); + return; + } + EconomyHandler.setCurrency(player.getUniqueId(), 0); + GuildRank.setMaxGuildRank(player, 1); + GuildRank.setActiveGuildRank(player, 1); + GuildRank.setGuildPrestigeRank(player, GuildRank.getGuildPrestigeRank(player) + 1); + PlayerQuestCooldowns.resetPlayerQuests(player); + + for (Player iteratedPlayer : Bukkit.getOnlinePlayers()) { + iteratedPlayer.sendTitle( + ChatColorConverter.convert(AdventurersGuildConfig.getPrestigeUnlockMessageTitle().replace("$player", player.getDisplayName()) + .replace("$tier", GuildRank.getGuildPrestigeRank(player) + "")), + ChatColorConverter.convert(AdventurersGuildConfig.getPrestigeUnlockMessageSubtitle().replace("$player", player.getDisplayName()) + .replace("$tier", GuildRank.getGuildPrestigeRank(player) + ""))); + } + player.closeInventory(); + if (!AdventurersGuildConfig.getOnPrestigeUpCommand().isEmpty()) + for (String command : AdventurersGuildConfig.getOnPrestigeUpCommand()) + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), + command.replace("$player", player.getName()) + .replace("$prestigeRank", GuildRank.getActiveGuildRank(player) + "") + .replace("$activeRank", GuildRank.getGuildPrestigeRank(player) + "")); + player.playSound(player.getLocation(), SoundsConfig.guildPrestigeSound, 1, 1); + } + + /** + * Using the following slots for the menu: + * 4 - Commoner rank + * Normal ranks: + * 11, 12, 13, 14, 15 + * 20, 21, 22, 23, 24 + * 39, 30, 31, 32, 34 + * 38, 39, 40, 41, 42 + * 49 - Prestige button + * + * @param player Player for whom the menu will be generated + * @return Returns the inventory generated + */ + public static Inventory initializeGuildRankMenu(Player player) { + String menuName = GuildRankMenuConfig.getMenuName(); + if (DefaultConfig.isForceMenuUnicode() || Bukkit.getPluginManager().isPluginEnabled("ResourcePackManager")) + menuName = ChatColor.WHITE + "\uF801\uDA90\uDEFA\uF805 " + menuName; + Inventory difficultyMenu = Bukkit.createInventory(player, 54, menuName); + difficultyMenu = populateInventory(difficultyMenu, player); + inventories.add(difficultyMenu); + player.openInventory(difficultyMenu); + return difficultyMenu; + } + + public static Inventory populateInventory(Inventory difficultyMenu, Player player) { + for (int i = 0; i < 11 + GuildRank.getGuildPrestigeRank(player); i++) { + if (AdventurersGuildConfig.isDisableCommonerRank() && i == 0) continue; + ItemStack itemStack = null; + if (GuildRank.isAtOrAboveGuildRank(player, i)) { + itemStack = difficultyItemStackConstructor(guildRankStatus.UNLOCKED, i, player, false); + } + if (GuildRank.getActiveGuildRank(player) < i && GuildRank.getMaxGuildRank(player) >= i) { + itemStack = difficultyItemStackConstructor(guildRankStatus.UNLOCKED, i, player, false); + } + if (GuildRank.getActiveGuildRank(player) == i) { + itemStack = difficultyItemStackConstructor(guildRankStatus.SELECTED, i, player, false); + } + if (GuildRank.getMaxGuildRank(player) < i) { + itemStack = difficultyItemStackConstructor(guildRankStatus.LOCKED, i, player, false); + } + if (GuildRank.getMaxGuildRank(player) + 1 == i) { + itemStack = difficultyItemStackConstructor(guildRankStatus.NEXT_UNLOCK, i, player, false); + } + difficultyMenu.setItem(rankSlots.get(i), itemStack); + } + + if (GuildRank.getGuildPrestigeRank(player) < 10) { + if (GuildRank.getActiveGuildRank(player) < 10 + GuildRank.getGuildPrestigeRank(player)) + difficultyMenu.setItem(prestigeRankSlot, difficultyItemStackConstructor + (guildRankStatus.PRESTIGE_LOCKED, GuildRank.getGuildPrestigeRank(player) + 1, player, true)); + else + difficultyMenu.setItem(prestigeRankSlot, difficultyItemStackConstructor + (guildRankStatus.PRESTIGE_NEXT_UNLOCK, GuildRank.getGuildPrestigeRank(player) + 1, player, true)); + } + + return difficultyMenu; + } + + private static ItemStack difficultyItemStackConstructor(guildRankStatus guildRankStatus, int activeGuildRank, Player player, boolean isPrestigeSlot) { + + ItemStack itemStack = null; + + String priceString = ""; + if (!isPrestigeSlot) + if (tierPriceCalculator(activeGuildRank, GuildRank.getGuildPrestigeRank(player)) > EconomyHandler.checkCurrency(player.getUniqueId())) + priceString = "&c" + tierPriceCalculator(activeGuildRank, GuildRank.getGuildPrestigeRank(player)); + else + priceString = "&a" + tierPriceCalculator(activeGuildRank, GuildRank.getGuildPrestigeRank(player)); + else { + if (tierPriceCalculator(GuildRank.getGuildPrestigeRank(player) + 12, GuildRank.getGuildPrestigeRank(player)) > EconomyHandler.checkCurrency(player.getUniqueId())) + priceString = "&c" + tierPriceCalculator(GuildRank.getGuildPrestigeRank(player) + 12, GuildRank.getGuildPrestigeRank(player)); + else + priceString = "&a" + tierPriceCalculator(GuildRank.getGuildPrestigeRank(player) + 12, GuildRank.getGuildPrestigeRank(player)); + } + switch (guildRankStatus) { + case UNLOCKED: + itemStack = constructButtonItemStack(activeGuildRank, GuildRankMenuConfig.getUnlockedButton().clone(), player, priceString); + break; + case LOCKED: + itemStack = constructButtonItemStack(activeGuildRank, GuildRankMenuConfig.getLockedButton().clone(), player, priceString); + break; + case SELECTED: + itemStack = constructButtonItemStack(activeGuildRank, GuildRankMenuConfig.getCurrentButton().clone(), player, priceString); + break; + case NEXT_UNLOCK: + itemStack = constructButtonItemStack(activeGuildRank, GuildRankMenuConfig.getNextButton().clone(), player, priceString); + break; + case PRESTIGE_LOCKED: + itemStack = constructButtonItemStack(activeGuildRank, GuildRankMenuConfig.getPrestigeLockedButton().clone(), player, priceString); + break; + case PRESTIGE_NEXT_UNLOCK: + itemStack = constructButtonItemStack(activeGuildRank, GuildRankMenuConfig.getPrestigeNextUnlockButton().clone(), player, priceString); + break; + } + + ItemMeta itemMeta = itemStack.getItemMeta(); + if (guildRankStatus.equals(GuildRankMenuHandler.guildRankStatus.UNLOCKED) || + guildRankStatus.equals(GuildRankMenuHandler.guildRankStatus.LOCKED) || + guildRankStatus.equals(GuildRankMenuHandler.guildRankStatus.SELECTED) || + guildRankStatus.equals(GuildRankMenuHandler.guildRankStatus.NEXT_UNLOCK)) + itemMeta.setDisplayName(GuildRank.getRankName(GuildRank.getGuildPrestigeRank(player), activeGuildRank)); + else + itemMeta.setDisplayName(itemMeta.getDisplayName().replace("$rank", GuildRank.getGuildPrestigeRank(player) + 1 + "")); + itemStack.setItemMeta(itemMeta); + + return itemStack; + + } + + private static ItemStack constructButtonItemStack(int activeGuildRank, ItemStack itemStack, Player player, String priceString) { + ItemMeta itemMeta = itemStack.getItemMeta(); + List newLore = new ArrayList<>(); + for (String string : itemMeta.getLore()) { + switch (string) { + case "$lootTier": + if (lootTierString(activeGuildRank) != null) + newLore.add(lootTierString(activeGuildRank)); + break; + case "$maxHealthIncrease": + if (healthBonusString(GuildRank.getGuildPrestigeRank(player), activeGuildRank) != null) + newLore.add(healthBonusString(GuildRank.getGuildPrestigeRank(player), activeGuildRank)); + break; + case "$chanceToCrit": + if (critBonusString(GuildRank.getGuildPrestigeRank(player), activeGuildRank) != null) + newLore.add(critBonusString(GuildRank.getGuildPrestigeRank(player), activeGuildRank)); + break; + case "$chanceToDodge": + if (dodgeBonusString(GuildRank.getGuildPrestigeRank(player), activeGuildRank) != null) + newLore.add(dodgeBonusString(GuildRank.getGuildPrestigeRank(player), activeGuildRank)); + break; + case "$currencyBonusMessage": + if (GuildRank.getGuildPrestigeRank(player) > 0) + newLore.add(currencyBonusString(GuildRank.getGuildPrestigeRank(player))); + break; + default: + if (string.contains("$previousRank")) { + newLore.add(string.replace("$previousRank", + (GuildRank.getRankName(GuildRank.getGuildPrestigeRank(player), GuildRank.getMaxGuildRank(player) + 1)))); + continue; + } + if (string.contains("$price")) { + newLore.add( + ChatColorConverter.convert( + string.replace("$price", priceString) + .replace("$currencyName", EconomySettingsConfig.getCurrencyName()))); + continue; + } + if (string.contains("$currentCurrency")) { + newLore.add(string + .replace("$currentCurrency", EconomyHandler.checkCurrency(player.getUniqueId()) + "") + .replace("$currencyName", EconomySettingsConfig.getCurrencyName())); + continue; + } + newLore.add(string); + break; + } + } + itemMeta.setLore(newLore); + itemStack.setItemMeta(itemMeta); + return itemStack; + } + + private static String lootTierString(int activeGuildRank) { + if (!AdventurersGuildConfig.isGuildLootLimiter()) return null; + return GuildRankMenuConfig.getLootTierMessage().replace("$tier", GuildRank.lootTierValue(activeGuildRank) + ""); + } + + private static String currencyBonusString(int activeGuildRank) { + return GuildRankMenuConfig.getCurrencyBonusMessage().replace("$amount", GuildRank.currencyBonusMultiplier(activeGuildRank) + ""); + } + + private static String healthBonusString(int prestigeLevel, int guildRank) { + if (!AdventurersGuildConfig.isAddMaxHealth()) return null; + if (prestigeLevel < 1) + return null; + return GuildRankMenuConfig.getHealthBonusMessage().replace("$amount", GuildRank.healthBonusValue(prestigeLevel, guildRank) + ""); + } + + private static String critBonusString(int prestigeLevel, int guildRank) { + if (!AdventurersGuildConfig.isAddMaxHealth()) return null; + if (prestigeLevel < 2) + return null; + return GuildRankMenuConfig.getCritBonusMessage().replace("$amount", GuildRank.critBonusValue(prestigeLevel, guildRank) + ""); + } + + private static String dodgeBonusString(int prestigeLevel, int guildRank) { + if (!AdventurersGuildConfig.isAddMaxHealth()) return null; + if (prestigeLevel < 3) + return null; + return GuildRankMenuConfig.getDodgeBonusMessage().replace("$amount", GuildRank.dodgeBonusValue(prestigeLevel, guildRank) + ""); + } + + private static int tierPriceCalculator(int tier, int prestigeLevel) { + /*Logic: + tier * 10 = max mob tier + max mob tier / 2 = loot shower payout for killing 1 em at max level for that player + payout * 1000 = amount of elite mobs to kill before going up a rank + */ + double eliteMobsToKillBeforeGuildRankUp = AdventurersGuildConfig.getBaseKillsForRankUp() + AdventurersGuildConfig.getAdditionalKillsForRankUpPerTier() * (tier - 1); + return (int) ((tier - 1) * 10D / 2D * eliteMobsToKillBeforeGuildRankUp * (GuildRank.currencyBonusMultiplier(prestigeLevel))); + } + + @EventHandler + public void onRankSelectorClick(InventoryClickEvent event) { + if (!(event.getWhoClicked() instanceof Player player)) return; + if (!inventories.contains(event.getInventory())) return; + if (event.getCurrentItem() == null || event.getCurrentItem().getType() == Material.AIR) return; + event.setCancelled(true); + + if (event.getSlot() == prestigeRankSlot) { + selectPrestigeUnlock(player); + return; + } + Integer selectedRank = null; + + for (int i = 0; i < rankSlots.size(); i++) { + if (rankSlots.get(i) == event.getSlot()) { + if (AdventurersGuildConfig.isDisableCommonerRank() && i == 4) continue; + selectedRank = i; + break; + } + } + + //Clicked nothing + if (selectedRank == null) return; + + if (GuildRank.getMaxGuildRank(player) >= selectedRank) { + selectUnlockedRank(player, selectedRank); + GuildRankMenuHandler.populateInventory(event.getInventory(), player); + return; + } + + if (GuildRank.getMaxGuildRank(player) + 1 == selectedRank) { + selectRankToUnlock(player, selectedRank); + GuildRankMenuHandler.populateInventory(event.getInventory(), player); + return; + } + + if (GuildRank.getMaxGuildRank(player) < selectedRank) { + selectPrestigeUnlock(player); + GuildRankMenuHandler.populateInventory(event.getInventory(), player); + } + + } + + @EventHandler + public void onInventoryClose(InventoryCloseEvent event) { + inventories.remove(event.getInventory()); + } + + private enum guildRankStatus { + UNLOCKED, + SELECTED, + NEXT_UNLOCK, + LOCKED, + PRESTIGE_LOCKED, + PRESTIGE_NEXT_UNLOCK, + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/adventurersguild/WorldSwitchBehavior.java b/src/main/java/com/magmaguy/elitemobs/adventurersguild/WorldSwitchBehavior.java new file mode 100644 index 000000000..142b98a5e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/adventurersguild/WorldSwitchBehavior.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.adventurersguild; + +import com.magmaguy.elitemobs.config.AdventurersGuildConfig; +import org.bukkit.attribute.Attribute; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerChangedWorldEvent; + +public class WorldSwitchBehavior implements Listener { + @EventHandler(ignoreCancelled = true) + public void onPlayerTeleport(PlayerChangedWorldEvent event) { + if (AdventurersGuildConfig.getWorldsWithoutAGBonuses().isEmpty()) return; + //to a world without bonuses + if (AdventurersGuildConfig.getWorldsWithoutAGBonuses().contains(event.getPlayer().getWorld().getName()) && + !AdventurersGuildConfig.getWorldsWithoutAGBonuses().contains(event.getFrom().getName())) + event.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(event.getPlayer().getAttribute(Attribute.GENERIC_MAX_HEALTH).getDefaultValue()); + //to a world with bonuses + else if (!AdventurersGuildConfig.getWorldsWithoutAGBonuses().contains(event.getPlayer().getWorld().getName()) && + AdventurersGuildConfig.getWorldsWithoutAGBonuses().contains(event.getFrom().getName())) + GuildRank.setMaxHealth(event.getPlayer()); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/announcements/AnnouncementPriority.java b/src/main/java/com/magmaguy/elitemobs/announcements/AnnouncementPriority.java new file mode 100644 index 000000000..a3b7e0a85 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/announcements/AnnouncementPriority.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.announcements; + +import com.magmaguy.elitemobs.config.EventsConfig; +import com.magmaguy.elitemobs.thirdparty.discordsrv.DiscordSRVAnnouncement; +import com.magmaguy.magmacore.util.ChatColorConverter; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.entity.Player; + +public class AnnouncementPriority { + private AnnouncementPriority() { + } + + public static void announce(String message, World world, int announcementPriority) { + if (announcementPriority == 1 && !EventsConfig.isAnnouncementBroadcastWorldOnly()) + Bukkit.broadcastMessage(ChatColorConverter.convert(message)); + else + for (Player player : world.getPlayers()) + player.sendMessage(ChatColorConverter.convert(message)); + if (announcementPriority < 3) return; + new DiscordSRVAnnouncement(ChatColorConverter.convert(message)); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/ArenaCompleteEvent.java b/src/main/java/com/magmaguy/elitemobs/api/ArenaCompleteEvent.java new file mode 100644 index 000000000..21c87e646 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/ArenaCompleteEvent.java @@ -0,0 +1,40 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.instanced.arena.ArenaInstance; +import com.magmaguy.elitemobs.utils.EventCaller; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; + +public class ArenaCompleteEvent extends Event { + private static final HandlerList handlers = new HandlerList(); + + @Getter + private final ArenaInstance arenaInstance; + + /** + * Called when an arena gets successfully completed by players. + * + * @param arenaInstance Instance of the arena that got completed + */ + public ArenaCompleteEvent(ArenaInstance arenaInstance) { + this.arenaInstance = arenaInstance; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static class ArenaCompleteEventHandler implements Listener { + public static void call(ArenaInstance arenaInstance) { + ArenaCompleteEvent arenaCompleteEvent = new ArenaCompleteEvent(arenaInstance); + new EventCaller(arenaCompleteEvent); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/ArenaStartEvent.java b/src/main/java/com/magmaguy/elitemobs/api/ArenaStartEvent.java new file mode 100644 index 000000000..1b43b1b42 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/ArenaStartEvent.java @@ -0,0 +1,33 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.instanced.arena.ArenaInstance; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class ArenaStartEvent extends Event { + private static final HandlerList handlers = new HandlerList(); + + @Getter + private final ArenaInstance arenaInstance; + + /** + * Called when an arena starts + * + * @param arenaInstance + */ + public ArenaStartEvent(ArenaInstance arenaInstance) { + this.arenaInstance = arenaInstance; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/CustomEventStartEvent.java b/src/main/java/com/magmaguy/elitemobs/api/CustomEventStartEvent.java new file mode 100644 index 000000000..43b1bfb30 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/CustomEventStartEvent.java @@ -0,0 +1,49 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.events.CustomEvent; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +/** + * To clear up the weird naming system here, this event is called when custom event (the type created by users for the + * customizable in-game event system) is called, i.e. for treasure goblins, meteors and the dead moon event. + */ +public class CustomEventStartEvent extends Event implements Cancellable { + + private static final HandlerList handlers = new HandlerList(); + private CustomEvent customEvent; + private boolean cancelled = false; + + public CustomEventStartEvent(CustomEvent customEvent) { + this.customEvent = customEvent; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + public CustomEvent getCustomEvent() { + return customEvent; + } + + public void setCustomEvent(CustomEvent customEvent) { + this.customEvent = customEvent; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancelled) { + this.cancelled = cancelled; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/DungeonCompleteEvent.java b/src/main/java/com/magmaguy/elitemobs/api/DungeonCompleteEvent.java new file mode 100644 index 000000000..ec68d46c0 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/DungeonCompleteEvent.java @@ -0,0 +1,31 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.instanced.dungeons.DungeonInstance; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class DungeonCompleteEvent extends Event { + private static final HandlerList handlers = new HandlerList(); + + @Getter + private final DungeonInstance dungeonInstance; + + /** + * Gets called when players complete a dungeon + * + * @param dungeonInstance Instance of the dungeon that completed + */ + public DungeonCompleteEvent(DungeonInstance dungeonInstance) { + this.dungeonInstance = dungeonInstance; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/DungeonInstallEvent.java b/src/main/java/com/magmaguy/elitemobs/api/DungeonInstallEvent.java new file mode 100644 index 000000000..45bf46eb0 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/DungeonInstallEvent.java @@ -0,0 +1,40 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import lombok.Getter; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class DungeonInstallEvent extends Event implements Cancellable { + + private static final HandlerList handlers = new HandlerList(); + @Getter + private final DungeonPackagerConfigFields dungeonPackagerConfigFields; + @Getter + private final String dungeonName; + @Getter + private final String dungeonFilename; + private boolean isCancelled = false; + + public DungeonInstallEvent(DungeonPackagerConfigFields dungeonPackagerConfigFields) { + this.dungeonPackagerConfigFields = dungeonPackagerConfigFields; + this.dungeonName = dungeonPackagerConfigFields.getName(); + this.dungeonFilename = dungeonPackagerConfigFields.getFilename(); + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + @Override + public boolean isCancelled() { + return this.isCancelled; + } + + @Override + public void setCancelled(boolean b) { + this.isCancelled = b; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/DungeonStartEvent.java b/src/main/java/com/magmaguy/elitemobs/api/DungeonStartEvent.java new file mode 100644 index 000000000..edeeff9f7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/DungeonStartEvent.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.instanced.dungeons.DungeonInstance; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class DungeonStartEvent extends Event { + private static final HandlerList handlers = new HandlerList(); + + @Getter + private final DungeonInstance dungeonInstance; + + public DungeonStartEvent(DungeonInstance dungeonInstance) { + this.dungeonInstance = dungeonInstance; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/DungeonUninstallEvent.java b/src/main/java/com/magmaguy/elitemobs/api/DungeonUninstallEvent.java new file mode 100644 index 000000000..2c112613f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/DungeonUninstallEvent.java @@ -0,0 +1,39 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import lombok.Getter; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class DungeonUninstallEvent extends Event implements Cancellable { + private static final HandlerList handlers = new HandlerList(); + @Getter + private final DungeonPackagerConfigFields dungeonPackagerConfigFields; + @Getter + private final String dungeonName; + @Getter + private final String dungeonFilename; + private boolean isCancelled = false; + + public DungeonUninstallEvent(DungeonPackagerConfigFields dungeonPackagerConfigFields) { + this.dungeonPackagerConfigFields = dungeonPackagerConfigFields; + this.dungeonName = dungeonPackagerConfigFields.getName(); + this.dungeonFilename = dungeonPackagerConfigFields.getFilename(); + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + @Override + public boolean isCancelled() { + return this.isCancelled; + } + + @Override + public void setCancelled(boolean b) { + this.isCancelled = b; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/EliteDamageEvent.java b/src/main/java/com/magmaguy/elitemobs/api/EliteDamageEvent.java new file mode 100644 index 000000000..83d11f928 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/EliteDamageEvent.java @@ -0,0 +1,53 @@ +package com.magmaguy.elitemobs.api; + + +import lombok.Getter; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class EliteDamageEvent extends Event implements Cancellable { + private static final HandlerList handlers = new HandlerList(); + private final Event event; + private boolean isCancelled = false; + @Getter + private double damage; + + /** + * Classes that deal with damage in EliteMobs extend this class in order to inherit modifiable and cancellable behavior. + * This is purely just used for API purposes, such as with the Elite Scripting system. Does not do anything on its own. + * + * @param damage Original damage which can be modified. + * @param event Original event which can be cancelled. + */ + + public EliteDamageEvent(double damage, Event event) { + this.damage = damage; + this.event = event; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + public void setDamage(double damage) { + this.damage = damage; + } + + @Override + public boolean isCancelled() { + return this.isCancelled; + } + + @Override + public void setCancelled(boolean b) { + this.isCancelled = b; + ((Cancellable) event).setCancelled(b); + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/EliteExplosionEvent.java b/src/main/java/com/magmaguy/elitemobs/api/EliteExplosionEvent.java new file mode 100644 index 000000000..5097dc65a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/EliteExplosionEvent.java @@ -0,0 +1,126 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.CrashFix; +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import lombok.Getter; +import org.bukkit.Location; +import org.bukkit.block.BlockState; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.FallingBlock; +import org.bukkit.event.*; +import org.bukkit.event.entity.EntityChangeBlockEvent; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class EliteExplosionEvent extends Event implements Cancellable { + + private static final HandlerList handlers = new HandlerList(); + @Getter + private final EliteEntity eliteEntity; + @Getter + private final List blockStates; + @Getter + private final PowersConfigFields powersConfigFields; + @Getter + private Location explosionSourceLocation; + private boolean isCancelled = false; + + public EliteExplosionEvent(EliteEntity eliteEntity, + PowersConfigFields powersConfigFields, + Location explosionSourceLocation, + List blockStates) { + this.eliteEntity = eliteEntity; + this.explosionSourceLocation = explosionSourceLocation; + this.powersConfigFields = powersConfigFields; + this.blockStates = blockStates; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + public void setExplosionSourceLocation(Location explosionSourceLocation) { + this.explosionSourceLocation = explosionSourceLocation; + } + + @Override + public boolean isCancelled() { + return this.isCancelled; + } + + @Override + public void setCancelled(boolean b) { + this.isCancelled = b; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public void visualExplosionEffect(PowersConfigFields powersConfigFields) { + VisualExplosionEffectType visualExplosionEffectType; + + if (powersConfigFields == null) + visualExplosionEffectType = VisualExplosionEffectType.NORMAL; + else if (powersConfigFields.getFilename().equals("ender_dragon_empowered_lightning.yml")) + visualExplosionEffectType = VisualExplosionEffectType.ASCEND; + else if (powersConfigFields.getFilename().equalsIgnoreCase("ender_dragon_tornado.yml")) { + visualExplosionEffectType = VisualExplosionEffectType.HIGH_POWER; + } else + visualExplosionEffectType = VisualExplosionEffectType.NORMAL; + + for (BlockState blockState : blockStates) { + FallingBlock fallingBlock = blockState.getBlock().getWorld().spawnFallingBlock(blockState.getLocation().add(new Vector(0, 0.2, 0)), blockState.getBlockData()); + fallingBlock.setDropItem(false); + fallingBlock.setHurtEntities(true); + + switch (visualExplosionEffectType) { + case ASCEND: + fallingBlock.setVelocity(fallingBlock.getLocation().clone().subtract(explosionSourceLocation) + .toVector().normalize().setY(1).normalize().multiply(ThreadLocalRandom.current().nextDouble())); + fallingBlock.setGravity(false); + fallingBlock.setGlowing(true); + break; + case HIGH_POWER: + fallingBlock.setVelocity(fallingBlock.getLocation().clone().subtract(explosionSourceLocation).toVector().normalize().setY(2).multiply(0.9)); + break; + case NORMAL: + default: + fallingBlock.setVelocity(fallingBlock.getLocation().clone().subtract(explosionSourceLocation).toVector().normalize().setY(1).multiply(0.5)); + } + + new BukkitRunnable() { + @Override + public void run() { + if (fallingBlock.isValid()) + fallingBlock.remove(); + } + }.runTaskLater(MetadataHandler.PLUGIN, 20 * 4); + + CrashFix.registerVisualFallingBlock(fallingBlock); + } + } + + public enum VisualExplosionEffectType { + NORMAL, + HIGH_POWER, + ASCEND + } + + public static class EliteExplosionEvents implements Listener { + @EventHandler(ignoreCancelled = true) + public void onBlockDrop(EntityChangeBlockEvent event) { + if (!event.getEntity().getType().equals(EntityType.FALLING_BLOCK)) return; + if (!CrashFix.isVisualFallingBlock(event.getEntity())) return; + event.setCancelled(true); + event.getEntity().remove(); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/EliteMobDamagedByEliteMobEvent.java b/src/main/java/com/magmaguy/elitemobs/api/EliteMobDamagedByEliteMobEvent.java new file mode 100644 index 000000000..0aa31fcc7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/EliteMobDamagedByEliteMobEvent.java @@ -0,0 +1,81 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.RegionalBossEntity; +import com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs.EliteMobProperties; +import com.magmaguy.elitemobs.utils.EntityFinder; +import com.magmaguy.elitemobs.utils.EventCaller; +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; + +public class EliteMobDamagedByEliteMobEvent extends EliteDamageEvent { + + private static final HandlerList handlers = new HandlerList(); + private final EliteEntity damager; + private final EliteEntity damagee; + private final EntityDamageByEntityEvent entityDamageByEntityEvent; + + /** + * Event fired when an elite gets damaged by another elite. + * + * @param damager Damager in the event. + * @param damagee Damaged entity in the event. + * @param event Original Minecraft damage event. + * @param damage Damage in the event. Can be modified! + */ + public EliteMobDamagedByEliteMobEvent(EliteEntity damager, EliteEntity damagee, EntityDamageByEntityEvent event, double damage) { + super(damage, event); + this.damager = damager; + this.damagee = damagee; + this.entityDamageByEntityEvent = event; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + public EliteEntity getDamager() { + return damager; + } + + public EliteEntity getDamagee() { + return damagee; + } + + public EntityDamageByEntityEvent getEntityDamageByEntityEvent() { + return entityDamageByEntityEvent; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + //The thing that calls the event + public static class EliteMobDamagedByEliteMobFilter implements Listener { + + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + public void onEntityDamageByEntityEvent(EntityDamageByEntityEvent event) { + EliteEntity damagee = EntityTracker.getEliteMobEntity(event.getEntity()); + if (damagee == null) return; + LivingEntity livingEntity = EntityFinder.filterRangedDamagers(event.getDamager()); + EliteEntity damager = EntityTracker.getEliteMobEntity(livingEntity); + if (damager == null) return; + if (damager.getLivingEntity() == null) return; + if (EliteMobProperties.getPluginData(damager.getLivingEntity().getType()) == null) return; + double damage = EliteMobProperties.getBaselineDamage(damager.getLivingEntity().getType(), damager) + damager.getLevel(); + EliteMobDamagedByEliteMobEvent eliteMobDamagedByEliteMobEvent = new EliteMobDamagedByEliteMobEvent(damager, damagee, event, damage); + new EventCaller(eliteMobDamagedByEliteMobEvent); + if (eliteMobDamagedByEliteMobEvent.isCancelled()) return; + event.setDamage(damage); + if (damagee instanceof RegionalBossEntity regionalBossEntity) regionalBossEntity.removeSlow(); + } + } + + +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/EliteMobDamagedByPlayerAntiExploitEvent.java b/src/main/java/com/magmaguy/elitemobs/api/EliteMobDamagedByPlayerAntiExploitEvent.java new file mode 100644 index 000000000..5ad66656e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/EliteMobDamagedByPlayerAntiExploitEvent.java @@ -0,0 +1,64 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import org.bukkit.entity.Entity; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class EliteMobDamagedByPlayerAntiExploitEvent extends Event implements Cancellable { + + private static final HandlerList handlers = new HandlerList(); + private final Entity entity; + private final EliteEntity eliteEntity; + private final EliteMobDamagedByPlayerEvent eliteMobDamagedByPlayerEvent; + private boolean isCancelled = false; + private boolean isTriggered = false; + + public EliteMobDamagedByPlayerAntiExploitEvent(EliteEntity eliteEntity, EliteMobDamagedByPlayerEvent event) { + this.entity = eliteEntity.getLivingEntity(); + this.eliteEntity = eliteEntity; + this.eliteMobDamagedByPlayerEvent = event; + if (eliteEntity.getLivingEntity() != null && !eliteEntity.getLivingEntity().hasAI()) + setCancelled(true); + } + + public static HandlerList getHandlerList() { + return handlers; + } + + public Entity getEntity() { + return entity; + } + + public EliteEntity getEliteMobEntity() { + return eliteEntity; + } + + public EliteMobDamagedByPlayerEvent getEliteMobDamagedByPlayerEvent() { + return eliteMobDamagedByPlayerEvent; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + @Override + public boolean isCancelled() { + return this.isCancelled; + } + + @Override + public void setCancelled(boolean b) { + this.isCancelled = b; + } + + public boolean isTriggered() { + return isTriggered; + } + + public void setTriggered(boolean triggered) { + isTriggered = triggered; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/EliteMobDamagedByPlayerEvent.java b/src/main/java/com/magmaguy/elitemobs/api/EliteMobDamagedByPlayerEvent.java new file mode 100644 index 000000000..a86da6566 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/EliteMobDamagedByPlayerEvent.java @@ -0,0 +1,275 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.EliteMobs; +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.adventurersguild.GuildRank; +import com.magmaguy.elitemobs.api.utils.EliteItemManager; +import com.magmaguy.elitemobs.config.ItemSettingsConfig; +import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; +import com.magmaguy.elitemobs.dungeons.EliteMobsWorld; +import com.magmaguy.elitemobs.entitytracker.CustomProjectileData; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.playerdata.ElitePlayerInventory; +import com.magmaguy.elitemobs.thirdparty.worldguard.WorldGuardCompatibility; +import com.magmaguy.elitemobs.thirdparty.worldguard.WorldGuardFlagChecker; +import com.magmaguy.elitemobs.utils.EntityFinder; +import com.magmaguy.elitemobs.utils.EventCaller; +import com.magmaguy.magmacore.util.Round; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.*; +import org.bukkit.event.EventHandler; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.ProjectileLaunchEvent; + +import java.util.concurrent.ThreadLocalRandom; + +public class EliteMobDamagedByPlayerEvent extends EliteDamageEvent { + + private static final HandlerList handlers = new HandlerList(); + @Getter + private final Entity entity; + @Getter + private final EliteEntity eliteMobEntity; + @Getter + private final Player player; + @Getter + private final EntityDamageByEntityEvent entityDamageByEntityEvent; + @Getter + private final boolean criticalStrike; + @Getter + private final boolean isCustomDamage; + @Getter + private final double damageModifier; + @Getter + public boolean rangedAttack; + + /** + * Event fired when an elite is damaged by a player. + * + * @param eliteEntity Elite damaged. + * @param player Player acting as the damged. + * @param event Original Minecraft damage event. + * @param damage Damage. Can be modifed! + * @param criticalStrike Whether the strike is a critical strike. + * @param isCustomDamage Whether the amount of damage is custom, meaning it should apply with no damage reduction of any kind, including armor! + * @param damageModifier Damage modifiers that the boss may have to reduce incoming damage. + */ + public EliteMobDamagedByPlayerEvent(EliteEntity eliteEntity, Player player, EntityDamageByEntityEvent event, double damage, boolean criticalStrike, boolean isCustomDamage, double damageModifier) { + super(damage, event); + this.entity = eliteEntity.getLivingEntity(); + this.eliteMobEntity = eliteEntity; + this.player = player; + this.entityDamageByEntityEvent = event; + this.rangedAttack = event.getDamager() instanceof Projectile; + this.criticalStrike = criticalStrike; + this.isCustomDamage = isCustomDamage; + this.damageModifier = damageModifier; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + + //The thing that calls the event + public static class EliteMobDamagedByPlayerEventFilter implements Listener { + public static boolean bypass = false; + + private static double getThornsDamage(Player player) { + if (!ItemSettingsConfig.isUseEliteEnchantments()) return 0D; + ElitePlayerInventory elitePlayerInventory = ElitePlayerInventory.getPlayer(player); + int thornsLevel = 0; + if (elitePlayerInventory.helmet.thornsLevel > Enchantment.THORNS.getMaxLevel()) + thornsLevel += elitePlayerInventory.helmet.thornsLevel - Enchantment.THORNS.getMaxLevel(); + if (elitePlayerInventory.chestplate.thornsLevel > Enchantment.THORNS.getMaxLevel()) + thornsLevel += elitePlayerInventory.chestplate.thornsLevel - Enchantment.THORNS.getMaxLevel(); + if (elitePlayerInventory.leggings.thornsLevel > Enchantment.THORNS.getMaxLevel()) + thornsLevel += elitePlayerInventory.helmet.thornsLevel - Enchantment.THORNS.getMaxLevel(); + if (elitePlayerInventory.boots.thornsLevel > Enchantment.THORNS.getMaxLevel()) + thornsLevel += elitePlayerInventory.boots.thornsLevel - Enchantment.THORNS.getMaxLevel(); + return thornsLevel * 2.5D; + } + + /** + * Gets the amount of damage dealt by EliteMobs-specific features + * + * @param player Damager + * @return Bonus damage applied + */ + private static double getEliteMeleeDamage(Player player, LivingEntity livingEntity) { + if (player.getInventory().getItemInMainHand().getType().equals(Material.BOW) || player.getInventory().getItemInMainHand().getType().equals(Material.CROSSBOW)) + return 0.0; + double eliteDamage = ElitePlayerInventory.getPlayer(player).getEliteDamage(true); + double bonusEliteDamage = secondaryEnchantmentDamageIncrease(player, livingEntity); + return (eliteDamage + bonusEliteDamage) * player.getAttackCooldown(); + } + + private static double getEliteRangedDamage(Projectile arrow) { + //note: the arrow velocity amplitude at full load is about 2.8 + double arrowSpeedMultiplier = Math.sqrt(Math.pow(arrow.getVelocity().getX(), 2D) + Math.pow(arrow.getVelocity().getY(), 2D) + Math.pow(arrow.getVelocity().getZ(), 2D)); + arrowSpeedMultiplier /= 4.0D; + double arrowDamage = EliteItemManager.getArrowEliteDamage(arrow); + return arrowSpeedMultiplier * arrowDamage; + } + + private static double getCustomDamageModifier(EliteEntity eliteEntity, Material itemStackType) { + if (!(eliteEntity instanceof CustomBossEntity)) return 1; + //This doesn't really take into account people switching their weapon out on ranged attacks. That's probably fine. + return ((CustomBossEntity) eliteEntity).getDamageModifier(itemStackType); + } + + private static double secondaryEnchantmentDamageIncrease(Player player, LivingEntity livingEntity) { + if (ItemSettingsConfig.isUseEliteEnchantments()) return 0D; + if (livingEntity instanceof Spider || livingEntity instanceof Silverfish) { + int level = ElitePlayerInventory.playerInventories.get(player.getUniqueId()).mainhand.getDamageArthropodsLevel(player.getInventory().getItemInMainHand(), false); + level -= Enchantment.BANE_OF_ARTHROPODS.getMaxLevel(); + if (level < 1) return 0D; + return level * 2.5D; + } + if (livingEntity instanceof Zombie || livingEntity instanceof Skeleton || livingEntity instanceof Wither || livingEntity instanceof SkeletonHorse || livingEntity instanceof ZombieHorse || livingEntity.getType().equals(EntityType.ZOMBIFIED_PIGLIN)) { + int level = ElitePlayerInventory.playerInventories.get(player.getUniqueId()).mainhand.getDamageUndeadLevel(player.getInventory().getItemInMainHand(), false); + level -= Enchantment.SMITE.getMaxLevel(); + if (level < 1) return 0D; + return level * 2.5D; + } + return 0; + } + + private static boolean isCriticalHit(Player player) { + double criticalStrike = ElitePlayerInventory.playerInventories.get(player.getUniqueId()).getCritChance(false); + criticalStrike += (GuildRank.critBonusValue(GuildRank.getGuildPrestigeRank(player), GuildRank.getActiveGuildRank(player)) / 100); + return ThreadLocalRandom.current().nextDouble() < criticalStrike; + } + + @EventHandler(ignoreCancelled = true) + public void onPlayerShootArrow(ProjectileLaunchEvent event) { + if (!(event.getEntity().getShooter() instanceof Player)) return; + EliteItemManager.tagArrow(event.getEntity()); + } + + @EventHandler(ignoreCancelled = true) + public void onEliteMobAttacked(EntityDamageByEntityEvent event) { + if (event.getEntity().getType().equals(EntityType.ENDER_DRAGON) && ((EnderDragon) event.getEntity()).getPhase().equals(EnderDragon.Phase.DYING)) + return; + LivingEntity livingEntity = EntityFinder.filterRangedDamagers(event.getDamager()); + if (livingEntity == null) return; + if (!livingEntity.getType().equals(EntityType.PLAYER)) return; + Player player = (Player) livingEntity; + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(event.getEntity()); + //Living entity is sometimes null when the damage is dealt to an already dead entity - might happen with mcmmo due to DOTs and stuff + if (eliteEntity == null || !eliteEntity.isValid()) return; + //There's at least 1 gun plugin that makes players the projectile themselves. + if (event.getCause().equals(EntityDamageEvent.DamageCause.PROJECTILE) && !(event.getDamager() instanceof Projectile)) + return; + + /* + From this point on, the damage is confirmed to be processed by EliteMobs + */ + + //nullify vanilla reductions, this is needed because boss armor is just cosmetic + for (EntityDamageEvent.DamageModifier modifier : EntityDamageByEntityEvent.DamageModifier.values()) + if (event.isApplicable(modifier) && modifier != EntityDamageEvent.DamageModifier.BASE) + event.setDamage(modifier, 0); + + //If the damage wasn't caused by an elite item, just allow the event to go as raw + double damage = event.getDamage(); + double eliteDamage = 0; + //Sometimes players are "fake" due to npc plugins + boolean validPlayer = !player.hasMetadata("NPC") && ElitePlayerInventory.getPlayer(player) != null; + + if (validPlayer && event.getCause().equals(EntityDamageEvent.DamageCause.THORNS)) + //Thorns are their own kind of damage + eliteDamage = getThornsDamage(player); + else if (validPlayer && (event.getCause().equals(EntityDamageEvent.DamageCause.ENTITY_ATTACK) || event.getCause().equals(EntityDamageEvent.DamageCause.ENTITY_SWEEP_ATTACK) && EliteItemManager.isEliteMobsItem(player.getInventory().getItemInMainHand()))) + eliteDamage = getEliteMeleeDamage(player, livingEntity); + else if (event.getCause().equals(EntityDamageEvent.DamageCause.PROJECTILE)) + //Scan arrow for arrow damage + eliteDamage = getEliteRangedDamage((Projectile) event.getDamager()); + + double damageModifier = 1; + if (event.getCause().equals(EntityDamageEvent.DamageCause.PROJECTILE)) + if (CustomProjectileData.getCustomProjectileDataHashMap().get((Projectile) event.getDamager()) == null) + damageModifier = getCustomDamageModifier(eliteEntity, null); + else + damageModifier = getCustomDamageModifier(eliteEntity, CustomProjectileData.getCustomProjectileDataHashMap().get(event.getDamager()).getProjectileShooterMaterial()); + else getCustomDamageModifier(eliteEntity, player.getInventory().getItemInMainHand().getType()); + + if (eliteEntity instanceof CustomBossEntity customBossEntity && customBossEntity.isNormalizedCombat()) + damage = Round.twoDecimalPlaces((damage + eliteDamage) * damageModifier * MobCombatSettingsConfig.getNormalizedDamageToEliteMultiplier()); + else + damage = Round.twoDecimalPlaces((damage + eliteDamage) * damageModifier * MobCombatSettingsConfig.getDamageToEliteMultiplier()); + + boolean criticalHit = false; + + if (validPlayer) { + criticalHit = isCriticalHit(player); + if (criticalHit) damage *= 1.5; + } + + EliteMobDamagedByPlayerEvent eliteMobDamagedByPlayerEvent = new EliteMobDamagedByPlayerEvent(eliteEntity, player, event, damage, criticalHit, bypass, damageModifier); + + new EventCaller(eliteMobDamagedByPlayerEvent); + + if (eliteMobDamagedByPlayerEvent.isCancelled()) { + event.setCancelled(true); + return; + } + + //In case things got modified along the way + damage = eliteMobDamagedByPlayerEvent.getDamage(); + + if (validPlayer) { + //Time to deal custom damage! + eliteEntity.addDamager(player, damage); + } + + //Dragons need special handling due to their custom deaths + if (eliteEntity.getLivingEntity() != null && eliteEntity.getLivingEntity().getType().equals(EntityType.ENDER_DRAGON) && eliteEntity.getLivingEntity().getHealth() - damage < 1) { + if (eliteEntity.isDying()) return; + damage = 0; + event.setCancelled(true); + ((EnderDragon) eliteEntity.getLivingEntity()).setPhase(EnderDragon.Phase.DYING); + eliteEntity.setDying(true); + //remove the dragon after it is done with the light show, this death doesn't show up on events + Bukkit.getScheduler().runTaskLater(MetadataHandler.PLUGIN, () -> new EventCaller(new EliteMobDeathEvent(eliteEntity)), 200); + } + + event.setDamage(EntityDamageEvent.DamageModifier.BASE, damage); + + eliteEntity.syncPluginHealth(((LivingEntity) event.getEntity()).getHealth()); + + + runAntiexploit(eliteEntity, event, eliteMobDamagedByPlayerEvent); + } + + private void runAntiexploit(EliteEntity eliteEntity, EntityDamageByEntityEvent event, EliteMobDamagedByPlayerEvent eliteMobDamagedByPlayerEvent) { + if (EliteMobsWorld.isEliteMobsWorld(event.getDamager().getWorld().getUID())) return; + if (EliteMobs.worldGuardIsEnabled) { + Boolean regionQuery = WorldGuardFlagChecker.checkNullableFlag(eliteEntity.getLocation(), WorldGuardCompatibility.getELITEMOBS_ANTIEXPLOIT()); + if (regionQuery != null && !regionQuery) return; + } + if (event.getCause() != EntityDamageEvent.DamageCause.ENTITY_ATTACK && + event.getCause() != EntityDamageEvent.DamageCause.ENTITY_SWEEP_ATTACK && + event.getCause() != EntityDamageEvent.DamageCause.PROJECTILE) + return; + + if (eliteEntity.isInAntiExploitCooldown() || + eliteEntity.getLivingEntity() == null) return; + Bukkit.getServer().getPluginManager().callEvent(new EliteMobDamagedByPlayerAntiExploitEvent(eliteEntity, eliteMobDamagedByPlayerEvent)); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/EliteMobDamagedEvent.java b/src/main/java/com/magmaguy/elitemobs/api/EliteMobDamagedEvent.java new file mode 100644 index 000000000..888ce2e4a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/EliteMobDamagedEvent.java @@ -0,0 +1,75 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.EliteMobs; +import com.magmaguy.elitemobs.dungeons.EliteMobsWorld; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.thirdparty.worldguard.WorldGuardCompatibility; +import com.magmaguy.elitemobs.thirdparty.worldguard.WorldGuardFlagChecker; +import com.magmaguy.elitemobs.utils.EventCaller; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.entity.Entity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; + +public class EliteMobDamagedEvent extends EliteDamageEvent { + + private static final HandlerList handlers = new HandlerList(); + @Getter + private final Entity entity; + @Getter + private final EliteEntity eliteEntity; + @Getter + private final EntityDamageEvent entityDamageEvent; + + public EliteMobDamagedEvent(EliteEntity eliteEntity, EntityDamageEvent event, double damage) { + super(damage, event); + this.entity = eliteEntity.getLivingEntity(); + this.eliteEntity = eliteEntity; + this.entityDamageEvent = event; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static class EliteMobDamageEventFilter implements Listener { + + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) + public void onEntityDamagedEvent(EntityDamageEvent event) { + + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(event.getEntity()); + if (eliteEntity == null) return; + + EliteMobDamagedEvent eliteMobDamagedEvent = new EliteMobDamagedEvent(eliteEntity, event, event.getDamage()); + new EventCaller(eliteMobDamagedEvent); + if (eliteMobDamagedEvent.isCancelled()) { + eliteMobDamagedEvent.setCancelled(true); + return; + } + + //happens if it dies + if (!eliteEntity.isValid()) return; + + if (EliteMobsWorld.isEliteMobsWorld(event.getEntity().getWorld().getUID())) return; + + if (EliteMobs.worldGuardIsEnabled && !WorldGuardFlagChecker.checkFlag(eliteEntity.getLivingEntity().getLocation(), + WorldGuardCompatibility.getELITEMOBS_ANTIEXPLOIT())) + return; + + Bukkit.getServer().getPluginManager().callEvent(new GenericAntiExploitEvent(eliteEntity, event)); + + } + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/EliteMobDeathEvent.java b/src/main/java/com/magmaguy/elitemobs/api/EliteMobDeathEvent.java new file mode 100644 index 000000000..7ed9ca552 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/EliteMobDeathEvent.java @@ -0,0 +1,70 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.api.internal.RemovalReason; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.utils.EventCaller; +import org.bukkit.entity.Entity; +import org.bukkit.event.Event; +import org.bukkit.event.EventHandler; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDeathEvent; + +public class EliteMobDeathEvent extends Event { + + private static final HandlerList handlers = new HandlerList(); + private final Entity entity; + private final EliteEntity eliteEntity; + private EntityDeathEvent entityDeathEvent = null; + + public EliteMobDeathEvent(EliteEntity eliteEntity, EntityDeathEvent entityDeathEvent) { + this.entity = eliteEntity.getUnsyncedLivingEntity(); + this.eliteEntity = eliteEntity; + this.entityDeathEvent = entityDeathEvent; + eliteEntity.remove(RemovalReason.DEATH); + } + + /** + * This is necessary for End Dragons + * + * @param eliteEntity + */ + public EliteMobDeathEvent(EliteEntity eliteEntity) { + this.entity = eliteEntity.getUnsyncedLivingEntity(); + this.eliteEntity = eliteEntity; + new EventCaller(new EliteMobRemoveEvent(eliteEntity, RemovalReason.DEATH)); + } + + + public static HandlerList getHandlerList() { + return handlers; + } + + public Entity getEntity() { + return this.entity; + } + + public EliteEntity getEliteEntity() { + return this.eliteEntity; + } + + public EntityDeathEvent getEntityDeathEvent() { + return this.entityDeathEvent; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static class EliteMobDeathEventFilter implements Listener { + @EventHandler + public void onMobDeath(EntityDeathEvent event) { + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(event.getEntity()); + if (eliteEntity == null) return; + new EventCaller(new EliteMobDeathEvent(eliteEntity, event)); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/EliteMobEnterCombatEvent.java b/src/main/java/com/magmaguy/elitemobs/api/EliteMobEnterCombatEvent.java new file mode 100644 index 000000000..9fc75f727 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/EliteMobEnterCombatEvent.java @@ -0,0 +1,95 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.utils.CommandRunner; +import com.magmaguy.elitemobs.utils.EntitySearch; +import com.magmaguy.elitemobs.utils.EventCaller; +import org.bukkit.Bukkit; +import org.bukkit.attribute.Attribute; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Mob; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.EventHandler; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; + +import java.util.ArrayList; + +public class EliteMobEnterCombatEvent extends Event { + + private static final HandlerList handlers = new HandlerList(); + private final Player targetEntity; + private final EliteEntity eliteEntity; + + public EliteMobEnterCombatEvent(EliteEntity eliteEntity, Player targetEntity) { + this.targetEntity = targetEntity; + this.eliteEntity = eliteEntity; + + if (!DefaultConfig.isAlwaysShowNametags()) + eliteEntity.setNameVisible(true); + if (eliteEntity instanceof CustomBossEntity customBossEntity) + CommandRunner.runCommandFromList(customBossEntity.getCustomBossesConfigFields().getOnCombatEnterCommands(), new ArrayList<>()); + //Phase bosses can launch this event through phase switches + if (!eliteEntity.isInCombat()) + Bukkit.getScheduler().runTaskTimerAsynchronously(MetadataHandler.PLUGIN, task -> { + if (!eliteEntity.isValid()) { + task.cancel(); + Bukkit.getScheduler().runTask(MetadataHandler.PLUGIN, syncTask -> new EventCaller(new EliteMobExitCombatEvent(eliteEntity, EliteMobExitCombatEvent.EliteMobExitCombatReason.ELITE_NOT_VALID))); + return; + } + if (!eliteEntity.isInCombatGracePeriod()) { + double followRange = eliteEntity.getLivingEntity().getAttribute(Attribute.GENERIC_FOLLOW_RANGE).getValue(); + if (eliteEntity.getLivingEntity().getType().equals(EntityType.ENDER_DRAGON)) + followRange = 200; + if (EntitySearch.getNearbyCombatPlayers(eliteEntity.getLocation(), followRange).isEmpty()) { + task.cancel(); + Bukkit.getScheduler().runTask(MetadataHandler.PLUGIN, syncTask -> new EventCaller(new EliteMobExitCombatEvent(eliteEntity, EliteMobExitCombatEvent.EliteMobExitCombatReason.NO_NEARBY_PLAYERS))); + } + } + }, 20L, 20L); + eliteEntity.setInCombat(true); + } + + public static HandlerList getHandlerList() { + return handlers; + } + + public Player getTargetEntity() { + return this.targetEntity; + } + + public EliteEntity getEliteMobEntity() { + return this.eliteEntity; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static class EliteMobEnterCombatEventFilter implements Listener { + @EventHandler(ignoreCancelled = true) + public void onEliteMobDamaged(EliteMobDamagedByPlayerEvent event) { + if (event.getEliteMobEntity().isInCombat()) return; + if (!(event.getEliteMobEntity().getLivingEntity() instanceof Mob)) return; + Bukkit.getServer().getPluginManager().callEvent(new EliteMobEnterCombatEvent(event.getEliteMobEntity(), event.getPlayer())); + } + + @EventHandler(ignoreCancelled = true) + public void onEliteMobDamage(PlayerDamagedByEliteMobEvent event) { + if (event.getEliteMobEntity().isInCombat()) return; + if (!(event.getEliteMobEntity().getLivingEntity() instanceof Mob)) return; + Bukkit.getServer().getPluginManager().callEvent(new EliteMobEnterCombatEvent(event.getEliteMobEntity(), event.getPlayer())); + } + + @EventHandler(ignoreCancelled = true) + public void onEliteMobTarget(EliteMobTargetPlayerEvent event) { + if (event.getEliteMobEntity().isInCombat()) return; + Bukkit.getServer().getPluginManager().callEvent(new EliteMobEnterCombatEvent(event.getEliteMobEntity(), event.getPlayer())); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/EliteMobExitCombatEvent.java b/src/main/java/com/magmaguy/elitemobs/api/EliteMobExitCombatEvent.java new file mode 100644 index 000000000..c664d86c6 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/EliteMobExitCombatEvent.java @@ -0,0 +1,64 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.utils.CommandRunner; +import org.bukkit.entity.EntityType; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +import java.util.ArrayList; + +public class EliteMobExitCombatEvent extends Event { + + private static final HandlerList handlers = new HandlerList(); + private final EliteEntity eliteEntity; + private final EliteMobExitCombatReason eliteMobExitCombatReason; + + + public EliteMobExitCombatEvent(EliteEntity eliteEntity, EliteMobExitCombatReason reason) { + this.eliteEntity = eliteEntity; + this.eliteMobExitCombatReason = reason; +// if (!eliteEntity.isInCombat()) return; todo: this might be necessary + eliteEntity.setInCombat(false); + if (eliteEntity.getUnsyncedLivingEntity().isDead()) return; + //only run commands if the reason for leaving combat isn't death, onDeath commands exist for that case + if (eliteEntity instanceof CustomBossEntity) + CommandRunner.runCommandFromList(((CustomBossEntity) eliteEntity).getCustomBossesConfigFields().getOnCombatLeaveCommands(), new ArrayList<>()); + if (eliteEntity.isValid() && + MobCombatSettingsConfig.isRegenerateCustomBossHealthOnCombatEnd() && + !reason.equals(EliteMobExitCombatReason.PHASE_SWITCH) && + !eliteEntity.getUnsyncedLivingEntity().getType().equals(EntityType.PHANTOM)) { + eliteEntity.fullHeal(); + } + if (!DefaultConfig.isAlwaysShowNametags()) + eliteEntity.setNameVisible(false); + } + + public static HandlerList getHandlerList() { + return handlers; + } + + public EliteEntity getEliteMobEntity() { + return this.eliteEntity; + } + + public EliteMobExitCombatReason getEliteMobExitCombatReason() { + return eliteMobExitCombatReason; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public enum EliteMobExitCombatReason { + NO_NEARBY_PLAYERS, + SPIRIT_WALK, + ELITE_NOT_VALID, + PHASE_SWITCH + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/EliteMobHealEvent.java b/src/main/java/com/magmaguy/elitemobs/api/EliteMobHealEvent.java new file mode 100644 index 000000000..e80d6e71c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/EliteMobHealEvent.java @@ -0,0 +1,49 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import lombok.Getter; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class EliteMobHealEvent extends Event implements Cancellable { + + private static final HandlerList handlers = new HandlerList(); + @Getter + private final EliteEntity eliteEntity; + @Getter + private double healAmount = 0; + private boolean isCancelled = false; + @Getter + private boolean fullHeal = false; + + public EliteMobHealEvent(EliteEntity eliteEntity, double healAmount) { + this.eliteEntity = eliteEntity; + this.healAmount = healAmount; + } + + public EliteMobHealEvent(EliteEntity eliteEntity, boolean fullHeal) { + this.eliteEntity = eliteEntity; + this.fullHeal = fullHeal; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + @Override + public boolean isCancelled() { + return this.isCancelled; + } + + @Override + public void setCancelled(boolean b) { + this.isCancelled = b; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/EliteMobRemoveEvent.java b/src/main/java/com/magmaguy/elitemobs/api/EliteMobRemoveEvent.java new file mode 100644 index 000000000..452486484 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/EliteMobRemoveEvent.java @@ -0,0 +1,49 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.api.internal.RemovalReason; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import org.bukkit.entity.Entity; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class EliteMobRemoveEvent extends Event { + + private static final HandlerList handlers = new HandlerList(); + private final Entity entity; + private final EliteEntity eliteEntity; + private final RemovalReason removalReason; + + /** + * This is always the last event to be called when an Elite Mob dies, and is used to clean up references to it in memory. + * + * @param eliteEntity Elite Mob removed + * @param removalReason Reason for removal + */ + public EliteMobRemoveEvent(EliteEntity eliteEntity, RemovalReason removalReason) { + this.entity = eliteEntity.getUnsyncedLivingEntity(); + this.eliteEntity = eliteEntity; + this.removalReason = removalReason; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + public Entity getEntity() { + return this.entity; + } + + public EliteEntity getEliteMobEntity() { + return this.eliteEntity; + } + + public RemovalReason getRemovalReason() { + return removalReason; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/EliteMobSpawnEvent.java b/src/main/java/com/magmaguy/elitemobs/api/EliteMobSpawnEvent.java new file mode 100644 index 000000000..3e95484b6 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/EliteMobSpawnEvent.java @@ -0,0 +1,90 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.bukkit.event.entity.CreatureSpawnEvent; + +public class EliteMobSpawnEvent extends Event implements Cancellable { + + private static final HandlerList handlers = new HandlerList(); + private final LivingEntity livingEntity; + private final EliteEntity eliteEntity; + private final CreatureSpawnEvent.SpawnReason spawnReason; + private boolean isCancelled = false; + + /** + * Cancelling this event will prevent the Elite Mob from being constructed by removing it and the entity it would've converted + * + * @param eliteEntity EliteMobEntity being formed + */ + public EliteMobSpawnEvent(EliteEntity eliteEntity) { + this.livingEntity = eliteEntity.getLivingEntity(); + this.eliteEntity = eliteEntity; + this.spawnReason = eliteEntity.getSpawnReason(); + } + + public static HandlerList getHandlerList() { + return handlers; + } + + /** + * Returns the entity being converted to an EliteMobEntity + * + * @return Entity being converted into an Elite Mob + */ + public LivingEntity getEntity() { + return this.livingEntity; + } + + /** + * Returns the EliteMobEntity currently being formed + * + * @return EliteMobEntity currently being formed + */ + public EliteEntity getEliteMobEntity() { + return this.eliteEntity; + } + + /** + * Gets the reason for the Entity getting spawned + * + * @return Reason for the Entity getting spawned + */ + public CreatureSpawnEvent.SpawnReason getReason() { + return this.spawnReason; + } + + /** + * Returns if the event is cancelled + * + * @return If the event is cancelled + */ + @Override + public boolean isCancelled() { + return this.isCancelled; + } + + /** + * Cancels the event. This will cancel the formation of the Elite Mob and remove the living entity. Once cancelled it can't be uncancelled. + * + * @param cancel Cancels the event + */ + @Override + public void setCancelled(boolean cancel) { + this.isCancelled = cancel; + } + + /** + * Returns a list of handlers + * + * @return List of handlers + */ + @Override + public HandlerList getHandlers() { + return handlers; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/EliteMobTargetPlayerEvent.java b/src/main/java/com/magmaguy/elitemobs/api/EliteMobTargetPlayerEvent.java new file mode 100644 index 000000000..480f26a8b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/EliteMobTargetPlayerEvent.java @@ -0,0 +1,67 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.EventHandler; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityTargetLivingEntityEvent; + +public class EliteMobTargetPlayerEvent extends Event { + + private static final HandlerList handlers = new HandlerList(); + private final Entity entity; + private final EliteEntity eliteEntity; + private final Player player; + private final EntityTargetLivingEntityEvent entityTargetLivingEntityEvent; + + public EliteMobTargetPlayerEvent(EliteEntity eliteEntity, Player player, EntityTargetLivingEntityEvent event) { + this.entity = event.getEntity(); + this.eliteEntity = eliteEntity; + this.player = player; + this.entityTargetLivingEntityEvent = event; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + public Entity getEntity() { + return this.entity; + } + + public EliteEntity getEliteMobEntity() { + return this.eliteEntity; + } + + public Player getPlayer() { + return this.player; + } + + public EntityTargetLivingEntityEvent entityTargetLivingEntityEvent() { + return this.entityTargetLivingEntityEvent; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static class EliteMobTargetPlayerEventFilter implements Listener { + @EventHandler + public void onMobTarget(EntityTargetLivingEntityEvent event) { + if (!(event.getTarget() instanceof Player player)) return; + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(event.getEntity()); + if (eliteEntity == null) return; + + if (player.getGameMode().equals(GameMode.ADVENTURE) || player.getGameMode().equals(GameMode.SURVIVAL)) + Bukkit.getServer().getPluginManager().callEvent(new EliteMobTargetPlayerEvent(eliteEntity, player, event)); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/ElitePhaseSwitchEvent.java b/src/main/java/com/magmaguy/elitemobs/api/ElitePhaseSwitchEvent.java new file mode 100644 index 000000000..0f24c4520 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/ElitePhaseSwitchEvent.java @@ -0,0 +1,31 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.PhaseBossEntity; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class ElitePhaseSwitchEvent extends Event { + private static final HandlerList handlers = new HandlerList(); + + @Getter + private final CustomBossEntity customBossEntity; + @Getter + private final PhaseBossEntity phaseBossEntity; + + public ElitePhaseSwitchEvent(CustomBossEntity customBossEntity, PhaseBossEntity phaseBossEntity) { + this.customBossEntity = customBossEntity; + this.phaseBossEntity = phaseBossEntity; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/GenericAntiExploitEvent.java b/src/main/java/com/magmaguy/elitemobs/api/GenericAntiExploitEvent.java new file mode 100644 index 000000000..30723f7ad --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/GenericAntiExploitEvent.java @@ -0,0 +1,132 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.entity.Entity; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.util.Vector; + +public class GenericAntiExploitEvent extends Event implements Cancellable { + + private static final HandlerList handlers = new HandlerList(); + private final Entity entity; + private final EliteEntity eliteEntity; + private final EntityDamageEvent entityDamageEvent; + public Block + block000, block001, block002, + block010, block011, block012, + block020, block021, block022, + block030, block031, block032, + block100, blockBelow, block102, + block110, ground, block112, + block120, headMaterial, block122, + block130, ceilingMaterial, block132, + block200, block201, block202, + block210, block211, block212, + block220, block221, block222, + block230, block231, block232; + private boolean isCancelled = false; + private boolean isTriggered = false; + + public GenericAntiExploitEvent(EliteEntity eliteEntity, EntityDamageEvent event) { + this.entity = eliteEntity.getLivingEntity(); + this.eliteEntity = eliteEntity; + this.entityDamageEvent = event; + this.isCancelled = event.isCancelled(); + if (event.isCancelled()) return; + if (!eliteEntity.getLivingEntity().hasAI()) + setCancelled(true); + block000 = defineMaterial(new Vector(-1, -1, -1)); + block001 = defineMaterial(new Vector(-1, -1, 0)); + block002 = defineMaterial(new Vector(-1, -1, 1)); + block010 = defineMaterial(new Vector(-1, 0, -1)); + block011 = defineMaterial(new Vector(-1, 0, 0)); + block012 = defineMaterial(new Vector(-1, 0, 1)); + block020 = defineMaterial(new Vector(-1, 1, -1)); + block021 = defineMaterial(new Vector(-1, 1, 0)); + block022 = defineMaterial(new Vector(-1, 1, 1)); + block030 = defineMaterial(new Vector(-1, 2, -1)); + block031 = defineMaterial(new Vector(-1, 2, 0)); + block032 = defineMaterial(new Vector(-1, 2, 1)); + block100 = defineMaterial(new Vector(0, -1, -1)); + //mob floor location + blockBelow = defineMaterial(new Vector(0, -1, 0)); + block102 = defineMaterial(new Vector(0, -1, 1)); + block110 = defineMaterial(new Vector(0, 0, -1)); + //mob ground location + ground = defineMaterial(new Vector(0, 0, 0)); + block112 = defineMaterial(new Vector(0, 0, 1)); + block120 = defineMaterial(new Vector(0, 1, -1)); + //mob head location + headMaterial = defineMaterial(new Vector(0, 1, 0)); + block122 = defineMaterial(new Vector(0, 1, 1)); + block130 = defineMaterial(new Vector(0, 2, -1)); + //ceiling block + ceilingMaterial = defineMaterial(new Vector(0, 2, 0)); + block132 = defineMaterial(new Vector(0, 2, 1)); + block200 = defineMaterial(new Vector(1, -1, -1)); + block201 = defineMaterial(new Vector(1, -1, 0)); + block202 = defineMaterial(new Vector(1, -1, 1)); + block210 = defineMaterial(new Vector(1, 0, -1)); + block211 = defineMaterial(new Vector(1, 0, 0)); + block212 = defineMaterial(new Vector(1, 0, 1)); + block220 = defineMaterial(new Vector(1, 1, -1)); + block221 = defineMaterial(new Vector(1, 1, 0)); + block222 = defineMaterial(new Vector(1, 1, 1)); + block230 = defineMaterial(new Vector(1, 2, -1)); + block231 = defineMaterial(new Vector(1, 2, 0)); + block232 = defineMaterial(new Vector(1, 2, 1)); + + } + + public static HandlerList getHandlerList() { + return handlers; + } + + private Block defineMaterial(Vector offset) { + Location clonedLocation = entity.getLocation().getBlock().getLocation().add(new Vector(0.5, 0.5, 0.5)).clone(); + //Location templocation = clonedLocation.clone().add(offset); + //new DebugBlockLocation(templocation); + return clonedLocation.add(offset).getBlock(); + } + + public Entity getEntity() { + return entity; + } + + public EliteEntity getEliteMobEntity() { + return eliteEntity; + } + + public EntityDamageEvent getEntityDamageEvent() { + return entityDamageEvent; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + @Override + public boolean isCancelled() { + return this.isCancelled; + } + + @Override + public void setCancelled(boolean b) { + this.isCancelled = b; + } + + public boolean isTriggered() { + return isTriggered; + } + + public void setTriggered(boolean triggered) { + isTriggered = triggered; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/InstancedDungeonRemoveEvent.java b/src/main/java/com/magmaguy/elitemobs/api/InstancedDungeonRemoveEvent.java new file mode 100644 index 000000000..819891422 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/InstancedDungeonRemoveEvent.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.instanced.dungeons.DungeonInstance; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class InstancedDungeonRemoveEvent extends Event { + private static final HandlerList handlers = new HandlerList(); + + @Getter + private final DungeonInstance dungeonInstance; + + public InstancedDungeonRemoveEvent(DungeonInstance dungeonInstance) { + this.dungeonInstance = dungeonInstance; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/NPCEntityRemoveEvent.java b/src/main/java/com/magmaguy/elitemobs/api/NPCEntityRemoveEvent.java new file mode 100644 index 000000000..2d8ed2b0b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/NPCEntityRemoveEvent.java @@ -0,0 +1,4 @@ +package com.magmaguy.elitemobs.api; + +public class NPCEntityRemoveEvent { +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/NPCEntitySpawnEvent.java b/src/main/java/com/magmaguy/elitemobs/api/NPCEntitySpawnEvent.java new file mode 100644 index 000000000..dd29d735f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/NPCEntitySpawnEvent.java @@ -0,0 +1,77 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.npcs.NPCEntity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class NPCEntitySpawnEvent extends Event implements Cancellable { + private static final HandlerList handlers = new HandlerList(); + private final LivingEntity livingEntity; + private final NPCEntity npcEntity; + private boolean isCancelled = false; + + /** + * Cancelling this event will prevent the NPC from being constructed by removing it and the entity it would've converted + */ + public NPCEntitySpawnEvent(LivingEntity livingEntity, NPCEntity npcEntity) { + this.livingEntity = livingEntity; + this.npcEntity = npcEntity; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + /** + * Returns the entity being converted to an EliteMobEntity + * + * @return Entity being converted into an Elite Mob + */ + public LivingEntity getLivingEntity() { + return this.livingEntity; + } + + /** + * Returns the EliteMobEntity currently being formed + * + * @return EliteMobEntity currently being formed + */ + public NPCEntity getNPCEntity() { + return this.npcEntity; + } + + + /** + * Returns if the event is cancelled + * + * @return If the event is cancelled + */ + @Override + public boolean isCancelled() { + return this.isCancelled; + } + + /** + * Cancels the event. This will cancel the formation of the Elite Mob and remove the living entity. Once cancelled it can't be uncancelled. + * + * @param cancel Cancels the event + */ + @Override + public void setCancelled(boolean cancel) { + this.isCancelled = cancel; + if (isCancelled) + livingEntity.remove(); + } + + /** + * Returns a list of handlers + * + * @return List of handlers + */ + @Override + public HandlerList getHandlers() { + return handlers; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/PlayerDamagedByEliteMobEvent.java b/src/main/java/com/magmaguy/elitemobs/api/PlayerDamagedByEliteMobEvent.java new file mode 100644 index 000000000..70e38bffd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/PlayerDamagedByEliteMobEvent.java @@ -0,0 +1,256 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.adventurersguild.GuildRank; +import com.magmaguy.elitemobs.collateralminecraftchanges.PlayerDeathMessageByEliteMob; +import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs.EliteMobProperties; +import com.magmaguy.elitemobs.playerdata.ElitePlayerInventory; +import com.magmaguy.elitemobs.utils.EventCaller; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Material; +import org.bukkit.attribute.Attribute; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.*; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.entity.EntityExplodeEvent; +import org.bukkit.inventory.meta.Damageable; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.ThreadLocalRandom; + +public class PlayerDamagedByEliteMobEvent extends EliteDamageEvent { + + private static final HandlerList handlers = new HandlerList(); + private final Entity entity; + private final EliteEntity eliteEntity; + private final Player player; + private final EntityDamageByEntityEvent entityDamageByEntityEvent; + private final Projectile projectile; + + public PlayerDamagedByEliteMobEvent(EliteEntity eliteEntity, Player player, EntityDamageByEntityEvent event, Projectile projectile, double damage) { + super(damage, event); + this.entity = event.getEntity(); + this.eliteEntity = eliteEntity; + this.player = player; + this.entityDamageByEntityEvent = event; + this.projectile = projectile; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + public Entity getEntity() { + return this.entity; + } + + public EliteEntity getEliteMobEntity() { + return this.eliteEntity; + } + + public Player getPlayer() { + return this.player; + } + + public Projectile getProjectile() { + return projectile; + } + + public EntityDamageByEntityEvent getEntityDamageByEntityEvent() { + return this.entityDamageByEntityEvent; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + //Thing that launches the event + public static class PlayerDamagedByEliteMobEventFilter implements Listener { + @Getter + @Setter + private static boolean bypass = false; + @Getter + @Setter + private static double specialMultiplier = 1; + + private static double eliteToPlayerDamageFormula(Player player, EliteEntity eliteEntity, EntityDamageByEntityEvent event) { + double baseDamage = EliteMobProperties.getBaselineDamage(eliteEntity.getLivingEntity().getType(), eliteEntity); + //Case for creeper and ghast explosions + if (eliteEntity.getLivingEntity() != null && player.isValid() && player.getLocation().getWorld().equals(eliteEntity.getLivingEntity().getWorld())) + if (eliteEntity.getLivingEntity().getType().equals(EntityType.CREEPER)) { + Creeper creeper = (Creeper) eliteEntity.getLivingEntity(); + double distance = player.getLocation().distance(eliteEntity.getLivingEntity().getLocation()); + double distanceAttenuation = 1 - distance / creeper.getExplosionRadius(); + distanceAttenuation = distanceAttenuation < 0 ? 0 : distanceAttenuation; + baseDamage *= distanceAttenuation; + } else if (eliteEntity.getLivingEntity().getType().equals(EntityType.GHAST) && + event.getDamager().getType().equals(EntityType.FIREBALL)) { + double distance = player.getLocation().distance(eliteEntity.getLivingEntity().getLocation()); + double distanceAttenuation = 1 - distance / ((Fireball) event.getDamager()).getYield(); + distanceAttenuation = distanceAttenuation < 0 ? 0 : distanceAttenuation; + baseDamage *= distanceAttenuation; + } + double bonusDamage = eliteEntity.getLevel() * .5; //A .5 increase in damage for every level the mob has + + ElitePlayerInventory elitePlayerInventory = ElitePlayerInventory.getPlayer(player); + if (elitePlayerInventory == null) return 0; + + //Bosses now gain .5 damage per level instead of 1 damage per level to make fight against high level and low level mobs more lenient + double damageReduction = elitePlayerInventory.getEliteDefense(true) * 0.5; + if (event.getDamager() instanceof AbstractArrow) + damageReduction += elitePlayerInventory.getEliteProjectileProtection(true); + if (event.getDamager() instanceof Fireball || event.getDamager() instanceof Creeper) { + damageReduction += elitePlayerInventory.getEliteBlastProtection(true); + } + + double customBossDamageMultiplier = eliteEntity.getDamageMultiplier(); + double potionEffectDamageReduction = 0; + + if (player.hasPotionEffect(PotionEffectType.RESISTANCE)) + potionEffectDamageReduction = (player.getPotionEffect(PotionEffectType.RESISTANCE). + getAmplifier() + 1) * MobCombatSettingsConfig.getResistanceDamageMultiplier(); + + double finalDamage; + if (eliteEntity instanceof CustomBossEntity customBossEntity && customBossEntity.isNormalizedCombat()) + finalDamage = Math.max(baseDamage + bonusDamage - damageReduction - potionEffectDamageReduction, 1) * + customBossDamageMultiplier * specialMultiplier * MobCombatSettingsConfig.getNormalizedDamageToPlayerMultiplier(); + else + finalDamage = Math.max(baseDamage + bonusDamage - damageReduction - potionEffectDamageReduction, 1) * + customBossDamageMultiplier * specialMultiplier * MobCombatSettingsConfig.getDamageToPlayerMultiplier(); + + if (specialMultiplier != 1) specialMultiplier = 1; + + double playerMaxHealth = player.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue(); + + //Prevent 1-shots + finalDamage = Math.min(finalDamage, playerMaxHealth - 1); + + return finalDamage; + } + + //Remove potion effects of creepers when they blow up because Minecraft passes those effects to players, and they are infinite + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + private void explosionEvent(EntityExplodeEvent event) { + if (event.getEntity().getType().equals(EntityType.CREEPER) && EntityTracker.isEliteMob(event.getEntity())) { + //by default minecraft spreads potion effects + Set potionEffects = new HashSet<>(((Creeper) event.getEntity()).getActivePotionEffects()); + potionEffects.forEach(potionEffectType -> ((Creeper) event.getEntity()).removePotionEffect(potionEffectType.getType())); + } + } + + @EventHandler + public void onEliteDamagePlayer(EntityDamageByEntityEvent event) { + if (event.isCancelled()) { + bypass = false; + if (!(event.getDamager() instanceof Explosive)) + return; + } + if (!(event.getEntity() instanceof Player player)) return; + + //citizens + if (player.hasMetadata("NPC") || ElitePlayerInventory.getPlayer(player) == null) + return; + + Projectile projectile = null; + + EliteEntity eliteEntity = null; + if (event.getDamager() instanceof LivingEntity) + eliteEntity = EntityTracker.getEliteMobEntity(event.getDamager()); + else if (event.getDamager() instanceof Projectile && ((Projectile) event.getDamager()).getShooter() instanceof LivingEntity) { + eliteEntity = EntityTracker.getEliteMobEntity((LivingEntity) ((Projectile) event.getDamager()).getShooter()); + projectile = (Projectile) event.getDamager(); + } else if (event.getDamager().getType().equals(EntityType.EVOKER_FANGS)) + if (((EvokerFangs) event.getDamager()).getOwner() != null) + eliteEntity = EntityTracker.getEliteMobEntity(((EvokerFangs) event.getDamager()).getOwner()); + + if (eliteEntity == null || eliteEntity.getLivingEntity() == null) return; + + //By this point, it is guaranteed that this kind of damage should have custom EliteMobs behavior + + //dodge chance + if (ThreadLocalRandom.current().nextDouble() < GuildRank.dodgeBonusValue(GuildRank.getGuildPrestigeRank(player), GuildRank.getActiveGuildRank(player)) / 100) { + player.sendTitle(" ", "Dodged!"); + event.setCancelled(true); + return; + } + + boolean blocking = false; + + //Blocking reduces melee damage and nullifies most ranged damage at the cost of shield durability + if (player.isBlocking()) { + blocking = true; + if (player.getInventory().getItemInOffHand().getType().equals(Material.SHIELD)) { + ItemMeta itemMeta = player.getInventory().getItemInOffHand().getItemMeta(); + org.bukkit.inventory.meta.Damageable damageable = (Damageable) itemMeta; + + if (player.getInventory().getItemInOffHand().getItemMeta().hasEnchant(Enchantment.UNBREAKING) && + player.getInventory().getItemInOffHand().getItemMeta().getEnchantLevel(Enchantment.UNBREAKING) / 20D > ThreadLocalRandom.current().nextDouble()) + damageable.setDamage(damageable.getDamage() + 5); + player.getInventory().getItemInOffHand().setItemMeta(itemMeta); + if (Material.SHIELD.getMaxDurability() < damageable.getDamage()) + player.getInventory().setItemInOffHand(null); + } + + if (event.getDamager() instanceof Projectile) { + bypass = false; + event.getDamager().remove(); + return; + } + } + + //Calculate the damage for the event + double newDamage = eliteToPlayerDamageFormula(player, eliteEntity, event); + //Blocking reduces damage by 80% + if (blocking) + newDamage = newDamage - newDamage * MobCombatSettingsConfig.getBlockingDamageReduction(); + //nullify vanilla reductions + for (EntityDamageEvent.DamageModifier modifier : EntityDamageByEntityEvent.DamageModifier.values()) + if (event.isApplicable(modifier) && modifier != EntityDamageEvent.DamageModifier.ABSORPTION) + event.setDamage(modifier, 0); + + //Check if we should be doing raw damage, which some powers have + + if (bypass) { + //Use raw damage in case of bypass + newDamage = event.getOriginalDamage(EntityDamageEvent.DamageModifier.BASE); + bypass = false; + } + + //Run the event, see if it will get cancelled or suffer further damage modifications + PlayerDamagedByEliteMobEvent playerDamagedByEliteMobEvent = new PlayerDamagedByEliteMobEvent(eliteEntity, player, event, projectile, newDamage); + new EventCaller(playerDamagedByEliteMobEvent); + + //In case damage got modified along the way + newDamage = playerDamagedByEliteMobEvent.getDamage(); + + if (playerDamagedByEliteMobEvent.isCancelled()) { + bypass = false; + return; + } + + //Set the final damage value + event.setDamage(EntityDamageEvent.DamageModifier.BASE, newDamage); + + //Deal with the player getting killed todo: this is a bit busted, fix + if (player.getHealth() - event.getDamage() <= 0) + PlayerDeathMessageByEliteMob.addDeadPlayer(player, PlayerDeathMessageByEliteMob.initializeDeathMessage(player, eliteEntity)); + + } + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/PlayerJoinArenaEvent.java b/src/main/java/com/magmaguy/elitemobs/api/PlayerJoinArenaEvent.java new file mode 100644 index 000000000..e937cee4d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/PlayerJoinArenaEvent.java @@ -0,0 +1,28 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.instanced.arena.ArenaInstance; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class PlayerJoinArenaEvent extends Event { + private static final HandlerList handlers = new HandlerList(); + + @Getter + private final ArenaInstance arenaInstance; + + public PlayerJoinArenaEvent(ArenaInstance arenaInstance) { + this.arenaInstance = arenaInstance; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/PlayerJoinDungeonEvent.java b/src/main/java/com/magmaguy/elitemobs/api/PlayerJoinDungeonEvent.java new file mode 100644 index 000000000..d2c80ce2d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/PlayerJoinDungeonEvent.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.instanced.dungeons.DungeonInstance; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class PlayerJoinDungeonEvent extends Event { + private static final HandlerList handlers = new HandlerList(); + + @Getter + private final DungeonInstance dungeonInstance; + + public PlayerJoinDungeonEvent(DungeonInstance dungeonInstance) { + this.dungeonInstance = dungeonInstance; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/PlayerLeaveArenaEvent.java b/src/main/java/com/magmaguy/elitemobs/api/PlayerLeaveArenaEvent.java new file mode 100644 index 000000000..66d038cdc --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/PlayerLeaveArenaEvent.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.instanced.arena.ArenaInstance; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class PlayerLeaveArenaEvent extends Event { + private static final HandlerList handlers = new HandlerList(); + + @Getter + private final ArenaInstance arenaInstance; + + public PlayerLeaveArenaEvent(ArenaInstance arenaInstance) { + this.arenaInstance = arenaInstance; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/PlayerLeaveDungeonEvent.java b/src/main/java/com/magmaguy/elitemobs/api/PlayerLeaveDungeonEvent.java new file mode 100644 index 000000000..f01bb92f1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/PlayerLeaveDungeonEvent.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.instanced.dungeons.DungeonInstance; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class PlayerLeaveDungeonEvent extends Event { + private static final HandlerList handlers = new HandlerList(); + + @Getter + private final DungeonInstance dungeonInstance; + + public PlayerLeaveDungeonEvent(DungeonInstance dungeonInstance) { + this.dungeonInstance = dungeonInstance; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/PlayerPreTeleportEvent.java b/src/main/java/com/magmaguy/elitemobs/api/PlayerPreTeleportEvent.java new file mode 100644 index 000000000..1974d0b5b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/PlayerPreTeleportEvent.java @@ -0,0 +1,120 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.CombatTagConfig; +import com.magmaguy.elitemobs.utils.EventCaller; +import com.magmaguy.magmacore.util.ChatColorConverter; +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.*; +import org.bukkit.scheduler.BukkitRunnable; + +public class PlayerPreTeleportEvent extends Event implements Cancellable { + + private static final HandlerList handlers = new HandlerList(); + private final Location destination; + private final Location originalLocation; + private final Player player; + private boolean isCancelled = false; + + /** + * Called when a player initiates a teleport to a location. The teleport will go through 3 seconds after the event is + * launched, assuming it isn't cancelled by the player or via code. + * + * @param player Player that will teleport + * @param destination Teleport destination + */ + public PlayerPreTeleportEvent(Player player, Location destination) { + this.player = player; + this.destination = destination.clone(); + this.originalLocation = player.getLocation().clone(); + } + + public static void teleportPlayer(Player player, Location destination) { + if (destination.getWorld() == null) return; + if (CombatTagConfig.isEnableTeleportTimer()) + new EventCaller(new PlayerPreTeleportEvent(player, destination)); + else + PlayerTeleportEvent.teleportPlayer(player, destination); + } + + public static HandlerList getHandlerList() { + return handlers; + } + + public void startTeleport() { + new BukkitRunnable() { + int timerLeft = 3; + + @Override + public void run() { + if (!player.isValid()) { + cancel(); + return; + } + + if (player.getLocation().getX() != originalLocation.getX() || + player.getLocation().getY() != originalLocation.getY() || + player.getLocation().getZ() != originalLocation.getZ()) + isCancelled = true; + + if (isCancelled) { + player.spigot().sendMessage(ChatMessageType.ACTION_BAR, + TextComponent.fromLegacyText(ChatColorConverter.convert(CombatTagConfig.getTeleportCancelled()))); + cancel(); + return; + } + + player.spigot().sendMessage(ChatMessageType.ACTION_BAR, + TextComponent.fromLegacyText(ChatColorConverter.convert(CombatTagConfig.getTeleportTimeLeft()) + .replace("$time", timerLeft + ""))); + + + if (timerLeft == 0) { + PlayerTeleportEvent.teleportPlayer(player, destination); + cancel(); + return; + } + + timerLeft--; + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 20); + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + @Override + public boolean isCancelled() { + return this.isCancelled; + } + + @Override + public void setCancelled(boolean b) { + this.isCancelled = b; + } + + public Player getPlayer() { + return player; + } + + public Location getDestination() { + return destination; + } + + public Location getOriginalLocation() { + return originalLocation; + } + + public static class PlayerPreTeleportEventEvents implements Listener { + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onTeleportEvent(PlayerPreTeleportEvent event) { + event.startTeleport(); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/PlayerTeleportEvent.java b/src/main/java/com/magmaguy/elitemobs/api/PlayerTeleportEvent.java new file mode 100644 index 000000000..05177dd22 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/PlayerTeleportEvent.java @@ -0,0 +1,80 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.dungeons.EliteMobsWorld; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.utils.EventCaller; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.*; + +public class PlayerTeleportEvent extends Event implements Cancellable { + + private static final HandlerList handlers = new HandlerList(); + private final Location destination; + private final Location originalLocation; + private final Player player; + private boolean isCancelled = false; + + /** + * Event fired when players teleport due to EliteMobs. This is used for teleporting to the Adventurer's Guild and to + * Dungeons. + * + * @param player Player to be teleported + * @param destination Teleport destination + */ + public PlayerTeleportEvent(Player player, Location destination) { + this.player = player; + this.destination = destination; + this.originalLocation = player.getLocation().clone(); + } + + public static void teleportPlayer(Player player, Location destination) { + new EventCaller(new PlayerTeleportEvent(player, destination)); + } + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + @Override + public boolean isCancelled() { + return this.isCancelled; + } + + @Override + public void setCancelled(boolean b) { + this.isCancelled = b; + } + + public Player getPlayer() { + return player; + } + + public Location getDestination() { + return destination; + } + + public Location getOriginalLocation() { + return originalLocation; + } + + public void executeTeleport() { + if (!EliteMobsWorld.isEliteMobsWorld(player.getLocation().getWorld().getUID())) + PlayerData.setBackTeleportLocation(player, originalLocation); + + player.teleport(destination); + } + + public static class PlayerTeleportEventExecutor implements Listener { + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onPlayerTeleport(PlayerTeleportEvent event) { + event.executeTeleport(); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/QuestAcceptEvent.java b/src/main/java/com/magmaguy/elitemobs/api/QuestAcceptEvent.java new file mode 100644 index 000000000..3e3cce76c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/QuestAcceptEvent.java @@ -0,0 +1,92 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.config.QuestsConfig; +import com.magmaguy.elitemobs.config.SoundsConfig; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.quests.CustomQuest; +import com.magmaguy.elitemobs.quests.Quest; +import com.magmaguy.magmacore.util.ChatColorConverter; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.*; + +public class QuestAcceptEvent extends Event implements Cancellable { + + private static final HandlerList handlers = new HandlerList(); + @Getter + private final Player player; + @Getter + private final Quest quest; + private boolean isCancelled = false; + + public QuestAcceptEvent(Player player, Quest quest) { + this.player = player; + this.quest = quest; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public boolean isCancelled() { + return isCancelled; + } + + @Override + public void setCancelled(boolean cancel) { + isCancelled = cancel; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static class QuestAcceptEventHandler implements Listener { + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void questAcceptLimiter(QuestAcceptEvent event) { + if (PlayerData.getQuests(event.getPlayer().getUniqueId()).size() < QuestsConfig.getMaximumActiveQuests()) + return; + event.setCancelled(true); + event.getPlayer().sendMessage(ChatColorConverter.convert(QuestsConfig.getQuestCapMessage())); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onQuestAccept(QuestAcceptEvent event) { + event.getPlayer().sendMessage(QuestsConfig.getQuestJoinMessage().replace("$questName", ChatColorConverter.convert(event.getQuest().getQuestName()))); + event.getQuest().setAccepted(true); + if (QuestsConfig.isUseQuestAcceptTitles()) + event.getPlayer().sendTitle( + ChatColorConverter.convert(QuestsConfig.getQuestStartTitle().replace("$questName", event.getQuest().getQuestName())), + ChatColorConverter.convert(QuestsConfig.getQuestStartSubtitle().replace("$questName", event.getQuest().getQuestName())), + 20, 60, 20); + + boolean playedCustomSound = false; + + if (event.getQuest() instanceof CustomQuest customQuest) { + + customQuest.applyTemporaryPermissions(event.getPlayer()); + + if (customQuest.getCustomQuestsConfigFields().getQuestAcceptDialog() != null && + !customQuest.getCustomQuestsConfigFields().getQuestAcceptDialog().isEmpty()) + for (String dialog : customQuest.getCustomQuestsConfigFields().getQuestAcceptDialog()) + event.getPlayer().sendMessage(dialog); + + if (customQuest.getCustomQuestsConfigFields().getQuestAcceptSound() != null) { + Bukkit.getPlayer(customQuest.getPlayerUUID()).playSound( + Bukkit.getPlayer(customQuest.getPlayerUUID()), + customQuest.getCustomQuestsConfigFields().getQuestAcceptSound(), + 1f, 1f); + playedCustomSound = true; + } + } + if (!QuestsConfig.isAutoTrackQuestsOnAccept()) + event.getQuest().getQuestObjectives().displayTemporaryObjectivesScoreboard(event.getPlayer()); + PlayerData.addQuest(event.getPlayer().getUniqueId(), event.getQuest()); + if (!playedCustomSound) + event.getPlayer().playSound(event.getPlayer().getLocation(), SoundsConfig.questAcceptSound, 1, 1); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/QuestCompleteEvent.java b/src/main/java/com/magmaguy/elitemobs/api/QuestCompleteEvent.java new file mode 100644 index 000000000..1422c3de3 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/QuestCompleteEvent.java @@ -0,0 +1,58 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.config.SoundsConfig; +import com.magmaguy.elitemobs.quests.CustomQuest; +import com.magmaguy.elitemobs.quests.Quest; +import com.magmaguy.elitemobs.utils.EventCaller; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.*; + +public class QuestCompleteEvent extends Event implements Cancellable { + private static final HandlerList handlers = new HandlerList(); + @Getter + private final Player player; + @Getter + private final Quest quest; + private boolean cancelled; + + public QuestCompleteEvent(Player player, Quest quest) { + this.player = player; + this.quest = quest; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } + + public static class QuestCompleteEventHandler implements Listener { + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onQuestComplete(QuestCompleteEvent event) { + new EventCaller(new QuestRewardEvent(event.getPlayer(), event.quest)); + if (event.getQuest() instanceof CustomQuest customQuest && + customQuest.getCustomQuestsConfigFields().getQuestCompleteSound() != null) + Bukkit.getPlayer(customQuest.getPlayerUUID()).playSound( + Bukkit.getPlayer(customQuest.getPlayerUUID()), + customQuest.getCustomQuestsConfigFields().getQuestCompleteSound(), + 1f, 1f); + else + event.getPlayer().playSound(event.getPlayer().getLocation(), SoundsConfig.questCompleteSound, 1, 1); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/QuestLeaveEvent.java b/src/main/java/com/magmaguy/elitemobs/api/QuestLeaveEvent.java new file mode 100644 index 000000000..57f8bf775 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/QuestLeaveEvent.java @@ -0,0 +1,63 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.QuestsConfig; +import com.magmaguy.elitemobs.config.SoundsConfig; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.quests.CustomQuest; +import com.magmaguy.elitemobs.quests.Quest; +import com.magmaguy.elitemobs.quests.QuestTracking; +import lombok.Getter; +import org.bukkit.entity.Player; +import org.bukkit.event.*; +import org.bukkit.permissions.PermissionAttachment; + +public class QuestLeaveEvent extends Event { + private static final HandlerList handlers = new HandlerList(); + @Getter + private final Player player; + @Getter + private final Quest quest; + + public QuestLeaveEvent(Player player, Quest quest) { + this.player = player; + this.quest = quest; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static class QuestLeaveEventHandler implements Listener { + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onQuestLeave(QuestLeaveEvent event) { + PlayerData.removeQuest(event.getPlayer().getUniqueId(), event.getQuest()); + event.getPlayer().sendMessage(QuestsConfig.getQuestLeaveMessage().replace("$questName", event.getQuest().getQuestName())); + if (QuestsConfig.isUseQuestLeaveTitles()) + event.getPlayer().sendTitle( + QuestsConfig.getQuestLeaveTitle().replace("$questName", event.getQuest().getQuestName()), + QuestsConfig.getQuestLeaveSubtitle().replace("$questName", event.getQuest().getQuestName()), + 20, 60, 20); + if (event.getQuest() instanceof CustomQuest customQuest) { + if (!customQuest.getCustomQuestsConfigFields().getTemporaryPermissions().isEmpty()) { + PermissionAttachment permissionAttachment = event.getPlayer().addAttachment(MetadataHandler.PLUGIN); + for (String permission : customQuest.getCustomQuestsConfigFields().getTemporaryPermissions()) + permissionAttachment.setPermission(permission, false); + } + + if (QuestTracking.getPlayerTrackingQuests().containsKey(event.getPlayer())) { + QuestTracking questTracking = QuestTracking.getPlayerTrackingQuests().get(event.getPlayer()); + if (questTracking.getCustomQuest().getCustomQuestsConfigFields().equals(customQuest.getCustomQuestsConfigFields())) + questTracking.stop(); + } + } + + event.getPlayer().playSound(event.getPlayer().getLocation(), SoundsConfig.questAbandonSound, 1, 1); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/QuestObjectivesCompletedEvent.java b/src/main/java/com/magmaguy/elitemobs/api/QuestObjectivesCompletedEvent.java new file mode 100644 index 000000000..97e37bafb --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/QuestObjectivesCompletedEvent.java @@ -0,0 +1,40 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.config.QuestsConfig; +import com.magmaguy.elitemobs.quests.Quest; +import com.magmaguy.elitemobs.utils.EventCaller; +import lombok.Getter; +import org.bukkit.entity.Player; +import org.bukkit.event.*; + +public class QuestObjectivesCompletedEvent extends Event { + private static final HandlerList handlers = new HandlerList(); + @Getter + private final Player player; + @Getter + private final Quest quest; + + public QuestObjectivesCompletedEvent(Player player, Quest customQuest) { + this.player = player; + this.quest = customQuest; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static class QuestObjectivesCompletedEventHandler implements Listener { + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onObjectivesCompleted(QuestObjectivesCompletedEvent event) { + if (!QuestsConfig.isRequireQuestTurnIn()) { + QuestCompleteEvent questCompleteEvent = new QuestCompleteEvent(event.getPlayer(), event.getQuest()); + new EventCaller(questCompleteEvent); + } + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/QuestProgressionEvent.java b/src/main/java/com/magmaguy/elitemobs/api/QuestProgressionEvent.java new file mode 100644 index 000000000..4b617ee6d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/QuestProgressionEvent.java @@ -0,0 +1,49 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.config.QuestsConfig; +import com.magmaguy.elitemobs.config.SoundsConfig; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.quests.Quest; +import com.magmaguy.elitemobs.quests.QuestTracking; +import com.magmaguy.elitemobs.quests.objectives.Objective; +import lombok.Getter; +import org.bukkit.entity.Player; +import org.bukkit.event.*; + +public class QuestProgressionEvent extends Event { + private static final HandlerList handlers = new HandlerList(); + @Getter + private final Player player; + @Getter + private final Quest quest; + @Getter + private final Objective objective; + + public QuestProgressionEvent(Player player, Quest quest, Objective objective) { + this.player = player; + this.quest = quest; + this.objective = objective; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static class QuestProgressionEventHandler implements Listener { + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onQuestProgression(QuestProgressionEvent event) { + event.getQuest().getQuestObjectives().updateQuestStatus(event.getPlayer().getUniqueId()); + if (QuestsConfig.isDoQuestChatProgression()) + event.getPlayer().sendMessage(QuestsConfig.getQuestChatProgressionMessage(event.getObjective())); + if (!QuestTracking.isTracking(event.player)) + event.getQuest().getQuestObjectives().displayTemporaryObjectivesScoreboard(event.getPlayer()); + PlayerData.updateQuestStatus(event.getPlayer().getUniqueId(), event.getQuest()); + event.getPlayer().playSound(event.getPlayer().getLocation(), SoundsConfig.questProgressionSound, 1, 1); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/QuestRewardEvent.java b/src/main/java/com/magmaguy/elitemobs/api/QuestRewardEvent.java new file mode 100644 index 000000000..c7a929cbb --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/QuestRewardEvent.java @@ -0,0 +1,59 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.config.QuestsConfig; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.quests.Quest; +import com.magmaguy.magmacore.util.ChatColorConverter; +import lombok.Getter; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class QuestRewardEvent extends Event { + + private static final HandlerList handlers = new HandlerList(); + @Getter + private final Player player; + @Getter + private final Quest quest; + + public QuestRewardEvent(Player player, Quest quest) { + this.player = player; + this.quest = quest; + + quest.getQuestObjectives().setTurnedIn(true); + + doMessages(); + doRewards(); + + completeQuestData(); + } + + public static HandlerList getHandlerList() { + return handlers; + } + + private void doMessages() { + player.sendMessage(QuestsConfig.getQuestCompleteMessage().replace("$questName", quest.getQuestName())); + if (QuestsConfig.isUseQuestCompleteTitles()) + player.sendTitle( + ChatColorConverter.convert(QuestsConfig.getQuestCompleteTitle().replace("$questName", quest.getQuestName())), + ChatColorConverter.convert(QuestsConfig.getQuestCompleteSubtitle().replace("$questName", quest.getQuestName())), + 20, 60, 20); + } + + private void doRewards() { + quest.getQuestObjectives().getQuestReward().doRewards(); + } + + private void completeQuestData() { + PlayerData.removeQuest(player.getUniqueId(), quest); + PlayerData.incrementQuestsCompleted(player.getUniqueId()); + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/ScriptZoneEnterEvent.java b/src/main/java/com/magmaguy/elitemobs/api/ScriptZoneEnterEvent.java new file mode 100644 index 000000000..2c9d55bb7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/ScriptZoneEnterEvent.java @@ -0,0 +1,29 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import lombok.Getter; +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class ScriptZoneEnterEvent extends Event { + private static final HandlerList handlers = new HandlerList(); + @Getter + private final EliteEntity eliteEntity; + @Getter + private final LivingEntity entity; + + public ScriptZoneEnterEvent(EliteEntity customBossEntity, LivingEntity entity) { + this.eliteEntity = customBossEntity; + this.entity = entity; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/ScriptZoneLeaveEvent.java b/src/main/java/com/magmaguy/elitemobs/api/ScriptZoneLeaveEvent.java new file mode 100644 index 000000000..6e2505042 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/ScriptZoneLeaveEvent.java @@ -0,0 +1,29 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import lombok.Getter; +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class ScriptZoneLeaveEvent extends Event { + private static final HandlerList handlers = new HandlerList(); + @Getter + private final EliteEntity eliteEntity; + @Getter + private final LivingEntity entity; + + public ScriptZoneLeaveEvent(EliteEntity customBossEntity, LivingEntity entity) { + this.eliteEntity = customBossEntity; + this.entity = entity; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/WorldInstanceEvent.java b/src/main/java/com/magmaguy/elitemobs/api/WorldInstanceEvent.java new file mode 100644 index 000000000..dde7da10a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/WorldInstanceEvent.java @@ -0,0 +1,48 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import lombok.Getter; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class WorldInstanceEvent extends Event implements Cancellable { + private static final HandlerList handlers = new HandlerList(); + @Getter + private final DungeonPackagerConfigFields dungeonPackagerConfigFields; + @Getter + private final String blueprintWorldName; + @Getter + private final String instancedWorldName; + private boolean cancelled = false; + + + public WorldInstanceEvent(String blueprintWorldName, + String instancedWorldName, + DungeonPackagerConfigFields dungeonPackagerConfigFields) { + this.blueprintWorldName = blueprintWorldName; + this.instancedWorldName = instancedWorldName; + this.dungeonPackagerConfigFields = dungeonPackagerConfigFields; + } + + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean cancelled) { + this.cancelled = cancelled; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/WorldUninstanceEvent.java b/src/main/java/com/magmaguy/elitemobs/api/WorldUninstanceEvent.java new file mode 100644 index 000000000..87bffadce --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/WorldUninstanceEvent.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.api; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import lombok.Getter; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +public class WorldUninstanceEvent extends Event { + private static final HandlerList handlers = new HandlerList(); + + @Getter + private final DungeonPackagerConfigFields dungeonPackagerConfigFields; + + public WorldUninstanceEvent(DungeonPackagerConfigFields dungeonPackagerConfigFields) { + this.dungeonPackagerConfigFields = dungeonPackagerConfigFields; + } + + public static HandlerList getHandlerList() { + return handlers; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/instanced/MatchDestroyEvent.java b/src/main/java/com/magmaguy/elitemobs/api/instanced/MatchDestroyEvent.java new file mode 100644 index 000000000..2abe71334 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/instanced/MatchDestroyEvent.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.api.instanced; + +import com.magmaguy.elitemobs.instanced.MatchInstance; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +public class MatchDestroyEvent extends Event implements MatchEvent { + private static final HandlerList handlers = new HandlerList(); + private final MatchInstance matchInstance; + + public MatchDestroyEvent(MatchInstance matchInstance) { + this.matchInstance = matchInstance; + } + + @Override + public MatchInstance getInstance() { + return matchInstance; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlers; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/instanced/MatchEndEvent.java b/src/main/java/com/magmaguy/elitemobs/api/instanced/MatchEndEvent.java new file mode 100644 index 000000000..18a668e99 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/instanced/MatchEndEvent.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.api.instanced; + +import com.magmaguy.elitemobs.instanced.MatchInstance; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +public class MatchEndEvent extends Event implements MatchEvent { + private static final HandlerList handlers = new HandlerList(); + private final MatchInstance matchInstance; + + public MatchEndEvent(MatchInstance matchInstance) { + this.matchInstance = matchInstance; + } + + @Override + public MatchInstance getInstance() { + return matchInstance; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlers; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/instanced/MatchEvent.java b/src/main/java/com/magmaguy/elitemobs/api/instanced/MatchEvent.java new file mode 100644 index 000000000..a96f1947d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/instanced/MatchEvent.java @@ -0,0 +1,7 @@ +package com.magmaguy.elitemobs.api.instanced; + +import com.magmaguy.elitemobs.instanced.MatchInstance; + +public interface MatchEvent { + MatchInstance getInstance(); +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/instanced/MatchInstantiateEvent.java b/src/main/java/com/magmaguy/elitemobs/api/instanced/MatchInstantiateEvent.java new file mode 100644 index 000000000..e60e5268b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/instanced/MatchInstantiateEvent.java @@ -0,0 +1,38 @@ +package com.magmaguy.elitemobs.api.instanced; + +import com.magmaguy.elitemobs.instanced.MatchInstance; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +public class MatchInstantiateEvent extends Event implements MatchEvent, Cancellable { + private static final HandlerList handlers = new HandlerList(); + private final MatchInstance matchInstance; + private boolean cancelled = false; + + public MatchInstantiateEvent(MatchInstance matchInstance) { + this.matchInstance = matchInstance; + } + + @Override + public MatchInstance getInstance() { + return matchInstance; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlers; + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean b) { + this.cancelled = b; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/instanced/MatchJoinEvent.java b/src/main/java/com/magmaguy/elitemobs/api/instanced/MatchJoinEvent.java new file mode 100644 index 000000000..1378d400f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/instanced/MatchJoinEvent.java @@ -0,0 +1,46 @@ +package com.magmaguy.elitemobs.api.instanced; + +import com.magmaguy.elitemobs.instanced.MatchInstance; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +public class MatchJoinEvent extends Event implements MatchEvent, MatchPlayerEvent, Cancellable { + private static final HandlerList handlers = new HandlerList(); + private final MatchInstance matchInstance; + private final Player player; + private boolean cancelled = false; + + public MatchJoinEvent(MatchInstance matchInstance, Player player) { + this.matchInstance = matchInstance; + this.player = player; + } + + @Override + public MatchInstance getInstance() { + return matchInstance; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlers; + } + + @Override + public boolean isCancelled() { + return cancelled; + } + + @Override + public void setCancelled(boolean b) { + this.cancelled = b; + } + + @Override + public Player getPlayer() { + return player; + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/api/instanced/MatchLeaveEvent.java b/src/main/java/com/magmaguy/elitemobs/api/instanced/MatchLeaveEvent.java new file mode 100644 index 000000000..d1c140ee4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/instanced/MatchLeaveEvent.java @@ -0,0 +1,34 @@ +package com.magmaguy.elitemobs.api.instanced; + +import com.magmaguy.elitemobs.instanced.MatchInstance; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +public class MatchLeaveEvent extends Event implements MatchEvent, MatchPlayerEvent { + private static final HandlerList handlers = new HandlerList(); + private final MatchInstance matchInstance; + private final Player player; + + public MatchLeaveEvent(MatchInstance matchInstance, Player player) { + this.matchInstance = matchInstance; + this.player = player; + } + + @Override + public MatchInstance getInstance() { + return matchInstance; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlers; + } + + @Override + public Player getPlayer() { + return player; + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/api/instanced/MatchPlayerEvent.java b/src/main/java/com/magmaguy/elitemobs/api/instanced/MatchPlayerEvent.java new file mode 100644 index 000000000..8eae674ee --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/instanced/MatchPlayerEvent.java @@ -0,0 +1,7 @@ +package com.magmaguy.elitemobs.api.instanced; + +import org.bukkit.entity.Player; + +public interface MatchPlayerEvent { + Player getPlayer(); +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/instanced/MatchStartEvent.java b/src/main/java/com/magmaguy/elitemobs/api/instanced/MatchStartEvent.java new file mode 100644 index 000000000..b359e61dc --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/instanced/MatchStartEvent.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.api.instanced; + +import com.magmaguy.elitemobs.instanced.MatchInstance; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import org.jetbrains.annotations.NotNull; + +public class MatchStartEvent extends Event implements MatchEvent { + private static final HandlerList handlers = new HandlerList(); + private final MatchInstance matchInstance; + + public MatchStartEvent(MatchInstance matchInstance) { + this.matchInstance = matchInstance; + } + + @Override + public MatchInstance getInstance() { + return matchInstance; + } + + @NotNull + @Override + public HandlerList getHandlers() { + return handlers; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/internal/RemovalReason.java b/src/main/java/com/magmaguy/elitemobs/api/internal/RemovalReason.java new file mode 100644 index 000000000..6caa686ed --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/internal/RemovalReason.java @@ -0,0 +1,28 @@ +package com.magmaguy.elitemobs.api.internal; + +/** + * DEATH is used for when Elites die in a way detected correctly by EliteMobs + * CHUNK_UNLOAD fires when an Elite is removed due to a chunk unload. This is a true removal, so persistent Elites won't have it. + * WORLD_UNLOAD fires when an Elite is removed due to a World unload. Persistent Elites can't survive this. + * SHUTDOWN fires when a server shuts down, reload or when EliteMobs reloads + * OTHER fires when the reason couldn't be determined, probably a #remove() API call by another plugin + * EFFECT_TIMEOUT fires when either a power has ended or when an effect is done being displayed for any reason + */ +public enum RemovalReason { + DEATH, + PHASE_BOSS_RESET, + PHASE_BOSS_PHASE_END, + CHUNK_UNLOAD, + WORLD_UNLOAD, + SHUTDOWN, + EFFECT_TIMEOUT, + BOSS_TIMEOUT, + NPC_TIMEOUT, + OTHER, + UNSPECIFIED_WATCHDOG_REMOVAL, + REMOVE_COMMAND, + KILL_COMMAND, + REINFORCEMENT_CULL, + ENTITY_REPLACEMENT, + ARENA_RESET +} diff --git a/src/main/java/com/magmaguy/elitemobs/api/utils/EliteItemManager.java b/src/main/java/com/magmaguy/elitemobs/api/utils/EliteItemManager.java new file mode 100644 index 000000000..a6457ac7b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/api/utils/EliteItemManager.java @@ -0,0 +1,347 @@ +package com.magmaguy.elitemobs.api.utils; + +import com.magmaguy.elitemobs.combatsystem.CombatSystem; +import com.magmaguy.elitemobs.config.ItemSettingsConfig; +import com.magmaguy.elitemobs.items.EliteItemLore; +import com.magmaguy.elitemobs.items.ItemTagger; +import com.magmaguy.elitemobs.items.customenchantments.SoulbindEnchantment; +import org.bukkit.Material; +import org.bukkit.attribute.Attribute; +import org.bukkit.attribute.AttributeModifier; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; + +public class EliteItemManager { + //This is a utility class for easy and fast interfacing with EliteMobs items! Use it as a shortcut to reading source. + + /** + * Calculates the Elite DPS of an item aka EDPS. This is the damage per second dealt to Elites, which may or may not + * reflect the DPS dealt to other entities. + * + * @param itemStack ItemStack to analyze. Should be an {@ItemStack} with a GENERIC_ATTACK_SPEED and GENERIC_ATTACK_DAMAGE {@Attribute} but will handle any {@ItemStack} + * @return The EDPS of the ItemStack. Defaults to 4 as that is the unarmed DPS! + */ + public static double getDPS(@Nullable ItemStack itemStack) { + return getDPS(getAttackSpeed(itemStack), getBaseDamage(itemStack)) + getDPS(getAttackSpeed(itemStack), getEliteMobsSpecificDamage(itemStack)); + } + + /** + * Calculates the DPS of any item + * + * @param attackSpeed Attack speed from item attribute + * @param damage Damage from attribute + * @return DPS value + */ + public static double getDPS(Double attackSpeed, Double damage) { + if (attackSpeed == null || damage == null) return 4; + //Mojang sees attack speed as the number of attacks per 20 ticks (1 second). + double attackSpeedPerSecond = 1 / attackSpeed; + return damage / attackSpeedPerSecond; + } + + /** + * Gets either the "real" damage of an {@ItemStack} based on the material attributes and further attribute modifications. + * + * @param itemStack {@ItemStack} to check the damage on. + * @return Damage attribute or calculated stored damage. Defaults to 1. + */ + public static double getBaseDamage(ItemStack itemStack) { + //Default as per Minecraft defaults. This is the same as being unarmed. + double defaultDamage = 1.0; + if (itemStack == null) return defaultDamage; + //Ranged damage works differently. 6.0 damage is the best case scenario for the average arrow so that is the value used. + if (itemStack.getType() == Material.BOW) return 6.0; + if (itemStack.getType() == Material.CROSSBOW) return 7.0; + //Check the default modifiers - these are usually the only modifiers + try { + for (AttributeModifier attributeModifier : itemStack.getType().getDefaultAttributeModifiers(EquipmentSlot.HAND).get(Attribute.GENERIC_ATTACK_DAMAGE)) + defaultDamage = attributeCrawler(defaultDamage, attributeModifier); + } catch (NoSuchMethodError e) { + //If you're on an ancient version the damage will not work that well for the default materials. + return 1.0; + } + //Check custom modifiers - this should only happen when third party plugins step in + if (itemStack.getItemMeta() != null && + itemStack.getItemMeta().getAttributeModifiers() != null && + itemStack.getItemMeta().getAttributeModifiers(EquipmentSlot.HAND).containsKey(Attribute.GENERIC_ATTACK_DAMAGE)) + for (AttributeModifier attributeModifier : itemStack + .getItemMeta() + .getAttributeModifiers() + .get(Attribute.GENERIC_ATTACK_SPEED)) + defaultDamage = attributeCrawler(defaultDamage, attributeModifier); + return defaultDamage; + } + + /** + * Gets the GENERIC_ATTACK_SPEED {@Attribute} from any item - for players assuming a default {@Player} attack speed! + * + * @param itemStack ItemStack to analyze + * @return Attack speed value + */ + public static double getAttackSpeed(@Nullable ItemStack itemStack) { + //Default as per Minecraft defaults. This is 1/default for the dps + double defaultAttackSpeed = 4.0; + if (itemStack == null) return defaultAttackSpeed; + //Ranged damage works differently. Bows take 1s to draw and crossbows take 1.25s to draw. + if (itemStack.getType() == Material.BOW) return 1.0; + else if (itemStack.getType() == Material.CROSSBOW) return 0.8; + //Check the default modifiers - these are usually the only modifiers + try { + for (AttributeModifier attributeModifier : itemStack.getType().getDefaultAttributeModifiers(EquipmentSlot.HAND).get(Attribute.GENERIC_ATTACK_SPEED)) + defaultAttackSpeed = attributeCrawler(defaultAttackSpeed, attributeModifier); + } catch (NoSuchMethodError e) { + //If you're on an ancient version you just get the default sword speed. + defaultAttackSpeed = 4.0; + } + //Check custom modifiers - this should only happen when third party plugins step in + if (itemStack.getItemMeta() != null && + itemStack.getItemMeta().getAttributeModifiers() != null && + itemStack.getItemMeta().getAttributeModifiers(EquipmentSlot.HAND).containsKey(Attribute.GENERIC_ATTACK_SPEED)) + for (AttributeModifier attributeModifier : itemStack + .getItemMeta() + .getAttributeModifiers() + .get(Attribute.GENERIC_ATTACK_SPEED)) + defaultAttackSpeed = attributeCrawler(defaultAttackSpeed, attributeModifier); + return defaultAttackSpeed; + } + + /** + * This goes through the attribute modifiers and applies them to a base value + * + * @param baseValue Default value. For damage, it's 1. For attack speed, it's 4, as set by Minecraft. + * @param attributeModifier Modifier to check against. + * @return Value after being appropriately modified. + */ + private static double attributeCrawler(double baseValue, AttributeModifier attributeModifier) { + switch (attributeModifier.getOperation()) { + case ADD_NUMBER: + baseValue += attributeModifier.getAmount(); + break; + case MULTIPLY_SCALAR_1: + case ADD_SCALAR: + //Yes, these two do the same thing. No, they shouldn't. This is a spigot thing. + baseValue += baseValue * attributeModifier.getAmount(); + break; + } + return baseValue; + } + + /** + * Calculates the item level of a weapon. + * + * @param itemStack ItemStack to analyze. + * @return Item level. Can't be lower than 0. + */ + public static double getWeaponLevel(@Nullable ItemStack itemStack) { + //The weapon level takes the base stats of the item and the elite damage attribute into account. Elite sharpness + //is a part of the rarity, so it does not figure into the level math + return Math.max(Math.round( + (getDPS(getAttackSpeed(itemStack), getBaseDamage(itemStack)) + + getDPS(getAttackSpeed(itemStack), ItemTagger.getEliteDamageAttribute(itemStack))) + / CombatSystem.DPS_PER_LEVEL + ), 0); + } + + public static double getEliteDamageFromEliteAttributes(@Nullable ItemStack itemStack) { + return ItemTagger.getEliteDamageAttribute(itemStack); + } + + /** + * Calculates the damage specific to EliteMobs. More specifically, scans for the elite enchantment level of sharpness + * or power and adds the elite damage stored on the item. Note that this only adds elite enchantments, not vanilla ones. + * Those get handled through vanilla means! + * + * @return The bonus damage + */ + public static double getEliteDamageFromEnchantments(@Nullable ItemStack itemStack) { + if (itemStack == null) return 0; + //Elite Items may have elite enchantments associated to an item + int enchantmentLevel = ItemTagger.getEnchantment(itemStack.getItemMeta(), Enchantment.SHARPNESS.getKey()); + if (enchantmentLevel > 0 && ItemSettingsConfig.isUseEliteEnchantments()) { + enchantmentLevel -= Enchantment.SHARPNESS.getMaxLevel(); + if (enchantmentLevel < 0) enchantmentLevel = 0; + } else { + enchantmentLevel = ItemTagger.getEnchantment(itemStack.getItemMeta(), Enchantment.POWER.getKey()); + if (enchantmentLevel > 0 && ItemSettingsConfig.isUseEliteEnchantments()) + enchantmentLevel -= Enchantment.POWER.getMaxLevel(); + if (enchantmentLevel < 0) enchantmentLevel = 0; + } + + if (enchantmentLevel < 1) + //Note: this means sharpness works on bows and that power works on weapons. By default, this state is not reachable, so it doesn't really matter. + enchantmentLevel += itemStack.getEnchantmentLevel(Enchantment.POWER) + itemStack.getEnchantmentLevel(Enchantment.SHARPNESS); + if (enchantmentLevel == 0) return 0; + //This is how vanilla sharpness works. Might as well use it for everything. + return 1 + enchantmentLevel * 0.5; + } + + public static double getEliteMobsSpecificDamage(ItemStack itemStack) { + return getEliteDamageFromEliteAttributes(itemStack) + getEliteDamageFromEnchantments(itemStack); + } + + /** + * Calculates the total DPS. This adds base damage to elite damage. + * + * @param itemStack ItemStack to scan + * @return EDPS value + */ + public static double getTotalDPS(@Nullable ItemStack itemStack) { + if (itemStack == null) return 0; + double bonusDamage = getEliteMobsSpecificDamage(itemStack); + if (bonusDamage == 0) return 0; + return getDPS(getAttackSpeed(itemStack), bonusDamage); + } + + /** + * Calculates the elite protection value. This value is completely divorced from vanilla Minecraft as the vanilla method does not scale well for MMORPG-like progression. + * + * @param itemStack ItemStack to analyze + * @return Elite protection value + */ + public static double getEliteDefense(@Nullable ItemStack itemStack) { + if (itemStack == null || itemStack.getItemMeta() == null) return 0D; + //Since there are 4 pieces of armor, this gets divided by 4 + double materialValue = CombatSystem.getMaterialTier(itemStack.getType()) / 4D; + double defenseAttribute = ItemTagger.getEliteDefenseAttribute(itemStack); + return materialValue + defenseAttribute; + } + + public static double getArmorLevel(@Nullable ItemStack itemStack) { + if (itemStack == null || itemStack.getItemMeta() == null) return 0D; + //Each piece of armor lowers damage by .25, and .25 damage represents 1 level, so the level is the protection * 4 + return getEliteDefense(itemStack) * 4D; + } + + public static double getBonusEliteDefense(@Nullable ItemStack itemStack) { + if (itemStack == null || itemStack.getItemMeta() == null) return 0D; + int enchantmentLevel = 0; + enchantmentLevel = ItemTagger.getEnchantment(itemStack.getItemMeta(), Enchantment.PROTECTION.getKey()); + return enchantmentLevel * .25; + } + + /** + * Calculates the item level of any given {@ItemStack} + * + * @param itemStack ItemStack to analyze + * @return Item level + */ + public static double getItemLevel(@Nullable ItemStack itemStack) { + double value = getWeaponLevel(itemStack); + if (value > 3.0) return value; + return getArmorLevel(itemStack); + } + + public static int getRoundedItemLevel(@Nullable ItemStack itemStack) { + return (int) Math.round(getItemLevel(itemStack)); + } + + public static boolean isWeapon(@Nullable ItemStack itemStack) { + if (itemStack == null) return false; + //Wooden axe stats are so bad they can't even get detected properly + if (itemStack.getType().equals(Material.WOODEN_AXE) || itemStack.getType().equals(Material.CROSSBOW)) + return true; + if (ItemSettingsConfig.isUseHoesAsWeapons() && + (itemStack.getType().equals(Material.WOODEN_HOE) || + itemStack.getType().equals(Material.GOLDEN_HOE) || + itemStack.getType().equals(Material.STONE_HOE) || + itemStack.getType().equals(Material.IRON_HOE) || + itemStack.getType().equals(Material.DIAMOND_HOE) || + itemStack.getType().equals(Material.NETHERITE_HOE))) + return true; + return getWeaponLevel(itemStack) > 3.0; + } + + public static boolean isArmor(@Nullable ItemStack itemStack) { + return getArmorLevel(itemStack) > 0; + } + + public static void setEliteLevel(@Nullable ItemStack itemStack, int level) { + if (itemStack == null) return; + registerEliteItem(itemStack); + if (isWeapon(itemStack)) { + double damage = calculateEliteBonus(itemStack, level); + if (damage > 0) + ItemTagger.setEliteDamageAttribute(itemStack, damage); + } else if (isArmor(itemStack)) { + double defense = calculateEliteBonus(itemStack, level); + if (defense > 0) + ItemTagger.setEliteDefenseAttribute(itemStack, defense); + } + new EliteItemLore(itemStack, false); + } + + /** + * This returns how much elite damage an item would give, based on a level. This should be used when a level wants to + * be calculated instead of read, which should only be true when you're doing something tricky like temporarily limiting + * the level of items for instanced dungeons + * + * @param itemStack ItemStack to check the level of + * @param level Level to calculate + * @return Amount of damage an elite weapon of that level would deal + */ + public static double calculateEliteBonus(ItemStack itemStack, int level) { + if (isWeapon(itemStack)) { + return level * CombatSystem.DPS_PER_LEVEL / 1 / getAttackSpeed(itemStack) - getBaseDamage(itemStack); + } else if (isArmor(itemStack)) { + return (level - CombatSystem.getMaterialTier(itemStack.getType())) / 4D; + } + return 0; + } + + public static void tagArrow(@Nullable Projectile projectile) { + if (projectile == null) return; + if (!(projectile.getShooter() instanceof Player)) return; + ItemTagger.setEliteDamageAttribute(projectile, getEliteMobsSpecificDamage(((Player) projectile.getShooter()).getInventory().getItemInMainHand())); + } + + public static double getArrowEliteDamage(@Nullable Projectile projectile) { + return ItemTagger.getEliteDamageAttribute(projectile); + } + + /** + * Checks if an item is an EliteMobs item + * + * @param itemStack Item to analyze + * @return If the item is an elite item + */ + public static boolean isEliteMobsItem(ItemStack itemStack) { + return ItemTagger.isEliteItem(itemStack); + } + + public static void registerEliteItem(@Nullable ItemStack itemStack) { + if (itemStack == null || itemStack.getItemMeta() == null) return; + ItemMeta itemMeta = itemStack.getItemMeta(); + ItemTagger.registerEliteItem(itemMeta); + itemStack.setItemMeta(itemMeta); + } + + /** + * Returns whether an item meta has the soulbind enchantment + * + * @param itemMeta Item meta to be evaluated + * @return Whether the item has the soulbind meta + */ + @Nullable + public static boolean hasSoulbindEnchantment(@NotNull ItemMeta itemMeta) { + return SoulbindEnchantment.itemHasSoulbindEnchantment(itemMeta); + } + + /** + * Gets the {@link Player} to whom the item meta is linked. + * + * @param itemMeta Item meta to be evaluated. + * @return Player to whom the meta is linked. Returns null if no player is linked, or if the player linked is not online. + */ + @Nullable + public static Player getSoulboundPlayer(@NotNull ItemMeta itemMeta) { + return SoulbindEnchantment.getSoulboundPlayer(itemMeta); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/AlternativeDurabilityLoss.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/AlternativeDurabilityLoss.java new file mode 100644 index 000000000..f805347df --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/AlternativeDurabilityLoss.java @@ -0,0 +1,88 @@ +package com.magmaguy.elitemobs.collateralminecraftchanges; + +import com.magmaguy.elitemobs.api.utils.EliteItemManager; +import com.magmaguy.elitemobs.config.ItemSettingsConfig; +import com.magmaguy.elitemobs.items.ItemTagger; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityShootBowEvent; +import org.bukkit.event.entity.PlayerDeathEvent; +import org.bukkit.event.player.PlayerItemDamageEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class AlternativeDurabilityLoss implements Listener { + + //these values are percentual + private static double durabilityLoss(ItemStack itemStack) { + boolean isWeaponMaterial = EliteItemManager.isWeapon(itemStack); + int maxDurability = itemStack.getType().getMaxDurability() > (isWeaponMaterial ? 2000 : 1000) ? (isWeaponMaterial ? 2000 : 1000) : itemStack.getType().getMaxDurability(); + double baseModifier = isWeaponMaterial ? 2000 : 1000; + double durabilityLoss = ((baseModifier - maxDurability) / baseModifier) * ItemSettingsConfig.getEliteDurabilityMultiplier(); + double durabilityLevel = 1 + (ItemTagger.getEnchantment(itemStack.getItemMeta(), Enchantment.UNBREAKING.getKey()) / 4d); + double defaultMultiplier = 0.5; //just tweaking defaults + return durabilityLoss / durabilityLevel * defaultMultiplier; + } + + private static boolean isOnLastDamage(ItemStack itemStack) { + if (itemStack == null) return false; + if (!itemStack.hasItemMeta()) return false; + if (!ItemTagger.isEliteItem(itemStack)) return false; + if (!(itemStack.getItemMeta() instanceof Damageable)) return false; + if (itemStack.getType().getMaxDurability() == 0) return false; + return ((Damageable) itemStack.getItemMeta()).getDamage() + 1 >= itemStack.getType().getMaxDurability(); + } + + public static void doDurabilityLoss(Player player) { + if (!ItemSettingsConfig.isEliteDurability()) return; + List itemsList = new ArrayList<>(Arrays.stream(player.getInventory().getArmorContents()).toList()); + itemsList.add(player.getInventory().getItemInMainHand()); + itemsList.add(player.getInventory().getItemInOffHand()); + + for (ItemStack itemStack : itemsList) + if (itemStack != null && + itemStack.getType().getMaxDurability() != 0 && + EliteItemManager.isEliteMobsItem(itemStack) && + itemStack.getItemMeta() instanceof Damageable damageable) { + int maxDurability = itemStack.getType().getMaxDurability(); + int durabilityLoss = (int) (maxDurability * durabilityLoss(itemStack)); + int currentDurability = damageable.getDamage(); + int newDurability = currentDurability + durabilityLoss; + damageable.setDamage(newDurability); + itemStack.setItemMeta(damageable); + if (newDurability >= maxDurability) + if (ItemSettingsConfig.isPreventEliteItemsFromBreaking()) { + damageable.setDamage(maxDurability - 1); + itemStack.setItemMeta(damageable); + } else { + itemStack.setAmount(0); + } + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onDurabilityLoss(PlayerItemDamageEvent event) { + if (!EliteItemManager.isEliteMobsItem(event.getItem())) return; + if (!EliteItemManager.isArmor(event.getItem()) && !EliteItemManager.isWeapon(event.getItem())) return; + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerDeath(PlayerDeathEvent event) { + doDurabilityLoss(event.getEntity()); + } + + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerShoot(EntityShootBowEvent event) { + if (!EliteItemManager.isEliteMobsItem(event.getBow())) return; + if (isOnLastDamage(event.getBow())) event.setCancelled(true); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/AntiExploitMessage.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/AntiExploitMessage.java deleted file mode 100644 index d77ec0b2d..000000000 --- a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/AntiExploitMessage.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.magmaguy.elitemobs.collateralminecraftchanges; - -import com.magmaguy.elitemobs.ChatColorConverter; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; -import net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.chat.TextComponent; -import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; - - -public class AntiExploitMessage { - - public static void sendWarning(LivingEntity livingEntity) { - - for (Entity entity : livingEntity.getNearbyEntities(15, 15, 15)) - if (entity instanceof Player) { - Player player = (Player) entity; - player.spigot().sendMessage(ChatMessageType.ACTION_BAR, - TextComponent.fromLegacyText(ChatColorConverter.convert(ConfigValues.mobCombatSettingsConfig.getString(MobCombatSettingsConfig.ANTI_EXPLOIT_MESSAGE)))); - } - - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/ChunkUnloadMetadataPurge.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/ChunkUnloadMetadataPurge.java deleted file mode 100644 index df545a6a9..000000000 --- a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/ChunkUnloadMetadataPurge.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.collateralminecraftchanges; - -import com.magmaguy.elitemobs.EntityTracker; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.world.ChunkUnloadEvent; - - -/** - * Created by MagmaGuy on 20/12/2016. - */ -public class ChunkUnloadMetadataPurge implements Listener { - - @EventHandler - public void onUnload(ChunkUnloadEvent event) { - EntityTracker.chunkWiper(event); - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/CombustionPrevention.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/CombustionPrevention.java new file mode 100644 index 000000000..5491259a5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/CombustionPrevention.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.collateralminecraftchanges; + +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityCombustEvent; +import org.bukkit.potion.PotionEffectType; + +public class CombustionPrevention implements Listener { + @EventHandler + public void onCombust(EntityCombustEvent event) { + if (event.getEntity() instanceof LivingEntity && + ((LivingEntity) event.getEntity()).hasPotionEffect(PotionEffectType.FIRE_RESISTANCE)) + event.setCancelled(true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/EliteBlazeWaterDamagePrevention.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/EliteBlazeWaterDamagePrevention.java new file mode 100644 index 000000000..4cd3e9b86 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/EliteBlazeWaterDamagePrevention.java @@ -0,0 +1,18 @@ +package com.magmaguy.elitemobs.collateralminecraftchanges; + +import com.magmaguy.elitemobs.api.EliteMobDamagedEvent; +import org.bukkit.entity.EntityType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; + +public class EliteBlazeWaterDamagePrevention implements Listener { + @EventHandler(priority = EventPriority.LOWEST) + public void onBlazeWaterDamage(EliteMobDamagedEvent event) { + if (event.getEntity() == null) return; + if (!event.getEntity().getType().equals(EntityType.BLAZE)) return; + if (!event.getEntityDamageEvent().getCause().equals(EntityDamageEvent.DamageCause.DROWNING)) return; + event.setCancelled(true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/EliteSlimeDeathSplit.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/EliteSlimeDeathSplit.java new file mode 100644 index 000000000..5655c3116 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/EliteSlimeDeathSplit.java @@ -0,0 +1,14 @@ +package com.magmaguy.elitemobs.collateralminecraftchanges; + +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.SlimeSplitEvent; + +public class EliteSlimeDeathSplit implements Listener { + @EventHandler (ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void SlimeSplitEvent(SlimeSplitEvent event){ + if (EntityTracker.isEliteMob(event.getEntity())) event.setCancelled(true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/EnderCrystalDamageProtectionBypass.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/EnderCrystalDamageProtectionBypass.java new file mode 100644 index 000000000..cd1b6ca52 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/EnderCrystalDamageProtectionBypass.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.collateralminecraftchanges; + +import com.magmaguy.elitemobs.utils.EntityFinder; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; + +public class EnderCrystalDamageProtectionBypass implements Listener { + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onEntityDamageByEntityEvent(EntityDamageByEntityEvent event) { + if (!event.getEntity().getType().equals(EntityType.END_CRYSTAL)) return; + LivingEntity entity = EntityFinder.filterRangedDamagers(event.getDamager()); + if (entity == null || !entity.getType().equals(EntityType.PLAYER)) return; + event.setCancelled(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/EnderDragonUnstuck.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/EnderDragonUnstuck.java new file mode 100644 index 000000000..666bff7e9 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/EnderDragonUnstuck.java @@ -0,0 +1,47 @@ +package com.magmaguy.elitemobs.collateralminecraftchanges; + +import com.magmaguy.elitemobs.api.EliteMobEnterCombatEvent; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import org.bukkit.entity.EnderDragon; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Wolf; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityTargetLivingEntityEvent; + +public class EnderDragonUnstuck implements Listener { + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onDragonEnterCombat(EliteMobEnterCombatEvent event) { + if (event.getEliteMobEntity() == null) return; + if (event.getEliteMobEntity().getLivingEntity() == null) return; + if (!event.getEliteMobEntity().getLivingEntity().getType().equals(EntityType.ENDER_DRAGON)) return; + event.getEliteMobEntity().getLivingEntity().setAI(true); + ((EnderDragon) event.getEliteMobEntity().getLivingEntity()).setPhase(EnderDragon.Phase.LEAVE_PORTAL); + } + + public static class AggroPrevention implements Listener { + + @EventHandler(ignoreCancelled = true) + public void onTarget(EntityTargetLivingEntityEvent event) { + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(event.getEntity()); + if (eliteEntity == null) return; + //No modification for passive entities + if (eliteEntity instanceof CustomBossEntity customBossEntity && customBossEntity.getCustomBossesConfigFields().isNeutral()) + return; + EliteEntity eliteEntity1 = EntityTracker.getEliteMobEntity(event.getTarget()); + if (eliteEntity1 != null && eliteEntity1 instanceof CustomBossEntity customBossEntity && customBossEntity.getCustomBossesConfigFields().isNeutral()) + return; + if (event.getEntity().getType().equals(EntityType.WOLF) && !((Wolf) event.getEntity()).isAngry() || + event.getTarget() != null && + event.getTarget().getType().equals(EntityType.WOLF) && !((Wolf) event.getTarget()).isAngry()) + return; + if (EntityTracker.isEliteMob(event.getEntity()) && event.getTarget() != null && EntityTracker.isEliteMob(event.getTarget()) || + EntityTracker.isEliteMob(event.getEntity()) && event.getTarget() != null && EntityTracker.isNPCEntity(event.getTarget())) + event.setCancelled(true); + } + + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/EntityDeathDataFlusher.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/EntityDeathDataFlusher.java deleted file mode 100644 index b402c859d..000000000 --- a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/EntityDeathDataFlusher.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.collateralminecraftchanges; - -import com.magmaguy.elitemobs.EntityTracker; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDeathEvent; - -/** - * Created by MagmaGuy on 14/07/2017. - */ -public class EntityDeathDataFlusher implements Listener { - - @EventHandler(priority = EventPriority.MONITOR) - public void onEntityDeathFlushData(EntityDeathEvent event) { - - EntityTracker.deathWipe(event); - - } - - -} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/EntityTransformHandler.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/EntityTransformHandler.java new file mode 100644 index 000000000..85cafeef0 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/EntityTransformHandler.java @@ -0,0 +1,18 @@ +package com.magmaguy.elitemobs.collateralminecraftchanges; + +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityTransformEvent; + +public class EntityTransformHandler implements Listener { + + @EventHandler + public void onMobTransform(EntityTransformEvent event) { + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(event.getEntity()); + if (eliteEntity == null) return; + event.setCancelled(true); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/EnvironmentalDungeonDamage.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/EnvironmentalDungeonDamage.java new file mode 100644 index 000000000..347370d56 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/EnvironmentalDungeonDamage.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.collateralminecraftchanges; + +import com.magmaguy.elitemobs.config.DungeonsConfig; +import com.magmaguy.elitemobs.dungeons.EliteMobsWorld; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; + +public class EnvironmentalDungeonDamage implements Listener { + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onDamage(EntityDamageEvent event) { + if (!EliteMobsWorld.isEliteMobsWorld(event.getEntity().getWorld().getUID())) return; + switch (event.getCause()) { + case POISON -> event.setDamage(event.getDamage() * DungeonsConfig.getPoisonDamageMultiplier()); + case WITHER -> event.setDamage(event.getDamage() * DungeonsConfig.getWitherDamageMultiplier()); + case FIRE_TICK -> event.setDamage(event.getDamage() * DungeonsConfig.getFireDamageMultiplier()); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/FindNewWorlds.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/FindNewWorlds.java new file mode 100644 index 000000000..236a57873 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/FindNewWorlds.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.collateralminecraftchanges; + +import com.magmaguy.elitemobs.config.ValidWorldsConfig; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.world.WorldLoadEvent; + +public class FindNewWorlds implements Listener { + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onWorldLoad(WorldLoadEvent event) { + ValidWorldsConfig.addWorld(event.getWorld().getName()); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/FindSuperMobs.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/FindSuperMobs.java deleted file mode 100644 index 95ea00ed0..000000000 --- a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/FindSuperMobs.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.magmaguy.elitemobs.collateralminecraftchanges; - -import com.magmaguy.elitemobs.mobconstructor.mobdata.passivemobs.SuperMobProperties; -import org.bukkit.entity.Entity; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.world.ChunkLoadEvent; - -public class FindSuperMobs implements Listener { - - @EventHandler - public void findSuperMob(ChunkLoadEvent event) { - - for (Entity entity : event.getChunk().getEntities()) - if (SuperMobProperties.isValidSuperMobType(entity)) { - } - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/FixPlayerOnLoginOrRespawn.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/FixPlayerOnLoginOrRespawn.java new file mode 100644 index 000000000..7293e3822 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/FixPlayerOnLoginOrRespawn.java @@ -0,0 +1,28 @@ +package com.magmaguy.elitemobs.collateralminecraftchanges; + +import com.magmaguy.elitemobs.config.DefaultConfig; +import org.bukkit.attribute.Attribute; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerRespawnEvent; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +public class FixPlayerOnLoginOrRespawn implements Listener { + @EventHandler + public void onPlayerRespawn(PlayerRespawnEvent event) { + event.getPlayer().addPotionEffect(new PotionEffect(PotionEffectType.SLOWNESS, 0, 0)); + event.getPlayer().addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 0, 0)); + if (DefaultConfig.isResetPlayerScaleOnLogin()) + event.getPlayer().getAttribute(Attribute.GENERIC_SCALE).setBaseValue(1f); + } + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + event.getPlayer().addPotionEffect(new PotionEffect(PotionEffectType.SLOWNESS, 0, 0)); + event.getPlayer().addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 0, 0)); + if (DefaultConfig.isResetPlayerScaleOnLogin()) + event.getPlayer().getAttribute(Attribute.GENERIC_SCALE).setBaseValue(1f); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/ItemDisenchantPrevention.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/ItemDisenchantPrevention.java new file mode 100644 index 000000000..dc659474a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/ItemDisenchantPrevention.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.collateralminecraftchanges; + +import com.magmaguy.elitemobs.api.utils.EliteItemManager; +import com.magmaguy.elitemobs.config.ItemSettingsConfig; +import org.bukkit.event.Event; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryType; + +public class ItemDisenchantPrevention implements Listener { + @EventHandler + public void onDisenchant(InventoryClickEvent event) { + if (!event.getSlotType().equals(InventoryType.SlotType.RESULT)) return; + if (!event.getInventory().getType().equals(InventoryType.GRINDSTONE)) return; + if (!EliteItemManager.isEliteMobsItem(event.getInventory().getItem(0)) && + !EliteItemManager.isEliteMobsItem(event.getInventory().getItem(1))) return; + event.setResult(Event.Result.DENY); + event.setCancelled(true); + event.getWhoClicked().sendMessage(ItemSettingsConfig.getPreventEliteItemDisenchantmentMessage()); + event.getWhoClicked().closeInventory(); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/ItemEnchantmentPrevention.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/ItemEnchantmentPrevention.java new file mode 100644 index 000000000..36e73ea9b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/ItemEnchantmentPrevention.java @@ -0,0 +1,32 @@ +package com.magmaguy.elitemobs.collateralminecraftchanges; + +import com.magmaguy.elitemobs.items.ItemTagger; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.enchantment.PrepareItemEnchantEvent; +import org.bukkit.event.inventory.PrepareAnvilEvent; + +public class ItemEnchantmentPrevention implements Listener { + @EventHandler(priority = EventPriority.HIGHEST) + public void onResultGeneration(PrepareAnvilEvent event) { + if (!ItemTagger.isEliteItem(event.getInventory().getItem(0)) && + !ItemTagger.isEliteItem(event.getInventory().getItem(1))) + return; + event.setResult(ItemStackGenerator.generateItemStack(Material.AIR)); + event.getInventory().setRepairCost(300); + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onResultGeneration(PrepareItemEnchantEvent event) { + if (!ItemTagger.isEliteItem(event.getInventory().getItem(0)) && + !ItemTagger.isEliteItem(event.getInventory().getItem(1))) + return; + event.setCancelled(true); + //todo: test this, also why was this feature not on? + //event.setResult(ItemStackGenerator.generateItemStack(Material.AIR)); + //event.getInventory().setRepairCost(300); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/KeepNeutralsAngry.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/KeepNeutralsAngry.java new file mode 100644 index 000000000..2beb66562 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/KeepNeutralsAngry.java @@ -0,0 +1,60 @@ +package com.magmaguy.elitemobs.collateralminecraftchanges; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.attribute.Attribute; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Mob; +import org.bukkit.entity.Player; +import org.bukkit.entity.Wolf; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.HashSet; +import java.util.Objects; + +public class KeepNeutralsAngry { + private static final HashSet angryMobs = new HashSet<>(); + + private KeepNeutralsAngry() { + } + + public static void showMeYouWarFace(EliteEntity eliteEntity) { + //might already contain + EntityType entityType = eliteEntity.getLivingEntity().getType(); + if (angryMobs.contains(eliteEntity)) return; + new BukkitRunnable() { + @Override + public void run() { + if (eliteEntity instanceof CustomBossEntity customBossEntity && customBossEntity.getCustomBossesConfigFields().isNeutral()) + return; + //It is possible for entities to change type during combat, in which case they need to be wiped + if (!eliteEntity.isValid() || + !entityType.equals(eliteEntity.getLivingEntity().getType()) || + entityType.equals(EntityType.WOLF) && ((Wolf) eliteEntity.getLivingEntity()).isTamed()) { + cancel(); + angryMobs.remove(eliteEntity); + return; + } + + if (!eliteEntity.getLivingEntity().getType().equals(EntityType.LLAMA) && !eliteEntity.getLivingEntity().getType().equals(EntityType.RABBIT) && + ((Mob) eliteEntity.getLivingEntity()).getTarget() != null) + return; + + for (Player player : Bukkit.getOnlinePlayers()) + if (!player.getGameMode().equals(GameMode.SPECTATOR) && !player.getGameMode().equals(GameMode.CREATIVE) && + Objects.equals(player.getLocation().getWorld(), eliteEntity.getLocation().getWorld()) && + player.getLocation().distanceSquared(eliteEntity.getLocation()) < + Math.pow(Objects.requireNonNull(eliteEntity.getLivingEntity().getAttribute(Attribute.GENERIC_FOLLOW_RANGE)).getValue(), 2)) { + ((Mob) eliteEntity.getLivingEntity()).setTarget(player); + return; + } + + ((Mob) eliteEntity.getLivingEntity()).setTarget(null); + + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 20); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/LightningImmunity.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/LightningImmunity.java new file mode 100644 index 000000000..a3566e5c7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/LightningImmunity.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.collateralminecraftchanges; + +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import org.bukkit.entity.EntityType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; + +public class LightningImmunity implements Listener { + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onLightningStrike(EntityDamageByEntityEvent event) { + if (!event.getDamager().getType().equals(EntityType.LIGHTNING_BOLT)) return; + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(event.getEntity()); + if (eliteEntity == null) return; + if (eliteEntity.hasPower(PowersConfig.getPower("attack_lightning.yml")) || + eliteEntity.hasPower(PowersConfig.getPower("lightning_bolts.yml"))) + event.setCancelled(true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/LightningSpawnBypass.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/LightningSpawnBypass.java new file mode 100644 index 000000000..e102cee26 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/LightningSpawnBypass.java @@ -0,0 +1,31 @@ +package com.magmaguy.elitemobs.collateralminecraftchanges; + +import org.bukkit.Location; +import org.bukkit.entity.EntityType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntitySpawnEvent; + +public class LightningSpawnBypass implements Listener { + private static boolean bypass = false; + + public static void strikeLightingIgnoreProtections(Location location) { + if (location == null || location.getWorld() == null) return; + bypass = true; + location.getWorld().strikeLightningEffect(location); + } + + public static void bypass() { + bypass = true; + } + + //This overrides region protection plugins that would delete lightning - breaking powers and effects + @EventHandler(priority = EventPriority.HIGHEST) + public void onLightningSpawn(EntitySpawnEvent event) { + if (!bypass) return; + if (!event.getEntity().getType().equals(EntityType.LIGHTNING_BOLT)) return; + bypass = true; + event.setCancelled(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/NPCsBecomeWitches.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/NPCsBecomeWitches.java new file mode 100644 index 000000000..964209f17 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/NPCsBecomeWitches.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.collateralminecraftchanges; + +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityTransformEvent; + +public class NPCsBecomeWitches implements Listener { + @EventHandler(priority = EventPriority.HIGHEST) + public void onNPCConversion(EntityTransformEvent event) { + if (!EntityTracker.isNPCEntity(event.getEntity())) return; + event.setCancelled(true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PlayerDeathMessageByEliteMob.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PlayerDeathMessageByEliteMob.java index 5acac3794..b3e8ea913 100644 --- a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PlayerDeathMessageByEliteMob.java +++ b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PlayerDeathMessageByEliteMob.java @@ -1,24 +1,11 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package com.magmaguy.elitemobs.collateralminecraftchanges; -import com.magmaguy.elitemobs.ChatColorConverter; -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.playerdata.PlayerStatsTracker; +import com.magmaguy.magmacore.util.ChatColorConverter; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -26,10 +13,11 @@ import org.bukkit.event.entity.PlayerDeathEvent; import java.util.HashMap; +import java.util.concurrent.ThreadLocalRandom; public class PlayerDeathMessageByEliteMob implements Listener { - private static HashMap deadPlayerList = new HashMap<>(); + private static final HashMap deadPlayerList = new HashMap<>(); public static void addDeadPlayer(Player player, String deathMessage) { deadPlayerList.put(player, deathMessage); @@ -43,85 +31,26 @@ private static void removeDeadPlayer(Player player) { deadPlayerList.remove(player); } - @EventHandler - public void onPlayerDeath(PlayerDeathEvent event) { + public static String initializeDeathMessage(Player player, EliteEntity eliteEntity) { - if (isDeadPlayer(event.getEntity())) { - event.setDeathMessage(deadPlayerList.get(event.getEntity())); - removeDeadPlayer(event.getEntity()); - } + String deathMessage = ""; - } + if (eliteEntity instanceof CustomBossEntity customBossEntity && customBossEntity.getCustomBossesConfigFields().getOnKillMessage() != null && !customBossEntity.getCustomBossesConfigFields().getOnKillMessage().isEmpty()) + return deathMessageSender(customBossEntity.getCustomBossesConfigFields().getOnKillMessage().replace("$player", player.getDisplayName()), player, customBossEntity.getLivingEntity()); - public static String intializeDeathMessage(Player player, LivingEntity livingEntity) { - - String deathMessage; - - /* - Deal with players dying from Elite Mobs - */ - - switch (livingEntity.getType()) { - - case BLAZE: - deathMessage = deathMessageSender(MobCombatSettingsConfig.BLAZE_DEATH_MESSAGE, player, livingEntity); - break; - case CREEPER: - deathMessage = deathMessageSender(MobCombatSettingsConfig.CREEPER_DEATH_MESSAGE, player, livingEntity); - break; - case ENDERMAN: - deathMessage = deathMessageSender(MobCombatSettingsConfig.ENDERMAN_DEATH_MESSAGE, player, livingEntity); - break; - case ENDERMITE: - deathMessage = deathMessageSender(MobCombatSettingsConfig.ENDERMITE_DEATH_MESSAGE, player, livingEntity); - break; - case IRON_GOLEM: - deathMessage = deathMessageSender(MobCombatSettingsConfig.IRONGOLEM_DEATH_MESSAGE, player, livingEntity); - break; - case POLAR_BEAR: - deathMessage = deathMessageSender(MobCombatSettingsConfig.POLARBEAR_DEATH_MESSAGE, player, livingEntity); - break; - case SILVERFISH: - deathMessage = deathMessageSender(MobCombatSettingsConfig.SILVERFISH_DEATH_MESSAGE, player, livingEntity); - break; - case SKELETON: - deathMessage = deathMessageSender(MobCombatSettingsConfig.SKELETON_DEATH_MESSAGE, player, livingEntity); - break; - case SPIDER: - deathMessage = deathMessageSender(MobCombatSettingsConfig.SPIDER_DEATH_MESSAGE, player, livingEntity); - break; - case WITCH: - deathMessage = deathMessageSender(MobCombatSettingsConfig.WITCH_DEATH_MESSAGE, player, livingEntity); - break; - case ZOMBIE: - deathMessage = deathMessageSender(MobCombatSettingsConfig.ZOMBIE_DEATH_MESSAGE, player, livingEntity); - break; - case HUSK: - deathMessage = deathMessageSender(MobCombatSettingsConfig.HUSK_DEATH_MESSAGE, player, livingEntity); - break; - case PIG_ZOMBIE: - deathMessage = deathMessageSender(MobCombatSettingsConfig.ZOMBIE_PIGMAN_DEATH_MESSAGE, player, livingEntity); - break; - case STRAY: - deathMessage = deathMessageSender(MobCombatSettingsConfig.STRAY_DEATH_MESSAGE, player, livingEntity); - break; - case WITHER_SKELETON: - deathMessage = deathMessageSender(MobCombatSettingsConfig.WITHER_SKELETON_DEATH_MESSAGE, player, livingEntity); - break; - default: - deathMessage = deathMessageSender(MobCombatSettingsConfig.DEFAULT_DEATH_MESSAGE, player, livingEntity); - break; - } + if (MobPropertiesConfig.getMobProperties().containsKey(eliteEntity.getLivingEntity().getType())) + deathMessage = deathMessageSender + (MobPropertiesConfig.getMobProperties().get(eliteEntity.getLivingEntity().getType()).getDeathMessages() + .get(ThreadLocalRandom.current().nextInt(MobPropertiesConfig.getMobProperties().get(eliteEntity.getLivingEntity().getType()).getDeathMessages().size())) + , player, eliteEntity.getLivingEntity()); return deathMessage; } - private static String deathMessageSender(String configNode, Player player, LivingEntity livingEntity) { + private static String deathMessageSender(String deathMessage, Player player, LivingEntity livingEntity) { - String deathMessage = ConfigValues.mobCombatSettingsConfig.getString(configNode); deathMessage = deathMessagePlaceholderConversion(deathMessage, player, livingEntity); - return deathMessage; } @@ -132,10 +61,21 @@ private static String deathMessagePlaceholderConversion(String deathMessage, Pla deathMessage = deathMessage.replace("$player", player.getDisplayName()); deathMessage = deathMessage.replace("$entity", livingEntityName); - deathMessage = ChatColorConverter.convert(deathMessage); + deathMessage = ChatColorConverter.convert("&7" + deathMessage); return deathMessage; } + @EventHandler + public void onPlayerDeath(PlayerDeathEvent event) { + + if (isDeadPlayer(event.getEntity())) { + event.setDeathMessage(deadPlayerList.get(event.getEntity())); + PlayerStatsTracker.registerPlayerDeath(event.getEntity()); + removeDeadPlayer(event.getEntity()); + } + + } + } diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PlayerQuitCleanup.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PlayerQuitCleanup.java new file mode 100644 index 000000000..3a88714f5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PlayerQuitCleanup.java @@ -0,0 +1,14 @@ +package com.magmaguy.elitemobs.collateralminecraftchanges; + +import com.magmaguy.elitemobs.powers.scripts.ScriptAction; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; + +public class PlayerQuitCleanup implements Listener { + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) { + if (ScriptAction.getInvulnerablePlayers().contains(event.getPlayer())) + event.getPlayer().setInvulnerable(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PreventCreeperPassiveEntityDamage.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PreventCreeperPassiveEntityDamage.java deleted file mode 100644 index 1141263bf..000000000 --- a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PreventCreeperPassiveEntityDamage.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.collateralminecraftchanges; - -import com.magmaguy.elitemobs.mobconstructor.mobdata.passivemobs.SuperMobProperties; -import org.bukkit.entity.*; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageEvent; - -/** - * Created by MagmaGuy on 22/04/2017. - */ -public class PreventCreeperPassiveEntityDamage implements Listener { - - //This cancels all creeper and entity-caused explosion damage on passive mobs - @EventHandler - public void superCreeperCollateralDamageAvoider(EntityDamageEvent event) { - - if (event.getCause() == EntityDamageEvent.DamageCause.ENTITY_EXPLOSION) { - - if (SuperMobProperties.isValidSuperMobType(event.getEntityType()) || - event.getEntity() instanceof Horse || event.getEntity() instanceof Villager || - event.getEntity() instanceof Bat || event.getEntity() instanceof ArmorStand || - event.getEntity() instanceof Rabbit) { - - event.setDamage(0); - - } - - } - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PreventDarkroomExploit.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PreventDarkroomExploit.java deleted file mode 100644 index 650b6182f..000000000 --- a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PreventDarkroomExploit.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.magmaguy.elitemobs.collateralminecraftchanges; - -import com.magmaguy.elitemobs.EntityTracker; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.util.Vector; - -public class PreventDarkroomExploit implements Listener { - - @EventHandler - public void onDamage(EntityDamageEvent event) { - - if (!EntityTracker.isNaturalEntity(event.getEntity())) return; - - int livingEntityCount = 1; - for (Entity entity : event.getEntity().getNearbyEntities(1, 1, 1)) - if (entity instanceof LivingEntity) - livingEntityCount++; - - - if (livingEntityCount < 2) return; - - Location entityLocation = event.getEntity().getLocation().getBlock().getLocation().add(0.5, 0, 0.5); - - Block block1 = entityLocation.clone().add(new Vector(0, 0, 1)).getBlock(); - Block block2 = entityLocation.clone().add(new Vector(0, 0, -1)).getBlock(); - Block block3 = entityLocation.clone().add(new Vector(0, 1, 1)).getBlock(); - Block block4 = entityLocation.clone().add(new Vector(0, 1, -1)).getBlock(); - Block block5 = entityLocation.clone().add(new Vector(1, 0, 0)).getBlock(); - Block block6 = entityLocation.clone().add(new Vector(-1, 0, 0)).getBlock(); - Block block7 = entityLocation.clone().add(new Vector(1, 1, 0)).getBlock(); - Block block8 = entityLocation.clone().add(new Vector(-1, 1, 0)).getBlock(); - - if (!block3.getType().equals(Material.AIR) && !block4.getType().equals(Material.AIR) && - !block7.getType().equals(Material.AIR) && !block8.getType().equals(Material.AIR)) { - EntityTracker.unregisterNaturalEntity((LivingEntity) event.getEntity()); - Bukkit.getLogger().warning("Running"); - AntiExploitMessage.sendWarning((LivingEntity) event.getEntity()); - return; - } - - int airCount = 0; - - if (block1.getType().equals(Material.AIR)) - airCount++; - if (block2.getType().equals(Material.AIR)) - airCount++; - if (block3.getType().equals(Material.AIR)) - airCount++; - if (block4.getType().equals(Material.AIR)) - airCount++; - if (block5.getType().equals(Material.AIR)) - airCount++; - if (block6.getType().equals(Material.AIR)) - airCount++; - if (block7.getType().equals(Material.AIR)) - airCount++; - if (block8.getType().equals(Material.AIR)) - airCount++; - - if (airCount >= 4) return; - - EntityTracker.unregisterNaturalEntity((LivingEntity) event.getEntity()); - AntiExploitMessage.sendWarning((LivingEntity) event.getEntity()); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PreventEliteBeeHiveEnter.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PreventEliteBeeHiveEnter.java new file mode 100644 index 000000000..1f257b4f5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PreventEliteBeeHiveEnter.java @@ -0,0 +1,14 @@ +package com.magmaguy.elitemobs.collateralminecraftchanges; + +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityEnterBlockEvent; + +public class PreventEliteBeeHiveEnter implements Listener { + @EventHandler + public void onBeeEnterHive(EntityEnterBlockEvent event) { + if (EntityTracker.isEliteMob(event.getEntity())) + event.setCancelled(true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PreventEliteEquipmentDrop.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PreventEliteEquipmentDrop.java new file mode 100644 index 000000000..51f15d398 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PreventEliteEquipmentDrop.java @@ -0,0 +1,24 @@ +package com.magmaguy.elitemobs.collateralminecraftchanges; + +import com.magmaguy.elitemobs.api.EliteMobDeathEvent; +import org.bukkit.Material; +import org.bukkit.entity.Mob; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; + +public class PreventEliteEquipmentDrop implements Listener { + + @EventHandler(priority = EventPriority.HIGHEST) + public void onEliteDeath(EliteMobDeathEvent event) { + if (event.getEntityDeathEvent() == null) return; + if (!(event.getEntity() instanceof Mob)) return; + if (((Mob) event.getEntity()).getEquipment() == null) return; + for (ItemStack drop : event.getEntityDeathEvent().getDrops()) + for (ItemStack equipment : ((Mob) event.getEntity()).getEquipment().getArmorContents()) + if (drop != null && drop.equals(equipment)) + drop.setType(Material.AIR); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PreventEliteSilverfishBlockEnter.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PreventEliteSilverfishBlockEnter.java new file mode 100644 index 000000000..ef8b4f30c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PreventEliteSilverfishBlockEnter.java @@ -0,0 +1,14 @@ +package com.magmaguy.elitemobs.collateralminecraftchanges; + +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityChangeBlockEvent; + +public class PreventEliteSilverfishBlockEnter implements Listener { + @EventHandler + public void onSilverfishBlockEnter(EntityChangeBlockEvent event) { + if (EntityTracker.isEliteMob(event.getEntity())) + event.setCancelled(true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PreventItemPickupByMobs.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PreventItemPickupByMobs.java new file mode 100644 index 000000000..0b22b12c9 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PreventItemPickupByMobs.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.collateralminecraftchanges; + +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityPickupItemEvent; + +public class PreventItemPickupByMobs implements Listener { + + @EventHandler + public void onItemPickup(EntityPickupItemEvent event) { + if (EntityTracker.isEliteMob(event.getEntity())) + event.setCancelled(true); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PreventMountExploit.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PreventMountExploit.java deleted file mode 100644 index d5c2a5d11..000000000 --- a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PreventMountExploit.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.magmaguy.elitemobs.collateralminecraftchanges; - -import com.magmaguy.elitemobs.EntityTracker; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.spigotmc.event.entity.EntityMountEvent; - -public class PreventMountExploit implements Listener { - - @EventHandler - public void mountEvent(EntityMountEvent event) { - - if (EntityTracker.isEliteMob(event.getEntity())) event.setCancelled(true); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PreventTowerExploit.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PreventTowerExploit.java deleted file mode 100644 index 2fa68dd35..000000000 --- a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PreventTowerExploit.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.magmaguy.elitemobs.collateralminecraftchanges; - -import com.magmaguy.elitemobs.EntityTracker; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; -import org.bukkit.entity.Projectile; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.util.Vector; - -public class PreventTowerExploit implements Listener { - - @EventHandler - public void onHit(EntityDamageByEntityEvent event) { - - if (!(event instanceof LivingEntity)) return; - LivingEntity livingEntity = (LivingEntity) event.getEntity(); - if (!EntityTracker.isNaturalEntity(livingEntity)) return; - if (!(event.getDamager() instanceof Projectile && - ((Projectile) event.getDamager()).getShooter() instanceof Player || - event.getDamager() instanceof Player)) - return; - - Location mobLocation = event.getEntity().getLocation().add(new Vector(0.5, 0, 0.5)); - Location playerLocation; - if (event.getDamager() instanceof Player) - playerLocation = event.getDamager().getLocation(); - else - playerLocation = ((Player) ((Projectile) event.getDamager()).getShooter()).getLocation().getBlock().getLocation().add(new Vector(0.5, 0, 0.5)); - - if (playerLocation.getY() - mobLocation.getY() < 2) return; - - Block block1 = playerLocation.clone().add(new Vector(0, -1, 1)).getBlock(); - Block block2 = playerLocation.clone().add(new Vector(0, -1, -1)).getBlock(); - Block block3 = playerLocation.clone().add(new Vector(0, -2, 1)).getBlock(); - Block block4 = playerLocation.clone().add(new Vector(0, -2, -1)).getBlock(); - Block block5 = playerLocation.clone().add(new Vector(1, -1, 0)).getBlock(); - Block block6 = playerLocation.clone().add(new Vector(-1, -1, 0)).getBlock(); - Block block7 = playerLocation.clone().add(new Vector(1, -2, 0)).getBlock(); - Block block8 = playerLocation.clone().add(new Vector(-1, -2, 0)).getBlock(); - - if (!(block1.getType().equals(Material.AIR) && block2.getType().equals(Material.AIR) && - block3.getType().equals(Material.AIR) && block4.getType().equals(Material.AIR) && - block5.getType().equals(Material.AIR) && block6.getType().equals(Material.AIR) && - block7.getType().equals(Material.AIR) && block8.getType().equals(Material.AIR))) - return; - - EntityTracker.unregisterNaturalEntity(livingEntity); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PreventUpgradeDiamondToNetherite.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PreventUpgradeDiamondToNetherite.java new file mode 100644 index 000000000..3de63fa7d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/PreventUpgradeDiamondToNetherite.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.collateralminecraftchanges; + +import com.magmaguy.elitemobs.items.ItemTagger; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.PrepareSmithingEvent; + +public class PreventUpgradeDiamondToNetherite implements Listener { + @EventHandler + public void UpgradeItemEvent(PrepareSmithingEvent event) { + if (!ItemTagger.isEliteItem(event.getInventory().getItem(0)) && + !ItemTagger.isEliteItem(event.getInventory().getItem(1))) + return; + if (event.getInventory().getItem(0) != null && + event.getInventory().getItem(0).getType().equals(Material.NETHERITE_UPGRADE_SMITHING_TEMPLATE)) + event.setResult(ItemStackGenerator.generateItemStack(Material.AIR)); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/VanillaReinforcementsCanceller.java b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/VanillaReinforcementsCanceller.java new file mode 100644 index 000000000..94d0125ac --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/collateralminecraftchanges/VanillaReinforcementsCanceller.java @@ -0,0 +1,18 @@ +package com.magmaguy.elitemobs.collateralminecraftchanges; + +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.CreatureSpawnEvent; + +public class VanillaReinforcementsCanceller implements Listener { + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onSpawn(CreatureSpawnEvent event) { + if (!event.getSpawnReason().equals(CreatureSpawnEvent.SpawnReason.REINFORCEMENTS)) return; + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(event.getEntity()); + if (eliteEntity == null) return; + event.setCancelled(true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/combatsystem/CombatSystem.java b/src/main/java/com/magmaguy/elitemobs/combatsystem/CombatSystem.java new file mode 100644 index 000000000..16fe8fbe2 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/combatsystem/CombatSystem.java @@ -0,0 +1,66 @@ +package com.magmaguy.elitemobs.combatsystem; + +import org.bukkit.Material; + +public class CombatSystem { + public static final double PER_LEVEL_POWER_INCREASE = 0.5; + /** + * This determines how many hits it takes to kill a boss. + * Unfortunately, since it's flat, at a scale, all bosses tend to end up having the same amount of life. + * It accomplishes this by adding this flat amount of health to bosses. + *

+ * Minus one because bosses start with 7 hp in the normalized combat system. They always have some baseline hp. + */ + public static final double TARGET_HITS_TO_KILL_MINUS_ONE = 3D; //affects max health assignment on EliteMobEntity.java + //this sets the tier of various materials + public static final int NETHERITE_TIER_LEVEL = 8; + public static final int DIAMOND_TIER_LEVEL = 7; + public static final int IRON_TIER_LEVEL = 6; + public static final int STONE_CHAIN_TIER_LEVEL = 5; + public static final int GOLD_WOOD_LEATHER_TIER_LEVEL = 3; + + //DPS increase per tier + public static final double DPS_PER_LEVEL = 1.6; + + + private CombatSystem() { + } + + public static int getMaterialTier(Material material) { + switch (material) { + case DIAMOND_BOOTS: + case DIAMOND_CHESTPLATE: + case DIAMOND_HELMET: + case DIAMOND_LEGGINGS: + return DIAMOND_TIER_LEVEL; + case IRON_BOOTS: + case IRON_CHESTPLATE: + case IRON_HELMET: + case IRON_LEGGINGS: + return IRON_TIER_LEVEL; + case CHAINMAIL_BOOTS: + case CHAINMAIL_CHESTPLATE: + case CHAINMAIL_HELMET: + case CHAINMAIL_LEGGINGS: + return STONE_CHAIN_TIER_LEVEL; + case GOLDEN_BOOTS: + case GOLDEN_CHESTPLATE: + case GOLDEN_HELMET: + case GOLDEN_LEGGINGS: + case LEATHER_BOOTS: + case LEATHER_CHESTPLATE: + case LEATHER_HELMET: + case LEATHER_LEGGINGS: + case TURTLE_HELMET: + return GOLD_WOOD_LEATHER_TIER_LEVEL; + default: + if (material.equals(Material.NETHERITE_HELMET) || + material.equals(Material.NETHERITE_CHESTPLATE) || + material.equals(Material.NETHERITE_LEGGINGS) || + material.equals(Material.NETHERITE_BOOTS)) + return CombatSystem.NETHERITE_TIER_LEVEL; + } + return 0; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/combatsystem/EliteMobDamagedByEliteMobHandler.java b/src/main/java/com/magmaguy/elitemobs/combatsystem/EliteMobDamagedByEliteMobHandler.java new file mode 100644 index 000000000..11bc31e52 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/combatsystem/EliteMobDamagedByEliteMobHandler.java @@ -0,0 +1,29 @@ +package com.magmaguy.elitemobs.combatsystem; + +import com.magmaguy.elitemobs.api.EliteMobDamagedByEliteMobEvent; +import org.bukkit.entity.EntityType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; + +public class EliteMobDamagedByEliteMobHandler implements Listener { + + @EventHandler(ignoreCancelled = true) + public void onIronGolemDamage(EliteMobDamagedByEliteMobEvent event) { + + if (event.getDamager().getLivingEntity() == null || event.getDamagee().getLivingEntity() == null) return; + + if (!(event.getDamager().getLivingEntity().getType().equals(EntityType.IRON_GOLEM) || + event.getDamagee().getLivingEntity().getType().equals(EntityType.IRON_GOLEM))) return; + + double damage = event.getEntityDamageByEntityEvent().getDamage() * event.getDamager().getLevel() * CombatSystem.PER_LEVEL_POWER_INCREASE; + + for (EntityDamageEvent.DamageModifier modifier : EntityDamageEvent.DamageModifier.values()) + if (event.getEntityDamageByEntityEvent().isApplicable(modifier)) + event.getEntityDamageByEntityEvent().setDamage(modifier, 0); + + event.getEntityDamageByEntityEvent().setDamage(damage); + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/combatsystem/EliteMobGenericDamagedHandler.java b/src/main/java/com/magmaguy/elitemobs/combatsystem/EliteMobGenericDamagedHandler.java new file mode 100644 index 000000000..4ea1be964 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/combatsystem/EliteMobGenericDamagedHandler.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.combatsystem; + +import com.magmaguy.elitemobs.api.EliteMobDamagedEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; + +public class EliteMobGenericDamagedHandler implements Listener { + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void eliteMobDamagedGeneric(EliteMobDamagedEvent event) { + if (event.getEntityDamageEvent().getCause().equals(EntityDamageEvent.DamageCause.ENTITY_ATTACK)) return; + if (!event.getEntityDamageEvent().getCause().equals(EntityDamageEvent.DamageCause.CUSTOM)) + event.getEntityDamageEvent().setDamage(EntityDamageEvent.DamageModifier.BASE, event.getEntityDamageEvent().getDamage()); + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/combatsystem/EliteProjectile.java b/src/main/java/com/magmaguy/elitemobs/combatsystem/EliteProjectile.java new file mode 100644 index 000000000..8401ac810 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/combatsystem/EliteProjectile.java @@ -0,0 +1,63 @@ +package com.magmaguy.elitemobs.combatsystem; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import org.bukkit.Location; +import org.bukkit.NamespacedKey; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.persistence.PersistentDataType; +import org.bukkit.projectiles.ProjectileSource; +import org.bukkit.util.Vector; + +public class EliteProjectile { + private EliteProjectile() { + } + + public static Projectile create(EntityType entityType, Entity shooter, Entity victim, Vector shotVector, boolean gravity) { + Location projectileLocation = generateLocation(shooter, victim); + Projectile projectile = (Projectile) projectileLocation.getWorld().spawnEntity(projectileLocation, entityType); + projectile.setShooter((ProjectileSource) shooter); + projectile.setVelocity(shotVector); + projectile.setGravity(gravity); + projectile.setPersistent(false); + EntityTracker.registerProjectileEntity(projectile); + return projectile; + } + + public static Projectile create(EntityType entityType, Entity shooter, Player victim, boolean gravity) { + Vector targetterToTargetted = victim.getEyeLocation().clone().subtract(victim.getLocation()).toVector().normalize().multiply(2); + return create(entityType, shooter, victim, targetterToTargetted, gravity); + } + + public static Projectile create(EntityType entityType, Entity shooter, Vector targetterToTargetted, boolean gravity) { + Location projectileLocation = generateLocation(shooter, targetterToTargetted); + Projectile projectile = (Projectile) projectileLocation.getWorld().spawnEntity(projectileLocation, entityType); + projectile.setShooter((ProjectileSource) shooter); + projectile.setVelocity(targetterToTargetted); + projectile.setGravity(gravity); + projectile.setPersistent(false); + EntityTracker.registerProjectileEntity(projectile); + return projectile; + } + + private static Location generateLocation(Entity shooter, Entity victim) { + Vector vector = victim.getLocation().clone().subtract(shooter.getLocation().clone()).toVector().normalize(); + return shooter.getLocation().clone().add(0, 1, 0).add(vector).setDirection(vector); + } + + private static Location generateLocation(Entity shooter, Vector targetterToTargetted) { + return shooter.getLocation().clone().add(targetterToTargetted).setDirection(targetterToTargetted).add(new Vector(0, 1, 0)); + } + + public static void signExplosiveWithPower(Projectile projectile, String powerName) { + projectile.getPersistentDataContainer().set(new NamespacedKey(MetadataHandler.PLUGIN, "detonationPower"), PersistentDataType.STRING, powerName); + } + + public static String readExplosivePower(Projectile projectile) { + return projectile.getPersistentDataContainer().get(new NamespacedKey(MetadataHandler.PLUGIN, "detonationPower"), PersistentDataType.STRING); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/combatsystem/antiexploit/AmbientDamageExploit.java b/src/main/java/com/magmaguy/elitemobs/combatsystem/antiexploit/AmbientDamageExploit.java new file mode 100644 index 000000000..05cd00243 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/combatsystem/antiexploit/AmbientDamageExploit.java @@ -0,0 +1,28 @@ +package com.magmaguy.elitemobs.combatsystem.antiexploit; + +import com.magmaguy.elitemobs.api.GenericAntiExploitEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; + +public class AmbientDamageExploit implements Listener { + + @EventHandler(ignoreCancelled = true) + public void onDamage(GenericAntiExploitEvent event) { + if (!event.getEliteMobEntity().getLivingEntity().hasAI()) return; + if (!(event.getEntityDamageEvent().getCause().equals(EntityDamageEvent.DamageCause.HOT_FLOOR) || + event.getEntityDamageEvent().getCause().equals(EntityDamageEvent.DamageCause.CRAMMING) || + event.getEntityDamageEvent().getCause().equals(EntityDamageEvent.DamageCause.DROWNING) || + event.getEntityDamageEvent().getCause().equals(EntityDamageEvent.DamageCause.FALL) || + event.getEntityDamageEvent().getCause().equals(EntityDamageEvent.DamageCause.SUFFOCATION) || + event.getEntityDamageEvent().getCause().equals(EntityDamageEvent.DamageCause.CONTACT) || + event.getEntityDamageEvent().getCause().equals(EntityDamageEvent.DamageCause.LAVA) || + event.getEntityDamageEvent().getCause().equals(EntityDamageEvent.DamageCause.DRYOUT))) + return; + + event.getEliteMobEntity().incrementAntiExploit(1, "ambientdamageexploit"); + event.setTriggered(true); + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/combatsystem/antiexploit/AntiExploitMessage.java b/src/main/java/com/magmaguy/elitemobs/combatsystem/antiexploit/AntiExploitMessage.java new file mode 100644 index 000000000..8f0a01908 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/combatsystem/antiexploit/AntiExploitMessage.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.combatsystem.antiexploit; + +import com.magmaguy.elitemobs.config.AntiExploitConfig; +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; + + +public class AntiExploitMessage { + + private AntiExploitMessage() { + } + + public static void sendWarning(LivingEntity livingEntity, String code) { + for (Entity entity : livingEntity.getNearbyEntities(15, 15, 15)) + if (entity instanceof Player player) { + if (!player.isOp()) + player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(AntiExploitConfig.getAntiExploitMessage())); + else + player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(AntiExploitConfig.getAntiExploitMessage() + " OP-only:" + code)); + } + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/combatsystem/antiexploit/EliteMobDamagedByPlayerAntiExploitListener.java b/src/main/java/com/magmaguy/elitemobs/combatsystem/antiexploit/EliteMobDamagedByPlayerAntiExploitListener.java new file mode 100644 index 000000000..db8d3365a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/combatsystem/antiexploit/EliteMobDamagedByPlayerAntiExploitListener.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.combatsystem.antiexploit; + +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerAntiExploitEvent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; + +public class EliteMobDamagedByPlayerAntiExploitListener implements Listener { + @EventHandler(priority = EventPriority.MONITOR) + public void onDamage(EliteMobDamagedByPlayerAntiExploitEvent event) { + if (event.isTriggered()) return; + event.getEliteMobEntity().decrementAntiExploit(1); + event.getEliteMobEntity().setInAntiExploitCooldown(); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/combatsystem/antiexploit/HoneyBlockJumpExploit.java b/src/main/java/com/magmaguy/elitemobs/combatsystem/antiexploit/HoneyBlockJumpExploit.java new file mode 100644 index 000000000..51ee70bd9 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/combatsystem/antiexploit/HoneyBlockJumpExploit.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.combatsystem.antiexploit; + +import com.magmaguy.elitemobs.api.GenericAntiExploitEvent; +import com.magmaguy.elitemobs.config.AntiExploitConfig; +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class HoneyBlockJumpExploit implements Listener { + + @EventHandler + public void onDamage(GenericAntiExploitEvent event) { + if (!AntiExploitConfig.isHoneyBlockExploit()) return; + if (event.ground == null) return; + if (!event.ground.equals(Material.HONEY_BLOCK)) return; + event.getEliteMobEntity().incrementAntiExploit(5, "honeyexploit"); + event.setTriggered(true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/combatsystem/antiexploit/PreventDarkroomExploit.java b/src/main/java/com/magmaguy/elitemobs/combatsystem/antiexploit/PreventDarkroomExploit.java new file mode 100644 index 000000000..a96ec515e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/combatsystem/antiexploit/PreventDarkroomExploit.java @@ -0,0 +1,55 @@ +package com.magmaguy.elitemobs.combatsystem.antiexploit; + +import com.magmaguy.elitemobs.api.GenericAntiExploitEvent; +import com.magmaguy.elitemobs.config.AntiExploitConfig; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class PreventDarkroomExploit implements Listener { + + @EventHandler + public void onDamage(GenericAntiExploitEvent event) { + + if (event.isCancelled()) return; + + //gets blocks at 1 height completely surrounding the entity + if (AntiExploitConfig.isDarkroomAntiExploit1() && !event.block021.isPassable() && + !event.block120.isPassable() && + !event.block122.isPassable() && + !event.block221.isPassable()) { + event.getEliteMobEntity().incrementAntiExploit(4, "darkroom coffin ring"); + return; + } + + //gets blocks at 0 height plus if there's a block on top + if (AntiExploitConfig.isDarkroomAntiExploit2() && + (!event.block011.isPassable() || !event.block021.isPassable()) && + (!event.block110.isPassable() || !event.block120.isPassable()) && + (!event.block112.isPassable() || !event.block122.isPassable()) && + (!event.block211.isPassable() || !event.block221.isPassable()) && + !event.ceilingMaterial.isPassable()) { + event.getEliteMobEntity().incrementAntiExploit(4, "darkroom mine"); + return; + } + + if (AntiExploitConfig.isDarkroomAntiExploit3()) + darkRoomAntiExploit3(event); + + } + + private void darkRoomAntiExploit3(GenericAntiExploitEvent event) { + int wallCount = 0; + if (!event.block011.isPassable() && !event.block021.isPassable()) + wallCount++; + if (!event.block110.isPassable() && !event.block120.isPassable()) + wallCount++; + if (!event.block112.isPassable() && !event.block122.isPassable()) + wallCount++; + if (!event.block211.isPassable() && !event.block221.isPassable()) + wallCount++; + + if (wallCount >= 3) + event.getEliteMobEntity().incrementAntiExploit(4, "darkroom walls"); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/combatsystem/antiexploit/PreventEndermanHeightExploit.java b/src/main/java/com/magmaguy/elitemobs/combatsystem/antiexploit/PreventEndermanHeightExploit.java new file mode 100644 index 000000000..ca0565139 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/combatsystem/antiexploit/PreventEndermanHeightExploit.java @@ -0,0 +1,32 @@ +package com.magmaguy.elitemobs.combatsystem.antiexploit; + +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerAntiExploitEvent; +import com.magmaguy.elitemobs.config.AntiExploitConfig; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.EntityType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.util.Vector; + +public class PreventEndermanHeightExploit implements Listener { + + @EventHandler(priority = EventPriority.HIGHEST) + public void onDamage(EliteMobDamagedByPlayerAntiExploitEvent event) { + if (!AntiExploitConfig.isEndermanHeightAntiExploit()) return; + if (!event.getEntity().getType().equals(EntityType.ENDERMAN)) return; + + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(event.getEntity()); + if (eliteEntity == null) return; + + Block block = event.getEliteMobDamagedByPlayerEvent().getPlayer().getLocation().getBlock().getLocation().add(new Vector(0, 2, 0)).getBlock(); + if (block.getType().equals(Material.AIR) || block.getType().equals(Material.WATER)) return; + + eliteEntity.incrementAntiExploit(9, "enderman height"); + event.setTriggered(true); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/combatsystem/antiexploit/PreventLargeDarkroomExploit.java b/src/main/java/com/magmaguy/elitemobs/combatsystem/antiexploit/PreventLargeDarkroomExploit.java new file mode 100644 index 000000000..c6f537c58 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/combatsystem/antiexploit/PreventLargeDarkroomExploit.java @@ -0,0 +1,28 @@ +package com.magmaguy.elitemobs.combatsystem.antiexploit; + +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerAntiExploitEvent; +import com.magmaguy.elitemobs.config.AntiExploitConfig; +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.util.Vector; + +public class PreventLargeDarkroomExploit implements Listener { + + @EventHandler(priority = EventPriority.HIGHEST) + public void onEntityDamage(EliteMobDamagedByPlayerAntiExploitEvent event) { + if (event.isCancelled()) return; + if (event.getEliteMobEntity().getLivingEntity() == null) return; + antiHopper(event); + } + + private void antiHopper(EliteMobDamagedByPlayerAntiExploitEvent event) { + if (!AntiExploitConfig.isLargeDarkroomAntiExploit1()) return; + if (event.getEliteMobEntity().getLivingEntity().getLocation().getBlock().getLocation().clone().subtract(new Vector(0, 1, 0)).getBlock().getType().equals(Material.HOPPER)) { + event.getEliteMobEntity().incrementAntiExploit(5, "largeRoomAntiExploit1"); + event.setTriggered(true); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/combatsystem/antiexploit/PreventMountExploit.java b/src/main/java/com/magmaguy/elitemobs/combatsystem/antiexploit/PreventMountExploit.java new file mode 100644 index 000000000..741ba3d44 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/combatsystem/antiexploit/PreventMountExploit.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.combatsystem.antiexploit; + +import com.magmaguy.elitemobs.config.AntiExploitConfig; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityMountEvent; + +public class PreventMountExploit implements Listener { + + public static boolean bypass = false; + + @EventHandler + public void mountEvent(EntityMountEvent event) { + if (bypass) { + bypass = false; + return; + } + if (!AntiExploitConfig.isMountAntiExploit()) return; + if (EntityTracker.isEliteMob(event.getEntity())) event.setCancelled(true); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/combatsystem/antiexploit/PreventPathfindingExploit.java b/src/main/java/com/magmaguy/elitemobs/combatsystem/antiexploit/PreventPathfindingExploit.java new file mode 100644 index 000000000..a1e9652a4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/combatsystem/antiexploit/PreventPathfindingExploit.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.combatsystem.antiexploit; + +import com.magmaguy.easyminecraftgoals.NMSManager; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerAntiExploitEvent; +import com.magmaguy.elitemobs.dungeons.EliteMobsWorld; +import org.bukkit.entity.Mob; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class PreventPathfindingExploit implements Listener { + @EventHandler + public void OnEliteDamagedbyPlayerEvent(EliteMobDamagedByPlayerAntiExploitEvent event) { + if (event.isCancelled()) return; + if (event.getEliteMobEntity().getLivingEntity() == null) return; + if (!NMSManager.isEnabled()) return; + //Only mobs pathfind + if (!(event.getEliteMobEntity().getLivingEntity() instanceof Mob)) return; + if (NMSManager.getAdapter().canReach(event.getEliteMobEntity().getLivingEntity(), event.getEliteMobDamagedByPlayerEvent().getPlayer().getLocation())) + return; + if (EliteMobsWorld.isEliteMobsWorld(event.getEntity().getWorld().getUID())) return; + event.getEliteMobEntity().incrementAntiExploit(5, "no path to player"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/combatsystem/combattag/CombatTag.java b/src/main/java/com/magmaguy/elitemobs/combatsystem/combattag/CombatTag.java new file mode 100644 index 000000000..adedaeaea --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/combatsystem/combattag/CombatTag.java @@ -0,0 +1,66 @@ +package com.magmaguy.elitemobs.combatsystem.combattag; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.CombatTagConfig; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.GameMode; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scheduler.BukkitRunnable; + +public class CombatTag implements Listener { + + private static Player playerFinder(EntityDamageByEntityEvent event) { + + if (event.getDamager() instanceof Player && EntityTracker.isEliteMob(event.getEntity())) + return (Player) event.getDamager(); + if (event.getEntity() instanceof Player && (EntityTracker.isEliteMob(event.getEntity()) || + event.getDamager() instanceof Projectile && ((Projectile) event.getDamager()).getShooter() instanceof LivingEntity && + EntityTracker.isEliteMob(((LivingEntity) ((Projectile) event.getDamager()).getShooter())))) + return (Player) event.getEntity(); + if (event.getDamager() instanceof Projectile && ((Projectile) event.getDamager()).getShooter() instanceof Player && + EntityTracker.isEliteMob(event.getEntity())) + return (Player) ((Projectile) event.getDamager()).getShooter(); + + return null; + + } + + @EventHandler(ignoreCancelled = true) + public void onDamage(EntityDamageByEntityEvent event) { + + Player player = playerFinder(event); + + if (player == null) return; + + if (player.getGameMode().equals(GameMode.CREATIVE)) return; + + //if (player.isInvulnerable()) player.setInvulnerable(false); + if (player.isFlying()) { + player.setFlying(false); + player.spigot().sendMessage(ChatMessageType.ACTION_BAR, + TextComponent.fromLegacyText(CombatTagConfig.getCombatTagMessage())); + player.addPotionEffect(new PotionEffect(PotionEffectType.SLOW_FALLING, 20 * 60, 0)); + new BukkitRunnable() { + @Override + public void run() { + if (!player.isOnline() || player.isDead()) + cancel(); + if (player.isOnGround()) { + cancel(); + player.removePotionEffect(PotionEffectType.SLOWNESS); + } + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/combatsystem/displays/HealthDisplay.java b/src/main/java/com/magmaguy/elitemobs/combatsystem/displays/HealthDisplay.java new file mode 100644 index 000000000..ccb8bb35f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/combatsystem/displays/HealthDisplay.java @@ -0,0 +1,38 @@ +package com.magmaguy.elitemobs.combatsystem.displays; + +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; +import com.magmaguy.elitemobs.utils.DialogArmorStand; +import org.bukkit.ChatColor; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; + +public class HealthDisplay implements Listener { + + /* + Color progression: Dark green - Green - Red - Dark red + */ + private static ChatColor setHealthColor(int currentHealth, int maxHealth) { + if (maxHealth <= 0) return ChatColor.WHITE; + double healthPercentage = currentHealth * 100 / (double) maxHealth; + if (healthPercentage > 75) + return ChatColor.DARK_GREEN; + if (healthPercentage > 50) + return ChatColor.GREEN; + if (healthPercentage > 25) + return ChatColor.RED; + if (healthPercentage > 0) + return ChatColor.DARK_RED; + return ChatColor.DARK_RED; + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onHit(EliteMobDamagedByPlayerEvent event) { + if (!MobCombatSettingsConfig.isDisplayHealthOnHit()) return; + int maxHealth = (int) event.getEliteMobEntity().getMaxHealth(); + int currentHealth = (int) (event.getEliteMobEntity().getHealth() - event.getDamage()); + DialogArmorStand.createDialogArmorStand(event.getEliteMobEntity().getLivingEntity(), setHealthColor(currentHealth, maxHealth) + "" + currentHealth + "/" + maxHealth); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/combatsystem/displays/PopupDisplay.java b/src/main/java/com/magmaguy/elitemobs/combatsystem/displays/PopupDisplay.java new file mode 100644 index 000000000..2426f38f3 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/combatsystem/displays/PopupDisplay.java @@ -0,0 +1,159 @@ +package com.magmaguy.elitemobs.combatsystem.displays; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.api.EliteMobHealEvent; +import com.magmaguy.elitemobs.api.internal.RemovalReason; +import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; +import com.magmaguy.elitemobs.config.enchantments.premade.CriticalStrikesConfig; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.items.customenchantments.CriticalStrikesEnchantment; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.utils.DialogArmorStand; +import com.magmaguy.elitemobs.utils.VisualDisplay; +import com.magmaguy.magmacore.util.Round; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Player; +import org.bukkit.entity.TextDisplay; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.EulerAngle; +import org.bukkit.util.Vector; + +import java.util.concurrent.ThreadLocalRandom; + +public class PopupDisplay implements Listener { + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onHit(EliteMobDamagedByPlayerEvent event) { + if (!MobCombatSettingsConfig.isDisplayDamageOnHit()) return; + + Location mobLocation = event.getEliteMobEntity().getLocation(); + + Vector offset = new Vector(ThreadLocalRandom.current().nextDouble(-2, 2), 0, ThreadLocalRandom.current().nextDouble(-2, 2)); + + String colorPrefix = ""; + if (event.getDamageModifier() < 1) { + //resist + colorPrefix += MobCombatSettingsConfig.getResistTextColor(); + DialogArmorStand.createDialogArmorStand(event.getEliteMobEntity().getUnsyncedLivingEntity(), + MobCombatSettingsConfig.getResistText(), offset.clone().subtract(new Vector(0, 0.2, 0))); + mobLocation.getWorld().playSound(mobLocation, Sound.BLOCK_ANVIL_USE, 1f, 1f); + if (MobCombatSettingsConfig.isDoResistEffect()) + resistArmorStandCreator(event.getEliteMobEntity(), event.getPlayer(), Material.SHIELD); + } else if (event.getDamageModifier() > 1) { + //weak + colorPrefix += MobCombatSettingsConfig.getWeakTextColor(); + DialogArmorStand.createDialogArmorStand(event.getEliteMobEntity().getUnsyncedLivingEntity(), + MobCombatSettingsConfig.getWeakText(), offset.clone().subtract(new Vector(0, 0.2, 0))); + mobLocation.getWorld().playSound(mobLocation, Sound.ENTITY_ITEM_BREAK, 1f, 1f); + if (MobCombatSettingsConfig.isDoWeakEffect()) + weakArmorStandCreator(event.getEliteMobEntity(), event.getPlayer(), Material.DIAMOND_SWORD); + } + if (event.isCriticalStrike()) { + //crit + colorPrefix += CriticalStrikesConfig.getCriticalHitColor(); + CriticalStrikesEnchantment.criticalStrikePopupMessage(event.getEliteMobEntity().getUnsyncedLivingEntity(), new Vector(0, 0.2, 0)); + } + + DialogArmorStand.createDialogArmorStand(event.getEliteMobEntity().getUnsyncedLivingEntity(), ChatColor.RED + + colorPrefix + ChatColor.BOLD + Round.twoDecimalPlaces(event.getDamage()), offset); + + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onHit(EliteMobHealEvent event) { + if (!MobCombatSettingsConfig.isDisplayDamageOnHit()) return; + if (!event.getEliteEntity().isValid()) return; + + Vector offset = new Vector(ThreadLocalRandom.current().nextDouble(-1, 1), 0, ThreadLocalRandom.current().nextDouble(-1, 1)); + + if (event.isFullHeal()) { + DialogArmorStand.createDialogArmorStand(event.getEliteEntity().getUnsyncedLivingEntity(), + MobCombatSettingsConfig.getFullHealMessage(), offset.clone().subtract(new Vector(0, 0.2, 0))); + } else { + DialogArmorStand.createDialogArmorStand(event.getEliteEntity().getUnsyncedLivingEntity(), + ChatColor.GREEN + "" + event.getHealAmount() + " HP HEAL!", offset.clone().subtract(new Vector(0, 0.2, 0))); + } + + } + + private void resistArmorStandCreator(EliteEntity eliteEntity, Player player, Material material) { + if (!eliteEntity.isValid() || !player.isValid() || !eliteEntity.getLocation().getWorld().equals(player.getWorld())) + return; + + ArmorStand armorStand = VisualDisplay.generateTemporaryArmorStand(getResistLocation(player, eliteEntity), "Resist"); + armorStand.getEquipment().setItemInMainHand(new ItemStack(material)); + armorStand.addEquipmentLock(EquipmentSlot.HAND, ArmorStand.LockType.REMOVING_OR_CHANGING); + armorStand.setRightArmPose(new EulerAngle(Math.PI / 2d, Math.PI + Math.PI / 2d, Math.PI)); + + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + if (counter > 20 || !eliteEntity.isValid() || !player.isValid() || !eliteEntity.getLocation().getWorld().equals(player.getWorld())) { + EntityTracker.unregister(armorStand, RemovalReason.EFFECT_TIMEOUT); + cancel(); + return; + } + try { + armorStand.teleport(getResistLocation(player, eliteEntity)); + } catch (Exception e) { + //Sometimes, very rarely, x is not finite. Doesn't really matter. + } + counter++; + } + }.runTaskTimer(MetadataHandler.PLUGIN, 1, 1); + } + + private Location getResistLocation(Player player, EliteEntity eliteEntity) { + Vector armorsStandVector = player.getLocation().subtract(eliteEntity.getLocation()).toVector().normalize().multiply(1.5); + Location armorStandLocation = eliteEntity.getLocation().add(armorsStandVector); + armorStandLocation.setDirection(armorsStandVector); + return armorStandLocation; + } + + private void weakArmorStandCreator(EliteEntity eliteEntity, Player player, Material material) { + if (!eliteEntity.isValid() || !player.isValid() || !eliteEntity.getLocation().getWorld().equals(player.getWorld())) + return; + + TextDisplay[] textDisplays = new TextDisplay[2]; + textDisplays[0] = generateWeakArmorStand(player, eliteEntity, material, -1); + textDisplays[1] = generateWeakArmorStand(player, eliteEntity, material, 1); + + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + if (counter > 10 || !eliteEntity.isValid() || !player.isValid() || !eliteEntity.getLocation().getWorld().equals(player.getWorld())) { + EntityTracker.unregister(textDisplays[0], RemovalReason.EFFECT_TIMEOUT); + EntityTracker.unregister(textDisplays[1], RemovalReason.EFFECT_TIMEOUT); + cancel(); + return; + } + for (TextDisplay armorStand : textDisplays) + armorStand.teleport(armorStand.getLocation().add(eliteEntity.getLocation().add(new Vector(0, 0, 0)) + .subtract(armorStand.getLocation()).toVector().normalize().multiply(.4))); + counter++; + } + }.runTaskTimer(MetadataHandler.PLUGIN, 1, 1); + } + + private TextDisplay generateWeakArmorStand(Player player, EliteEntity eliteEntity, Material material, int offset) { + Vector armorsStandVector = player.getLocation().clone().add(new Vector(0, 2, 0)).subtract(eliteEntity.getLocation()).toVector().normalize().multiply(3.0).rotateAroundY(Math.PI / 8 * offset); + Location armorStandLocation = eliteEntity.getLocation().add(armorsStandVector); + armorStandLocation.setDirection(armorsStandVector.multiply(-1)); + return VisualDisplay.generateTemporaryTextDisplay(armorStandLocation, "Weak"); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/combattag/CombatTag.java b/src/main/java/com/magmaguy/elitemobs/combattag/CombatTag.java deleted file mode 100644 index a1efa636d..000000000 --- a/src/main/java/com/magmaguy/elitemobs/combattag/CombatTag.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.magmaguy.elitemobs.combattag; - -import com.magmaguy.elitemobs.ChatColorConverter; -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.CombatTagConfig; -import com.magmaguy.elitemobs.config.ConfigValues; -import net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.chat.TextComponent; -import org.bukkit.GameMode; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; -import org.bukkit.entity.Projectile; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.scheduler.BukkitRunnable; - -public class CombatTag implements Listener { - - @EventHandler - public void onDamage(EntityDamageByEntityEvent event) { - - Player player = playerFinder(event); - - if (player == null) return; - - if (player.getGameMode().equals(GameMode.CREATIVE)) return; - - if (player.isInvulnerable()) player.setInvulnerable(false); - if (player.isFlying()) { - player.setFlying(false); - player.spigot().sendMessage(ChatMessageType.ACTION_BAR, - TextComponent.fromLegacyText(ChatColorConverter.convert(ConfigValues.combatTagConfig.getString(CombatTagConfig.COMBAT_TAG_MESSAGE)))); - new BukkitRunnable() { - @Override - public void run() { - //TODO: introduce the featherfall potion effect for versions above 1.12.2 -// if (NameHandler.currentVersionIsUnder(13, 0)) { - if (!player.isOnline() || player.isDead()) - cancel(); - if (player.isOnGround()) { - player.setFallDistance(0F); - cancel(); - } -// } else { -////TODO: introduce the featherfall potion effect for versions above 1.12.2 -// if (!player.isOnline() || player.isDead()) -// player.removePotionEffect(PotionEffectType.SLOW); -// cancel(); -// if (player.isOnGround()) { -// player.setFallDistance(0F); -// cancel(); -// } -// -// } - } - }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); - } - } - - private static Player playerFinder(EntityDamageByEntityEvent event) { - - if (event.getDamager() instanceof Player && EntityTracker.isEliteMob(event.getEntity())) - return (Player) event.getDamager(); - if (event.getEntity() instanceof Player && (EntityTracker.isEliteMob(event.getEntity()) || - event.getDamager() instanceof Projectile && ((Projectile) event.getDamager()).getShooter() instanceof LivingEntity && - EntityTracker.isEliteMob(((LivingEntity) ((Projectile) event.getDamager()).getShooter())))) - return (Player) event.getEntity(); - if (event.getDamager() instanceof Projectile && ((Projectile) event.getDamager()).getShooter() instanceof Player && - EntityTracker.isEliteMob(event.getEntity())) - return (Player) ((Projectile) event.getDamager()).getShooter(); - - return null; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/AdventurersGuildArgCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/AdventurersGuildArgCommand.java new file mode 100644 index 000000000..5ecc8de73 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/AdventurersGuildArgCommand.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.List; + +public class AdventurersGuildArgCommand extends AdvancedCommand { + public AdventurersGuildArgCommand() { + super(List.of("ag", "adventurersguild")); + setUsage("/em adventurersguild"); + setPermission("elitemobs.adventurersguild.command"); + setSenderType(SenderType.PLAYER); + setDescription("Teleports players to the Adventurer's Guild Hub or opens the Adventurer's Guild menu."); + } + + @Override + public void execute(CommandData commandData) { + com.magmaguy.elitemobs.commands.guild.AdventurersGuildCommand.adventurersGuildCommand(commandData.getPlayerSender()); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/AdventurersGuildCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/AdventurersGuildCommand.java new file mode 100644 index 000000000..1c6f75897 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/AdventurersGuildCommand.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.ArrayList; + +public class AdventurersGuildCommand extends AdvancedCommand { + public AdventurersGuildCommand() { + super(new ArrayList<>()); + setUsage("/em adventurersguild"); + setPermission("elitemobs.adventurersguild.command"); + setSenderType(SenderType.PLAYER); + setDescription("Teleports players to the Adventurer's Guild Hub or opens the Adventurer's Guild menu."); + } + + @Override + public void execute(CommandData commandData) { + com.magmaguy.elitemobs.commands.guild.AdventurersGuildCommand.adventurersGuildCommand(commandData.getPlayerSender()); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/AltCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/AltCommand.java new file mode 100644 index 000000000..4a6f18b00 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/AltCommand.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; +import com.magmaguy.magmacore.util.Logger; + +import java.util.List; + +public class AltCommand extends AdvancedCommand { + public AltCommand() { + super(List.of("alt")); + setUsage("/em alt"); + setDescription("Changes the style of the /em menu."); + setPermission("elitemobs.alt"); + setSenderType(SenderType.PLAYER); + } + + @Override + public void execute(CommandData commandData) { + PlayerData.setUseBookMenus(commandData.getPlayerSender(), !PlayerData.getUseBookMenus(commandData.getPlayerSender().getUniqueId())); + Logger.sendMessage(commandData.getCommandSender(), DefaultConfig.getSwitchEMStyleMessage()); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/ArenaCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/ArenaCommand.java new file mode 100644 index 000000000..9c97bb5ab --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/ArenaCommand.java @@ -0,0 +1,25 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.menus.ArenaMenu; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.ArrayList; +import java.util.List; + +public class ArenaCommand extends AdvancedCommand { + public ArenaCommand() { + super(List.of("arena")); + addArgument("arenaID", new ArrayList<>()); + setUsage("/em arena "); + setPermission("elitemobs.arena.start"); + setDescription("Open the Arena menu."); + setSenderType(SenderType.PLAYER); + } + + @Override + public void execute(CommandData commandData) { + new ArenaMenu().constructArenaMenu(commandData.getPlayerSender(), commandData.getStringArgument("arenaID")); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/CheckMaxItemTierCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/CheckMaxItemTierCommand.java deleted file mode 100644 index faa16eb9b..000000000 --- a/src/main/java/com/magmaguy/elitemobs/commands/CheckMaxItemTierCommand.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.magmaguy.elitemobs.commands; - -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.ItemsDropSettingsConfig; -import com.magmaguy.elitemobs.config.ItemsProceduralSettingsConfig; -import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; -import org.bukkit.command.CommandSender; - -public class CheckMaxItemTierCommand { - - public static void checkMaxItemTier(CommandSender commandSender) { - - commandSender.sendMessage("The current maximum item tier is tier " + ConfigValues.itemsDropSettingsConfig.getString(ItemsDropSettingsConfig.MAXIMUM_LOOT_TIER)); - commandSender.sendMessage("The current maximum power enchantment is " + ConfigValues.itemsProceduralSettingsConfig.getString(ItemsProceduralSettingsConfig.ARROW_DAMAGE_MAX_LEVEL)); - commandSender.sendMessage("The current maximum sharpness enchantment is " + ConfigValues.itemsProceduralSettingsConfig.getString(ItemsProceduralSettingsConfig.DAMAGE_ALL_MAX_LEVEL)); - commandSender.sendMessage("The current maximum protection enchantment is " + ConfigValues.itemsProceduralSettingsConfig.getString(ItemsProceduralSettingsConfig.PROTECTION_ENVIRONMENTAL_MAX_LEVEL)); - commandSender.sendMessage("The current maximum natural mob level is " + ConfigValues.mobCombatSettingsConfig.getString(MobCombatSettingsConfig.NATURAL_ELITEMOB_LEVEL_CAP)); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/CheckTierCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/CheckTierCommand.java deleted file mode 100644 index 18a6ca642..000000000 --- a/src/main/java/com/magmaguy/elitemobs/commands/CheckTierCommand.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.magmaguy.elitemobs.commands; - -import com.magmaguy.elitemobs.adventurersguild.GuildRank; -import com.magmaguy.elitemobs.items.ItemTierFinder; -import org.bukkit.entity.Player; - -public class CheckTierCommand { - - public static void checkTier(Player player) { - - double gearTier = ItemTierFinder.findPlayerTier(player); - double guildTier = (GuildRank.getGuildRank(player.getUniqueId()) - 10) * 0.2; - - player.sendMessage("Your combat tier is " + gearTier); - player.sendMessage("Your guild tier bonus is " + guildTier); - player.sendMessage("Your threat tier is " + (gearTier + guildTier)); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/CommandHandler.java b/src/main/java/com/magmaguy/elitemobs/commands/CommandHandler.java index 941813756..dfe83b9f2 100644 --- a/src/main/java/com/magmaguy/elitemobs/commands/CommandHandler.java +++ b/src/main/java/com/magmaguy/elitemobs/commands/CommandHandler.java @@ -1,349 +1,106 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package com.magmaguy.elitemobs.commands; import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.adventurersguild.AdventurersGuildGUI; -import com.magmaguy.elitemobs.commands.shops.CustomShopHandler; -import com.magmaguy.elitemobs.commands.shops.ShopHandler; -import com.magmaguy.elitemobs.config.AdventurersGuildConfig; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.DefaultConfig; -import org.bukkit.Bukkit; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; - -/** - * Created by MagmaGuy on 21/01/2017. - */ - -public class CommandHandler implements CommandExecutor { - - private final static String STATS = "elitemobs.stats"; - private final static String GETLOOT = "elitemobs.getloot"; - private final static String SIMLOOT = "elitemobs.simloot"; - public final static String RELOAD_CONFIGS = "elitemobs.reload"; - private final static String RELOAD_LOOT = "elitemobs.reload.loot"; - private final static String GIVELOOT = "elitemobs.giveloot"; - private final static String SPAWNMOB = "elitemobs.spawnmob"; - private final static String SPAWN_BOSS_MOB = "elitemobs.spawnbossmob"; - public final static String KILLALL_AGGRESSIVEELITES = "elitemobs.killall.aggressiveelites"; - public final static String KILLALL_PASSIVEELITES = "elitemobs.killall.passiveelites"; - public final static String KILLALL_SPECIFICENTITY = "elitemobs.killall.specificentity"; - private final static String SHOP = "elitemobs.shop"; - private final static String CUSTOMSHOP = "elitemobs.customshop"; - private final static String CURRENCY_PAY = "elitemobs.currency.pay"; - private final static String CURRENCY_ADD = "elitemobs.currency.add"; - private final static String CURRENCY_SUBTRACT = "elitemobs.currency.subtract"; - private final static String CURRENCY_SET = "elitemobs.currency.set"; - private final static String CURRENCY_CHECK = "elitemobs.currency.check"; - private final static String CURRENCY_WALLET = "elitemobs.currency.wallet"; - private final static String CURRENCY_COINTOP = "elitemobs.currency.cointop"; - private final static String VERSION = "elitemobs.version"; - public final static String EVENT_LAUNCH_SMALLTREASUREGOBLIN = "elitemobs.events.smalltreasuregoblin"; - public final static String EVENT_LAUNCH_DEADMOON = "elitemobs.events.smalltreasuregoblin"; - private final static String CHECK_TIER = "elitemobs.checktier"; - private final static String SET_MAX_TIER = "elitemobs.config.setmaxtier"; - private final static String GET_TIER = "elitemobs.gettier"; - private final static String CHECK_MAX_TIER = "elitemobs.checkmaxtier"; - private final static String ADVENTURERS_GUILD = "elitemobs.adventurersguild"; - - @Override - public boolean onCommand(CommandSender commandSender, Command command, String label, String[] args) { - - switch (label) { - case "ag": - case "adventurersguild": - case "adventurerguild": - if (userPermCheck(ADVENTURERS_GUILD, commandSender) && ConfigValues.adventurersGuildConfig.getBoolean(AdventurersGuildConfig.ENABLE_ADVENTURERS_GUILD)) - AdventurersGuildGUI.mainMenu((Player) commandSender); - return true; - } - - if (args.length == 0) { - validCommands(commandSender); - return true; - } - - args[0] = args[0].toLowerCase(); - - switch (args[0]) { - case "spawn": - case "spawnmob": - if (permCheck(SPAWNMOB, commandSender)) - SpawnMobCommandHandler.spawnMob(commandSender, args); - return true; - case "ag": - case "adventurersguild": - case "adventurerguild": - if (userPermCheck(ADVENTURERS_GUILD, commandSender)) - AdventurersGuildGUI.mainMenu((Player) commandSender); - return true; - case "stats": - if (permCheck(STATS, commandSender)) - StatsCommandHandler.statsHandler(commandSender); - return true; - case "getloot": - case "gl": - if (userPermCheck(GETLOOT, commandSender) && args.length == 1) { - LootGUI lootGUI = new LootGUI(); - lootGUI.lootGUI((Player) commandSender); - } else { - if (GetLootCommandHandler.getLoot(((Player) commandSender), args[1])) - return true; - else - ((Player) commandSender).sendTitle("", "Could not find that item name."); - } - return true; - case "shop": - case "store": - if (userPermCheck(SHOP, commandSender)) { - ShopHandler shopHandler = new ShopHandler(); - shopHandler.initializeShop((Player) commandSender); - } - return true; - case "customshop": - case "cshop": - case "customstore": - case "cstore": - if (userPermCheck(CUSTOMSHOP, commandSender)) { - CustomShopHandler customShopHandler = new CustomShopHandler(); - customShopHandler.initializeShop((Player) commandSender); - } - return true; - case "wallet": - case "bal": - case "balance": - case "currency": - case "money": - case "$": - if (userPermCheck(CURRENCY_WALLET, commandSender)) - CurrencyCommandsHandler.walletCommand(commandSender, args); - return true; - case "cointop": - case "baltop": - case "cashtop": - case "currencytop": - case "$top": - if (userPermCheck(CURRENCY_COINTOP, commandSender)) - CurrencyCommandsHandler.coinTop(commandSender); - return true; - case "version": - if (permCheck(VERSION, commandSender)) - VersionHandler.versionCommand(commandSender, args); - return true; - case "checktier": - case "tiercheck": - case "tier": - if (permCheck(CHECK_TIER, commandSender)) - CheckTierCommand.checkTier(((Player) commandSender)); - return true; - case "checkmaxtier": - case "maxtier": - if (permCheck(CHECK_MAX_TIER, commandSender)) - CheckMaxItemTierCommand.checkMaxItemTier(commandSender); - return true; - case "reload": - case "restart": - if (permCheck(RELOAD_CONFIGS, commandSender)) - ReloadHandler.reloadCommand(commandSender, args); - return true; - case "killall": - case "kill": - KillHandler.killCommand(commandSender, args); - return true; - case "simloot": - case "simulateloot": - case "simdrop": - case "simulatedrop": - if (userPermCheck(SIMLOOT, commandSender)) - SimLootHandler.simLoot((Player) commandSender, Integer.parseInt(args[1])); - return true; - case "check": - case "checkcurrency": - case "checkbal": - case "checkbalance": - case "check$": - if (permCheck(CURRENCY_CHECK, commandSender)) - CurrencyCommandsHandler.checkCommand(commandSender, args); - return true; - case "event": - case "launchevent": - case "startevent": - case "triggerevent": - TriggerEventHandler.triggerEventCommand(commandSender, args); - return true; - case "spawnbossmob": - case "spawnboss": - if (userPermCheck(SPAWNMOB, commandSender)) - SpawnMobCommandHandler.spawnBossMob((Player) commandSender, args); - return true; - case "gettier": - case "spawntier": - if (userPermCheck(GET_TIER, commandSender)) - TierSetSpawner.spawnTierItem(Integer.parseInt(args[1]), (Player) commandSender); - return true; - case "setmaxtier": - if (permCheck(SET_MAX_TIER, commandSender)) - SetMaxItemTierCommand.setMaxItemTier(Double.parseDouble(args[1]), commandSender); - return true; - case "giveloot": - if (permCheck(GIVELOOT, commandSender)) - GiveLootHandler.giveLootCommand(commandSender, args); - return true; - case "pay": - if (userPermCheck(CURRENCY_PAY, commandSender)) - CurrencyCommandsHandler.payCommand((Player) commandSender, args); - return true; - case "add": - if (permCheck(CURRENCY_ADD, commandSender)) - CurrencyCommandsHandler.addCommand(commandSender, args); - return true; - case ("subtract"): - if (permCheck(CURRENCY_SUBTRACT, commandSender)) - CurrencyCommandsHandler.subtractCommand(commandSender, args); - return true; - case ("set"): - if (permCheck(CURRENCY_SET, commandSender)) - CurrencyCommandsHandler.setCommand(commandSender, args); - return true; - default: - validCommands(commandSender); - return true; - - } - - } - - public static boolean permCheck(String permission, CommandSender commandSender) { - - if (commandSender.hasPermission(permission)) return true; - - if (commandSender instanceof Player && - Bukkit.getPluginManager().getPlugin(MetadataHandler.ELITE_MOBS).getConfig().getBoolean(DefaultConfig.ENABLE_PERMISSION_TITLES)) { - - Player player = (Player) commandSender; - - player.sendTitle("I'm afraid I can't let you do that, " + player.getDisplayName() + ".", - "You need the following permission: " + permission); - - } else { - - commandSender.sendMessage("[EliteMobs] You may not run this command."); - commandSender.sendMessage("[EliteMobs] You don't have the permission " + permission); - - } - - return false; +import com.magmaguy.magmacore.command.CommandManager; +public class CommandHandler { + private static CommandManager emCommand; + private static CommandManager adventurersGuildCommand; + private CommandHandler() { } - public static boolean userPermCheck(String permission, CommandSender commandSender) { - - if (commandSender instanceof Player) { - - return permCheck(permission, commandSender); - - } - - commandSender.sendMessage("[EliteMobs] You may not run this command."); - commandSender.sendMessage("[EliteMobs] This is a user command."); - return false; - + public static void registerCommands() { + emCommand = new CommandManager(MetadataHandler.PLUGIN, "elitemobs"); + + //Admin commands + emCommand.registerCommand(new SetupCommand()); + emCommand.registerCommand(new SetupDoneCommand()); + emCommand.registerCommand(new SetupToggleCommand()); + emCommand.registerCommand(new SpawnBossCommand()); + emCommand.registerCommand(new SpawnBossLevelCommand()); + emCommand.registerCommand(new SpawnBossAtCommand()); + emCommand.registerCommand(new SpawnBossLevelAtCommand()); + emCommand.registerCommand(new PlaceBossCommand()); + emCommand.registerCommand(new PlaceTreasureChestCommand()); + emCommand.registerCommand(new PlaceNPCCommand()); + emCommand.registerCommand(new RemoveCommand()); + emCommand.registerCommand(new DebugCommand()); + emCommand.registerCommand(new EventCommand()); + emCommand.registerCommand(new StatsCommand()); + emCommand.registerCommand(new LootMenuCommand()); + emCommand.registerCommand(new LootGiveCommand()); + emCommand.registerCommand(new LootRandomCommand()); + emCommand.registerCommand(new LootSimulateMultipleCommand()); + emCommand.registerCommand(new LootSimulateCommand()); + emCommand.registerCommand(new VersionCommand()); + emCommand.registerCommand(new ReloadCommand()); + emCommand.registerCommand(new KillCommand()); + emCommand.registerCommand(new KillRadiusCommand()); + emCommand.registerCommand(new KillTypeCommand()); + emCommand.registerCommand(new KillTypeRadiusCommand()); + emCommand.registerCommand(new LootDebugCommand()); + emCommand.registerCommand(new MoneyAddCommand()); + emCommand.registerCommand(new MoneyAddAllCommand()); + emCommand.registerCommand(new MoneySetCommand()); + emCommand.registerCommand(new MoneyCheckPlayerCommand()); + emCommand.registerCommand(new UnbindForceCommand()); + emCommand.registerCommand(new FireballCommand()); + emCommand.registerCommand(new RespawnAllCommand()); + emCommand.registerCommand(new PackageDungeonCommand()); + emCommand.registerCommand(new LanguageCommand()); + emCommand.registerCommand(new PlaceWormholeCommand()); + emCommand.registerCommand(new LootStats()); + emCommand.registerCommand(new ShopProceduralOtherCommand()); + emCommand.registerCommand(new ShopCustomOtherCommand()); + emCommand.registerCommand(new ShopSellOtherCommand()); + emCommand.registerCommand(new QuestBypassCommand()); + emCommand.registerCommand(new QuestCompleteCommand()); + emCommand.registerCommand(new QuestCompleteQuestCommand()); + emCommand.registerCommand(new QuestResetCommand()); + emCommand.registerCommand(new QuestResetAllCommand()); + emCommand.registerCommand(new TransitiveBlocksCancelCommand()); + emCommand.registerCommand(new TransitiveBlocksRegisterCommand()); + emCommand.registerCommand(new TransitiveBlocksEditCommand()); + emCommand.registerCommand(new TransitiveBlocksRegisterAreaCommand()); + emCommand.registerCommand(new TransitiveBlocksEditAreaCommand()); + emCommand.registerCommand(new RankSetCommand()); + emCommand.registerCommand(new SpawnElite()); + emCommand.registerCommand(new SpawnEliteAtCommand()); + emCommand.registerCommand(new DiscordMessageCommand()); + emCommand.registerCommand(new DiscordCommand()); + emCommand.registerCommand(new MoneyRemoveCommand()); + emCommand.registerCommand(new ProtectionBypassCommand()); + + //User commands +// emCommand.registerCommand(new AdventurersGuildCommand()); + emCommand.registerCommand(new ShareItemCommand()); + emCommand.registerCommand(new ShopDynamicCommand()); + emCommand.registerCommand(new ShopCustomCommand()); + emCommand.registerCommand(new RepairCommand()); + emCommand.registerCommand(new EnchantCommand()); + emCommand.registerCommand(new ScrapCommand()); + emCommand.registerCommand(new UnbindCommand()); + emCommand.registerCommand(new MoneyCheckCommand()); + emCommand.registerCommand(new QuestAcceptCommand()); + emCommand.registerCommand(new QuestTrackCommand()); + emCommand.registerCommand(new QuestLeaveCommand()); + emCommand.registerCommand(new RankCommand()); + emCommand.registerCommand(new LootCommand()); + emCommand.registerCommand(new QuitCommand()); + emCommand.registerCommand(new StartCommand()); + emCommand.registerCommand(new ArenaCommand()); + emCommand.registerCommand(new DismissCommand()); + emCommand.registerCommand(new AltCommand()); + emCommand.registerCommand(new SpawnTeleportCommand()); + emCommand.registerCommand(new DungeonTeleportCommand()); + emCommand.registerCommand(new TrackBossCommand()); + emCommand.registerCommand(new PayCommand()); + emCommand.registerCommand(new AdventurersGuildArgCommand()); + + emCommand.registerCommand(new EliteMobsCommand()); + emCommand.registerCommand(new HelpCommand()); + + adventurersGuildCommand =new CommandManager(MetadataHandler.PLUGIN, "adventurersguild"); + adventurersGuildCommand.registerCommand(new AdventurersGuildCommand()); } - - private static void validCommands(CommandSender commandSender) { - - if (commandSender instanceof Player) { - - Player player = (Player) commandSender; - - player.sendMessage("[EliteMobs] Valid commands:"); - if (silentPermCheck(STATS, commandSender)) - player.sendMessage("/elitemobs stats"); - if (silentPermCheck(SHOP, commandSender)) - player.sendMessage("/elitemobs shop"); - if (silentPermCheck(CUSTOMSHOP, commandSender)) - player.sendMessage("/elitemobs customshop"); - if (silentPermCheck(CURRENCY_WALLET, commandSender)) - player.sendMessage("/elitemobs wallet"); - if (silentPermCheck(CURRENCY_COINTOP, commandSender)) - player.sendMessage("/elitemobs cointop"); - if (silentPermCheck(CURRENCY_PAY, commandSender)) - player.sendMessage("/elitemobs pay [username]"); - if (silentPermCheck(CURRENCY_ADD, commandSender)) - player.sendMessage("/elitemobs add [username]"); - if (silentPermCheck(CURRENCY_SUBTRACT, commandSender)) - player.sendMessage("/elitemobs subtract [username]"); - if (silentPermCheck(CURRENCY_SET, commandSender)) - player.sendMessage("/elitemobs set [username]"); - if (silentPermCheck(CURRENCY_CHECK, commandSender)) - player.sendMessage("/elitemobs check [username]"); - if (silentPermCheck(RELOAD_CONFIGS, commandSender)) - player.sendMessage("/elitemobs reload"); - if (silentPermCheck(KILLALL_AGGRESSIVEELITES, commandSender)) - player.sendMessage("/elitemobs kill aggressive"); - if (silentPermCheck(KILLALL_PASSIVEELITES, commandSender)) - player.sendMessage("/elitemobs kill passive"); - if (silentPermCheck(SIMLOOT, commandSender)) - player.sendMessage("/elitemobs simloot [mob level]"); - if (silentPermCheck(GETLOOT, commandSender)) - player.sendMessage("/elitemobs getloot [loot name (no loot name = AdventurersGuildGUI)]"); - if (silentPermCheck(GIVELOOT, commandSender)) - player.sendMessage("/elitemobs giveloot [player name] random/[loot_name_underscore_for_spaces]"); - if (silentPermCheck(SPAWNMOB, commandSender)) - player.sendMessage("/elitemobs SpawnMob [mobType] [mobLevel] [mobPower] [mobPower2(keep adding as many as you'd like)]"); - if (silentPermCheck(SPAWN_BOSS_MOB, commandSender)) - commandSender.sendMessage("/elitemobs spawnBossMob [bossName]"); - if (silentPermCheck(CHECK_TIER, commandSender)) - commandSender.sendMessage("/elitemobs checktier"); - if (silentPermCheck(CHECK_MAX_TIER, commandSender)) - commandSender.sendMessage("/elitemobs checkmaxtier"); - if (silentPermCheck(SET_MAX_TIER, commandSender)) - commandSender.sendMessage("/elitemobs setmaxtier [tier]"); - if (silentPermCheck(GET_TIER, commandSender)) - commandSender.sendMessage("/elitemobs gettier [tier]"); - - - } else if (commandSender instanceof ConsoleCommandSender) { - - commandSender.sendMessage("[EliteMobs] Command not recognized. Valid commands:"); - commandSender.sendMessage("elitemobs stats"); - commandSender.sendMessage("elitemobs reload"); - commandSender.sendMessage("elitemobs check [username]"); - commandSender.sendMessage("elitemobs set [username]"); - commandSender.sendMessage("elitemobs add [username]"); - commandSender.sendMessage("elitemobs subtract [username]"); - commandSender.sendMessage("elitemobs killall passiveelites"); - commandSender.sendMessage("elitemobs killall aggressiveelites"); - commandSender.sendMessage("elitemobs giveloot [player name] random/[loot_name_underscore_for_spaces]"); - commandSender.sendMessage("elitemobs SpawnMob [worldName] [x] [y] [z] [mobType] [mobLevel] [mobPower] [mobPower2(keep adding as many as you'd like)]"); - - } - - } - - private static boolean silentPermCheck(String permission, CommandSender commandSender) { - - return commandSender.hasPermission(permission); - - } - - } diff --git a/src/main/java/com/magmaguy/elitemobs/commands/CurrencyCommandsHandler.java b/src/main/java/com/magmaguy/elitemobs/commands/CurrencyCommandsHandler.java index 3dcb004a2..e11cdfd9e 100644 --- a/src/main/java/com/magmaguy/elitemobs/commands/CurrencyCommandsHandler.java +++ b/src/main/java/com/magmaguy/elitemobs/commands/CurrencyCommandsHandler.java @@ -1,229 +1,145 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package com.magmaguy.elitemobs.commands; -import com.magmaguy.elitemobs.config.ConfigValues; import com.magmaguy.elitemobs.config.EconomySettingsConfig; import com.magmaguy.elitemobs.economy.EconomyHandler; -import com.magmaguy.elitemobs.economy.UUIDFilter; -import com.magmaguy.elitemobs.playerdata.PlayerData; -import org.bukkit.ChatColor; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Round; +import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.util.ArrayList; -import java.util.UUID; - -import static org.bukkit.Bukkit.getServer; - /** * Created by MagmaGuy on 17/06/2017. */ public class CurrencyCommandsHandler { - public static void payCommand(String playerName, double amount) { - - if (amount > 0) - EconomyHandler.addCurrency(UUIDFilter.guessUUI(playerName), amount); - - - } - - public static void payCommand(Player commandSender, String[] args) { - - try { - - if (Double.parseDouble(args[2]) > 0 && Integer.parseInt(args[2]) <= EconomyHandler.checkCurrency(UUIDFilter.guessUUI(commandSender.getName()))) { - - payCommand(args[1], Integer.parseInt(args[2])); - subtractCommand(commandSender.getName(), Integer.parseInt(args[2])); - - commandSender.sendMessage("You have paisd " + args[2] + " " + ConfigValues.economyConfig.get("Currency name") + " to " + args[1]); - commandSender.sendMessage("You now have " + EconomyHandler.checkCurrency(UUIDFilter.guessUUI(commandSender.getName())) + " " + ConfigValues.economyConfig.get("Currency name")); - - Player recipient = getServer().getPlayer(args[1]); - recipient.sendMessage("You have received " + args[2] + " " + ConfigValues.economyConfig.get("Currency name") + " from " + commandSender.getDisplayName()); - - } else if (Double.parseDouble(args[2]) < 0) - commandSender.sendMessage("Nice try. This plugin doesn't make the same mistake as some banks have in the past."); - else - commandSender.sendMessage("You don't have enough " + ConfigValues.economyConfig.get("Currency name") + " to do that!"); - - - } catch (Exception e) { - - commandSender.sendMessage("Input not valid. Command format: /em pay [playerName] [amount]"); + public static void payCommand(Player sender, String recipientName, double amount) { + //CASE: Negative amount + if (amount <= 0) { + sender.sendMessage(ChatColorConverter.convert("&4[EliteMobs]Nice try.")); + return; } - } - - public static void addCommand(String playerName, double amount) { - - EconomyHandler.addCurrency(UUIDFilter.guessUUI(playerName), amount); - - } - - public static void addCommand(CommandSender commandSender, String[] args) { - - try { - - addCommand(args[1], Integer.parseInt(args[2])); - - commandSender.sendMessage("You have added " + args[2] + " to " + args[1]); - commandSender.sendMessage("They now have " + EconomyHandler.checkCurrency(UUIDFilter.guessUUI(commandSender.getName()))); - - } catch (Exception e) { - - commandSender.sendMessage("Input not valid. Command format: /em add [playerName] [amount]"); - + //CASE: Offline player + Player recipient = Bukkit.getPlayer(recipientName); + if (recipient == null) { + sender.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &4Player " + recipientName + " is not online and can therefore not get a payment.")); + return; } - } - - public static void subtractCommand(String playerName, double amount) { - - EconomyHandler.subtractCurrency(UUIDFilter.guessUUI(playerName), amount); - - } - - public static void subtractCommand(CommandSender commandSender, String[] args) { - - try { - - subtractCommand(args[1], Integer.parseInt(args[2])); - - commandSender.sendMessage("You have subtracted " + args[2] + " from " + args[1]); - commandSender.sendMessage("They now have " + EconomyHandler.checkCurrency(UUIDFilter.guessUUI(commandSender.getName()))); - - } catch (Exception e) { - - commandSender.sendMessage("Input not valid. Command format: /em subtract [playerName] [amount]"); - + //CASE: Insufficient funds + double senderCurrency = EconomyHandler.checkCurrency(sender.getUniqueId()); + if (senderCurrency - amount < 0) { + sender.sendMessage( + ChatColorConverter.convert( + EconomySettingsConfig.getEconomyPaymentInsufficientCurrency() + .replace("$currency_name", EconomySettingsConfig.getCurrencyName()))); + return; } - } - - public static void setCommand(String playerName, double amount) { - - EconomyHandler.setCurrency(UUIDFilter.guessUUI(playerName), amount); - - } - - public static void setCommand(CommandSender commandSender, String[] args) { - - try { - - CurrencyCommandsHandler.setCommand(args[1], Integer.parseInt(args[2])); - commandSender.sendMessage("You set " + args[1] + "'s " + ConfigValues.economyConfig.get("Currency name") + " to " + args[2]); - - } catch (Exception e) { - - commandSender.sendMessage("Input not valid. Command format: /em set [playerName] [amount]"); - - } + double actuallyReceivedAmount = Round.twoDecimalPlaces(amount - amount * EconomySettingsConfig.getPlayerToPlayerTaxes()); + double taxes = Round.twoDecimalPlaces(amount * EconomySettingsConfig.getPlayerToPlayerTaxes()); + + //CASE: Successful payment + EconomyHandler.addCurrency(recipient.getUniqueId(), actuallyReceivedAmount); + EconomyHandler.subtractCurrency(sender.getUniqueId(), amount); + + sender.sendMessage( + ChatColorConverter.convert( + EconomySettingsConfig.getEconomyPayMessage() + .replace("$amount_sent", amount + "") + .replace("$amount_received", actuallyReceivedAmount + "") + .replace("$taxes", taxes + "") + .replace("$currency_name", EconomySettingsConfig.getCurrencyName()) + .replace("$receiver", recipient.getDisplayName()))); + + sender.sendMessage( + ChatColorConverter.convert( + EconomySettingsConfig.getEconomyCurrencyLeftMessage() + .replace("$amount_left", String.valueOf(EconomyHandler.checkCurrency(sender.getUniqueId()))) + .replace("$currency_name", EconomySettingsConfig.getCurrencyName()))); + + recipient.sendMessage( + ChatColorConverter.convert( + EconomySettingsConfig.getEconomyPaymentReceivedMessage() + .replace("$amount_sent", amount + "") + .replace("$amount_received", actuallyReceivedAmount + "") + .replace("$taxes", taxes + "") + .replace("$sender", sender.getDisplayName()) + .replace("$currency_name", EconomySettingsConfig.getCurrencyName()))); + + recipient.sendMessage( + ChatColorConverter.convert( + EconomySettingsConfig.getEconomyCurrencyLeftMessage() + .replace("$amount_left", String.valueOf(EconomyHandler.checkCurrency(recipient.getUniqueId()))) + .replace("$currency_name", EconomySettingsConfig.getCurrencyName()))); } - public static Double checkCommand(String playerName) { - - return EconomyHandler.checkCurrency(UUIDFilter.guessUUI(playerName)); - + public static void addCommand(Player player, double amount) { + EconomyHandler.addCurrency(player.getUniqueId(), amount); } - public static void checkCommand(CommandSender commandSender, String[] args) { - - try { - Double money = CurrencyCommandsHandler.checkCommand(args[1]); - commandSender.sendMessage(args[1] + " has " + money + " " + ConfigValues.economyConfig.get("Currency name")); - } catch (Exception e) { - commandSender.sendMessage("Input not valid. Command format: /em check [playerName]"); + public static void addCommand(CommandSender commandSender, String onlinePlayer, double amount) { + Player player = Bukkit.getPlayer(onlinePlayer); + if (player == null) { + commandSender.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &4Player " + onlinePlayer + " &4is not valid!")); + return; } - + addCommand(player, amount); + commandSender.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &2You have added " + amount + " to " + onlinePlayer)); + commandSender.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &2They now have " + EconomyHandler.checkCurrency(player.getUniqueId()))); } - public static Double walletCommand(String playerName) { - - return EconomyHandler.checkCurrency(UUIDFilter.guessUUI(playerName)); - + public static void addAllCommand(CommandSender commandSender, double amount) { + for (Player player : Bukkit.getOnlinePlayers()) + addCommand(player, amount); + commandSender.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &2You have added " + amount + " to all online players.")); } - public static void walletCommand(CommandSender commandSender, String[] args) { - - commandSender.sendMessage(ChatColor.GREEN + "You have " + - CurrencyCommandsHandler.walletCommand(commandSender.getName()) + " " + - ConfigValues.economyConfig.getString("Currency name")); + public static void subtractCommand(String playerName, double amount) { + EconomyHandler.subtractCurrency(Bukkit.getPlayer(playerName).getUniqueId(), amount); } - public static void coinTop(CommandSender commandSender) { - - ArrayList arrayList = new ArrayList(); - - for (UUID uuid : PlayerData.playerCurrency.keySet()) { - - if (arrayList.size() == 0) { - - arrayList.add(uuid); - - } else { - - int index = arrayList.size(); - - for (UUID inArrayUUID : arrayList) { - - double arrayEntryValue = PlayerData.playerCurrency.get(inArrayUUID); - double newValue = PlayerData.playerCurrency.get(uuid); - - if (newValue > arrayEntryValue) { - - index = arrayList.indexOf(inArrayUUID); - break; - - } - - } - - arrayList.add(index, uuid); - - } - + public static void subtractCommand(CommandSender commandSender, String onlinePlayer, int amount) { + Player player = Bukkit.getPlayer(onlinePlayer); + if (player == null) { + commandSender.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &4Player " + onlinePlayer + " &4is not valid!")); + return; } + subtractCommand(onlinePlayer, amount); + commandSender.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &2You have subtracted " + amount + " from " + onlinePlayer)); + commandSender.sendMessage(ChatColorConverter.convert("&8[EliteMobs]They now have " + EconomyHandler.checkCurrency(player.getUniqueId()))); + } - commandSender.sendMessage(ChatColor.RED + "[EliteMobs] " + ChatColor.DARK_GREEN + ConfigValues.economyConfig.get(EconomySettingsConfig.CURRENCY_NAME) + " High Score:"); - - int iterationAmount = 10; - - if (arrayList.size() < 10) { - - iterationAmount = arrayList.size(); - + public static void setCommand(CommandSender commandSender, String onlinePlayer, double amount) { + Player player = Bukkit.getPlayer(onlinePlayer); + if (player == null) { + commandSender.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &4Player " + onlinePlayer + " &4is not valid!")); + return; } + EconomyHandler.setCurrency(player.getUniqueId(), amount); + commandSender.sendMessage("You set " + onlinePlayer + "'s " + EconomySettingsConfig.getCurrencyName() + " to " + amount); + } - for (int i = 0; i < iterationAmount; i++) { - - String name = PlayerData.playerDisplayName.get(arrayList.get(i)); - double amount = PlayerData.playerCurrency.get(arrayList.get(i)); - - int place = i + 1; - - commandSender.sendMessage(ChatColor.GREEN + "#" + place + " " + ChatColor.WHITE + name + " with " + - ChatColor.DARK_GREEN + amount + " " + ChatColor.GREEN + ConfigValues.economyConfig.get(EconomySettingsConfig.CURRENCY_NAME)); + public static void checkCommand(CommandSender commandSender, String playerName) { + Player player = Bukkit.getPlayer(playerName); + if (player == null) { + commandSender.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &4Player " + playerName + " &4is not valid!")); + return; } + double money = EconomyHandler.checkCurrency(player.getUniqueId()); + commandSender.sendMessage(ChatColorConverter.convert("&8[EliteMobs]&f " + playerName + " &2has " + money + " " + EconomySettingsConfig.getCurrencyName())); + } + public static void walletCommand(Player player) { + player.sendMessage( + ChatColorConverter.convert( + EconomySettingsConfig.getEconomyWalletCommand() + .replace("$balance", String.valueOf(EconomyHandler.checkCurrency(player.getUniqueId()))) + .replace("$currency_name", EconomySettingsConfig.getCurrencyName()))); } } diff --git a/src/main/java/com/magmaguy/elitemobs/commands/CustomBossCommandHandler.java b/src/main/java/com/magmaguy/elitemobs/commands/CustomBossCommandHandler.java new file mode 100644 index 000000000..71fbd2efb --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/CustomBossCommandHandler.java @@ -0,0 +1,56 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import com.magmaguy.elitemobs.mobconstructor.custombosses.RegionalBossEntity; +import com.magmaguy.elitemobs.utils.DebugBlockLocation; +import com.magmaguy.magmacore.util.ChatColorConverter; +import org.bukkit.Location; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.util.Vector; + +public class CustomBossCommandHandler { + private CustomBossCommandHandler() { + } + + public static Location autoSeekSafeSpawnLocation(Location originalLocation) { + Location newLocation = new Location(originalLocation.getWorld(), + originalLocation.getBlockX() + 0.5, + originalLocation.getBlockY() + 0.5, + originalLocation.getBlockZ() + 0.5); + for (int i = 0; i < 4; i++) + if (newLocation.add(new Vector(0, i, 0)).getBlock().isPassable()) { + new DebugBlockLocation(newLocation); + return newLocation; + } + return null; + } + + public static void addSpawnLocation(String customBossConfigFieldsString, Player player) { + CustomBossesConfigFields customBossesConfigFields = CustomBossesConfigFields.getRegionalElites().get(customBossConfigFieldsString); + if (customBossesConfigFields == null) + player.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &4Failed to add spawn location! Custom Boss " + customBossConfigFieldsString + " is not valid regional boss!")); + else { + Location safeSpawnLocation = autoSeekSafeSpawnLocation(player.getLocation()); + if (safeSpawnLocation == null) + player.sendMessage("[EliteMobs] No safe spawn location found! Make sure the area is passable!"); + else { + RegionalBossEntity.createPermanentRegionalBossEntity(customBossesConfigFields, safeSpawnLocation); + } + } + } + + public static void setLeashRadius(String customBossConfigFieldsString, CommandSender commandSender, int leashRadius) { + CustomBossesConfigFields customBossesConfigFields = CustomBossesConfigFields.getRegionalElites().get(customBossConfigFieldsString); + if (customBossesConfigFields == null) { + commandSender.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &4Failed set the leash radius! Was the boss a valid regional boss?")); + return; + } + customBossesConfigFields.runtimeSetLeashRadius(leashRadius); + for (RegionalBossEntity regionalBossEntity : RegionalBossEntity.getRegionalBossEntitySet()) + if (customBossesConfigFields.getFilename().equals(regionalBossEntity.getCustomBossesConfigFields().getFilename())) + regionalBossEntity.setLeashRadius(leashRadius); + } + + +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/DebugCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/DebugCommand.java new file mode 100644 index 000000000..34f06fa3b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/DebugCommand.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.commands.admin.DebugScreen; +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfig; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.ArrayList; +import java.util.List; + +public class DebugCommand extends AdvancedCommand { + public DebugCommand() { + super(List.of("debug")); + addArgument("filename", new ArrayList<>(CustomBossesConfig.getCustomBosses().keySet())); + setUsage("/em debug "); + setPermission("elitemobs.debug"); + setSenderType(SenderType.PLAYER); + setDescription("Debug bosses or players."); + } + + @Override + public void execute(CommandData commandData) { + DebugScreen.open(commandData.getPlayerSender(), commandData.getStringArgument("filename")); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/DiscordCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/DiscordCommand.java new file mode 100644 index 000000000..b06eb76f3 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/DiscordCommand.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.utils.DiscordLinks; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.util.Logger; + +import java.util.List; + +public class DiscordCommand extends AdvancedCommand { + public DiscordCommand() { + super(List.of("discord")); + setUsage("/em discord"); + setPermission("elitemobs.discord.link"); + setDescription("Links to the EliteMobs discord."); + } + + @Override + public void execute(CommandData commandData) { + Logger.sendMessage(commandData.getPlayerSender(), "&6Discord room for support & downloads: &9" + DiscordLinks.mainLink); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/DiscordMessageCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/DiscordMessageCommand.java new file mode 100644 index 000000000..64988902c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/DiscordMessageCommand.java @@ -0,0 +1,25 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.thirdparty.discordsrv.DiscordSRVAnnouncement; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.util.Logger; + +import java.util.ArrayList; +import java.util.List; + +public class DiscordMessageCommand extends AdvancedCommand { + public DiscordMessageCommand() { + super(List.of("discord")); + addArgument("message", new ArrayList<>()); + setUsage("/em discord "); + setPermission("elitemobs.discord.message"); + setDescription("Sends a message to the Discord via DiscordSRV, for debugging purposes"); + } + + @Override + public void execute(CommandData commandData) { + new DiscordSRVAnnouncement(commandData.getStringSequenceArgument("message")); + Logger.sendMessage(commandData.getCommandSender(), "&aAttempted to send a message to Discord!"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/DismissCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/DismissCommand.java new file mode 100644 index 000000000..bb1b02fd4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/DismissCommand.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.List; + +public class DismissCommand extends AdvancedCommand { + public DismissCommand() { + super(List.of("dismiss")); + setDescription("Dismisses /em menu message."); + setUsage("/em dismiss"); + setPermission("elitemobs.dismiss"); + setSenderType(SenderType.PLAYER); + } + + @Override + public void execute(CommandData commandData) { + PlayerData.setDismissEMStatusScreenMessage(commandData.getPlayerSender(), !PlayerData.getDismissEMStatusScreenMessage(commandData.getPlayerSender().getUniqueId())); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/DungeonCommands.java b/src/main/java/com/magmaguy/elitemobs/commands/DungeonCommands.java new file mode 100644 index 000000000..4cbe96b1c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/DungeonCommands.java @@ -0,0 +1,37 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.api.PlayerPreTeleportEvent; +import com.magmaguy.elitemobs.dungeons.EMPackage; +import com.magmaguy.elitemobs.dungeons.WorldInstancedDungeonPackage; +import com.magmaguy.elitemobs.instanced.MatchInstance; +import com.magmaguy.elitemobs.menus.InstancedDungeonBrowser; +import com.magmaguy.elitemobs.wormhole.Wormhole; +import org.bukkit.entity.Player; + +public class DungeonCommands { + public static void teleport(Player player, String minidungeonName) { + EMPackage emPackage = EMPackage.getEmPackages().get(minidungeonName); + if (emPackage == null) { + player.sendMessage("[EliteMobs] That dungeon isn't valid!"); + return; + } else if (!emPackage.isInstalled()) { + player.sendMessage("[EliteMobs] That dungeon isn't installed, ask an admin to install it!"); + return; + } + if (MatchInstance.getAnyPlayerInstance(player) != null) { + player.sendMessage("[EliteMobs] You're already in an instance! You will not be able to switch to another instance before you do /em quit"); + return; + } + if (emPackage instanceof WorldInstancedDungeonPackage) + new InstancedDungeonBrowser(player, emPackage.getDungeonPackagerConfigFields().getFilename()); + else { + if (emPackage.getDungeonPackagerConfigFields().getTeleportLocation() != null) { + PlayerPreTeleportEvent.teleportPlayer(player, emPackage.getDungeonPackagerConfigFields().getTeleportLocation()); + Wormhole.addPlayerToCooldowns(player); + } + else + player.sendMessage("[EliteMobs] Can't teleport you to the dungeon because the teleport location isn't set!" + + " Ask an admin to reinstall the dungeon!"); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/DungeonTeleportCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/DungeonTeleportCommand.java new file mode 100644 index 000000000..5c71e0f63 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/DungeonTeleportCommand.java @@ -0,0 +1,24 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.ArrayList; +import java.util.List; + +public class DungeonTeleportCommand extends AdvancedCommand { + public DungeonTeleportCommand() { + super(List.of("dungeontp")); + addArgument("dungeonID", new ArrayList<>()); + setPermission("elitemobs.dungeon.tp"); + setDescription("Teleports players to Lairs, Minidungeons and Dungeons."); + setUsage("/em dungeontp "); + setSenderType(SenderType.PLAYER); + } + + @Override + public void execute(CommandData commandData) { + DungeonCommands.teleport(commandData.getPlayerSender(), commandData.getStringArgument("dungeonID")); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/EliteMobsCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/EliteMobsCommand.java new file mode 100644 index 000000000..c41a1a6b2 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/EliteMobsCommand.java @@ -0,0 +1,25 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.playerdata.statusscreen.PlayerStatusScreen; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.ArrayList; + +public class EliteMobsCommand extends AdvancedCommand { + public EliteMobsCommand() { + super(new ArrayList<>()); + setDescription("The main command for EliteMobs, opens the main menu."); + setUsage("/em"); + setPermission("elitemobs.command"); + setSenderType(SenderType.PLAYER); + } + + @Override + public void execute(CommandData commandData) { + if (DefaultConfig.isEmLeadsToStatusMenu()) + new PlayerStatusScreen(commandData.getPlayerSender()); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/EnchantCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/EnchantCommand.java new file mode 100644 index 000000000..1e7bfa81c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/EnchantCommand.java @@ -0,0 +1,25 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.commands.guild.AdventurersGuildCommand; +import com.magmaguy.elitemobs.menus.ItemEnchantmentMenu; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.List; + +public class EnchantCommand extends AdvancedCommand { + public EnchantCommand() { + super(List.of("enchant")); + setUsage("/em enchant"); + setPermission("elitemobs.enchant.command"); + setSenderType(SenderType.PLAYER); + setDescription("Opens the enchantment menu or teleports the player to the Adventurer's Guild Hub"); + } + + @Override + public void execute(CommandData commandData) { + if (!AdventurersGuildCommand.adventurersGuildTeleport(commandData.getPlayerSender())) + new ItemEnchantmentMenu(commandData.getPlayerSender()); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/EventCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/EventCommand.java new file mode 100644 index 000000000..61a496b6d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/EventCommand.java @@ -0,0 +1,24 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.events.TimedEvent; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.List; + +public class EventCommand extends AdvancedCommand { + public EventCommand() { + super(List.of("event")); + addArgument("filename", TimedEvent.getBlueprintEvents().stream().map(timedEvent -> timedEvent.getCustomEventsConfigFields().getFilename()).toList()); + setUsage("/em event "); + setPermission("elitemobs.event.start"); + setSenderType(SenderType.PLAYER); + setDescription("Triggers a timed event to start at the next available time and place."); + } + + @Override + public void execute(CommandData commandData) { + com.magmaguy.elitemobs.commands.admin.EventCommand.trigger(commandData.getCommandSender(), commandData.getStringArgument("filename")); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/FireballCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/FireballCommand.java new file mode 100644 index 000000000..f15b47354 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/FireballCommand.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Fireball; + +import java.util.List; + +public class FireballCommand extends AdvancedCommand { + public FireballCommand() { + super(List.of("fireball")); + setUsage("/em fireball"); + setPermission("elitemobs.fireball"); + setDescription("Shoots a fireball, to test terrain protections and explosion regeneration."); + } + + @Override + public void execute(CommandData commandData) { + Fireball fireball = (Fireball) commandData.getPlayerSender().getWorld().spawnEntity(commandData.getPlayerSender().getLocation(), EntityType.FIREBALL); + fireball.setDirection(commandData.getPlayerSender().getLocation().getDirection().normalize()); + fireball.setShooter(commandData.getPlayerSender()); + fireball.setYield(3F); + EntityTracker.registerProjectileEntity(fireball); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/GetLootCommandHandler.java b/src/main/java/com/magmaguy/elitemobs/commands/GetLootCommandHandler.java deleted file mode 100644 index f18728d51..000000000 --- a/src/main/java/com/magmaguy/elitemobs/commands/GetLootCommandHandler.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.commands; - -import com.magmaguy.elitemobs.items.uniqueitems.UniqueItemInitializer; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -import static com.magmaguy.elitemobs.items.CustomItemConstructor.customItemList; - -/** - * Created by MagmaGuy on 01/05/2017. - */ -public class GetLootCommandHandler { - - public static boolean getLoot(Player player, String args1) { - - boolean itemExists = false; - - for (ItemStack itemStack : customItemList) - itemExists = getItem(itemStack, args1, player); - - if (itemExists) return true; - - for (ItemStack itemStack : UniqueItemInitializer.uniqueItemsList) - itemExists = getItem(itemStack, args1, player); - - if (itemExists) return true; - return false; - - } - - private static boolean getItem(ItemStack itemStack, String args1, Player player) { - - String itemRawName = itemStack.getItemMeta().getDisplayName(); - - if (itemRawName != null) { - - Bukkit.getLogger().info(itemStack.getItemMeta().getDisplayName()); - - String itemProcessedName = itemRawName.replaceAll(" ", "_").toLowerCase(); - itemProcessedName = ChatColor.stripColor(itemProcessedName); - - if (itemProcessedName.equalsIgnoreCase(args1) && player.isValid()) { - - player.getInventory().addItem(itemStack); - - return true; - - } - - } - - return false; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/GiveLootHandler.java b/src/main/java/com/magmaguy/elitemobs/commands/GiveLootHandler.java deleted file mode 100644 index 59619128e..000000000 --- a/src/main/java/com/magmaguy/elitemobs/commands/GiveLootHandler.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.magmaguy.elitemobs.commands; - -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -import java.util.concurrent.ThreadLocalRandom; - -import static com.magmaguy.elitemobs.items.CustomItemConstructor.customItemList; - -public class GiveLootHandler { - - public static void giveLootCommand(CommandSender commandSender, String[] args) { - - if (Bukkit.getServer().getPlayer(args[1]) != null) { - - Player receiver = Bukkit.getServer().getPlayer(args[1]); - - if (args[2].equalsIgnoreCase("random") || args[2].equalsIgnoreCase("r")) { - - int index = ThreadLocalRandom.current().nextInt(customItemList.size()); - ItemStack itemStack = new ItemStack(customItemList.get(index)); - receiver.getInventory().addItem(itemStack); - - } else - GetLootCommandHandler.getLoot(receiver, args[2]); - - } else - commandSender.sendMessage("Can't give loot to player - player not found."); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/GuildRankCommands.java b/src/main/java/com/magmaguy/elitemobs/commands/GuildRankCommands.java new file mode 100644 index 000000000..7764a5f4b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/GuildRankCommands.java @@ -0,0 +1,31 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.adventurersguild.GuildRank; +import com.magmaguy.magmacore.util.ChatColorConverter; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +public class GuildRankCommands { + public static void setGuildRank(CommandSender commandSender, String playerString, int prestigeLevel, int activeLevel) { + + Player player = Bukkit.getPlayer(playerString); + if (player == null) { + commandSender.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &4The player isn't online!")); + return; + } + + if (activeLevel < 0 || activeLevel > 10 + prestigeLevel || prestigeLevel > 10 || activeLevel > 20) { + commandSender.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &4The prestige rank / guild rank combination you picked is not valid!")); + return; + } + + GuildRank.setGuildPrestigeRank(player, prestigeLevel); + GuildRank.setMaxGuildRank(player, activeLevel); + GuildRank.setActiveGuildRank(player, activeLevel); + + commandSender.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &2You set the EliteMobs rank of " + + playerString + " to " + GuildRank.getRankName(GuildRank.getGuildPrestigeRank(player), GuildRank.getActiveGuildRank(player)))); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/HelpCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/HelpCommand.java new file mode 100644 index 000000000..c2b49187d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/HelpCommand.java @@ -0,0 +1,33 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.CommandManager; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.entity.Player; + +import java.util.List; + +public class HelpCommand extends AdvancedCommand { + public HelpCommand() { + super(List.of("help")); + setUsage("/em help"); + setPermission("elitemobs.help"); + setDescription("Lists all commands."); + } + + @Override + public void execute(CommandData commandData) { + Logger.sendMessage(commandData.getCommandSender(), "Commands:"); + for (CommandManager commandManager : CommandManager.getCommandManagers()) { + commandManager.commands.forEach(command -> { + if (commandData.getCommandSender() instanceof Player player) { + player.spigot().sendMessage(Logger.hoverMessage(command.getUsage(), command.getDescription())); + } else { + Logger.sendSimpleMessage(commandData.getCommandSender(), command.getUsage()); + Logger.sendSimpleMessage(commandData.getCommandSender(), command.getDescription()); + } + }); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/KillCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/KillCommand.java new file mode 100644 index 000000000..70c740edd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/KillCommand.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.commands.admin.KillHandler; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; + +import java.util.List; + +public class KillCommand extends AdvancedCommand { + public KillCommand() { + super(List.of("kill")); + setUsage("/em kill"); + setPermission("elitemobs.kill.command"); + setDescription("Kills all elites."); + } + + @Override + public void execute(CommandData commandData) { + KillHandler.killAggressiveMobs(commandData.getCommandSender()); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/KillHandler.java b/src/main/java/com/magmaguy/elitemobs/commands/KillHandler.java deleted file mode 100644 index cc6fd731a..000000000 --- a/src/main/java/com/magmaguy/elitemobs/commands/KillHandler.java +++ /dev/null @@ -1,176 +0,0 @@ -package com.magmaguy.elitemobs.commands; - -import com.magmaguy.elitemobs.EliteMobs; -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import org.bukkit.World; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; - -public class KillHandler { - - public static void killCommand(CommandSender commandSender, String[] args) { - - if (args.length < 2) - commandSender.sendMessage("[EliteMobs] Incorrect command syntax. Try /em kill aggressive/passive/mobType [radius]"); - - /* - Run with no radius search - */ - if (args.length == 2) { - if (args[1].equalsIgnoreCase("aggressive")) - killAggressiveMobs(commandSender); - else if (args[1].equalsIgnoreCase("passive")) - killPassiveMobs(commandSender); - else - killEntityType(commandSender, args); - return; - } - - /* - Run radius search - */ - if (args.length == 3) { - if (args[1].equalsIgnoreCase("aggressive")) - radiusKillAggressiveMobs(commandSender, args); - else if (args[1].equalsIgnoreCase("passive")) - radiusKillPassiveMobs(commandSender, args); - else - radiusKillSpecificMobs(commandSender, args); - } else - commandSender.sendMessage("[EliteMobs] Incorrect command syntax. Try /em kill aggressive/passive/mobType [radius]"); - - - } - - private static void killAggressiveMobs(CommandSender commandSender) { - - if (CommandHandler.permCheck(CommandHandler.KILLALL_AGGRESSIVEELITES, commandSender)) { - int counter = 0; - - for (EliteMobEntity eliteMobEntity : EntityTracker.getEliteMobs()) { - eliteMobEntity.getLivingEntity().remove(); - EntityTracker.unregisterEliteMob(eliteMobEntity); - counter++; - } - - - commandSender.sendMessage("Killed " + counter + " Elite Mobs."); - - } - - } - - private static void killPassiveMobs(CommandSender commandSender) { - - if (CommandHandler.permCheck(CommandHandler.KILLALL_PASSIVEELITES, commandSender)) { - int counter = 0; - for (World world : EliteMobs.validWorldList) - for (LivingEntity livingEntity : world.getLivingEntities()) - if (EntityTracker.isSuperMob(livingEntity)) { - livingEntity.remove(); - counter++; - } - - commandSender.sendMessage("Killed " + counter + " Elite Mobs."); - - } - } - - private static void killEntityType(CommandSender commandSender, String[] args) { - - if (CommandHandler.permCheck(CommandHandler.KILLALL_SPECIFICENTITY, commandSender)) { - - try { - EntityType entityType = EntityType.fromName(args[1].toUpperCase()); - int counter = 0; - for (World world : EliteMobs.validWorldList) - for (LivingEntity livingEntity : world.getLivingEntities()) - if (livingEntity.getType().equals(entityType) && - (EntityTracker.isEliteMob(livingEntity) || - EntityTracker.isSuperMob(livingEntity))) { - livingEntity.remove(); - counter++; - } - - commandSender.sendMessage("Killed " + counter + " Elite " + args[1] + "."); - - } catch (Exception e) { - commandSender.sendMessage("[EliteMobs] Entity type is not valid!"); - } - - } - - } - - private static void radiusKillAggressiveMobs(CommandSender commandSender, String[] args) { - - if (!CommandHandler.userPermCheck(CommandHandler.KILLALL_AGGRESSIVEELITES, commandSender)) - return; - - try { - - int counter = 0; - for (Entity entity : ((Player) commandSender).getNearbyEntities(Integer.parseInt(args[2]), Integer.parseInt(args[2]), Integer.parseInt(args[2]))) - if (EntityTracker.isEliteMob(entity)) { - entity.remove(); - counter++; - } - - commandSender.sendMessage("Killed " + counter + " Elite Mobs."); - - } catch (Exception e) { - commandSender.sendMessage("[EliteMobs] Incorrect command syntax. Try /em kill aggressive/passive/mobType [radius]"); - } - - } - - private static void radiusKillPassiveMobs(CommandSender commandSender, String[] args) { - - if (!CommandHandler.userPermCheck(CommandHandler.KILLALL_PASSIVEELITES, commandSender)) - return; - - try { - int counter = 0; - for (Entity entity : ((Player) commandSender).getNearbyEntities(Integer.parseInt(args[2]), Integer.parseInt(args[2]), Integer.parseInt(args[2]))) - if (EntityTracker.isSuperMob(entity)) { - entity.remove(); - counter++; - } - commandSender.sendMessage("Killed " + counter + " Elite Mobs."); - - } catch (Exception e) { - commandSender.sendMessage("[EliteMobs] Incorrect command syntax. Try /em kill aggressive/passive/mobType [radius]"); - } - - } - - private static void radiusKillSpecificMobs(CommandSender commandSender, String[] args) { - - if (!CommandHandler.userPermCheck(CommandHandler.KILLALL_SPECIFICENTITY, commandSender)) - return; - - try { - - EntityType entityType = EntityType.fromName(args[1].toUpperCase()); - - int counter = 0; - for (Entity entity : ((Player) commandSender).getNearbyEntities(Integer.parseInt(args[2]), Integer.parseInt(args[2]), Integer.parseInt(args[2]))) - if (entity.getType().equals(entityType) && - (EntityTracker.isEliteMob(entity) || - EntityTracker.isSuperMob(entity))) { - entity.remove(); - counter++; - } - commandSender.sendMessage("Killed " + counter + " Elite " + args[1] + "."); - - } catch (Exception e) { - commandSender.sendMessage("[EliteMobs] Incorrect command syntax. Try /em kill aggressive/passive/mobType [radius]"); - } - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/KillRadiusCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/KillRadiusCommand.java new file mode 100644 index 000000000..978c494a7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/KillRadiusCommand.java @@ -0,0 +1,25 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.commands.admin.KillHandler; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.ArrayList; +import java.util.List; + +public class KillRadiusCommand extends AdvancedCommand { + public KillRadiusCommand() { + super(List.of("kill")); + addArgument("radius", new ArrayList<>()); + setUsage("/em kill "); + setPermission("elitemobs.kill.command"); + setSenderType(SenderType.PLAYER); + setDescription("Kills all elites in the specified radius."); + } + + @Override + public void execute(CommandData commandData) { + KillHandler.radiusKillAggressiveMobs(commandData.getPlayerSender(), commandData.getIntegerArgument("radius")); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/KillTypeCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/KillTypeCommand.java new file mode 100644 index 000000000..03b0ffdc6 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/KillTypeCommand.java @@ -0,0 +1,25 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.commands.admin.KillHandler; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class KillTypeCommand extends AdvancedCommand { + public KillTypeCommand() { + super(List.of("kill")); + addLiteral("type"); + addArgument("type", new ArrayList<>()); + setUsage("/em kill type "); + setPermission("elitemobs.kill.command"); + setDescription("Kills all elites of the specified type."); + } + + @Override + public void execute(CommandData commandData) { + KillHandler.killEntityType(commandData.getCommandSender(), EntityType.valueOf(commandData.getStringArgument("type"))); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/KillTypeRadiusCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/KillTypeRadiusCommand.java new file mode 100644 index 000000000..33cd0d2e8 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/KillTypeRadiusCommand.java @@ -0,0 +1,30 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.commands.admin.KillHandler; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class KillTypeRadiusCommand extends AdvancedCommand { + public KillTypeRadiusCommand() { + super(List.of("kill")); + addLiteral("type"); + addArgument("type", new ArrayList<>()); + addArgument("range", new ArrayList<>()); + setUsage("/em kill type "); + setPermission("elitemobs.kill.command"); + setSenderType(SenderType.PLAYER); + setDescription("Kills all elites of the specified type within the specified radius."); + } + + @Override + public void execute(CommandData commandData) { + KillHandler.radiusKillSpecificMobs(commandData.getPlayerSender(), + EntityType.valueOf(commandData.getStringArgument("type")), + commandData.getIntegerArgument("range")); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/LanguageCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/LanguageCommand.java new file mode 100644 index 000000000..57d0aee9a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/LanguageCommand.java @@ -0,0 +1,35 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.config.translations.TranslationsConfig; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.util.Logger; + +import java.util.ArrayList; +import java.util.List; + +public class LanguageCommand extends AdvancedCommand { + public LanguageCommand() { + super(List.of("language")); + List suggestions = new ArrayList<>(TranslationsConfig.getTranslationConfigs().keySet().stream().toList()); + suggestions.add("english"); + addArgument("language", suggestions); + setUsage("/em language "); + setPermission("elitemobs.language"); + setDescription("Sets the language that the server will use for EliteMobs, based on a translation file in the translation files."); + } + + @Override + public void execute(CommandData commandData) { + String language = commandData.getStringArgument("language"); + if (!TranslationsConfig.getTranslationConfigs().containsKey(language) && !language.equals("english")) { + Logger.sendMessage(commandData.getCommandSender(), "Language not found. Valid languages:"); + TranslationsConfig.getTranslationConfigs().keySet().forEach(key -> Logger.sendMessage(commandData.getCommandSender(), key)); + return; + } + DefaultConfig.setLanguage(commandData.getCommandSender(), language); + Logger.sendMessage(commandData.getCommandSender(), "&2Language set to " + language + + " ! &4Translations are created and manged for free by the community through Crowdin ( https://crowdin.com/project/elitemobs ), use at your own discretion!"); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/LootCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/LootCommand.java new file mode 100644 index 000000000..d1035a41f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/LootCommand.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.menus.LootMenu; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.List; + +public class LootCommand extends AdvancedCommand { + public LootCommand() { + super(List.of("loot")); + setUsage("/em loot"); + setDescription("Open the loot menu for group loot."); + setSenderType(SenderType.PLAYER); + } + + @Override + public void execute(CommandData commandData) { + LootMenu.openMenu(commandData.getPlayerSender()); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/LootDebugCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/LootDebugCommand.java new file mode 100644 index 000000000..ada2a14e9 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/LootDebugCommand.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.commands.admin.GetTierCommand; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.ArrayList; +import java.util.List; + +public class LootDebugCommand extends AdvancedCommand { + public LootDebugCommand() { + super(List.of("loot")); + addLiteral("debug"); + addArgument("level", new ArrayList<>()); + setUsage("/em loot debug "); + setPermission("elitemobs.loot.debug"); + setSenderType(SenderType.PLAYER); + setDescription("Equips players with a complete armor set, weapons set of the specified level, and food for testing purposes."); + } + + @Override + public void execute(CommandData commandData) { + GetTierCommand.get(commandData.getPlayerSender(), commandData.getIntegerArgument("level")); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/LootGUI.java b/src/main/java/com/magmaguy/elitemobs/commands/LootGUI.java deleted file mode 100644 index e43a8f8c7..000000000 --- a/src/main/java/com/magmaguy/elitemobs/commands/LootGUI.java +++ /dev/null @@ -1,267 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.commands; - -import com.magmaguy.elitemobs.items.CustomItemConstructor; -import com.magmaguy.elitemobs.items.uniqueitems.UniqueItemInitializer; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.inventory.meta.SkullMeta; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -/** - * Created by MagmaGuy on 04/05/2017. - */ -public class LootGUI implements Listener { - - private int currentHeaderPage = 1; - private int currentLootPage = 1; - private boolean filter = false; - private int filterRank = 0; - - private List lootSlots = new ArrayList<>(Arrays.asList(10, 11, 12, 13, 14, 15, 16, 19, 20, 21, 22, 23, 24, 25, 28, 29, 30, 31, - 32, 33, 34, 37, 38, 39, 40, 41, 42, 43, 46, 47, 48, 49, 50, 51, 52)); - - private String shopName = "EliteMobs Custom Loot"; - - public void lootGUI(Player player) { - - Inventory fakeChestInventory = Bukkit.createInventory(null, 54, shopName); - tierConstructor(fakeChestInventory); - headerConstructor(fakeChestInventory); - lootNavigationConstructor(fakeChestInventory); - lootConstructor(fakeChestInventory); - - player.openInventory(fakeChestInventory); - - } - - private void headerConstructor(Inventory inventory) { - - ItemStack arrowLeft = new ItemStack(Material.SKULL_ITEM, 1, (short) 3); - SkullMeta arrowLeftSkullMeta = (SkullMeta) arrowLeft.getItemMeta(); - arrowLeftSkullMeta.setOwner("MHF_ArrowLeft"); - arrowLeftSkullMeta.setDisplayName("Previous Item Ranks"); - arrowLeft.setItemMeta(arrowLeftSkullMeta); - - inventory.setItem(0, arrowLeft); - - - ItemStack arrowRight = new ItemStack(Material.SKULL_ITEM, 1, (short) 3); - SkullMeta arrowRightSkullMeta = (SkullMeta) arrowRight.getItemMeta(); - arrowRightSkullMeta.setOwner("MHF_ArrowRight"); - arrowRightSkullMeta.setDisplayName("Next Item Ranks"); - arrowRight.setItemMeta(arrowRightSkullMeta); - - inventory.setItem(8, arrowRight); - - - ItemStack signature = new ItemStack(Material.SKULL_ITEM, 1, (short) 3); - SkullMeta signatureSkullMeta = (SkullMeta) signature.getItemMeta(); - signatureSkullMeta.setOwner("magmaguy"); - signatureSkullMeta.setDisplayName("EliteMobs by MagmaGuy"); - List signatureList = new ArrayList<>(); - signatureList.add("Support the plugins you enjoy!"); - signatureSkullMeta.setLore(signatureList); - signature.setItemMeta(signatureSkullMeta); - - inventory.setItem(4, signature); - - } - - private void tierConstructor(Inventory inventory) { - - List tierSlots = new ArrayList<>(); - - tierSlots.add(1); - tierSlots.add(2); - tierSlots.add(3); - tierSlots.add(5); - tierSlots.add(6); - tierSlots.add(7); - - List keySet = new ArrayList<>(CustomItemConstructor.dynamicRankedItemStacks.keySet()); - - int counter = 1; - - for (int number : tierSlots) { - - if (keySet.size() >= counter + ((currentHeaderPage - 1) * 6)) { - - ItemStack chest = new ItemStack(Material.CHEST, 1); - ItemMeta chestItemMeta = chest.getItemMeta(); - chestItemMeta.setDisplayName("Tier " + keySet.get((counter - 1) + ((currentHeaderPage - 1) * 6))); - List lore = new ArrayList(); - lore.add("Filter by items of this rank."); - chestItemMeta.setLore(lore); - chest.setItemMeta(chestItemMeta); - - inventory.setItem(number, chest); - - } - - counter++; - - } - - } - - private void lootNavigationConstructor(Inventory inventory) { - - ItemStack arrowLeft = new ItemStack(Material.SKULL_ITEM, 1, (short) 3); - SkullMeta arrowLeftSkullMeta = (SkullMeta) arrowLeft.getItemMeta(); - arrowLeftSkullMeta.setOwner("MHF_ArrowLeft"); - arrowLeftSkullMeta.setDisplayName("Previous Loot Page"); - arrowLeft.setItemMeta(arrowLeftSkullMeta); - - inventory.setItem(27, arrowLeft); - - - ItemStack arrowRight = new ItemStack(Material.SKULL_ITEM, 1, (short) 3); - SkullMeta arrowRightSkullMeta = (SkullMeta) arrowRight.getItemMeta(); - arrowRightSkullMeta.setOwner("MHF_ArrowRight"); - arrowRightSkullMeta.setDisplayName("Next Loot Page"); - arrowRight.setItemMeta(arrowRightSkullMeta); - - inventory.setItem(35, arrowRight); - - } - - private void lootConstructor(Inventory inventory) { - - List getLootList = new ArrayList<>(); - for (List list : CustomItemConstructor.dynamicRankedItemStacks.values()) - getLootList.addAll(list); - - getLootList.addAll(CustomItemConstructor.staticCustomItemHashMap.keySet()); - getLootList.addAll(UniqueItemInitializer.uniqueItemsList); - - int counter = 1; - - for (int number : lootSlots) { - - if (!filter) { - - if (getLootList.size() >= counter + ((currentLootPage - 1) * 35)) { - - inventory.setItem(number, getLootList.get(counter - 1 + ((currentLootPage - 1) * 35))); - - } - - } else { - - List currentRankloot = CustomItemConstructor.dynamicRankedItemStacks.get(filterRank); - - if (currentRankloot.size() >= counter + ((currentLootPage - 1) * 35)) { - - inventory.setItem(number, currentRankloot.get(counter - 1 + ((currentLootPage - 1) * 35))); - - } - - } - - counter++; - - } - - } - - @EventHandler - public void onClick(InventoryClickEvent event) { - - if (event.getInventory().getName().equalsIgnoreCase(shopName)) { - - if (event.getCurrentItem() == null || event.getCurrentItem().getType().equals(Material.AIR)) { - - event.setCancelled(true); - return; - - } - - String itemDisplayName = event.getCurrentItem().getItemMeta().getDisplayName(); - Player player = (Player) event.getWhoClicked(); - - if (itemDisplayName != null) { - - if (itemDisplayName.equals("Next Loot Page")) { - - currentLootPage++; - lootGUI(player); - - } else if (itemDisplayName.equals("Previous Loot Page")) { - - if (currentLootPage > 1) { - - currentLootPage--; - lootGUI(player); - - } - - } else if (itemDisplayName.equals("Next Item Ranks")) { - - currentHeaderPage++; - lootGUI(player); - - } else if (itemDisplayName.equals("Previous Item Ranks")) { - - if (currentHeaderPage > 1) { - - currentHeaderPage--; - lootGUI(player); - - } - - } else if (itemDisplayName.equals("EliteMobs by MagmaGuy")) { - - filter = false; - currentLootPage = 1; - lootGUI(player); - - } else if (event.getCurrentItem().getItemMeta().getLore().get(0).equals("Filter by items of this rank.")) { - - filter = true; - String[] lore = itemDisplayName.split("\\s"); - filterRank = Integer.valueOf(lore[1]); - currentLootPage = 1; - lootGUI(player); - - } - - } - - if (lootSlots.contains(event.getSlot())) { - - player.getInventory().addItem(event.getCurrentItem()); - - } - - event.setCancelled(true); - - } - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/LootGiveCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/LootGiveCommand.java new file mode 100644 index 000000000..5938e9cfb --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/LootGiveCommand.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.commands.admin.LootCommand; +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfig; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; + +import java.util.ArrayList; +import java.util.List; + +public class LootGiveCommand extends AdvancedCommand { + public LootGiveCommand() { + super(List.of("loot")); + addLiteral("give"); + addArgument("filename", new ArrayList<>(CustomItemsConfig.getCustomItems().keySet())); + addArgument("playerName", new ArrayList<>()); + setUsage("/em loot give "); + setPermission("elitemobs.loot.admin"); + setDescription("Gives the specified loot to a specific player."); + } + + @Override + public void execute(CommandData commandData) { + LootCommand.give(commandData.getCommandSender(), commandData.getStringArgument("playerName"), commandData.getStringArgument("filename")); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/LootMenuCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/LootMenuCommand.java new file mode 100644 index 000000000..9126a677b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/LootMenuCommand.java @@ -0,0 +1,24 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.menus.GetLootMenu; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.List; + +public class LootMenuCommand extends AdvancedCommand { + public LootMenuCommand() { + super(List.of("loot")); + addLiteral("menu"); + setUsage("/em loot menu"); + setPermission("elitemobs.loot.admin"); + setSenderType(SenderType.PLAYER); + setDescription("Opens the loot menu."); + } + + @Override + public void execute(CommandData commandData) { + new GetLootMenu(commandData.getPlayerSender()); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/LootRandomCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/LootRandomCommand.java new file mode 100644 index 000000000..60c979976 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/LootRandomCommand.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.commands.admin.SimLootCommand; +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfig; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; + +import java.util.ArrayList; +import java.util.List; + +public class LootRandomCommand extends AdvancedCommand { + public LootRandomCommand() { + super(List.of("loot")); + addLiteral("random"); + addArgument("level", new ArrayList<>()); + addArgument("playerName", new ArrayList<>(CustomItemsConfig.getCustomItems().keySet())); + setUsage("/em loot random "); + setPermission("elitemobs.loot.admin"); + setDescription("Gives the player random loot of the specified level."); + } + + @Override + public void execute(CommandData commandData) { + SimLootCommand.forcePositiveLoot(commandData.getCommandSender(), commandData.getStringArgument("playerName"), commandData.getIntegerArgument("level")); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/LootSimulateCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/LootSimulateCommand.java new file mode 100644 index 000000000..9dbd97527 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/LootSimulateCommand.java @@ -0,0 +1,31 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.commands.admin.SimLootCommand; +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfig; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.ArrayList; +import java.util.List; + +public class LootSimulateCommand extends AdvancedCommand { + public LootSimulateCommand() { + super(List.of("loot")); + addLiteral("simulate"); + addArgument("level", new ArrayList<>()); + addArgument("playerName", new ArrayList<>(CustomItemsConfig.getCustomItems().keySet())); + setUsage("/em loot simulate "); + setPermission("elitemobs.loot.admin"); + setSenderType(SenderType.PLAYER); + setDescription("Simulates loot drops for the specified level and player."); + } + + @Override + public void execute(CommandData commandData) { + SimLootCommand.run( + commandData.getPlayerSender(), + commandData.getIntegerArgument("level"), + commandData.getStringArgument("playerName")); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/LootSimulateMultipleCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/LootSimulateMultipleCommand.java new file mode 100644 index 000000000..a38e117cb --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/LootSimulateMultipleCommand.java @@ -0,0 +1,33 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.commands.admin.SimLootCommand; +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfig; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.ArrayList; +import java.util.List; + +public class LootSimulateMultipleCommand extends AdvancedCommand { + public LootSimulateMultipleCommand() { + super(List.of("loot")); + addLiteral("simulate"); + addArgument("level", new ArrayList<>()); + addArgument("times", new ArrayList<>(CustomItemsConfig.getCustomItems().keySet())); + addArgument("playerName", new ArrayList<>()); + setUsage("/em loot simulate "); + setPermission("elitemobs.loot.admin"); + setSenderType(SenderType.PLAYER); + setDescription("Simulates loot drops for the specified amount of times for the specified level and player."); + } + + @Override + public void execute(CommandData commandData) { + SimLootCommand.runMultipleTimes( + commandData.getPlayerSender(), + commandData.getIntegerArgument("level"), + commandData.getIntegerArgument("times"), + commandData.getStringArgument("playerName")); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/LootStats.java b/src/main/java/com/magmaguy/elitemobs/commands/LootStats.java new file mode 100644 index 000000000..9e81fb2f6 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/LootStats.java @@ -0,0 +1,38 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.api.utils.EliteItemManager; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.util.List; + +public class LootStats extends AdvancedCommand { + public LootStats() { + super(List.of("loot")); + addLiteral("stats"); + setUsage("/em loot stats"); + setPermission("elitemobs.loot.stats"); + setSenderType(SenderType.PLAYER); + setDescription("Provides EliteMobs stats for the currently held item."); + } + + @Override + public void execute(CommandData commandData) { + Player player = commandData.getPlayerSender(); + ItemStack item = player.getInventory().getItemInMainHand(); + double attackSpeed = EliteItemManager.getAttackSpeed(item); + double damage = EliteItemManager.getBaseDamage(item); + double dps = EliteItemManager.getDPS(item); + double itemLevel = EliteItemManager.getWeaponLevel(item); + double bonusEDPS = EliteItemManager.getTotalDPS(item); + player.sendMessage("[EliteMobs] Item Stats:"); + player.sendMessage("Item attack speed: " + attackSpeed); + player.sendMessage("Item damage: " + damage); + player.sendMessage("Item EDPS: " + dps); + player.sendMessage("Item level: " + itemLevel); + player.sendMessage("Item bonus EDPS: " + bonusEDPS); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/MoneyAddAllCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/MoneyAddAllCommand.java new file mode 100644 index 000000000..176e7f042 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/MoneyAddAllCommand.java @@ -0,0 +1,25 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; + +import java.util.ArrayList; +import java.util.List; + +public class MoneyAddAllCommand extends AdvancedCommand { + public MoneyAddAllCommand() { + super(List.of("money")); + addLiteral("addAll"); + addArgument("amount", new ArrayList<>()); + setUsage("/em money addAll "); + setPermission("elitemobs.money.admin"); + setDescription("Gives every player on the server the specified amount of money."); + } + + @Override + public void execute(CommandData commandData) { + CurrencyCommandsHandler.addAllCommand( + commandData.getCommandSender(), + commandData.getDoubleArgument("amount")); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/MoneyAddCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/MoneyAddCommand.java new file mode 100644 index 000000000..e7089faa2 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/MoneyAddCommand.java @@ -0,0 +1,28 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfig; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; + +import java.util.ArrayList; +import java.util.List; + +public class MoneyAddCommand extends AdvancedCommand { + public MoneyAddCommand() { + super(List.of("money")); + addLiteral("add"); + addArgument("player", new ArrayList<>()); + addArgument("amount", new ArrayList<>(CustomItemsConfig.getCustomItems().keySet())); + setUsage("/em money add "); + setPermission("elitemobs.money.admin"); + setDescription("Gives the specified amount of money to the designated player."); + } + + @Override + public void execute(CommandData commandData) { + CurrencyCommandsHandler.addCommand( + commandData.getCommandSender(), + commandData.getStringArgument("player"), + commandData.getDoubleArgument("amount")); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/MoneyCheckCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/MoneyCheckCommand.java new file mode 100644 index 000000000..14cee4268 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/MoneyCheckCommand.java @@ -0,0 +1,28 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.playerdata.statusscreen.PlayerStatusScreen; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.List; + +public class MoneyCheckCommand extends AdvancedCommand { + public MoneyCheckCommand() { + super(List.of("money")); + addLiteral("check"); + setUsage("/em money check"); + setPermission("elitemobs.money.check.self"); + setSenderType(SenderType.PLAYER); + setDescription("Checks your EliteMobs currency."); + } + + @Override + public void execute(CommandData commandData) { + if (DefaultConfig.isOtherCommandsLeadToEMStatusMenu()) + new PlayerStatusScreen(commandData.getPlayerSender()); + else + CurrencyCommandsHandler.walletCommand(commandData.getPlayerSender()); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/MoneyCheckPlayerCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/MoneyCheckPlayerCommand.java new file mode 100644 index 000000000..a73f8def9 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/MoneyCheckPlayerCommand.java @@ -0,0 +1,25 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; + +import java.util.ArrayList; +import java.util.List; + +public class MoneyCheckPlayerCommand extends AdvancedCommand { + public MoneyCheckPlayerCommand() { + super(List.of("money")); + addLiteral("check"); + addArgument("player", new ArrayList<>()); + setUsage("/em money check "); + setPermission("elitemobs.money.check.others"); + setDescription("Checks the currency of the specified player."); + } + + @Override + public void execute(CommandData commandData) { + CurrencyCommandsHandler.checkCommand( + commandData.getCommandSender(), + commandData.getStringArgument("player")); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/MoneyRemoveCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/MoneyRemoveCommand.java new file mode 100644 index 000000000..3bb188cd2 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/MoneyRemoveCommand.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfig; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; + +import java.util.ArrayList; +import java.util.List; + +public class MoneyRemoveCommand extends AdvancedCommand { + public MoneyRemoveCommand() { + super(List.of("money")); + addLiteral("remove"); + addArgument("player", new ArrayList<>(CustomItemsConfig.getCustomItems().keySet())); + addArgument("amount", new ArrayList<>(CustomItemsConfig.getCustomItems().keySet())); + setUsage("/em money remove "); + setPermission("elitemobs.money.admin"); + setDescription("Deducts the specified amount of currency from a player."); + } + + @Override + public void execute(CommandData commandData) { + CurrencyCommandsHandler.subtractCommand( + commandData.getStringArgument("player"), + commandData.getDoubleArgument("amount")); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/MoneySetCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/MoneySetCommand.java new file mode 100644 index 000000000..5a1c9802d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/MoneySetCommand.java @@ -0,0 +1,28 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfig; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; + +import java.util.ArrayList; +import java.util.List; + +public class MoneySetCommand extends AdvancedCommand { + public MoneySetCommand() { + super(List.of("money")); + addLiteral("set"); + addArgument("player", new ArrayList<>(CustomItemsConfig.getCustomItems().keySet())); + addArgument("amount", new ArrayList<>(CustomItemsConfig.getCustomItems().keySet())); + setUsage("/em money set "); + setPermission("elitemobs.money.admin"); + setDescription("Sets the specified amount of currency for the specified player."); + } + + @Override + public void execute(CommandData commandData) { + CurrencyCommandsHandler.setCommand( + commandData.getCommandSender(), + commandData.getStringArgument("player"), + commandData.getDoubleArgument("amount")); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/PackageCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/PackageCommand.java new file mode 100644 index 000000000..4a9c8131e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/PackageCommand.java @@ -0,0 +1,109 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Logger; +import com.magmaguy.magmacore.util.ZipFile; +import org.bukkit.command.CommandSender; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; + +public class PackageCommand { + CommandSender commandSender; + String dungeonFolderName; + + public PackageCommand(CommandSender commandSender, String dungeonFolderName, String versionNumber) { + this.commandSender = commandSender; + if (dungeonFolderName == null || dungeonFolderName.isEmpty()) { + commandSender.sendMessage("[EliteMobs] This commands needs a valid dungeon name!"); + return; + } + int version = 0; + try { + version = Integer.parseInt(versionNumber); + } catch (Exception exception) { + commandSender.sendMessage("This command needs a valid natural number! (1, 2, 3, 4...)"); + return; + } + + this.dungeonFolderName = dungeonFolderName; + clearPreviousContents(); + packContents("custombosses"); + packContents("customevents"); + packContents("npcs"); + packContents("customitems"); + packContents("customquests"); + packContents("customarenas"); + packContents("customspawns"); + packContents("customtreasurechests"); + packContents("wormholes"); + packContents("world_blueprints"); + packContents("powers"); + + commandSender.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &2Done! You can find your package in &9~/plugins/EliteMobs/exports &2. &6If you are making a dungeon, make sure to create your own dungeonpackages file!")); + commandSender.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &6Don't forget to add your world and schematic files to the package if needed!")); + + try { + ZipFile.ZipUtility.zip(new File(MetadataHandler.PLUGIN.getDataFolder().getPath() + File.separatorChar + "exports" + File.separatorChar + dungeonFolderName), + MetadataHandler.PLUGIN.getDataFolder().getPath() + File.separatorChar + "exports" + File.separatorChar + dungeonFolderName + "_packaged.zip"); + } catch (Exception exception) { + commandSender.sendMessage(ChatColorConverter.convert("4&[EliteMobs] Failed to zip package!")); + } + + commandSender.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &6Zipped files for your convenience. Don't forget any additional files like the dungeonpackager or world/schematics files before distributing!")); + } + + private void clearPreviousContents() { + File targetFolder = new File(MetadataHandler.PLUGIN.getDataFolder().getPath() + File.separatorChar + "exports" + File.separatorChar + dungeonFolderName); + if (targetFolder.exists()) delete(targetFolder.toPath()); + if (new File(MetadataHandler.PLUGIN.getDataFolder().getPath() + File.separatorChar + "exports" + File.separatorChar + dungeonFolderName + "_packaged.zip").exists()) + delete(Path.of(MetadataHandler.PLUGIN.getDataFolder().getPath() + File.separatorChar + "exports" + File.separatorChar + dungeonFolderName + "_packaged.zip")); + } + + private void delete(Path path) { + for (File file : path.toFile().listFiles()) { + if (file.isDirectory()) delete(file.toPath()); + else file.delete(); + } + } + + private void packContents(String subdirectory) { + Path path = Path.of(MetadataHandler.PLUGIN.getDataFolder().getPath() + File.separatorChar + subdirectory + File.separatorChar + dungeonFolderName); + + if (!Files.exists(path) || !Files.isDirectory(path)) { + commandSender.sendMessage("[EliteMobs] Could not find any " + subdirectory + " for this dungeon. This might be normal depending on your setup."); + return; + } + File sourceFolder = new File(path.toString()); + File targetFolder = new File(MetadataHandler.PLUGIN.getDataFolder().getPath() + File.separatorChar + "exports" + File.separatorChar + dungeonFolderName + File.separatorChar + subdirectory + File.separatorChar + dungeonFolderName); + if (!targetFolder.exists()) { + try { + targetFolder.mkdirs(); + targetFolder.mkdir(); + } catch (Exception ex) { + commandSender.sendMessage("[EliteMobs] Failed to create directory " + targetFolder.getPath()); + ex.printStackTrace(); + return; + } + } + for (File file : sourceFolder.listFiles()) + recursivelyGetFiles(file, targetFolder); + } + + private void recursivelyGetFiles(File scannedFile, File destination) { + try { + if (scannedFile.isDirectory()) { + File newDestination = new File(destination.getAbsolutePath() + File.separatorChar + scannedFile.getName()); + newDestination.mkdir(); + for (File file : scannedFile.listFiles()) + recursivelyGetFiles(file, newDestination); + } else + Files.copy(scannedFile.toPath(), Path.of(destination.getAbsolutePath() + File.separatorChar + scannedFile.getName()), StandardCopyOption.REPLACE_EXISTING); + } catch (Exception exception) { + Logger.warn("Failed to recursively pack dungeon!"); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/PackageDungeonCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/PackageDungeonCommand.java new file mode 100644 index 000000000..1e867ea92 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/PackageDungeonCommand.java @@ -0,0 +1,25 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; + +import java.util.ArrayList; +import java.util.List; + +public class PackageDungeonCommand extends AdvancedCommand { + public PackageDungeonCommand() { + super(List.of("package")); + addArgument("dungeonName", new ArrayList<>()); + addArgument("version", new ArrayList<>()); + setUsage("/em package "); + setPermission("elitemobs.package"); + setDescription("Packages an EliteMobs dungeon for distribution."); + } + + @Override + public void execute(CommandData commandData) { + new PackageCommand(commandData.getCommandSender(), + commandData.getStringArgument("dungeonName"), + commandData.getStringArgument("version")); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/PayCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/PayCommand.java new file mode 100644 index 000000000..fdd48e0a0 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/PayCommand.java @@ -0,0 +1,28 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.ArrayList; +import java.util.List; + +public class PayCommand extends AdvancedCommand { + public PayCommand() { + super(List.of("pay")); + addArgument("player", new ArrayList<>()); + addArgument("amount", new ArrayList<>()); + setDescription("Send money to a player, minus tax."); + setUsage("/em pay "); + setPermission("elitemobs.money.pay"); + setSenderType(SenderType.PLAYER); + } + + @Override + public void execute(CommandData commandData) { + CurrencyCommandsHandler.payCommand( + commandData.getPlayerSender(), + commandData.getStringArgument("player"), + commandData.getDoubleArgument("amount")); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/PlaceBossCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/PlaceBossCommand.java new file mode 100644 index 000000000..2a65ae715 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/PlaceBossCommand.java @@ -0,0 +1,32 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfig; +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class PlaceBossCommand extends AdvancedCommand { + public PlaceBossCommand() { + super(List.of("place")); + addLiteral("boss"); + List regionalBosses = new ArrayList<>(); + for (Map.Entry entry : CustomBossesConfig.getCustomBosses().entrySet()) + if (entry.getValue().isRegionalBoss()) + regionalBosses.add(entry.getKey()); + addArgument("filename", regionalBosses); + setUsage("/em place boss "); + setPermission("elitemobs.place.admin"); + setSenderType(SenderType.PLAYER); + setDescription("Add a spawn location for the specified boss at your current location."); + } + + @Override + public void execute(CommandData commandData) { + CustomBossCommandHandler.addSpawnLocation(commandData.getStringArgument("filename"), commandData.getPlayerSender()); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/PlaceNPCCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/PlaceNPCCommand.java new file mode 100644 index 000000000..c1f31c9cd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/PlaceNPCCommand.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.commands.admin.NPCCommands; +import com.magmaguy.elitemobs.config.npcs.NPCsConfig; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.ArrayList; +import java.util.List; + +public class PlaceNPCCommand extends AdvancedCommand { + public PlaceNPCCommand() { + super(List.of("place")); + addLiteral("npc"); + addArgument("filename", new ArrayList<>(NPCsConfig.npcEntities.keySet())); + setUsage("/em place npc "); + setPermission("elitemobs.place.npc"); + setSenderType(SenderType.PLAYER); + setDescription("Permanently adds an npc to the location the user is standing on."); + } + + @Override + public void execute(CommandData commandData) { + NPCCommands.set(commandData.getPlayerSender(), commandData.getStringArgument("filename")); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/PlaceTreasureChestCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/PlaceTreasureChestCommand.java new file mode 100644 index 000000000..b47ae3621 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/PlaceTreasureChestCommand.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.config.customtreasurechests.CustomTreasureChestsConfig; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.ArrayList; +import java.util.List; + +public class PlaceTreasureChestCommand extends AdvancedCommand { + public PlaceTreasureChestCommand() { + super(List.of("place")); + addLiteral("treasureChest"); + addArgument("filename", new ArrayList<>(CustomTreasureChestsConfig.getCustomTreasureChestConfigFields().keySet())); + setUsage("/em place treasureChest "); + setPermission("elitemobs.place.admin"); + setSenderType(SenderType.PLAYER); + setDescription("Permanently adds a treasure chest to the location the user is standing on."); + } + + @Override + public void execute(CommandData commandData) { + CustomTreasureChestsConfig.addTreasureChestEntry(commandData.getPlayerSender(), commandData.getStringArgument("filename")); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/PlaceWormholeCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/PlaceWormholeCommand.java new file mode 100644 index 000000000..04cb8aa06 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/PlaceWormholeCommand.java @@ -0,0 +1,42 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.config.wormholes.WormholeConfig; +import com.magmaguy.elitemobs.wormhole.Wormhole; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; +import com.magmaguy.magmacore.util.Logger; + +import java.util.ArrayList; +import java.util.List; + +public class PlaceWormholeCommand extends AdvancedCommand { + public PlaceWormholeCommand() { + super(List.of("place")); + addLiteral("wormhole"); + addArgument("filename", new ArrayList<>(WormholeConfig.getWormholes().keySet())); + addArgument("wormholeOption", List.of(1, 2)); + setUsage("/em place wormhole <1/2>"); + setPermission("elitemobs.place.admin"); + setSenderType(SenderType.PLAYER); + setDescription("Place a wormhole teleport at your current location."); + } + + @Override + public void execute(CommandData commandData) { + for (Wormhole wormhole : Wormhole.getWormholes()) { + if (wormhole.getWormholeConfigFields().getFilename().equals(commandData.getStringArgument("filename"))) + switch (commandData.getStringArgument("wormholeOption")) { + case "1": + wormhole.getWormholeEntry1().updateLocation(commandData.getPlayerSender()); + return; + case "2": + wormhole.getWormholeEntry2().updateLocation(commandData.getPlayerSender()); + return; + default: + Logger.sendMessage(commandData.getCommandSender(), "Not a valid wormhole option! Pick 1 or 2 to set either end of the wormhole."); + } + } + Logger.sendMessage(commandData.getCommandSender(), "Failed to set location for this wormhole."); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/ProtectionBypassCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/ProtectionBypassCommand.java new file mode 100644 index 000000000..89e65f2ed --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/ProtectionBypassCommand.java @@ -0,0 +1,25 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.dungeons.DungeonProtector; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; +import com.magmaguy.magmacore.util.Logger; + +import java.util.List; + +public class ProtectionBypassCommand extends AdvancedCommand { + public ProtectionBypassCommand() { + super(List.of("protection")); + addLiteral("bypass"); + setPermission("elitemobs.protection.bypass"); + setDescription("Allows admins to toggle bypassing protections"); + setSenderType(SenderType.PLAYER); + } + + @Override + public void execute(CommandData commandData) { + boolean outcome = DungeonProtector.toggleBypass(commandData.getPlayerSender().getUniqueId()); + Logger.sendMessage(commandData.getCommandSender(), "Bypassing dungeon protections is now " + outcome); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/QuestAcceptCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/QuestAcceptCommand.java new file mode 100644 index 000000000..e5526ea69 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/QuestAcceptCommand.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.commands.quests.QuestCommand; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.ArrayList; +import java.util.List; + +public class QuestAcceptCommand extends AdvancedCommand { + public QuestAcceptCommand() { + super(List.of("quest")); + addLiteral("accept"); + addArgument("questID", new ArrayList<>()); + setUsage("/em quest accept "); + setPermission("elitemobs.quest.accept"); + setSenderType(SenderType.PLAYER); + setDescription("Accepts a quest. Used via menu, can't be directly used."); + } + + @Override + public void execute(CommandData commandData) { + QuestCommand.joinQuest(commandData.getStringArgument("questID"), commandData.getPlayerSender()); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/QuestBypassCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/QuestBypassCommand.java new file mode 100644 index 000000000..83619bbae --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/QuestBypassCommand.java @@ -0,0 +1,30 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.commands.quests.QuestCommand; +import com.magmaguy.elitemobs.quests.playercooldowns.PlayerQuestCooldowns; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; +import com.magmaguy.magmacore.util.Logger; + +import java.util.List; + +public class QuestBypassCommand extends AdvancedCommand { + public QuestBypassCommand() { + super(List.of("quest")); + addLiteral("bypass"); + setUsage("/em quest bypass"); + setPermission("elitemobs.quest.bypass"); + setSenderType(SenderType.PLAYER); + setDescription("Bypasses permission restrictions for elite quests."); + } + + @Override + public void execute(CommandData commandData) { + QuestCommand.bypassQuestRequirements(commandData.getPlayerSender()); + if (PlayerQuestCooldowns.bypassesQuestRestrictions(commandData.getPlayerSender())) + Logger.sendMessage(commandData.getCommandSender(), "Now bypassing quest permission requirements!"); + else + Logger.sendMessage(commandData.getCommandSender(), "No longer bypassing quest permission requirements!"); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/QuestCompleteCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/QuestCompleteCommand.java new file mode 100644 index 000000000..232fb266a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/QuestCompleteCommand.java @@ -0,0 +1,24 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.commands.quests.QuestCommand; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.List; + +public class QuestCompleteCommand extends AdvancedCommand { + public QuestCompleteCommand() { + super(List.of("quest")); + addLiteral("complete"); + setUsage("/em quest complete"); + setPermission("elitemobs.quest.complete.force"); + setSenderType(SenderType.PLAYER); + setDescription("Forces all of your currently active elite quests to be completed. For debugging use only."); + } + + @Override + public void execute(CommandData commandData) { + QuestCommand.completeQuest(commandData.getPlayerSender()); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/QuestCompleteQuestCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/QuestCompleteQuestCommand.java new file mode 100644 index 000000000..be7f31614 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/QuestCompleteQuestCommand.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.commands.quests.QuestCommand; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.ArrayList; +import java.util.List; + +public class QuestCompleteQuestCommand extends AdvancedCommand { + public QuestCompleteQuestCommand() { + super(List.of("quest")); + addLiteral("complete"); + addArgument("id", new ArrayList<>()); + setUsage("/em quest complete"); + setPermission("elitemobs.quest.complete"); + setSenderType(SenderType.PLAYER); + setDescription("Completes a quest for a player. Meant to be used via menu, not directly."); + } + + @Override + public void execute(CommandData commandData) { + QuestCommand.completeQuest(commandData.getStringArgument("id"), commandData.getPlayerSender()); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/QuestLeaveCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/QuestLeaveCommand.java new file mode 100644 index 000000000..3472647ca --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/QuestLeaveCommand.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.commands.quests.QuestCommand; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.ArrayList; +import java.util.List; + +public class QuestLeaveCommand extends AdvancedCommand { + public QuestLeaveCommand() { + super(List.of("quest")); + addLiteral("leave"); + addArgument("questID", new ArrayList<>()); + setUsage("/em quest leave"); + setPermission("elitemobs.quest.leave"); + setSenderType(SenderType.PLAYER); + setDescription("Leaves a quest. Used via menu, can't be directly used."); + } + + @Override + public void execute(CommandData commandData) { + QuestCommand.leaveQuest(commandData.getPlayerSender(), commandData.getStringArgument("questID")); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/QuestResetAllCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/QuestResetAllCommand.java new file mode 100644 index 000000000..18b968908 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/QuestResetAllCommand.java @@ -0,0 +1,24 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.commands.quests.QuestCommand; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; + +import java.util.ArrayList; +import java.util.List; + +public class QuestResetAllCommand extends AdvancedCommand { + public QuestResetAllCommand() { + super(List.of("quest")); + addLiteral("resetAll"); + addArgument("player", new ArrayList<>()); + setUsage("/em quest resetAll "); + setPermission("elitemobs.quest.reset.all"); + setDescription("Resets all quests for a specific player."); + } + + @Override + public void execute(CommandData commandData) { + QuestCommand.resetQuests(commandData.getCommandSender(), commandData.getStringArgument("player")); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/QuestResetCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/QuestResetCommand.java new file mode 100644 index 000000000..f57951bbd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/QuestResetCommand.java @@ -0,0 +1,28 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.commands.quests.QuestCommand; +import com.magmaguy.elitemobs.config.customquests.CustomQuestsConfig; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.ArrayList; +import java.util.List; + +public class QuestResetCommand extends AdvancedCommand { + public QuestResetCommand() { + super(List.of("quest")); + addLiteral("reset"); + addArgument("player", new ArrayList<>()); + addArgument("questName", new ArrayList<>(CustomQuestsConfig.getCustomQuests().keySet())); + setUsage("/em quest reset "); + setPermission("elitemobs.quest.reset"); + setDescription("Resets a specific quest for a specific player."); + setSenderType(SenderType.PLAYER); + } + + @Override + public void execute(CommandData commandData) { + QuestCommand.resetQuest(commandData.getCommandSender(), commandData.getStringArgument("player"), commandData.getStringArgument("questName")); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/QuestTrackCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/QuestTrackCommand.java new file mode 100644 index 000000000..207a34243 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/QuestTrackCommand.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.commands.quests.QuestCommand; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.ArrayList; +import java.util.List; + +public class QuestTrackCommand extends AdvancedCommand { + public QuestTrackCommand() { + super(List.of("quest")); + addLiteral("track"); + addArgument("questID", new ArrayList<>()); + setUsage("/em quest track "); + setPermission("elitemobs.quest.track"); + setSenderType(SenderType.PLAYER); + setDescription("Tracks a quest. Used via menu, can't be directly used."); + } + + @Override + public void execute(CommandData commandData) { + QuestCommand.trackQuest(commandData.getStringArgument("questID"), commandData.getPlayerSender()); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/QuitCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/QuitCommand.java new file mode 100644 index 000000000..148b2b2bf --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/QuitCommand.java @@ -0,0 +1,24 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.instanced.MatchInstance; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.List; + +public class QuitCommand extends AdvancedCommand { + public QuitCommand() { + super(List.of("quit")); + setDescription("When in instanced content, makes the player leave the instance."); + setUsage("/em quit"); + setSenderType(SenderType.PLAYER); + } + + @Override + public void execute(CommandData commandData) { + MatchInstance matchInstance = MatchInstance.getAnyPlayerInstance(commandData.getPlayerSender()); + if (matchInstance != null) + matchInstance.removeAnyKind(commandData.getPlayerSender()); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/RankCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/RankCommand.java new file mode 100644 index 000000000..b85485726 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/RankCommand.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.commands.guild.AdventurersGuildCommand; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.List; + +public class RankCommand extends AdvancedCommand { + public RankCommand() { + super(List.of("rank")); + setUsage("/em rank"); + setDescription("Opens the EliteMobs rank menu or teleports you to the Adventurer's Guild."); + setSenderType(SenderType.PLAYER); + } + + @Override + public void execute(CommandData commandData) { + if (!com.magmaguy.elitemobs.commands.guild.AdventurersGuildCommand.adventurersGuildTeleport(commandData.getPlayerSender())) + AdventurersGuildCommand.adventurersGuildCommand(commandData.getPlayerSender()); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/RankSetCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/RankSetCommand.java new file mode 100644 index 000000000..b4730d04b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/RankSetCommand.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; + +import java.util.ArrayList; +import java.util.List; + +public class RankSetCommand extends AdvancedCommand { + public RankSetCommand() { + super(List.of("rank")); + addArgument("player", new ArrayList<>()); + addArgument("prestigeLevel", new ArrayList<>()); + addArgument("guildLevel", new ArrayList<>()); + setUsage("/em rank "); + setPermission("elitemobs.rank.set"); + setDescription("Manually sets a player's guild rank to a the prestige level and guild level specified."); + } + + @Override + public void execute(CommandData commandData) { + GuildRankCommands.setGuildRank(commandData.getCommandSender(), + commandData.getStringArgument("player"), + commandData.getIntegerArgument("prestigeLevel"), + commandData.getIntegerArgument("guildLevel")); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/ReloadCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/ReloadCommand.java new file mode 100644 index 000000000..efc3774b9 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/ReloadCommand.java @@ -0,0 +1,30 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.command.CommandSender; + +import java.util.List; + +public class ReloadCommand extends AdvancedCommand { + public ReloadCommand() { + super(List.of("reload")); + setUsage("/em reload"); + setPermission("elitemobs.reload"); + setDescription("Reloads EliteMobs."); + } + + public static void reload(CommandSender commandSender) { + MetadataHandler.PLUGIN.onDisable(); + MetadataHandler.PLUGIN.onLoad(); + MetadataHandler.PLUGIN.onEnable(); + Logger.sendMessage(commandSender, "Plugin reloaded!"); + } + + @Override + public void execute(CommandData commandData) { + reload(commandData.getCommandSender()); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/ReloadConfigCommandHandler.java b/src/main/java/com/magmaguy/elitemobs/commands/ReloadConfigCommandHandler.java deleted file mode 100644 index af9977664..000000000 --- a/src/main/java/com/magmaguy/elitemobs/commands/ReloadConfigCommandHandler.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.commands; - -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.items.CustomItemConstructor; -import org.bukkit.Bukkit; - -/** - * Created by MagmaGuy on 13/05/2017. - */ -public class ReloadConfigCommandHandler { - - public void reloadConfiguration() { - - //Reload all configs - ConfigValues.initializeCachedConfigurations(); - - //reload config-based initialized data - CustomItemConstructor customItemConstructor = new CustomItemConstructor(); - customItemConstructor.superDropParser(); - - Bukkit.getLogger().info("EliteMobs config reloaded!"); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/ReloadHandler.java b/src/main/java/com/magmaguy/elitemobs/commands/ReloadHandler.java deleted file mode 100644 index 77d208483..000000000 --- a/src/main/java/com/magmaguy/elitemobs/commands/ReloadHandler.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.magmaguy.elitemobs.commands; - -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.items.CustomItemConstructor; -import com.magmaguy.elitemobs.items.uniqueitems.UniqueItemInitializer; -import org.bukkit.command.CommandSender; - -public class ReloadHandler { - - public static void reloadCommand(CommandSender commandSender, String[] args) { - - ConfigValues.initializeCachedConfigurations(); - CustomItemConstructor.customItemList.clear(); - CustomItemConstructor.staticCustomItemHashMap.clear(); - CustomItemConstructor.dynamicRankedItemStacks.clear(); - UniqueItemInitializer.uniqueItemsList.clear(); - CustomItemConstructor customItemConstructor = new CustomItemConstructor(); - customItemConstructor.superDropParser(); -// UniqueItemConstructor uniqueItemConstructor = new UniqueItemConstructor(); -// uniqueItemConstructor.intializeUniqueItems(); - UniqueItemInitializer.initialize(); - commandSender.sendMessage("EliteMobs reloaded!"); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/RemoveCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/RemoveCommand.java new file mode 100644 index 000000000..2110beb14 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/RemoveCommand.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.List; + +public class RemoveCommand extends AdvancedCommand { + public RemoveCommand() { + super(List.of("remove")); + setUsage("/em remove"); + setPermission("elitemobs.remove"); + setSenderType(SenderType.PLAYER); + setDescription("Toggle removal mode for EliteMobs, which can permanently remove any EliteMobs-related content."); + } + + @Override + public void execute(CommandData commandData) { + com.magmaguy.elitemobs.commands.admin.RemoveCommand.remove(commandData.getPlayerSender()); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/RepairCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/RepairCommand.java new file mode 100644 index 000000000..a1d6adeab --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/RepairCommand.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.commands.guild.AdventurersGuildCommand; +import com.magmaguy.elitemobs.menus.RepairMenu; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.List; + +public class RepairCommand extends AdvancedCommand { + public RepairCommand() { + super(List.of("repair")); + setUsage("/em repair"); + setPermission("elitemobs.repair.command"); + setSenderType(SenderType.PLAYER); + setDescription("Opens the repair item menu or teleports the player to the Adventurer's Guild Hub."); + } + + @Override + public void execute(CommandData commandData) { + if (!AdventurersGuildCommand.adventurersGuildTeleport(commandData.getPlayerSender())) { + RepairMenu repairMenu = new RepairMenu(); + repairMenu.constructRepairMenu(commandData.getPlayerSender()); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/RespawnAllCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/RespawnAllCommand.java new file mode 100644 index 000000000..63766ad2d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/RespawnAllCommand.java @@ -0,0 +1,24 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.mobconstructor.custombosses.RegionalBossEntity; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; + +import java.util.List; + +public class RespawnAllCommand extends AdvancedCommand { + public RespawnAllCommand() { + super(List.of("respawn")); + addLiteral("all"); + setUsage("/em respawn all"); + setPermission("elitemobs.respawn.force"); + setDescription("Forces all regional bosses to respawn."); + } + + @Override + public void execute(CommandData commandData) { + RegionalBossEntity.getRegionalBossEntities().forEach(regionalBossEntity -> { + if (regionalBossEntity.isRespawning()) regionalBossEntity.forceRespawn(); + }); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/ScrapCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/ScrapCommand.java new file mode 100644 index 000000000..534216f7e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/ScrapCommand.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.commands.guild.AdventurersGuildCommand; +import com.magmaguy.elitemobs.menus.ScrapperMenu; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.List; + +public class ScrapCommand extends AdvancedCommand { + public ScrapCommand() { + super(List.of("scrap")); + setUsage("/em scrap"); + setPermission("elitemobs.scrap.command"); + setSenderType(SenderType.PLAYER); + setDescription("Opens the scrap menu or teleports the player to the Adventurer's Guild Hub."); + } + + @Override + public void execute(CommandData commandData) { + if (!AdventurersGuildCommand.adventurersGuildTeleport(commandData.getPlayerSender())) { + ScrapperMenu scrapperMenu = new ScrapperMenu(); + scrapperMenu.constructScrapMenu(commandData.getPlayerSender()); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/SetMaxItemTierCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/SetMaxItemTierCommand.java deleted file mode 100644 index 9d84fdb8c..000000000 --- a/src/main/java/com/magmaguy/elitemobs/commands/SetMaxItemTierCommand.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.magmaguy.elitemobs.commands; - -import com.magmaguy.elitemobs.ChatColorConverter; -import com.magmaguy.elitemobs.config.*; -import org.bukkit.command.CommandSender; -import org.bukkit.configuration.Configuration; - -public class SetMaxItemTierCommand { - - public static void setMaxItemTier(double tier, CommandSender commandSender) { - - CustomConfigLoader customConfigLoader = new CustomConfigLoader(); - Configuration itemsDropSettingsConfig = customConfigLoader.getCustomConfig(ItemsDropSettingsConfig.CONFIG_NAME); - - itemsDropSettingsConfig.set(ItemsDropSettingsConfig.MAXIMUM_LOOT_TIER, tier); - customConfigLoader.saveCustomConfig(ItemsDropSettingsConfig.CONFIG_NAME); - - CustomConfigLoader customConfigLoader1 = new CustomConfigLoader(); - Configuration itemsProceduralSettingsConfig = customConfigLoader1.getCustomConfig(ItemsProceduralSettingsConfig.CONFIG_NAME); - - itemsProceduralSettingsConfig.set(ItemsProceduralSettingsConfig.ARROW_DAMAGE_MAX_LEVEL, tier-1); - itemsProceduralSettingsConfig.set(ItemsProceduralSettingsConfig.DAMAGE_ALL_MAX_LEVEL, tier-1); - itemsProceduralSettingsConfig.set(ItemsProceduralSettingsConfig.PROTECTION_ENVIRONMENTAL_MAX_LEVEL, tier-1); - customConfigLoader1.saveCustomConfig(ItemsProceduralSettingsConfig.CONFIG_NAME); - - - int maxMobLevel = (int) (tier * ConfigValues.mobCombatSettingsConfig.getDouble(MobCombatSettingsConfig.PER_TIER_LEVEL_INCREASE) * 10); - - CustomConfigLoader customConfigLoader2 = new CustomConfigLoader(); - Configuration mobCombatSettingsConfig = customConfigLoader2.getCustomConfig(MobCombatSettingsConfig.CONFIG_NAME); - mobCombatSettingsConfig.set(MobCombatSettingsConfig.NATURAL_ELITEMOB_LEVEL_CAP, maxMobLevel); - customConfigLoader2.saveCustomConfig(MobCombatSettingsConfig.CONFIG_NAME); - - ConfigValues.initializeCachedConfigurations(); - - commandSender.sendMessage(ChatColorConverter.convert( - "Warning: You have set the max tier to " + tier + "!")); - commandSender.sendMessage(ChatColorConverter.convert( - "The max protection enchantment has been increased to " + (tier - 1))); - commandSender.sendMessage(ChatColorConverter.convert( - "The max sharpness enchantment has been increased to " + (tier- 1))); - commandSender.sendMessage(ChatColorConverter.convert( - "The max power enchantment has been increased to " + (tier - 1))); - commandSender.sendMessage(ChatColorConverter.convert( - "The max mob level has been increased to " + maxMobLevel)); - commandSender.sendMessage(ChatColorConverter.convert( - "You can run this command again to tweak the values or change them in the ItemProceduralSettings.yml file," + - " as well as the ItemsDropSettings and the MobCombatSettings")); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/SetupCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/SetupCommand.java new file mode 100644 index 000000000..743545e32 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/SetupCommand.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.commands.setup.SetupMenu; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.List; + +public class SetupCommand extends AdvancedCommand { + public SetupCommand() { + super(List.of("setup")); + setPermission("elitemobs.setup"); + setSenderType(SenderType.PLAYER); + setDescription("The main command for setting up EliteMobs!"); + setUsage("/em setup"); + } + + @Override + public void execute(CommandData commandData) { + new SetupMenu(commandData.getPlayerSender()); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/SetupDoneCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/SetupDoneCommand.java new file mode 100644 index 000000000..c94084e30 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/SetupDoneCommand.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.util.Logger; + +import java.util.List; + +public class SetupDoneCommand extends AdvancedCommand { + public SetupDoneCommand() { + super(List.of("setup")); + addLiteral("done"); + setUsage("/em setup done"); + setPermission("elitemobs.setup"); + setDescription("Toggles whether the setup message will show up."); + } + + @Override + public void execute(CommandData commandData) { + DefaultConfig.toggleSetupDone(); + if (DefaultConfig.isSetupDone()) + Logger.sendMessage(commandData.getCommandSender(), "&aEliteMobs will no longer send messages on login. You can do [/em setup done] again to revert this."); + else + Logger.sendMessage(commandData.getCommandSender(), "&aEliteMobs will once again send messages on login. You can do [/em setup done] again to revert this."); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/SetupToggleCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/SetupToggleCommand.java new file mode 100644 index 000000000..89082a29f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/SetupToggleCommand.java @@ -0,0 +1,35 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.dungeons.EMPackage; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.util.Logger; + +import java.util.List; +import java.util.stream.Collectors; + +public class SetupToggleCommand extends AdvancedCommand { + public SetupToggleCommand() { + super(List.of("setup")); + addLiteral("toggle"); + addArgument("empackages", EMPackage.getEmPackages().values().stream().map(emPackage -> emPackage.getDungeonPackagerConfigFields().getFilename()).collect(Collectors.toUnmodifiableList())); + setUsage("/em setup toggle "); + setPermission("elitemobs.setup"); + setDescription("Allows you to toggle the installation of specified EliteMobs content."); + } + + @Override + public void execute(CommandData commandData) { + String dungeon = commandData.getStringArgument("empackages"); + if (dungeon.isEmpty() || EMPackage.getEmPackages().get(dungeon) == null) + Logger.sendMessage(commandData.getCommandSender(), "Not a valid em package!"); + EMPackage emPackage = EMPackage.getEmPackages().get(dungeon); + if (emPackage.install()) { + if (emPackage.isInstalled()) + Logger.sendMessage(commandData.getCommandSender(), "Successfully installed content!"); + else + Logger.sendMessage(commandData.getCommandSender(), "Successfully uninstalled content!"); + + } + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/ShareItemCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/ShareItemCommand.java new file mode 100644 index 000000000..46b26dea2 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/ShareItemCommand.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.items.ShareItem; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.List; + +public class ShareItemCommand extends AdvancedCommand { + public ShareItemCommand() { + super(List.of("shareItem")); + setUsage("/em shareItem"); + setPermission("elitemobs.shareitem"); + setSenderType(SenderType.PLAYER); + setDescription("Shares the stats of the currently held EliteMobs item in chat."); + } + + @Override + public void execute(CommandData commandData) { + ShareItem.showOnChat(commandData.getPlayerSender()); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/ShopCustomCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/ShopCustomCommand.java new file mode 100644 index 000000000..51d1ee9db --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/ShopCustomCommand.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.commands.guild.AdventurersGuildCommand; +import com.magmaguy.elitemobs.menus.CustomShopMenu; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.List; + +public class ShopCustomCommand extends AdvancedCommand { + public ShopCustomCommand() { + super(List.of("shop")); + addLiteral("custom"); + setUsage("/em shop custom"); + setPermission("elitemobs.shop.command"); + setSenderType(SenderType.PLAYER); + setDescription("Opens the procedurally generated item shop or teleports the player to the Adventurer's Guild Hub."); + } + + @Override + public void execute(CommandData commandData) { + if (!AdventurersGuildCommand.adventurersGuildTeleport(commandData.getPlayerSender())) + CustomShopMenu.customShopInitializer(commandData.getPlayerSender()); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/ShopCustomOtherCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/ShopCustomOtherCommand.java new file mode 100644 index 000000000..2d005cc46 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/ShopCustomOtherCommand.java @@ -0,0 +1,30 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.menus.CustomShopMenu; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.Bukkit; + +import java.util.ArrayList; +import java.util.List; + +public class ShopCustomOtherCommand extends AdvancedCommand { + public ShopCustomOtherCommand() { + super(List.of("shop")); + addLiteral("custom"); + addArgument("player", new ArrayList<>()); + setUsage("/em shop custom "); + setPermission("elitemobs.shop.custom.other"); + setDescription("Opens the EliteMobs shop for custom items for the specified player."); + } + + @Override + public void execute(CommandData commandData) { + try { + CustomShopMenu.customShopConstructor(Bukkit.getPlayer(commandData.getStringArgument("player"))); + } catch (Exception ex) { + Logger.sendMessage(commandData.getCommandSender(), "Failed to get player with that username!"); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/ShopDynamicCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/ShopDynamicCommand.java new file mode 100644 index 000000000..a4c047071 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/ShopDynamicCommand.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.commands.guild.AdventurersGuildCommand; +import com.magmaguy.elitemobs.menus.ProceduralShopMenu; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.List; + +public class ShopDynamicCommand extends AdvancedCommand { + public ShopDynamicCommand() { + super(List.of("shop")); + addLiteral("dynamic"); + setUsage("/em shop dynamic"); + setPermission("elitemobs.shop.dynamic"); + setSenderType(SenderType.PLAYER); + setDescription("Opens the procedurally generated item shop or teleports the player to the Adventurer's Guild Hub."); + } + + @Override + public void execute(CommandData commandData) { + if (!AdventurersGuildCommand.adventurersGuildTeleport(commandData.getPlayerSender())) + ProceduralShopMenu.shopInitializer(commandData.getPlayerSender()); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/ShopProceduralOtherCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/ShopProceduralOtherCommand.java new file mode 100644 index 000000000..5984710df --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/ShopProceduralOtherCommand.java @@ -0,0 +1,30 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.menus.ProceduralShopMenu; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.Bukkit; + +import java.util.ArrayList; +import java.util.List; + +public class ShopProceduralOtherCommand extends AdvancedCommand { + public ShopProceduralOtherCommand() { + super(List.of("shop")); + addLiteral("procedural"); + addArgument("player", new ArrayList<>()); + setUsage("/em shop procedural "); + setPermission("elitemobs.*"); + setDescription("Opens the EliteMobs shop for procedurally generated items."); + } + + @Override + public void execute(CommandData commandData) { + try { + ProceduralShopMenu.shopConstructor(Bukkit.getPlayer(commandData.getStringArgument("player"))); + } catch (Exception ex) { + Logger.sendMessage(commandData.getCommandSender(), "Failed to get player with that username!"); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/ShopSellOtherCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/ShopSellOtherCommand.java new file mode 100644 index 000000000..f4af0c02d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/ShopSellOtherCommand.java @@ -0,0 +1,31 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.menus.SellMenu; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.Bukkit; + +import java.util.ArrayList; +import java.util.List; + +public class ShopSellOtherCommand extends AdvancedCommand { + public ShopSellOtherCommand() { + super(List.of("shop")); + addLiteral("sell"); + addArgument("player", new ArrayList<>()); + setUsage("/em shop sell "); + setPermission("elitemobs.shop.sell.other"); + setDescription("Opens the EliteMobs shop sell menu for the specified player."); + } + + @Override + public void execute(CommandData commandData) { + SellMenu sellMenu = new SellMenu(); + try { + sellMenu.constructSellMenu(Bukkit.getPlayer(commandData.getStringArgument("player"))); + } catch (Exception ex) { + Logger.sendMessage(commandData.getCommandSender(), "Failed to get player with that username!"); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/SimLootHandler.java b/src/main/java/com/magmaguy/elitemobs/commands/SimLootHandler.java deleted file mode 100644 index 62ae75a82..000000000 --- a/src/main/java/com/magmaguy/elitemobs/commands/SimLootHandler.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.commands; - -import org.bukkit.entity.Player; - -/** - * Created by MagmaGuy on 08/06/2017. - */ -public class SimLootHandler { - - public static void simLoot(Player player, int level) { - -// if (level < 1) -// level = 0; -// -// LootTables.generateLoot(player); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/SpawnBossAtCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/SpawnBossAtCommand.java new file mode 100644 index 000000000..8f2871d95 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/SpawnBossAtCommand.java @@ -0,0 +1,39 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfig; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import org.bukkit.Bukkit; +import org.bukkit.generator.WorldInfo; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class SpawnBossAtCommand extends AdvancedCommand { + public SpawnBossAtCommand() { + super(List.of("spawn")); + addLiteral("bossAt"); + addArgument("filename", new ArrayList<>(CustomBossesConfig.getCustomBosses().keySet())); + addArgument("worldName", Bukkit.getWorlds().stream().map(WorldInfo::getName).collect(Collectors.toList())); + addArgument("x", new ArrayList<>()); + addArgument("y", new ArrayList<>()); + addArgument("z", new ArrayList<>()); + setUsage("/em spawn bossAt "); + setPermission("elitemobs.place.admin"); + setDescription("Spawns a custom boss at the specified location."); + } + + @Override + public void execute(CommandData commandData) { + SpawnCommand.spawnCustomBossCommand( + commandData.getCommandSender(), + commandData.getStringArgument("filename"), + commandData.getStringArgument("worldName"), + new Vector( + commandData.getDoubleArgument("x"), + commandData.getDoubleArgument("y"), + commandData.getDoubleArgument("z"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/SpawnBossCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/SpawnBossCommand.java new file mode 100644 index 000000000..2deb74068 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/SpawnBossCommand.java @@ -0,0 +1,28 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfig; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.ArrayList; +import java.util.List; + +public class SpawnBossCommand extends AdvancedCommand { + public SpawnBossCommand() { + super(List.of("spawn")); + addLiteral("boss"); + addArgument("filename", new ArrayList<>(CustomBossesConfig.getCustomBosses().keySet())); + setUsage("/em spawn boss "); + setPermission("elitemobs.place.admin"); + setSenderType(SenderType.PLAYER); + setDescription("Spawns a custom boss at the location the user is looking at."); + } + + @Override + public void execute(CommandData commandData) { + SpawnCommand.spawnCustomBossCommand( + commandData.getPlayerSender(), + commandData.getStringArgument("filename")); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/SpawnBossLevelAtCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/SpawnBossLevelAtCommand.java new file mode 100644 index 000000000..1fe0eecfc --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/SpawnBossLevelAtCommand.java @@ -0,0 +1,41 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfig; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import org.bukkit.Bukkit; +import org.bukkit.generator.WorldInfo; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class SpawnBossLevelAtCommand extends AdvancedCommand { + public SpawnBossLevelAtCommand() { + super(List.of("spawn")); + addLiteral("bossAt"); + addArgument("filename", new ArrayList<>(CustomBossesConfig.getCustomBosses().keySet())); + addArgument("worldName", Bukkit.getWorlds().stream().map(WorldInfo::getName).collect(Collectors.toList())); + addArgument("x", new ArrayList<>()); + addArgument("y", new ArrayList<>()); + addArgument("z", new ArrayList<>()); + addArgument("level", new ArrayList<>()); + setUsage("/em spawn bossAt "); + setPermission("elitemobs.place.admin"); + setDescription("Spawns a custom boss at the specified location with the specified level."); + } + + @Override + public void execute(CommandData commandData) { + SpawnCommand.spawnCustomBossCommand( + commandData.getCommandSender(), + commandData.getStringArgument("filename"), + commandData.getStringArgument("worldName"), + new Vector( + commandData.getDoubleArgument("x"), + commandData.getDoubleArgument("y"), + commandData.getDoubleArgument("z")), + commandData.getIntegerArgument("level")); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/SpawnBossLevelCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/SpawnBossLevelCommand.java new file mode 100644 index 000000000..cb6a6515e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/SpawnBossLevelCommand.java @@ -0,0 +1,30 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfig; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.ArrayList; +import java.util.List; + +public class SpawnBossLevelCommand extends AdvancedCommand { + public SpawnBossLevelCommand() { + super(List.of("spawn")); + addLiteral("boss"); + addArgument("filename", new ArrayList<>(CustomBossesConfig.getCustomBosses().keySet())); + addArgument("level", List.of("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19")); + setUsage("/em spawn boss "); + setPermission("elitemobs.place.admin"); + setSenderType(SenderType.PLAYER); + setDescription("Spawns a custom boss at the location the user is looking at with the specified level."); + } + + @Override + public void execute(CommandData commandData) { + SpawnCommand.spawnCustomBossCommand( + commandData.getPlayerSender(), + commandData.getStringArgument("filename"), + commandData.getIntegerArgument("level")); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/SpawnCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/SpawnCommand.java new file mode 100644 index 000000000..322e88eeb --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/SpawnCommand.java @@ -0,0 +1,175 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.config.CustomConfigFields; +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfig; +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs.EliteMobProperties; +import com.magmaguy.elitemobs.powers.meta.ElitePower; +import com.magmaguy.magmacore.util.ChatColorConverter; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.bukkit.util.Vector; + +import java.util.HashSet; +import java.util.Optional; + +/** + * Created by MagmaGuy on 01/05/2017. + */ +public class SpawnCommand { + + public static void spawnEliteEntityTypeCommand(Player player, EntityType entityType, Integer level, Optional powers) { + LivingEntity livingEntity = (LivingEntity) player.getLocation().getWorld().spawnEntity(getLocation(player), entityType); + EliteEntity eliteEntity = new EliteEntity(); + eliteEntity.setLevel(level); + + if (powers.isPresent()) { + String[] powersArray = powers.get().split(" "); + HashSet mobPowers = getPowers(powersArray, player); + eliteEntity.applyPowers(mobPowers); + } else { + eliteEntity.randomizePowers(EliteMobProperties.getPluginData(livingEntity)); + } + eliteEntity.setLivingEntity(livingEntity, CreatureSpawnEvent.SpawnReason.CUSTOM); + } + + public static void spawnEliteEntityTypeCommand(CommandSender commandSender, + EntityType entityType, + String world, + Vector coords, + Integer level, + Optional powers) { + try { + Location location = new Location(Bukkit.getWorld(world), coords.getX(), coords.getY(), coords.getZ()); + spawnEliteEntityTypeCommand(commandSender, + location, + entityType, + level, + powers); + } catch (Exception e) { + commandSender.sendMessage("[EliteMobs] World argument was not valid!"); + } + } + + public static void spawnEliteEntityTypeCommand(CommandSender commandSender, + Location location, + EntityType entityType, + Integer level, + Optional powers) { + if (!EliteMobProperties.getValidMobTypes().contains(entityType)) { + commandSender.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &4Entity type " + entityType.toString() + " can't be an Elite!")); + return; + } + LivingEntity livingEntity = (LivingEntity) location.getWorld().spawnEntity(location, entityType); + HashSet mobPowers = new HashSet<>(); + if (powers.isPresent()) { + String[] powersArray = powers.get().split(" "); + mobPowers = getPowers(powersArray, commandSender); + } + EliteEntity eliteEntity = new EliteEntity(); + eliteEntity.setLevel(level); + eliteEntity.setLivingEntity(livingEntity, CreatureSpawnEvent.SpawnReason.CUSTOM); + if (!mobPowers.isEmpty()) eliteEntity.applyPowers(mobPowers); + else eliteEntity.randomizePowers(EliteMobProperties.getPluginData(livingEntity)); + } + + public static void spawnCustomBossCommand(CommandSender commandSender, + String fileName, + String world, + Vector coords) { + try { + Location location = new Location(Bukkit.getWorld(world), coords.getX(), coords.getY(), coords.getZ()); + CustomBossesConfigFields customBossesConfigFields = CustomBossesConfig.getCustomBoss(fileName); + if (customBossesConfigFields == null) { + commandSender.sendMessage("Filename " + fileName + " is not valid! Make sure you are writing the name of a configuration file in the custombosses folder!"); + return; + } + CustomBossEntity customBossEntity = new CustomBossEntity(customBossesConfigFields); + customBossEntity.setSpawnLocation(location); + customBossEntity.spawn(false); + } catch (Exception e) { + commandSender.sendMessage("[EliteMobs] World argument was not valid!"); + } + + } + + public static void spawnCustomBossCommand(CommandSender commandSender, + String fileName, + String world, + Vector coords, + int level) { + try { + Location location = new Location(Bukkit.getWorld(world), coords.getX(), coords.getY(), coords.getZ()); + CustomBossesConfigFields customBossesConfigFields = CustomBossesConfig.getCustomBoss(fileName); + if (customBossesConfigFields == null) { + commandSender.sendMessage("Filename " + fileName + " is not valid! Make sure you are writing the name of a configuration file in the custombosses folder!"); + return; + } + CustomBossEntity customBossEntity = new CustomBossEntity(customBossesConfigFields); + customBossEntity.setSpawnLocation(location); + customBossEntity.setLevel(level); + customBossEntity.spawn(false); + } catch (Exception e) { + commandSender.sendMessage("[EliteMobs] World argument was not valid!"); + } + + } + + public static void spawnCustomBossCommand(Player player, String fileName, int level) { + CustomBossesConfigFields customBossesConfigFields = CustomBossesConfig.getCustomBoss(fileName); + if (customBossesConfigFields == null) { + player.sendMessage("Filename " + fileName + " is not valid! Make sure you are writing the name of a configuration file in the custombosses folder!"); + return; + } + CustomBossEntity customBossEntity = new CustomBossEntity(customBossesConfigFields); + customBossEntity.setSpawnLocation(getLocation(player)); + customBossEntity.setLevel(level); + customBossEntity.spawn(false); + } + + public static void spawnCustomBossCommand(Player player, String fileName) { + CustomBossesConfigFields customBossesConfigFields = CustomBossesConfig.getCustomBoss(fileName); + if (customBossesConfigFields == null) { + player.sendMessage("Filename " + fileName + " is not valid! Make sure you are writing the name of a configuration file in the custombosses folder!"); + return; + } + CustomBossEntity customBossEntity = new CustomBossEntity(customBossesConfigFields); + customBossEntity.setSpawnLocation(getLocation(player)); + customBossEntity.spawn(false); + } + + + private static Location getLocation(Player player) { + return player.getTargetBlock(null, 30).getLocation().add(0.5, 1, 0.5); + } + + private static HashSet getPowers(String[] mobPowers, CommandSender commandSender) { + + HashSet elitePowers = new HashSet<>(); + + for (String string : mobPowers) { + PowersConfigFields powersConfigFields = PowersConfig.getPower(string); + if (powersConfigFields == null) { + commandSender.sendMessage("[EliteMobs] Power " + string + " is not a valid power! Valid powers:"); + StringBuilder allPowers = new StringBuilder(); + for (CustomConfigFields iteratedField : ElitePower.getElitePowers().values()) + allPowers.append(iteratedField.getFilename()).append(", "); + allPowers.append("custom"); + commandSender.sendMessage(allPowers.toString()); + return new HashSet<>(); + } + elitePowers.add(powersConfigFields); + } + return elitePowers; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/SpawnElite.java b/src/main/java/com/magmaguy/elitemobs/commands/SpawnElite.java new file mode 100644 index 000000000..4823c0c5e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/SpawnElite.java @@ -0,0 +1,34 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.powers.meta.ElitePower; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class SpawnElite extends AdvancedCommand { + public SpawnElite() { + super(List.of("spawn")); + addLiteral("elite"); + addArgument("entityType", new ArrayList<>()); + addArgument("level", new ArrayList<>()); + addArgument("powers", ElitePower.getElitePowers().keySet().stream().toList()); + setUsage("/em spawn elite <...>"); + setPermission("elitemobs.place.admin"); + setSenderType(SenderType.PLAYER); + setDescription("Spawns an elite of the specified type and level, and optionally with the specified powers."); + } + + @Override + public void execute(CommandData commandData) { + SpawnCommand.spawnEliteEntityTypeCommand( + commandData.getPlayerSender(), + EntityType.valueOf(commandData.getStringArgument("entityType")), + commandData.getIntegerArgument("level"), + Optional.of(commandData.getStringSequenceArgument("powers"))); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/SpawnEliteAtCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/SpawnEliteAtCommand.java new file mode 100644 index 000000000..502bb1811 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/SpawnEliteAtCommand.java @@ -0,0 +1,44 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.powers.meta.ElitePower; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; +import org.bukkit.entity.EntityType; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public class SpawnEliteAtCommand extends AdvancedCommand { + public SpawnEliteAtCommand() { + super(List.of("spawn")); + addLiteral("eliteAt"); + addArgument("world", new ArrayList<>()); + addArgument("x", new ArrayList<>()); + addArgument("y", new ArrayList<>()); + addArgument("z", new ArrayList<>()); + addArgument("entityType", new ArrayList<>()); + addArgument("level", new ArrayList<>()); + addArgument("powers", ElitePower.getElitePowers().keySet().stream().toList()); + setUsage("/em spawn eliteAt <...>"); + setPermission("elitemobs.place.admin"); + setSenderType(SenderType.PLAYER); + setDescription("Spawns an elite of the specified type and level, optionally with specified powers, at the chosen location."); + } + + @Override + public void execute(CommandData commandData) { + SpawnCommand.spawnEliteEntityTypeCommand( + commandData.getPlayerSender(), + EntityType.valueOf(commandData.getStringArgument("entityType")), + commandData.getStringArgument("world"), + new Vector( + commandData.getIntegerArgument("x"), + commandData.getIntegerArgument("y"), + commandData.getIntegerArgument("z")), + commandData.getIntegerArgument("level"), + Optional.of(commandData.getStringSequenceArgument("powers"))); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/SpawnMobCommandHandler.java b/src/main/java/com/magmaguy/elitemobs/commands/SpawnMobCommandHandler.java deleted file mode 100644 index f1a072e90..000000000 --- a/src/main/java/com/magmaguy/elitemobs/commands/SpawnMobCommandHandler.java +++ /dev/null @@ -1,421 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.commands; - -import com.magmaguy.elitemobs.events.mobs.*; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobconstructor.SuperMobConstructor; -import com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs.EliteMobProperties; -import com.magmaguy.elitemobs.mobconstructor.mobdata.passivemobs.SuperMobProperties; -import com.magmaguy.elitemobs.mobpowers.ElitePower; -import com.magmaguy.elitemobs.mobpowers.defensivepowers.*; -import com.magmaguy.elitemobs.mobpowers.majorpowers.*; -import com.magmaguy.elitemobs.mobpowers.miscellaneouspowers.BonusLoot; -import com.magmaguy.elitemobs.mobpowers.miscellaneouspowers.MovementSpeed; -import com.magmaguy.elitemobs.mobpowers.miscellaneouspowers.Taunt; -import com.magmaguy.elitemobs.mobpowers.offensivepowers.*; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.command.BlockCommandSender; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; -import org.bukkit.entity.Squid; -import org.bukkit.util.Vector; - -import java.util.ArrayList; -import java.util.HashSet; - -import static com.magmaguy.elitemobs.EliteMobs.validWorldList; - -/** - * Created by MagmaGuy on 01/05/2017. - */ -public class SpawnMobCommandHandler { - - public static void spawnMob(CommandSender commandSender, String[] args) { - - Location location = getLocation(commandSender, args); - if (location == null) return; - - EntityType entityType = getEntityType(commandSender, args); - if (entityType == null) return; - - if (SuperMobProperties.isValidSuperMobType(entityType)) { - spawnSuperMob(entityType, location); - return; - } - - Integer mobLevel = getLevel(commandSender, args); - if (mobLevel == null) return; - - HashSet mobPowers = getPowers(commandSender, args); - - EliteMobEntity eliteMobEntity = new EliteMobEntity(entityType, location, mobLevel, mobPowers); - - } - - private static Location getLocation(CommandSender commandSender, String args[]) { - - if (commandSender instanceof Player) - return getLocation((Player) commandSender); - - - if (commandSender instanceof ConsoleCommandSender || commandSender instanceof BlockCommandSender) { - - World world = null; - - try { - - for (World worldIterator : validWorldList) - if (worldIterator.getName().equals(args[1])) - world = worldIterator; - - } catch (Exception e) { - - commandSender.sendMessage("[EliteMobs] Invalid world name when summoning Elite Mob."); - commandSender.sendMessage("[EliteMobs] Valid worlds:"); - for (World worldIterator : validWorldList) - commandSender.sendMessage(worldIterator.getName()); - commandSender.sendMessage("[EliteMobs] Is your world enabled in the ValidWorlds.yml config file?"); - return null; - - } - - double xCoord, yCoord, zCoord; - - try { - - xCoord = Double.parseDouble(args[2]); - yCoord = Double.parseDouble(args[3]); - zCoord = Double.parseDouble(args[4]); - - } catch (Exception e) { - - commandSender.sendMessage("[EliteMobs] Invalid X Y Z coordinates."); - return null; - - } - - return new Location(world, xCoord, yCoord, zCoord); - - } - - return null; - - } - - private static Location getLocation(Player player) { - return player.getTargetBlock(null, 30).getLocation().add(0.5, 1, 0.5); - } - - - private static EntityType getEntityType(CommandSender commandSender, String args[]) { - - String entityInput = ""; - - if (commandSender instanceof Player) { - - try { - - entityInput = args[1].toLowerCase(); - - } catch (Exception e) { - - commandSender.sendMessage("[EliteMobs] Error trying to obtain mob type."); - String validEntities = ""; - for (EntityType entities : EliteMobProperties.getValidMobTypes()) - validEntities += entities + ", "; - commandSender.sendMessage("[EliteMobs] Valid mob types:" + validEntities); - - } - - - } else if (commandSender instanceof ConsoleCommandSender || commandSender instanceof BlockCommandSender) { - - - try { - - entityInput = args[5].toLowerCase(); - - } catch (Exception e) { - - commandSender.sendMessage("[EliteMobs] Error trying to obtain mob type."); - String validEntities = ""; - for (EntityType entities : EliteMobProperties.getValidMobTypes()) - validEntities += entities + ", "; - commandSender.sendMessage("[EliteMobs] Valid mob types:" + validEntities); - - } - - } - - try { - return EntityType.valueOf(entityInput.toUpperCase()); - } catch (Exception ex) { - commandSender.sendMessage("[EliteMobs] Could not spawn mob type " + entityInput + - " If this is incorrect, please contact the dev."); - return null; - } - - } - - private static Integer getLevel(CommandSender commandSender, String args[]) { - - int mobLevel = 0; - - if (commandSender instanceof Player) { - - try { - - mobLevel = Integer.valueOf(args[2]); - - } catch (Error error) { - - commandSender.sendMessage("Error assigning mob level to Elite Mob. Mob level must be above 0."); - - } - - - } else if (commandSender instanceof ConsoleCommandSender || commandSender instanceof BlockCommandSender) { - - try { - - mobLevel = Integer.valueOf(args[6]); - - } catch (Error error) { - - commandSender.sendMessage("Error assigning mob level to Elite Mob. Mob level must be above 0."); - - } - - } - - if (mobLevel < 1) - mobLevel = 1; - - return mobLevel; - - } - - private static HashSet getPowers(CommandSender commandSender, String args[]) { - - ArrayList mobPowers = new ArrayList(); - - if (commandSender instanceof Player) { - - if (args.length > 3) { - - int index = 0; - - for (String arg : args) { - - //mob powers start after arg 2 - if (index > 2) - mobPowers.add(arg); - - index++; - - } - - } - - } else if (commandSender instanceof ConsoleCommandSender || commandSender instanceof BlockCommandSender) { - - if (args.length > 6) { - - int index = 0; - - for (String arg : args) { - - //mob powers start after arg 6 - if (index > 6) - mobPowers.add(arg); - - index++; - - } - - } - - } - - return getPowers(mobPowers, commandSender); - - } - - private static HashSet getPowers(ArrayList mobPowers, CommandSender commandSender) { - - HashSet elitePowers = new HashSet<>(); - - if (mobPowers.size() > 0) { - - for (String string : mobPowers) { - - switch (string.toLowerCase()) { - //major powers - case "zombiefriends": - elitePowers.add(new ZombieFriends()); - break; - case "zombienecronomicon": - elitePowers.add(new ZombieNecronomicon()); - break; - case "zombieteamrocket": - elitePowers.add(new ZombieTeamRocket()); - break; - case "zombieparents": - elitePowers.add(new ZombieParents()); - break; - case "zombiebloat": - elitePowers.add(new ZombieBloat()); - break; - case "skeletontrackingarrow": - elitePowers.add(new SkeletonTrackingArrow()); - break; - case "skeletonpillar": - elitePowers.add(new SkeletonPillar()); - break; - //minor powers - case "attackarrow": - elitePowers.add(new AttackArrow()); - break; - case "attackblinding": - elitePowers.add(new AttackBlinding()); - break; - case "attackconfusing": - elitePowers.add(new AttackConfusing()); - break; - case "attackfire": - elitePowers.add(new AttackConfusing()); - break; - case "attackfireball": - elitePowers.add(new AttackFireball()); - break; - case "attackfreeze": - elitePowers.add(new AttackFreeze()); - break; - case "attackgravity": - elitePowers.add(new AttackGravity()); - break; - case "attackpoison": - elitePowers.add(new AttackPoison()); - break; - case "attackpush": - elitePowers.add(new AttackPush()); - break; - case "attackweakness": - elitePowers.add(new AttackWeakness()); - break; - case "attackweb": - elitePowers.add(new AttackWeb()); - break; - case "attackwither": - elitePowers.add(new AttackWither()); - break; - case "bonusloot": - elitePowers.add(new BonusLoot()); - break; - case "invisibility": - elitePowers.add(new Invisibility()); - break; - case "invulnerabilityarrow": - elitePowers.add(new InvulnerabilityArrow()); - break; - case "invulnerabilityfalldamage": - elitePowers.add(new InvulnerabilityFallDamage()); - break; - case "invulnerabilityfire": - elitePowers.add(new InvulnerabilityFire()); - break; - case "invulnerabilityknockback": - elitePowers.add(new InvulnerabilityKnockback()); - break; - case "movementspeed": - elitePowers.add(new MovementSpeed()); - break; - case "taunt": - elitePowers.add(new Taunt()); - break; - default: - commandSender.sendMessage(string + " is not a valid power."); - commandSender.sendMessage("Valid powers: attackarrow, attackblinding, attackconfusing," + - " attackfire, attackfireball, attackfreeze,attackgravity, attackpoison, attackpush, " + - "attackweakness, attackweb, attackwither, bonusloot, invisibility, invulnerabilityarrow," + - "invulnerabilityfalldamage, invulnerabilityfire, invulnerabilityknockback, movementspeed," + - "taunt, zombiefriends, zombienecronomicon, zombieteamrocket, zombieteamrocket, zombieparents," + - "zombiebloat, skeletontrackingarrow, skeletonpillar"); - break; - - } - - } - - } - - return elitePowers; - - } - - private static void spawnSuperMob(EntityType entityType, Location location) { - SuperMobConstructor.constructSuperMob((LivingEntity) location.getWorld().spawnEntity(location, entityType)); - } - - public static void spawnBossMob(Player player, String[] args) { - - Location cursorLocation = player.getTargetBlock(null, 5).getLocation().add(new Vector(0.5, 2, 0.5)); - - if (args[1].equalsIgnoreCase("treasuregoblin")) { - - TreasureGoblin.createGoblin(cursorLocation); - player.sendMessage("Spawned treasure goblin"); - - } - - if (args[1].equalsIgnoreCase("zombieking")) { - - ZombieKing.spawnZombieKing(cursorLocation); - player.sendMessage("Spawned zombie king"); - - } - - if (args[1].equalsIgnoreCase("kraken")) { - - Squid squid = (Squid) cursorLocation.getWorld().spawnEntity(cursorLocation, EntityType.SQUID); - Kraken.spawnKraken(squid.getLocation()); - squid.remove(); - player.sendMessage("Spawned Kraken"); - - } - - if (args[1].equalsIgnoreCase("balrog")) { - - Balrog.spawnBalrog(cursorLocation); - player.sendMessage("Spawned Balrog"); - - } - - if (args[1].equalsIgnoreCase("fae")) { - - Fae.spawnFae(cursorLocation); - player.sendMessage("Spawned Fae"); - - } - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/SpawnTeleportCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/SpawnTeleportCommand.java new file mode 100644 index 000000000..d0e40f1d6 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/SpawnTeleportCommand.java @@ -0,0 +1,25 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.api.PlayerPreTeleportEvent; +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.List; + +public class SpawnTeleportCommand extends AdvancedCommand { + public SpawnTeleportCommand() { + super(List.of("spawntp")); + setPermission("elitemobs.teleport.spawn"); + setUsage("/em spawntp"); + setDescription("Teleports players to the server spawn."); + setSenderType(SenderType.PLAYER); + } + + @Override + public void execute(CommandData commandData) { + if (DefaultConfig.getDefaultSpawnLocation() != null) + PlayerPreTeleportEvent.teleportPlayer(commandData.getPlayerSender(), DefaultConfig.getDefaultSpawnLocation()); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/StartCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/StartCommand.java new file mode 100644 index 000000000..35f3162fe --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/StartCommand.java @@ -0,0 +1,28 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.instanced.MatchInstance; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; +import com.magmaguy.magmacore.util.Logger; + +import java.util.List; + +public class StartCommand extends AdvancedCommand { + public StartCommand() { + super(List.of("start")); + setUsage("/em start"); + setDescription("When in instanced content, makes the player start the instance."); + setSenderType(SenderType.PLAYER); + setPermission("elitemobs.instance.start"); + } + + @Override + public void execute(CommandData commandData) { + MatchInstance matchInstance = MatchInstance.getPlayerInstance(commandData.getPlayerSender()); + if (matchInstance != null) { + matchInstance.countdownMatch(); + } else + Logger.sendMessage(commandData.getCommandSender(), "You are not queued for instanced content!"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/StatsCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/StatsCommand.java new file mode 100644 index 000000000..db5660270 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/StatsCommand.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.List; + +public class StatsCommand extends AdvancedCommand { + public StatsCommand() { + super(List.of("stats")); + setUsage("/em stats"); + setPermission("elitemobs.stats"); + setSenderType(SenderType.PLAYER); + setDescription("Displays EliteMobs server stats."); + } + + @Override + public void execute(CommandData commandData) { + com.magmaguy.elitemobs.commands.admin.StatsCommand.statsHandler(commandData.getCommandSender()); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/StatsCommandHandler.java b/src/main/java/com/magmaguy/elitemobs/commands/StatsCommandHandler.java deleted file mode 100644 index 639fc0d2f..000000000 --- a/src/main/java/com/magmaguy/elitemobs/commands/StatsCommandHandler.java +++ /dev/null @@ -1,328 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.commands; - -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.DefaultConfig; -import org.bukkit.Bukkit; -import org.bukkit.World; -import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; - -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; - -import static com.magmaguy.elitemobs.EliteMobs.validWorldList; -import static org.bukkit.Bukkit.getLogger; -import static org.bukkit.Bukkit.getServer; - -/** - * Created by MagmaGuy on 01/05/2017. - */ -public class StatsCommandHandler { - - public static void statsHandler(CommandSender commandSender) { - - int mobLevelSavingsCount = 0; - int totalMobCount = 0; - int aggressiveCount = 0; - int passiveCount = 0; - int blazeCount = 0; - int caveSpiderCount = 0; - int creeperCount = 0; - int endermanCount = 0; - int endermiteCount = 0; - int huskCount = 0; - int ironGolemCount = 0; - int pigZombieCount = 0; - int polarBearCount = 0; - int silverfishCount = 0; - int skeletonCount = 0; - int spiderCount = 0; - int strayCount = 0; - int witchCount = 0; - int witherSkeletonCount = 0; - int zombieCount = 0; - int zombieVillagerCount = 0; - - int chickenCount = 0; - int cowCount = 0; - int mushroomCowCount = 0; - int pigCount = 0; - int sheepCount = 0; - - for (World world : validWorldList) { - - for (LivingEntity livingEntity : world.getLivingEntities()) { - - if (EntityTracker.isEliteMob(livingEntity) || - EntityTracker.isSuperMob(livingEntity)) { - - totalMobCount++; - - if (EntityTracker.isEliteMob(livingEntity)) { - - mobLevelSavingsCount += EntityTracker.getEliteMobEntity(livingEntity).getLevel(); - aggressiveCount++; - - switch (livingEntity.getType()) { - - case ZOMBIE: - zombieCount++; - break; - case HUSK: - huskCount++; - break; - case ZOMBIE_VILLAGER: - zombieVillagerCount++; - break; - case SKELETON: - skeletonCount++; - break; - case WITHER_SKELETON: - witherSkeletonCount++; - break; - case STRAY: - strayCount++; - break; - case PIG_ZOMBIE: - pigZombieCount++; - break; - case CREEPER: - creeperCount++; - break; - case SPIDER: - spiderCount++; - break; - case ENDERMAN: - endermanCount++; - break; - case CAVE_SPIDER: - caveSpiderCount++; - break; - case SILVERFISH: - silverfishCount++; - break; - case BLAZE: - blazeCount++; - break; - case WITCH: - witchCount++; - break; - case ENDERMITE: - endermiteCount++; - break; - case POLAR_BEAR: - polarBearCount++; - break; - case IRON_GOLEM: - ironGolemCount++; - break; - default: - getLogger().info("Error: Couldn't assign custom mob name due to unexpected aggressive boss mob (talk to the dev!)"); - getLogger().info("Missing mob type: " + livingEntity.getType()); - break; - } - - - } else if (EntityTracker.isSuperMob(livingEntity)) { - - //passive EliteMobs only stack at 50 right now - //TODO: redo this count at some other stage of this plugin's development - mobLevelSavingsCount += ConfigValues.defaultConfig.getInt(DefaultConfig.SUPERMOB_STACK_AMOUNT); - passiveCount++; - - switch (livingEntity.getType()) { - - case CHICKEN: - chickenCount++; - break; - case COW: - cowCount++; - break; - case MUSHROOM_COW: - mushroomCowCount++; - break; - case PIG: - pigCount++; - break; - case SHEEP: - sheepCount++; - break; - default: - getLogger().info("Error: Couldn't assign custom mob name due to unexpected passive boss mob (talk to the dev!)"); - getLogger().info("Missing mob type: " + livingEntity.getType()); - break; - - } - - } - - } - - } - - } - - if (commandSender instanceof Player) { - - Player player = (Player) commandSender; - - player.sendMessage("§5§m-----------------------------------------------------"); - player.sendMessage("§a§lEliteMobs v. " + Bukkit.getPluginManager().getPlugin(MetadataHandler.ELITE_MOBS).getDescription().getVersion() + " stats:"); - player.sendMessage("There are currently §l§6" + totalMobCount + " §f§rEliteMobs replacing §l§e" + - mobLevelSavingsCount + " §f§rregular mobs."); - - if (aggressiveCount > 0) { - - String aggressiveCountMessage = "§c" + aggressiveCount + " §4Aggressive EliteMobs: §f"; - - HashMap unsortedMobCount = new HashMap(); - - unsortedMobCountFilter(unsortedMobCount, blazeCount, "blazes"); - unsortedMobCountFilter(unsortedMobCount, caveSpiderCount, "cave spiders"); - unsortedMobCountFilter(unsortedMobCount, creeperCount, "creepers"); - unsortedMobCountFilter(unsortedMobCount, endermanCount, "endermen"); - unsortedMobCountFilter(unsortedMobCount, endermiteCount, "endermites"); - unsortedMobCountFilter(unsortedMobCount, huskCount, "husks"); - unsortedMobCountFilter(unsortedMobCount, pigZombieCount, "zombiepigmen"); - unsortedMobCountFilter(unsortedMobCount, polarBearCount, "polar bears"); - unsortedMobCountFilter(unsortedMobCount, silverfishCount, "silverfish"); - unsortedMobCountFilter(unsortedMobCount, skeletonCount, "skeletons"); - unsortedMobCountFilter(unsortedMobCount, spiderCount, "spiders"); - unsortedMobCountFilter(unsortedMobCount, strayCount, "strays"); - unsortedMobCountFilter(unsortedMobCount, witchCount, "witches"); - unsortedMobCountFilter(unsortedMobCount, witherSkeletonCount, "wither skeletons"); - unsortedMobCountFilter(unsortedMobCount, zombieCount, "zombie"); - unsortedMobCountFilter(unsortedMobCount, zombieVillagerCount, "zombie villagers"); - - player.sendMessage(messageStringAppender(aggressiveCountMessage, unsortedMobCount)); - - } - - if (passiveCount > 0) { - - String passiveCountMessage = "§b" + passiveCount + " §3Passive EliteMobs: §f"; - - HashMap unsortedMobCount = new HashMap(); - - unsortedMobCountFilter(unsortedMobCount, chickenCount, "chickens"); - unsortedMobCountFilter(unsortedMobCount, cowCount, "cows"); - unsortedMobCountFilter(unsortedMobCount, ironGolemCount, "iron golems"); - unsortedMobCountFilter(unsortedMobCount, mushroomCowCount, "mushroom cows"); - unsortedMobCountFilter(unsortedMobCount, pigCount, "pigs"); - unsortedMobCountFilter(unsortedMobCount, sheepCount, "sheep"); - - player.sendMessage(messageStringAppender(passiveCountMessage, unsortedMobCount)); - - } - - player.sendMessage("§5§m-----------------------------------------------------"); - - } else if (commandSender instanceof ConsoleCommandSender) { - - getServer().getConsoleSender().sendMessage("§5§m-------------------------------------------------------------"); - getServer().getConsoleSender().sendMessage("§a§lEliteMobs stats:"); - getServer().getConsoleSender().sendMessage("There are currently §l§6" + totalMobCount + " §f§rEliteMobs replacing §l§e" + - mobLevelSavingsCount + " §f§rregular mobs."); - - if (aggressiveCount > 0) { - - String aggressiveCountMessage = "§c" + aggressiveCount + " §4Aggressive EliteMobs: §f"; - - HashMap unsortedMobCount = new HashMap(); - - unsortedMobCountFilter(unsortedMobCount, blazeCount, "blazes"); - unsortedMobCountFilter(unsortedMobCount, caveSpiderCount, "cave spiders"); - unsortedMobCountFilter(unsortedMobCount, creeperCount, "creepers"); - unsortedMobCountFilter(unsortedMobCount, endermanCount, "endermen"); - unsortedMobCountFilter(unsortedMobCount, endermiteCount, "endermites"); - unsortedMobCountFilter(unsortedMobCount, huskCount, "husks"); - unsortedMobCountFilter(unsortedMobCount, ironGolemCount, "iron golems"); - unsortedMobCountFilter(unsortedMobCount, pigZombieCount, "zombiepigmen"); - unsortedMobCountFilter(unsortedMobCount, polarBearCount, "polar bears"); - unsortedMobCountFilter(unsortedMobCount, silverfishCount, "silverfish"); - unsortedMobCountFilter(unsortedMobCount, skeletonCount, "skeletons"); - unsortedMobCountFilter(unsortedMobCount, spiderCount, "spiders"); - unsortedMobCountFilter(unsortedMobCount, strayCount, "strays"); - unsortedMobCountFilter(unsortedMobCount, witchCount, "witches"); - unsortedMobCountFilter(unsortedMobCount, witherSkeletonCount, "wither skeletons"); - unsortedMobCountFilter(unsortedMobCount, zombieCount, "zombie"); - unsortedMobCountFilter(unsortedMobCount, zombieVillagerCount, "zombie villagers"); - - getServer().getConsoleSender().sendMessage(messageStringAppender(aggressiveCountMessage, unsortedMobCount)); - - } - - if (passiveCount > 0) { - - String passiveCountMessage = "§b" + passiveCount + " §3Passive EliteMobs: §f"; - - HashMap unsortedMobCount = new HashMap(); - - unsortedMobCountFilter(unsortedMobCount, chickenCount, "chickens"); - unsortedMobCountFilter(unsortedMobCount, cowCount, "cows"); - unsortedMobCountFilter(unsortedMobCount, mushroomCowCount, "mushroom cows"); - unsortedMobCountFilter(unsortedMobCount, pigCount, "pigs"); - unsortedMobCountFilter(unsortedMobCount, sheepCount, "sheep"); - - getServer().getConsoleSender().sendMessage(messageStringAppender(passiveCountMessage, unsortedMobCount)); - - } - - getServer().getConsoleSender().sendMessage("§5§m-------------------------------------------------------------"); - - } - - } - - private static void unsortedMobCountFilter(HashMap unsortedMobCount, int count, String mobTypeName) { - - if (count > 0) { - - unsortedMobCount.put(mobTypeName, count); - - } - - } - - private static String messageStringAppender(String countMessage, HashMap unsortedMobCount) { - - Iterator iterator = unsortedMobCount.entrySet().iterator(); - - while (iterator.hasNext()) { - - Map.Entry pair = (Map.Entry) iterator.next(); - - String mobCountString = "§6§l" + pair.getValue(); - String commaString = ","; - String spacing = " "; - String mobNameString = "§r§f" + pair.getKey(); - - countMessage += commaString + spacing + mobCountString + spacing + mobNameString; - - } - - return countMessage; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/TierSetSpawner.java b/src/main/java/com/magmaguy/elitemobs/commands/TierSetSpawner.java deleted file mode 100644 index f8fe78065..000000000 --- a/src/main/java/com/magmaguy/elitemobs/commands/TierSetSpawner.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.magmaguy.elitemobs.commands; - -import org.bukkit.Material; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -public class TierSetSpawner { - - public static void spawnTierItem(int tierLevel, Player player) { - - ItemStack helmet = new ItemStack(Material.DIAMOND_HELMET); - ItemStack chestplate = new ItemStack(Material.DIAMOND_CHESTPLATE); - ItemStack leggings = new ItemStack(Material.DIAMOND_LEGGINGS); - ItemStack boots = new ItemStack(Material.DIAMOND_BOOTS); - ItemStack sword = new ItemStack(Material.DIAMOND_SWORD); - ItemStack axe = new ItemStack(Material.DIAMOND_AXE); - ItemStack bow = new ItemStack(Material.BOW); - - if (tierLevel > 1) { - - applyEnchantment(helmet, Enchantment.PROTECTION_ENVIRONMENTAL, tierLevel); - applyEnchantment(chestplate, Enchantment.PROTECTION_ENVIRONMENTAL, tierLevel); - applyEnchantment(leggings, Enchantment.PROTECTION_ENVIRONMENTAL, tierLevel); - applyEnchantment(boots, Enchantment.PROTECTION_ENVIRONMENTAL, tierLevel); - applyEnchantment(sword, Enchantment.DAMAGE_ALL, tierLevel); - applyEnchantment(axe, Enchantment.DAMAGE_ALL, tierLevel); - applyEnchantment(bow, Enchantment.ARROW_DAMAGE, tierLevel); - - } - - player.getInventory().addItem(helmet); - player.getInventory().addItem(chestplate); - player.getInventory().addItem(leggings); - player.getInventory().addItem(boots); - player.getInventory().addItem(sword); - player.getInventory().addItem(axe); - player.getInventory().addItem(bow); - - return; - - } - - private static void applyEnchantment(ItemStack itemStack, Enchantment enchantment, int tierLevel) { - - ItemMeta newItemMeta = itemStack.getItemMeta(); - newItemMeta.addEnchant(enchantment, tierLevel - 1, true); - itemStack.setItemMeta(newItemMeta); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/TrackBossCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/TrackBossCommand.java new file mode 100644 index 000000000..02a58b06b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/TrackBossCommand.java @@ -0,0 +1,39 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; +import com.magmaguy.magmacore.util.Logger; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +public class TrackBossCommand extends AdvancedCommand { + public TrackBossCommand() { + super(List.of("track")); + addLiteral("boss"); + addArgument("id", new ArrayList<>()); + setDescription("Tracks a Custom Boss."); + setUsage("/em track boss "); + setSenderType(SenderType.PLAYER); + setPermission("elitemobs.boss.track"); + } + + @Override + public void execute(CommandData commandData) { + try { + for (CustomBossEntity customBossEntity : CustomBossEntity.getTrackableCustomBosses()) + if (customBossEntity.getEliteUUID().equals(UUID.fromString(commandData.getStringArgument("id")))) { + customBossEntity.getCustomBossBossBar().addTrackingPlayer(commandData.getPlayerSender()); + return; + } + Logger.sendMessage(commandData.getCommandSender(), DefaultConfig.getBossAlreadyGoneMessage()); + } catch (Exception ex) { + //happens when players try to track an entity that has despawned for any reason + Logger.sendMessage(commandData.getCommandSender(), DefaultConfig.getBossAlreadyGoneMessage()); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/TransitiveBlocksCancelCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/TransitiveBlocksCancelCommand.java new file mode 100644 index 000000000..5a321f703 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/TransitiveBlocksCancelCommand.java @@ -0,0 +1,24 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.mobconstructor.custombosses.transitiveblocks.TransitiveBlockCommand; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.List; + +public class TransitiveBlocksCancelCommand extends AdvancedCommand { + public TransitiveBlocksCancelCommand() { + super(List.of("transitiveBlocks")); + addLiteral("cancel"); + setUsage("/em transitiveBlocks cancel"); + setDescription("Cancels transitive block registration."); + setSenderType(SenderType.PLAYER); + setPermission("elitemobs.transitiveblocks"); + } + + @Override + public void execute(CommandData commandData) { + TransitiveBlockCommand.processCommand(commandData.getPlayerSender()); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/TransitiveBlocksEditAreaCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/TransitiveBlocksEditAreaCommand.java new file mode 100644 index 000000000..d1a14a2b8 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/TransitiveBlocksEditAreaCommand.java @@ -0,0 +1,32 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfig; +import com.magmaguy.elitemobs.mobconstructor.custombosses.transitiveblocks.TransitiveBlockCommand; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.List; + +public class TransitiveBlocksEditAreaCommand extends AdvancedCommand { + public TransitiveBlocksEditAreaCommand() { + super(List.of("transitiveBlocks")); + addLiteral("editArea"); + addArgument("filename", CustomBossesConfig.getCustomBosses().keySet().stream().toList()); + addArgument("type", List.of("ON_SPAWN", "ON_REMOVE")); + setUsage("/em transitiveBlocks editArea "); + setPermission("elitemobs.transitiveblocks"); + setDescription("Edits large transitive blocks areas for use by regional bosses."); + setSenderType(SenderType.PLAYER); + } + + @Override + public void execute(CommandData commandData) { + TransitiveBlockCommand.processCommand( + commandData.getPlayerSender(), + commandData.getStringArgument("filename"), + commandData.getStringArgument("type"), + true, + true); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/TransitiveBlocksEditCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/TransitiveBlocksEditCommand.java new file mode 100644 index 000000000..db6a54c7f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/TransitiveBlocksEditCommand.java @@ -0,0 +1,31 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfig; +import com.magmaguy.elitemobs.mobconstructor.custombosses.transitiveblocks.TransitiveBlockCommand; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.List; + +public class TransitiveBlocksEditCommand extends AdvancedCommand { + public TransitiveBlocksEditCommand() { + super(List.of("transitiveBlocks")); + addLiteral("edit"); + addArgument("filename", CustomBossesConfig.getCustomBosses().keySet().stream().toList()); + addArgument("type", List.of("ON_SPAWN", "ON_REMOVE")); + setUsage("/em transitiveBlocks edit "); + setDescription("Edits transitive blocks for use by regional bosses."); + setSenderType(SenderType.PLAYER); + setPermission("elitemobs.transitiveblocks"); + } + + @Override + public void execute(CommandData commandData) { + TransitiveBlockCommand.processCommand( + commandData.getPlayerSender(), + commandData.getStringArgument("filename"), + commandData.getStringArgument("type"), + true); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/TransitiveBlocksRegisterAreaCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/TransitiveBlocksRegisterAreaCommand.java new file mode 100644 index 000000000..c68cb1115 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/TransitiveBlocksRegisterAreaCommand.java @@ -0,0 +1,32 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfig; +import com.magmaguy.elitemobs.mobconstructor.custombosses.transitiveblocks.TransitiveBlockCommand; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.List; + +public class TransitiveBlocksRegisterAreaCommand extends AdvancedCommand { + public TransitiveBlocksRegisterAreaCommand() { + super(List.of("transitiveBlocks")); + addLiteral("registerArea"); + addArgument("filename", CustomBossesConfig.getCustomBosses().keySet().stream().toList()); + addArgument("type", List.of("ON_SPAWN", "ON_REMOVE")); + setUsage("/em transitiveBlocks registerArea "); + setDescription("Registers large transitive blocks areas for use by regional bosses."); + setSenderType(SenderType.PLAYER); + setPermission("elitemobs.transitiveblocks"); + } + + @Override + public void execute(CommandData commandData) { + TransitiveBlockCommand.processCommand( + commandData.getPlayerSender(), + commandData.getStringArgument("filename"), + commandData.getStringArgument("type"), + false, + true); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/TransitiveBlocksRegisterCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/TransitiveBlocksRegisterCommand.java new file mode 100644 index 000000000..22504ebed --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/TransitiveBlocksRegisterCommand.java @@ -0,0 +1,30 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfig; +import com.magmaguy.elitemobs.mobconstructor.custombosses.transitiveblocks.TransitiveBlockCommand; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.List; + +public class TransitiveBlocksRegisterCommand extends AdvancedCommand { + public TransitiveBlocksRegisterCommand() { + super(List.of("transitiveBlocks")); + addLiteral("register"); + addArgument("filename", CustomBossesConfig.getCustomBosses().keySet().stream().toList()); + addArgument("type", List.of("ON_SPAWN", "ON_REMOVE")); + setUsage("/em transitiveBlocks register "); + setDescription("Registers transitive blocks for use by regional bosses."); + setSenderType(SenderType.PLAYER); + setPermission("elitemobs.transitiveblocks"); + } + + @Override + public void execute(CommandData commandData) { + TransitiveBlockCommand.processCommand( + commandData.getPlayerSender(), + commandData.getStringArgument("filename"), + commandData.getStringArgument("type"), false); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/TriggerEventHandler.java b/src/main/java/com/magmaguy/elitemobs/commands/TriggerEventHandler.java deleted file mode 100644 index 53218c106..000000000 --- a/src/main/java/com/magmaguy/elitemobs/commands/TriggerEventHandler.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.magmaguy.elitemobs.commands; - -import com.magmaguy.elitemobs.events.DeadMoon; -import com.magmaguy.elitemobs.events.SmallTreasureGoblin; -import org.bukkit.command.CommandSender; - -public class TriggerEventHandler { - - public static void triggerEventCommand(CommandSender commandSender, String[] args){ - - if (CommandHandler.permCheck(CommandHandler.EVENT_LAUNCH_SMALLTREASUREGOBLIN, commandSender) && args[1].equalsIgnoreCase("smalltreasuregoblin")) { - SmallTreasureGoblin.initializeEvent(); - commandSender.sendMessage("Queued small treasure goblin event for next valid zombie spawn"); - } - if (CommandHandler.permCheck(CommandHandler.EVENT_LAUNCH_DEADMOON, commandSender) && args[1].equalsIgnoreCase("deadmoon")) { - DeadMoon.initializeEvent(); - commandSender.sendMessage("Queued deadmoon event for next new moon"); - } - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/UnbindCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/UnbindCommand.java new file mode 100644 index 000000000..742eb9385 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/UnbindCommand.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.commands.guild.AdventurersGuildCommand; +import com.magmaguy.elitemobs.menus.UnbindMenu; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; + +import java.util.List; + +public class UnbindCommand extends AdvancedCommand { + public UnbindCommand() { + super(List.of("unbind")); + setUsage("/em unbind"); + setPermission("elitemobs.unbind.command"); + setSenderType(SenderType.PLAYER); + setDescription("Opens the unbind menu or teleports the player to the Adventurer's Guild Hub."); + } + + @Override + public void execute(CommandData commandData) { + if (!AdventurersGuildCommand.adventurersGuildTeleport(commandData.getPlayerSender())) { + UnbindMenu unbindMenu = new UnbindMenu(); + unbindMenu.constructUnbinderMenu(commandData.getPlayerSender()); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/UnbindForceCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/UnbindForceCommand.java new file mode 100644 index 000000000..f853fa85b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/UnbindForceCommand.java @@ -0,0 +1,28 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.items.ItemTagger; +import com.magmaguy.elitemobs.items.customenchantments.SoulbindEnchantment; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.command.SenderType; +import org.bukkit.inventory.ItemStack; + +import java.util.List; + +public class UnbindForceCommand extends AdvancedCommand { + public UnbindForceCommand() { + super(List.of("unbind")); + addLiteral("force"); + setUsage("/em unbind force"); + setSenderType(SenderType.PLAYER); + setPermission("elitemobs.unbind.force"); + setDescription("Forcefully unbinds a held item."); + } + + @Override + public void execute(CommandData commandData) { + ItemStack itemStack = commandData.getPlayerSender().getInventory().getItemInMainHand(); + if (ItemTagger.isEliteItem(itemStack)) + SoulbindEnchantment.removeEnchantment(itemStack); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/VersionCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/VersionCommand.java new file mode 100644 index 000000000..3a7669ba6 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/VersionCommand.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.commands; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.magmacore.command.AdvancedCommand; +import com.magmaguy.magmacore.command.CommandData; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; + +import java.util.List; + +public class VersionCommand extends AdvancedCommand { + public VersionCommand() { + super(List.of("version")); + setUsage("/em version"); + setPermission("elitemobs.version"); + setDescription("Checks the server's EliteMobs plugin version."); + } + + @Override + public void execute(CommandData commandData) { + Logger.sendMessage( + commandData.getCommandSender(), + ChatColor.WHITE + " version " + ChatColor.GREEN + Bukkit.getPluginManager().getPlugin(MetadataHandler.ELITE_MOBS).getDescription().getVersion()); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/commands/VersionHandler.java b/src/main/java/com/magmaguy/elitemobs/commands/VersionHandler.java deleted file mode 100644 index a3962ffb4..000000000 --- a/src/main/java/com/magmaguy/elitemobs/commands/VersionHandler.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.magmaguy.elitemobs.commands; - -import com.magmaguy.elitemobs.MetadataHandler; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; - -public class VersionHandler { - - public static void versionCommand(CommandSender commandSender, String[] args){ - - commandSender.sendMessage(ChatColor.DARK_GREEN + "[EliteMobs]" + ChatColor.WHITE + " version " + ChatColor.GREEN + - Bukkit.getPluginManager().getPlugin(MetadataHandler.ELITE_MOBS).getDescription().getVersion()); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/admin/DebugScreen.java b/src/main/java/com/magmaguy/elitemobs/commands/admin/DebugScreen.java new file mode 100644 index 000000000..e39885c30 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/admin/DebugScreen.java @@ -0,0 +1,86 @@ +package com.magmaguy.elitemobs.commands.admin; + +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.RegionalBossEntity; +import com.magmaguy.elitemobs.playerdata.statusscreen.PlayerStatusScreen; +import com.magmaguy.elitemobs.utils.BookMaker; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.SpigotMessage; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import java.util.Locale; + +public class DebugScreen { + + public static void open(Player player, String argument) { + if (Bukkit.getPlayer(argument) != null) + new PlayerStatusScreen(player, Bukkit.getPlayer(argument)); + else openBossScreen(player, argument); + } + + private static void openBossScreen(Player player, String argument) { + + TextComponent[] pages = new TextComponent[100]; + + int counter = 0; + for (EliteEntity eliteEntity : EntityTracker.getEliteMobEntities().values()) + if (!(eliteEntity instanceof RegionalBossEntity)) + if (eliteEntity instanceof CustomBossEntity) { + TextComponent textComponent = generateEntry((CustomBossEntity) eliteEntity, argument, player); + if (textComponent == null) continue; + pages[counter] = textComponent; + counter++; + } + + for (RegionalBossEntity regionalBossEntity : RegionalBossEntity.getRegionalBossEntities()) { + TextComponent textComponent = generateEntry(regionalBossEntity, argument, player); + if (textComponent == null) continue; + pages[counter] = textComponent; + counter++; + } + + BookMaker.generateBook(player, pages); + + } + + private static TextComponent generateEntry(CustomBossEntity customBossEntity, String argument, Player player) { + if (!customBossEntity.getCustomBossesConfigFields().getFilename().contains(argument) && + !customBossEntity.getCustomBossesConfigFields().getName().toLowerCase(Locale.ROOT).contains(argument.toLowerCase(Locale.ROOT))) + return null; + TextComponent page = new TextComponent(); + page.addExtra(customBossEntity.getCustomBossesConfigFields().getFilename() + "\n"); + page.addExtra("Name: " + ChatColorConverter.convert(customBossEntity.getCustomBossesConfigFields().getName()) + ChatColor.BLACK + "\n"); + page.addExtra("Level: " + customBossEntity.getCustomBossesConfigFields().getLevel() + "\n"); + if (customBossEntity.getLivingEntity() != null) { + page.addExtra("Is Alive (MC): " + !customBossEntity.getLivingEntity().isDead() + "\n"); + page.addExtra(SpigotMessage.commandHoverMessage(ChatColor.BLUE + "XYZ: " + "\n", + customBossEntity.getLocation().getBlockX() + ", " + + customBossEntity.getLocation().getBlockY() + ", " + + customBossEntity.getLocation().getBlockZ() + "\n" + + ChatColor.BLUE + "Click to teleport! (if alive)", + "/em debugtp " + customBossEntity.getEliteUUID().toString())); + page.addExtra("Has AI: " + !customBossEntity.getLivingEntity().hasAI() + "\n"); + } else + page.addExtra("Is Alive (MC): false\n"); + if (customBossEntity.getLocation() != null && player.getWorld().equals(customBossEntity.getLocation().getWorld())) + page.addExtra(SpigotMessage.hoverMessage(ChatColor.BLUE + "Spawn distance", + "Spawn distance: X=" + (int) (player.getLocation().getX() - customBossEntity.getSpawnLocation().getX()) + + " | Y=" + (int) (player.getLocation().getY() - customBossEntity.getSpawnLocation().getY()) + + " | Z=" + (int) (player.getLocation().getZ() - customBossEntity.getSpawnLocation().getZ()) + "\n")); + page.addExtra("Is Persistent: " + customBossEntity.getCustomBossesConfigFields().isPersistent() + "\n"); + if (customBossEntity instanceof RegionalBossEntity) { + page.addExtra("Is Respawning: " + ((RegionalBossEntity) customBossEntity).isRespawning() + "\n"); + } + + page.addExtra(SpigotMessage.commandHoverMessage(ChatColor.BLUE + "Boss trace!", + "Remember, it requires debug mode to be on! This is used for advanced debugging, ask on discord if you want to know more about it.", + "/elitemobs trace " + customBossEntity.getEliteUUID().toString())); + return page; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/admin/EventCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/admin/EventCommand.java new file mode 100644 index 000000000..4c0f6bafb --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/admin/EventCommand.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.commands.admin; + +import com.magmaguy.elitemobs.events.TimedEvent; +import com.magmaguy.magmacore.util.ChatColorConverter; +import org.bukkit.command.CommandSender; + +public class EventCommand { + private EventCommand() { + } + + public static void trigger(CommandSender commandSender, String eventName) { + for (TimedEvent timedEvent : TimedEvent.getBlueprintEvents()) + if (timedEvent.getCustomEventsConfigFields().getFilename().equals(eventName)) { + timedEvent.instantiateEvent(); + commandSender.sendMessage(ChatColorConverter.convert("&8[EliteMobs] Queued event " + eventName + " for the next valid time it can spawn. &cThis might take a while depending on the start conditions of the event.")); + return; + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/admin/GetTierCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/admin/GetTierCommand.java new file mode 100644 index 000000000..8cbeb76d8 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/admin/GetTierCommand.java @@ -0,0 +1,79 @@ +package com.magmaguy.elitemobs.commands.admin; + +import com.magmaguy.elitemobs.api.utils.EliteItemManager; +import com.magmaguy.elitemobs.items.EliteItemLore; +import com.magmaguy.elitemobs.items.ItemTagger; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +public class GetTierCommand { + private GetTierCommand() { + } + + public static void get(Player player, int tierLevel) { + + ItemStack helmet = new ItemStack(Material.IRON_HELMET); + addDurability(helmet); + ItemStack chestplate = new ItemStack(Material.IRON_CHESTPLATE); + addDurability(chestplate); + ItemStack leggings = new ItemStack(Material.IRON_LEGGINGS); + addDurability(leggings); + ItemStack boots = new ItemStack(Material.IRON_BOOTS); + addDurability(boots); + ItemStack sword = new ItemStack(Material.IRON_SWORD); + addDurability(sword); + ItemStack axe = new ItemStack(Material.IRON_AXE); + addDurability(axe); + ItemStack bow = new ItemStack(Material.BOW); + addDurability(boots); + ItemStack cheatSword = new ItemStack(Material.NETHERITE_SWORD); + addDurability(cheatSword); + + EliteItemManager.setEliteLevel(helmet, tierLevel); + EliteItemManager.setEliteLevel(chestplate, tierLevel); + EliteItemManager.setEliteLevel(leggings, tierLevel); + EliteItemManager.setEliteLevel(boots, tierLevel); + EliteItemManager.setEliteLevel(sword, tierLevel); + EliteItemManager.setEliteLevel(axe, tierLevel); + EliteItemManager.setEliteLevel(bow, tierLevel); + EliteItemManager.setEliteLevel(cheatSword, tierLevel); + ItemMeta cheatItemMeta = cheatSword.getItemMeta(); + cheatItemMeta.setDisplayName("CHEAT SWORD"); + ItemTagger.registerEnchantment(cheatItemMeta, Enchantment.SHARPNESS.getKey(), 100); + cheatSword.setItemMeta(cheatItemMeta); + + new EliteItemLore(helmet, false); + new EliteItemLore(leggings, false); + new EliteItemLore(boots, false); + new EliteItemLore(sword, false); + new EliteItemLore(axe, false); + new EliteItemLore(cheatSword, false); + new EliteItemLore(chestplate, false); + new EliteItemLore(bow, false); + + + player.getInventory().setHelmet(helmet); + player.getInventory().setChestplate(chestplate); + player.getInventory().setLeggings(leggings); + player.getInventory().setBoots(boots); + player.getInventory().addItem(sword); + player.getInventory().addItem(axe); + player.getInventory().addItem(bow); + player.getInventory().addItem(cheatSword); + player.getInventory().addItem(new ItemStack(Material.COOKED_BEEF, 64)); + player.getInventory().addItem(new ItemStack(Material.ARROW, 64)); + player.getInventory().addItem(new ItemStack(Material.ARROW, 64)); + player.getInventory().addItem(new ItemStack(Material.SHIELD)); + + } + + private static void addDurability(ItemStack itemStack) { + ItemMeta itemMeta = itemStack.getItemMeta(); + itemMeta.addEnchant(Enchantment.UNBREAKING, 5, true); + itemStack.setItemMeta(itemMeta); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/admin/KillHandler.java b/src/main/java/com/magmaguy/elitemobs/commands/admin/KillHandler.java new file mode 100644 index 000000000..fa37074fe --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/admin/KillHandler.java @@ -0,0 +1,64 @@ +package com.magmaguy.elitemobs.commands.admin; + +import com.magmaguy.elitemobs.api.internal.RemovalReason; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs.EliteMobProperties; +import com.magmaguy.magmacore.util.ChatColorConverter; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; + +import java.util.ArrayList; + +public class KillHandler { + + //TODO: FIX NPE ISSUE YOU FUCKING MORON + + public static void killAggressiveMobs(CommandSender commandSender) { + int counter = 0; + for (EliteEntity eliteEntity : new ArrayList<>(EntityTracker.getEliteMobEntities().values())) { + eliteEntity.remove(RemovalReason.OTHER); + counter++; + } + commandSender.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &4Killed " + counter + " Elite Mobs.")); + } + + public static void killEntityType(CommandSender commandSender, EntityType entityType) { + if (EliteMobProperties.getValidMobTypes().contains(entityType)) { + int counter = 0; + for (EliteEntity eliteEntity : EntityTracker.getEliteMobEntities().values()) { + if (!eliteEntity.getLivingEntity().getType().equals(entityType)) continue; + eliteEntity.remove(RemovalReason.OTHER); + counter++; + } + commandSender.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &4Killed " + counter + " Elite " + entityType.toString() + ".")); + } else + commandSender.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &cNot a valid entity type for EliteMobs!")); + } + + public static void radiusKillAggressiveMobs(Player player, int radius) { + int counter = 0; + for (Entity entity : player.getNearbyEntities(radius, radius, radius)) { + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(entity); + if (eliteEntity != null) + eliteEntity.remove(RemovalReason.OTHER); + } + player.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &4Killed " + counter + " Elite Mobs.")); + } + + public static void radiusKillSpecificMobs(Player player, EntityType entityType, int radius) { + int counter = 0; + for (Entity entity : player.getNearbyEntities(radius, radius, radius)) { + if (!entity.getType().equals(entityType)) continue; + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(entity); + if (eliteEntity != null) { + ((EliteEntity) entity).remove(RemovalReason.OTHER); + counter++; + } + } + player.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &4Killed " + counter + " Elite Mobs.")); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/admin/LootCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/admin/LootCommand.java new file mode 100644 index 000000000..77871fb0e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/admin/LootCommand.java @@ -0,0 +1,38 @@ +package com.magmaguy.elitemobs.commands.admin; + +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import com.magmaguy.magmacore.util.ChatColorConverter; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +/** + * Created by MagmaGuy on 01/05/2017. + */ +public class LootCommand { + + public static void get(Player player, String args1) { + CustomItem customItem = CustomItem.getCustomItem(args1); + if (customItem == null) { + player.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &cFile name " + args1 + " &cis not a valid custom item file name!")); + return; + } + player.getInventory().addItem(customItem.generateDefaultsItemStack(player, false, null, true)); + } + + public static void give(CommandSender commandSender, String playerString, String args1) { + CustomItem customItem = CustomItem.getCustomItem(args1); + if (customItem == null) { + commandSender.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &cFile name " + args1 + " &cis not a valid custom item file name!")); + return; + } + Player player = Bukkit.getPlayer(playerString); + if (player == null) + commandSender.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &cTried to give item to invalid player!")); + else { + player.getInventory().addItem(customItem.generateDefaultsItemStack(player, false, null)); + commandSender.sendMessage("[EliteMobs] Successfully gave " + player.getName() + " item " + customItem.getCustomItemsConfigFields().getName()); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/admin/NPCCommands.java b/src/main/java/com/magmaguy/elitemobs/commands/admin/NPCCommands.java new file mode 100644 index 000000000..d9bcc72f0 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/admin/NPCCommands.java @@ -0,0 +1,35 @@ +package com.magmaguy.elitemobs.commands.admin; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfig; +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCEntity; +import com.magmaguy.magmacore.util.Round; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +public class NPCCommands { + + public static void set(Player player, String npcFileName) { + + NPCsConfigFields npCsConfigFields = NPCsConfig.getNpcEntities().get(npcFileName); + if (npCsConfigFields == null) { + player.sendMessage("[EliteMobs] Invalid NPC filename."); + return; + } + + Location playerLocation = player.getLocation(); + + String location = playerLocation.getWorld().getName() + "," + + Round.twoDecimalPlaces(playerLocation.getX()) + "," + + Round.twoDecimalPlaces(playerLocation.getY()) + "," + + Round.twoDecimalPlaces(playerLocation.getZ()) + "," + + Round.twoDecimalPlaces(playerLocation.getYaw()) + "," + + Round.twoDecimalPlaces(playerLocation.getPitch()); + + npCsConfigFields.setEnabled(true); + npCsConfigFields.setSpawnLocation(location); + new NPCEntity(npCsConfigFields, location); + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/admin/RelativeCoordinatesCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/admin/RelativeCoordinatesCommand.java new file mode 100644 index 000000000..ebbf4f598 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/admin/RelativeCoordinatesCommand.java @@ -0,0 +1,44 @@ +package com.magmaguy.elitemobs.commands.admin; + +import com.magmaguy.elitemobs.dungeons.EMPackage; +import com.magmaguy.elitemobs.powerstances.GenericRotationMatrixMath; +import com.magmaguy.magmacore.util.ChatColorConverter; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.util.Vector; + +public class RelativeCoordinatesCommand { + public static void get(Player player, String minidungeonString) { + + EMPackage emPackage = EMPackage.getEmPackages().get(minidungeonString); + if (emPackage == null) { + player.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &4Minidungeons name " + minidungeonString + " &4isn't valid!")); + return; + } + + if (!emPackage.isInstalled()) { + player.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &4Minidungeon isn't installed! Can't get the relative location for uninstalled Minidungeons!")); + return; + } + + Location anchorpoint = emPackage.getDungeonPackagerConfigFields().getAnchorPoint(); + + if (anchorpoint == null) { + player.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &4Something went wrong and made the anchor point not valid!")); + return; + } + + Vector relativeVector = player.getLocation().clone().subtract(anchorpoint).toVector(); + if (emPackage.getDungeonPackagerConfigFields().getCalculatedRotation() != 0) + GenericRotationMatrixMath.rotateVectorYAxis(emPackage.getDungeonPackagerConfigFields().getCalculatedRotation(), anchorpoint, relativeVector); + + String relativePosition = relativeVector.getBlockX() + ", " + + relativeVector.getBlockY() + ", " + + relativeVector.getBlockZ(); + + player.sendMessage(ChatColorConverter.convert( + "[EliteMobs] Relative position to anchor point of " + emPackage.getDungeonPackagerConfigFields().getName() + ": " + relativePosition)); + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/admin/RemoveCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/admin/RemoveCommand.java new file mode 100644 index 000000000..e752f0de5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/admin/RemoveCommand.java @@ -0,0 +1,86 @@ +package com.magmaguy.elitemobs.commands.admin; + +import com.magmaguy.elitemobs.api.internal.RemovalReason; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.RegionalBossEntity; +import com.magmaguy.elitemobs.npcs.NPCEntity; +import com.magmaguy.elitemobs.treasurechest.TreasureChest; +import com.magmaguy.magmacore.util.ChatColorConverter; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + +public class RemoveCommand { + private static final Set removingPlayers = new HashSet<>(); + + private RemoveCommand() { + } + + public static void remove(Player player) { + if (removingPlayers.contains(player.getUniqueId())) { + player.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &aYou are no longer removing elites!")); + removingPlayers.remove(player.getUniqueId()); + } else { + removingPlayers.add(player.getUniqueId()); + player.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &cYou are now removing elites when you punch them! Run &a/em remove &cagain to stop removing elites!")); + } + } + + public static class RemoveCommandEvents implements Listener { + @EventHandler(ignoreCancelled = true) + public void quitEvent(PlayerQuitEvent event) { + removingPlayers.remove(event.getPlayer().getUniqueId()); + } + + @EventHandler(priority = EventPriority.LOWEST) + public void removeEliteEntity(EntityDamageByEntityEvent event) { + if (!removingPlayers.contains(event.getDamager().getUniqueId())) return; + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(event.getEntity()); + if (eliteEntity == null) { + event.getDamager().sendMessage(ChatColorConverter.convert("&8[EliteMobs] The entity you just removed was not an EliteMobs entity. EliteMobs will still attempt to remove it though.")); + event.getDamager().sendMessage(ChatColorConverter.convert("&8[EliteMobs] If the entity is supposed to be an EliteMobs entity, it is highly likely some other plugin hijacked the entity and changed it in a way that made EliteMobs unable to recognize it anymore.")); + event.getEntity().remove(); + return; + } + if (eliteEntity instanceof RegionalBossEntity) + event.getDamager().sendMessage(ChatColorConverter.convert( + "&8[EliteMobs] &cRemoved a spawn location for boss " + + ((RegionalBossEntity) eliteEntity).getCustomBossesConfigFields().getFilename())); + eliteEntity.remove(RemovalReason.REMOVE_COMMAND); + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOWEST) + public void removeNPC(EntityDamageByEntityEvent event) { + if (!removingPlayers.contains(event.getDamager().getUniqueId())) return; + NPCEntity npcEntity = EntityTracker.getNPCEntity(event.getEntity()); + if (npcEntity == null) return; + npcEntity.remove(RemovalReason.REMOVE_COMMAND); + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOWEST) + public void removeTreasureChest(PlayerInteractEvent event) { + if (!removingPlayers.contains(event.getPlayer().getUniqueId())) return; + if (event.getClickedBlock() == null) return; + TreasureChest treasureChest = TreasureChest.getTreasureChest(event.getClickedBlock().getLocation()); + if (treasureChest == null) return; + treasureChest.removeTreasureChest(); + event.getPlayer().sendMessage("[EliteMobs] Removed treasure chest!"); + event.setCancelled(true); + event.getClickedBlock().setType(Material.AIR); + } + } + +} + diff --git a/src/main/java/com/magmaguy/elitemobs/commands/admin/SimLootCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/admin/SimLootCommand.java new file mode 100644 index 000000000..19552c6e6 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/admin/SimLootCommand.java @@ -0,0 +1,86 @@ +package com.magmaguy.elitemobs.commands.admin; + +import com.magmaguy.elitemobs.config.ItemSettingsConfig; +import com.magmaguy.elitemobs.items.EliteItemLore; +import com.magmaguy.elitemobs.items.LootTables; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +/** + * Created by MagmaGuy on 08/06/2017. + */ +public class SimLootCommand { + + public static void forcePositiveLoot(CommandSender commandSender, String playerName, int level) { + Player player = Bukkit.getPlayer(playerName); + if (player == null) { + commandSender.sendMessage("[EliteMobs] Failed to get a player named \"" + playerName + "\"!"); + return; + } + int counter = 0; + while (true) { + counter++; + if (run(player, level, false)) break; + if (counter > 1000) { + Logger.info("Failed to generate loot within 1000 attempts! This is almost certainly an issue with the way the loot is configured in your server."); + break; + } + } + } + + public static void runMultipleTimes(Player player, int level, int timesToRun) { + for (int i = 0; i < timesToRun; i++) + run(player, level, true); + } + + public static void runMultipleTimes(CommandSender player, int level, int timesToRun, String playerName) { + Player targetPlayer = Bukkit.getPlayer(playerName); + if (targetPlayer == null) { + player.sendMessage(ChatColor.RED + "[EliteMobs] Could not send item to player " + playerName + " - player with this name was not found!"); + return; + } + for (int i = 0; i < timesToRun; i++) + run(targetPlayer, level, true); + player.sendMessage("[EliteMobs] Finished running simulation command for player " + playerName + " " + timesToRun + " times at level " + level + " ."); + } + + public static boolean run(Player player, int level, boolean message) { + try { + ItemStack itemStack = LootTables.generateLoot(level, player.getLocation(), player); + if (itemStack == null) { + if (message) + player.sendMessage(ChatColorConverter.convert(ItemSettingsConfig.getSimlootMessageFailure())); + return false; + } else { + EliteItemLore eliteItemLore = new EliteItemLore(itemStack, false); + if (message) + player.sendMessage(ChatColorConverter.convert(ItemSettingsConfig.getSimlootMessageSuccess().replace("$itemName", eliteItemLore.getItemStack().getItemMeta().getDisplayName()))); + return true; + } + } catch (Exception ex) { + if (message) + player.sendMessage(ChatColorConverter.convert(ItemSettingsConfig.getSimlootMessageFailure())); + return false; + } + } + + public static void run(CommandSender player, int level, String playerName) { + Player targetPlayer = Bukkit.getPlayer(playerName); + if (targetPlayer == null) { + player.sendMessage(ChatColor.RED + "[EliteMobs] Could not send item to player " + playerName + " - player with this name was not found!"); + return; + } + run(targetPlayer, level, true); + player.sendMessage("[EliteMobs] Finished running simulation command for player " + playerName + " at level " + level + " ."); + } + + public static void simulateSpecialLoot(Player player, int timesToRun) { + for (int i = 0; i < timesToRun; i++) + LootTables.generateSpecialLoot(player, 0, null); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/admin/StatsCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/admin/StatsCommand.java new file mode 100644 index 000000000..d3c5bd302 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/admin/StatsCommand.java @@ -0,0 +1,101 @@ +package com.magmaguy.elitemobs.commands.admin; + +import com.magmaguy.elitemobs.EliteMobs; +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.adventurersguild.GuildRank; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.custombosses.RegionalBossEntity; +import com.magmaguy.elitemobs.playerdata.ElitePlayerInventory; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Round; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; + +import java.util.HashMap; + +/** + * Created by MagmaGuy on 01/05/2017. + */ +public class StatsCommand { + + public static void statsHandler(CommandSender commandSender) { + + int aggressiveCount = 0; + int passiveCount = 0; + + HashMap entitiesCounted = new HashMap<>(); + + for (World world : EliteMobs.validWorldList) + for (LivingEntity livingEntity : world.getLivingEntities()) + if (EntityTracker.isEliteMob(livingEntity)) { + aggressiveCount++; + if (!entitiesCounted.containsKey(livingEntity.getType())) + entitiesCounted.put(livingEntity.getType(), 1); + else + entitiesCounted.put(livingEntity.getType(), entitiesCounted.get(livingEntity.getType()) + 1); + } + + StringBuilder breakdownString = new StringBuilder("&2Breakdown: &a"); + + for (EntityType entityType : entitiesCounted.keySet()) { + breakdownString.append(entitiesCounted.get(entityType)).append(" ").append(entityType).append("&2, &a"); + } + + double highestThreat = 0; + String highestThreatUser = ""; + double threatAverage = 0; + int highestGuildRank = 0; + String highestGuildUser = ""; + double guildRankAverage = 0; + Player highestGuildRankPlayer = null; + for (Player player : Bukkit.getOnlinePlayers()) { + double currentTier = ElitePlayerInventory.playerInventories.get(player.getUniqueId()).getFullPlayerTier(true); + threatAverage += currentTier; + int currentGuildRank = GuildRank.getActiveGuildRank(player); + guildRankAverage += currentGuildRank; + if (currentTier > highestThreat) { + highestThreat = currentTier; + highestThreatUser = player.getDisplayName(); + } + if (currentGuildRank > highestGuildRank) { + highestGuildRankPlayer = player; + highestGuildRank = currentGuildRank; + highestGuildUser = player.getDisplayName(); + } + } + threatAverage /= Bukkit.getOnlinePlayers().size(); + guildRankAverage /= Bukkit.getOnlinePlayers().size(); + + commandSender.sendMessage(ChatColorConverter.convert( + "§5§m-----------------------------------------------------")); + commandSender.sendMessage(ChatColorConverter.convert( + "&7[EM] §a§lEliteMobs v. " + Bukkit.getPluginManager().getPlugin(MetadataHandler.ELITE_MOBS).getDescription().getVersion() + " stats:")); + commandSender.sendMessage(ChatColorConverter.convert( + "&7[EM] &2There are currently §l§6" + (aggressiveCount + passiveCount) + " §f§2EliteMobs mobs entities in the world, of which &a" + + aggressiveCount + " &2are Elite Mobs and &a" + passiveCount + " &2are Super Mobs.")); + commandSender.sendMessage(ChatColorConverter.convert(breakdownString.toString())); + if (highestGuildRankPlayer == null) return; + commandSender.sendMessage(ChatColorConverter.convert( + "&7[EM] &2Highest online threat tier: &a" + highestThreatUser + " &2at total threat tier &a" + highestThreat)); + commandSender.sendMessage(ChatColorConverter.convert( + "&7[EM] &2Average threat tier: &a" + Round.twoDecimalPlaces(threatAverage))); + commandSender.sendMessage(ChatColorConverter.convert( + "&7[EM] &2Highest adventurer's guild tier: &a" + highestGuildUser + " &2at guild rank &a" + GuildRank.getRankName(GuildRank.getGuildPrestigeRank(highestGuildRankPlayer), highestGuildRank) + " &2(&a" + highestGuildRank + "&2)")); + commandSender.sendMessage(ChatColorConverter.convert( + "&7[EM] &2Average guild rank: &a" + Round.twoDecimalPlaces(guildRankAverage))); + commandSender.sendMessage(ChatColorConverter.convert( + "§5§m-----------------------------------------------------")); + commandSender.sendMessage("Tracked boss count: " + EntityTracker.getEliteMobEntities().size()); + commandSender.sendMessage("Tracked NPC count: " + EntityTracker.getNpcEntities().size()); + int loadedCounter = 0; + for (RegionalBossEntity regionalBossEntity : RegionalBossEntity.getRegionalBossEntities()) + if (regionalBossEntity.isValid()) + loadedCounter++; + commandSender.sendMessage(ChatColorConverter.convert("&7[EM] &2There are &c" + RegionalBossEntity.getRegionalBossEntities().size() + " &2Regional Bosses installed, of which &c" + loadedCounter + " &2are currently loaded.")); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/guiconfig/SignatureItem.java b/src/main/java/com/magmaguy/elitemobs/commands/guiconfig/SignatureItem.java deleted file mode 100644 index 2707d80ca..000000000 --- a/src/main/java/com/magmaguy/elitemobs/commands/guiconfig/SignatureItem.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.commands.guiconfig; - -import org.bukkit.Material; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.SkullMeta; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by MagmaGuy on 12/11/2017. - */ -public class SignatureItem { - - public static final ItemStack SIGNATURE_ITEMSTACK = setSignatureItem(); - - private static ItemStack setSignatureItem() { - - ItemStack signature = new ItemStack(Material.SKULL_ITEM, 1, (short) 3); - SkullMeta signatureSkullMeta = (SkullMeta) signature.getItemMeta(); - signatureSkullMeta.setOwner("magmaguy"); - signatureSkullMeta.setDisplayName("EliteMobs by MagmaGuy"); - List signatureList = new ArrayList<>(); - signatureList.add("Support the plugins you enjoy!"); - signatureSkullMeta.setLore(signatureList); - signature.setItemMeta(signatureSkullMeta); - - return signature; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/guild/AdventurersGuildCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/guild/AdventurersGuildCommand.java new file mode 100644 index 000000000..2c0be348f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/guild/AdventurersGuildCommand.java @@ -0,0 +1,37 @@ +package com.magmaguy.elitemobs.commands.guild; + +import com.magmaguy.elitemobs.adventurersguild.GuildRankMenuHandler; +import com.magmaguy.elitemobs.api.PlayerPreTeleportEvent; +import com.magmaguy.elitemobs.api.PlayerTeleportEvent; +import com.magmaguy.elitemobs.config.AdventurersGuildConfig; +import com.magmaguy.elitemobs.config.CombatTagConfig; +import com.magmaguy.elitemobs.dungeons.EMPackage; +import com.magmaguy.elitemobs.utils.EventCaller; +import org.bukkit.entity.Player; + +public class AdventurersGuildCommand { + + public static void adventurersGuildCommand(Player player) { + if (adventurersGuildTeleport(player)) return; + if (player.hasPermission("elitemobs.adventurersguild.command")) + GuildRankMenuHandler.initializeGuildRankMenu(player); + else + player.sendMessage("Missing permission: elitemobs.adventurersguild.command / elitemobs.adventurersguild.teleport"); + } + + public static boolean adventurersGuildTeleport(Player player) { + if (!player.hasPermission("elitemobs.adventurersguild.teleport")) return false; + if (!AdventurersGuildConfig.isAgTeleport()) return false; + + EMPackage emPackage = EMPackage.getEmPackages().get("adventurers_guild_hub.yml"); + if (!emPackage.isInstalled()) return false; + + if (CombatTagConfig.isEnableCombatTag()) + new EventCaller(new PlayerPreTeleportEvent(player, emPackage.getDungeonPackagerConfigFields().getTeleportLocation())); + else + new EventCaller(new PlayerTeleportEvent(player, emPackage.getDungeonPackagerConfigFields().getTeleportLocation())); + + return true; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/quests/QuestCommand.java b/src/main/java/com/magmaguy/elitemobs/commands/quests/QuestCommand.java new file mode 100644 index 000000000..c1fa39f9b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/quests/QuestCommand.java @@ -0,0 +1,81 @@ +package com.magmaguy.elitemobs.commands.quests; + +import com.magmaguy.elitemobs.config.customquests.CustomQuestsConfig; +import com.magmaguy.elitemobs.config.customquests.CustomQuestsConfigFields; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.quests.CustomQuest; +import com.magmaguy.elitemobs.quests.Quest; +import com.magmaguy.elitemobs.quests.QuestTracking; +import com.magmaguy.elitemobs.quests.playercooldowns.PlayerQuestCooldowns; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.UUID; + +public class QuestCommand { + + private QuestCommand() { + } + + public static void completeQuest(String questID, Player player) { + try { + Quest.completeQuest(UUID.fromString(questID), player); + } catch (Exception ex) { + player.sendMessage(ChatColor.RED + "[EliteMobs] Invalid quest ID!"); + } + } + + // /em quest join questFilename + public static void joinQuest(String questID, Player player) { + CustomQuest.startQuest(questID, player); + } + + public static void trackQuest(String questID, Player player) { + QuestTracking.toggleTracking(player, questID); + } + + // /em quest leave questFilename + public static void leaveQuest(Player player, String questID) { + Quest.stopPlayerQuest(player, questID); + } + + public static void resetQuests(CommandSender commandSender, String playerString) { + Player player = Bukkit.getPlayer(playerString); + if (player == null) { + commandSender.sendMessage("[EliteMobs] Error - player name not valid!"); + return; + } + PlayerQuestCooldowns.resetPlayerQuests(player); + commandSender.sendMessage("[EliteMobs] Successfully reset quests for player " + playerString); + } + + public static void resetQuest(CommandSender commandSender, String playerString, String questName) { + Player player = Bukkit.getPlayer(playerString); + if (player == null) { + commandSender.sendMessage("[EliteMobs] Error - player name is not valid!"); + return; + } + CustomQuestsConfigFields customQuestsConfigFields = CustomQuestsConfig.getCustomQuests().get(questName); + if (customQuestsConfigFields == null) { + commandSender.sendMessage("[EliteMobs] Error - quest filename " + questName + " is not valid!"); + return; + } + PlayerQuestCooldowns.resetPlayerQuestCooldown(player, customQuestsConfigFields); + commandSender.sendMessage("[EliteMobs] Successfully quest " + questName + " for player " + playerString); + } + + public static void completeQuest(Player player) { + for (Quest quest : new ArrayList(PlayerData.getQuests(player.getUniqueId()))) { + quest.getQuestObjectives().setForceOver(true); + Quest.completeQuest(quest.getQuestID(), player); + } + } + + public static void bypassQuestRequirements(Player player) { + PlayerQuestCooldowns.toggleBypass(player); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/setup/ResourcePackConfigurer.java b/src/main/java/com/magmaguy/elitemobs/commands/setup/ResourcePackConfigurer.java new file mode 100644 index 000000000..b364279c7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/setup/ResourcePackConfigurer.java @@ -0,0 +1,7 @@ +package com.magmaguy.elitemobs.commands.setup; + +public class ResourcePackConfigurer { + public static void setup() { + + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/setup/SetupMenu.java b/src/main/java/com/magmaguy/elitemobs/commands/setup/SetupMenu.java new file mode 100644 index 000000000..459eaa264 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/commands/setup/SetupMenu.java @@ -0,0 +1,278 @@ +package com.magmaguy.elitemobs.commands.setup; + +import com.magmaguy.elitemobs.config.menus.premade.GetLootMenuConfig; +import com.magmaguy.elitemobs.dungeons.EMPackage; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.*; + +public class SetupMenu { + + private static final int nextIcon = 35; + private static final int infoIcon = 4; + public static Map setupMenus = new HashMap<>(); + private static List emPackages = new ArrayList<>(); + private final int previousIcon = 27; + Inventory inventory; + Player player; + ArrayList validSlots = new ArrayList<>(new ArrayList<>(List.of(10, 11, 12, 13, 14, 15, 16, 19, 20, 21, 22, 23, + 24, 25, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43, 46, 47, 48, 49, 50, 51, 52))); + HashMap minidungeonHashMap = new HashMap<>(); + @Getter + private int currentPage = 1; + + public SetupMenu(Player player) { + this.inventory = Bukkit.createInventory(player, 54, "Setup menu"); + this.player = player; + redrawMenu(1, inventory); + } + + private static void resourcePackButtonInteraction(Player player, SetupMenu setupMenu) { + player.closeInventory(); + player.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &2Processing your request, please wait...\n")); + if (!player.hasPermission("elitemobs.*")) { + player.sendMessage("[EliteMobs] You do not have the required permission (elitemobs.*) to do that!"); + return; + } + + Logger.sendMessage(player, "This setting is now no longer in use! Use my ResourcePackManager plugin to easily and automatically merge & host the EliteMobs resource pack, and much more!"); + return; +// +// if (ResourcePackDataConfig.isEliteMobsResourcePackEnabled()) { +// //Case for if it is downloaded +// ResourcePackDataConfig.toggleEliteMobsResourcePackStatus(false); +// } else { +// ResourcePackDataConfig.toggleEliteMobsResourcePackStatus(true); +// player.spigot().sendMessage(SpigotMessage.simpleMessage("&8[EliteMobs] &2The EliteMobs resource pack has been installed!")); +// player.spigot().sendMessage(SpigotMessage.commandHoverMessage("&eBefore you go! &fDo you want to force players to use the resource pack? This is necessary if you plan to use &cModelEngine for the custom boss models. &aClick here if you want to force resource packs. &eIgnore this message if you don't!", "Click to force resource packs!", "/elitemobs forceresourcepack")); +// } + } + +// public static void forceResourcePack(Player player) { +// ResourcePackDataConfig.toggleForceResourcePack(true); +// player.sendMessage("[EliteMobs] Using the resource pack is now mandatory!"); +// } + + private static void dungeonButtonInteraction(Player player, SetupMenu setupMenu, InventoryClickEvent event) { + //for minidungeons + EMPackage emPackage = setupMenu.minidungeonHashMap.get(event.getSlot()); + if (emPackage != null) { + if (!emPackage.isDownloaded()) { + player.sendMessage("----------------------------------------------------"); + player.sendMessage(ChatColorConverter.convert("&4Download this at &9" + emPackage.getDungeonPackagerConfigFields().getDownloadLink() + " &4!")); + player.sendMessage("----------------------------------------------------"); + player.closeInventory(); + setupMenus.remove(event.getInventory()); + return; + } + if (!emPackage.isInstalled()) + emPackage.install(player); + else if (!emPackage.uninstall(player)) { + player.sendMessage("[EliteMobs] Failed to unload package because players were present in the worlds you were trying to unload! Remove the players from the dungeon before uninstalling it!"); + } + setupMenus.remove(event.getInventory()); + player.closeInventory(); + } + } + + private void redrawMenu(int page, Inventory inventory) { + currentPage = page; + setupMenus.remove(inventory); + this.inventory = inventory; + inventory.clear(); + //reserve resource pack status + customResourcePackStatus(); + //iterate through dungeons + dungeonStatuses(); + //Set icons + addNavigationElements(); + player.openInventory(inventory); + setupMenus.put(inventory, this); + } + + private void addNavigationElements() { + ItemStack infoButton = GetLootMenuConfig.infoItem; + List lore = ChatColorConverter.convert(List.of("&2To setup optional/recommended content for EliteMobs:", + "&61) &fDownload content from &9magmaguy.itch.io &for &9patreon.com/magmaguy", + "&62) &fPut content in the &2imports &ffolder of EliteMobs", + "&63) &fDo &2/em reload", + "&64) &fDo &2/em setup", + "&65) &fClick on &eyellow &ficons to install!", + "Click to get more info!")); + ItemMeta itemMeta = infoButton.getItemMeta(); + itemMeta.setLore(lore); + infoButton.setItemMeta(itemMeta); + inventory.setItem(infoIcon, infoButton); + + ItemStack previousButton = GetLootMenuConfig.previousLootItem; + ItemMeta previousButtonMeta = previousButton.getItemMeta(); + previousButtonMeta.setDisplayName("Previous page"); + previousButton.setItemMeta(previousButtonMeta); + if (currentPage > 1) + inventory.setItem(previousIcon, previousButton); + + ItemStack nextButton = GetLootMenuConfig.nextLootItem; + ItemMeta nextButtonMeta = nextButton.getItemMeta(); + nextButtonMeta.setDisplayName("Next page"); + nextButton.setItemMeta(nextButtonMeta); + int totalPages = (int) Math.ceil(emPackages.size() / 28d); + if (totalPages > 1 && currentPage < totalPages) + inventory.setItem(nextIcon, nextButton); + } + + private void dungeonStatuses() { + //Counter has to account for pages + int dungeonCounter = 0; + int inventoryLocationCounter = 0; + if (currentPage != 1) + dungeonCounter = validSlots.size() * (currentPage - 1) - 2; + else + inventoryLocationCounter = 1; + List rawEmPackages = EMPackage.getEmPackages().values().stream().toList(); + List alphabeticalSort = new ArrayList<>(); + rawEmPackages.forEach(iteratedPackage -> alphabeticalSort.add(ChatColor.stripColor(ChatColorConverter.convert(iteratedPackage.getDungeonPackagerConfigFields().getName())))); + Collections.sort(alphabeticalSort); + emPackages = new ArrayList<>(); + alphabeticalSort.forEach(entry -> rawEmPackages.forEach(iteratedPackage -> { + if (ChatColor.stripColor(ChatColorConverter.convert(iteratedPackage.getDungeonPackagerConfigFields().getName())).equals(entry)) + emPackages.add(iteratedPackage); + })); + minidungeonHashMap.clear(); + for (int i = dungeonCounter; i < emPackages.size(); i++) { + if (currentPage == 1 && minidungeonHashMap.size() > validSlots.size() - 2) break; + if (inventoryLocationCounter >= validSlots.size()) break; + EMPackage emPackage = emPackages.get(i); + + addDungeonPackagerContent(emPackage, inventoryLocationCounter); + + minidungeonHashMap.put(validSlots.get(inventoryLocationCounter), emPackage); + dungeonCounter++; + inventoryLocationCounter++; + } + } + + private void addDungeonPackagerContent(EMPackage emPackage, int counter) { + String itemName = emPackage.getDungeonPackagerConfigFields().getName(); + List lore = new ArrayList<>(); + + addSize(lore, emPackage); + //boss count can't be calculated ahead of time here, unfortunately + addInstallationString(lore, emPackage); + + lore = ChatColorConverter.convert(lore); + inventory.setItem(validSlots.get(counter), ItemStackGenerator.generateItemStack(getMaterial(emPackage), itemName, lore)); + } + + private Material getMaterial(EMPackage emPackage) { + if (emPackage.isOutOfDate()) + return Material.ORANGE_STAINED_GLASS_PANE; + if (emPackage.isInstalled()) + return Material.GREEN_STAINED_GLASS_PANE; + if (emPackage.isDownloaded()) + return Material.YELLOW_STAINED_GLASS_PANE; + return Material.RED_STAINED_GLASS_PANE; + } + + private void addSize(List lore, EMPackage emPackage) { + lore.add("&fSize: " + emPackage.getDungeonPackagerConfigFields().getDungeonSizeCategory().toString()); + } + + private void addInstallationString(List lore, EMPackage emPackage) { + String status = "&fStatus: "; + if (emPackage.isOutOfDate()) { + lore.add(status + "&4outdated!"); + lore.add("&4Download the update at"); + lore.add("&9" + emPackage.getDungeonPackagerConfigFields().getDownloadLink() + " &f!"); + lore.add("&cClick to uninstall!"); + return; + } + if (emPackage.isInstalled()) { + lore.add(status + "&2already installed!"); + lore.add("&cClick to uninstall!"); + return; + } + if (!emPackage.isDownloaded()) { + lore.add(status + "&4not downloaded!"); + lore.add("&4Download this at"); + lore.add("&9" + emPackage.getDungeonPackagerConfigFields().getDownloadLink() + " &f!"); + return; + } + lore.add(status + "&aready to install!"); + lore.add("&2Click to install!"); + } + + private void customResourcePackStatus() { + if (currentPage != 1) return; + String state = "Custom resource pack is"; + String lore; + Material material; + boolean resourceState = Bukkit.getPluginManager().isPluginEnabled("ResourcePackManager"); + + if (!resourceState) { + material = Material.YELLOW_STAINED_GLASS_PANE; + lore = ChatColor.RED + "Not enabled! Click to enable!"; + } else { + material = Material.GREEN_STAINED_GLASS_PANE; + lore = ChatColor.GREEN + "Working correctly! Click to disable!"; + } + + inventory.setItem(validSlots.get(0), ItemStackGenerator.generateItemStack(material, state, new ArrayList<>(List.of(lore)))); + } + + public static class SetupMenuListeners implements Listener { + @EventHandler(ignoreCancelled = true) + public void onInventoryInteraction(InventoryClickEvent event) { + SetupMenu setupMenu = setupMenus.get(event.getInventory()); + if (setupMenu == null) return; + event.setCancelled(true); + Player player = (Player) event.getWhoClicked(); + //for resource pack + if (event.getSlot() == 10 && setupMenu.getCurrentPage() == 1) { + resourcePackButtonInteraction(player, setupMenu); + return; + } + //for permissions mode + if (event.getSlot() == infoIcon) { + player.sendMessage( + "EliteMobs installation process:", + "Wiki page: https://github.com/MagmaGuy/EliteMobs/wiki/%5BGuide%5D-Quick-Setup", + "Video version: https://youtu.be/boRg2X4qhw4", + "Download links: free & premium https://magmaguy.itch.io/ | premium-only https://www.patreon.com/magmaguy", + "Discord support: https://discord.gg/9f5QSka"); + player.closeInventory(); + return; + } + if (event.getSlot() == setupMenu.previousIcon && event.getCurrentItem() != null) { + setupMenu.redrawMenu(setupMenu.getCurrentPage() - 1, event.getInventory()); + return; + } + if (event.getSlot() == nextIcon && event.getCurrentItem() != null) { + setupMenu.redrawMenu(setupMenu.getCurrentPage() + 1, event.getInventory()); + return; + } + + dungeonButtonInteraction(player, setupMenu, event); + } + + @EventHandler + public void onClose(InventoryCloseEvent event) { + setupMenus.remove(event.getInventory()); + } + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/shops/CustomShopHandler.java b/src/main/java/com/magmaguy/elitemobs/commands/shops/CustomShopHandler.java deleted file mode 100644 index 2a34f505f..000000000 --- a/src/main/java/com/magmaguy/elitemobs/commands/shops/CustomShopHandler.java +++ /dev/null @@ -1,152 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.commands.shops; - -import com.magmaguy.elitemobs.commands.guiconfig.SignatureItem; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.EconomySettingsConfig; -import com.magmaguy.elitemobs.economy.EconomyHandler; -import com.magmaguy.elitemobs.economy.UUIDFilter; -import com.magmaguy.elitemobs.items.CustomItemConstructor; -import com.magmaguy.elitemobs.items.ItemWorthCalculator; -import com.magmaguy.elitemobs.items.ObfuscatedSignatureLoreData; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; - -import java.util.List; -import java.util.Random; - -/** - * Created by MagmaGuy on 20/06/2017. - */ -public class CustomShopHandler implements Listener { - - public static final String SHOP_NAME = ConfigValues.economyConfig.getString(EconomySettingsConfig.CUSTOM_SHOP_NAME); - - public void initializeShop(Player player) { - - Inventory shopInventory = Bukkit.createInventory(player, 54, SHOP_NAME); - - populateShop(shopInventory); - - player.openInventory(shopInventory); - - } - - private void populateShop(Inventory shopInventory) { - - SharedShopElements.shopHeader(shopInventory); - shopContents(shopInventory); - - } - - private static List validSlots = (List) ConfigValues.economyConfig.getList(EconomySettingsConfig.CUSTOM_SHOP_VALID_SLOTS); - - private void shopContents(Inventory shopInventory) { - - //Anything after 8 is populated - Random random = new Random(); - - for (int i : validSlots) { - - int itemEntryIndex = random.nextInt(CustomItemConstructor.customItemList.size()); - - shopInventory.setItem(i, CustomItemConstructor.customItemList.get(itemEntryIndex)); - - } - - } - - @EventHandler - public void onClick(InventoryClickEvent event) { - - if (!SharedShopElements.inventoryNullPointerPreventer(event)) { - - return; - - } - - if (!event.getInventory().getName().equals(SHOP_NAME)) return; - - //reroll loot button - if (event.getCurrentItem().getItemMeta().getDisplayName().equals(SignatureItem.SIGNATURE_ITEMSTACK.getItemMeta().getDisplayName())) { - - populateShop(event.getInventory()); - event.setCancelled(true); - return; - - } - - if (!ObfuscatedSignatureLoreData.obfuscatedSignatureDetector(event.getCurrentItem())) { - - event.setCancelled(true); - return; - - } - - Player player = (Player) event.getWhoClicked(); - ItemStack itemStack = event.getCurrentItem(); - String itemDisplayName = event.getCurrentItem().getItemMeta().getDisplayName(); - - double itemValue = ItemWorthCalculator.determineItemWorth(itemStack); - - //These slots are for buying items - if (validSlots.contains(event.getSlot()) && event.getClickedInventory().getName().equalsIgnoreCase(SHOP_NAME)) { - - boolean inventoryHasFreeSlots = false; - for (ItemStack iteratedStack : player.getInventory()) { - - if (iteratedStack == null) { - - inventoryHasFreeSlots = true; - break; - - } - - } - - if (!inventoryHasFreeSlots) { - - player.sendMessage("Your inventory is full! You can't buy items until you get some free space."); - player.closeInventory(); - - } else if (EconomyHandler.checkCurrency(UUIDFilter.guessUUI(player.getName())) >= itemValue) { - //player has enough money - EconomyHandler.subtractCurrency(UUIDFilter.guessUUI(player.getName()), itemValue); - player.getInventory().addItem(itemStack); - populateShop(event.getInventory()); - - SharedShopElements.buyMessage(player, itemDisplayName, itemValue); - - } else { - - player.closeInventory(); - SharedShopElements.insufficientFundsMessage(player, itemValue); - - } - - } - - event.setCancelled(true); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/shops/ItemSaleEvent.java b/src/main/java/com/magmaguy/elitemobs/commands/shops/ItemSaleEvent.java deleted file mode 100644 index 8d3845a43..000000000 --- a/src/main/java/com/magmaguy/elitemobs/commands/shops/ItemSaleEvent.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.commands.shops; - -import com.magmaguy.elitemobs.economy.EconomyHandler; -import com.magmaguy.elitemobs.economy.UUIDFilter; -import com.magmaguy.elitemobs.items.ItemWorthCalculator; -import com.magmaguy.elitemobs.items.ObfuscatedSignatureLoreData; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.inventory.ItemStack; - -public class ItemSaleEvent implements Listener { - - @EventHandler - public void playerSellEvent(InventoryClickEvent event) { - - if (!SharedShopElements.sellInventoryNullPointerPreventer(event)) { - - return; - - } - - if (!event.getInventory().getName().equals(ShopHandler.SHOP_NAME) && - !event.getInventory().getName().equals(CustomShopHandler.SHOP_NAME)) { - - return; - - } - - if (event.getClickedInventory().getName().equals(ShopHandler.SHOP_NAME) || - event.getClickedInventory().getName().equals(CustomShopHandler.SHOP_NAME)) { - - return; - - } - - if (!ObfuscatedSignatureLoreData.obfuscatedSignatureDetector(event.getCurrentItem())) { - - event.setCancelled(true); - return; - - } - - Player player = (Player) event.getWhoClicked(); - ItemStack itemStack = event.getCurrentItem(); - String itemDisplayName = itemStack.getItemMeta().getDisplayName(); - - double amountDeduced = ItemWorthCalculator.determineResaleWorth(itemStack); - - EconomyHandler.addCurrency(UUIDFilter.guessUUI(player.getName()), amountDeduced); - - if (event.getCurrentItem().getAmount() == 1) { - - event.setCurrentItem(new ItemStack(Material.AIR)); - - } else if (event.getCurrentItem().getAmount() > 1) { - - int newAmount = event.getCurrentItem().getAmount() - 1; - - event.getCurrentItem().setAmount(newAmount); - - } - - SharedShopElements.sellMessage(player, itemDisplayName, amountDeduced); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/shops/SharedShopElements.java b/src/main/java/com/magmaguy/elitemobs/commands/shops/SharedShopElements.java deleted file mode 100644 index 9d9e7a128..000000000 --- a/src/main/java/com/magmaguy/elitemobs/commands/shops/SharedShopElements.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.commands.shops; - -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.commands.guiconfig.SignatureItem; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.EconomySettingsConfig; -import com.magmaguy.elitemobs.economy.EconomyHandler; -import com.magmaguy.elitemobs.economy.UUIDFilter; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; -import org.bukkit.scheduler.BukkitRunnable; - -public class SharedShopElements { - - public static void shopHeader(Inventory shopInventory) { - - ItemStack signature = SignatureItem.SIGNATURE_ITEMSTACK; - - shopInventory.setItem(ConfigValues.economyConfig.getInt(EconomySettingsConfig.SIGNATURE_ITEM_LOCATION_SHOPS), signature); - - } - - public static boolean inventoryNullPointerPreventer(InventoryClickEvent event) { - - //Check if economy is enabled - if (!ConfigValues.economyConfig.getBoolean(EconomySettingsConfig.ENABLE_ECONOMY)) return false; - //Check if current item is valid - if (event.getCurrentItem() == null) return false; - if (event.getCurrentItem().getType().equals(Material.AIR)) return false; - if (event.getCurrentItem().getItemMeta() == null) return false; - return event.getCurrentItem().getItemMeta().hasLore(); - - } - - public static boolean sellInventoryNullPointerPreventer(InventoryClickEvent event) { - - //Check if economy is enabled - if (!ConfigValues.economyConfig.getBoolean(EconomySettingsConfig.ENABLE_ECONOMY)) return false; - //Check if current item is valid - if (event.getCurrentItem() == null) return false; - return !event.getCurrentItem().getType().equals(Material.AIR); - } - - public static void buyMessage(Player player, String itemDisplayName, double itemValue) { - - new BukkitRunnable() { - - @Override - public void run() { - - player.sendMessage(ChatColor.GREEN + "You have bought " + itemDisplayName + " for " + ChatColor.DARK_GREEN + itemValue + " " + ChatColor.GREEN + ConfigValues.economyConfig.getString(EconomySettingsConfig.CURRENCY_NAME)); - player.sendMessage(ChatColor.GREEN + "You have " + ChatColor.DARK_GREEN + EconomyHandler.checkCurrency(UUIDFilter.guessUUI(player.getName())) + " " + ChatColor.GREEN + ConfigValues.economyConfig.getString(EconomySettingsConfig.CURRENCY_NAME)); - - } - - - }.runTaskLater(Bukkit.getPluginManager().getPlugin(MetadataHandler.ELITE_MOBS), 2); - - } - - public static void insufficientFundsMessage(Player player, double itemValue) { - - new BukkitRunnable() { - - @Override - public void run() { - - player.sendMessage(ChatColor.RED + "You don't have enough " + ConfigValues.economyConfig.getString(EconomySettingsConfig.CURRENCY_NAME) + "!"); - player.sendMessage(ChatColor.GREEN + "You have " + ChatColor.DARK_GREEN + EconomyHandler.checkCurrency(UUIDFilter.guessUUI(player.getName())) + " " + ChatColor.GREEN + ConfigValues.economyConfig.getString(EconomySettingsConfig.CURRENCY_NAME)); - player.sendMessage(ChatColor.GREEN + "That item cost " + ChatColor.DARK_GREEN + itemValue + " " + ChatColor.GREEN + ConfigValues.economyConfig.getString(EconomySettingsConfig.CURRENCY_NAME) + "."); - - } - - - }.runTaskLater(Bukkit.getPluginManager().getPlugin(MetadataHandler.ELITE_MOBS), 2); - - player.closeInventory(); - - } - - public static void sellMessage(Player player, String itemDisplayName, double amountDeduced) { - - player.sendMessage("You have sold " + itemDisplayName + " for " + amountDeduced + " " + ConfigValues.economyConfig.getString(EconomySettingsConfig.CURRENCY_NAME)); - - new BukkitRunnable() { - - @Override - public void run() { - - player.sendMessage("You have " + EconomyHandler.checkCurrency(UUIDFilter.guessUUI(player.getName())) + " " + ConfigValues.economyConfig.getString(EconomySettingsConfig.CURRENCY_NAME)); - - } - - - }.runTaskLater(Bukkit.getPluginManager().getPlugin(MetadataHandler.ELITE_MOBS), 2); - - } - - -} diff --git a/src/main/java/com/magmaguy/elitemobs/commands/shops/ShopHandler.java b/src/main/java/com/magmaguy/elitemobs/commands/shops/ShopHandler.java deleted file mode 100644 index 10b24e2e3..000000000 --- a/src/main/java/com/magmaguy/elitemobs/commands/shops/ShopHandler.java +++ /dev/null @@ -1,153 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.commands.shops; - -import com.magmaguy.elitemobs.commands.guiconfig.SignatureItem; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.EconomySettingsConfig; -import com.magmaguy.elitemobs.economy.EconomyHandler; -import com.magmaguy.elitemobs.economy.UUIDFilter; -import com.magmaguy.elitemobs.items.ItemWorthCalculator; -import com.magmaguy.elitemobs.items.ObfuscatedSignatureLoreData; -import com.magmaguy.elitemobs.items.itemconstructor.ItemConstructor; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.inventory.InventoryClickEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; - -import java.util.List; -import java.util.Random; - -/** - * Created by MagmaGuy on 17/06/2017. - */ -public class ShopHandler implements Listener { - - public static final String SHOP_NAME = ConfigValues.economyConfig.getString(EconomySettingsConfig.SHOP_NAME); - - public void initializeShop(Player player) { - - Inventory shopInventory = Bukkit.createInventory(player, 54, SHOP_NAME); - - populateShop(shopInventory); - - player.openInventory(shopInventory); - - } - - private void populateShop(Inventory shopInventory) { - - SharedShopElements.shopHeader(shopInventory); - shopContents(shopInventory); - - } - - private static List validSlots = (List) ConfigValues.economyConfig.getList(EconomySettingsConfig.SHOP_VALID_SLOTS); - - private void shopContents(Inventory shopInventory) { - - Random random = new Random(); - - for (int i : validSlots) { - - int balancedMax = ConfigValues.economyConfig.getInt(EconomySettingsConfig.HIGHEST_PROCEDURALLY_SIMULATED_LOOT) - - ConfigValues.economyConfig.getInt(EconomySettingsConfig.LOWEST_PROCEDURALLY_SIMULATED_LOOT); - int balancedMin = ConfigValues.economyConfig.getInt(EconomySettingsConfig.LOWEST_PROCEDURALLY_SIMULATED_LOOT); - - int randomTier = random.nextInt(balancedMax) + balancedMin; - - shopInventory.setItem(i, ItemConstructor.constructItem(randomTier, null)); - - } - - } - - @EventHandler - public void onClick(InventoryClickEvent event) { - - if (!SharedShopElements.inventoryNullPointerPreventer(event)) - return; - - if (!event.getInventory().getName().equals(SHOP_NAME)) return; - - //reroll loot button - if (event.getCurrentItem().getItemMeta().getDisplayName().equals(SignatureItem.SIGNATURE_ITEMSTACK.getItemMeta().getDisplayName())) { - - populateShop(event.getInventory()); - event.setCancelled(true); - return; - - } - - if (!ObfuscatedSignatureLoreData.obfuscatedSignatureDetector(event.getCurrentItem())) { - - event.setCancelled(true); - return; - - } - - Player player = (Player) event.getWhoClicked(); - ItemStack itemStack = event.getCurrentItem(); - String itemDisplayName = itemStack.getItemMeta().getDisplayName(); - - double itemValue = ItemWorthCalculator.determineItemWorth(itemStack); - - boolean inventoryHasFreeSlots = false; - for (ItemStack iteratedStack : player.getInventory().getStorageContents()) { - - if (iteratedStack == null) { - - inventoryHasFreeSlots = true; - break; - - } - - } - - //These slots are for buying items - if (event.getClickedInventory().getName().equalsIgnoreCase(SHOP_NAME) && validSlots.contains(event.getSlot())) { - - if (!inventoryHasFreeSlots) { - - player.sendMessage("Your inventory is full! You can't buy items until you get some free space."); - player.closeInventory(); - - } else if (EconomyHandler.checkCurrency(UUIDFilter.guessUUI(player.getName())) >= itemValue) { - //player has enough money - EconomyHandler.subtractCurrency(UUIDFilter.guessUUI(player.getName()), itemValue); - player.getInventory().addItem(itemStack); - populateShop(event.getInventory()); - - SharedShopElements.buyMessage(player, itemDisplayName, itemValue); - - } else { - - player.closeInventory(); - SharedShopElements.insufficientFundsMessage(player, itemValue); - - } - - } - - event.setCancelled(true); - - } - - -} diff --git a/src/main/java/com/magmaguy/elitemobs/config/AdventurersGuildConfig.java b/src/main/java/com/magmaguy/elitemobs/config/AdventurersGuildConfig.java index 919bf63f8..e29f97515 100644 --- a/src/main/java/com/magmaguy/elitemobs/config/AdventurersGuildConfig.java +++ b/src/main/java/com/magmaguy/elitemobs/config/AdventurersGuildConfig.java @@ -1,25 +1,505 @@ package com.magmaguy.elitemobs.config; -import org.bukkit.configuration.Configuration; +import com.magmaguy.magmacore.config.ConfigurationFile; +import com.magmaguy.magmacore.util.ChatColorConverter; +import lombok.Getter; -public class AdventurersGuildConfig { +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; - public static final String CONFIG_NAME = "AdventurersGuild.yml"; +public class AdventurersGuildConfig extends ConfigurationFile { + @Getter + private static final String[][] rankNames = new String[11][21]; + @Getter + private static final String[][] shortRankNames = new String[11][21]; + @Getter + private static boolean addMaxHealth; + @Getter + private static boolean addCrit; + @Getter + private static boolean addDodge; + @Getter + private static boolean agTeleport; + @Getter + private static boolean guildLootLimiter; + @Getter + private static String lootLimiterMessage; + @Getter + private static List onRankUpCommand; + @Getter + private static List onPrestigeUpCommand; + @Getter + private static double dodge1; + @Getter + private static double dodge2; + @Getter + private static double dodge3; + @Getter + private static double crit1; + @Getter + private static double crit2; + @Getter + private static double crit3; + @Getter + private static double health1; + @Getter + private static double health2; + @Getter + private static double health3; + @Getter + private static double health4; + @Getter + private static String adventurersGuildMenuName; + @Getter + private static int baseKillsForRankUp; + @Getter + private static int additionalKillsForRankUpPerTier; + @Getter + private static String prestigeUnlockMessageTitle; + @Getter + private static String prestigeUnlockMessageSubtitle; + @Getter + private static List worldsWithoutAGBonuses; + @Getter + private static double peacefulModeEliteChanceDecrease; + @Getter + private static boolean disableCommonerRank; - public static final String ENABLE_ADVENTURERS_GUILD = "Enable adventurer's guild"; - - CustomConfigLoader customConfigLoader = new CustomConfigLoader(); - Configuration configuration = customConfigLoader.getCustomConfig(CONFIG_NAME); + public AdventurersGuildConfig() { + super("AdventurersGuild.yml"); + } - public void initializeConfig(){ + public static String getRankName(int prestigeTier, int rankTier) { + return ChatColorConverter.convert(rankNames[prestigeTier][rankTier]); + } - configuration.addDefault(ENABLE_ADVENTURERS_GUILD, true); + public static String getShortenedRankName(int prestigeTier, int rankTier) { + return ChatColorConverter.convert(shortRankNames[prestigeTier][rankTier]); + } - configuration.options().copyDefaults(true); - UnusedNodeHandler.clearNodes(configuration); - customConfigLoader.saveDefaultCustomConfig(CONFIG_NAME); - customConfigLoader.saveCustomConfig(CONFIG_NAME); + private static String prestigeColors(int prestigeTier) { + switch (prestigeTier) { + case 1: + return "&e"; + case 2: + return "&2"; + case 3: + return "&a"; + case 4: + return "&3"; + case 5: + return "&b"; + case 6: + return "&4"; + case 7: + return "&c"; + case 8: + return "&9"; + case 9: + return "&d"; + case 10: + return "&5"; + default: + return "error"; + } + } + private static String romanNumerals(int prestigeTier) { + switch (prestigeTier) { + case 1: + return "Ⅰ"; + case 2: + return "ⅠⅠ"; + case 3: + return "ⅠⅠⅠ"; + case 4: + return "ⅠⅤ"; + case 5: + return "Ⅴ"; + case 6: + return "ⅤⅠ"; + case 7: + return "ⅤⅠⅠ"; + case 8: + return "ⅤⅠⅠⅠ"; + case 9: + return "ⅠⅩ"; + case 10: + return "Ⅹ"; + case 11: + return "ⅩⅠ"; + case 12: + return "ⅩⅠⅠ"; + case 13: + return "ⅩⅠⅠⅠ"; + case 14: + return "ⅩⅠⅤ"; + case 15: + return "ⅩⅤ"; + case 16: + return "ⅩⅤⅠ"; + case 17: + return "ⅩⅤⅠⅠ"; + case 18: + return "ⅩⅤⅠⅠⅠ"; + case 19: + return "ⅩⅠⅩ"; + case 20: + return "ⅩⅩ"; + case 0: + return "0"; + default: + return "error"; + } } + @Override + public void initializeValues() { + addMaxHealth = ConfigurationEngine.setBoolean( + List.of("Sets if EliteMobs will add max health when unlocking guild ranks as a prestige reward"), + fileConfiguration, "Add max health when unlocking higher guild ranks", true); + addCrit = ConfigurationEngine.setBoolean( + List.of("Sets if EliteMobs will add a critical strike chance when unlocking guild ranks as a prestige reward"), + fileConfiguration, "Add critical chance when unlocking higher guild ranks", true); + addDodge = ConfigurationEngine.setBoolean( + List.of("Sets if EliteMobs will add dodge chance when unlocking guild ranks as a prestige reward"), + fileConfiguration, "Add dodge chance when unlocking higher guild ranks", true); + agTeleport = ConfigurationEngine.setBoolean( + List.of("Sets if user commands get rerouted to the adventurer's guild hub. This is highly recommended for gameplay immersion and tutorial purposes."), + fileConfiguration, "userCommandsTeleportToAdventurersGuild", true); + adventurersGuildMenuName = ConfigurationEngine.setString( + List.of("Sets the in-game display name of the adventurer's guild"), + file, fileConfiguration, "adventurersGuildMenuName", "&6&lAdventurer's Hub", true); + + //iterate through all prestige tiers + for (int prestigeRank = 0; prestigeRank < 11; prestigeRank++) + for (int normalRank = 0; normalRank < 11 + prestigeRank; normalRank++) { + String rankName = ""; + String shortRankName = ""; + switch (normalRank) { + case 0: + if (prestigeRank == 0) { + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, "&8Commoner - disables elites!", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", "&6&l✧&e" + romanNumerals(normalRank), true); + } else { + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, prestigeColors(prestigeRank) + "Prestige " + prestigeRank + " &8Commoner", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", prestigeColors(prestigeRank) + "⚜" + romanNumerals(prestigeRank) + "&6&l✧&e" + romanNumerals(normalRank), true); + } + rankNames[prestigeRank][normalRank] = rankName; + shortRankNames[prestigeRank][normalRank] = shortRankName; + break; + case 1: + if (prestigeRank == 0) { + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, "&fRookie", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", "&6&l✧&e" + romanNumerals(normalRank), true); + } else { + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, prestigeColors(prestigeRank) + "Prestige " + prestigeRank + " &fRookie", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", prestigeColors(prestigeRank) + "⚜" + romanNumerals(prestigeRank) + "&6&l✧&e" + romanNumerals(normalRank), true); + } + rankNames[prestigeRank][normalRank] = rankName; + shortRankNames[prestigeRank][normalRank] = shortRankName; + break; + case 2: + if (prestigeRank == 0) { + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, "&fNovice", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", "&6&l✧&e" + romanNumerals(normalRank), true); + } else { + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, prestigeColors(prestigeRank) + "Prestige " + prestigeRank + " &fNovice", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", prestigeColors(prestigeRank) + "⚜" + romanNumerals(prestigeRank) + "&6&l✧&e" + romanNumerals(normalRank), true); + } + rankNames[prestigeRank][normalRank] = rankName; + shortRankNames[prestigeRank][normalRank] = shortRankName; + break; + case 3: + if (prestigeRank == 0) { + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, "&fApprentice", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", "&6&l✧&e" + romanNumerals(normalRank), true); + } else { + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, prestigeColors(prestigeRank) + "Prestige " + prestigeRank + " &fApprentice", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", prestigeColors(prestigeRank) + "⚜" + romanNumerals(prestigeRank) + "&6&l✧&e" + romanNumerals(normalRank), true); + } + rankNames[prestigeRank][normalRank] = rankName; + shortRankNames[prestigeRank][normalRank] = shortRankName; + break; + case 4: + if (prestigeRank == 0) { + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, "&2Adventurer", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", "&6&l✧&e" + romanNumerals(normalRank), true); + } else { + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, prestigeColors(prestigeRank) + "Prestige " + prestigeRank + " &2Adventurer", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", prestigeColors(prestigeRank) + "⚜" + romanNumerals(prestigeRank) + "&6&l✧&e" + romanNumerals(normalRank), true); + } + rankNames[prestigeRank][normalRank] = rankName; + shortRankNames[prestigeRank][normalRank] = shortRankName; + break; + case 5: + if (prestigeRank == 0) { + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, "&2Journeyman", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", "&6&l✧&e" + romanNumerals(normalRank), true); + } else { + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, prestigeColors(prestigeRank) + "Prestige " + prestigeRank + " &2Journeyman", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", prestigeColors(prestigeRank) + "⚜" + romanNumerals(prestigeRank) + "&6&l✧&e" + romanNumerals(normalRank), true); + } + rankNames[prestigeRank][normalRank] = rankName; + shortRankNames[prestigeRank][normalRank] = shortRankName; + break; + case 6: + if (prestigeRank == 0) { + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, "&2Adept", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", "&6&l✧&e" + romanNumerals(normalRank), true); + } else { + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, prestigeColors(prestigeRank) + "Prestige " + prestigeRank + " &2Adept", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", prestigeColors(prestigeRank) + "⚜" + romanNumerals(prestigeRank) + "&6&l✧&e" + romanNumerals(normalRank), true); + } + rankNames[prestigeRank][normalRank] = rankName; + shortRankNames[prestigeRank][normalRank] = shortRankName; + break; + case 7: + if (prestigeRank == 0) { + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, "&1Veteran", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", "&6&l✧&e" + romanNumerals(normalRank), true); + } else { + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, prestigeColors(prestigeRank) + "Prestige " + prestigeRank + " &1Veteran", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", prestigeColors(prestigeRank) + "⚜" + romanNumerals(prestigeRank) + "&6&l✧&e" + romanNumerals(normalRank), true); + } + rankNames[prestigeRank][normalRank] = rankName; + shortRankNames[prestigeRank][normalRank] = shortRankName; + break; + case 8: + if (prestigeRank == 0) { + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, "&1Elite", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", "&6&l✧&e" + romanNumerals(normalRank), true); + } else { + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, prestigeColors(prestigeRank) + "Prestige " + prestigeRank + " &1Elite", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", prestigeColors(prestigeRank) + "⚜" + romanNumerals(prestigeRank) + "&6&l✧&e" + romanNumerals(normalRank), true); + } + rankNames[prestigeRank][normalRank] = rankName; + shortRankNames[prestigeRank][normalRank] = shortRankName; + break; + case 9: + if (prestigeRank == 0) { + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, "&lMaster", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", "&6&l✧&e" + romanNumerals(normalRank), true); + } else { + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, prestigeColors(prestigeRank) + "Prestige " + prestigeRank + " &5Master", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", prestigeColors(prestigeRank) + "⚜" + romanNumerals(prestigeRank) + "&6&l✧&e" + romanNumerals(normalRank), true); + } + rankNames[prestigeRank][normalRank] = rankName; + shortRankNames[prestigeRank][normalRank] = shortRankName; + break; + case 10: + if (prestigeRank == 0) { + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, "&5Hero", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", "&6&l✧&e" + romanNumerals(normalRank), true); + } else { + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", prestigeColors(prestigeRank) + "⚜" + romanNumerals(prestigeRank) + "&6&l✧&e" + romanNumerals(normalRank), true); + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, prestigeColors(prestigeRank) + "Prestige " + prestigeRank + " &5Hero", true); + } + rankNames[prestigeRank][normalRank] = rankName; + shortRankNames[prestigeRank][normalRank] = shortRankName; + break; + case 11: + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, prestigeColors(prestigeRank) + "Prestige " + prestigeRank + " &5Legend", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", prestigeColors(prestigeRank) + "⚜" + romanNumerals(prestigeRank) + "&6&l✧&e" + romanNumerals(normalRank), true); + rankNames[prestigeRank][normalRank] = rankName; + shortRankNames[prestigeRank][normalRank] = shortRankName; + break; + case 12: + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, prestigeColors(prestigeRank) + "Prestige " + prestigeRank + " &5Myth", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", prestigeColors(prestigeRank) + "⚜" + romanNumerals(prestigeRank) + "&6&l✧&e" + romanNumerals(normalRank), true); + rankNames[prestigeRank][normalRank] = rankName; + shortRankNames[prestigeRank][normalRank] = shortRankName; + break; + case 13: + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, prestigeColors(prestigeRank) + "Prestige " + prestigeRank + " &5Immortal", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", prestigeColors(prestigeRank) + "⚜" + romanNumerals(prestigeRank) + "&6&l✧&e" + romanNumerals(normalRank), true); + rankNames[prestigeRank][normalRank] = rankName; + shortRankNames[prestigeRank][normalRank] = shortRankName; + break; + case 14: + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, prestigeColors(prestigeRank) + "Prestige " + prestigeRank + " &5Chosen", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", prestigeColors(prestigeRank) + "⚜" + romanNumerals(prestigeRank) + "&6&l✧&e" + romanNumerals(normalRank), true); + rankNames[prestigeRank][normalRank] = rankName; + shortRankNames[prestigeRank][normalRank] = shortRankName; + break; + case 15: + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, prestigeColors(prestigeRank) + "Prestige " + prestigeRank + " &5Ascendant", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", prestigeColors(prestigeRank) + "⚜" + romanNumerals(prestigeRank) + "&6&l✧&e" + romanNumerals(normalRank), true); + rankNames[prestigeRank][normalRank] = rankName; + shortRankNames[prestigeRank][normalRank] = shortRankName; + break; + case 16: + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, prestigeColors(prestigeRank) + "Prestige " + prestigeRank + " &5Titan", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", prestigeColors(prestigeRank) + "⚜" + romanNumerals(prestigeRank) + "&6&l✧&e" + romanNumerals(normalRank), true); + rankNames[prestigeRank][normalRank] = rankName; + shortRankNames[prestigeRank][normalRank] = shortRankName; + break; + case 17: + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, prestigeColors(prestigeRank) + "Prestige " + prestigeRank + " &5Demigod", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", prestigeColors(prestigeRank) + "⚜" + romanNumerals(prestigeRank) + "&6&l✧&e" + romanNumerals(normalRank), true); + rankNames[prestigeRank][normalRank] = rankName; + shortRankNames[prestigeRank][normalRank] = shortRankName; + break; + case 18: + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, prestigeColors(prestigeRank) + "Prestige " + prestigeRank + " &5Deity", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", prestigeColors(prestigeRank) + "⚜" + romanNumerals(prestigeRank) + "&6&l✧&e" + romanNumerals(normalRank), true); + rankNames[prestigeRank][normalRank] = rankName; + shortRankNames[prestigeRank][normalRank] = shortRankName; + break; + case 19: + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, prestigeColors(prestigeRank) + "Prestige " + prestigeRank + " &5Godhunter", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", prestigeColors(prestigeRank) + "⚜" + romanNumerals(prestigeRank) + "&6&l✧&e" + romanNumerals(normalRank), true); + rankNames[prestigeRank][normalRank] = rankName; + shortRankNames[prestigeRank][normalRank] = shortRankName; + break; + case 20: + rankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank, prestigeColors(prestigeRank) + "Prestige " + prestigeRank + " &5Godslayer", true); + shortRankName = ConfigurationEngine.setString(file, fileConfiguration, + "Prestige " + prestigeRank + " rank " + normalRank + " short placeholder", prestigeColors(prestigeRank) + "⚜" + romanNumerals(prestigeRank) + "&6&l✧&e" + romanNumerals(normalRank), true); + rankNames[prestigeRank][normalRank] = rankName; + shortRankNames[prestigeRank][normalRank] = shortRankName; + break; + default: + throw new IllegalStateException("Unexpected value: " + normalRank); + } + + } + + guildLootLimiter = ConfigurationEngine.setBoolean( + List.of("Sets if player loot is limited by their guild level.", + " This is an incredibly important part of EliteMobs and extremely highly recommended."), + fileConfiguration, "limitLootBasedOnGuildTier", true); + lootLimiterMessage = ConfigurationEngine.setString( + List.of("Sets the message sent to players if their loot gets nerfed due to their low guild level."), + file, fileConfiguration, "lootLimiterMessage", "&7[EM] &cYou must unlock the next guild rank through /ag to loot better items!", true); + onRankUpCommand = ConfigurationEngine.setList( + List.of("Sets the commands that run on guild rank up. Placeholders are:", "$prestigerank - outputs the prestige rank", "$activerank - outputs the currently active rank", "$player - outputs the player name"), + file, fileConfiguration, "onRankUpCommand", Collections.emptyList(), false); + onPrestigeUpCommand = ConfigurationEngine.setList( + List.of("Sets the commands that run on prestige rank up.", "$prestigerank - outputs the prestige rank", "$activerank - outputs the currently active rank", "$player - outputs the player name"), + file, fileConfiguration, "onPrestigeUpCommand", Collections.emptyList(), false); + dodge1 = ConfigurationEngine.setDouble( + List.of("Sets the prestige level for the first dodge bonus."), + fileConfiguration, "dodgePrestige3Bonus", 3); + dodge2 = ConfigurationEngine.setDouble( + List.of("Sets the prestige level for the second dodge bonus."), + fileConfiguration, "dodgePrestige6Bonus", 6); + dodge3 = ConfigurationEngine.setDouble( + List.of("Sets the prestige level for the third dodge bonus."), + fileConfiguration, "dodgePrestige9Bonus", 10); + crit1 = ConfigurationEngine.setDouble( + List.of("Sets the prestige level for the first critical hit bonus."), + fileConfiguration, "critPrestige2Bonus", 3); + crit2 = ConfigurationEngine.setDouble( + List.of("Sets the prestige level for the second critical hit bonus."), + fileConfiguration, "critPrestige5Bonus", 6); + crit3 = ConfigurationEngine.setDouble( + List.of("Sets the prestige level for the third critical hit bonus."), + fileConfiguration, "critPrestige8Bonus", 10); + health1 = ConfigurationEngine.setDouble( + List.of("Sets the prestige level for the first max health bonus."), + fileConfiguration, "healthPrestige1Bonus", 2); + health2 = ConfigurationEngine.setDouble( + List.of("Sets the prestige level for the second max health bonus."), + fileConfiguration, "healthPrestige4Bonus", 2.5); + health3 = ConfigurationEngine.setDouble( + List.of("Sets the prestige level for the third max health bonus."), + fileConfiguration, "healthPrestige7Bonus", 3); + health4 = ConfigurationEngine.setDouble( + List.of("Sets the prestige level for the third max health bonus."), + fileConfiguration, "healthPrestige10Bonus", 4); + + baseKillsForRankUp = ConfigurationEngine.setInt( + List.of("Sets the estimated base amount of bosses that must be killed to be able to afford a rank up."), + fileConfiguration, "baseKillsForRankUpV2", 100); + additionalKillsForRankUpPerTier = ConfigurationEngine.setInt( + List.of("Sets the estimated additional amount of bosses that must be killed to be able to rank up, per level.", + "The formula is this amount x the level the player is currently at."), + fileConfiguration, "additionalKillsForRankUpPerTierV2", 50); + + prestigeUnlockMessageTitle = ConfigurationEngine.setString( + List.of("Sets title sent to players when someone unlocks a prestige rank.", + "$player is a placeholder that gets replaced with the player's display name."), + file, fileConfiguration, "prestigeUnlockMessageTitle", "$player", true); + prestigeUnlockMessageSubtitle = ConfigurationEngine.setString( + List.of("Sets subtitle sent to players when someone unlocks a prestige rank.", + "$tier is a placeholder that gets replaced with the player's prestige level."), + file, fileConfiguration, "prestigeUnlockMessageSubtitle", "&2has unlocked $tier&2!", true); + + peacefulModeEliteChanceDecrease = ConfigurationEngine.setDouble( + List.of("Sets the multiplier that will be applied to the spawn chance when players are using the peaceful (commoner) rank."), + fileConfiguration, "peacefulModeEliteChanceDecrease", 0.2); + + worldsWithoutAGBonuses = ConfigurationEngine.setList( + List.of("Sets the list of worlds to which guild rank bonuses will not be applied"), + file, fileConfiguration, "worldsWithoutAGBonuses", new ArrayList(), false); + + disableCommonerRank = ConfigurationEngine.setBoolean( + List.of("Disables users' ability to switch to peaceful mode for EliteMobs. Peaceful mode lowers level and spawn rates of mobs around that player specifically"), + fileConfiguration, "disableCommonerRank", false); + } } diff --git a/src/main/java/com/magmaguy/elitemobs/config/AntiExploitConfig.java b/src/main/java/com/magmaguy/elitemobs/config/AntiExploitConfig.java new file mode 100644 index 000000000..62988c78e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/AntiExploitConfig.java @@ -0,0 +1,79 @@ +package com.magmaguy.elitemobs.config; + +import com.magmaguy.magmacore.config.ConfigurationFile; +import lombok.Getter; + +import java.util.List; + +public class AntiExploitConfig extends ConfigurationFile { + private static final String ANTI_EXPLOIT_LABEL = "Specific antiexploit features are not documented intentionally. Server operators can see what antiexploit type got triggered, but further information as to how it specifically works is not made available."; + @Getter + private static String antiExploitMessage; + @Getter + private static boolean darkroomAntiExploit1; + @Getter + private static boolean darkroomAntiExploit2; + @Getter + private static boolean darkroomAntiExploit3; + @Getter + private static boolean largeDarkroomAntiExploit1; + @Getter + private static boolean endermanHeightAntiExploit; + @Getter + private static boolean mountAntiExploit; + @Getter + private static boolean ambientDamageExploit; + @Getter + private static boolean honeyBlockExploit; + @Getter + private static boolean noItemPickup; + @Getter + private static boolean noPathExploit; + @Getter + private static int antiExploitThreshold; + + public AntiExploitConfig() { + super("AntiExploit.yml"); + } + + @Override + public void initializeValues() { + antiExploitMessage = ConfigurationEngine.setString( + List.of("Sets the message that shows up when the antiexploit is triggered."), + file, fileConfiguration, "AntiExploit message", + "&c[EM AntiExploit] &7Nearby elite won't drop special loot.", true); + darkroomAntiExploit1 = ConfigurationEngine.setBoolean( + List.of("Sets if the darkroom antiexploit 1 is enabled.", ANTI_EXPLOIT_LABEL), + fileConfiguration, "Enable darkroom antiexploit 1", true); + darkroomAntiExploit2 = ConfigurationEngine.setBoolean( + List.of("Sets if the darkroom antiexploit 2 is enabled.", ANTI_EXPLOIT_LABEL), + fileConfiguration, "Enable darkroom antiexploit 2", true); + darkroomAntiExploit3 = ConfigurationEngine.setBoolean( + List.of("Sets if the darkroom antiexploit 3 is enabled.", ANTI_EXPLOIT_LABEL), + fileConfiguration, "Enable darkroom antiexploit 3", true); + largeDarkroomAntiExploit1 = ConfigurationEngine.setBoolean( + List.of("Sets if the large darkroom antiexploit 1 is enabled.", ANTI_EXPLOIT_LABEL), + fileConfiguration, "Enable large darkroom antiexploit 1", true); + endermanHeightAntiExploit = ConfigurationEngine.setBoolean( + List.of("Sets if the enderman height antiexploit is enabled.", ANTI_EXPLOIT_LABEL), + fileConfiguration, "Enable enderman height antiexploit", true); + mountAntiExploit = ConfigurationEngine.setBoolean( + List.of("Sets if the mount antiexploit is enabled.", ANTI_EXPLOIT_LABEL), + fileConfiguration, "Enable mount antiexploit", true); + noItemPickup = ConfigurationEngine.setBoolean( + List.of("Sets if elite mobs can pick items up"), + fileConfiguration, "preventItemPickupByMobs", true); + ambientDamageExploit = ConfigurationEngine.setBoolean( + List.of("Sets if the ambient damage antiexploit is enabled.", + ANTI_EXPLOIT_LABEL), fileConfiguration, "Enable ambient damage antiexploit", true); + honeyBlockExploit = ConfigurationEngine.setBoolean( + List.of("Sets if the honey block antiexploit is enabled.", + ANTI_EXPLOIT_LABEL), fileConfiguration, "Enable honey block antiexploit", true); + antiExploitThreshold = ConfigurationEngine.setInt( + List.of("Sets the threshold for antiexploit activation. Higher values make it more tolerant. Modifying this is not recommended."), + fileConfiguration, "antiExploitThreshold", 10); + noPathExploit = ConfigurationEngine.setBoolean( + List.of("Sets if the no path antiexploit is enabled"), + fileConfiguration, "nPathExploit", true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/ArenasConfig.java b/src/main/java/com/magmaguy/elitemobs/config/ArenasConfig.java new file mode 100644 index 000000000..76a140724 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/ArenasConfig.java @@ -0,0 +1,122 @@ +package com.magmaguy.elitemobs.config; + +import com.magmaguy.magmacore.config.ConfigurationFile; +import lombok.Getter; + +import java.util.List; + +public class ArenasConfig extends ConfigurationFile { + @Getter + private static String notEnoughPlayersMessage; + @Getter + private static String startingTitle; + @Getter + private static String startingSubtitle; + @Getter + private static String arenaFullMessage; + @Getter + private static String arenasOngoingMessage; + @Getter + private static String arenaStartHintMessage; + @Getter + private static String arenaQuitHintMessage; + @Getter + private static String arenaJoinPlayerMessage; + @Getter + private static String arenaJoinSpectatorMessage; + @Getter + private static String waveTitle; + @Getter + private static String waveSubtitle; + @Getter + private static String victoryTitle; + @Getter + private static String victorySubtitle; + @Getter + private static String defeatTitle; + @Getter + private static String defeatSubtitle; + @Getter + private static String victoryBroadcast; + @Getter + private static String joinPlayerTitle; + @Getter + private static String joinPlayerSubtitle; + @Getter + private static String joinSpectatorTitle; + @Getter + private static String joinSpectatorSubtitle; + @Getter + private static String noArenaPermissionMessage; + + public ArenasConfig() { + super("Arenas.yml"); + } + + @Override + public void initializeValues() { + notEnoughPlayersMessage = ConfigurationEngine.setString( + List.of("Message that appears when not enough players are present to start an arena."), + file, fileConfiguration, "notEnoughPlayersMessage", "&8[EliteMobs] &cYou need at least $amount to start the match!", true); + startingTitle = ConfigurationEngine.setString( + List.of("Title that appears when an arena is starting."), + file, fileConfiguration, "startingMessage", "&2Starting!", true); + startingSubtitle = ConfigurationEngine.setString( + List.of("Subtitle that appears when an arena is starting."), + file, fileConfiguration, "startingSubtitle", "&2in $count...", true); + arenaFullMessage = ConfigurationEngine.setString( + List.of("Message that appears when an arena is full."), + file, fileConfiguration, "arenaFullMessage", "&4[EliteMobs] &cArena is full! You can spectate instead while you wait for it to finish!", true); + arenasOngoingMessage = ConfigurationEngine.setString( + List.of("Message that appears when a player attempts to join an active arena."), + file, fileConfiguration, "arenasOngoingMessage", "&4[EliteMobs] &cCan't join the arena now - a match is currently happening! You can spectate instead while you wait for it to finish!", true); + arenaStartHintMessage = ConfigurationEngine.setString( + List.of("Message that appears to remind players how to start an arena after joining as a player."), + file, fileConfiguration, "instanceStartHintMessage", "&2[EliteMobs] &aYou can start the instance by doing &2/em start", true); + arenaQuitHintMessage = ConfigurationEngine.setString( + List.of("Message that appears to remind players how to leave an arena."), + file, fileConfiguration, "instanceQuitHintMessage", "&4[EliteMobs] &cYou can leave the instance by doing &4/em quit", true); + arenaJoinPlayerMessage = ConfigurationEngine.setString( + List.of("Message that appears when players join an arena."), + file, fileConfiguration, "arenaJoinPlayerMessage", "&2[EliteMobs] &aYou can start the arena by doing &2/em start &aif there are at least &2$count &aplayers in it! \nYou can leave the arena by doing &c/em quit", true); + arenaJoinSpectatorMessage = ConfigurationEngine.setString( + List.of("Message that appears to remind players how to leave an arena after joining as a spectator."), + file, fileConfiguration, "arenaJoinSpectatorMessage", "&2[EliteMobs] &aYou can leave the arena at any time using &2/em quit", true); + waveTitle = ConfigurationEngine.setString( + List.of("Title message that appears when a wave is starting."), + file, fileConfiguration, "waveTitle", "&aWave &2$wave", true); + waveSubtitle = ConfigurationEngine.setString( + List.of("Subtitle message that appears when a wave is starting."), + file, fileConfiguration, "waveSubtitle", "", true); + victoryTitle = ConfigurationEngine.setString( + List.of("Title that appears when an arena is completed."), + file, fileConfiguration, "victoryTitle", "&2Victory!", true); + victorySubtitle = ConfigurationEngine.setString( + List.of("Subtitle that appears when an arena is completed."), + file, fileConfiguration, "victorySubtitle", "&aCompleted &2$wave &awaves!", true); + defeatTitle = ConfigurationEngine.setString( + List.of("Title that appears when players fail an arena."), + file, fileConfiguration, "defeatTitle", "&4Defeat!", true); + defeatSubtitle = ConfigurationEngine.setString( + List.of("Subitle that appears when players fail an arena."), + file, fileConfiguration, "defeatSubtitle", "&cReached wave &4$wave&c!", true); + victoryBroadcast = ConfigurationEngine.setString( + List.of("Message broadcasted when players beat an arena."), + file, fileConfiguration, "victoryBroadcast", "Arena $arenaName was conquered by $players!", true); + joinPlayerTitle = ConfigurationEngine.setString( + List.of("Title that appears when a player joins an arena."), + file, fileConfiguration, "joinPlayerTitle", "&aStart with &2/em start &a!", true); + joinPlayerSubtitle = ConfigurationEngine.setString( + List.of("Subtitle that appears when a player joins an arena."), + file, fileConfiguration, "joinPlayerSubtitle", "&cLeave with &4/em quit &c!", true); + joinSpectatorTitle = ConfigurationEngine.setString( + List.of("Title that appears when a spectator joins an arena."), + file, fileConfiguration, "joinSpectatorTitle", "&aNow spectating!", true); + joinSpectatorSubtitle = ConfigurationEngine.setString( + List.of("Subtitle that appears when a spectator joins an arena."), + file, fileConfiguration, "joinSpectatorSubtitle", "&cLeave with &4/em quit &c!", true); + noArenaPermissionMessage = ConfigurationEngine.setString( + List.of("Sets the message sent to players if they do not have permission to enter an arena."), + file, fileConfiguration, "noArenaPermissionMessage", "[EliteMobs] You don't have the permission to enter this arena!", true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/CombatTagConfig.java b/src/main/java/com/magmaguy/elitemobs/config/CombatTagConfig.java index dc84f734c..f5d60687b 100644 --- a/src/main/java/com/magmaguy/elitemobs/config/CombatTagConfig.java +++ b/src/main/java/com/magmaguy/elitemobs/config/CombatTagConfig.java @@ -1,27 +1,42 @@ package com.magmaguy.elitemobs.config; -import org.bukkit.configuration.Configuration; - -public class CombatTagConfig { - - public static final String CONFIG_NAME = "CombatTag.yml"; - - public static final String ENABLE_COMBAT_TAG = "Enable combat tag"; - public static final String COMBAT_TAG_MESSAGE = "Combat tag message"; - - CustomConfigLoader customConfigLoader = new CustomConfigLoader(); - private Configuration configuration = customConfigLoader.getCustomConfig(CONFIG_NAME); - - public void initializeConfig(){ - - configuration.addDefault(ENABLE_COMBAT_TAG, true); - configuration.addDefault(COMBAT_TAG_MESSAGE, "&c[EliteMobs] Combat tag activated!"); - - customConfigLoader.getCustomConfig(CONFIG_NAME).options().copyDefaults(true); - UnusedNodeHandler.clearNodes(configuration); - customConfigLoader.saveDefaultCustomConfig(CONFIG_NAME); - customConfigLoader.saveCustomConfig(CONFIG_NAME); - +import com.magmaguy.magmacore.config.ConfigurationFile; +import lombok.Getter; + +import java.util.List; + +public class CombatTagConfig extends ConfigurationFile { + @Getter + private static boolean enableCombatTag; + @Getter + private static String combatTagMessage; + @Getter + private static boolean enableTeleportTimer; + @Getter + private static String teleportTimeLeft; + @Getter + private static String teleportCancelled; + + public CombatTagConfig() { + super("CombatTag.yml"); } + @Override + public void initializeValues() { + enableCombatTag = ConfigurationEngine.setBoolean( + List.of("Sets if the combat tag is enabled.", "When enabled, flying players that engage in combat are set to stop flying."), + fileConfiguration, "Enable combat tag", true); + combatTagMessage = ConfigurationEngine.setString( + List.of("Sets the message sent when the combat tag is activated."), + file, fileConfiguration, "Combat tag message", "&c[EliteMobs] Combat tag activated!", true); + enableTeleportTimer = ConfigurationEngine.setBoolean( + List.of("Sets if the /ag command will have a timer before teleportation"), + fileConfiguration, "Enable adventurers guild teleport timer", true); + teleportTimeLeft = ConfigurationEngine.setString( + List.of("Sets the action message set while waiting for the teleport timer."), + file, fileConfiguration, "Teleport time left", "&7[EM] Teleporting in &a$time &7seconds...", true); + teleportCancelled = ConfigurationEngine.setString( + List.of("Sets the message sent when players move while waiting for teleportation."), + file, fileConfiguration, "Teleport cancelled", "&7[EM] &cTeleport interrupted!", true); + } } diff --git a/src/main/java/com/magmaguy/elitemobs/config/ConfigValues.java b/src/main/java/com/magmaguy/elitemobs/config/ConfigValues.java deleted file mode 100644 index 68a35cd75..000000000 --- a/src/main/java/com/magmaguy/elitemobs/config/ConfigValues.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.config; - -import com.magmaguy.elitemobs.MetadataHandler; -import org.bukkit.Bukkit; -import org.bukkit.configuration.Configuration; - -/** - * Created by MagmaGuy on 05/05/2017. - */ -public class ConfigValues { - - public static Configuration defaultConfig, itemsCustomLootListConfig, mobPowerConfig, translationConfig, - itemsProceduralSettingsConfig, economyConfig, playerCacheConfig, eventsConfig, itemsCustomLootSettingsConfig, - validMobsConfig, validWorldsConfig, itemsUniqueConfig, mobCombatSettingsConfig, itemsDropSettingsConfig, - playerMoneyData, playerRankData, playerMaxRankData, combatTagConfig, adventurersGuildConfig, - customEnchantmentsConfig; - - public static void initializeCachedConfigurations() { - - CustomConfigLoader customConfigLoader = new CustomConfigLoader(); - - defaultConfig = Bukkit.getPluginManager().getPlugin(MetadataHandler.ELITE_MOBS).getConfig(); - - customConfigLoader = new CustomConfigLoader(); - itemsCustomLootListConfig = customConfigLoader.getCustomConfig(ItemsCustomLootListConfig.CONFIG_NAME, true); - - customConfigLoader = new CustomConfigLoader(); - mobPowerConfig = customConfigLoader.getCustomConfig(MobPowersConfig.CONFIG_NAME); - - customConfigLoader = new CustomConfigLoader(); - itemsCustomLootSettingsConfig = customConfigLoader.getCustomConfig(ItemsCustomLootSettingsConfig.CONFIG_NAME); - - customConfigLoader = new CustomConfigLoader(); - translationConfig = customConfigLoader.getCustomConfig(TranslationConfig.CONFIG_NAME); - - customConfigLoader = new CustomConfigLoader(); - itemsProceduralSettingsConfig = customConfigLoader.getCustomConfig(ItemsProceduralSettingsConfig.CONFIG_NAME); - - customConfigLoader = new CustomConfigLoader(); - economyConfig = customConfigLoader.getCustomConfig(EconomySettingsConfig.CONFIG_NAME); - - customConfigLoader = new CustomConfigLoader(); - playerCacheConfig = customConfigLoader.getCustomConfig(PlayerCacheData.CONFIG_NAME, true); - - customConfigLoader = new CustomConfigLoader(); - playerMoneyData = customConfigLoader.getCustomConfig(PlayerMoneyData.CONFIG_NAME, true); - - customConfigLoader = new CustomConfigLoader(); - playerRankData = customConfigLoader.getCustomConfig(PlayerGuildRank.CONFIG_NAME, true); - - customConfigLoader = new CustomConfigLoader(); - playerMaxRankData = customConfigLoader.getCustomConfig(PlayerMaxGuildRank.CONFIG_NAME, true); - - customConfigLoader = new CustomConfigLoader(); - eventsConfig = customConfigLoader.getCustomConfig(EventsConfig.CONFIG_NAME); - - customConfigLoader = new CustomConfigLoader(); - validMobsConfig = customConfigLoader.getCustomConfig(ValidMobsConfig.CONFIG_NAME); - - customConfigLoader = new CustomConfigLoader(); - validWorldsConfig = customConfigLoader.getCustomConfig(ValidWorldsConfig.CONFIG_NAME); - - customConfigLoader = new CustomConfigLoader(); - itemsUniqueConfig = customConfigLoader.getCustomConfig(ItemsUniqueConfig.CONFIG_NAME); - - customConfigLoader = new CustomConfigLoader(); - mobCombatSettingsConfig = customConfigLoader.getCustomConfig(MobCombatSettingsConfig.CONFIG_NAME); - - customConfigLoader = new CustomConfigLoader(); - itemsDropSettingsConfig = customConfigLoader.getCustomConfig(ItemsDropSettingsConfig.CONFIG_NAME); - - customConfigLoader = new CustomConfigLoader(); - combatTagConfig = customConfigLoader.getCustomConfig(CombatTagConfig.CONFIG_NAME); - - customConfigLoader = new CustomConfigLoader(); - adventurersGuildConfig = customConfigLoader.getCustomConfig(AdventurersGuildConfig.CONFIG_NAME); - - customConfigLoader = new CustomConfigLoader(); - customEnchantmentsConfig = customConfigLoader.getCustomConfig(CustomEnchantmentsConfig.CONFIG_NAME); - - } - - public static void intializeConfigurations() { - - DefaultConfig defaultConfig = new DefaultConfig(); - defaultConfig.loadConfiguration(); - - MobPowersConfig mobPowersConfig = new MobPowersConfig(); - mobPowersConfig.initializeConfig(); - - ItemsCustomLootListConfig itemsCustomLootListConfig = new ItemsCustomLootListConfig(); - itemsCustomLootListConfig.intializeConfig(); - - ItemsCustomLootSettingsConfig itemsCustomLootSettingsConfig = new ItemsCustomLootSettingsConfig(); - itemsCustomLootSettingsConfig.initializeConfig(); - - TranslationConfig translationConfig = new TranslationConfig(); - translationConfig.initializeConfig(); - - ItemsProceduralSettingsConfig itemsProceduralSettingsConfig = new ItemsProceduralSettingsConfig(); - itemsProceduralSettingsConfig.intializeConfig(); - - EconomySettingsConfig economySettingsConfig = new EconomySettingsConfig(); - economySettingsConfig.initializeConfig(); - - PlayerMoneyData playerMoneyData = new PlayerMoneyData(); - playerMoneyData.intializeConfig(); - - PlayerCacheData playerCacheData = new PlayerCacheData(); - playerCacheData.initializeConfig(); - - EventsConfig eventsConfig = new EventsConfig(); - eventsConfig.initializeConfig(); - - ValidWorldsConfig validWorldsConfig = new ValidWorldsConfig(); - validWorldsConfig.initializeConfig(); - - ValidMobsConfig validMobsConfig = new ValidMobsConfig(); - validMobsConfig.initializeConfig(); - - ItemsUniqueConfig itemsUniqueConfig = new ItemsUniqueConfig(); - itemsUniqueConfig.initializeConfig(); - - MobCombatSettingsConfig mobCombatSettingsConfig = new MobCombatSettingsConfig(); - mobCombatSettingsConfig.initializeConfig(); - - ItemsDropSettingsConfig itemsDropSettingsConfig = new ItemsDropSettingsConfig(); - itemsDropSettingsConfig.initializeConfig(); - - PlayerGuildRank playerGuildRank = new PlayerGuildRank(); - playerGuildRank.intializeConfig(); - - PlayerMaxGuildRank playerMaxGuildRank = new PlayerMaxGuildRank(); - playerMaxGuildRank.intializeConfig(); - - CombatTagConfig combatTagConfig = new CombatTagConfig(); - combatTagConfig.initializeConfig(); - - AdventurersGuildConfig adventurersGuildConfig = new AdventurersGuildConfig(); - adventurersGuildConfig.initializeConfig(); - - CustomEnchantmentsConfig customEnchantmentsConfig = new CustomEnchantmentsConfig(); - customEnchantmentsConfig.initializeConfig(); - - } - -} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/ConfigurationEngine.java b/src/main/java/com/magmaguy/elitemobs/config/ConfigurationEngine.java new file mode 100644 index 000000000..c47c3692e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/ConfigurationEngine.java @@ -0,0 +1,80 @@ +package com.magmaguy.elitemobs.config; + +import com.magmaguy.elitemobs.config.translations.TranslationsConfig; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.SkullMeta; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class ConfigurationEngine extends com.magmaguy.magmacore.config.ConfigurationEngine { + + public static String setString(File file, FileConfiguration fileConfiguration, String key, String defaultValue, boolean translatable) { + fileConfiguration.addDefault(key, defaultValue); + if (translatable) + return TranslationsConfig.add(file.getName(), key, ChatColorConverter.convert(fileConfiguration.getString(key))); + else + return ChatColorConverter.convert(fileConfiguration.getString(key)); + } + + public static String setString(List comments, File file, FileConfiguration fileConfiguration, String key, String defaultValue, boolean translatable) { + String value = setString(file, fileConfiguration, key, defaultValue, translatable); + setComments(fileConfiguration, key, comments); + return value; + } + + public static List setList(File file, FileConfiguration fileConfiguration, String key, List defaultValue, boolean translatable) { + fileConfiguration.addDefault(key, defaultValue); + if (translatable) + return TranslationsConfig.add(file.getName(), key, (List) fileConfiguration.getList(key)); + else + return fileConfiguration.getList(key); + } + + public static List setList(List comment, File file, FileConfiguration fileConfiguration, String key, List defaultValue, boolean translatable) { + List value = setList(file, fileConfiguration, key, defaultValue, translatable); + setComments(fileConfiguration, key, comment); + return value; + } + + public static ItemStack setItemStack(File file, FileConfiguration fileConfiguration, String key, ItemStack itemStack, boolean translatable) { + fileConfiguration.addDefault(key + ".material", itemStack.getType().toString()); + if (itemStack.hasItemMeta() && itemStack.getItemMeta().hasDisplayName()) + fileConfiguration.addDefault(key + ".name", itemStack.getItemMeta().getDisplayName()); + if (itemStack.hasItemMeta() && itemStack.getItemMeta().hasLore()) + fileConfiguration.addDefault(key + ".lore", itemStack.getItemMeta().getLore()); + if (itemStack.getType().equals(Material.PLAYER_HEAD)) + fileConfiguration.addDefault(key + ".owner", ((SkullMeta) itemStack.getItemMeta()).getOwner()); + Material material; + try { + material = Material.valueOf(fileConfiguration.getString(key + ".material")); + } catch (Exception ex) { + Logger.warn("Material type " + fileConfiguration.getString(key + ".material") + " is not valid! Correct it to make a valid item."); + return null; + } + String name = ""; + try { + name = setString(file, fileConfiguration, key + ".name", itemStack.getItemMeta().getDisplayName(), true); + } catch (Exception ex) { + Logger.warn("Item name " + fileConfiguration.getString(key + ".name") + " is not valid! Correct it to make a valid item."); + } + List lore = new ArrayList<>(); + try { + lore = setList(file, fileConfiguration, key + ".lore", null, true); + } catch (Exception ex) { + Logger.warn("Item lore " + fileConfiguration.getString(key + ".lore") + " is not valid! Correct it to make a valid item."); + } + ItemStack fileItemStack = ItemStackGenerator.generateItemStack(material, name, lore); + if (material == Material.PLAYER_HEAD) + ((SkullMeta) itemStack.getItemMeta()).setOwningPlayer(Bukkit.getOfflinePlayer(fileConfiguration.getString(key + ".owner"))); + return fileItemStack; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/ConfigurationExporter.java b/src/main/java/com/magmaguy/elitemobs/config/ConfigurationExporter.java new file mode 100644 index 000000000..d0fbb9990 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/ConfigurationExporter.java @@ -0,0 +1,98 @@ +package com.magmaguy.elitemobs.config; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.scheduler.BukkitRunnable; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.security.DigestInputStream; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +public class ConfigurationExporter { + private ConfigurationExporter() { + } + + public static void initializeConfigs() { + new BukkitRunnable() { + @Override + public void run() { + Path configurationsPath = Paths.get(MetadataHandler.PLUGIN.getDataFolder().getAbsolutePath()); + if (!Files.isDirectory(Paths.get(configurationsPath.normalize() + "" + File.separatorChar + "exports"))) { + try { + Files.createDirectory(Paths.get(configurationsPath.normalize() + "" + File.separatorChar + "exports")); + } catch (Exception exception) { + Logger.warn("Failed to create exports directory! Tell the dev!"); + exception.printStackTrace(); + } + } + try { + File rspFile = Paths.get(configurationsPath.normalize() + "" + File.separatorChar + "exports" + File.separatorChar + "elitemobs_resource_pack.zip").toFile(); + if (rspFile.exists()) rspFile.delete(); + downloadFile("https://magmaguy.com/downloads/elitemobs_resource_pack.zip", Paths.get(configurationsPath.normalize() + "" + File.separatorChar + "exports").toAbsolutePath().toString()); + } catch (Exception e) { + Logger.warn("Failed to download official resource pack! Tell the dev!"); + e.printStackTrace(); + } + } + }.runTaskAsynchronously(MetadataHandler.PLUGIN); + } + + public static void downloadFile(String fileURL, String saveFilePath) throws IOException { + URL url = new URL(fileURL); + HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); + int responseCode = httpConn.getResponseCode(); + + // Check HTTP response code first + if (responseCode == HttpURLConnection.HTTP_OK) { + String fileName = ""; + String disposition = httpConn.getHeaderField("Content-Disposition"); + + if (disposition != null) { + // Extracts file name from header field + int index = disposition.indexOf("filename="); + if (index > 0) { + fileName = disposition.substring(index + 10, disposition.length() - 1); + } + } else { + // Extracts file name from URL + fileName = fileURL.substring(fileURL.lastIndexOf("/") + 1); + } + + // Opens input stream from the HTTP connection + InputStream inputStream = httpConn.getInputStream(); + String saveFilePathWithName = saveFilePath + File.separatorChar + fileName; + + // Opens an output stream to save into file + FileOutputStream outputStream = new FileOutputStream(saveFilePathWithName); + + int bytesRead = -1; + byte[] buffer = new byte[4096]; + while ((bytesRead = inputStream.read(buffer)) != -1) { + outputStream.write(buffer, 0, bytesRead); + } + + outputStream.close(); + inputStream.close(); + + } else { + Logger.warn("No file to download. Server replied HTTP code: " + responseCode); + } + httpConn.disconnect(); + } + + public static byte[] sha1CodeByteArray(File file) throws IOException, NoSuchAlgorithmException { + FileInputStream fileInputStream = new FileInputStream(file); + MessageDigest digest = MessageDigest.getInstance("SHA-1"); + DigestInputStream digestInputStream = new DigestInputStream(fileInputStream, digest); + byte[] bytes = new byte[1024]; + // read all file content + while (digestInputStream.read(bytes) > 0) digest = digestInputStream.getMessageDigest(); + return digest.digest(); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/CustomConfigConstructor.java b/src/main/java/com/magmaguy/elitemobs/config/CustomConfigConstructor.java deleted file mode 100644 index 10f18ba99..000000000 --- a/src/main/java/com/magmaguy/elitemobs/config/CustomConfigConstructor.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.config; - -/** - * Created by MagmaGuy on 01/05/2017. - */ - -import com.magmaguy.elitemobs.MetadataHandler; -import org.bukkit.Bukkit; -import org.bukkit.configuration.InvalidConfigurationException; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.plugin.Plugin; - -import java.io.File; -import java.io.IOException; -import java.io.InputStreamReader; - -public class CustomConfigConstructor extends YamlConfiguration { - - Plugin plugin = Bukkit.getPluginManager().getPlugin(MetadataHandler.ELITE_MOBS); - private File file; - private String defaults; - - /** - * Creates new PluginFile, without defaults - * - * @param fileName - Name of the file - */ - public CustomConfigConstructor(String fileName) { - this(fileName, null); - } - - /** - * Creates new PluginFile, with defaults - * - * @param fileName - Name of the file - * @param defaultsName - Name of the defaults - */ - public CustomConfigConstructor(String fileName, String defaultsName) { - this.defaults = defaultsName; - File newFile = new File(plugin.getDataFolder().getPath()+"/data"); - Bukkit.getLogger().info("ATTENTION: " + newFile.toString()); - this.file = new File(newFile, fileName); - reload(); - } - - /** - * Reload configuration - */ - public void reload() { - - if (!file.exists()) { - - try { - file.getParentFile().mkdirs(); - file.createNewFile(); - - } catch (IOException exception) { - exception.printStackTrace(); - plugin.getLogger().severe("Error while creating file " + file.getName()); - } - - } - - try { - load(file); - - if (defaults != null) { - InputStreamReader reader = new InputStreamReader(plugin.getResource(defaults)); - FileConfiguration defaultsConfig = YamlConfiguration.loadConfiguration(reader); - - setDefaults(defaultsConfig); - options().copyDefaults(true); - - reader.close(); - save(); - } - - } catch (IOException exception) { - exception.printStackTrace(); - plugin.getLogger().severe("Error while loading file " + file.getName()); - - } catch (InvalidConfigurationException exception) { - exception.printStackTrace(); - plugin.getLogger().severe("Error while loading file " + file.getName()); - - } - - } - - /** - * Save configuration - */ - public void save() { - - try { - options().indent(2); - save(file); - - } catch (IOException exception) { - exception.printStackTrace(); - plugin.getLogger().severe("Error while saving file " + file.getName()); - } - - } - -} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/CustomConfigFields.java b/src/main/java/com/magmaguy/elitemobs/config/CustomConfigFields.java new file mode 100644 index 000000000..3e22bd9a9 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/CustomConfigFields.java @@ -0,0 +1,50 @@ +package com.magmaguy.elitemobs.config; + +import com.magmaguy.elitemobs.config.translations.TranslationsConfig; +import org.bukkit.configuration.ConfigurationSection; + +import java.util.List; +import java.util.Map; + +public class CustomConfigFields extends com.magmaguy.magmacore.config.CustomConfigFields { + + /** + * Used by plugin-generated files (defaults) + * + * @param filename + * @param isEnabled + */ + public CustomConfigFields(String filename, boolean isEnabled) { + super(filename, isEnabled); + } + + @Override + public void processConfigFields() { + + } + + @Override + public String getFilename() { + return super.getFilename(); + } + + protected String translatable(String filename, String key, String value) { + return TranslationsConfig.add(filename, key, value); + } + + protected List translatable(String filename, String key, List value) { + return TranslationsConfig.add(filename, key, value); + } + + public ConfigurationSection processConfigurationSection(String path, Map value) { + if (!configHas(path) && value != null) + fileConfiguration.addDefaults(value); + ConfigurationSection newValue = fileConfiguration.getConfigurationSection(path); + if (newValue == null) return null; + + for (String key : newValue.getKeys(true)) + if (key.equalsIgnoreCase("message")) + newValue.set(key, translatable(filename, key, (String) newValue.get(key))); + return newValue; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/CustomConfigLoader.java b/src/main/java/com/magmaguy/elitemobs/config/CustomConfigLoader.java deleted file mode 100644 index 0c3c6e048..000000000 --- a/src/main/java/com/magmaguy/elitemobs/config/CustomConfigLoader.java +++ /dev/null @@ -1,167 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.config; - -import com.magmaguy.elitemobs.MetadataHandler; -import org.bukkit.Bukkit; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.plugin.Plugin; - -import java.io.*; -import java.util.logging.Level; - -/** - * Created by MagmaGuy on 01/05/2017. - */ -public class CustomConfigLoader { - - Plugin plugin = Bukkit.getPluginManager().getPlugin(MetadataHandler.ELITE_MOBS); - private FileConfiguration customConfig = null; - private File customConfigFile = null; - - public FileConfiguration getCustomConfig(String configName) { - - return getCustomConfig(configName, false); - - } - - public FileConfiguration getCustomConfig(String configName, boolean isDataFile) { - - if (customConfig == null) { - - reloadCustomConfig(configName, isDataFile); - - } - - return customConfig; - } - - public void reloadCustomConfig(String configName, boolean isDataFile) { - - if (customConfigFile == null && !isDataFile) { - - customConfigFile = new File(plugin.getDataFolder(), configName); - - } - - if (customConfigFile == null && isDataFile) { - - customConfigFile = new File(plugin.getDataFolder(), "data/" + configName); - - if (!customConfigFile.exists()) customConfigFile.getParentFile().mkdirs(); - - } - - customConfig = YamlConfiguration.loadConfiguration(customConfigFile); - - // Look for defaults in the jar - Reader defConfigStream = null; - - try { - - defConfigStream = new InputStreamReader(plugin.getResource(configName), "UTF8"); - - } catch (UnsupportedEncodingException e) { - - e.printStackTrace(); - } - - if (defConfigStream != null) { - - YamlConfiguration defConfig = YamlConfiguration.loadConfiguration(customConfigFile); - - customConfig = defConfig; - - } - - } - - public void saveCustomConfig(String configName) { - - if (customConfig == null || customConfigFile == null) { - - return; - - } - - try { - - getCustomConfig(configName).save(customConfigFile); - - } catch (IOException ex) { - - Bukkit.getLogger().log(Level.SEVERE, "Could not save config to " + customConfigFile, ex); - - } - - } - - public void saveCustomConfig(String configName, boolean isDataFile) { - - if (customConfig == null || customConfigFile == null) { - - return; - - } - - if (!isDataFile) return; - - try { - - getCustomConfig(configName).save(customConfigFile); - - } catch (IOException ex) { - - Bukkit.getLogger().log(Level.SEVERE, "Could not save config to " + customConfigFile, ex); - - } - - } - - public void saveDefaultCustomConfig(String configName) { - - if (customConfigFile == null) { - - customConfigFile = new File(plugin.getDataFolder(), configName); - - } - - if (!customConfigFile.exists()) { - - plugin.saveResource(configName, false); - - } - - } - - public void saveDefaultCustomConfig(String configName, boolean isDataFile) { - - if (customConfigFile == null && isDataFile) { - - customConfigFile = new File(plugin.getDataFolder(), "data/" + configName); - - } - - if (!customConfigFile.exists()) { - - plugin.saveResource(configName, false); - - } - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/config/CustomEnchantmentsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/CustomEnchantmentsConfig.java deleted file mode 100644 index 67e54c361..000000000 --- a/src/main/java/com/magmaguy/elitemobs/config/CustomEnchantmentsConfig.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.magmaguy.elitemobs.config; - -import org.bukkit.configuration.Configuration; - -public class CustomEnchantmentsConfig{ - - public static final String CONFIG_NAME = "CustomEnchantments.yml"; - private CustomConfigLoader customConfigLoader = new CustomConfigLoader(); - private Configuration configuration = customConfigLoader.getCustomConfig(CONFIG_NAME); - - public static String HUNTER_NAME = "HunterEnchantment enchantment name"; - public static String HUNTER_SPAWN_BONUS = "Percentual elite mob increase in spawn rate around the player per hunter enchantment level"; - public static String FLAMETHROWER_NAME = "FlamethrowerEnchantment enchantment name"; - - public void initializeConfig() { - - configuration.addDefault(HUNTER_NAME, "HunterEnchantment"); - configuration.addDefault(HUNTER_SPAWN_BONUS, 2); - configuration.addDefault(FLAMETHROWER_NAME, "FlamethrowerEnchantment"); - - customConfigLoader.getCustomConfig(CONFIG_NAME).options().copyDefaults(true); - UnusedNodeHandler.clearNodes(configuration); - customConfigLoader.saveDefaultCustomConfig(CONFIG_NAME); - customConfigLoader.saveCustomConfig(CONFIG_NAME); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/config/DatabaseConfig.java b/src/main/java/com/magmaguy/elitemobs/config/DatabaseConfig.java new file mode 100644 index 000000000..1650f8522 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/DatabaseConfig.java @@ -0,0 +1,38 @@ +package com.magmaguy.elitemobs.config; + +import com.magmaguy.magmacore.config.ConfigurationFile; +import lombok.Getter; + +import java.util.List; + +public class DatabaseConfig extends ConfigurationFile { + @Getter + public static boolean useMySQL; + @Getter + public static String mysqlHost; + @Getter + public static String mysqlPort; + @Getter + public static String mysqlDatabaseName; + @Getter + public static String mysqlUsername; + @Getter + public static String mysqlPassword; + @Getter + public static boolean useSSL; + + public DatabaseConfig() { + super("Database.yml"); + } + + @Override + public void initializeValues() { + useMySQL = ConfigurationEngine.setBoolean(List.of("Sets whether MySQL will be used. By default EliteMobs uses SQLite. If you wish to use MySQL you will need a valid MySQL configuration."), fileConfiguration, "useMySQL", false); + mysqlHost = ConfigurationEngine.setString(List.of("The host of your MySQL database"), file, fileConfiguration, "mysqlHost", "localhost", false); + mysqlPort = ConfigurationEngine.setString(List.of("The port of your MySQL database"), file, fileConfiguration, "mysqlPort", "3306", false); + mysqlDatabaseName = ConfigurationEngine.setString(List.of("The name of the database"), file, fileConfiguration, "mysqlDatabaseName", "elitemobs", false); + mysqlUsername = ConfigurationEngine.setString(List.of("The username for MySQl"), file, fileConfiguration, "mysqlUsername", "your_username_mysql_here", false); + mysqlPassword = ConfigurationEngine.setString(List.of("The password for your MysSQL database"), file, fileConfiguration, "mysqlPassword", "your_mysql_password_here", false); + useSSL = ConfigurationEngine.setBoolean(List.of("Whether to use SSL"), fileConfiguration, "useSSL", true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/DefaultConfig.java b/src/main/java/com/magmaguy/elitemobs/config/DefaultConfig.java index 81b45ffeb..6972a4ecf 100644 --- a/src/main/java/com/magmaguy/elitemobs/config/DefaultConfig.java +++ b/src/main/java/com/magmaguy/elitemobs/config/DefaultConfig.java @@ -1,77 +1,209 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package com.magmaguy.elitemobs.config; -import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.commands.ReloadCommand; +import com.magmaguy.elitemobs.config.translations.TranslationsConfig; +import com.magmaguy.elitemobs.utils.ConfigurationLocation; +import com.magmaguy.magmacore.config.ConfigurationFile; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; import org.bukkit.Bukkit; -import org.bukkit.configuration.Configuration; +import org.bukkit.Location; +import org.bukkit.command.CommandSender; + +import java.util.List; /** * Created by MagmaGuy on 08/06/2017. */ -public class DefaultConfig { - - public static final String ALWAYS_SHOW_NAMETAGS = "Always show Elite Mob nametags"; - public static final String SUPERMOB_STACK_AMOUNT = "SuperMob (passive EliteMobs) stack amount"; - public static final String MMORPG_COLORS = "Use MMORPG colors for item ranks"; - public static final String CREEPER_PASSIVE_DAMAGE_PREVENTER = "Prevent creepers from killing passive mobs"; - public static final String ENABLE_PERMISSION_TITLES = "Use titles to warn players they are missing a permission"; - public static final String ENABLE_POWER_SCOREBOARDS = "Use scoreboards to display mob powers using permissions"; - public static final String HIDE_ENCHANTMENTS_ATTRIBUTE = "Hide enchantment attributes on plugin-generated items"; - public static final String PREVENT_ITEM_PICKUP = "Prevent item pickup from all aggressive mobs"; - public static final String PREVENT_ELITE_MOB_CONVERSION_OF_NAMED_MOBS = "Make aggressive named mobs unable to become Elite Mobs"; - public static final String PREVENT_MOUNT_EXPLOIT = "Prevent Minecraft living entity mount exploit for Elite Mobs"; - public static final String STRICT_SPAWNING_RULES = "Strict spawning rules mode for better compatibility with other plugins"; - public static final String PREVENT_TOWER_EXPLOIT = "Prevent tower exploit"; - public static final String PREVENT_DARKROOM_EXPLOIT = "Prevent dark room spawner exploit"; - - public static void reloadConfig() { - - Bukkit.getPluginManager().getPlugin("EliteMobs").reloadConfig(); - +public class DefaultConfig extends ConfigurationFile { + @Getter + public static DefaultConfig instance; + @Getter + private static boolean alwaysShowNametags; + @Getter + private static int superMobStackAmount; + @Getter + private static boolean preventCreeperDamageToPassiveMobs; + @Getter + private static boolean doPermissionTitles; + @Getter + private static boolean preventEliteMobConversionOfNamedMobs; + @Getter + private static boolean doStrictSpawningRules; + @Getter + private static double nightmareWorldSpawnBonus; + @Getter + private static boolean emLeadsToStatusMenu; + @Getter + private static boolean otherCommandsLeadToEMStatusMenu; + @Getter + private static boolean setupDone; + @Getter + private static Location defaultSpawnLocation; + @Getter + private static boolean doExplosionRegen; + @Getter + private static boolean preventVanillaReinforcementsForEliteEntities; + @Getter + private static boolean doRegenerateContainers; + @Getter + private static int defaultTransitiveBlockLimiter; + @Getter + private static boolean onlyUseBedrockMenus; + @Getter + private static int characterLimitForBookMenuPages; + @Getter + private static boolean useGlassToFillMenuEmptySpace; + @Getter + private static boolean menuUnicodeFormatting; + @Getter + private static String language; + @Getter + private static String noPendingCommands; + @Getter + private static String trackMessage; + @Getter + private static String chestLowRankMessage; + @Getter + private static String chestCooldownMessage; + @Getter + private static String dismissEMMessage; + @Getter + private static String switchEMStyleMessage; + @Getter + private static String treasureChestNoDropMessage; + @Getter + private static String bossAlreadyGoneMessage; + @Getter + private static boolean resetPlayerScaleOnLogin; + @Getter + private static boolean forceMenuUnicode; + + public DefaultConfig() { + super("config.yml"); + instance = this; } - public void loadConfiguration() { - - Configuration configuration = Bukkit.getPluginManager().getPlugin(MetadataHandler.ELITE_MOBS).getConfig(); - - configuration.addDefault(SUPERMOB_STACK_AMOUNT, 50); - configuration.addDefault(MMORPG_COLORS, true); - configuration.addDefault(CREEPER_PASSIVE_DAMAGE_PREVENTER, true); - configuration.addDefault(ENABLE_PERMISSION_TITLES, true); - configuration.addDefault(ENABLE_POWER_SCOREBOARDS, false); - configuration.addDefault(ALWAYS_SHOW_NAMETAGS, true); - configuration.addDefault(HIDE_ENCHANTMENTS_ATTRIBUTE, false); - configuration.addDefault(PREVENT_ITEM_PICKUP, false); - configuration.addDefault(PREVENT_ELITE_MOB_CONVERSION_OF_NAMED_MOBS, true); - configuration.addDefault(STRICT_SPAWNING_RULES, false); - configuration.addDefault(PREVENT_MOUNT_EXPLOIT, true); - configuration.addDefault(PREVENT_TOWER_EXPLOIT, true); - configuration.addDefault(PREVENT_DARKROOM_EXPLOIT, true); - - configuration.options().copyDefaults(true); - - UnusedNodeHandler.clearNodes(configuration); - - //save the config when changed - Bukkit.getPluginManager().getPlugin(MetadataHandler.ELITE_MOBS).saveConfig(); - Bukkit.getPluginManager().getPlugin(MetadataHandler.ELITE_MOBS).saveDefaultConfig(); + public static void toggleSetupDone() { + setupDone = !setupDone; + instance.fileConfiguration.set("setupDoneV3", setupDone); + save(); + } - Bukkit.getLogger().info("EliteMobs config loaded!"); + public static void save() { + ConfigurationEngine.fileSaverOnlyDefaults(instance.fileConfiguration, instance.file); + } + public static void setLanguage(CommandSender commandSender, String filename) { + language = filename; + instance.fileConfiguration.set("language", filename); + ConfigurationEngine.fileSaverCustomValues(instance.fileConfiguration, instance.file); + ReloadCommand.reload(commandSender); } + @Override + public void initializeValues() { + //The language changes what data is loaded downstream + language = ConfigurationEngine.setString( + List.of("Sets the language file used by EliteMobs", "Do NOT change this manually! It is meant to be installed with the command '/em language '"), + file, fileConfiguration, "language", "english", false); + //This needs to be initialized as soon as the language is figured out + new TranslationsConfig(); + + alwaysShowNametags = ConfigurationEngine.setBoolean( + List.of("Sets whether elites and bosses spawned by elitemobs will always show their nametags.", "Not recommended!"), + fileConfiguration, "alwaysShowEliteMobNameTags", false); + superMobStackAmount = Math.max(ConfigurationEngine.setInt( + List.of("Sets the amount of passive mobs that have to be in close proximity before they can be merged.", "Don't set this to 0!"), + fileConfiguration, "superMobStackAmount", 50), 1); + preventCreeperDamageToPassiveMobs = ConfigurationEngine.setBoolean( + List.of("Makes elites not damage passive mobs with explosions."), + fileConfiguration, "preventEliteCreeperDamageToPassiveMobs", true); + doPermissionTitles = ConfigurationEngine.setBoolean( + List.of("Sets whether EliteMobs will use titles to warn players about missing permissions"), + fileConfiguration, "useTitlesForMissingPermissionMessages", true); + preventEliteMobConversionOfNamedMobs = ConfigurationEngine.setBoolean( + List.of("Sets whether EliteMobs will prevent converting named mobs to elites.", "Especially important for compatibility with other plugins."), + fileConfiguration, "preventEliteMobConversionOfNamedMobs", true); + doStrictSpawningRules = ConfigurationEngine.setBoolean( + List.of("Sets if EliteMobs will convert mobs with custom spawn reasons.", "Running certain boss plugins will automatically set this to true, no matter what the value in the config is."), + fileConfiguration, "enableHighCompatibilityMode", false); + if (Bukkit.getPluginManager().isPluginEnabled("MythicMobs") || + Bukkit.getPluginManager().isPluginEnabled("LevelledMobs")) { + Logger.info("Other boss mob plugins have been detected, high compatibility mode will be used!"); + doStrictSpawningRules = true; + } + nightmareWorldSpawnBonus = ConfigurationEngine.setDouble( + List.of("Sets the elite spawn bonus for the nightmare gamemode"), + fileConfiguration, "nightmareWorldSpawnBonus", 0.5); + emLeadsToStatusMenu = ConfigurationEngine.setBoolean( + List.of("Sets if the centralized /em command opens the main status page of the plugin.", "Highly recommended!"), + fileConfiguration, "emLeadsToStatusMenu", true); + otherCommandsLeadToEMStatusMenu = ConfigurationEngine.setBoolean( + List.of("Sets if running specific commands like /em wallet will lead to the /em menu where that information is centralized."), + fileConfiguration, "otherCommandsLeadToEMStatusMenu", true); + setupDone = ConfigurationEngine.setBoolean( + List.of("Sets if the setup is complete.", "Do not set this value manually, it is meant to be modified through in-game commands."), + fileConfiguration, "setupDoneV3", false); + preventVanillaReinforcementsForEliteEntities = ConfigurationEngine.setBoolean( + List.of("Sets if elites will prevent spawning vanilla reinforcements, such as for the Zombie reinforcement feature."), + fileConfiguration, "preventVanillaReinforcementsForEliteEntities", true); + try { + defaultSpawnLocation = ConfigurationLocation.serialize( + ConfigurationEngine.setString( + List.of("Sets the default spawn location of the server for EliteMobs. /em spawntp will lead to this location."), + file, fileConfiguration, "defaultSpawnLocation", + ConfigurationLocation.deserialize(Bukkit.getWorlds().get(0).getSpawnLocation()), false)); + } catch (Exception ex) { + Logger.warn("There is an issue with your defaultSpawnLocation in the config.yml configuration file! Fix it!"); + } + + doExplosionRegen = ConfigurationEngine.setBoolean( + List.of("Sets if EliteMobs will regenerate blocks blown up by elites."), + fileConfiguration, "doExplosionRegen", true); + doRegenerateContainers = ConfigurationEngine.setBoolean( + List.of("Sets if the explosion regen will also regenerate the contents of containers such as chests.", "Turning it to false will make elite explosions not blow up containers."), + fileConfiguration, "doRegenerateContainers", true); + defaultTransitiveBlockLimiter = ConfigurationEngine.setInt(fileConfiguration, "defaultTransitiveBlockLimiter", 500); + onlyUseBedrockMenus = ConfigurationEngine.setBoolean( + List.of("Sets whether the /em menu will only use the inventory-based menu style which is compatible with bedrock.", "As a reminder, players can otherwise do the command /em alt to switch between /em menu styles"), + fileConfiguration, "onlyUseBedrockMenus", false); + characterLimitForBookMenuPages = ConfigurationEngine.setInt( + List.of("Sets the character limit per line for book menu pages.", "Lower this amount if text is getting cut off in book menus such as for quests"), + fileConfiguration, "characterLimitForBookMenuPagesV2", 170); + useGlassToFillMenuEmptySpace = ConfigurationEngine.setBoolean( + List.of("Sets if empty menu space will be filled with glass panes.", "Not recommended if you are using the EliteMobs resource pack."), + fileConfiguration, "useGlassToFillMenuEmptySpace", false); + menuUnicodeFormatting = ConfigurationEngine.setBoolean( + List.of("Sets if unicode will be used to format the EliteMobs resource pack.", + "Do not set this manually, it is set automatically upon installation of the resource pack.", + "Only set it manually if you had to merge the EliteMobs resource pack, and expect that the spacing might not work if you do that."), + fileConfiguration, "menuUnicodeFormatting", false); + noPendingCommands = ConfigurationEngine.setString( + List.of("Sets the message sent to players if they run '/em confirm' with no pending commands."), + file, fileConfiguration, "noPendingCommands", "&cYou don't currently have any pending commands!", true); + trackMessage = ConfigurationEngine.setString( + List.of("Sets the tracking message for bosses that send tracking messages."), + file, fileConfiguration, "trackMessage", "Track the $name", true); + chestLowRankMessage = ConfigurationEngine.setString( + List.of("Sets the message sent to players that open treasure chests with level requirements above their guild rank."), + file, fileConfiguration, "chestLowRankMessage", "&7[EM] &cYour guild rank needs to be at least $rank &cin order to open this chest!", true); + chestCooldownMessage = ConfigurationEngine.setString( + List.of("Sets the message sent to players that try to reopen a treasure chest they have already opened."), + file, fileConfiguration, "chestCooldownMessage", "&7[EM] &cYou've already opened this chest recently! Wait $time!", true); + dismissEMMessage = ConfigurationEngine.setString( + List.of("Sets the message that appears recommending the /em alt command for players having issues with the /em command"), + file, fileConfiguration, "dismissEMMessage", "&8[EliteMobs] &2/elitemobs &fmenu not working for you? Try &2/elitemobs alt &fto see an alternative version of the menu! &cDon't want to see this message again? &4/em dismiss", true); + switchEMStyleMessage = ConfigurationEngine.setString( + List.of("Sets the message that appears when players run the /em alt command."), + file, fileConfiguration, "switchEMStyleMessage", "&8[EliteMobs] &2/elitemobs &fmenu style changed! Check it out!", true); + treasureChestNoDropMessage = ConfigurationEngine.setString( + List.of("Sets the message that appears when a player opens a treasure chest but gets nothing"), + file, fileConfiguration, "treasureChestNoDropMessage", "&8[EliteMobs] &cYou didn't get anything! Better luck next time!", true); + bossAlreadyGoneMessage = ConfigurationEngine.setString( + List.of("Sets the message that appears when a player tries to track a boss that is no longer valid"), + file, fileConfiguration, "bossAlreadyGoneMessage", "&c[EliteMobs] Sorry, this boss is already gone!", true); + resetPlayerScaleOnLogin = ConfigurationEngine.setBoolean(List.of("Sets whether to reset player scale (literally, the player size on login).", "This is important because some elite powers can modify it and if the server crashes players will be stuck to whatever scale was set when the server crashed, unless this option is set to true."), fileConfiguration, "resetPlayerScale", true); + forceMenuUnicode = ConfigurationEngine.setBoolean(List.of("Sets whether the menu unicodes for the resource pack should be forced even if the pack is not being hosted through the recommended methods (which is using ResourcePackManager)"), fileConfiguration, "forceMenuUnicode", false); + } } diff --git a/src/main/java/com/magmaguy/elitemobs/config/DiscordSRVConfig.java b/src/main/java/com/magmaguy/elitemobs/config/DiscordSRVConfig.java new file mode 100644 index 000000000..8afc3545e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/DiscordSRVConfig.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config; + +import com.magmaguy.magmacore.config.ConfigurationFile; +import lombok.Getter; + +import java.util.List; + +public class DiscordSRVConfig extends ConfigurationFile { + + @Getter + private static String announcementRoomName; + + public DiscordSRVConfig() { + super("DiscordSRV.yml"); + } + + @Override + public void initializeValues() { + announcementRoomName = ConfigurationEngine.setString( + List.of("Documentation can be found here: https://github.com/MagmaGuy/EliteMobs/wiki/DiscordSRV---Discord-broadcasts"), + file, fileConfiguration, "announcementRoomName", + "YOU_NEED_TO_PUT_THE_NAME_OF_THE_DISCORD_ROOM_YOU_WANT_ELITEMOBS" + + "_ANNOUNCEMENTS_TO_BE_BROADCASTED_IN_AS_YOU_HAVE_IN_YOUR_DISCORDSRV_" + + "CONFIGURATION_FILE_CHECK_ELITEMOBS_WIKI_FOR_DETAILS", false); + + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/DungeonsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/DungeonsConfig.java new file mode 100644 index 000000000..12944c718 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/DungeonsConfig.java @@ -0,0 +1,97 @@ +package com.magmaguy.elitemobs.config; + +import com.magmaguy.magmacore.config.ConfigurationFile; +import lombok.Getter; + +import java.util.List; + +public class DungeonsConfig extends ConfigurationFile { + + @Getter + private static String instancedDungeonTitle; + @Getter + private static List instancedDungeonDescription; + @Getter + private static String dungeonRezInstructions; + @Getter + private static String dungeonLivesLeftText; + @Getter + private static String dungeonJoinAsPlayerText; + @Getter + private static String dungeonJoinAsSpectatorText; + @Getter + private static boolean allowSpectatorsInInstancedContent; + @Getter + private static String instancedDungeonCompleteMessage; + @Getter + private static String instancedDungeonClosingInstanceMessage; + @Getter + private static boolean friendlyFireInDungeons; + @Getter + private static double fireDamageMultiplier; + @Getter + private static double poisonDamageMultiplier; + @Getter + private static double witherDamageMultiplier; + + public DungeonsConfig() { + super("dungeons.yml"); + } + + @Override + public void initializeValues() { + + dungeonRezInstructions = ConfigurationEngine.setString( + List.of("Sets the text that appears over resurrection banners in dungeons"), + file, fileConfiguration, "dungeonRezInstructions", "&aPunch to rez!", true); + dungeonLivesLeftText = ConfigurationEngine.setString( + List.of("Sets the text that shows how many lives players have left in a dungeon! Placeholders:", "$amount - the amount of lives left"), + file, fileConfiguration, "dungeonLivesLeftText", "&c$amount lives left!", true); + dungeonJoinAsPlayerText = ConfigurationEngine.setString( + List.of("Sets the text for joining a dungeon as a player! Placeholders:", "$dungeonName - the name of the dungeon"), + file, fileConfiguration, "joinDungeonAsPlayerText", "&fJoin $dungeonName as a player!", true); + dungeonJoinAsSpectatorText = ConfigurationEngine.setString( + List.of("Sets the text for joining a dungeon as a spectator! Placeholders:", "$dungeonName - the name of the dungeon"), + file, fileConfiguration, "joinDungeonAsSpectatorText", "&fJoin $dungeonName as a spectator!", true); + instancedDungeonTitle = ConfigurationEngine.setString( + List.of( + "Sets the title that will show up in the item description of instanced dungeon menus", + "$difficulty is the placeholder for the difficulty name in the configuration file of the dungeon"), + file, fileConfiguration, "instancedDungeonTitle", "Start $difficulty difficulty dungeon!", + true); + instancedDungeonDescription = ConfigurationEngine.setList( + List.of("Sets the description that will show up in the item description of instanced dungeon menus", + "$dungeonName is the placeholder for the dungeon name in the configuration file of the dungeon"), + file, + fileConfiguration, + "instancedDungeonDescription", + List.of("&fCreate a new instance of the dungeon", "$dungeonName &ffor yourself and maybe", "&fsome friends!"), + true); + allowSpectatorsInInstancedContent = ConfigurationEngine.setBoolean( + List.of("Sets is spectating instanced content will be available."), + fileConfiguration, "allowSpectatorsInInstancedContent", true); + instancedDungeonCompleteMessage = ConfigurationEngine.setString( + List.of("Sets the message that appears when an instanced dungeon is completed"), + file, fileConfiguration, "instancedDungeonCompleteMessage", "[EliteMobs] Dungeon completed! It will self-destruct in 2 minutes!", + true); + instancedDungeonClosingInstanceMessage = ConfigurationEngine.setString( + List.of("Sets the message that appears when an instanced dungeon closing"), + file, fileConfiguration, "instancedDungeonClosingInstanceMessage", "[EliteMobs] Closing instance!", + true); + friendlyFireInDungeons = ConfigurationEngine.setBoolean( + List.of("Sets if PvP will be allowed in dungeons"), + fileConfiguration, "friendlyFireInDungeons", false); + fireDamageMultiplier = ConfigurationEngine.setDouble( + List.of("Sets the damage multiplier for fire damage in dungeons", + "This is important for balance as by default the damage is a bit too high for the dungeons as we design them"), + fileConfiguration, "fireDamageMultiplier", 0.5); + witherDamageMultiplier = ConfigurationEngine.setDouble( + List.of("Sets the damage multiplier for wither damage in dungeons", + "This is important for balance as by default the damage is a bit too high for the dungeons as we design them"), + fileConfiguration, "witherDamageMultiplier", 0.5); + poisonDamageMultiplier = ConfigurationEngine.setDouble( + List.of("Sets the damage multiplier for fire damage in dungeons", + "This is important for balance as by default the damage is a bit too high for the dungeons as we design them"), + fileConfiguration, "poisonDamageMultiplier", 0.5); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/EconomySettingsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/EconomySettingsConfig.java index 6863efb39..20a73bea6 100644 --- a/src/main/java/com/magmaguy/elitemobs/config/EconomySettingsConfig.java +++ b/src/main/java/com/magmaguy/elitemobs/config/EconomySettingsConfig.java @@ -1,317 +1,280 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package com.magmaguy.elitemobs.config; -import com.magmaguy.elitemobs.mobconstructor.CombatSystem; -import org.bukkit.configuration.Configuration; +import com.magmaguy.elitemobs.combatsystem.CombatSystem; +import com.magmaguy.magmacore.config.ConfigurationFile; +import lombok.Getter; +import org.bukkit.Material; +import org.bukkit.configuration.file.FileConfiguration; -import java.util.Arrays; +import java.util.List; /** * Created by MagmaGuy on 17/06/2017. */ -public class EconomySettingsConfig { +public class EconomySettingsConfig extends ConfigurationFile { + @Getter + private static boolean enableEconomy; + @Getter + private static double resaleValue; + @Getter + private static String currencyName; + @Getter + private static boolean useVault; + @Getter + private static boolean enableCurrencyShower; + @Getter + private static double currencyShowerMultiplier; + @Getter + private static String chatCurrencyShowerMessage; + @Getter + private static String actionBarCurrencyShowerMessage; + @Getter + private static String lootShowerMaterial1; + @Getter + private static String lootShowerMaterial5; + @Getter + private static String lootShowerMaterial10; + @Getter + private static String lootShowerMaterial20; + @Getter + private static String lootShowerMaterial50; + @Getter + private static String lootShowerMaterial100; + @Getter + private static String lootShowerMaterial500; + @Getter + private static String lootShowerMaterial1000; + @Getter + private static String adventurersGuildNotificationMessage; + @Getter + private static double defaultMaterialWorth; + @Getter + private static FileConfiguration thisConfiguration; + @Getter + private static double playerToPlayerTaxes; + @Getter + private static String economyPayMessage; + @Getter + private static String economyCurrencyLeftMessage; + @Getter + private static String economyPaymentReceivedMessage; + @Getter + private static String economyPaymentInsufficientCurrency; + @Getter + private static String economyWalletCommand; + @Getter + private static String economyTaxMessage; + @Getter + private static String shopBuyMessage; + @Getter + private static String shopSellMessage; + @Getter + private static String shopInsufficientFundsMessage; + @Getter + private static String shopSaleInstructions; + @Getter + private static String shopSaleOthersItems; + @Getter + private static String shopCurrentBalance; + @Getter + private static String shopItemPrice; + @Getter + private static String shopBatchSellMessage; - public static final String CONFIG_NAME = "EconomySettings.yml"; - public static final String ENABLE_ECONOMY = "Enable economy"; - public static final String RESALE_VALUE = "Item resale value (percentage)"; - public static final String LOWEST_PROCEDURALLY_SIMULATED_LOOT = "Procedurally Generated Loot.Lowest shop item tier"; - public static final String HIGHEST_PROCEDURALLY_SIMULATED_LOOT = "Procedurally Generated Loot.Highest shop item tier"; - public static final String CURRENCY_NAME = "Currency name"; - public static final String SHOP_NAME = "Shop name"; - public static final String CUSTOM_SHOP_NAME = "Custom shop name"; - public static final String SIGNATURE_ITEM_LOCATION_SHOPS = "Reroll button location for EliteMobs Shops"; - public static final String SHOP_VALID_SLOTS = "Valid chest slots for EliteMobs Shop"; - public static final String CUSTOM_SHOP_VALID_SLOTS = "Valid chest slots for EliteMobs Custom Shop"; - private static final String MATERIAL_WORTH = "Material worth."; - public static final String DIAMOND_AXE = MATERIAL_WORTH + "DIAMOND_AXE"; - public static final String DIAMOND_BARDING = MATERIAL_WORTH + "DIAMOND_BARDING"; - public static final String DIAMOND_BLOCK = MATERIAL_WORTH + "DIAMOND_BLOCK"; - public static final String DIAMOND_BOOTS = MATERIAL_WORTH + "DIAMOND_BOOTS"; - public static final String DIAMOND_CHESTPLATE = MATERIAL_WORTH + "DIAMOND_CHESTPLATE"; - public static final String DIAMOND_HELMET = MATERIAL_WORTH + "DIAMOND_HELMET"; - public static final String DIAMOND_HOE = MATERIAL_WORTH + "DIAMOND_HOE"; - public static final String DIAMOND_LEGGINGS = MATERIAL_WORTH + "DIAMOND_LEGGINGS"; - public static final String DIAMOND_ORE = MATERIAL_WORTH + "DIAMOND_ORE"; - public static final String DIAMOND_PICKAXE = MATERIAL_WORTH + "DIAMOND_PICKAXE"; - public static final String DIAMOND_SPADE = MATERIAL_WORTH + "DIAMOND_SPADE"; - public static final String DIAMOND_SWORD = MATERIAL_WORTH + "DIAMOND_SWORD"; - public static final String IRON_AXE = MATERIAL_WORTH + "IRON_AXE"; - public static final String IRON_BARDING = MATERIAL_WORTH + "IRON_BARDING"; - public static final String IRON_BLOCK = MATERIAL_WORTH + "IRON_BLOCK"; - public static final String IRON_BOOTS = MATERIAL_WORTH + "IRON_BOOTS"; - public static final String IRON_CHESTPLATE = MATERIAL_WORTH + "IRON_CHESTPLATE"; - public static final String IRON_HELMET = MATERIAL_WORTH + "IRON_HELMET"; - public static final String IRON_HOE = MATERIAL_WORTH + "IRON_HOE"; - public static final String IRON_INGOT = MATERIAL_WORTH + "IRON_INGOT"; - public static final String IRON_LEGGINGS = MATERIAL_WORTH + "IRON_LEGGINGS"; - public static final String IRON_NUGGET = MATERIAL_WORTH + "IRON_NUGGET"; - public static final String IRON_ORE = MATERIAL_WORTH + "IRON_ORE"; - public static final String IRON_PICKAXE = MATERIAL_WORTH + "IRON_PICKAXE"; - public static final String IRON_SPADE = MATERIAL_WORTH + "IRON_SPADE"; - public static final String IRON_SWORD = MATERIAL_WORTH + "IRON_SWORD"; - public static final String SHIELD = MATERIAL_WORTH + "SHIELD"; - public static final String BOW = MATERIAL_WORTH + "BOW"; - public static final String CHAINMAIL_BOOTS = MATERIAL_WORTH + "CHAINMAIL_BOOTS"; - public static final String CHAINMAIL_CHESTPLATE = MATERIAL_WORTH + "CHAINMAIL_CHESTPLATE"; - public static final String CHAINMAIL_HELMET = MATERIAL_WORTH + "CHAINMAIL_HELMET"; - public static final String CHAINMAIL_LEGGINGS = MATERIAL_WORTH + "CHAINMAIL_LEGGINGS"; - public static final String STONE_SWORD = MATERIAL_WORTH + "STONE_SWORD"; - public static final String STONE_SPADE = MATERIAL_WORTH + "STONE_SPADE"; - public static final String STONE_PICKAXE = MATERIAL_WORTH + "STONE_PICKAXE"; - public static final String STONE_AXE = MATERIAL_WORTH + "STONE_AXE"; - public static final String GOLD_AXE = MATERIAL_WORTH + "GOLD_AXE"; - public static final String GOLD_BARDING = MATERIAL_WORTH + "GOLD_BARDING"; - public static final String GOLD_BLOCK = MATERIAL_WORTH + "GOLD_BLOCK"; - public static final String GOLD_BOOTS = MATERIAL_WORTH + "GOLD_BOOTS"; - public static final String GOLD_CHESTPLATE = MATERIAL_WORTH + "GOLD_CHESTPLATE"; - public static final String GOLD_HELMET = MATERIAL_WORTH + "GOLD_HELMET"; - public static final String GOLD_HOE = MATERIAL_WORTH + "GOLD_HOE"; - public static final String GOLD_INGOT = MATERIAL_WORTH + "GOLD_INGOT"; - public static final String GOLD_LEGGINGS = MATERIAL_WORTH + "GOLD_LEGGINGS"; - public static final String GOLD_NUGGET = MATERIAL_WORTH + "GOLD_NUGGET"; - public static final String GOLD_ORE = MATERIAL_WORTH + "GOLD_ORE"; - public static final String GOLD_PICKAXE = MATERIAL_WORTH + "GOLD_PICKAXE"; - public static final String GOLD_SPADE = MATERIAL_WORTH + "GOLD_SPADE"; - public static final String GOLD_SWORD = MATERIAL_WORTH + "GOLD_SWORD"; - public static final String GOLDEN_APPLE = MATERIAL_WORTH + "GOLDEN_APPLE"; - public static final String GOLDEN_CARROT = MATERIAL_WORTH + "GOLDEN_CARROT"; - public static final String LEATHER_BOOTS = MATERIAL_WORTH + "LEATHER_BOOTS"; - public static final String LEATHER_CHESTPLATE = MATERIAL_WORTH + "LEATHER_CHESTPLATE"; - public static final String LEATHER_HELMET = MATERIAL_WORTH + "LEATHER_HELMET"; - public static final String LEATHER_LEGGINGS = MATERIAL_WORTH + "LEATHER_LEGGINGS"; - public static final String WOOD_SWORD = MATERIAL_WORTH + "WOOD_SWORD"; - public static final String WOOD_AXE = MATERIAL_WORTH + "WOOD_AXE"; - public static final String WOOD_PICKAXE = MATERIAL_WORTH + "WOOD_PICKAXE"; - public static final String WOOD_HOE = MATERIAL_WORTH + "WOOD_HOE"; - public static final String OTHER = MATERIAL_WORTH + "OTHER"; + public EconomySettingsConfig() { + super("EconomySettings.yml"); + } - private static final String ENCHANTMENT_WORTH = "Enchantment worth."; - public static final String ARROW_DAMAGE = ENCHANTMENT_WORTH + "ARROW_DAMAGE"; - public static final String ARROW_FIRE = ENCHANTMENT_WORTH + "ARROW_FIRE"; - public static final String ARROW_INFINITE = ENCHANTMENT_WORTH + "ARROW_INFINITE"; - public static final String ARROW_KNOCKBACK = ENCHANTMENT_WORTH + "ARROW_KNOCKBACK"; - public static final String BINDING_CURSE = ENCHANTMENT_WORTH + "BINDING_CURSE"; - public static final String DAMAGE_ALL = ENCHANTMENT_WORTH + "DAMAGE_ALL"; - public static final String DAMAGE_ARTHROPODS = ENCHANTMENT_WORTH + "DAMAGE_ARTHROPODS"; - public static final String DAMAGE_UNDEAD = ENCHANTMENT_WORTH + "DAMAGE_UNDEAD"; - public static final String DEPTH_STRIDER = ENCHANTMENT_WORTH + "DEPTH_STRIDER"; - public static final String DIG_SPEED = ENCHANTMENT_WORTH + "DIG_SPEED"; - public static final String DURABILITY = ENCHANTMENT_WORTH + "DURABILITY"; - public static final String FIRE_ASPECT = ENCHANTMENT_WORTH + "FIRE_ASPECT"; - public static final String FROST_WALKER = ENCHANTMENT_WORTH + "FROST_WALKER"; - public static final String KNOCKBACK = ENCHANTMENT_WORTH + "KNOCKBACK"; - public static final String LOOT_BONUS_BLOCKS = ENCHANTMENT_WORTH + "LOOT_BONUS_BLOCKS"; - public static final String LOOT_BONUS_MOBS = ENCHANTMENT_WORTH + "LOOT_BONUS_MOBS"; - public static final String LUCK_ENCHANTMENT = ENCHANTMENT_WORTH + "LUCK"; - public static final String LURE = ENCHANTMENT_WORTH + "LURE"; - public static final String MENDING = ENCHANTMENT_WORTH + "MENDING"; - public static final String OXYGEN = ENCHANTMENT_WORTH + "OXYGEN"; - public static final String PROTECTION_ENVIRONMENTAL = ENCHANTMENT_WORTH + "PROTECTION_ENVIRONMENTAL"; - public static final String PROTECTION_EXPLOSIONS = ENCHANTMENT_WORTH + "PROTECTION_EXPLOSIONS"; - public static final String PROTECTION_FALL = ENCHANTMENT_WORTH + "PROTECTION_FALL"; - public static final String PROTECTION_PROJECTILE = ENCHANTMENT_WORTH + "PROTECTION_PROJECTILE"; - public static final String PROTECTION_FIRE = ENCHANTMENT_WORTH + "PROTECTION_FIRE"; - public static final String SILK_TOUCH = ENCHANTMENT_WORTH + "SILK_TOUCH"; - public static final String SWEEPING_EDGE = ENCHANTMENT_WORTH + "SWEEPING_EDGE"; - public static final String THORNS = ENCHANTMENT_WORTH + "THORNS"; - public static final String VANISHING_CURSE = ENCHANTMENT_WORTH + "VANISHING_CURSE"; - public static final String WATER_WORKER = ENCHANTMENT_WORTH + "WATER_WORKER"; + private static void addMaterial(FileConfiguration fileConfiguration, Material material, double value) { + ConfigurationEngine.setDouble( + List.of("Sets the worth of this material for the elitemobs currency system."), + fileConfiguration, "materialWorth." + material.name(), value); + } - private static final String POTION_EFFECT_WORTH = "Potion effect worth."; - public static final String ABSORPTION = POTION_EFFECT_WORTH + "ABSORPTION"; - public static final String BLINDNESS = POTION_EFFECT_WORTH + "BLINDNESS"; - public static final String CONFUSION = POTION_EFFECT_WORTH + "CONFUSION"; - public static final String DAMAGE_RESISTANCE = POTION_EFFECT_WORTH + "DAMAGE_RESISTANCE"; - public static final String FAST_DIGGING = POTION_EFFECT_WORTH + "FAST_DIGGING"; - public static final String FIRE_RESISTANCE = POTION_EFFECT_WORTH + "FIRE_RESISTANCE"; - public static final String GLOWING = POTION_EFFECT_WORTH + "GLOWING"; - public static final String HARM = POTION_EFFECT_WORTH + "HARM"; - public static final String HEAL = POTION_EFFECT_WORTH + "HEAL"; - public static final String HEALTH_BOOST = POTION_EFFECT_WORTH + "HEALTH_BOOST"; - public static final String HUNGER = POTION_EFFECT_WORTH + "HUNGER"; - public static final String INCREASE_DAMAGE = POTION_EFFECT_WORTH + "INCREASE_DAMAGE"; - public static final String INVISIBILITY = POTION_EFFECT_WORTH + "INVISIBILITY"; - public static final String JUMP = POTION_EFFECT_WORTH + "JUMP"; - public static final String LEVITATION = POTION_EFFECT_WORTH + "LEVITATION"; - public static final String LUCK_POTION = POTION_EFFECT_WORTH + "LUCK"; - public static final String NIGHT_VISION = POTION_EFFECT_WORTH + "NIGHT_VISION"; - public static final String POISON = POTION_EFFECT_WORTH + "POISON"; - public static final String REGENERATION = POTION_EFFECT_WORTH + "REGENERATION"; - public static final String SATURATION = POTION_EFFECT_WORTH + "SATURATION_NAME"; - public static final String SLOW = POTION_EFFECT_WORTH + "SLOW"; - public static final String SLOW_DIGGING = POTION_EFFECT_WORTH + "SLOW_DIGGING"; - public static final String SPEED = POTION_EFFECT_WORTH + "SPEED"; - public static final String UNLUCK = POTION_EFFECT_WORTH + "UNLUCK"; - public static final String WATER_BREATHING = POTION_EFFECT_WORTH + "WATER_BREATHING"; - public static final String WEAKNESS = POTION_EFFECT_WORTH + "WEAKNESS"; - public static final String WITHER = POTION_EFFECT_WORTH + "WITHER"; + public static double getMaterialWorth(Material material) { + try { + return thisConfiguration.getDouble("materialWorth." + material.name()); + } catch (Exception ex) { + return defaultMaterialWorth; + } + } - CustomConfigLoader customConfigLoader = new CustomConfigLoader(); - Configuration configuration = customConfigLoader.getCustomConfig(CONFIG_NAME); + @Override + public void initializeValues() { + double netheriteLevel = CombatSystem.NETHERITE_TIER_LEVEL + 10D; + double tridentLevel = CombatSystem.DIAMOND_TIER_LEVEL + 10D; + double diamondLevel = CombatSystem.DIAMOND_TIER_LEVEL + 10D; + double ironLevel = CombatSystem.IRON_TIER_LEVEL + 10D; + double stoneChainLevel = CombatSystem.STONE_CHAIN_TIER_LEVEL + 10D; + double goldWoodLeatherLevel = CombatSystem.GOLD_WOOD_LEATHER_TIER_LEVEL + 10D; - public void initializeConfig() { + enableEconomy = ConfigurationEngine.setBoolean( + List.of("Sets if the EliteMobs economy is enabled. This means elite coins, the ability to buy and sell gear and the ability to upgrade guild ranks", "If disabled, players will not be able to progress in the plugin!"), + fileConfiguration, "enableEconomy", true); + resaleValue = ConfigurationEngine.setDouble( + List.of("Sets the resale item of items, as a % of the original price. 5 is 5%"), + fileConfiguration, "itemResaleValue", 5); + currencyName = ConfigurationEngine.setString( + List.of("Sets the in-game name of the currency used."), + file, fileConfiguration, "currencyName", "Elite Coins", true); + useVault = ConfigurationEngine.setBoolean( + List.of("Sets the plugin to use Vault. THIS IS NOT RECOMMENDED! Read why here: https://github.com/MagmaGuy/EliteMobs/wiki/%5BThird-party-support%5D-Vault"), + fileConfiguration, "useVault - not recommended", false); + enableCurrencyShower = ConfigurationEngine.setBoolean( + List.of("Sets if elites will drop coins based on their level."), + fileConfiguration, "enableCurrencyShower", true); + currencyShowerMultiplier = ConfigurationEngine.setDouble( + List.of("Sets the multiplier for the currency dropped by elites."), + fileConfiguration, "currencyShowerTierMultiplier", 1D); + chatCurrencyShowerMessage = ConfigurationEngine.setString( + List.of("Sets the message sent when players pick up elite currency."), + file, fileConfiguration, "chatCurrencyShowerMessage", "&7[EM] You've picked up &a$amount $currency_name!", true); + actionBarCurrencyShowerMessage = ConfigurationEngine.setString( + List.of("Sets the action bar message sent when players pick up elite currency."), + file, fileConfiguration, "actionbarCurrencyShowerMessage", "&7[EM] You've picked up &a$amount $currency_name!", true); + lootShowerMaterial1 = ConfigurationEngine.setString( + List.of("Sets the material type of 1 dropped elite coin."), + file, fileConfiguration, "lootShowerMaterial.1", Material.GOLD_NUGGET.name(), false); + ConfigurationEngine.setInt( + List.of("Sets the custom model ID for 1 dropped elite coin. Used by the resource pack."), + fileConfiguration, "lootShowerData.1", 1); + lootShowerMaterial5 = ConfigurationEngine.setString(file, fileConfiguration, "lootShowerMaterial.5", Material.GOLD_INGOT.name(), false); + ConfigurationEngine.setInt(fileConfiguration, "lootShowerData.5", 1); + lootShowerMaterial10 = ConfigurationEngine.setString(file, fileConfiguration, "lootShowerMaterial.10", Material.GOLD_BLOCK.name(), false); + ConfigurationEngine.setInt(fileConfiguration, "lootShowerData.10", 1); + lootShowerMaterial20 = ConfigurationEngine.setString(file, fileConfiguration, "lootShowerMaterial.20", Material.EMERALD.name(), false); + ConfigurationEngine.setInt(fileConfiguration, "lootShowerData.20", 1); + lootShowerMaterial50 = ConfigurationEngine.setString(file, fileConfiguration, "lootShowerMaterial.50", Material.EMERALD_BLOCK.name(), false); + ConfigurationEngine.setInt(fileConfiguration, "lootShowerData.50", 1); + lootShowerMaterial100 = ConfigurationEngine.setString(file, fileConfiguration, "lootShowerMaterial.100", Material.DIAMOND.name(), false); + ConfigurationEngine.setInt(fileConfiguration, "lootShowerData.100", 1); + lootShowerMaterial500 = ConfigurationEngine.setString(file, fileConfiguration, "lootShowerMaterial.500", Material.DIAMOND_BLOCK.name(), false); + ConfigurationEngine.setInt(fileConfiguration, "lootShowerData.500", 1); + lootShowerMaterial1000 = ConfigurationEngine.setString(file, fileConfiguration, "lootShowerMaterial.1000", Material.NETHER_STAR.name(), false); + ConfigurationEngine.setInt(fileConfiguration, "lootShowerData.1000", 1); + adventurersGuildNotificationMessage = ConfigurationEngine.setString( + List.of("Send the message players get after looting currency. Useful for tutorial purposes."), + file, fileConfiguration, "adventurersGuildNotificationMessages", "&7[EM] Extra spending money? Try &a/ag !", true); - double diamondLevel = CombatSystem.DIAMOND_TIER_LEVEL + 10; - double ironLevel = CombatSystem.IRON_TIER_LEVEL + 10; - double stoneChainLevel = CombatSystem.STONE_CHAIN_TIER_LEVEL + 10; - double goldWoodLeatherLevel = CombatSystem.GOLD_WOOD_LEATHER_TIER_LEVEL + 10; + addMaterial(fileConfiguration, Material.DIAMOND_AXE, diamondLevel); + addMaterial(fileConfiguration, Material.DIAMOND_BOOTS, diamondLevel); + addMaterial(fileConfiguration, Material.DIAMOND_CHESTPLATE, diamondLevel); + addMaterial(fileConfiguration, Material.DIAMOND_LEGGINGS, diamondLevel); + addMaterial(fileConfiguration, Material.DIAMOND_HELMET, diamondLevel); + addMaterial(fileConfiguration, Material.DIAMOND_PICKAXE, diamondLevel); + addMaterial(fileConfiguration, Material.DIAMOND_SHOVEL, diamondLevel); + addMaterial(fileConfiguration, Material.DIAMOND_SWORD, diamondLevel); + addMaterial(fileConfiguration, Material.DIAMOND_HOE, diamondLevel); - configuration.addDefault(ENABLE_ECONOMY, true); - configuration.addDefault(RESALE_VALUE, 5); - configuration.addDefault(LOWEST_PROCEDURALLY_SIMULATED_LOOT, 1); - configuration.addDefault(HIGHEST_PROCEDURALLY_SIMULATED_LOOT, 5); - configuration.addDefault(CURRENCY_NAME, "Elite Coins"); - configuration.addDefault(SHOP_NAME, "EliteMobs Shop"); - configuration.addDefault(CUSTOM_SHOP_NAME, "EliteMobs Custom Shop"); - configuration.addDefault(SIGNATURE_ITEM_LOCATION_SHOPS, 4); - configuration.addDefault(SHOP_VALID_SLOTS, Arrays.asList(9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 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)); - configuration.addDefault(CUSTOM_SHOP_VALID_SLOTS, Arrays.asList(9, 10, 11, 12, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 22, 23, 24, 25, 26, 27, 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)); + addMaterial(fileConfiguration, Material.IRON_AXE, ironLevel); + addMaterial(fileConfiguration, Material.IRON_BOOTS, ironLevel); + addMaterial(fileConfiguration, Material.IRON_LEGGINGS, ironLevel); + addMaterial(fileConfiguration, Material.IRON_CHESTPLATE, ironLevel); + addMaterial(fileConfiguration, Material.IRON_HELMET, ironLevel); + addMaterial(fileConfiguration, Material.IRON_PICKAXE, ironLevel); + addMaterial(fileConfiguration, Material.IRON_SHOVEL, ironLevel); + addMaterial(fileConfiguration, Material.IRON_HOE, ironLevel); + addMaterial(fileConfiguration, Material.IRON_SWORD, ironLevel); + addMaterial(fileConfiguration, Material.SHIELD, ironLevel); + addMaterial(fileConfiguration, Material.BOW, ironLevel); - configuration.addDefault(DIAMOND_AXE, diamondLevel); - configuration.addDefault(DIAMOND_BARDING, diamondLevel); - configuration.addDefault(DIAMOND_BLOCK, diamondLevel); - configuration.addDefault(DIAMOND_BOOTS, diamondLevel); - configuration.addDefault(DIAMOND_CHESTPLATE, diamondLevel); - configuration.addDefault(DIAMOND_HELMET, diamondLevel); - configuration.addDefault(DIAMOND_HOE, diamondLevel); - configuration.addDefault(DIAMOND_LEGGINGS, diamondLevel); - configuration.addDefault(DIAMOND_ORE, diamondLevel); - configuration.addDefault(DIAMOND_PICKAXE, diamondLevel); - configuration.addDefault(DIAMOND_SPADE, diamondLevel); - configuration.addDefault(DIAMOND_SWORD, diamondLevel); - configuration.addDefault(IRON_AXE, ironLevel); - configuration.addDefault(IRON_BARDING, ironLevel); - configuration.addDefault(IRON_BLOCK, ironLevel); - configuration.addDefault(IRON_BOOTS, ironLevel); - configuration.addDefault(IRON_CHESTPLATE, ironLevel); - configuration.addDefault(IRON_HELMET, ironLevel); - configuration.addDefault(IRON_HOE, ironLevel); - configuration.addDefault(IRON_INGOT, ironLevel); - configuration.addDefault(IRON_LEGGINGS, ironLevel); - configuration.addDefault(IRON_NUGGET, ironLevel); - configuration.addDefault(IRON_ORE, ironLevel); - configuration.addDefault(IRON_PICKAXE, ironLevel); - configuration.addDefault(IRON_SPADE, ironLevel); - configuration.addDefault(IRON_SWORD, ironLevel); - configuration.addDefault(SHIELD, ironLevel); - configuration.addDefault(BOW, ironLevel); - configuration.addDefault(CHAINMAIL_BOOTS, stoneChainLevel); - configuration.addDefault(CHAINMAIL_CHESTPLATE, stoneChainLevel); - configuration.addDefault(CHAINMAIL_HELMET, stoneChainLevel); - configuration.addDefault(CHAINMAIL_LEGGINGS, stoneChainLevel); - configuration.addDefault(STONE_SWORD, stoneChainLevel); - configuration.addDefault(STONE_AXE, stoneChainLevel); - configuration.addDefault(STONE_PICKAXE, stoneChainLevel); - configuration.addDefault(STONE_SPADE, stoneChainLevel); - configuration.addDefault(GOLD_AXE, goldWoodLeatherLevel); - configuration.addDefault(GOLD_BARDING, goldWoodLeatherLevel); - configuration.addDefault(GOLD_BLOCK, goldWoodLeatherLevel); - configuration.addDefault(GOLD_BOOTS, goldWoodLeatherLevel); - configuration.addDefault(GOLD_CHESTPLATE, goldWoodLeatherLevel); - configuration.addDefault(GOLD_HELMET, goldWoodLeatherLevel); - configuration.addDefault(GOLD_HOE, goldWoodLeatherLevel); - configuration.addDefault(GOLD_INGOT, goldWoodLeatherLevel); - configuration.addDefault(GOLD_LEGGINGS, goldWoodLeatherLevel); - configuration.addDefault(GOLD_NUGGET, goldWoodLeatherLevel); - configuration.addDefault(GOLD_ORE, goldWoodLeatherLevel); - configuration.addDefault(GOLD_PICKAXE, goldWoodLeatherLevel); - configuration.addDefault(GOLD_SPADE, goldWoodLeatherLevel); - configuration.addDefault(GOLD_SWORD, goldWoodLeatherLevel); - configuration.addDefault(GOLDEN_APPLE, goldWoodLeatherLevel); - configuration.addDefault(GOLDEN_CARROT, goldWoodLeatherLevel); - configuration.addDefault(LEATHER_BOOTS, goldWoodLeatherLevel); - configuration.addDefault(LEATHER_CHESTPLATE, goldWoodLeatherLevel); - configuration.addDefault(LEATHER_HELMET, goldWoodLeatherLevel); - configuration.addDefault(LEATHER_LEGGINGS, goldWoodLeatherLevel); - configuration.addDefault(WOOD_SWORD, goldWoodLeatherLevel); - configuration.addDefault(WOOD_AXE, goldWoodLeatherLevel); - configuration.addDefault(WOOD_PICKAXE, goldWoodLeatherLevel); - configuration.addDefault(WOOD_HOE, goldWoodLeatherLevel); - configuration.addDefault(OTHER, 1); + addMaterial(fileConfiguration, Material.CHAINMAIL_BOOTS, stoneChainLevel); + addMaterial(fileConfiguration, Material.CHAINMAIL_LEGGINGS, stoneChainLevel); + addMaterial(fileConfiguration, Material.CHAINMAIL_CHESTPLATE, stoneChainLevel); + addMaterial(fileConfiguration, Material.CHAINMAIL_HELMET, stoneChainLevel); - configuration.addDefault(ARROW_DAMAGE, diamondLevel); - configuration.addDefault(ARROW_FIRE, diamondLevel / 2); - configuration.addDefault(ARROW_INFINITE, diamondLevel / 2); - configuration.addDefault(ARROW_KNOCKBACK, diamondLevel / 2); - configuration.addDefault(BINDING_CURSE, -1); - configuration.addDefault(DAMAGE_ALL, diamondLevel); - configuration.addDefault(DAMAGE_ARTHROPODS, diamondLevel / 2); - configuration.addDefault(DAMAGE_UNDEAD, diamondLevel / 2); - configuration.addDefault(DEPTH_STRIDER, 1); - configuration.addDefault(DIG_SPEED, diamondLevel); - configuration.addDefault(DURABILITY, diamondLevel); - configuration.addDefault(FIRE_ASPECT, diamondLevel / 2); - configuration.addDefault(FROST_WALKER, 1); - configuration.addDefault(KNOCKBACK, diamondLevel / 2); - configuration.addDefault(LOOT_BONUS_BLOCKS, diamondLevel); - configuration.addDefault(LOOT_BONUS_MOBS, diamondLevel / 2); - configuration.addDefault(LUCK_ENCHANTMENT, 1); - configuration.addDefault(LURE, 1); - configuration.addDefault(MENDING, diamondLevel * 2); - configuration.addDefault(OXYGEN, 1); - configuration.addDefault(PROTECTION_ENVIRONMENTAL, diamondLevel); - configuration.addDefault(PROTECTION_EXPLOSIONS, diamondLevel / 2); - configuration.addDefault(PROTECTION_FALL, diamondLevel / 2); - configuration.addDefault(PROTECTION_FIRE, diamondLevel / 2); - configuration.addDefault(PROTECTION_PROJECTILE, diamondLevel); - configuration.addDefault(SILK_TOUCH, diamondLevel); - configuration.addDefault(SWEEPING_EDGE, diamondLevel); - configuration.addDefault(THORNS, diamondLevel); - configuration.addDefault(VANISHING_CURSE, -1); - configuration.addDefault(WATER_WORKER, 1); + addMaterial(fileConfiguration, Material.STONE_SWORD, stoneChainLevel); + addMaterial(fileConfiguration, Material.STONE_AXE, stoneChainLevel); + addMaterial(fileConfiguration, Material.STONE_PICKAXE, stoneChainLevel); + addMaterial(fileConfiguration, Material.STONE_SHOVEL, stoneChainLevel); + addMaterial(fileConfiguration, Material.STONE_HOE, stoneChainLevel); - configuration.addDefault(ABSORPTION, (diamondLevel) * 10); - configuration.addDefault(BLINDNESS, (diamondLevel / 2) * 10); - configuration.addDefault(CONFUSION, (diamondLevel / 2) * 10); - configuration.addDefault(DAMAGE_RESISTANCE, (diamondLevel) * 10); - configuration.addDefault(FAST_DIGGING, (diamondLevel) * 10); - configuration.addDefault(FIRE_RESISTANCE, (diamondLevel / 2) * 10); - configuration.addDefault(GLOWING, (1) * 10); - configuration.addDefault(HARM, (diamondLevel) * 10); - configuration.addDefault(HEAL, (diamondLevel) * 10); - configuration.addDefault(HEALTH_BOOST, (diamondLevel) * 10); - configuration.addDefault(HUNGER, (1) * 10); - configuration.addDefault(INCREASE_DAMAGE, (diamondLevel) * 10); - configuration.addDefault(INVISIBILITY, (diamondLevel / 2) * 10); - configuration.addDefault(JUMP, (diamondLevel / 2) * 10); - configuration.addDefault(LEVITATION, (diamondLevel / 2) * 10); - configuration.addDefault(LUCK_POTION, (1) * 10); - configuration.addDefault(NIGHT_VISION, (1) * 10); - configuration.addDefault(POISON, (diamondLevel / 2) * 10); - configuration.addDefault(REGENERATION, (diamondLevel) * 10); - configuration.addDefault(SATURATION, (diamondLevel / 2) * 10); - configuration.addDefault(SLOW, (diamondLevel / 2) * 10); - configuration.addDefault(SLOW_DIGGING, (1) * 10); - configuration.addDefault(SPEED, (diamondLevel / 2) * 10); - configuration.addDefault(UNLUCK, (1) * 10); - configuration.addDefault(WATER_BREATHING, (1) * 10); - configuration.addDefault(WEAKNESS, (diamondLevel) * 10); - configuration.addDefault(WITHER, (diamondLevel / 2) * 10); + addMaterial(fileConfiguration, Material.GOLDEN_AXE, goldWoodLeatherLevel); + addMaterial(fileConfiguration, Material.GOLDEN_BOOTS, goldWoodLeatherLevel); + addMaterial(fileConfiguration, Material.GOLDEN_LEGGINGS, goldWoodLeatherLevel); + addMaterial(fileConfiguration, Material.GOLDEN_CHESTPLATE, goldWoodLeatherLevel); + addMaterial(fileConfiguration, Material.GOLDEN_HELMET, goldWoodLeatherLevel); + addMaterial(fileConfiguration, Material.GOLDEN_SWORD, goldWoodLeatherLevel); + addMaterial(fileConfiguration, Material.GOLDEN_SHOVEL, goldWoodLeatherLevel); + addMaterial(fileConfiguration, Material.GOLDEN_PICKAXE, goldWoodLeatherLevel); + addMaterial(fileConfiguration, Material.GOLDEN_HOE, goldWoodLeatherLevel); + addMaterial(fileConfiguration, Material.GOLDEN_APPLE, diamondLevel); + addMaterial(fileConfiguration, Material.ENCHANTED_GOLDEN_APPLE, diamondLevel); - configuration.options().copyDefaults(true); - UnusedNodeHandler.clearNodes(configuration); - customConfigLoader.saveDefaultCustomConfig(CONFIG_NAME); - customConfigLoader.saveCustomConfig(CONFIG_NAME); + addMaterial(fileConfiguration, Material.LEATHER_BOOTS, goldWoodLeatherLevel); + addMaterial(fileConfiguration, Material.LEATHER_LEGGINGS, goldWoodLeatherLevel); + addMaterial(fileConfiguration, Material.LEATHER_CHESTPLATE, goldWoodLeatherLevel); + addMaterial(fileConfiguration, Material.LEATHER_HELMET, goldWoodLeatherLevel); - } + addMaterial(fileConfiguration, Material.WOODEN_SWORD, goldWoodLeatherLevel); + addMaterial(fileConfiguration, Material.WOODEN_AXE, goldWoodLeatherLevel); + addMaterial(fileConfiguration, Material.WOODEN_HOE, goldWoodLeatherLevel); + addMaterial(fileConfiguration, Material.WOODEN_PICKAXE, goldWoodLeatherLevel); + addMaterial(fileConfiguration, Material.TRIDENT, tridentLevel); + addMaterial(fileConfiguration, Material.ELYTRA, diamondLevel); + addMaterial(fileConfiguration, Material.TURTLE_HELMET, goldWoodLeatherLevel); + + addMaterial(fileConfiguration, Material.NETHERITE_AXE, netheriteLevel); + addMaterial(fileConfiguration, Material.NETHERITE_PICKAXE, netheriteLevel); + addMaterial(fileConfiguration, Material.NETHERITE_SHOVEL, netheriteLevel); + addMaterial(fileConfiguration, Material.NETHERITE_HOE, netheriteLevel); + addMaterial(fileConfiguration, Material.NETHERITE_SWORD, netheriteLevel); + addMaterial(fileConfiguration, Material.NETHERITE_HELMET, netheriteLevel); + addMaterial(fileConfiguration, Material.NETHERITE_CHESTPLATE, netheriteLevel); + addMaterial(fileConfiguration, Material.NETHERITE_LEGGINGS, netheriteLevel); + addMaterial(fileConfiguration, Material.NETHERITE_BOOTS, netheriteLevel); + + defaultMaterialWorth = ConfigurationEngine.setDouble( + List.of("Sets the default material worth for items not specifically defined."), + fileConfiguration, "materialWorth.defaultMaterialWorth", 1); + playerToPlayerTaxes = ConfigurationEngine.setDouble( + List.of("Sets the tax rate for transactions between players.", "Strongly recommended for balance reasons, as high level players can gain up to 6x more currency and try to use other players to bypass prestige currency resets."), + fileConfiguration, "playerToPlayerPaymentTaxes", 0.2); + + economyPayMessage = ConfigurationEngine.setString( + List.of("Message sent when sending elite currency to other players."), + file, fileConfiguration, "Economy pay message v2", "&2You have paid &2$amount_sent $currency_name &2to $receiver&2, who got $amount_received after taxes!", true); + economyCurrencyLeftMessage = ConfigurationEngine.setString( + List.of("Message sent after players send currency."), + file, fileConfiguration, "Economy currency left message", "You now have &2$amount_left $currency_name", true); + economyPaymentReceivedMessage = ConfigurationEngine.setString( + List.of("Message received when receiving currency."), + file, fileConfiguration, "Economy money from payment message", "You have received &2$amount_received $currency_name &ffrom $sender", true); + economyPaymentInsufficientCurrency = ConfigurationEngine.setString( + List.of("Message sent when players try to send an amount of coins they do not have."), + file, fileConfiguration, "Economy payment insufficient currency", "&cYou don't have enough $currency_name to do that!", true); + economyWalletCommand = ConfigurationEngine.setString( + List.of("/em balance message"), + file, fileConfiguration, "Wallet command message", "You have &2$balance $currency_name", true); + economyTaxMessage = ConfigurationEngine.setString( + List.of("Confirmation message sent when players try to send currency to another player."), + file, fileConfiguration, "Tax confirmation message", "&cSending a payment will cost $percentage% in taxes. &aDo &9$command &ato proceed!", true); + shopBuyMessage = ConfigurationEngine.setString( + List.of("Message sent when a player buys from a shop."), + file, fileConfiguration, "Shop buy message", "&aYou have bought $item_name &afor $item_value $currency_name!", true); + shopCurrentBalance = ConfigurationEngine.setString( + List.of("Message sent when a player interacts with a shop."), + file, fileConfiguration, "Shop current balance message", "&aYou have $currency_amount $currency_name.", true); + shopInsufficientFundsMessage = ConfigurationEngine.setString( + List.of("Message sent when players don't have enough currency to purchase an item"), + file, fileConfiguration, "Shop insufficient funds message", "&cYou don't have enough $currency_name!", true); + shopItemPrice = ConfigurationEngine.setString( + List.of("Second part of message sent when players try to purchase an item they can not afford."), + file, fileConfiguration, "Shop item cost message", "That item costs &c$item_value $currency_name.", true); + shopSellMessage = ConfigurationEngine.setString( + List.of("Message sent upon selling an item to a shop."), + file, fileConfiguration, "Shop sell message", "&aYou have sold $item_name &afor $currency_amount $currency_name!", true); + shopSaleOthersItems = ConfigurationEngine.setString( + List.of("Message sent upon trying to sell an item that does not belong to that player."), + file, fileConfiguration, "Shop sale player items warning", "&cYou can't sell items that are not currently soulbound to you! This includes items from other prestige tiers!", true); + shopSaleInstructions = ConfigurationEngine.setString( + List.of("Message sent upon trying to sell a non-EliteMobs item"), + file, fileConfiguration, "Shop sale instructions", "&cYou can only sell EliteMobs loot here! (Armor / weapons dropped from elites showing a value on their lore)", true); + shopBatchSellMessage = ConfigurationEngine.setString( + List.of("Message sent upon selling a batch of elite items."), + file, fileConfiguration, "shopBatchSellItem", "&aYou have sold your items &afor $currency_amount $currency_name!", true); + + } } diff --git a/src/main/java/com/magmaguy/elitemobs/config/EventsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/EventsConfig.java index 81ba5fa0b..2d72be5c4 100644 --- a/src/main/java/com/magmaguy/elitemobs/config/EventsConfig.java +++ b/src/main/java/com/magmaguy/elitemobs/config/EventsConfig.java @@ -1,120 +1,45 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package com.magmaguy.elitemobs.config; -import org.bukkit.configuration.Configuration; - -public class EventsConfig { - - public static final String CONFIG_NAME = "events.yml"; - public static final String ENABLE_EVENTS = "Enable events"; - public static final String MINIMUM_ONLINE_PLAYERS = "Minimum amount of online players for event to trigger"; - public static final String MAXIMUM_ONLINE_PLAYERS = "Maximum amount of online players after which the event frequency won't increase"; - public static final String MINIMUM_EVENT_FREQUENCY = "Minimum event frequency (minutes)"; - public static final String MAXIMUM_EVENT_FREQUENCY = "Maximum event frequency (minutes)"; - private static final String ENABLED_EVENTS = "Enabled events."; - public static final String TREASURE_GOBLIN_SMALL_ENABLED = ENABLED_EVENTS + "Small treasure goblin"; - public static final String DEAD_MOON_ENABLED = ENABLED_EVENTS + "Dead moon"; - public static final String KRAKEN_ENABLED = ENABLED_EVENTS + "Kraken"; - public static final String BALROG_ENABLED = ENABLED_EVENTS + "Balrog"; - public static final String FAE_ENABLED = ENABLED_EVENTS + "Fae"; - public static final String TREASURE_GOBLIN_NAME = "Name of mob in Treasure Goblin events"; - public static final String SMALL_TREASURE_GOBLIN_EVENT_ANNOUNCEMENT_TEXT = "Small treasure goblin event announcement text"; - public static final String SMALL_TREASURE_GOBLIN_EVENT_PLAYER_END_TEXT = "Small treasure goblin killed by players message"; - public static final String SMALL_TREASURE_GOBLIN_EVENT_OTHER_END_TEXT = "Small treasure goblin nondescript death message"; - public static final String SMALL_TREASURE_GOBLIN_REWARD = "Treasure goblin extra loot drop amount"; - public static final String DEAD_MOON_EVENT_ANNOUNCEMENT_TEXT = "Dead Moon event announcement text"; - public static final String DEAD_MOON_EVENT_PLAYER_END_TEXT = "Zombie King killed by players message"; - public static final String DEAD_MOON_EVENT_OTHER_END_TEXT = "Zombie King nondescript death message"; - private static final String DEAD_MOON_NAMES = "Dead moon names."; - public static final String DEAD_MOON_THE_RETURNED_NAME = DEAD_MOON_NAMES + "Name of The Returned"; - public static final String DEAD_MOON_ZOMBIE_KING_NAME = DEAD_MOON_NAMES + "Name of the Zombie King"; - private static final String EVENT_WEIGHT = "Event weight."; - public static final String SMALL_TREASURE_GOBLIN_EVENT_WEIGHT = EVENT_WEIGHT + "Small treasure goblin"; - public static final String DEAD_MOON_EVENT_WEIGHT = EVENT_WEIGHT + "Blood moon"; - public static final String EVENT_TIMEOUT_TIME = "Time before boss mob escapes the map"; - public static final String EVENT_TIMEOUT_MESSAGE = "Message for when boss mobs gets culled"; - public static final String SPIRIT_WALK_HIT_INTERVAL = "Number of hits before spirit walk gets activated"; - public static final String ZOMBIE_KING_FLAMETHROWER_INTERVAL = "Time interval between zombie king flamethrower attacks"; - public static final String ZOMBIE_KING_UNHOLY_SMITE_INTERVAL = "Time interval between zombie king unholy smite attacks"; - public static final String ZOMBIE_KING_SUMMON_MINIONS_INTERVAL = "Time interval between zombie king minion summons"; - public static final String TREASURE_GOBLIN_GOLD_SHOTGUN_INTERVAL = "Time interval between treasure goblin gold shotgun shots"; - public static final String TREASURE_GOBLIN_RADIAL_EXPLOSION = "Time interval between treasure goblin radial explosions"; - public static final String KRAKEN_CHANCE_ON_FISH = "Kraken on fish chance"; - public static final String KRAKEN_NAME = "Name of mob in Kraken event"; - public static final String BALROG_CHANCE_ON_MINE = "Balrog chance on mine"; - public static final String BALROG_NAME = "Name of mob in Balrog event"; - public static final String BALROG_TRASH_MOB_NAME = "Name of trash mobs in Balrog event"; - public static final String FAE_NAME = "Name of mob in Fae event"; - public static final String FAE_CHANCE_ON_CHOP = "Fae chance on chop"; - public static final String ANNOUNCEMENT_BROADCAST_WORLD_ONLY = "Only broadcast event message in event world"; - public static final String DEADMOON_ANNOUNCEMENT_MESSAGE = "Deadmoon announcement message"; - public static final String DEADMOON_END_MESSAGE = "Deadmoon end message"; - - CustomConfigLoader customConfigLoader = new CustomConfigLoader(); - Configuration configuration = customConfigLoader.getCustomConfig(CONFIG_NAME); - - public void initializeConfig() { - - configuration.addDefault(ENABLE_EVENTS, true); - configuration.addDefault(MINIMUM_ONLINE_PLAYERS, 2); - configuration.addDefault(MAXIMUM_ONLINE_PLAYERS, 100); - configuration.addDefault(MINIMUM_EVENT_FREQUENCY, 45); - configuration.addDefault(MAXIMUM_EVENT_FREQUENCY, 10); - configuration.addDefault(TREASURE_GOBLIN_SMALL_ENABLED, true); - configuration.addDefault(DEAD_MOON_ENABLED, true); - configuration.addDefault(TREASURE_GOBLIN_NAME, "&eTreasure Goblin"); - configuration.addDefault(SMALL_TREASURE_GOBLIN_EVENT_ANNOUNCEMENT_TEXT, "&7&m-----------------------------------------------------\n&7[&aEvent&7] &fA &ctreasure goblin &fhas appeared in&c $world &fat&c $location \n &fMake sure to take a hunting party with you!\n&7&m-----------------------------------------------------"); - configuration.addDefault(SMALL_TREASURE_GOBLIN_EVENT_PLAYER_END_TEXT, "A Treasure Goblin has been slain by $player!"); - configuration.addDefault(SMALL_TREASURE_GOBLIN_EVENT_OTHER_END_TEXT, "A Treasure Goblin has been slain!"); - configuration.addDefault(SMALL_TREASURE_GOBLIN_REWARD, 10); - configuration.addDefault(DEAD_MOON_EVENT_ANNOUNCEMENT_TEXT, "&7&m-----------------------------------------------------\n&7[&aEvent&7] &fA &cZombie King &fhas appeared in&c $world &fat&c $location \n &fMake sure to take a hunting party with you!\n&7&m-----------------------------------------------------"); - configuration.addDefault(DEAD_MOON_EVENT_PLAYER_END_TEXT, "The Zombie King has been slain by $player!"); - configuration.addDefault(DEAD_MOON_EVENT_OTHER_END_TEXT, "The Zombie King has been slain!"); - configuration.addDefault(DEAD_MOON_THE_RETURNED_NAME, "&2The Returned"); - configuration.addDefault(DEAD_MOON_ZOMBIE_KING_NAME, "&4Zombie King"); - configuration.addDefault(SMALL_TREASURE_GOBLIN_EVENT_WEIGHT, 40); - configuration.addDefault(DEAD_MOON_EVENT_WEIGHT, 20); - configuration.addDefault(EVENT_TIMEOUT_TIME, 30); - configuration.addDefault(EVENT_TIMEOUT_MESSAGE, "$bossmob has escaped!"); - configuration.addDefault(SPIRIT_WALK_HIT_INTERVAL, 15); - configuration.addDefault(ZOMBIE_KING_FLAMETHROWER_INTERVAL, 20); - configuration.addDefault(ZOMBIE_KING_UNHOLY_SMITE_INTERVAL, 20); - configuration.addDefault(ZOMBIE_KING_SUMMON_MINIONS_INTERVAL, 20); - configuration.addDefault(TREASURE_GOBLIN_GOLD_SHOTGUN_INTERVAL, 20); - configuration.addDefault(TREASURE_GOBLIN_RADIAL_EXPLOSION, 20); - configuration.addDefault(KRAKEN_ENABLED, true); - configuration.addDefault(BALROG_ENABLED, true); - configuration.addDefault(KRAKEN_CHANCE_ON_FISH, 0.005); - configuration.addDefault(KRAKEN_NAME, "&1Kraken"); - configuration.addDefault(BALROG_CHANCE_ON_MINE, 0.005); - configuration.addDefault(BALROG_NAME, "&cBalrog"); - configuration.addDefault(BALROG_TRASH_MOB_NAME, "&cRaug"); - configuration.addDefault(FAE_ENABLED, true); - configuration.addDefault(FAE_NAME, "&aFae"); - configuration.addDefault(FAE_CHANCE_ON_CHOP, 0.001); - configuration.addDefault(ANNOUNCEMENT_BROADCAST_WORLD_ONLY, false); - configuration.addDefault(DEADMOON_ANNOUNCEMENT_MESSAGE, "A dead moon rises, and the undead with it..."); - configuration.addDefault(DEADMOON_END_MESSAGE, "Dawn rises, the Dead Moon wanes for those still alive..."); +import com.magmaguy.magmacore.config.ConfigurationFile; +import lombok.Getter; + +import java.util.List; + +public class EventsConfig extends ConfigurationFile { + @Getter + private static boolean announcementBroadcastWorldOnly; + @Getter + private static int actionEventMinimumCooldown; + @Getter + private static int timedEventMinimumCooldown; + @Getter + private static boolean actionEventsEnabled; + @Getter + private static boolean timedEventsEnabled; + + public EventsConfig() { + super("events.yml"); + } - configuration.options().copyDefaults(true); - UnusedNodeHandler.clearNodes(configuration); - customConfigLoader.saveDefaultCustomConfig(CONFIG_NAME); - customConfigLoader.saveCustomConfig(CONFIG_NAME); + @Override + public void initializeValues() { + announcementBroadcastWorldOnly = ConfigurationEngine.setBoolean( + List.of("Sets if events will only broadcasted in the world the events happens in."), + fileConfiguration, "Only broadcast event message in event worlds", false); + actionEventMinimumCooldown = ConfigurationEngine.setInt( + List.of("Sets the minimum cooldown, in minutes, between action events"), + fileConfiguration, "actionEventMinimumCooldownMinutes", 4); + timedEventMinimumCooldown = ConfigurationEngine.setInt( + List.of("Sets the minimum cooldown, in minutes, between timed events"), + fileConfiguration, "actionEventMinimumCooldownMinutes", 4); + actionEventsEnabled = ConfigurationEngine.setBoolean( + List.of("Sets if action events will happen.", + "https://github.com/MagmaGuy/EliteMobs/wiki/Creating-Custom-Events#action-events"), + fileConfiguration, "actionEventsEnabled", true); + timedEventsEnabled = ConfigurationEngine.setBoolean( + List.of("Sets if timed events will happen.", + "https://github.com/MagmaGuy/EliteMobs/wiki/Creating-Custom-Events#timed-events"), + fileConfiguration, "timedEventsEnabled", true); } - } diff --git a/src/main/java/com/magmaguy/elitemobs/config/ItemSettingsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/ItemSettingsConfig.java new file mode 100644 index 000000000..1e3dc63ec --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/ItemSettingsConfig.java @@ -0,0 +1,346 @@ +package com.magmaguy.elitemobs.config; + +import com.magmaguy.magmacore.config.ConfigurationFile; +import com.magmaguy.magmacore.util.ChatColorConverter; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +public class ItemSettingsConfig extends ConfigurationFile { + @Getter + private static String shopItemSource; + @Getter + private static boolean doEliteMobsLoot; + @Getter + private static boolean doMmorpgColors; + @Getter + private static boolean preventCustomItemPlacement; + @Getter + private static List loreStructure; + @Getter + private static String mobItemSource; + @Getter + private static String loreWorth; + @Getter + private static String loreResale; + @Getter + private static double flatDropRate; + @Getter + private static double regionalBossNonUniqueDropRate; + @Getter + private static boolean regionalBossesDropVanillaLoot; + @Getter + private static double levelIncreaseDropRate; + @Getter + private static double proceduralItemWeight; + @Getter + private static double weighedItemWeight; + @Getter + private static double fixedItemWeight; + @Getter + private static double limitedItemWeight; + @Getter + private static double scalableItemWeight; + @Getter + private static double defaultLootMultiplier; + @Getter + private static double defaultExperienceMultiplier; + @Getter + private static String potionEffectOnHitTargetLore; + @Getter + private static int maxLevelForDefaultLootMultiplier; + @Getter + private static int maximumItemLevel; + @Getter + private static boolean useEliteEnchantments; + @Getter + private static String eliteEnchantLoreString; + @Getter + private static boolean useHoesAsWeapons; + @Getter + private static boolean enableRareItemParticleEffects; + @Getter + private static String potionEffectOnHitSelfLore; + @Getter + private static String potionEffectContinuousLore; + @Getter + private static String scrapSucceededMessage; + @Getter + private static String eliteEnchantmentColor; + @Getter + private static String vanillaEnchantmentColor; + @Getter + private static String customEnchantmentColor; + @Getter + private static String potionEffectColor; + @Getter + private static String noSoulbindLore; + @Getter + private static boolean preventEliteItemEnchantment; + @Getter + private static boolean preventEliteItemDisenchantment; + @Getter + private static String preventEliteItemDisenchantmentMessage; + @Getter + private static boolean preventEliteItemDiamondToNetheriteUpgrade; + @Getter + private static boolean eliteDurability; + @Getter + private static double eliteDurabilityMultiplier; + @Getter + private static String scrapFailedMessage; + @Getter + private static boolean putLootDirectlyIntoPlayerInventory; + @Getter + private static int lootLevelDifferenceLockout; + @Getter + private static boolean preventEliteItemsFromBreaking; + @Getter + private static String noItemDurabilityMessage; + @Getter + private static int minimumProcedurallyGeneratedDiamondLootLevelPlusSeven; + @Getter + private static String simlootMessageSuccess; + @Getter + private static String simlootMessageFailure; + @Getter + private static String directDropCustomLootMessage; + @Getter + private static String directDropMinecraftLootMessage; + @Getter + private static String directDropCoinMessage; + @Getter + private static boolean hideAttributes; + @Getter + private static String weaponEntry; + @Getter + private static String armorEntry; + @Getter + private static String levelRangeTooDifferent; + + public ItemSettingsConfig() { + super("ItemSettings.yml"); + } + + @Override + public void initializeValues() { + + doEliteMobsLoot = ConfigurationEngine.setBoolean( + List.of("Sets if any EliteMobs loot will drop.", + "Includes Elite Coins, Custom Items, Procedurally Generate Items - everything!", + "Not recommended, makes mmorpg progression impossible."), + fileConfiguration, "doEliteMobsLoot", true); + doMmorpgColors = ConfigurationEngine.setBoolean( + List.of("Sets if procedurally generated loot will have different colors based on the quality of the item."), + fileConfiguration, "doMMORPGColorsForItems", true); + preventCustomItemPlacement = ConfigurationEngine.setBoolean( + List.of("Sets if the placement of custom items, like banners or blocks, is prevented.", "This is recommended - custom items break when they are placed and can not be recovered!") + , fileConfiguration, "preventCustomItemPlacement", true); + loreStructure = ConfigurationEngine.setList( + List.of("Sets the format for the lore of custom all EliteMobs items!", + "The following are valid placeholders:", + "$itemLevel - shows the item level", + "$prestigeLevel - shows the prestige level", + "$weaponOrArmorStats - shows the elite DPS or elite armor stats, depending on the item", + "$soulbindInfo - shows who, if anyone, the item is soulbound to", + "$itemSource - shows where the item came from, like a mob or a shop", + "$ifLore - makes a line only appear if the item has custom lore. Only applies for custom items", + "$customLore - shows the entirety of the custom lore. Only applies for custom items", + "$ifEnchantments - makes a line only appear if the item has any enchantments", + "$enchantments - shows the enchantments on the item", + "$eliteEnchantments - shows the elite enchantments on the item", + "$ifCustomEnchantments - shows the custom enchantments on the item", + "$customEnchantments - shows the custom enchantments on the item", + "$ifPotionEffects - only shows the line if the item has potion effects", + "$potionEffects - shows the potion effects on the item", + "$loreResaleValue - shows the value of the item. Might show the purchase or sell price depending on where it is viewed", + "Important: Several of the placeholders can be further customized by the configuration settings further below"), + file, fileConfiguration, "itemLoreStructureV2", new ArrayList<>(List.of( + ChatColorConverter.convert("&7&m&l---------&7<&lEquip Info&7>&m&l---------"), + ChatColorConverter.convert("&7Item level: &f$itemLevel &7Prestige &6$prestigeLevel"), + ChatColorConverter.convert("$weaponOrArmorStats"), + ChatColorConverter.convert("$soulbindInfo"), + ChatColorConverter.convert("$itemSource"), + ChatColorConverter.convert("$ifLore&7&m&l-----------&7< &f&lLore&7 >&m&l-----------"), + ChatColorConverter.convert("$customLore"), + ChatColorConverter.convert("$ifEnchantments&7&m&l--------&7<&9&lEnchantments&7>&m&l--------"), + ChatColorConverter.convert("$enchantments"), + ChatColorConverter.convert("$eliteEnchantments"), + ChatColorConverter.convert("$ifCustomEnchantments&7&m&l------&7< &3&lCustom Enchants&7 >&m&l------"), + ChatColorConverter.convert("$customEnchantments"), + ChatColorConverter.convert("$ifPotionEffects&7&m&l----------&7< &5&lEffects&7 >&m&l----------"), + ChatColorConverter.convert("$potionEffect"), + ChatColorConverter.convert("&7&l&m-----------------------------"), + ChatColorConverter.convert("$loreResaleValue") + )), true); + shopItemSource = ConfigurationEngine.setString( + List.of("Sets the shop source lore for store purchased"), + file, fileConfiguration, "shopSourceItemLores", "&7Purchased from a store", true); + mobItemSource = ConfigurationEngine.setString( + List.of("Sets the shop source lore for items looted from bosses"), + file, fileConfiguration, "mobSourceItemLores", "&7Looted from $mob", true); + loreWorth = ConfigurationEngine.setString( + List.of("Sets the item worth lore"), + file, fileConfiguration, "loreWorths", "&7Worth $worth $currencyName", true); + loreResale = ConfigurationEngine.setString( + List.of("Sets the item resale value lore"), + file, fileConfiguration, "loreResaleValues", "&7Sells for $resale $currencyName", true); + flatDropRate = ConfigurationEngine.setDouble( + List.of("Sets the base chance for any elite item to drop from elite mobs"), + fileConfiguration, "flatDropRateV3", 0.20); + regionalBossNonUniqueDropRate = ConfigurationEngine.setDouble( + List.of("Sets the base chance for any elite item to drop from regional bosses"), + fileConfiguration, "regionalBossNonUniqueDropRate", 0.05); + regionalBossesDropVanillaLoot = ConfigurationEngine.setBoolean( + List.of("Sets if the regional bosses can drop vanilla loot"), + fileConfiguration, "regionalBossesDropVanillaLoot", false); + levelIncreaseDropRate = ConfigurationEngine.setDouble( + List.of("Sets how much the chance of an elite item dropping increases based on the level of the boss.", + "The level of the boss is multiplied by this value and added to the base chance.", + "It is no longer recommended to have this above 0.0!"), + fileConfiguration, "levelIncreaseDropRateV2", 0.00); + proceduralItemWeight = ConfigurationEngine.setDouble( + List.of("Sets the weighed chance of a procedurally generated item dropping.", + "This system uses weighted probabilities! Look that up on google if you don't know what that is."), + fileConfiguration, "proceduralItemDropWeight", 90); + weighedItemWeight = ConfigurationEngine.setDouble( + List.of("Sets the relative chance of a weighed item dropping.", + "Weighed items are custom items that don't have a dynamic weight, like charms.") + , fileConfiguration, "weighedItemDropWeight", 1); + fixedItemWeight = ConfigurationEngine.setDouble( + List.of("Sets the relative chance of a fixed item dropping. These are custom items that do not scale."), + fileConfiguration, "fixedItemDropWeight", 10); + limitedItemWeight = ConfigurationEngine.setDouble( + List.of("Sets the relative chance of a limited item dropping. These are custom items that scale up to a specific level"), + fileConfiguration, "limitedItemDropWeight", 3); + scalableItemWeight = ConfigurationEngine.setDouble( + List.of("Sets the relative chance of a scalable item dropping. These are custom items that can scale to any level, and are the most common in the plugin."), + fileConfiguration, "scalableItemDropWeight", 6); + defaultLootMultiplier = ConfigurationEngine.setDouble( + List.of("Sets the multiplier for the vanilla loot of the mob, based on the level of the mob."), + fileConfiguration, "defaultLootMultiplier", 0); + maxLevelForDefaultLootMultiplier = ConfigurationEngine.setInt( + List.of("Sets the maximum level for the default loot multiplier."), + fileConfiguration, "levelCapForDefaultLootMultiplier", 200); + defaultExperienceMultiplier = ConfigurationEngine.setDouble( + List.of("Sets the vanilla Minecraft experience dropped multiplier for the boss, based on the level of the boss."), + fileConfiguration, "defaultExperienceMultiplier", 1); + maximumItemLevel = ConfigurationEngine.setInt( + List.of("Sets the level of the maximum loot that will be dropped by EliteMobs. Strongly recommended to leave it at 200."), + fileConfiguration, "maximumItemLevel", 200); + useEliteEnchantments = ConfigurationEngine.setBoolean( + List.of("Sets if elite enchantments will be used. ", + "Elite enchantments replace vanilla enchantments when elite items get enchantment levels that go beyond vanilla limits.", + "Example: if an elite sword is supposed to have sharpness 10, since the Minecraft limit is level 5, it will have sharpness 5 and elite sharpness 5.", + "Elite sharpness only affects mobs spawned by EliteMobs. This is done so PVP and vanilla combat don't become unbalanced."), + fileConfiguration, "useEliteEnchantments", true); + eliteEnchantLoreString = ConfigurationEngine.setString( + List.of("Sets the display name that will be used for the elite enchantments on item lore."), + file, fileConfiguration, "eliteEnchantmentLoreStrings", "Elite", true); + useHoesAsWeapons = ConfigurationEngine.setBoolean( + List.of("Sets if EliteMobs will see hoes as valid weapons for the damage calculations."), + fileConfiguration, "useHoesAsWeapons", false); + enableRareItemParticleEffects = ConfigurationEngine.setBoolean( + List.of("Sets if EliteMobs will spawn special particles over dropped items of high quality."), + fileConfiguration, "enableRareItemParticleEffects", true); + potionEffectOnHitTargetLore = ConfigurationEngine.setString( + List.of("Sets the symbols that will be used in item lore to show that a potion effect applies on hit to the entity that gets hit."), + file, fileConfiguration, "potionEffectOnHitTargetLore", "&4⚔☠", false); + potionEffectOnHitSelfLore = ConfigurationEngine.setString( + List.of("Sets the symbols that will be used in item lore to show that a potion effect applies on hit to the player doing the hitting."), + file, fileConfiguration, "potionEffectOnHitSelfLore", "&9⚔🛡", false); + potionEffectContinuousLore = ConfigurationEngine.setString( + List.of("Sets the symbols that will be used in item lore to show that a potion effect will keep reapplying for as long as the player wields it."), + file, fileConfiguration, "potionEffectContinuousLore", "&6⟲", false); + eliteEnchantmentColor = ConfigurationEngine.setString( + List.of("Sets the characters prefixed to elite enchantments in item lore."), + file, fileConfiguration, "eliteEnchantmentLoreColor", "&9◇", false); + vanillaEnchantmentColor = ConfigurationEngine.setString( + List.of("Sets the characters prefixed to vanilla enchantments in item lore."), + file, fileConfiguration, "vanillaEnchantmentLoreColor", "&7◇", false); + customEnchantmentColor = ConfigurationEngine.setString( + List.of("Sets the characters prefixed to custom enchantments in item lore."), + file, fileConfiguration, "customEnchantmentColor", "&3◇", false); + potionEffectColor = ConfigurationEngine.setString( + List.of("Sets the characters prefixed to potion effects in item lore."), + file, fileConfiguration, "potionEffectLoreColor", "&5◇", false); + noSoulbindLore = ConfigurationEngine.setString( + List.of("Sets the text that will appear on the item if the item is not soulbound."), + file, fileConfiguration, "noSoulbindLore", "&7Not Soulbound!", true); + preventEliteItemEnchantment = ConfigurationEngine.setBoolean( + List.of("Sets if elite item can be enchanted by vanilla means. This is not recommended as EliteMobs has its own custom enchantments system with its own balance!"), + fileConfiguration, "preventEliteItemEnchantment", true); + preventEliteItemDisenchantment = ConfigurationEngine.setBoolean( + List.of("Sets if elite items can be disenchanted by vanilla means."), + fileConfiguration, "preventEliteItemDisenchantment", true); + preventEliteItemDisenchantmentMessage = ConfigurationEngine.setString( + List.of("Sets the message that appears for players when they attempt to disenchant an item and that is not allowed."), + file, fileConfiguration, "preventEliteItemDisenchantmentMessage", "&c[EliteMobs] Can't disenchant Elite Items!", true); + preventEliteItemDiamondToNetheriteUpgrade = ConfigurationEngine.setBoolean( + List.of("Sets whether elite items can be upgraded from diamond to netherite by vanilla means. Not recommended!"), + fileConfiguration, "preventEliteItemDiamondToNetheriteUpgrade", true); + eliteDurability = ConfigurationEngine.setBoolean( + List.of("Sets whether elite items will only lose durability on death.", + "This is an important system for EliteMobs, and it is strongly recommended as high level fights are nearly impossible without it!"), + fileConfiguration, "eliteItemsDurabilityLossOnlyOnDeath", true); + eliteDurabilityMultiplier = ConfigurationEngine.setDouble( + List.of("Sets the durability loss multiplier for elite items if it is set to lose durability on death.", + "Values between 0.0 and 1.0 lower the durability loss and values above 1.0 increase it.", + "Example: 0.5 deals 50% of the durability loss, 2.0 deals 200% of the durability loss."), + fileConfiguration, "eliteItemsDurabilityLossMultiplier", 1d); + scrapSucceededMessage = ConfigurationEngine.setString( + List.of("Sets the message that appears when item scrapping is successful."), + file, fileConfiguration, "scrapSucceededMessageV2", "&8[EliteMobs] &2Scrapping succeeded $amount times!", true); + scrapFailedMessage = ConfigurationEngine.setString( + List.of("Sets message that appears when item scrapping fails."), + file, fileConfiguration, "scrapFailedMessageV2", "&8[EliteMobs] &cScrapping failed $amount times!", true); + putLootDirectlyIntoPlayerInventory = ConfigurationEngine.setBoolean( + List.of("Sets if elite loot should be placed directly into players' inventories."), + fileConfiguration, "putLootDirectlyIntoPlayerInventory", false); + lootLevelDifferenceLockout = ConfigurationEngine.setInt( + List.of("Sets maximum level difference players can have before they can no longer loot items that are too low level.", + "This is calculated based on the average level of the loot the player is wearing.", + "As an example, if it is set to 10 and a player has level 50 gear, they will not be able to farm level 39 bosses."), + fileConfiguration, "lootLevelDifferenceLockout", 10); + preventEliteItemsFromBreaking = ConfigurationEngine.setBoolean( + List.of("Sets if EliteMobs will prevent Elite Items from breaking when using the durability loss on death system.", + "Players will not be able to use items with no durability left anyway, this is simply to prevent the accidental loss of high level but low durability items."), + fileConfiguration, "preventEliteItemsFromBreaking", true); + noItemDurabilityMessage = ConfigurationEngine.setString( + List.of("Sets the characters prefixed to vanilla enchantments in item lore."), + file, fileConfiguration, "noItemDurabilityMessage", "&8[EliteMobs] $item &4is broken! It won't work until repaired!", true); + minimumProcedurallyGeneratedDiamondLootLevelPlusSeven = ConfigurationEngine.setInt( + List.of("Sets the minimum level, +7, of bosses that can procedurally generated drop diamond gear in EliteMobs.", + "There is no procedurally generated netherite gear in EliteMobs, only custom loot."), + fileConfiguration, "minimumProcedurallyGeneratedDiamondLootLevelPlusSeven", 10); + simlootMessageSuccess = ConfigurationEngine.setString( + List.of("Sets the message show in chat when successfully rolling for loot through the /em simloot command."), + file, fileConfiguration, "simlootMessageSuccess", "&8[EliteMobs] &2Rolled for loot and got $itemName &2!", true); + simlootMessageFailure = ConfigurationEngine.setString( + List.of("Sets the message show in chat when failing to roll for loot through the /em simloot command."), + file, fileConfiguration, "simlootMessageFailure", "&8[EliteMobs] &cRolled for loot and got nothing!", true); + directDropCustomLootMessage = ConfigurationEngine.setString( + List.of("Sets the message that players get when elite loot is deposited directly into their inventories."), + file, fileConfiguration, "directDropCustomLootMessage", "&8[EliteMobs] &2Obtained $itemName &2!", true); + directDropMinecraftLootMessage = ConfigurationEngine.setString( + List.of("Sets the message that players get when vanilla loot is deposited directly into their inventories."), + file, fileConfiguration, "directDropMinecraftLootMessage", "&8[EliteMobs] &aObtained $itemName &a!", true); + directDropCoinMessage = ConfigurationEngine.setString( + List.of("Sets the message that players get when elite coins are deposited directly into their inventories."), + file, fileConfiguration, "directDropCoinMessage", "&8[EliteMobs] &aObtained &2$amount $currencyName &a!", true); + hideAttributes = ConfigurationEngine.setBoolean( + List.of("Sets if EliteMobs will hide vanilla Minecraft attributes."), + fileConfiguration, "hideItemAttributes", true); + weaponEntry = ConfigurationEngine.setString( + List.of("Sets the weapon-specific lore entry on an elite item. The $EDPS placeholder gets replaced with the elite DPS (damage per second) of the weapon."), + file, fileConfiguration, "weaponEntry", "&7Elite DPS: &2$EDPS", true); + armorEntry = ConfigurationEngine.setString( + List.of("Sets the armor-specific lore entry on an elite item. The $EDEF placeholder gets replaced with the elite DEF (defense) of the weapon."), + file, fileConfiguration, "armorEntry", "&7Elite Armor: &2$EDEF", true); + levelRangeTooDifferent = ConfigurationEngine.setString( + List.of("Sets the message sent when a played kills a boss but the gear level is too different from the boss level to get coins"), + file, fileConfiguration, "levelRangeTooDifferent", "&8EM] &4Your gear is level $playerLevel and the boss is level $bossLevel, level difference is too high to get coins!", true); + + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/ItemsCustomLootListConfig.java b/src/main/java/com/magmaguy/elitemobs/config/ItemsCustomLootListConfig.java deleted file mode 100644 index e88e15dad..000000000 --- a/src/main/java/com/magmaguy/elitemobs/config/ItemsCustomLootListConfig.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.config; - -import com.magmaguy.elitemobs.MetadataHandler; -import org.bukkit.Bukkit; - -import java.io.File; - -/** - * Created by MagmaGuy on 01/05/2017. - */ -public class ItemsCustomLootListConfig { - - public static final String CONFIG_NAME = "ItemsCustomLootList.yml"; - - public void intializeConfig() { - - Bukkit.getLogger().info(Bukkit.getPluginManager().getPlugin(MetadataHandler.ELITE_MOBS).getDataFolder().getAbsolutePath() + "/data/" + CONFIG_NAME); - - File file = new File(Bukkit.getPluginManager().getPlugin(MetadataHandler.ELITE_MOBS).getDataFolder().getAbsolutePath() + "/data/" + CONFIG_NAME); - - if (!file.exists()) { - - CustomConfigConstructor customConfigConstructor = new CustomConfigConstructor(CONFIG_NAME, CONFIG_NAME); - - } - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/config/ItemsCustomLootSettingsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/ItemsCustomLootSettingsConfig.java deleted file mode 100644 index 194a00bdb..000000000 --- a/src/main/java/com/magmaguy/elitemobs/config/ItemsCustomLootSettingsConfig.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.config; - -import com.magmaguy.elitemobs.ChatColorConverter; -import org.bukkit.configuration.Configuration; - -import java.util.Arrays; - -public class ItemsCustomLootSettingsConfig { - - public static final String CONFIG_NAME = "ItemsCustomLootSettings.yml"; - public static final String MMORPG_COLORS_FOR_CUSTOM_ITEMS = "Use MMORPG colors for custom items"; -// public static final String SHOW_POTION_EFFECTS = "Show potion effects on lore"; - public static final String SHOW_ITEM_VALUE = "Show item value on lore"; - public static final String SHOW_ITEM_TIER = "Show item tier on lore"; - public static final String LORE_STRUCTURE = "Lore Structure"; - public static final String PREVENT_CUSTOM_ITEM_PLACING = "Prevent players from placing pleaceable Elite custom items"; - public static final String DEFAULT_POTION_EFFECT_DURATION_NODE_PREFIX = "Default potion effect duration (seconds, on hit)."; - public static final String ABSORPTION = DEFAULT_POTION_EFFECT_DURATION_NODE_PREFIX + "ABSORPTION"; - public static final String BLINDNESS = DEFAULT_POTION_EFFECT_DURATION_NODE_PREFIX + "BLINDNESS"; - public static final String CONFUSION = DEFAULT_POTION_EFFECT_DURATION_NODE_PREFIX + "CONFUSION"; - public static final String DAMAGE_RESISTANCE = DEFAULT_POTION_EFFECT_DURATION_NODE_PREFIX + "DAMAGE_RESISTANCE"; - public static final String FAST_DIGGING = DEFAULT_POTION_EFFECT_DURATION_NODE_PREFIX + "FAST_DIGGING"; - public static final String FIRE_RESISTANCE = DEFAULT_POTION_EFFECT_DURATION_NODE_PREFIX + "FIRE_RESISTANCE"; - public static final String GLOWING = DEFAULT_POTION_EFFECT_DURATION_NODE_PREFIX + "GLOWING"; - public static final String HEALTH_BOOST = DEFAULT_POTION_EFFECT_DURATION_NODE_PREFIX + "HEALTH_BOOST"; - public static final String HUNGER = DEFAULT_POTION_EFFECT_DURATION_NODE_PREFIX + "HUNGER"; - public static final String INCREASE_DAMAGE = DEFAULT_POTION_EFFECT_DURATION_NODE_PREFIX + "INCREASE_DAMAGE"; - public static final String INVISIBILITY = DEFAULT_POTION_EFFECT_DURATION_NODE_PREFIX + "INVISIBILITY"; - public static final String JUMP = DEFAULT_POTION_EFFECT_DURATION_NODE_PREFIX + "LEVITATION"; - public static final String LUCK = DEFAULT_POTION_EFFECT_DURATION_NODE_PREFIX + "LUCK"; - public static final String NIGHT_VISION = DEFAULT_POTION_EFFECT_DURATION_NODE_PREFIX + "NIGHT_VISION"; - public static final String POISON = DEFAULT_POTION_EFFECT_DURATION_NODE_PREFIX + "POISON"; - public static final String REGENERATION = DEFAULT_POTION_EFFECT_DURATION_NODE_PREFIX + "REGENERATION"; - public static final String SLOW = DEFAULT_POTION_EFFECT_DURATION_NODE_PREFIX + "SLOW"; - public static final String SLOW_DIGGING = DEFAULT_POTION_EFFECT_DURATION_NODE_PREFIX + "SLOW_DIGGING"; - public static final String SPEED = DEFAULT_POTION_EFFECT_DURATION_NODE_PREFIX + "SPEED"; - public static final String UNLUCK = DEFAULT_POTION_EFFECT_DURATION_NODE_PREFIX + "UNLUCK"; - public static final String WATER_BREATHING = DEFAULT_POTION_EFFECT_DURATION_NODE_PREFIX + "WATER_BREATHING"; - public static final String WEAKNESS = DEFAULT_POTION_EFFECT_DURATION_NODE_PREFIX + "WEAKNESS"; - public static final String WITHER = DEFAULT_POTION_EFFECT_DURATION_NODE_PREFIX + "WITHER"; - CustomConfigLoader customConfigLoader = new CustomConfigLoader(); - private Configuration configuration = customConfigLoader.getCustomConfig(CONFIG_NAME); - - public void initializeConfig() { - - configuration.addDefault(MMORPG_COLORS_FOR_CUSTOM_ITEMS, true); -// configuration.addDefault(SHOW_POTION_EFFECTS, true); - configuration.addDefault(SHOW_ITEM_VALUE, true); - configuration.addDefault(SHOW_ITEM_TIER, true); - configuration.addDefault(PREVENT_CUSTOM_ITEM_PLACING, true); - configuration.addDefault(LORE_STRUCTURE, Arrays.asList( - ChatColorConverter.convert("$enchantments"), - ChatColorConverter.convert("$potionEffect"), - ChatColorConverter.convert("&m----------------------"), - ChatColorConverter.convert(" $customLore "), - ChatColorConverter.convert(" $itemValue "), - ChatColorConverter.convert("&m----------------------"), - ChatColorConverter.convert(" Tier $tier ") - )); - configuration.addDefault(ABSORPTION, 2); - configuration.addDefault(BLINDNESS, 5); - configuration.addDefault(CONFUSION, 10); - configuration.addDefault(DAMAGE_RESISTANCE, 30); - configuration.addDefault(FAST_DIGGING, 30); - configuration.addDefault(FIRE_RESISTANCE, 15); - configuration.addDefault(GLOWING, 60); - configuration.addDefault(HEALTH_BOOST, 90); - configuration.addDefault(HUNGER, 30); - configuration.addDefault(INCREASE_DAMAGE, 30); - configuration.addDefault(INVISIBILITY, 3); - configuration.addDefault(JUMP, 10); - configuration.addDefault(LUCK, 5); - configuration.addDefault(NIGHT_VISION, 30); - configuration.addDefault(POISON, 20); - configuration.addDefault(REGENERATION, 20); - configuration.addDefault(SLOW, 15); - configuration.addDefault(SLOW_DIGGING, 10); - configuration.addDefault(SPEED, 30); - configuration.addDefault(UNLUCK, 30); - configuration.addDefault(WATER_BREATHING, 30); - configuration.addDefault(WEAKNESS, 15); - configuration.addDefault(WITHER, 15); - - customConfigLoader.getCustomConfig(CONFIG_NAME).options().copyDefaults(true); - UnusedNodeHandler.clearNodes(configuration); - customConfigLoader.saveDefaultCustomConfig(CONFIG_NAME); - customConfigLoader.saveCustomConfig(CONFIG_NAME); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/config/ItemsDropSettingsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/ItemsDropSettingsConfig.java deleted file mode 100644 index 2c389bf5c..000000000 --- a/src/main/java/com/magmaguy/elitemobs/config/ItemsDropSettingsConfig.java +++ /dev/null @@ -1,211 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.config; - -import com.magmaguy.elitemobs.items.customenchantments.CustomEnchantmentCache; -import org.bukkit.configuration.Configuration; - -public class ItemsDropSettingsConfig { - - public static final String CONFIG_NAME = "ItemsDropSettings.yml"; - - public static final String ENABLE_PLUGIN_LOOT = "Enable plugin loot"; - public static final String DROP_CUSTOM_ITEMS = "Elite Mobs can drop custom loot"; - public static final String LORE_WORTH = "Item worth"; - public static final String LORE_RESALE_WORTH = "Item resale worth"; - public static final String ELITE_ITEM_FLAT_DROP_RATE = "EliteMob base percentual plugin item drop chance"; - public static final String ELITE_ITEM_TIER_DROP_RATE = "EliteMob plugin item percentual drop chance increase per tier"; - public static final String PROCEDURAL_ITEM_WEIGHT = "Procedurally generated item weight"; - public static final String CUSTOM_ITEM_WEIGHT = "Custom item weight"; - public static final String CUSTOM_DYNAMIC_ITEM_WEIGHT = "Custom dynamic item weight"; - public static final String CUSTOM_STATIC_ITEM_WEIGHT = "Custom static item weight"; - public static final String SPAWNER_DEFAULT_LOOT_MULTIPLIER = "Drop multiplied default loot from elite mobs spawned in spawners"; - public static final String DEFAULT_LOOT_MULTIPLIER = "EliteMob default loot multiplier"; - public static final String MAXIMUM_LEVEL_FOR_LOOT_MULTIPLIER = "Maximum level of the Elite Mob default multiplier"; - public static final String EXPERIENCE_LOOT_MULTIPLIER = "EliteMob xp multiplier"; - public static final String MAXIMUM_LOOT_TIER = "Maximum loot tier (REQUIRES INCREASING SHARPNESS AND PROTECTION ENCHANTMENTS TO WORK PROPERLY, READ GITHUB WIKI!)"; - public static final String ENABLE_CUSTOM_ENCHANTMENT_SYSTEM = "Enable custom echantment system (check the github wiki before changing)"; - public static final String ENCHANTMENT_NAME = "Enchantment name."; - public static final String ARROW_DAMAGE_NAME = ENCHANTMENT_NAME +"ARROW_DAMAGE"; - public static final String ARROW_FIRE_NAME = ENCHANTMENT_NAME + "ARROW_FIRE"; - public static final String ARROW_INFINITE_NAME = ENCHANTMENT_NAME + "ARROW_INFINITE"; - public static final String ARROW_KNOCKBACK_NAME = ENCHANTMENT_NAME + "ARROW_KNOCKBACK"; - public static final String BINDING_CURSE_NAME = ENCHANTMENT_NAME + "BINDING_CURSE"; - public static final String CHANNELING_NAME = ENCHANTMENT_NAME + "CHANNELING"; - public static final String DAMAGE_ALL_NAME = ENCHANTMENT_NAME + "DAMAGE_ALL"; - public static final String DAMAGE_ARTHROPODS_NAME = ENCHANTMENT_NAME + "DAMAGE_ARTHROPODS"; - public static final String DAMAGE_UNDEAD_NAME = ENCHANTMENT_NAME + "DAMAGE_UNDEAD"; - public static final String DEPTH_STRIDER_NAME = ENCHANTMENT_NAME + "DEPTH_STRIDER"; - public static final String DIG_SPEED_NAME = ENCHANTMENT_NAME + "DIG_SPEED"; - public static final String DURABILITY_NAME = ENCHANTMENT_NAME + "DURABILITY"; - public static final String FIRE_ASPECT_NAME = ENCHANTMENT_NAME + "FIRE_ASPECT"; - public static final String FROST_WALKER_NAME = ENCHANTMENT_NAME + "FROST_WALKER"; - public static final String IMPALING_NAME = ENCHANTMENT_NAME + "IMPALING"; - public static final String KNOCKBACK_NAME = ENCHANTMENT_NAME + "KNOCKBACK"; - public static final String LOOT_BONUS_BLOCKS_NAME = ENCHANTMENT_NAME + "LOOT_BONUS_BLOCKS"; - public static final String LOOT_BONUS_MOBS_NAME = ENCHANTMENT_NAME + "LOOT_BONUS_MOBS"; - public static final String LOYALTY_NAME = ENCHANTMENT_NAME + "LOYALTY"; - public static final String LUCK_ENCHANTMENT_NAME = ENCHANTMENT_NAME + "LUCK"; - public static final String LURE_NAME = ENCHANTMENT_NAME + "LURE"; - public static final String MENDING_NAME = ENCHANTMENT_NAME + "MENDING"; - public static final String OXYGEN_NAME = ENCHANTMENT_NAME + "OXYGEN"; - public static final String PROTECTION_ENVIRONMENTAL_NAME = ENCHANTMENT_NAME + "PROTECTION_ENVIRONMENTAL"; - public static final String PROTECTION_EXPLOSIONS_NAME = ENCHANTMENT_NAME + "PROTECTION_EXPLOSIONS"; - public static final String PROTECTION_FALL_NAME = ENCHANTMENT_NAME + "PROTECTION_FALL"; - public static final String PROTECTION_FIRE_NAME = ENCHANTMENT_NAME + "PROTECTION_FIRE"; - public static final String PROTECTION_PROJECTILE_NAME = ENCHANTMENT_NAME + "PROTECTION_PROJECTILE"; - public static final String RIPTIDE_NAME = ENCHANTMENT_NAME + "RIPTIDE"; - public static final String SILK_TOUCH_NAME = ENCHANTMENT_NAME + "SILK_TOUCH"; - public static final String SWEEPING_EDGE_NAME = ENCHANTMENT_NAME + "SWEEPING_EDGE"; - public static final String THORNS_NAME = ENCHANTMENT_NAME + "THORNS"; - public static final String VANISHING_CURSE_NAME = ENCHANTMENT_NAME + "VANISHING_CURSE"; - public static final String WATER_WORKER_NAME = ENCHANTMENT_NAME + "WATER_WORKER"; - public static final String POTION_EFFECT_NAME = "Potion effect name."; - public static final String ABSORPTION_NAME = POTION_EFFECT_NAME + "ABSORPTION"; - public static final String BLINDNESS_NAME = POTION_EFFECT_NAME + "BLINDNESS"; - public static final String CONDUIT_POWER_NAME = POTION_EFFECT_NAME + "CONDUIT_POWER"; - public static final String CONFUSION_NAME = POTION_EFFECT_NAME + "CONFUSION"; - public static final String DAMAGE_RESISTANCE_NAME = POTION_EFFECT_NAME + "DAMAGE_RESISTANCE"; - public static final String DOLPHINS_GRACE_NAME = POTION_EFFECT_NAME + "DOLPHINS_GRACE"; - public static final String FAST_DIGGING_NAME = POTION_EFFECT_NAME + "FAST_DIGGING"; - public static final String FIRE_RESISTANCE_NAME = POTION_EFFECT_NAME + "FIRE_RESISTANCE"; - public static final String GLOWING_NAME = POTION_EFFECT_NAME + "GLOWING"; - public static final String HARM_NAME = POTION_EFFECT_NAME + "HARM"; - public static final String HEAL_NAME = POTION_EFFECT_NAME + "HEAL"; - public static final String HEAL_BOOST_NAME = POTION_EFFECT_NAME + "HEAL_BOOST"; - public static final String HUNGER_NAME = POTION_EFFECT_NAME + "HUNGER"; - public static final String INCREASE_DAMAGE_NAME = POTION_EFFECT_NAME + "INCREASE_DAMAGE"; - public static final String INVISIBILITY_NAME = POTION_EFFECT_NAME + "INVISIBILITY"; - public static final String JUMP_NAME = POTION_EFFECT_NAME + "JUMP"; - public static final String LEVITATION_NAME = POTION_EFFECT_NAME + "LEVITATION"; - public static final String LUCK_POTION_NAME = POTION_EFFECT_NAME + "LUCK"; - public static final String NIGHT_VISION_NAME = POTION_EFFECT_NAME + "NIGHT_VISION"; - public static final String POISON_NAME = POTION_EFFECT_NAME + "POISON"; - public static final String REGENERATION_NAME = POTION_EFFECT_NAME + "REGENERATION"; - public static final String SATURATION_NAME = POTION_EFFECT_NAME + "SATURATION"; - public static final String SLOW_NAME = POTION_EFFECT_NAME + "SLOW"; - public static final String SLOW_DIGGING_NAME = POTION_EFFECT_NAME + "SLOW_DIGGING"; - public static final String SLOW_FALLING_NAME = POTION_EFFECT_NAME + "SLOW_FALLING"; - public static final String SPEED_NAME = POTION_EFFECT_NAME + "SPEED"; - public static final String UNLUCK_NAME = POTION_EFFECT_NAME + "UNLUCK"; - public static final String WATER_BREATHING_NAME = POTION_EFFECT_NAME + "WATER_BREATHING"; - public static final String WEAKNESS_NAME = POTION_EFFECT_NAME + "WEAKNESS"; - public static final String WITHER_NAME = POTION_EFFECT_NAME + "WITHER"; - public static final String ENABLE_RARE_DROP_EFFECT = "Enable rare drop visual effect"; - - /* - Custom enchantments - */ - public static final String FLAMETHROWER_NAME = ENCHANTMENT_NAME + CustomEnchantmentCache.flamethrowerEnchantment.getKey(); - public static final String HUNTER_NAME = ENCHANTMENT_NAME + CustomEnchantmentCache.hunterEnchantment.getKey(); - - CustomConfigLoader customConfigLoader = new CustomConfigLoader(); - Configuration configuration = customConfigLoader.getCustomConfig(CONFIG_NAME); - - public void initializeConfig() { - - configuration.addDefault(ENABLE_PLUGIN_LOOT, true); - configuration.addDefault(DROP_CUSTOM_ITEMS, true); - configuration.addDefault(LORE_WORTH, "Worth $worth $currencyName"); - configuration.addDefault(LORE_RESALE_WORTH, "$resale $currencyName resale value"); - configuration.addDefault(ELITE_ITEM_FLAT_DROP_RATE, 025.00); - configuration.addDefault(ELITE_ITEM_TIER_DROP_RATE, 005.00); - configuration.addDefault(PROCEDURAL_ITEM_WEIGHT, 90); - configuration.addDefault(CUSTOM_ITEM_WEIGHT, 10); - configuration.addDefault(CUSTOM_DYNAMIC_ITEM_WEIGHT, 9); - configuration.addDefault(CUSTOM_STATIC_ITEM_WEIGHT, 1); - configuration.addDefault(SPAWNER_DEFAULT_LOOT_MULTIPLIER, true); - configuration.addDefault(DEFAULT_LOOT_MULTIPLIER, 1.0); - configuration.addDefault(MAXIMUM_LEVEL_FOR_LOOT_MULTIPLIER, 200); - configuration.addDefault(EXPERIENCE_LOOT_MULTIPLIER, 1.0); - configuration.addDefault(MAXIMUM_LOOT_TIER, 5); - configuration.addDefault(ENABLE_CUSTOM_ENCHANTMENT_SYSTEM, true); - configuration.addDefault(ARROW_DAMAGE_NAME, "Power"); - configuration.addDefault(ARROW_FIRE_NAME, "Flame"); - configuration.addDefault(ARROW_INFINITE_NAME, "Infinity"); - configuration.addDefault(ARROW_KNOCKBACK_NAME, "Punch"); - configuration.addDefault(BINDING_CURSE_NAME, "Curse of Binding"); - configuration.addDefault(CHANNELING_NAME, "Channeling"); - configuration.addDefault(DAMAGE_ALL_NAME, "Sharpness"); - configuration.addDefault(DAMAGE_ARTHROPODS_NAME, "Bane of Arthropods"); - configuration.addDefault(DAMAGE_UNDEAD_NAME, "Smite"); - configuration.addDefault(DEPTH_STRIDER_NAME, "Depth Strider"); - configuration.addDefault(DIG_SPEED_NAME, "Efficiency"); - configuration.addDefault(DURABILITY_NAME, "Unbreaking"); - configuration.addDefault(FIRE_ASPECT_NAME, "Fire Aspect"); - configuration.addDefault(FROST_WALKER_NAME, "Frost Walker"); - configuration.addDefault(IMPALING_NAME, "Impaling"); - configuration.addDefault(KNOCKBACK_NAME, "Knockback"); - configuration.addDefault(LOOT_BONUS_BLOCKS_NAME, "Fortune"); - configuration.addDefault(LOOT_BONUS_MOBS_NAME, "Looting"); - configuration.addDefault(LOYALTY_NAME, "Loyalty"); - configuration.addDefault(LUCK_ENCHANTMENT_NAME, "Luck of the Sea"); - configuration.addDefault(LURE_NAME, "Lure"); - configuration.addDefault(MENDING_NAME, "Mending"); - configuration.addDefault(OXYGEN_NAME, "Respiration"); - configuration.addDefault(PROTECTION_ENVIRONMENTAL_NAME, "Protection"); - configuration.addDefault(PROTECTION_EXPLOSIONS_NAME, "Blast Protection"); - configuration.addDefault(PROTECTION_FALL_NAME, "Feather Falling"); - configuration.addDefault(PROTECTION_FIRE_NAME, "Fire Protection"); - configuration.addDefault(PROTECTION_PROJECTILE_NAME, "Projectile Protection"); - configuration.addDefault(RIPTIDE_NAME, "Riptide"); - configuration.addDefault(SILK_TOUCH_NAME, "Silk Touch"); - configuration.addDefault(SWEEPING_EDGE_NAME, "Sweeping Edge"); - configuration.addDefault(THORNS_NAME, "Thorns"); - configuration.addDefault(VANISHING_CURSE_NAME, "Curse of Vanishing"); - configuration.addDefault(WATER_WORKER_NAME, "Aqua Affinity"); - configuration.addDefault(ABSORPTION_NAME, "Absorption"); - configuration.addDefault(BLINDNESS_NAME, "Blindness"); - configuration.addDefault(CONDUIT_POWER_NAME, "Conduit Power"); - configuration.addDefault(CONFUSION_NAME, "Nausea"); - configuration.addDefault(DAMAGE_RESISTANCE_NAME, "Resistance"); - configuration.addDefault(DOLPHINS_GRACE_NAME, "Dolphin's grace"); - configuration.addDefault(FAST_DIGGING_NAME, "Haste"); - configuration.addDefault(FIRE_RESISTANCE_NAME, "Fire Resistance"); - configuration.addDefault(GLOWING_NAME, "Glowing"); - configuration.addDefault(HARM_NAME, "Instant Damage"); - configuration.addDefault(HEAL_NAME, "Instant Health"); - configuration.addDefault(HEAL_BOOST_NAME, "Health Boost"); - configuration.addDefault(HUNGER_NAME, "Hunger"); - configuration.addDefault(INCREASE_DAMAGE_NAME, "Strength"); - configuration.addDefault(INVISIBILITY_NAME, "Invisibility"); - configuration.addDefault(JUMP_NAME, "Jump Boost"); - configuration.addDefault(LEVITATION_NAME, "Levitation"); - configuration.addDefault(LUCK_POTION_NAME, "Luck"); - configuration.addDefault(NIGHT_VISION_NAME, "Night Vision"); - configuration.addDefault(POISON_NAME, "Poison"); - configuration.addDefault(REGENERATION_NAME, "Regeneration"); - configuration.addDefault(SATURATION_NAME, "Saturation"); - configuration.addDefault(SLOW_NAME, "Slowness"); - configuration.addDefault(SLOW_DIGGING_NAME, "Mining Fatigue"); - configuration.addDefault(SLOW_FALLING_NAME, "Slow Falling"); - configuration.addDefault(SPEED_NAME, "Speed"); - configuration.addDefault(UNLUCK_NAME, "Bad Luck"); - configuration.addDefault(WATER_BREATHING_NAME, "Water Breathing"); - configuration.addDefault(WEAKNESS_NAME, "Weakness"); - configuration.addDefault(WITHER_NAME, "Wither"); - configuration.addDefault(FLAMETHROWER_NAME, "Flamethrower"); - configuration.addDefault(HUNTER_NAME, "Hunter"); - configuration.addDefault(ENABLE_RARE_DROP_EFFECT, true); - - configuration.options().copyDefaults(true); - UnusedNodeHandler.clearNodes(configuration); - customConfigLoader.saveDefaultCustomConfig(CONFIG_NAME); - customConfigLoader.saveCustomConfig(CONFIG_NAME); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/config/ItemsProceduralSettingsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/ItemsProceduralSettingsConfig.java deleted file mode 100644 index e255dda69..000000000 --- a/src/main/java/com/magmaguy/elitemobs/config/ItemsProceduralSettingsConfig.java +++ /dev/null @@ -1,1591 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.config; - -import com.magmaguy.elitemobs.ChatColorConverter; -import org.bukkit.configuration.Configuration; - -import java.util.Arrays; - -/** - * Created by MagmaGuy on 04/06/2017. - */ -public class ItemsProceduralSettingsConfig { - - public static final String CONFIG_NAME = "ItemsProceduralSettings.yml"; - public static final String LORE_MOB_LEVEL_SOURCE = "Item source (mob)"; - public static final String LORE_SHOP_SOURCE = "Item source (shop)"; - public static final String LORE_STRUCTURE = "Lore structure"; - public static final String DROP_ITEMS_ON_DEATH = "Drop procedurally generated items on Elite Mob death"; - public static final String MONITOR_ITEMS_ON_CONSOLE = "Monitor procedurally generated items on console"; - public static final String PROCEDURAL_ITEM_VALID_MATERIALS = "Valid material list for random items"; - public static String ARROW_DAMAGE_BOOL, ARROW_DAMAGE_MAX_LEVEL, - ARROW_FIRE_BOOL, ARROW_FIRE_MAX_LEVEL, - ARROW_INFINITE_BOOL, - ARROW_KNOCKBACK_BOOL, ARROW_KNOCKBACK_MAX_LEVEL, - BINDING_CURSE_BOOL, - DAMAGE_ALL_BOOL, DAMAGE_ALL_MAX_LEVEL, - DAMAGE_ARTHROPODS_BOOL, DAMAGE_ARTHROPODS_MAX_LEVEL, - DAMAGE_UNDEAD_BOOL, DAMAGE_UNDEAD_MAX_LEVEL, - DEPTH_STRIDER_BOOL, DEPTH_STRIDER_MAX_LEVEL, - DIG_SPEED_BOOL, DIG_SPEED_MAX_LEVEL, - DURABILITY_BOOL, DURABILITY_MAX_LEVEL, - FIRE_ASPECT_BOOL, FIRE_ASPECT_MAX_LEVEL, - FROST_WALKER_BOOL, FROST_WALKER_MAX_LEVEL, - KNOCKBACK_BOOL, KNOCKBACK_MAX_LEVEL, - LOOT_BONUS_BLOCKS_BOOL, LOOT_BONUS_BLOCKS_MAX_LEVEL, - LOOT_BONUS_MOBS_BOOL, LOOT_BONUS_MOBS_MAX_LEVEL, - LUCK_BOOL, LUCK_MAX_LEVEL, - LURE_BOOL, LURE_MAX_LEVEL, - MENDING_BOOL, - OXYGEN_BOOL, OXYGEN_MAX_LEVEL, - PROTECTION_ENVIRONMENTAL_BOOL, PROTECTION_ENVIRONMENTAL_MAX_LEVEL, - PROTECTION_EXPLOSIONS_BOOL, PROTECTION_EXPLOSIONS_MAX_LEVEL, - PROTECTION_FALL_BOOL, PROTECTION_FALL_MAX_LEVEL, - PROTECTION_FIRE_BOOL, PROTECTION_FIRE_MAX_LEVEL, - PROTECTION_PROJECTILE_BOOL, PROTECTION_PROJECTILE_MAX_LEVEL, - SILK_TOUCH_BOOL, - SWEEPING_EDGE_BOOL, SWEEPING_EDGE_MAX_LEVEL, - THORNS_BOOL, THORNS_MAX_LEVEL, - VANISHING_CURSE_BOOL, - WATER_WORKER_BOOL, WATER_WORKER_MAX_LEVEL; - public static String HUNTER_BOOL, HUNTER_MAX_LEVEL; - public static final String ITEM_NAME_FORMAT = "Procedurally generated item name format"; - private static final String MATERIAL_NAME = "Material name."; - public static final String SWORD_MATERIAL_NAME = MATERIAL_NAME + "Sword"; - public static final String BOW_MATERIAL_NAME = MATERIAL_NAME + "Bow"; - public static final String PICKAXE_MATERIAL_NAME = MATERIAL_NAME + "Pickaxe"; - public static final String SPADE_MATERIAL_NAME = MATERIAL_NAME + "Spade"; - public static final String HOE_MATERIAL_NAME = MATERIAL_NAME + "Hoe"; - public static final String AXE_MATERIAL_NAME = MATERIAL_NAME + "Axe"; - public static final String HELMET_MATERIAL_NAME = MATERIAL_NAME + "Helmet"; - public static final String CHESTPLATE_MATERIAL_NAME = MATERIAL_NAME + "Chestplate"; - public static final String LEGGINGS_MATERIAL_NAME = MATERIAL_NAME + "Leggings"; - public static final String BOOTS_MATERIAL_NAME = MATERIAL_NAME + "Boots"; - public static final String SHEARS_MATERIAL_NAME = MATERIAL_NAME + "Shears"; - public static final String FISHING_ROD_MATERIAL_NAME = MATERIAL_NAME + "Fishing Rod"; - public static final String SHIELD_MATERIAL_NAME = MATERIAL_NAME + "Shield"; - public static final String CUSTOM_ENCHANTMENT_CHANCE = "Chance of getting a custom enchantment"; - - CustomConfigLoader customConfigLoader = new CustomConfigLoader(); - public Configuration configuration = customConfigLoader.getCustomConfig(CONFIG_NAME); - - public void intializeConfig() { - - configuration.addDefault(DROP_ITEMS_ON_DEATH, true); - configuration.addDefault(MONITOR_ITEMS_ON_CONSOLE, false); - configuration.addDefault(LORE_MOB_LEVEL_SOURCE, "Looted from a level $level Elite $mob"); - configuration.addDefault(LORE_SHOP_SOURCE, "Purchased from a store"); - configuration.addDefault(LORE_STRUCTURE, Arrays.asList( - ChatColorConverter.convert("$enchantments"), - ChatColorConverter.convert("$potionEffects"), - ChatColorConverter.convert("&m----------------------"), - ChatColorConverter.convert("$itemSource"), - ChatColorConverter.convert( "$itemValue"), - ChatColorConverter.convert("Elite Mobs drop"), - ChatColorConverter.convert("&m----------------------"), - ChatColorConverter.convert("Tier $tier") - )); - configuration.addDefault(PROCEDURAL_ITEM_VALID_MATERIALS, Arrays.asList( - "DIAMOND_SWORD", - "GOLD_SWORD", - "IRON_SWORD", - "STONE_SWORD", - "WOOD_SWORD", - "BOW", - "DIAMOND_PICKAXE", - "GOLD_PICKAXE", - "IRON_PICKAXE", - "STONE_PICKAXE", - "WOOD_PICKAXE", - "DIAMOND_SPADE", - "GOLD_SPADE", - "IRON_SPADE", - "STONE_SPADE", - "WOOD_SPADE", - "DIAMOND_HOE", - "GOLD_HOE", - "IRON_HOE", - "STONE_HOE", - "WOOD_HOE", - "DIAMOND_AXE", - "GOLD_AXE", - "IRON_AXE", - "STONE_AXE", - "WOOD_AXE", - "SHEARS", - "SHIELD", - "FISHING_ROD", - "CHAINMAIL_HELMET", - "DIAMOND_HELMET", - "GOLD_HELMET", - "IRON_HELMET", - "LEATHER_HELMET", - "CHAINMAIL_CHESTPLATE", - "DIAMOND_CHESTPLATE", - "GOLD_CHESTPLATE", - "IRON_CHESTPLATE", - "LEATHER_CHESTPLATE", - "CHAINMAIL_LEGGINGS", - "DIAMOND_LEGGINGS", - "GOLD_LEGGINGS", - "IRON_LEGGINGS", - "LEATHER_LEGGINGS", - "CHAINMAIL_BOOTS", - "DIAMOND_BOOTS", - "GOLD_BOOTS", - "IRON_BOOTS", - "LEATHER_BOOTS" - )); - - ARROW_DAMAGE_BOOL = boolValidEnchantmentConstructor("ARROW_DAMAGE"); - ARROW_DAMAGE_MAX_LEVEL = maxLevelValidEnchantmentConstructor("ARROW_DAMAGE"); - - ARROW_FIRE_BOOL = boolValidEnchantmentConstructor("ARROW_FIRE"); - ARROW_FIRE_MAX_LEVEL = maxLevelValidEnchantmentConstructor("ARROW_FIRE"); - - ARROW_INFINITE_BOOL = boolValidEnchantmentConstructor("ARROW_INFINITE"); - - ARROW_KNOCKBACK_BOOL = boolValidEnchantmentConstructor("ARROW_KNOCKBACK"); - ARROW_KNOCKBACK_MAX_LEVEL = maxLevelValidEnchantmentConstructor("ARROW_KNOCKBACK"); - - BINDING_CURSE_BOOL = boolValidEnchantmentConstructor("BINDING_CURSE"); - - DAMAGE_ALL_BOOL = boolValidEnchantmentConstructor("DAMAGE_ALL"); - DAMAGE_ALL_MAX_LEVEL = maxLevelValidEnchantmentConstructor("DAMAGE_ALL"); - - DAMAGE_ARTHROPODS_BOOL = boolValidEnchantmentConstructor("DAMAGE_ARTHROPODS"); - DAMAGE_ARTHROPODS_MAX_LEVEL = maxLevelValidEnchantmentConstructor("DAMAGE_ARTHROPODS"); - - DAMAGE_UNDEAD_BOOL = boolValidEnchantmentConstructor("DAMAGE_UNDEAD"); - DAMAGE_UNDEAD_MAX_LEVEL = maxLevelValidEnchantmentConstructor("DAMAGE_UNDEAD"); - - DEPTH_STRIDER_BOOL = boolValidEnchantmentConstructor("DEPTH_STRIDER"); - DEPTH_STRIDER_MAX_LEVEL = maxLevelValidEnchantmentConstructor("DEPTH_STRIDER"); - - DIG_SPEED_BOOL = boolValidEnchantmentConstructor("DIG_SPEED"); - DIG_SPEED_MAX_LEVEL = maxLevelValidEnchantmentConstructor("DIG_SPEED"); - - DURABILITY_BOOL = boolValidEnchantmentConstructor("DURABILITY"); - DURABILITY_MAX_LEVEL = maxLevelValidEnchantmentConstructor("DURABILITY"); - - FIRE_ASPECT_BOOL = boolValidEnchantmentConstructor("FIRE_ASPECT"); - FIRE_ASPECT_MAX_LEVEL = maxLevelValidEnchantmentConstructor("FIRE_ASPECT"); - - FROST_WALKER_BOOL = boolValidEnchantmentConstructor("FROST_WALKER"); - FROST_WALKER_MAX_LEVEL = maxLevelValidEnchantmentConstructor("FROST_WALKER"); - - KNOCKBACK_BOOL = boolValidEnchantmentConstructor("KNOCKBACK"); - KNOCKBACK_MAX_LEVEL = maxLevelValidEnchantmentConstructor("KNOCKBACK"); - - LOOT_BONUS_BLOCKS_BOOL = boolValidEnchantmentConstructor("LOOT_BONUS_BLOCKS"); - LOOT_BONUS_BLOCKS_MAX_LEVEL = maxLevelValidEnchantmentConstructor("LOOT_BONUS_BLOCKS"); - - LOOT_BONUS_MOBS_BOOL = boolValidEnchantmentConstructor("LOOT_BONUS_MOBS"); - LOOT_BONUS_MOBS_MAX_LEVEL = maxLevelValidEnchantmentConstructor("LOOT_BONUS_MOBS"); - - LUCK_BOOL = boolValidEnchantmentConstructor("LUCK"); - LUCK_MAX_LEVEL = maxLevelValidEnchantmentConstructor("LUCK"); - - LURE_BOOL = boolValidEnchantmentConstructor("LURE"); - LURE_MAX_LEVEL = maxLevelValidEnchantmentConstructor("LURE"); - - MENDING_BOOL = boolValidEnchantmentConstructor("MENDING"); - - OXYGEN_BOOL = boolValidEnchantmentConstructor("OXYGEN"); - OXYGEN_MAX_LEVEL = maxLevelValidEnchantmentConstructor("OXYGEN"); - - PROTECTION_ENVIRONMENTAL_BOOL = boolValidEnchantmentConstructor("PROTECTION_ENVIRONMENTAL"); - PROTECTION_ENVIRONMENTAL_MAX_LEVEL = maxLevelValidEnchantmentConstructor("PROTECTION_ENVIRONMENTAL"); - - PROTECTION_EXPLOSIONS_BOOL = boolValidEnchantmentConstructor("PROTECTION_EXPLOSIONS"); - PROTECTION_EXPLOSIONS_MAX_LEVEL = maxLevelValidEnchantmentConstructor("PROTECTION_EXPLOSIONS"); - - PROTECTION_FALL_BOOL = boolValidEnchantmentConstructor("PROTECTION_FALL"); - PROTECTION_FALL_MAX_LEVEL = maxLevelValidEnchantmentConstructor("PROTECTION_FALL"); - - PROTECTION_FIRE_BOOL = boolValidEnchantmentConstructor("PROTECTION_FIRE"); - PROTECTION_FIRE_MAX_LEVEL = maxLevelValidEnchantmentConstructor("PROTECTION_FIRE"); - - PROTECTION_PROJECTILE_BOOL = boolValidEnchantmentConstructor("PROTECTION_PROJECTILE"); - PROTECTION_PROJECTILE_MAX_LEVEL = maxLevelValidEnchantmentConstructor("PROTECTION_PROJECTILE"); - - SILK_TOUCH_BOOL = boolValidEnchantmentConstructor("SILK_TOUCH"); - - SWEEPING_EDGE_BOOL = boolValidEnchantmentConstructor("SWEEPING_EDGE"); - SWEEPING_EDGE_MAX_LEVEL = maxLevelValidEnchantmentConstructor("SWEEPING_EDGE"); - - THORNS_BOOL = boolValidEnchantmentConstructor("THORNS"); - THORNS_MAX_LEVEL = maxLevelValidEnchantmentConstructor("THORNS"); - - VANISHING_CURSE_BOOL = boolValidEnchantmentConstructor("VANISHING"); - - WATER_WORKER_BOOL = boolValidEnchantmentConstructor("WATER_WORKER"); - WATER_WORKER_MAX_LEVEL = maxLevelValidEnchantmentConstructor("WATER_WORKER"); - - /* - Custom enchantments - */ - HUNTER_BOOL = boolValidEnchantmentConstructor("HUNTER"); - HUNTER_MAX_LEVEL = maxLevelValidEnchantmentConstructor("HUNTER"); - - - configuration.addDefault(ARROW_DAMAGE_BOOL, true); - configuration.addDefault(ARROW_DAMAGE_MAX_LEVEL, 5); - - configuration.addDefault(ARROW_FIRE_BOOL, true); - configuration.addDefault(ARROW_FIRE_MAX_LEVEL, 1); - - configuration.addDefault(ARROW_INFINITE_BOOL, true); - - configuration.addDefault(ARROW_KNOCKBACK_BOOL, true); - configuration.addDefault(ARROW_KNOCKBACK_MAX_LEVEL, 2); - - configuration.addDefault(BINDING_CURSE_BOOL, true); - - configuration.addDefault(DAMAGE_ALL_BOOL, true); - configuration.addDefault(DAMAGE_ALL_MAX_LEVEL, 5); - - configuration.addDefault(DAMAGE_ARTHROPODS_BOOL, true); - configuration.addDefault(DAMAGE_ARTHROPODS_MAX_LEVEL, 5); - - configuration.addDefault(DAMAGE_UNDEAD_BOOL, true); - configuration.addDefault(DAMAGE_UNDEAD_MAX_LEVEL, 5); - - configuration.addDefault(DEPTH_STRIDER_BOOL, true); - configuration.addDefault(DEPTH_STRIDER_MAX_LEVEL, 3); - - configuration.addDefault(DIG_SPEED_BOOL, true); - configuration.addDefault(DIG_SPEED_MAX_LEVEL, 5); - - configuration.addDefault(DURABILITY_BOOL, true); - configuration.addDefault(DURABILITY_MAX_LEVEL, 3); - - configuration.addDefault(FIRE_ASPECT_BOOL, true); - configuration.addDefault(FIRE_ASPECT_MAX_LEVEL, 2); - - configuration.addDefault(FROST_WALKER_BOOL, true); - configuration.addDefault(FROST_WALKER_MAX_LEVEL, 2); - - configuration.addDefault(KNOCKBACK_BOOL, true); - configuration.addDefault(KNOCKBACK_MAX_LEVEL, 2); - - configuration.addDefault(LOOT_BONUS_BLOCKS_BOOL, true); - configuration.addDefault(LOOT_BONUS_BLOCKS_MAX_LEVEL, 3); - - configuration.addDefault(LOOT_BONUS_MOBS_BOOL, true); - configuration.addDefault(LOOT_BONUS_MOBS_MAX_LEVEL, 3); - - configuration.addDefault(LUCK_BOOL, true); - configuration.addDefault(LUCK_MAX_LEVEL, 3); - - configuration.addDefault(LURE_BOOL, true); - configuration.addDefault(LURE_MAX_LEVEL, 3); - - configuration.addDefault(MENDING_BOOL, false); - - configuration.addDefault(OXYGEN_BOOL, true); - configuration.addDefault(OXYGEN_MAX_LEVEL, 3); - - configuration.addDefault(PROTECTION_ENVIRONMENTAL_BOOL, true); - configuration.addDefault(PROTECTION_ENVIRONMENTAL_MAX_LEVEL, 4); - - configuration.addDefault(PROTECTION_EXPLOSIONS_BOOL, true); - configuration.addDefault(PROTECTION_EXPLOSIONS_MAX_LEVEL, 4); - - configuration.addDefault(PROTECTION_FALL_BOOL, true); - configuration.addDefault(PROTECTION_FALL_MAX_LEVEL, 4); - - configuration.addDefault(PROTECTION_FIRE_BOOL, true); - configuration.addDefault(PROTECTION_FIRE_MAX_LEVEL, 4); - - configuration.addDefault(PROTECTION_PROJECTILE_BOOL, true); - configuration.addDefault(PROTECTION_PROJECTILE_MAX_LEVEL, 4); - - configuration.addDefault(SILK_TOUCH_BOOL, true); - - configuration.addDefault(SWEEPING_EDGE_BOOL, true); - configuration.addDefault(SWEEPING_EDGE_MAX_LEVEL, 3); - - configuration.addDefault(THORNS_BOOL, true); - configuration.addDefault(THORNS_MAX_LEVEL, 3); - - configuration.addDefault(VANISHING_CURSE_BOOL, true); - - configuration.addDefault(WATER_WORKER_BOOL, true); - configuration.addDefault(WATER_WORKER_MAX_LEVEL, 1); - - configuration.addDefault(HUNTER_BOOL, true); - configuration.addDefault(HUNTER_MAX_LEVEL, 3); - - configuration.addDefault(SWORD_MATERIAL_NAME, "Sword"); - configuration.addDefault(BOW_MATERIAL_NAME, "Bow"); - configuration.addDefault(PICKAXE_MATERIAL_NAME, "Pickaxe"); - configuration.addDefault(SPADE_MATERIAL_NAME, "Spade"); - configuration.addDefault(HOE_MATERIAL_NAME, "Hoe"); - configuration.addDefault(AXE_MATERIAL_NAME, "Axe"); - configuration.addDefault(FISHING_ROD_MATERIAL_NAME, "Fishing Rod"); - configuration.addDefault(SHIELD_MATERIAL_NAME, "Shield"); - configuration.addDefault(SHEARS_MATERIAL_NAME, "Shears"); - configuration.addDefault(HELMET_MATERIAL_NAME, "Helmet"); - configuration.addDefault(CHESTPLATE_MATERIAL_NAME, "Chestplate"); - configuration.addDefault(LEGGINGS_MATERIAL_NAME, "Leggings"); - configuration.addDefault(BOOTS_MATERIAL_NAME, "Boots"); - configuration.addDefault(CUSTOM_ENCHANTMENT_CHANCE, 0.1); - - configuration.addDefault(ITEM_NAME_FORMAT, Arrays.asList( - "$verb $itemType of the $adjective $noun", - "$itemType of the $adjective $noun", - "$noun's $adjective $verb $itemType", - "$verb $itemType", - "$adjective $verb $itemType", - "The $verb-er", - "The $adjective $verb-er" - )); - - configuration.addDefault("Valid nouns", Arrays.asList( - "MagmaGuy", - "Dawn", - "Sunset", - "Heaven", - "Hell", - "Angel", - "Archangel", - "Cherub", - "Seraph", - "Demon", - "Fiend", - "Bat", - "Chicken", - "Cow", - "Mooshroom", - "Pig", - "Rabbit", - "Sheep", - "Squid", - "Villager", - "Cave Spider", - "Enderman", - "Polar Bear", - "Spider", - "Zombie Pigman", - "Blaze", - "Creeper", - "Elder Guardian", - "Endermite", - "Evoker", - "Ghast", - "Guardian", - "Husk", - "Magma Cube", - "Shulker", - "Silverfish", - "Skeleton", - "Slime", - "Stray", - "Vex", - "Vindicator", - "Witch", - "Wither Skeleton", - "Zombie", - "Donkey", - "Horse", - "Llama", - "Mule", - "Ocelot", - "Wolf", - "Iron Golem", - "Snow Golem", - "Ender Dragon", - "Wither", - "Illusioner", - "Parrot", - "Giant", - "Killer Bunny", - "Steve", - "Wolfbane", - "Chaos", - "Aeon", - "Dragon", - "Sphynx", - "Minotaur", - "Hades", - "Oath", - "Oathbreaker", - "Deserter", - "Betrayer", - "Jade", - "Light", - "Darkness", - "Oblivion", - "Shadow", - "Void", - "Xeno", - "Zealot", - "Zenith", - "Dusk", - "Twilight", - "Mob", - "Elite Mob", - "Urist", - "Dwarf", - "Elf", - "Ork", - "Goblin", - "Gnome", - "Goliath", - "Drow", - "Human", - "Halfling", - "Half-Orc", - "Beholder", - "Mind Flayer", - "Owlbear", - "Bulette", - "Rust Monster", - "Hill Giant", - "Stone Giant", - "Frost Giant", - "Fire Giant", - "Cloud Giant", - "Storm Giant", - "Kobold", - "Lich", - "Ork", - "Umber Hulk", - "Fighter", - "Wizard", - "Paladin", - "Cleric", - "Ranger", - "Archer", - "Mage", - "Tiefling", - "Werewolf", - "Vampire", - "Centaur", - "Catfolk", - "Half-Giant", - "Ogre", - "Troll", - "Rogue", - "Barbarian", - "Bard", - "Druid", - "Monk", - "Sorcerer", - "Warlock", - "Demon HunterEnchantment", - "Death Knight", - "Priest", - "Shaman", - "Warrior", - "Basilisk", - "Chimera", - "Imp", - "Dryad", - "Gargoyle", - "Djinni", - "Efreeti", - "Ghost", - "Hobgoblin", - "Hydra", - "Kraken", - "Lamia", - "Medusa", - "Mimic", - "Mummy", - "Pegasus", - "Roc", - "Satyr", - "Tarrasque", - "Abomination", - "Ghoul", - "Treant", - "Unicorn", - "Wraith", - "Acolyte", - "Gladiator", - "Knight", - "Gryphon", - "Raider", - "Scout", - "Spy", - "Thg", - "Noble", - "Guard", - "Veteran", - "Wyvern", - "Abyssal", - "Infernal", - "Elemental", - "Tauren", - "Pandaren", - "Sasquatch", - "Forsaken", - "Yeti", - "Banshee", - "Arachnid", - "Undead", - "Night Elf", - "Blood Elf", - "Draenei", - "Worgen", - "Warlord", - "Witch", - "Magi", - "Sage", - "Thief", - "Assassin", - "Templar", - "Beastmaster", - "Berserker", - "Inventor", - "Luchador", - "Pirate", - "Vanguard", - "Voidblade", - "Whisp", - "Peasant", - "Footman", - "Swordsman", - "Thrall", - "Felhound", - "Huntress", - "HunterEnchantment" - )); - - configuration.addDefault("Valid verb-er (noun)", Arrays.asList( - "World Breaker", - "World Shatterer", - "Avenger", - "Ashbringer", - "Windseeker", - "Defiler", - "Thunderfury", - "Slicer", - "Slasher", - "Cutter", - "Stabber", - "Scratcher", - "Killer", - "Slayer", - "Destroyer", - "Hugger", - "Murderer", - "Slapper", - "Traveller", - "Teleporter", - "Blinker", - "Wrecker", - "Materializer", - "Spawner", - "Demander", - "Assaulter", - "Striker", - "Ambusher", - "Rusher", - "Stormer", - "Bombarder", - "Barrager", - "Smiter", - "Charger", - "Battler", - "Hammerer", - "Beater", - "Combater", - "Overwhelmer", - "Raider", - "Tackler", - "Shooter", - "Venturer", - "Cracker", - "Smasher", - "Shatterer", - "Fracturer", - "Splinterer", - "Pulverizer", - "Tearer", - "Renderer", - "Snapper", - "Burster", - "Exploder", - "Damager", - "Fragmenter", - "Splitter", - "Fortifier", - "Nudger", - "Tapper", - "Thumper", - "Butter", - "Clatterer", - "Striker", - "Whacker", - "Slammer", - "Summoner", - "Screamer", - "Shifter", - "Transformer", - "Modifyer", - "Twister", - "Blurrer", - "Warper", - "Alterer", - "Adapter", - "Evolver", - "HunterEnchantment", - "Trailer", - "Follower", - "Stalker", - "Shadower", - "Hounder", - "Caser", - "Mounter", - "Ascender", - "Riser", - "Springer", - "Hoarder", - "Reaper", - "Harvester", - "Saver", - "Shelterer", - "Cloaker", - "Shrouder", - "Encloser", - "Hider", - "Masker", - "Buryer", - "Clouder", - "Shader", - "Sealer", - "Enveloper", - "Veiler", - "Traverser", - "Forder", - "Glider", - "Howler", - "Whimperer", - "Screamer", - "Squealer", - "Bawler", - "Screecher", - "Chopper", - "Chipper", - "Snipper", - "Splitter", - "Axer", - "Slasher", - "Renderer", - "Tearer", - "Thinner", - "Cropper", - "Carver", - "Hacker", - "Piercer", - "Sawer", - "Shaver", - "Shearer", - "Miner", - "Excavater", - "Burrower", - "Driller", - "Tunneler", - "Invader", - "Boarder", - "Wanderer", - "Intruder", - "Evader", - "Runner", - "Dodger", - "Crasher", - "Battler", - "Wrestler", - "Scuffler", - "Dueler", - "Brawler", - "Clasher", - "Grappler", - "Scrapper", - "Attacker", - "Feuder", - "Catcher", - "Solver", - "Revealer", - "Leaper", - "Bouncer", - "Vaulter", - "Hopper", - "Surger", - "Punter", - "Dropkicker", - "Perceiver", - "Fader", - "Bleeder", - "Weakener", - "Forger", - "Releaser", - "Gatherer", - "Crusher", - "Propeller", - "Jogger", - "Sprinter", - "Scouter", - "Explorer", - "Digger", - "Trembler", - "Parter", - "Hacker", - "Carver", - "Divider", - "Halver", - "Breaker", - "Renderer", - "Ripper", - "Grazer", - "Imprisoner", - "Cornerer", - "Pinner", - "Catcher", - "Restrainer", - "Binder", - "Snagger", - "Snatcher", - "Cager", - "Capturer", - "Haunter", - "Creeper", - "Sneaker" - )); - - configuration.addDefault("Valid adjectives", Arrays.asList( - "Adorable", - "Beautiful", - "Clean", - "Elegant", - "Fancy", - "Glamorous", - "Handsome", - "Long", - "Magnificent", - "Plain", - "Quaint", - "Sparkling", - "Ugliest", - "Red", - "Orange", - "Yellow", - "Green", - "Blue", - "Purple", - "Gray", - "Black", - "White", - "Dead", - "Odd", - "Powerful", - "Rich", - "Vast", - "Zealous", - "Deafening", - "Faint", - "Melodic", - "Quiet", - "Thundering", - "Whispering", - "Hissing", - "Ancient", - "Fast", - "Old", - "Rapid", - "Slow", - "Rotten", - "Creepy", - "Crooked", - "Empty", - "Heavy", - "Abhorrent", - "Abnormal", - "Absurd", - "Acceptable", - "Accidental", - "Adamant", - "Adventurous", - "Agonizing", - "Alert", - "Annoyed", - "Annoying", - "Anxious", - "Aromatic", - "Aggressive", - "Aloof", - "Amazing", - "Ambiguous", - "Ambitious", - "Amused", - "Angry", - "Arrogant", - "Ashamed", - "Aspiring", - "Astonishing", - "Auspicious", - "Average", - "Awesome", - "Awful", - "Bad", - "Barbarous", - "Bashful", - "Beffiting", - "Belligerent", - "Beneficial", - "Berserk", - "Best", - "Bewildered", - "Big", - "Bitter", - "Bizarre", - "Bloody", - "Boiling", - "Boundless", - "Brash", - "Brave", - "Brawny", - "Breakable", - "Brief", - "Bright", - "Broken", - "Busy", - "Calculating", - "Callous", - "Calm", - "Capricious", - "Careful", - "Careless", - "Caring", - "Cautious", - "Ceaseless", - "Certain", - "Charming", - "Cheap", - "Chief", - "Chilly", - "Chivalrous", - "Chunky", - "Clear", - "Clever", - "Cloistered", - "Clumsy", - "Cloudy", - "Classy", - "Colossal", - "Combative", - "Common", - "Confused", - "Condemned", - "Cool", - "Courageous", - "Cowardly", - "Crazy", - "Craven", - "Cruel", - "Cuddly", - "Curious", - "Cute", - "Damaged", - "Damaging", - "Dangerous", - "Dark", - "Dashing", - "Decisive", - "Deep", - "Defeated", - "Defective", - "Defiant", - "Delicate", - "Delicious", - "Delightful", - "Demonic", - "Delirious", - "Deranged", - "Descriptive", - "Devilish", - "Difficult", - "Diligent", - "Direful", - "Dirty", - "Disastrous", - "Disgusted", - "Disgusting", - "Disillusioned", - "Distinct", - "Disturbed", - "Draconian", - "Dramatic", - "Dreary", - "Dysfunctional", - "Eager", - "Elderly", - "Electric", - "Elite", - "Enchanted", - "Enchanting", - "Energetic", - "Enormous", - "Entertaining", - "Enthusiastic", - "Envious", - "Erratic", - "Ethereal", - "Evasive", - "Excellent", - "Excited", - "Exciting", - "Exotic", - "Exuberant", - "Fabulous", - "Faded", - "Fair", - "Faithful", - "False", - "Familiar", - "Famous", - "Fanatical", - "Fantastic", - "Fascinated", - "Fat", - "Fearful", - "Fearless", - "Feeble", - "Festive", - "Fierce", - "Filthy", - "Fine", - "Finicky", - "First", - "Fixed", - "Flashy", - "Flawless", - "Flimsy", - "Flippant", - "Flowery", - "Fluffy", - "Fluttering", - "Foamy", - "Foolish", - "Forgetful", - "Fortunate", - "Frail", - "Fragile", - "Frantic", - "Free", - "Freezing", - "Fresh", - "Friendly", - "Frightening", - "Fumbling", - "Funny", - "Furry", - "Furtive", - "Fuzzy", - "Giant", - "Gifted", - "Gigantic", - "Glistening", - "Glorious", - "Godly", - "Good", - "Goofy", - "Gorgeous", - "Graceful", - "Grandiose", - "Grateful", - "Greasy", - "Great", - "Greedy", - "Grieving", - "Groovy", - "Grotesque", - "Grubby", - "Gruesome", - "Grumpy", - "Guarded", - "Guiltless", - "Gullible", - "Gutsy", - "Guttural", - "Hallowed", - "Hanging", - "Hapless", - "Happy", - "Harmonious", - "Hateful", - "Healthy", - "Heartbreaking", - "Heavenly", - "Hellish", - "Helpful", - "Helpless", - "Hesitant", - "Hideous", - "Hilarious", - "Hollow", - "Homeless", - "Honorable", - "Horrible", - "Hospitable", - "Huge", - "Hulking", - "Humorous", - "Hungry", - "Hurt", - "Hushed", - "Hypnotic", - "Hysterical", - "Icky", - "Icy", - "Ignorant", - "Ill", - "Illegal", - "Illustrious", - "Imaginary", - "Immense", - "Imminent", - "Impartial", - "Imperfect", - "Impolite", - "Important", - "Incandescent", - "Incompetent", - "Industrious", - "Incredible", - "Inexpensive", - "Infamous", - "Innocent", - "Inquisitive", - "Insidious", - "Instinctive", - "Intelligent", - "Interesting", - "Invincible", - "Irate", - "Itchy", - "Jaded", - "Jagged", - "Jealous", - "Jolly", - "Joyous", - "Jumpy", - "Juvenile", - "Keen", - "Kind", - "Kindhearted", - "Knowing", - "Knowledgeable", - "Known", - "Labored", - "Lame", - "Large", - "Last", - "Late", - "Laughable", - "Lazy", - "Lean", - "Lethal", - "Light", - "Little", - "Living", - "Lonely", - "Loud", - "Lovely", - "Lucky", - "Magenta", - "Magical", - "Majestic", - "Malicious", - "Marked", - "Massive", - "Marvelous", - "Mean", - "Medical", - "Melted", - "Messy", - "Mighty", - "Military", - "Mindless", - "Minor", - "Misty", - "Mixed", - "Modern", - "Motionless", - "Mysterious", - "Naive", - "Narrow", - "Natural", - "Neat", - "Necessary", - "Needless", - "Needy", - "Nervous", - "New", - "Nice", - "Normal", - "Nostalgic", - "Numberless", - "Obsolete", - "Obtainable", - "Oceanic", - "Old-fashioned", - "Omniscient", - "Optimal", - "Ordinary", - "Organic", - "Outstanding", - "Oval", - "Overrated", - "Painful", - "Parallel", - "Pathetic", - "Peaceful", - "Penitent", - "Perfect", - "Periodic", - "Petite", - "Physical", - "Pink", - "Plastic", - "Pleasant", - "Pointless", - "Polite", - "Poor", - "Precious", - "Premium", - "Present", - "Pretty", - "Private", - "Productive", - "Protective", - "Public", - "Puzzling", - "Questionable", - "Quick", - "Quickest", - "Rare", - "Ready", - "Real", - "Rebel", - "Regular", - "Remarkable", - "Responsible", - "Romantic", - "Round", - "Royal", - "Sad", - "Safe", - "Salty", - "Satisfying", - "Scared", - "Scary", - "Scientific", - "Scrawny", - "Screeching", - "Second", - "Second-hand", - "Secret", - "Selfish", - "Sequacious", - "Serious", - "Shallow", - "Sharp", - "Shiny", - "Shocking", - "Short", - "Shy", - "Sick", - "Silent", - "Silky", - "Silly", - "Simple", - "Skinny", - "Slim", - "Slimy", - "Slippery", - "Small", - "Smart", - "Smiling", - "Smooth", - "Sneaky", - "Soft", - "Solid", - "Special", - "Spectacular", - "Spicy", - "Spiky", - "Splendid", - "Spooky", - "Spotless", - "Square", - "Staking", - "Standing", - "Steady", - "Sticky", - "Strange", - "Striped", - "Strong", - "Successful", - "Super", - "Supreme", - "Sweet", - "Talented", - "Tall", - "Tasty", - "Temporary", - "Tense", - "Terrible", - "Terrific", - "Tested", - "Thankful", - "Thick", - "Thin", - "Thirsty", - "Thoughtful", - "Tiny", - "Tired", - "Tricky", - "Troubled", - "True", - "Ugly", - "Ultra", - "Unadvised", - "Unarmed", - "Uncovered", - "Unhealthy", - "Unique", - "Unknown", - "Unnatural", - "Unused", - "Unusual", - "Used", - "Useful", - "Useless", - "Valuable", - "Violent", - "Waiting", - "Wandering", - "Warm", - "Weak", - "Wealthy", - "Whole", - "Wise", - "Wonderful", - "Wooden", - "Worried", - "Worthless", - "Wrong", - "Menacing" - )); - - configuration.addDefault("Valid verbs", Arrays.asList( - "Slashing", - "Cutting", - "Stabbing", - "Scratching", - "Killing", - "Slaying", - "Butchering", - "Destroying", - "Tickling", - "Hugging", - "Murdering", - "Slapping", - "Hissing", - "Traveling", - "Teleporting", - "Blinking", - "Destroying", - "Wrecking", - "Flashing", - "Materializing", - "Spawning", - "Questioning", - "Inquiring", - "Pleading", - "Demanding", - "Interrogating", - "Querying", - "Assaulting", - "Striking", - "Ambushing", - "Assailing", - "Rushing", - "Storming", - "Bombarding", - "Barraging", - "Smiting", - "Charging", - "Clobbering", - "Battling", - "Battering", - "Hammering", - "Beating", - "Combating", - "Overwhelming", - "Raiding", - "Tackling", - "Shooting", - "Venturing", - "Cracking", - "Rupturing", - "Smashing", - "Shattering", - "Fracturing", - "Splintering", - "Pulverizing", - "Tearing", - "Rending", - "Snapping", - "Bursting", - "Exploding", - "Damaging", - "Fragmenting", - "Splitting", - "Fortifying", - "Nudging", - "Tapping", - "Jostling", - "Thumping", - "Butting", - "Clattering", - "Striking", - "Whacking", - "Slamming", - "Summoning", - "Screaming", - "Bellowing", - "Roaring", - "Shifting", - "Transforming", - "Modifying", - "Twisting", - "Mutating", - "Distorting", - "Blurring", - "Adjusting", - "Warping", - "Altering", - "Adapting", - "Evolving", - "Varying", - "Hunting", - "Trailing", - "Following", - "Stalking", - "Shadowing", - "Hounding", - "Casing", - "Mounting", - "Ascending", - "Rising", - "Heaving", - "Springing", - "Cresting", - "Gathering", - "Corralling", - "Hoarding", - "Reaping", - "Harvesting", - "Saving", - "Sheltering", - "Cloaking", - "Shrouding", - "Enclosing", - "Concealing", - "Hiding", - "Disguising", - "Masking", - "Burying", - "Smothering", - "Clouding", - "Shielding", - "Shading", - "Sealing", - "Enveloping", - "Veiling", - "Obscuring", - "Traversing", - "Fording", - "Gliding", - "Howling", - "Whimpering", - "Screaming", - "Shrieking", - "Squealing", - "Roaring", - "Wailing", - "Bawling", - "Screeching", - "Cleaving", - "Chopping", - "Chipping", - "Severing", - "Slicing", - "Snipping", - "Splitting", - "Axing", - "Slashing", - "Rending", - "Tearing", - "Thinning", - "Cropping", - "Carving", - "Dissecting", - "Hacking", - "Piercing", - "Sawing", - "Shaving", - "Shearing", - "Mining", - "Delving", - "Excavating", - "Burrowing", - "Drilling", - "Hollowing", - "Gouging", - "Tunneling", - "Invading", - "Boarding", - "Wandering", - "Infiltrating", - "Intruding", - "Evading", - "Fleeing", - "Running", - "Dodging", - "Crashing", - "Battling", - "Tussling", - "Wrestling", - "Scuffling", - "Dueling", - "Brawling", - "Jousting", - "Sparring", - "Clashing", - "Warring", - "Grappling", - "Scrapping", - "Attacking", - "Feuding", - "Skirmishing", - "Discovering", - "Detecting", - "Catching", - "Solving", - "Revealing", - "Unearthing", - "Leaping", - "Bouncing", - "Springing", - "Vaulting", - "Hopping", - "Surging", - "Punting", - "Booting", - "Dropkicking", - "Sensing", - "Perceiving", - "Detecting", - "Fading", - "Bleeding", - "Shrinking", - "Weakening", - "Abating", - "Diminishing", - "Forging", - "Releasing", - "Gathering", - "Collecting", - "Culling", - "Crushing", - "Propelling", - "Jogging", - "Sprinting", - "Questing", - "Scouting", - "Exploring", - "Digging", - "Trembling", - "Rattling", - "Parting", - "Hacking", - "Rupturing", - "Carving", - "Dividing", - "Halving", - "Breaking", - "Sundering", - "Separating", - "Rending", - "Ripping", - "Grazing", - "Imprisoning", - "Snaring", - "Cornering", - "Entangling", - "Pinning", - "Catching", - "Restraining", - "Binding", - "Hooking", - "Snagging", - "Snatching", - "Caging", - "Capturing", - "Haunting", - "Creeping", - "Sneaking", - "Spying", - "Avenging" - - )); - - configuration.options().copyDefaults(true); - UnusedNodeHandler.clearNodes(configuration); - customConfigLoader.saveDefaultCustomConfig(CONFIG_NAME); - customConfigLoader.saveCustomConfig(CONFIG_NAME); - - } - - private String boolValidEnchantmentConstructor(String string) { - - String validEnchantmentsprefix = "Valid Enchantments."; - String allowSuffix = ".Allow"; - - String finalString = validEnchantmentsprefix + string + allowSuffix; - - return finalString; - - } - - private String maxLevelValidEnchantmentConstructor(String string) { - - String validEnchantmentsprefix = "Valid Enchantments."; - String maxLevelSuffix = ".Max Level"; - - String finalString = validEnchantmentsprefix + string + maxLevelSuffix; - - return finalString; - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/config/ItemsUniqueConfig.java b/src/main/java/com/magmaguy/elitemobs/config/ItemsUniqueConfig.java deleted file mode 100644 index ae6af6a33..000000000 --- a/src/main/java/com/magmaguy/elitemobs/config/ItemsUniqueConfig.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.config; - -import com.magmaguy.elitemobs.items.uniqueitems.*; -import org.bukkit.configuration.Configuration; - -public class ItemsUniqueConfig{ - - public static final String CONFIG_NAME = "ItemsUnique.yml"; - private CustomConfigLoader customConfigLoader = new CustomConfigLoader(); - private Configuration configuration = customConfigLoader.getCustomConfig(CONFIG_NAME); - - public static final String ENABLE_UNIQUE_ITEMS = "Enable unique items"; - public static final String ENABLE_HUNTING_SET = "Enable Mob Hunting set"; - public static final String HUNTING_SET_CHANCE_INCREASER = "EliteMob percentual spawn chance increase per hunting set item"; - public static final String ENABLE_ZOMBIE_KING_AXE = "Enable Zombie King Axe"; - public static final String SHOW_ITEM_WORTH = "Show item worth"; - public static final String ENABLE_KRAKEN_FISHING_ROD = "Enable Depths Seeker Fishing Rod"; - public static final String ENABLE_GREED = "Enable Dwarven Greed pickaxe"; - public static final String ENABLE_THE_FELLER = "Enable The Feller"; - - public void initializeConfig() { - - configuration.addDefault(ENABLE_UNIQUE_ITEMS, true); - configuration.addDefault(SHOW_ITEM_WORTH, true); - configuration.addDefault(ENABLE_HUNTING_SET, true); - configuration.addDefault(HUNTING_SET_CHANCE_INCREASER, 10); - configuration.addDefault(ENABLE_ZOMBIE_KING_AXE, true); - configuration.addDefault(ENABLE_KRAKEN_FISHING_ROD, true); - configuration.addDefault(ENABLE_GREED, true); - configuration.addDefault(ENABLE_THE_FELLER, true); - - customConfigLoader.getCustomConfig(CONFIG_NAME).options().copyDefaults(true); - customConfigLoader.saveDefaultCustomConfig(CONFIG_NAME); - customConfigLoader.saveCustomConfig(CONFIG_NAME); - -// Non-static item assembly to avoid issues with making the configuration static (messes up reloads and changes) - HuntingHelmet huntingHelmet = new HuntingHelmet(); - huntingHelmet.assembleConfigItem(configuration); - - HuntingChestplate huntingChestplate = new HuntingChestplate(); - huntingChestplate.assembleConfigItem(configuration); - - HuntingLeggings huntingLeggings = new HuntingLeggings(); - huntingLeggings.assembleConfigItem(configuration); - - HuntingBoots huntingBoots = new HuntingBoots(); - huntingBoots.assembleConfigItem(configuration); - - HuntingBow huntingBow = new HuntingBow(); - huntingBow.assembleConfigItem(configuration); - - ZombieKingsAxe zombieKingsAxe = new ZombieKingsAxe(); - zombieKingsAxe.assembleConfigItem(configuration); - - DepthsSeeker depthsSeeker = new DepthsSeeker(); - depthsSeeker.assembleConfigItem(configuration); - - DwarvenGreed dwarvenGreed = new DwarvenGreed(); - dwarvenGreed.assembleConfigItem(configuration); - - TheFeller theFeller = new TheFeller(); - theFeller.assembleConfigItem(configuration); - - customConfigLoader.getCustomConfig(CONFIG_NAME).options().copyDefaults(true); - UnusedNodeHandler.clearNodes(configuration); - customConfigLoader.saveDefaultCustomConfig(CONFIG_NAME); - customConfigLoader.saveCustomConfig(CONFIG_NAME); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/config/LegacyValueConverter.java b/src/main/java/com/magmaguy/elitemobs/config/LegacyValueConverter.java new file mode 100644 index 000000000..3a0b9fcdd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/LegacyValueConverter.java @@ -0,0 +1,121 @@ +package com.magmaguy.elitemobs.config; + +import org.bukkit.Particle; + +import java.util.Locale; + +public class LegacyValueConverter { + private LegacyValueConverter() { + } + + public static String parseEnchantment(String materialName) { + switch (materialName.toUpperCase(Locale.ROOT)) { + case "ARROW_DAMAGE": + return "POWER"; + case "ARROW_FIRE": + return "FLAME"; + case "ARROW_INFINITE": + return "INFINITY"; + case "ARROW_KNOCKBACK": + return "PUNCH"; + case "DAMAGE_ARTHROPODS": + return "BANE_OF_ARTHROPODS"; + case "DAMAGE_UNDEAD": + return "SMITE"; + case "DIG_SPEED": + return "EFFICIENCY"; + case "DURABILITY": + return "UNBREAKING"; + case "LOOT_BONUS_BLOCKS": + return "FORTUNE"; + case "LOOT_BONUS_MOBS": + return "LOOTING"; + case "LUCK": + return "LUCK_OF_THE_SEA"; + case "RESPIRATION": + return "RESPIRATION"; + case "PROTECTION_ENVIRONMENTAL": + return "PROTECTION"; + case "BLAST_PROTECTION": + return "BLAST_PROTECTION"; + case "PROTECTION_FALL": + return "FEATHER_FALLING"; + case "PROTECTION_FIRE": + return "FIRE_PROTECTION"; + case "PROTECTION_PROJECTILE": + return "PROJECTILE_PROTECTION"; + case "WATER_WORKER": + return "AQUA_AFFINITY"; + default: + return materialName; + } + } + + public static String parsePotionEffect(String potionEffectName) { + switch (potionEffectName.toUpperCase(Locale.ROOT)) { + case "CONFUSION": + return "NAUSEA"; + case "DAMAGE_RESISTANCE": + return "RESISTANCE"; + case "FAST_DIGGING": + return "HASTE"; + case "HARM": + return "INSTANT_DAMAGE"; + case "HEAL": + return "INSTANT_HEALTH"; + case "INCREASE_DAMAGE": + return "STRENGTH"; + case "JUMP": + return "JUMP_BOOST"; + case "SLOW": + return "SLOWNESS"; + case "SLOW_DIGGING": + return "MINING_FATIGUE"; + default: + return potionEffectName; + } + } + + public static String parseParticle(String potionEffectName) { + switch (potionEffectName.toUpperCase(Locale.ROOT)) { + case "EXPLOSION_NORMAL", "EXPLOSION_LARGE": + return Particle.EXPLOSION.toString(); + case "SMOKE_NORMAL": + return Particle.SMOKE.toString(); + case "SMOKE_LARGE": + return Particle.LARGE_SMOKE.toString(); + case "REDSTONE": + return Particle.DUST.toString(); + case "SLIME": + return Particle.ITEM_SLIME.toString(); + case "DRIP_LAVA": + return Particle.DRIPPING_WATER.toString(); + case "EXPLOSION_HUGE": + return Particle.EXPLOSION.toString(); + case "SNOWBALL": + return Particle.SNOWFLAKE.toString(); + case "SPELL": + return Particle.WITCH.toString(); + case "DRIP_WATER": + return Particle.DRIPPING_WATER.toString(); + case "SPELL_MOB": + return Particle.WITCH.toString(); + case "VILLAGER_ANGRY": + return Particle.ANGRY_VILLAGER.toString(); + case "WATER_BUBBLE": + return Particle.UNDERWATER.toString(); + case "VILLAGER_HAPPY": + return Particle.HAPPY_VILLAGER.toString(); + case "WATER_SPLASH": + return Particle.SPLASH.toString(); + default: + return potionEffectName; + } + } + + public static String parseDeserializedBlocks(String originalDeserializedBlock) { + if (originalDeserializedBlock.endsWith("grass")) + return originalDeserializedBlock.replace("grass", "grass_block[snowy=false]"); + return originalDeserializedBlock; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/MobCombatSettingsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/MobCombatSettingsConfig.java index d80be6013..070621c58 100644 --- a/src/main/java/com/magmaguy/elitemobs/config/MobCombatSettingsConfig.java +++ b/src/main/java/com/magmaguy/elitemobs/config/MobCombatSettingsConfig.java @@ -1,129 +1,222 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package com.magmaguy.elitemobs.config; -import org.bukkit.configuration.Configuration; - -public class MobCombatSettingsConfig { - - public static final String CONFIG_NAME = "MobCombatSettings.yml"; - - public static final String NATURAL_MOB_SPAWNING = "Natural EliteMob spawning"; - public static final String SPAWNERS_SPAWN_ELITE_MOBS = "Spawners can spawn Elite Mobs"; - public static final String AGGRESSIVE_MOB_CONVERSION_PERCENTAGE = "Percentage of aggressive mobs that get converted to EliteMobs when they spawn"; - public static final String AGGRESSIVE_MOB_STACKING = "Aggressive mob stacking"; - public static final String ELITEMOB_STACKING_CAP = "Elite mob stacking cap"; - public static final String PER_TIER_LEVEL_INCREASE = "Levels between elite mob tiers"; - public static final String STACK_AGGRESSIVE_SPAWNER_MOBS = "Stack aggressive spawner mobs"; - public static final String STACK_AGGRESSIVE_NATURAL_MOBS = "Stack aggressive natural mobs"; - public static final String AGGRESSIVE_STACK_RANGE = "Range to stack aggressive mobs"; - public static final String PASSIVE_STACK_RANGE = "Range to stack passive mobs"; - public static final String NATURAL_ELITEMOB_LEVEL_CAP = "Natural elite mob level cap"; - public final static String TARGET_HITS_TO_KILL = "Target hits to kill Elite Mob"; - public final static String BASE_DAMAGE_DEALT_TO_PLAYER = "Base damage dealt to players by Elite Mobs"; - public static final String ELITE_CREEPER_EXPLOSION_MULTIPLIER = "SuperCreeper explosion nerf multiplier"; - public static final String ELITE_ARMOR = "Elite Mobs wear armor"; - public static final String ELITE_HELMETS = "Elite Mobs wear helmets"; - public static final String ENABLE_VISUAL_EFFECTS_FOR_NATURAL_MOBS = "Turn on visual effects for natural or plugin-spawned EliteMobs"; - public static final String DISABLE_VISUAL_EFFECTS_FOR_SPAWNER_MOBS = "Dangerous! Turn off visual effects for non-natural or non-plugin-spawned EliteMobs"; - public static final String ENABLE_WARNING_VISUAL_EFFECTS = "Turn on visual effects that indicate an attack is about to happen"; - public static final String ENABLE_DEATH_MESSAGES = "Enable EliteMobs death messages"; - private static final String DEATH_MESSAGES = "Player death messages cause by."; - public static final String BLAZE_DEATH_MESSAGE = DEATH_MESSAGES + "blazes"; - public static final String CREEPER_DEATH_MESSAGE = DEATH_MESSAGES + "creeper"; - public static final String ENDERMAN_DEATH_MESSAGE = DEATH_MESSAGES + "enderman"; - public static final String ENDERMITE_DEATH_MESSAGE = DEATH_MESSAGES + "endermite"; - public static final String IRONGOLEM_DEATH_MESSAGE = DEATH_MESSAGES + "iron golem"; - public static final String POLARBEAR_DEATH_MESSAGE = DEATH_MESSAGES + "polar bear"; - public static final String SILVERFISH_DEATH_MESSAGE = DEATH_MESSAGES + "silverfish"; - public static final String SKELETON_DEATH_MESSAGE = DEATH_MESSAGES + "skeleton"; - public static final String SPIDER_DEATH_MESSAGE = DEATH_MESSAGES + "spider"; - public static final String WITCH_DEATH_MESSAGE = DEATH_MESSAGES + "witch"; - public static final String ZOMBIE_DEATH_MESSAGE = DEATH_MESSAGES + "zombie"; - public static final String HUSK_DEATH_MESSAGE = DEATH_MESSAGES + "husk"; - public static final String ZOMBIE_PIGMAN_DEATH_MESSAGE = DEATH_MESSAGES + "zombie pigman"; - public static final String STRAY_DEATH_MESSAGE = DEATH_MESSAGES + "stray"; - public static final String WITHER_SKELETON_DEATH_MESSAGE = DEATH_MESSAGES + "wither skeleton"; - public static final String DEFAULT_DEATH_MESSAGE = DEATH_MESSAGES + "default"; - public static final String DISPLAY_HEALTH_ON_HIT = "Display Elite Mob health on hit"; - public static final String DISPLAY_DAMAGE_ON_HIT = "Display damage dealt to Elite Mobs on hit"; - public static final String ONLY_SHOW_HEALTH_FOR_ELITE_MOBS = "Only display health indicator for Elite Mobs"; - public static final String ONLY_SHOW_DAMAGE_FOR_ELITE_MOBS = "Only display damage indicator for Elite Mobs"; - public static final String INCREASE_DIFFICULTY_WITH_SPAWN_DISTANCE = "Increase level of mobs spawned based on distance from world spawn"; - public static final String DISTANCE_TO_INCREMENT = "Distance between increments"; - public static final String LEVEL_TO_INCREMENT = "Amount of levels incremented per distance"; - public static final String ANTI_EXPLOIT_MESSAGE = "Anti exploit message"; - public static final String OBFUSCATE_MOB_POWERS = "Hide mob powers until they are engaged"; +import com.magmaguy.magmacore.config.ConfigurationFile; +import lombok.Getter; - CustomConfigLoader customConfigLoader = new CustomConfigLoader(); - public Configuration configuration = customConfigLoader.getCustomConfig(CONFIG_NAME); +import java.util.Collections; +import java.util.List; - public void initializeConfig() { - - configuration.addDefault(NATURAL_MOB_SPAWNING, true); - configuration.addDefault(SPAWNERS_SPAWN_ELITE_MOBS, false); - configuration.addDefault(AGGRESSIVE_MOB_CONVERSION_PERCENTAGE, 020.00); - configuration.addDefault(AGGRESSIVE_MOB_STACKING, true); - configuration.addDefault(ELITEMOB_STACKING_CAP, 100); - configuration.addDefault(STACK_AGGRESSIVE_SPAWNER_MOBS, true); - configuration.addDefault(STACK_AGGRESSIVE_NATURAL_MOBS, false); - configuration.addDefault(AGGRESSIVE_STACK_RANGE, 1); - configuration.addDefault(PASSIVE_STACK_RANGE, 15); - configuration.addDefault(NATURAL_ELITEMOB_LEVEL_CAP, 2500); - configuration.addDefault(TARGET_HITS_TO_KILL, 10); - configuration.addDefault(BASE_DAMAGE_DEALT_TO_PLAYER, 5); - configuration.addDefault(ELITE_CREEPER_EXPLOSION_MULTIPLIER, 1.0); - configuration.addDefault(ELITE_ARMOR, true); - configuration.addDefault(ELITE_HELMETS, true); - configuration.addDefault(ENABLE_VISUAL_EFFECTS_FOR_NATURAL_MOBS, true); - configuration.addDefault(DISABLE_VISUAL_EFFECTS_FOR_SPAWNER_MOBS, true); - configuration.addDefault(ENABLE_WARNING_VISUAL_EFFECTS, true); - configuration.addDefault(PER_TIER_LEVEL_INCREASE, 10); - configuration.addDefault(ENABLE_DEATH_MESSAGES, true); - configuration.addDefault(BLAZE_DEATH_MESSAGE, "$player was lit ablaze by $entity!"); - configuration.addDefault(CREEPER_DEATH_MESSAGE, "$player was blasted away by $entity!"); - configuration.addDefault(ENDERMAN_DEATH_MESSAGE, "$entity sent $player into the void!"); - configuration.addDefault(ENDERMITE_DEATH_MESSAGE, "$player was glitched to death by $entity!"); - configuration.addDefault(IRONGOLEM_DEATH_MESSAGE, "$player messed with the wrong $entity!"); - configuration.addDefault(POLARBEAR_DEATH_MESSAGE, "$player was clawed to death by $entity!"); - configuration.addDefault(SILVERFISH_DEATH_MESSAGE, "$player mistook $entity for a stone block!"); - configuration.addDefault(SKELETON_DEATH_MESSAGE, "$player became $entity's pin cushion!"); - configuration.addDefault(SPIDER_DEATH_MESSAGE, "$player became entangled in $entity's web!"); - configuration.addDefault(WITCH_DEATH_MESSAGE, "$player became $entity's test subject!"); - configuration.addDefault(ZOMBIE_DEATH_MESSAGE, "$player was devoured by $entity!"); - configuration.addDefault(HUSK_DEATH_MESSAGE, "$player was hollowed out by $entity!"); - configuration.addDefault(ZOMBIE_PIGMAN_DEATH_MESSAGE, "$player was mobbed to death by $entity!"); - configuration.addDefault(STRAY_DEATH_MESSAGE, "$player was led astray by $entity!"); - configuration.addDefault(WITHER_SKELETON_DEATH_MESSAGE, "$entity's arrows withered away $player!"); - configuration.addDefault(DEFAULT_DEATH_MESSAGE, "$player has been slain by $entity"); - configuration.addDefault(DISPLAY_HEALTH_ON_HIT, true); - configuration.addDefault(DISPLAY_DAMAGE_ON_HIT, true); - configuration.addDefault(ONLY_SHOW_HEALTH_FOR_ELITE_MOBS, true); - configuration.addDefault(ONLY_SHOW_DAMAGE_FOR_ELITE_MOBS, true); - configuration.addDefault(INCREASE_DIFFICULTY_WITH_SPAWN_DISTANCE, false); - configuration.addDefault(DISTANCE_TO_INCREMENT, 100); - configuration.addDefault(LEVEL_TO_INCREMENT, 1); - configuration.addDefault(ANTI_EXPLOIT_MESSAGE, "&c[EM AntiExploit] &7Nearby elite won't drop special loot."); - configuration.addDefault(OBFUSCATE_MOB_POWERS, true); - - configuration.options().copyDefaults(true); - UnusedNodeHandler.clearNodes(configuration); - customConfigLoader.saveDefaultCustomConfig(CONFIG_NAME); - customConfigLoader.saveCustomConfig(CONFIG_NAME); +public class MobCombatSettingsConfig extends ConfigurationFile { + @Getter + private static boolean doNaturalMobSpawning; + @Getter + private static boolean doSpawnersSpawnEliteMobs; + @Getter + private static double aggressiveMobConversionPercentage; + @Getter + private static int superMobsStackRange; + @Getter + private static int naturalEliteMobLevelCap; + @Getter + private static boolean doEliteArmor; + @Getter + private static boolean doEliteHelmets; + @Getter + private static boolean enableVisualEffectsForNaturalMobs; + @Getter + private static boolean disableVisualEffectsForSpawnerMobs; + @Getter + private static boolean enableWarningVisualEffects; + @Getter + private static boolean enableDeathMessages; + @Getter + private static boolean displayHealthOnHit; + @Getter + private static boolean displayDamageOnHit; + @Getter + private static boolean increaseDifficultyWithSpawnDistance; + @Getter + private static double distanceToIncrement; + @Getter + private static double levelToIncrement; + @Getter + private static boolean obfuscateMobPowers; + @Getter + private static double damageToEliteMultiplier; + @Getter + private static double damageToPlayerMultiplier; + @Getter + private static boolean showCustomBossLocation; + @Getter + private static String bossLocationMessage; + @Getter + private static List commandsOnDeath; + @Getter + private static String bossKillParticipationMessage; + @Getter + private static boolean regenerateCustomBossHealthOnCombatEnd; + @Getter + private static String defaultOtherWorldBossLocationMessage; + @Getter + private static String weakTextColor; + @Getter + private static String resistTextColor; + @Getter + private static String weakText; + @Getter + private static String resistText; + @Getter + private static boolean doWeakEffect; + @Getter + private static boolean doResistEffect; + @Getter + private static double normalizedBaselineDamage; + @Getter + private static double normalizedBaselineHealth; + @Getter + private static double normalizedDamageToEliteMultiplier; + @Getter + private static double normalizedDamageToPlayerMultiplier; + @Getter + private static boolean normalizeRegionalBosses; + @Getter + private static String fullHealMessage; + @Getter + private static double strengthAndWeaknessDamageMultipliers; + @Getter + private static double resistanceDamageMultiplier; + @Getter + private static double blockingDamageReduction; + public MobCombatSettingsConfig() { + super("MobCombatSettings.yml"); } + @Override + public void initializeValues() { + doNaturalMobSpawning = ConfigurationEngine.setBoolean( + List.of("Sets if naturally spawned elites will spawn. Note: event mobs like the zombie king are not naturally spawned elites! You will have to disable events if you want to disable event bosses."), + fileConfiguration, "doNaturalEliteMobSpawning", true); + doSpawnersSpawnEliteMobs = ConfigurationEngine.setBoolean( + List.of("Sets if spawns spawned from mob spawners can be converted to elites. Not recommended!"), + fileConfiguration, "doSpawnersSpawnEliteMobs", false); + aggressiveMobConversionPercentage = ConfigurationEngine.setDouble( + List.of("Sets the percentage of naturally spawned mobs that get converted to elite mobs."), + fileConfiguration, "eliteMobsSpawnPercentage", 0.05); + superMobsStackRange = Math.max(ConfigurationEngine.setInt( + List.of("Sets the super mob range to scan for super mob stacking"), + fileConfiguration, "superMobStackRange", 15), 2); + naturalEliteMobLevelCap = ConfigurationEngine.setInt( + List.of("Sets the maximum level elites can spawn at.", "Note: elite mob level is based on what armor and weapons players are wearing, and armor only scales up to level 200."), + fileConfiguration, "naturalEliteMobsLevelCap", 250); + doEliteArmor = ConfigurationEngine.setBoolean( + List.of("Sets if elites will wear armor based on their level. This is for visual purposes only and does not affect combat."), + fileConfiguration, "doElitesWearArmor", true); + doEliteHelmets = ConfigurationEngine.setBoolean( + List.of("Sets if elites will wear helmets based on their level. This will prevent them from easily burning away during the daytime."), + fileConfiguration, "doElitesWearHelmets", true); + enableVisualEffectsForNaturalMobs = ConfigurationEngine.setBoolean( + List.of("Sets if elites will have visual trails around them warning players about what players they have."), + fileConfiguration, "doNaturalEliteMobVisualEffects", true); + disableVisualEffectsForSpawnerMobs = ConfigurationEngine.setBoolean( + List.of("Sets if elites spawned from spawners will do visual effects."), + fileConfiguration, "doSpawnerEliteMobVisualEffects", false); + enableWarningVisualEffects = ConfigurationEngine.setBoolean( + List.of("Sets if some powers will do the warning phase of the power. This is very important as warning phases usually mean the power can be dodged, and the visual lets players know where to dodge to."), + fileConfiguration, "doPowerBuildupVisualEffects", true); + enableDeathMessages = ConfigurationEngine.setBoolean( + List.of("Sets if custom death messages will be used when players die from elites."), + fileConfiguration, "doCustomEliteMobsDeathMessages", true); + displayHealthOnHit = ConfigurationEngine.setBoolean( + List.of("Sets if EliteMobs will show health indicators for elites."), + fileConfiguration, "doDisplayMobHealthOnHit", true); + displayDamageOnHit = ConfigurationEngine.setBoolean( + List.of("Sets if EliteMobs will show damage indicators for damage done to elites."), + fileConfiguration, "doDisplayMobDamageOnHit", true); + increaseDifficultyWithSpawnDistance = ConfigurationEngine.setBoolean( + List.of("Sets if the level of elites will increased based on the distance from spawn.", + "This is a value added on top of their normal level, meaning that if a player is wearing level 100 gear near spawn and the boss has +1 level due from the distanced from spawn, the boss will spawn at level 101.", + "This option is generally not recommended, especially if you have a random tp system on your server."), + fileConfiguration, "doIncreaseEliteMobLevelBasedOnSpawnDistance", false); + distanceToIncrement = ConfigurationEngine.setDouble( + List.of("Sets the distance between level increments for distance-based level increases."), + fileConfiguration, "distanceBetweenIncrements", 100); + levelToIncrement = ConfigurationEngine.setDouble( + List.of("Sets how many levels increase at each distance increment for distance-based level increases."), + fileConfiguration, "levelIncreaseAtIncrements", 1); + obfuscateMobPowers = ConfigurationEngine.setBoolean( + List.of("Sets if the powers of elites will be hidden until they enter combat. This is recommended for performance reasons."), + fileConfiguration, "hideEliteMobPowersUntilAggro", true); + damageToEliteMultiplier = ConfigurationEngine.setDouble( + List.of("Sets the multiplier for the damage dealt to all bosses spawned by EliteMobs, except those using the normalized damage system (regional dungeon bosses). Higher values increase the damage dealt, making bosses easier to kill.", "2.0 = 200%, 0.5 = 50%"), + fileConfiguration, "damageToEliteMobMultiplierV2", 1); + damageToPlayerMultiplier = ConfigurationEngine.setDouble( + List.of("Sets the multiplier for the damage dealt to players by elites. Higher values increase the amount of damage dealt by bosses, except those using the normalized damage system (regional dungeon bosses), making bosses hit harder.", "2.0 = 200%, 0.5 = 50%"), + fileConfiguration, "damageToPlayerMultiplierV2", 1); + showCustomBossLocation = ConfigurationEngine.setBoolean( + List.of("Sets if special bosses can be tracked."), + fileConfiguration, "showCustomBossLocation", true); + bossLocationMessage = ConfigurationEngine.setString( + List.of("Sets the message sent to players to track a boss location."), + file, fileConfiguration, "bossLocationMessage", "&7[EM] &2[Click to track!]", true); + //Accepts placeholders $players, $level and $name + commandsOnDeath = ConfigurationEngine.setList( + List.of("Sets the commands that run when an elite dies. Valid placeholders are:", "$level for the level of the boss", "$name for the name of the boss", "$players will make the command run for each player that participated in the kill. As an example, if Bob and Steve killed a boss, 'broadcast $players killed the boss!' will run 'bob killed the boss' and 'steve killed the boss!'"), + file, fileConfiguration, "commandsOnEliteMobDeath", Collections.emptyList(), false); + //Accepts placeholder $playerDamage + bossKillParticipationMessage = ConfigurationEngine.setString( + List.of("Sets teh message sent to players that participate in big boss kills."), + file, fileConfiguration, "bossKillParticipationMessage", "&eYour damage: &2$playerDamage", true); + regenerateCustomBossHealthOnCombatEnd = ConfigurationEngine.setBoolean( + List.of("Sets if bosses regenerate health when they go out of combat. Strongly recommended."), + fileConfiguration, "regenerateCustomBossHealthOnCombatEnd", true); + defaultOtherWorldBossLocationMessage = ConfigurationEngine.setString( + List.of("Sets the message sent to players that are trying to track bosses currently in a different world."), + file, fileConfiguration, "defaultOtherWorldBossLocationMessage", "$name: In different world!", true); + weakTextColor = ConfigurationEngine.setString( + List.of("Sets the prefix added to damage indicators when players hit a boss with something that boss is weak against."), + file, fileConfiguration, "weakTextColor", "&9", false); + resistTextColor = ConfigurationEngine.setString( + List.of("Sets the prefix added to damage indicators when players hit a boss with something that boss is strong against."), + file, fileConfiguration, "resistTextColor", "&c", false); + weakText = ConfigurationEngine.setString( + List.of("Sets the message that appears when players hit the boss with something that boss is weak against."), + file, fileConfiguration, "weakText", "&9&lWeak!", true); + resistText = ConfigurationEngine.setString( + List.of("Sets the message that appears when players hit the boss with something that boss is strong against."), + file, fileConfiguration, "resistText", "&c&lResist!", true); + doWeakEffect = ConfigurationEngine.setBoolean( + List.of("Sets if visuals will be used to show that a boss is weak against an attack."), + fileConfiguration, "doWeakEffect", true); + doResistEffect = ConfigurationEngine.setBoolean( + List.of("Sets if visuals will be used to show that a boss is strong against an attack."), + fileConfiguration, "doResistEffect", true); + normalizedDamageToEliteMultiplier = ConfigurationEngine.setDouble( + List.of("Sets the multiplier for the damage dealt to bosses using the normalized damage system (regional dungeon bosses). Higher values increase the damage dealt, making bosses easier to kill.", "2.0 = 200%, 0.5 = 50%"), + fileConfiguration, "damageToEliteMobMultiplier", 1); + normalizedDamageToPlayerMultiplier = ConfigurationEngine.setDouble( + List.of("Sets the multiplier for the damage dealt to players by bosses using the normalized damage system (regional dungeon bosses). Higher values increase the amount of damage dealt by bosses, making bosses hit harder.", "2.0 = 200%, 0.5 = 50%"), + fileConfiguration, "damageToPlayerMultiplier", 1); + normalizedBaselineDamage = ConfigurationEngine.setDouble( + List.of("Sets the baseline damage for custom bosses using the normalized damage (usually regional bosses)."), + fileConfiguration, "normalizedRegionalBossBaselineDamageV2", 3); + normalizedBaselineHealth = ConfigurationEngine.setDouble( + List.of("Sets the baseline health for custom bosses using the normalized health (usually regional bosses)."), + fileConfiguration, "normalizedRegionalBossBaselineHealthV3", 4); + normalizeRegionalBosses = ConfigurationEngine.setBoolean( + List.of("Sets if regional bosses will used the normalized combat system.", "This is very strongly recommended, and premade content will not be balanced properly if modified."), + fileConfiguration, "normalizeRegionalBosses", true); + fullHealMessage = ConfigurationEngine.setString( + List.of("Sets the message that appears when a boss heals from going out of combat."), + file, fileConfiguration, "fullHealMessage", "&2FULL HEAL!", true); + strengthAndWeaknessDamageMultipliers = ConfigurationEngine.setDouble( + List.of("Sets the multipliers applied to attacks bosses are strong and weak against."), + fileConfiguration, "strengthAndWeaknessDamageMultipliers", 2D); + resistanceDamageMultiplier = ConfigurationEngine.setDouble( + List.of("Sets the multiplier applied to damage reduction from the resistance potion effect for players."), + fileConfiguration, "resistanceDamageMultiplier", 1); + blockingDamageReduction = ConfigurationEngine.setDouble( + List.of("Sets the multiplier applied to damage reduction when a player is holding up a shield for melee attacks (powers excluded)."), + fileConfiguration, "blockingDamageReduction", 0.8); + } } diff --git a/src/main/java/com/magmaguy/elitemobs/config/MobPowersConfig.java b/src/main/java/com/magmaguy/elitemobs/config/MobPowersConfig.java deleted file mode 100644 index 045da3623..000000000 --- a/src/main/java/com/magmaguy/elitemobs/config/MobPowersConfig.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.config; - -import org.bukkit.configuration.Configuration; - -/** - * Created by MagmaGuy on 01/05/2017. - */ -public class MobPowersConfig { - - public static final String CONFIG_NAME = "MobPowers.yml"; - CustomConfigLoader customConfigLoader = new CustomConfigLoader(); - private Configuration configuration = customConfigLoader.getCustomConfig(CONFIG_NAME); - - private static final String POWERS = "Powers."; - private static final String DEFENSIVE_POWERS = POWERS + "Defensive Powers."; - private static final String OFFENSIVE_POWERS = POWERS + "Offensive Powers."; - private static final String MISCELLANEOUS_POWERS = POWERS + "Miscellaneous Powers."; - private static final String MAJOR_POWERS = POWERS + "Major Powers."; - - public static final String ATTACK_ARROW = OFFENSIVE_POWERS + "AttackArrow"; - public static final String ATTACK_BLINDING = OFFENSIVE_POWERS + "AttackBlinding"; - public static final String ATTACK_CONFUSING = OFFENSIVE_POWERS + "AttackConfusing"; - public static final String ATTACK_FIRE = OFFENSIVE_POWERS + "AttackFire"; - public static final String ATTACK_FIREBALL = OFFENSIVE_POWERS + "AttackFireball"; - public static final String ATTACK_FREEZE = OFFENSIVE_POWERS + "AttackFreeze"; - public static final String ATTACK_GRAVITY = OFFENSIVE_POWERS + "AttackGravity"; - public static final String ATTACK_POISON = OFFENSIVE_POWERS + "AttackPoison"; - public static final String ATTACK_PUSH = OFFENSIVE_POWERS + "AttackPush"; - public static final String ATTACK_WEAKNESS = OFFENSIVE_POWERS + "AttackWeakness"; - public static final String ATTACK_WEB = OFFENSIVE_POWERS + "AttackWeb"; - public static final String ATTACK_WITHER = OFFENSIVE_POWERS + "AttackWither"; - - public static final String INVISIBILITY = DEFENSIVE_POWERS + "Invisibility"; - public static final String INVULNERABILITY_ARROW = DEFENSIVE_POWERS + "InvulnerabilityArrow"; - public static final String INVULNERABILITY_FALL_DAMAGE = DEFENSIVE_POWERS + "InvulnerabilityFallDamage"; - public static final String INVULNERABILITY_FIRE = DEFENSIVE_POWERS + "InvulnerabilityFire"; - public static final String INVULNERABILITY_KNOCKBACK = DEFENSIVE_POWERS + "InvulnerabilityKnockback"; - - public static final String BONUS_LOOT = MISCELLANEOUS_POWERS + "BonusLoot"; - public static final String MOVEMENT_SPEED = MISCELLANEOUS_POWERS + "MovementSpeed"; - public static final String TAUNT = MISCELLANEOUS_POWERS + "Taunt"; - - public static final String SKELETON_PILLAR = MAJOR_POWERS + "SkeletonPillar"; - public static final String SKELETON_TRACKING_ARROW = MAJOR_POWERS + "SkeletonTrackingArrow"; - public static final String ZOMBIE_BLOAT = MAJOR_POWERS + "ZombieBloat"; - public static final String ZOMBIE_FRIENDS = MAJOR_POWERS + "ZombieFriends"; - public static final String ZOMBIE_NECRONOMICON = MAJOR_POWERS + "ZombieNecronomicon"; - public static final String ZOMBIE_PARENTS = MAJOR_POWERS + "ZombieParents"; - public static final String ZOMBIE_TEAM_ROCKET = MAJOR_POWERS + "ZombieTeamRocket"; - - public static final String FROZEN_MESSAGE = "Freeze power message"; - - public void initializeConfig() { - - configuration.addDefault(ATTACK_ARROW, true); - configuration.addDefault(ATTACK_BLINDING, true); - configuration.addDefault(ATTACK_CONFUSING, true); - configuration.addDefault(ATTACK_FIRE, true); - configuration.addDefault(ATTACK_FIREBALL, true); - configuration.addDefault(ATTACK_FREEZE, true); - configuration.addDefault(ATTACK_GRAVITY, true); - configuration.addDefault(ATTACK_POISON, true); - configuration.addDefault(ATTACK_PUSH, true); - configuration.addDefault(ATTACK_WEAKNESS, true); - configuration.addDefault(ATTACK_WEB, true); - configuration.addDefault(ATTACK_WITHER, true); - - configuration.addDefault(INVISIBILITY, true); - configuration.addDefault(INVULNERABILITY_ARROW, true); - configuration.addDefault(INVULNERABILITY_FALL_DAMAGE, true); - configuration.addDefault(INVULNERABILITY_FIRE, true); - configuration.addDefault(INVULNERABILITY_KNOCKBACK, true); - - configuration.addDefault(BONUS_LOOT, true); - configuration.addDefault(MOVEMENT_SPEED, true); - configuration.addDefault(TAUNT, true); - configuration.addDefault(SKELETON_PILLAR, true); - configuration.addDefault(SKELETON_TRACKING_ARROW, true); - configuration.addDefault(ZOMBIE_BLOAT, true); - configuration.addDefault(ZOMBIE_FRIENDS, true); - configuration.addDefault(ZOMBIE_NECRONOMICON, true); - configuration.addDefault(ZOMBIE_PARENTS, true); - configuration.addDefault(ZOMBIE_TEAM_ROCKET, true); - - configuration.addDefault(FROZEN_MESSAGE, "&9You've been frozen!"); - - customConfigLoader.getCustomConfig(CONFIG_NAME).options().copyDefaults(true); - UnusedNodeHandler.clearNodes(configuration); - customConfigLoader.saveDefaultCustomConfig(CONFIG_NAME); - customConfigLoader.saveCustomConfig(CONFIG_NAME); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/config/ModelsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/ModelsConfig.java new file mode 100644 index 000000000..0114dfdaf --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/ModelsConfig.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config; + +import com.magmaguy.magmacore.config.ConfigurationFile; + +import java.util.List; + +public class ModelsConfig extends ConfigurationFile { + public static String treasureChest; + + public ModelsConfig() { + super("Models.yml"); + } + + @Override + public void initializeValues() { + treasureChest = ConfigurationEngine.setString( + List.of("Name of the custom model for the treasure chest"), + file, fileConfiguration, "treasureChest", "elitemobs_treasure_chest", false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/PlayerCacheData.java b/src/main/java/com/magmaguy/elitemobs/config/PlayerCacheData.java deleted file mode 100644 index b2d107ad6..000000000 --- a/src/main/java/com/magmaguy/elitemobs/config/PlayerCacheData.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.config; - -import org.bukkit.configuration.Configuration; - -/** - * Created by MagmaGuy on 02/07/2017. - */ -public class PlayerCacheData { - - public static final String CONFIG_NAME = "playerCache.yml"; - public CustomConfigLoader customConfigLoader = new CustomConfigLoader(); - public Configuration configuration = customConfigLoader.getCustomConfig(CONFIG_NAME, true); - - public void initializeConfig() { - - //no real defaults, just a data file - customConfigLoader.getCustomConfig(CONFIG_NAME, true).options().copyDefaults(true); - customConfigLoader.saveDefaultCustomConfig(CONFIG_NAME, true); - customConfigLoader.saveCustomConfig(CONFIG_NAME, true); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/config/PlayerGuildRank.java b/src/main/java/com/magmaguy/elitemobs/config/PlayerGuildRank.java deleted file mode 100644 index e5c9ebe9c..000000000 --- a/src/main/java/com/magmaguy/elitemobs/config/PlayerGuildRank.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.magmaguy.elitemobs.config; - -import org.bukkit.configuration.Configuration; - -public class PlayerGuildRank { - - public static final String CONFIG_NAME = "playerGuildRank.yml"; - public CustomConfigLoader customConfigLoader = new CustomConfigLoader(); - public Configuration configuration = customConfigLoader.getCustomConfig(CONFIG_NAME, true); - - public void intializeConfig() { - - //no real defaults, just a data file - customConfigLoader.getCustomConfig(CONFIG_NAME, true).options().copyDefaults(true); - customConfigLoader.saveDefaultCustomConfig(CONFIG_NAME, true); - customConfigLoader.saveCustomConfig(CONFIG_NAME, true); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/config/PlayerMaxGuildRank.java b/src/main/java/com/magmaguy/elitemobs/config/PlayerMaxGuildRank.java deleted file mode 100644 index a8aa2cbfe..000000000 --- a/src/main/java/com/magmaguy/elitemobs/config/PlayerMaxGuildRank.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.magmaguy.elitemobs.config; - -import org.bukkit.configuration.Configuration; - -public class PlayerMaxGuildRank { - - public static final String CONFIG_NAME = "playerMaxGuildRank.yml"; - public CustomConfigLoader customConfigLoader = new CustomConfigLoader(); - public Configuration configuration = customConfigLoader.getCustomConfig(CONFIG_NAME, true); - - public void intializeConfig() { - - //no real defaults, just a data file - customConfigLoader.getCustomConfig(CONFIG_NAME, true).options().copyDefaults(true); - customConfigLoader.saveDefaultCustomConfig(CONFIG_NAME, true); - customConfigLoader.saveCustomConfig(CONFIG_NAME, true); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/config/PlayerMoneyData.java b/src/main/java/com/magmaguy/elitemobs/config/PlayerMoneyData.java deleted file mode 100644 index 3d29906d4..000000000 --- a/src/main/java/com/magmaguy/elitemobs/config/PlayerMoneyData.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.config; - -import org.bukkit.configuration.Configuration; - -/** - * Created by MagmaGuy on 17/06/2017. - */ -public class PlayerMoneyData { - - public static final String CONFIG_NAME = "playerMoneyData.yml"; - public CustomConfigLoader customConfigLoader = new CustomConfigLoader(); - public Configuration configuration = customConfigLoader.getCustomConfig(CONFIG_NAME, true); - - public void intializeConfig() { - - //no real defaults, just a data file - customConfigLoader.getCustomConfig(CONFIG_NAME, true).options().copyDefaults(true); - customConfigLoader.saveDefaultCustomConfig(CONFIG_NAME, true); - customConfigLoader.saveCustomConfig(CONFIG_NAME, true); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/config/ProceduralItemGenerationSettingsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/ProceduralItemGenerationSettingsConfig.java new file mode 100644 index 000000000..c49ca5e92 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/ProceduralItemGenerationSettingsConfig.java @@ -0,0 +1,1465 @@ +package com.magmaguy.elitemobs.config; + +import com.magmaguy.elitemobs.items.itemconstructor.MaterialGenerator; +import com.magmaguy.magmacore.config.ConfigurationFile; +import lombok.Getter; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class ProceduralItemGenerationSettingsConfig extends ConfigurationFile { + @Getter + private static final List validMaterials = new ArrayList<>(); + @Getter + private + static boolean doProceduralItemDrops; + @Getter + private static double customEnchantmentChance; + @Getter + private static String swordName; + @Getter + private static String bowName; + @Getter + private static String pickaxeName; + @Getter + private static String spadeName; + @Getter + private static String hoeName; + @Getter + private static String axeName; + @Getter + private static String helmetName; + @Getter + private static String chestplateName; + @Getter + private static String leggingsName; + @Getter + private static String bootsName; + @Getter + private static String shearsName; + @Getter + private static String fishingRodName; + @Getter + private static String shieldName; + @Getter + private static String tridentName; + @Getter + private static String crossbowName; + @Getter + private static List nameFormat; + @Getter + private static List nouns; + @Getter + private static List adjectives; + @Getter + private static List verbs; + @Getter + private static List verbers; + @Getter + private static ProceduralItemGenerationSettingsConfig instance; + + public ProceduralItemGenerationSettingsConfig() { + super("ProceduralItemGenerationSettings.yml"); + } + + private void addMaterial(Material material) { + ConfigurationEngine.setBoolean(fileConfiguration, "validMaterials." + material.name(), true); + } + + public void cacheMaterials() { + validMaterials.clear(); + for (String material : fileConfiguration.getConfigurationSection("validMaterials").getKeys(false)) + if (fileConfiguration.getConfigurationSection("validMaterials").getBoolean(material)) + validMaterials.add(material); + } + + + @Override + public void initializeValues() { + instance = this; + + doProceduralItemDrops = ConfigurationEngine.setBoolean(fileConfiguration, "dropProcedurallyGeneratedItems", true); + customEnchantmentChance = ConfigurationEngine.setDouble(fileConfiguration, "customEnchantmentsChance", 0.5); + + addMaterial(Material.DIAMOND_HELMET); + addMaterial(Material.DIAMOND_CHESTPLATE); + addMaterial(Material.DIAMOND_LEGGINGS); + addMaterial(Material.DIAMOND_BOOTS); + + addMaterial(Material.DIAMOND_SWORD); + addMaterial(Material.DIAMOND_AXE); + + + addMaterial(Material.IRON_HELMET); + addMaterial(Material.IRON_CHESTPLATE); + addMaterial(Material.IRON_LEGGINGS); + addMaterial(Material.IRON_BOOTS); + + addMaterial(Material.IRON_SWORD); + addMaterial(Material.IRON_AXE); + + + addMaterial(Material.GOLDEN_HELMET); + addMaterial(Material.GOLDEN_CHESTPLATE); + addMaterial(Material.GOLDEN_LEGGINGS); + addMaterial(Material.GOLDEN_BOOTS); + + addMaterial(Material.GOLDEN_SWORD); + addMaterial(Material.GOLDEN_AXE); + + + addMaterial(Material.CHAINMAIL_HELMET); + addMaterial(Material.CHAINMAIL_CHESTPLATE); + addMaterial(Material.CHAINMAIL_LEGGINGS); + addMaterial(Material.CHAINMAIL_BOOTS); + + + addMaterial(Material.LEATHER_HELMET); + addMaterial(Material.LEATHER_CHESTPLATE); + addMaterial(Material.LEATHER_LEGGINGS); + addMaterial(Material.LEATHER_BOOTS); + + + addMaterial(Material.STONE_SWORD); + addMaterial(Material.STONE_AXE); + + + addMaterial(Material.WOODEN_SWORD); + addMaterial(Material.WOODEN_AXE); + + + addMaterial(Material.SHIELD); + addMaterial(Material.TURTLE_HELMET); + addMaterial(Material.TRIDENT); + addMaterial(Material.BOW); + addMaterial(Material.CROSSBOW); + + cacheMaterials(); + + swordName = ConfigurationEngine.setString(file, fileConfiguration, "materialNames.swordName", "Sword", true); + bowName = ConfigurationEngine.setString(file, fileConfiguration, "materialNames.bowName", "Bow", true); + pickaxeName = ConfigurationEngine.setString(file, fileConfiguration, "materialNames.pickaxe", "Pickaxe", true); + spadeName = ConfigurationEngine.setString(file, fileConfiguration, "materialNames.spade", "Spade", true); + hoeName = ConfigurationEngine.setString(file, fileConfiguration, "materialNames.hoe", "Hoe", true); + axeName = ConfigurationEngine.setString(file, fileConfiguration, "materialNames.axe", "Axe", true); + helmetName = ConfigurationEngine.setString(file, fileConfiguration, "materialNames.helmet", "Helmet", true); + chestplateName = ConfigurationEngine.setString(file, fileConfiguration, "materialNames.chestplate", "Chestplate", true); + leggingsName = ConfigurationEngine.setString(file, fileConfiguration, "materialNames.leggings", "Leggings", true); + bootsName = ConfigurationEngine.setString(file, fileConfiguration, "materialNames.boots", "Boots", true); + shearsName = ConfigurationEngine.setString(file, fileConfiguration, "materialNames.shears", "Shears", true); + fishingRodName = ConfigurationEngine.setString(file, fileConfiguration, "materialNames.fishingRod", "Fishing Rod", true); + shieldName = ConfigurationEngine.setString(file, fileConfiguration, "materialNames.shield", "Shield", true); + tridentName = ConfigurationEngine.setString(file, fileConfiguration, "materialNames.trident", "Trident", true); + crossbowName = ConfigurationEngine.setString(file, fileConfiguration, "materialNames.crossbow", "Crossbow", true); + + nameFormat = ConfigurationEngine.setList(file, fileConfiguration, "nameFormats", new ArrayList<>(List.of( + "$verb $itemType of the $adjective $noun", + "$itemType of the $adjective $noun", + "$noun's $adjective $verb $itemType", + "$verb $itemType", + "$adjective $verb $itemType", + "The $verb-er", + "The $adjective $verb-er" + )), true); + + nouns = ConfigurationEngine.setList(file, fileConfiguration, "nouns", new ArrayList<>(List.of( + "MagmaGuy", + "Dawn", + "Sunset", + "Heaven", + "Hell", + "Angel", + "Archangel", + "Cherub", + "Seraph", + "Demon", + "Fiend", + "Bat", + "Chicken", + "Cow", + "Mooshroom", + "Pig", + "Rabbit", + "Sheep", + "Squid", + "Villager", + "Cave Spider", + "Enderman", + "Polar Bear", + "Spider", + "Zombie Pigman", + "Blaze", + "Creeper", + "Elder Guardian", + "Endermite", + "Evoker", + "Ghast", + "Guardian", + "Husk", + "Magma Cube", + "Shulker", + "Silverfish", + "Skeleton", + "Slime", + "Stray", + "Vex", + "Vindicator", + "Witch", + "Wither Skeleton", + "Zombie", + "Donkey", + "Horse", + "Llama", + "Mule", + "Ocelot", + "Wolf", + "Iron Golem", + "Snow Golem", + "Ender Dragon", + "Wither", + "Illusioner", + "Parrot", + "Giant", + "Killer Bunny", + "Steve", + "Wolfbane", + "Chaos", + "Aeon", + "Dragon", + "Sphynx", + "Minotaur", + "Hades", + "Oath", + "Oathbreaker", + "Deserter", + "Betrayer", + "Jade", + "Light", + "Darkness", + "Oblivion", + "Shadow", + "Void", + "Xeno", + "Zealot", + "Zenith", + "Dusk", + "Twilight", + "Mob", + "Elite Mob", + "Urist", + "Dwarf", + "Elf", + "Ork", + "Goblin", + "Gnome", + "Goliath", + "Drow", + "Human", + "Halfling", + "Half-Orc", + "Beholder", + "Mind Flayer", + "Owlbear", + "Bulette", + "Rust Monster", + "Hill Giant", + "Stone Giant", + "Frost Giant", + "Fire Giant", + "Cloud Giant", + "Storm Giant", + "Kobold", + "Lich", + "Ork", + "Umber Hulk", + "Fighter", + "Wizard", + "Paladin", + "Cleric", + "Ranger", + "Archer", + "Mage", + "Tiefling", + "Werewolf", + "Vampire", + "Centaur", + "Catfolk", + "Half-Giant", + "Ogre", + "Troll", + "Rogue", + "Barbarian", + "Bard", + "Druid", + "Monk", + "Sorcerer", + "Warlock", + "Demon Hunter", + "Death Knight", + "Priest", + "Shaman", + "Warrior", + "Basilisk", + "Chimera", + "Imp", + "Dryad", + "Gargoyle", + "Djinni", + "Efreeti", + "Ghost", + "Hobgoblin", + "Hydra", + "Kraken", + "Lamia", + "Medusa", + "Mimic", + "Mummy", + "Pegasus", + "Roc", + "Satyr", + "Tarrasque", + "Abomination", + "Ghoul", + "Treant", + "Unicorn", + "Wraith", + "Acolyte", + "Gladiator", + "Knight", + "Gryphon", + "Raider", + "Scout", + "Spy", + "Thg", + "Noble", + "Guard", + "Veteran", + "Wyvern", + "Abyssal", + "Infernal", + "Elemental", + "Tauren", + "Pandaren", + "Sasquatch", + "Forsaken", + "Yeti", + "Banshee", + "Arachnid", + "Undead", + "Night Elf", + "Blood Elf", + "Draenei", + "Worgen", + "Warlord", + "Witch", + "Magi", + "Sage", + "Thief", + "Assassin", + "Templar", + "Beastmaster", + "Berserker", + "Inventor", + "Luchador", + "Pirate", + "Vanguard", + "Voidblade", + "Wisp", + "Peasant", + "Footman", + "Swordsman", + "Thrall", + "Felhound", + "Huntress", + "Hunter", + "Aarakorcra", + "Aboleth", + "Deva", + "Planetar", + "Solar", + "Ankheg", + "Azer", + "Behir", + "Death Tyrant", + "Blight", + "Bugbear", + "Hugbear", + "Bullywug", + "Cambion", + "Chuul", + "Lich King", + "Cockatrice", + "Couatl", + "Cyclops", + "Titan", + "Darkmantle", + "Ancient One", + "Demilich", + "Balor", + "Barlgura", + "Chasme", + "Dretch", + "Glabrezu", + "Goristro", + "Hezrou", + "Manes", + "Marilith", + "Nalfeshnee", + "Quasit", + "Vrock", + "Yochlol", + "Pit Fiend", + "Lemure", + "Dracolich", + "Doppleganger", + "Chromatic Dragon", + "Drider", + "Air Elemental", + "Earth Elemental", + "Fire Elemental", + "Water Elemental", + "Rohirrim", + "Gondorian", + "Empyrean", + "Faerie Dragon", + "Ettin", + "Flumph", + "Fomorian", + "Dao", + "Gnoll", + "Parshendi", + "Listener", + "Spren", + "Stormfather", + "Rosharian", + "Brightlord", + "Highprince", + "King", + "Emperor", + "Shardbearer", + "Surgebinder", + "Bondsmith", + "Golem", + "Gorgon", + "Hag", + "Harpy", + "Hippogriff", + "Homunculus", + "State Alchemist", + "Undying Soldier", + "Jackalwere", + "Nothic", + "Oni", + "Rakshasa", + "Revenant", + "Cultist" + )), true); + + adjectives = ConfigurationEngine.setList(file, fileConfiguration, "adjectives", new ArrayList<>(List.of( + "Adorable", + "Beautiful", + "Clean", + "Elegant", + "Fancy", + "Glamorous", + "Handsome", + "Long", + "Magnificent", + "Plain", + "Quaint", + "Sparkling", + "Ugliest", + "Red", + "Orange", + "Yellow", + "Green", + "Blue", + "Purple", + "Gray", + "Black", + "White", + "Dead", + "Odd", + "Powerful", + "Rich", + "Vast", + "Zealous", + "Deafening", + "Faint", + "Melodic", + "Quiet", + "Thundering", + "Whispering", + "Hissing", + "Ancient", + "Fast", + "Old", + "Rapid", + "Slow", + "Rotten", + "Creepy", + "Crooked", + "Empty", + "Heavy", + "Abhorrent", + "Abnormal", + "Absurd", + "Acceptable", + "Accidental", + "Adamant", + "Adventurous", + "Agonizing", + "Alert", + "Annoyed", + "Annoying", + "Anxious", + "Aromatic", + "Aggressive", + "Aloof", + "Amazing", + "Ambiguous", + "Ambitious", + "Amused", + "Angry", + "Arrogant", + "Ashamed", + "Aspiring", + "Astonishing", + "Auspicious", + "Average", + "Awesome", + "Awful", + "Bad", + "Barbarous", + "Bashful", + "Beffiting", + "Belligerent", + "Beneficial", + "Berserk", + "Best", + "Bewildered", + "Big", + "Bitter", + "Bizarre", + "Bloody", + "Boiling", + "Boundless", + "Brash", + "Brave", + "Brawny", + "Breakable", + "Brief", + "Bright", + "Broken", + "Busy", + "Calculating", + "Callous", + "Calm", + "Capricious", + "Careful", + "Careless", + "Caring", + "Cautious", + "Ceaseless", + "Certain", + "Charming", + "Cheap", + "Chief", + "Chilly", + "Chivalrous", + "Chunky", + "Clear", + "Clever", + "Cloistered", + "Clumsy", + "Cloudy", + "Classy", + "Colossal", + "Combative", + "Common", + "Confused", + "Condemned", + "Cool", + "Courageous", + "Cowardly", + "Crazy", + "Craven", + "Cruel", + "Cuddly", + "Curious", + "Cute", + "Damaged", + "Damaging", + "Dangerous", + "Dark", + "Dashing", + "Decisive", + "Deep", + "Defeated", + "Defective", + "Defiant", + "Delicate", + "Delicious", + "Delightful", + "Demonic", + "Delirious", + "Deranged", + "Descriptive", + "Devilish", + "Difficult", + "Diligent", + "Direful", + "Dirty", + "Disastrous", + "Disgusted", + "Disgusting", + "Disillusioned", + "Distinct", + "Disturbed", + "Draconian", + "Dramatic", + "Dreary", + "Dysfunctional", + "Eager", + "Elderly", + "Electric", + "Elite", + "Enchanted", + "Enchanting", + "Energetic", + "Enormous", + "Entertaining", + "Enthusiastic", + "Envious", + "Erratic", + "Ethereal", + "Evasive", + "Excellent", + "Excited", + "Exciting", + "Exotic", + "Exuberant", + "Fabulous", + "Faded", + "Fair", + "Faithful", + "False", + "Familiar", + "Famous", + "Fanatical", + "Fantastic", + "Fascinated", + "Fat", + "Fearful", + "Fearless", + "Feeble", + "Festive", + "Fierce", + "Filthy", + "Fine", + "Finicky", + "First", + "Fixed", + "Flashy", + "Flawless", + "Flimsy", + "Flippant", + "Flowery", + "Fluffy", + "Fluttering", + "Foamy", + "Foolish", + "Forgetful", + "Fortunate", + "Frail", + "Fragile", + "Frantic", + "Free", + "Freezing", + "Fresh", + "Friendly", + "Frightening", + "Fumbling", + "Funny", + "Furry", + "Furtive", + "Fuzzy", + "Giant", + "Gifted", + "Gigantic", + "Glistening", + "Glorious", + "Godly", + "Good", + "Goofy", + "Gorgeous", + "Graceful", + "Grandiose", + "Grateful", + "Greasy", + "Great", + "Greedy", + "Grieving", + "Groovy", + "Grotesque", + "Grubby", + "Gruesome", + "Grumpy", + "Guarded", + "Guiltless", + "Gullible", + "Gutsy", + "Guttural", + "Hallowed", + "Hanging", + "Hapless", + "Happy", + "Harmonious", + "Hateful", + "Healthy", + "Heartbreaking", + "Heavenly", + "Hellish", + "Helpful", + "Helpless", + "Hesitant", + "Hideous", + "Hilarious", + "Hollow", + "Homeless", + "Honorable", + "Horrible", + "Hospitable", + "Huge", + "Hulking", + "Humorous", + "Hungry", + "Hurt", + "Hushed", + "Hypnotic", + "Hysterical", + "Icky", + "Icy", + "Ignorant", + "Ill", + "Illegal", + "Illustrious", + "Imaginary", + "Immense", + "Imminent", + "Impartial", + "Imperfect", + "Impolite", + "Important", + "Incandescent", + "Incompetent", + "Industrious", + "Incredible", + "Inexpensive", + "Infamous", + "Innocent", + "Inquisitive", + "Insidious", + "Instinctive", + "Intelligent", + "Interesting", + "Invincible", + "Irate", + "Itchy", + "Jaded", + "Jagged", + "Jealous", + "Jolly", + "Joyous", + "Jumpy", + "Juvenile", + "Keen", + "Kind", + "Kindhearted", + "Knowing", + "Knowledgeable", + "Known", + "Labored", + "Lame", + "Large", + "Last", + "Late", + "Laughable", + "Lazy", + "Lean", + "Lethal", + "Light", + "Little", + "Living", + "Lonely", + "Loud", + "Lovely", + "Lucky", + "Magenta", + "Magical", + "Majestic", + "Malicious", + "Marked", + "Massive", + "Marvelous", + "Mean", + "Medical", + "Melted", + "Messy", + "Mighty", + "Military", + "Mindless", + "Minor", + "Misty", + "Mixed", + "Modern", + "Motionless", + "Mysterious", + "Naive", + "Narrow", + "Natural", + "Neat", + "Necessary", + "Needless", + "Needy", + "Nervous", + "New", + "Nice", + "Normal", + "Nostalgic", + "Numberless", + "Obsolete", + "Obtainable", + "Oceanic", + "Old-fashioned", + "Omniscient", + "Optimal", + "Ordinary", + "Organic", + "Outstanding", + "Oval", + "Overrated", + "Painful", + "Parallel", + "Pathetic", + "Peaceful", + "Penitent", + "Perfect", + "Periodic", + "Petite", + "Physical", + "Pink", + "Plastic", + "Pleasant", + "Pointless", + "Polite", + "Poor", + "Precious", + "Premium", + "Present", + "Pretty", + "Private", + "Productive", + "Protective", + "Public", + "Puzzling", + "Questionable", + "Quick", + "Quickest", + "Rare", + "Ready", + "Real", + "Rebel", + "Regular", + "Remarkable", + "Responsible", + "Romantic", + "Round", + "Royal", + "Sad", + "Safe", + "Salty", + "Satisfying", + "Scared", + "Scary", + "Scientific", + "Scrawny", + "Screeching", + "Second", + "Second-hand", + "Secret", + "Selfish", + "Sequacious", + "Serious", + "Shallow", + "Sharp", + "Shiny", + "Shocking", + "Short", + "Shy", + "Sick", + "Silent", + "Silky", + "Silly", + "Simple", + "Skinny", + "Slim", + "Slimy", + "Slippery", + "Small", + "Smart", + "Smiling", + "Smooth", + "Sneaky", + "Soft", + "Solid", + "Special", + "Spectacular", + "Spicy", + "Spiky", + "Splendid", + "Spooky", + "Spotless", + "Square", + "Staking", + "Standing", + "Steady", + "Sticky", + "Strange", + "Striped", + "Strong", + "Successful", + "Super", + "Supreme", + "Sweet", + "Talented", + "Tall", + "Tasty", + "Temporary", + "Tense", + "Terrible", + "Terrific", + "Tested", + "Thankful", + "Thick", + "Thin", + "Thirsty", + "Thoughtful", + "Tiny", + "Tired", + "Tricky", + "Troubled", + "True", + "Ugly", + "Ultra", + "Unadvised", + "Unarmed", + "Uncovered", + "Unhealthy", + "Unique", + "Unknown", + "Unnatural", + "Unused", + "Unusual", + "Used", + "Useful", + "Useless", + "Valuable", + "Violent", + "Waiting", + "Wandering", + "Warm", + "Weak", + "Wealthy", + "Whole", + "Wise", + "Wonderful", + "Wooden", + "Worried", + "Worthless", + "Wrong", + "Menacing", + "Trusting", + "Unassuming", + "Threatening" + )), true); + + verbs = ConfigurationEngine.setList(file, fileConfiguration, "verbs", new ArrayList<>(List.of( + "Slashing", + "Cutting", + "Stabbing", + "Scratching", + "Killing", + "Slaying", + "Butchering", + "Destroying", + "Tickling", + "Hugging", + "Murdering", + "Slapping", + "Hissing", + "Traveling", + "Teleporting", + "Blinking", + "Destroying", + "Wrecking", + "Flashing", + "Materializing", + "Spawning", + "Questioning", + "Inquiring", + "Pleading", + "Demanding", + "Interrogating", + "Querying", + "Assaulting", + "Striking", + "Ambushing", + "Assailing", + "Rushing", + "Storming", + "Bombarding", + "Barraging", + "Smiting", + "Charging", + "Clobbering", + "Battling", + "Battering", + "Hammering", + "Beating", + "Combating", + "Overwhelming", + "Raiding", + "Tackling", + "Shooting", + "Venturing", + "Cracking", + "Rupturing", + "Smashing", + "Shattering", + "Fracturing", + "Splintering", + "Pulverizing", + "Tearing", + "Rending", + "Snapping", + "Bursting", + "Exploding", + "Damaging", + "Fragmenting", + "Splitting", + "Fortifying", + "Nudging", + "Tapping", + "Jostling", + "Thumping", + "Butting", + "Clattering", + "Striking", + "Whacking", + "Slamming", + "Summoning", + "Screaming", + "Bellowing", + "Roaring", + "Shifting", + "Transforming", + "Modifying", + "Twisting", + "Mutating", + "Distorting", + "Blurring", + "Adjusting", + "Warping", + "Altering", + "Adapting", + "Evolving", + "Varying", + "Hunting", + "Trailing", + "Following", + "Stalking", + "Shadowing", + "Hounding", + "Casing", + "Mounting", + "Ascending", + "Rising", + "Heaving", + "Springing", + "Cresting", + "Gathering", + "Corralling", + "Hoarding", + "Reaping", + "Harvesting", + "Saving", + "Sheltering", + "Cloaking", + "Shrouding", + "Enclosing", + "Concealing", + "Hiding", + "Disguising", + "Masking", + "Burying", + "Smothering", + "Clouding", + "Shielding", + "Shading", + "Sealing", + "Enveloping", + "Veiling", + "Obscuring", + "Traversing", + "Fording", + "Gliding", + "Howling", + "Whimpering", + "Screaming", + "Shrieking", + "Squealing", + "Roaring", + "Wailing", + "Bawling", + "Screeching", + "Cleaving", + "Chopping", + "Chipping", + "Severing", + "Slicing", + "Snipping", + "Splitting", + "Axing", + "Slashing", + "Rending", + "Tearing", + "Thinning", + "Cropping", + "Carving", + "Dissecting", + "Hacking", + "Piercing", + "Sawing", + "Shaving", + "Shearing", + "Mining", + "Delving", + "Excavating", + "Burrowing", + "Drilling", + "Hollowing", + "Gouging", + "Tunneling", + "Invading", + "Boarding", + "Wandering", + "Infiltrating", + "Intruding", + "Evading", + "Fleeing", + "Running", + "Dodging", + "Crashing", + "Battling", + "Tussling", + "Wrestling", + "Scuffling", + "Dueling", + "Brawling", + "Jousting", + "Sparring", + "Clashing", + "Warring", + "Grappling", + "Scrapping", + "Attacking", + "Feuding", + "Skirmishing", + "Discovering", + "Detecting", + "Catching", + "Solving", + "Revealing", + "Unearthing", + "Leaping", + "Bouncing", + "Springing", + "Vaulting", + "Hopping", + "Surging", + "Punting", + "Booting", + "Dropkicking", + "Sensing", + "Perceiving", + "Detecting", + "Fading", + "Bleeding", + "Shrinking", + "Weakening", + "Abating", + "Diminishing", + "Forging", + "Releasing", + "Gathering", + "Collecting", + "Culling", + "Crushing", + "Propelling", + "Jogging", + "Sprinting", + "Questing", + "Scouting", + "Exploring", + "Digging", + "Trembling", + "Rattling", + "Parting", + "Hacking", + "Rupturing", + "Carving", + "Dividing", + "Halving", + "Breaking", + "Sundering", + "Separating", + "Rending", + "Ripping", + "Grazing", + "Imprisoning", + "Snaring", + "Cornering", + "Entangling", + "Pinning", + "Catching", + "Restraining", + "Binding", + "Hooking", + "Snagging", + "Snatching", + "Caging", + "Capturing", + "Haunting", + "Creeping", + "Sneaking", + "Spying", + "Avenging", + "Storming" + )), true); + + verbers = ConfigurationEngine.setList(file, fileConfiguration, "verb-ers (noun)", new ArrayList<>(List.of( + "World Breaker", + "World Shatterer", + "Avenger", + "Ashbringer", + "Windseeker", + "Defiler", + "Thunderfury", + "Slicer", + "Slasher", + "Cutter", + "Stabber", + "Scratcher", + "Killer", + "Slayer", + "Destroyer", + "Hugger", + "Murderer", + "Slapper", + "Traveller", + "Teleporter", + "Blinker", + "Wrecker", + "Materializer", + "Spawner", + "Demander", + "Assaulter", + "Striker", + "Ambusher", + "Rusher", + "Stormer", + "Bombarder", + "Barrager", + "Smiter", + "Charger", + "Battler", + "Hammerer", + "Beater", + "Combater", + "Overwhelmer", + "Raider", + "Tackler", + "Shooter", + "Venturer", + "Cracker", + "Smasher", + "Shatterer", + "Fracturer", + "Splinterer", + "Pulverizer", + "Tearer", + "Renderer", + "Snapper", + "Burster", + "Exploder", + "Damager", + "Fragmenter", + "Splitter", + "Fortifier", + "Nudger", + "Tapper", + "Thumper", + "Butter", + "Clatterer", + "Striker", + "Whacker", + "Slammer", + "Summoner", + "Screamer", + "Shifter", + "Transformer", + "Modifyer", + "Twister", + "Blurrer", + "Warper", + "Alterer", + "Adapter", + "Evolver", + "HunterEnchantment", + "Trailer", + "Follower", + "Stalker", + "Shadower", + "Hounder", + "Caser", + "Mounter", + "Ascender", + "Riser", + "Springer", + "Hoarder", + "Reaper", + "Harvester", + "Saver", + "Shelterer", + "Cloaker", + "Shrouder", + "Encloser", + "Hider", + "Masker", + "Buryer", + "Clouder", + "Shader", + "Sealer", + "Enveloper", + "Veiler", + "Traverser", + "Forder", + "Glider", + "Howler", + "Whimperer", + "Screamer", + "Squealer", + "Bawler", + "Screecher", + "Chopper", + "Chipper", + "Snipper", + "Splitter", + "Axer", + "Slasher", + "Renderer", + "Tearer", + "Thinner", + "Cropper", + "Carver", + "Hacker", + "Piercer", + "Sawer", + "Shaver", + "Shearer", + "Miner", + "Excavater", + "Burrower", + "Driller", + "Tunneler", + "Invader", + "Boarder", + "Wanderer", + "Intruder", + "Evader", + "Runner", + "Dodger", + "Crasher", + "Battler", + "Wrestler", + "Scuffler", + "Dueler", + "Brawler", + "Clasher", + "Grappler", + "Scrapper", + "Attacker", + "Feuder", + "Catcher", + "Solver", + "Revealer", + "Leaper", + "Bouncer", + "Vaulter", + "Hopper", + "Surger", + "Punter", + "Dropkicker", + "Perceiver", + "Fader", + "Bleeder", + "Weakener", + "Forger", + "Releaser", + "Gatherer", + "Crusher", + "Propeller", + "Jogger", + "Sprinter", + "Scouter", + "Explorer", + "Digger", + "Trembler", + "Parter", + "Hacker", + "Carver", + "Divider", + "Halver", + "Breaker", + "Renderer", + "Ripper", + "Grazer", + "Imprisoner", + "Cornerer", + "Pinner", + "Catcher", + "Restrainer", + "Binder", + "Snagger", + "Snatcher", + "Cager", + "Capturer", + "Haunter", + "Creeper", + "Sneaker", + "Binder", + "Jailer", + "Seducer", + "Dancer", + "Blasphemer", + "Eater", + "Snorer", + "Thruster", + "Slapper" + )), true); + + MaterialGenerator.initializeValidProceduralMaterials(); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/QuestsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/QuestsConfig.java new file mode 100644 index 000000000..863584853 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/QuestsConfig.java @@ -0,0 +1,336 @@ +package com.magmaguy.elitemobs.config; + +import com.magmaguy.elitemobs.quests.objectives.CustomFetchObjective; +import com.magmaguy.elitemobs.quests.objectives.DialogObjective; +import com.magmaguy.elitemobs.quests.objectives.KillObjective; +import com.magmaguy.elitemobs.quests.objectives.Objective; +import com.magmaguy.magmacore.config.ConfigurationFile; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.ChatColor; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.EntityType; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class QuestsConfig extends ConfigurationFile { + + @Getter + private static boolean requireQuestTurnIn; + @Getter + private static String questJoinMessage; + @Getter + private static String questLeaveMessage; + @Getter + private static String questCompleteMessage; + @Getter + private static String leaveWhenNoActiveQuestsExist; + @Getter + private static String questLeaveConfirmationMessage; + @Getter + private static boolean useQuestAcceptTitles; + @Getter + private static String questStartTitle; + @Getter + private static String questStartSubtitle; + @Getter + private static boolean useQuestCompleteTitles; + @Getter + private static String questCompleteTitle; + @Getter + private static String questCompleteSubtitle; + @Getter + private static boolean useQuestLeaveTitles; + @Getter + private static String questLeaveTitle; + @Getter + private static String questLeaveSubtitle; + @Getter + private static boolean doQuestChatProgression; + @Getter + private static String ongoingColorCode; + @Getter + private static String completedColorCode; + @Getter + private static String killQuestChatProgressionMessage; + @Getter + private static String fetchQuestChatProgressionMessage; + @Getter + private static String dialogQuestChatProgressionMessage; + @Getter + private static boolean useQuestScoreboards; + @Getter + private static String killQuestScoreboardProgressionLine; + @Getter + private static String fetchQuestScoreboardProgressionLine; + @Getter + private static String dialogQuestScoreboardProgressionLine; + @Getter + private static int maximumActiveQuests; + @Getter + private static String questCapMessage; + @Getter + private static List questEntityTypes = new ArrayList<>(); + @Getter + private static String chatTrackMessage; + @Getter + private static String chatTrackHover; + @Getter + private static String chatTrackCommand; + @Getter + private static String chatTrackingMessage; + @Getter + private static String chatTrackingHover; + @Getter + private static String chatTrackingCommand; + @Getter + private static boolean autoTrackQuestsOnAccept; + @Getter + private static String noQuestDestinationFound; + @Getter + private static String questDestinationInOtherWorld; + @Getter + private static String questAlreadyCompletedMessage; + @Getter + private static String questPrerequisitesMissingMessage; + @Getter + private static String lowRankDynamicQuestWarning; + @Getter + private static String questTurnInObjective; + @Getter + private static int horizontalCharacterLimitBedrockMenu; + @Getter + private static int itemEntryCharacterLimitBedrockMenu; + + public QuestsConfig() { + super("Quests.yml"); + } + + private static List setEntityTypes(FileConfiguration fileConfiguration, File file) { + List entityTypes = new ArrayList<>(new ArrayList<>(List.of( + EntityType.BLAZE.toString(), + EntityType.CAVE_SPIDER.toString(), + EntityType.DROWNED.toString(), + EntityType.ELDER_GUARDIAN.toString(), + EntityType.ENDERMAN.toString(), + EntityType.ENDERMITE.toString(), + EntityType.EVOKER.toString(), + EntityType.GHAST.toString(), + EntityType.GUARDIAN.toString(), + EntityType.HUSK.toString(), + EntityType.ILLUSIONER.toString(), + EntityType.IRON_GOLEM.toString(), + EntityType.PILLAGER.toString(), + EntityType.RAVAGER.toString(), + EntityType.SILVERFISH.toString(), + EntityType.SKELETON.toString(), + EntityType.SPIDER.toString(), + EntityType.STRAY.toString(), + EntityType.VINDICATOR.toString(), + EntityType.WITCH.toString(), + EntityType.WITHER_SKELETON.toString(), + EntityType.WOLF.toString(), + EntityType.ZOMBIE.toString() + ))); + + List laterEntities = new ArrayList<>(List.of( + EntityType.HOGLIN.toString(), + EntityType.ZOGLIN.toString(), + EntityType.PIGLIN_BRUTE.toString(), + EntityType.PIGLIN.toString(), + EntityType.ZOMBIFIED_PIGLIN.toString())); + entityTypes.addAll(laterEntities); + + ConfigurationEngine.setList(file, fileConfiguration, "questEntityTypes", entityTypes, false); + + List parsedTypes = new ArrayList<>(); + for (String string : entityTypes) + try { + parsedTypes.add(EntityType.valueOf(string)); + } catch (Exception ex) { + Logger.warn("Entity type " + string + " is not a valid entity type from the Spigot API!"); + } + return parsedTypes; + } + + public static String getQuestChatProgressionMessage(Objective objective) { + String newString = ""; + if (objective instanceof KillObjective) + newString = killQuestChatProgressionMessage; + else if (objective instanceof CustomFetchObjective) + newString = fetchQuestChatProgressionMessage; + else if (objective instanceof DialogObjective) + newString = dialogQuestChatProgressionMessage; + newString = newString.replace("$name", ChatColor.WHITE + ChatColor.stripColor(objective.getObjectiveName())); + newString = newString.replace("$current", objective.getCurrentAmount() + ""); + newString = newString.replace("$target", objective.getTargetAmount() + ""); + if (!objective.isObjectiveCompleted()) + return newString.replace("$color", ongoingColorCode); + else + return newString.replace("$color", completedColorCode); + } + + public static String getQuestScoreboardProgressionLine(Objective objective) { + String newString = ""; + if (objective instanceof KillObjective) + newString = killQuestScoreboardProgressionLine; + else if (objective instanceof CustomFetchObjective) + newString = fetchQuestScoreboardProgressionLine; + else if (objective instanceof DialogObjective) + newString = dialogQuestScoreboardProgressionLine; + newString = newString.replace("$name", ChatColor.WHITE + ChatColor.stripColor(objective.getObjectiveName())); + newString = newString.replace("$current", objective.getCurrentAmount() + ""); + newString = newString.replace("$target", objective.getTargetAmount() + ""); + if (!objective.isObjectiveCompleted()) + return newString.replace("$color", ongoingColorCode); + else + return newString.replace("$color", completedColorCode); + } + + @Override + public void initializeValues() { + + requireQuestTurnIn = ConfigurationEngine.setBoolean( + List.of("Sets if quests have to be returned to quest givers to complete the quest."), + fileConfiguration, "requireQuestTurnIn", true); + questJoinMessage = ConfigurationEngine.setString( + List.of("Sets the message sent when a quest is accepted."), + file, fileConfiguration, "questJoinMessage", "&aYou have accepted the quest $questName &a!", true); + questLeaveMessage = ConfigurationEngine.setString( + List.of("Sets the message sent when a quest is abandoned."), + file, fileConfiguration, "questLeaveMessage", "&cYou have abandoned the quest $questName &c!", true); + questCompleteMessage = ConfigurationEngine.setString( + List.of("Sets message sent when a quest is completed."), + file, fileConfiguration, "questCompleteMessage", "&2You completed the quest $questName &2!", true); + leaveWhenNoActiveQuestsExist = ConfigurationEngine.setString( + List.of("Sets the message sent when a player tried to abandon a quest when none are active."), + file, fileConfiguration, "leaveWhenNoActiveQuestsExist", "&cYou don't currently have an active quest!", true); + questLeaveConfirmationMessage = ConfigurationEngine.setString( + List.of("Sets the confirmation message sent when players try to leave a quest."), + file, fileConfiguration, "questLeaveConfirmationMessage", "&cAre you sure you want to abandon your current quest? Do &a/em confirm &c to confirm your choice!", true); + useQuestAcceptTitles = ConfigurationEngine.setBoolean( + List.of("Sets if some of the messages related to quests will use titles instead of chat messages."), + fileConfiguration, "useQuestAcceptTitles", true); + questStartTitle = ConfigurationEngine.setString( + List.of("Sets the title sent when a players starts a quest."), + file, fileConfiguration, "questStartTitle", "&aQuest Accepted!", true); + questStartSubtitle = ConfigurationEngine.setString( + List.of("Sets the subtitle sent when a players starts a quest."), + file, fileConfiguration, "questStartSubtitle", "$questName", false); + useQuestCompleteTitles = ConfigurationEngine.setBoolean( + List.of("Sets if titles will be sent when players complete a quest."), + fileConfiguration, "useQuestCompleteTitles", true); + questCompleteTitle = ConfigurationEngine.setString( + List.of("Sets the title sent when a player completes a quest."), + file, fileConfiguration, "questCompleteTitle", "&2Quest Completed!", true); + questCompleteSubtitle = ConfigurationEngine.setString( + List.of("Sets the subtitle sent when a player completes a quest."), + file, fileConfiguration, "questCompleteSubtitle", "$questName", true); + useQuestLeaveTitles = ConfigurationEngine.setBoolean( + List.of("Sets if titles are sent when players leave quests.."), + fileConfiguration, "useQuestLeaveTitles", true); + questLeaveTitle = ConfigurationEngine.setString( + List.of("Sets the title sent when a player leaves a quest."), + file, fileConfiguration, "questLeaveTitle", "&cQuest Abandoned!", true); + questLeaveSubtitle = ConfigurationEngine.setString( + List.of("Sets the subtitle sent when a player leaves a quest."), + file, fileConfiguration, "questLeaveSubtitle", "$questName", false); + doQuestChatProgression = ConfigurationEngine.setBoolean( + List.of("Sets if messages are sent on chat reporting quest objective progression."), + fileConfiguration, "doQuestChatProgression", true); + ongoingColorCode = ConfigurationEngine.setString( + List.of("Sets the color codes for ongoing objectives."), + file, fileConfiguration, "ongoingQuestColorCode", "&c", false); + completedColorCode = ConfigurationEngine.setString( + List.of("Sets the color codes for completed objectives."), + file, fileConfiguration, "ongoingQuestColorCode", "&2", false); + killQuestChatProgressionMessage = ConfigurationEngine.setString( + List.of("Sets the formatting for progression messages of kill quests."), + file, fileConfiguration, "killQuestChatProgressionMessage", "&8[EliteMobs]&c➤Kill $name:$color$current&0/$color$target", true); + fetchQuestChatProgressionMessage = ConfigurationEngine.setString( + List.of("Sets the formatting for progression messages of fetch quests."), + file, fileConfiguration, "fetchQuestChatProgressionMessage", "&8[EliteMobs]&c➤Get $name:$color$current&0/$color$target", true); + dialogQuestChatProgressionMessage = ConfigurationEngine.setString( + List.of("Sets the formatting for progression messages of dialog quests."), + file, fileConfiguration, "dialogQuestChatProgressionMessage", "&8[EliteMobs]&c➤Talk to $name:$color$current&0/$color$target", true); + maximumActiveQuests = ConfigurationEngine.setInt( + List.of("Sets the maximum amount of accepted quests a player can have."), + fileConfiguration, "maximumActiveQuests", 10); + questCapMessage = ConfigurationEngine.setString( + List.of("Sets the message sent to players when trying to accept an amount of quests that exceed the active quest cap."), + file, fileConfiguration, "questCapMessage", "&8[EliteMobs] &cYou have reached the maximum amount of active quests (10)! " + + "&4Abandon or complete at least one active quest if you want to get more quests!", true); + + useQuestScoreboards = ConfigurationEngine.setBoolean( + List.of("Sets if scoreboards messages will be used for quests."), + fileConfiguration, "useQuestScoreboards", true); + + killQuestScoreboardProgressionLine = ConfigurationEngine.setString( + List.of("Sets the formatting for scoreboard progression messages of kill quests."), + file, fileConfiguration, "killQuestScoreboardProgressionMessage", "&c➤Kill $name:$color$current&0/$color$target", true); + fetchQuestScoreboardProgressionLine = ConfigurationEngine.setString( + List.of("Sets the formatting for scoreboard progression message of fetch quests."), + file, fileConfiguration, "fetchQuestScoreboardProgressionMessage", "&c➤Get $name:$color$current&0/$color$target", true); + dialogQuestScoreboardProgressionLine = ConfigurationEngine.setString( + List.of("Sets the formatting for scoreboard progression messages of dialog quests."), + file, fileConfiguration, "dialogQuestScoreboardProgressionMessage", "&c➤Talk to $name:$color$current&0/$color$target", true); + + questEntityTypes = setEntityTypes(fileConfiguration, file); + + chatTrackMessage = ConfigurationEngine.setString( + List.of("Sets the message sent to players to activate quest tracking."), + file, fileConfiguration, "chatTrackMessage", "&8[EliteMobs]&2 Click here to track your quest!", true); + chatTrackHover = ConfigurationEngine.setString( + List.of("Sets the hover message of the quest tracking message."), + file, fileConfiguration, "chatTrackHover", "&2Click to track!", true); + chatTrackCommand = ConfigurationEngine.setString( + List.of("Sets the command sent when clicking on the tracking message. You really should not modify this."), + file, fileConfiguration, "chatTrackCommand", "/elitemobs quest track $questID", false); + + chatTrackingMessage = ConfigurationEngine.setString( + List.of("Sets the message sent to players when activating quest tracking."), + file, fileConfiguration, "chatTrackingMessage", "&8[EliteMobs]&9 You are now tracking a quest!", true); + chatTrackingHover = ConfigurationEngine.setString( + List.of("Sets the hover message of the quest tracking enabled message."), + file, fileConfiguration, "chatTrackingHover", "&2Click to untrack/track! /em -> Quests to track a different quest!", true); + chatTrackingCommand = ConfigurationEngine.setString( + List.of("Sets the command sent when click on the quest tracking activation message. You really should not modify this."), + file, fileConfiguration, "chatTrackingCommand", "/elitemobs quest track $questID", false); + + autoTrackQuestsOnAccept = ConfigurationEngine.setBoolean( + List.of("Sets if quests are automatically tracked when accepted."), + fileConfiguration, "autoTrackQuestsOnAccept", true); + + noQuestDestinationFound = ConfigurationEngine.setString( + List.of("Sets the message that appears when the destination of the quest could not be found."), + file, fileConfiguration, "noQuestDestinationFound", "[EM] No quest destination found!", true); + questDestinationInOtherWorld = ConfigurationEngine.setString( + List.of("Sets the message that appears when the quest target is in a different world."), + file, fileConfiguration, "questDestinationInOtherWorld", "[EM] Go to world $world!", true); + + questAlreadyCompletedMessage = ConfigurationEngine.setString( + List.of("Sets the message sent to players when trying to accept a quest they have already completed."), + file, fileConfiguration, "questAlreadyCompletedMessage", "&8[EliteMobs] &cYou already completed this quest!", true); + questPrerequisitesMissingMessage = ConfigurationEngine.setString( + List.of("Sets the message sent to players when trying to accept a quest they do not have the permission for."), + file, fileConfiguration, "questPrerequisitesMissingMessage", "&8[EliteMobs] &cThis NPC has some quest(s) you can't accept yet!", true); + + lowRankDynamicQuestWarning = ConfigurationEngine.setString( + List.of("Sets the message sent to players trying to get a quest for which they do not have the correct guild rank activated."), + file, fileConfiguration, "lowRankDynamicQuestWarning", "&8[EliteMobs] &cYou can't take these quests with your current guild rank! Increase your guild rank to accept these quests.", true); + + questTurnInObjective = ConfigurationEngine.setString( + List.of("Sets the formatting for the quest turn-in message."), + file, fileConfiguration, "questTurnInObjective", "&a2Talk to $npcName", true); + + horizontalCharacterLimitBedrockMenu = ConfigurationEngine.setInt( + List.of("Sets the maximum amount of characters inventory-based menus for quests will have before breaking the line."), + fileConfiguration, "horizontalCharacterLimitBedrockMenu", 30); + itemEntryCharacterLimitBedrockMenu = ConfigurationEngine.setInt( + List.of("Sets the maximum amount of characters per item entry in inventory-based menus for quests before creating another item to continue the entry."), + fileConfiguration, "itemEntryCharacterLimitBedrockMenu", 300); + + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/SoundsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/SoundsConfig.java new file mode 100644 index 000000000..0e211c4fd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/SoundsConfig.java @@ -0,0 +1,50 @@ +package com.magmaguy.elitemobs.config; + +import com.magmaguy.magmacore.config.ConfigurationFile; + +import java.util.List; + +public class SoundsConfig extends ConfigurationFile { + public static String treasureChestOpenSound; + public static String guildRankUpSound; + public static String guildPrestigeSound; + public static String questProgressionSound; + public static String questCompleteSound; + public static String questAbandonSound; + public static String questAcceptSound; + + public SoundsConfig() { + super("Sounds.yml"); + } + + @Override + public void initializeValues() { + treasureChestOpenSound = ConfigurationEngine.setString( + List.of("Sets the sound that will play when a treasure chest opens"), + file, fileConfiguration, "treasureChestOpenSound", "elitemobs:treasure_chest.open", false); + + guildRankUpSound = ConfigurationEngine.setString( + List.of("Sets the sound that will play when a player ranks up at the guild"), + file, fileConfiguration, "guildRankUpSound", "elitemobs:guild.rankup", false); + + guildPrestigeSound = ConfigurationEngine.setString( + List.of("Sets the sound that will play when a player prestiges at the guild"), + file, fileConfiguration, "guildPrestigeSound", "elitemobs:guild.prestige", false); + + questProgressionSound = ConfigurationEngine.setString( + List.of("Sets the sound that will play when a player progresses a quest"), + file, fileConfiguration, "questProgressionSound", "elitemobs:quest.progression", false); + + questCompleteSound = ConfigurationEngine.setString( + List.of("Sets the sound that will play when a player completes a quest"), + file, fileConfiguration, "questCompleteSound", "elitemobs:quest.completion", false); + + questAbandonSound = ConfigurationEngine.setString( + List.of("Sets the sound that will play when a player abandons a quest"), + file, fileConfiguration, "questAbandonSound", "elitemobs:quest.abandon", false); + + questAcceptSound = ConfigurationEngine.setString( + List.of("Sets the sound that will play when a player accepts a quest"), + file, fileConfiguration, "questAcceptSound", "elitemobs:quest.accept", false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/SpecialItemSystemsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/SpecialItemSystemsConfig.java new file mode 100644 index 000000000..536569ffa --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/SpecialItemSystemsConfig.java @@ -0,0 +1,169 @@ +package com.magmaguy.elitemobs.config; + +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import com.magmaguy.magmacore.config.ConfigurationFile; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.configuration.file.FileConfiguration; + +import java.util.HashMap; +import java.util.List; + +public class SpecialItemSystemsConfig extends ConfigurationFile { + + @Getter + private static final HashMap specialValues = new HashMap<>(); + @Getter + private static boolean dropSpecialLoot; + @Getter + private static double bossChanceToDrop; + @Getter + private static double nonEliteChanceToDrop; + @Getter + private static double luckyTicketMultiplier; + @Getter + private static double criticalFailureChance; + @Getter + private static double challengeChance; + @Getter + private static double criticalFailureChanceDuringChallengeChance; + @Getter + private static String insufficientFundsMessage; + @Getter + private static String newFundsMessage; + @Getter + private static boolean announceImportantEnchantments; + @Getter + private static String successAnnouncement; + @Getter + private static String criticalFailureAnnouncement; + @Getter + private static String challengeAnnouncement; + + public SpecialItemSystemsConfig() { + super("SpecialItemSystems.yml"); + } + + private static void addDefaultEnchantmentBook(FileConfiguration fileConfiguration, String configFilename, double chance) { + String key = "enchantedBookWeightedDropChance." + configFilename; + fileConfiguration.addDefault(key, chance); + CustomItem customItem = CustomItem.getCustomItem(configFilename + ".yml"); + if (customItem == null) { + Logger.warn("Failed to get custom item " + configFilename + ".yml for the special loot list!"); + return; + } + specialValues.put(customItem, fileConfiguration.getDouble(key)); + } + + @Override + public void initializeValues() { + specialValues.clear(); + + dropSpecialLoot = ConfigurationEngine.setBoolean( + List.of("Sets if special loot will drop."), + fileConfiguration, "dropSpecialLoot", true); + + bossChanceToDrop = ConfigurationEngine.setDouble( + List.of("Sets the chance of special loot dropping from any custom boss that can drop elite loot with a health multiplier over 1.0.", "This means all bosses, minibosses and marginally hard bosses."), + fileConfiguration, "bossChanceToDrop", 0.1); + nonEliteChanceToDrop = ConfigurationEngine.setDouble( + List.of("Sets the chance of special loot dropping custom boss that can drop elite loot.", "Normal elites are excluded to avoid encouraging mob farms."), + fileConfiguration, "normalChanceToDrop", 0.01); + + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_arrow_damage", 200); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_arrow_fire", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_arrow_infinite", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_arrow_knockback", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_channeling", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_critical_strikes", 1); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_damage_all", 200); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_damage_arthropods", 100); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_damage_undead", 100); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_depth_strider", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_dig_speed", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_drilling", 1); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_durability", 100); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_earthquake", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_flamethrower", 0); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_frost_walker", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_hunter", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_ice_breaker", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_impaling", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_knockback", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_lightning", 0); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_loot_bonus_blocks", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_loot_bonus_mobs", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_loud_strikes", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_loyalty", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_luck", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_lure", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_mending", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_meteor_shower", 0); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_multishot", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_oxygen", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_piercing", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_plasma_boots", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_protection_environmental", 600); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_protection_explosions", 100); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_protection_fall", 100); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_protection_fire", 100); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_protection_projectile", 100); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_quick_charge", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_riptide", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_silk_touch", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_soul_speed", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_sweeping_edge", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_thorns", 10); + addDefaultEnchantmentBook(fileConfiguration, "enchanted_book_water_worker", 10); + + addDefaultEnchantmentBook(fileConfiguration, "elite_lucky_ticket", 100); + + addDefaultEnchantmentBook(fileConfiguration, "elite_scrap_huge", 100); + + fileConfiguration.setComments("enchantedBookWeightedDropChance", + List.of("Sets the chance of a special item dropping over another special item.", + "The higher the value, the higher the chance of that item getting picked over other items.", + "Keep in mind that if values get too high, things with low values will become almost impossible to obtain.")); + + luckyTicketMultiplier = ConfigurationEngine.setDouble( + List.of("Multiplier for the lucky ticket success chance in enchantments. 2.0 = 2x"), + fileConfiguration, "luckyTicketMultiplier", 2.00); + + criticalFailureChance = ConfigurationEngine.setDouble( + List.of("Chance of an item being lost if an item enchantment fails. This is a percentage of the base failure chance."), + fileConfiguration, "criticalFailureChanceV2", 0.01); + + challengeChance = ConfigurationEngine.setDouble( + List.of("Chance of a player being teleported to a challenge arena if an item enchantment fails. This is a percentage of the base failure chance.", "If the player defeats the arena, their item is upgraded correctly. If the lose, either it is not enchanted or, if they're unlucky, they may lose the item."), + fileConfiguration, "challengeChance", 0.30); + + criticalFailureChanceDuringChallengeChance = ConfigurationEngine.setDouble( + List.of("Chance of an item being lost if a player loses the enchantment challenge. This is a percentage of the base failure chance."), + fileConfiguration, "criticalFailureChanceDuringChallengeChance", 0.10); + + insufficientFundsMessage = ConfigurationEngine.setString( + List.of("Sets the message sent when players do not have enough elite coins to enchant an item"), + file, fileConfiguration, "insufficientFundsMessage", "&8[EliteMobs] &c$price $currencyName is required to enchant $itemName, but you only have $currentAmount!", true); + + newFundsMessage = ConfigurationEngine.setString( + List.of("Sets the message sent when players after deducting the funds"), + file, fileConfiguration, "newFundsMessage", "&8[EliteMobs] &fYou just spent $price $currencyName! You now have $currentAmount $currencyName.", true); + + announceImportantEnchantments = ConfigurationEngine.setBoolean( + List.of("Sets if enchantments of items with more than 10 enchantments in them will be announced"), + fileConfiguration, "successAnnouncement", true); + + successAnnouncement = ConfigurationEngine.setString( + List.of("Sets the message announced to all players when successfully enchanting an item with more than 10 enchantments"), + file, fileConfiguration, "successAnnouncement", "&8[EliteMobs] $player &2has successfully enchanted $itemName&2!", true); + + challengeAnnouncement = ConfigurationEngine.setString( + List.of("Sets the message announced to all players when they get a boss fight while trying to enchant an item with more than 10 enchantments"), + file, fileConfiguration, "challengeAnnouncement", "&8[EliteMobs] $player &6is challenging a boss to enchant $itemName&6!", true); + + criticalFailureAnnouncement = ConfigurationEngine.setString( + List.of("Sets the message announced to all players when losing an item while trying to enchant it if the item has more than 10 enchantments"), + file, fileConfiguration, "criticalFailureAnnouncement", "&8[EliteMobs] $player &clost $itemName &cwhile trying to enchant it!", true); + + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/TranslationConfig.java b/src/main/java/com/magmaguy/elitemobs/config/TranslationConfig.java deleted file mode 100644 index b42e74aaa..000000000 --- a/src/main/java/com/magmaguy/elitemobs/config/TranslationConfig.java +++ /dev/null @@ -1,531 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.config; - -import org.bukkit.configuration.Configuration; - -import java.util.Arrays; - -/** - * Created by MagmaGuy on 12/05/2017. - */ -public class TranslationConfig { - - private static final String ELITE_MOB_NAME = "Elite mob names."; - public static final String NAME_BLAZE = ELITE_MOB_NAME + "Blaze"; - public static final String NAME_CAVE_SPIDER = ELITE_MOB_NAME + "CaveSpider"; - public static final String NAME_CREEPER = ELITE_MOB_NAME + "Creeper"; - public static final String NAME_ENDERMAN = ELITE_MOB_NAME + "Enderman"; - public static final String NAME_ENDERMITE = ELITE_MOB_NAME + "Endermite"; - public static final String NAME_HUSK = ELITE_MOB_NAME + "Husk"; - public static final String NAME_IRON_GOLEM = ELITE_MOB_NAME + "IronGolem"; - public static final String NAME_PIG_ZOMBIE = ELITE_MOB_NAME + "PigZombie"; - public static final String NAME_POLAR_BEAR = ELITE_MOB_NAME + "PolarBear"; - public static final String NAME_SILVERFISH = ELITE_MOB_NAME + "Silverfish"; - public static final String NAME_SKELETON = ELITE_MOB_NAME + "Skeleton"; - public static final String NAME_SPIDER = ELITE_MOB_NAME + "Spider"; - public static final String NAME_STRAY = ELITE_MOB_NAME + "Stray"; - public static final String NAME_WITCH = ELITE_MOB_NAME + "Witch"; - public static final String NAME_WITHER_SKELETON = ELITE_MOB_NAME + "WitherSkeleton"; - public static final String NAME_ZOMBIE = ELITE_MOB_NAME + "Zombie"; - public static final String NAME_VEX = ELITE_MOB_NAME + "Vex"; - public static final String NAME_VINDICATOR = ELITE_MOB_NAME + "Vindicator"; - public static final String NAME_DROWNED = ELITE_MOB_NAME + "Drowned"; - - public static final String NAME_CHICKEN = ELITE_MOB_NAME + "Chicken"; - public static final String NAME_COW = ELITE_MOB_NAME + "Cow"; - public static final String NAME_MUSHROOM_COW = ELITE_MOB_NAME + "MushroomCow"; - public static final String NAME_PIG = ELITE_MOB_NAME + "Pig"; - public static final String NAME_SHEEP = ELITE_MOB_NAME + "Sheep"; - - public static final String CONFIG_NAME = "translation.yml"; - CustomConfigLoader customConfigLoader = new CustomConfigLoader(); - Configuration configuration = customConfigLoader.getCustomConfig(CONFIG_NAME); - - public void initializeConfig() { - - configuration.addDefault(NAME_BLAZE, "Level $level Elite Blaze"); - configuration.addDefault(NAME_CAVE_SPIDER, "Level $level Elite Cave Spider"); - configuration.addDefault(NAME_CREEPER, "Level $level Elite Creeper"); - configuration.addDefault(NAME_ENDERMAN, "Level $level Elite Enderman"); - configuration.addDefault(NAME_ENDERMITE, "Level $level Elite Endermite"); - configuration.addDefault(NAME_HUSK, "Level $level Elite Husk"); - configuration.addDefault(NAME_IRON_GOLEM, "Level $level Elite Iron Golem"); - configuration.addDefault(NAME_PIG_ZOMBIE, "Level $level Elite Zombie Pigman"); - configuration.addDefault(NAME_POLAR_BEAR, "Level $level Elite Polar Bear"); - configuration.addDefault(NAME_SILVERFISH, "Level $level Elite Silverfish"); - configuration.addDefault(NAME_SKELETON, "Level $level Elite Skeleton"); - configuration.addDefault(NAME_SPIDER, "Level $level Elite Spider"); - configuration.addDefault(NAME_STRAY, "Level $level Elite Stray"); - configuration.addDefault(NAME_WITCH, "Level $level Elite Witch"); - configuration.addDefault(NAME_WITHER_SKELETON, "Level $level Elite Wither Skeleton"); - configuration.addDefault(NAME_ZOMBIE, "Level $level Elite Zombie"); - configuration.addDefault(NAME_VEX, "Level $level Elite Vex"); - configuration.addDefault(NAME_VINDICATOR, "Level $level Elite Vindicator"); - configuration.addDefault(NAME_DROWNED, "Level $level Elite Drowned"); - - configuration.addDefault(NAME_CHICKEN, "Super Chicken"); - configuration.addDefault(NAME_COW, "Super Cow"); - configuration.addDefault(NAME_MUSHROOM_COW, "Super Mooshroom"); - configuration.addDefault(NAME_PIG, "Super Pig"); - configuration.addDefault(NAME_SHEEP, "Super Sheep"); - - configuration.addDefault("ScoreBoard.Health", "Health: "); - - configuration.addDefault("Taunts.Target", Arrays.asList( - "OI! Get over here!", - "What's that I see? A coward?", - "Sir, prepare your fisticuffs!", - "Let's settle this like cavemen!", - "En garde!", - "Look out! A creeper, behind you!", - "Aren't you a right ugly mug!", - "You look delicious.", - "Prepare for trouble!", - "Let the best click spammer win!", - "SPARTAAAAAA", - "I am actually level 9001", - "Not an Elite Mob", - "Poorly disguised Elite Mob", - "Ah, fresh prey!", - "The hunter becomes the hunted!", - "Killing me crashes the server", - "I'm actually a disguised player!", - "I'm not going to drop any loot!", - "Why can't we be friends?", - "Sssssss", - "This is my last day on the job!", - "Stop right there criminal scum!", - "Prepare to die!", - "Praise the Sun!", - "Git gud", - "Alea jacta est!", - "Facta, non verba!", - "Skulls for the skull throne!", - "Blood for the blood throne!", - "A sacrifice for Herobrine!", - "I shall pierce the heavens!", - "Just who do you think I am!?", - "A weakling! He's mine.", - "Dibs on the weakling!", - "Accio player!", - "A duel to the death!", - "I challenge you to a duel!", - "Pika pika!", - "Did you just call me an infernal", - "What did you just call me?", - "I know what you did you monster!", - "This is how your story ends!", - "Prepare for trouble!", - "I've been preparing for this!", - "I am prepared. Are you?", - "A worthy foe!", - "A worthy opponent!", - "A newbie! It's my lucky day!", - "Your stuff or your life!", - "This is a robbery!", - "It's you! You monster!", - "So hungry, give me your flesh!", - "There he is!", - "Must've been my imagination", - "Hi I'm Mr Meeseeks!", - "I'm Mr Meeseeks, look at me!", - "Your diamonds or your life!", - "For king and country!", - "Hit me with your best shot!", - "Witness me!", - "Witness me blood bag!", - "I go all shiny and chrome!")); - - configuration.addDefault("Taunts.Damaged", Arrays.asList( - "Ow!", - "Oi!", - "Stop that!", - "Why?!", - "You fight like a Dairy Farmer!", - "You are a pain in the backside!", - "En garde! Touche!", - "Hacks!", - "My health is bugged, unkillable!", - "Your hits only make me stronger!", - "Sticks and stones...", - "'tis but a flesh wound!", - "Emperor protects!", - "Herobrine, aid me!", - "Behind you! A creeper!", - "I have made a terrible mistake.", - "What doesn't kill me...", - "Zombies dig scars", - "I shall show you my true power!", - "Prepare for my ultimate attack!", - "My reinforcements are arriving!", - "You're going to pay for that!", - "That's going to leave a mark!", - "An eye for an eye!", - "Health insurance will cover that", - "I felt that one in my bones", - "'tis but a scratch", - "What was that? A soft breeze?", - "You'll never defeat me like that", - "Pathetic.", - "Weak.", - "That didn't even dent my armor!", - "This is going to be an easy one", - "My grandchildren will feel that", - "Are you even trying?", - "An admin just fully healed me", - "Haxxor!", - "Me? Damaged? Hacks!", - "I can't be defeated!", - "Good thing I'm using hacks!", - "Watch out! Herobrine behind you!", - "My life for Aiur!", - "Your home is getting griefed!", - "Why can't we be friends?", - "Valhalla!", - "Notch save me!", - "No retreat!", - "Hit me with your best shot!" - )); - - configuration.addDefault("Taunts.BowDamaged", Arrays.asList( - "Fight me like a Player!", - "Afraid to come up-close?", - "I can smell your fear from here!", - "Did you forget your sword?", - "Coward! Bow are no fair!", - "Bows? That's so 2011...", - "Bows are for the weak of mind!", - "Bows are for the weak of spirit!", - "Bows are for the weak of heart!", - "I thought we agreed no bows!", - "Bows? You'll regret that", - - //regular hits - "Ow!", - "Oi!", - "Stop that!", - "Why?!", - "You fight like a Dairy Farmer!", - "You are a pain in the backside!", - "En garde! Touche!", - "Hacks!", - "My health is bugged, unkillable!", - "Your hits only make me stronger!", - "Sticks and stones...", - "'tis but a flesh wound!", - "Emperor protects!", - "Herobrine, aid me!", - "Behind you! A creeper!", - "I have made a terrible mistake.", - "What doesn't kill me...", - "Zombies dig scars", - "I shall show you my true power!", - "Prepare for my ultimate attack!", - "My reinforcements are arriving!", - "You're going to pay for that!", - "That's going to leave a mark!", - "An eye for an eye!", - "Health insurance will cover that", - "I felt that one in my bones", - "'tis but a scratch", - "What was that? A soft breeze?", - "You'll never defeat me like that", - "Pathetic.", - "Weak.", - "That didn't even dent my armor!", - "This is going to be an easy one", - "My grandchildren will feel that", - "Are you even trying?", - "An admin just fully healed me", - "Haxxor!", - "Me? Damaged? Hacks!", - "I can't be defeated!", - "Good thing I'm using hacks!", - "Watch out! Herobrine behind you!", - "My life for Aiur!", - "Your home is getting griefed!", - "Why can't we be friends?", - "Valhalla!", - "Notch save me!", - "No retreat!", - "Hit me with your best shot!" - )); - - configuration.addDefault("Taunts.Hit", Arrays.asList( - "A solid hit!", - "He shoots, and he scores!", - "You'll feel that in the morning!", - "Victory approaches!", - "Victory shall be mine!", - "That was only half of my power!", - "You came to the wrong hood!", - "You messed with the wrong mob!", - "Get ready to get mobbed on!", - "This was your last mistake!", - "Feel the burn!", - "John Cena", - "How are you still standing?", - "Just give up already!", - "Give up!", - "I have the high ground!", - "I will end you!", - "Hope you came prepared for pain!", - "The hunter becomes the hunted!", - "Blood for the blood throne!", - "Skulls for the skull throne!", - "A good player is a dead player!", - "Git gud!", - "Praise the Sun!", - "The end draws near!", - "You are not prepared.", - "Zug zug!", - "Hardly worth my time!", - "I thought this was a challenge?", - "Pro tip: don't get hit", - "Ima firin mah lazer bwooooooooo", - "For the Emperor!", - "Herobrine shall be pleased!", - "This is the end for you!", - "Are you even trying?", - "Weakling!", - "Pathetic.", - "Maybe this will wake you up.", - "This is just the beggining!", - "We're just getting started!", - "That was just a warm-up!", - "You are no match for me!", - "RKO out of nowhere!", - "I can do this all night long!", - "A fine punching bag!", - "I am the night!", - "I wonder what will break first", - "Revenge for Steve! You monster!", - "Join the mob side!", - "Too easy, too easy!", - "Too easy!", - "You can't defeat me!", - "Pikachuuuuuu", - "Avada kedavra!", - "Crucio!", - "Jierda!", - "A critical hit!", - "This is what skills looks like!", - "9001 damage!", - "Still standing?", - "Face your defeat!", - "A taste of pain to come!", - "I'll make you endangered!" - )); - - configuration.addDefault("Taunts.Death", Arrays.asList( - "Alas, poor Yorick!", - "The rest is silence", - "I shall return", - "Unforgivable", - "I live, I die, I live again!", - "WITNESS ME", - "I ride to valhalla!", - "VALHALLA!", - "VALHALLA! DELIVERANCE", - "You win, this time", - "A blight upon your land!", - "A pox upon thee!", - "You'll join me soon enough!", - "This is not over", - "Death is but a setback", - "Not like this...", - "I just wanted to go into space", - "We could've been friends", - "Your sins crawling on your back", - "See you in a bit", - "See you later", - "I'll be waiting for you", - "I will be avenged!", - "I won't go gently into the night", - "Should've gotten life insurance", - "It was my last day on the job", - "It was my last day here", - "Et tu, Brute?", - "RIP", - "x.x", - "(x.x)", - "xox", - "Fainted", - "GG, WP", - "GG", - "WP", - "GG no RE", - "HAX", - "Hacker", - "Not fair I was lagging", - "You win, this time", - "You monster...", - "Mediocre..." - )); - - configuration.addDefault("ZombieFriends.Friend 1", "BFF #1"); - configuration.addDefault("ZombieFriends.Friend 2", "BFF #2"); - - configuration.addDefault("ZombieFriends.DeathMessage", Arrays.asList( - "Noooo!", - "Mediocre!", - "Zacharias!", - "He's deader than before!" - )); - - configuration.addDefault("ZombieFriends.ZombieDialog", Arrays.asList( - "Let's play ZombieCraft later!", - "Feel the power of friendship!", - "El pueblo, unido!", - "I called my friends over!", - "BFF power!", - "One for all!", - "Get him!", - "Screw you guys, I'm going home!" - )); - - configuration.addDefault("ZombieFriends.FriendDialog", Arrays.asList( - "Don't mess with our friends!", - "We got your back Zach!", - "Backup has arrived!", - "One for all, one for all!", - "This is going to be easy!", - "Give up we have the high ground!", - "You wanna go bruv?", - "Worldstaaaaaaaaar!", - "What are you doing to our friend", - "Feel the power of friendship!", - "Friendship power at 100%!", - "Zombies, assemble!", - "We got your back mate!", - "Together we are better!", - "The more the merrier!", - "I got you fam!", - "All for one!" - )); - - configuration.addDefault("ZombieNecronomicon.Summoned zombie", "Summoned Zombie"); - configuration.addDefault("ZombieNecronomicon.Summoned skeleton", "Summoned Skeleton"); - configuration.addDefault("ZombieNecronomicon.Summoning chant", "Nor is it to be thought..." + - "that man is either the oldest " + - "or the last of earth's masters, or that the common bulk of life and substance walks alone. The Old Ones" + - " were, the Old Ones are, and the Old Ones shall be. Not in the spaces we know, but between them, they " + - "walk serene and primal, undimensioned and to us unseen. Yog-Sothoth knows the gate. Yog-Sothoth is the " + - "gate. Yog-Sothoth is the key and guardian of the gate. Past, present, future, all are one in Yog-Sothoth. " + - "He knows where the Old Ones broke through of old, and where They shall break through again. He knows " + - "where They had trod earth's fields, and where They still tread them, and why no one can behold Them as " + - "They tread. By Their smell can men sometimes know Them near, but of Their semblance can no man know, " + - "saving only in the features of those They have begotten on mankind; and of those are there many sorts, " + - "differing in likeness from man's truest eidolon to that shape without sight or substance which is Them. " + - "They walk unseen and foul in lonely places where the Words have been spoken and the Rites howled through " + - "at their Seasons. The wind gibbers with Their voices, and the earth mutters with Their consciousness. " + - "They bend the forest and crush the city, yet may not forest or city behold the hand that smites. Kadath " + - "in the cold waste hath known Them, and what man knows Kadath? The ice desert of the South and the sunken " + - "isles of Ocean hold stones whereon Their seal is engraver, but who hath seen the deep frozen city or the " + - "sealed tower long garlanded with seaweed and barnacles? Great Cthulhu is Their cousin, yet can he spy " + - "Them only dimly. Iä! Shub-Niggurath! As a foulness shall ye know Them. Their hand is at your throats, " + - "yet ye see Them not; and Their habitation is even one with your guarded threshold. Yog-Sothoth is the " + - "key to the gate, whereby the spheres meet. Man rules now where They ruled once; They shall soon rule " + - "where man rules now. After summer is winter, after winter summer. They wait patient and potent, for " + - "here shall They reign again."); - - configuration.addDefault("ZombieTeamRocket.Intro", Arrays.asList( - "Prepare for trouble!", - "Make it double!", - "To protect the world", - "from devastation!", - "To unite all people", - "within our nation!", - "To denounce the evils", - "of truth and love!", - "To extend our reach", - "to the stars above!", - "Jesse!", - "James!", - "Team Rocket blasts off", - "at the speed of light!", - "Surrender now", - "or prepare to fight!", - "Meowth! That's right!" - )); - - configuration.addDefault("ZombieTeamRocket.Jesse name", "Jesse"); - configuration.addDefault("ZombieTeamRocket.James name", "James"); - configuration.addDefault("ZombieTeamRocket.Meowth name", "Meowth"); - configuration.addDefault("ZombieTeamRocket.DeathMessage", "Team rocket blasts off again!"); - - configuration.addDefault("ZombieParents.Dad Name", "Zombie's Dad"); - configuration.addDefault("ZombieParents.Mom Name", "Zombie's Mom"); - - configuration.addDefault("ZombieParents.DeathMessage", Arrays.asList( - "You monster!", - "My baby!", - "What have you done!?", - "Revenge!", - "Nooooo!", - "You will pay for that!", - "Eh, he was adopted", - "He's dead! Again!", - "He's deader than before!", - "You broke him!" - )); - - configuration.addDefault("ZombieParents.ZombieDialog", Arrays.asList( - "You're embarrassing me!", - "He's bullying me!", - "He's the one picking on me!", - "I can deal with this alone!", - "Leave me alone, I got this!", - "Stop following me around!", - "God this is so embarassing!", - "He took my lunch money!", - "He's bullying me!" - )); - - configuration.addDefault("ZombieParents.ZombieDadDialog", Arrays.asList( - "Get away from my son!", - "Stand up for yourself son!", - "I'll deal with him!", - "Stop picking on my son!", - "Why are you doing this?", - "I'll talk to your parents!", - "You go kiddo!", - "Show him who's boss kiddo!", - "Nice punch kiddo!" - )); - - configuration.addDefault("ZombieParents.ZombieMomDialog", Arrays.asList( - "Hands off my child!", - "Are you hurt sweety?", - "Did he hurt you sweety?", - "Let me see that booboo sweety", - "I'll talk to his parents!", - "You forgot your jacket sweety!", - "Posture, sweetheart", - "Break it up!", - "Stop this!", - "Did you take out the garbage?" - )); - - configuration.options().copyDefaults(true); - UnusedNodeHandler.clearNodes(configuration); - customConfigLoader.saveDefaultCustomConfig(CONFIG_NAME); - customConfigLoader.saveCustomConfig(CONFIG_NAME); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/config/UnusedNodeHandler.java b/src/main/java/com/magmaguy/elitemobs/config/UnusedNodeHandler.java deleted file mode 100644 index d239f2545..000000000 --- a/src/main/java/com/magmaguy/elitemobs/config/UnusedNodeHandler.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.magmaguy.elitemobs.config; - -import org.bukkit.Bukkit; -import org.bukkit.configuration.Configuration; - -public class UnusedNodeHandler { - - public static Configuration clearNodes(Configuration configuration) { - - for (String actual : configuration.getKeys(false)) { - - boolean keyExists = false; - - for (String defaults : configuration.getDefaults().getKeys(true)) { - - if (actual.equals(defaults)) { - - keyExists = true; - - } - - } - - if (!keyExists) { - - configuration.set(actual, null); - Bukkit.getLogger().warning(actual); - Bukkit.getLogger().info("[EliteMobs] Deleting unused config values."); - - } - - } - - return configuration; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/config/ValidMobsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/ValidMobsConfig.java deleted file mode 100644 index 1bbef23a4..000000000 --- a/src/main/java/com/magmaguy/elitemobs/config/ValidMobsConfig.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.config; - -import org.bukkit.configuration.Configuration; - -public class ValidMobsConfig { - - public static final String CONFIG_NAME = "ValidMobs.yml"; - public static final String ALLOW_AGGRESSIVE_ELITEMOBS = "Allow aggressive EliteMobs"; - public static final String ALLOW_PASSIVE_SUPERMOBS = "Allow Passive SuperMobs"; - public static final String VALID_SUPERMOBS = "Valid Super Mobs."; - public static final String CHICKEN = VALID_SUPERMOBS + "CHICKEN"; - public static final String COW = VALID_SUPERMOBS + "COW"; - public static final String MUSHROOM_COW = VALID_SUPERMOBS + "MUSHROOM_COW"; - public static final String PIG = VALID_SUPERMOBS + "PIG"; - public static final String SHEEP = VALID_SUPERMOBS + "SHEEP"; - public static final String VALID_AGGRESSIVE_ELITEMOBS = "Valid aggressive EliteMobs."; - public static final String BLAZE = VALID_AGGRESSIVE_ELITEMOBS + "BLAZE"; - public static final String CAVE_SPIDER = VALID_AGGRESSIVE_ELITEMOBS + "CAVE_SPIDER"; - public static final String CREEPER = VALID_AGGRESSIVE_ELITEMOBS + "CREEPER"; - public static final String ENDERMAN = VALID_AGGRESSIVE_ELITEMOBS + "ENDERMAN"; - public static final String ENDERMITE = VALID_AGGRESSIVE_ELITEMOBS + "ENDERMITE"; - public static final String HUSK = VALID_AGGRESSIVE_ELITEMOBS + "HUSK"; - public static final String IRON_GOLEM = VALID_AGGRESSIVE_ELITEMOBS + "IRON_GOLEM"; - public static final String PIG_ZOMBIE = VALID_AGGRESSIVE_ELITEMOBS + "PIG_ZOMBIE"; - public static final String POLAR_BEAR = VALID_AGGRESSIVE_ELITEMOBS + "POLAR_BEAR"; - public static final String SILVERFISH = VALID_AGGRESSIVE_ELITEMOBS + "SILVERFISH"; - public static final String STRAY = VALID_AGGRESSIVE_ELITEMOBS + "STRAY"; - public static final String SKELETON = VALID_AGGRESSIVE_ELITEMOBS + "SKELETON"; - public static final String WITHER_SKELETON = VALID_AGGRESSIVE_ELITEMOBS + "WITHER_SKELETON"; - public static final String SPIDER = VALID_AGGRESSIVE_ELITEMOBS + "SPIDER"; - public static final String VEX = VALID_AGGRESSIVE_ELITEMOBS + "VEX"; - public static final String VINDICATOR = VALID_AGGRESSIVE_ELITEMOBS + "VINDICATOR"; - public static final String WITCH = VALID_AGGRESSIVE_ELITEMOBS + "WITCH"; - public static final String ZOMBIE = VALID_AGGRESSIVE_ELITEMOBS + "ZOMBIE"; - CustomConfigLoader customConfigLoader = new CustomConfigLoader(); - private Configuration configuration = customConfigLoader.getCustomConfig(CONFIG_NAME); - - public void initializeConfig() { - - configuration.addDefault(ALLOW_AGGRESSIVE_ELITEMOBS, true); - configuration.addDefault(BLAZE, true); - configuration.addDefault(CAVE_SPIDER, true); - configuration.addDefault(CREEPER, true); - configuration.addDefault(ENDERMAN, true); - configuration.addDefault(ENDERMITE, true); - configuration.addDefault(HUSK, true); - configuration.addDefault(IRON_GOLEM, true); - configuration.addDefault(PIG_ZOMBIE, true); - configuration.addDefault(POLAR_BEAR, true); - configuration.addDefault(SILVERFISH, true); - configuration.addDefault(SKELETON, true); - configuration.addDefault(WITHER_SKELETON, true); - configuration.addDefault(SPIDER, true); - configuration.addDefault(STRAY, true); - configuration.addDefault(VEX, true); - configuration.addDefault(VINDICATOR, true); - configuration.addDefault(WITCH, true); - configuration.addDefault(ZOMBIE, true); - configuration.addDefault(ALLOW_PASSIVE_SUPERMOBS, true); - configuration.addDefault(CHICKEN, true); - configuration.addDefault(COW, true); - configuration.addDefault(MUSHROOM_COW, true); - configuration.addDefault(PIG, true); - configuration.addDefault(SHEEP, true); - - - customConfigLoader.getCustomConfig(CONFIG_NAME).options().copyDefaults(true); - UnusedNodeHandler.clearNodes(configuration); - customConfigLoader.saveDefaultCustomConfig(CONFIG_NAME); - customConfigLoader.saveCustomConfig(CONFIG_NAME); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/config/ValidWorldsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/ValidWorldsConfig.java index b9918237d..fe1a8dc9e 100644 --- a/src/main/java/com/magmaguy/elitemobs/config/ValidWorldsConfig.java +++ b/src/main/java/com/magmaguy/elitemobs/config/ValidWorldsConfig.java @@ -1,43 +1,45 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package com.magmaguy.elitemobs.config; +import com.magmaguy.magmacore.config.ConfigurationFile; +import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.World; -import org.bukkit.configuration.Configuration; +import org.bukkit.configuration.ConfigurationSection; -public class ValidWorldsConfig { +import java.util.ArrayList; +import java.util.List; - public static final String CONFIG_NAME = "ValidWorlds.yml"; - CustomConfigLoader customConfigLoader = new CustomConfigLoader(); - private Configuration configuration = customConfigLoader.getCustomConfig(CONFIG_NAME); +public class ValidWorldsConfig extends ConfigurationFile { + @Getter + private static final List validWorlds = new ArrayList<>(); + @Getter + private static ValidWorldsConfig instance; - public void initializeConfig() { + public ValidWorldsConfig() { + super("ValidWorlds.yml"); + instance = this; + } - for (World world : Bukkit.getWorlds()) { + public static void addWorld(String worldName) { + if (instance.fileConfiguration.getKeys(true).contains("Valid worlds." + worldName)) return; - configuration.addDefault("Valid worlds." + world.getName(), true); + ConfigurationEngine.setBoolean( + List.of("Sets if elites will spawn in this world."), + instance.fileConfiguration, "Valid worlds." + worldName, true); + ConfigurationEngine.fileSaverOnlyDefaults(instance.fileConfiguration, instance.file); + validWorlds.add(worldName); + } - } + @Override + public void initializeValues() { - customConfigLoader.getCustomConfig(CONFIG_NAME).options().copyDefaults(true); - UnusedNodeHandler.clearNodes(configuration); - customConfigLoader.saveDefaultCustomConfig(CONFIG_NAME); - customConfigLoader.saveCustomConfig(CONFIG_NAME); + for (World world : Bukkit.getWorlds()) + ConfigurationEngine.setBoolean(fileConfiguration, "Valid worlds." + world.getName(), true); - } + ConfigurationSection validWorldsSection = fileConfiguration.getConfigurationSection("Valid worlds"); + for (String key : validWorldsSection.getKeys(false)) + if (validWorldsSection.getBoolean(key)) + validWorlds.add(key); + } } diff --git a/src/main/java/com/magmaguy/elitemobs/config/WormholesConfig.java b/src/main/java/com/magmaguy/elitemobs/config/WormholesConfig.java new file mode 100644 index 000000000..3eb1a4150 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/WormholesConfig.java @@ -0,0 +1,42 @@ +package com.magmaguy.elitemobs.config; + +import com.magmaguy.magmacore.config.ConfigurationFile; +import lombok.Getter; + +import java.util.List; + +public class WormholesConfig extends ConfigurationFile { + @Getter + private static String dungeonNotInstalledMessage; + @Getter + private static String defaultPortalMissingMessage; + @Getter + private static boolean reducedParticlesMode; + @Getter + private static boolean noParticlesMode; + @Getter + private static String insufficientCurrencyForWormholeMessage; + + public WormholesConfig() { + super("Wormholes.yml"); + } + + @Override + public void initializeValues() { + dungeonNotInstalledMessage = ConfigurationEngine.setString( + List.of("Sets the message that appears when a teleport is used for a dungeon that is not installed."), + file, fileConfiguration, "dungeonNotInstalledMessage", "&8[EliteMobs] &cDungeon $dungeonID &cis not installed! This teleport will not work.", true); + defaultPortalMissingMessage = ConfigurationEngine.setString( + List.of("Sets the message that appears when a wormhole is used for a dungeon that is not installed."), + file, fileConfiguration, "defaultPortalMissingMessage", "&8[EliteMobs] &cThis portal doesn't seem to lead anywhere!", true); + reducedParticlesMode = ConfigurationEngine.setBoolean( + List.of("Sets if the reduced particles mode for wormholes is used. This is especially recommended if you are allowing bedrock clients in."), + fileConfiguration, "reducedParticlesMode", true); + noParticlesMode = ConfigurationEngine.setBoolean( + List.of("Sets if wormholes don't use particles at all. Not recommended, but might be necessary for really bad bedrock clients."), + fileConfiguration, "noParticlesMode", false); + insufficientCurrencyForWormholeMessage = ConfigurationEngine.setString( + List.of("Sets the message that is sent when a player tries to use a wormhole but does not have enough currency to use it."), + file, fileConfiguration, "insufficientCurrencyForWormholeMessage", "&8[EliteMobs] &cInsufficient currency! You need $amount to use this wormhole!", true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/commands/CommandsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/commands/CommandsConfig.java new file mode 100644 index 000000000..ce53ee642 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/commands/CommandsConfig.java @@ -0,0 +1,46 @@ +package com.magmaguy.elitemobs.config.commands; + +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.commands.premade.CheckTierConfig; +import com.magmaguy.elitemobs.config.commands.premade.CheckTierOthersConfig; +import org.bukkit.configuration.file.FileConfiguration; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class CommandsConfig { + + private static final ArrayList commandsConfigFields = new ArrayList<>(new ArrayList<>(List.of( + new CheckTierConfig(), + new CheckTierOthersConfig() + ))); + + private CommandsConfig() { + + } + + public static void initializeConfigs() { + //Checks if the directory doesn't exist + for (CommandsConfigFields commandsConfigFields : commandsConfigFields) + initializeConfiguration(commandsConfigFields); + } + + /** + * Initializes a single instance of a premade configuration using the default values. + * + * @param commandsConfigFields + * @return + */ + private static FileConfiguration initializeConfiguration(CommandsConfigFields commandsConfigFields) { + + File file = ConfigurationEngine.fileCreator("commands", commandsConfigFields.getFileName()); + FileConfiguration fileConfiguration = ConfigurationEngine.fileConfigurationCreator(file); + commandsConfigFields.generateConfigDefaults(file, fileConfiguration); + ConfigurationEngine.fileSaverOnlyDefaults(fileConfiguration, file); + + return fileConfiguration; + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/commands/CommandsConfigFields.java b/src/main/java/com/magmaguy/elitemobs/config/commands/CommandsConfigFields.java new file mode 100644 index 000000000..7395f5b74 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/commands/CommandsConfigFields.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.config.commands; + +import org.bukkit.configuration.file.FileConfiguration; + +import java.io.File; + +public class CommandsConfigFields { + + private String fileName; + + public CommandsConfigFields(String fileName) { + this.fileName = fileName + ".yml"; + } + + public CommandsConfigFields(FileConfiguration configuration) { + + } + + public void generateConfigDefaults(File file, FileConfiguration fileConfiguration) { + } + + public String getFileName() { + return fileName; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/commands/premade/CheckTierConfig.java b/src/main/java/com/magmaguy/elitemobs/config/commands/premade/CheckTierConfig.java new file mode 100644 index 000000000..aac1cae31 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/commands/premade/CheckTierConfig.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.config.commands.premade; + +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.commands.CommandsConfigFields; +import org.bukkit.configuration.file.FileConfiguration; + +import java.io.File; + +public class CheckTierConfig extends CommandsConfigFields { + public static String message1, message2, message3, noPermMessage; + + public CheckTierConfig() { + super("check_tier"); + } + + @Override + public void generateConfigDefaults(File file, FileConfiguration fileConfiguration) { + message1 = ConfigurationEngine.setString(file, fileConfiguration, "message1", "&7[EM] Your combat tier is $tier", true); + message2 = ConfigurationEngine.setString(file, fileConfiguration, "message2", "&7[EM] Your guild tier bonus is $tier", true); + message3 = ConfigurationEngine.setString(file, fileConfiguration, "message3", "&7[EM] &aYour total threat tier is $tier", true); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/commands/premade/CheckTierOthersConfig.java b/src/main/java/com/magmaguy/elitemobs/config/commands/premade/CheckTierOthersConfig.java new file mode 100644 index 000000000..5fb50b118 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/commands/premade/CheckTierOthersConfig.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.config.commands.premade; + +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.commands.CommandsConfigFields; +import org.bukkit.configuration.file.FileConfiguration; + +import java.io.File; + +public class CheckTierOthersConfig extends CommandsConfigFields { + public static String message1, message2, message3, noPermMessage; + + public CheckTierOthersConfig() { + super("check_tier_others"); + } + + @Override + public void generateConfigDefaults(File file, FileConfiguration fileConfiguration) { + message1 = ConfigurationEngine.setString(file, fileConfiguration, "message1", "&7[EM] $player's combat tier is $tier", true); + message2 = ConfigurationEngine.setString(file, fileConfiguration, "message2", "&7[EM] $player's guild tier bonus is $tier", true); + message3 = ConfigurationEngine.setString(file, fileConfiguration, "message3", "&7[EM] &a$player's total threat tier is $tier", true); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customarenas/CustomArenasConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customarenas/CustomArenasConfig.java new file mode 100644 index 000000000..ec86cfb9c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customarenas/CustomArenasConfig.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.config.customarenas; + +import com.magmaguy.elitemobs.instanced.arena.ArenaInstance; +import com.magmaguy.magmacore.config.CustomConfig; + +import java.util.HashMap; + +public class CustomArenasConfig extends CustomConfig { + + private static HashMap customArenas; + + public CustomArenasConfig() { + super("customarenas", "com.magmaguy.elitemobs.config.customarenas.premade", CustomArenasConfigFields.class); + customArenas = new HashMap<>(); + for (String key : super.getCustomConfigFieldsHashMap().keySet()) + if (super.getCustomConfigFieldsHashMap().get(key).isEnabled()) { + customArenas.put(key, (CustomArenasConfigFields) super.getCustomConfigFieldsHashMap().get(key)); + ArenaInstance.initializeArena((CustomArenasConfigFields) super.getCustomConfigFieldsHashMap().get(key)); + } + } + + public static CustomArenasConfigFields getCustomArena(String string) { + return customArenas.get(string); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customarenas/CustomArenasConfigFields.java b/src/main/java/com/magmaguy/elitemobs/config/customarenas/CustomArenasConfigFields.java new file mode 100644 index 000000000..2ae2f1f42 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customarenas/CustomArenasConfigFields.java @@ -0,0 +1,91 @@ +package com.magmaguy.elitemobs.config.customarenas; + +import com.magmaguy.elitemobs.config.CustomConfigFields; +import com.magmaguy.elitemobs.items.customloottable.CustomLootTable; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Location; + +import java.util.ArrayList; +import java.util.List; + +public class CustomArenasConfigFields extends CustomConfigFields { + + @Getter + @Setter + private String arenaName; + @Getter + @Setter + private String corner1; + @Getter + @Setter + private String corner2; + @Getter + @Setter + private String startLocation; + @Getter + @Setter + private String exitLocation; + @Getter + @Setter + private int waveCount; + @Getter + @Setter + private int delayBetweenWaves; + @Getter + @Setter + private List spawnPoints = new ArrayList<>(); + @Getter + @Setter + private List bossList = new ArrayList<>(); + @Getter + @Setter + private List rawArenaRewards = new ArrayList<>(); + @Getter + @Setter + private CustomLootTable arenaRewards; + @Getter + @Setter + private int minimumPlayerCount = 1; + @Getter + @Setter + private int maximumPlayerCount; + @Getter + @Setter + private List arenaMessages = new ArrayList<>(); + @Getter + @Setter + private boolean cylindricalArena = false; + @Getter + @Setter + private String permission = null; + @Getter + private Location teleportLocation = null; + + public CustomArenasConfigFields(String filename, boolean isEnabled) { + super(filename, isEnabled); + } + + @Override + public void processConfigFields() { + this.isEnabled = processBoolean("isEnabled", isEnabled, true, true); + this.arenaName = translatable(filename, "arenaName", processString("arenaName", arenaName, "Default name", false)); + this.corner1 = processString("corner1", corner1, null, false); + this.corner2 = processString("corner2", corner2, null, false); + this.startLocation = processString("startLocation", startLocation, null, false); + this.exitLocation = processString("exitLocation", exitLocation, null, false); + this.waveCount = processInt("waveCount", waveCount, 0, false); + this.delayBetweenWaves = processInt("delayBetweenWaves", delayBetweenWaves, 0, false); + this.spawnPoints = processStringList("spawnPoints", spawnPoints, new ArrayList<>(), false); + this.bossList = processStringList("bossList", bossList, new ArrayList<>(), false); + this.rawArenaRewards = processStringList("rawArenaReward", rawArenaRewards, new ArrayList<>(), false); + arenaRewards = new CustomLootTable(this); + this.minimumPlayerCount = processInt("minimumPlayerCount", minimumPlayerCount, 1, false); + this.maximumPlayerCount = processInt("maximumPlayerCount", maximumPlayerCount, 100, false); + this.arenaMessages = translatable(filename, "arenaMessages", processStringList("arenaMessages", arenaMessages, new ArrayList<>(), false)); + this.cylindricalArena = processBoolean("cylindricalArena", cylindricalArena, false, false); + this.permission = processString("permission", permission, null, false); + this.teleportLocation = processLocation("teleportLocation", teleportLocation, null, false); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customarenas/premade/WoodLeagueArena.java b/src/main/java/com/magmaguy/elitemobs/config/customarenas/premade/WoodLeagueArena.java new file mode 100644 index 000000000..e8a03f797 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customarenas/premade/WoodLeagueArena.java @@ -0,0 +1,814 @@ +package com.magmaguy.elitemobs.config.customarenas.premade; + +import com.magmaguy.elitemobs.config.customarenas.CustomArenasConfigFields; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueArena extends CustomArenasConfigFields { + public WoodLeagueArena() { + super("wood_league", true); + super.setArenaName("Wood League"); + super.setCorner1("em_adventurers_guild,257,69,333,0,0"); + super.setCorner2("em_adventurers_guild,181,91,257,0,0"); + super.setStartLocation("em_adventurers_guild,219.5,70,295.5,0,0"); + super.setExitLocation("em_adventurers_guild,242.5,92,269.5,84,0"); + super.setWaveCount(50); + super.setBossList(new ArrayList<>(List.of( + "wave=1:spawnPoint=north:boss=wood_league_wave_1_melee.yml", + "wave=1:spawnPoint=north:boss=wood_league_wave_1_melee.yml", + "wave=1:spawnPoint=north:boss=wood_league_wave_1_ranged.yml", + + "wave=2:spawnPoint=north:boss=wood_league_wave_2_melee.yml", + "wave=2:spawnPoint=north:boss=wood_league_wave_2_melee.yml", + "wave=2:spawnPoint=north:boss=wood_league_wave_2_ranged.yml", + "wave=2:spawnPoint=south:boss=wood_league_wave_2_melee.yml", + "wave=2:spawnPoint=south:boss=wood_league_wave_2_melee.yml", + "wave=2:spawnPoint=south:boss=wood_league_wave_2_ranged.yml", + + "wave=3:spawnPoint=north:boss=wood_league_wave_3_melee.yml", + "wave=3:spawnPoint=north:boss=wood_league_wave_3_melee.yml", + "wave=3:spawnPoint=north:boss=wood_league_wave_3_ranged.yml", + "wave=3:spawnPoint=south:boss=wood_league_wave_3_melee.yml", + "wave=3:spawnPoint=south:boss=wood_league_wave_3_melee.yml", + "wave=3:spawnPoint=south:boss=wood_league_wave_3_ranged.yml", + + "wave=4:spawnPoint=north:boss=wood_league_wave_4_melee.yml", + "wave=4:spawnPoint=north:boss=wood_league_wave_4_melee.yml", + "wave=4:spawnPoint=north:boss=wood_league_wave_4_ranged.yml", + "wave=4:spawnPoint=south:boss=wood_league_wave_4_melee.yml", + "wave=4:spawnPoint=south:boss=wood_league_wave_4_melee.yml", + "wave=4:spawnPoint=south:boss=wood_league_wave_4_ranged.yml", + + "wave=5:spawnPoint=center:boss=wood_league_wave_5_miniboss.yml", + + "wave=6:spawnPoint=north:boss=wood_league_wave_6_melee.yml", + "wave=6:spawnPoint=north:boss=wood_league_wave_6_melee.yml", + "wave=6:spawnPoint=north:boss=wood_league_wave_6_ranged.yml", + "wave=6:spawnPoint=south:boss=wood_league_wave_6_melee.yml", + "wave=6:spawnPoint=south:boss=wood_league_wave_6_melee.yml", + "wave=6:spawnPoint=south:boss=wood_league_wave_6_ranged.yml", + "wave=6:spawnPoint=east:boss=wood_league_wave_6_melee.yml", + "wave=6:spawnPoint=east:boss=wood_league_wave_6_melee.yml", + "wave=6:spawnPoint=east:boss=wood_league_wave_6_ranged.yml", + "wave=6:spawnPoint=west:boss=wood_league_wave_6_melee.yml", + "wave=6:spawnPoint=west:boss=wood_league_wave_6_melee.yml", + "wave=6:spawnPoint=west:boss=wood_league_wave_6_ranged.yml", + + "wave=7:spawnPoint=north:boss=wood_league_wave_7_melee.yml", + "wave=7:spawnPoint=north:boss=wood_league_wave_7_melee.yml", + "wave=7:spawnPoint=north:boss=wood_league_wave_7_ranged.yml", + "wave=7:spawnPoint=south:boss=wood_league_wave_7_melee.yml", + "wave=7:spawnPoint=south:boss=wood_league_wave_7_melee.yml", + "wave=7:spawnPoint=south:boss=wood_league_wave_7_ranged.yml", + + "wave=8:spawnPoint=north:boss=wood_league_wave_8_melee.yml", + "wave=8:spawnPoint=north:boss=wood_league_wave_8_melee.yml", + "wave=8:spawnPoint=north:boss=wood_league_wave_8_melee.yml", + "wave=8:spawnPoint=south:boss=wood_league_wave_8_melee.yml", + "wave=8:spawnPoint=south:boss=wood_league_wave_8_melee.yml", + "wave=8:spawnPoint=south:boss=wood_league_wave_8_melee.yml", + + "wave=9:spawnPoint=north:boss=wood_league_wave_9_ranged.yml", + "wave=9:spawnPoint=north:boss=wood_league_wave_9_ranged.yml", + "wave=9:spawnPoint=north:boss=wood_league_wave_9_ranged.yml", + "wave=9:spawnPoint=south:boss=wood_league_wave_9_ranged.yml", + "wave=9:spawnPoint=south:boss=wood_league_wave_9_ranged.yml", + "wave=9:spawnPoint=south:boss=wood_league_wave_9_ranged.yml", + + "wave=10:spawnPoint=center:boss=wood_league_wave_10_boss.yml", + + "wave=11:spawnPoint=north:boss=wood_league_wave_11_melee.yml", + "wave=11:spawnPoint=north:boss=wood_league_wave_11_melee.yml", + "wave=11:spawnPoint=north:boss=wood_league_wave_11_ranged.yml", + "wave=11:spawnPoint=south:boss=wood_league_wave_11_melee.yml", + "wave=11:spawnPoint=south:boss=wood_league_wave_11_melee.yml", + "wave=11:spawnPoint=south:boss=wood_league_wave_11_ranged.yml", + + "wave=12:spawnPoint=north:boss=wood_league_wave_12_melee.yml", + "wave=12:spawnPoint=north:boss=wood_league_wave_12_melee.yml", + "wave=12:spawnPoint=north:boss=wood_league_wave_12_ranged.yml", + "wave=12:spawnPoint=south:boss=wood_league_wave_12_melee.yml", + "wave=12:spawnPoint=south:boss=wood_league_wave_12_melee.yml", + "wave=12:spawnPoint=south:boss=wood_league_wave_12_ranged.yml", + "wave=12:spawnPoint=east:boss=wood_league_wave_12_melee.yml", + "wave=12:spawnPoint=east:boss=wood_league_wave_12_melee.yml", + "wave=12:spawnPoint=east:boss=wood_league_wave_12_ranged.yml", + + "wave=13:spawnPoint=north:boss=wood_league_wave_13_melee.yml", + "wave=13:spawnPoint=north:boss=wood_league_wave_13_melee.yml", + "wave=13:spawnPoint=north:boss=wood_league_wave_13_ranged.yml", + "wave=13:spawnPoint=south:boss=wood_league_wave_13_melee.yml", + "wave=13:spawnPoint=south:boss=wood_league_wave_13_melee.yml", + "wave=13:spawnPoint=south:boss=wood_league_wave_13_ranged.yml", + "wave=13:spawnPoint=east:boss=wood_league_wave_13_melee.yml", + "wave=13:spawnPoint=east:boss=wood_league_wave_13_melee.yml", + "wave=13:spawnPoint=east:boss=wood_league_wave_13_ranged.yml", + + "wave=14:spawnPoint=north:boss=wood_league_wave_14_melee.yml", + "wave=14:spawnPoint=north:boss=wood_league_wave_14_melee.yml", + "wave=14:spawnPoint=north:boss=wood_league_wave_14_ranged.yml", + "wave=14:spawnPoint=south:boss=wood_league_wave_14_melee.yml", + "wave=14:spawnPoint=south:boss=wood_league_wave_14_melee.yml", + "wave=14:spawnPoint=south:boss=wood_league_wave_14_ranged.yml", + "wave=14:spawnPoint=east:boss=wood_league_wave_14_melee.yml", + "wave=14:spawnPoint=east:boss=wood_league_wave_14_melee.yml", + "wave=14:spawnPoint=east:boss=wood_league_wave_14_ranged.yml", + + "wave=15:spawnPoint=center:boss=wood_league_wave_15_miniboss.yml", + + "wave=16:spawnPoint=north:boss=wood_league_wave_16_melee.yml", + "wave=16:spawnPoint=north:boss=wood_league_wave_16_melee.yml", + "wave=16:spawnPoint=north:boss=wood_league_wave_16_ranged.yml", + "wave=16:spawnPoint=south:boss=wood_league_wave_16_melee.yml", + "wave=16:spawnPoint=south:boss=wood_league_wave_16_melee.yml", + "wave=16:spawnPoint=south:boss=wood_league_wave_16_ranged.yml", + "wave=16:spawnPoint=east:boss=wood_league_wave_16_melee.yml", + "wave=16:spawnPoint=east:boss=wood_league_wave_16_melee.yml", + "wave=16:spawnPoint=east:boss=wood_league_wave_16_ranged.yml", + "wave=16:spawnPoint=west:boss=wood_league_wave_16_melee.yml", + "wave=16:spawnPoint=west:boss=wood_league_wave_16_melee.yml", + "wave=16:spawnPoint=west:boss=wood_league_wave_16_ranged.yml", + "wave=16:spawnPoint=northeast:boss=wood_league_wave_16_melee.yml", + "wave=16:spawnPoint=northeast:boss=wood_league_wave_16_melee.yml", + "wave=16:spawnPoint=northeast:boss=wood_league_wave_16_ranged.yml", + + "wave=17:spawnPoint=north:boss=wood_league_wave_17_melee.yml", + "wave=17:spawnPoint=north:boss=wood_league_wave_17_melee.yml", + "wave=17:spawnPoint=north:boss=wood_league_wave_17_ranged.yml", + "wave=17:spawnPoint=south:boss=wood_league_wave_17_melee.yml", + "wave=17:spawnPoint=south:boss=wood_league_wave_17_melee.yml", + "wave=17:spawnPoint=south:boss=wood_league_wave_17_ranged.yml", + "wave=17:spawnPoint=east:boss=wood_league_wave_17_melee.yml", + "wave=17:spawnPoint=east:boss=wood_league_wave_17_melee.yml", + "wave=17:spawnPoint=east:boss=wood_league_wave_17_ranged.yml", + + "wave=18:spawnPoint=north:boss=wood_league_wave_18_melee.yml", + "wave=18:spawnPoint=north:boss=wood_league_wave_18_melee.yml", + "wave=18:spawnPoint=north:boss=wood_league_wave_18_melee.yml", + "wave=18:spawnPoint=south:boss=wood_league_wave_18_melee.yml", + "wave=18:spawnPoint=south:boss=wood_league_wave_18_melee.yml", + "wave=18:spawnPoint=south:boss=wood_league_wave_18_melee.yml", + "wave=18:spawnPoint=east:boss=wood_league_wave_18_melee.yml", + "wave=18:spawnPoint=east:boss=wood_league_wave_18_melee.yml", + "wave=18:spawnPoint=east:boss=wood_league_wave_18_melee.yml", + + "wave=19:spawnPoint=north:boss=wood_league_wave_19_ranged.yml", + "wave=19:spawnPoint=north:boss=wood_league_wave_19_ranged.yml", + "wave=19:spawnPoint=north:boss=wood_league_wave_19_ranged.yml", + "wave=19:spawnPoint=south:boss=wood_league_wave_19_ranged.yml", + "wave=19:spawnPoint=south:boss=wood_league_wave_19_ranged.yml", + "wave=19:spawnPoint=south:boss=wood_league_wave_19_ranged.yml", + "wave=19:spawnPoint=east:boss=wood_league_wave_19_ranged.yml", + "wave=19:spawnPoint=east:boss=wood_league_wave_19_ranged.yml", + "wave=19:spawnPoint=east:boss=wood_league_wave_19_ranged.yml", + + "wave=20:spawnPoint=center:boss=wood_league_wave_20_boss.yml", + + "wave=21:spawnPoint=north:boss=wood_league_wave_21_melee.yml", + "wave=21:spawnPoint=north:boss=wood_league_wave_21_melee.yml", + "wave=21:spawnPoint=north:boss=wood_league_wave_21_ranged.yml", + "wave=21:spawnPoint=south:boss=wood_league_wave_21_melee.yml", + "wave=21:spawnPoint=south:boss=wood_league_wave_21_melee.yml", + "wave=21:spawnPoint=south:boss=wood_league_wave_21_ranged.yml", + "wave=21:spawnPoint=east:boss=wood_league_wave_21_melee.yml", + "wave=21:spawnPoint=east:boss=wood_league_wave_21_melee.yml", + "wave=21:spawnPoint=east:boss=wood_league_wave_21_ranged.yml", + + "wave=22:spawnPoint=north:boss=wood_league_wave_22_melee.yml", + "wave=22:spawnPoint=north:boss=wood_league_wave_22_melee.yml", + "wave=22:spawnPoint=north:boss=wood_league_wave_22_ranged.yml", + "wave=22:spawnPoint=south:boss=wood_league_wave_22_melee.yml", + "wave=22:spawnPoint=south:boss=wood_league_wave_22_melee.yml", + "wave=22:spawnPoint=south:boss=wood_league_wave_22_ranged.yml", + "wave=22:spawnPoint=east:boss=wood_league_wave_22_melee.yml", + "wave=22:spawnPoint=east:boss=wood_league_wave_22_melee.yml", + "wave=22:spawnPoint=east:boss=wood_league_wave_22_ranged.yml", + "wave=22:spawnPoint=west:boss=wood_league_wave_22_melee.yml", + "wave=22:spawnPoint=west:boss=wood_league_wave_22_melee.yml", + "wave=22:spawnPoint=west:boss=wood_league_wave_22_ranged.yml", + + "wave=23:spawnPoint=north:boss=wood_league_wave_23_melee.yml", + "wave=23:spawnPoint=north:boss=wood_league_wave_23_melee.yml", + "wave=23:spawnPoint=north:boss=wood_league_wave_23_ranged.yml", + "wave=23:spawnPoint=south:boss=wood_league_wave_23_melee.yml", + "wave=23:spawnPoint=south:boss=wood_league_wave_23_melee.yml", + "wave=23:spawnPoint=south:boss=wood_league_wave_23_ranged.yml", + "wave=23:spawnPoint=east:boss=wood_league_wave_23_melee.yml", + "wave=23:spawnPoint=east:boss=wood_league_wave_23_melee.yml", + "wave=23:spawnPoint=east:boss=wood_league_wave_23_ranged.yml", + "wave=23:spawnPoint=west:boss=wood_league_wave_23_melee.yml", + "wave=23:spawnPoint=west:boss=wood_league_wave_23_melee.yml", + "wave=23:spawnPoint=west:boss=wood_league_wave_23_ranged.yml", + + "wave=24:spawnPoint=north:boss=wood_league_wave_24_melee.yml", + "wave=24:spawnPoint=north:boss=wood_league_wave_24_melee.yml", + "wave=24:spawnPoint=north:boss=wood_league_wave_24_ranged.yml", + "wave=24:spawnPoint=south:boss=wood_league_wave_24_melee.yml", + "wave=24:spawnPoint=south:boss=wood_league_wave_24_melee.yml", + "wave=24:spawnPoint=south:boss=wood_league_wave_24_ranged.yml", + "wave=24:spawnPoint=east:boss=wood_league_wave_24_melee.yml", + "wave=24:spawnPoint=east:boss=wood_league_wave_24_melee.yml", + "wave=24:spawnPoint=east:boss=wood_league_wave_24_ranged.yml", + "wave=24:spawnPoint=west:boss=wood_league_wave_24_melee.yml", + "wave=24:spawnPoint=west:boss=wood_league_wave_24_melee.yml", + "wave=24:spawnPoint=west:boss=wood_league_wave_24_ranged.yml", + + "wave=25:spawnPoint=center:boss=wood_league_wave_25_miniboss.yml", + + "wave=26:spawnPoint=north:boss=wood_league_wave_26_melee.yml", + "wave=26:spawnPoint=north:boss=wood_league_wave_26_melee.yml", + "wave=26:spawnPoint=north:boss=wood_league_wave_26_ranged.yml", + "wave=26:spawnPoint=south:boss=wood_league_wave_26_melee.yml", + "wave=26:spawnPoint=south:boss=wood_league_wave_26_melee.yml", + "wave=26:spawnPoint=south:boss=wood_league_wave_26_ranged.yml", + "wave=26:spawnPoint=east:boss=wood_league_wave_26_melee.yml", + "wave=26:spawnPoint=east:boss=wood_league_wave_26_melee.yml", + "wave=26:spawnPoint=east:boss=wood_league_wave_26_ranged.yml", + "wave=26:spawnPoint=west:boss=wood_league_wave_26_melee.yml", + "wave=26:spawnPoint=west:boss=wood_league_wave_26_melee.yml", + "wave=26:spawnPoint=west:boss=wood_league_wave_26_ranged.yml", + "wave=26:spawnPoint=northeast:boss=wood_league_wave_26_melee.yml", + "wave=26:spawnPoint=northeast:boss=wood_league_wave_26_melee.yml", + "wave=26:spawnPoint=northeast:boss=wood_league_wave_26_ranged.yml", + "wave=26:spawnPoint=southwest:boss=wood_league_wave_26_melee.yml", + "wave=26:spawnPoint=southwest:boss=wood_league_wave_26_melee.yml", + "wave=26:spawnPoint=southwest:boss=wood_league_wave_26_ranged.yml", + + "wave=27:spawnPoint=north:boss=wood_league_wave_27_melee.yml", + "wave=27:spawnPoint=north:boss=wood_league_wave_27_melee.yml", + "wave=27:spawnPoint=north:boss=wood_league_wave_27_ranged.yml", + "wave=27:spawnPoint=south:boss=wood_league_wave_27_melee.yml", + "wave=27:spawnPoint=south:boss=wood_league_wave_27_melee.yml", + "wave=27:spawnPoint=south:boss=wood_league_wave_27_ranged.yml", + "wave=27:spawnPoint=east:boss=wood_league_wave_27_melee.yml", + "wave=27:spawnPoint=east:boss=wood_league_wave_27_melee.yml", + "wave=27:spawnPoint=east:boss=wood_league_wave_27_ranged.yml", + "wave=27:spawnPoint=west:boss=wood_league_wave_27_melee.yml", + "wave=27:spawnPoint=west:boss=wood_league_wave_27_melee.yml", + "wave=27:spawnPoint=west:boss=wood_league_wave_27_ranged.yml", + + "wave=28:spawnPoint=north:boss=wood_league_wave_28_melee.yml", + "wave=28:spawnPoint=north:boss=wood_league_wave_28_melee.yml", + "wave=28:spawnPoint=north:boss=wood_league_wave_28_melee.yml", + "wave=28:spawnPoint=south:boss=wood_league_wave_28_melee.yml", + "wave=28:spawnPoint=south:boss=wood_league_wave_28_melee.yml", + "wave=28:spawnPoint=south:boss=wood_league_wave_28_melee.yml", + "wave=28:spawnPoint=east:boss=wood_league_wave_28_melee.yml", + "wave=28:spawnPoint=east:boss=wood_league_wave_28_melee.yml", + "wave=28:spawnPoint=east:boss=wood_league_wave_28_melee.yml", + "wave=28:spawnPoint=west:boss=wood_league_wave_28_melee.yml", + "wave=28:spawnPoint=west:boss=wood_league_wave_28_melee.yml", + "wave=28:spawnPoint=west:boss=wood_league_wave_28_melee.yml", + + "wave=29:spawnPoint=north:boss=wood_league_wave_29_ranged.yml", + "wave=29:spawnPoint=north:boss=wood_league_wave_29_ranged.yml", + "wave=29:spawnPoint=north:boss=wood_league_wave_29_ranged.yml", + "wave=29:spawnPoint=south:boss=wood_league_wave_29_ranged.yml", + "wave=29:spawnPoint=south:boss=wood_league_wave_29_ranged.yml", + "wave=29:spawnPoint=south:boss=wood_league_wave_29_ranged.yml", + "wave=29:spawnPoint=east:boss=wood_league_wave_29_ranged.yml", + "wave=29:spawnPoint=east:boss=wood_league_wave_29_ranged.yml", + "wave=29:spawnPoint=east:boss=wood_league_wave_29_ranged.yml", + "wave=29:spawnPoint=west:boss=wood_league_wave_29_ranged.yml", + "wave=29:spawnPoint=west:boss=wood_league_wave_29_ranged.yml", + "wave=29:spawnPoint=west:boss=wood_league_wave_29_ranged.yml", + + "wave=30:spawnPoint=center:boss=wood_league_wave_30_boss.yml", + + "wave=31:spawnPoint=north:boss=wood_league_wave_31_ranged.yml", + "wave=31:spawnPoint=north:boss=wood_league_wave_31_melee.yml", + "wave=31:spawnPoint=north:boss=wood_league_wave_31_melee.yml", + "wave=31:spawnPoint=south:boss=wood_league_wave_31_ranged.yml", + "wave=31:spawnPoint=south:boss=wood_league_wave_31_melee.yml", + "wave=31:spawnPoint=south:boss=wood_league_wave_31_melee.yml", + "wave=31:spawnPoint=east:boss=wood_league_wave_31_ranged.yml", + "wave=31:spawnPoint=east:boss=wood_league_wave_31_melee.yml", + "wave=31:spawnPoint=east:boss=wood_league_wave_31_melee.yml", + "wave=31:spawnPoint=west:boss=wood_league_wave_31_ranged.yml", + "wave=31:spawnPoint=west:boss=wood_league_wave_31_melee.yml", + "wave=31:spawnPoint=west:boss=wood_league_wave_31_melee.yml", + + "wave=32:spawnPoint=north:boss=wood_league_wave_32_ranged.yml", + "wave=32:spawnPoint=north:boss=wood_league_wave_32_melee.yml", + "wave=32:spawnPoint=north:boss=wood_league_wave_32_melee.yml", + "wave=32:spawnPoint=south:boss=wood_league_wave_32_ranged.yml", + "wave=32:spawnPoint=south:boss=wood_league_wave_32_melee.yml", + "wave=32:spawnPoint=south:boss=wood_league_wave_32_melee.yml", + "wave=32:spawnPoint=east:boss=wood_league_wave_32_ranged.yml", + "wave=32:spawnPoint=east:boss=wood_league_wave_32_melee.yml", + "wave=32:spawnPoint=east:boss=wood_league_wave_32_melee.yml", + "wave=32:spawnPoint=west:boss=wood_league_wave_32_ranged.yml", + "wave=32:spawnPoint=west:boss=wood_league_wave_32_melee.yml", + "wave=32:spawnPoint=west:boss=wood_league_wave_32_melee.yml", + "wave=32:spawnPoint=northeast:boss=wood_league_wave_32_ranged.yml", + "wave=32:spawnPoint=northeast:boss=wood_league_wave_32_melee.yml", + "wave=32:spawnPoint=northeast:boss=wood_league_wave_32_melee.yml", + + "wave=33:spawnPoint=north:boss=wood_league_wave_33_ranged.yml", + "wave=33:spawnPoint=north:boss=wood_league_wave_33_melee.yml", + "wave=33:spawnPoint=north:boss=wood_league_wave_33_melee.yml", + "wave=33:spawnPoint=south:boss=wood_league_wave_33_ranged.yml", + "wave=33:spawnPoint=south:boss=wood_league_wave_33_melee.yml", + "wave=33:spawnPoint=south:boss=wood_league_wave_33_melee.yml", + "wave=33:spawnPoint=east:boss=wood_league_wave_33_ranged.yml", + "wave=33:spawnPoint=east:boss=wood_league_wave_33_melee.yml", + "wave=33:spawnPoint=east:boss=wood_league_wave_33_melee.yml", + "wave=33:spawnPoint=west:boss=wood_league_wave_33_ranged.yml", + "wave=33:spawnPoint=west:boss=wood_league_wave_33_melee.yml", + "wave=33:spawnPoint=west:boss=wood_league_wave_33_melee.yml", + "wave=33:spawnPoint=northeast:boss=wood_league_wave_33_ranged.yml", + "wave=33:spawnPoint=northeast:boss=wood_league_wave_33_melee.yml", + "wave=33:spawnPoint=northeast:boss=wood_league_wave_33_melee.yml", + + "wave=34:spawnPoint=north:boss=wood_league_wave_34_ranged.yml", + "wave=34:spawnPoint=north:boss=wood_league_wave_34_melee.yml", + "wave=34:spawnPoint=north:boss=wood_league_wave_34_melee.yml", + "wave=34:spawnPoint=south:boss=wood_league_wave_34_ranged.yml", + "wave=34:spawnPoint=south:boss=wood_league_wave_34_melee.yml", + "wave=34:spawnPoint=south:boss=wood_league_wave_34_melee.yml", + "wave=34:spawnPoint=east:boss=wood_league_wave_34_ranged.yml", + "wave=34:spawnPoint=east:boss=wood_league_wave_34_melee.yml", + "wave=34:spawnPoint=east:boss=wood_league_wave_34_melee.yml", + "wave=34:spawnPoint=west:boss=wood_league_wave_34_ranged.yml", + "wave=34:spawnPoint=west:boss=wood_league_wave_34_melee.yml", + "wave=34:spawnPoint=west:boss=wood_league_wave_34_melee.yml", + "wave=34:spawnPoint=northeast:boss=wood_league_wave_34_ranged.yml", + "wave=34:spawnPoint=northeast:boss=wood_league_wave_34_melee.yml", + "wave=34:spawnPoint=northeast:boss=wood_league_wave_34_melee.yml", + + "wave=35:spawnPoint=center:boss=wood_league_wave_35_miniboss.yml", + + "wave=36:spawnPoint=north:boss=wood_league_wave_36_ranged.yml", + "wave=36:spawnPoint=north:boss=wood_league_wave_36_melee.yml", + "wave=36:spawnPoint=north:boss=wood_league_wave_36_melee.yml", + "wave=36:spawnPoint=south:boss=wood_league_wave_36_ranged.yml", + "wave=36:spawnPoint=south:boss=wood_league_wave_36_melee.yml", + "wave=36:spawnPoint=south:boss=wood_league_wave_36_melee.yml", + "wave=36:spawnPoint=east:boss=wood_league_wave_36_ranged.yml", + "wave=36:spawnPoint=east:boss=wood_league_wave_36_melee.yml", + "wave=36:spawnPoint=east:boss=wood_league_wave_36_melee.yml", + "wave=36:spawnPoint=west:boss=wood_league_wave_36_ranged.yml", + "wave=36:spawnPoint=west:boss=wood_league_wave_36_melee.yml", + "wave=36:spawnPoint=west:boss=wood_league_wave_36_melee.yml", + "wave=36:spawnPoint=northeast:boss=wood_league_wave_36_ranged.yml", + "wave=36:spawnPoint=northeast:boss=wood_league_wave_36_melee.yml", + "wave=36:spawnPoint=northeast:boss=wood_league_wave_36_melee.yml", + "wave=36:spawnPoint=southwest:boss=wood_league_wave_36_ranged.yml", + "wave=36:spawnPoint=southwest:boss=wood_league_wave_36_melee.yml", + "wave=36:spawnPoint=southwest:boss=wood_league_wave_36_melee.yml", + "wave=36:spawnPoint=southeast:boss=wood_league_wave_36_ranged.yml", + "wave=36:spawnPoint=southeast:boss=wood_league_wave_36_melee.yml", + "wave=36:spawnPoint=southeast:boss=wood_league_wave_36_melee.yml", + + "wave=37:spawnPoint=north:boss=wood_league_wave_37_ranged.yml", + "wave=37:spawnPoint=north:boss=wood_league_wave_37_melee.yml", + "wave=37:spawnPoint=north:boss=wood_league_wave_37_melee.yml", + "wave=37:spawnPoint=south:boss=wood_league_wave_37_ranged.yml", + "wave=37:spawnPoint=south:boss=wood_league_wave_37_melee.yml", + "wave=37:spawnPoint=south:boss=wood_league_wave_37_melee.yml", + "wave=37:spawnPoint=east:boss=wood_league_wave_37_ranged.yml", + "wave=37:spawnPoint=east:boss=wood_league_wave_37_melee.yml", + "wave=37:spawnPoint=east:boss=wood_league_wave_37_melee.yml", + "wave=37:spawnPoint=west:boss=wood_league_wave_37_ranged.yml", + "wave=37:spawnPoint=west:boss=wood_league_wave_37_melee.yml", + "wave=37:spawnPoint=west:boss=wood_league_wave_37_melee.yml", + "wave=37:spawnPoint=northeast:boss=wood_league_wave_37_ranged.yml", + "wave=37:spawnPoint=northeast:boss=wood_league_wave_37_melee.yml", + "wave=37:spawnPoint=northeast:boss=wood_league_wave_37_melee.yml", + + "wave=38:spawnPoint=north:boss=wood_league_wave_38_melee.yml", + "wave=38:spawnPoint=north:boss=wood_league_wave_38_melee.yml", + "wave=38:spawnPoint=north:boss=wood_league_wave_38_melee.yml", + "wave=38:spawnPoint=south:boss=wood_league_wave_38_melee.yml", + "wave=38:spawnPoint=south:boss=wood_league_wave_38_melee.yml", + "wave=38:spawnPoint=south:boss=wood_league_wave_38_melee.yml", + "wave=38:spawnPoint=east:boss=wood_league_wave_38_melee.yml", + "wave=38:spawnPoint=east:boss=wood_league_wave_38_melee.yml", + "wave=38:spawnPoint=east:boss=wood_league_wave_38_melee.yml", + "wave=38:spawnPoint=west:boss=wood_league_wave_38_melee.yml", + "wave=38:spawnPoint=west:boss=wood_league_wave_38_melee.yml", + "wave=38:spawnPoint=west:boss=wood_league_wave_38_melee.yml", + "wave=38:spawnPoint=northeast:boss=wood_league_wave_38_melee.yml", + "wave=38:spawnPoint=northeast:boss=wood_league_wave_38_melee.yml", + "wave=38:spawnPoint=northeast:boss=wood_league_wave_38_melee.yml", + + "wave=39:spawnPoint=north:boss=wood_league_wave_39_ranged.yml", + "wave=39:spawnPoint=north:boss=wood_league_wave_39_ranged.yml", + "wave=39:spawnPoint=north:boss=wood_league_wave_39_ranged.yml", + "wave=39:spawnPoint=south:boss=wood_league_wave_39_ranged.yml", + "wave=39:spawnPoint=south:boss=wood_league_wave_39_ranged.yml", + "wave=39:spawnPoint=south:boss=wood_league_wave_39_ranged.yml", + "wave=39:spawnPoint=east:boss=wood_league_wave_39_ranged.yml", + "wave=39:spawnPoint=east:boss=wood_league_wave_39_ranged.yml", + "wave=39:spawnPoint=east:boss=wood_league_wave_39_ranged.yml", + "wave=39:spawnPoint=west:boss=wood_league_wave_39_ranged.yml", + "wave=39:spawnPoint=west:boss=wood_league_wave_39_ranged.yml", + "wave=39:spawnPoint=west:boss=wood_league_wave_39_ranged.yml", + "wave=39:spawnPoint=northeast:boss=wood_league_wave_39_ranged.yml", + "wave=39:spawnPoint=northeast:boss=wood_league_wave_39_ranged.yml", + "wave=39:spawnPoint=northeast:boss=wood_league_wave_39_ranged.yml", + + "wave=40:spawnPoint=center:boss=wood_league_wave_40_boss.yml", + + "wave=41:spawnPoint=north:boss=wood_league_wave_41_ranged.yml", + "wave=41:spawnPoint=north:boss=wood_league_wave_41_melee.yml", + "wave=41:spawnPoint=north:boss=wood_league_wave_41_melee.yml", + "wave=41:spawnPoint=south:boss=wood_league_wave_41_ranged.yml", + "wave=41:spawnPoint=south:boss=wood_league_wave_41_melee.yml", + "wave=41:spawnPoint=south:boss=wood_league_wave_41_melee.yml", + "wave=41:spawnPoint=east:boss=wood_league_wave_41_ranged.yml", + "wave=41:spawnPoint=east:boss=wood_league_wave_41_melee.yml", + "wave=41:spawnPoint=east:boss=wood_league_wave_41_melee.yml", + "wave=41:spawnPoint=west:boss=wood_league_wave_41_ranged.yml", + "wave=41:spawnPoint=west:boss=wood_league_wave_41_melee.yml", + "wave=41:spawnPoint=west:boss=wood_league_wave_41_melee.yml", + "wave=41:spawnPoint=northeast:boss=wood_league_wave_41_ranged.yml", + "wave=41:spawnPoint=northeast:boss=wood_league_wave_41_melee.yml", + "wave=41:spawnPoint=northeast:boss=wood_league_wave_41_melee.yml", + + "wave=42:spawnPoint=north:boss=wood_league_wave_42_ranged.yml", + "wave=42:spawnPoint=north:boss=wood_league_wave_42_melee.yml", + "wave=42:spawnPoint=north:boss=wood_league_wave_42_melee.yml", + "wave=42:spawnPoint=north:boss=wood_league_wave_42_healer.yml", + "wave=42:spawnPoint=south:boss=wood_league_wave_42_ranged.yml", + "wave=42:spawnPoint=south:boss=wood_league_wave_42_melee.yml", + "wave=42:spawnPoint=south:boss=wood_league_wave_42_melee.yml", + "wave=42:spawnPoint=south:boss=wood_league_wave_42_healer.yml", + "wave=42:spawnPoint=east:boss=wood_league_wave_42_ranged.yml", + "wave=42:spawnPoint=east:boss=wood_league_wave_42_melee.yml", + "wave=42:spawnPoint=east:boss=wood_league_wave_42_melee.yml", + "wave=42:spawnPoint=east:boss=wood_league_wave_42_healer.yml", + "wave=42:spawnPoint=west:boss=wood_league_wave_42_ranged.yml", + "wave=42:spawnPoint=west:boss=wood_league_wave_42_melee.yml", + "wave=42:spawnPoint=west:boss=wood_league_wave_42_melee.yml", + "wave=42:spawnPoint=west:boss=wood_league_wave_42_healer.yml", + "wave=42:spawnPoint=northeast:boss=wood_league_wave_42_ranged.yml", + "wave=42:spawnPoint=northeast:boss=wood_league_wave_42_melee.yml", + "wave=42:spawnPoint=northeast:boss=wood_league_wave_42_melee.yml", + "wave=42:spawnPoint=northeast:boss=wood_league_wave_42_healer.yml", + "wave=42:spawnPoint=southwest:boss=wood_league_wave_42_ranged.yml", + "wave=42:spawnPoint=southwest:boss=wood_league_wave_42_melee.yml", + "wave=42:spawnPoint=southwest:boss=wood_league_wave_42_melee.yml", + "wave=42:spawnPoint=southwest:boss=wood_league_wave_42_healer.yml", + + "wave=43:spawnPoint=north:boss=wood_league_wave_43_ranged.yml", + "wave=43:spawnPoint=north:boss=wood_league_wave_43_melee.yml", + "wave=43:spawnPoint=north:boss=wood_league_wave_43_melee.yml", + "wave=43:spawnPoint=north:boss=wood_league_wave_43_healer.yml", + "wave=43:spawnPoint=south:boss=wood_league_wave_43_ranged.yml", + "wave=43:spawnPoint=south:boss=wood_league_wave_43_melee.yml", + "wave=43:spawnPoint=south:boss=wood_league_wave_43_melee.yml", + "wave=43:spawnPoint=south:boss=wood_league_wave_43_healer.yml", + "wave=43:spawnPoint=east:boss=wood_league_wave_43_ranged.yml", + "wave=43:spawnPoint=east:boss=wood_league_wave_43_melee.yml", + "wave=43:spawnPoint=east:boss=wood_league_wave_43_melee.yml", + "wave=43:spawnPoint=east:boss=wood_league_wave_43_healer.yml", + "wave=43:spawnPoint=west:boss=wood_league_wave_43_ranged.yml", + "wave=43:spawnPoint=west:boss=wood_league_wave_43_melee.yml", + "wave=43:spawnPoint=west:boss=wood_league_wave_43_melee.yml", + "wave=43:spawnPoint=west:boss=wood_league_wave_43_healer.yml", + "wave=43:spawnPoint=northeast:boss=wood_league_wave_43_ranged.yml", + "wave=43:spawnPoint=northeast:boss=wood_league_wave_43_melee.yml", + "wave=43:spawnPoint=northeast:boss=wood_league_wave_43_melee.yml", + "wave=43:spawnPoint=northeast:boss=wood_league_wave_43_healer.yml", + "wave=43:spawnPoint=southwest:boss=wood_league_wave_43_ranged.yml", + "wave=43:spawnPoint=southwest:boss=wood_league_wave_43_melee.yml", + "wave=43:spawnPoint=southwest:boss=wood_league_wave_43_melee.yml", + "wave=43:spawnPoint=southwest:boss=wood_league_wave_43_healer.yml", + + "wave=44:spawnPoint=north:boss=wood_league_wave_44_ranged.yml", + "wave=44:spawnPoint=north:boss=wood_league_wave_44_melee.yml", + "wave=44:spawnPoint=north:boss=wood_league_wave_44_melee.yml", + "wave=44:spawnPoint=north:boss=wood_league_wave_44_healer.yml", + "wave=44:spawnPoint=south:boss=wood_league_wave_44_ranged.yml", + "wave=44:spawnPoint=south:boss=wood_league_wave_44_melee.yml", + "wave=44:spawnPoint=south:boss=wood_league_wave_44_melee.yml", + "wave=44:spawnPoint=south:boss=wood_league_wave_44_healer.yml", + "wave=44:spawnPoint=east:boss=wood_league_wave_44_ranged.yml", + "wave=44:spawnPoint=east:boss=wood_league_wave_44_melee.yml", + "wave=44:spawnPoint=east:boss=wood_league_wave_44_melee.yml", + "wave=44:spawnPoint=east:boss=wood_league_wave_44_healer.yml", + "wave=44:spawnPoint=west:boss=wood_league_wave_44_ranged.yml", + "wave=44:spawnPoint=west:boss=wood_league_wave_44_melee.yml", + "wave=44:spawnPoint=west:boss=wood_league_wave_44_melee.yml", + "wave=44:spawnPoint=west:boss=wood_league_wave_44_healer.yml", + "wave=44:spawnPoint=northeast:boss=wood_league_wave_44_ranged.yml", + "wave=44:spawnPoint=northeast:boss=wood_league_wave_44_melee.yml", + "wave=44:spawnPoint=northeast:boss=wood_league_wave_44_melee.yml", + "wave=44:spawnPoint=northeast:boss=wood_league_wave_44_healer.yml", + "wave=44:spawnPoint=southwest:boss=wood_league_wave_44_ranged.yml", + "wave=44:spawnPoint=southwest:boss=wood_league_wave_44_melee.yml", + "wave=44:spawnPoint=southwest:boss=wood_league_wave_44_melee.yml", + "wave=44:spawnPoint=southwest:boss=wood_league_wave_44_healer.yml", + + "wave=45:spawnPoint=center:boss=wood_league_wave_45_miniboss.yml", + + "wave=46:spawnPoint=north:boss=wood_league_wave_46_ranged.yml", + "wave=46:spawnPoint=north:boss=wood_league_wave_46_melee.yml", + "wave=46:spawnPoint=north:boss=wood_league_wave_46_melee.yml", + "wave=46:spawnPoint=north:boss=wood_league_wave_46_healer.yml", + "wave=46:spawnPoint=south:boss=wood_league_wave_46_ranged.yml", + "wave=46:spawnPoint=south:boss=wood_league_wave_46_melee.yml", + "wave=46:spawnPoint=south:boss=wood_league_wave_46_melee.yml", + "wave=46:spawnPoint=south:boss=wood_league_wave_46_healer.yml", + "wave=46:spawnPoint=east:boss=wood_league_wave_46_ranged.yml", + "wave=46:spawnPoint=east:boss=wood_league_wave_46_melee.yml", + "wave=46:spawnPoint=east:boss=wood_league_wave_46_melee.yml", + "wave=46:spawnPoint=east:boss=wood_league_wave_46_healer.yml", + "wave=46:spawnPoint=west:boss=wood_league_wave_46_ranged.yml", + "wave=46:spawnPoint=west:boss=wood_league_wave_46_melee.yml", + "wave=46:spawnPoint=west:boss=wood_league_wave_46_melee.yml", + "wave=46:spawnPoint=west:boss=wood_league_wave_46_healer.yml", + "wave=46:spawnPoint=northeast:boss=wood_league_wave_46_ranged.yml", + "wave=46:spawnPoint=northeast:boss=wood_league_wave_46_melee.yml", + "wave=46:spawnPoint=northeast:boss=wood_league_wave_46_melee.yml", + "wave=46:spawnPoint=northeast:boss=wood_league_wave_46_healer.yml", + "wave=46:spawnPoint=southwest:boss=wood_league_wave_46_ranged.yml", + "wave=46:spawnPoint=southwest:boss=wood_league_wave_46_melee.yml", + "wave=46:spawnPoint=southwest:boss=wood_league_wave_46_melee.yml", + "wave=46:spawnPoint=southwest:boss=wood_league_wave_46_healer.yml", + "wave=46:spawnPoint=northwest:boss=wood_league_wave_46_ranged.yml", + "wave=46:spawnPoint=northwest:boss=wood_league_wave_46_melee.yml", + "wave=46:spawnPoint=northwest:boss=wood_league_wave_46_melee.yml", + "wave=46:spawnPoint=northwest:boss=wood_league_wave_46_healer.yml", + "wave=46:spawnPoint=southeast:boss=wood_league_wave_46_ranged.yml", + "wave=46:spawnPoint=southeast:boss=wood_league_wave_46_melee.yml", + "wave=46:spawnPoint=southeast:boss=wood_league_wave_46_melee.yml", + "wave=46:spawnPoint=southeast:boss=wood_league_wave_46_healer.yml", + + "wave=47:spawnPoint=north:boss=wood_league_wave_47_ranged.yml", + "wave=47:spawnPoint=north:boss=wood_league_wave_47_melee.yml", + "wave=47:spawnPoint=north:boss=wood_league_wave_47_melee.yml", + "wave=47:spawnPoint=north:boss=wood_league_wave_47_healer.yml", + "wave=47:spawnPoint=south:boss=wood_league_wave_47_ranged.yml", + "wave=47:spawnPoint=south:boss=wood_league_wave_47_melee.yml", + "wave=47:spawnPoint=south:boss=wood_league_wave_47_melee.yml", + "wave=47:spawnPoint=south:boss=wood_league_wave_47_healer.yml", + "wave=47:spawnPoint=east:boss=wood_league_wave_47_ranged.yml", + "wave=47:spawnPoint=east:boss=wood_league_wave_47_melee.yml", + "wave=47:spawnPoint=east:boss=wood_league_wave_47_melee.yml", + "wave=47:spawnPoint=east:boss=wood_league_wave_47_healer.yml", + "wave=47:spawnPoint=west:boss=wood_league_wave_47_ranged.yml", + "wave=47:spawnPoint=west:boss=wood_league_wave_47_melee.yml", + "wave=47:spawnPoint=west:boss=wood_league_wave_47_melee.yml", + "wave=47:spawnPoint=west:boss=wood_league_wave_47_healer.yml", + "wave=47:spawnPoint=northeast:boss=wood_league_wave_47_ranged.yml", + "wave=47:spawnPoint=northeast:boss=wood_league_wave_47_melee.yml", + "wave=47:spawnPoint=northeast:boss=wood_league_wave_47_melee.yml", + "wave=47:spawnPoint=northeast:boss=wood_league_wave_47_healer.yml", + "wave=47:spawnPoint=southwest:boss=wood_league_wave_47_ranged.yml", + "wave=47:spawnPoint=southwest:boss=wood_league_wave_47_melee.yml", + "wave=47:spawnPoint=southwest:boss=wood_league_wave_47_melee.yml", + "wave=47:spawnPoint=southwest:boss=wood_league_wave_47_healer.yml", + + "wave=48:spawnPoint=north:boss=wood_league_wave_48_melee.yml", + "wave=48:spawnPoint=north:boss=wood_league_wave_48_melee.yml", + "wave=48:spawnPoint=north:boss=wood_league_wave_48_melee.yml", + "wave=48:spawnPoint=north:boss=wood_league_wave_48_healer.yml", + "wave=48:spawnPoint=south:boss=wood_league_wave_48_melee.yml", + "wave=48:spawnPoint=south:boss=wood_league_wave_48_melee.yml", + "wave=48:spawnPoint=south:boss=wood_league_wave_48_melee.yml", + "wave=48:spawnPoint=south:boss=wood_league_wave_48_healer.yml", + "wave=48:spawnPoint=east:boss=wood_league_wave_48_melee.yml", + "wave=48:spawnPoint=east:boss=wood_league_wave_48_melee.yml", + "wave=48:spawnPoint=east:boss=wood_league_wave_48_melee.yml", + "wave=48:spawnPoint=east:boss=wood_league_wave_48_healer.yml", + "wave=48:spawnPoint=west:boss=wood_league_wave_48_melee.yml", + "wave=48:spawnPoint=west:boss=wood_league_wave_48_melee.yml", + "wave=48:spawnPoint=west:boss=wood_league_wave_48_melee.yml", + "wave=48:spawnPoint=west:boss=wood_league_wave_48_healer.yml", + "wave=48:spawnPoint=northeast:boss=wood_league_wave_48_melee.yml", + "wave=48:spawnPoint=northeast:boss=wood_league_wave_48_melee.yml", + "wave=48:spawnPoint=northeast:boss=wood_league_wave_48_melee.yml", + "wave=48:spawnPoint=northeast:boss=wood_league_wave_48_healer.yml", + "wave=48:spawnPoint=southwest:boss=wood_league_wave_48_melee.yml", + "wave=48:spawnPoint=southwest:boss=wood_league_wave_48_melee.yml", + "wave=48:spawnPoint=southwest:boss=wood_league_wave_48_melee.yml", + "wave=48:spawnPoint=southwest:boss=wood_league_wave_48_healer.yml", + + "wave=49:spawnPoint=north:boss=wood_league_wave_49_ranged.yml", + "wave=49:spawnPoint=north:boss=wood_league_wave_49_ranged.yml", + "wave=49:spawnPoint=north:boss=wood_league_wave_49_ranged.yml", + "wave=49:spawnPoint=north:boss=wood_league_wave_49_healer.yml", + "wave=49:spawnPoint=south:boss=wood_league_wave_49_ranged.yml", + "wave=49:spawnPoint=south:boss=wood_league_wave_49_ranged.yml", + "wave=49:spawnPoint=south:boss=wood_league_wave_49_ranged.yml", + "wave=49:spawnPoint=south:boss=wood_league_wave_49_healer.yml", + "wave=49:spawnPoint=east:boss=wood_league_wave_49_ranged.yml", + "wave=49:spawnPoint=east:boss=wood_league_wave_49_ranged.yml", + "wave=49:spawnPoint=east:boss=wood_league_wave_49_ranged.yml", + "wave=49:spawnPoint=east:boss=wood_league_wave_49_healer.yml", + "wave=49:spawnPoint=west:boss=wood_league_wave_49_ranged.yml", + "wave=49:spawnPoint=west:boss=wood_league_wave_49_ranged.yml", + "wave=49:spawnPoint=west:boss=wood_league_wave_49_ranged.yml", + "wave=49:spawnPoint=west:boss=wood_league_wave_49_healer.yml", + "wave=49:spawnPoint=northeast:boss=wood_league_wave_49_ranged.yml", + "wave=49:spawnPoint=northeast:boss=wood_league_wave_49_ranged.yml", + "wave=49:spawnPoint=northeast:boss=wood_league_wave_49_ranged.yml", + "wave=49:spawnPoint=northeast:boss=wood_league_wave_49_healer.yml", + "wave=49:spawnPoint=southwest:boss=wood_league_wave_49_ranged.yml", + "wave=49:spawnPoint=southwest:boss=wood_league_wave_49_ranged.yml", + "wave=49:spawnPoint=southwest:boss=wood_league_wave_49_ranged.yml", + "wave=49:spawnPoint=southwest:boss=wood_league_wave_49_healer.yml", + + "wave=50:spawnPoint=center:boss=wood_league_wave_50_boss.yml" + ))); + super.setSpawnPoints(new ArrayList<>(List.of( + "name=north:location=em_adventurers_guild,219.5,71,273.5", + "name=south:location=em_adventurers_guild,219.5,71,316.5", + "name=west:location=em_adventurers_guild,197.5,71,295.5", + "name=east:location=em_adventurers_guild,240.5,71,295.5", + "name=center:location=em_adventurers_guild,219.5,71,295.5", + "name=northeast:location=em_adventurers_guild,233.5,71,281.5", + "name=southeast:location=em_adventurers_guild,233.5,71,309.5", + "name=northwest:location=em_adventurers_guild,205.5,71,281.5", + "name=southwest:location=em_adventurers_guild,205.5,71,309.5"))); + + super.setDelayBetweenWaves(5); + super.setRawArenaRewards(new ArrayList<>(List.of( + "filename=enchanted_book_protection_environmental.yml:wave=10:chance=0.01", + "filename=enchanted_book_protection_environmental.yml:wave=10:chance=0.01", + "filename=enchanted_book_protection_environmental.yml:wave=10:chance=0.01", + "filename=enchanted_book_protection_environmental.yml:wave=10:chance=0.01", + "filename=enchanted_book_damage_all.yml:wave=10:chance=0.01", + "filename=enchanted_book_arrow_damage.yml:wave=10:chance=0.01", + "filename=enchanted_book_protection_environmental.yml:wave=20:chance=0.01", + "filename=enchanted_book_protection_environmental.yml:wave=20:chance=0.01", + "filename=enchanted_book_protection_environmental.yml:wave=20:chance=0.01", + "filename=enchanted_book_protection_environmental.yml:wave=20:chance=0.01", + "filename=enchanted_book_damage_all.yml:wave=20:chance=0.01", + "filename=enchanted_book_arrow_damage.yml:wave=20:chance=0.01", + "filename=enchanted_book_protection_environmental.yml:wave=30:chance=0.01", + "filename=enchanted_book_protection_environmental.yml:wave=30:chance=0.01", + "filename=enchanted_book_protection_environmental.yml:wave=30:chance=0.01", + "filename=enchanted_book_protection_environmental.yml:wave=30:chance=0.01", + "filename=enchanted_book_protection_environmental.yml:wave=30:chance=0.01", + "filename=enchanted_book_arrow_damage.yml:wave=30:chance=0.01", + "filename=enchanted_book_protection_environmental.yml:wave=40:chance=0.01", + "filename=enchanted_book_protection_environmental.yml:wave=40:chance=0.01", + "filename=enchanted_book_protection_environmental.yml:wave=40:chance=0.01", + "filename=enchanted_book_protection_environmental.yml:wave=40:chance=0.01", + "filename=enchanted_book_damage_all.yml:wave=40:chance=0.01", + "filename=enchanted_book_arrow_damage.yml:wave=40:chance=0.01", + "filename=enchanted_book_protection_environmental.yml:wave=50:chance=0.1", + "filename=enchanted_book_protection_environmental.yml:wave=50:chance=0.1", + "filename=enchanted_book_protection_environmental.yml:wave=50:chance=0.1", + "filename=enchanted_book_protection_environmental.yml:wave=50:chance=0.1", + "filename=enchanted_book_damage_all.yml:wave=50:chance=0.1", + "filename=enchanted_book_arrow_damage.yml:wave=50:chance=0.1", + + "filename=elite_scrap_tiny.yml:wave=5:chance=1:amount=5", + "filename=elite_scrap_tiny.yml:wave=10:chance=1:amount=5", + "filename=elite_scrap_small.yml:wave=15:chance=1:amount=5", + "filename=elite_scrap_small.yml:wave=20:chance=1:amount=5", + "filename=elite_scrap_small.yml:wave=25:chance=1:amount=5", + "filename=elite_scrap_large.yml:wave=30:chance=1:amount=5", + "filename=elite_scrap_large.yml:wave=35:chance=1:amount=5", + "filename=elite_scrap_large.yml:wave=40:chance=1:amount=5", + "filename=elite_scrap_large.yml:wave=45:chance=1:amount=5", + "filename=elite_scrap_huge.yml:wave=50:chance=1:amount=5", + + "currencyAmount=2:wave=1", + "currencyAmount=5:wave=2", + "currencyAmount=10:wave=3", + "currencyAmount=15:wave=4", + "currencyAmount=20:wave=5", + "currencyAmount=25:wave=6", + "currencyAmount=30:wave=7", + "currencyAmount=35:wave=8", + "currencyAmount=40:wave=9", + "currencyAmount=45:wave=10", + "currencyAmount=50:wave=11", + "currencyAmount=55:wave=12", + "currencyAmount=60:wave=13", + "currencyAmount=65:wave=14", + "currencyAmount=70:wave=15", + "currencyAmount=75:wave=16", + "currencyAmount=80:wave=17", + "currencyAmount=85:wave=18", + "currencyAmount=90:wave=19", + "currencyAmount=95:wave=20", + "currencyAmount=100:wave=21", + "currencyAmount=105:wave=22", + "currencyAmount=110:wave=23", + "currencyAmount=115:wave=24", + "currencyAmount=120:wave=25", + "currencyAmount=125:wave=26", + "currencyAmount=130:wave=27", + "currencyAmount=135:wave=28", + "currencyAmount=140:wave=29", + "currencyAmount=145:wave=30", + "currencyAmount=150:wave=31", + "currencyAmount=155:wave=32", + "currencyAmount=160:wave=33", + "currencyAmount=165:wave=34", + "currencyAmount=170:wave=35", + "currencyAmount=175:wave=36", + "currencyAmount=180:wave=37", + "currencyAmount=185:wave=38", + "currencyAmount=190:wave=39", + "currencyAmount=195:wave=40", + "currencyAmount=200:wave=41", + "currencyAmount=205:wave=42", + "currencyAmount=210:wave=43", + "currencyAmount=215:wave=44", + "currencyAmount=220:wave=45", + "currencyAmount=225:wave=46", + "currencyAmount=230:wave=47", + "currencyAmount=235:wave=48", + "currencyAmount=240:wave=49", + "currencyAmount=250:wave=50", + + "level=10:filename=summon_merchant_scroll.yml:wave=10", + + "filename=invictus_sword.yml:itemlevel=50:wave=50:chance=0.2", + "filename=invictus_helmet.yml:itemlevel=50:wave=50:chance=0.2", + "filename=invictus_chestplate.yml:itemlevel=50:wave=50:chance=0.2", + "filename=invictus_leggings.yml:itemlevel=50:wave=50:chance=0.2", + "filename=invictus_boots.yml:itemlevel=50:wave=50:chance=0.2", + "filename=invictus_pickaxe.yml:itemlevel=50:wave=50:chance=0.1", + "filename=invictus_shovel.yml:itemlevel=50:wave=50:chance=0.1", + + "filename=challengers_sword.yml:itemlevel=40:wave=40:chance=0.2", + "filename=challengers_helmet.yml:itemlevel=40:wave=40:chance=0.2", + "filename=challengers_chestplate.yml:itemlevel=40:wave=40:chance=0.2", + "filename=challengers_leggings.yml:itemlevel=40:wave=40:chance=0.2", + "filename=challengers_boots.yml:itemlevel=40:wave=40:chance=0.2", + + "filename=veterans_sword.yml:itemlevel=30:wave=30:chance=0.2", + "filename=veterans_helmet.yml:itemlevel=30:wave=30:chance=0.2", + "filename=veterans_chestplate.yml:itemlevel=30:wave=30:chance=0.2", + "filename=veterans_leggings.yml:itemlevel=30:wave=30:chance=0.2", + "filename=veterans_boots.yml:itemlevel=30:wave=30:chance=0.2", + + "filename=grunts_sword.yml:itemlevel=20:wave=20:chance=0.2", + "filename=grunts_helmet.yml:itemlevel=20:wave=20:chance=0.2", + "filename=grunts_chestplate.yml:itemlevel=20:wave=20:chance=0.2", + "filename=grunts_leggings.yml:itemlevel=20:wave=20:chance=0.2", + "filename=grunts_boots.yml:itemlevel=20:wave=20:chance=0.2", + + "filename=novices_sword.yml:itemlevel=10:wave=10:chance=0.2", + "filename=novices_helmet.yml:itemlevel=10:wave=10:chance=0.2", + "filename=novices_chestplate.yml:itemlevel=10:wave=10:chance=0.2", + "filename=novices_leggings.yml:itemlevel=10:wave=10:chance=0.2", + "filename=novices_boots.yml:itemlevel=10:wave=10:chance=0.2" + + ))); + super.setArenaMessages(new ArrayList<>(new ArrayList<>(List.of( + "wave=1:message=&8[Gladius] &fToday's main event! A legendary fighter came all the way to the arena to test his might against the toughest monsters from all the land! But before that, here's a rookie fighting some zombies.", + "wave=2:message=&8[Gladius] &fWould you look at that, they at least know how to wave their arms! That was just the warmup, let's start putting on some pressure!", + "wave=3:message=&8[Gladius] &fSo you think you know how to fight? Well this wave will put the &cheat &fon! Ha ha ha ha ha!", + "wave=4:message=&8[Gladius] &fAlright I guess they can take the heat! Ladies and gentlemen, strap on, we might be in for a show!", + "wave=5:message=&8[Gladius] &fI found this &cweird creature &foutside, and I thought putting it in the arena would be funny!", + "wave=6:message=&8[Gladius] &fSeems like you can handle small groups of enemies just fine, &clet's try scaling that up!", + "wave=7:message=&8[Gladius] &fSo you think you can truly challenge the arena? We shall see...", + "wave=8:message=&8[Gladius] &fNot bad, but what if every enemy is a &cmelee &fenemy?", + "wave=9:message=&8[Gladius] &fNice, nice, but what if they're all &cranged &finstead?", + "wave=10:message=&8[Gladius] &fCareful now, a &cbad doggo &fseems to have wandered into the arena! Where did it even come from?", + "wave=11:message=&8[Gladius] &fAlright folks we got animal control to deal with the bad doggos, we're back in business!", + "wave=12:message=&8[Gladius] &fIt seems like the audience is clamoring for &cmore&f! Well, let's give it to them!", + "wave=13:message=&8[Gladius] &fSeems like the custodians got bored and gave the arena creatures &2poison&f! Let's see where this goes...", + "wave=14:message=&8[Gladius] &fWell that was... boring! Whoever gave those guys poison is fired! Come up with something better next time!", + "wave=15:message=&8[Gladius] &fAnd here we have this year's prize-winning &4hog&f! It got first place for ugliness and meanness! Everyone give a round of applause for &4Mr. Oinkers&f!", + "wave=16:message=&8[Gladius] &fMr. Oinkers is now bacon! Here comes &cMr. Oinker's fans&f, flooding the arena to get their revenge!", + "wave=17:message=&8[Gladius] &fIt would seem as though our arena challenger thinks they have a shot! But can they deal with even more &cpowerful &ffoes?", + "wave=18:message=&8[Gladius] &fThe &cfencing club &fand the &carchery club &fare having a contest! Let's see which one does better!", + "wave=19:message=&8[Gladius] &fThe fencing club didn't so so hot, let's see what the &carchery club&f has for us!", + "wave=20:message=&8[Gladius] &fSeems like the archery club didn't do so hot either! It seems like our challenger has begun attracting the attention of some of our top gladiators! Introducing &2Zoltan, the Pride of the Zombies&f!", + "wave=21:message=&8[Gladius] &fUnbelievable! Seems like this rookie defeated Zoltan! Do we have a potential new champion in our hands?", + "wave=22:message=&8[Gladius] &fSpectators are starting to place their bets! How far can today's contestant go?", + "wave=23:message=&8[Gladius] &fDon't look away now, this wave's enemies all have &cwithering &fattacks!", + "wave=24:message=&8[Gladius] &fSeems like some pretty big arena names are starting to arrive to stop this challenger! Stay tuned!", + "wave=25:message=&8[Gladius] &fHere comes &bAgdluak&f, the archer from the Great North! Beware of its &bfrost&f!", + "wave=26:message=&8[Gladius] &fThat was a pretty cool fight! I am &cswarming &fwith excitement to see what's next!", + "wave=27:message=&8[Gladius] &fI've been told the arena grows harder! &cZombies immune to arrows, skeletons that freeze their opponents &f- what will they think of next!?", + "wave=28:message=&8[Gladius] &fIt's time to show off those &cfencing &fskills! Remember, it's all about the legwork!", + "wave=29:message=&8[Gladius] &fAnd now, let's have some &ctarget practice&f! The challenger is the target!", + "wave=30:message=&8[Gladius] &fA true arena champion approaches! The &2Southern Viper &fonce again seeks to &cpoison &ftheir enemies to death with his &cthousand poisons&f!", + "wave=31:message=&8[Gladius] &fThe Southern Viper has fallen! The crowd goes wild! What a day, ladies and gentlemen, what a day!", + "wave=32:message=&8[Gladius] &fI have been told that the arena custodians are done messing around and are staring to let loose! Can our challenger survive this?", + "wave=33:message=&8[Gladius] &fSeems like some enemies got their hands on some of Southern Viper's &cpoisons&f! You do not want to get hit by those, ladies and gentlemen!", + "wave=34:message=&8[Gladius] &fBobby, make sure you put 1,000 Elite Coins on these contestants dying for me - no, no, 1,000 Elite Coins - wait was this thing on? I mean, onwards to the next wave!", + "wave=35:message=&8[Gladius] &fLadies and gentlemen, what a rare treat! It would seems as the very &aWood League Jester &fhas stepped up to fight! What delightful &2tricks &fdoes he have for us today?", + "wave=36:message=&8[Gladius] &fWhat a lovely show ladies and gentlemen, give it up for &aThe Jester&f!", + "wave=37:message=&8[Gladius] &fBobby, how is my bet doing? What do you mean 10,000 Elite Coins, I told you to put 1,000 on there! Uh, pump them, &cpump the powers up&f!", + "wave=38:message=&8[Gladius] &fBobby you're killing me here! Uh, dump some &cswordsmen &fon there, I need to deal with something real quick...", + "wave=39:message=&8[Gladius] &fWhat do you mean no refunds? I didn't even want to - ahem, I mean, a legion of &carchers &fhave come from far to show off their skills!", + "wave=40:message=&8[Gladius] &fLadies an gentlemen, for, uh, random reasons, I have invited the strongest fighter I can summon! Meet &4Crucios, the Bearer of Curses&f!", + "wave=41:message=&8[Gladius] &fCrucios has been defeated!? What has the world come to?", + "wave=42:message=&8[Gladius] &fA wealthy for now patron has decided to throw in free healthcare to arena enemies! Will they do better with &2healing&f?", + "wave=43:message=&8[Gladius] &f&cWither&f, &cpoison, &cfire&f throw in everything you have! Do you even know how much is on the line!?", + "wave=44:message=&8[Gladius] &fThis is clearly not working, let me think of something...", + "wave=45:message=&8[Gladius] &fHere is one of the top gladiators of the Wood League Arena! &cThousand Blades &fapproaches once again with his &cinnumerable projectiles&f! He better win!", + "wave=46:message=&8[Gladius] &fThousand Blades has fallen! It just seems like you can't get competent gladiators these days! That's fine, you'll see! You'll all see! &cRelease the swarm!", + "wave=47:message=&8[Gladius] &fIf swarms don't work, throw in &cmore powers&f! Throw in all of the powers!", + "wave=48:message=&8[Gladius] &fWe are starting to run out of options here! Are these all of the &cswordsmen &fwe have left?", + "wave=49:message=&8[Gladius] &fAlright send all we have left, we have no other options! Move forth, &carchers&f!", + "wave=50:message=&8[Gladius] &fI guess this is it for me... I have no option but to declare - wait, who is that in the distance? Is that &4Uther, the Champion of the Wood League Arena&f? Ladies and gentlemen, match set and over, our contestant has no chance of winning here! They shall be &csmitten &fby our champion!", + "wave=51:message=&8[Gladius the Destitute] &fUnbelievable, Uther has been defeated! We have a new arena champion! I would be incredibly excited if I wasn't so terribly in debt now!" + )))); + setMaximumPlayerCount(5); + setCylindricalArena(true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/CustomBossesConfig.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/CustomBossesConfig.java new file mode 100644 index 000000000..b48e83ecc --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/CustomBossesConfig.java @@ -0,0 +1,59 @@ +package com.magmaguy.elitemobs.config.custombosses; + +import com.magmaguy.elitemobs.mobconstructor.custombosses.InstancedBossEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.RegionalBossEntity; +import com.magmaguy.magmacore.config.CustomConfig; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class CustomBossesConfig extends CustomConfig { + + private static HashMap customBosses = new HashMap<>(); + + public CustomBossesConfig() { + super("custombosses", "com.magmaguy.elitemobs.config.custombosses.premade", CustomBossesConfigFields.class); + customBosses = new HashMap<>(); + for (String key : super.getCustomConfigFieldsHashMap().keySet()) + if (super.getCustomConfigFieldsHashMap().get(key).isEnabled()) { + CustomBossesConfigFields customBossesConfigFields = (CustomBossesConfigFields) super.getCustomConfigFieldsHashMap().get(key); + customBosses.put(key, customBossesConfigFields); + } + //This one initializes mobs, which require all mobs to be initialized for phases / reinforcements + for (CustomBossesConfigFields customBossesConfigFields : customBosses.values()) { + if (customBossesConfigFields.isRegionalBoss()) { + //Instanced regional bosses don't actually get initialized alongside normal Regional Bosses + if (customBossesConfigFields.isInstanced()) { + //Initialize the regional bosses in the world + List locations = customBossesConfigFields.processStringList("spawnLocations", new ArrayList<>(), new ArrayList<>(), false); +// if (locations.isEmpty() && !customBossesConfigFields.isRemoveAfterDeath()) +// Logger.info(customBossesConfigFields.getFilename() + " does not have a set location yet! It will not spawn. Did you install its minidungeon?"); + for (String string : locations) + InstancedBossEntity.add(string, customBossesConfigFields); + continue; + } + + CustomBossesConfigFields.getRegionalElites().put(customBossesConfigFields.getFilename(), customBossesConfigFields); + //Reinforcement elites are only temporary and situational, don't initialize them + if (!customBossesConfigFields.isReinforcement()) { + //Initialize the regional bosses in the world + List locations = customBossesConfigFields.processStringList("spawnLocations", new ArrayList<>(), new ArrayList<>(), false); +// if (locations.isEmpty() && !customBossesConfigFields.isRemoveAfterDeath()) +// Logger.info(customBossesConfigFields.getFilename() + " does not have a set location yet! It will not spawn. Did you install its minidungeon?"); + for (String string : locations) + new RegionalBossEntity(customBossesConfigFields, string).initialize(); + } + } + } + } + + public static HashMap getCustomBosses() { + return customBosses; + } + + public static CustomBossesConfigFields getCustomBoss(String fileName) { + return customBosses.get(fileName); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/CustomBossesConfigFields.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/CustomBossesConfigFields.java new file mode 100644 index 000000000..d8fe6319a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/CustomBossesConfigFields.java @@ -0,0 +1,487 @@ +package com.magmaguy.elitemobs.config.custombosses; + +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.CustomConfigFields; +import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; +import com.magmaguy.elitemobs.items.customloottable.CustomLootTable; +import com.magmaguy.elitemobs.mobconstructor.BossType; +import com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs.EliteMobProperties; +import com.magmaguy.elitemobs.powers.scripts.caching.EliteScriptBlueprint; +import com.magmaguy.elitemobs.thirdparty.custommodels.CustomModel; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.*; + +public class CustomBossesConfigFields extends CustomConfigFields { + + @Getter + private static final Map regionalElites = new HashMap<>(); + @Getter + private CustomLootTable customLootTable = null; + @Getter + @Setter + private EntityType entityType = EntityType.ZOMBIE; + @Setter + private String name = "Default Name"; + @Setter + private String level = "dynamic"; + @Getter + @Setter + private boolean isPersistent = false; + @Getter + @Setter + private double healthMultiplier = 1; + @Getter + @Setter + private double damageMultiplier = 1; + @Getter + @Setter + private boolean frozen = false; + @Getter + @Setter + private boolean reinforcement = false; + @Getter + @Setter + private List onDeathCommands = null; + @Getter + @Setter + private List onSpawnCommands = null; + @Getter + @Setter + private List onCombatEnterCommands = null; + @Getter + @Setter + private List onCombatLeaveCommands = null; + @Getter + @Setter + private List uniqueLootList = null; + @Getter + @Setter + private List powers = null; + @Getter + @Setter + private List onDamageMessages = null; + @Getter + @Setter + private List onDamagedMessages = null; + @Getter + @Setter + private List trails = null; + @Getter + @Setter + private List phases = null; + @Getter + @Setter + private String locationMessage = null; + @Getter + @Setter + private String mountedEntity = null; + @Getter + @Setter + private String customModelMountPointID = null; + @Getter + @Setter + private String spawnMessage = null; + @Getter + @Setter + private String deathMessage = null; + @Getter + @Setter + private List deathMessages = null; + @Getter + @Setter + private String escapeMessage = null; + @Getter + @Setter + private boolean baby = false; + @Getter + @Setter + private boolean dropsEliteMobsLoot = true; + @Getter + @Setter + private boolean dropsVanillaLoot = true; + @Getter + @Setter + private boolean dropsRandomLoot = true; + /** + * Integration with LibsDisguises. Only used if that plugin is loaded. + */ + @Getter + @Setter + private String disguise = null; + @Getter + @Setter + private String customDisguiseData = null; + @Getter + @Setter + private String customModel = null; + private boolean customModelExists = false; + /** + * Announcement priority: + * 0 - no messages + * 1 - spawn/kill/escape messages + * 2 - spawn/kill/escape messages + player tracking + * 3 - spawn/kill/escape messages + player tracking + DiscordSRV discord notifications + *

+ * Default is 1 since the spawn messages have to be added to config files intentionally and it's weird to have to + * enabled them elsewhere on purpose + */ + @Getter + @Setter + private int announcementPriority = 0; + @Getter + @Setter + private Integer followDistance = 0; + @Getter + @Setter + private int spawnCooldown = 0; + @Getter + @Setter + private int timeout = 0; + @Getter + @Setter + private double leashRadius = 0; + @Getter + @Setter + private ItemStack helmet = null; + @Getter + @Setter + private ItemStack chestplate = null; + @Getter + @Setter + private ItemStack leggings = null; + @Getter + @Setter + private ItemStack boots = null; + @Getter + @Setter + private ItemStack mainHand = null; + @Getter + @Setter + private ItemStack offHand = null; + @Getter + private boolean regionalBoss = false; + @Getter + @Setter + private boolean cullReinforcements = true; + @Getter + @Setter + private HashMap damageModifiers = new HashMap(); + @Getter + @Setter + private boolean normalizedCombat = false; + @Getter + @Setter + private Double movementSpeedAttribute = null; + //this saves files for regional boss respawn cooldowns + @Getter + @Setter + private boolean filesOutOfSync = false; + @Getter + private List onSpawnBlockStates = new ArrayList<>(), onRemoveBlockStates = new ArrayList<>(); + @Getter + @Setter + private boolean instanced = false; + @Getter + @Setter + private String phaseSpawnLocation = null; + @Getter + @Setter + private ConfigurationSection rawEliteScripts = null; + @Getter + private List eliteScript = new ArrayList<>(); + @Getter + @Setter + private String song = null; + @Getter + @Setter + private boolean alert = false; + @Getter + @Setter + private boolean removeAfterDeath = false; + @Getter + @Setter + private int slimeSize = 4; + @Getter + @Setter + private boolean neutral = false; + @Getter + private String onKillMessage; + @Getter + private BossType bossType = BossType.NORMAL; + @Getter + private double scale = 1D; + + /** + * Creates a new default pre-made Custom Boss. The boss is further customized through a builder pattern. + */ + public CustomBossesConfigFields(String fileName, + EntityType entityType, + boolean isEnabled, + String name, + String level) { + super(fileName, isEnabled); + this.entityType = entityType; + this.name = name; + this.level = level; + } + + public CustomBossesConfigFields(String fileName, + boolean isEnabled) { + super(fileName, isEnabled); + } + + public String getName() { + return name == null ? "Default Name" : name; + } + + //This method unifies all level placeholders down to $level and applies a custom level for quest display purposes + public String getCleanName(int level) { + String cleanNameLevel; + if (level == 0) cleanNameLevel = level + ""; + else cleanNameLevel = this.level; + return ChatColorConverter.convert(getName().replace("$level", cleanNameLevel) + .replace("$normalLevel", ChatColorConverter.convert("&2[&a" + cleanNameLevel + "&2]&f")) + .replace("$minibossLevel", ChatColorConverter.convert("&6〖&e" + cleanNameLevel + "&6〗&f")) + .replace("$bossLevel", ChatColorConverter.convert("&4『&c" + cleanNameLevel + "&4』&f")) + .replace("$reinforcementLevel", ChatColorConverter.convert("&8〔&7") + cleanNameLevel + "&8〕&f") + .replace("$eventBossLevel", ChatColorConverter.convert("&4「&c" + cleanNameLevel + "&4」&f"))); + } + + public void runtimeSetLeashRadius(double leashRadius) { + this.leashRadius = leashRadius; + this.fileConfiguration.set("leashRadius", leashRadius); + ConfigurationEngine.fileSaverCustomValues(fileConfiguration, file); + } + + public double getDamageModifier(Material material) { + return damageModifiers.get(material) == null ? 1 : damageModifiers.get(material); + } + + public int getLevel() { + if (level.equalsIgnoreCase("dynamic")) { + return -1; + } else { + try { + return Integer.valueOf(level); + } catch (Exception ex) { + Logger.warn("Regional Elite Mob level for " + getFilename() + " is neither numeric nor dynamic. Fix the configuration for it."); + return 1; + } + } + } + + public void setOnSpawnBlockStates(List onSpawnBlockStates) { + this.onSpawnBlockStates = onSpawnBlockStates; + fileConfiguration.set("onSpawnBlockStates", onSpawnBlockStates); + try { + fileConfiguration.save(file); + } catch (Exception ex) { + Logger.warn("Failed to save on spawn block states!", true); + } + } + + public void setOnRemoveBlockStates(List onRemoveBlockStates) { + this.onRemoveBlockStates = onRemoveBlockStates; + fileConfiguration.set("onRemoveBlockStates", onRemoveBlockStates); + try { + fileConfiguration.save(file); + } catch (Exception ex) { + Logger.warn("Failed to save on remove block states!", true); + } + } + + @Override + public void processConfigFields() { + this.isEnabled = processBoolean("isEnabled", isEnabled, true, true); + this.entityType = processEnum("entityType", entityType, EntityType.ZOMBIE, EntityType.class, true); + if (entityType == null) entityType = EntityType.ZOMBIE; + if (EliteMobProperties.getPluginData(entityType) == null) { + Logger.warn("Failed to get plugin data for entity type " + entityType.toString() + " in file " + filename + " ! Defaulting to zombie."); + entityType = EntityType.ZOMBIE; + } + this.instanced = processBoolean("instanced", instanced, false, false); + this.name = translatable(filename, "name", processString("name", name, "Default Name", true)); + //Levels are strings because "dynamic" is a valid value + this.level = processString("level", level, "dynamic", true); + this.isPersistent = processBoolean("isPersistent", isPersistent, false, false); + this.healthMultiplier = processDouble("healthMultiplier", healthMultiplier, 1D, false); + this.damageMultiplier = processDouble("damageMultiplier", damageMultiplier, 1D, false); + this.baby = processBoolean("isBaby", baby, false, false); + this.dropsEliteMobsLoot = processBoolean("dropsEliteMobsLoot", dropsEliteMobsLoot, true, false); + this.dropsVanillaLoot = processBoolean("dropsVanillaLoot", dropsVanillaLoot, true, false); + this.dropsRandomLoot = processBoolean("dropsRandomLoot", dropsRandomLoot, true, false); + this.frozen = processBoolean("frozen", frozen, false, false); + this.reinforcement = processBoolean("reinforcement", reinforcement, false, false); + this.onDeathCommands = processStringList("onDeathCommands", onDeathCommands, new ArrayList<>(), false); + this.onSpawnCommands = processStringList("onSpawnCommands", onSpawnCommands, new ArrayList<>(), false); + this.onCombatEnterCommands = processStringList("onCombatEnterCommands", onCombatEnterCommands, new ArrayList<>(), false); + this.onCombatLeaveCommands = processStringList("onCombatLeaveCommands", onCombatLeaveCommands, new ArrayList<>(), false); + this.deathMessages = translatable(filename, "deathMessages", processStringList("deathMessages", deathMessages, new ArrayList<>(), false)); + this.uniqueLootList = processList("uniqueLootList", uniqueLootList, new ArrayList<>(), false); + this.customLootTable = new CustomLootTable(this); + + //this can't be converted directly to an enum list because there are some special string features in here + this.powers = processList("powers", powers, null, false); + this.onDamageMessages = translatable(filename, "onDamageMessages", processStringList("onDamageMessages", onDamageMessages, new ArrayList<>(), false)); + this.onDamagedMessages = translatable(filename, "onDamagedMessages", processStringList("onDamagedMessages", onDamagedMessages, new ArrayList<>(), false)); + this.trails = processStringList("trails", trails, new ArrayList<>(), false); + this.phases = processStringList("phases", phases, new ArrayList<>(), false); + this.phaseSpawnLocation = processString("phaseSpawnLocation", phaseSpawnLocation, null, false); + this.locationMessage = translatable(filename, "locationMessage", processString("locationMessage", locationMessage, null, false)); + this.mountedEntity = processString("mountedEntity", mountedEntity, null, false); + if (mountedEntity != null && mountedEntity.equals(filename)) { + Logger.warn("Custom Boss " + filename + " has itself for a mount. This makes an infinite loop of the boss mounting itself. The boss mount will not be used for safety reasons."); + this.mountedEntity = null; + } + this.customModelMountPointID = processString("customModelMountPointID", customModelMountPointID, null, false); + this.spawnMessage = translatable(filename, "spawnMessage", processString("spawnMessage", spawnMessage, null, false)); + this.deathMessage = translatable(filename, "deathMessage", processString("deathMessage", deathMessage, null, false)); + this.escapeMessage = translatable(filename, "escapeMessage", processString("escapeMessage", escapeMessage, null, false)); + this.disguise = processString("disguise", disguise, null, false); + this.customDisguiseData = processString("customDisguiseData", customDisguiseData, null, false); + this.customModel = processString("customModel", customModel, null, false); + + this.announcementPriority = processInt("announcementPriority", announcementPriority, 0, false); + this.followDistance = processInt("followDistance", followDistance, 0, false); + this.spawnCooldown = processInt("spawnCooldown", spawnCooldown, 0, false); + this.timeout = processInt("timeout", timeout, 0, false); + this.leashRadius = processDouble("leashRadius", leashRadius, 0, false); + this.helmet = processItemStack("helmet", helmet, null, false); + this.chestplate = processItemStack("chestplate", chestplate, null, false); + this.leggings = processItemStack("leggings", leggings, null, false); + this.boots = processItemStack("boots", boots, null, false); + this.mainHand = processItemStack("mainHand", mainHand, null, false); + this.offHand = processItemStack("offHand", offHand, null, false); + this.regionalBoss = processBoolean("isRegionalBoss", regionalBoss, false, false); + this.onSpawnBlockStates = processStringList("onSpawnBlockStates", onSpawnBlockStates, new ArrayList<>(), false); + this.onRemoveBlockStates = processStringList("onRemoveBlockStates", onRemoveBlockStates, new ArrayList<>(), false); + + cullReinforcements = processBoolean("cullReinforcements", cullReinforcements, true, false); + damageModifiers = processDamageModifiers("damageModifiers", damageModifiers); + + if (MobCombatSettingsConfig.isNormalizeRegionalBosses() && (isRegionalBoss() || isInstanced())) + this.normalizedCombat = true; + else + this.normalizedCombat = processBoolean("normalizedCombat", normalizedCombat, false, false); + + this.movementSpeedAttribute = processDouble("movementSpeedAttribute", movementSpeedAttribute, null, false); + + rawEliteScripts = fileConfiguration.getConfigurationSection("eliteScript"); + if (rawEliteScripts != null) eliteScript = EliteScriptBlueprint.parseBossScripts(rawEliteScripts, this); + + this.song = processString("song", song, null, false); + this.alert = processBoolean("alert", alert, false, false); + this.removeAfterDeath = processBoolean("removeAfterDeath", removeAfterDeath, false, false); + this.slimeSize = processInt("slimeSize", slimeSize, 4, false); + this.neutral = processBoolean("neutral", neutral, false, false); + + this.onKillMessage = ConfigurationEngine.setString( + List.of("Sets the message that is shown when a boss is killed", "Placeholders:", "$player - username of the player the boss killed"), + file, fileConfiguration, "onKillMessage", null, true); + + String bossTypeString = ConfigurationEngine.setString(file, fileConfiguration, "bossType", "NORMAL", false); + try { + this.bossType = BossType.valueOf(bossTypeString.toUpperCase(Locale.ROOT)); + } catch (Exception e) { + Logger.warn("Boss type for boss " + filename + " is not a valid boss type!"); + } + + this.scale = processDouble("scale", scale, 1, false); + } + + public boolean isCustomModelExists() { + if (CustomModel.customModelsEnabled() && CustomModel.modelExists(customModel)) + return customModelExists = true; + return false; + } + + private HashMap processDamageModifiers(String path, HashMap pluginDefaults) { + HashMap hashMap = new HashMap<>(); + if (!fileConfiguration.contains(path) && damageModifiers.isEmpty()) + return pluginDefaults; + + for (String rawDamageModifier : fileConfiguration.getStringList(path)) { + String[] parsedStrings; + Material material = null; + Double multiplier = null; + if (rawDamageModifier.contains(",")) { + parsedStrings = rawDamageModifier.split(","); + for (String parsedDamageModifier : parsedStrings) { + if (parsedDamageModifier.contains("material:")) + try { + material = Material.getMaterial(parsedDamageModifier.replace("material:", "")); + } catch (Exception ex) { + Logger.warn("Boss " + getFilename() + " has invalid entry " + parsedDamageModifier + " !"); + } + else if (parsedDamageModifier.contains("multiplier:")) + try { + multiplier = Double.parseDouble(parsedDamageModifier.replace("multiplier:", "")); + } catch (Exception ex) { + Logger.warn("Boss " + getFilename() + " has invalid entry " + parsedDamageModifier + " !"); + } + else + Logger.warn("Entry " + parsedDamageModifier + " is invalid for boss file " + getFilename() + " !"); + } + + } else { + parsedStrings = rawDamageModifier.split(":"); + for (String parsedDamageModifier : parsedStrings) { + if (parsedDamageModifier.contains("material=")) + try { + material = Material.getMaterial(parsedDamageModifier.replace("material=", "")); + } catch (Exception ex) { + Logger.warn("Boss " + getFilename() + " has invalid entry " + parsedDamageModifier + " !"); + } + else if (parsedDamageModifier.contains("multiplier=")) + try { + multiplier = Double.parseDouble(parsedDamageModifier.replace("multiplier=", "")); + } catch (Exception ex) { + Logger.warn("Boss " + getFilename() + " has invalid entry " + parsedDamageModifier + " !"); + } + else + Logger.warn("Entry " + parsedDamageModifier + " is invalid for boss file " + getFilename() + " !"); + } + + } + if (material != null && multiplier != null) + hashMap.put(material, multiplier); + } + if (!hashMap.isEmpty()) + fileConfiguration.addDefault(path, deserializeDamageModifiers(hashMap)); + return hashMap; + } + + private List deserializeDamageModifiers(HashMap damageModifiers) { + List deserializedDamageModifiers = new ArrayList<>(); + damageModifiers.forEach((key, value) -> deserializedDamageModifiers.add("material=" + key.toString() + ":" + "multiplier=" + value)); + return deserializedDamageModifiers; + } + + protected List majorBossDeathString(String slainLine) { + return new ArrayList<>(List.of( + "&e&l---------------------------------------------", + "&4" + slainLine, + "&c&l 1st Damager: $damager1name &cwith $damager1damage damage!", + "&6&l 2nd Damager: $damager2name &6with $damager2damage damage!", + "&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!", + "&aSlayers: $players", + "&e&l---------------------------------------------")); + } + + public void saveFile() { + try { + fileConfiguration.save(file); + } catch (Exception ex) { + Logger.warn("Failed to save boss file " + filename + "!"); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/AlphaWerewolfP1Boss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/AlphaWerewolfP1Boss.java new file mode 100644 index 000000000..3f6402ddc --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/AlphaWerewolfP1Boss.java @@ -0,0 +1,54 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; + +public class AlphaWerewolfP1Boss extends CustomBossesConfigFields { + public AlphaWerewolfP1Boss() { + super("alpha_werewolf_p1", + EntityType.VINDICATOR, + true, + "$eventBossLevel &7Enraged Vindicator", + "dynamic"); + setPersistent(true); + setHealthMultiplier(4); + setDamageMultiplier(2); + setPhases(List.of("alpha_werewolf_p2.yml:0.99")); + setPowers(new ArrayList<>(new ArrayList<>(List.of("spirit_walk.yml", + "summonable:summonType=GLOBAL:filename=gamma_werewolf.yml:amount=1:customSpawn=normal_surface_spawn.yml", + "summonable:summonType=GLOBAL:filename=omega_wolf.yml:amount=2:customSpawn=normal_surface_spawn.yml")))); + setSpawnMessage("&cThe howls of an Alpha Werewolf are heard!"); + setDeathMessage("&aThe Alpha Werewolf has been stopped by $players!"); + setDeathMessages(new ArrayList<>(List.of( + "&e&l---------------------------------------------", + "&4The Alpha Wolf has been put down!", + "&c&l 1st Damager: $damager1name &cwith $damager1damage damage!", + "&6&l 2nd Damager: $damager2name &6with $damager2damage damage!", + "&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!", + "&aSlayers: $players", + "&e&l---------------------------------------------"))); + setEscapeMessage("&4Dawn breaks, the Alpha Wolf vanishes without a trace!"); + setLocationMessage("&7Enraged Vindicator: $distance blocks away!"); + setUniqueLootList(new ArrayList<>(List.of( + "werewolf_bone.yml:0.2", + "werewolf_bone.yml:0.2", + "werewolf_bone.yml:0.2", + "werewolf_bone.yml:0.2", + "werewolf_bone.yml:0.2", + "wolfsbane.yml:0.2"))); + setTrails(Collections.singletonList(Material.BONE.toString())); + setAnnouncementPriority(2); + HashMap damageModifiers = new HashMap<>(); + damageModifiers.put(Material.IRON_SWORD, 2D); + damageModifiers.put(Material.IRON_AXE, 2D); + setDamageModifiers(damageModifiers); + setFollowDistance(100); + } +} + diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/AlphaWerewolfP2Boss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/AlphaWerewolfP2Boss.java new file mode 100644 index 000000000..ad9bda686 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/AlphaWerewolfP2Boss.java @@ -0,0 +1,56 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; + +public class AlphaWerewolfP2Boss extends CustomBossesConfigFields { + public AlphaWerewolfP2Boss() { + super("alpha_werewolf_p2", + EntityType.VINDICATOR, + true, + "$eventBossLevel &7Alpha Werewolf", + "dynamic"); + setPersistent(true); + setHealthMultiplier(4); + setDamageMultiplier(2); + setPowers(new ArrayList<>(List.of("attack_blinding.yml", "ground_pound.yml", "moonwalk.yml", "spirit_walk.yml", + "summonable:summonType=ON_HIT:filename=beta_wolf.yml:amount=5:chance=0.1:inheritAggro=true:spawnNearby=true", + "summonable:summonType=ON_HIT:filename=gamma_werewolf.yml:amount=1:chance=0.1:inheritAggro=true:spawnNearby=true", + "summonable:summonType=GLOBAL:filename=gamma_werewolf.yml:amount=1:customSpawn=normal_surface_spawn.yml", + "summonable:summonType=GLOBAL:filename=omega_wolf.yml:amount=2:customSpawn=normal_surface_spawn.yml"))); + setSpawnMessage("&cThe howls of an Alpha Werewolf are heard!"); + setDeathMessage("&aThe Alpha Werewolf has been stopped by $players!"); + setDeathMessages(new ArrayList<>(List.of( + "&e&l---------------------------------------------", + "&4The Alpha Wolf has been put down!", + "&c&l 1st Damager: $damager1name &cwith $damager1damage damage!", + "&6&l 2nd Damager: $damager2name &6with $damager2damage damage!", + "&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!", + "&aSlayers: $players", + "&e&l---------------------------------------------"))); + setEscapeMessage("&4Dawn breaks, the Alpha Wolf vanishes without a trace!"); + setLocationMessage("&7Alpha Wolf: $distance blocks away!"); + setUniqueLootList(new ArrayList<>(List.of( + "werewolf_bone.yml:0.2", + "werewolf_bone.yml:0.2", + "werewolf_bone.yml:0.2", + "werewolf_bone.yml:0.2", + "werewolf_bone.yml:0.2", + "wolfsbane.yml:0.2"))); + setTrails(Collections.singletonList(Material.BONE.toString())); + setDisguise("custom:alpha_werewolf_p2"); + setCustomDisguiseData("player alpha_werewolf_p2 setskin {\"id\":\"50f47a40-9557-4ef8-9986-9c97215116e4\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTU5NjY5NjY4Njg4OCwKICAicHJvZmlsZUlkIiA6ICIwNmE4NjAyZDAwODk0YWQxOTcyMGQ3NGE1OGU1MDZjZiIsCiAgInByb2ZpbGVOYW1lIiA6ICJfMW5kcmFfIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzU1ZWFhMDlkNDVlMzFhNmM0YzFjYTc3MWNkZWE4ZDlmM2Y2MWJjMTI1MGI5ZTg5NGY3ZmQ1YzIxM2YxOGE0YjUiCiAgICB9CiAgfQp9\",\"signature\":\"psopRAKIS71E2Chl8hKBKXJG6yvtDxP+e0yUY6iDRlPC8M/0Vs+lL1dnArQSKO68PZ6KlaiYRdMhEWHVTdbz3wXniNK8KNi+Aitl3MYXGD7BRfxENJE4GOjyvAYyWgxyU3s2D8gZbBMkrNYBcNI7SvhLUT67libXG0WOUCBLGE29mtRRS74eHEC0P55CoVXJtxksxBr3wM4p55hQepQoDV+zrGmokwNZjgxlNaMP0v6R6LWyBxfwnCTVNRa8PS+YmMtxXkqa9Dl9aDAzit41J455F9Ei/Md4wahZ89pauLzBnWrjlJLriv5yg/pCWBOlUqreLaiN3y+gFmMa1TjI52FMyPn56/GW5U+Eud90nL9I4NignfJzdGgDqjP2e7xcgRvmEb344+97/fTPy721vgsMXMAlEPwQg7HadTCUOpRGn918gGRTbLdZGPRvcZxRKVV6unM1bB25XaRNC5GZtOHRDO61YmX5c5URIy6ectjmhPrw3u6Yx8q/5N5+OIsoADANTUh9decoaCT4Z5T12s6YtsBy7qay3fTt4oVj4pWO3zWvLJ+8NmGKlyX+SHz7xcxXhFOUgXoX7V+5ICN87zn4IsQ7j4Ihn8uSrEbX05tnfBELbQFz7MGULvqwnR2GiEYyVULOB4y1fISoRNNx1TtbtAOMEB3dnKlHgdzkdhM=\"}],\"legacy\":false}"); + setAnnouncementPriority(2); + HashMap damageModifiers = new HashMap<>(); + damageModifiers.put(Material.IRON_SWORD, 2D); + damageModifiers.put(Material.IRON_AXE, 2D); + setDamageModifiers(damageModifiers); + setFollowDistance(100); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/ArmorGoblinBoss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/ArmorGoblinBoss.java new file mode 100644 index 000000000..edfd3ff93 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/ArmorGoblinBoss.java @@ -0,0 +1,53 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class ArmorGoblinBoss extends CustomBossesConfigFields { + public ArmorGoblinBoss() { + super("armor_goblin", + EntityType.ZOMBIE, + true, + "$eventBossLevel &3Armor Goblin", + "dynamic"); + setHealthMultiplier(4); + setDamageMultiplier(2); + setHelmet(new ItemStack(Material.DIAMOND_HELMET)); + setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE)); + setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS)); + setBoots(new ItemStack(Material.DIAMOND_BOOTS)); + setMainHand(new ItemStack(Material.SHIELD)); + setOffHand(new ItemStack(Material.SHIELD)); + setBaby(true); + setPowers(new ArrayList<>(List.of("gold_explosion.yml", "gold_shotgun.yml", "spirit_walk.yml"))); + setSpawnMessage("&cAn Armor Goblin has been sighted!"); + setDeathMessage("&aAn Armor Goblin has been slain by $players!"); + setDeathMessages(new ArrayList<>(List.of( + "&e&l---------------------------------------------", + "&eThe Armor Goblin has been pillaged!", + "&c&l 1st Damager: $damager1name &cwith $damager1damage damage!", + "&6&l 2nd Damager: $damager2name &6with $damager2damage damage!", + "&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!", + "&aSlayers: $players", + "&e&l---------------------------------------------"))); + setEscapeMessage("&4An Armor Goblin has escaped!"); + setLocationMessage("&cArmor Goblin: $distance blocks away!"); + setTrails(Collections.singletonList(Material.GOLD_NUGGET.toString())); + setAnnouncementPriority(2); + setPersistent(true); + setUniqueLootList(new ArrayList<>(List.of( + "goblin_helmet.yml:0.2", + "goblin_chestplate.yml:0.2", + "goblin_leggings.yml:0.2", + "goblin_boots.yml:0.2" + ))); + setFollowDistance(100); + setCustomModel("em_goblin_armor"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/BalrogConfig.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/BalrogConfig.java new file mode 100644 index 000000000..6acb2c3a6 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/BalrogConfig.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Particle; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class BalrogConfig extends CustomBossesConfigFields { + public BalrogConfig() { + super("balrog", + EntityType.SILVERFISH, + true, + "$eventBossLevel &4Balrog", + "dynamic"); + setPowers(new ArrayList<>(List.of("summonable:summonType=ON_HIT:chance=0.5:filename=raug.yml"))); + setUniqueLootList(Collections.singletonList("dwarven_greed.yml:1")); + setTrails(new ArrayList<>(List.of(Particle.LARGE_SMOKE.toString(), + Particle.LARGE_SMOKE.toString(), + Particle.LARGE_SMOKE.toString(), + Particle.LARGE_SMOKE.toString(), + Particle.FLAME.toString(), + Particle.FLAME.toString()))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/BeastMasterBoss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/BeastMasterBoss.java new file mode 100644 index 000000000..c540d426a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/BeastMasterBoss.java @@ -0,0 +1,37 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class BeastMasterBoss extends CustomBossesConfigFields { + public BeastMasterBoss() { + super("beast_master", + EntityType.VINDICATOR, + true, + "$eventBossLevel &6Beast Master", + "dynamic"); + setHealthMultiplier(4); + setDamageMultiplier(2); + setSpawnMessage("&cThe Beast Master has been sighted!"); + setDeathMessage("&aThe Best Master has been slain by $players!"); + setDeathMessages(new ArrayList<>(List.of( + "&e&l---------------------------------------------", + "&eThe Beast Master has been savaged!", + "&c&l 1st Damager: $damager1name &cwith $damager1damage damage!", + "&6&l 2nd Damager: $damager2name &6with $damager2damage damage!", + "&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!", + "&aSlayers: $players", + "&e&l---------------------------------------------"))); + setEscapeMessage("&4The Beast Master has returned to the wilds!"); + setLocationMessage("&cBeast Master: $distance blocks away!"); + setAnnouncementPriority(2); + setPersistent(true); + setPowers(new ArrayList<>(List.of("attack_poison.yml", "ground_pound.yml", "bonus_loot.yml", + "summonable:summonType=ON_HIT:filename=wild_wolf.yml:spawnNearby=true:inheritAggro=true:inheritLevel=true:chance=0.2"))); + setUniqueLootList(List.of("summon_wolf_scroll.yml:1")); + setFollowDistance(100); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/BetaWolfBoss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/BetaWolfBoss.java new file mode 100644 index 000000000..b14794688 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/BetaWolfBoss.java @@ -0,0 +1,29 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class BetaWolfBoss extends CustomBossesConfigFields { + public BetaWolfBoss() { + super("beta_wolf", + EntityType.WOLF, + true, + "$reinforcementLevel &7Beta Wolf", + "dynamic"); + setDropsEliteMobsLoot(false); + setDropsVanillaLoot(false); + setHealthMultiplier(0.5); + setDamageMultiplier(0.5); + setPowers(new ArrayList<>(List.of("attack_poison.yml"))); + HashMap damageModifiers = new HashMap<>(); + damageModifiers.put(Material.IRON_SWORD, 2D); + damageModifiers.put(Material.IRON_AXE, 2D); + setDamageModifiers(damageModifiers); + setFollowDistance(100); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/BlayyzeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/BlayyzeConfig.java new file mode 100644 index 000000000..ad8e7c33a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/BlayyzeConfig.java @@ -0,0 +1,39 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class BlayyzeConfig extends CustomBossesConfigFields { + public BlayyzeConfig() { + super("blayyze", + EntityType.BLAZE, + true, + "$eventBossLevel &6Blayyze", + "dynamic"); + setTimeout(30); + setPersistent(true); + setHealthMultiplier(4); + setDamageMultiplier(2); + setPowers(new ArrayList<>(List.of("meteor_shower.yml", "summon_embers.yml", "bullet_hell.yml", "spirit_walk.yml"))); + setSpawnMessage("&cSomething came out of the meteorite's crater..."); + setDeathMessage("&6$players completed first contact."); + setDeathMessages(new ArrayList<>(List.of( + "&e&l---------------------------------------------", + "&6The Blayyze has been repelled!", + "&c&l 1st Damager: $damager1name &cwith $damager1damage damage!", + "&6&l 2nd Damager: $damager2name &6with $damager2damage damage!", + "&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!", + "&aSlayers: $players", + "&e&l---------------------------------------------"))); + setEscapeMessage("&6The ayyliens have been taken to area 51!"); + setLocationMessage("&6????: $distance blocks away"); + setUniqueLootList(List.of("meteor_shower_scroll.yml:1")); + setTrails(Collections.singletonList(Material.FIRE_CHARGE.toString())); + setAnnouncementPriority(2); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/CharmsGoblinBoss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/CharmsGoblinBoss.java new file mode 100644 index 000000000..f55390d06 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/CharmsGoblinBoss.java @@ -0,0 +1,60 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class CharmsGoblinBoss extends CustomBossesConfigFields { + public CharmsGoblinBoss() { + super("charms_goblin.yml", + EntityType.ZOMBIE, + true, + "$eventBossLevel &2Charms Goblin", + "dynamic"); + setHealthMultiplier(4); + setDamageMultiplier(2); + setHelmet(new ItemStack(Material.IRON_HELMET)); + setChestplate(new ItemStack(Material.IRON_CHESTPLATE)); + setLeggings(new ItemStack(Material.IRON_LEGGINGS)); + setBoots(new ItemStack(Material.IRON_BOOTS)); + setBaby(true); + setPowers(new ArrayList<>(List.of("gold_explosion.yml", "gold_shotgun.yml", "spirit_walk.yml"))); + setSpawnMessage("&cA Charms Goblin has been sighted!"); + setDeathMessage("&aA Charms Goblin has been slain by $players!"); + setDeathMessages(new ArrayList<>(List.of( + "&e&l---------------------------------------------", + "&eThe Charms Goblin has been pillaged!", + "&c&l 1st Damager: $damager1name &cwith $damager1damage damage!", + "&6&l 2nd Damager: $damager2name &6with $damager2damage damage!", + "&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!", + "&aSlayers: $players", + "&e&l---------------------------------------------"))); + setEscapeMessage("&4A Charms Goblin has escaped!"); + setLocationMessage("&cCharms Goblin: $distance blocks away!"); + setTrails(Collections.singletonList(Material.GOLD_NUGGET.toString())); + setAnnouncementPriority(2); + setPersistent(true); + setUniqueLootList(new ArrayList<>(List.of( + "berserker_charm.yml:0.2", + "chameleon_charm.yml:0.2", + "cheetah_charm.yml:0.2", + "elephant_charm.yml:0.2", + "firefly_charm.yml:0.2", + "fishy_charm.yml:0.2", + "lucky_charms.yml:0.2", + "owl_charm.yml:0.2", + "rabbit_charm.yml:0.2", + "salamander_charm.yml:0.2", + "scorpion_charm.yml:0.2", + "shulker_charm.yml:0.2", + "slowpoke_charm.yml:0.2", + "vampiric_charm.yml:0.2"))); + setFollowDistance(100); + setCustomModel("em_goblin_charms"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/CoinsGoblinBoss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/CoinsGoblinBoss.java new file mode 100644 index 000000000..0f6e84b3e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/CoinsGoblinBoss.java @@ -0,0 +1,45 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class CoinsGoblinBoss extends CustomBossesConfigFields { + public CoinsGoblinBoss() { + super("coins_goblin", + EntityType.ZOMBIE, + true, + "$eventBossLevel &eCoins Goblin", + "dynamic"); + setHealthMultiplier(4); + setDamageMultiplier(2); + setHelmet(new ItemStack(Material.GOLDEN_HELMET)); + setChestplate(new ItemStack(Material.GOLDEN_CHESTPLATE)); + setLeggings(new ItemStack(Material.GOLDEN_LEGGINGS)); + setBoots(new ItemStack(Material.GOLDEN_BOOTS)); + setBaby(true); + setPowers(new ArrayList<>(List.of("gold_explosion.yml", "gold_shotgun.yml", "spirit_walk.yml", "bonus_coins.yml:20"))); + setSpawnMessage("&cA Coins Goblin has been sighted!"); + setDeathMessage("&aA Coins Goblin has been slain by $players!"); + setDeathMessages(new ArrayList<>(List.of( + "&e&l---------------------------------------------", + "&eThe Coins Goblin has been pillaged!", + "&c&l 1st Damager: $damager1name &cwith $damager1damage damage!", + "&6&l 2nd Damager: $damager2name &6with $damager2damage damage!", + "&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!", + "&aSlayers: $players", + "&e&l---------------------------------------------"))); + setEscapeMessage("&4A Coins Goblin has escaped!"); + setLocationMessage("&cCoins Goblin: $distance blocks away!"); + setTrails(Collections.singletonList(Material.GOLD_NUGGET.toString())); + setAnnouncementPriority(2); + setPersistent(true); + setFollowDistance(100); + setCustomModel("em_goblin_coins"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/EmberConfig.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/EmberConfig.java new file mode 100644 index 000000000..5be146775 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/EmberConfig.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Particle; +import org.bukkit.entity.EntityType; + +import java.util.Collections; + +public class EmberConfig extends CustomBossesConfigFields { + public EmberConfig() { + super("ember", + EntityType.BLAZE, + true, + "$reinforcementLevel &cEmber", + "dynamic"); + setHealthMultiplier(0.3); + setDamageMultiplier(0.3); + setDropsEliteMobsLoot(false); + setTrails(Collections.singletonList(Particle.WITCH.toString())); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/FireFaeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/FireFaeConfig.java new file mode 100644 index 000000000..78af5a281 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/FireFaeConfig.java @@ -0,0 +1,24 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Particle; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class FireFaeConfig extends CustomBossesConfigFields { + public FireFaeConfig() { + super("fire_fae", + EntityType.VEX, + true, + "$eventBossLevel &cFire Fae", + "dynamic"); + setHealthMultiplier(0.3); + setDamageMultiplier(0.3); + setPowers(new ArrayList<>(List.of("attack_fire.yml"))); + setUniqueLootList(Collections.singletonList("the_feller.yml:0.3")); + setTrails(Collections.singletonList(Particle.FLAME.toString())); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/GamaWerewolfBoss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/GamaWerewolfBoss.java new file mode 100644 index 000000000..a6e53ef41 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/GamaWerewolfBoss.java @@ -0,0 +1,30 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class GamaWerewolfBoss extends CustomBossesConfigFields { + public GamaWerewolfBoss() { + super("gamma_werewolf", + EntityType.WOLF, + true, + "$reinforcementLevel &7Gamma Werewolf", + "dynamic"); + setHealthMultiplier(1.5); + setDamageMultiplier(1.5); + setPowers(new ArrayList<>(List.of("ground_pound.yml", + "summonable:summonType=ON_COMBAT_ENTER:filename=omega_wolf.yml:amount=2:inheritAggro=true:spawnNearby=true"))); + setDisguise("custom:gamma_werewolf"); + setCustomDisguiseData("player gamma_werewolf setskin {\"id\":\"5f5fff79-687e-46ad-8020-e618a6ec8871\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTYyNzE4OTcxMTA4MCwKICAicHJvZmlsZUlkIiA6ICJkMGFkNThjOTNiMzY0ZjgyOWRjZWEzMTAzMzE5MTgyMSIsCiAgInByb2ZpbGVOYW1lIiA6ICJfU2FwcGhpcmVfTHVuYV8iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjgxZjRmMGRiNWUzZDQzYmU2ZWMwNzE3Njc0MDMxN2Y4ZTQxZWJiNjU0YzYwZTU4MzVhZGYyMzE5MzUzMTE3IgogICAgfQogIH0KfQ==\",\"signature\":\"d9XXwZOzBUfoV04rV2XOoSRI1GYolEe2ABeNXL8Yft56L+ci/tzM+DWya9yzTjP1cS4wQ1B23rAX2CQfcSC9HF/LPTtwzE+gmGt0EVGH+S3jvcXPl/Vb2igfK6LmINqhjpqEIhvF8NePF3oZ01S6Bwc46v1SMRQ3LpWC9cPPrIeVc48RrpsxknQVzszuKHeiDv3H1x4pdhpR3EdLlAPMyapijio1yjYCRgxd9TWN/4EcbtKTWy2AeEwU/eATYiNFYcFPdOQ3FGjiveUkeq8dGGe8huZvFCNcSizuws70HaIQrJceosRfnwiuJUBUVkYS9cPCVmV+dDOBOCYt7falct2wuHQWFXcD6e9Umqts26lzLbccDY0VQnb9k32Ip/6m95v8sg7AP1OcEN9PNrD5MV+p+CSkzfqfoS2nDcBg69hhi6DYqPBzlqVmDAdRJs2MX5kQoYwM5Zqi6LJDWqVNkNixc/MBnzkS92PcG93cd6eMPjE6p4gWRLoU9hbuUo+6xxh4vItBJj+65UgRvVk48fJJSEKn61be8Jhp6nuhmJ4AUYfGcBun9Q0Wn7py+YsBAZs6Abt3+Nr56V7dOxhiR2hINmhklZVOsiv5UDTzlWhpUe0yBjp92ELfzt7mbLzv5he6SUaxK1OytYchA8nJbTEZnsLpOiXaJs+wKgz1u9s=\"}],\"legacy\":false}"); + HashMap damageModifiers = new HashMap<>(); + damageModifiers.put(Material.IRON_SWORD, 2D); + damageModifiers.put(Material.IRON_AXE, 2D); + setDamageModifiers(damageModifiers); + setFollowDistance(100); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/IceFaeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/IceFaeConfig.java new file mode 100644 index 000000000..28d5e26b4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/IceFaeConfig.java @@ -0,0 +1,24 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Particle; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class IceFaeConfig extends CustomBossesConfigFields { + public IceFaeConfig() { + super("ice_fae", + EntityType.VEX, + true, + "$eventBossLevel &bIce Fae", + "dynamic"); + setHealthMultiplier(0.3); + setDamageMultiplier(0.3); + setPowers(new ArrayList<>(List.of("attack_freeze.yml"))); + setUniqueLootList(Collections.singletonList("the_feller.yml:0.3")); + setTrails(Collections.singletonList(Particle.DRIPPING_WATER.toString())); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/ImperialBeeGuardConfig.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/ImperialBeeGuardConfig.java new file mode 100644 index 000000000..72d2eb3ac --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/ImperialBeeGuardConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Particle; +import org.bukkit.entity.EntityType; + +import java.util.Collections; + +public class ImperialBeeGuardConfig extends CustomBossesConfigFields { + public ImperialBeeGuardConfig() { + super("imperial_bee_guard", + EntityType.BEE, + true, + "$reinforcementLevel &eImperial Bee Soldier", + "dynamic"); + setDropsEliteMobsLoot(false); + setDropsVanillaLoot(false); + setHealthMultiplier(0.1); + setDamageMultiplier(0.1); + setTrails(Collections.singletonList(Particle.LARGE_SMOKE.toString())); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/KillerRabbitOfCaerbannogConfig.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/KillerRabbitOfCaerbannogConfig.java new file mode 100644 index 000000000..5b426195e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/KillerRabbitOfCaerbannogConfig.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Particle; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class KillerRabbitOfCaerbannogConfig extends CustomBossesConfigFields { + public KillerRabbitOfCaerbannogConfig() { + super("killer_rabbit_of_caerbannog", + EntityType.RABBIT, + true, + "$eventBossLevel &cKiller Rabbit of Caerbannog", + "dynamic"); + setUniqueLootList(Collections.singletonList("rabbit_charm.yml:1")); + setTrails(new ArrayList<>(List.of(Particle.LARGE_SMOKE.toString(), + Particle.LARGE_SMOKE.toString(), + Particle.LARGE_SMOKE.toString(), + Particle.LARGE_SMOKE.toString(), + Particle.FLAME.toString(), + Particle.FLAME.toString()))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/KrakenConfig.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/KrakenConfig.java new file mode 100644 index 000000000..1ff299231 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/KrakenConfig.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Particle; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class KrakenConfig extends CustomBossesConfigFields { + public KrakenConfig() { + super("kraken", + EntityType.ELDER_GUARDIAN, + true, + "$eventBossLevel &3Kraken", + "dynamic"); + setUniqueLootList(Collections.singletonList("rod_of_the_depths.yml:1")); + setTrails(new ArrayList<>(List.of(Particle.LARGE_SMOKE.toString(), + Particle.LARGE_SMOKE.toString(), + Particle.LARGE_SMOKE.toString(), + Particle.LARGE_SMOKE.toString(), + Particle.FLAME.toString(), + Particle.FLAME.toString()))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/LightningFaeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/LightningFaeConfig.java new file mode 100644 index 000000000..ae13646cc --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/LightningFaeConfig.java @@ -0,0 +1,24 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Particle; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class LightningFaeConfig extends CustomBossesConfigFields { + public LightningFaeConfig() { + super("lightning_fae", + EntityType.VEX, + true, + "$eventBossLevel &eLightning Fae", + "dynamic"); + setHealthMultiplier(0.3); + setDamageMultiplier(0.3); + setPowers(new ArrayList<>(List.of("attack_lightning.yml"))); + setUniqueLootList(Collections.singletonList("the_feller.yml:0.3")); + setTrails(Collections.singletonList(Particle.WITCH.toString())); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/NecronomiconSkeletonConfig.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/NecronomiconSkeletonConfig.java new file mode 100644 index 000000000..7ce48756f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/NecronomiconSkeletonConfig.java @@ -0,0 +1,18 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +public class NecronomiconSkeletonConfig extends CustomBossesConfigFields { + public NecronomiconSkeletonConfig() { + super("necronomicon_skeleton", + EntityType.SKELETON, + true, + "$reinforcementLevel &7Summoned Skeleton", + "dynamic"); + setHealthMultiplier(0.3); + setDamageMultiplier(0.1); + setDropsVanillaLoot(false); + setDropsEliteMobsLoot(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/NecronomiconZombieConfig.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/NecronomiconZombieConfig.java new file mode 100644 index 000000000..57e9d02d7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/NecronomiconZombieConfig.java @@ -0,0 +1,18 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +public class NecronomiconZombieConfig extends CustomBossesConfigFields { + public NecronomiconZombieConfig() { + super("necronomicon_zombie", + EntityType.ZOMBIE, + true, + "$reinforcementLevel &7Summoned Zombie", + "dynamic"); + setHealthMultiplier(0.3); + setDamageMultiplier(0.1); + setDropsVanillaLoot(false); + setDropsEliteMobsLoot(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/OmegaWolfBoss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/OmegaWolfBoss.java new file mode 100644 index 000000000..9ff9e1291 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/OmegaWolfBoss.java @@ -0,0 +1,25 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class OmegaWolfBoss extends CustomBossesConfigFields { + public OmegaWolfBoss() { + super("omega_wolf", + EntityType.WOLF, + true, + "$reinforcementLevel &7Omega Wolf", + "dynamic"); + setPowers(new ArrayList<>(List.of("attack_poison.yml", "moonwalk.yml"))); + HashMap damageModifiers = new HashMap<>(); + damageModifiers.put(Material.IRON_SWORD, 2D); + damageModifiers.put(Material.IRON_AXE, 2D); + setDamageModifiers(damageModifiers); + setFollowDistance(100); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/PillagerCaravanBeastBoss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/PillagerCaravanBeastBoss.java new file mode 100644 index 000000000..a96597f33 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/PillagerCaravanBeastBoss.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class PillagerCaravanBeastBoss extends CustomBossesConfigFields { + public PillagerCaravanBeastBoss() { + super("pillager_caravan_beast", + EntityType.RAVAGER, + true, + "$reinforcementLevel &cCaravan Beast", + "dynamic"); + setDropsEliteMobsLoot(false); + setDropsVanillaLoot(false); + setFollowDistance(100); + setPowers(new ArrayList<>(List.of("attack_confusing.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/PillagerCaravanGuardBoss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/PillagerCaravanGuardBoss.java new file mode 100644 index 000000000..4253cd683 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/PillagerCaravanGuardBoss.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class PillagerCaravanGuardBoss extends CustomBossesConfigFields { + public PillagerCaravanGuardBoss() { + super("pillager_caravan_guard", + EntityType.PILLAGER, + true, + "$reinforcementLevel &cCaravan Guard", + "dynamic"); + setDropsEliteMobsLoot(false); + setDropsVanillaLoot(false); + setMountedEntity("pillager_caravan_beast.yml"); + setFollowDistance(100); + setPowers(new ArrayList<>(List.of("attack_poison.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/PillagerCaravanLeaderBoss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/PillagerCaravanLeaderBoss.java new file mode 100644 index 000000000..2cebc1792 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/PillagerCaravanLeaderBoss.java @@ -0,0 +1,34 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class PillagerCaravanLeaderBoss extends CustomBossesConfigFields { + public PillagerCaravanLeaderBoss() { + super("pillager_caravan_leader", + EntityType.PILLAGER, + true, + "$eventBossLevel &cPillager Caravan Leader", + "dynamic"); + setPersistent(true); + setPowers(new ArrayList<>(List.of("bonus_loot.yml", "arrow_fireworks.yml", "arrow_rain.yml", + "summonable:summonType=ON_COMBAT_ENTER:filename=pillager_caravan_guard.yml:spawnNearby=true:inheritLevel=true", + "summonable:summonType=ON_COMBAT_ENTER:filename=pillager_caravan_guard.yml:spawnNearby=true:inheritLevel=true"))); + setMountedEntity("pillager_caravan_beast.yml"); + setFollowDistance(100); + setDamageMultiplier(2); + setHealthMultiplier(2); + setUniqueLootList(new ArrayList<>(List.of("summon_merchant_scroll.yml:0.5", + "summon_merchant_scroll.yml:0.5", + "summon_merchant_scroll.yml:0.5", + "summon_merchant_scroll.yml:0.5", + "summon_merchant_scroll.yml:0.5"))); + setSpawnMessage("&cA pillager caravan has been sighted!"); + majorBossDeathString("The pillager caravan has been vanquished!"); + setLocationMessage("&cPillager Caravan: $distance blocks away!"); + setAnnouncementPriority(2); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/QueenBeeBoss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/QueenBeeBoss.java new file mode 100644 index 000000000..8155fa69e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/QueenBeeBoss.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Particle; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class QueenBeeBoss extends CustomBossesConfigFields { + public QueenBeeBoss() { + super("queen_bee", + EntityType.BEE, + true, + "$eventBossLevel &6Queen Bee", + "dynamic"); + setPowers(new ArrayList<>(List.of("summonable:summonType=ON_HIT:chance=0.5:filename=imperial_bee_guard.yml"))); + setUniqueLootList(Collections.singletonList("the_stinger.yml:1")); + setTrails(new ArrayList<>(List.of(Particle.LARGE_SMOKE.toString(), + Particle.LARGE_SMOKE.toString(), + Particle.LARGE_SMOKE.toString(), + Particle.LARGE_SMOKE.toString(), + Particle.FLAME.toString(), + Particle.FLAME.toString()))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/RaugConfig.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/RaugConfig.java new file mode 100644 index 000000000..02850bb2b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/RaugConfig.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Particle; +import org.bukkit.entity.EntityType; + +import java.util.Collections; + +public class RaugConfig extends CustomBossesConfigFields { + public RaugConfig() { + super("raug", + EntityType.SILVERFISH, + true, + "$reinforcementLevel &4Raug", + "dynamic"); + setHealthMultiplier(0.1); + setDamageMultiplier(0.1); + setTrails(Collections.singletonList(Particle.LARGE_SMOKE.toString())); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/SnoopyConfig.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/SnoopyConfig.java new file mode 100644 index 000000000..8dd2fb819 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/SnoopyConfig.java @@ -0,0 +1,35 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * In the loving memory of Snoopy, the best boy + * January 2006 - January 2021 + * Gone but not forgotten. + */ +public class SnoopyConfig extends CustomBossesConfigFields { + public SnoopyConfig() { + super("snoopy", + EntityType.WOLF, + true, + "&6{&4☠&6} &fSnoopy", + "dynamic"); + setTimeout(3); + setHealthMultiplier(10); + setDamageMultiplier(2); + setPowers(new ArrayList<>(List.of("invulnerability_fire.yml"))); + setDropsVanillaLoot(false); + setDropsEliteMobsLoot(false); + setTrails(Collections.singletonList(Material.BONE.toString())); + setOnDamagedMessages(Collections.singletonList("Woof!")); + setOnDamageMessages(Collections.singletonList("Woof!")); + setSpawnMessage("&aAn extremely rare Snoopy has been sighted!"); + setAnnouncementPriority(3); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/SummonableWolfConfig.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/SummonableWolfConfig.java new file mode 100644 index 000000000..bab10f5dc --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/SummonableWolfConfig.java @@ -0,0 +1,24 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; + +import java.util.Collections; + +public class SummonableWolfConfig extends CustomBossesConfigFields { + public SummonableWolfConfig() { + super("summonable_wolf", + EntityType.WOLF, + true, + "$normalLevel Wolfy", + "dynamic"); + setTimeout(3); + setHealthMultiplier(3); + setDropsVanillaLoot(false); + setDropsEliteMobsLoot(false); + setTrails(Collections.singletonList(Material.BONE.toString())); + setOnDamagedMessages(Collections.singletonList("Woof!")); + setOnDamageMessages(Collections.singletonList("Woof!")); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TestCustomBossesConfig.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TestCustomBossesConfig.java new file mode 100644 index 000000000..4ec3d37c2 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TestCustomBossesConfig.java @@ -0,0 +1,49 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.Particle; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class TestCustomBossesConfig extends CustomBossesConfigFields { + public TestCustomBossesConfig() { + super("test_boss", + EntityType.ZOMBIE, + true, + "$eventBossLevel &6Test boss", + "dynamic"); + setTimeout(10); + setHealthMultiplier(2); + setDamageMultiplier(0.5); + setHelmet(new ItemStack(Material.GOLDEN_HELMET)); + setChestplate(new ItemStack(Material.IRON_CHESTPLATE)); + setLeggings(new ItemStack(Material.LEATHER_LEGGINGS)); + setBoots(new ItemStack(Material.CHAINMAIL_BOOTS)); + setMainHand(new ItemStack(Material.GOLDEN_AXE)); + setOffHand(new ItemStack(Material.SHIELD)); + setPowers(new ArrayList<>(List.of("invulnerability_knockback.yml"))); + setSpawnMessage("A test boss has been spawned!"); + setDeathMessage("A test boss has been slain by $players!"); + setDeathMessages(new ArrayList<>(List.of( + "&e&l---------------------------------------------", + "&eThe Test Boss has been debugged!", + "&c&l 1st Damager: $damager1name &cwith $damager1damage damage!", + "&6&l 2nd Damager: $damager2name &6with $damager2damage damage!", + "&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!", + "&aSlayers: $players", + "&e&l---------------------------------------------"))); + setEscapeMessage("A test boss entity has escaped!"); + setLocationMessage("Test entity: $distance"); + setUniqueLootList(Collections.singletonList("magmaguys_toothpick.yml:1")); + setTrails(Collections.singletonList(Particle.BLOCK_MARKER.toString())); + setOnDamageMessages(Collections.singletonList("I've hit you!")); + setOnDamagedMessages(Collections.singletonList("I've been hit!")); + setOnDeathCommands(Collections.singletonList("say $players has killed $name! That was level $level!")); + setAnnouncementPriority(3); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TheLivingDeadConfig.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TheLivingDeadConfig.java new file mode 100644 index 000000000..d1ba9ca78 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TheLivingDeadConfig.java @@ -0,0 +1,25 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class TheLivingDeadConfig extends CustomBossesConfigFields { + public TheLivingDeadConfig() { + super("the_living_dead", + EntityType.HUSK, + true, + "$reinforcementLevel &6The Living Dead", + "dynamic"); + setHelmet(ItemStackGenerator.generateItemStack(Material.CHAINMAIL_HELMET)); + setChestplate(ItemStackGenerator.generateItemStack(Material.CHAINMAIL_CHESTPLATE)); + setLeggings(ItemStackGenerator.generateItemStack(Material.CHAINMAIL_LEGGINGS)); + setBoots(ItemStackGenerator.generateItemStack(Material.CHAINMAIL_BOOTS)); + setPowers(new ArrayList<>(List.of("attack_fire.yml", "corpse.yml", "ground_pound.yml"))); + setFollowDistance(100); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TheReturnedConfig.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TheReturnedConfig.java new file mode 100644 index 000000000..61a7e7482 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TheReturnedConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +public class TheReturnedConfig extends CustomBossesConfigFields { + public TheReturnedConfig() { + super("the_returned", + EntityType.HUSK, + true, + "$reinforcementLevel &6The Returned", + "dynamic"); + setHealthMultiplier(0.5); + setDamageMultiplier(0.5); + setDropsEliteMobsLoot(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TotemZombie1Boss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TotemZombie1Boss.java new file mode 100644 index 000000000..756347a8b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TotemZombie1Boss.java @@ -0,0 +1,33 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class TotemZombie1Boss extends CustomBossesConfigFields { + public TotemZombie1Boss() { + super("totem_zombie_1", EntityType.ZOMBIE, true, "$eventBossLevel Head Zombie", "dynamic"); + setPersistent(true); + setMountedEntity("totem_zombie_2.yml"); + setPowers(new ArrayList<>(List.of("skeleton_tracking_arrow.yml", "attack_fireball.yml", "hyper_loot.yml"))); + setCullReinforcements(false); + setFollowDistance(100); + setHelmet(new ItemStack(Material.NETHERITE_HELMET)); + setChestplate(new ItemStack(Material.NETHERITE_CHESTPLATE)); + setLeggings(new ItemStack(Material.NETHERITE_LEGGINGS)); + setBoots(new ItemStack(Material.NETHERITE_BOOTS)); + setMainHand(new ItemStack(Material.NETHERITE_SWORD)); + setDamageMultiplier(2); + setHealthMultiplier(2); + setSpawnMessage("&cA Dr. Craftenmine abomination has been sighted!"); + setDeathMessage("&aDr. Craftenmine's abomination been terminated by $players!"); + setDeathMessages(majorBossDeathString("The Zombie Totem been slain!")); + setEscapeMessage("&4Dr. Craftenmine's creation has escaped!"); + setLocationMessage("&cZombie Totem: $distance blocks away!"); + setAnnouncementPriority(2); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TotemZombie2Boss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TotemZombie2Boss.java new file mode 100644 index 000000000..26e003c86 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TotemZombie2Boss.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class TotemZombie2Boss extends CustomBossesConfigFields { + public TotemZombie2Boss() { + super("totem_zombie_2", EntityType.ZOMBIE, true, "$eventBossLevel Totem Zombie", "dynamic"); + setMountedEntity("totem_zombie_3.yml"); + setPowers(new ArrayList<>(List.of("arrow_rain.yml", "attack_arrow.yml", "bonus_loot.yml"))); + setCullReinforcements(false); + setFollowDistance(100); + setHelmet(new ItemStack(Material.DIAMOND_HELMET)); + setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE)); + setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS)); + setBoots(new ItemStack(Material.DIAMOND_BOOTS)); + setMainHand(new ItemStack(Material.DIAMOND_SWORD)); + setDamageMultiplier(1.5); + setHealthMultiplier(1.5); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TotemZombie3Boss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TotemZombie3Boss.java new file mode 100644 index 000000000..ac4d193e5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TotemZombie3Boss.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class TotemZombie3Boss extends CustomBossesConfigFields { + public TotemZombie3Boss() { + super("totem_zombie_3", EntityType.ZOMBIE, true, "$eventBossLevel Totem Zombie", "dynamic"); + setMountedEntity("totem_zombie_4.yml"); + setPowers(new ArrayList<>(List.of("attack_lightning.yml", "attack_web.yml", "bonus_loot.yml"))); + setCullReinforcements(false); + setFollowDistance(100); + setHelmet(new ItemStack(Material.IRON_HELMET)); + setChestplate(new ItemStack(Material.IRON_CHESTPLATE)); + setLeggings(new ItemStack(Material.IRON_LEGGINGS)); + setBoots(new ItemStack(Material.IRON_BOOTS)); + setMainHand(new ItemStack(Material.IRON_SWORD)); + setDamageMultiplier(1.5); + setHealthMultiplier(1.5); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TotemZombie4Boss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TotemZombie4Boss.java new file mode 100644 index 000000000..9f8feb388 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TotemZombie4Boss.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class TotemZombie4Boss extends CustomBossesConfigFields { + public TotemZombie4Boss() { + super("totem_zombie_4", EntityType.ZOMBIE, true, "$eventBossLevel Totem Zombie", "dynamic"); + setMountedEntity("totem_zombie_5.yml"); + setPowers(new ArrayList<>(List.of("attack_push.yml", "attack_poison.yml", "bonus_loot.yml"))); + setCullReinforcements(false); + setFollowDistance(100); + setHelmet(new ItemStack(Material.CHAINMAIL_HELMET)); + setChestplate(new ItemStack(Material.CHAINMAIL_CHESTPLATE)); + setLeggings(new ItemStack(Material.CHAINMAIL_LEGGINGS)); + setBoots(new ItemStack(Material.CHAINMAIL_BOOTS)); + setMainHand(new ItemStack(Material.STONE_SWORD)); + setDamageMultiplier(1.5); + setHealthMultiplier(1.5); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TotemZombie5Boss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TotemZombie5Boss.java new file mode 100644 index 000000000..02e6d1d91 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TotemZombie5Boss.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class TotemZombie5Boss extends CustomBossesConfigFields { + public TotemZombie5Boss() { + super("totem_zombie_5", EntityType.ZOMBIE, true, "$eventBossLevel Totem Zombie", "dynamic"); + setMountedEntity("totem_zombie_6.yml"); + setPowers(new ArrayList<>(List.of("attack_gravity.yml", "attack_blinding.yml", "bonus_loot.yml"))); + setCullReinforcements(false); + setFollowDistance(100); + setHelmet(new ItemStack(Material.LEATHER_HELMET)); + setChestplate(new ItemStack(Material.LEATHER_CHESTPLATE)); + setLeggings(new ItemStack(Material.LEATHER_LEGGINGS)); + setBoots(new ItemStack(Material.LEATHER_BOOTS)); + setMainHand(new ItemStack(Material.WOODEN_SWORD)); + setDamageMultiplier(1.5); + setHealthMultiplier(1.5); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TotemZombie6Boss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TotemZombie6Boss.java new file mode 100644 index 000000000..016300fb4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TotemZombie6Boss.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class TotemZombie6Boss extends CustomBossesConfigFields { + public TotemZombie6Boss() { + super("totem_zombie_6", EntityType.ZOMBIE, true, "$eventBossLevel Totem Zombie", "dynamic"); + setBaby(true); + setHelmet(new ItemStack(Material.LEATHER_HELMET)); + setPowers(new ArrayList<>(List.of(("attack_wither.yml"), "bonus_loot.yml"))); + setCullReinforcements(false); + setFollowDistance(100); + setDamageMultiplier(1.5); + setHealthMultiplier(1.5); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TreasureGoblinBoss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TreasureGoblinBoss.java new file mode 100644 index 000000000..1824bf945 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/TreasureGoblinBoss.java @@ -0,0 +1,45 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class TreasureGoblinBoss extends CustomBossesConfigFields { + public TreasureGoblinBoss() { + super("treasure_goblin", + EntityType.ZOMBIE, + true, + "$eventBossLevel &eTreasure Goblin", + "dynamic"); + setHealthMultiplier(4); + setDamageMultiplier(2); + setHelmet(new ItemStack(Material.GOLDEN_HELMET)); + setChestplate(new ItemStack(Material.GOLDEN_CHESTPLATE)); + setLeggings(new ItemStack(Material.GOLDEN_LEGGINGS)); + setBoots(new ItemStack(Material.GOLDEN_BOOTS)); + setBaby(true); + setPowers(new ArrayList<>(List.of("gold_explosion.yml", "gold_shotgun.yml", "hyper_loot.yml", "spirit_walk.yml"))); + setSpawnMessage("&cA Treasure Goblin has been sighted!"); + setDeathMessage("&aA Treasure Goblin has been slain by $players!"); + setDeathMessages(new ArrayList<>(List.of( + "&e&l---------------------------------------------", + "&eThe Treasure Goblin has been pillaged!", + "&c&l 1st Damager: $damager1name &cwith $damager1damage damage!", + "&6&l 2nd Damager: $damager2name &6with $damager2damage damage!", + "&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!", + "&aSlayers: $players", + "&e&l---------------------------------------------"))); + setEscapeMessage("&4A Treasure Goblin has escaped!"); + setLocationMessage("&cTreasure Goblin: $distance blocks away!"); + setTrails(Collections.singletonList(Material.GOLD_NUGGET.toString())); + setAnnouncementPriority(2); + setPersistent(true); + setFollowDistance(100); + setCustomModel("em_goblin_treasure"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WeaponsGoblinBoss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WeaponsGoblinBoss.java new file mode 100644 index 000000000..e6154206b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WeaponsGoblinBoss.java @@ -0,0 +1,53 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class WeaponsGoblinBoss extends CustomBossesConfigFields { + public WeaponsGoblinBoss() { + super("weapons_goblin", + EntityType.ZOMBIE, + true, + "$eventBossLevel &cWeapons Goblin", + "dynamic"); + setHealthMultiplier(4); + setDamageMultiplier(2); + setHelmet(new ItemStack(Material.NETHERITE_HELMET)); + setChestplate(new ItemStack(Material.NETHERITE_CHESTPLATE)); + setLeggings(new ItemStack(Material.NETHERITE_LEGGINGS)); + setBoots(new ItemStack(Material.NETHERITE_BOOTS)); + setMainHand(new ItemStack(Material.NETHERITE_SWORD)); + setOffHand(new ItemStack(Material.NETHERITE_AXE)); + setBaby(true); + setPowers(new ArrayList<>(List.of("gold_explosion.yml", "gold_shotgun.yml", "spirit_walk.yml"))); + setSpawnMessage("&cA Weapons Goblin has been sighted!"); + setDeathMessage("&aA Weapons Goblin has been slain by $players!"); + setDeathMessages(new ArrayList<>(List.of( + "&e&l---------------------------------------------", + "&eThe Weapons Goblin has been pillaged!", + "&c&l 1st Damager: $damager1name &cwith $damager1damage damage!", + "&6&l 2nd Damager: $damager2name &6with $damager2damage damage!", + "&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!", + "&aSlayers: $players", + "&e&l---------------------------------------------"))); + setEscapeMessage("&4A Weapons Goblin has escaped!"); + setLocationMessage("&cWeapons Goblin: $distance blocks away!"); + setTrails(Collections.singletonList(Material.GOLD_NUGGET.toString())); + setAnnouncementPriority(2); + setPersistent(true); + setUniqueLootList(new ArrayList<>(List.of( + "goblin_slasher.yml:0.2", + "goblin_cleaver.yml:0.2", + "goblin_poker.yml:0.2", + "goblin_shooter.yml:0.2", + "goblin_ballista.yml:0.2"))); + setFollowDistance(100); + setCustomModel("em_goblin_weapon"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WildWolfBoss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WildWolfBoss.java new file mode 100644 index 000000000..586f0b64b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WildWolfBoss.java @@ -0,0 +1,18 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +public class WildWolfBoss extends CustomBossesConfigFields { + public WildWolfBoss() { + super("wild_wolf.yml", + EntityType.WOLF, + true, + "$reinforcementLevel &7Wild Wolf", + "dynamic"); + setHealthMultiplier(0.2); + setDamageMultiplier(0.2); + setDropsEliteMobsLoot(false); + setDropsVanillaLoot(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave10Boss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave10Boss.java new file mode 100644 index 000000000..d4192e19f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave10Boss.java @@ -0,0 +1,24 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave10Boss extends CustomBossesConfigFields { + public WoodLeagueWave10Boss() { + super("wood_league_wave_10_boss", + EntityType.WOLF, + true, + "$bossLevel &4Bad Doggo", + "10"); + setFollowDistance(60); + + setPowers(new ArrayList<>(List.of("ground_pound.yml", + "summonable:summonType=ON_HIT:filename=wood_league_wave_10_reinforcement.yml:amount=2:chance=0.1:inheritAggro=true:spawnNearby=true"))); + setMovementSpeedAttribute(0.6D); + setHealthMultiplier(5D); + setDamageMultiplier(2D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave10Reinforcement.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave10Reinforcement.java new file mode 100644 index 000000000..cf76b3d74 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave10Reinforcement.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +public class WoodLeagueWave10Reinforcement extends CustomBossesConfigFields { + public WoodLeagueWave10Reinforcement() { + super("wood_league_wave_10_reinforcement", + EntityType.WOLF, + true, + "$reinforcementLevel &cBad Pupper", + "10"); + setFollowDistance(60); + + setMovementSpeedAttribute(0.6D); + setHealthMultiplier(0.25D); + setDamageMultiplier(0.8D); + setDropsRandomLoot(false); + setDropsEliteMobsLoot(false); + setDropsVanillaLoot(false); + setNormalizedCombat(true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave11Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave11Melee.java new file mode 100644 index 000000000..6bc097692 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave11Melee.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave11Melee extends CustomBossesConfigFields { + public WoodLeagueWave11Melee() { + super("wood_league_wave_11_melee", + EntityType.ZOMBIE, + true, + "$normalLevel &4Arena Zombie", + "11"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml"))); + + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave11Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave11Ranged.java new file mode 100644 index 000000000..20d6a4fe4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave11Ranged.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave11Ranged extends CustomBossesConfigFields { + public WoodLeagueWave11Ranged() { + super("wood_league_wave_11_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "11"); + setFollowDistance(60); + + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_vacuum.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave12Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave12Melee.java new file mode 100644 index 000000000..6a8588b06 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave12Melee.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave12Melee extends CustomBossesConfigFields { + public WoodLeagueWave12Melee() { + super("wood_league_wave_12_melee", + EntityType.ZOMBIE, + true, + "$normalLevel &4Arena Zombie", + "12"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml"))); + + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave12Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave12Ranged.java new file mode 100644 index 000000000..3a2ccbf59 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave12Ranged.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave12Ranged extends CustomBossesConfigFields { + public WoodLeagueWave12Ranged() { + super("wood_league_wave_12_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "12"); + setFollowDistance(60); + + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_vacuum.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave13Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave13Melee.java new file mode 100644 index 000000000..713d8c092 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave13Melee.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave13Melee extends CustomBossesConfigFields { + public WoodLeagueWave13Melee() { + super("wood_league_wave_13_melee", + EntityType.ZOMBIE, + true, + "$normalLevel &4Arena Zombie", + "13"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml", "attack_poison.yml"))); + + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave13Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave13Ranged.java new file mode 100644 index 000000000..06760236f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave13Ranged.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave13Ranged extends CustomBossesConfigFields { + public WoodLeagueWave13Ranged() { + super("wood_league_wave_13_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "13"); + setFollowDistance(60); + + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_vacuum.yml", "attack_poison.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave14Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave14Melee.java new file mode 100644 index 000000000..196ea187f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave14Melee.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave14Melee extends CustomBossesConfigFields { + public WoodLeagueWave14Melee() { + super("wood_league_wave_14_melee", + EntityType.ZOMBIE, + true, + "$normalLevel &4Arena Zombie", + "14"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml"))); + + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave14Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave14Ranged.java new file mode 100644 index 000000000..b91bd881e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave14Ranged.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave14Ranged extends CustomBossesConfigFields { + public WoodLeagueWave14Ranged() { + super("wood_league_wave_14_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "14"); + setFollowDistance(60); + + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_vacuum.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave15Miniboss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave15Miniboss.java new file mode 100644 index 000000000..ba0dbc68e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave15Miniboss.java @@ -0,0 +1,24 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave15Miniboss extends CustomBossesConfigFields { + public WoodLeagueWave15Miniboss() { + super("wood_league_wave_15_miniboss", + EntityType.ZOGLIN, + true, + "$bossLevel &4Mr. Oinkers", + "15"); + setFollowDistance(60); + + setPowers(new ArrayList<>(List.of("gold_explosion.yml", "gold_shotgun.yml"))); + setMovementSpeedAttribute(0.6D); + setHealthMultiplier(3D); + setDamageMultiplier(2D); + setOnDamagedMessages(List.of("Oink!?")); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave16Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave16Melee.java new file mode 100644 index 000000000..a1e0be91d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave16Melee.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave16Melee extends CustomBossesConfigFields { + public WoodLeagueWave16Melee() { + super("wood_league_wave_16_melee", + EntityType.ZOMBIE, + true, + "$normalLevel Mr. Oinkers Fan", + "16"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml"))); + setDamageMultiplier(0.5D); + setHealthMultiplier(0.75D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave16Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave16Ranged.java new file mode 100644 index 000000000..c6948b752 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave16Ranged.java @@ -0,0 +1,25 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave16Ranged extends CustomBossesConfigFields { + public WoodLeagueWave16Ranged() { + super("wood_league_wave_16_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Mr. Oinkers Fan", + "16"); + setFollowDistance(60); + + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_vacuum.yml"))); + setDamageMultiplier(0.5D); + setHealthMultiplier(0.75D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave17Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave17Melee.java new file mode 100644 index 000000000..ed925b7ab --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave17Melee.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave17Melee extends CustomBossesConfigFields { + public WoodLeagueWave17Melee() { + super("wood_league_wave_17_melee", + EntityType.ZOMBIE, + true, + "$normalLevel &4Arena Zombie", + "17"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml", "attack_fire.yml"))); + + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave17Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave17Ranged.java new file mode 100644 index 000000000..38050f2d0 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave17Ranged.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave17Ranged extends CustomBossesConfigFields { + public WoodLeagueWave17Ranged() { + super("wood_league_wave_17_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "17"); + setFollowDistance(60); + + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_vacuum.yml", "skeleton_tracking_arrow.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave18Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave18Melee.java new file mode 100644 index 000000000..a44a7fbc4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave18Melee.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave18Melee extends CustomBossesConfigFields { + public WoodLeagueWave18Melee() { + super("wood_league_wave_18_melee", + EntityType.ZOMBIE, + true, + "$normalLevel &4Fencing Club Enthusiast", + "18"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml", "attack_fire.yml"))); + setMainHand(new ItemStack(Material.DIAMOND_SWORD)); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave19Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave19Ranged.java new file mode 100644 index 000000000..5fe608210 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave19Ranged.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave19Ranged extends CustomBossesConfigFields { + public WoodLeagueWave19Ranged() { + super("wood_league_wave_19_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Archery Club Enthusiast", + "19"); + setFollowDistance(60); + + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_vacuum.yml", "skeleton_tracking_arrow.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave1Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave1Melee.java new file mode 100644 index 000000000..b20f52daa --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave1Melee.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +public class WoodLeagueWave1Melee extends CustomBossesConfigFields { + public WoodLeagueWave1Melee() { + super("wood_league_wave_1_melee", + EntityType.ZOMBIE, + true, + "$normalLevel Arena Zombie", + "1"); + setFollowDistance(60); + + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave1Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave1Ranged.java new file mode 100644 index 000000000..7b6a9a6ea --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave1Ranged.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +public class WoodLeagueWave1Ranged extends CustomBossesConfigFields { + public WoodLeagueWave1Ranged() { + super("wood_league_wave_1_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "1"); + setMainHand(new ItemStack(Material.CROSSBOW)); + setFollowDistance(60); + + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave20Boss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave20Boss.java new file mode 100644 index 000000000..e4a9bf1cb --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave20Boss.java @@ -0,0 +1,31 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave20Boss extends CustomBossesConfigFields { + public WoodLeagueWave20Boss() { + super("wood_league_wave_20_boss", + EntityType.ZOMBIE, + true, + "$bossLevel &2Zoltan", + "20"); + setFollowDistance(60); + setHelmet(new ItemStack(Material.GOLDEN_HELMET)); + setChestplate(new ItemStack(Material.GOLDEN_CHESTPLATE)); + setLeggings(new ItemStack(Material.GOLDEN_LEGGINGS)); + setBoots(new ItemStack(Material.GOLDEN_BOOTS)); + setMainHand(new ItemStack(Material.GOLDEN_AXE)); + setOffHand(new ItemStack(Material.BOW)); + setPowers(new ArrayList<>(List.of("skeleton_tracking_arrow.yml", "zombie_bloat.yml", "shield_wall.yml", "bullet_hell.yml"))); + setMovementSpeedAttribute(0.6D); + setHealthMultiplier(5D); + setDamageMultiplier(2D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave21Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave21Melee.java new file mode 100644 index 000000000..93a88dd9a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave21Melee.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave21Melee extends CustomBossesConfigFields { + public WoodLeagueWave21Melee() { + super("wood_league_wave_21_melee", + EntityType.ZOMBIE, + true, + "$normalLevel &4Arena Zombie", + "21"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml", "attack_fire.yml"))); + setHelmet(new ItemStack(Material.LEATHER_HELMET)); + setChestplate(new ItemStack(Material.LEATHER_CHESTPLATE)); + setLeggings(new ItemStack(Material.LEATHER_LEGGINGS)); + setBoots(new ItemStack(Material.LEATHER_BOOTS)); + setMainHand(new ItemStack(Material.IRON_SWORD)); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave21Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave21Ranged.java new file mode 100644 index 000000000..75573f0a0 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave21Ranged.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave21Ranged extends CustomBossesConfigFields { + public WoodLeagueWave21Ranged() { + super("wood_league_wave_21_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "21"); + setFollowDistance(60); + setHelmet(new ItemStack(Material.LEATHER_HELMET)); + setChestplate(new ItemStack(Material.LEATHER_CHESTPLATE)); + setLeggings(new ItemStack(Material.LEATHER_LEGGINGS)); + setBoots(new ItemStack(Material.LEATHER_BOOTS)); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_vacuum.yml", "skeleton_tracking_arrow.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave22Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave22Melee.java new file mode 100644 index 000000000..f15daf5bc --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave22Melee.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave22Melee extends CustomBossesConfigFields { + public WoodLeagueWave22Melee() { + super("wood_league_wave_22_melee", + EntityType.ZOMBIE, + true, + "$normalLevel &4Arena Zombie", + "22"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml", "attack_fire.yml"))); + setHelmet(new ItemStack(Material.LEATHER_HELMET)); + setChestplate(new ItemStack(Material.LEATHER_CHESTPLATE)); + setLeggings(new ItemStack(Material.LEATHER_LEGGINGS)); + setBoots(new ItemStack(Material.LEATHER_BOOTS)); + setMainHand(new ItemStack(Material.IRON_SWORD)); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave22Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave22Ranged.java new file mode 100644 index 000000000..a16a0fbba --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave22Ranged.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave22Ranged extends CustomBossesConfigFields { + public WoodLeagueWave22Ranged() { + super("wood_league_wave_22_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "22"); + setFollowDistance(60); + setHelmet(new ItemStack(Material.LEATHER_HELMET)); + setChestplate(new ItemStack(Material.LEATHER_CHESTPLATE)); + setLeggings(new ItemStack(Material.LEATHER_LEGGINGS)); + setBoots(new ItemStack(Material.LEATHER_BOOTS)); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_vacuum.yml", "skeleton_tracking_arrow.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave23Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave23Melee.java new file mode 100644 index 000000000..2bdc87613 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave23Melee.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave23Melee extends CustomBossesConfigFields { + public WoodLeagueWave23Melee() { + super("wood_league_wave_23_melee", + EntityType.ZOMBIE, + true, + "$normalLevel &4Arena Zombie", + "23"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml", "attack_fire.yml", "attack_wither.yml"))); + setHelmet(new ItemStack(Material.LEATHER_HELMET)); + setChestplate(new ItemStack(Material.LEATHER_CHESTPLATE)); + setLeggings(new ItemStack(Material.LEATHER_LEGGINGS)); + setBoots(new ItemStack(Material.LEATHER_BOOTS)); + setMainHand(new ItemStack(Material.IRON_SWORD)); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave23Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave23Ranged.java new file mode 100644 index 000000000..0b4fcc092 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave23Ranged.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave23Ranged extends CustomBossesConfigFields { + public WoodLeagueWave23Ranged() { + super("wood_league_wave_23_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "23"); + setFollowDistance(60); + setHelmet(new ItemStack(Material.LEATHER_HELMET)); + setChestplate(new ItemStack(Material.LEATHER_CHESTPLATE)); + setLeggings(new ItemStack(Material.LEATHER_LEGGINGS)); + setBoots(new ItemStack(Material.LEATHER_BOOTS)); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_vacuum.yml", "skeleton_tracking_arrow.yml", "attack_wither.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave24Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave24Melee.java new file mode 100644 index 000000000..e5fbde528 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave24Melee.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave24Melee extends CustomBossesConfigFields { + public WoodLeagueWave24Melee() { + super("wood_league_wave_24_melee", + EntityType.ZOMBIE, + true, + "$normalLevel &4Arena Zombie", + "24"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml", "attack_fire.yml"))); + setHelmet(new ItemStack(Material.LEATHER_HELMET)); + setChestplate(new ItemStack(Material.LEATHER_CHESTPLATE)); + setLeggings(new ItemStack(Material.LEATHER_LEGGINGS)); + setBoots(new ItemStack(Material.LEATHER_BOOTS)); + setMainHand(new ItemStack(Material.IRON_SWORD)); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave24Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave24Ranged.java new file mode 100644 index 000000000..96c97685b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave24Ranged.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave24Ranged extends CustomBossesConfigFields { + public WoodLeagueWave24Ranged() { + super("wood_league_wave_24_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "24"); + setFollowDistance(60); + setHelmet(new ItemStack(Material.LEATHER_HELMET)); + setChestplate(new ItemStack(Material.LEATHER_CHESTPLATE)); + setLeggings(new ItemStack(Material.LEATHER_LEGGINGS)); + setBoots(new ItemStack(Material.LEATHER_BOOTS)); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_vacuum.yml", "skeleton_tracking_arrow.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave25Miniboss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave25Miniboss.java new file mode 100644 index 000000000..8316510bf --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave25Miniboss.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave25Miniboss extends CustomBossesConfigFields { + public WoodLeagueWave25Miniboss() { + super("wood_league_wave_25_miniboss", + EntityType.PILLAGER, + true, + "$minibossLevel &bAgdluak", + "25"); + setPowers(new ArrayList<>(List.of("frost_cone.yml", "attack_freeze.yml", "arrow_rain.yml"))); + setHealthMultiplier(3D); + setDamageMultiplier(2D); + setFollowDistance(60); + setMovementSpeedAttribute(0.6D); + setMainHand(new ItemStack(Material.CROSSBOW)); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave26Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave26Melee.java new file mode 100644 index 000000000..bd07d5414 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave26Melee.java @@ -0,0 +1,29 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave26Melee extends CustomBossesConfigFields { + public WoodLeagueWave26Melee() { + super("wood_league_wave_26_melee", + EntityType.ZOMBIE, + true, + "$normalLevel &4Arena Zombie", + "26"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml", "attack_fire.yml"))); + setHelmet(new ItemStack(Material.LEATHER_HELMET)); + setChestplate(new ItemStack(Material.LEATHER_CHESTPLATE)); + setLeggings(new ItemStack(Material.LEATHER_LEGGINGS)); + setBoots(new ItemStack(Material.LEATHER_BOOTS)); + setMainHand(new ItemStack(Material.IRON_SWORD)); + setDamageMultiplier(0.5D); + setHealthMultiplier(0.75D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave26Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave26Ranged.java new file mode 100644 index 000000000..58745f173 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave26Ranged.java @@ -0,0 +1,29 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave26Ranged extends CustomBossesConfigFields { + public WoodLeagueWave26Ranged() { + super("wood_league_wave_26_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "26"); + setFollowDistance(60); + setHelmet(new ItemStack(Material.LEATHER_HELMET)); + setChestplate(new ItemStack(Material.LEATHER_CHESTPLATE)); + setLeggings(new ItemStack(Material.LEATHER_LEGGINGS)); + setBoots(new ItemStack(Material.LEATHER_BOOTS)); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_vacuum.yml", "skeleton_tracking_arrow.yml"))); + setDamageMultiplier(0.5D); + setHealthMultiplier(0.75D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave27Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave27Melee.java new file mode 100644 index 000000000..e3782544a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave27Melee.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave27Melee extends CustomBossesConfigFields { + public WoodLeagueWave27Melee() { + super("wood_league_wave_27_melee", + EntityType.ZOMBIE, + true, + "$normalLevel &4Arena Zombie", + "27"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml", "attack_fire.yml", "invulnerability_arrow.yml"))); + setHelmet(new ItemStack(Material.LEATHER_HELMET)); + setChestplate(new ItemStack(Material.LEATHER_CHESTPLATE)); + setLeggings(new ItemStack(Material.LEATHER_LEGGINGS)); + setBoots(new ItemStack(Material.LEATHER_BOOTS)); + setMainHand(new ItemStack(Material.IRON_SWORD)); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave27Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave27Ranged.java new file mode 100644 index 000000000..da7c31f94 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave27Ranged.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave27Ranged extends CustomBossesConfigFields { + public WoodLeagueWave27Ranged() { + super("wood_league_wave_27_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "27"); + setFollowDistance(60); + setHelmet(new ItemStack(Material.LEATHER_HELMET)); + setChestplate(new ItemStack(Material.LEATHER_CHESTPLATE)); + setLeggings(new ItemStack(Material.LEATHER_LEGGINGS)); + setBoots(new ItemStack(Material.LEATHER_BOOTS)); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_freeze.yml", "skeleton_tracking_arrow.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave28Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave28Melee.java new file mode 100644 index 000000000..79dd3a530 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave28Melee.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave28Melee extends CustomBossesConfigFields { + public WoodLeagueWave28Melee() { + super("wood_league_wave_28_melee", + EntityType.ZOMBIE, + true, + "$normalLevel &4Arena Zombie", + "28"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml", "attack_fire.yml", "invulnerability_arrow.yml"))); + setHelmet(new ItemStack(Material.LEATHER_HELMET)); + setChestplate(new ItemStack(Material.LEATHER_CHESTPLATE)); + setLeggings(new ItemStack(Material.LEATHER_LEGGINGS)); + setBoots(new ItemStack(Material.LEATHER_BOOTS)); + setMainHand(new ItemStack(Material.IRON_SWORD)); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave29Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave29Ranged.java new file mode 100644 index 000000000..96427706f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave29Ranged.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave29Ranged extends CustomBossesConfigFields { + public WoodLeagueWave29Ranged() { + super("wood_league_wave_29_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "29"); + setFollowDistance(60); + setHelmet(new ItemStack(Material.LEATHER_HELMET)); + setChestplate(new ItemStack(Material.LEATHER_CHESTPLATE)); + setLeggings(new ItemStack(Material.LEATHER_LEGGINGS)); + setBoots(new ItemStack(Material.LEATHER_BOOTS)); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_freeze.yml", "skeleton_tracking_arrow.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave2Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave2Melee.java new file mode 100644 index 000000000..47e54f286 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave2Melee.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +public class WoodLeagueWave2Melee extends CustomBossesConfigFields { + public WoodLeagueWave2Melee() { + super("wood_league_wave_2_melee", + EntityType.ZOMBIE, + true, + "$normalLevel Arena Zombie", + "2"); + setFollowDistance(60); + + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave2Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave2Ranged.java new file mode 100644 index 000000000..a24e15ea6 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave2Ranged.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +public class WoodLeagueWave2Ranged extends CustomBossesConfigFields { + public WoodLeagueWave2Ranged() { + super("wood_league_wave_2_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "2"); + setMainHand(new ItemStack(Material.CROSSBOW)); + setFollowDistance(60); + + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave30Boss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave30Boss.java new file mode 100644 index 000000000..5de90d62d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave30Boss.java @@ -0,0 +1,31 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave30Boss extends CustomBossesConfigFields { + public WoodLeagueWave30Boss() { + super("wood_league_wave_30_boss", + EntityType.SKELETON, + true, + "$bossLevel &2The Southern Viper", + "30"); + setFollowDistance(60); + setHelmet(new ItemStack(Material.LEATHER_HELMET)); + setChestplate(new ItemStack(Material.LEATHER_CHESTPLATE)); + setLeggings(new ItemStack(Material.LEATHER_LEGGINGS)); + setBoots(new ItemStack(Material.LEATHER_BOOTS)); + setMainHand(new ItemStack(Material.BOW)); + setOffHand(new ItemStack(Material.TOTEM_OF_UNDYING)); + setPowers(new ArrayList<>(List.of("attack_fire.yml", "attack_poison.yml", "shield_wall.yml", "attack_wither.yml", "skeleton_tracking_arrow.yml"))); + setMovementSpeedAttribute(0.6D); + setHealthMultiplier(5D); + setDamageMultiplier(2D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave31Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave31Melee.java new file mode 100644 index 000000000..7053513f6 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave31Melee.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave31Melee extends CustomBossesConfigFields { + public WoodLeagueWave31Melee() { + super("wood_league_wave_31_melee", + EntityType.ZOMBIE, + true, + "$normalLevel &4Arena Zombie", + "31"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml", "attack_fire.yml", "invulnerability_arrow.yml"))); + setHelmet(new ItemStack(Material.IRON_HELMET)); + setChestplate(new ItemStack(Material.IRON_CHESTPLATE)); + setLeggings(new ItemStack(Material.IRON_LEGGINGS)); + setBoots(new ItemStack(Material.IRON_BOOTS)); + setMainHand(new ItemStack(Material.GOLDEN_SWORD)); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave31Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave31Ranged.java new file mode 100644 index 000000000..be6a3d8de --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave31Ranged.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave31Ranged extends CustomBossesConfigFields { + public WoodLeagueWave31Ranged() { + super("wood_league_wave_31_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "31"); + setFollowDistance(60); + setHelmet(new ItemStack(Material.IRON_HELMET)); + setChestplate(new ItemStack(Material.IRON_CHESTPLATE)); + setLeggings(new ItemStack(Material.IRON_LEGGINGS)); + setBoots(new ItemStack(Material.IRON_BOOTS)); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_freeze.yml", "skeleton_tracking_arrow.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave32Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave32Melee.java new file mode 100644 index 000000000..ac4e141ca --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave32Melee.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave32Melee extends CustomBossesConfigFields { + public WoodLeagueWave32Melee() { + super("wood_league_wave_32_melee", + EntityType.ZOMBIE, + true, + "$normalLevel &4Arena Zombie", + "32"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml", "attack_fire.yml", "invulnerability_arrow.yml"))); + setHelmet(new ItemStack(Material.IRON_HELMET)); + setChestplate(new ItemStack(Material.IRON_CHESTPLATE)); + setLeggings(new ItemStack(Material.IRON_LEGGINGS)); + setBoots(new ItemStack(Material.IRON_BOOTS)); + setMainHand(new ItemStack(Material.GOLDEN_SWORD)); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave32Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave32Ranged.java new file mode 100644 index 000000000..0ecaf5b19 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave32Ranged.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave32Ranged extends CustomBossesConfigFields { + public WoodLeagueWave32Ranged() { + super("wood_league_wave_32_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "32"); + setFollowDistance(60); + setHelmet(new ItemStack(Material.IRON_HELMET)); + setChestplate(new ItemStack(Material.IRON_CHESTPLATE)); + setLeggings(new ItemStack(Material.IRON_LEGGINGS)); + setBoots(new ItemStack(Material.IRON_BOOTS)); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_freeze.yml", "skeleton_tracking_arrow.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave33Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave33Melee.java new file mode 100644 index 000000000..42893d29c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave33Melee.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave33Melee extends CustomBossesConfigFields { + public WoodLeagueWave33Melee() { + super("wood_league_wave_33_melee", + EntityType.ZOMBIE, + true, + "$normalLevel &4Arena Zombie", + "33"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml", "attack_fire.yml", "invulnerability_arrow.yml", "attack_poison.yml"))); + setHelmet(new ItemStack(Material.IRON_HELMET)); + setChestplate(new ItemStack(Material.IRON_CHESTPLATE)); + setLeggings(new ItemStack(Material.IRON_LEGGINGS)); + setBoots(new ItemStack(Material.IRON_BOOTS)); + setMainHand(new ItemStack(Material.GOLDEN_SWORD)); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave33Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave33Ranged.java new file mode 100644 index 000000000..233883e29 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave33Ranged.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave33Ranged extends CustomBossesConfigFields { + public WoodLeagueWave33Ranged() { + super("wood_league_wave_33_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "33"); + setFollowDistance(60); + setHelmet(new ItemStack(Material.IRON_HELMET)); + setChestplate(new ItemStack(Material.IRON_CHESTPLATE)); + setLeggings(new ItemStack(Material.IRON_LEGGINGS)); + setBoots(new ItemStack(Material.IRON_BOOTS)); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_freeze.yml", "skeleton_tracking_arrow.yml", "attack_blinding.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave34Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave34Melee.java new file mode 100644 index 000000000..66d985adf --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave34Melee.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave34Melee extends CustomBossesConfigFields { + public WoodLeagueWave34Melee() { + super("wood_league_wave_34_melee", + EntityType.ZOMBIE, + true, + "$normalLevel &4Arena Zombie", + "34"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml", "attack_fire.yml", "invulnerability_arrow.yml"))); + setHelmet(new ItemStack(Material.IRON_HELMET)); + setChestplate(new ItemStack(Material.IRON_CHESTPLATE)); + setLeggings(new ItemStack(Material.IRON_LEGGINGS)); + setBoots(new ItemStack(Material.IRON_BOOTS)); + setMainHand(new ItemStack(Material.GOLDEN_SWORD)); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave34Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave34Ranged.java new file mode 100644 index 000000000..5240114cb --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave34Ranged.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave34Ranged extends CustomBossesConfigFields { + public WoodLeagueWave34Ranged() { + super("wood_league_wave_34_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "34"); + setFollowDistance(60); + setHelmet(new ItemStack(Material.IRON_HELMET)); + setChestplate(new ItemStack(Material.IRON_CHESTPLATE)); + setLeggings(new ItemStack(Material.IRON_LEGGINGS)); + setBoots(new ItemStack(Material.IRON_BOOTS)); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_freeze.yml", "skeleton_tracking_arrow.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave35Miniboss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave35Miniboss.java new file mode 100644 index 000000000..2fabd52ac --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave35Miniboss.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave35Miniboss extends CustomBossesConfigFields { + public WoodLeagueWave35Miniboss() { + super("wood_league_wave_35_miniboss", + EntityType.VINDICATOR, + true, + "$minibossLevel &6The Jester", + "35"); + setPowers(new ArrayList<>(List.of("attack_confusing.yml", "attack_push.yml", "attack_gravity.yml", "fireworks_barrage.yml", "arrow_fireworks.yml"))); + setHealthMultiplier(3D); + setDamageMultiplier(2D); + setFollowDistance(60); + setMovementSpeedAttribute(0.6D); + setMainHand(new ItemStack(Material.GOLDEN_AXE)); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave36Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave36Melee.java new file mode 100644 index 000000000..ab69d8b08 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave36Melee.java @@ -0,0 +1,29 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave36Melee extends CustomBossesConfigFields { + public WoodLeagueWave36Melee() { + super("wood_league_wave_36_melee", + EntityType.ZOMBIE, + true, + "$normalLevel &4Arena Zombie", + "36"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml", "attack_fire.yml", "invulnerability_arrow.yml"))); + setHelmet(new ItemStack(Material.IRON_HELMET)); + setChestplate(new ItemStack(Material.IRON_CHESTPLATE)); + setLeggings(new ItemStack(Material.IRON_LEGGINGS)); + setBoots(new ItemStack(Material.IRON_BOOTS)); + setMainHand(new ItemStack(Material.GOLDEN_SWORD)); + setDamageMultiplier(0.5D); + setHealthMultiplier(0.75D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave36Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave36Ranged.java new file mode 100644 index 000000000..c4f042f25 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave36Ranged.java @@ -0,0 +1,29 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave36Ranged extends CustomBossesConfigFields { + public WoodLeagueWave36Ranged() { + super("wood_league_wave_36_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "36"); + setFollowDistance(60); + setHelmet(new ItemStack(Material.IRON_HELMET)); + setChestplate(new ItemStack(Material.IRON_CHESTPLATE)); + setLeggings(new ItemStack(Material.IRON_LEGGINGS)); + setBoots(new ItemStack(Material.IRON_BOOTS)); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_freeze.yml", "skeleton_tracking_arrow.yml"))); + setDamageMultiplier(0.5D); + setHealthMultiplier(0.75D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave37Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave37Melee.java new file mode 100644 index 000000000..0355da1bb --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave37Melee.java @@ -0,0 +1,28 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave37Melee extends CustomBossesConfigFields { + public WoodLeagueWave37Melee() { + super("wood_league_wave_37_melee", + EntityType.ZOMBIE, + true, + "$normalLevel &4Arena Zombie", + "37"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml", "attack_fire.yml", "invulnerability_arrow.yml"))); + setHelmet(new ItemStack(Material.IRON_HELMET)); + setChestplate(new ItemStack(Material.IRON_CHESTPLATE)); + setLeggings(new ItemStack(Material.IRON_LEGGINGS)); + setBoots(new ItemStack(Material.IRON_BOOTS)); + setMainHand(new ItemStack(Material.GOLDEN_SWORD)); + setMovementSpeedAttribute(0.3D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave37Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave37Ranged.java new file mode 100644 index 000000000..1c0266826 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave37Ranged.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave37Ranged extends CustomBossesConfigFields { + public WoodLeagueWave37Ranged() { + super("wood_league_wave_37_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "37"); + setFollowDistance(60); + setHelmet(new ItemStack(Material.IRON_HELMET)); + setChestplate(new ItemStack(Material.IRON_CHESTPLATE)); + setLeggings(new ItemStack(Material.IRON_LEGGINGS)); + setBoots(new ItemStack(Material.IRON_BOOTS)); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_freeze.yml", "skeleton_tracking_arrow.yml", "shield_wall.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave38Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave38Melee.java new file mode 100644 index 000000000..94ba133e3 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave38Melee.java @@ -0,0 +1,28 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave38Melee extends CustomBossesConfigFields { + public WoodLeagueWave38Melee() { + super("wood_league_wave_38_melee", + EntityType.ZOMBIE, + true, + "$normalLevel &4Arena Swordsman", + "38"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml", "attack_fire.yml", "invulnerability_arrow.yml"))); + setHelmet(new ItemStack(Material.IRON_HELMET)); + setChestplate(new ItemStack(Material.IRON_CHESTPLATE)); + setLeggings(new ItemStack(Material.IRON_LEGGINGS)); + setBoots(new ItemStack(Material.IRON_BOOTS)); + setMainHand(new ItemStack(Material.GOLDEN_SWORD)); + setMovementSpeedAttribute(0.3D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave39Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave39Ranged.java new file mode 100644 index 000000000..25ab6c108 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave39Ranged.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave39Ranged extends CustomBossesConfigFields { + public WoodLeagueWave39Ranged() { + super("wood_league_wave_39_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Archer", + "39"); + setFollowDistance(60); + setHelmet(new ItemStack(Material.IRON_HELMET)); + setChestplate(new ItemStack(Material.IRON_CHESTPLATE)); + setLeggings(new ItemStack(Material.IRON_LEGGINGS)); + setBoots(new ItemStack(Material.IRON_BOOTS)); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_freeze.yml", "skeleton_tracking_arrow.yml", "shield_wall.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave3Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave3Melee.java new file mode 100644 index 000000000..f803211a9 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave3Melee.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave3Melee extends CustomBossesConfigFields { + public WoodLeagueWave3Melee() { + super("wood_league_wave_3_melee", + EntityType.ZOMBIE, + true, + "$normalLevel Arena Zombie", + "3"); + setPowers(new ArrayList<>(List.of("attack_fire.yml"))); + setFollowDistance(60); + + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave3Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave3Ranged.java new file mode 100644 index 000000000..f64c5357a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave3Ranged.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave3Ranged extends CustomBossesConfigFields { + public WoodLeagueWave3Ranged() { + super("wood_league_wave_3_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "3"); + setMainHand(new ItemStack(Material.CROSSBOW)); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("attack_fire.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave40Boss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave40Boss.java new file mode 100644 index 000000000..51b85f17f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave40Boss.java @@ -0,0 +1,31 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave40Boss extends CustomBossesConfigFields { + public WoodLeagueWave40Boss() { + super("wood_league_wave_40_boss", + EntityType.SKELETON, + true, + "$bossLevel &cCrucio the Bearer of Curses", + "40"); + setFollowDistance(60); + setHelmet(new ItemStack(Material.DIAMOND_HELMET)); + setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE)); + setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS)); + setBoots(new ItemStack(Material.DIAMOND_BOOTS)); + setMainHand(new ItemStack(Material.DIAMOND_SWORD)); + setOffHand(new ItemStack(Material.SHIELD)); + setPowers(new ArrayList<>(List.of("attack_wither.yml", "attack_poison.yml", "shield_wall.yml", "bullet_hell.yml", "skeleton_tracking_arrow.yml", "flame_pyre.yml"))); + setMovementSpeedAttribute(0.6D); + setHealthMultiplier(5D); + setDamageMultiplier(2D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave41Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave41Melee.java new file mode 100644 index 000000000..eef118f96 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave41Melee.java @@ -0,0 +1,28 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave41Melee extends CustomBossesConfigFields { + public WoodLeagueWave41Melee() { + super("wood_league_wave_41_melee", + EntityType.ZOMBIE, + true, + "$normalLevel &4Arena Zombie", + "41"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml", "attack_fire.yml", "invulnerability_arrow.yml"))); + setHelmet(new ItemStack(Material.DIAMOND_HELMET)); + setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE)); + setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS)); + setBoots(new ItemStack(Material.DIAMOND_BOOTS)); + setMainHand(new ItemStack(Material.GOLDEN_SWORD)); + setMovementSpeedAttribute(0.3D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave41Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave41Ranged.java new file mode 100644 index 000000000..13b1ffbee --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave41Ranged.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class WoodLeagueWave41Ranged extends CustomBossesConfigFields { + public WoodLeagueWave41Ranged() { + super("wood_league_wave_41_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "41"); + setFollowDistance(60); + setHelmet(new ItemStack(Material.DIAMOND_HELMET)); + setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE)); + setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS)); + setBoots(new ItemStack(Material.DIAMOND_BOOTS)); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_freeze.yml", "skeleton_tracking_arrow.yml", "shield_wall.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave42Healer.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave42Healer.java new file mode 100644 index 000000000..78cc5a456 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave42Healer.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave42Healer extends CustomBossesConfigFields { + public WoodLeagueWave42Healer() { + super("wood_league_wave_42_healer", + EntityType.PILLAGER, + true, + "$normalLevel Arena Healer", + "42"); + setFollowDistance(60); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("channel_healing.yml"))); + setHealthMultiplier(.5D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave42Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave42Melee.java new file mode 100644 index 000000000..ac410b316 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave42Melee.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave42Melee extends CustomBossesConfigFields { + public WoodLeagueWave42Melee() { + super("wood_league_wave_42_melee", + EntityType.ZOMBIE, + true, + "$normalLevel &4Arena Zombie", + "42"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml", "attack_fire.yml", "invulnerability_arrow.yml"))); + setHelmet(new ItemStack(Material.DIAMOND_HELMET)); + setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE)); + setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS)); + setBoots(new ItemStack(Material.DIAMOND_BOOTS)); + setMainHand(new ItemStack(Material.DIAMOND_SWORD)); + setMovementSpeedAttribute(0.3D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave42Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave42Ranged.java new file mode 100644 index 000000000..56385d9d1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave42Ranged.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave42Ranged extends CustomBossesConfigFields { + public WoodLeagueWave42Ranged() { + super("wood_league_wave_42_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "42"); + setFollowDistance(60); + setHelmet(new ItemStack(Material.DIAMOND_HELMET)); + setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE)); + setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS)); + setBoots(new ItemStack(Material.DIAMOND_BOOTS)); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_freeze.yml", "skeleton_tracking_arrow.yml", "shield_wall.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave43Healer.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave43Healer.java new file mode 100644 index 000000000..81507655c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave43Healer.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave43Healer extends CustomBossesConfigFields { + public WoodLeagueWave43Healer() { + super("wood_league_wave_43_healer", + EntityType.PILLAGER, + true, + "$normalLevel Arena Healer", + "43"); + setFollowDistance(60); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("channel_healing.yml"))); + setHealthMultiplier(.5D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave43Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave43Melee.java new file mode 100644 index 000000000..55498f3ef --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave43Melee.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave43Melee extends CustomBossesConfigFields { + public WoodLeagueWave43Melee() { + super("wood_league_wave_43_melee", + EntityType.ZOMBIE, + true, + "$normalLevel &4Arena Zombie", + "43"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml", "attack_fire.yml", "invulnerability_arrow.yml", "attack_poison.yml"))); + setHelmet(new ItemStack(Material.DIAMOND_HELMET)); + setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE)); + setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS)); + setBoots(new ItemStack(Material.DIAMOND_BOOTS)); + setMainHand(new ItemStack(Material.DIAMOND_SWORD)); + setMovementSpeedAttribute(0.3D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave43Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave43Ranged.java new file mode 100644 index 000000000..2edca9c83 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave43Ranged.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave43Ranged extends CustomBossesConfigFields { + public WoodLeagueWave43Ranged() { + super("wood_league_wave_43_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "43"); + setFollowDistance(60); + setHelmet(new ItemStack(Material.DIAMOND_HELMET)); + setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE)); + setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS)); + setBoots(new ItemStack(Material.DIAMOND_BOOTS)); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_freeze.yml", "skeleton_tracking_arrow.yml", "shield_wall.yml", "attack_wither.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave44Healer.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave44Healer.java new file mode 100644 index 000000000..8355fa282 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave44Healer.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave44Healer extends CustomBossesConfigFields { + public WoodLeagueWave44Healer() { + super("wood_league_wave_44_healer", + EntityType.PILLAGER, + true, + "$normalLevel Arena Healer", + "44"); + setFollowDistance(60); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("channel_healing.yml"))); + setHealthMultiplier(.5D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave44Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave44Melee.java new file mode 100644 index 000000000..f710abe90 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave44Melee.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave44Melee extends CustomBossesConfigFields { + public WoodLeagueWave44Melee() { + super("wood_league_wave_44_melee", + EntityType.ZOMBIE, + true, + "$normalLevel &4Arena Zombie", + "44"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml", "attack_fire.yml", "invulnerability_arrow.yml"))); + setHelmet(new ItemStack(Material.DIAMOND_HELMET)); + setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE)); + setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS)); + setBoots(new ItemStack(Material.DIAMOND_BOOTS)); + setMainHand(new ItemStack(Material.DIAMOND_SWORD)); + setMovementSpeedAttribute(0.3D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave44Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave44Ranged.java new file mode 100644 index 000000000..9aca81908 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave44Ranged.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave44Ranged extends CustomBossesConfigFields { + public WoodLeagueWave44Ranged() { + super("wood_league_wave_44_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "44"); + setFollowDistance(60); + setHelmet(new ItemStack(Material.DIAMOND_HELMET)); + setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE)); + setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS)); + setBoots(new ItemStack(Material.DIAMOND_BOOTS)); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_freeze.yml", "skeleton_tracking_arrow.yml", "shield_wall.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave45Miniboss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave45Miniboss.java new file mode 100644 index 000000000..cc62aebe8 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave45Miniboss.java @@ -0,0 +1,25 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave45Miniboss extends CustomBossesConfigFields { + public WoodLeagueWave45Miniboss() { + super("wood_league_wave_45_miniboss", + EntityType.VINDICATOR, + true, + "$minibossLevel &6Thousand Blades", + "45"); + setPowers(new ArrayList<>(List.of("attack_arrow.yml", "arrow_rain.yml", "arrow_fireworks.yml", "attack_fireball.yml", "bullet_hell.yml", "meteor_shower.yml"))); + setHealthMultiplier(3D); + setDamageMultiplier(2D); + setFollowDistance(60); + setMovementSpeedAttribute(0.6D); + setMainHand(new ItemStack(Material.GOLDEN_AXE)); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave46Healer.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave46Healer.java new file mode 100644 index 000000000..25ced2418 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave46Healer.java @@ -0,0 +1,25 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave46Healer extends CustomBossesConfigFields { + public WoodLeagueWave46Healer() { + super("wood_league_wave_46_healer", + EntityType.PILLAGER, + true, + "$normalLevel Arena Healer", + "46"); + setFollowDistance(60); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("channel_healing.yml"))); + setDamageMultiplier(0.5D); + setHealthMultiplier(0.75D); + setHealthMultiplier(.5D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave46Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave46Melee.java new file mode 100644 index 000000000..a804e01ec --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave46Melee.java @@ -0,0 +1,29 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave46Melee extends CustomBossesConfigFields { + public WoodLeagueWave46Melee() { + super("wood_league_wave_46_melee", + EntityType.ZOMBIE, + true, + "$normalLevel &4Arena Zombie", + "46"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml", "attack_fire.yml", "invulnerability_arrow.yml"))); + setHelmet(new ItemStack(Material.DIAMOND_HELMET)); + setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE)); + setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS)); + setBoots(new ItemStack(Material.DIAMOND_BOOTS)); + setMainHand(new ItemStack(Material.DIAMOND_SWORD)); + setMovementSpeedAttribute(0.3D); + setDamageMultiplier(0.5D); + setHealthMultiplier(0.75D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave46Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave46Ranged.java new file mode 100644 index 000000000..9325c74dc --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave46Ranged.java @@ -0,0 +1,28 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave46Ranged extends CustomBossesConfigFields { + public WoodLeagueWave46Ranged() { + super("wood_league_wave_46_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "46"); + setFollowDistance(60); + setHelmet(new ItemStack(Material.DIAMOND_HELMET)); + setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE)); + setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS)); + setBoots(new ItemStack(Material.DIAMOND_BOOTS)); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_freeze.yml", "skeleton_tracking_arrow.yml", "shield_wall.yml"))); + setDamageMultiplier(0.5D); + setHealthMultiplier(0.75D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave47Healer.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave47Healer.java new file mode 100644 index 000000000..0935104c8 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave47Healer.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave47Healer extends CustomBossesConfigFields { + public WoodLeagueWave47Healer() { + super("wood_league_wave_47_healer", + EntityType.PILLAGER, + true, + "$normalLevel Arena Healer", + "47"); + setFollowDistance(60); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("channel_healing.yml"))); + setHealthMultiplier(.5D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave47Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave47Melee.java new file mode 100644 index 000000000..10a902c1c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave47Melee.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave47Melee extends CustomBossesConfigFields { + public WoodLeagueWave47Melee() { + super("wood_league_wave_47_melee", + EntityType.ZOMBIE, + true, + "$normalLevel &4Arena Zombie", + "47"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml", "attack_fire.yml", "invulnerability_arrow.yml"))); + setHelmet(new ItemStack(Material.DIAMOND_HELMET)); + setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE)); + setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS)); + setBoots(new ItemStack(Material.DIAMOND_BOOTS)); + setMainHand(new ItemStack(Material.DIAMOND_SWORD)); + setMovementSpeedAttribute(0.3D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave47Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave47Ranged.java new file mode 100644 index 000000000..bcfcc5e15 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave47Ranged.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave47Ranged extends CustomBossesConfigFields { + public WoodLeagueWave47Ranged() { + super("wood_league_wave_47_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "47"); + setFollowDistance(60); + setHelmet(new ItemStack(Material.DIAMOND_HELMET)); + setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE)); + setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS)); + setBoots(new ItemStack(Material.DIAMOND_BOOTS)); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_freeze.yml", "skeleton_tracking_arrow.yml", "shield_wall.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave48Healer.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave48Healer.java new file mode 100644 index 000000000..a9c8c7175 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave48Healer.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave48Healer extends CustomBossesConfigFields { + public WoodLeagueWave48Healer() { + super("wood_league_wave_48_healer", + EntityType.PILLAGER, + true, + "$normalLevel Arena Healer", + "48"); + setFollowDistance(60); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("channel_healing.yml"))); + setHealthMultiplier(.5D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave48Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave48Melee.java new file mode 100644 index 000000000..4a82ca2d7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave48Melee.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave48Melee extends CustomBossesConfigFields { + public WoodLeagueWave48Melee() { + super("wood_league_wave_48_melee", + EntityType.ZOMBIE, + true, + "$normalLevel &4Arena Zombie", + "48"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml", "attack_fire.yml", "invulnerability_arrow.yml"))); + setHelmet(new ItemStack(Material.DIAMOND_HELMET)); + setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE)); + setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS)); + setBoots(new ItemStack(Material.DIAMOND_BOOTS)); + setMainHand(new ItemStack(Material.DIAMOND_SWORD)); + setMovementSpeedAttribute(0.3D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave49Healer.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave49Healer.java new file mode 100644 index 000000000..82047ad8d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave49Healer.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave49Healer extends CustomBossesConfigFields { + public WoodLeagueWave49Healer() { + super("wood_league_wave_49_healer", + EntityType.PILLAGER, + true, + "$normalLevel Arena Healer", + "49"); + setFollowDistance(60); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("channel_healing.yml"))); + setHealthMultiplier(.5D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave49Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave49Ranged.java new file mode 100644 index 000000000..45d6dd3f1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave49Ranged.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave49Ranged extends CustomBossesConfigFields { + public WoodLeagueWave49Ranged() { + super("wood_league_wave_49_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "49"); + setFollowDistance(60); + setHelmet(new ItemStack(Material.DIAMOND_HELMET)); + setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE)); + setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS)); + setBoots(new ItemStack(Material.DIAMOND_BOOTS)); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_freeze.yml", "skeleton_tracking_arrow.yml", "shield_wall.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave4Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave4Melee.java new file mode 100644 index 000000000..4cfbc05f1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave4Melee.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +public class WoodLeagueWave4Melee extends CustomBossesConfigFields { + public WoodLeagueWave4Melee() { + super("wood_league_wave_4_melee", + EntityType.ZOMBIE, + true, + "$normalLevel Arena Zombie", + "4"); + setFollowDistance(60); + + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave4Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave4Ranged.java new file mode 100644 index 000000000..35009171b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave4Ranged.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +public class WoodLeagueWave4Ranged extends CustomBossesConfigFields { + public WoodLeagueWave4Ranged() { + super("wood_league_wave_4_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "4"); + setMainHand(new ItemStack(Material.CROSSBOW)); + setFollowDistance(60); + + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave50Boss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave50Boss.java new file mode 100644 index 000000000..746e236e7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave50Boss.java @@ -0,0 +1,34 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave50Boss extends CustomBossesConfigFields { + public WoodLeagueWave50Boss() { + super("wood_league_wave_50_boss", + EntityType.WITHER_SKELETON, + true, + "$bossLevel &6Uther the Champion", + "50"); + setFollowDistance(60); + setMainHand(new ItemStack(Material.NETHERITE_AXE)); + setOffHand(new ItemStack(Material.SHIELD)); + setPowers(new ArrayList<>(List.of("ground_pound.yml", + "shield_wall.yml", + "bullet_hell.yml", + "arrow_fireworks.yml", + "fireworks_barrage.yml", + "summonable:summonType=ON_COMBAT_ENTER:filename=wood_league_wave_50_reinforcement.yml:amount=2"))); + setMovementSpeedAttribute(0.4D); + setHealthMultiplier(10D); + setDamageMultiplier(1D); + setPhases(new ArrayList<>(new ArrayList<>(List.of( + "wood_league_wave_50_boss_p2.yml:0.66", + "wood_league_wave_50_boss_p3.yml:0.33")))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave50BossP2.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave50BossP2.java new file mode 100644 index 000000000..f06687790 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave50BossP2.java @@ -0,0 +1,31 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave50BossP2 extends CustomBossesConfigFields { + public WoodLeagueWave50BossP2() { + super("wood_league_wave_50_boss_p2", + EntityType.WITHER_SKELETON, + true, + "$bossLevel &6Uther the Champion", + "50"); + setFollowDistance(60); + setMainHand(new ItemStack(Material.NETHERITE_AXE)); + setOffHand(new ItemStack(Material.SHIELD)); + setPowers(new ArrayList<>(List.of("firestorm.yml", + "flame_pyre.yml", + "flamethrower.yml", + "death_slice.yml", + "firestorm.yml", + "summonable:summonType=ON_COMBAT_ENTER:filename=wood_league_wave_50_reinforcement.yml:amount=2"))); + setMovementSpeedAttribute(0.5D); + setHealthMultiplier(10D); + setDamageMultiplier(1D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave50BossP3.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave50BossP3.java new file mode 100644 index 000000000..c895ecebf --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave50BossP3.java @@ -0,0 +1,31 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave50BossP3 extends CustomBossesConfigFields { + public WoodLeagueWave50BossP3() { + super("wood_league_wave_50_boss_p3", + EntityType.WITHER_SKELETON, + true, + "$bossLevel &6Uther the Champion", + "50"); + setFollowDistance(60); + setMainHand(new ItemStack(Material.NETHERITE_AXE)); + setOffHand(new ItemStack(Material.SHIELD)); + setPowers(new ArrayList<>(List.of("attack_lightning.yml", + "lightning_bolts.yml", + "gold_explosion.yml", + "photon_ray.yml", + "thunderstorm.yml", + "summonable:summonType=ON_COMBAT_ENTER:filename=wood_league_wave_50_reinforcement.yml:amount=2"))); + setMovementSpeedAttribute(0.6D); + setHealthMultiplier(10D); + setDamageMultiplier(1D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave50Reinforcement.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave50Reinforcement.java new file mode 100644 index 000000000..147a71fa2 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave50Reinforcement.java @@ -0,0 +1,29 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave50Reinforcement extends CustomBossesConfigFields { + public WoodLeagueWave50Reinforcement() { + super("wood_league_wave_50_reinforcement", + EntityType.PILLAGER, + true, + "$reinforcementLevel &6Uther Stan", + "50"); + setFollowDistance(60); + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("channel_healing.yml"))); + setMovementSpeedAttribute(0.6D); + setHealthMultiplier(0.25D); + setDamageMultiplier(0.8D); + setDropsRandomLoot(false); + setDropsEliteMobsLoot(false); + setDropsVanillaLoot(false); + setNormalizedCombat(true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave5Miniboss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave5Miniboss.java new file mode 100644 index 000000000..ab27a49aa --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave5Miniboss.java @@ -0,0 +1,24 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave5Miniboss extends CustomBossesConfigFields { + public WoodLeagueWave5Miniboss() { + super("wood_league_wave_5_miniboss", + EntityType.RAVAGER, + true, + "$minibossLevel &cWeird Cow", + "5"); + setPowers(new ArrayList<>(List.of("attack_push.yml", "attack_gravity.yml"))); + setOnDamagedMessages(List.of("Woof!")); + setHealthMultiplier(3D); + setDamageMultiplier(2D); + setFollowDistance(60); + setMovementSpeedAttribute(0.6D); + + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave6Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave6Melee.java new file mode 100644 index 000000000..a0fd5cd6a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave6Melee.java @@ -0,0 +1,18 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +public class WoodLeagueWave6Melee extends CustomBossesConfigFields { + public WoodLeagueWave6Melee() { + super("wood_league_wave_6_melee", + EntityType.ZOMBIE, + true, + "$normalLevel Arena Zombie", + "6"); + setFollowDistance(60); + + setDamageMultiplier(0.5D); + setHealthMultiplier(0.75D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave6Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave6Ranged.java new file mode 100644 index 000000000..a4d562b6a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave6Ranged.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +public class WoodLeagueWave6Ranged extends CustomBossesConfigFields { + public WoodLeagueWave6Ranged() { + super("wood_league_wave_6_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "6"); + setFollowDistance(60); + + setMainHand(new ItemStack(Material.CROSSBOW)); + setDamageMultiplier(0.5D); + setHealthMultiplier(0.75D); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave7Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave7Melee.java new file mode 100644 index 000000000..3df50aa28 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave7Melee.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave7Melee extends CustomBossesConfigFields { + public WoodLeagueWave7Melee() { + super("wood_league_wave_7_melee", + EntityType.ZOMBIE, + true, + "$normalLevel Arena Zombie", + "7"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave7Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave7Ranged.java new file mode 100644 index 000000000..70e402b58 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave7Ranged.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave7Ranged extends CustomBossesConfigFields { + public WoodLeagueWave7Ranged() { + super("wood_league_wave_7_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "7"); + setFollowDistance(60); + + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_vacuum.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave8Melee.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave8Melee.java new file mode 100644 index 000000000..14f9540a2 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave8Melee.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave8Melee extends CustomBossesConfigFields { + public WoodLeagueWave8Melee() { + super("wood_league_wave_8_melee", + EntityType.ZOMBIE, + true, + "$normalLevel Arena Zombie", + "8"); + setFollowDistance(60); + setPowers(new ArrayList<>(List.of("corpse.yml"))); + + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave9Ranged.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave9Ranged.java new file mode 100644 index 000000000..7e1fd96e2 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/WoodLeagueWave9Ranged.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class WoodLeagueWave9Ranged extends CustomBossesConfigFields { + public WoodLeagueWave9Ranged() { + super("wood_league_wave_9_ranged", + EntityType.PILLAGER, + true, + "$normalLevel Arena Crossbowman", + "9"); + setFollowDistance(60); + + setMainHand(new ItemStack(Material.CROSSBOW)); + setPowers(new ArrayList<>(List.of("attack_vacuum.yml"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/ZombieDadConfig.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/ZombieDadConfig.java new file mode 100644 index 000000000..ed597add0 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/ZombieDadConfig.java @@ -0,0 +1,18 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +public class ZombieDadConfig extends CustomBossesConfigFields { + public ZombieDadConfig() { + super("zombie_parents_dad", + EntityType.SKELETON, + true, + "$reinforcementLevel &7Zombie Dad", + "dynamic"); + setHealthMultiplier(0.5); + setDamageMultiplier(0.5); + setDropsVanillaLoot(false); + setDropsEliteMobsLoot(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/ZombieFriendConfig.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/ZombieFriendConfig.java new file mode 100644 index 000000000..50cacd3d6 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/ZombieFriendConfig.java @@ -0,0 +1,18 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +public class ZombieFriendConfig extends CustomBossesConfigFields { + public ZombieFriendConfig() { + super("zombie_friends_friend", + EntityType.ZOMBIE, + true, + "$reinforcementLevel &7Zombie Friend", + "dynamic"); + setHealthMultiplier(0.5); + setDamageMultiplier(0.5); + setDropsVanillaLoot(false); + setDropsEliteMobsLoot(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/ZombieKingBoss.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/ZombieKingBoss.java new file mode 100644 index 000000000..0c5b98ef8 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/ZombieKingBoss.java @@ -0,0 +1,39 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.Material; +import org.bukkit.Particle; +import org.bukkit.entity.EntityType; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class ZombieKingBoss extends CustomBossesConfigFields { + public ZombieKingBoss() { + super("zombie_king", + EntityType.ZOMBIE, + true, + "$eventBossLevel &4Zombie King", + "dynamic"); + setPersistent(true); + setHealthMultiplier(4); + setDamageMultiplier(2); + setHelmet(new ItemStack(Material.DIAMOND_HELMET)); + setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE)); + setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS)); + setBoots(new ItemStack(Material.DIAMOND_BOOTS)); + setMainHand(new ItemStack(Material.GOLDEN_AXE)); + setPowers(new ArrayList<>(List.of("flame_pyre.yml", "flamethrower.yml", "summon_the_returned.yml", "spirit_walk.yml", + "summonable:summonType=GLOBAL:filename=the_living_dead.yml:amount=5:customSpawn=normal_surface_spawn.yml"))); + setSpawnMessage("&cThe Zombie King has been sighted!"); + setDeathMessage("&aThe Zombie King has been slain by $players!"); + majorBossDeathString("The Zombie King has been slain!"); + setEscapeMessage("&4The Zombie King has escaped!"); + setLocationMessage("&cZombie King: $distance blocks away!"); + setUniqueLootList(Collections.singletonList("zombie_kings_axe.yml:1")); + setTrails(Collections.singletonList(Particle.FLAME.toString())); + setAnnouncementPriority(2); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/ZombieMomConfig.java b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/ZombieMomConfig.java new file mode 100644 index 000000000..82ea4c632 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/custombosses/premade/ZombieMomConfig.java @@ -0,0 +1,18 @@ +package com.magmaguy.elitemobs.config.custombosses.premade; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import org.bukkit.entity.EntityType; + +public class ZombieMomConfig extends CustomBossesConfigFields { + public ZombieMomConfig() { + super("zombie_parents_mom", + EntityType.SKELETON, + true, + "$reinforcementLevel &7Zombie Mom", + "dynamic"); + setHealthMultiplier(0.5); + setDamageMultiplier(0.5); + setDropsVanillaLoot(false); + setDropsEliteMobsLoot(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customevents/CustomEventsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customevents/CustomEventsConfig.java new file mode 100644 index 000000000..721728f5c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customevents/CustomEventsConfig.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.customevents; + +import com.magmaguy.magmacore.config.CustomConfig; + +import java.util.HashMap; + +public class CustomEventsConfig extends CustomConfig { + + private static HashMap customEvents; + + public CustomEventsConfig() { + super("customevents", "com.magmaguy.elitemobs.config.customevents.premade", CustomEventsConfigFields.class); + customEvents = new HashMap<>(); + for (String key : super.getCustomConfigFieldsHashMap().keySet()) + if (super.getCustomConfigFieldsHashMap().get(key).isEnabled()) + customEvents.put(key, (CustomEventsConfigFields) super.getCustomConfigFieldsHashMap().get(key)); + } + + public static HashMap getCustomEvents() { + return customEvents; + } + + public static CustomEventsConfigFields getCustomEvent(String fileName) { + return customEvents.get(fileName); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customevents/CustomEventsConfigFields.java b/src/main/java/com/magmaguy/elitemobs/config/customevents/CustomEventsConfigFields.java new file mode 100644 index 000000000..40bd8614d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customevents/CustomEventsConfigFields.java @@ -0,0 +1,98 @@ +package com.magmaguy.elitemobs.config.customevents; + +import com.magmaguy.elitemobs.config.CustomConfigFields; +import com.magmaguy.elitemobs.events.CustomEvent; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class CustomEventsConfigFields extends CustomConfigFields { + + @Getter + @Setter + private CustomEvent.EventType eventType = CustomEvent.EventType.DEFAULT; + @Getter + @Setter + private List bossFilenames = new ArrayList<>(); + @Getter + @Setter + private String startMessage; + @Getter + @Setter + private String endMessage; + @Getter + @Setter + private List eventStartCommands = new ArrayList<>(); + @Getter + @Setter + private List eventEndCommands = new ArrayList<>(); + @Getter + @Setter + private int announcementPriority = 0; + @Getter + @Setter + private double chance = 0; + @Getter + @Setter + private List breakableMaterials = new ArrayList<>(); + @Getter + @Setter + private double localCooldown = 0; + @Getter + @Setter + private double globalCooldown = 0; + @Getter + @Setter + private double weight = 0; + @Getter + @Setter + private double eventDuration = 0; + @Getter + @Setter + private int eventEndTime = -1; + @Getter + @Setter + private boolean endEventWithBossDeath = true; + @Getter + @Setter + private String spawnType = ""; + @Getter + @Setter + private int minimumPlayerCount = 1; + + public CustomEventsConfigFields(String filename, boolean isEnabled) { + super(filename, isEnabled); + } + + @Override + public void processConfigFields() { + this.isEnabled = processBoolean("isEnabled", isEnabled, true, true); + this.eventType = processEnum("eventType", eventType, CustomEvent.EventType.DEFAULT, CustomEvent.EventType.class, true); + if (eventType == CustomEvent.EventType.DEFAULT) { + Logger.warn("Failed to determine a valid event type for " + filename + " ! This event will not be registered."); + return; + } + this.bossFilenames = processStringList("bossFilenames", bossFilenames, new ArrayList<>(), true); + if (bossFilenames == null) return; + this.startMessage = translatable(filename, "startMessage", processString("startMessage", startMessage, null, false)); + this.endMessage = translatable(filename, "endMessage", processString("endMessage", endMessage, null, false)); + this.eventStartCommands = processStringList("eventStartCommands", eventStartCommands, new ArrayList<>(), false); + this.eventEndCommands = processStringList("eventEndCommands", eventEndCommands, new ArrayList<>(), false); + this.announcementPriority = processInt("announcementPriority", announcementPriority, 0, false); + this.chance = processDouble("chance", chance, 0, false); + this.breakableMaterials = processEnumList("breakableMaterials", breakableMaterials, new ArrayList<>(), Material.class, false); + this.localCooldown = processDouble("localCooldown", localCooldown, 0, false); + this.globalCooldown = processDouble("globalCooldown", globalCooldown, 0, false); + this.weight = processDouble("weight", weight, 0, true); + this.eventDuration = processDouble("eventDuration", eventDuration, 0, false); + this.eventEndTime = processInt("eventEndTime", eventEndTime, -1, false); + this.endEventWithBossDeath = processBoolean("endEventWithBossDeath", endEventWithBossDeath, true, false); + this.spawnType = processString("spawnType", spawnType, "", false); + this.minimumPlayerCount = processInt("minimumPlayerCount", minimumPlayerCount, 1, false); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/ArmorGoblinEvent.java b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/ArmorGoblinEvent.java new file mode 100644 index 000000000..2493b5448 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/ArmorGoblinEvent.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.customevents.premade; + +import com.magmaguy.elitemobs.config.customevents.CustomEventsConfigFields; +import com.magmaguy.elitemobs.events.CustomEvent; + +import java.util.List; + +public class ArmorGoblinEvent extends CustomEventsConfigFields { + public ArmorGoblinEvent() { + super("armor_goblin", true); + setEventType(CustomEvent.EventType.TIMED); + setBossFilenames(List.of("armor_goblin.yml")); + setLocalCooldown(120D); + setGlobalCooldown(25D); + setWeight(100D); + setSpawnType("normal_surface_spawn.yml"); + setEventDuration(30); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/BalrogEvent.java b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/BalrogEvent.java new file mode 100644 index 000000000..072da3e09 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/BalrogEvent.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.config.customevents.premade; + +import com.magmaguy.elitemobs.config.customevents.CustomEventsConfigFields; +import com.magmaguy.elitemobs.events.CustomEvent; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class BalrogEvent extends CustomEventsConfigFields { + public BalrogEvent() { + super("balrog", + true); + setEventType(CustomEvent.EventType.BREAK_BLOCK); + setBossFilenames(List.of("balrog.yml")); + setChance(0.001); + setBreakableMaterials(new ArrayList<>(List.of(Material.COAL_ORE, Material.IRON_ORE, Material.GOLD_ORE, Material.LAPIS_ORE, + Material.DIAMOND_ORE, Material.EMERALD_ORE, Material.REDSTONE_ORE))); + setEventDuration(20); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/BeastMasterEvent.java b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/BeastMasterEvent.java new file mode 100644 index 000000000..2fcb2057a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/BeastMasterEvent.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.customevents.premade; + +import com.magmaguy.elitemobs.config.customevents.CustomEventsConfigFields; +import com.magmaguy.elitemobs.events.CustomEvent; + +import java.util.List; + +public class BeastMasterEvent extends CustomEventsConfigFields { + public BeastMasterEvent() { + super("beast_master", true); + setEventType(CustomEvent.EventType.TIMED); + setBossFilenames(List.of("beast_master.yml")); + setLocalCooldown(120D); + setGlobalCooldown(25D); + setWeight(80); + setSpawnType("normal_surface_spawn.yml"); + setEventDuration(30); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/CharmsGoblinEvent.java b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/CharmsGoblinEvent.java new file mode 100644 index 000000000..506023865 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/CharmsGoblinEvent.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.customevents.premade; + +import com.magmaguy.elitemobs.config.customevents.CustomEventsConfigFields; +import com.magmaguy.elitemobs.events.CustomEvent; + +import java.util.List; + +public class CharmsGoblinEvent extends CustomEventsConfigFields { + public CharmsGoblinEvent() { + super("charms_goblin", + true); + setEventType(CustomEvent.EventType.TIMED); + setBossFilenames(List.of("charms_goblin.yml")); + setLocalCooldown(120D); + setGlobalCooldown(25D); + setWeight(50); + setSpawnType("normal_surface_spawn.yml"); + setEventDuration(30); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/CoinsGoblinEvent.java b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/CoinsGoblinEvent.java new file mode 100644 index 000000000..ac6b8f5f4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/CoinsGoblinEvent.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.customevents.premade; + +import com.magmaguy.elitemobs.config.customevents.CustomEventsConfigFields; +import com.magmaguy.elitemobs.events.CustomEvent; + +import java.util.List; + +public class CoinsGoblinEvent extends CustomEventsConfigFields { + public CoinsGoblinEvent() { + super("coins_goblin", true); + setEventType(CustomEvent.EventType.TIMED); + setBossFilenames(List.of("coins_goblin.yml")); + setLocalCooldown(120D); + setGlobalCooldown(25D); + setWeight(75); + setSpawnType("normal_surface_spawn.yml"); + setEventDuration(30); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/DeadMoonEvent.java b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/DeadMoonEvent.java new file mode 100644 index 000000000..d5087607b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/DeadMoonEvent.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.customevents.premade; + +import com.magmaguy.elitemobs.config.customevents.CustomEventsConfigFields; +import com.magmaguy.elitemobs.events.CustomEvent; + +import java.util.List; + +public class DeadMoonEvent extends CustomEventsConfigFields { + public DeadMoonEvent() { + super("dead_moon", true); + setEventType(CustomEvent.EventType.TIMED); + setBossFilenames(List.of("zombie_king.yml")); + setLocalCooldown(240D); + setGlobalCooldown(25D); + setWeight(50D); + setSpawnType("dead_moon_spawn.yml"); + setEventDuration(10D); + setEventEndTime(23000); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/FaeEvent.java b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/FaeEvent.java new file mode 100644 index 000000000..8fdceff5d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/FaeEvent.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.config.customevents.premade; + +import com.magmaguy.elitemobs.config.customevents.CustomEventsConfigFields; +import com.magmaguy.elitemobs.events.CustomEvent; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class FaeEvent extends CustomEventsConfigFields { + public FaeEvent() { + super("fae", + true); + setEventType(CustomEvent.EventType.BREAK_BLOCK); + setBossFilenames(new ArrayList<>(List.of("fire_fae.yml", "ice_fae.yml", "lightning_fae.yml"))); + setChance(0.001); + setBreakableMaterials(new ArrayList<>(List.of(Material.BIRCH_LOG, Material.ACACIA_LOG, Material.DARK_OAK_LOG, + Material.OAK_LOG, Material.SPRUCE_LOG, Material.JUNGLE_LOG))); + setEventDuration(20); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/FullMoonEvent.java b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/FullMoonEvent.java new file mode 100644 index 000000000..0378cd3ce --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/FullMoonEvent.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.customevents.premade; + +import com.magmaguy.elitemobs.config.customevents.CustomEventsConfigFields; +import com.magmaguy.elitemobs.events.CustomEvent; + +import java.util.List; + +public class FullMoonEvent extends CustomEventsConfigFields { + public FullMoonEvent() { + super("full_moon", true); + setEventType(CustomEvent.EventType.TIMED); + setBossFilenames(List.of("alpha_werewolf_p1.yml")); + setLocalCooldown(240D); + setGlobalCooldown(25D); + setWeight(50D); + setSpawnType("full_moon_spawn.yml"); + setEventDuration(10D); + setEventEndTime(23000); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/KillerRabbitOfCaerbannogEvent.java b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/KillerRabbitOfCaerbannogEvent.java new file mode 100644 index 000000000..2abe54924 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/KillerRabbitOfCaerbannogEvent.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.customevents.premade; + +import com.magmaguy.elitemobs.config.customevents.CustomEventsConfigFields; +import com.magmaguy.elitemobs.events.CustomEvent; + +import java.util.List; + +public class KillerRabbitOfCaerbannogEvent extends CustomEventsConfigFields { + public KillerRabbitOfCaerbannogEvent() { + super("killer_rabbit_of_caerbannog", + true); + setEventType(CustomEvent.EventType.TILL_SOIL); + setBossFilenames(List.of("killer_rabbit_of_caerbannog.yml")); + setChance(0.0001); + setEventDuration(20); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/KrakenEvent.java b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/KrakenEvent.java new file mode 100644 index 000000000..67635d6f9 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/KrakenEvent.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.customevents.premade; + +import com.magmaguy.elitemobs.config.customevents.CustomEventsConfigFields; +import com.magmaguy.elitemobs.events.CustomEvent; + +import java.util.List; + +public class KrakenEvent extends CustomEventsConfigFields { + public KrakenEvent() { + super("kraken", + true); + setEventType(CustomEvent.EventType.FISH); + setBossFilenames(List.of("kraken.yml")); + setChance(0.005); + setEventDuration(20); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/PillagerCaravanEvent.java b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/PillagerCaravanEvent.java new file mode 100644 index 000000000..323c2a996 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/PillagerCaravanEvent.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.customevents.premade; + +import com.magmaguy.elitemobs.config.customevents.CustomEventsConfigFields; +import com.magmaguy.elitemobs.events.CustomEvent; + +import java.util.List; + +public class PillagerCaravanEvent extends CustomEventsConfigFields { + public PillagerCaravanEvent() { + super("pillager_caravan", true); + setEventType(CustomEvent.EventType.TIMED); + setBossFilenames(List.of("pillager_caravan_leader.yml")); + setLocalCooldown(120D); + setGlobalCooldown(25D); + setWeight(80D); + setSpawnType("normal_surface_spawn.yml"); + setEventDuration(30); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/QueenBeeEvent.java b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/QueenBeeEvent.java new file mode 100644 index 000000000..1b8fd7da4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/QueenBeeEvent.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.customevents.premade; + +import com.magmaguy.elitemobs.config.customevents.CustomEventsConfigFields; +import com.magmaguy.elitemobs.events.CustomEvent; +import org.bukkit.Material; + +import java.util.List; + +public class QueenBeeEvent extends CustomEventsConfigFields { + public QueenBeeEvent() { + super("queen_bee", + true); + setEventType(CustomEvent.EventType.BREAK_BLOCK); + setBossFilenames(List.of("queen_bee.yml")); + setChance(0.001); + setBreakableMaterials(List.of(Material.BEE_NEST)); + setEventDuration(20); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/TreasureGoblinEvent.java b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/TreasureGoblinEvent.java new file mode 100644 index 000000000..aee9e8bcf --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/TreasureGoblinEvent.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.customevents.premade; + +import com.magmaguy.elitemobs.config.customevents.CustomEventsConfigFields; +import com.magmaguy.elitemobs.events.CustomEvent; + +import java.util.List; + +public class TreasureGoblinEvent extends CustomEventsConfigFields { + public TreasureGoblinEvent() { + super("treasure_goblin", true); + setEventType(CustomEvent.EventType.TIMED); + setBossFilenames(List.of("treasure_goblin.yml")); + setLocalCooldown(120D); + setGlobalCooldown(25D); + setWeight(100D); + setSpawnType("normal_surface_spawn.yml"); + setEventDuration(30); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/WeaponsGoblinEvent.java b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/WeaponsGoblinEvent.java new file mode 100644 index 000000000..b94590b95 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/WeaponsGoblinEvent.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.customevents.premade; + +import com.magmaguy.elitemobs.config.customevents.CustomEventsConfigFields; +import com.magmaguy.elitemobs.events.CustomEvent; + +import java.util.List; + +public class WeaponsGoblinEvent extends CustomEventsConfigFields { + public WeaponsGoblinEvent() { + super("weapons_goblin", true); + setEventType(CustomEvent.EventType.TIMED); + setBossFilenames(List.of("weapons_goblin.yml")); + setLocalCooldown(120D); + setGlobalCooldown(25D); + setWeight(100D); + setSpawnType("normal_surface_spawn.yml"); + setEventDuration(30); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/ZombieTotemEvent.java b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/ZombieTotemEvent.java new file mode 100644 index 000000000..e4fea6e1b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customevents/premade/ZombieTotemEvent.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.customevents.premade; + +import com.magmaguy.elitemobs.config.customevents.CustomEventsConfigFields; +import com.magmaguy.elitemobs.events.CustomEvent; + +import java.util.List; + +public class ZombieTotemEvent extends CustomEventsConfigFields { + public ZombieTotemEvent() { + super("zombie_totem", true); + setEventType(CustomEvent.EventType.TIMED); + setBossFilenames(List.of("totem_zombie_1.yml")); + setLocalCooldown(120D); + setGlobalCooldown(25D); + setWeight(100D); + setSpawnType("normal_surface_spawn.yml"); + setEventDuration(30); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/CustomItemsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/CustomItemsConfig.java new file mode 100644 index 000000000..6b29e0db5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/CustomItemsConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems; + +import com.magmaguy.magmacore.config.CustomConfig; + +import java.util.HashMap; + +public class CustomItemsConfig extends CustomConfig { + + private static HashMap customItems = new HashMap<>(); + + public CustomItemsConfig() { + super("customitems", "com.magmaguy.elitemobs.config.customitems.premade", CustomItemsConfigFields.class); + customItems = new HashMap<>(); + for (String key : super.getCustomConfigFieldsHashMap().keySet()) + customItems.put(key, (CustomItemsConfigFields) super.getCustomConfigFieldsHashMap().get(key)); + } + + public static HashMap getCustomItems() { + return customItems; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/CustomItemsConfigFields.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/CustomItemsConfigFields.java new file mode 100644 index 000000000..33054229a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/CustomItemsConfigFields.java @@ -0,0 +1,132 @@ +package com.magmaguy.elitemobs.config.customitems; + +import com.magmaguy.elitemobs.config.CustomConfigFields; +import com.magmaguy.elitemobs.config.LegacyValueConverter; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class CustomItemsConfigFields extends CustomConfigFields { + + @Getter + @Setter + private Material material = Material.WOODEN_SWORD; + @Getter + @Setter + private String name = "Default name"; + @Getter + @Setter + private List lore = new ArrayList<>(); + @Getter + @Setter + private List enchantments = new ArrayList<>(); + @Getter + @Setter + private List potionEffects = new ArrayList<>(); + @Getter + @Setter + private String dropWeight = "dynamic"; + @Getter + @Setter + private CustomItem.Scalability scalability = CustomItem.Scalability.SCALABLE; + @Getter + @Setter + private CustomItem.ItemType itemType = CustomItem.ItemType.CUSTOM; + @Getter + @Setter + private Integer customModelID = -1; + @Getter + @Setter + private String permission = ""; + @Getter + @Setter + private int level = 0; + @Getter + @Setter + private boolean soulbound = true; + + public CustomItemsConfigFields(String fileName, + boolean isEnabled, + Material material, + String name, + List lore) { + super(fileName, isEnabled); + this.material = material; + this.name = name; + this.lore = lore; + } + + public CustomItemsConfigFields(String fileName, + boolean isEnabled) { + super(fileName, isEnabled); + } + + /** + * Generates config defaults to be used by CustomBossesConfig + */ + @Override + public void processConfigFields() { + this.isEnabled = processBoolean("isEnabled", isEnabled, true, true); + this.material = processEnum("material", material, Material.WOODEN_SWORD, Material.class, true); + this.name = translatable(filename, "name", processString("name", name, "Default name", true)); + this.lore = translatable(filename, "lore", processStringList("lore", lore, new ArrayList<>(), true)); + this.enchantments = processStringList("enchantments", enchantments, null, false); + this.potionEffects = processStringList("potionEffects", potionEffects, null, false); + this.dropWeight = processString("dropWeight", dropWeight, "dynamic", false); + this.scalability = processEnum("scalability", scalability, CustomItem.Scalability.SCALABLE, CustomItem.Scalability.class, false); + this.itemType = processEnum("itemType", itemType, CustomItem.ItemType.CUSTOM, CustomItem.ItemType.class, false); + this.customModelID = processInt("customModelID", customModelID, -1, false); + this.permission = processString("permission", permission, "", false); + this.level = processInt("level", level, 0, false); + this.soulbound = processBoolean("soulbound", soulbound, true, false); + updatePostProcessor(); + } + + private void updatePostProcessor() { + List newEnchantments = new ArrayList<>(); + for (String enchantment : enchantments) { + if (!enchantment.contains(",")) { + Logger.warn("Invalid format for enchantment in file " + filename + " for enchantment " + enchantment + " : missing ',' for valid level after the enchantment name"); + continue; + } + String[] split = enchantment.split(","); + String result = LegacyValueConverter.parseEnchantment(split[0]); + if (result.equals(split[0])) newEnchantments.add(enchantment); + else newEnchantments.add(result + "," + split[1]); + } + enchantments = newEnchantments; + + List newPotionEffects = new ArrayList<>(); + for (String potionEffect : potionEffects) { + if (!potionEffect.contains(",")) { + Logger.warn("Invalid format for potion effect in file " + filename + " for potion effect " + potionEffect + " : missing ',' for valid level after the potion effect name"); + continue; + } + String[] split = potionEffect.split(","); + String result = LegacyValueConverter.parsePotionEffect(split[0]); + if (result.equals(split[0])) newPotionEffects.add(potionEffect); + else { + StringBuilder newString = new StringBuilder(); + newString.append(result + ","); + + for (int i = 1; i < split.length; i++) { + newString.append(split[i]); + if (i != split.length - 1) + newString.append(","); + } + newPotionEffects.add(newString.toString()); + } + } + potionEffects = newPotionEffects; + + potionEffects.forEach(potionEffect -> { + if (potionEffect.contains("INSTANT_DAMAGE")) + Logger.warn("Item " + filename + " contains HARM/INSTANT_DAMAGE potion effect, which heals undead mobs (Minecraft vanilla mechanic) and often times confuses players and admins. It is recommended you switch this potion effect with something else, like STRENGTH if you want more damage."); + }); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/BerserkerCharmConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/BerserkerCharmConfig.java new file mode 100644 index 000000000..73df1ae55 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/BerserkerCharmConfig.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class BerserkerCharmConfig extends CustomItemsConfigFields { + public BerserkerCharmConfig() { + super("berserker_charm", + true, + Material.TOTEM_OF_UNDYING, + "&bBerserker Charm", + new ArrayList<>(List.of("&aLose yourself in the face of", "&aoverwhelming adversity in more", "&aways than one..."))); + setEnchantments(List.of("VANISHING_CURSE,1")); + setPotionEffects(new ArrayList<>(List.of("BLINDNESS,0,self,onHit", "FAST_DIGGING,0,self,onHit"))); + setDropWeight("1"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ChallengersBootsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ChallengersBootsConfig.java new file mode 100644 index 000000000..8f6bea653 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ChallengersBootsConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class ChallengersBootsConfig extends CustomItemsConfigFields { + public ChallengersBootsConfig() { + super("challengers_boots", true, Material.DIAMOND_BOOTS, "&cChallenger's Boots", new ArrayList<>(List.of("&2Awarded to those who challenge the", "&2Wood League Arena!"))); + setEnchantments(new ArrayList<>(List.of("PROTECTION,5", "BLAST_PROTECTION,4", "PROJECTILE_PROTECTION,4", "MENDING,1", "UNBREAKING,5"))); + setItemType(CustomItem.ItemType.UNIQUE); + setLevel(40); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ChallengersChestplateConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ChallengersChestplateConfig.java new file mode 100644 index 000000000..3ffe99d49 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ChallengersChestplateConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class ChallengersChestplateConfig extends CustomItemsConfigFields { + public ChallengersChestplateConfig() { + super("challengers_chestplate", true, Material.DIAMOND_CHESTPLATE, "&cChallenger's Chestplate", new ArrayList<>(List.of("&2Awarded to those who challenge the", "&2Wood League Arena!"))); + setEnchantments(new ArrayList<>(List.of("PROTECTION,5", "BLAST_PROTECTION,4", "PROJECTILE_PROTECTION,4", "MENDING,1", "UNBREAKING,5"))); + setItemType(CustomItem.ItemType.UNIQUE); + setLevel(40); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ChallengersHelmetConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ChallengersHelmetConfig.java new file mode 100644 index 000000000..9bd405be2 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ChallengersHelmetConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class ChallengersHelmetConfig extends CustomItemsConfigFields { + public ChallengersHelmetConfig() { + super("challengers_helmet", true, Material.DIAMOND_HELMET, "&cChallenger's Helmet", new ArrayList<>(List.of("&2Awarded to those who challenge the", "&2Wood League Arena!"))); + setEnchantments(new ArrayList<>(List.of("PROTECTION,5", "BLAST_PROTECTION,4", "PROJECTILE_PROTECTION,4", "MENDING,1", "UNBREAKING,5"))); + setItemType(CustomItem.ItemType.UNIQUE); + setLevel(40); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ChallengersLeggingsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ChallengersLeggingsConfig.java new file mode 100644 index 000000000..199891924 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ChallengersLeggingsConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class ChallengersLeggingsConfig extends CustomItemsConfigFields { + public ChallengersLeggingsConfig() { + super("challengers_leggings", true, Material.DIAMOND_LEGGINGS, "&cChallenger's Leggings", new ArrayList<>(List.of("&2Awarded to those who challenge the", "&2Wood League Arena!"))); + setEnchantments(new ArrayList<>(List.of("PROTECTION,5", "BLAST_PROTECTION,4", "PROJECTILE_PROTECTION,4", "MENDING,1", "UNBREAKING,5"))); + setItemType(CustomItem.ItemType.UNIQUE); + setLevel(40); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ChallengersSwordConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ChallengersSwordConfig.java new file mode 100644 index 000000000..06a5326c2 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ChallengersSwordConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class ChallengersSwordConfig extends CustomItemsConfigFields { + public ChallengersSwordConfig() { + super("challengers_sword", true, Material.DIAMOND_SWORD, "&cChallenger's Sword", new ArrayList<>(List.of("&2Awarded to those who challenge the", "&2Wood League Arena!"))); + setEnchantments(new ArrayList<>(List.of("SHARPNESS,5", "KNOCKBACK,2", "MENDING,1", "LIGHTNING,3", "SWEEPING_EDGE,1", "UNBREAKING,5"))); + setItemType(CustomItem.ItemType.UNIQUE); + setLevel(40); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ChameleonCharmConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ChameleonCharmConfig.java new file mode 100644 index 000000000..907fc9d81 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ChameleonCharmConfig.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class ChameleonCharmConfig extends CustomItemsConfigFields { + public ChameleonCharmConfig() { + super("chameleon_charm", + true, + Material.LEATHER, + "&bChameleon Charm", + new ArrayList<>(List.of("&aThe colorful Chameleon can", "&ablend in just about anywhere,", "&aslowly creeping around..."))); + setEnchantments(List.of("VANISHING_CURSE,1")); + setPotionEffects(new ArrayList<>(List.of("INVISIBILITY,0,self,onHit", "SLOW,0,self,onHit", "BLINDNESS,0,self,onHit"))); + setDropWeight("1"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/CheetahCharmConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/CheetahCharmConfig.java new file mode 100644 index 000000000..cd9ba2d2a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/CheetahCharmConfig.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class CheetahCharmConfig extends CustomItemsConfigFields { + public CheetahCharmConfig() { + super("cheetah_charm", + true, + Material.GOLDEN_BOOTS, + "&bCheetah Charm", + new ArrayList<>(List.of("&aCheetahs can reach speeds of", "&a120 km/h... for about 60", "&aseconds. Make them count!"))); + setEnchantments(List.of("VANISHING_CURSE,1")); + setPotionEffects(new ArrayList<>(List.of("SPEED,2,self,continuous", "HUNGER,0,self,continuous"))); + setDropWeight("1"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/DepthsSeekerConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/DepthsSeekerConfig.java new file mode 100644 index 000000000..e60d80fb2 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/DepthsSeekerConfig.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class DepthsSeekerConfig extends CustomItemsConfigFields { + public DepthsSeekerConfig() { + super("depths_seeker", + true, + Material.FISHING_ROD, + "&2Depths seeker", + new ArrayList<>(List.of("&9Come from depths immeasurable", "&9and looted from monster most vile,", "&9there is no telling what horrors", "&9this fishing rod has seen."))); + setEnchantments(new ArrayList<>(List.of("LURE,3", "LUCK_OF_THE_SEA,3", "UNBREAKING,10", "FIRE_ASPECT,1", "VANISHING_CURSE,1"))); + setPotionEffects(new ArrayList<>(List.of("WATER_BREATHING,0,self,continuous", "LUCK,0,self,continuous"))); + setItemType(CustomItem.ItemType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/DwarvenGreedConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/DwarvenGreedConfig.java new file mode 100644 index 000000000..239a8deb3 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/DwarvenGreedConfig.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class DwarvenGreedConfig extends CustomItemsConfigFields { + public DwarvenGreedConfig() { + super("dwarven_greed", + true, + Material.WOODEN_PICKAXE, + "&4Dwarven Greed", + new ArrayList<>(List.of("&cThose who delve too greedily", "&cand too deep may wake ancient", "&chorrors of shadow and flame", "&cbest left undisturbed."))); + setEnchantments(new ArrayList<>(List.of("FORTUNE,4", "UNBREAKING,6", "EFFICIENCY,6", "VANISHING_CURSE,1"))); + setPotionEffects(new ArrayList<>(List.of("FAST_DIGGING,1,self,continuous", "NIGHT_VISION,0,self,continuous"))); + setItemType(CustomItem.ItemType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ElephantCharmConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ElephantCharmConfig.java new file mode 100644 index 000000000..c4904416e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ElephantCharmConfig.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class ElephantCharmConfig extends CustomItemsConfigFields { + public ElephantCharmConfig() { + super("elephant_charm", + true, + Material.ANVIL, + "&bElephant Charm", + new ArrayList<>(List.of("&aGain the power of an elephant", "&astampede, for the cost of the", "&aspeed of an elephant stampede!"))); + setEnchantments(List.of("VANISHING_CURSE,1")); + setPotionEffects(new ArrayList<>(List.of("INCREASE_DAMAGE,1,self,onHit", "SLOW,3,self,onHit"))); + setDropWeight("1"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookArrowDamageConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookArrowDamageConfig.java new file mode 100644 index 000000000..4b576c0b8 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookArrowDamageConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookArrowDamageConfig extends CustomItemsConfigFields { + public EnchantedBookArrowDamageConfig() { + super("enchanted_book_arrow_damage", + true, + Material.BOOK, + "&5Elite Power Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("POWER,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookArrowInfiniteConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookArrowInfiniteConfig.java new file mode 100644 index 000000000..6dfd1cabb --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookArrowInfiniteConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookArrowInfiniteConfig extends CustomItemsConfigFields { + public EnchantedBookArrowInfiniteConfig() { + super("enchanted_book_arrow_infinite", + true, + Material.BOOK, + "&5Elite Infinity Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("INFINITY,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookArrowKnockbackConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookArrowKnockbackConfig.java new file mode 100644 index 000000000..7cbdcac56 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookArrowKnockbackConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookArrowKnockbackConfig extends CustomItemsConfigFields { + public EnchantedBookArrowKnockbackConfig() { + super("enchanted_book_arrow_knockback", + true, + Material.BOOK, + "&5Elite Punch Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("PUNCH,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookChannelingConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookChannelingConfig.java new file mode 100644 index 000000000..27d629d05 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookChannelingConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookChannelingConfig extends CustomItemsConfigFields { + public EnchantedBookChannelingConfig() { + super("enchanted_book_channeling", + true, + Material.BOOK, + "&5Elite Channeling Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("CHANNELING,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookCriticalStrikesConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookCriticalStrikesConfig.java new file mode 100644 index 000000000..a0745bbb6 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookCriticalStrikesConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookCriticalStrikesConfig extends CustomItemsConfigFields { + public EnchantedBookCriticalStrikesConfig() { + super("enchanted_book_critical_strikes", + true, + Material.BOOK, + "&5Elite Critical Strikes Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("CRITICAL_STRIKES,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookDamageAllConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookDamageAllConfig.java new file mode 100644 index 000000000..c6dae5de3 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookDamageAllConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookDamageAllConfig extends CustomItemsConfigFields { + public EnchantedBookDamageAllConfig() { + super("enchanted_book_damage_all", + true, + Material.BOOK, + "&5Elite Sharpness Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("SHARPNESS,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookDamageArthropodsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookDamageArthropodsConfig.java new file mode 100644 index 000000000..7b86c9ab7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookDamageArthropodsConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookDamageArthropodsConfig extends CustomItemsConfigFields { + public EnchantedBookDamageArthropodsConfig() { + super("enchanted_book_damage_arthropods", + true, + Material.BOOK, + "&5Elite Bane of Arthropods Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("BANE_OF_ARTHROPODS,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookDamageUndeadConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookDamageUndeadConfig.java new file mode 100644 index 000000000..64ba5fd13 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookDamageUndeadConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookDamageUndeadConfig extends CustomItemsConfigFields { + public EnchantedBookDamageUndeadConfig() { + super("enchanted_book_damage_undead", + true, + Material.BOOK, + "&5Elite Smite Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("SMITE,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookDepthStriderConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookDepthStriderConfig.java new file mode 100644 index 000000000..88e7d32dd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookDepthStriderConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookDepthStriderConfig extends CustomItemsConfigFields { + public EnchantedBookDepthStriderConfig() { + super("enchanted_book_depth_strider", + true, + Material.BOOK, + "&5Elite Depth Strider Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("DEPTH_STRIDER,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookDigSpeedConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookDigSpeedConfig.java new file mode 100644 index 000000000..77f4f0253 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookDigSpeedConfig.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookDigSpeedConfig extends CustomItemsConfigFields { + public EnchantedBookDigSpeedConfig() { + super("enchanted_book_dig_speed", + true, + Material.BOOK, + "&5Elite Efficiency Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("EFFICIENCY,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookDrillingConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookDrillingConfig.java new file mode 100644 index 000000000..6e85199cd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookDrillingConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookDrillingConfig extends CustomItemsConfigFields { + public EnchantedBookDrillingConfig() { + super("enchanted_book_drilling", + true, + Material.BOOK, + "&5Elite Drilling Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("DRILLING,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookDurabilityConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookDurabilityConfig.java new file mode 100644 index 000000000..799b07078 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookDurabilityConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookDurabilityConfig extends CustomItemsConfigFields { + public EnchantedBookDurabilityConfig() { + super("enchanted_book_durability", + true, + Material.BOOK, + "&5Elite Unbreaking Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("UNBREAKING,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookEarthquakeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookEarthquakeConfig.java new file mode 100644 index 000000000..10b15a0ec --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookEarthquakeConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookEarthquakeConfig extends CustomItemsConfigFields { + public EnchantedBookEarthquakeConfig() { + super("enchanted_book_earthquake", + true, + Material.BOOK, + "&5Elite Earthquake Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("EARTHQUAKE,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookFlameConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookFlameConfig.java new file mode 100644 index 000000000..99025718b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookFlameConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookFlameConfig extends CustomItemsConfigFields { + public EnchantedBookFlameConfig() { + super("enchanted_book_arrow_fire", + true, + Material.BOOK, + "&5Elite Flame Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("FLAME,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookFlamethrowerConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookFlamethrowerConfig.java new file mode 100644 index 000000000..dc818ebc3 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookFlamethrowerConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookFlamethrowerConfig extends CustomItemsConfigFields { + public EnchantedBookFlamethrowerConfig() { + super("enchanted_book_flamethrower", + true, + Material.BOOK, + "&5Elite Flamethrower Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("FLAMETHROWER,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookFrostWalkerConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookFrostWalkerConfig.java new file mode 100644 index 000000000..6dd0551ae --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookFrostWalkerConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookFrostWalkerConfig extends CustomItemsConfigFields { + public EnchantedBookFrostWalkerConfig() { + super("enchanted_book_frost_walker", + true, + Material.BOOK, + "&5Elite Frost Walker Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("FROST_WALKER,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookHunterConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookHunterConfig.java new file mode 100644 index 000000000..cd937d8e0 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookHunterConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookHunterConfig extends CustomItemsConfigFields { + public EnchantedBookHunterConfig() { + super("enchanted_book_hunter", + true, + Material.BOOK, + "&5Elite Hunter Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("HUNTER,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookIceBreakerConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookIceBreakerConfig.java new file mode 100644 index 000000000..404ecdf2e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookIceBreakerConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookIceBreakerConfig extends CustomItemsConfigFields { + public EnchantedBookIceBreakerConfig() { + super("enchanted_book_ice_breaker", + true, + Material.BOOK, + "&5Elite Ice Breaker Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("ICE_BREAKER,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookImpalingConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookImpalingConfig.java new file mode 100644 index 000000000..b63dc469d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookImpalingConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookImpalingConfig extends CustomItemsConfigFields { + public EnchantedBookImpalingConfig() { + super("enchanted_book_impaling", + true, + Material.BOOK, + "&5Elite Impaling Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("IMPALING,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookKnockbackConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookKnockbackConfig.java new file mode 100644 index 000000000..8628be905 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookKnockbackConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookKnockbackConfig extends CustomItemsConfigFields { + public EnchantedBookKnockbackConfig() { + super("enchanted_book_knockback", + true, + Material.BOOK, + "&5Elite Knockback Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("KNOCKBACK,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookLightningConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookLightningConfig.java new file mode 100644 index 000000000..c5f411043 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookLightningConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookLightningConfig extends CustomItemsConfigFields { + public EnchantedBookLightningConfig() { + super("enchanted_book_lightning", + true, + Material.BOOK, + "&5Elite Lightning Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("LIGHTNING,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookLootBonusBlocksConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookLootBonusBlocksConfig.java new file mode 100644 index 000000000..2ac7cc1c3 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookLootBonusBlocksConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookLootBonusBlocksConfig extends CustomItemsConfigFields { + public EnchantedBookLootBonusBlocksConfig() { + super("enchanted_book_loot_bonus_blocks", + true, + Material.BOOK, + "&5Elite Fortune Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("FORTUNE,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookLootBonusMobsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookLootBonusMobsConfig.java new file mode 100644 index 000000000..a599a99de --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookLootBonusMobsConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookLootBonusMobsConfig extends CustomItemsConfigFields { + public EnchantedBookLootBonusMobsConfig() { + super("enchanted_book_loot_bonus_mobs", + true, + Material.BOOK, + "&5Elite Looting Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("LOOT_BONUS_MOBS,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookLoudStrikesConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookLoudStrikesConfig.java new file mode 100644 index 000000000..5de5c27dd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookLoudStrikesConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookLoudStrikesConfig extends CustomItemsConfigFields { + public EnchantedBookLoudStrikesConfig() { + super("enchanted_book_loud_strikes", + true, + Material.BOOK, + "&5Elite Loud Strikes Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("LOUD_STRIKES,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookLoyaltyConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookLoyaltyConfig.java new file mode 100644 index 000000000..20b0a705f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookLoyaltyConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookLoyaltyConfig extends CustomItemsConfigFields { + public EnchantedBookLoyaltyConfig() { + super("enchanted_book_loyalty", + true, + Material.BOOK, + "&5Elite Loyalty Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("LOYALTY,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookLuckConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookLuckConfig.java new file mode 100644 index 000000000..7d6110913 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookLuckConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookLuckConfig extends CustomItemsConfigFields { + public EnchantedBookLuckConfig() { + super("enchanted_book_luck", + true, + Material.BOOK, + "&5Elite Luck of the Sea Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("LUCK_OF_THE_SEA,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookLureConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookLureConfig.java new file mode 100644 index 000000000..1557b3bd8 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookLureConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookLureConfig extends CustomItemsConfigFields { + public EnchantedBookLureConfig() { + super("enchanted_book_lure", + true, + Material.BOOK, + "&5Elite Lure Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("LURE,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookMendingConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookMendingConfig.java new file mode 100644 index 000000000..0aaf06b6e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookMendingConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookMendingConfig extends CustomItemsConfigFields { + public EnchantedBookMendingConfig() { + super("enchanted_book_mending", + true, + Material.BOOK, + "&5Elite Mending Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("MENDING,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookMeteorShowerConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookMeteorShowerConfig.java new file mode 100644 index 000000000..9f20eb536 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookMeteorShowerConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookMeteorShowerConfig extends CustomItemsConfigFields { + public EnchantedBookMeteorShowerConfig() { + super("enchanted_book_meteor_shower", + true, + Material.BOOK, + "&5Elite Meteor Shower Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("METEOR_SHOWER,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookMultishotConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookMultishotConfig.java new file mode 100644 index 000000000..042c8562b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookMultishotConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookMultishotConfig extends CustomItemsConfigFields { + public EnchantedBookMultishotConfig() { + super("enchanted_book_multishot", + true, + Material.BOOK, + "&5Elite Multishot Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("MULTISHOT,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookOxygenConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookOxygenConfig.java new file mode 100644 index 000000000..898cb733d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookOxygenConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookOxygenConfig extends CustomItemsConfigFields { + public EnchantedBookOxygenConfig() { + super("enchanted_book_oxygen", + true, + Material.BOOK, + "&5Elite Respiration Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("RESPIRATION,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookPiercingConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookPiercingConfig.java new file mode 100644 index 000000000..3211a1e44 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookPiercingConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookPiercingConfig extends CustomItemsConfigFields { + public EnchantedBookPiercingConfig() { + super("enchanted_book_piercing", + true, + Material.BOOK, + "&5Elite Piercing Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("PIERCING,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookPlasmaBootsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookPlasmaBootsConfig.java new file mode 100644 index 000000000..e3741e9e4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookPlasmaBootsConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookPlasmaBootsConfig extends CustomItemsConfigFields { + public EnchantedBookPlasmaBootsConfig() { + super("enchanted_book_plasma_boots", + true, + Material.BOOK, + "&5Elite Plasma Boots Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("PLASMA_BOOTS,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookProtectionEnvironmentalConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookProtectionEnvironmentalConfig.java new file mode 100644 index 000000000..495de4535 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookProtectionEnvironmentalConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookProtectionEnvironmentalConfig extends CustomItemsConfigFields { + public EnchantedBookProtectionEnvironmentalConfig() { + super("enchanted_book_protection_environmental", + true, + Material.BOOK, + "&5Elite Protection Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("PROTECTION,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookProtectionExplosionsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookProtectionExplosionsConfig.java new file mode 100644 index 000000000..56413bb5e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookProtectionExplosionsConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookProtectionExplosionsConfig extends CustomItemsConfigFields { + public EnchantedBookProtectionExplosionsConfig() { + super("enchanted_book_protection_explosions", + true, + Material.BOOK, + "&5Elite Blast Protection Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("BLAST_PROTECTION,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookProtectionFallConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookProtectionFallConfig.java new file mode 100644 index 000000000..71a77ce5a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookProtectionFallConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookProtectionFallConfig extends CustomItemsConfigFields { + public EnchantedBookProtectionFallConfig() { + super("enchanted_book_protection_fall", + true, + Material.BOOK, + "&5Elite Feather Falling Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("FEATHER_FALLING,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookProtectionFireConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookProtectionFireConfig.java new file mode 100644 index 000000000..1a6511654 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookProtectionFireConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookProtectionFireConfig extends CustomItemsConfigFields { + public EnchantedBookProtectionFireConfig() { + super("enchanted_book_protection_fire", + true, + Material.BOOK, + "&5Elite Fire Protection Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("FIRE_PROTECTION,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookProtectionProjectileConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookProtectionProjectileConfig.java new file mode 100644 index 000000000..b8baa90f6 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookProtectionProjectileConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookProtectionProjectileConfig extends CustomItemsConfigFields { + public EnchantedBookProtectionProjectileConfig() { + super("enchanted_book_protection_projectile", + true, + Material.BOOK, + "&5Elite Projectile Protection Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("PROJECTILE_PROTECTION,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookQuickChargeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookQuickChargeConfig.java new file mode 100644 index 000000000..88afe28fa --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookQuickChargeConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookQuickChargeConfig extends CustomItemsConfigFields { + public EnchantedBookQuickChargeConfig() { + super("enchanted_book_quick_charge", + true, + Material.BOOK, + "&5Elite Quick Charge Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("QUICK_CHARGE,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookRiptideConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookRiptideConfig.java new file mode 100644 index 000000000..2fac218de --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookRiptideConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookRiptideConfig extends CustomItemsConfigFields { + public EnchantedBookRiptideConfig() { + super("enchanted_book_riptide", + true, + Material.BOOK, + "&5Elite Riptide Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("RIPTIDE,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookSilkTouchConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookSilkTouchConfig.java new file mode 100644 index 000000000..3d2b36c89 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookSilkTouchConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookSilkTouchConfig extends CustomItemsConfigFields { + public EnchantedBookSilkTouchConfig() { + super("enchanted_book_silk_touch", + true, + Material.BOOK, + "&5Elite Silk Touch Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("SILK_TOUCH,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookSoulSpeedConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookSoulSpeedConfig.java new file mode 100644 index 000000000..e3d8be3e2 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookSoulSpeedConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookSoulSpeedConfig extends CustomItemsConfigFields { + public EnchantedBookSoulSpeedConfig() { + super("enchanted_book_soul_speed", + true, + Material.BOOK, + "&5Elite Soul Speed Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("SOUL_SPEED,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookSweepingEdgeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookSweepingEdgeConfig.java new file mode 100644 index 000000000..336642441 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookSweepingEdgeConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookSweepingEdgeConfig extends CustomItemsConfigFields { + public EnchantedBookSweepingEdgeConfig() { + super("enchanted_book_sweeping_edge", + true, + Material.BOOK, + "&5Elite Sweeping Edge Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("SWEEPING_EDGE,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookThornsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookThornsConfig.java new file mode 100644 index 000000000..68bba7af2 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookThornsConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookThornsConfig extends CustomItemsConfigFields { + public EnchantedBookThornsConfig() { + super("enchanted_book_thorns", + true, + Material.BOOK, + "&5Elite Thorns Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("THORNS,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookWaterWorkerConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookWaterWorkerConfig.java new file mode 100644 index 000000000..60c93fbb1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/EnchantedBookWaterWorkerConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class EnchantedBookWaterWorkerConfig extends CustomItemsConfigFields { + public EnchantedBookWaterWorkerConfig() { + super("enchanted_book_water_worker", + true, + Material.BOOK, + "&5Elite Aqua Affinity Enchanted Book", + new ArrayList<>(List.of("&2Used to enchant items at the enchanter!"))); + setEnchantments(new ArrayList<>(List.of("AQUA_AFFINITY,1", "ENCHANTED_SOURCE,1"))); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/FireflyCharmConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/FireflyCharmConfig.java new file mode 100644 index 000000000..d7d9a1f0c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/FireflyCharmConfig.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class FireflyCharmConfig extends CustomItemsConfigFields { + public FireflyCharmConfig() { + super("firefly_charm", + true, + Material.GLASS_BOTTLE, + "&bFirefly Charm", + List.of("&aLight up the night!")); + setEnchantments(List.of("VANISHING_CURSE,1")); + setPotionEffects(new ArrayList<>(List.of("NIGHT_VISION,0,self,continuous", "GLOWING,0,target,onHit"))); + setDropWeight("1"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/FishyCharmConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/FishyCharmConfig.java new file mode 100644 index 000000000..1ac2a51a4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/FishyCharmConfig.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class FishyCharmConfig extends CustomItemsConfigFields { + public FishyCharmConfig() { + super("fishy_charm", + true, + Material.COD, + "&bFishy Charm", + new ArrayList<>(List.of("&aThere's just something not", "&aquite right with this one..."))); + setEnchantments(List.of("VANISHING_CURSE,1")); + setPotionEffects(List.of("WATER_BREATHING,0,self,continuous")); + setDropWeight("1"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GoblinBallistaItem.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GoblinBallistaItem.java new file mode 100644 index 000000000..a336cf971 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GoblinBallistaItem.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class GoblinBallistaItem extends CustomItemsConfigFields { + public GoblinBallistaItem() { + super("goblin_ballista", + true, + Material.CROSSBOW, + "&8Goblin Ballista", + List.of("&8A treasure among goblins!")); + setEnchantments(new ArrayList<>(List.of("POWER,1", "UNBREAKING,1", "QUICK_CHARGE,3", "MULTISHOT,1"))); + setPotionEffects(List.of("HEAL,0,self,onHit")); + setItemType(CustomItem.ItemType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GoblinBootsItem.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GoblinBootsItem.java new file mode 100644 index 000000000..8f7f28642 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GoblinBootsItem.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class GoblinBootsItem extends CustomItemsConfigFields { + public GoblinBootsItem() { + super("goblin_boots", + true, + Material.GOLDEN_BOOTS, + "&8Goblin Boots", + List.of("&8A treasure among goblins!")); + setMaterial(Material.NETHERITE_BOOTS); + setEnchantments(new ArrayList<>(List.of("PROTECTION,1", "BLAST_PROTECTION,1", "PROJECTILE_PROTECTION,1", "UNBREAKING,1"))); + setPotionEffects(List.of("SPEED,0,self,continuous")); + setItemType(CustomItem.ItemType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GoblinChestplateItem.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GoblinChestplateItem.java new file mode 100644 index 000000000..ae27fd0b0 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GoblinChestplateItem.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class GoblinChestplateItem extends CustomItemsConfigFields { + public GoblinChestplateItem() { + super("goblin_chestplate", + true, + Material.NETHERITE_CHESTPLATE, + "&8Goblin Chestplate", + List.of("&8A treasure among goblins!")); + setEnchantments(new ArrayList<>(List.of("PROTECTION,1", "BLAST_PROTECTION,1", "PROJECTILE_PROTECTION,1", "UNBREAKING,1"))); + setPotionEffects(List.of("SATURATION,0,self,continuous")); + setItemType(CustomItem.ItemType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GoblinCleaverItem.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GoblinCleaverItem.java new file mode 100644 index 000000000..fe17ac508 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GoblinCleaverItem.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class GoblinCleaverItem extends CustomItemsConfigFields { + public GoblinCleaverItem() { + super("goblin_cleaver", + true, + Material.NETHERITE_AXE, + "&8Goblin Cleaver", + List.of("&8A treasure among goblins!")); + setEnchantments(new ArrayList<>(List.of("SHARPNESS,1", "SMITE,1", "UNBREAKING,1", "KNOCKBACK,1", "LOOTING,5"))); + setPotionEffects(List.of("POISON,0,target,onHit")); + setItemType(CustomItem.ItemType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GoblinHelmetItem.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GoblinHelmetItem.java new file mode 100644 index 000000000..d1c40b2cb --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GoblinHelmetItem.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class GoblinHelmetItem extends CustomItemsConfigFields { + public GoblinHelmetItem() { + super("goblin_helmet", + true, + Material.NETHERITE_HELMET, + "&8Goblin Helmet", + List.of("&8A treasure among goblins!")); + setEnchantments(new ArrayList<>(List.of("PROTECTION,1", "BLAST_PROTECTION,1", "PROJECTILE_PROTECTION,1", "UNBREAKING,1"))); + setPotionEffects(List.of("NIGHT_VISION,0,self,continuous")); + setItemType(CustomItem.ItemType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GoblinLeggingsItem.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GoblinLeggingsItem.java new file mode 100644 index 000000000..e514f7691 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GoblinLeggingsItem.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class GoblinLeggingsItem extends CustomItemsConfigFields { + public GoblinLeggingsItem() { + super("goblin_leggings", + true, + Material.NETHERITE_LEGGINGS, + "&8Goblin Leggings", + List.of("&8A treasure among goblins!")); + setEnchantments(new ArrayList<>(List.of("PROTECTION,1", "BLAST_PROTECTION,1", "PROJECTILE_PROTECTION,1", "UNBREAKING,1"))); + setPotionEffects(List.of("JUMP,0,self,continuous")); + setItemType(CustomItem.ItemType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GoblinPokerItem.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GoblinPokerItem.java new file mode 100644 index 000000000..048b5db00 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GoblinPokerItem.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class GoblinPokerItem extends CustomItemsConfigFields { + public GoblinPokerItem() { + super("goblin_poker", + true, + Material.TRIDENT, + "&8Goblin Poker", + List.of("&8A treasure among goblins!")); + setEnchantments(new ArrayList<>(List.of("SHARPNESS,1", "SMITE,1", "UNBREAKING,1", "KNOCKBACK,1", "LOOTING,5"))); + setPotionEffects(List.of("WITHER,0,target,onHit")); + setItemType(CustomItem.ItemType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GoblinShooterItem.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GoblinShooterItem.java new file mode 100644 index 000000000..5b44505ac --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GoblinShooterItem.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class GoblinShooterItem extends CustomItemsConfigFields { + public GoblinShooterItem() { + super("goblin_shooter", + true, + Material.BOW, + "&8Goblin Shooter", + List.of("&8A treasure among goblins!")); + setEnchantments(new ArrayList<>(List.of("POWER,1", "UNBREAKING,1", "INFINITY,1", "FLAME,1"))); + setPotionEffects(List.of("SPEED,2,self,onHit")); + setItemType(CustomItem.ItemType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GoblinSlasherItem.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GoblinSlasherItem.java new file mode 100644 index 000000000..72e4ac05a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GoblinSlasherItem.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class GoblinSlasherItem extends CustomItemsConfigFields { + public GoblinSlasherItem() { + super("goblin_slasher", + true, + Material.NETHERITE_SWORD, + "&8Goblin Slasher", + List.of("&8A treasure among goblins!")); + setEnchantments(new ArrayList<>(List.of("SHARPNESS,1", "SMITE,1", "UNBREAKING,1", "KNOCKBACK,1", "LOOTING,5"))); + setPotionEffects(List.of("FAST_DIGGING,0,self,onHit")); + setItemType(CustomItem.ItemType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GrapplingArrowConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GrapplingArrowConfig.java new file mode 100644 index 000000000..686599109 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GrapplingArrowConfig.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.List; + +public class GrapplingArrowConfig extends CustomItemsConfigFields { + public GrapplingArrowConfig() { + super("grappling_arrow", + true, + Material.SPECTRAL_ARROW, + "&6Grappling Arrow", + List.of("&eFire at a TARGET BLOCK to grapple!")); + setEnchantments(List.of("GRAPPLING_HOOK,1")); + setScalability(CustomItem.Scalability.FIXED); + setDropWeight("1"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GruntsBootsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GruntsBootsConfig.java new file mode 100644 index 000000000..033e73b4a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GruntsBootsConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class GruntsBootsConfig extends CustomItemsConfigFields { + public GruntsBootsConfig() { + super("grunts_boots", true, Material.IRON_BOOTS, "&fGrunt's Boots", new ArrayList<>(List.of("&2Awarded to those who challenge the", "&2Wood League Arena!"))); + setEnchantments(new ArrayList<>(List.of("PROTECTION,5", "PROJECTILE_PROTECTION,5", "UNBREAKING,5"))); + setItemType(CustomItem.ItemType.UNIQUE); + setLevel(20); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GruntsChestplateConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GruntsChestplateConfig.java new file mode 100644 index 000000000..773dd8d8a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GruntsChestplateConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class GruntsChestplateConfig extends CustomItemsConfigFields { + public GruntsChestplateConfig() { + super("grunts_chestplate", true, Material.IRON_CHESTPLATE, "&fGrunt's Chestplate", new ArrayList<>(List.of("&2Awarded to those who challenge the", "&2Wood League Arena!"))); + setEnchantments(new ArrayList<>(List.of("PROTECTION,5", "PROJECTILE_PROTECTION,4", "UNBREAKING,5"))); + setItemType(CustomItem.ItemType.UNIQUE); + setLevel(20); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GruntsHelmetConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GruntsHelmetConfig.java new file mode 100644 index 000000000..f2fe58bb5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GruntsHelmetConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class GruntsHelmetConfig extends CustomItemsConfigFields { + public GruntsHelmetConfig() { + super("grunts_helmet", true, Material.IRON_HELMET, "&fGrunt's Helmet", new ArrayList<>(List.of("&2Awarded to those who challenge the", "&2Wood League Arena!"))); + setEnchantments(new ArrayList<>(List.of("PROTECTION,5", "PROJECTILE_PROTECTION,4", "UNBREAKING,5"))); + setItemType(CustomItem.ItemType.UNIQUE); + setLevel(20); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GruntsLeggingsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GruntsLeggingsConfig.java new file mode 100644 index 000000000..00bc38fc4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GruntsLeggingsConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class GruntsLeggingsConfig extends CustomItemsConfigFields { + public GruntsLeggingsConfig() { + super("grunts_leggings", true, Material.IRON_LEGGINGS, "&fGrunt's Leggings", new ArrayList<>(List.of("&2Awarded to those who challenge the", "&2Wood League Arena!"))); + setEnchantments(new ArrayList<>(List.of("PROTECTION,5", "PROJECTILE_PROTECTION,4", "UNBREAKING,5"))); + setItemType(CustomItem.ItemType.UNIQUE); + setLevel(20); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GruntsSwordConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GruntsSwordConfig.java new file mode 100644 index 000000000..69f7206dc --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/GruntsSwordConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class GruntsSwordConfig extends CustomItemsConfigFields { + public GruntsSwordConfig() { + super("grunts_sword", true, Material.IRON_SWORD, "&fGrunt's Sword", new ArrayList<>(List.of("&2Awarded to those who challenge the", "&2Wood League Arena!"))); + setEnchantments(new ArrayList<>(List.of("SHARPNESS,5", "KNOCKBACK,2", "SWEEPING_EDGE,1", "UNBREAKING,5"))); + setItemType(CustomItem.ItemType.UNIQUE); + setLevel(20); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/InvictusBootsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/InvictusBootsConfig.java new file mode 100644 index 000000000..3cdde5432 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/InvictusBootsConfig.java @@ -0,0 +1,18 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class InvictusBootsConfig extends CustomItemsConfigFields { + public InvictusBootsConfig() { + super("invictus_boots", true, Material.NETHERITE_BOOTS, "&4Invictus Boots", new ArrayList<>(List.of("&2Awarded to the champions of the", "&2Wood League Arena!"))); + setEnchantments(new ArrayList<>(List.of("PROTECTION,5", "BLAST_PROTECTION,4", "PROJECTILE_PROTECTION,4", "MENDING,1", "UNBREAKING,5"))); + setPotionEffects(List.of("SPEED,0,self,continuous")); + setItemType(CustomItem.ItemType.UNIQUE); + setLevel(50); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/InvictusChestplateConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/InvictusChestplateConfig.java new file mode 100644 index 000000000..bf8e9199e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/InvictusChestplateConfig.java @@ -0,0 +1,18 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class InvictusChestplateConfig extends CustomItemsConfigFields { + public InvictusChestplateConfig() { + super("invictus_chestplate", true, Material.NETHERITE_CHESTPLATE, "&4Invictus Chestplate", new ArrayList<>(List.of("&2Awarded to the champions of the", "&2Wood League Arena!"))); + setEnchantments(new ArrayList<>(List.of("PROTECTION,5", "BLAST_PROTECTION,4", "PROJECTILE_PROTECTION,4", "MENDING,1", "UNBREAKING,5"))); + setPotionEffects(List.of("HEAL,0,self,onHit")); + setItemType(CustomItem.ItemType.UNIQUE); + setLevel(50); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/InvictusHelmetConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/InvictusHelmetConfig.java new file mode 100644 index 000000000..b5f0678fe --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/InvictusHelmetConfig.java @@ -0,0 +1,18 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class InvictusHelmetConfig extends CustomItemsConfigFields { + public InvictusHelmetConfig() { + super("invictus_helmet", true, Material.NETHERITE_HELMET, "&4Invictus Helmet", new ArrayList<>(List.of("&2Awarded to the champions of the", "&2Wood League Arena!"))); + setEnchantments(new ArrayList<>(List.of("PROTECTION,5", "BLAST_PROTECTION,4", "PROJECTILE_PROTECTION,4", "MENDING,1", "UNBREAKING,5"))); + setPotionEffects(List.of("NIGHT_VISION,0,self,continuous")); + setItemType(CustomItem.ItemType.UNIQUE); + setLevel(50); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/InvictusLeggingsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/InvictusLeggingsConfig.java new file mode 100644 index 000000000..f13f57c40 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/InvictusLeggingsConfig.java @@ -0,0 +1,18 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class InvictusLeggingsConfig extends CustomItemsConfigFields { + public InvictusLeggingsConfig() { + super("invictus_leggings", true, Material.NETHERITE_LEGGINGS, "&4Invictus Leggings", new ArrayList<>(List.of("&2Awarded to the champions of the", "&2Wood League Arena!"))); + setEnchantments(new ArrayList<>(List.of("PROTECTION,5", "BLAST_PROTECTION,4", "PROJECTILE_PROTECTION,4", "MENDING,1", "UNBREAKING,5"))); + setPotionEffects(List.of("JUMP,0,self,continuous")); + setItemType(CustomItem.ItemType.UNIQUE); + setLevel(50); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/InvictusPickaxeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/InvictusPickaxeConfig.java new file mode 100644 index 000000000..57c11afca --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/InvictusPickaxeConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class InvictusPickaxeConfig extends CustomItemsConfigFields { + public InvictusPickaxeConfig() { + super("invictus_pickaxe", true, Material.NETHERITE_PICKAXE, "&4Invictus Pickaxe", new ArrayList<>(List.of("&2Awarded to the champions of the", "&2Wood League Arena!"))); + setEnchantments(new ArrayList<>(List.of("EFFICIENCY,6", "DRILLING,3", "UNBREAKING,5"))); + setPotionEffects(List.of("FAST_DIGGING,0,self,continuous")); + setItemType(CustomItem.ItemType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/InvictusShovelConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/InvictusShovelConfig.java new file mode 100644 index 000000000..71e6dc3f7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/InvictusShovelConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class InvictusShovelConfig extends CustomItemsConfigFields { + public InvictusShovelConfig() { + super("invictus_shovel", true, Material.NETHERITE_SHOVEL, "&4Invictus Shovel", new ArrayList<>(List.of("&2Awarded to the champions of the", "&2Wood League Arena!"))); + setEnchantments(new ArrayList<>(List.of("EFFICIENCY,6", "DRILLING,3", "UNBREAKING,5"))); + setPotionEffects(List.of("FAST_DIGGING,0,self,continuous")); + setItemType(CustomItem.ItemType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/InvictusSwordConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/InvictusSwordConfig.java new file mode 100644 index 000000000..f19ce8a63 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/InvictusSwordConfig.java @@ -0,0 +1,18 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class InvictusSwordConfig extends CustomItemsConfigFields { + public InvictusSwordConfig() { + super("invictus_sword", true, Material.NETHERITE_SWORD, "&4Invictus Sword", new ArrayList<>(List.of("&2Awarded to the champions of the", "&2Wood League Arena!"))); + setEnchantments(new ArrayList<>(List.of("SHARPNESS,5", "KNOCKBACK,2", "MENDING,1", "LIGHTNING,3", "SWEEPING_EDGE,1", "UNBREAKING,5"))); + setPotionEffects(List.of("WITHER,0,target,onHit")); + setItemType(CustomItem.ItemType.UNIQUE); + setLevel(50); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/LostPresentConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/LostPresentConfig.java new file mode 100644 index 000000000..4b9308be7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/LostPresentConfig.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class LostPresentConfig extends CustomItemsConfigFields { + public LostPresentConfig() { + super("xmas_lost_present", + true, + Material.CHEST, + "&2Lost Present", + new ArrayList<>(List.of("&2Turn this in to Santa for a reward!"))); + setScalability(CustomItem.Scalability.FIXED); + setItemType(CustomItem.ItemType.UNIQUE); + setPermission("elitequest.xmas_quest.yml"); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/LuckyCharmsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/LuckyCharmsConfig.java new file mode 100644 index 000000000..9b678407c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/LuckyCharmsConfig.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class LuckyCharmsConfig extends CustomItemsConfigFields { + public LuckyCharmsConfig() { + super("lucky_charms", + true, + Material.COOKIE, + "&bLucky Charms", + new ArrayList<>(List.of("&aPart of a complete breakfast!", "&cNote: Absolutely not a part of", "&ca complete breakfast."))); + setEnchantments(List.of("VANISHING_CURSE,1")); + setPotionEffects(List.of("LUCK,0,self,continuous")); + setDropWeight("1"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/LuckyTicketConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/LuckyTicketConfig.java new file mode 100644 index 000000000..12d7f3c80 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/LuckyTicketConfig.java @@ -0,0 +1,24 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class LuckyTicketConfig extends CustomItemsConfigFields { + public LuckyTicketConfig() { + super("elite_lucky_ticket", + true, + Material.PAPER, + "&6Elite Lucky Ticket", + new ArrayList<>(List.of( + "&2Doubles the chance of successfully", + "&2enchanting an item!"))); + setEnchantments(List.of("LUCKY_SOURCE,1")); + setItemType(CustomItem.ItemType.UNIQUE); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/MagmaguysToothpickConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/MagmaguysToothpickConfig.java new file mode 100644 index 000000000..b028da70d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/MagmaguysToothpickConfig.java @@ -0,0 +1,18 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import org.bukkit.Material; + +import java.util.List; + +public class MagmaguysToothpickConfig extends CustomItemsConfigFields { + public MagmaguysToothpickConfig() { + super("magmaguys_toothpick", + true, + Material.WOODEN_SWORD, + "&4Magmaguy&c's &2Toothpick", + List.of("&aIn nearly mint condition!")); + setEnchantments(List.of("VANISHING_CURSE,1")); + setCustomModelID(1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/MeteorShowerScrollConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/MeteorShowerScrollConfig.java new file mode 100644 index 000000000..de12cf2b9 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/MeteorShowerScrollConfig.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class MeteorShowerScrollConfig extends CustomItemsConfigFields { + public MeteorShowerScrollConfig() { + super("meteor_shower_scroll", + true, + Material.PAPER, + "&7Meteor Shower Scroll", + new ArrayList<>(List.of("&4Call forth destruction.", "&4Single-use."))); + setEnchantments(List.of("METEOR_SHOWER,1")); + setItemType(CustomItem.ItemType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/NovicesBootsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/NovicesBootsConfig.java new file mode 100644 index 000000000..e4efd4ca1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/NovicesBootsConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class NovicesBootsConfig extends CustomItemsConfigFields { + public NovicesBootsConfig() { + super("novices_boots", true, Material.LEATHER_BOOTS, "&8Novice's Boots", new ArrayList<>(List.of("&2Awarded to those who challenge the", "&2Wood League Arena!"))); + setEnchantments(new ArrayList<>(List.of("PROTECTION,5", "UNBREAKING,5"))); + setItemType(CustomItem.ItemType.UNIQUE); + setLevel(10); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/NovicesChestplateConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/NovicesChestplateConfig.java new file mode 100644 index 000000000..c33eb0dc1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/NovicesChestplateConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class NovicesChestplateConfig extends CustomItemsConfigFields { + public NovicesChestplateConfig() { + super("novices_chestplate", true, Material.LEATHER_CHESTPLATE, "&8Novice's Chestplate", new ArrayList<>(List.of("&2Awarded to those who challenge the", "&2Wood League Arena!"))); + setEnchantments(new ArrayList<>(List.of("PROTECTION,5", "UNBREAKING,5"))); + setItemType(CustomItem.ItemType.UNIQUE); + setLevel(10); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/NovicesHelmetConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/NovicesHelmetConfig.java new file mode 100644 index 000000000..e2da64dd7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/NovicesHelmetConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class NovicesHelmetConfig extends CustomItemsConfigFields { + public NovicesHelmetConfig() { + super("novices_helmet", true, Material.LEATHER_HELMET, "&8Novice's Helmet", new ArrayList<>(List.of("&2Awarded to those who challenge the", "&2Wood League Arena!"))); + setEnchantments(new ArrayList<>(List.of("PROTECTION,5", "UNBREAKING,5"))); + setItemType(CustomItem.ItemType.UNIQUE); + setLevel(10); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/NovicesLeggingsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/NovicesLeggingsConfig.java new file mode 100644 index 000000000..6002aa790 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/NovicesLeggingsConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class NovicesLeggingsConfig extends CustomItemsConfigFields { + public NovicesLeggingsConfig() { + super("novices_leggings", true, Material.LEATHER_LEGGINGS, "&8Novice's Leggings", new ArrayList<>(List.of("&2Awarded to those who challenge the", "&2Wood League Arena!"))); + setEnchantments(new ArrayList<>(List.of("PROTECTION,5", "UNBREAKING,5"))); + setItemType(CustomItem.ItemType.UNIQUE); + setLevel(10); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/NovicesSwordConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/NovicesSwordConfig.java new file mode 100644 index 000000000..00dc7ef28 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/NovicesSwordConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class NovicesSwordConfig extends CustomItemsConfigFields { + public NovicesSwordConfig() { + super("novices_sword", true, Material.STONE_SWORD, "&8Novice's Sword", new ArrayList<>(List.of("&2Awarded to those who challenge the", "&2Wood League Arena!"))); + setEnchantments(new ArrayList<>(List.of("SHARPNESS,5", "SWEEPING_EDGE,1", "UNBREAKING,5"))); + setItemType(CustomItem.ItemType.UNIQUE); + setLevel(10); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/OwlCharmConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/OwlCharmConfig.java new file mode 100644 index 000000000..9e975b915 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/OwlCharmConfig.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class OwlCharmConfig extends CustomItemsConfigFields { + public OwlCharmConfig() { + super("owl_charm", + true, + Material.ELYTRA, + "&bOwl Charm", + new ArrayList<>(List.of("&aBecome the ultimate nocturnal", "&apredator!"))); + setEnchantments(List.of("VANISHING_CURSE,1")); + setPotionEffects(new ArrayList<>(List.of("GLOWING,0,target,onHit", "JUMP,2,self,continuous", "NIGHT_VISION,0,self,continuous", "WEAKNESS,0,self,continuous"))); + setDropWeight("1"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/RabbitCharmConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/RabbitCharmConfig.java new file mode 100644 index 000000000..717c7a738 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/RabbitCharmConfig.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class RabbitCharmConfig extends CustomItemsConfigFields { + public RabbitCharmConfig() { + super("rabbit_charm", + true, + Material.RABBIT_FOOT, + "&bRabbit Charm", + new ArrayList<>(List.of("&aWith this charm, just about", "&aany destination is only a hop,", "&askip and a jump away!"))); + setEnchantments(List.of("VANISHING_CURSE,1")); + setPotionEffects(List.of("JUMP,2,self,continuous")); + setDropWeight("1"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/RodOfTheDepthsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/RodOfTheDepthsConfig.java new file mode 100644 index 000000000..b0bd1e2a9 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/RodOfTheDepthsConfig.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class RodOfTheDepthsConfig extends CustomItemsConfigFields { + public RodOfTheDepthsConfig() { + super("rod_of_the_depths", + true, + Material.FISHING_ROD, + "&3Rod of the Depths", + new ArrayList<>(List.of("&3You want to hear about where", "&3I got this from? Sit down lad,", "&3I've got a tale for ye..."))); + setEnchantments(new ArrayList<>(List.of("LURE,3", "LUCK_OF_THE_SEA,1", "UNBREAKING,6", "VANISHING_CURSE,1"))); + setPotionEffects(new ArrayList<>(List.of("INVISIBILITY,0,self,onHit", "SLOW,0,self,onHit", "BLINDNESS,0,self,onHit"))); + setItemType(CustomItem.ItemType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/SalamanderCharmConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/SalamanderCharmConfig.java new file mode 100644 index 000000000..fe82635e2 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/SalamanderCharmConfig.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class SalamanderCharmConfig extends CustomItemsConfigFields { + public SalamanderCharmConfig() { + super("salamander_charm", + true, + Material.LEATHER, + "&bSalamander Charm", + new ArrayList<>(List.of("&aAlmost as hot as MagmaGuy's", "&anew mixtape!"))); + setEnchantments(List.of("VANISHING_CURSE,1")); + setPotionEffects(List.of("FIRE_RESISTANCE,0,self,continuous")); + setDropWeight("1"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ScorpionCharm.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ScorpionCharm.java new file mode 100644 index 000000000..87af5ad73 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ScorpionCharm.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class ScorpionCharm extends CustomItemsConfigFields { + public ScorpionCharm() { + super("scorpion_charm", + true, + Material.POISONOUS_POTATO, + "&bScorpion Charm", + new ArrayList<>(List.of("&aFloat like a butterfly,", "&asting like a bee,", "&apoison like a potato!"))); + setEnchantments(List.of("VANISHING_CURSE,1")); + setPotionEffects(List.of("POISON,0,target,onHit")); + setDropWeight("1"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ScrapEliteHugeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ScrapEliteHugeConfig.java new file mode 100644 index 000000000..a2956f0fe --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ScrapEliteHugeConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class ScrapEliteHugeConfig extends CustomItemsConfigFields { + public ScrapEliteHugeConfig() { + super("elite_scrap_huge", + true, + Material.PURPLE_DYE, + "&5Huge Elite Scrap", + new ArrayList<>(List.of("&fUsed to repair Elite items!", "&fFully repairs an item!"))); + setItemType(CustomItem.ItemType.UNIQUE); + setEnchantments(new ArrayList<>(List.of("repair,5"))); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ScrapEliteLargeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ScrapEliteLargeConfig.java new file mode 100644 index 000000000..d905dd681 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ScrapEliteLargeConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class ScrapEliteLargeConfig extends CustomItemsConfigFields { + public ScrapEliteLargeConfig() { + super("elite_scrap_large", + true, + Material.RED_DYE, + "&9Large Elite Scrap", + new ArrayList<>(List.of("&fUsed to repair Elite items!", "&fRepairs a huge amount!"))); + setItemType(CustomItem.ItemType.UNIQUE); + setEnchantments(new ArrayList<>(List.of("repair,4"))); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ScrapEliteMediumConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ScrapEliteMediumConfig.java new file mode 100644 index 000000000..43f9c7fc2 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ScrapEliteMediumConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class ScrapEliteMediumConfig extends CustomItemsConfigFields { + public ScrapEliteMediumConfig() { + super("elite_scrap_medium", + true, + Material.ORANGE_DYE, + "&9Medium Elite Scrap", + new ArrayList<>(List.of("&fUsed to repair Elite items!", "&fRepairs a large amount!"))); + setItemType(CustomItem.ItemType.UNIQUE); + setEnchantments(new ArrayList<>(List.of("repair,3"))); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ScrapEliteSmallConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ScrapEliteSmallConfig.java new file mode 100644 index 000000000..ef552e874 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ScrapEliteSmallConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class ScrapEliteSmallConfig extends CustomItemsConfigFields { + public ScrapEliteSmallConfig() { + super("elite_scrap_small", + true, + Material.GREEN_DYE, + "&9Small Elite Scrap", + new ArrayList<>(List.of("&fUsed to repair Elite items!", "&fRepairs a medium amount!"))); + setItemType(CustomItem.ItemType.UNIQUE); + setEnchantments(new ArrayList<>(List.of("repair,2"))); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ScrapEliteTinyConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ScrapEliteTinyConfig.java new file mode 100644 index 000000000..3377f930f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ScrapEliteTinyConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class ScrapEliteTinyConfig extends CustomItemsConfigFields { + public ScrapEliteTinyConfig() { + super("elite_scrap_tiny", + true, + Material.WHITE_DYE, + "&fTiny Elite Scrap", + new ArrayList<>(List.of("&fUsed to repair Elite items!", "&fRepairs a small amount!"))); + setItemType(CustomItem.ItemType.UNIQUE); + setEnchantments(new ArrayList<>(List.of("repair,1"))); + setScalability(CustomItem.Scalability.FIXED); + setSoulbound(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ShulkerCharmConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ShulkerCharmConfig.java new file mode 100644 index 000000000..57248b0ac --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ShulkerCharmConfig.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class ShulkerCharmConfig extends CustomItemsConfigFields { + public ShulkerCharmConfig() { + super("shulker_charm", + true, + Material.FEATHER, + "&bShulker Charm", + new ArrayList<>(List.of("&aI believe I can fly", "&aI believe I can touch the sky", "&aAnd you're coming with me!"))); + setEnchantments(List.of("VANISHING_CURSE,1")); + setPotionEffects(new ArrayList<>(List.of("LEVITATION,0,self,onHit", "LEVITATION,1,target,onHit"))); + setDropWeight("1"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/SlowpokeCharmConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/SlowpokeCharmConfig.java new file mode 100644 index 000000000..a3877d2da --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/SlowpokeCharmConfig.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class SlowpokeCharmConfig extends CustomItemsConfigFields { + public SlowpokeCharmConfig() { + super("slowpoke_charm", + true, + Material.CARROT_ON_A_STICK, + "&bSlowpoke Charm", + new ArrayList<>(List.of("&aLet's just hope it doesn't hit", "&aitself in its confusion..."))); + setEnchantments(List.of("VANISHING_CURSE,1")); + setPotionEffects(new ArrayList<>(List.of("SLOW,0,self,onHit", "CONFUSION,0,target,onHit"))); + setDropWeight("1"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/SummonMerchantScrollConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/SummonMerchantScrollConfig.java new file mode 100644 index 000000000..4ef99ed02 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/SummonMerchantScrollConfig.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class SummonMerchantScrollConfig extends CustomItemsConfigFields { + public SummonMerchantScrollConfig() { + super("summon_merchant_scroll", + true, + Material.PAPER, + "&6Summon Merchant Scroll", + new ArrayList<>(List.of("&aNeed to sell an item?", "&aRight-click to activate", "&aor yell &9Jeeves!"))); + setEnchantments(List.of("SUMMON_MERCHANT,1")); + setDropWeight("5"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/SummonWolfScrollConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/SummonWolfScrollConfig.java new file mode 100644 index 000000000..a69fce0ea --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/SummonWolfScrollConfig.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class SummonWolfScrollConfig extends CustomItemsConfigFields { + public SummonWolfScrollConfig() { + super("summon_wolf_scroll", + true, + Material.PAPER, + "&6Summon Wolf Scroll", + new ArrayList<>(List.of("&aSummons a good boy", "&ato help you bite Elites!", "&aMake sure you pet it!"))); + setEnchantments(List.of("SUMMON_WOLF,1")); + setItemType(CustomItem.ItemType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/TheFellerConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/TheFellerConfig.java new file mode 100644 index 000000000..394e71def --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/TheFellerConfig.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class TheFellerConfig extends CustomItemsConfigFields { + public TheFellerConfig() { + super("the_feller", + true, + Material.DIAMOND_AXE, + "&2The Feller", + new ArrayList<>(List.of("&aEven in your sleep,", "&ayou can feel this axe''s", "&asaplust"))); + setEnchantments(new ArrayList<>(List.of("FORTUNE,4", "SILK_TOUCH,1", "UNBREAKING,6", "EFFICIENCY,6", "VANISHING_CURSE,1"))); + setPotionEffects(new ArrayList<>(List.of("FAST_DIGGING,1,self,continuous", "NIGHT_VISION,0,self,continuous"))); + setItemType(CustomItem.ItemType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/TheStingerConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/TheStingerConfig.java new file mode 100644 index 000000000..2b55e434b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/TheStingerConfig.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class TheStingerConfig extends CustomItemsConfigFields { + public TheStingerConfig() { + super("the_stinger", + true, + Material.GOLDEN_SWORD, + "&eThe Stinger", + new ArrayList<>(List.of("&aFloat like a butterfly,", "&asting like a bee!"))); + setEnchantments(new ArrayList<>(List.of("SHARPNESS,1", "UNBREAKING,1", "VANISHING_CURSE,1"))); + setPotionEffects(List.of("POISON,0,target,onHit")); + setItemType(CustomItem.ItemType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/UnbindScrollConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/UnbindScrollConfig.java new file mode 100644 index 000000000..40e45c591 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/UnbindScrollConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class UnbindScrollConfig extends CustomItemsConfigFields { + public UnbindScrollConfig() { + super("unbind_scroll", + true, + Material.PAPER, + "&5Unbind Scroll", + new ArrayList<>(List.of("&5Allows users to unbind one", + "&5soulbound item at an anvil!", + "&5Use wisely!"))); + setEnchantments(List.of("UNBIND,1")); + setItemType(CustomItem.ItemType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/VampiricCharmConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/VampiricCharmConfig.java new file mode 100644 index 000000000..c6583876f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/VampiricCharmConfig.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class VampiricCharmConfig extends CustomItemsConfigFields { + public VampiricCharmConfig() { + super("vampiric_charm", + true, + Material.STICK, + "&bVampiric Charm", + new ArrayList<>(List.of("&aNo one can remember where this", "&acame from, and no one can,", "&aforget how dangerous it is..."))); + setEnchantments(List.of("VANISHING_CURSE,1")); + setPotionEffects(new ArrayList<>(List.of("HEAL,0,self,onHit", "BLINDNESS,0,self,onHit", "SLOW,0,self,onHit"))); + setDropWeight("1"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/VeteransBootsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/VeteransBootsConfig.java new file mode 100644 index 000000000..dca970c39 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/VeteransBootsConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class VeteransBootsConfig extends CustomItemsConfigFields { + public VeteransBootsConfig() { + super("veterans_boots", true, Material.GOLDEN_BOOTS, "&6Veteran's Boots", new ArrayList<>(List.of("&2Awarded to those who challenge the", "&2Wood League Arena!"))); + setEnchantments(new ArrayList<>(List.of("PROTECTION,5", "PROJECTILE_PROTECTION,4", "MENDING,1", "UNBREAKING,5"))); + setItemType(CustomItem.ItemType.UNIQUE); + setLevel(30); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/VeteransChestplateConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/VeteransChestplateConfig.java new file mode 100644 index 000000000..4879bcb65 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/VeteransChestplateConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class VeteransChestplateConfig extends CustomItemsConfigFields { + public VeteransChestplateConfig() { + super("veterans_chestplate", true, Material.GOLDEN_CHESTPLATE, "&6Veteran's Chestplate", new ArrayList<>(List.of("&2Awarded to those who challenge the", "&2Wood League Arena!"))); + setEnchantments(new ArrayList<>(List.of("PROTECTION,5", "PROJECTILE_PROTECTION,4", "MENDING,1", "UNBREAKING,5"))); + setItemType(CustomItem.ItemType.UNIQUE); + setLevel(30); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/VeteransHelmetConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/VeteransHelmetConfig.java new file mode 100644 index 000000000..069e12586 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/VeteransHelmetConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class VeteransHelmetConfig extends CustomItemsConfigFields { + public VeteransHelmetConfig() { + super("veterans_helmet", true, Material.GOLDEN_HELMET, "&6Veteran's Helmet", new ArrayList<>(List.of("&2Awarded to those who challenge the", "&2Wood League Arena!"))); + setEnchantments(new ArrayList<>(List.of("PROTECTION,5", "PROJECTILE_PROTECTION,4", "MENDING,1", "UNBREAKING,5"))); + setItemType(CustomItem.ItemType.UNIQUE); + setLevel(30); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/VeteransLeggingsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/VeteransLeggingsConfig.java new file mode 100644 index 000000000..610288772 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/VeteransLeggingsConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class VeteransLeggingsConfig extends CustomItemsConfigFields { + public VeteransLeggingsConfig() { + super("veterans_leggings", true, Material.GOLDEN_LEGGINGS, "&6Veteran's Leggings", new ArrayList<>(List.of("&2Awarded to those who challenge the", "&2Wood League Arena!"))); + setEnchantments(new ArrayList<>(List.of("PROTECTION,5", "PROJECTILE_PROTECTION,4", "MENDING,1", "UNBREAKING,5"))); + setItemType(CustomItem.ItemType.UNIQUE); + setLevel(30); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/VeteransSwordConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/VeteransSwordConfig.java new file mode 100644 index 000000000..ac13304ec --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/VeteransSwordConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class VeteransSwordConfig extends CustomItemsConfigFields { + public VeteransSwordConfig() { + super("veterans_sword", true, Material.GOLDEN_SWORD, "&6Veteran's Sword", new ArrayList<>(List.of("&2Awarded to those who challenge the", "&2Wood League Arena!"))); + setEnchantments(new ArrayList<>(List.of("SHARPNESS,5", "KNOCKBACK,2", "MENDING,1", "SWEEPING_EDGE,1", "UNBREAKING,5"))); + setItemType(CustomItem.ItemType.UNIQUE); + setLevel(30); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/WerewolfBoneItem.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/WerewolfBoneItem.java new file mode 100644 index 000000000..2cfc5a067 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/WerewolfBoneItem.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class WerewolfBoneItem extends CustomItemsConfigFields { + public WerewolfBoneItem() { + super("werewolf_bone", + true, + Material.BONE, + "&6Werewolf Bone", + new ArrayList<>(List.of("&aHaving killed the alpha,", "&athis temporarily makes you!", "&athe wolves' new leader"))); + setEnchantments(List.of("SUMMON_WOLF,1")); + setItemType(CustomItem.ItemType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/WolfsbaneItem.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/WolfsbaneItem.java new file mode 100644 index 000000000..3a526cf78 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/WolfsbaneItem.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class WolfsbaneItem extends CustomItemsConfigFields { + public WolfsbaneItem() { + super("wolfsbane", + true, + Material.IRON_SWORD, + "&7Wolfsbane", + new ArrayList<>(List.of("&aMade from the remains of", "&aan alpha werewolf, all", "&awolves cower at the sight of it."))); + setEnchantments(new ArrayList<>(List.of("SHARPNESS,1", "FIRE_ASPECT,4", "UNBREAKING,5", "LOOTING,5"))); + setPotionEffects(new ArrayList<>(List.of("FAST_DIGGING,2,self,onHit", "NIGHT_VISION,0,self,continuous"))); + setItemType(CustomItem.ItemType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ZombieKingsAxeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ZombieKingsAxeConfig.java new file mode 100644 index 000000000..e87707d02 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customitems/premade/ZombieKingsAxeConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.customitems.premade; + +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class ZombieKingsAxeConfig extends CustomItemsConfigFields { + public ZombieKingsAxeConfig() { + super("zombie_kings_axe", + true, + Material.GOLDEN_AXE, + "&4Zombie King's Axe", + new ArrayList<>(List.of("The axe of the one Zombies", "call their king.", "The bloodlust is palpable."))); + setEnchantments(new ArrayList<>(List.of("SHARPNESS,1", "SMITE,5", "EFFICIENCY,5", "UNBREAKING,5", "KNOCKBACK,3", + "FIRE_ASPECT,4", "LOOTING,5", "AQUA_AFFINITY,5", "FLAMETHROWER,1"))); + setPotionEffects(new ArrayList<>(List.of("FAST_DIGGING,0,self,onHit", "NIGHT_VISION,0,self,continuous", "WITHER,0,target,onHit"))); + setItemType(CustomItem.ItemType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customquests/CustomQuestsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customquests/CustomQuestsConfig.java new file mode 100644 index 000000000..126943f4a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customquests/CustomQuestsConfig.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.customquests; + +import com.magmaguy.magmacore.config.CustomConfig; + +import java.util.HashMap; + +public class CustomQuestsConfig extends CustomConfig { + private static HashMap customQuests = new HashMap<>(); + + public CustomQuestsConfig() { + super("customquests", "com.magmaguy.elitemobs.config.customquests.premade", CustomQuestsConfigFields.class); + customQuests = new HashMap<>(); + for (String key : super.getCustomConfigFieldsHashMap().keySet()) + customQuests.put(key, (CustomQuestsConfigFields) super.getCustomConfigFieldsHashMap().get(key)); + } + + public static HashMap getCustomQuests() { + return customQuests; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customquests/CustomQuestsConfigFields.java b/src/main/java/com/magmaguy/elitemobs/config/customquests/CustomQuestsConfigFields.java new file mode 100644 index 000000000..e6e6a1223 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customquests/CustomQuestsConfigFields.java @@ -0,0 +1,202 @@ +package com.magmaguy.elitemobs.config.customquests; + +import com.magmaguy.elitemobs.config.CustomConfigFields; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.configuration.ConfigurationSection; + +import java.util.*; + +public class CustomQuestsConfigFields extends CustomConfigFields { + + @Getter + @Setter + protected Map> customObjectives = new HashMap(); + @Getter + @Setter + List temporaryPermissions = new ArrayList<>(); + @Getter + @Setter + List questAcceptDialog = new ArrayList<>(); + @Getter + @Setter + private int questLevel = 0; + @Getter + @Setter + private List customRewardsList = new ArrayList<>(); + @Getter + @Setter + //Required permission to accept quest + private String questAcceptPermission = ""; + @Getter + @Setter + private List questAcceptPermissions = null; + @Getter + //Permission which locks players out of a quest + private String questLockoutPermission = ""; + @Getter + @Setter + private int questLockoutMinutes = -1; + @Getter + @Setter + private String questName = ""; + @Getter + @Setter + private List questLore = new ArrayList<>(); + @Getter + @Setter + private List questCompleteDialog = new ArrayList<>(); + @Getter + @Setter + //placeholders: $player, $getX, $getY, $getZ + private List questCompleteCommands = new ArrayList<>(); + @Getter + @Setter + private String turnInNPC = ""; + @Getter + @Setter + private boolean trackable = true; + @Getter + @Setter + private String questAcceptSound; + @Getter + @Setter + private String questCompleteSound; + + + public CustomQuestsConfigFields(String filename, + boolean isEnabled, + Map> customQuestObjective, + List customQuestReward, + int questLevel, + String questName, + List questLore) { + super(filename, isEnabled); + this.customObjectives = customQuestObjective; + this.customRewardsList = customQuestReward; + this.questLevel = questLevel; + this.questName = questName; + this.questLore = questLore; + } + + /** + * Used by plugin-generated files (defaults) + * + * @param filename + * @param isEnabled + */ + public CustomQuestsConfigFields(String filename, + boolean isEnabled) { + super(filename, isEnabled); + } + + public void setQuestLockoutPermission() { + this.questLockoutPermission = "elitequest." + getFilename(); + } + + @Override + public void processConfigFields() { + this.isEnabled = processBoolean("isEnabled", isEnabled, true, true); + if (fileConfiguration.contains("customObjectives") && fileConfiguration.get("customObjectives") instanceof List) + updateOldStringFormat(fileConfiguration.getStringList("customObjectives")); + this.customObjectives = processQuestObjectives(); + this.customRewardsList = processStringList("customRewards", customRewardsList, new ArrayList<>(), true); + this.questAcceptPermission = processString("questAcceptPermission", questAcceptPermission, null, false); + this.questAcceptPermissions = processStringList("questAcceptPermissions", questAcceptPermissions, null, false); + this.questLockoutPermission = processString("questLockoutPermission", questLockoutPermission, null, false); + this.questLockoutMinutes = processInt("questLockoutMinutes", questLockoutMinutes, -1, false); + this.questName = translatable(filename, "name", processString("name", questName, filename, true)); + this.questLore = translatable(filename, "questLore", processStringList("questLore", questLore, new ArrayList<>(), false)); + this.temporaryPermissions = processStringList("temporaryPermissions", temporaryPermissions, new ArrayList<>(), false); + this.questAcceptDialog = translatable(filename, "questAcceptDialog", processStringList("questAcceptDialog", questAcceptDialog, new ArrayList<>(), false)); + this.questCompleteDialog = translatable(filename, "questCompleteMessage", processStringList("questCompleteMessage", questCompleteDialog, new ArrayList<>(), false)); + this.questCompleteCommands = processStringList("questCompleteCommands", questCompleteCommands, new ArrayList<>(), false); + this.turnInNPC = processString("turnInNPC", turnInNPC, "", false); + this.trackable = processBoolean("trackable", trackable, true, false); + this.questLevel = processInt("questLevel", questLevel, 0, false); + this.questAcceptSound = processString("questAcceptSound", questAcceptSound, "", false); + this.questCompleteSound = processString("questCompleteSound", questCompleteSound, "", false); + } + + private void updateOldStringFormat(List oldList) { + Map> parsedObjectives = new HashMap<>(); + int counter = 0; + for (String questObjectiveEntry : oldList) { + counter++; + Map parsedEntry = new HashMap<>(); + String[] individualEntries = questObjectiveEntry.split(":"); + for (String keyAndValue : individualEntries) { + String[] keyAndValueArray = keyAndValue.split("="); + String key = keyAndValueArray[0]; + Object value = null; + if (keyAndValueArray.length > 1) + value = keyAndValueArray[1]; + if (value == null) + switch (key.toUpperCase(Locale.ROOT)) { + case "KILL_CUSTOM", "FETCH_ITEM", "DIALOG", "ARENA" -> { + value = key; + key = "objectiveType"; + } + default -> + Logger.warn("Failed to correctly parse key " + key + " in " + filename + " while updating the old quest configuration format!"); + } + if (key.equalsIgnoreCase("dialog")) { + value = Arrays.stream(((String) value).split("\\n")).toList(); + } + parsedEntry.put(key, value); + Logger.info("Converted quest old entry to " + key + ": " + value); + } + parsedObjectives.put("Objective" + counter, parsedEntry); + } + fileConfiguration.set("customObjectives", parsedObjectives); + customObjectives = parsedObjectives; + try { + fileConfiguration.save(file); + } catch (Exception ex) { + Logger.warn("Failed to save new custom objective format!"); + } + } + + private Map> processQuestObjectives() { + Map rawMap; + + //write defaults + if (fileConfiguration.getConfigurationSection("customObjectives") == null && !customObjectives.isEmpty()) { + fileConfiguration.set("customObjectives", customObjectives); + rawMap = new HashMap<>(customObjectives); + + Map> parsedObjectives = new HashMap<>(); + for (Map.Entry> maps : customObjectives.entrySet()) { + Map parsedMap = new HashMap<>(); + for (Map.Entry entry : maps.getValue().entrySet()) + if (entry.getKey().equals("dialog")) + parsedMap.put(entry.getKey(), translatable(filename, "customObjectives." + maps.getKey() + "." + entry.getKey(), (List) entry.getValue())); + else + parsedMap.put(entry.getKey(), entry.getValue()); + parsedObjectives.put(maps.getKey(), parsedMap); + } + return parsedObjectives; + + } else + rawMap = fileConfiguration.getConfigurationSection("customObjectives").getValues(false); + + if (rawMap == null) { + Logger.warn("Failed to parse custom objectives for " + filename); + return new HashMap<>(); + } + //Parse for the specific translatable elements + Map> parsedObjectives = new HashMap<>(); + for (Map.Entry maps : rawMap.entrySet()) { + Map parsedMap = new HashMap<>(); + for (Map.Entry entry : ((ConfigurationSection) maps.getValue()).getValues(false).entrySet()) + if (entry.getKey().equals("dialog")) + parsedMap.put((String) entry.getKey(), translatable(filename, "customObjectives." + maps.getKey() + "." + entry.getKey(), (List) entry.getValue())); + else + parsedMap.put((String) entry.getKey(), entry.getValue()); + parsedObjectives.put(maps.getKey(), parsedMap); + } + return parsedObjectives; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customquests/premade/TestQuestConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customquests/premade/TestQuestConfig.java new file mode 100644 index 000000000..eee94ee11 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customquests/premade/TestQuestConfig.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.customquests.premade; + +import com.magmaguy.elitemobs.config.customquests.CustomQuestsConfigFields; + +import java.util.List; +import java.util.Map; + +public class TestQuestConfig extends CustomQuestsConfigFields { + public TestQuestConfig() { + super("test_quest", + true, + Map.of("Objective1", Map.of("objectiveType", "KILL_CUSTOM", + "filename", "test_boss.yml", + "amount", 1)), + List.of("filename=magmaguys_toothpick.yml:amount=1:chance=1"), + 0, + "Kill the Test Boss", + List.of("&cEnd the test boss' reign of terror!")); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customquests/premade/WelcomeQuest0Config.java b/src/main/java/com/magmaguy/elitemobs/config/customquests/premade/WelcomeQuest0Config.java new file mode 100644 index 000000000..e482af240 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customquests/premade/WelcomeQuest0Config.java @@ -0,0 +1,31 @@ +package com.magmaguy.elitemobs.config.customquests.premade; + +import com.magmaguy.elitemobs.config.customquests.CustomQuestsConfigFields; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class WelcomeQuest0Config extends CustomQuestsConfigFields { + public WelcomeQuest0Config() { + super("ag_welcome_quest_0.yml", + true, + Map.of("Objective1", Map.of("objectiveType", "DIALOG", + "filename", "guide_1.yml", + "npcName", "Odigos", + "location", "at the Adventurer's Guild", + "dialog", List.of( + "&8[&aCasus&8]&f Welcome to the Adventurer's Guild Hub, the hub for all things EliteMobs!", + "You can always get back here using &2/ag&f!", + "Talk to me again for a quest!"))), + List.of("currencyAmount=50:amount=1:chance=1"), + 1, + "&2Finding the AG!", + List.of("Discover the Adventurer's Guild Hub using the command &2/ag &0or &2/adventurersguild !") + ); + setQuestLockoutPermission(); + setTurnInNPC("guide_1.yml"); + setQuestAcceptDialog(new ArrayList<>(List.of("&8[Odigos]&f Alright, make sure you use &2/ag &f or &2/adventurersguild&f to head off to the Adventurer's Guild Hub!", + "Make sure you talk to Casus when you're there!"))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customquests/premade/WelcomeQuest1Config.java b/src/main/java/com/magmaguy/elitemobs/config/customquests/premade/WelcomeQuest1Config.java new file mode 100644 index 000000000..43283845c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customquests/premade/WelcomeQuest1Config.java @@ -0,0 +1,34 @@ +package com.magmaguy.elitemobs.config.customquests.premade; + +import com.magmaguy.elitemobs.config.customquests.CustomQuestsConfigFields; + +import java.util.*; + +public class WelcomeQuest1Config extends CustomQuestsConfigFields { + public WelcomeQuest1Config() { + super("ag_welcome_quest_1.yml", + true, + new HashMap<>(), + new ArrayList<>(List.of( + "filename=magmaguys_toothpick.yml:amount=1:chance=1", + "currencyAmount=750:amount=1:chance=1" + )), + 1, + "&2Welcome to the AG!", + Collections.singletonList("&aMeet the Adventurer's Guild NPCs!") + ); + //Huff my shorts java, you and your 10 Map.of limit + super.customObjectives.put("Objective1", Map.of("objectiveType", "DIALOG", "filename", "back_teleporter.yml", "npcName", "Hermes", "location", "by the gate", "dialog", List.of("&8[&aHermes&8]&f I take you back to where you were before! Just talk to me again!"))); + super.customObjectives.put("Objective2", Map.of("objectiveType", "DIALOG", "filename", "barkeep.yml", "npcName", "Bartley", "location", "in the main building", "dialog", List.of("&8[&aBartley&8]&f Need a stiff drink? My drinks pack an extra punch!"))); + super.customObjectives.put("Objective3", Map.of("objectiveType", "DIALOG", "filename", "blacksmith.yml", "npcName", "Greg", "location", "in the main building", "dialog", List.of("&8[&aGreg&8]&f Want to buy or sell something? I've got a little of everything!"))); + super.customObjectives.put("Objective4", Map.of("objectiveType", "DIALOG", "filename", "combat_instructor.yml", "npcName", "Charles", "location", "next to the main building", "dialog", List.of("&8[&aCharles&8]&f Want to learn about fighting elites? Just talk to me!"))); + super.customObjectives.put("Objective5", Map.of("objectiveType", "DIALOG", "filename", "guild_attendant.yml", "npcName", "Gillian", "location", "in the main building", "dialog", List.of("&8[&aGillian&8]&f Do you seek power? Do you desire to reach new heights? Talk to me to unlock new guild ranks, and reach levels of power you never thought to be possible!"))); + super.customObjectives.put("Objective6", Map.of("objectiveType", "DIALOG", "filename", "quest_giver.yml", "npcName", "Qel'Thuzad", "location", "in the main building", "dialog", List.of("&8[&aQel'Thuzad&8]&f These Elite monsters, where do they keep coming from?", "Ah, never mind that for now, we are always in need of more people to assist us in slaying quests!", "Just talk to me to get one!"))); + super.customObjectives.put("Objective7", Map.of("objectiveType", "DIALOG", "filename", "enchanted.yml", "npcName", "Eden", "location", "under the main building", "dialog", List.of("&8[&aEden&8]&f Need to enchant your Elite items? Just bring me an elite enchanted book!"))); + super.customObjectives.put("Objective8", Map.of("objectiveType", "DIALOG", "filename", "repairman_config.yml", "npcName", "Reggie", "location", "under the main building", "dialog", List.of("&8[&aReggie&8]&f Need your Elite items repaired? Just bring me some scrap, and I'll make them as good as new!", "Remember, the higher the level of your scrap, the better I can repair you Elite item!"))); + super.customObjectives.put("Objective9", Map.of("objectiveType", "DIALOG", "filename", "scrapper_config.yml", "npcName", "Kelly", "location", "under the main building", "dialog", List.of("&8[&aKelly&8]&f Got extra Elite items? Don't know what to do with them? Give them to me, and I'll turn them into scrap!", "You can use scrap to repair Elite items!"))); + super.customObjectives.put("Objective10", Map.of("objectiveType", "DIALOG", "filename", "special_blacksmith.yml", "npcName", "Grog", "location", "in the main building", "dialog", List.of("&8[&aGrog&8]&f Want to buy special items? I've got just the thing!"))); + super.customObjectives.put("Objective11", Map.of("objectiveType", "DIALOG", "filename", "unbinder.yml", "npcName", "Ulfric", "location", "under the main building", "dialog", List.of("&8[&aUlfric&8]&f If you bring me a very special and rare item, I can unbind your Elite items.", "You don't yet look prepared to take this challenge on, but you can make killing the Binder of Worlds your ultimate goal, if you dare."))); + setQuestLockoutPermission(); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customquests/premade/XmasQuest0Config.java b/src/main/java/com/magmaguy/elitemobs/config/customquests/premade/XmasQuest0Config.java new file mode 100644 index 000000000..b3b7f8723 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customquests/premade/XmasQuest0Config.java @@ -0,0 +1,37 @@ +package com.magmaguy.elitemobs.config.customquests.premade; + +import com.magmaguy.elitemobs.config.customquests.CustomQuestsConfigFields; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class XmasQuest0Config extends CustomQuestsConfigFields { + public XmasQuest0Config() { + super("xmas_quest_0", + true, + Map.of("Objective1", Map.of("objectiveType", "FETCH_ITEM", "filename", "xmas_lost_present.yml", "amount", 10, "itemName", "Lost Present")), + new ArrayList<>(List.of( + "filename=xmas_treat.yml:amount=10:chance=.3", + "filename=xmas_treat_v2.yml:amount=1:chance=.3", + "filename=xmas_and_gold.yml:amount=1:chance=.2", + "filename=xmas_and_goooooold.yml:amount=1:chance=.2", + "filename=xmas_silver.yml:amount=1:chance=.2", + "filename=xmas_siiiiilver.yml:amount=1:chance=.2", + "filename=xmas_peppermint.yml:amount=1:chance=.1", + "filename=xmas_cornelius_pick.yml:amount=1:chance=.1", + "filename=xmas_substitute_elf_practice.yml:amount=1:chance=.1", + "currencyAmount=300:amount=1:chance=.3", + "currencyAmount=300:amount=1:chance=.3", + "currencyAmount=300:amount=1:chance=.3" + )), + 10, + "&2Find the lost gifts!", + new ArrayList<>(List.of("I seem to have lost some Christmas gifts along the way, would you help a poor old man find them again?", + "I will let you open one of them in return!"))); + super.setQuestAcceptDialog(List.of("&8[&cSaint Nick&8]&f Thank you! I will be waiting here for you!")); + super.setQuestCompleteDialog(List.of("&8[&cSaint Nick&8]&f Thank you for your help! " + + "There are still some lost gifts out there, talk to me again if you want to help out more!")); + super.setTemporaryPermissions(List.of("elitequest.xmas_quest.yml")); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customspawns/CustomSpawnConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customspawns/CustomSpawnConfig.java new file mode 100644 index 000000000..342f4e1c6 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customspawns/CustomSpawnConfig.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.customspawns; + +import com.magmaguy.magmacore.config.CustomConfig; + +import java.util.HashMap; + +public class CustomSpawnConfig extends CustomConfig { + + private static HashMap customSpawns = new HashMap<>(); + + public CustomSpawnConfig() { + super("customspawns", "com.magmaguy.elitemobs.config.customspawns.premade", CustomSpawnConfigFields.class); + customSpawns = new HashMap<>(); + for (String key : super.getCustomConfigFieldsHashMap().keySet()) + if (super.getCustomConfigFieldsHashMap().get(key).isEnabled()) + customSpawns.put(key, (CustomSpawnConfigFields) super.getCustomConfigFieldsHashMap().get(key)); + } + + public static HashMap getCustomSpawns() { + return customSpawns; + } + + public static CustomSpawnConfigFields getCustomEvent(String fileName) { + return customSpawns.get(fileName); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customspawns/CustomSpawnConfigFields.java b/src/main/java/com/magmaguy/elitemobs/config/customspawns/CustomSpawnConfigFields.java new file mode 100644 index 000000000..2b23edfcc --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customspawns/CustomSpawnConfigFields.java @@ -0,0 +1,72 @@ +package com.magmaguy.elitemobs.config.customspawns; + +import com.magmaguy.elitemobs.config.CustomConfigFields; +import com.magmaguy.elitemobs.events.MoonPhaseDetector; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.World; +import org.bukkit.block.Biome; + +import java.util.ArrayList; +import java.util.List; + +public class CustomSpawnConfigFields extends CustomConfigFields { + + @Getter + @Setter + int lowestYLevel = 0; + @Getter + @Setter + int highestYLevel = 320; + @Getter + @Setter + List validWorlds = new ArrayList<>(); + @Getter + @Setter + List validWorldEnvironments = new ArrayList<>(); + @Getter + @Setter + List validBiomes = new ArrayList<>(); + @Getter + @Setter + private long earliestTime = 0; + @Getter + @Setter + private long latestTime = 24000; + @Getter + @Setter + private MoonPhaseDetector.MoonPhase moonPhase = null; + @Getter + @Setter + private boolean bypassWorldGuard = false; + @Getter + @Setter + private boolean canSpawnInLight = false; + @Getter + @Setter + private boolean isSurfaceSpawn = false; + @Getter + @Setter + private boolean isUndergroundSpawn = false; + + public CustomSpawnConfigFields(String filename, boolean isEnabled) { + super(filename, isEnabled); + } + + @Override + public void processConfigFields() { + this.isEnabled = processBoolean("isEnabled", isEnabled, true, true); + this.lowestYLevel = processInt("lowestYLevel", lowestYLevel, 0, false); + this.highestYLevel = processInt("highestYLevel", highestYLevel, 320, false); + this.validWorlds = processWorldList("validWorlds", validWorlds, new ArrayList<>(), false); + this.validWorldEnvironments = processEnumList("validWorldEnvironments", validWorldEnvironments, new ArrayList<>(), World.Environment.class, false); + this.validBiomes = processEnumList("validBiomes", validBiomes, new ArrayList<>(), Biome.class, false); + this.earliestTime = processLong("earliestTime", earliestTime, 0, false); + this.latestTime = processLong("latestTime", latestTime, 24000, false); + this.moonPhase = processEnum("moonPhase", moonPhase, null, MoonPhaseDetector.MoonPhase.class, false); + this.bypassWorldGuard = processBoolean("bypassWorldGuard", bypassWorldGuard, false, false); + this.canSpawnInLight = processBoolean("canSpawnInLight", canSpawnInLight, false, false); + this.isSurfaceSpawn = processBoolean("isSurfaceSpawn", isSurfaceSpawn, false, false); + this.isUndergroundSpawn = processBoolean("isUndergroundSpawn", isUndergroundSpawn, false, false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customspawns/premade/DeadMoonSpawn.java b/src/main/java/com/magmaguy/elitemobs/config/customspawns/premade/DeadMoonSpawn.java new file mode 100644 index 000000000..eef335c93 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customspawns/premade/DeadMoonSpawn.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.config.customspawns.premade; + +import com.magmaguy.elitemobs.config.customspawns.CustomSpawnConfigFields; +import com.magmaguy.elitemobs.events.MoonPhaseDetector; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; + +public class DeadMoonSpawn extends CustomSpawnConfigFields { + public DeadMoonSpawn() { + super("dead_moon_spawn", true); + setSurfaceSpawn(true); + try { + setValidWorldEnvironments(new ArrayList<>(new ArrayList<>(List.of(World.Environment.NORMAL, World.Environment.CUSTOM)))); + } catch (NoSuchFieldError err) { + //So this happens when CUSTOM doesn't exist, which it should but in some bugged releases it doesn't. + setValidWorldEnvironments(new ArrayList<>(List.of(World.Environment.NORMAL))); + } + setEarliestTime(12000); + setMoonPhase(MoonPhaseDetector.MoonPhase.NEW_MOON); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customspawns/premade/FullMoonSpawn.java b/src/main/java/com/magmaguy/elitemobs/config/customspawns/premade/FullMoonSpawn.java new file mode 100644 index 000000000..5841626df --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customspawns/premade/FullMoonSpawn.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.config.customspawns.premade; + +import com.magmaguy.elitemobs.config.customspawns.CustomSpawnConfigFields; +import com.magmaguy.elitemobs.events.MoonPhaseDetector; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; + +public class FullMoonSpawn extends CustomSpawnConfigFields { + public FullMoonSpawn() { + super("full_moon_spawn", true); + setSurfaceSpawn(true); + try { + setValidWorldEnvironments(new ArrayList<>(new ArrayList<>(List.of(World.Environment.NORMAL, World.Environment.CUSTOM)))); + } catch (NoSuchFieldError ex) { + //So this happens when CUSTOM doesn't exist, which it should but in some bugged releases it doesn't. + setValidWorldEnvironments(new ArrayList<>(List.of(World.Environment.NORMAL))); + } + setEarliestTime(12000); + setMoonPhase(MoonPhaseDetector.MoonPhase.FULL_MOON); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customspawns/premade/NetherSpawn.java b/src/main/java/com/magmaguy/elitemobs/config/customspawns/premade/NetherSpawn.java new file mode 100644 index 000000000..1456df361 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customspawns/premade/NetherSpawn.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.customspawns.premade; + +import com.magmaguy.elitemobs.config.customspawns.CustomSpawnConfigFields; +import org.bukkit.World; + +import java.util.List; + +public class NetherSpawn extends CustomSpawnConfigFields { + public NetherSpawn() { + super("nether_spawn", true); + setCanSpawnInLight(true); + setValidWorldEnvironments(List.of(World.Environment.NETHER)); + setUndergroundSpawn(true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customspawns/premade/NighttimeSurfaceSpawn.java b/src/main/java/com/magmaguy/elitemobs/config/customspawns/premade/NighttimeSurfaceSpawn.java new file mode 100644 index 000000000..a8d9eda63 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customspawns/premade/NighttimeSurfaceSpawn.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.config.customspawns.premade; + +import com.magmaguy.elitemobs.config.customspawns.CustomSpawnConfigFields; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; + +public class NighttimeSurfaceSpawn extends CustomSpawnConfigFields { + public NighttimeSurfaceSpawn() { + super("nighttime_surface_spawn", + true); + setSurfaceSpawn(true); + try { + setValidWorldEnvironments(new ArrayList<>(new ArrayList<>(List.of(World.Environment.NORMAL, World.Environment.CUSTOM)))); + } catch (NoSuchFieldError ex) { + //So this happens when CUSTOM doesn't exist, which it should but in some bugged releases it doesn't. + setValidWorldEnvironments(new ArrayList<>(List.of(World.Environment.NORMAL))); + } + setEarliestTime(12000); + setBypassWorldGuard(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customspawns/premade/NormalSurfaceSpawn.java b/src/main/java/com/magmaguy/elitemobs/config/customspawns/premade/NormalSurfaceSpawn.java new file mode 100644 index 000000000..d0be9051e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customspawns/premade/NormalSurfaceSpawn.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.config.customspawns.premade; + +import com.magmaguy.elitemobs.config.customspawns.CustomSpawnConfigFields; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; + +public class NormalSurfaceSpawn extends CustomSpawnConfigFields { + public NormalSurfaceSpawn() { + super("normal_surface_spawn", + true); + setSurfaceSpawn(true); + setCanSpawnInLight(true); + try { + setValidWorldEnvironments(new ArrayList<>(new ArrayList<>(List.of(World.Environment.NORMAL, World.Environment.CUSTOM)))); + } catch (NoSuchFieldError ex) { + //So this happens when CUSTOM doesn't exist, which it should but in some bugged releases it doesn't. + setValidWorldEnvironments(new ArrayList<>(List.of(World.Environment.NORMAL))); + } + setBypassWorldGuard(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customspawns/premade/NormalUndergroundSpawn.java b/src/main/java/com/magmaguy/elitemobs/config/customspawns/premade/NormalUndergroundSpawn.java new file mode 100644 index 000000000..b6e2ab729 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customspawns/premade/NormalUndergroundSpawn.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.config.customspawns.premade; + +import com.magmaguy.elitemobs.config.customspawns.CustomSpawnConfigFields; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; + +public class NormalUndergroundSpawn extends CustomSpawnConfigFields { + public NormalUndergroundSpawn() { + super("normal_underground_spawn", + true); + setSurfaceSpawn(false); + setCanSpawnInLight(false); + try { + setValidWorldEnvironments(new ArrayList<>(new ArrayList<>(List.of(World.Environment.NORMAL, World.Environment.CUSTOM)))); + } catch (NoSuchFieldError ex) { + //So this happens when CUSTOM doesn't exist, which it should but in some bugged releases it doesn't. + setValidWorldEnvironments(new ArrayList<>(List.of(World.Environment.NORMAL))); + } + setBypassWorldGuard(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customspawns/premade/OceanSpawn.java b/src/main/java/com/magmaguy/elitemobs/config/customspawns/premade/OceanSpawn.java new file mode 100644 index 000000000..15709547f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customspawns/premade/OceanSpawn.java @@ -0,0 +1,24 @@ +package com.magmaguy.elitemobs.config.customspawns.premade; + +import com.magmaguy.elitemobs.config.customspawns.CustomSpawnConfigFields; +import org.bukkit.World; +import org.bukkit.block.Biome; + +import java.util.List; + +public class OceanSpawn extends CustomSpawnConfigFields { + public OceanSpawn() { + super("ocean_spawn", true); + setValidWorldEnvironments(List.of(World.Environment.NORMAL, World.Environment.CUSTOM)); + setValidBiomes(List.of( + Biome.OCEAN, + Biome.COLD_OCEAN, + Biome.DEEP_OCEAN, + Biome.FROZEN_OCEAN, + Biome.LUKEWARM_OCEAN, + Biome.DEEP_FROZEN_OCEAN, + Biome.DEEP_LUKEWARM_OCEAN, + Biome.DEEP_OCEAN)); + setSurfaceSpawn(true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customspawns/premade/TheEndSurfaceSpawn.java b/src/main/java/com/magmaguy/elitemobs/config/customspawns/premade/TheEndSurfaceSpawn.java new file mode 100644 index 000000000..d1600b25b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customspawns/premade/TheEndSurfaceSpawn.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.customspawns.premade; + +import com.magmaguy.elitemobs.config.customspawns.CustomSpawnConfigFields; +import org.bukkit.World; + +import java.util.List; + +public class TheEndSurfaceSpawn extends CustomSpawnConfigFields { + public TheEndSurfaceSpawn() { + super("the_end_surface_spawn", true); + setSurfaceSpawn(true); + setCanSpawnInLight(true); + setValidWorldEnvironments(List.of(World.Environment.THE_END)); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customtreasurechests/CustomTreasureChestConfigFields.java b/src/main/java/com/magmaguy/elitemobs/config/customtreasurechests/CustomTreasureChestConfigFields.java new file mode 100644 index 000000000..8f81d59aa --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customtreasurechests/CustomTreasureChestConfigFields.java @@ -0,0 +1,186 @@ +package com.magmaguy.elitemobs.config.customtreasurechests; + +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.CustomConfigFields; +import com.magmaguy.elitemobs.items.customloottable.CustomLootTable; +import com.magmaguy.elitemobs.treasurechest.TreasureChest; +import com.magmaguy.elitemobs.utils.ConfigurationLocation; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.BlockFace; + +import java.util.ArrayList; +import java.util.List; + +public class CustomTreasureChestConfigFields extends CustomConfigFields { + + @Getter + private Material chestMaterial = Material.CHEST; + @Getter + private BlockFace facing = BlockFace.NORTH; + @Getter + private int chestTier = 0; + @Getter + private TreasureChest.DropStyle dropStyle = TreasureChest.DropStyle.SINGLE; + @Getter + private int restockTimer = 0; + @Getter + private List lootList = null; + @Getter + private double mimicChance = 0; + @Getter + private List mimicCustomBossesList = null; + @Getter + private List restockTimers = null; + @Getter + private List effects = null; + @Getter + private String worldName; + @Getter + private Location location; + @Getter + private String locationString; + @Getter + private long restockTime = 0L; + @Getter + private List locationsString = new ArrayList<>(); + @Getter + private CustomLootTable customLootTable = null; + @Getter + @Setter + private boolean instanced = false; + + + public CustomTreasureChestConfigFields(String filename, boolean isEnabled) { + super(filename, isEnabled); + } + + /** + * Called to write defaults for a new Custom Boss Mob Entity + */ + public CustomTreasureChestConfigFields(String fileName, + boolean isEnabled, + Material chestMaterial, + BlockFace facing, + int chestTier, + Location location, + TreasureChest.DropStyle dropStyle, + int restockTimer, + List lootList, + double mimicChance, + List mimicCustomBossesList, + long restockTime, + List restockTimers, + List effects) { + + super(fileName, isEnabled); + this.chestMaterial = chestMaterial; + this.facing = facing; + this.chestTier = chestTier; + this.location = location; + this.dropStyle = dropStyle; + this.restockTimer = restockTimer; + this.lootList = lootList; + this.mimicChance = mimicChance; + this.mimicCustomBossesList = mimicCustomBossesList; + this.restockTime = restockTime; + this.restockTimers = restockTimers; + this.effects = effects; + } + + @Override + public void processConfigFields() { + this.isEnabled = processBoolean("isEnabled", isEnabled, false, false); + this.chestMaterial = processEnum("chestType", chestMaterial, Material.CHEST, Material.class, true); + this.facing = processEnum("facing", facing, BlockFace.NORTH, BlockFace.class, true); + this.chestTier = processInt("chestTier", chestTier, 0, true); + this.worldName = processString("location", worldName, null, false); + if (worldName != null) + worldName = worldName.split(",")[0]; + this.dropStyle = processEnum("dropStyle", dropStyle, TreasureChest.DropStyle.SINGLE, TreasureChest.DropStyle.class, true); + this.restockTimer = processInt("restockTimer", restockTimer, 0, true); + this.lootList = processStringList("lootList", lootList, new ArrayList<>(), true); + this.customLootTable = new CustomLootTable(this); + this.mimicChance = processDouble("mimicChance", mimicChance, 0, true); + this.mimicCustomBossesList = processStringList("mimicCustomBossesList", mimicCustomBossesList, new ArrayList<>(), true); + this.restockTime = processLong("restockTime", restockTime, 0, false); + this.restockTimers = processStringList("restockTimers", restockTimers, new ArrayList<>(), false); + this.effects = processStringList("effects", effects, new ArrayList<>(), false); + this.locationsString = processStringList("locations", locationsString, new ArrayList<>(), false); + this.locationString = processString("location", locationString, null, false); + this.instanced = processBoolean("instanced", instanced, false, false); + if (locationString != null) + new TreasureChest(this, locationString, restockTime); + else if (locationsString != null) + for (String string : locationsString) { + String[] strings = string.split(":"); + long timestamp = 0; + if (strings.length > 1) { + try { + timestamp = Long.parseLong(strings[1]); + } catch (Exception exception) { + Logger.warn("Bad unix timestamp in locations for " + filename + " . Entry: " + strings[0]); + } + } + new TreasureChest(this, strings[0], timestamp); + } + else Logger.warn("No locations found for chest " + filename); + } + + /** + * For the new format of Treasure chests, which have multiple locations per file + * + * @param chestInstanceLocation + * @param unixTimeStamp + * @return + */ + public TreasureChest addTreasureChest(Location chestInstanceLocation, long unixTimeStamp) { + int index = -1; + String deserializedLocation = ConfigurationLocation.deserialize(chestInstanceLocation.getBlock().getLocation()); + for (String string : locationsString) + if (string.split(":")[0].equals(deserializedLocation)) { + index = locationsString.indexOf(string); + break; + } + String serializedUpdatedLocation = deserializedLocation + ":" + unixTimeStamp; + TreasureChest treasureChest = null; + if (index != -1) { + //case for existing treasure chest getting a cooldown + locationsString.set(index, serializedUpdatedLocation); + } else { + //case for a new treasure chest + locationsString.add(serializedUpdatedLocation); + treasureChest = new TreasureChest(this, ConfigurationLocation.deserialize(chestInstanceLocation), unixTimeStamp); + } + fileConfiguration.set("locations", locationsString); + ConfigurationEngine.fileSaverCustomValues(fileConfiguration, file); + return treasureChest; + } + + public void setRestockTime(Location location, long newRestockTime) { + if (isInstanced()) return; + if (!locationsString.isEmpty()) { + addTreasureChest(location, newRestockTime); + return; + } + + this.restockTime = newRestockTime; + this.fileConfiguration.set("restockTime", newRestockTime); + try { + fileConfiguration.save(file); + } catch (Exception ex) { + Logger.warn("Attempted to update restock time for a custom treasure chest and failed, did you delete it during runtime?"); + } + } + + public void purgeLocations() { + this.locationsString = new ArrayList<>(); + ConfigurationEngine.writeValue(null, file, fileConfiguration, "locations"); + this.locationString = null; + ConfigurationEngine.writeValue(null, file, fileConfiguration, "location"); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customtreasurechests/CustomTreasureChestsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customtreasurechests/CustomTreasureChestsConfig.java new file mode 100644 index 000000000..ef7c32954 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customtreasurechests/CustomTreasureChestsConfig.java @@ -0,0 +1,52 @@ +package com.magmaguy.elitemobs.config.customtreasurechests; + +import com.magmaguy.elitemobs.treasurechest.TreasureChest; +import com.magmaguy.magmacore.config.CustomConfig; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.HashMap; + +public class CustomTreasureChestsConfig extends CustomConfig { + + @Getter + private static HashMap customTreasureChestConfigFields = new HashMap<>(); + + public CustomTreasureChestsConfig() { + super("customtreasurechests", "com.magmaguy.elitemobs.config.customtreasurechests.premade", CustomTreasureChestConfigFields.class); + customTreasureChestConfigFields = new HashMap<>(); + for (String key : super.getCustomConfigFieldsHashMap().keySet()) + if (super.getCustomConfigFieldsHashMap().get(key).isEnabled()) + customTreasureChestConfigFields.put(key, (CustomTreasureChestConfigFields) super.getCustomConfigFieldsHashMap().get(key)); + } + + public static void addTreasureChestEntry(Player player, String customChestFileName) { + CustomTreasureChestConfigFields customTreasureChestConfigFields = getCustomTreasureChestConfigFields().get(customChestFileName); + if (customTreasureChestConfigFields == null) { + player.sendMessage("[EM] Invalid Treasure Chest file name!"); + return; + } + addTreasureChestEntry(new Location(player.getWorld(), player.getLocation().getX(), player.getLocation().getY(), player.getLocation().getZ()), customChestFileName); + } + + public static TreasureChest addTreasureChestEntry(Location location, String customChestFileName) { + CustomTreasureChestConfigFields customTreasureChestConfigFields = getCustomTreasureChestConfigFields().get(customChestFileName); + if (location == null) { + Logger.warn("Failed to commit a location for a treasure chest!"); + return null; + } + return customTreasureChestConfigFields.addTreasureChest(location, 0); + } + + public static void removeTreasureChestEntry(Location location, String customChestFileName) { + CustomTreasureChestConfigFields customTreasureChestConfigFields = getCustomTreasureChestConfigFields().get(customChestFileName); + if (location == null || customTreasureChestConfigFields == null) { + Logger.warn("Failed to remove a location for a treasure chest!"); + return; + } + customTreasureChestConfigFields.purgeLocations(); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/customtreasurechests/premade/TestCustomTreasureChestConfig.java b/src/main/java/com/magmaguy/elitemobs/config/customtreasurechests/premade/TestCustomTreasureChestConfig.java new file mode 100644 index 000000000..13a16e2f2 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/customtreasurechests/premade/TestCustomTreasureChestConfig.java @@ -0,0 +1,29 @@ +package com.magmaguy.elitemobs.config.customtreasurechests.premade; + +import com.magmaguy.elitemobs.config.customtreasurechests.CustomTreasureChestConfigFields; +import com.magmaguy.elitemobs.treasurechest.TreasureChest; +import org.bukkit.Material; +import org.bukkit.block.BlockFace; + +import java.util.List; + +public class TestCustomTreasureChestConfig extends CustomTreasureChestConfigFields { + + public TestCustomTreasureChestConfig() { + super("test_custom_treasure_config", + true, + Material.CHEST, + BlockFace.NORTH, + 0, + null, + TreasureChest.DropStyle.SINGLE, + 1, + List.of("magmaguys_toothpick.yml:1"), + 0.5, + List.of("test_boss.yml:1"), + 0, + null, + List.of("BARRIER")); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/DungeonPackagerConfig.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/DungeonPackagerConfig.java new file mode 100644 index 000000000..6fd299f13 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/DungeonPackagerConfig.java @@ -0,0 +1,37 @@ +package com.magmaguy.elitemobs.config.dungeonpackager; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.dungeons.EMPackage; +import com.magmaguy.magmacore.config.CustomConfig; +import lombok.Getter; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +public class DungeonPackagerConfig extends CustomConfig { + + @Getter + private static Map dungeonPackages = new HashMap<>(); + @Getter + private static Map enchantedChallengeDungeonPackages = new HashMap<>(); + + + public DungeonPackagerConfig() { + super("dungeonpackages", "com.magmaguy.elitemobs.config.dungeonpackager.premade", DungeonPackagerConfigFields.class); + dungeonPackages = new HashMap<>(); + enchantedChallengeDungeonPackages = new HashMap<>(); + for (String key : super.getCustomConfigFieldsHashMap().keySet()) { + if (!((DungeonPackagerConfigFields) super.getCustomConfigFieldsHashMap().get(key)).isEnchantmentChallenge()) + dungeonPackages.put(key, (DungeonPackagerConfigFields) super.getCustomConfigFieldsHashMap().get(key)); + else + enchantedChallengeDungeonPackages.put(key, (DungeonPackagerConfigFields) super.getCustomConfigFieldsHashMap().get(key)); + EMPackage.initialize((DungeonPackagerConfigFields) super.getCustomConfigFieldsHashMap().get(key)); + } + + //Initialize blueprints folder + File worldsBluePrint = new File(MetadataHandler.PLUGIN.getDataFolder().getAbsolutePath() + File.separatorChar + "world_blueprints"); + if (!worldsBluePrint.exists()) worldsBluePrint.mkdir(); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/DungeonPackagerConfigFields.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/DungeonPackagerConfigFields.java new file mode 100644 index 000000000..e48e6b2b4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/DungeonPackagerConfigFields.java @@ -0,0 +1,354 @@ +package com.magmaguy.elitemobs.config.dungeonpackager; + +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.CustomConfigFields; +import com.magmaguy.elitemobs.utils.ConfigurationLocation; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.util.Vector; + +import java.util.List; +import java.util.Map; + +public class DungeonPackagerConfigFields extends CustomConfigFields { + + @Getter + private String name; + @Getter + private ContentType contentType = null; + @Getter + private List customInfo = null; + @Getter + private List relativeBossLocations = null; + @Getter + private List relativeTreasureChestLocations = null; + @Getter + private String downloadLink = ""; + @Getter + private DungeonSizeCategory dungeonSizeCategory = DungeonSizeCategory.LAIR; + @Getter + private String worldName; + @Getter + @Setter + private String wormholeWorldName; + @Getter + private String schematicName = null; + @Getter + private World.Environment environment = World.Environment.NORMAL; + @Getter + private boolean protect = true; + @Getter + private Location anchorPoint; + @Getter + private String defaultSchematicRotationString = null; + @Getter + @Setter + private Integer calculatedRotation = 0; + @Getter + private Vector corner1 = new Vector(0, 0, 0), corner2 = new Vector(0, 0, 0); + @Getter + private int dungeonVersion = 0; + @Getter + private String playerInfo = null; + @Getter + private String regionEnterMessage = null; + @Getter + private String regionLeaveMessage = null; + @Getter + @Setter + private List worldGuardFlags = null; + @Getter + @Setter + private boolean hasCustomModels = false; + @Getter + private boolean defaultDungeon = false; + @Getter + private Location teleportLocation = null; + @Getter + private String teleportLocationString = null; + @Getter + private String teleportLocationOffsetString = null; + @Getter + private Location teleportLocationOffset = null; + @Getter + private String permission = null; + @Getter + @Setter + private int minPlayerCount = 1; + @Getter + @Setter + private int maxPlayerCount = 5; + @Getter + @Setter + private List rawDungeonObjectives = null; + @Getter + private String startLocationString = null; + @Getter + private String dungeonConfigFolderName; + @Getter + private int contentLevel; + @Getter + @Setter + private List> difficulties; + @Getter + @Setter + private boolean enchantmentChallenge = false; + @Getter + @Setter + private boolean allowExplosions; + @Getter + @Setter + private boolean listedInTeleports = true; + @Getter + @Setter + private String song = null; + @Getter + @Setter + private boolean allowLiquidFlow = true; + + public DungeonPackagerConfigFields(String fileName, boolean isEnabled) { + super(fileName, isEnabled); + } + + /** + * Used by the world-based open dungeons + * + * @param filename Filename of the dungeon + * @param isEnabled If the dungeon is enabled + * @param name Human name of the dungeon + * @param customInfo Info displayed to players in menus + * @param downloadLink Download link for the dungeon + * @param dungeonSizeCategory Size of the dungeon + * @param worldName Name of the world in the Minecraft files + * @param environment World environment, is shared with the wormhole world + * @param protect If the dungeon should be protected with WorldGuard + * @param teleportLocationString Location to teleport players to + * @param dungeonVersion Version of the dungeon + * @param playerInfo Additional custom info for players + * @param regionEnterMessage Message upon entering the region + * @param regionLeaveMessage Message upon leaving the region + */ + public DungeonPackagerConfigFields(String filename, + boolean isEnabled, + String name, + List customInfo, + String downloadLink, + DungeonSizeCategory dungeonSizeCategory, + String worldName, + World.Environment environment, + Boolean protect, + String teleportLocationString, + int dungeonVersion, + String playerInfo, + String regionEnterMessage, + String regionLeaveMessage, + String dungeonConfigFolderName, + boolean allowExplosions) { + super(filename, isEnabled); + this.contentType = ContentType.OPEN_DUNGEON; + this.name = name; + this.customInfo = customInfo; + this.downloadLink = downloadLink; + this.dungeonSizeCategory = dungeonSizeCategory; + this.worldName = worldName; + this.environment = environment; + this.protect = protect; + this.teleportLocationString = teleportLocationString; + this.dungeonVersion = dungeonVersion; + this.playerInfo = playerInfo; + this.regionEnterMessage = regionEnterMessage; + this.regionLeaveMessage = regionLeaveMessage; + this.dungeonConfigFolderName = dungeonConfigFolderName; + this.allowExplosions = allowExplosions; + defaultDungeon = true; + } + + //For instanced dungeons + public DungeonPackagerConfigFields(String filename, + boolean isEnabled, + String name, + List customInfo, + String downloadLink, + DungeonSizeCategory dungeonSizeCategory, + String worldName, + World.Environment environment, + Boolean protect, + String teleportLocationString, + String startLocationString, + int dungeonVersion, + String playerInfo, + String regionEnterMessage, + String regionLeaveMessage, + List rawDungeonObjectives, + String dungeonConfigFolderName, + int contentLevel, + boolean allowExplosions) { + super(filename, isEnabled); + this.contentType = ContentType.INSTANCED_DUNGEON; + this.name = name; + this.customInfo = customInfo; + this.downloadLink = downloadLink; + this.dungeonSizeCategory = dungeonSizeCategory; + this.worldName = worldName; + this.environment = environment; + this.protect = protect; + this.teleportLocationString = teleportLocationString; + this.startLocationString = startLocationString; + this.dungeonVersion = dungeonVersion; + this.playerInfo = playerInfo; + this.regionEnterMessage = regionEnterMessage; + this.regionLeaveMessage = regionLeaveMessage; + this.rawDungeonObjectives = rawDungeonObjectives; + this.dungeonConfigFolderName = dungeonConfigFolderName; + this.contentLevel = contentLevel; + this.allowExplosions = allowExplosions; + defaultDungeon = true; + } + + //For the adventurer's guild hub + public DungeonPackagerConfigFields(String filename, + boolean isEnabled, + String name, + List customInfo, + String downloadLink, + String worldName, + World.Environment environment, + Boolean protect, + String teleportLocationString, + int dungeonVersion, + String playerInfo, + String regionEnterMessage, + String regionLeaveMessage, + String dungeonConfigFolderName, + boolean allowExplosions) { + super(filename, isEnabled); + this.contentType = ContentType.HUB; + this.name = name; + this.customInfo = customInfo; + this.downloadLink = downloadLink; + this.worldName = worldName; + this.environment = environment; + this.protect = protect; + this.teleportLocationString = teleportLocationString; + this.dungeonVersion = dungeonVersion; + this.playerInfo = playerInfo; + this.regionEnterMessage = regionEnterMessage; + this.regionLeaveMessage = regionLeaveMessage; + this.dungeonConfigFolderName = dungeonConfigFolderName; + this.allowExplosions = allowExplosions; + defaultDungeon = true; + } + + @Override + public void processConfigFields() { + this.isEnabled = processBoolean("isEnabled", isEnabled, false, true); + this.name = translatable(filename, "name", processString("name", name, null, true)); + this.customInfo = translatable(filename, "customInfo", processStringList("customInfo", customInfo, null, true)); + this.relativeBossLocations = processStringList("relativeBossLocations", relativeBossLocations, null, false); + this.relativeTreasureChestLocations = processStringList("relativeTreasureChestLocations", relativeTreasureChestLocations, null, false); + this.downloadLink = processString("downloadLink", downloadLink, null, false); + this.dungeonSizeCategory = processEnum("dungeonSizeCategory", dungeonSizeCategory, null, DungeonSizeCategory.class, false); + if (dungeonSizeCategory == null) { + Logger.warn("File " + filename + " does not have a valid dungeonSizeCategory!"); + this.fileConfiguration = null; + return; + } + this.worldName = processString("worldName", worldName, null, false); + this.wormholeWorldName = processString("wormholeWorldName", wormholeWorldName, null, false); + this.schematicName = processString("schematicName", schematicName, null, false); + this.environment = processEnum("environment", environment, null, World.Environment.class, false); + this.protect = processBoolean("protect", protect, true, true); + this.anchorPoint = processLocation("anchorPoint", anchorPoint, null, false); + this.defaultSchematicRotationString = processString("defaultSchematicRotation", defaultSchematicRotationString, null, false); + this.calculatedRotation = processInt("calculatedRotation", calculatedRotation, 0, false); + this.corner1 = processVector("corner1", corner1, null, false); + this.corner2 = processVector("corner2", corner2, null, false); + this.dungeonVersion = processInt("dungeonVersion", dungeonVersion, 0, false); + this.playerInfo = translatable(filename, "playerInfo", processString("playerInfo", playerInfo, null, false)); + this.regionEnterMessage = translatable(filename, "regionEnterMessage", processString("regionEnterMessage", regionEnterMessage, null, false)); + this.regionLeaveMessage = translatable(filename, "regionLeaveMessage", processString("regionLeaveMessage", regionLeaveMessage, null, false)); + this.hasCustomModels = processBoolean("hasCustomModels", hasCustomModels, false, false); + this.startLocationString = processString("startLocation", startLocationString, null, false); + this.teleportLocationString = processString("teleportLocation", teleportLocationString, null, false); + this.teleportLocationOffsetString = processString("teleportLocationOffset", teleportLocationOffsetString, null, false); + if (teleportLocationOffsetString != null && !teleportLocationOffsetString.isEmpty()) + this.teleportLocationOffset = ConfigurationLocation.serialize(teleportLocationOffsetString); + this.permission = processString("permission", permission, null, false); + this.minPlayerCount = processInt("minPlayerCount", minPlayerCount, 1, false); + this.maxPlayerCount = processInt("maxPlayerCount", maxPlayerCount, 5, false); + this.rawDungeonObjectives = processStringList("dungeonObjectives", rawDungeonObjectives, null, false); + this.contentType = processEnum("contentType", contentType, null, ContentType.class, true); + this.dungeonConfigFolderName = processString("dungeonConfigFolderName", dungeonConfigFolderName, null, false); + this.contentLevel = processInt("contentLevel", contentLevel, 0, false); + if (fileConfiguration.contains("difficulties")) + this.difficulties = (List>) fileConfiguration.getList("difficulties"); + else fileConfiguration.addDefault("difficulties", difficulties); + enchantmentChallenge = processBoolean("enchantmentChallenge", enchantmentChallenge, false, false); + this.allowExplosions = processBoolean("allowExplosionBlockDamage", allowExplosions, false, false); + this.listedInTeleports = processBoolean("listedInTeleports", listedInTeleports, true, false); + this.song = processString("song", song, null, false); + this.allowLiquidFlow = processBoolean("allowLiquidFlow", allowLiquidFlow, allowLiquidFlow, false); + processAdditionalFields(); + } + + public void processAdditionalFields() { + } + + /** + * This just sets the installed status to true, doesn't really do anything else + */ + public void simpleInstall() { + this.isEnabled = true; + ConfigurationEngine.writeValue(true, file, fileConfiguration, "isEnabled"); + } + + public void installWorld() { + this.isEnabled = true; + ConfigurationEngine.writeValue(true, file, fileConfiguration, "isEnabled"); + this.teleportLocation = processLocation("teleportLocation", teleportLocation, null, false); + ConfigurationEngine.fileSaverCustomValues(fileConfiguration, file); + } + + public void initializeWorld() { + this.teleportLocation = processLocation("teleportLocation", teleportLocation, null, false); + } + + public void simpleUninstall() { + this.isEnabled = false; + ConfigurationEngine.writeValue(false, file, fileConfiguration, "isEnabled"); + } + + public void uninstallWorld() { + this.isEnabled = false; + ConfigurationEngine.writeValue(false, file, fileConfiguration, "isEnabled"); + this.teleportLocation = null; + ConfigurationEngine.fileSaverCustomValues(fileConfiguration, file); + } + + public enum DungeonLocationType { + WORLD, + SCHEMATIC, + INSTANCED + } + + public enum ContentType { + OPEN_DUNGEON, + INSTANCED_DUNGEON, + HUB, + SCHEMATIC_DUNGEON + } + + public enum DungeonSizeCategory { + LAIR, + SANCTUM, + MINIDUNGEON, + DUNGEON, + RAID, + ADVENTURE, + OTHER, + ARENA + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/AdventurersGuildHub.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/AdventurersGuildHub.java new file mode 100644 index 000000000..350b9324f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/AdventurersGuildHub.java @@ -0,0 +1,29 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.List; + +public class AdventurersGuildHub extends DungeonPackagerConfigFields { + public AdventurersGuildHub() { + super("adventurers_guild_hub", + true, + "&2[000] Adventurers Guild Hub!", + List.of("&aThe EliteMobs hub with shops and teleports!"), + DiscordLinks.freeMinidungeons, + "em_adventurers_guild", + World.Environment.NORMAL, + true, + "em_adventurers_guild,208.5,88,236.5,-80,0", + 0, + "Difficulty: &cHard\n" + + "$bossCount level $lowestTier Big Boss!\n" + + "&6Face fierce beasts at their home turf!", + "&8[EM] &aYou have entered the Beast Sanctuary! Beware of what prowls here!", + "&8[EM] &aYou've left the Beast Sanctuary! Did you take trophies?", + "em_adventurers_guild", + false); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/AirshipMinidungeon.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/AirshipMinidungeon.java new file mode 100644 index 000000000..c6f5dc37d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/AirshipMinidungeon.java @@ -0,0 +1,34 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; + +public class AirshipMinidungeon extends DungeonPackagerConfigFields { + public AirshipMinidungeon() { + super("airship_minidungeon", + true, + "&2[lvl 045-055] &6The Airship", + new ArrayList<>(List.of("&fAn awesome airship full of undead pirates!", + "&6Credits: MagmaGuy, 69OzCanOfBepis", + "&6and Realm of Lotheridon")), + DiscordLinks.premiumMinidungeons, + DungeonSizeCategory.MINIDUNGEON, + "em_the_airship", + World.Environment.NORMAL, + true, + "em_the_airship,-95.5,188.0,43.5,-144,0", + 0, + "Difficulty: &6Medium\n" + + "$bossCount bosses, from level $lowestTier to $highestTier\n" + + "&6An awesome airship full of undead pirates\n" + + "&6for experienced players!", + "&8[EM] &cEntering hostile air zone!", + "&8[EM] &cLeaving hostile air zone!", + "the_airship", + false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/BeastsSanctuaryLair.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/BeastsSanctuaryLair.java new file mode 100644 index 000000000..ea917e477 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/BeastsSanctuaryLair.java @@ -0,0 +1,30 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.List; + +public class BeastsSanctuaryLair extends DungeonPackagerConfigFields { + public BeastsSanctuaryLair() { + super("beasts_sanctuary_lair", + true, + "&2[lvl 130] &6The Beasts Sanctuary", + List.of("&6Confront the beasts!"), + DiscordLinks.premiumMinidungeons, + DungeonSizeCategory.LAIR, + "em_beasts_sanctuary", + World.Environment.NORMAL, + true, + "em_beasts_sanctuary,32.5,88.2,36.5,0,0", + 0, + "Difficulty: &cHard\n" + + "$bossCount level $lowestTier Big Boss!\n" + + "&6Face fierce beasts at their home turf!", + "&8[EM] &aYou have entered the Beast Sanctuary! Beware of what prowls here!", + "&8[EM] &aYou've left the Beast Sanctuary! Did you take trophies?", + "the_beasts_sanctuary", + false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/BinderOfWorldsSanctum.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/BinderOfWorldsSanctum.java new file mode 100644 index 000000000..a130b6748 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/BinderOfWorldsSanctum.java @@ -0,0 +1,40 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class BinderOfWorldsSanctum extends DungeonPackagerConfigFields { + public BinderOfWorldsSanctum() { + super("binder_of_worlds_sanctum", + true, + "&2[lvl 200] &5The Binder Of Worlds", + new ArrayList<>(List.of("&5The ultimate challenge. Be prepared!", + "&6Credits: MagmaGuy, 69OzCanOfBepis & Frostcone")), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.SANCTUM, + "em_id_binder_of_worlds", + World.Environment.THE_END, + true, + "em_id_binder_of_worlds,-40.5,74,87.5,-155.0,0.0", + "em_id_binder_of_worlds,-40,62,24,-130,-11", + 0, + "Difficulty: &6Nightmare\n" + + "$bossCount level $highestTier final boss!\n" + + "&5This is the hardest fight in EliteMobs!", + "&8[EM] &5Reality unravels around you. You face the final challenge. &4You are not prepared!", + "&8[EM] &5You have left the unravelling. Did you find what you sought? Was it worth it?", + List.of("filename=em_id_binder_of_worlds_phase_1.yml"), + "the_binder_of_worlds", + 50, + true); + setDifficulties(List.of( + Map.of("name", "normal", "levelSync", 205, "id", 0), + Map.of("name", "hard", "levelSync", 200, "id", 1), + Map.of("name", "mythic", "levelSync", 195, "id", 2))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/BoneMonasteryDungeon.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/BoneMonasteryDungeon.java new file mode 100644 index 000000000..6d46ddd22 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/BoneMonasteryDungeon.java @@ -0,0 +1,38 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class BoneMonasteryDungeon extends DungeonPackagerConfigFields { + public BoneMonasteryDungeon() { + super("bone_monastery_dungeon", + true, + "&2[lvl 085]&cThe Bone Monastery", + new ArrayList<>(List.of("&fSpooky skeletons await.", + "&6Credits: MagmaGuy, Matevagyok, Frostcone, 69OzCanOfBepis")), + DiscordLinks.premiumMinidungeons, + DungeonSizeCategory.DUNGEON, + "em_id_bone_monastery", + World.Environment.NORMAL, + true, + "em_id_bone_monastery,-249.5,18.0,109.5,-174.499999,18.499996", + "em_id_bone_monastery,-171.5,5.0,54.5,-174.499999,18.499996", + 0, + "Difficulty: &45-man content!", + "&bWelcome to the bone monastery! Mind the skeletons.", + "&bYou have left the bone monastery!", + List.of("filename=bone_monastery_bone_saint_himiko_p1.yml"), + "the_bone_monastery", + 85, + false); + setDifficulties(List.of( + Map.of("name", "normal", "levelSync", 90, "id", 0), + Map.of("name", "hard", "levelSync", 85, "id", 1), + Map.of("name", "mythic", "levelSync", 80, "id", 2))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/CatacombsLair.off b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/CatacombsLair.off new file mode 100644 index 000000000..9e7decd1f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/CatacombsLair.off @@ -0,0 +1,39 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.util.Vector; + +import java.util.Arrays; +import java.util.Collections; + +public class CatacombsLair extends DungeonPackagerConfigFields { + public CatacombsLair() { + super("catacombs_lair", + true, + "&2[lvl 010] &8The Catacombs", + new ArrayList<>(List.of("&fThe best starter lair for players!", + "&6Credits: Realm of Lotheridon"), + new ArrayList<>(List.of( + "catacombs_tier_5_evoker_guard_2.yml:2.5,0.5,13.5", + "catacombs_tier_5_illusioner_guard_1.yml:-2.5,2.5,16.5", + "catacombs_tier_15_boss.yml:0.5,-7.5,45.5", + "catacombs_tier_10_miniboss.yml:-8.5,-15.5,36.5"), + Collections.singletonList("catacombs_tier_15_treasure_chest.yml:-1,-14,15"), + DiscordLinks.premiumMinidungeons, + DungeonSizeCategory.LAIR, + "em_catacombs.schem", + true, + new Vector(13, -16, 0), + new Vector(-18, 17, 52), + "0,0,0,0,0", + 0, + "Difficulty: &cHard\n" + + "$bossCount bosses, from tier $lowestTier to $highestTier\n" + + "&2The best Lair challenge for groups of beginners!", + "&8[EM] &8Now entering the Catacombs. Be careful with what dwells below...", + "&8[EM] &8You have left the Catacombs. Was it worth it?", + SchematicPackage.SchematicRotation.SOUTH.toString(), + "the_catacombs"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/ColosseumLair.off b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/ColosseumLair.off new file mode 100644 index 000000000..b9bbff526 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/ColosseumLair.off @@ -0,0 +1,46 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.Arrays; + +public class ColosseumLair extends DungeonPackagerConfigFields { + public ColosseumLair() { + super("colosseum_lair", + true, + "&2[lvl 070] &6The Colosseum", + new ArrayList<>(List.of("&fFeaturing the first true World boss, first", + "&fmulti-phased battle, first mounted boss,", + "&ffirst disguised boss... a truly epic fight!", + "&6Credits: MagmaGuy & Maldini"), + new ArrayList<>(List.of("colosseum_tier_70_boss_p1.yml:-0.5,-1.5,47.5", + "colosseum_tier_70_gladiator.yml:5.5,-7.5,22.5", + "colosseum_tier_70_gladiator.yml:1.5,-7.5,22.5", + "colosseum_tier_70_gladiator.yml:0.5,-7.5,30.5", + "colosseum_tier_70_gladiator.yml:-5.5,-7.5,41.5", + "colosseum_tier_70_gladiator.yml:1.5,-7.5,41.5", + "colosseum_tier_70_gladiator.yml:-11.5,-7.5,41.5", + "colosseum_tier_70_gladiator.yml:-14.5,-7.5,23.5", + "colosseum_tier_70_gladiator.yml:-30.5,-7.5,31.5", + "colosseum_tier_70_gladiator.yml:-30.5,-7.5,31.5"), + new ArrayList<>(), + DiscordLinks.premiumMinidungeons, + DungeonSizeCategory.LAIR, + "em_colosseum.schem", + true, + new Vector(40, -14, 0), + new Vector(-41, 31, 88), + "0,0,0,0,0", + 0, + "Difficulty: &cHard\n" + + "$bossCount bosses, from level $lowestTier to $highestTier\n" + + "&cA true challenge for big groups of players!", + "&8[EM] &6Champions and challengers prepare! &eProve your worth against the most mighty of foes!", + "&8[EM] &6Farewell traveller! &eReturn soon to show your might once more!", + SchematicPackage.SchematicRotation.SOUTH.toString(), + "the_colosseum"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/CraftenminesLabSanctum.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/CraftenminesLabSanctum.java new file mode 100644 index 000000000..39aad36c4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/CraftenminesLabSanctum.java @@ -0,0 +1,39 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class CraftenminesLabSanctum extends DungeonPackagerConfigFields { + public CraftenminesLabSanctum() { + super("craftenmines_lab_sanctum", + true, + "&2[lvl 030] &aCraftenmines Sanctum", + new ArrayList<>(List.of("&aFace the creator of the devious creations!", + "&6Credits: MagmaGuy, 69OzCanOfBepis")), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.SANCTUM, + "em_id_craftenmines_lab", + World.Environment.NORMAL, + true, + "em_id_craftenmines_lab,-26.5,68,0.5,-90.0,0.0", + "em_id_craftenmines_lab,-19,66,0,-90,0", + 0, + "Difficulty: &6Hard\n" + + "Difficulty: &45-man hard content!", + "&8[EM] &5Someone must stop Dr. Craftenmine and his horrific creations!", + "&8[EM] &5You have left Dr. Craftenmine's laboratory!", + List.of("filename=dr_craftenmine_p1.yml"), + "em_id_craftenmines_lab", + 30, + false); + setDifficulties(List.of( + Map.of("name", "normal", "levelSync", 25, "id", 0), + Map.of("name", "hard", "levelSync", 30, "id", 1), + Map.of("name", "mythic", "levelSync", 35, "id", 2))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/DarkCathedralLair.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/DarkCathedralLair.java new file mode 100644 index 000000000..df8211fd7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/DarkCathedralLair.java @@ -0,0 +1,35 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; + +public class DarkCathedralLair extends DungeonPackagerConfigFields { + public DarkCathedralLair() { + super("dark_cathedral_lair", + true, + "&2[lvl 040] &8The Dark Cathedral", + new ArrayList<>(List.of("&fThe first ever EliteMobs Lair!", + "&fA classic that all servers need!", + "&6Credits: MagmaGuy, 69OzCanOfBepis, Frost, Dali")), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.LAIR, + "em_the_dark_cathedral", + World.Environment.NETHER, + true, + "em_the_dark_cathedral,47.5,85.2,199.5,163,0", + 0, + "Difficulty: &cHard\n" + + "$bossCount level $highestTier Big Boss!\n" + + "&cThe original minidungeon, a challenge for\n" + + "&ca group of players or for veterans!", + "&8[EM] &1An invasion is in progress. &9Stop the insurrection!", + "&8[EM] &1You managed to hold them back. &9For now...", + "the_dark_cathedral", + false); + setSong("name=elitemobs:dark_cathedral.ambient length=93830"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/DarkSpireMinidungeon.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/DarkSpireMinidungeon.java new file mode 100644 index 000000000..13f366e5e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/DarkSpireMinidungeon.java @@ -0,0 +1,33 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; + +public class DarkSpireMinidungeon extends DungeonPackagerConfigFields { + public DarkSpireMinidungeon() { + super("dark_spire_minidungeon", + true, + "&2[lvl 100-120] &8The Dark Spire", + new ArrayList<>(List.of("&fThe first ever high level content!", + "&fMade for those who want a real challenge!", + "&6Credits: 69OzCanOfBepis")), + DiscordLinks.premiumMinidungeons, + DungeonSizeCategory.MINIDUNGEON, + "em_dark_spire", + World.Environment.NETHER, + true, + "em_dark_spire,60,97.5,97,110,0", + 0, + "Difficulty: &6Medium\n" + + "$bossCount bosses, from level $lowestTier to $highestTier\n" + + "&cA vast challenge for advanced players!", + "&8[EM] &1An invasion is in progress. &9Stop the insurrection!", + "&8[EM] &1You managed to hold them back. &9For now...", + "the_dark_spire", + false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/DiamondLeagueArena.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/DiamondLeagueArena.java new file mode 100644 index 000000000..cca59824c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/DiamondLeagueArena.java @@ -0,0 +1,30 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.List; + +public class DiamondLeagueArena extends DungeonPackagerConfigFields { + public DiamondLeagueArena() { + super("diamond_league_arena", + true, + "&5[lvl 100-150] &fThe Diamond League Arena", + List.of("&fFace the Diamond League Arena!"), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.ARENA, + "em_diamond_arena", + World.Environment.NORMAL, + true, + "em_diamond_arena,4.5,78,-28.5,0,0", + 0, + "Difficulty: &chard\n" + + "Face 50 waves of the arena, from\n" + + "level 100 to level 150!", + "&fAre you prepared to face the arena?", + "&fNow leaving the diamond league arena!", + "diamond_league_arena", + false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge1.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge1.java new file mode 100644 index 000000000..7f5db81cf --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge1.java @@ -0,0 +1,36 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.List; +import java.util.Map; + +public class EnchantmentChallenge1 extends DungeonPackagerConfigFields { + public EnchantmentChallenge1() { + super("enchantment_challenge_1_sanctum", + true, + "&2[lvl 000-200] &fEnchantment Challenge 01", + List.of("&fAn enchantment challenge dungeon!"), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.SANCTUM, + "em_id_enchantment_challenge_1", + World.Environment.NORMAL, + true, + "em_id_enchantment_challenge_1,18.5,95,-15.5,45,0.0", + "em_id_enchantment_challenge_1,14.5,65,-12.5,45,0", + 0, + "Difficulty: &4solo hard content!", + "&bChallenge time!", + "&bYou have left the enchantment challenge!", + List.of("filename=enchantment_boss_dark_flame.yml"), + "em_id_enchantment_challenge_1", + 1, + false); + setDifficulties(List.of( + Map.of("name", "normal", "id", 0))); + setEnchantmentChallenge(true); + setMaxPlayerCount(1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge10.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge10.java new file mode 100644 index 000000000..abe1495af --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge10.java @@ -0,0 +1,36 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.List; +import java.util.Map; + +public class EnchantmentChallenge10 extends DungeonPackagerConfigFields { + public EnchantmentChallenge10() { + super("enchantment_challenge_10_sanctum", + true, + "&2[lvl 000-200] &fEnchantment Challenge 10", + List.of("&fAn enchantment challenge dungeon!"), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.SANCTUM, + "em_id_enchantment_challenge_10", + World.Environment.NORMAL, + true, + "em_id_enchantment_challenge_10,18.5,95,-15.5,45,0.0", + "em_id_enchantment_challenge_10,14.5,65,-12.5,45,0", + 0, + "Difficulty: &4solo hard content!", + "&bChallenge time!", + "&bYou have left the enchantment challenge!", + List.of("filename=enchantment_boss_tricky_bones.yml"), + "em_id_enchantment_challenge_10", + 1, + false); + setDifficulties(List.of( + Map.of("name", "normal", "id", 0))); + setEnchantmentChallenge(true); + setMaxPlayerCount(1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge11.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge11.java new file mode 100644 index 000000000..113146b5f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge11.java @@ -0,0 +1,36 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.List; +import java.util.Map; + +public class EnchantmentChallenge11 extends DungeonPackagerConfigFields { + public EnchantmentChallenge11() { + super("enchantment_challenge_11_sanctum", + true, + "&2[lvl 000-200] &6Enchantment Challenge 11", + List.of("&fAn enchantment challenge dungeon!"), + DiscordLinks.premiumMinidungeons, + DungeonPackagerConfigFields.DungeonSizeCategory.SANCTUM, + "em_id_enchantment_challenge_11", + World.Environment.THE_END, + true, + "em_id_enchantment_challenge_11,-15.5,94,15.5,-135,0.0", + "em_id_enchantment_challenge_11,14.5,65,-12.5,45,0", + 0, + "Difficulty: &4solo hard content!", + "&bChallenge time!", + "&bYou have left the enchantment challenge!", + List.of("filename=enchantment_boss_void_haze.yml"), + "em_id_enchantment_challenge_11", + 1, + false); + setDifficulties(List.of( + Map.of("name", "normal", "id", 0))); + setEnchantmentChallenge(true); + setMaxPlayerCount(1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge12.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge12.java new file mode 100644 index 000000000..763b12217 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge12.java @@ -0,0 +1,36 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.List; +import java.util.Map; + +public class EnchantmentChallenge12 extends DungeonPackagerConfigFields { + public EnchantmentChallenge12() { + super("enchantment_challenge_12_sanctum", + true, + "&2[lvl 000-200] &6Enchantment Challenge 12", + List.of("&fAn enchantment challenge dungeon!"), + DiscordLinks.premiumMinidungeons, + DungeonPackagerConfigFields.DungeonSizeCategory.SANCTUM, + "em_id_enchantment_challenge_12", + World.Environment.THE_END, + true, + "em_id_enchantment_challenge_12,-15.5,94,15.5,-135,0.0", + "em_id_enchantment_challenge_12,14.5,65,-12.5,45,0", + 0, + "Difficulty: &4solo hard content!", + "&bChallenge time!", + "&bYou have left the enchantment challenge!", + List.of("filename=enchantment_boss_mad_arcanist.yml"), + "em_id_enchantment_challenge_12", + 1, + false); + setDifficulties(List.of( + Map.of("name", "normal", "id", 0))); + setEnchantmentChallenge(true); + setMaxPlayerCount(1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge13.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge13.java new file mode 100644 index 000000000..c6a3b67f7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge13.java @@ -0,0 +1,36 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.List; +import java.util.Map; + +public class EnchantmentChallenge13 extends DungeonPackagerConfigFields { + public EnchantmentChallenge13() { + super("enchantment_challenge_13_sanctum", + true, + "&2[lvl 000-200] &6Enchantment Challenge 13", + List.of("&fAn enchantment challenge dungeon!"), + DiscordLinks.premiumMinidungeons, + DungeonPackagerConfigFields.DungeonSizeCategory.SANCTUM, + "em_id_enchantment_challenge_13", + World.Environment.THE_END, + true, + "em_id_enchantment_challenge_13,-15.5,94,15.5,-135,0.0", + "em_id_enchantment_challenge_13,14.5,65,-12.5,45,0", + 0, + "Difficulty: &4solo hard content!", + "&bChallenge time!", + "&bYou have left the enchantment challenge!", + List.of("filename=enchantment_boss_abyss_wanderer_p1.yml"), + "em_id_enchantment_challenge_13", + 1, + false); + setDifficulties(List.of( + Map.of("name", "normal", "id", 0))); + setEnchantmentChallenge(true); + setMaxPlayerCount(1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge14.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge14.java new file mode 100644 index 000000000..9d99c11f6 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge14.java @@ -0,0 +1,36 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.List; +import java.util.Map; + +public class EnchantmentChallenge14 extends DungeonPackagerConfigFields { + public EnchantmentChallenge14() { + super("enchantment_challenge_14_sanctum", + true, + "&2[lvl 000-200] &6Enchantment Challenge 14", + List.of("&fAn enchantment challenge dungeon!"), + DiscordLinks.premiumMinidungeons, + DungeonPackagerConfigFields.DungeonSizeCategory.SANCTUM, + "em_id_enchantment_challenge_14", + World.Environment.THE_END, + true, + "em_id_enchantment_challenge_14,-15.5,94,15.5,-135,0.0", + "em_id_enchantment_challenge_14,14.5,65,-12.5,45,0", + 0, + "Difficulty: &4solo hard content!", + "&bChallenge time!", + "&bYou have left the enchantment challenge!", + List.of("filename=enchantment_boss_hollow_soul.yml"), + "em_id_enchantment_challenge_14", + 1, + false); + setDifficulties(List.of( + Map.of("name", "normal", "id", 0))); + setEnchantmentChallenge(true); + setMaxPlayerCount(1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge15.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge15.java new file mode 100644 index 000000000..c075b7c38 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge15.java @@ -0,0 +1,36 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.List; +import java.util.Map; + +public class EnchantmentChallenge15 extends DungeonPackagerConfigFields { + public EnchantmentChallenge15() { + super("enchantment_challenge_15_sanctum", + true, + "&2[lvl 000-200] &6Enchantment Challenge 15", + List.of("&fAn enchantment challenge dungeon!"), + DiscordLinks.premiumMinidungeons, + DungeonPackagerConfigFields.DungeonSizeCategory.SANCTUM, + "em_id_enchantment_challenge_15", + World.Environment.THE_END, + true, + "em_id_enchantment_challenge_15,-15.5,94,15.5,-135,0.0", + "em_id_enchantment_challenge_15,14.5,65,-12.5,45,0", + 0, + "Difficulty: &4solo hard content!", + "&bChallenge time!", + "&bYou have left the enchantment challenge!", + List.of("filename=enchantment_boss_hopper_cultist.yml"), + "em_id_enchantment_challenge_15", + 1, + false); + setDifficulties(List.of( + Map.of("name", "normal", "id", 0))); + setEnchantmentChallenge(true); + setMaxPlayerCount(1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge16.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge16.java new file mode 100644 index 000000000..29bb4c651 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge16.java @@ -0,0 +1,36 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.List; +import java.util.Map; + +public class EnchantmentChallenge16 extends DungeonPackagerConfigFields { + public EnchantmentChallenge16() { + super("enchantment_challenge_16_sanctum", + true, + "&2[lvl 000-200] &6Enchantment Challenge 16", + List.of("&fAn enchantment challenge dungeon!"), + DiscordLinks.premiumMinidungeons, + DungeonPackagerConfigFields.DungeonSizeCategory.SANCTUM, + "em_id_enchantment_challenge_16", + World.Environment.THE_END, + true, + "em_id_enchantment_challenge_16,-15.5,94,15.5,-135,0.0", + "em_id_enchantment_challenge_16,14.5,65,-12.5,45,0", + 0, + "Difficulty: &4solo hard content!", + "&bChallenge time!", + "&bYou have left the enchantment challenge!", + List.of("filename=enchantment_boss_shadow_heart.yml"), + "em_id_enchantment_challenge_16", + 1, + false); + setDifficulties(List.of( + Map.of("name", "normal", "id", 0))); + setEnchantmentChallenge(true); + setMaxPlayerCount(1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge17.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge17.java new file mode 100644 index 000000000..fcab49d66 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge17.java @@ -0,0 +1,36 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.List; +import java.util.Map; + +public class EnchantmentChallenge17 extends DungeonPackagerConfigFields { + public EnchantmentChallenge17() { + super("enchantment_challenge_17_sanctum", + true, + "&2[lvl 000-200] &6Enchantment Challenge 17", + List.of("&fAn enchantment challenge dungeon!"), + DiscordLinks.premiumMinidungeons, + DungeonPackagerConfigFields.DungeonSizeCategory.SANCTUM, + "em_id_enchantment_challenge_17", + World.Environment.THE_END, + true, + "em_id_enchantment_challenge_17,-15.5,94,15.5,-135,0.0", + "em_id_enchantment_challenge_17,14.5,65,-12.5,45,0", + 0, + "Difficulty: &4solo hard content!", + "&bChallenge time!", + "&bYou have left the enchantment challenge!", + List.of("filename=enchantment_boss_void_fly.yml"), + "em_id_enchantment_challenge_17", + 1, + false); + setDifficulties(List.of( + Map.of("name", "normal", "id", 0))); + setEnchantmentChallenge(true); + setMaxPlayerCount(1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge18.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge18.java new file mode 100644 index 000000000..a9849c978 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge18.java @@ -0,0 +1,36 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.List; +import java.util.Map; + +public class EnchantmentChallenge18 extends DungeonPackagerConfigFields { + public EnchantmentChallenge18() { + super("enchantment_challenge_18_sanctum", + true, + "&2[lvl 000-200] &6Enchantment Challenge 18", + List.of("&fAn enchantment challenge dungeon!"), + DiscordLinks.premiumMinidungeons, + DungeonPackagerConfigFields.DungeonSizeCategory.SANCTUM, + "em_id_enchantment_challenge_18", + World.Environment.THE_END, + true, + "em_id_enchantment_challenge_11,-15.5,94,15.5,-135,0.0", + "em_id_enchantment_challenge_11,14.5,65,-12.5,45,0", + 0, + "Difficulty: &4solo hard content!", + "&bChallenge time!", + "&bYou have left the enchantment challenge!", + List.of("filename=enchantment_boss_grisly_grim.yml"), + "em_id_enchantment_challenge_18", + 1, + false); + setDifficulties(List.of( + Map.of("name", "normal", "id", 0))); + setEnchantmentChallenge(true); + setMaxPlayerCount(1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge19.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge19.java new file mode 100644 index 000000000..38bfbb808 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge19.java @@ -0,0 +1,36 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.List; +import java.util.Map; + +public class EnchantmentChallenge19 extends DungeonPackagerConfigFields { + public EnchantmentChallenge19() { + super("enchantment_challenge_19_sanctum", + true, + "&2[lvl 000-200] &6Enchantment Challenge 19", + List.of("&fAn enchantment challenge dungeon!"), + DiscordLinks.premiumMinidungeons, + DungeonPackagerConfigFields.DungeonSizeCategory.SANCTUM, + "em_id_enchantment_challenge_19", + World.Environment.THE_END, + true, + "em_id_enchantment_challenge_19,-15.5,94,15.5,-135,0.0", + "em_id_enchantment_challenge_19,14.5,65,-12.5,45,0", + 0, + "Difficulty: &4solo hard content!", + "&bChallenge time!", + "&bYou have left the enchantment challenge!", + List.of("filename=enchantment_boss_phantasm.yml"), + "em_id_enchantment_challenge_19", + 1, + false); + setDifficulties(List.of( + Map.of("name", "normal", "id", 0))); + setEnchantmentChallenge(true); + setMaxPlayerCount(1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge2.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge2.java new file mode 100644 index 000000000..31ce2d9a6 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge2.java @@ -0,0 +1,36 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.List; +import java.util.Map; + +public class EnchantmentChallenge2 extends DungeonPackagerConfigFields { + public EnchantmentChallenge2() { + super("enchantment_challenge_2_sanctum", + true, + "&2[lvl 000-200] &fEnchantment Challenge 02", + List.of("&fAn enchantment challenge dungeon!"), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.SANCTUM, + "em_id_enchantment_challenge_2", + World.Environment.NORMAL, + true, + "em_id_enchantment_challenge_2,18.5,95,-15.5,45,0.0", + "em_id_enchantment_challenge_2,14.5,65,-12.5,45,0", + 0, + "Difficulty: &4solo hard content!", + "&bChallenge time!", + "&bYou have left the enchantment challenge!", + List.of("filename=enchantment_boss_energized_bunny.yml"), + "em_id_enchantment_challenge_2", + 1, + false); + setDifficulties(List.of( + Map.of("name", "normal", "id", 0))); + setEnchantmentChallenge(true); + setMaxPlayerCount(1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge20.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge20.java new file mode 100644 index 000000000..9c2fa2773 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge20.java @@ -0,0 +1,36 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.List; +import java.util.Map; + +public class EnchantmentChallenge20 extends DungeonPackagerConfigFields { + public EnchantmentChallenge20() { + super("enchantment_challenge_20_sanctum", + true, + "&2[lvl 000-200] &6Enchantment Challenge 20", + List.of("&fAn enchantment challenge dungeon!"), + DiscordLinks.premiumMinidungeons, + DungeonPackagerConfigFields.DungeonSizeCategory.SANCTUM, + "em_id_enchantment_challenge_20", + World.Environment.THE_END, + true, + "em_id_enchantment_challenge_20,-15.5,94,15.5,-135,0.0", + "em_id_enchantment_challenge_20,14.5,65,-12.5,45,0", + 0, + "Difficulty: &4solo hard content!", + "&bChallenge time!", + "&bYou have left the enchantment challenge!", + List.of("filename=enchantment_boss_soul_trampler.yml"), + "em_id_enchantment_challenge_20", + 1, + false); + setDifficulties(List.of( + Map.of("name", "normal", "id", 0))); + setEnchantmentChallenge(true); + setMaxPlayerCount(1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge3.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge3.java new file mode 100644 index 000000000..44563aafa --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge3.java @@ -0,0 +1,36 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.List; +import java.util.Map; + +public class EnchantmentChallenge3 extends DungeonPackagerConfigFields { + public EnchantmentChallenge3() { + super("enchantment_challenge_3_sanctum", + true, + "&2[lvl 000-200] &fEnchantment Challenge 03", + List.of("&fAn enchantment challenge dungeon!"), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.SANCTUM, + "em_id_enchantment_challenge_3", + World.Environment.NORMAL, + true, + "em_id_enchantment_challenge_3,18.5,95,-15.5,45,0.0", + "em_id_enchantment_challenge_3,14.5,65,-12.5,45,0", + 0, + "Difficulty: &4solo hard content!", + "&bChallenge time!", + "&bYou have left the enchantment challenge!", + List.of("filename=enchantment_boss_jealous_block.yml"), + "em_id_enchantment_challenge_3", + 1, + false); + setDifficulties(List.of( + Map.of("name", "normal", "id", 0))); + setEnchantmentChallenge(true); + setMaxPlayerCount(1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge4.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge4.java new file mode 100644 index 000000000..877e360ef --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge4.java @@ -0,0 +1,36 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.List; +import java.util.Map; + +public class EnchantmentChallenge4 extends DungeonPackagerConfigFields { + public EnchantmentChallenge4() { + super("enchantment_challenge_4_sanctum", + true, + "&2[lvl 000-200] &fEnchantment Challenge 04", + List.of("&fAn enchantment challenge dungeon!"), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.SANCTUM, + "em_id_enchantment_challenge_4", + World.Environment.NORMAL, + true, + "em_id_enchantment_challenge_4,18.5,95,-15.5,45,0.0", + "em_id_enchantment_challenge_4,14.5,65,-12.5,45,0", + 0, + "Difficulty: &4solo hard content!", + "&bChallenge time!", + "&bYou have left the enchantment challenge!", + List.of("filename=enchantment_boss_leet_summoner.yml"), + "em_id_enchantment_challenge_4", + 1, + false); + setDifficulties(List.of( + Map.of("name", "normal", "id", 0))); + setEnchantmentChallenge(true); + setMaxPlayerCount(1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge5.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge5.java new file mode 100644 index 000000000..98dd8f1f5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge5.java @@ -0,0 +1,36 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.List; +import java.util.Map; + +public class EnchantmentChallenge5 extends DungeonPackagerConfigFields { + public EnchantmentChallenge5() { + super("enchantment_challenge_5_sanctum", + true, + "&2[lvl 000-200] &fEnchantment Challenge 05", + List.of("&fAn enchantment challenge dungeon!"), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.SANCTUM, + "em_id_enchantment_challenge_5", + World.Environment.NORMAL, + true, + "em_id_enchantment_challenge_5,18.5,95,-15.5,45,0.0", + "em_id_enchantment_challenge_5,14.5,65,-12.5,45,0", + 0, + "Difficulty: &4solo hard content!", + "&bChallenge time!", + "&bYou have left the enchantment challenge!", + List.of("filename=enchantment_boss_loveable_impaler.yml"), + "em_id_enchantment_challenge_5", + 1, + false); + setDifficulties(List.of( + Map.of("name", "normal", "id", 0))); + setEnchantmentChallenge(true); + setMaxPlayerCount(1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge6.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge6.java new file mode 100644 index 000000000..6b3840884 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge6.java @@ -0,0 +1,36 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.List; +import java.util.Map; + +public class EnchantmentChallenge6 extends DungeonPackagerConfigFields { + public EnchantmentChallenge6() { + super("enchantment_challenge_6_sanctum", + true, + "&2[lvl 000-200] &fEnchantment Challenge 06", + List.of("&fAn enchantment challenge dungeon!"), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.SANCTUM, + "em_id_enchantment_challenge_6", + World.Environment.NORMAL, + true, + "em_id_enchantment_challenge_6,18.5,95,-15.5,45,0.0", + "em_id_enchantment_challenge_6,14.5,65,-12.5,45,0", + 0, + "Difficulty: &4solo hard content!", + "&bChallenge time!", + "&bYou have left the enchantment challenge!", + List.of("filename=enchantment_boss_ravegarer.yml"), + "em_id_enchantment_challenge_6", + 1, + false); + setDifficulties(List.of( + Map.of("name", "normal", "id", 0))); + setEnchantmentChallenge(true); + setMaxPlayerCount(1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge7.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge7.java new file mode 100644 index 000000000..fa6bfd7e9 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge7.java @@ -0,0 +1,36 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.List; +import java.util.Map; + +public class EnchantmentChallenge7 extends DungeonPackagerConfigFields { + public EnchantmentChallenge7() { + super("enchantment_challenge_7_sanctum", + true, + "&2[lvl 000-200] &fEnchantment Challenge 07", + List.of("&fAn enchantment challenge dungeon!"), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.SANCTUM, + "em_id_enchantment_challenge_7", + World.Environment.NORMAL, + true, + "em_id_enchantment_challenge_7,18.5,95,-15.5,45,0.0", + "em_id_enchantment_challenge_7,14.5,65,-12.5,45,0", + 0, + "Difficulty: &4solo hard content!", + "&bChallenge time!", + "&bYou have left the enchantment challenge!", + List.of("filename=enchantment_boss_rock_solid_cold.yml"), + "em_id_enchantment_challenge_7", + 1, + false); + setDifficulties(List.of( + Map.of("name", "normal", "id", 0))); + setEnchantmentChallenge(true); + setMaxPlayerCount(1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge8.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge8.java new file mode 100644 index 000000000..8aba4a9bc --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge8.java @@ -0,0 +1,36 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.List; +import java.util.Map; + +public class EnchantmentChallenge8 extends DungeonPackagerConfigFields { + public EnchantmentChallenge8() { + super("enchantment_challenge_8_sanctum", + true, + "&2[lvl 000-200] &fEnchantment Challenge 08", + List.of("&fAn enchantment challenge dungeon!"), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.SANCTUM, + "em_id_enchantment_challenge_8", + World.Environment.NORMAL, + true, + "em_id_enchantment_challenge_8,18.5,95,-15.5,45,0.0", + "em_id_enchantment_challenge_8,14.5,65,-12.5,45,0", + 0, + "Difficulty: &4solo hard content!", + "&bChallenge time!", + "&bYou have left the enchantment challenge!", + List.of("filename=enchantment_boss_the_firebunger.yml"), + "em_id_enchantment_challenge_8", + 1, + false); + setDifficulties(List.of( + Map.of("name", "normal", "id", 0))); + setEnchantmentChallenge(true); + setMaxPlayerCount(1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge9.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge9.java new file mode 100644 index 000000000..824adb7c7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/EnchantmentChallenge9.java @@ -0,0 +1,36 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.List; +import java.util.Map; + +public class EnchantmentChallenge9 extends DungeonPackagerConfigFields { + public EnchantmentChallenge9() { + super("enchantment_challenge_9_sanctum", + true, + "&2[lvl 000-200] &fEnchantment Challenge 09", + List.of("&fAn enchantment challenge dungeon!"), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.SANCTUM, + "em_id_enchantment_challenge_9", + World.Environment.NORMAL, + true, + "em_id_enchantment_challenge_9,18.5,95,-15.5,45,0.0", + "em_id_enchantment_challenge_9,14.5,65,-12.5,45,0", + 0, + "Difficulty: &4solo hard content!", + "&bChallenge time!", + "&bYou have left the enchantment challenge!", + List.of("filename=enchantment_boss_the_glass_master.yml"), + "em_id_enchantment_challenge_9", + 1, + false); + setDifficulties(List.of( + Map.of("name", "normal", "id", 0))); + setEnchantmentChallenge(true); + setMaxPlayerCount(1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/FireworksLair.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/FireworksLair.java new file mode 100644 index 000000000..34cff84b4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/FireworksLair.java @@ -0,0 +1,32 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; + +public class FireworksLair extends DungeonPackagerConfigFields { + public FireworksLair() { + super("fireworks_lair", + true, + "&2[lvl 020] &aThe Fireworks", + new ArrayList<>(List.of("&fThe 2021 4th of July map!", + "&6Credits: MagmaGuy")), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.LAIR, + "em_fireworks", + World.Environment.NORMAL, + true, + "em_fireworks,29.5,66.2,-32.5,45,0", + 0, + "Difficulty: &cHard\n" + + "$bossCount level $lowestTier Big Boss!\n" + + "&6An encounter full of explosions!", + "&8[EM] &eWelcome to the fireworks show!", + "&8[EM] &eYou've left the party!", + "the_fireworks", + true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/FrostPalaceSanctum.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/FrostPalaceSanctum.java new file mode 100644 index 000000000..79d38c6f5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/FrostPalaceSanctum.java @@ -0,0 +1,39 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class FrostPalaceSanctum extends DungeonPackagerConfigFields { + public FrostPalaceSanctum() { + super("frost_palace_sanctum", + true, + "&2[lvl 050] &3The Frost Palace", + new ArrayList<>(List.of("&fA 7 phase fight against", + "the queen of ice!", + "&6Credits: MagmaGuy, Delio")), + DiscordLinks.premiumMinidungeons, + DungeonSizeCategory.SANCTUM, + "em_id_frost_palace", + World.Environment.NORMAL, + true, + "em_id_frost_palace,195.5,-31,-51.5,90,30", + "em_id_frost_palace,183.5,-58,-51.5,90.0,0.0", + 0, + "Difficulty: &45-man hard content!", + "&bYou are stepping into the Frost Palace! Stay frosty!", + "&bYou have left the Frost Palace!", + List.of("filename=frost_palace_frost_queen_p0.yml"), + "frost_palace", + 50, + true); + setDifficulties(List.of( + Map.of("name", "normal", "levelSync", 55, "id", 0), + Map.of("name", "hard", "levelSync", 50, "id", 1), + Map.of("name", "mythic", "levelSync", 45, "id", 2))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/HallosseumLair.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/HallosseumLair.java new file mode 100644 index 000000000..62952b489 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/HallosseumLair.java @@ -0,0 +1,32 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; + +public class HallosseumLair extends DungeonPackagerConfigFields { + public HallosseumLair() { + super("hallosseum_lair", + true, + "&2[lvl 030] &cThe Hallosseum", + new ArrayList<>(List.of("&fThe 2020 spooky halloween encounter!", + "&6Credits: MagmaGuy & 69OzCanOfBepis")), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.LAIR, + "em_hallosseum", + World.Environment.NETHER, + true, + "em_hallosseum,66.5,22.2,77.5,20,0", + 0, + "Difficulty: &chard\n" + + "$bossCount level $lowestTier Big Boss!\n" + + "&6A fun Halloween challenge!", + "&8[EM] &4Trick or treat! &8Your soul is mine!", + "&8[EM] &4You've escaped with your soul intact.", + "the_hallosseum", + false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/InvasionMinidungeon.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/InvasionMinidungeon.java new file mode 100644 index 000000000..ebaa354c3 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/InvasionMinidungeon.java @@ -0,0 +1,32 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; + +public class InvasionMinidungeon extends DungeonPackagerConfigFields { + public InvasionMinidungeon() { + super("invasion_minidungeon", + true, + "&2[lvl 035-045] &2The Invasion", + new ArrayList<>(List.of("&fThe Halloween Minidungeon!", + "&6Credits: MagmaGuy & 69OzCanOfBepis")), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.MINIDUNGEON, + "em_invasion", + World.Environment.NORMAL, + true, + "em_invasion,-8.5,13.2,19.5,80,0", + 0, + "Difficulty: &6Medium\n" + + "$bossCount aliens, from level $lowestTier to $highestTier\n" + + "&6Don't get abducted!", + "&8[EM] &7Alien invasion in progress! Defeat the Mothership!", + "&8[EM] &7You have escaped the alien abductions! No one will ever believe you.", + "invasion", + false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/IronLeagueArena.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/IronLeagueArena.java new file mode 100644 index 000000000..3f60f38bc --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/IronLeagueArena.java @@ -0,0 +1,30 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.List; + +public class IronLeagueArena extends DungeonPackagerConfigFields { + public IronLeagueArena() { + super("iron_league_arena", + true, + "&2[lvl 050-100] &fThe Iron League Arena", + List.of("&fFace the Iron League Arena!"), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.ARENA, + "em_iron_league_arena", + World.Environment.NORMAL, + true, + "em_iron_league_arena,46,-42,38,-110,-24", + 0, + "Difficulty: &chard\n" + + "Face 50 waves of the arena, from\n" + + "level 50 to level 100!", + "&fAre you prepared to face the arena?", + "&fNow leaving the iron league arena!", + "iron_league_arena", + false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/KnightCastleLair.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/KnightCastleLair.java new file mode 100644 index 000000000..074241236 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/KnightCastleLair.java @@ -0,0 +1,30 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.List; + +public class KnightCastleLair extends DungeonPackagerConfigFields { + public KnightCastleLair() { + super("knights_castle_lair", + true, + "&2[lvl 095] &fThe Knight's Castle", + List.of("&fChallenge the knights of the castle!"), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.LAIR, + "em_knight_castle", + World.Environment.NORMAL, + true, + "em_knight_castle,-20.5,6.2,55.5,-120,0", + 0, + "Difficulty: &chard\n" + + "$bossCount level $lowestTier Big Boss!\n" + + "&6Face an honorable duel!", + "&fAssault the castle!", + "&fNow leaving the castle!", + "the_knight_castle", + false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/NorthPoleMinidungeon.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/NorthPoleMinidungeon.java new file mode 100644 index 000000000..601dc404e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/NorthPoleMinidungeon.java @@ -0,0 +1,32 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; + +public class NorthPoleMinidungeon extends DungeonPackagerConfigFields { + public NorthPoleMinidungeon() { + super("north_pole_minidungeon", + true, + "&2[lvl 055-060] &9The North Pole", + new ArrayList<>(List.of("&fThe Christmas minidungeon!", + "&6Credits: MagmaGuy & 69OzCanOfBepis")), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.MINIDUNGEON, + "em_north_pole", + World.Environment.NORMAL, + true, + "em_north_pole,-264.5,43.2,-503.5,47,0", + 0, + "Difficulty: &6Medium\n" + + "$bossCount bosses, from level $lowestTier to $highestTier\n" + + "&6Christmas in a snow globe!", + "&8[EM] &7You have reached the North Pole! &fHave you been naughty this year?", + "&8[EM] &7Come back and visit. &fThere are plenty of sweets and treats for next time!", + "the_north_pole", + false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/OasisAdventure.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/OasisAdventure.java new file mode 100644 index 000000000..d8d5a5d30 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/OasisAdventure.java @@ -0,0 +1,33 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; + +public class OasisAdventure extends DungeonPackagerConfigFields { + public OasisAdventure() { + super("oasis_adventure", + true, + "&2[lvl 020-055] &6The Oasis", + new ArrayList<>(List.of("&fA massive adventure for beginners!", + "&6Credits: 69OzCanOfBepis")), + DiscordLinks.premiumMinidungeons, + DungeonSizeCategory.ADVENTURE, + "em_oasis", + World.Environment.NORMAL, + true, + "em_oasis,260.5,22,280.5,0,0", + 2, + "Difficulty: &2Solo-able\n" + + "$bossCount bosses, from level $lowestTier to $highestTier\n" + + "&6A big adventure for people who know the ropes!", + "&8[EM] &6You have arrived at the Oasis!", + "&8[EM] &6You have left the Oasis!", + "oasis", + false); + setWormholeWorldName("em_oasis_wormhole"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/OasisPyramidSanctum.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/OasisPyramidSanctum.java new file mode 100644 index 000000000..8f8cbdb3d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/OasisPyramidSanctum.java @@ -0,0 +1,37 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class OasisPyramidSanctum extends DungeonPackagerConfigFields { + public OasisPyramidSanctum() { + super("oasis_pyramid_sanctum", + true, + "&2[lvl 055] &6The Oasis Pyramid", + new ArrayList<>(List.of("&fThe final dungeon of the Oasis adventure!", + "&6Credits: 69OzCanOfBepis, Frostcone, MagmaGuy")), + DiscordLinks.premiumMinidungeons, + DungeonPackagerConfigFields.DungeonSizeCategory.SANCTUM, + "em_id_oasis_pyramid", + World.Environment.NORMAL, + true, + "em_id_oasis_pyramid,-9.5,77.0,-153.5,-115,17", + "em_id_oasis_pyramid,0.5,75.0,-169.5,-180,3", + 0, + "Difficulty: &4solo hard content!", + "&bWelcome to the Pyramid!", + "&bYou have left the Pyramid!", + List.of("filename=oasis_pharaoh_p1.yml"), + "em_id_oasis_pyramid", + 55, + false); + setDifficulties(List.of( + Map.of("name", "normal", "id", 0))); + setListedInTeleports(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/PirateShipMinidungeon.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/PirateShipMinidungeon.java new file mode 100644 index 000000000..7f607f7fd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/PirateShipMinidungeon.java @@ -0,0 +1,35 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; + +public class PirateShipMinidungeon extends DungeonPackagerConfigFields { + public PirateShipMinidungeon() { + super("pirate_ship_minidungeon", + true, + "&2[lvl 010-020] &6The Pirate Ship", + new ArrayList<>(List.of("&fA fun, challenging minidungeon full of", + "&fbosses made for players starting to get good,", + "&fat EliteMobs!", + "&6Credits: MagmaGuy & Realm of Lotheridon")), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.MINIDUNGEON, + "em_the_pirate_ship", + World.Environment.NORMAL, + true, + "em_the_pirate_ship,-85.5,64.0,236.5,180,0", + 0, + "Difficulty: &6Medium\n" + + "$bossCount bosses, from level $lowestTier to $highestTier\n" + + "&6One of the best hunting grounds for" + + "&6aspiring adventurers!", + "&8[EM] &3Now boarding the Pirate Ship! &bPillage and plunder to yer' hearts content!", + "&8[EM] &3Player overboard! &bReturn when you've earned your sea-legs ye' landlubber!", + "the_pirate_ship", + false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/PrimisAdventure.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/PrimisAdventure.java new file mode 100644 index 000000000..f6d774aa7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/PrimisAdventure.java @@ -0,0 +1,34 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; + +public class PrimisAdventure extends DungeonPackagerConfigFields { + public PrimisAdventure() { + super("primis_adventure", + true, + "&2[lvl 000-020] &7Primis", + new ArrayList<>(List.of("&fA tutorial adventure for new players!", + "&6Credits: 69OzCanOfBepis, MagmaGuy")), + DiscordLinks.premiumMinidungeons, + DungeonPackagerConfigFields.DungeonSizeCategory.ADVENTURE, + "em_primis", + World.Environment.NORMAL, + true, + "em_primis,1406.5,21.5,357.5,33,0", + 0, + "Difficulty: &2Easy\n" + + "$bossCount bosses, from level $lowestTier to $highestTier\n" + + "&6A tutorial adventure for new players!", + "&8[EM] &6Primis awaits, strike the earth!", + "&8[EM] &6You have left Primis!", + "primis", + false); + setWormholeWorldName("em_primis_wormhole"); + setHasCustomModels(true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/PrimisBloodTempleSanctum.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/PrimisBloodTempleSanctum.java new file mode 100644 index 000000000..ee90dc388 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/PrimisBloodTempleSanctum.java @@ -0,0 +1,37 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class PrimisBloodTempleSanctum extends DungeonPackagerConfigFields { + public PrimisBloodTempleSanctum() { + super("primis_blood_temple_sanctum", + true, + "&2[lvl 020] &aPrimis - Blood Temple'", + new ArrayList<>(List.of("&fThe Fire Elemental awaits!", + "&6Credits: Dali_, Frostcone, MagmaGuy")), + DiscordLinks.premiumMinidungeons, + DungeonPackagerConfigFields.DungeonSizeCategory.SANCTUM, + "em_id_bloodtemple", + World.Environment.NORMAL, + true, + "em_id_bloodtemple,326.5,87.0,-738.5,-44,35", + "em_id_bloodtemple,324.5,73.0,-711.5,-90,5", + 0, + "Difficulty: &4solo hard content!", + "&bWelcome to the Blood Temple!", + "&bYou have left the Blood Temple!", + List.of("filename=primis_final_elemental_p1.yml"), + "em_id_bloodtemple", + 20, + true); + setDifficulties(List.of( + Map.of("name", "normal", "id", 0))); + setListedInTeleports(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/PrimisGladiusInvasionDungeon.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/PrimisGladiusInvasionDungeon.java new file mode 100644 index 000000000..0c72e39bc --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/PrimisGladiusInvasionDungeon.java @@ -0,0 +1,40 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class PrimisGladiusInvasionDungeon extends DungeonPackagerConfigFields { + public PrimisGladiusInvasionDungeon() { + super("primis_gladius_invasion_dungeon", + true, + "&2[lvl 000-020] &aPrimis - Gladius Invasion", + new ArrayList<>(List.of("&fIt is time to take Gladius back!", "&6Credits: 69OzCanOfBepis, Frostcone, MagmaGuy")), + DiscordLinks.premiumMinidungeons, + DungeonSizeCategory.DUNGEON, + "em_id_primis_gladius", + World.Environment.NETHER, + true, + "em_id_primis_gladius,-108.5,69.0,40.5,-90.499999,0", + "em_id_primis_gladius,-100.5,69.0,40.5,-69.499999,0", + 0, + "Difficulty: &4solo hard content!", + "&bWelcome to the Gladius Invasion!", + "2&bYou have left the Gladius Invasion!", + List.of("filename=primis_gladius_bell_id.yml"), + "em_id_primis_gladius", + 1, + false); + setDifficulties(List.of( + Map.of("name", "normal", "id", 0, "levelSync", 18), + Map.of("name", "hard", "id", 1, "levelSync", 15), + Map.of("name", "mythic", "id", 2, "levelSync", 12) + )); + setMaxPlayerCount(5); + setListedInTeleports(false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/RuinsLair.off b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/RuinsLair.off new file mode 100644 index 000000000..77e9f1202 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/RuinsLair.off @@ -0,0 +1,37 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.util.Vector; + +import java.util.Arrays; +import java.util.List; + +public class RuinsLair extends DungeonPackagerConfigFields { + public RuinsLair() { + super("the_ruins", + true, + "&2[lvl 150] &6The Ruins", + new ArrayList<>(List.of("&fA fight against a myth from", + "&fNorse mythology, be prepared for a smiting!", + "&6Credits: 69OzCanOfBepis, MagmaGuy"), + List.of( + "ruins_boss_p1.yml:0,0,0"), + List.of(), + DiscordLinks.premiumMinidungeons, + DungeonSizeCategory.LAIR, + "em_the_ruins.schem", + true, + new Vector(18, -6, -19), + new Vector(-21, 10, 20), + "-1,-4,18,0,0", + 0, + "Difficulty: &cHard\n" + + "$bossCount level $lowestTier Big Boss!\n" + + "&cA tough fight against a Norse god!", + "&8[EM] &3Those who challenge the myths must be prepared for their downfall!", + "&8[EM] &3You now know what it takes to make a legend!", + SchematicPackage.SchematicRotation.SOUTH.toString(), + "the_ruins"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/SewersMinidungeon.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/SewersMinidungeon.java new file mode 100644 index 000000000..69a2b3603 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/SewersMinidungeon.java @@ -0,0 +1,33 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; + +public class SewersMinidungeon extends DungeonPackagerConfigFields { + public SewersMinidungeon() { + super("sewers_minidungeon", + true, + "&2[lvl 020-035] &8The Sewers", + new ArrayList<>(List.of("&fThe biggest minidungeon ever made!", + "&6Credits: MagmaGuy & 69OzCanOfBepis")), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.MINIDUNGEON, + "em_sewer_maze", + World.Environment.NORMAL, + true, + "em_sewer_maze,-21,168.2,-174,90,0", + 0, + "Difficulty: &6Medium\n" + + "$bossCount bosses, from level $lowestTier to $highestTier\n" + + "&6A complex dungeon maze with a challenging sections!", + "&8[EM] &5This place looks abandoned... &dYet something lurks in these sewers!", + + "&8[EM] &5You managed to stay above water. &dMaybe next time you'll drown.", + "the_sewers", + false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/ShadowOfTheBinderOfWorldsLair.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/ShadowOfTheBinderOfWorldsLair.java new file mode 100644 index 000000000..49db8c1d1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/ShadowOfTheBinderOfWorldsLair.java @@ -0,0 +1,32 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; + +public class ShadowOfTheBinderOfWorldsLair extends DungeonPackagerConfigFields { + public ShadowOfTheBinderOfWorldsLair() { + super("shadow_of_the_binder_of_worlds_lair", + true, + "&2[lvl 200] &5Shadow of the Binder Of Worlds", + new ArrayList<>(List.of("&5The penultimate challenge. Be prepared!", + "&6Credits: MagmaGuy, 69OzCanOfBepis & Frostcone")), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.LAIR, + "em_shadow_of_the_binder_of_worlds", + World.Environment.THE_END, + true, + "em_shadow_of_the_binder_of_worlds,-42.5,63.2,-19.5,-65,0", + 0, + "Difficulty: &6Nightmare\n" + + "$bossCount level $highestTier final boss!\n" + + "&5This is the hardest fight in EliteMobs!", + "&8[EM] &5Reality unravels around you. You face the final challenge. &4You are not prepared!", + "&8[EM] &5You have left the unravelling. Did you find what you sought? Was it worth it?", + "the_binder_of_worlds", + true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/SteamworksLair.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/SteamworksLair.java new file mode 100644 index 000000000..35a5057e7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/SteamworksLair.java @@ -0,0 +1,30 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.List; + +public class SteamworksLair extends DungeonPackagerConfigFields { + public SteamworksLair() { + super("steamworks_lair", + true, + "&2[lvl 140] &6The Steamworks", + List.of("&fA steampunk inspired lair!"), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.LAIR, + "em_steamworks_lair", + World.Environment.NORMAL, + true, + "em_steamworks_lair,-48.5,-47.8,-102.5,40,0", + 0, + "Difficulty: &chard\n" + + "$bossCount level $lowestTier Big Boss!\n" + + "&6Get ready for a robot rumble!", + "&6Reach the top and mind your step!", + "&6Now leaving the clockwork dominion!", + "the_steamworks", + false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/TheBridgeSanctum.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/TheBridgeSanctum.java new file mode 100644 index 000000000..e1695895c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/TheBridgeSanctum.java @@ -0,0 +1,38 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class TheBridgeSanctum extends DungeonPackagerConfigFields { + public TheBridgeSanctum() { + super("the_bridge_sanctum", + true, + "&2[lvl 025] &3The Bridge Sanctum", + new ArrayList<>(List.of("&fThe perfect intermediate instanced sanctum!", + "&6Credits: Dali_, MagmaGuy, Frostcone")), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.SANCTUM, + "em_id_the_bridge", + World.Environment.NORMAL, + true, + "em_id_the_bridge,-255.5,100,-14.5,-90.0,0.0", + "em_id_the_bridge,-216.5,103,-14.5,-90.0,0.0", + 0, + "Difficulty: &45-man hard content!", + "&bBefore being able to enter the city you must deal with the guardian on the bridge!", + "&bYou have left The Bridge!", + List.of("filename=the_bridge_ancient_guardian_p1.yml"), + "em_id_the_bridge", + 25, + false); + setDifficulties(List.of( + Map.of("name", "normal", "levelSync", 30, "id", 0), + Map.of("name", "hard", "levelSync", 25, "id", 1), + Map.of("name", "mythic", "levelSync", 20, "id", 2))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/TheCaveSanctum.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/TheCaveSanctum.java new file mode 100644 index 000000000..8d3e1c70a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/TheCaveSanctum.java @@ -0,0 +1,38 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class TheCaveSanctum extends DungeonPackagerConfigFields { + public TheCaveSanctum() { + super("the_cave_sanctum", + true, + "&2[lvl 010] &3The Cave Sanctum", + new ArrayList<>(List.of("&fThe perfect starter instanced sanctum!", + "&6Credits: MagmaGuy, Frostcone, 69OzCanOfBepis, Realm of Lotheridon")), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.SANCTUM, + "em_id_the_cave", + World.Environment.NORMAL, + true, + "em_id_the_cave,0.5,65,0.5,70,0", + "em_id_the_cave,-18.5,58,-17.5,90.0,30.0", + 0, + "Difficulty: &45-man hard content!", + "&bYou've been asked to clear the path to the underground. Deal with the thing in the cave!", + "&bYou have left The Cave!", + List.of("filename=the_cave_boiler_p1.yml"), + "em_id_the_cave", + 15, + false); + setDifficulties(List.of( + Map.of("name", "normal", "levelSync", 20, "id", 0), + Map.of("name", "hard", "levelSync", 15, "id", 1), + Map.of("name", "mythic", "levelSync", 10, "id", 2))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/TheCityDungeon.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/TheCityDungeon.java new file mode 100644 index 000000000..131cc67a4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/TheCityDungeon.java @@ -0,0 +1,41 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class TheCityDungeon extends DungeonPackagerConfigFields { + public TheCityDungeon() { + super("the_city_dungeon", + true, + "&2[lvl 030] &3The City Dungeon", + new ArrayList<>(List.of("&fThe perfect intermediate instanced sanctum!", + "&6Credits: Dali_, MagmaGuy, Frostcone")), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.DUNGEON, + "em_id_the_city", + World.Environment.NORMAL, + true, + "em_id_the_city,-87.5,119,-13.5,-90,0", + "em_id_the_city,-60.5,122,-12.5,-67,0", + 0, + "Difficulty: &45-man hard content!", + "&bBefore being able to enter the city you must deal with the guardian on the bridge!", + "&bYou have left The City!", + List.of("filename=em_id_the_city_mini_boss_one.yml", + "filename=em_id_the_city_mini_boss_two.yml", + "filename=em_id_the_city_mini_boss_three.yml", + "filename=em_id_the_city_royal_guard_p1.yml"), + "em_id_the_city", + 30, + false); + setDifficulties(List.of( + Map.of("name", "normal", "levelSync", 35, "id", 0), + Map.of("name", "hard", "levelSync", 30, "id", 1), + Map.of("name", "mythic", "levelSync", 25, "id", 2))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/TheClimbDungeon.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/TheClimbDungeon.java new file mode 100644 index 000000000..b6a6c1c4e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/TheClimbDungeon.java @@ -0,0 +1,41 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class TheClimbDungeon extends DungeonPackagerConfigFields { + public TheClimbDungeon() { + super("the_climb_dungeon", + true, + "&2[lvl 010] &3The Climb Dungeon", + new ArrayList<>(List.of("&fThe perfect starter instanced dungeon!", + "&6Credits: MagmaGuy, Frostcone, 69OzCanOfBepis, Realm of Lotheridon")), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.DUNGEON, + "em_id_the_climb", + World.Environment.NORMAL, + true, + "em_id_the_climb,371.5,34,350.5,-70.0,-10.0", + "em_id_the_climb,379.5,36,352.5,-70,-10", + 0, + "Difficulty: &45-man hard content!", + "&bYou've been asked to investigate the path to the caves. Climb your way to the top!", + "&bYou have left The Climb!", + List.of("filename=the_climb_undead_beastmaster.yml", + "filename=the_climb_skeletal_shadow.yml", + "filename=the_climb_bone_champion.yml", + "filename=the_climb_undead_guardian.yml"), + "em_id_the_climb", + 10, + false); + setDifficulties(List.of( + Map.of("name", "normal", "levelSync", 15, "id", 0), + Map.of("name", "hard", "levelSync", 10, "id", 1), + Map.of("name", "mythic", "levelSync", 5, "id", 2))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/TheDeepMinesDungeon.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/TheDeepMinesDungeon.java new file mode 100644 index 000000000..100391f36 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/TheDeepMinesDungeon.java @@ -0,0 +1,39 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class TheDeepMinesDungeon extends DungeonPackagerConfigFields { + public TheDeepMinesDungeon() { + super("the_deep_mines_dungeon", + true, + "&2[lvl 045] &3The Deep Mines Dungeon", + new ArrayList<>(List.of("&fBelow lies the deepest mine ever dug.", + "&6Credits: Dali, MagmaGuy, FrostCone")), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.SANCTUM, + "em_id_the_deep_mines", + World.Environment.NORMAL, + true, + "em_id_the_deep_mines,-205.5,154,-85.5,0,0", + "em_id_the_deep_mines,-207.5,154,-68.5,0,0", + 0, + "Difficulty: &45-man hard content!", + "&bVenture far down and find out how deep the deep mines are.", + "&bYou have left The Deep Mines!", + List.of("filename=em_id_the_deep_mines_tnt_box.yml", + "filename=em_id_the_deep_mines_boss_the_pursuer_p1.yml"), + "em_id_the_deep_mines", + 45, + false); + setDifficulties(List.of( + Map.of("name", "normal", "levelSync", 47, "id", 0), + Map.of("name", "hard", "levelSync", 45, "id", 1), + Map.of("name", "mythic", "levelSync", 43, "id", 2))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/TheMinesDungeon.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/TheMinesDungeon.java new file mode 100644 index 000000000..d2ffda0cd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/TheMinesDungeon.java @@ -0,0 +1,42 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class TheMinesDungeon extends DungeonPackagerConfigFields { + public TheMinesDungeon() { + super("the_mines_dungeon", + true, + "&2[lvl 020] &3The Mines Dungeon", + new ArrayList<>(List.of("&fReady to step up your dungeon game?", + "&6Credits: MagmaGuy, Frostcone, 69OzCanOfBepis, Realm of Lotheridon, Dali_")), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.DUNGEON, + "em_id_the_mines", + World.Environment.NORMAL, + true, + "em_id_the_mines,250.5,116,-113.5,-42.0,7.0", + "em_id_the_mines,256.5,116,-106.5,-29,8", + 0, + "Difficulty: &45-man hard content!", + "&bYou''ve been asked to investigate what lurks in the mines. Find your way to the depths of the mine!", + "&bYou have left The Mines!", + List.of("filename=the_mines_soulweaver_daine_p0.yml", + "filename=the_mines_boss_soulfire_p1.yml", + "filename=the_mines_mini_boss_tulpa.yml", + "filename=the_mines_mini_boss_forger.yml", + "filename=the_mines_mini_boss_tusk.yml"), + "em_id_the_mines", + 20, + false); + setDifficulties(List.of( + Map.of("name", "normal", "levelSync", 25, "id", 0), + Map.of("name", "hard", "levelSync", 20, "id", 1), + Map.of("name", "mythic", "levelSync", 15, "id", 2))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/TheNetherBellSanctum.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/TheNetherBellSanctum.java new file mode 100644 index 000000000..1f6238f42 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/TheNetherBellSanctum.java @@ -0,0 +1,38 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class TheNetherBellSanctum extends DungeonPackagerConfigFields { + public TheNetherBellSanctum() { + super("the_nether_bell_sanctum", + true, + "&2[lvl 055] &3The Nether Bell Sanctum", + new ArrayList<>(List.of("&fVenture into the deepest part of the Nether!", + "&6Credits: Dali_, MagmaGuy, Frostcone")), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.SANCTUM, + "em_id_the_nether_bell", + World.Environment.NORMAL, + true, + "em_id_the_nether_bell,231.5,87,-219.5,44,0", + "em_id_the_nether_bell,184.5,69,-192.5,43,0", + 0, + "Difficulty: &45-man hard content!", + "&bNo being should be this deep in the Nether...", + "&bYou have left The Nether Bell!", + List.of("filename=em_id_the_nether_bell_boss_void_bell_p1.yml"), + "em_id_the_nether_bell", + 55, + false); + setDifficulties(List.of( + Map.of("name", "normal", "levelSync", 57, "id", 0), + Map.of("name", "hard", "levelSync", 55, "id", 1), + Map.of("name", "mythic", "levelSync", 53, "id", 2))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/TheNetherWastes.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/TheNetherWastes.java new file mode 100644 index 000000000..77a6a4a04 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/TheNetherWastes.java @@ -0,0 +1,38 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class TheNetherWastes extends DungeonPackagerConfigFields { + public TheNetherWastes() { + super("the_nether_wastes_dungeon", + true, + "&2[lvl 050] &3The Nether Wastes Dungeon", + new ArrayList<>(List.of("&fAn unexplored part of the Nether.", + "&6Credits: MagmaGuy, Frostcone, Dali_")), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.DUNGEON, + "em_id_the_nether_wastes", + World.Environment.NORMAL, + true, + "em_id_the_nether_wastes,38.5,84,64.5,-155,0", + "em_id_the_nether_wastes,41.5,82.5,55.5,-167,0", + 0, + "Difficulty: &45-man hard content!", + "&bTraverse the wastes and see what you can find.", + "&bYou have left The Nether Wastes!", + List.of("filename=em_id_the_nether_wastes_miniboss_5_shroud_p1.yml"), + "em_id_the_nether_wastes", + 50, + false); + setDifficulties(List.of( + Map.of("name", "normal", "levelSync", 52, "id", 0), + Map.of("name", "hard", "levelSync", 50, "id", 1), + Map.of("name", "mythic", "levelSync", 48, "id", 2))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/ThePalaceSanctum.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/ThePalaceSanctum.java new file mode 100644 index 000000000..5e5957a54 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/ThePalaceSanctum.java @@ -0,0 +1,38 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class ThePalaceSanctum extends DungeonPackagerConfigFields { + public ThePalaceSanctum() { + super("the_palace_sanctum", + true, + "&2[lvl 030] &3The Palace Sanctum", + new ArrayList<>(List.of("&fThe perfect intermediate instanced sanctum!", + "&6Credits: Dali_, MagmaGuy, Frostcone")), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.SANCTUM, + "em_id_the_palace", + World.Environment.NORMAL, + true, + "em_id_the_palace,208.5,144,-101.5,-90.0,0.0", + "em_id_the_palace,238.5,144,-100.5,0.0,0.0", + 0, + "Difficulty: &45-man hard content!", + "&bBefore being able to enter the city you must deal with the guardian on the bridge!", + "&bYou have left The Palace!", + List.of("the_palace_old_stone_king_p1.yml"), + "em_id_the_palace", + 35, + false); + setDifficulties(List.of( + Map.of("name", "normal", "levelSync", 40, "id", 0), + Map.of("name", "hard", "levelSync", 35, "id", 1), + Map.of("name", "mythic", "levelSync", 30, "id", 2))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/TheQuarryDungeon.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/TheQuarryDungeon.java new file mode 100644 index 000000000..42a5f6e8b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/TheQuarryDungeon.java @@ -0,0 +1,40 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class TheQuarryDungeon extends DungeonPackagerConfigFields { + public TheQuarryDungeon() { + super("the_quarry_dungeon", + true, + "&2[lvl 040] &3The Quarry Dungeon", + new ArrayList<>(List.of("&fAn ancient dwarven quarry deep underground.", + "&6Credits: Dali_, MagmaGuy, Frostcone")), + DiscordLinks.freeMinidungeons, + DungeonSizeCategory.DUNGEON, + "em_id_the_quarry", + World.Environment.NORMAL, + true, + "em_id_the_quarry,230.5,144,102.5,-67,0", + "em_id_the_quarry,245.5,138,109.5,-90,30", + 0, + "Difficulty: &45-man hard content!", + "&bGo down into the quarry and get that lift working.", + "&bYou have left The Quarry!", + List.of("filename=em_id_the_quarry_quarry_smith.yml", + "filename=em_id_the_quarry_royal_wizard_three.yml", + "filename=LiftStateFinishDungeon.yml"), + "em_id_the_quarry", + 40, + false); + setDifficulties(List.of( + Map.of("name", "normal", "levelSync", 42, "id", 0), + Map.of("name", "hard", "levelSync", 40, "id", 1), + Map.of("name", "mythic", "levelSync", 37, "id", 2))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/UnderGroveLair.java b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/UnderGroveLair.java new file mode 100644 index 000000000..c926a47de --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/UnderGroveLair.java @@ -0,0 +1,30 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.World; + +import java.util.List; + +public class UnderGroveLair extends DungeonPackagerConfigFields { + public UnderGroveLair() { + super("under_grove_lair", + true, + "&2[lvl 170] &6The Under Grove", + List.of("&6Stop the dryad's ritual!"), + DiscordLinks.premiumMinidungeons, + DungeonSizeCategory.LAIR, + "em_under_grove", + World.Environment.NORMAL, + true, + "em_under_grove,-2.5,-38.8,35.5,90,0", + 0, + "Difficulty: &cHard\n" + + "$bossCount level $lowestTier Big Boss!\n" + + "&6The dryads are up to no good, stop them!", + "&8[EM] &aYou are now trespassing the sacred grove!", + "&8[EM] &aYou have left the sacred grove!", + "the_under_grove", + false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/VampireManorMinidungeon.off b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/VampireManorMinidungeon.off new file mode 100644 index 000000000..26eb8377e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/dungeonpackager/premade/VampireManorMinidungeon.off @@ -0,0 +1,160 @@ +package com.magmaguy.elitemobs.config.dungeonpackager.premade; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import org.bukkit.util.Vector; + +import java.util.Arrays; + +public class VampireManorMinidungeon extends DungeonPackagerConfigFields { + public VampireManorMinidungeon() { + super("vampire_manor", + true, + "&2[lvl 170] &cThe Vampire Manor", + new ArrayList<>(List.of("&fPrepare to spill blood!", + "&6Credits: MagmaGuy, 69OzCanOfBepis"), + new ArrayList<>(List.of( + "vampire_grunt.yml:5.0,0.0,20.0", + "vampire_grunt.yml:-5.0,0.0,20.0", + "vampire_brute.yml:17.0,0.0,29.0", + "vampire_brute.yml:17.0,0.0,19.0", + "vampire_brute.yml:35.0,0.0,61.0", + "vampire_grunt.yml:35.0,0.0,70.0", + "vampire_grunt.yml:30.0,0.0,68.0", + "vampire_brute.yml:16.0,14.0,77.0", + "vampire_brute.yml:0.0,14.0,79.0", + "vampire_brute.yml:-16.0,14.0,77.0", + "vampire_brute.yml:-31.0,12.0,72.0", + "vampire_grunt.yml:-31.0,12.0,83.0", + "vampire_grunt.yml:30.0,12.0,81.0", + "vampire_brute.yml:31.0,12.0,72.0", + "vampire_necromancer.yml:-26.0,0.0,43.0", + "vampire_necromancer.yml:-28.0,0.0,47.0", + "vampire_necromancer.yml:-23.0,12.0,39.0", + "vampire_necromancer.yml:-30.0,12.0,39.0", + "vampire_grunt.yml:-32.0,0.0,22.0", + "vampire_grunt.yml:-27.0,0.0,15.0", + "vampire_grunt.yml:-26.0,0.0,29.0", + "vampire_grunt.yml:-18.0,12.0,21.0", + "vampire_grunt.yml:-35.0,12.0,21.0", + "vampire_grunt.yml:4.0,-11.0,57.0", + "vampire_grunt.yml:12.0,-11.0,66.0", + "vampire_fledgling.yml:5.0,-10.0,54.0", + "vampire_fledgling.yml:14.0,-12.0,70.0", + "vampire_fledgling.yml:6.0,-11.0,65.0", + "vampire_fledgling.yml:6.0,-13.0,87.0", + "vampire_fledgling.yml:-7.0,-12.0,89.0", + "vampire_fledgling.yml:-20.0,-10.0,81.0", + "vampire_necromancer.yml:-46.0,-9.0,24.0", + "vampire_necromancer.yml:-40.0,-9.0,18.0", + "vampire_necromancer.yml:-33.0,-9.0,24.0", + "vampire_grunt.yml:-35.0,-9.0,28.0", + "vampire_grunt.yml:-44.0,-9.0,28.0", + "vampire_grunt.yml:-45.0,-9.0,18.0", + "vampire_grunt.yml:-34.0,-9.0,17.0", + "vampire_grunt.yml:-14.0,0.0,62.0", + "vampire_grunt.yml:0.0,0.0,62.0", + "vampire_grunt.yml:13.0,0.0,62.0", + "vampire_brute.yml:0.0,2.0,78.0", + "vampire_brute.yml:-16.0,2.0,78.0", + "vampire_brute.yml:16.0,2.0,78.0", + "vampire_grunt.yml:35.0,0.0,33.0", + "vampire_grunt.yml:35.0,0.0,22.0", + "vampire_grunt.yml:31.0,0.0,13.0", + "vampire_grunt.yml:30.0,0.0,46.0", + "vampire_grunt.yml:25.0,0.0,36.0", + "vampire_necromancer.yml:30.0,1.0,30.0", + "vampire_grunt.yml:24.0,12.0,54.0", + "vampire_grunt.yml:17.0,12.0,42.0", + "vampire_grunt.yml:17.0,12.0,28.0", + "vampire_grunt.yml:-11.0,6.0,31.0", + "vampire_grunt.yml:10.0,6.0,31.0", + "vampire_grunt.yml:-30.0,0.0,67.0", + "vampire_grunt.yml:-33.0,0.0,76.0", + "vampire_grunt.yml:30.0,-11.0,33.0", + "vampire_grunt.yml:24.0,-11.0,33.0", + "vampire_necromancer.yml:19.0,-13.0,22.0", + "vampire_necromancer.yml:36.0,-13.0,23.0", + "vampire_grunt.yml:31.0,-11.0,13.0", + "vampire_grunt.yml:23.0,-11.0,14.0", + "vampire_necromancer.yml:2.0,-15.0,23.0", + "vampire_necromancer.yml:-26.0,-10.0,54.0", + "vampire_necromancer.yml:-9.0,46.0,48.0", + "vampire_brute.yml:-10.0,46.0,62.0", + "vampire_brute.yml:-9.0,46.0,33.0", + "vampire_brute.yml:13.0,61.0,48.0", + "vampire_brute.yml:0.0,61.0,60.0", + "vampire_necromancer_dining_hall.yml:17.0,12.0,17.0", + "vampire_necromancer_left_bedroom.yml:32.0,13.0,65.0", + "vampire_necromancer_right_bedroom.yml:-32.0,13.0,65.0", + "vampire_necromancer_supply_room.yml:-27.0,0.0,82.0", + "vampire_necromancer_gargoyle_rush.yml:-40.0,-9.0,57.0", + "vampire_brute_gargoyle_rush_right.yml:-38.0,-9.0,57.0", + "vampire_brute_gargoyle_rush_left.yml:-42.0,-9.0,57.0", + "vampire_grunt_gargoyle_rush_right.yml:-36.0,-9.0,57.0", + "vampire_grunt_gargoyle_rush_left.yml:-44.0,-9.0,57.0", + "vampire_king.yml:-13.0,30.0,48.0", + "vampire_wraith.yml:-47.0,-20.0,52.0", + "vampire_brute.yml:-18.0,12.0,16.0", + "vampire_necromancer_supreme_coffin_breaker.yml:2.0,-15.0,23.0", + "vampire_necromancer_supreme_gargoyle_overlord.yml:58.0,-15.0,23.0", + "vampire_fledgling_gargoyle_overlord.yml:58.0,-15.0,16.0", + "vampire_fledgling_gargoyle_overlord.yml:52.0,-15.0,16.0", + "vampire_fledgling_gargoyle_overlord.yml:48.0,-15.0,20.0", + "vampire_fledgling_gargoyle_overlord.yml:48.0,-15.0,26.0", + "vampire_fledgling_gargoyle_overlord.yml:52.0,-15.0,30.0", + "vampire_fledgling_gargoyle_overlord.yml:58.0,-15.0,30.0", + "vampire_fledgling_gargoyle_overlord.yml:48.0,-15.0,20.0", + "vampire_zombie.yml:-7.0,-25.0,65.0", + "vampire_zombie.yml:-19.0,-25.0,68.0", + "vampire_zombie.yml:-14.0,-25.0,51.0", + "vampire_zombie.yml:-2.0,-24.0,78.0", + "vampire_zombie.yml:-4.0,-26.0,43.0", + "vampire_zombie.yml:7.0,-24.0,78.0", + "vampire_zombie.yml:-30.0,-18.0,44.0", + "vampire_zombie.yml:-31.0,-18.0,34.0", + "vampire_zombie.yml:-26.0,-18.0,57.0", + "vampire_necromancer_entrance.yml:0.0,8.0,32.0", + "vampire_necromancer_foresight_pool.yml:-19.0,0.0,22.0", + "vampire_brute.yml:0.0,61.0,35.0", + "vampire_brute.yml:17.0,26.0,9.0", + "vampire_brute.yml:-17.0,26.0,9.0", + "vampire_brute.yml:-39.0,26.0,31.0", + "vampire_brute.yml:-39.0,26.0,65.0", + "vampire_brute.yml:-17.0,26.0,87.0", + "vampire_brute.yml:17.0,26.0,87.0", + "vampire_brute.yml:39.0,26.0,65.0", + "vampire_brute.yml:39.0,26.0,31.0"), + new ArrayList<>(List.of( + "vampire_manor_south.yml:16.5,11.5,13.5", + "vampire_manor_west.yml:-17.5,11.5,20.5", + "vampire_manor_east.yml:-28.5,-0.5,44.5", + "vampire_manor_north.yml:26.5,11.5,83.5", + "vampire_manor_north.yml:-27.5,11.5,83.5", + "vampire_manor_north.yml:-0.5,25.5,93.5", + "vampire_manor_north.yml:-0.5,60.5,37.5", + "vampire_manor_south.yml:-0.5,25.5,1.5", + "vampire_manor_south.yml:-0.5,60.5,57.5", + "vampire_manor_east.yml:-46.5,25.5,47.5", + "vampire_manor_west.yml:-10.5,60.5,47.5", + "vampire_manor_west.yml:45.5,25.5,47.5", + "vampire_manor_east.yml:-54.5,-19.5,54.5", + "vampire_manor_south.yml:-3.5,-25.5,37.5"), + DiscordLinks.premiumMinidungeons, + DungeonSizeCategory.MINIDUNGEON, + "em_vampire_manor.schem", + true, + new Vector(67, -28, 0), + new Vector(-57, 112, 97), + "0,0,0,0,0", + 0, + "Difficulty: &6Medium\n" + + "$bossCount bosses, from level $lowestTier to $highestTier\n" + + "&6A deadly manor full of blood thristy creatures!\n" + + "&6Are you ready to face that which haunts the night?", + "&8[EM] &cTrespassing on dangerous grounds!!", + "&8[EM] &cNow leaving haunted land!", + SchematicPackage.SchematicRotation.SOUTH.toString(), + "vampire_manor"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/EnchantmentsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/EnchantmentsConfig.java new file mode 100644 index 000000000..737597ab8 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/EnchantmentsConfig.java @@ -0,0 +1,38 @@ +package com.magmaguy.elitemobs.config.enchantments; + +import com.magmaguy.elitemobs.config.LegacyValueConverter; +import com.magmaguy.magmacore.config.CustomConfig; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.enchantments.Enchantment; + +import java.util.HashMap; +import java.util.Locale; + +public class EnchantmentsConfig extends CustomConfig { + + @Getter + private static HashMap enchantments = new HashMap(); + + public EnchantmentsConfig() { + super("enchantments", "com.magmaguy.elitemobs.config.enchantments.premade", EnchantmentsConfigFields.class); + enchantments = new HashMap<>(); + for (String key : super.getCustomConfigFieldsHashMap().keySet()) + enchantments.put(key, (EnchantmentsConfigFields) super.getCustomConfigFieldsHashMap().get(key)); + } + + public static EnchantmentsConfigFields getEnchantment(String string) { + String newString = LegacyValueConverter.parseEnchantment(string.replace(".yml", "")) + ".yml"; + newString = newString.toLowerCase(Locale.ROOT); + EnchantmentsConfigFields test = enchantments.get(newString); + if (test == null) { + Logger.warn("Failed to find enchant file " + newString); + new Exception().printStackTrace(); + } + return enchantments.get(newString); + } + + public static EnchantmentsConfigFields getEnchantment(Enchantment enchantment) { + return getEnchantment(enchantment.getKey().getKey().toLowerCase(Locale.ROOT) + ".yml"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/EnchantmentsConfigFields.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/EnchantmentsConfigFields.java new file mode 100644 index 000000000..206f08ddc --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/EnchantmentsConfigFields.java @@ -0,0 +1,59 @@ +package com.magmaguy.elitemobs.config.enchantments; + +import com.magmaguy.elitemobs.config.CustomConfigFields; +import lombok.Getter; +import org.bukkit.enchantments.Enchantment; + +import java.util.Locale; + +public class EnchantmentsConfigFields extends CustomConfigFields { + @Getter + private String name = "name"; + @Getter + private int maxLevel = 5; + @Getter + private double value = 1; + @Getter + private Enchantment enchantment = null; + @Getter + private boolean isEnabledForProcedurallyGeneratedItems = false; + @Getter + private int maxEnchantmentLevel; + + public EnchantmentsConfigFields(String filename, + boolean isEnabled, + String name, + int maxLevel, + double value, + boolean isEnabledForProcedurallyGeneratedItems, + int maxEnchantmentLevel) { + super(filename, isEnabled); + this.isEnabled = isEnabled; + this.name = name; + this.maxLevel = maxLevel; + this.value = value; + this.isEnabledForProcedurallyGeneratedItems = isEnabledForProcedurallyGeneratedItems; + this.maxEnchantmentLevel = maxEnchantmentLevel; + } + + @Override + public void processConfigFields() { + this.isEnabled = processBoolean("isEnabled", isEnabled, true, true); + this.name = translatable(filename, "name", processString("name", name, "name", true)); + this.maxLevel = processInt("maxLevelV2", maxLevel, 1, true); + String cleanName = this.filename.replace(".yml", "").toUpperCase(Locale.ROOT); + try { + this.enchantment = Enchantment.getByName(cleanName); + } catch (Exception ex) { + this.enchantment = null; + } + this.value = processDouble("value", value, 1, true); + this.isEnabledForProcedurallyGeneratedItems = processBoolean("isEnabledForProcedurallyGeneratedItems", isEnabledForProcedurallyGeneratedItems, false, true); + this.maxEnchantmentLevel = processInt("maxEnchantmentLevel", maxEnchantmentLevel, 1, false); + processAdditionalFields(); + } + + public void processAdditionalFields() { + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/AquaAffinityConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/AquaAffinityConfig.java new file mode 100644 index 000000000..74376999f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/AquaAffinityConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class AquaAffinityConfig extends EnchantmentsConfigFields { + public AquaAffinityConfig() { + super("aqua_affinity", + true, + "Aqua Affinity", + 1, + 6, + true, + 1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/BaneOfArthropodsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/BaneOfArthropodsConfig.java new file mode 100644 index 000000000..38ca2926e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/BaneOfArthropodsConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class BaneOfArthropodsConfig extends EnchantmentsConfigFields { + public BaneOfArthropodsConfig() { + super("bane_of_arthropods", + true, + "Bane of Arthropods", + 4, + 6, + true, + 100); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/BindingCurseConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/BindingCurseConfig.java new file mode 100644 index 000000000..2ccab6567 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/BindingCurseConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class BindingCurseConfig extends EnchantmentsConfigFields { + public BindingCurseConfig() { + super("binding_curse", + true, + "Curse of Binding", + 1, + -6, + true, + 1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/BlastProtectionConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/BlastProtectionConfig.java new file mode 100644 index 000000000..14c9161fe --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/BlastProtectionConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class BlastProtectionConfig extends EnchantmentsConfigFields { + public BlastProtectionConfig() { + super("blast_protection", + true, + "Blast Protection", + 4, + 6, + true, + 100); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/BreachConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/BreachConfig.java new file mode 100644 index 000000000..19f16c105 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/BreachConfig.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; +import org.bukkit.enchantments.Enchantment; + +public class BreachConfig extends EnchantmentsConfigFields { + public BreachConfig() { + super("breach", + true, + "Breach", + 4, + 6, + true, + Enchantment.BREACH.getMaxLevel()); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/ChannelingConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/ChannelingConfig.java new file mode 100644 index 000000000..f74b7ac15 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/ChannelingConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class ChannelingConfig extends EnchantmentsConfigFields { + public ChannelingConfig() { + super("channeling", + true, + "Channeling", + 1, + 6, + true, + 1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/CriticalStrikesConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/CriticalStrikesConfig.java new file mode 100644 index 000000000..ab91d072d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/CriticalStrikesConfig.java @@ -0,0 +1,28 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; +import lombok.Getter; + +public class CriticalStrikesConfig extends EnchantmentsConfigFields { + @Getter + private static String criticalHitPopup; + @Getter + private static String criticalHitColor; + + public CriticalStrikesConfig() { + super("critical_strikes", + true, + "Critical Strikes", + 2, + 13, + true, + 3); + } + + @Override + public void processAdditionalFields() { + criticalHitPopup = ConfigurationEngine.setString(file, super.fileConfiguration, "criticalHitPopup", "&5Critical Hit!", true); + criticalHitColor = ConfigurationEngine.setString(file, super.fileConfiguration, "criticalHitColor", "&5", false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/DensityConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/DensityConfig.java new file mode 100644 index 000000000..8b29b8e5c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/DensityConfig.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; +import org.bukkit.enchantments.Enchantment; + +public class DensityConfig extends EnchantmentsConfigFields { + public DensityConfig() { + super("density", + true, + "Density", + 4, + 6, + true, + Enchantment.DENSITY.getMaxLevel()); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/DepthStriderConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/DepthStriderConfig.java new file mode 100644 index 000000000..8cdddc6ba --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/DepthStriderConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class DepthStriderConfig extends EnchantmentsConfigFields { + public DepthStriderConfig() { + super("depth_strider", + true, + "Depth Strider", + 3, + 6, + true, + 3); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/DrillingConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/DrillingConfig.java new file mode 100644 index 000000000..d8f9691b9 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/DrillingConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class DrillingConfig extends EnchantmentsConfigFields { + public DrillingConfig() { + super("drilling", + true, + "Drilling", + 4, + 15, + false, + 4); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/EarthquakeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/EarthquakeConfig.java new file mode 100644 index 000000000..f949f9e91 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/EarthquakeConfig.java @@ -0,0 +1,29 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; +import lombok.Getter; + +public class EarthquakeConfig extends EnchantmentsConfigFields { + @Getter + private static String earthquakeActivationMessage; + @Getter + private static String earthquakeAvailableMessage; + + public EarthquakeConfig() { + super("earthquake", + true, + "Earthquake", + 5, + 50, + false, + 5); + } + + @Override + public void processAdditionalFields() { + earthquakeActivationMessage = ConfigurationEngine.setString(file, fileConfiguration, "earthquakeActivationMessage", "&8[EliteMobs] &aEarthquake triggered! &c2 min cooldown!", true); + earthquakeAvailableMessage = ConfigurationEngine.setString(file, fileConfiguration, "earthquakeAvailableMessage", "&8[EliteMobs] &2Earthquake cooldown over!", true); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/EfficiencyConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/EfficiencyConfig.java new file mode 100644 index 000000000..b6d19f9ba --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/EfficiencyConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class EfficiencyConfig extends EnchantmentsConfigFields { + public EfficiencyConfig() { + super("efficiency", + true, + "Efficiency", + 5, + 13, + false, + 5); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/EnchantedSourceConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/EnchantedSourceConfig.java new file mode 100644 index 000000000..ffc8871e6 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/EnchantedSourceConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class EnchantedSourceConfig extends EnchantmentsConfigFields { + public EnchantedSourceConfig() { + super("enchanted_source", + true, + "Enchanted Source", + 1, + 10, + true, + 1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/FeatherFallingConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/FeatherFallingConfig.java new file mode 100644 index 000000000..bd1902ae7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/FeatherFallingConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class FeatherFallingConfig extends EnchantmentsConfigFields { + public FeatherFallingConfig() { + super("feather_falling", + true, + "Feather Falling", + 4, + 6, + true, + 100); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/FireAspectConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/FireAspectConfig.java new file mode 100644 index 000000000..f59bb0319 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/FireAspectConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class FireAspectConfig extends EnchantmentsConfigFields { + public FireAspectConfig() { + super("fire_aspect", + true, + "Fire Aspect", + 2, + 6, + true, + 2); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/FireProtectionConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/FireProtectionConfig.java new file mode 100644 index 000000000..059643cea --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/FireProtectionConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class FireProtectionConfig extends EnchantmentsConfigFields { + public FireProtectionConfig() { + super("fire_protection", + true, + "Fire Protection", + 4, + 6, + true, + 4); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/FlameConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/FlameConfig.java new file mode 100644 index 000000000..22134720f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/FlameConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class FlameConfig extends EnchantmentsConfigFields { + public FlameConfig() { + super("flame", + true, + "Flame", + 1, + 6, + true, + 1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/FlamethrowerConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/FlamethrowerConfig.java new file mode 100644 index 000000000..0cde9a068 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/FlamethrowerConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class FlamethrowerConfig extends EnchantmentsConfigFields { + public FlamethrowerConfig() { + super("flamethrower", + true, + "Flamethrower", + 1, + 20, + false, + 1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/FortuneConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/FortuneConfig.java new file mode 100644 index 000000000..f221c41ba --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/FortuneConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class FortuneConfig extends EnchantmentsConfigFields { + public FortuneConfig() { + super("fortune", + true, + "Fortune", + 3, + 13, + false, + 3); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/FrostWalkerConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/FrostWalkerConfig.java new file mode 100644 index 000000000..6a1bedc7f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/FrostWalkerConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class FrostWalkerConfig extends EnchantmentsConfigFields { + public FrostWalkerConfig() { + super("frost_walker", + true, + "Frost Walker", + 2, + 6, + true, + 2); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/GrapplingHookConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/GrapplingHookConfig.java new file mode 100644 index 000000000..6cfa6dc8e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/GrapplingHookConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class GrapplingHookConfig extends EnchantmentsConfigFields { + public GrapplingHookConfig() { + super("grappling_hook", + true, + "Grappling Hook", + 1, + 10, + false, + 1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/HunterConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/HunterConfig.java new file mode 100644 index 000000000..44a1e6fd3 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/HunterConfig.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class HunterConfig extends EnchantmentsConfigFields { + public static double hunterSpawnBonus; + + public HunterConfig() { + super("hunter", + true, + "Hunter", + 3, + 10, + true, + 3); + } + + @Override + public void processAdditionalFields() { + hunterSpawnBonus = ConfigurationEngine.setDouble(super.fileConfiguration, "hunterSpawnBonus", 0.05); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/IceBreakerConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/IceBreakerConfig.java new file mode 100644 index 000000000..3cd59ac52 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/IceBreakerConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class IceBreakerConfig extends EnchantmentsConfigFields { + public IceBreakerConfig() { + super("ice_breaker", + true, + "Ice Breaker", + 2, + 10, + false, + 2); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/ImpalingConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/ImpalingConfig.java new file mode 100644 index 000000000..140bebd34 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/ImpalingConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class ImpalingConfig extends EnchantmentsConfigFields { + public ImpalingConfig() { + super("impaling", + true, + "Impaling", + 5, + 6, + true, + 5); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/InfinityConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/InfinityConfig.java new file mode 100644 index 000000000..6672c71b7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/InfinityConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class InfinityConfig extends EnchantmentsConfigFields { + public InfinityConfig() { + super("infinity", + true, + "Infinity", + 1, + 6, + true, + 1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/KnockbackConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/KnockbackConfig.java new file mode 100644 index 000000000..f5b840870 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/KnockbackConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class KnockbackConfig extends EnchantmentsConfigFields { + public KnockbackConfig() { + super("knockback", + true, + "Knockback", + 2, + 6, + true, + 10); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/LightningConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/LightningConfig.java new file mode 100644 index 000000000..7edf15fe6 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/LightningConfig.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class LightningConfig extends EnchantmentsConfigFields { + public static int minimumCooldown; + + public LightningConfig() { + super("lightning", + true, + "Lightning", + 5, + 15, + true, + 5); + } + + @Override + public void processAdditionalFields() { + minimumCooldown = ConfigurationEngine.setInt(super.fileConfiguration, "minimumCooldownSeconds", 60 * 2); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/LootingConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/LootingConfig.java new file mode 100644 index 000000000..742fb8ede --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/LootingConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class LootingConfig extends EnchantmentsConfigFields { + public LootingConfig() { + super("looting", + true, + "Looting", + 3, + 6, + true, + 3); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/LoudStrikesConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/LoudStrikesConfig.java new file mode 100644 index 000000000..d4734bc92 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/LoudStrikesConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class LoudStrikesConfig extends EnchantmentsConfigFields { + public LoudStrikesConfig() { + super("loud_strikes", + true, + "Loud Strikes", + 3, + 6, + false, + 10); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/LoyaltyConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/LoyaltyConfig.java new file mode 100644 index 000000000..54e4a0624 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/LoyaltyConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class LoyaltyConfig extends EnchantmentsConfigFields { + public LoyaltyConfig() { + super("loyalty", + true, + "Loyalty", + 3, + 6, + true, + 3); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/LuckOfTheSeaConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/LuckOfTheSeaConfig.java new file mode 100644 index 000000000..e5b925fc7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/LuckOfTheSeaConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class LuckOfTheSeaConfig extends EnchantmentsConfigFields { + public LuckOfTheSeaConfig() { + super("luck_of_the_sea", + true, + "Luck of the Sea", + 3, + 6, + true, + 3); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/LuckySourceConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/LuckySourceConfig.java new file mode 100644 index 000000000..447bf087d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/LuckySourceConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class LuckySourceConfig extends EnchantmentsConfigFields { + public LuckySourceConfig() { + super("lucky_source", + true, + "Lucky Source", + 1, + 20, + false, + 1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/LureConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/LureConfig.java new file mode 100644 index 000000000..a659cf793 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/LureConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class LureConfig extends EnchantmentsConfigFields { + public LureConfig() { + super("lure", + true, + "Lure", + 3, + 6, + true, + 3); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/MendingConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/MendingConfig.java new file mode 100644 index 000000000..421b0d923 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/MendingConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class MendingConfig extends EnchantmentsConfigFields { + public MendingConfig() { + super("mending", + false, + "Mending", + 1, + 13, + false, + 1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/MeteorShowerConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/MeteorShowerConfig.java new file mode 100644 index 000000000..75f0f81a1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/MeteorShowerConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class MeteorShowerConfig extends EnchantmentsConfigFields { + public MeteorShowerConfig() { + super("meteor_shower", + true, + "Meteor Shower", + 1, + 130, + false, + 1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/MultishotConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/MultishotConfig.java new file mode 100644 index 000000000..efc78826c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/MultishotConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class MultishotConfig extends EnchantmentsConfigFields { + public MultishotConfig() { + super("multishot", + true, + "Multishot", + 1, + 6, + true, + 1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/PiercingConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/PiercingConfig.java new file mode 100644 index 000000000..baac22235 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/PiercingConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class PiercingConfig extends EnchantmentsConfigFields { + public PiercingConfig() { + super("piercing", + true, + "Piercing", + 4, + 6, + true, + 4); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/PlasmaBootsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/PlasmaBootsConfig.java new file mode 100644 index 000000000..2e19737a2 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/PlasmaBootsConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class PlasmaBootsConfig extends EnchantmentsConfigFields { + public PlasmaBootsConfig() { + super("plasma_boots", + true, + "Plasma Boots", + 3, + 20, + false, + 3); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/PowerConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/PowerConfig.java new file mode 100644 index 000000000..8af3d4a8d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/PowerConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class PowerConfig extends EnchantmentsConfigFields { + public PowerConfig() { + super("power", + true, + "Power", + 5, + 13, + true, + 100); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/ProjectileProtectionConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/ProjectileProtectionConfig.java new file mode 100644 index 000000000..eb6d4fb9e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/ProjectileProtectionConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class ProjectileProtectionConfig extends EnchantmentsConfigFields { + public ProjectileProtectionConfig() { + super("projectile_protection", + true, + "Projectile Protection", + 4, + 6, + true, + 100); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/ProtectionConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/ProtectionConfig.java new file mode 100644 index 000000000..85d3ea55a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/ProtectionConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class ProtectionConfig extends EnchantmentsConfigFields { + public ProtectionConfig() { + super("protection", + true, + "Protection", + 4, + 13, + true, + 100); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/PunchConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/PunchConfig.java new file mode 100644 index 000000000..d81de603d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/PunchConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class PunchConfig extends EnchantmentsConfigFields { + public PunchConfig() { + super("punch", + true, + "Punch", + 2, + 6, + true, + 10); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/QuickChargeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/QuickChargeConfig.java new file mode 100644 index 000000000..7557275d5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/QuickChargeConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class QuickChargeConfig extends EnchantmentsConfigFields { + public QuickChargeConfig() { + super("quick_charge", + true, + "Quick Charge", + 3, + 6, + true, + 3); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/RepairConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/RepairConfig.java new file mode 100644 index 000000000..ba40be12b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/RepairConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class RepairConfig extends EnchantmentsConfigFields { + public RepairConfig() { + super("repair", + true, + "Repair", + 5, + 15, + false, + 5); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/RespirationConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/RespirationConfig.java new file mode 100644 index 000000000..6f4b8edd7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/RespirationConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class RespirationConfig extends EnchantmentsConfigFields { + public RespirationConfig() { + super("respiration", + true, + "Respiration", + 3, + 6, + true, + 3); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/RiptideConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/RiptideConfig.java new file mode 100644 index 000000000..57323c218 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/RiptideConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class RiptideConfig extends EnchantmentsConfigFields { + public RiptideConfig() { + super("riptide", + true, + "Riptide", + 3, + 6, + true, + 3); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/SharpnessConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/SharpnessConfig.java new file mode 100644 index 000000000..79a08a039 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/SharpnessConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class SharpnessConfig extends EnchantmentsConfigFields { + public SharpnessConfig() { + super("sharpness", + true, + "Sharpness", + 5, + 13, + true, + 100); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/SilkTouchConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/SilkTouchConfig.java new file mode 100644 index 000000000..ec5bfbe76 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/SilkTouchConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class SilkTouchConfig extends EnchantmentsConfigFields { + public SilkTouchConfig() { + super("silk_touch", + true, + "Silk Touch", + 1, + 13, + true, + 1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/SmiteConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/SmiteConfig.java new file mode 100644 index 000000000..b627ba294 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/SmiteConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class SmiteConfig extends EnchantmentsConfigFields { + public SmiteConfig() { + super("smite", + true, + "Smite", + 4, + 6, + true, + 100); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/SoulSpeedConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/SoulSpeedConfig.java new file mode 100644 index 000000000..2f398770d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/SoulSpeedConfig.java @@ -0,0 +1,14 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class SoulSpeedConfig extends EnchantmentsConfigFields { + public SoulSpeedConfig() { + super("soul_speed", + true, "Soul Speed", + 3, + 6, + true, + 3); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/SoulbindConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/SoulbindConfig.java new file mode 100644 index 000000000..b5d3b35d4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/SoulbindConfig.java @@ -0,0 +1,24 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class SoulbindConfig extends EnchantmentsConfigFields { + public static String loreStrings; + public static String hologramStrings; + + public SoulbindConfig() { + super("soulbind", + true, + "Soulbind", + 1, + 10, + true, + 1); + } + + @Override + public void processAdditionalFields() { + loreStrings = translatable(filename, "name", processString("loreStrings", "&7Soulbound to &f$player", null, true)); + hologramStrings = translatable(filename, "name", processString("hologramString", "$player&f's", null, true)); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/SummonMerchantConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/SummonMerchantConfig.java new file mode 100644 index 000000000..28005e9e5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/SummonMerchantConfig.java @@ -0,0 +1,24 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class SummonMerchantConfig extends EnchantmentsConfigFields { + public static String message; + + public SummonMerchantConfig() { + super("summon_merchant", + true, + "Summon Merchant", + 1, + 10, + false, + 1); + + } + + @Override + public void processAdditionalFields() { + message = ConfigurationEngine.setString(file, super.fileConfiguration, "message", "Jeeves!", true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/SummonWolfConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/SummonWolfConfig.java new file mode 100644 index 000000000..3bdbdd595 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/SummonWolfConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class SummonWolfConfig extends EnchantmentsConfigFields { + public SummonWolfConfig() { + super("summon_wolf", + true, + "Summon Wolf", + 1, + 20, + false, + 1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/SweepingEdgeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/SweepingEdgeConfig.java new file mode 100644 index 000000000..89840e5c7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/SweepingEdgeConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class SweepingEdgeConfig extends EnchantmentsConfigFields { + public SweepingEdgeConfig() { + super("sweeping_edge", + true, + "Sweeping Edge", + 3, + 6, + true, + 3); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/ThornsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/ThornsConfig.java new file mode 100644 index 000000000..be1bc93b7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/ThornsConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class ThornsConfig extends EnchantmentsConfigFields { + public ThornsConfig() { + super("thorns", + true, + "Thorns", + 3, + 6, + true, + 10); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/UnbindConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/UnbindConfig.java new file mode 100644 index 000000000..d3df5689e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/UnbindConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class UnbindConfig extends EnchantmentsConfigFields { + public UnbindConfig() { + super("unbind", + true, + "Unbind", + 1, + 10000, + false, + 1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/UnbreakingConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/UnbreakingConfig.java new file mode 100644 index 000000000..8cbc168fc --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/UnbreakingConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class UnbreakingConfig extends EnchantmentsConfigFields { + public UnbreakingConfig() { + super("unbreaking", + true, + "Unbreaking", + 3, + 13, + true, + 10); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/VanishingCurseConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/VanishingCurseConfig.java new file mode 100644 index 000000000..f3c084782 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/VanishingCurseConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; + +public class VanishingCurseConfig extends EnchantmentsConfigFields { + public VanishingCurseConfig() { + super("vanishing_curse", + true, + "Curse of Vanishing", + 1, + -1, + true, + 1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/WindBurstConfig.java b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/WindBurstConfig.java new file mode 100644 index 000000000..193933fbb --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/enchantments/premade/WindBurstConfig.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.config.enchantments.premade; + +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; +import org.bukkit.enchantments.Enchantment; + +public class WindBurstConfig extends EnchantmentsConfigFields { + public WindBurstConfig() { + super("wind_burst", + true, + "Wind Burst", + 4, + 6, + true, + Enchantment.WIND_BURST.getMaxLevel()); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/menus/MenusConfig.java b/src/main/java/com/magmaguy/elitemobs/config/menus/MenusConfig.java new file mode 100644 index 000000000..d6938973d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/menus/MenusConfig.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.config.menus; + +import com.magmaguy.magmacore.config.CustomConfig; + +import java.util.HashMap; + +public class MenusConfig extends CustomConfig { + + private static HashMap menusConfigFields = new HashMap<>(); + + public MenusConfig() { + super("menus", "com.magmaguy.elitemobs.config.menus.premade", MenusConfigFields.class); + menusConfigFields = new HashMap<>(); + for (String key : super.getCustomConfigFieldsHashMap().keySet()) + menusConfigFields.put(key, (MenusConfigFields) super.getCustomConfigFieldsHashMap().get(key)); + } + + public static HashMap getCustomQuests() { + return menusConfigFields; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/menus/MenusConfigFields.java b/src/main/java/com/magmaguy/elitemobs/config/menus/MenusConfigFields.java new file mode 100644 index 000000000..20b0a5631 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/menus/MenusConfigFields.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.menus; + +import com.magmaguy.elitemobs.config.CustomConfigFields; + +public class MenusConfigFields extends CustomConfigFields { + + public MenusConfigFields(String fileName, boolean isEnabled) { + super(fileName, isEnabled); + } + + @Override + public void processConfigFields() { + this.isEnabled = processBoolean("isEnabled", isEnabled, true, true); + processAdditionalFields(); + } + + public void processAdditionalFields() { + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/menus/premade/ArenaMenuConfig.java b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/ArenaMenuConfig.java new file mode 100644 index 000000000..05f5f9dd2 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/ArenaMenuConfig.java @@ -0,0 +1,40 @@ +package com.magmaguy.elitemobs.config.menus.premade; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.menus.MenusConfigFields; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import lombok.Getter; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import java.util.List; + +public class ArenaMenuConfig extends MenusConfigFields { + @Getter + private static String menuName; + @Getter + private static ItemStack playerItem; + @Getter + private static int playerItemSlot; + @Getter + private static ItemStack spectatorItem; + @Getter + private static int spectatorItemSlot; + + public ArenaMenuConfig() { + super("arena_menu", true); + } + + @Override + public void processAdditionalFields() { + menuName = ConfigurationEngine.setString(file, fileConfiguration, "menuName", "", true); + playerItem = ConfigurationEngine.setItemStack(file, fileConfiguration, "playerItem", + ItemStackGenerator.generateItemStack(Material.DIAMOND_SWORD, "&4Challenge the arena!", List.of("&2Fight in the arena!")), true); + playerItemSlot = ConfigurationEngine.setInt(fileConfiguration, "playerItemSlot", 6); + spectatorItem = ConfigurationEngine.setItemStack(file, fileConfiguration, "spectatorItem", + ItemStackGenerator.generateItemStack(Material.SPYGLASS, "&aSpectate!", List.of("&2Spectate players in the arena!"), MetadataHandler.signatureID), true); + spectatorItemSlot = ConfigurationEngine.setInt(fileConfiguration, "spectatorItemSlot", 2); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/menus/premade/BuyOrSellMenuConfig.java b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/BuyOrSellMenuConfig.java new file mode 100644 index 000000000..2979c22b6 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/BuyOrSellMenuConfig.java @@ -0,0 +1,54 @@ +package com.magmaguy.elitemobs.config.menus.premade; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.menus.MenusConfigFields; +import com.magmaguy.elitemobs.utils.ItemStackSerializer; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class BuyOrSellMenuConfig extends MenusConfigFields { + public static String SHOP_NAME; + public static ItemStack INFORMATION_ITEM; + public static int INFORMATION_SLOT; + public static ItemStack BUY_PROCEDURAL_ITEM; + public static ItemStack BUY_CUSTOM_ITEM; + public static int BUY_SLOT; + public static ItemStack SELL_ITEM; + public static int SELL_SLOT; + + public BuyOrSellMenuConfig() { + super("buy_or_sell_menu", true); + } + + @Override + public void processAdditionalFields() { + SHOP_NAME = ConfigurationEngine.setString(file, fileConfiguration, "Shop name", "[EM] Buy or Sell", true); + ItemStackSerializer.serialize( + "Information button", + ItemStackGenerator.generateSkullItemStack("magmaguy", + "&4&lEliteMobs &r&cby &4&lMagmaGuy", + new ArrayList<>(List.of("&8Support the plugins you enjoy!", + "&aClick on the emerald to buy items!", + "&cClick on the redstone to sell items!")), MetadataHandler.signatureID), + fileConfiguration); + INFORMATION_ITEM = ItemStackSerializer.deserialize("Information button", fileConfiguration); + INFORMATION_SLOT = ConfigurationEngine.setInt(fileConfiguration, "Information button slot", 4); + ItemStackSerializer.serialize("Buy procedurally generated items", + ItemStackGenerator.generateItemStack(Material.EMERALD, "Buy items", new ArrayList<>(), MetadataHandler.signatureID), fileConfiguration); + BUY_PROCEDURAL_ITEM = ItemStackSerializer.deserialize("Buy procedurally generated items", fileConfiguration); + ItemStackSerializer.serialize("Buy custom items", + ItemStackGenerator.generateItemStack(Material.EMERALD, "Buy custom items", new ArrayList<>(), MetadataHandler.signatureID), fileConfiguration); + BUY_CUSTOM_ITEM = ItemStackSerializer.deserialize("Buy custom items", fileConfiguration); + ItemStackSerializer.serialize("Sell items", + ItemStackGenerator.generateItemStack(Material.REDSTONE, "Sell items", new ArrayList<>(), MetadataHandler.signatureID), fileConfiguration); + SELL_ITEM = ItemStackSerializer.deserialize("Sell items", fileConfiguration); + BUY_SLOT = ConfigurationEngine.setInt(fileConfiguration, "Buy slot", 11); + SELL_SLOT = ConfigurationEngine.setInt(fileConfiguration, "Sell slot", 15); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/menus/premade/CustomQuestMenuConfig.java b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/CustomQuestMenuConfig.java new file mode 100644 index 000000000..a8dad1fcc --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/CustomQuestMenuConfig.java @@ -0,0 +1,179 @@ +package com.magmaguy.elitemobs.config.menus.premade; + +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.EconomySettingsConfig; +import com.magmaguy.elitemobs.config.menus.MenusConfigFields; +import com.magmaguy.elitemobs.items.customloottable.*; +import com.magmaguy.elitemobs.quests.objectives.*; +import com.magmaguy.elitemobs.quests.rewards.QuestReward; +import com.magmaguy.magmacore.util.ChatColorConverter; +import lombok.Getter; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class CustomQuestMenuConfig extends MenusConfigFields { + @Getter + private static String headerTextLines; + @Getter + private static String acceptTextLines; + @Getter + private static String acceptHoverLines; + @Getter + private static String acceptCommandLines; + @Getter + private static String acceptedTextLines; + @Getter + private static String acceptedHoverLines; + @Getter + private static String acceptedCommandLines; + @Getter + private static String trackTextLines; + @Getter + private static String trackHoverLines; + @Getter + private static String trackCommandLines; + @Getter + private static String untrackTextLines; + @Getter + private static String untrackHoverLines; + @Getter + private static String untrackCommandLines; + @Getter + private static String completedTextLines; + @Getter + private static String completedHoverLines; + @Getter + private static String completedCommandLines; + @Getter + private static String ongoingColorCode; + @Getter + private static String completedColorCode; + @Getter + private static String objectivesLine; + @Getter + private static String rewardsLine; + @Getter + private static String turnedInTextLines; + private static String turnedInHoverLines; + private static String killQuestDefaultSummaryLine; + private static String fetchQuestDefaultSummaryLine; + private static String dialogQuestDefaultSummaryLine; + private static String arenaQuestDefaultSummaryLine; + private static String rewardsDefaultSummaryLine; + @Getter + private static boolean useQuestTracking; + + public CustomQuestMenuConfig() { + super("custom_quest_screen", true); + } + + public static String getObjectiveLine(Objective objective) { + if (objective == null) return ""; + String newString = ""; + if (objective instanceof CustomKillObjective) + newString = killQuestDefaultSummaryLine; + else if (objective instanceof DialogObjective) + newString = dialogQuestDefaultSummaryLine.replace("$location", ((DialogObjective) objective).getTargetLocation()); + else if (objective instanceof CustomFetchObjective) + newString = fetchQuestDefaultSummaryLine; + else if (objective instanceof ArenaObjective) + newString = arenaQuestDefaultSummaryLine; + newString = newString.replace("$name", ChatColor.BLACK + ChatColor.stripColor(objective.getObjectiveName())); + newString = newString.replace("$current", objective.getCurrentAmount() + ""); + newString = newString.replace("$target", objective.getTargetAmount() + ""); + if (!objective.isObjectiveCompleted()) + return newString.replace("$color", ongoingColorCode); + else + return newString.replace("$color", completedColorCode); + } + + public static List getRewardsDefaultSummaryLine(QuestReward questReward) { + List textComponent = new ArrayList<>(); + if (questReward.getCustomLootTable() == null) return textComponent; + for (CustomLootEntry customLootEntry : questReward.getCustomLootTable().getEntries()) { + ItemStack itemStack = null; + if (customLootEntry instanceof EliteCustomLootEntry) + itemStack = ((EliteCustomLootEntry) customLootEntry).generateItemStack(questReward.getRewardLevel(), Bukkit.getPlayer(questReward.getPlayerUUID()), null); + else if (customLootEntry instanceof ItemStackCustomLootEntry) + itemStack = ((ItemStackCustomLootEntry) customLootEntry).generateItemStack(); + if (itemStack != null) { + textComponent.add(new TextComponent(rewardsDefaultSummaryLine + .replace("$amount", customLootEntry.getAmount() + "") + .replace("$rewardName", itemStack.getItemMeta().getDisplayName()) + .replace("$chance", (int) (customLootEntry.getChance() * 100) + ""))); + continue; + } + + if (customLootEntry instanceof VanillaCustomLootEntry) + itemStack = ((VanillaCustomLootEntry) customLootEntry).generateItemStack(); + if (itemStack != null) { + textComponent.add(new TextComponent(rewardsDefaultSummaryLine + .replace("$amount", customLootEntry.getAmount() + "") + .replace("$rewardName", itemStack.getType().toString().replace("_", " ")) + .replace("$chance", (int) (customLootEntry.getChance() * 100) + ""))); + continue; + } + + if (customLootEntry instanceof CurrencyCustomLootEntry) { + textComponent.add(new TextComponent(rewardsDefaultSummaryLine + .replace("$amount", customLootEntry.getAmount() + "") + .replace("$rewardName", ((CurrencyCustomLootEntry) customLootEntry).getCurrencyAmount() + " " + EconomySettingsConfig.getCurrencyName()) + .replace("$chance", (int) (customLootEntry.getChance() * 100) + ""))); + + } + } + return textComponent; + } + + + @Override + public void processAdditionalFields() { + //headerTextLines = ConfigurationEngine.setString(file, fileConfiguration, "headerTextLines", ChatColorConverter.convert("&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯\n&c&l$questName\n&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯")); + + headerTextLines = ConfigurationEngine.setString(file, fileConfiguration, "headerTextLines2", ChatColorConverter.convert("&a&l『&c&l$questName&a&l』\n"), true); + + acceptTextLines = ConfigurationEngine.setString(file, fileConfiguration, "acceptTextLines", "&a&l[Accept!]", true); + acceptHoverLines = ConfigurationEngine.setString(file, fileConfiguration, "acceptHoverLines", "&aClick to \n&aaccept quest!", true); + acceptCommandLines = ConfigurationEngine.setString(file, fileConfiguration, "acceptCommandLines", "/em quest accept $questID", false); + + acceptedTextLines = ConfigurationEngine.setString(file, fileConfiguration, "acceptedTextLines", "&2&lAccepted! &aTurn in with $npcName &4[Abandon]", true); + acceptedHoverLines = ConfigurationEngine.setString(file, fileConfiguration, "acceptedHoverLines", "&aClick to abandon quest!", true); + acceptedCommandLines = ConfigurationEngine.setString(file, fileConfiguration, "acceptedCommandLines3", "/em quest leave $questID", false); + + useQuestTracking = ConfigurationEngine.setBoolean(fileConfiguration, "useQuestTracking", true); + + trackTextLines = ConfigurationEngine.setString(file, fileConfiguration, "trackTextLines", "&2&l[Track]", true); + trackHoverLines = ConfigurationEngine.setString(file, fileConfiguration, "trackHoverLines", "&aClick to track quest!", true); + trackCommandLines = ConfigurationEngine.setString(file, fileConfiguration, "trackCommandLines3", "/em quest track $questID", false); + + untrackTextLines = ConfigurationEngine.setString(file, fileConfiguration, "untrackTextLines", "&4&l[Untrack]", true); + untrackHoverLines = ConfigurationEngine.setString(file, fileConfiguration, "untrackHoverLines", "&cClick to untrack quest!", true); + untrackCommandLines = ConfigurationEngine.setString(file, fileConfiguration, "untrackCommandLines", "/em quest track $questID", false); + + completedTextLines = ConfigurationEngine.setString(file, fileConfiguration, "completedTextLines", "&2&l[Turn in!]", true); + completedHoverLines = ConfigurationEngine.setString(file, fileConfiguration, "completedHoverLines", "&aClick to turn quest in!", true); + completedCommandLines = ConfigurationEngine.setString(file, fileConfiguration, "completedCommandLines", "/em quest complete $questID", false); + + turnedInTextLines = ConfigurationEngine.setString(file, fileConfiguration, "turnedInTextLines", "&8[Completed!]", true); + turnedInHoverLines = ConfigurationEngine.setString(file, fileConfiguration, "turnedInHoverLines", "&8Already turned in!", true); + + objectivesLine = ConfigurationEngine.setString(file, fileConfiguration, "objectivesLine", "&c&lObjectives:", true); + killQuestDefaultSummaryLine = ConfigurationEngine.setString(file, fileConfiguration, "killQuestDefaultSummaryLine", "&c➤Kill $name:$color$current&0/$color$target", true); + fetchQuestDefaultSummaryLine = ConfigurationEngine.setString(file, fileConfiguration, "fetchQuestDefaultSummaryLine", "&c➤Get $name:$color&$current&0/$color$target", true); + dialogQuestDefaultSummaryLine = ConfigurationEngine.setString(file, fileConfiguration, "dialogQuestDefaultSummaryLine", "&c➤Go talk to $name $location", true); + arenaQuestDefaultSummaryLine = ConfigurationEngine.setString(file, fileConfiguration, "arenaQuestDefaultSummaryLine", "&c➤Complete $arenaName", true); + + rewardsLine = ConfigurationEngine.setString(file, fileConfiguration, "rewardsLine", "&2&lRewards:", true); + rewardsDefaultSummaryLine = ConfigurationEngine.setString(file, fileConfiguration, "rewardsDefaultSummaryLine", "&2➤$amountx $rewardName &8($chance%)", true); + + ongoingColorCode = ConfigurationEngine.setString(file, fileConfiguration, "ongoingQuestColorCode", "&c", false); + completedColorCode = ConfigurationEngine.setString(file, fileConfiguration, "ongoingQuestColorCode", "&2", false); + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/menus/premade/CustomShopMenuConfig.java b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/CustomShopMenuConfig.java new file mode 100644 index 000000000..5fa896bc9 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/CustomShopMenuConfig.java @@ -0,0 +1,43 @@ +package com.magmaguy.elitemobs.config.menus.premade; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.menus.MenusConfigFields; +import com.magmaguy.elitemobs.utils.ItemStackSerializer; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + + +public class CustomShopMenuConfig extends MenusConfigFields { + public static String shopName; + public static ItemStack rerollItem; + public static int rerollSlot; + public static List storeSlots; + public static String messageFullInventory; + + public CustomShopMenuConfig() { + super("custom_shop_menu", true); + } + + @Override + public void processAdditionalFields() { + shopName = ConfigurationEngine.setString(file, fileConfiguration, "Shop name", "[EM] Custom Shop", true); + ItemStackSerializer.serialize("Reroll button", + ItemStackGenerator.generateSkullItemStack("magmaguy", + "&4&lEliteMobs &r&cby &4&lMagmaGuy", + List.of("&8Support the plugins you enjoy!"), + MetadataHandler.signatureID), + fileConfiguration); + rerollItem = ItemStackSerializer.deserialize("Reroll button", fileConfiguration); + rerollSlot = ConfigurationEngine.setInt(fileConfiguration, "Reroll button slot", 4); + storeSlots = ConfigurationEngine.setList(file, fileConfiguration, "Store item slots", new ArrayList<>(List.of(9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 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)), false); + messageFullInventory = ConfigurationEngine.setString(file, fileConfiguration, "Full inventory message", + "[EliteMobs] &4Your inventory is full! You can't buy items until you get some free space.", true); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/menus/premade/DynamicQuestMenuConfig.java b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/DynamicQuestMenuConfig.java new file mode 100644 index 000000000..c6d8b81fd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/DynamicQuestMenuConfig.java @@ -0,0 +1,147 @@ +package com.magmaguy.elitemobs.config.menus.premade; + +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.EconomySettingsConfig; +import com.magmaguy.elitemobs.config.menus.MenusConfigFields; +import com.magmaguy.elitemobs.items.customloottable.*; +import com.magmaguy.elitemobs.quests.objectives.Objective; +import com.magmaguy.elitemobs.quests.rewards.QuestReward; +import com.magmaguy.magmacore.util.ChatColorConverter; +import lombok.Getter; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class DynamicQuestMenuConfig extends MenusConfigFields { + @Getter + private static String questName; + @Getter + private static String headerTextLines; + @Getter + private static String defaultLoreTextLines; + @Getter + private static String acceptTextLines; + @Getter + private static String acceptHoverLines; + @Getter + private static String acceptCommandLines; + @Getter + private static String acceptedTextLines; + @Getter + private static String acceptedHoverLines; + @Getter + private static String acceptedCommandLines; + @Getter + private static String completedTextLines; + @Getter + private static String completedHoverLines; + @Getter + private static String completedCommandLines; + @Getter + private static String turnedInTextLines; + @Getter + private static String turnedInHoverLines; + @Getter + private static String ongoingColorCode; + @Getter + private static String completedColorCode; + @Getter + private static String objectivesLine; + @Getter + private static String rewardsLine; + + private static String killQuestDefaultSummaryLine; + private static String rewardsDefaultSummaryLine; + + public DynamicQuestMenuConfig() { + super("dynamic_quest_screen", true); + } + + public static String getKillQuestDefaultSummaryLine(Objective objective) { + String newString = killQuestDefaultSummaryLine; + newString = newString.replace("$name", ChatColor.BLACK + ChatColor.stripColor((objective).getObjectiveName())); + newString = newString.replace("$current", objective.getCurrentAmount() + ""); + newString = newString.replace("$target", objective.getTargetAmount() + ""); + if (!objective.isObjectiveCompleted()) + return newString.replace("$color", ongoingColorCode); + else + return newString.replace("$color", completedColorCode); + } + + public static List getRewardsDefaultSummaryLine(QuestReward questReward) { + List textComponent = new ArrayList<>(); + if (questReward.getCustomLootTable() == null) return textComponent; + for (CustomLootEntry customLootEntry : questReward.getCustomLootTable().getEntries()) { + ItemStack itemStack = null; + if (customLootEntry instanceof EliteCustomLootEntry) + itemStack = ((EliteCustomLootEntry) customLootEntry).generateItemStack(questReward.getRewardLevel(), Bukkit.getPlayer(questReward.getPlayerUUID()), null); + else if (customLootEntry instanceof ItemStackCustomLootEntry) + itemStack = ((ItemStackCustomLootEntry) customLootEntry).generateItemStack(); + if (itemStack != null) { + textComponent.add(new TextComponent(rewardsDefaultSummaryLine + .replace("$amount", customLootEntry.getAmount() + "") + .replace("$rewardName", itemStack.getItemMeta().getDisplayName()) + .replace("$chance", (int) (customLootEntry.getChance() * 100) + ""))); + continue; + } + + if (customLootEntry instanceof VanillaCustomLootEntry) + itemStack = ((VanillaCustomLootEntry) customLootEntry).generateItemStack(); + if (itemStack != null) { + textComponent.add(new TextComponent(rewardsDefaultSummaryLine + .replace("$amount", customLootEntry.getAmount() + "") + .replace("$rewardName", itemStack.getType().toString().replace("_", " ")) + .replace("$chance", (int) (customLootEntry.getChance() * 100) + ""))); + continue; + } + + if (customLootEntry instanceof CurrencyCustomLootEntry) { + textComponent.add(new TextComponent(rewardsDefaultSummaryLine + .replace("$amount", customLootEntry.getAmount() + "") + .replace("$rewardName", ((CurrencyCustomLootEntry) customLootEntry).getCurrencyAmount() + " " + EconomySettingsConfig.getCurrencyName()) + .replace("$chance", (int) (customLootEntry.getChance() * 100) + ""))); + + } + } + return textComponent; + } + + @Override + public void processAdditionalFields() { + questName = ConfigurationEngine.setString(file, fileConfiguration, "questName", "Slay $amount $name", true); + + headerTextLines = ConfigurationEngine.setString(file, fileConfiguration, "headerTextLines2", + ChatColorConverter.convert("&c&lGuild request!\n"), true); + + defaultLoreTextLines = ConfigurationEngine.setString(file, fileConfiguration, "defaultLoreTextLines", "&8Slay $amount $name!", true); + + acceptTextLines = ConfigurationEngine.setString(file, fileConfiguration, "acceptTextLines", "&a&lAccept!", true); + acceptHoverLines = ConfigurationEngine.setString(file, fileConfiguration, "acceptHoverLines", "&aClick to \n&aaccept quest!", true); + acceptCommandLines = ConfigurationEngine.setString(file, fileConfiguration, "acceptCommandLines", "/em quest accept $questID", false); + + acceptedTextLines = ConfigurationEngine.setString(file, fileConfiguration, "acceptedTextLines", "&2&lAccepted! &4[Abandon]", true); + acceptedHoverLines = ConfigurationEngine.setString(file, fileConfiguration, "acceptedHoverLines", "&aClick to abandon quest!", true); + acceptedCommandLines = ConfigurationEngine.setString(file, fileConfiguration, "acceptedCommandLines3", "/em quest leave $questID", false); + + completedTextLines = ConfigurationEngine.setString(file, fileConfiguration, "completedTextLines", "&2&l[Turn in!]", true); + completedHoverLines = ConfigurationEngine.setString(file, fileConfiguration, "completedHoverLines", "&aClick to turn quest in!", true); + completedCommandLines = ConfigurationEngine.setString(file, fileConfiguration, "completedCommandLines", "/em quest complete $questID", false); + + turnedInTextLines = ConfigurationEngine.setString(file, fileConfiguration, "turnedInTextLines", "&8[Completed!]", true); + turnedInHoverLines = ConfigurationEngine.setString(file, fileConfiguration, "turnedInHoverLines", "&8Already turned in!", true); + + objectivesLine = ConfigurationEngine.setString(file, fileConfiguration, "objectivesLine", "&c&lObjectives:", true); + killQuestDefaultSummaryLine = ConfigurationEngine.setString(file, fileConfiguration, "killQuestDefaultSummaryLine", "&c➤Kill $name:$color$current&0/$color$target", true); + + rewardsLine = ConfigurationEngine.setString(file, fileConfiguration, "rewardsLine", "&2&lRewards:", true); + rewardsDefaultSummaryLine = ConfigurationEngine.setString(file, fileConfiguration, "rewardsDefaultSummaryLine", "&2➤$amountx $rewardName &8($chance%)", true); + + ongoingColorCode = ConfigurationEngine.setString(file, fileConfiguration, "ongoingQuestColorCode", "&c", false); + completedColorCode = ConfigurationEngine.setString(file, fileConfiguration, "ongoingQuestColorCode", "&2", false); + + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/menus/premade/GetLootMenuConfig.java b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/GetLootMenuConfig.java new file mode 100644 index 000000000..8cbe889da --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/GetLootMenuConfig.java @@ -0,0 +1,76 @@ +package com.magmaguy.elitemobs.config.menus.premade; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.menus.MenusConfigFields; +import com.magmaguy.elitemobs.utils.ItemStackSerializer; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import org.bukkit.inventory.ItemStack; + +import java.util.List; + +public class GetLootMenuConfig extends MenusConfigFields { + public static String menuName; + public static ItemStack infoItem; + public static ItemStack leftArrowItem, rightArrowItem, previousLootItem, nextLootItem; + public static String tierTranslation, itemFilterTranslation; + + public GetLootMenuConfig() { + super("get_loot_menu", true); + } + + @Override + public void processAdditionalFields() { + + menuName = ConfigurationEngine.setString(file, fileConfiguration, "Menu name", "[EM] Getloot menu", true); + + ItemStackSerializer.serialize( + "Info button", + ItemStackGenerator.generateSkullItemStack("magmaguy", + "&4&lEliteMobs &r&cby &4&lMagmaGuy", + List.of("&8Support the plugins you enjoy!"), + MetadataHandler.signatureID), + fileConfiguration); + infoItem = ItemStackSerializer.deserialize("Info button", fileConfiguration); + + ItemStackSerializer.serialize( + "Left button", + ItemStackGenerator.generateSkullItemStack("MHF_ArrowLeft", + "Previous Item Ranks", + List.of(""), + MetadataHandler.signatureID), + fileConfiguration); + leftArrowItem = ItemStackSerializer.deserialize("Left button", fileConfiguration); + + ItemStackSerializer.serialize( + "Right button", + ItemStackGenerator.generateSkullItemStack("MHF_ArrowRight", + "Next Item Ranks", + List.of(""), + MetadataHandler.signatureID), + fileConfiguration); + rightArrowItem = ItemStackSerializer.deserialize("Right button", fileConfiguration); + + tierTranslation = ConfigurationEngine.setString(file, fileConfiguration, "tierTranslation", "Level", true); + itemFilterTranslation = ConfigurationEngine.setString(file, fileConfiguration, "itemFilterTranslation", "Filter by items of this level.", true); + + ItemStackSerializer.serialize( + "previousLoot", + ItemStackGenerator.generateSkullItemStack("MHF_ArrowLeft", + "Previous Loot Page", + List.of(""), + MetadataHandler.signatureID), + fileConfiguration); + previousLootItem = ItemStackSerializer.deserialize("previousLoot", fileConfiguration); + + ItemStackSerializer.serialize( + "nextLoot", + ItemStackGenerator.generateSkullItemStack("MHF_ArrowRight", + "Next Loot Page", + List.of(""), MetadataHandler.signatureID), + fileConfiguration); + nextLootItem = ItemStackSerializer.deserialize("nextLoot", fileConfiguration); + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/menus/premade/GuildRankMenuConfig.java b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/GuildRankMenuConfig.java new file mode 100644 index 000000000..d0713eac0 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/GuildRankMenuConfig.java @@ -0,0 +1,182 @@ +package com.magmaguy.elitemobs.config.menus.premade; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.menus.MenusConfigFields; +import com.magmaguy.elitemobs.utils.ItemStackSerializer; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import lombok.Getter; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class GuildRankMenuConfig extends MenusConfigFields { + @Getter + private static String menuName; + @Getter + private static String lowTierWarning; + @Getter + private static String normalTierWarning; + @Getter + private static ItemStack unlockedButton; + @Getter + private static ItemStack lockedButton; + @Getter + private static ItemStack currentButton; + @Getter + private static ItemStack nextButton; + @Getter + private static ItemStack prestigeLockedButton; + @Getter + private static ItemStack prestigeNextUnlockButton; + @Getter + private static String notEnoughCurrencyMessage; + @Getter + private static String unlockMessage; + @Getter + private static String broadcastMessage; + @Getter + private static String failedMessage; + @Getter + private static String spawnRateModifierMessage; + @Getter + private static String lootModifierMessage; + @Getter + private static String difficultyModifierMessage; + @Getter + private static String lootTierMessage; + @Getter + private static String currencyBonusMessage; + @Getter + private static String healthBonusMessage; + @Getter + private static String critBonusMessage; + @Getter + private static String dodgeBonusMessage; + + public GuildRankMenuConfig() { + super("guild_rank_selector_menu", true); + } + + @Override + public void processAdditionalFields() { + + menuName = ConfigurationEngine.setString(file, fileConfiguration, "questTierSelectorMenuTitle", "[EM] Guild Rank Selection", true); + lowTierWarning = ConfigurationEngine.setString(file, fileConfiguration, "lowTierWarning", "&cElites can't drop better loot!", true); + normalTierWarning = ConfigurationEngine.setString(file, fileConfiguration, "normalTierWarning", "&aElite can drop better loot!", true); + + ItemStackSerializer.serialize( + "unlockedButtons", + ItemStackGenerator.generateItemStack(Material.GRAY_STAINED_GLASS_PANE, + "$rankName", + new ArrayList<>(List.of("&f&m-------------------------------", + "&aThis rank is unlocked!", + "&fYou can select it.", + "&f&m-------------------------------", + "$lootTier", + "$currencyBonusMessage", + "$maxHealthIncrease", + "$chanceToCrit", + "$chanceToDodge")), MetadataHandler.signatureID), fileConfiguration); + unlockedButton = ItemStackSerializer.deserialize("unlockedButtons", fileConfiguration); + + ItemStackSerializer.serialize( + "lockedButtons", + ItemStackGenerator.generateItemStack(Material.RED_STAINED_GLASS_PANE, + "$rankName", + new ArrayList<>(List.of("&f&m-------------------------------", + "&aThis rank is locked!", + "&cYou need the $previousRank rank first!", + "&f&m-------------------------------", + "$lootTier", + "$currencyBonusMessage", + "$maxHealthIncrease", + "$chanceToCrit", + "$chanceToDodge")), MetadataHandler.signatureID), fileConfiguration); + lockedButton = ItemStackSerializer.deserialize("lockedButtons", fileConfiguration); + + ItemStackSerializer.serialize( + "currentButtons", + ItemStackGenerator.generateItemStack(Material.GREEN_STAINED_GLASS_PANE, + "$rankName", + new ArrayList<>(List.of("&f&m-------------------------------", + "&aThis is your current rank!", + "&f&m-------------------------------", + "$lootTier", + "$currencyBonusMessage", + "$maxHealthIncrease", + "$chanceToCrit", + "$chanceToDodge")), MetadataHandler.signatureID), fileConfiguration); + currentButton = ItemStackSerializer.deserialize("currentButtons", fileConfiguration); + + ItemStackSerializer.serialize( + "nextButtons", + ItemStackGenerator.generateItemStack(Material.YELLOW_STAINED_GLASS_PANE, + "Prestige $prestigeNumber", + new ArrayList<>(List.of( + "&6This is the next rank you can unlock", + "&aSelect it when you're ready!", + "&6Costs $price &6$currencyName", + "&fYou have &a$currentCurrency $currencyName", + "&f&m-------------------------------", + "$lootTier", + "$currencyBonusMessage", + "$maxHealthIncrease", + "$chanceToCrit", + "$chanceToDodge")), MetadataHandler.signatureID), fileConfiguration); + nextButton = ItemStackSerializer.deserialize("nextButtons", fileConfiguration); + + ItemStackSerializer.serialize( + "prestigeLockedButtons", + ItemStackGenerator.generateItemStack(Material.RED_STAINED_GLASS, + "Prestige $rank", + new ArrayList<>(List.of("&f&m-------------------------------", + "&4You must unlock all guild ranks first!", + "&f&m-------------------------------")), MetadataHandler.signatureID), fileConfiguration); + prestigeLockedButton = ItemStackSerializer.deserialize("prestigeLockedButtons", fileConfiguration); + + ItemStackSerializer.serialize( + "prestigeNextUnlockButtons", + ItemStackGenerator.generateItemStack(Material.GOLD_BLOCK, + "Prestige $rank", + new ArrayList<>(List.of("&f&m-------------------------------", + "&2Prestige unlock is ready!", + "&6Costs $price &6$currencyName", + "&cBuying prestige will reset guild ranks", + "&abut will allow you to unlock:", + "&a- Access to higher guild tiers", + "&a- Access to higher tier loot", + "&a- More coins from kills and quests", + "&a- Higher max health", + "&a- Base chance to crit", + "&a- Base chance to dodge", + "&4Warning: this resets you current", + "&4EliteMobs ITEMS AND CURRENCY!", + "&f&m-------------------------------")), MetadataHandler.signatureID), fileConfiguration); + prestigeNextUnlockButton = ItemStackSerializer.deserialize("prestigeNextUnlockButtons", fileConfiguration); + + notEnoughCurrencyMessage = ConfigurationEngine.setString(file, fileConfiguration, "notEnoughCurrencyMessages", + "&7[EliteMobs] &4You don't have enough Elite Coins ($neededAmount $currencyName)! Sell some Elite Mob loot to [/em shop]! " + + "You have $currentAmount $currencyName.", true); + + unlockMessage = ConfigurationEngine.setString(file, fileConfiguration, "unlockMessages", "&7[EliteMobs] &aYou have unlocked the $rankName &arank for $price $currencyName. \n&6Happy hunting!", true); + + broadcastMessage = ConfigurationEngine.setString(file, fileConfiguration, "questCompleteBroadcastMessages", "&7[EliteMobs] &a$player &ahas reached the $rankName &aguild rank!", true); + + failedMessage = ConfigurationEngine.setString(file, fileConfiguration, "failedMessages", "&7[EliteMobs] &cYou need to unlock other ranks first!", true); + + spawnRateModifierMessage = ConfigurationEngine.setString(file, fileConfiguration, "spawnRateModifierMessages", "&fElite Mob spawn rate modifier: &c$modifier%", true); + lootModifierMessage = ConfigurationEngine.setString(file, fileConfiguration, "lootModifierMessages", "&fElite Mob loot modifier: &a$modifier%", true); + difficultyModifierMessage = ConfigurationEngine.setString(file, fileConfiguration, "difficultyModifierMessages", "&fElite Mob difficulty modifier: &c$modifier%", true); + + lootTierMessage = ConfigurationEngine.setString(file, fileConfiguration, "lootTierMessages", "&2Elites can drop up to tier $tier loot!", true); + currencyBonusMessage = ConfigurationEngine.setString(file, fileConfiguration, "currencyBonusMessages", "&a$amountx coins from drops and quests!", true); + healthBonusMessage = ConfigurationEngine.setString(file, fileConfiguration, "healthBonusMessages", "&cAdds $amount ❤ of max health", true); + critBonusMessage = ConfigurationEngine.setString(file, fileConfiguration, "critBonusMessages", "&eAdds $amount% chance to crit", true); + dodgeBonusMessage = ConfigurationEngine.setString(file, fileConfiguration, "dodgeBonusMessages", "&8Adds $amount% chance to dodge", true); + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/menus/premade/ItemEnchantmentMenuConfig.java b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/ItemEnchantmentMenuConfig.java new file mode 100644 index 000000000..966bac1c9 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/ItemEnchantmentMenuConfig.java @@ -0,0 +1,145 @@ +package com.magmaguy.elitemobs.config.menus.premade; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.menus.MenusConfigFields; +import com.magmaguy.elitemobs.utils.ItemStackSerializer; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import lombok.Getter; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class ItemEnchantmentMenuConfig extends MenusConfigFields { + @Getter + private static String menuName; + @Getter + private static int infoSlot; + @Getter + private static ItemStack infoButton; + @Getter + private static int cancelSlot; + @Getter + private static ItemStack cancelButton; + @Getter + private static int confirmSlot; + @Getter + private static ItemStack confirmButton; + @Getter + private static int itemSlot; + @Getter + private static int itemInfoSlot; + @Getter + private static ItemStack itemInfoButton; + @Getter + private static int enchantedBookSlot; + @Getter + private static int enchantedBookInfoSlot; + @Getter + private static ItemStack enchantedBookInfoButton; + + @Getter + private static int luckyTicketSlot; + @Getter + private static int luckyTicketInfoSlot; + @Getter + private static ItemStack luckyTicketInfoButton; + @Getter + private static String enchantmentLimitMessage; + + + public ItemEnchantmentMenuConfig() { + super("item_enchantment_menu", true); + } + + @Override + public void processAdditionalFields() { + menuName = ConfigurationEngine.setString( + List.of("Sets the display name of the menu"), + file, fileConfiguration, "menuName", "&6Enchantment Menu", true); + infoSlot = ConfigurationEngine.setInt( + List.of("Sets the item slot number of the information button in the chest menu."), + fileConfiguration, "infoSlot", 4); + ItemStackSerializer.serialize( + "infoButton", + ItemStackGenerator.generateSkullItemStack("magmaguy", + "&2Enchantment info:", + new ArrayList<>(List.of( + "&2This menu can add enchants to your elite items!", + "&aIn order to enchant your elite item, add your", + "&aelite item and your elite enchanted books!", + "&6Items that already have a lot of enchantments", + "&6(high quality items) have a high chance of failing!", + "&8Normal failure makes you fail to enchant the item.", + "&8Challenge makes you fight a boss for the enchant.", + "&8Critical failures make you lose the item!")), MetadataHandler.signatureID), + fileConfiguration); + infoButton = ItemStackSerializer.deserialize("infoButton", fileConfiguration); + cancelSlot = ConfigurationEngine.setInt( + List.of("Sets the item slot number of the cancel button in the chest menu."), + fileConfiguration, "cancelSlot", 27); + ItemStackSerializer.serialize("cancelButton", ItemStackGenerator.generateItemStack(Material.BARRIER, + "&4Cancel", List.of("&cCancel repair!"), MetadataHandler.signatureID), fileConfiguration); + cancelButton = ItemStackSerializer.deserialize("cancelButton", fileConfiguration); + confirmSlot = ConfigurationEngine.setInt( + List.of("Sets the item slot number of the confirm button in the chest menu."), + fileConfiguration, "confirmSlot", 35); + ItemStackSerializer.serialize("confirmButton", ItemStackGenerator.generateItemStack(Material.EMERALD, + "&2Enchant!", List.of( + "&aPrice: $price $currencyName", + "&2Chance of success: $successChance%", + "&cChance of failure: $failureChance%", + "&6Challenge chance: $challengeChance%", + "&4Chance of critical failure: $criticalFailureChance%"), + 31174), fileConfiguration); + confirmButton = ItemStackSerializer.deserialize("confirmButton", fileConfiguration); + itemSlot = ConfigurationEngine.setInt( + List.of("Sets the item slot number of the elite item in the chest menu."), + fileConfiguration, "itemSlot", 29); + itemInfoSlot = ConfigurationEngine.setInt( + List.of("Sets the item slot number of the elite item info button in the chest menu."), + fileConfiguration, "itemInfoSlot", 20); + ItemStackSerializer.serialize( + "itemInfoButton", + ItemStackGenerator.generateItemStack(Material.GREEN_BANNER, + "&2Elite Item Input slot", + List.of("&aPut your elite item here!"), MetadataHandler.signatureID), + fileConfiguration); + itemInfoButton = ItemStackSerializer.deserialize("itemInfoButton", fileConfiguration); + enchantedBookInfoSlot = ConfigurationEngine.setInt( + List.of("Sets the item slot number of the enchanted book info button in the chest menu."), + fileConfiguration, "enchantedBookInfoSlot", 22); + ItemStackSerializer.serialize( + "enchantedBookInfoButton", + ItemStackGenerator.generateItemStack(Material.GREEN_BANNER, + "&2Enchanted Book Input slot", + List.of("&aPut your elite enchanted books here!"), MetadataHandler.signatureID), + fileConfiguration); + enchantedBookInfoButton = ItemStackSerializer.deserialize("enchantedBookInfoButton", fileConfiguration); + enchantedBookSlot = ConfigurationEngine.setInt( + List.of("Sets the item slot number of the enchanted book in the chest menu."), + fileConfiguration, "enchantedBookSlot", 31); + luckyTicketSlot = ConfigurationEngine.setInt(fileConfiguration, "luckyTicketSlot", 33); + luckyTicketInfoSlot = ConfigurationEngine.setInt( + List.of("Sets the item slot number of the lucky ticket info button in the chest menu."), + fileConfiguration, "luckyTicketInfoSlot", 24); + ItemStackSerializer.serialize( + "luckyTicketInfoButton", + ItemStackGenerator.generateItemStack(Material.GREEN_BANNER, + "&2Elite Lucky Ticket Input slot", + List.of("&a(Optional) Put your elite lucky tickets here!", + "&2Increase the odds of the enchantment succeeding", + "&2by adding an elite lucky ticket!"), MetadataHandler.signatureID), + fileConfiguration); + luckyTicketInfoButton = ItemStackSerializer.deserialize("luckyTicketInfoButton", fileConfiguration); + enchantmentLimitMessage = ConfigurationEngine.setString( + List.of("Sets the message that appears when a player attempts to enchant an item beyond the configured maximum enchantment level of any enchantment."), + file, + fileConfiguration, + "enchantmentLimitMessage", + "&c[EliteMobs] Can't enchant item beyond enchantment limit!", + true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/menus/premade/PlayerStatusMenuConfig.java b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/PlayerStatusMenuConfig.java new file mode 100644 index 000000000..7755cfa13 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/PlayerStatusMenuConfig.java @@ -0,0 +1,500 @@ +package com.magmaguy.elitemobs.config.menus.premade; + +import com.magmaguy.elitemobs.config.AdventurersGuildConfig; +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.menus.MenusConfigFields; +import com.magmaguy.elitemobs.playerdata.statusscreen.PlayerStatusScreen; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import lombok.Getter; +import org.bukkit.Material; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.inventory.ItemStack; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +public class PlayerStatusMenuConfig extends MenusConfigFields { + @Getter + private static final String[] indexTextLines = new String[13]; + @Getter + private static final String[] indexHoverLines = new String[13]; + @Getter + private static final String[] indexCommandLines = new String[13]; + @Getter + private static final String[] statsTextLines = new String[13]; + @Getter + private static final String[] statsHoverLines = new String[13]; + @Getter + private static final String[] statsCommandLines = new String[13]; + @Getter + private static final String[] gearTextLines = new String[13]; + @Getter + private static final String[] gearHoverLines = new String[13]; + @Getter + private static final String[] gearCommandLines = new String[13]; + @Getter + private static final String[] teleportTextLines = new String[13]; + @Getter + private static final String[] teleportHoverLines = new String[13]; + @Getter + private static final String[] teleportCommandLines = new String[13]; + @Getter + private static final String[] commandsTextLines = new String[13]; + @Getter + private static final String[] commandsHoverLines = new String[13]; + @Getter + private static final String[] commandsCommandLines = new String[13]; + @Getter + private static final String[] bossTrackerTextLines = new String[13]; + @Getter + private static final String[] bossTrackerHoverLines = new String[13]; + @Getter + private static final String[] bossTrackerCommandLines = new String[13]; + @Getter + private static final String[] questTrackerTextLines = new String[13]; + @Getter + private static final String[] questTrackerHoverLines = new String[13]; + @Getter + private static final String[] questTrackerCommandLines = new String[13]; + @Getter + private static boolean doIndexPage; + @Getter + private static boolean doStatsPage; + @Getter + private static boolean doGearPage; + @Getter + private static boolean doTeleportsPage; + @Getter + private static boolean doCommandsPage; + @Getter + private static boolean doQuestTrackingPage; + @Getter + private static boolean doBossTrackingPage; + @Getter + private static String teleportChestMenuName; + @Getter + private static String bossTrackerChestMenuName; + @Getter + private static String onBossTrackHover; + @Getter + private static String onQuestTrackHover; + @Getter + private static String onTeleportHover; + + @Getter + private static String indexChestMenuName; + @Getter + private static ItemStack backItem; + @Getter + private static ItemStack indexHeaderItem; + @Getter + private static int indexHeaderSlot; + @Getter + private static ItemStack indexStatsItem; + @Getter + private static int indexStatsSlot; + @Getter + private static ItemStack indexGearItem; + @Getter + private static int indexGearSlot; + @Getter + private static ItemStack indexTeleportsItem; + @Getter + private static int indexTeleportsSlot; + @Getter + private static ItemStack indexCommandsItem; + @Getter + private static int indexCommandsSlot; + @Getter + private static ItemStack indexQuestTrackingItem; + @Getter + private static int indexQuestTrackingSlot; + @Getter + private static ItemStack indexBossTrackingItem; + @Getter + private static int indexBossTrackingSlot; + @Getter + private static String gearChestMenuName; + @Getter + private static ItemStack gearDamageItem; + @Getter + private static int gearDamageSlot; + @Getter + private static ItemStack gearArmorItem; + @Getter + private static int gearArmorSlot; + @Getter + private static ItemStack gearThreatItem; + @Getter + private static int gearThreatSlot; + @Getter + private static String statsChestMenuName; + @Getter + private static ItemStack statsMoneyItem; + @Getter + private static int statsMoneySlot; + @Getter + private static ItemStack statsGuildTierItem; + @Getter + private static int statsGuildTierSlot; + @Getter + private static ItemStack statsEliteKillsItem; + @Getter + private static int statsEliteKillsSlot; + @Getter + private static ItemStack statsMaxEliteLevelKilledItem; + @Getter + private static int statsMaxEliteLevelKilledSlot; + @Getter + private static ItemStack statsEliteDeathsItem; + @Getter + private static int statsEliteDeathsSlot; + @Getter + private static ItemStack statsQuestsCompletedItem; + @Getter + private static int statsQuestsCompletedSlot; + @Getter + private static ItemStack statsScoreItem; + @Getter + private static int statsScoreSlot; + @Getter + private static String commandsChestMenuName; + @Getter + private static ItemStack commandsAGItem; + @Getter + private static int commandsAGSlot; + @Getter + private static ItemStack commandsShareItemItem; + @Getter + private static int commandsShareItemSlot; + + + public PlayerStatusMenuConfig() { + super("player_status_screen", true); + } + + private static void indexLineCreator(int line, String text, String hover, String command, FileConfiguration fileConfiguration, File file) { + indexTextLines[line] = ConfigurationEngine.setString(file, fileConfiguration, "indexTexts" + line, text, true); + indexHoverLines[line] = ConfigurationEngine.setString(file, fileConfiguration, "indexHovers" + line, hover, true); + indexCommandLines[line] = ConfigurationEngine.setString(file, fileConfiguration, "indexCommands" + line, command, false); + } + + private static void statsLineCreator(int line, String text, String hover, String command, FileConfiguration fileConfiguration, File file) { + statsTextLines[line] = ConfigurationEngine.setString(file, fileConfiguration, "statsText" + line, text, true); + statsHoverLines[line] = ConfigurationEngine.setString(file, fileConfiguration, "statsHover" + line, hover, true); + statsCommandLines[line] = ConfigurationEngine.setString(file, fileConfiguration, "statsCommand" + line, command, false); + } + + private static void gearLineCreator(int line, String text, String hover, String command, FileConfiguration fileConfiguration, File file) { + gearTextLines[line] = ConfigurationEngine.setString(file, fileConfiguration, "gearText" + line, text, true); + gearHoverLines[line] = ConfigurationEngine.setString(file, fileConfiguration, "gearHover" + line, hover, true); + gearCommandLines[line] = ConfigurationEngine.setString(file, fileConfiguration, "gearCommand" + line, command, false); + } + + private static void teleportLineCreator(int line, String text, String hover, String command, FileConfiguration fileConfiguration, File file) { + teleportTextLines[line] = ConfigurationEngine.setString(file, fileConfiguration, "teleportText" + line, text, true); + teleportHoverLines[line] = ConfigurationEngine.setString(file, fileConfiguration, "teleportHover" + line, hover, true); + teleportCommandLines[line] = ConfigurationEngine.setString(file, fileConfiguration, "teleportCommand" + line, command, false); + } + + private static void commandsLineCreator(int line, String text, String hover, String command, FileConfiguration fileConfiguration, File file) { + commandsTextLines[line] = ConfigurationEngine.setString(file, fileConfiguration, "commandsText" + line, text, true); + commandsHoverLines[line] = ConfigurationEngine.setString(file, fileConfiguration, "commandsHover" + line, hover, true); + commandsCommandLines[line] = ConfigurationEngine.setString(file, fileConfiguration, "commandsCommand" + line, command, false); + } + + private static void questTrackerLineCreator(int line, String text, String hover, String command, FileConfiguration fileConfiguration, File file) { + questTrackerTextLines[line] = ConfigurationEngine.setString(file, fileConfiguration, "questTrackerText" + line, text, true); + questTrackerHoverLines[line] = ConfigurationEngine.setString(file, fileConfiguration, "questTrackerHover" + line, hover, true); + questTrackerCommandLines[line] = ConfigurationEngine.setString(file, fileConfiguration, "questTrackerCommand" + line, command, false); + } + + private static void bossTrackerLineCreator(int line, String text, String hover, String command, FileConfiguration fileConfiguration, File file) { + bossTrackerTextLines[line] = ConfigurationEngine.setString(file, fileConfiguration, "bossTrackerText" + line, text, true); + bossTrackerHoverLines[line] = ConfigurationEngine.setString(file, fileConfiguration, "bossTrackerHover" + line, hover, true); + bossTrackerCommandLines[line] = ConfigurationEngine.setString(file, fileConfiguration, "bossTrackerCommand" + line, command, false); + } + + @Override + public void processAdditionalFields() { + + doIndexPage = ConfigurationEngine.setBoolean(fileConfiguration, "doIndexPage", true); + doStatsPage = ConfigurationEngine.setBoolean(fileConfiguration, "doStatsPage", true); + doGearPage = ConfigurationEngine.setBoolean(fileConfiguration, "doGearPage", true); + doTeleportsPage = ConfigurationEngine.setBoolean(fileConfiguration, "doTeleportsPage", true); + doCommandsPage = ConfigurationEngine.setBoolean(fileConfiguration, "doCommandsPage", true); + doQuestTrackingPage = ConfigurationEngine.setBoolean(fileConfiguration, "doQuestTrackingPage", true); + doBossTrackingPage = ConfigurationEngine.setBoolean(fileConfiguration, "doBossTrackingPage", true); + + indexLineCreator(0, "&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯", "", "", fileConfiguration, file); + indexLineCreator(1, "&5&l/ag &7- &6EliteMobs Hub", + "CLICK TO USE\n" + + "The place where you can find\n" + + "NPCs that give quests, buy and\n" + + "sell items, give advice and more!", + "/ag", fileConfiguration, file); + indexLineCreator(2, "&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯", "", "", fileConfiguration, file); + indexLineCreator(3, "", "", "", fileConfiguration, file); + indexLineCreator(4, "&6&lIndex", "", "", fileConfiguration, file); + indexLineCreator(5, "", "", "", fileConfiguration, file); + indexLineCreator(6, "&bp. $statsPage &8- &6Stats", "Click to go!", "$statsPage", fileConfiguration, file); + indexLineCreator(7, "&bp. $gearPage &8- &6Gear", "Click to go!", "$gearPage", fileConfiguration, file); + indexLineCreator(8, "&bp. $teleportsPage &8- &6Teleports", "Click to go!", "$teleportsPage", fileConfiguration, file); + indexLineCreator(9, "&bp. $commandsPage &8- &6Commands", "Click to go!", "$commandsPage", fileConfiguration, file); + indexLineCreator(10, "&bp. $questsPage &8- &6Quest Tracking", "Click to go!", "$questsPage", fileConfiguration, file); + indexLineCreator(11, "&bp. $bossTrackingPage &8- &6Boss Tracking", "Click to go!", "$bossTrackingPage", fileConfiguration, file); + indexLineCreator(12, "", "", "", fileConfiguration, file); + + + statsLineCreator(0, "&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯", "", "", fileConfiguration, file); + statsLineCreator(1, "&5&lPlayer Stats:", "", "", fileConfiguration, file); + statsLineCreator(2, "&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯", "", "", fileConfiguration, file); + statsLineCreator(3, "", "", "", fileConfiguration, file); + statsLineCreator(4, "&2Money: &a$money", "Kill Elite Mobs to loot currency or\n" + + "sell their drops in /em shop or\n" + + "complete quests!", "", fileConfiguration, file); + statsLineCreator(5, "", "", "", fileConfiguration, file); + statsLineCreator(6, "&6Guild Tier: &3$guildtier", "Prestige Tier and Guild Rank:\n" + + "Guild Rank determines how good your loot can " + + "be, sets your bonus from the Prestige Tier, among " + + "other things. The Prestige Tier unlocks extremely " + + "powerful rewards, like increased max health, chance " + + "to dodge/crit, increased currency rewards and more! " + + "You can unlock Guild Ranks and Prestige Tiers at /ag!\n" + + "⚜ = prestige rank, ✧ = guild rank!", "", fileConfiguration, file); + statsLineCreator(7, "&4Elite Kills: &c$kills", "Amount of Elite Mobs killed.", "", fileConfiguration, file); + statsLineCreator(8, "&4Max Lvl Killed: &c$highestkill", "Level of the highest Elite Mob killed.\n" + + "Elite Mob levels are based on the tier\n" + + "of your gear! Higher tiers, higher\n" + + "Elite Mob levels!\n" + + "Note: only non-exploity kills get counted!", "", fileConfiguration, file); + statsLineCreator(9, "&4Elite Deaths: &c$deaths", "Times killed by Elite Mobs.", "", fileConfiguration, file); + statsLineCreator(10, "&5Quests Completed: &d$quests", "Amount of EliteMobs quests completed.\n" + + "You can accept quests by talking to NPCs!", "", fileConfiguration, file); + statsLineCreator(11, "", "", "", fileConfiguration, file); + statsLineCreator(12, "&bScore: &3$score", "Your EliteMobs score. It goes up\n" + + "when you kill and elite mob,\n" + + "and it goes down when you die\n" + + "to an elite. Higher level\n" + + "elites give more score.", "", fileConfiguration, file); + + gearLineCreator(0, "&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯", "", "", fileConfiguration, file); + gearLineCreator(1, "&7&lArmor & Weapons:", "", "", fileConfiguration, file); + gearLineCreator(2, "&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯", "", "", fileConfiguration, file); + gearLineCreator(3, "&8&lGear Tiers:", "", "", fileConfiguration, file); + gearLineCreator(4, " ☠ - $helmettier", "$helmet", "", fileConfiguration, file); + gearLineCreator(5, " ▼ - $chestplatetier", "$chestplate", "", fileConfiguration, file); + gearLineCreator(6, " Π - $leggingstier", "$leggings", "", fileConfiguration, file); + gearLineCreator(7, " ╯╰ - $bootstier", "$boots", "", fileConfiguration, file); + gearLineCreator(8, "{⚔ - $mainhandtier} {⛨ - $offhandtier}", "{$mainhand}{$offhand}", "", fileConfiguration, file); + gearLineCreator(9, "", "", "", fileConfiguration, file); + gearLineCreator(10, "{dmg : $damage} {armr: $armor}", "{Base damage dealt to Elite Mobs}{Damage reduction from Elite Mobs}", + "", fileConfiguration, file); + gearLineCreator(11, "Threat level: $threat", + "This determines the level of the\n" + + "Elite Mobs that spawns near you.\n" + + "Takes armor, weapon in hand, guild\n" + + "tier into account.\n", + "", fileConfiguration, file); + gearLineCreator(12, "", "", "", fileConfiguration, file); + + teleportLineCreator(0, "&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯", "", "", fileConfiguration, file); + teleportLineCreator(1, "&2&lTeleports", "", "", fileConfiguration, file); + teleportLineCreator(2, "&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯", "", "", fileConfiguration, file); + teleportLineCreator(3, "Spawn", "Teleport to spawn!", "/em spawntp", fileConfiguration, file); + teleportLineCreator(4, PlayerStatusScreen.convertLightColorsToBlack(AdventurersGuildConfig.getAdventurersGuildMenuName()), "Teleport to the Adventurer's Guild Hub!", "/ag", fileConfiguration, file); + + onTeleportHover = ConfigurationEngine.setString(file, fileConfiguration, "onTeleportsHover", "Click to teleport!", true); + + commandsLineCreator(0, "&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯", "", "", fileConfiguration, file); + commandsLineCreator(1, "&3&lCommands:", "", "", fileConfiguration, file); + commandsLineCreator(2, "&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯", "", "", fileConfiguration, file); + commandsLineCreator(3, "", "", "", fileConfiguration, file); + commandsLineCreator(4, "&5/ag", "CLICK TO USE\n" + + "The place where you can find\n" + + "NPCs that give quests, buy and\n" + + "sell items, give advice and more!", "/ag", fileConfiguration, file); + commandsLineCreator(5, "", "", "", fileConfiguration, file); + commandsLineCreator(6, "&5/shareitem", "CLICK TO USE\n" + + "Shares the item you're holding\n" + + "on chat!", "/shareitem", fileConfiguration, file); + commandsLineCreator(7, "", "", "", fileConfiguration, file); + commandsLineCreator(8, "", "", "", fileConfiguration, file); + commandsLineCreator(9, "", "", "", fileConfiguration, file); + commandsLineCreator(10, "", "", "", fileConfiguration, file); + commandsLineCreator(11, "", "", "", fileConfiguration, file); + commandsLineCreator(12, "", "", "", fileConfiguration, file); + + questTrackerLineCreator(0, "&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯", "", "", fileConfiguration, file); + questTrackerLineCreator(1, "&6&lQuests:", "Talk to NPCs to accept quests!", "", fileConfiguration, file); + questTrackerLineCreator(2, "&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯", "", "", fileConfiguration, file); + + onQuestTrackHover = ConfigurationEngine.setString(file, fileConfiguration, "onQuestTrackHover", "Click to abandon!", true); + + bossTrackerLineCreator(0, "&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯", "", "", fileConfiguration, file); + bossTrackerLineCreator(1, "&4&lBoss Tracker:", "Big bosses get displayed here!", "", fileConfiguration, file); + bossTrackerLineCreator(2, "&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯", "", "", fileConfiguration, file); + + onBossTrackHover = ConfigurationEngine.setString(file, fileConfiguration, "onBossTrackHover", "Click to track/untrack!", true); + + teleportChestMenuName = ConfigurationEngine.setString(file, fileConfiguration, "teleportChestMenuName", "&2EliteMobs Teleports", true); + + bossTrackerChestMenuName = ConfigurationEngine.setString(file, fileConfiguration, "bossTrackerChestMenuName", "&2EliteMobs Boss Tracking", true); + + //inventory-based menus for bedrock + indexChestMenuName = ConfigurationEngine.setString(file, fileConfiguration, "indexChestMenuName", "&2EliteMobs Index", true); + indexHeaderItem = ConfigurationEngine.setItemStack(file, fileConfiguration, "indexHeaderItem", + ItemStackGenerator.generateItemStack(Material.PAPER, + "&5&l/ag &7- &6EliteMobs Hub", + new ArrayList<>(List.of("CLICK TO USE", + "The place where you can find", + "NPCs that give quests, buy and", + "sell items, give advice and more!"))), true); + indexHeaderSlot = ConfigurationEngine.setInt(fileConfiguration, "indexHeaderSlot", 4); + + indexStatsItem = ConfigurationEngine.setItemStack(file, fileConfiguration, "indexStatsItem", + ItemStackGenerator.generateItemStack(Material.MAP, + "&6Stats", + List.of("Click to go!")), true); + indexStatsSlot = ConfigurationEngine.setInt(fileConfiguration, "indexStatsSlot", 10); + + indexGearItem = ConfigurationEngine.setItemStack(file, fileConfiguration, "indexGearItem", + ItemStackGenerator.generateItemStack(Material.DIAMOND_SWORD, + "&6Gear", + List.of("Click to go!")), true); + indexGearSlot = ConfigurationEngine.setInt(fileConfiguration, "indexGearSlot", 12); + + indexTeleportsItem = ConfigurationEngine.setItemStack(file, fileConfiguration, "indexTeleportsItem", + ItemStackGenerator.generateItemStack(Material.END_PORTAL_FRAME, + "&6Teleports", + List.of("Click to go!")), true); + indexTeleportsSlot = ConfigurationEngine.setInt(fileConfiguration, "indexTeleportsSlot", 14); + + indexCommandsItem = ConfigurationEngine.setItemStack(file, fileConfiguration, "indexCommandsItem", + ItemStackGenerator.generateItemStack(Material.JUKEBOX, + "&6Commands", + List.of("Click to go!")), true); + indexCommandsSlot = ConfigurationEngine.setInt(fileConfiguration, "indexCommandsSlot", 16); + + + indexQuestTrackingItem = ConfigurationEngine.setItemStack(file, fileConfiguration, "indexQuestTrackingItem", + ItemStackGenerator.generateItemStack(Material.WRITABLE_BOOK, + "&6Quest Tracking", + List.of("Click to go!")), true); + indexQuestTrackingSlot = ConfigurationEngine.setInt(fileConfiguration, "indexQuestTrackingSlot", 20); + + indexBossTrackingItem = ConfigurationEngine.setItemStack(file, fileConfiguration, "indexBossTrackingItem", + ItemStackGenerator.generateItemStack(Material.TARGET, + "&6Boss Tracking", + List.of("Click to go!")), true); + + indexBossTrackingSlot = ConfigurationEngine.setInt(fileConfiguration, "indexBossTrackingSlot", 24); + + + backItem = ConfigurationEngine.setItemStack(file, fileConfiguration, "backItem", + ItemStackGenerator.generateItemStack(Material.BARRIER, "&cBack"), true); + + gearChestMenuName = ConfigurationEngine.setString(file, fileConfiguration, "gearChestMenuName", "&2EliteMobs Gear", true); + gearDamageItem = ConfigurationEngine.setItemStack(file, fileConfiguration, "gearDamageItem", + ItemStackGenerator.generateItemStack(Material.DIAMOND_SWORD, + "&4Damage: $damage", + new ArrayList<>(List.of("&fBase damage dealt to Elites.", + "&fBased on the level of your weapon!"))), true); + gearDamageSlot = ConfigurationEngine.setInt(fileConfiguration, "gearDamageSlot", 23); + gearArmorItem = ConfigurationEngine.setItemStack(file, fileConfiguration, "gearArmorItem", + ItemStackGenerator.generateItemStack(Material.SHIELD, + "&2Defense: $defense", + new ArrayList<>(List.of("&fBase damage reduction from Elites.", + "&fBased on the average level of your armor!"))), true); + gearArmorSlot = ConfigurationEngine.setInt(fileConfiguration, "gearArmorSlot", 24); + gearThreatItem = ConfigurationEngine.setItemStack(file, fileConfiguration, "gearThreatItem", + ItemStackGenerator.generateItemStack(Material.TARGET, + "&cThreat Level: $threat", + new ArrayList<>(List.of("&fThis determines the level of the", + "&fElite Mobs that spawns near you", + "&fTakes armor, weapon in hand, guild", + "&ftier into account."))), true); + gearThreatSlot = ConfigurationEngine.setInt(fileConfiguration, "gearThreatSlot", 25); + + statsChestMenuName = ConfigurationEngine.setString(file, fileConfiguration, "statsChestMenuName", "&2EliteMobs Stats", true); + + statsMoneyItem = ConfigurationEngine.setItemStack(file, fileConfiguration, "statsMoneyItem", + ItemStackGenerator.generateItemStack(Material.GOLD_INGOT, + "&2Elite Coins: $money", + new ArrayList<>(List.of("&fKill Elite Mobs to loot currency,", + "&fsell their drops in /em shop or", + "&fcomplete quests!"))), true); + statsMoneySlot = ConfigurationEngine.setInt(fileConfiguration, "statsMoneySlot", 10); + + statsGuildTierItem = ConfigurationEngine.setItemStack(file, fileConfiguration, "statsGuildTierItem", + ItemStackGenerator.generateItemStack(Material.TARGET, + "&6Guild Tier: $tier", + new ArrayList<>(List.of("&fGuild Rank determines how good your loot can ", + "&fbe, sets your bonus from the Prestige Tier, among ", + "&fother things. The Prestige Tier unlocks extremely ", + "&fpowerful rewards, like increased max health, chance ", + "&fto dodge/crit, increased currency rewards and more! ", + "&fYou can unlock Guild Ranks and Prestige Tiers at /ag!", + "&f⚜ = prestige rank, ✧ = guild rank!"))), true); + statsGuildTierSlot = ConfigurationEngine.setInt(fileConfiguration, "statsGuildTierSlot", 11); + + statsEliteKillsItem = ConfigurationEngine.setItemStack(file, fileConfiguration, "statsEliteKillsItem", + ItemStackGenerator.generateItemStack(Material.DIAMOND_SWORD, + "&4Elite Kills: &c$kills", + List.of("&fAmount of EliteMobs killed.")), true); + statsEliteKillsSlot = ConfigurationEngine.setInt(fileConfiguration, "statsEliteKillsSlot", 12); + + statsMaxEliteLevelKilledItem = ConfigurationEngine.setItemStack(file, fileConfiguration, "statsMaxEliteLevelKilledItem", + ItemStackGenerator.generateItemStack(Material.GOLDEN_SWORD, + "&4Max Lvl Killed: &c$maxKill", + new ArrayList<>(List.of("&fElite Mob levels are based on the tier", + "&fof your gear! Higher tiers, higher", + "&fElite Mob levels!\n", + "&eNote: only non-exploity kills get counted!"))), true); + statsMaxEliteLevelKilledSlot = ConfigurationEngine.setInt(fileConfiguration, "statsMaxEliteLevelKilledSlot", 13); + + statsEliteDeathsItem = ConfigurationEngine.setItemStack(file, fileConfiguration, "statsEliteDeathsItem", + ItemStackGenerator.generateItemStack(Material.TOTEM_OF_UNDYING, + "&4Elite Deaths: $deaths", + List.of("&fTimes killed by Elite Mobs.")), true); + statsEliteDeathsSlot = ConfigurationEngine.setInt(fileConfiguration, "statsEliteDeathsSlot", 14); + + statsQuestsCompletedItem = ConfigurationEngine.setItemStack(file, fileConfiguration, "statsQuestsCompletedItem", + ItemStackGenerator.generateItemStack(Material.LECTERN, + "&5Quests Completed: &d$questsCompleted", + new ArrayList<>(List.of("&fAmount of EliteMobs quests completed.", + "&fYou can accept quests by talking to NPCs!"))), true); + statsQuestsCompletedSlot = ConfigurationEngine.setInt(fileConfiguration, "statsQuestsCompletedSlot", 15); + + statsScoreItem = ConfigurationEngine.setItemStack(file, fileConfiguration, "statsScoreItem", + ItemStackGenerator.generateItemStack(Material.ITEM_FRAME, + "&3Score: &b$score", + new ArrayList<>(List.of("&fYour EliteMobs score. It goes up", + "&fwhen you kill and elite mob,", + "&fand it goes down when you die", + "&fto an elite. Higher level", + "&felites give more score."))), true); + statsScoreSlot = ConfigurationEngine.setInt(fileConfiguration, "statsScoreSlot", 16); + + commandsChestMenuName = ConfigurationEngine.setString(file, fileConfiguration, "commandsChestMenuName", "&2EliteMobs Commands", true); + + commandsAGItem = ConfigurationEngine.setItemStack(file, fileConfiguration, "commandsAGItem", + ItemStackGenerator.generateItemStack(Material.END_PORTAL_FRAME, + "&5/ag", + new ArrayList<>(List.of("&fClick to use!", + "&fThe place where you can find", + "&fNPCs that give quests, buy and", + "&fsell items, give advice and more!"))), true); + commandsAGSlot = ConfigurationEngine.setInt(fileConfiguration, "commandsAGSlot", 11); + + commandsShareItemItem = ConfigurationEngine.setItemStack(file, fileConfiguration, "commandsShareItemItem", + ItemStackGenerator.generateItemStack(Material.PAPER, + "&5/shareitem", + new ArrayList<>(List.of("&fClick to use!", + "&fShares the Elite Item you're holding", + "&fon chat!"))), true); + commandsShareItemSlot = ConfigurationEngine.setInt(fileConfiguration, "commandsShareItemSlot", 15); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/menus/premade/ProceduralShopMenuConfig.java b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/ProceduralShopMenuConfig.java new file mode 100644 index 000000000..989e2ad1a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/ProceduralShopMenuConfig.java @@ -0,0 +1,45 @@ +package com.magmaguy.elitemobs.config.menus.premade; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.menus.MenusConfigFields; +import com.magmaguy.elitemobs.utils.ItemStackSerializer; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class ProceduralShopMenuConfig extends MenusConfigFields { + public static String shopName; + public static ItemStack rerollItem; + public static int rerollSlot; + public static List storeSlots; + public static int minTier, maxTier; + public static String messageFullInventory; + + public ProceduralShopMenuConfig() { + super("procedural_shop_menu", true); + } + + @Override + public void processAdditionalFields() { + shopName = ConfigurationEngine.setString(file, fileConfiguration, "Shop name", "[EM] Procedural Item Shop", true); + ItemStackSerializer.serialize( + "Reroll button", + ItemStackGenerator.generateSkullItemStack("magmaguy", + "&4&lEliteMobs &r&cby &4&lMagmaGuy", + List.of("&8Support the plugins you enjoy!"), MetadataHandler.signatureID), + fileConfiguration); + rerollItem = ItemStackSerializer.deserialize("Reroll button", fileConfiguration); + rerollSlot = ConfigurationEngine.setInt(fileConfiguration, "Reroll button slot", 4); + storeSlots = ConfigurationEngine.setList(file, fileConfiguration, "Store item slots", new ArrayList<>(List.of(9, 10, 11, 12, + 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 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)), false); + minTier = ConfigurationEngine.setInt(fileConfiguration, "Minimum store item tier", 0); + maxTier = ConfigurationEngine.setInt(fileConfiguration, "Maximum store item tier", 5); + messageFullInventory = ConfigurationEngine.setString(file, fileConfiguration, "Full inventory message", + "&7[EliteMobs] &4Your inventory is full! You can't buy items until you get some free space.", true); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/menus/premade/QuestMenuConfig.java b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/QuestMenuConfig.java new file mode 100644 index 000000000..ce93961c4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/QuestMenuConfig.java @@ -0,0 +1,70 @@ +package com.magmaguy.elitemobs.config.menus.premade; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.menus.MenusConfigFields; +import com.magmaguy.elitemobs.utils.ItemStackSerializer; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class QuestMenuConfig extends MenusConfigFields { + public static String menuName, questSelectorMenuTitle; + public static ItemStack validTierButton, inactiveTierButton, invalidTierButton; + public static String cancelMessagePart1, cancelMessagePart2, cancelMessagePart3; + public static ItemStack killObjectiveButton; + public static String questCancelMessage, questStartTitle, questStartSubtitle, questCompleteTitle, questCompleteSubtitle, + objectiveString, rewardMessage, questCompleteBroadcastMessage, questStatusMessage, questStartBroadcastMessage; + + public QuestMenuConfig() { + super("quest_menu", true); + } + + @Override + public void processAdditionalFields() { + menuName = ConfigurationEngine.setString(file, fileConfiguration, "menuName", "[EM] Quest Selection", true); + + ItemStackSerializer.serialize( + "validTierButton", + ItemStackGenerator.generateItemStack(Material.GREEN_STAINED_GLASS_PANE, + "&2Take on a $rank &2quest!", + new ArrayList<>(List.of( + "&aAccept a $rank &aquest and", + "&aget special rewards!")), MetadataHandler.signatureID), + fileConfiguration); + validTierButton = ItemStackSerializer.deserialize("validTierButton", fileConfiguration); + + cancelMessagePart1 = ConfigurationEngine.setString(file, fileConfiguration, "cancelQuestMessage1", + "&c&l&m&o---------------------------------------------" + + "&cYou can only have one quest at a time! Cancelling your ongoing quest will reset quest progress!", true); + cancelMessagePart2 = ConfigurationEngine.setString(file, fileConfiguration, "cancelQuestMessage2", "&2[Click here to cancel current quest!]", true); + cancelMessagePart3 = ConfigurationEngine.setString(file, fileConfiguration, "cancelQuestMessage3", + "&7You can see your quest status with the command &a/em quest status" + + "&c&l&m&o---------------------------------------------", true); + + ItemStackSerializer.serialize( + "killObjectiveButton", + ItemStackGenerator.generateItemStack(Material.YELLOW_STAINED_GLASS_PANE, + "&2Kill $objectiveAmount $objectiveName", + new ArrayList<>(List.of( + "&aKill $objectiveAmount $objectiveName &amobs.", + "&fProgress: &a$currentAmount &f/&c $objectiveAmount", + "&aReward: &e $rewardAmount")), MetadataHandler.signatureID), + fileConfiguration); + killObjectiveButton = ItemStackSerializer.deserialize("killObjectiveButton", fileConfiguration); + + questCancelMessage = ConfigurationEngine.setString(file, fileConfiguration, "questCancelMessage", "&7[EliteMobs] &cYour ongoing quest has been cancelled!", true); + questStartTitle = ConfigurationEngine.setString(file, fileConfiguration, "questStartTitle", "You have accepted a quest!", true); + questStartSubtitle = ConfigurationEngine.setString(file, fileConfiguration, "questStartSubtitle", "Slay $objectiveAmount $objectiveName", true); + questCompleteTitle = ConfigurationEngine.setString(file, fileConfiguration, "questCompleteTitle", "Quest complete!", true); + questCompleteSubtitle = ConfigurationEngine.setString(file, fileConfiguration, "questCompleteSubtitle", "You have slain $objectiveAmount $objectiveName", true); + objectiveString = ConfigurationEngine.setString(file, fileConfiguration, "bossBarObjective", "Slay $objectiveAmount $objectiveName", true); + rewardMessage = ConfigurationEngine.setString(file, fileConfiguration, "questRewardMessage", "&7[EM] &aQuest completed! &6Your reward is &2$reward $currencyName", true); + questCompleteBroadcastMessage = ConfigurationEngine.setString(file, fileConfiguration, "questCompleteBroadcastMessage", "&7[EM] $player &2has completed a $rank &2quest!", true); + questStartBroadcastMessage = ConfigurationEngine.setString(file, fileConfiguration, "questStartBroadcastMessage", "&7[EM] $player &2has accepted a $rank &2quest!", true); + questStatusMessage = ConfigurationEngine.setString(file, fileConfiguration, "questStatusMessage", "&7[EM] &aYou've slain &a$currentAmount &f/ &c$objectiveAmount &a$objectiveName", true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/menus/premade/RepairMenuConfig.java b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/RepairMenuConfig.java new file mode 100644 index 000000000..30132b9d4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/RepairMenuConfig.java @@ -0,0 +1,86 @@ +package com.magmaguy.elitemobs.config.menus.premade; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.menus.MenusConfigFields; +import com.magmaguy.elitemobs.utils.ItemStackSerializer; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class RepairMenuConfig extends MenusConfigFields { + + public static String shopName; + public static ItemStack infoButton; + public static ItemStack eliteItemInputInfoButton; + public static ItemStack eliteScrapInputInfoButton; + public static ItemStack outputInfoButton; + public static int infoSlot; + public static int eliteItemInputInformationSlot; + public static int eliteScrapInputInformationSlot; + public static int outputInformationSlot; + public static int eliteItemInputSlot; + public static int eliteScrapInputSlot; + public static int outputSlot; + public static ItemStack cancelButton; + public static int cancelSlot; + public static ItemStack confirmButton; + public static int confirmSlot; + + public RepairMenuConfig() { + super("repair_menu", true); + } + + @Override + public void processAdditionalFields() { + shopName = ConfigurationEngine.setString(file, fileConfiguration, "shopName", "[EM] Repair menu!", true); + ItemStackSerializer.serialize( + "infoButton", + ItemStackGenerator.generateSkullItemStack("magmaguy", + "&4&lEliteMobs &r&cby &4&lMagmaGuy", + new ArrayList<>(List.of("&8Support the plugins you enjoy!", + "&aUse scrap to repair elite items!")), MetadataHandler.signatureID), + fileConfiguration); + infoButton = ItemStackSerializer.deserialize("infoButton", fileConfiguration); + infoSlot = ConfigurationEngine.setInt(fileConfiguration, "infoButtonSlot", 4); + eliteItemInputInformationSlot = ConfigurationEngine.setInt(fileConfiguration, "eliteItemInputInformationSlot", 20); + eliteItemInputSlot = ConfigurationEngine.setInt(fileConfiguration, "eliteItemInputSlot", 29); + ItemStackSerializer.serialize( + "eliteItemInputInformationButton", + ItemStackGenerator.generateItemStack(Material.GREEN_BANNER, + "&2 Elite Item Input slots", + List.of("&aThis slot is for your elite item!"), MetadataHandler.signatureID), + fileConfiguration); + eliteItemInputInfoButton = ItemStackSerializer.deserialize("eliteItemInputInformationButton", fileConfiguration); + eliteScrapInputInformationSlot = ConfigurationEngine.setInt(fileConfiguration, "eliteScrapInputInformationSlot", 22); + eliteScrapInputSlot = ConfigurationEngine.setInt(fileConfiguration, "eliteScrapInputSlot", 31); + ItemStackSerializer.serialize( + "eliteScrapInputInformationButton", + ItemStackGenerator.generateItemStack(Material.GREEN_BANNER, + "&2Elite Scrap Input slots", + List.of("&aThis slot is for your elite scrap!"), MetadataHandler.signatureID), + fileConfiguration); + eliteScrapInputInfoButton = ItemStackSerializer.deserialize("eliteScrapInputInformationButton", fileConfiguration); + outputInformationSlot = ConfigurationEngine.setInt(fileConfiguration, "informationOutputButtonSlot", 24); + outputSlot = ConfigurationEngine.setInt(fileConfiguration, "outputSlot", 33); + ItemStackSerializer.serialize("cancelButton", ItemStackGenerator.generateItemStack(Material.BARRIER, + "&4Cancel", List.of("&cCancel repair!"), MetadataHandler.signatureID), fileConfiguration); + ItemStackSerializer.serialize( + "outputInformationButton", + ItemStackGenerator.generateItemStack(Material.RED_BANNER, + "&2Output slots", + List.of("&aThis slot previews the result of your repair!"), MetadataHandler.signatureID), + fileConfiguration); + outputInfoButton = ItemStackSerializer.deserialize("outputInformationButton", fileConfiguration); + cancelButton = ItemStackSerializer.deserialize("cancelButton", fileConfiguration); + cancelSlot = ConfigurationEngine.setInt(fileConfiguration, "cancelButtonSlot", 27); + ItemStackSerializer.serialize("confirmButton", ItemStackGenerator.generateItemStack(Material.EMERALD, + "&2Confirm!", List.of("&aRepair item!"), 31174), fileConfiguration); + confirmButton = ItemStackSerializer.deserialize("confirmButton", fileConfiguration); + confirmSlot = ConfigurationEngine.setInt(fileConfiguration, "confirmRepairSlot", 35); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/menus/premade/ScrapperMenuConfig.java b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/ScrapperMenuConfig.java new file mode 100644 index 000000000..90b1cac0d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/ScrapperMenuConfig.java @@ -0,0 +1,60 @@ +package com.magmaguy.elitemobs.config.menus.premade; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.menus.MenusConfigFields; +import com.magmaguy.elitemobs.utils.ItemStackSerializer; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class ScrapperMenuConfig extends MenusConfigFields { + + public static String shopName; + public static ItemStack infoButton; + public static int infoSlot; + public static List storeSlots; + public static ItemStack cancelButton; + public static int cancelSlot; + public static ItemStack confirmButton; + public static int confirmSlot; + public static double scrapChance; + + public ScrapperMenuConfig() { + super("scrapper_menu", true); + } + + @Override + public void processAdditionalFields() { + shopName = ConfigurationEngine.setString(file, fileConfiguration, "shopName", "[EM] Scrapper", true); + ItemStackSerializer.serialize( + "infoButton", + ItemStackGenerator.generateSkullItemStack("magmaguy", + "&4&lEliteMobs &r&cby &4&lMagmaGuy", + new ArrayList<>(List.of("&8Support the plugins you enjoy!", + "&4Warning!", + "&cItems scrapped here are lost!", + "&cThere is a $chance% chance to get", + "&cscrap when scrapping items!", + "&aUse scrap at the smelter,", + "&arepairman and refiner!")), MetadataHandler.signatureID), + fileConfiguration); + infoButton = ItemStackSerializer.deserialize("infoButton", fileConfiguration); + infoSlot = ConfigurationEngine.setInt(fileConfiguration, "infoButtonSlot", 4); + storeSlots = ConfigurationEngine.setList(file, fileConfiguration, "scrapSlots", new ArrayList<>(List.of(19, 20, 21, 22, 23, + 24, 25, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43)), false); + ItemStackSerializer.serialize("cancelButton", ItemStackGenerator.generateItemStack(Material.BARRIER, + "&4Cancel", List.of("&cCancel scrap!"), MetadataHandler.signatureID), fileConfiguration); + cancelButton = ItemStackSerializer.deserialize("cancelButton", fileConfiguration); + cancelSlot = ConfigurationEngine.setInt(fileConfiguration, "cancelButtonSlot", 27); + ItemStackSerializer.serialize("confirmButton", ItemStackGenerator.generateItemStack(Material.EMERALD, + "&2Confirm Scrap", new ArrayList<>(List.of("&aScrap items!", "&a$chance% chance of success!")), 31174), fileConfiguration); + confirmButton = ItemStackSerializer.deserialize("confirmButton", fileConfiguration); + confirmSlot = ConfigurationEngine.setInt(fileConfiguration, "confirmScrapSlot", 35); + scrapChance = ConfigurationEngine.setDouble(fileConfiguration, "scrapChance", 0.75); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/menus/premade/SellMenuConfig.java b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/SellMenuConfig.java new file mode 100644 index 000000000..97039ddad --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/SellMenuConfig.java @@ -0,0 +1,56 @@ +package com.magmaguy.elitemobs.config.menus.premade; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.menus.MenusConfigFields; +import com.magmaguy.elitemobs.utils.ItemStackSerializer; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class SellMenuConfig extends MenusConfigFields { + public static String shopName; + public static ItemStack infoButton; + public static int infoSlot; + public static List storeSlots; + public static ItemStack cancelButton; + public static int cancelSlot; + public static ItemStack confirmButton; + public static int confirmSlot; + + public SellMenuConfig() { + super("sell_menu", true); + } + + @Override + public void processAdditionalFields() { + shopName = ConfigurationEngine.setString(file, fileConfiguration, "shopName", "[EM] Sell Shop", true); + ItemStackSerializer.serialize( + "infoButton", + ItemStackGenerator.generateSkullItemStack("magmaguy", + "&4&lEliteMobs &r&cby &4&lMagmaGuy", + new ArrayList<>(List.of("&8Support the plugins you enjoy!", + "&4Warning!", + "&cYou can only sell special", + "&cElite Mobs drops in this", + "&cshop! These should have", + "&ca value on their lore.")), MetadataHandler.signatureID), + fileConfiguration); + infoButton = ItemStackSerializer.deserialize("infoButton", fileConfiguration); + infoSlot = ConfigurationEngine.setInt(fileConfiguration, "infoButtonSlot", 4); + storeSlots = ConfigurationEngine.setList(file, fileConfiguration, "sellSlots", new ArrayList<>(List.of(19, 20, 21, 22, 23, + 24, 25, 28, 29, 30, 31, 32, 33, 34, 37, 38, 39, 40, 41, 42, 43)), false); + ItemStackSerializer.serialize("cancelButton", ItemStackGenerator.generateItemStack(Material.BARRIER, + "&4Cancel", List.of("&cCancel purchase!"), MetadataHandler.signatureID), fileConfiguration); + cancelButton = ItemStackSerializer.deserialize("cancelButton", fileConfiguration); + cancelSlot = ConfigurationEngine.setInt(fileConfiguration, "cancelButtonSlot", 27); + ItemStackSerializer.serialize("confirmButton", ItemStackGenerator.generateItemStack(Material.EMERALD, + "&2Confirm Sale", new ArrayList<>(List.of("&aSell item for", "&a$currency_amount $currency_name")), MetadataHandler.signatureID), fileConfiguration); + confirmButton = ItemStackSerializer.deserialize("confirmButton", fileConfiguration); + confirmSlot = ConfigurationEngine.setInt(fileConfiguration, "confirmSaleSlot", 35); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/menus/premade/UnbinderMenuConfig.java b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/UnbinderMenuConfig.java new file mode 100644 index 000000000..11b2c6af3 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/menus/premade/UnbinderMenuConfig.java @@ -0,0 +1,102 @@ +package com.magmaguy.elitemobs.config.menus.premade; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.menus.MenusConfigFields; +import com.magmaguy.elitemobs.utils.ItemStackSerializer; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import lombok.Getter; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.List; + +public class UnbinderMenuConfig extends MenusConfigFields { + + @Getter + private static String shopName; + @Getter + private static ItemStack infoButton; + @Getter + private static ItemStack eliteItemInputInfoButton; + @Getter + private static ItemStack eliteUnbindInputInfoButton; + @Getter + private static ItemStack outputInfoButton; + @Getter + private static int infoSlot; + @Getter + private static int eliteItemInputInformationSlot; + @Getter + private static int eliteScrapInputInformationSlot; + @Getter + private static int outputInformationSlot; + @Getter + private static int eliteItemInputSlot; + @Getter + private static int eliteUnbindInputSlot; + @Getter + private static int outputSlot; + @Getter + private static ItemStack cancelButton; + @Getter + private static int cancelSlot; + @Getter + private static ItemStack confirmButton; + @Getter + private static int confirmSlot; + + public UnbinderMenuConfig() { + super("unbind_menu", true); + } + + @Override + public void processAdditionalFields() { + shopName = ConfigurationEngine.setString(file, fileConfiguration, "shopName", "[EM] Unbind menu!", true); + ItemStackSerializer.serialize( + "infoButton", + ItemStackGenerator.generateSkullItemStack("magmaguy", + "&4&lEliteMobs &r&cby &4&lMagmaGuy", + new ArrayList<>(List.of("&8Support the plugins you enjoy!", + "&aUse an &5Unbind Scroll &ato remove Soulbind from an item!")), MetadataHandler.signatureID), + fileConfiguration); + infoButton = ItemStackSerializer.deserialize("infoButton", fileConfiguration); + infoSlot = ConfigurationEngine.setInt(fileConfiguration, "infoButtonSlot", 4); + eliteItemInputInformationSlot = ConfigurationEngine.setInt(fileConfiguration, "eliteItemInputInformationSlot", 20); + eliteItemInputSlot = ConfigurationEngine.setInt(fileConfiguration, "eliteItemInputSlot", 29); + ItemStackSerializer.serialize( + "eliteItemInputInformationButton", + ItemStackGenerator.generateItemStack(Material.GREEN_BANNER, + "&2Elite Item Input slots", + List.of("&aThis slot is for your elite item!"), MetadataHandler.signatureID), + fileConfiguration); + eliteItemInputInfoButton = ItemStackSerializer.deserialize("eliteItemInputInformationButton", fileConfiguration); + eliteScrapInputInformationSlot = ConfigurationEngine.setInt(fileConfiguration, "unbindScrollInputInformationSlot", 22); + eliteUnbindInputSlot = ConfigurationEngine.setInt(fileConfiguration, "unbindScrollInputSlot", 31); + ItemStackSerializer.serialize( + "unbindScrollInputInformationButton", + ItemStackGenerator.generateItemStack(Material.GREEN_BANNER, + "&5Unbind Scroll &aInput slots", + List.of("&aThis slot is for your &9Unbind Scroll&a!"), MetadataHandler.signatureID), + fileConfiguration); + eliteUnbindInputInfoButton = ItemStackSerializer.deserialize("unbindScrollInputInformationButton", fileConfiguration); + outputInformationSlot = ConfigurationEngine.setInt(fileConfiguration, "informationOutputButtonSlot", 24); + outputSlot = ConfigurationEngine.setInt(fileConfiguration, "outputSlot", 33); + ItemStackSerializer.serialize("cancelButton", ItemStackGenerator.generateItemStack(Material.BARRIER, + "&4Cancel", List.of("&cCancel unbind!"), MetadataHandler.signatureID), fileConfiguration); + ItemStackSerializer.serialize( + "outputInformationButton", + ItemStackGenerator.generateItemStack(Material.RED_BANNER, + "&2Unbound Item Output slot", + List.of("&aThis slot previews the result of your unbind!"), MetadataHandler.signatureID), + fileConfiguration); + outputInfoButton = ItemStackSerializer.deserialize("outputInformationButton", fileConfiguration); + cancelButton = ItemStackSerializer.deserialize("cancelButton", fileConfiguration); + cancelSlot = ConfigurationEngine.setInt(fileConfiguration, "cancelButtonSlot", 27); + ItemStackSerializer.serialize("confirmButton", ItemStackGenerator.generateItemStack(Material.EMERALD, + "&2Confirm!", List.of("&aUnbind item!"), 31175), fileConfiguration); + confirmButton = ItemStackSerializer.deserialize("confirmButton", fileConfiguration); + confirmSlot = ConfigurationEngine.setInt(fileConfiguration, "confirmUnbindSlot", 35); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/MobPropertiesConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/MobPropertiesConfig.java new file mode 100644 index 000000000..a643065ff --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/MobPropertiesConfig.java @@ -0,0 +1,97 @@ +package com.magmaguy.elitemobs.config.mobproperties; + +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.mobproperties.premade.*; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.EntityType; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class MobPropertiesConfig { + + private static final HashMap mobProperties = new HashMap<>(); + private static final ArrayList mobPropertiesConfigFieldsList = new ArrayList(new ArrayList<>(List.of( + new EliteBlazeConfig(), + new EliteCaveSpiderConfig(), + new EliteCreeperConfig(), + new EliteDrownedConfig(), + new EliteElderGuardianConfig(), + new EliteGuardianConfig(), + new EliteEndermanConfig(), + new EliteEndermiteConfig(), + new EliteEvokerConfig(), + new EliteHuskConfig(), + new EliteIllusionerConfig(), + new EliteIronGolemConfig(), + new ElitePhantomConfig(), + new ElitePillagerConfig(), + new ElitePolarBearConfig(), + new EliteRavagerConfig(), + new EliteSilverfishConfig(), + new EliteSkeletonConfig(), + new EliteSpiderConfig(), + new EliteStrayConfig(), + new EliteVexConfig(), + new EliteVindicatorConfig(), + new EliteWitchConfig(), + new EliteWitherSkeletonConfig(), + new EliteZombieConfig(), + new EliteGhastConfig(), + new EliteWolfConfig(), + new EliteEnderDragon(), + new EliteShulkerConfig(), + new EliteKillerBunnyConfig(), + new EliteLlamaConfig(), + new EliteSlimeConfig(), + new EliteMagmaCubeConfig(), + new EliteBoggedConfig(), + new EliteWardenConfig(), + new EliteGoatConfig(), + new EliteZombiefiedPiglin(), + new EliteZoglinConfig(), + new ElitePiglinConfig(), + new EliteHoglinConfig(), + new ElitePiglinBruteConfig(), + new EliteBeeConfig(), + new EliteBreezeConfig(), + new EliteWitherConfig() + ))); + + public static HashMap getMobProperties() { + return mobProperties; + } + + public static void addMobProperties(EntityType entityType, MobPropertiesConfigFields mobPropertiesConfigFields) { + mobProperties.put(entityType, mobPropertiesConfigFields); + } + + public static void initializeConfigs() { + + //Version checking goes here, only leaving this as an easy reference for post 1.21 versions +// if (!VersionChecker.serverVersionOlderThan(16, 2)) +// mobPropertiesConfigFieldsList.add(new ElitePiglinBruteConfig()); + + for (MobPropertiesConfigFields mobPropertiesConfigFields : mobPropertiesConfigFieldsList) + initializeConfiguration(mobPropertiesConfigFields); + } + + /** + * Initializes a single instance of a premade configuration using the default values. + */ + private static FileConfiguration initializeConfiguration(MobPropertiesConfigFields mobPropertiesConfigFields) { + + File file = ConfigurationEngine.fileCreator("mobproperties", mobPropertiesConfigFields.getFileName()); + FileConfiguration fileConfiguration = ConfigurationEngine.fileConfigurationCreator(file); + mobPropertiesConfigFields.generateConfigDefaults(fileConfiguration); + ConfigurationEngine.fileSaverOnlyDefaults(fileConfiguration, file); + + addMobProperties(mobPropertiesConfigFields.getEntityType(), new MobPropertiesConfigFields(fileConfiguration, file)); + + return fileConfiguration; + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/MobPropertiesConfigFields.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/MobPropertiesConfigFields.java new file mode 100644 index 000000000..4f1721407 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/MobPropertiesConfigFields.java @@ -0,0 +1,75 @@ +package com.magmaguy.elitemobs.config.mobproperties; + +import com.magmaguy.elitemobs.config.translations.TranslationsConfig; +import com.magmaguy.magmacore.util.ChatColorConverter; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.EntityType; + +import java.io.File; +import java.util.List; + +public class MobPropertiesConfigFields { + + private final String fileName; + private final EntityType entityType; + private final boolean isEnabled; + private final String name; + private final List deathMessages; + private final double baseDamage; + + public MobPropertiesConfigFields(String fileName, + EntityType entityType, + boolean isEnabled, + String name, + List deathMessages, + double baseDamage) { + this.fileName = fileName + ".yml"; + this.entityType = entityType; + this.isEnabled = isEnabled; + this.name = name; + this.deathMessages = deathMessages; + this.baseDamage = baseDamage; + } + + public MobPropertiesConfigFields(FileConfiguration configuration, File file) { + this.fileName = file.getName(); + this.entityType = EntityType.valueOf(configuration.getString("entityType")); + this.isEnabled = configuration.getBoolean("isEnabled"); + this.name = TranslationsConfig.add(fileName, "name", configuration.getString("name")); + this.deathMessages = TranslationsConfig.add(fileName, "deathMessages", configuration.getStringList("deathMessages")); + this.baseDamage = configuration.getDouble("baseDamageV2"); + } + + public void generateConfigDefaults(FileConfiguration fileConfiguration) { + fileConfiguration.addDefault("isEnabled", isEnabled); + fileConfiguration.addDefault("entityType", entityType.toString()); + fileConfiguration.addDefault("name", name); + fileConfiguration.addDefault("deathMessages", deathMessages); + fileConfiguration.addDefault("baseDamageV2", baseDamage); + } + + public String getFileName() { + return fileName; + } + + public EntityType getEntityType() { + return entityType; + } + + public boolean isEnabled() { + return isEnabled; + } + + public String getName() { + return ChatColorConverter.convert(name); + } + + public List getDeathMessages() { + return deathMessages; + } + + public double getBaseDamage() { + return this.baseDamage; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteBeeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteBeeConfig.java new file mode 100644 index 000000000..4e97cb187 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteBeeConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.List; + +public class EliteBeeConfig extends MobPropertiesConfigFields { + public EliteBeeConfig() { + super("elite_bee", + EntityType.BEE, + true, + "&fLvl &2$level &fElite &eBee", + List.of("$player &cwas stung by $entity!"), + 3); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteBlazeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteBlazeConfig.java new file mode 100644 index 000000000..36ad6f1c1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteBlazeConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.List; + +public class EliteBlazeConfig extends MobPropertiesConfigFields { + public EliteBlazeConfig() { + super("elite_blaze", + EntityType.BLAZE, + true, + "&fLvl &2$level &fElite &eBlaze", + List.of("$player &cwas lit ablaze by $entity!"), + 9); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteBoggedConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteBoggedConfig.java new file mode 100644 index 000000000..94b153a6b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteBoggedConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.List; + +public class EliteBoggedConfig extends MobPropertiesConfigFields { + public EliteBoggedConfig() { + super("elite_bogged", + EntityType.BOGGED, + true, + "&2Lvl &2$level &2Elite &eBogged", + List.of("$player &cwas poisoned by $entity!"), + 5); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteBreezeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteBreezeConfig.java new file mode 100644 index 000000000..201efca76 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteBreezeConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.List; + +public class EliteBreezeConfig extends MobPropertiesConfigFields { + public EliteBreezeConfig() { + super("elite_breeze", + EntityType.BREEZE, + true, + "&2Lvl &2$level &2Elite &eBreeze", + List.of("$player &cwas blown away by $entity!"), + 1.5); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteCaveSpiderConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteCaveSpiderConfig.java new file mode 100644 index 000000000..cc852ac88 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteCaveSpiderConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.List; + +public class EliteCaveSpiderConfig extends MobPropertiesConfigFields { + public EliteCaveSpiderConfig() { + super("elite_cave_spider", + EntityType.CAVE_SPIDER, + true, + "&fLvl &2$level &fElite &3Cave Spider", + List.of("$player &cbecame entangled in $entity's &cweb!"), + 3); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteCreeperConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteCreeperConfig.java new file mode 100644 index 000000000..5c03f1190 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteCreeperConfig.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class EliteCreeperConfig extends MobPropertiesConfigFields { + public EliteCreeperConfig() { + super("elite_creeper", + EntityType.CREEPER, + true, + "&fLvl &2$level &fElite &2Creeper", + new ArrayList<>(List.of("$player &cwas blasted away by $entity!", + "$entity &cjust oh man'd $player&c!")), + 64.5); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteDrownedConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteDrownedConfig.java new file mode 100644 index 000000000..b98fda444 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteDrownedConfig.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class EliteDrownedConfig extends MobPropertiesConfigFields { + public EliteDrownedConfig() { + super("elite_drowned", + EntityType.DROWNED, + true, + "&fLvl &2$level &fElite &3Drowned", + new ArrayList<>(List.of("$player &chas been brought down to the depths by $entity!", + "$player &chas been drowned by $entity!")), + 4); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteElderGuardianConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteElderGuardianConfig.java new file mode 100644 index 000000000..3f6834e01 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteElderGuardianConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.List; + +public class EliteElderGuardianConfig extends MobPropertiesConfigFields { + public EliteElderGuardianConfig() { + super("elite_elder_guardian", + EntityType.ELDER_GUARDIAN, + true, + "&fLvl &2$level &fElite &3Elder Guardian", + List.of("$entity &cprevented $player &cfrom exploring the depths!"), + 12); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteEnderDragon.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteEnderDragon.java new file mode 100644 index 000000000..8ea283c57 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteEnderDragon.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.List; + +public class EliteEnderDragon extends MobPropertiesConfigFields { + public EliteEnderDragon() { + super("elite_ender_dragon", + EntityType.ENDER_DRAGON, + true, + "&fLvl &2$level &fElite &5Ender Dragon", + List.of("$entity &chas ended $player!"), + 7); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteEndermanConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteEndermanConfig.java new file mode 100644 index 000000000..274ae1b13 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteEndermanConfig.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class EliteEndermanConfig extends MobPropertiesConfigFields { + public EliteEndermanConfig() { + super("elite_enderman", + EntityType.ENDERMAN, + true, + "&fLvl &2$level &fElite &5Enderman", + new ArrayList<>(List.of("$entity &csent $player &cinto the void!", + "$player &clooked at $entity &cwrong!", + "$player &cand $entity &cbecame best friends!")), + 10); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteEndermiteConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteEndermiteConfig.java new file mode 100644 index 000000000..ce3eae5af --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteEndermiteConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.List; + +public class EliteEndermiteConfig extends MobPropertiesConfigFields { + public EliteEndermiteConfig() { + super("elitemob_endermite", + EntityType.ENDERMITE, + true, + "&fLvl &2$level &fElite &7Endermite", + List.of("$entity &cis to $player &cwhat David is to Goliath!"), + 3); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteEvokerConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteEvokerConfig.java new file mode 100644 index 000000000..d36504575 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteEvokerConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.List; + +public class EliteEvokerConfig extends MobPropertiesConfigFields { + public EliteEvokerConfig() { + super("elite_evoker", + EntityType.EVOKER, + true, + "&fLvl &2$level &fElite &5Evoker", + List.of("$player &cwas enchanted by $entity&c!"), + 9); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteGhastConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteGhastConfig.java new file mode 100644 index 000000000..7e469fb0d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteGhastConfig.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class EliteGhastConfig extends MobPropertiesConfigFields { + public EliteGhastConfig() { + super("elite_ghast", + EntityType.GHAST, + true, + "&fLvl &2$level &fElite &fGhast", + new ArrayList<>(List.of("$player &cdidn't dodge $entity&c &cfireballs!", + "$player &cwas blown to bits $entity&c!", + "$entity &cgot $player's &cbacon!")), + 22.5); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteGoatConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteGoatConfig.java new file mode 100644 index 000000000..9e468bd2b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteGoatConfig.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class EliteGoatConfig extends MobPropertiesConfigFields { + public EliteGoatConfig() { + super("elite_goat", + EntityType.GOAT, + true, + "&fLvl &2$level &fElite &5Goat", + new ArrayList<>(List.of("$player &cwas rammed by $entity&c!", + "$player &cwas run over by $entity&c!", + "$player &cwas trampled by $entity&c!", + "$player &cgot $entity&c horns!")), + 3); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteGuardianConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteGuardianConfig.java new file mode 100644 index 000000000..46653977c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteGuardianConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.List; + +public class EliteGuardianConfig extends MobPropertiesConfigFields { + public EliteGuardianConfig() { + super("elite_guardian", + EntityType.GUARDIAN, + true, + "&fLvl &2$level &fElite &3Guardian", + List.of("$entity &cprevented $player &cfrom exploring the depths!"), + 9); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteHoglinConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteHoglinConfig.java new file mode 100644 index 000000000..07e8fbdbe --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteHoglinConfig.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class EliteHoglinConfig extends MobPropertiesConfigFields { + public EliteHoglinConfig() { + super("elite_hoglin", + EntityType.HOGLIN, + true, + "&fLvl &2$level &fElite &dHoglin", + new ArrayList<>(List.of("$player &cmessed with the $entity &cand got the horns!", + "$entity &cgot $player's &cbacon!")), + 8); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteHuskConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteHuskConfig.java new file mode 100644 index 000000000..95f01dc5a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteHuskConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.List; + +public class EliteHuskConfig extends MobPropertiesConfigFields { + public EliteHuskConfig() { + super("elite_husk", + EntityType.HUSK, + true, + "&fLvl &2$level &fElite &7Husk", + List.of("$player &cwas hollowed out by $entity&c!"), + 5); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteIllusionerConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteIllusionerConfig.java new file mode 100644 index 000000000..c73b0789d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteIllusionerConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.List; + +public class EliteIllusionerConfig extends MobPropertiesConfigFields { + public EliteIllusionerConfig() { + super("elite_illusioner", + EntityType.ILLUSIONER, + true, + "&fLvl &2$level &fElite &8Illusioner", + List.of("$player&c fell for $entity's &cillusions!"), + 5); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteIronGolemConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteIronGolemConfig.java new file mode 100644 index 000000000..3755ccabb --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteIronGolemConfig.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class EliteIronGolemConfig extends MobPropertiesConfigFields { + public EliteIronGolemConfig() { + super("elite_iron_golem", + EntityType.IRON_GOLEM, + true, + "&fLvl &2$level &fElite &fIron Golem", + new ArrayList<>(List.of("$player &cmessed with the wrong $entity&c!", + "$player &chas been taught the way of fist by $entity&c!")), + 15); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteKillerBunnyConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteKillerBunnyConfig.java new file mode 100644 index 000000000..640f39e74 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteKillerBunnyConfig.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class EliteKillerBunnyConfig extends MobPropertiesConfigFields { + public EliteKillerBunnyConfig() { + super("elite_killer_bunny", + EntityType.RABBIT, + true, + "&fLvl &2$level &fElite &cKiller Rabbit", + new ArrayList<>(List.of("$entity &cmade $player &cgo live in a farm upstate!", + "$entity &ceducated $player using a stick and not a carrot!")), + 12); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteLlamaConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteLlamaConfig.java new file mode 100644 index 000000000..584582952 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteLlamaConfig.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class EliteLlamaConfig extends MobPropertiesConfigFields { + public EliteLlamaConfig() { + super("elite_llama", + EntityType.LLAMA, + true, + "&fLvl &2$level &fElite &5Llama", + new ArrayList<>(List.of("$player &cwas spit on by $entity&c!", + "$player &cwas made $entity&c angry!")), + 1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteMagmaCubeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteMagmaCubeConfig.java new file mode 100644 index 000000000..aa0a5b096 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteMagmaCubeConfig.java @@ -0,0 +1,18 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class EliteMagmaCubeConfig extends MobPropertiesConfigFields { + public EliteMagmaCubeConfig() { + super("elite_magma_cube", + EntityType.MAGMA_CUBE, + true, + "&2Lvl &2$level &fElite &6Magma Cube", + new ArrayList<>(List.of("$player was incinerated by $entity&f!", "$player got too close to $entity&f!")), + 6); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/ElitePhantomConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/ElitePhantomConfig.java new file mode 100644 index 000000000..7d1272bbd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/ElitePhantomConfig.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class ElitePhantomConfig extends MobPropertiesConfigFields { + public ElitePhantomConfig() { + super("elite_phantom", + EntityType.PHANTOM, + true, + "&fLvl &2$level &fElite &9Phantom", + new ArrayList<>(List.of("$player &cjust had a bad nightmare about $entity&c!", + "$player &cwill be having nightmares about $entity&c!", + "$entity &chas taught $player &cthe value of sleep!")), + 9); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/ElitePiglinBruteConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/ElitePiglinBruteConfig.java new file mode 100644 index 000000000..b984e49fc --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/ElitePiglinBruteConfig.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class ElitePiglinBruteConfig extends MobPropertiesConfigFields { + public ElitePiglinBruteConfig() { + super("elite_piglin_brute", + EntityType.PIGLIN_BRUTE, + true, + "&fLvl &2$level &fElite &cPiglin Brute", + new ArrayList<>(List.of("$entity &ctenderized $player!", + "$entity &cbrutalized $player!")), + 19.5); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/ElitePiglinConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/ElitePiglinConfig.java new file mode 100644 index 000000000..8b5c70642 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/ElitePiglinConfig.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class ElitePiglinConfig extends MobPropertiesConfigFields { + public ElitePiglinConfig() { + super("elite_piglin", + EntityType.PIGLIN, + true, + "&fLvl &2$level &fElite &ePiglin", + new ArrayList<>(List.of("$entity &cwill fetch a good price for $player's remains!", + "$entity &ctaught $player &cthe value of gold!")), + 13); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/ElitePillagerConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/ElitePillagerConfig.java new file mode 100644 index 000000000..6568d8a3b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/ElitePillagerConfig.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class ElitePillagerConfig extends MobPropertiesConfigFields { + public ElitePillagerConfig() { + super("elite_pillager", + EntityType.PILLAGER, + true, + "&fLvl &2$level &fElite &8Pillager", + new ArrayList<>(List.of("$entity &cplundered $player&c!", + "$entity &cpillaged $player&c!")), + 5); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/ElitePolarBearConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/ElitePolarBearConfig.java new file mode 100644 index 000000000..86fec980e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/ElitePolarBearConfig.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class ElitePolarBearConfig extends MobPropertiesConfigFields { + public ElitePolarBearConfig() { + super("elite_polar_bear", + EntityType.POLAR_BEAR, + true, + "&fLvl &2$level &fElite &fPolar Bear", + new ArrayList<>(List.of("$player &cwas clawed to death by $entity&c!", + "$player &cwas mauled to death by $entity&c!")), + 9); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteRavagerConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteRavagerConfig.java new file mode 100644 index 000000000..3674bb14f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteRavagerConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.List; + +public class EliteRavagerConfig extends MobPropertiesConfigFields { + public EliteRavagerConfig() { + super("elite_ravager", + EntityType.RAVAGER, + true, + "&fLvl &2$level &fElite &6Ravager", + List.of("$entity &cshowed $player &cwho's in charge!"), + 18); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteShulkerConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteShulkerConfig.java new file mode 100644 index 000000000..9dbfc220b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteShulkerConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.List; + +public class EliteShulkerConfig extends MobPropertiesConfigFields { + public EliteShulkerConfig() { + super("elite_shulker", + EntityType.SHULKER, + true, + "&fLvl &2$level &fElite &5Shulker", + List.of("$entity &cshowed $player &cnew heights!"), + 4); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteSilverfishConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteSilverfishConfig.java new file mode 100644 index 000000000..b9a7d75b4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteSilverfishConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.List; + +public class EliteSilverfishConfig extends MobPropertiesConfigFields { + public EliteSilverfishConfig() { + super("elite_silverfish", + EntityType.SILVERFISH, + true, + "&fLvl &2$level &fElite &7Silverfish", + List.of("$player &cmistook $entity &cfor a stone block!"), + 1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteSkeletonConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteSkeletonConfig.java new file mode 100644 index 000000000..7e0422a7c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteSkeletonConfig.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class EliteSkeletonConfig extends MobPropertiesConfigFields { + public EliteSkeletonConfig() { + super("elite_skeleton", + EntityType.SKELETON, + true, + "&fLvl &2$level &fElite &fSkeleton", + new ArrayList<>(List.of("$player &cbecame $entity's &cpin cushion!", + "$entity &cwanted to see $player's &cbones!")), + 5); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteSlimeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteSlimeConfig.java new file mode 100644 index 000000000..4d4120ff1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteSlimeConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.List; + +public class EliteSlimeConfig extends MobPropertiesConfigFields { + public EliteSlimeConfig() { + super("elite_slime", + EntityType.SLIME, + true, + "&2Lvl &2$level &fElite &2Slime", + List.of("$player was squished by $entity&f!"), + 6); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteSpiderConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteSpiderConfig.java new file mode 100644 index 000000000..fcc70791a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteSpiderConfig.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class EliteSpiderConfig extends MobPropertiesConfigFields { + public EliteSpiderConfig() { + super("elite_spider", + EntityType.SPIDER, + true, + "&fLvl &2$level &fElite &7Spider", + new ArrayList<>(List.of("$player &cbecame entangled in $entity's &cweb!", + "$entity &chas devoured $player&c!")), + 3); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteStrayConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteStrayConfig.java new file mode 100644 index 000000000..152d0216d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteStrayConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.List; + +public class EliteStrayConfig extends MobPropertiesConfigFields { + public EliteStrayConfig() { + super("elite_stray", + EntityType.STRAY, + true, + "&fLvl &2$level &fElite &bStray", + List.of("$player &cwas led astray by $entity&c!"), + 5); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteVexConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteVexConfig.java new file mode 100644 index 000000000..fd50dd288 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteVexConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.List; + +public class EliteVexConfig extends MobPropertiesConfigFields { + public EliteVexConfig() { + super("elite_vex", + EntityType.VEX, + true, + "&fLvl &2$level &fElite &bVex", + List.of("$entity &chas vexed $player&c!"), + 13); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteVindicatorConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteVindicatorConfig.java new file mode 100644 index 000000000..2d4df06ee --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteVindicatorConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.List; + +public class EliteVindicatorConfig extends MobPropertiesConfigFields { + public EliteVindicatorConfig() { + super("elite_vindicator", + EntityType.VINDICATOR, + true, + "&fLvl &2$level &fElite &8Vindicator", + List.of("$entity &cvindicated his fighting skills over $player&c!"), + 19.5); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteWardenConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteWardenConfig.java new file mode 100644 index 000000000..bb802d24b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteWardenConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.List; + +public class EliteWardenConfig extends MobPropertiesConfigFields { + public EliteWardenConfig() { + super("elite_warden", + EntityType.WARDEN, + true, + "&fLvl &2$level &fElite &3Warden", + List.of("$entity &csensed $player &cwas nearby!"), + 45); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteWitchConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteWitchConfig.java new file mode 100644 index 000000000..238c7f26a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteWitchConfig.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class EliteWitchConfig extends MobPropertiesConfigFields { + public EliteWitchConfig() { + super("elite_witch", + EntityType.WITCH, + true, + "&fLvl &2$level &fElite &5Witch", + new ArrayList<>(List.of("$player &cbecame $entity's &ctest subject!", + "$player &chas been bewitched by $entity&c!")), + 6); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteWitherConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteWitherConfig.java new file mode 100644 index 000000000..9996b3473 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteWitherConfig.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class EliteWitherConfig extends MobPropertiesConfigFields { + public EliteWitherConfig() { + super("elite_wither", + EntityType.WITHER, + true, + "&fLvl &2$level &7Elite &5Wither", + new ArrayList<>(List.of("$player &cangered $entity&c!", + "$player &chas met $entity's &cfury!")), + 12); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteWitherSkeletonConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteWitherSkeletonConfig.java new file mode 100644 index 000000000..e1f3c7070 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteWitherSkeletonConfig.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class EliteWitherSkeletonConfig extends MobPropertiesConfigFields { + public EliteWitherSkeletonConfig() { + super("elite_wither_skeleton", + EntityType.WITHER_SKELETON, + true, + "&fLvl &2$level &fElite &8Wither Skeleton", + new ArrayList<>(List.of("$entity's &carrows withered away $player&c!", + "$entity's &chas withered $player &caway!")), + 12); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteWolfConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteWolfConfig.java new file mode 100644 index 000000000..07d3ff86d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteWolfConfig.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class EliteWolfConfig extends MobPropertiesConfigFields { + public EliteWolfConfig() { + super("elite_wolf", + EntityType.WOLF, + true, + "[$level] Elite Wolf", + new ArrayList<>(List.of("$entity tore $player apart!", + "$player was torn to shreds by $entity!")), + 6); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteZoglinConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteZoglinConfig.java new file mode 100644 index 000000000..2749b9125 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteZoglinConfig.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class EliteZoglinConfig extends MobPropertiesConfigFields { + public EliteZoglinConfig() { + super("elite_zoglin", + EntityType.ZOGLIN, + true, + "&fLvl &2$level &fElite &dZoglin", + new ArrayList<>(List.of("$player &cmessed with the $entity &cand got the horns!", + "$entity &cgot $player's &cbacon!")), + 12); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteZombieConfig.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteZombieConfig.java new file mode 100644 index 000000000..c4a558f1e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteZombieConfig.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class EliteZombieConfig extends MobPropertiesConfigFields { + public EliteZombieConfig() { + super("elite_zombie", + EntityType.ZOMBIE, + true, + "&fLvl &2$level &fElite &2Zombie", + new ArrayList<>(List.of("$player &cwas devoured by $entity&c!", + "$entity &cgot to $player's &cbrains!")), + 5); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteZombiefiedPiglin.java b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteZombiefiedPiglin.java new file mode 100644 index 000000000..4f478e9ee --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/mobproperties/premade/EliteZombiefiedPiglin.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.mobproperties.premade; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfigFields; +import org.bukkit.entity.EntityType; + +import java.util.ArrayList; +import java.util.List; + +public class EliteZombiefiedPiglin extends MobPropertiesConfigFields { + public EliteZombiefiedPiglin() { + super("elite_zombified_piglin", + EntityType.ZOMBIFIED_PIGLIN, + true, + "&fLvl &2$level &fElite &6Zombified Piglin", + new ArrayList<>(List.of("$player &cwas mobbed to death by $entity&c!", + "$entity &cgot $player's &cbacon!")), + 12); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/NPCsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/NPCsConfig.java new file mode 100644 index 000000000..896165a63 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/NPCsConfig.java @@ -0,0 +1,28 @@ +package com.magmaguy.elitemobs.config.npcs; + +import com.magmaguy.elitemobs.npcs.NPCEntity; +import com.magmaguy.magmacore.config.CustomConfig; + +import java.util.HashMap; + +public class NPCsConfig extends CustomConfig { + + public static HashMap npcEntities; + + public NPCsConfig() { + super("npcs", "com.magmaguy.elitemobs.config.npcs.premade", NPCsConfigFields.class); + npcEntities = new HashMap<>(); + for (String key : super.getCustomConfigFieldsHashMap().keySet()) { + npcEntities.put(key, (NPCsConfigFields) super.getCustomConfigFieldsHashMap().get(key)); + //Initializes NPC entities + NPCsConfigFields npCsConfigFields = (NPCsConfigFields) super.getCustomConfigFieldsHashMap().get(key); + if (npCsConfigFields.isEnabled()) + NPCEntity.initializeNPCs(npCsConfigFields); + } + } + + public static HashMap getNpcEntities() { + return npcEntities; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/NPCsConfigFields.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/NPCsConfigFields.java new file mode 100644 index 000000000..13ea6d0a3 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/NPCsConfigFields.java @@ -0,0 +1,175 @@ +package com.magmaguy.elitemobs.config.npcs; + +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.CustomConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.entity.Villager; + +import java.util.ArrayList; +import java.util.List; + +public class NPCsConfigFields extends CustomConfigFields { + + @Getter + @Setter + public String noPreviousLocationMessage; + @Getter + @Setter + private String name = ""; + @Getter + @Setter + private String role = ""; + @Getter + @Setter + private Villager.Profession profession = Villager.Profession.NITWIT; + @Getter + private String spawnLocation; + @Getter + @Setter + private List greetings = new ArrayList<>(); + @Getter + @Setter + private List dialog = new ArrayList<>(); + @Getter + @Setter + private List farewell = new ArrayList<>(); + @Getter + @Setter + private boolean canTalk = true; + @Getter + @Setter + private double activationRadius = 3; + @Getter + @Setter + private NPCInteractions.NPCInteractionType interactionType = NPCInteractions.NPCInteractionType.NONE; + @Getter + @Setter + private double timeout = 0; + @Getter + @Setter + private List questFilenames = null; + /** + * Integration with LibsDisguises. Only used if that plugin is loaded. + */ + @Getter + @Setter + private String disguise = null; + @Getter + @Setter + private String customDisguiseData = null; + @Getter + @Setter + private String customModel = null; + @Getter + @Setter + private String arenaFilename; + @Getter + @Setter + private List locations = new ArrayList<>(); + @Getter + @Setter + private String command; + @Getter + @Setter + private boolean instanced = false; + @Getter + @Setter + private double scale = 1; + + public NPCsConfigFields(String fileName, + boolean isEnabled, + String name, + String role, + Villager.Profession profession, + String location, + List greetings, + List dialog, + List farewell, + boolean canTalk, + double activationRadius, + NPCInteractions.NPCInteractionType interactionType) { + super(fileName, isEnabled); + this.name = name; + this.role = role; + this.profession = profession; + this.spawnLocation = location; + this.greetings = greetings; + this.dialog = dialog; + this.farewell = farewell; + this.canTalk = canTalk; + this.activationRadius = activationRadius; + this.interactionType = interactionType; + } + + public NPCsConfigFields(String filename, + boolean isEnabled) { + super(filename, isEnabled); + } + + public void setSpawnLocation(String spawnLocation) { + this.locations.add(spawnLocation); + this.fileConfiguration.set("spawnLocations", locations); + try { + ConfigurationEngine.fileSaverCustomValues(fileConfiguration, this.file); + } catch (Exception ex) { + Logger.warn("Attempted to update the location status for an NPC with no config file! Did you delete it during runtime?"); + } + } + + @Override + public void processConfigFields() { + this.isEnabled = processBoolean("isEnabled", isEnabled, true, true); + this.name = translatable(filename, "name", processString("name", name, "", true)); + this.role = translatable(filename, "role", processString("role", role, "", true)); + try { + this.profession = Villager.Profession.valueOf(processString("profession", profession.toString(), Villager.Profession.NITWIT.toString(), false)); + } catch (IncompatibleClassChangeError e) { + //The early 1.21 API still used the profession enum, which was later dropped. This works for later releases, but not the early ones. + } catch (Exception e){ + Logger.warn("NPC in configuration file " + filename + " has an invalid profession!"); + } + this.spawnLocation = processString("spawnLocation", spawnLocation, null, true); + this.locations = processStringList("spawnLocations", locations, null, false); + this.greetings = translatable(filename, "greetings", processStringList("greetings", greetings, new ArrayList<>(), true)); + this.dialog = translatable(filename, "dialog", processStringList("dialog", dialog, new ArrayList<>(), true)); + this.farewell = translatable(filename, "farewell", processStringList("farewell", farewell, new ArrayList<>(), true)); + this.canTalk = processBoolean("canTalk", canTalk, true, true); + this.activationRadius = processDouble("activationRadius", activationRadius, 3, true); + this.interactionType = processEnum("interactionType", interactionType, NPCInteractions.NPCInteractionType.NONE, NPCInteractions.NPCInteractionType.class, true); + this.timeout = processDouble("timeout", timeout, 0, false); + this.noPreviousLocationMessage = translatable(filename, "noPreviousLocationMessage", processString("noPreviousLocationMessage", noPreviousLocationMessage, "", false)); + this.questFilenames = processStringList("questFileName", questFilenames, new ArrayList<>(), false); + this.disguise = processString("disguise", disguise, null, false); + this.customDisguiseData = processString("customDisguiseData", customDisguiseData, null, false); + this.customModel = processString("customModel", customModel, null, false); + this.arenaFilename = processString("arena", arenaFilename, null, false); + this.command = processString("command", command, null, false); + this.instanced = processBoolean("instanced", instanced, false, false); + this.scale = processDouble("scale", scale, 1, false); + } + + public void setEnabled(boolean enabled) { + this.isEnabled = enabled; + this.fileConfiguration.set("isEnabled", enabled); + try { + ConfigurationEngine.fileSaverCustomValues(this.fileConfiguration, this.file); + } catch (Exception e) { + Logger.warn("Attempted to update the enabled status for an NPC with no config file! Did you delete it during runtime?"); + } + } + + public void removeNPC(String locationString) { + if (locations == null) return; + locations.removeIf(entry -> entry.equals(locationString)); + this.fileConfiguration.set("spawnLocations", locations); + try { + ConfigurationEngine.fileSaverCustomValues(fileConfiguration, this.file); + } catch (Exception ex) { + Logger.warn("Attempted to update the location status for an NPC with no config file! Did you delete it during runtime?"); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/BackTeleporter.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/BackTeleporter.java new file mode 100644 index 000000000..c28d89672 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/BackTeleporter.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.List; + +public class BackTeleporter extends NPCsConfigFields { + public BackTeleporter() { + super("back_teleporter", + true, + "Hermes", + "", + Villager.Profession.FLETCHER, + "em_adventurers_guild,213.5,88,232,0,0", + List.of("Welcome to the\\nAdventurer's Guild Hub!"), + List.of("Need to go back?"), + List.of("Safe travels, friend."), + true, + 3, + NPCInteractions.NPCInteractionType.TELEPORT_BACK); + setNoPreviousLocationMessage("&8[EliteMobs] &cCouldn't send you back to your previous location - no previous location found!"); + setDisguise("custom:ag_back_teleporter"); + setCustomDisguiseData("player ag_back_teleporter setskin {\"id\":\"a946c147-4fc4-4ade-b06f-cae6462bf3e1\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTY3MzU1ODQyMTE5OSwKICAicHJvZmlsZUlkIiA6ICI2MDJmMjA0M2YzYjU0OGU1ODQyYjE4ZjljMDg2Y2U0ZiIsCiAgInByb2ZpbGVOYW1lIiA6ICJCb3J5c18iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjdmNjg1NjhmYzlhYzA2YWIwMjk4ODY2OTkyNmEwYjUwNmRlNjc3YTAyZTJhYWIzYWM4ZGM5ZWMyMTVjMDQ0YiIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9\",\"signature\":\"gwhAsHKA2jq8AY7MKZtsEkCqrxH6wR1SqDH85QOPdJW9AP5ZVLUg0G+hd+VDF/9lL1tIn/o3WuY6T9mE6oNrUtSvGCtEwusKHgbg+K+OGacWGWYQFPTGQoekYpZ0sfPXfK69gh7L+C1t6GvCdswow7l+O9eebPQcIMFuwixThVcMeeegGFibkGCl3lYHvhSXrcl9xEHTgOym/tsVxt9+gZCQvh8L6U5MBViClYDktBVgz68Ny1FBw1EA6LNUBK63t4kBQEpRCTsEJrfN9k5CS2AApVrjqCcor8oai2K5crZao0XM6qVmjxNb4Y1WZ9svFCIfgrJW2mXPc2lL5ctODfza/TGMRnCy+6yGKPPp5SHTbSLmyZ7e+q6UiwcSqlOHQibmrAK81Z3hiEEyA96NBZ3hNny2TqEk6ok2uFmIZcqgaBtnFEL9YeO2zob/pCf3iOV1uvQw0nDTeuqJC9VXlkIVkJ2+t8FBqV7ZjNH0L1djxW0NMcjEfFQkvMp9SP3t0aPpbkmSWfWFpiItS6pNxxviLFF8ogueFbYZMqA/1BXiBKY+EqnOi8TAI25GotgMjDCtdOeUbWPVc/hDb4jgFncGaTBnNAgFcRgL3RIqtpO8kUaNSHBuXjAZl+WfRXUvbFznkcecHzoiMZoaCSu7nubtehVB+v1wLGnawALT1MQ=\"}],\"legacy\":false}"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/BarkeepConfig.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/BarkeepConfig.java new file mode 100644 index 000000000..c295747f4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/BarkeepConfig.java @@ -0,0 +1,47 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.ArrayList; +import java.util.List; + +public class BarkeepConfig extends NPCsConfigFields { + public BarkeepConfig() { + super("barkeep", + true, + "Bartley", + "", + Villager.Profession.BUTCHER, + "em_adventurers_guild,285.5,91,209.5,0,0", + new ArrayList<>(List.of( + "Need a drink?", + "Want a drink", + "Thirsty?", + "Howdy, partner.")), + new ArrayList<>(List.of( + "Have one of our house specialties.", + "Special drinks won't find them\\nanywhere else.", + "One taste and will keep you\\ncoming back from more.")), + new ArrayList<>(List.of( + "Come back anytime", + "Bottoms up!", + "Kampai!", + "Salut!", + "Brosd!", + "Salud!", + "À la vôtre !", + "Prost!", + "Santi!", + "Salute!", + "Saúde!", + "Cheers!", + "乾杯!")), + true, + 3, + NPCInteractions.NPCInteractionType.BAR); + setDisguise("custom:ag_barkeep"); + setCustomDisguiseData("player ag_barkeep setskin {\"id\":\"82410e8f-b4b7-4ca3-9a24-f9f55745e00a\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTY1Mjg5ODE0MTE5NCwKICAicHJvZmlsZUlkIiA6ICJkYmQ4MDQ2M2EwMzY0Y2FjYjI3OGNhODBhMDBkZGIxMyIsCiAgInByb2ZpbGVOYW1lIiA6ICJ4bG9nMjEiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzQ0MTUxYWFjZTc4YzAzZDA2MzdkN2M2MGFhZGE2YTBlYjE0OWI0M2FiZTA4NjFiZmY5MDUyNDFjMjk3YjdiMSIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9\",\"signature\":\"KEr3OT8YkJUS62aDBAleWzKnjVRlxMyMJGB6wV3NxuCZOK0p/PBb6Hhxu81GU3avwBuQQtyPI0HlSyxag8/ONpvCih1yxejClYpwY2OAMXENHPz+Id8Ps6gEjVOnin9DcVtIUoWyU1pnVVFuEOuXQQTd7E0JGET6DBTpWvc8JvL3rRvUw+wCwvXN7eOC028alN3+cBoLNYO7rWv2zHBZbnKHQWrMqqbh0eVh1EMZZRhzOCTnH8CDyNj/+t2R5XPNUTPWx5x2lS9RVyJm07IZlNk8qczyyf8zBUHICExqFP4sZoJqhrkJZezxUtGv0svTMgiAfue3snCEc5NreU1m7bGnYB1X+3ZrbRLntrU2o1yDlqDrEWAPAm1xKqJvzth/FIkzLdVh2kBuA2D/dDssF81bdfTXHs1GEnbFO6A1r/Cse/EhafEv8V/3zrJrElhcMxowYYR/vxgFblT2jugX6sHDDxRBghyPAD/W5D8DBqSTbBtwFc86/uYFJ11i3ne01FhcYe2nBMrk5/IQxy68v5WHbvyhRfSkQwB7dYgYkEU2btIjDBsJjQAWQcqlOctOFMQqAneseNKf5/WOQymbT3ERE/9VuCb0LYZbFaVyL51Kp5glVvFCED3qXuUgQhago81yPKSksSdQD82w/iXQV2wBoQt+irbtak0D7aDtUQ4=\"}],\"legacy\":false}"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/BinderOfWorldsNPCConfig.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/BinderOfWorldsNPCConfig.java new file mode 100644 index 000000000..292866561 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/BinderOfWorldsNPCConfig.java @@ -0,0 +1,32 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.ArrayList; +import java.util.List; + +public class BinderOfWorldsNPCConfig extends NPCsConfigFields { + public BinderOfWorldsNPCConfig() { + super("binder_of_worlds_teleporter", + true, + "Buði the Doomsayer", + "<[200] Binder of Worlds Teleport>", + Villager.Profession.ARMORER, + "em_adventurers_guild,294.5,91,223.5,180,0", + List.of( + "You are not prepared."), + new ArrayList<>(List.of( + "The things I've seen...\\nYou wouldn't believe it.", + "The End is near...\\nYou are not prepared.", + "I give the greatest challenge of them all.\\nExpect death.")), + new ArrayList<>(), + true, + 3, + NPCInteractions.NPCInteractionType.COMMAND); + setDisguise("custom:elitemobs_world_binder_teleporter"); + setCustomDisguiseData("player elitemobs_world_binder_teleporter setskin {\"id\":\"fda90f28-71fe-439b-911c-a815a787ab85\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTY3ODI4NjMyNjY2OCwKICAicHJvZmlsZUlkIiA6ICI3MDQ0ZDlkY2I5OGI0YzgzYWFjNjIzNjFlYTY5YmNmOSIsCiAgInByb2ZpbGVOYW1lIiA6ICJfV2F0cnlzaGthXyIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS81OWE2NzMxNmY0OGI4ZjcyMzlhNzJjYWE1ODM5OWIxYjFmMjVlODlhYjAwNTIwZmI5MWI0YTEzMmE4NTBmMmJhIgogICAgfQogIH0KfQ==\",\"signature\":\"QujA31pUzzN+Nnnrq9TrYJJN+TGgqVwf7i84QSL0R84oVDiFC8uBd23ZV5jWql1wuHAlCGHnozqa7MkXmJ+b2P8Aqa/DVLEeWO5o9xkmYsTR28nR1gesHe9/1NNRj8hSsqP3trwYsIdGrTkSc5B56px/jDKM3uvpEpFk9CyzKRGccizunavWahUS3HRDmgj8EsjyeIPuZhbkA/0SSGtA0eIyg3xkmcT7NWOcebW3yGfknc9AYmrKRpS+ud6bRNXb0681uHrshz1NEg9X8pg4+W1xP1xgzxWOQfYNP+T9t1IFTUPql9uTp6cJ27z/uTSneH6FpFbUpve0H9X0w8Ow/OmNPEJzdfLrDmgCQHSwZERgvorKBn9WDfPgHX/wzTNIGxuzU88X4KYa3E0HO/HRJ4shMDSc+cYoB/KGuq1xpHYbAbmbzzUeTS9WhQ9jqB82Fr0Izq0eb81/gapFTzl5Au+96LTBnMVqCaAFb2mY3pD4ZGChCuxYWgD45ORvqR2QPVAjs1acbzqLLPuda52GKp7NOO4IZ6UIG6bQfj++5RFgn7lDU7qLtt0ADq8Ushha73+1cJLNZbD4tq0b5u7XWzemZba36Fup6fXv6XIN08Lij0CZyMseEFlLZWkgIQCeYdXIhFItWZ0rD05gw/udm8lMHvaHvWFff7I2HVsLQnA=\"}],\"legacy\":false}"); + setCommand("em dungeontp binder_of_worlds_sanctum.yml"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/BlacksmithConfig.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/BlacksmithConfig.java new file mode 100644 index 000000000..5ea02dfcf --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/BlacksmithConfig.java @@ -0,0 +1,47 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.ArrayList; +import java.util.List; + +public class BlacksmithConfig extends NPCsConfigFields { + public BlacksmithConfig() { + super("blacksmith", + true, + "Greg", + "", + Villager.Profession.TOOLSMITH, + "em_adventurers_guild,285.5,93,261.5,179,0", + new ArrayList<>(List.of( + "Welcome to our shop!", + "Sell your goods here!", + "Fresh goods, just for you!", + "Got something to sell?", + "Want to buy something good?", + "Fresh goods every time!")), + new ArrayList<>(List.of( + "Higher level mobs drop\\nhigher value items!", + "Items with lots of \\nenchantments are worth more!", + "Higher level mobs drop\\nbetter items!", + "Higher level mobs have\\na higher chance of dropping loot!", + "Elite mobs are attracted to\\ngood armor, the better the\\narmor the higher their level!", + "Some items have special\\npotion effects!", + "Some items have unique\\neffects!", + "The hunter enchantment\\nattracts elite mobs to your\\nlocation!", + "Special weapons and armor\\ndropped by elite mobs can\\nbe sold here!", + "Higher guild ranks will\\nincrease the quality of the\\nloot from elite mobs!")), + new ArrayList<>(List.of( + "Thank you for your business!", + "Come back soon!", + "Come back any time!", + "Recommend this shop to your\\nfriends!")), + true, + 3, + NPCInteractions.NPCInteractionType.PROCEDURALLY_GENERATED_SHOP); + setDisguise("custom:ag_blacksmith"); + setCustomDisguiseData("player ag_blacksmith setskin {\"id\":\"5fbb022e-b62e-47ef-aeb5-a98fbc7ff936\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTY3NjEyMzkyMTU3MCwKICAicHJvZmlsZUlkIiA6ICJhYTA3ZjM2Mjk0NTM0YzYwODQzMjI4NzAzZTBlMjE3OCIsCiAgInByb2ZpbGVOYW1lIiA6ICJfU2FrdXlhX0l6YXlvaV8iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOWM0YTdhYTQyMzVhYjZjOTI2OTU4MTg5YjhiZDUwNTJkODExNmUyZDAzNGJhZGU2OWIyMzBiZTgxN2M3ZjI4MiIKICAgIH0KICB9Cn0=\",\"signature\":\"uZS2bAkz4f07TcXlZtSDK0ZPuUk/+H3PS5dr80WuDyQEN5FKPSEP2rSrVg8LHpVm5Gs2fwtkzUVG+MUloCR/7F/98RyLwzP5xyzt8+DELONi5iPfxLsYLG0VsIQCUH67sZGm4A9/iOyBTAkbr9aKUdwjJvyVnaT+Bj2dslzJqXaw9cO3gRQxlweeq9VL1weMFbldPEi12K4tS6KMYfYjfVXvCxHXpKby/AbXI/huNyK1T4BBIHrzq4TbpRD7xnIUMTLYf4ARnowsvoF9cNzbyTFrkCpH87wdGFbPyyH49h6mKLyTLUPESOHAxtwwhudsyi34zlVgMuzkvY6AqcjCZHnmELBm7/2QVEEZlk6lMFO8dI0pcF3fdQKrlLQBg/gNjUNdzU3rvgNs56P8a8RCRIvx/ExMMFEIUtIDPVZBIToSn7lwkLxwZJKS9Lk2fmVD5Vgs2v4Vn74zhxQYHYziwcpMThu1uDynEA2FNlkS9O9nd0dSSe1e55uMPWYMkgQNTLusRrIU53DpFTRMjMySubteielH9Xbk5PjmTGlBpqeDuA80XNOgGSO84uXDrFrdgnHkiAO9nKyCzOY+95RrPdIoUQkUps3mj5gIrmBF5mGIzF+QWgkpMeSx78WCGEGxPHBHl9ZzpM5iuU+iRGCBWSnJA1Og1JnLooIT6eAEFm4=\"}],\"legacy\":false}"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/BoneMonasteryTeleporter.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/BoneMonasteryTeleporter.java new file mode 100644 index 000000000..d3a5dc5be --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/BoneMonasteryTeleporter.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.List; + +public class BoneMonasteryTeleporter extends NPCsConfigFields { + public BoneMonasteryTeleporter() { + super("bone_monastery_teleporter", + true, + "Sister Frieda", + "<[85] Bone Monastery Teleport>", + Villager.Profession.ARMORER, + "em_adventurers_guild,292.5,91,217.5,-90,0", + List.of(""), + List.of(), + List.of(), + true, + 1, + NPCInteractions.NPCInteractionType.COMMAND); + setCommand("em dungeontp bone_monastery_dungeon.yml"); + setDisguise("custom:elitemobs_bone_monastery_teleporter"); + setCustomDisguiseData("player elitemobs_bone_monastery_teleporter setskin {\"id\":\"a30519df-b8b1-42a8-a537-64d5ff8b5651\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTY0NzgwMjAxMzExNCwKICAicHJvZmlsZUlkIiA6ICJhYjlkYmMzZjk4NGE0ZWI4YTVmY2RlYWMzNzEzZWFkMSIsCiAgInByb2ZpbGVOYW1lIiA6ICJDeWJvcm51dDIiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTcwZjM0OThhYjRlMDhlMjIyYzI4OTBlYmMyMTU2ZjhhYjY1NmIwM2U3OGVhM2ZhMmViNmE0Y2ZjM2NiZjE1NSIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9\",\"signature\":\"KP+QjsBszTPBIGI/RU50q2aF9DhFFzLxqsYwxBlL8t+idG1AKYd4nt8LrDs4C8fKVmT+fHmCCJSxpakmZgQ1aHgPLN67A8Q614K3SR67vaseNMhVnmEmZ0clBFRHxjnVR134/ozeXFSGd2d8ttbZPzO8GxXWMa6ezbrWEPEsxl6n4l/Mj6v2zZQWkHBxhmgqxWh+z/708JBop0H5TDha+y2gikaRdRhurXXq67Ud/oghcMK6mTO5ET0m8/8TNz0uBF42rcMbT2Ew6t/h2SuW0ULvd3cb/gB4zUMjAXmhrtb0kHoC+gAPPv715TWG7LBnuOkAbl9SLCvMeSkSKUsKWTswb07DojrEl+kt8LZToebFlR37esNqSubPvFx7LJJZ+wBspTv+c9PNdfVSUMkzh02jKdgWEDFQv6WG26OZw+f9PPOztYRzmYEajezl0Re8G66aIa3G3eynWa+JMX3Ml9Jpym+P1wBkIo1nWlazJkumkPG6sVLqMOkvrCQlDedWoQacCDRVsUVnzBHrHkEoin5y+USkcxWwU4yhaPi7mX3SSG0mRiI3LpBurcCiJcQzlGszml2w5fJBLAeEUyO9UtUMxP/mS477FmbGeLvmP7+AcnNe2COe+/G8mdfQ+pXlgjnWDzhsdVktY2kJ5QJZZ9cD5Ru7BOqU2Uqn6Y1PkMA=\"}],\"legacy\":false}"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/CombatInstructorConfig.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/CombatInstructorConfig.java new file mode 100644 index 000000000..637b85026 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/CombatInstructorConfig.java @@ -0,0 +1,66 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.ArrayList; +import java.util.List; + +public class CombatInstructorConfig extends NPCsConfigFields { + public CombatInstructorConfig() { + super("combat_instructor", + true, + "Charles", + "", + Villager.Profession.NITWIT, + "em_adventurers_guild,277.41,90.0,286.23,-214.85,-1.95", + new ArrayList<>(List.of( + "Want to learn about combat?", + "Need a combat lesson?", + "Want to know more about combat?", + "Ready to fight Elite Mobs?")), + new ArrayList<>(List.of( + "The items around Elite Mobs\\nshow what powers they have.", + "The higher the level of\\nthe Elite Mob, the\\nmore powers they can have", + "The higher the level of\\nthe Elite Mob, the\\nbetter the loot they can drop", + "Higher level Elite Mobs\\nhave higher chances\\nof dropping special items", + "Elite Mobs with floating\\narrows fire arrows at\\nnearby players", + "Elite Mobs with floating\\nender eyes blind you\\nwhen they hit you", + "Elite Mobs with floating\\nspell particles confuse you\\nwhen they hit you", + "Elite Mobs with floating\\nlava buckets set you on fire\\nwhen they hit you", + "Elite Mobs with floating\\nfireballs fire fireballs\nat nearby players", + "Elite Mobs with floating\\npacked ice freeze you\\nwhen they hit you", + "Elite Mobs with floating\\nelytras make you float\\nwhen they hit you", + "Elite Mobs with floating\\nemeralds poison you\\nwhen they hit you", + "Elite Mobs with floating\\npistons push you\\nwhen they hit you", + "Elite Mobs with floating\\ntotems weaken you\\nwhen they hit you", + "Elite Mobs with floating\\nwebs web you\\nwhen they hit you", + "Elite Mobs with floating\\nskulls wither you\\nwhen they hit you", + "Elite Mobs with floating\\nchests drop bonus loot\\nwhen you kill them", + "Elite Mobs with floating\\ngold boots are faster", + "Elite Mobs with floating\\njukeboxes taunt you\\nduring combat", + "Elite Mobs with floating\\nglass panes are invisible", + "Elite Mobs with floating\\nspectral arrows are immune\\nto arrows", + "Elite Mobs with floating\\nfeathers are immune\\nto fall damage", + "Elite Mobs with floating\\nflames are immune\\nto fire", + "Elite Mobs with floating\\nanvils are heavier\\nthan usual", + "Elite Mobs with floating\\nbone blocks leave their\\ncorpses behind when killed", + "Elite Mobs with floating\\nslime blocks jump higher\\nthan usual", + "Elite Mobs with floating\\nslime balls create a vaccum\\nupon death", + "Elite Mobs with floating\\nleads pull you\\nwhen they hit you", + "Elite Mobs with floating\\nbones create bone pillars\\nduring combat", + "Elite Mobs with floating\\ntipped arrows fire tracking\\narrows during combat", + "Elite Mobs with floating\\nmushrooms bloat up to become giants\\nwhen hit", + "Elite Mobs with floating\\nskulls summon reinforcements\\nwhen hit", + "Elite Mobs with floating\\nbooks summon reinforcements\\nuntil you kill the summoner", + "Elite Mobs with floating\\neggs summon reinforcements\\nwhen hit", + "Elite Mobs with floating\\nfireworks summon Team Rocket\\nwhen hit")), + null, + true, + 3, + NPCInteractions.NPCInteractionType.CHAT); + setDisguise("custom:ag_combat_instructor"); + setCustomDisguiseData("player ag_back_teleporter setskin {\"id\":\"2309bbd6-da95-4c32-9de0-08cd1072d582\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTY3NzI3MTg3MzI1OCwKICAicHJvZmlsZUlkIiA6ICI3YmRhNDBlM2E1YjU0YzE0YWJmZGYzNGMyODY2NjQ0NiIsCiAgInByb2ZpbGVOYW1lIiA6ICJfRWdvcl9wbGF5XyIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS8xYmEwM2E5MzQ2NzlmOTdlZTNmNTIyMDI2ZGQyY2FlZDNmOWUzZGUxOTIxZDdkMzUwNzRhNzA5YWVlZTY1M2Y0IgogICAgfQogIH0KfQ==\",\"signature\":\"yLnzRj53v2941K05aMvIqH/5gREtBrDJCHReHsHko3jLzsN10BidUJd9Hs40wIdrlji8G/GvVv469fmmSVda5QTInszgNhDTUk/0IpC4Ir9nGe5S9mN+gDuyaHHClux0ZRxQkf4O7A/8765y7lGG8Y3ZBNFwovyht3Q0qoxW5AP0AUVvv7GHy2MeXWv7iDtrb3o79Yzy8tm1SG3d9jnCnIEjpKD98U5cwAu9N/UL5MM1zgVtMXsB4D7ymm3bHy+SC4HYjg8oA1TLYc9JofJB1qsMcKUbQ1N3BG63p1b6yf79ADRgtZY258Q83G9x2TmznlKeAH7WgnnYL8Mf01XTr5D7hUwhkxpPVAwLL0kJ3BXmOEE+CwRoBthOWTCWvSTNfkBu7PicML8zzdT89dMFJF+OXH/ofg+FHkhlO009mmd4H7FaAkmTAXZpqr9vjfwnO3/m5pcMgNiPpDqyZushdJKEAOTIQtUR5hO6L1u6opIVUmE5pVSY4BuuZtOi7tlkkJpqnXH8+5gZoQq7ZB0yrnNr2LlhDLdfHkBCG2/nhHK4yVdzRWb+N20c2yP2FUXWbCaWvZF8+i2051zAarqkaLL1hJ24Ysmu+n1BXbLSKB/AlUJVHmrQbJZpj+LKX1Up4buqQmnFLQwem2O3hyAaEnbQ56xwVHTiszQJ+BJqqm4=\"}],\"legacy\":false}"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/CraftenminesLabSanctumTeleporterConfig.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/CraftenminesLabSanctumTeleporterConfig.java new file mode 100644 index 000000000..5e0cbc93c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/CraftenminesLabSanctumTeleporterConfig.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.List; + +public class CraftenminesLabSanctumTeleporterConfig extends NPCsConfigFields { + public CraftenminesLabSanctumTeleporterConfig() { + super("craftenmines_lab_sanctum_teleporter", + true, + "Sonio the Speedy", + "<[30] Craftenmine's Laboratory Teleport>", + Villager.Profession.ARMORER, + "em_adventurers_guild,296.5,91,217.5,90,0", + List.of(""), + List.of(), + List.of(), + true, + 1, + NPCInteractions.NPCInteractionType.COMMAND); + setCommand("em dungeontp craftenmines_lab_sanctum.yml"); + setDisguise("custom:elitemobs_craftenmines_laboratory_teleporter"); + setCustomDisguiseData("player elitemobs_craftenmines_laboratory_teleporter setskin {\"id\":\"bfe398ba-f41a-48f1-80d7-7513002dacf1\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTY4MjYzMzE1ODc1MywKICAicHJvZmlsZUlkIiA6ICJlN2E1OWU2Yzk1NTY0M2IxYTYxZGI2NzNkNTA3ZjE5OSIsCiAgInByb2ZpbGVOYW1lIiA6ICJZSmNhdCIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS84ZDY4ODNkYThjM2UzYjI1ZDQ1ODJhYjdhMzA2MzQ1ZDhiOTY5ZTg1MzI1ZDE2Zjg3OTY3MjE2MzgzMDY4NDgwIgogICAgfQogIH0KfQ==\",\"signature\":\"RXEyj+rpRtydqtNSntHcQmJhAvFxCLeI8d7ErnEjbVLMpNnv+SIrjMCplT+T32EW8qTny+LVtqd+xibNLYzqkmOcNBzwga5inYqEGpQ40XEbGycLYxFV8r/L8+oaG9b36/szAWMqWzWbFOUFDk2CwJEhR8sYOOq1vfWshpONl38BoaM78F7GTM0ck/J3VBDF/hiwD5GwDlQ5O2hDofwsMay7fE7ilwQ/6i4eBWW0PlCtoTwF5dvdvG04MSs4tF9FF5KTF8BlulOq41qnGVHmyu1VAQdKNk7HHqudSII2aiV2x0rhw10dgzPvPllu5qI1KMozF07YLdv3C5j53CLewnLCDje9HGIuNmImGkJ8hFnVex/hGDeX5FY9IRC+9kLULzrVjdVj3q/V42HouN5HrboI/4dicMveQbZ8aBoPjtX7MCH/6dCxnRZJG47AQSQs8/xCcO7n1xEJcwLx7FuxVKmSzie91LCcyCsCsZ7Qm9MvtVjRyqYYGaTbr+Mht0czG3qUGMyw7iaT4PWmEbCjLgU46S35kAmTDNQLZmZzF5JOHECijQqGtTeNgJIwNdNDdM6AFPzhnFa85ubdRLa86Fv5FhLehJ8ySz9+xBXAecuUr3NOmG0AFQLklDw9HcGHJ7Jr0MNM+LkJdNMVSymZNJaT21o4Qa9fJNq6GdSTpP4=\"}],\"legacy\":false}"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/EnchanterConfig.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/EnchanterConfig.java new file mode 100644 index 000000000..03e32bca5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/EnchanterConfig.java @@ -0,0 +1,39 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.ArrayList; +import java.util.List; + +public class EnchanterConfig extends NPCsConfigFields { + public EnchanterConfig() { + super("enchanted", + true, + "Eden", + "", + Villager.Profession.TOOLSMITH, + "em_adventurers_guild,278.5,77,243.5,0,0", + new ArrayList<>(List.of( + "Need something enchanted?", + "Feeling lucky?", + "Got an item to improve?", + "Got enchanted books?")), + new ArrayList<>(List.of( + "Enchantment results are\\nnot guaranteed!", + "Don't complain if it fails!", + "Got an enchanted book?", + "Higher quality items are\\nriskier to enchant!")), + new ArrayList<>(List.of( + "Got what you wanted!", + "How's your karma?", + "If at first you fail,\\ntry and try again!")), + true, + 3, + NPCInteractions.NPCInteractionType.ENCHANTER); + setDisguise("custom:ag_enchanter"); + setCustomDisguiseData("player ag_enchanter setskin {\"id\":\"c579c972-54c4-4ebc-8530-6018fd9405b8\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTYzMzIzODI1MTc3MCwKICAicHJvZmlsZUlkIiA6ICJiNjc3NTgwYzExYmU0ZjNiODI1OGM0YjBkNzNhNzg0ZiIsCiAgInByb2ZpbGVOYW1lIiA6ICJPZmZpY2lhbGx5SksiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTk1M2QyZDg0MDVhYWQxM2QyZmUwN2Y0Mzg1NmFkODAxZjQzZWI2MTBlYzAwMTJiNDMxMzk2ZTYzMTgzYjkyZiIKICAgIH0KICB9Cn0=\",\"signature\":\"t1aaf/0C7HtS+U+tdfK4p5Q4T9xowTNCxxhZCqLVqbROYu3ch08xVcud54Nb01qK9Y36K6IOuGcRyAVUVTZQMNkNktp62KzG7fXHutRva+adaGKVRdjPSCK5/cd5yekXRbMKv6f79Io+aIVuw81sm/Fa2aYLE/ZCb+TQPZ99K4N5QofreXyM+H1SsLEnXkxEiKWsi2dAuPfd0cMzA/EZXVi7wAEylayyqZrsDfjyD2cHjieS2jSLYyRtjg0BdGsWhAN3D0qHe2brwjMcm3id5uY79OlCQjfiF1QGwi+ZMwdo/QDL/KW2GojFwrL4CfjvWsePBeK7AClrmOqfRheKHGSMvOywqWv6Vn0ZAMlKZAL5uVEPn9zu6sdj8D8A0Pnt+XZ3tJ4k3RxoENpTWBZRzt2bgKQJRmhAAomnNShq07rVuaEeYP7bJgAzdE0lWBbr23HuFGv4Z2oVuZ+lAx2QofAcscJGRPPH2UVMxYpo/vZtNWpEyVQqdkR4IretpSkczMXXSL8Nb3jOkRRQLV+0ktBPsCRskLAASJIVlCE3FeeYdFY1KLkcpEEm61QJovn6CsOJvhIVZtDYDWY7ZROUR4cBYxc9uKHy/XDEKEMv3fh4vYw+5uEu5Q7ZMtd+JKW4u6pXFRyWf1OclIMMQ6DGlK2gYIaVXsUCikmuUp0Bgyo=\"}],\"legacy\":false}"); + } +} + diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/FrostQueenTeleporter.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/FrostQueenTeleporter.java new file mode 100644 index 000000000..0a1a81156 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/FrostQueenTeleporter.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.List; + +public class FrostQueenTeleporter extends NPCsConfigFields { + public FrostQueenTeleporter() { + super("frost_queen_teleporter", + true, + "Ishard the Frostbitten", + "<[50] Frost Palace Teleport>", + Villager.Profession.ARMORER, + "em_adventurers_guild,294.5,91,215.5,0,0", + List.of(""), + List.of(), + List.of(), + true, + 1, + NPCInteractions.NPCInteractionType.COMMAND); + setCommand("em dungeontp frost_palace_sanctum.yml"); + setDisguise("custom:elitemobs_frost_queen_teleporter"); + setCustomDisguiseData("player elitemobs_frost_queen_teleporter setskin {\"id\":\"3aeab183-452a-44b7-9734-306a8930e199\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTY2MzgwOTYxMjUxMCwKICAicHJvZmlsZUlkIiA6ICJmNThkZWJkNTlmNTA0MjIyOGY2MDIyMjExZDRjMTQwYyIsCiAgInByb2ZpbGVOYW1lIiA6ICJ1bnZlbnRpdmV0YWxlbnQiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDI3YjY2MjcwZmY5MTIyMWU4NjhjZTg2MDUwMTkxYTk1NzdkMjE1Nzc4YzY2MmI2NjliYjFmYjAzM2UyYTkyYiIKICAgIH0KICB9Cn0=\",\"signature\":\"EnaEhcygFbcO/ABDSPvou1lT2DIhENO6CiB5ZODGmU/h2Tgf54CCskFwwRYKIe4UR1Qmam+1MyxdS65UzkszhsdswyKyRHJtpQ2xO9/jarAt/Q/gVlaEOSExt4CvPicl4QZPyD1auBOVFS5ZGwfFfCp/fqGF71hRESRnJTrGdTx1ITeuyI27MQGyzPT3GyHvJkJQCXYtrJHdaeiS71m1jVxeDz/uDksI973J/HPFt5ywgf0vwOqed3rWnYV6Oc3wfMuv3RAqlMufu89MVfj47nCZ9E/wzp7CirWz5/JYTXoAz/7+ihkYxdCH0NOvPWo6ytcwI04S46SG9h6E4HW8RKUdb9qIoNekrQccMEoeiSq30LmN5fLIQE7O+4KE+tZiHgca/xxXoeNDoEp3JoBm8NInyHz54uOptNa5eOIrF+aNR10JbpzmeUEd6nxhXBi03+Ti7FJgvKyyh4+MZxkr9ceLj+K/EGnjyAUyU7gceligbfpqU6RcsniCxfl9YzLa+nZBy89790AR6jmccc+rl8zlV0xBEf/Vb4ik8aCTnBevd8QV0YAIUeZ3TRAhqv3FrbrHdo6wetj4HHTkIoVH7ej4KMAvmgoh4TyiCHHQIjhtz4iEqPQUNejje+eLw00Rp7YeeePeHLmk/v+uL2HbyfECwQKkML9nbB9Ts3aka/A=\"}],\"legacy\":false}"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/Guide0Config.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/Guide0Config.java new file mode 100644 index 000000000..0fb9f06ce --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/Guide0Config.java @@ -0,0 +1,41 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Guide0Config extends NPCsConfigFields { + public Guide0Config() { + super("guide_0.yml", + true, + "Dux", + "", + Villager.Profession.NITWIT, + "null", + new ArrayList<>(List.of( + "Heard about the AG?", + "Been to the AG?", + "Heard of the Adventurer's Guild?", + "Know about the Adventurer's Guild?")), + new ArrayList<>(List.of( + "Heard about the AG?", + "Been to the AG?", + "Heard of the Adventurer's Guild?", + "Know about the Adventurer's Guild?")), + new ArrayList<>(List.of( + "Come back anytime", + "I'll be here if you need me!", + "I'll be around!", + "See you later!")), + true, + 5, + NPCInteractions.NPCInteractionType.CUSTOM_QUEST_GIVER); + super.setQuestFilenames(Collections.singletonList("ag_welcome_quest_0.yml")); + setDisguise("custom:ag_guide_0"); + setCustomDisguiseData("player ag_guide_0 setskin {\"id\":\"ff49abb7-d842-45b0-97df-cf520b08dd1e\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTY3NzE5OTM1OTgxOCwKICAicHJvZmlsZUlkIiA6ICJhYTk3N2E3ODk0NTE0ODdhOGZiOWVhYmI0NzcyYmNmMyIsCiAgInByb2ZpbGVOYW1lIiA6ICJiZXN0c3VuZyIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS8yZDNmYzlkYWQzNGNlNDEzMjRjMzE5YmE1ZmQ2ZmYxZjk2ZjI2Y2QwNDMxNDI5MDI5NWVkYmNmNzYwMGFiZGM5IgogICAgfQogIH0KfQ==\",\"signature\":\"xMqh9jXhUFVIWBHnl2YD3dcmb+Nyq7RP7IY3iSYpkQrT1RPT7lNSVLVinRRDt+Yvrd4Tm5UKy7V7pjPTZdUamjbMzrqGATrHAdc/RXCj7Skk11hpXRlJijIrXR30pAZ/piZmm0j9O8k78PUq+funK3eo6W3HO7O8oIzPnbO+PAovpT6W9CDq6KUyNHoxWOP5NTk+VJxV5CaGKs4zrlGSztRlwBydJnlG2LTzdQ01Pqa5hm1QfMensebrhk3x8bLIIfl5q/CkWGuTfglQKisFznwXcsBihmKk8o5Dj+pnd7uy8/KMQXx7gOZN/5+k5HLXT1w8zNcTmpqCxJnKsNgmK3qHDMbSWvSkEmRDTRubNPokd4n5eMMuKmylQ3Io2aP+H1GpE+K/NW0Q80si/BZ5OY3WuF6tFcpWGw8RlWj6jgoQSjoIS6o9Y8uZaHBaz5d51gdyTfjyRGxzXhH/TQQu+ND/qimtmNwf7Zd3ricYXbJ8ZMuFnSuQSx9G5i67Idy11leShAGLk7UQinR2dQ/hBMKwZ0C8LFBgg1EejZxhJi0OlxJC093XKcspbj4m3o7S6WjMEeIRwmoKKtqQKJBCoCWIMp0MiON0+dGq1QJDOLTLyEGexVXqncn1MfMw3XL9amLIfTObmP08DSXERpEjnYwJ94+EP6daxYJSBtlLWpY=\"}],\"legacy\":false}"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/Guide1Config.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/Guide1Config.java new file mode 100644 index 000000000..9afe33ee5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/Guide1Config.java @@ -0,0 +1,40 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class Guide1Config extends NPCsConfigFields { + public Guide1Config() { + super("guide_1.yml", + true, + "Casus", + "", + Villager.Profession.NITWIT, + "em_adventurers_guild,215.5,87,239.5,131,0", + new ArrayList<>(List.of( + "Need guidance?", + "Need a hint", + "Are you lost?", + "Need help?")), + new ArrayList<>(List.of( + "I know everything about\\nthis place!", + "Want to meet the other members\\nof the Adventurer's Guild?", + "Need to learn your way around\\nthis place?")), + new ArrayList<>(List.of( + "Come back anytime", + "I'll be here if you need me!", + "I'll be around!", + "See you later!")), + true, + 5, + NPCInteractions.NPCInteractionType.CUSTOM_QUEST_GIVER); + super.setQuestFilenames(Collections.singletonList("ag_welcome_quest_1.yml")); + setDisguise("custom:ag_guide_1"); + setCustomDisguiseData("player ag_guide_1 setskin {\"id\":\"e784faf0-86a5-4e8a-bb38-961f4250fc01\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTY3NzE3MDYyODE3OCwKICAicHJvZmlsZUlkIiA6ICIwOTZkYWUzZWY1MmU0YWU4ODk3ODY2N2EyOGIwZWFhNCIsCiAgInByb2ZpbGVOYW1lIiA6ICJBYml5QWphIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzU3YTViYmU1MzlmMmYyOGU3OGM0OTE1Y2IxYmE5N2EyY2YxNDUzOTIzNDQ0M2U3ZDZlZDZkMzdhYmFiYzEzMTUiCiAgICB9CiAgfQp9\",\"signature\":\"Jf/RqgTr38zW29YGlOUebXelzu4rZ/oZ8TgltaRi2JyOa+V3ZfN4VelBXM582J/0S/f4Zw3oOF7QCLtXl6jjBsu27VqUL/zJ2XGsqLe2xiQ9iJ01ZsV+sV89pm37kJ9IvkyJvRuE//Gej8PpAoaE6VMfCyQQloztNF/OIGlOn5KO8Ut/IFoS8w8k0q3My2K4Iz3rMl+ws4mN9qpOLEZfIGR2z77sQ188/ysZnZqg7i4l8Z/fQ02fiYYOj50l6rhbyD5nC01zakr9OWcXQ1EsKKwdl0UhYKKUgqnqdpn9Sy04RlwvqCmBwnelsFOWhI1SCrXIQ+cKpw6BgzGzGJOCXOOscnmNgIE3yIILoS/wl1DPMT2wuP7hxw5Xi59JEYrF6yUVOdjKbIATZr0uWHzjEW8G25jA9UWxciM4M/NNPBe5RlL3JVhRmu7fbR0kGtW5ydcQuX7Mtjrkj3VqhPlTl/9MpdZR8FzhhKhxvqVE1Rc0Yrsv7MyHtlhkbBnyxVmx+yFe3T+PpeiH3ji/wtWQ3NBjuZG/M6cYCa2zsd9PoPr8qayUTyW73V08oB0X/xClxjk+TPqf6triTO9uXEqaOpGJE/+hk+FTBhJ0ctDTfdoH/6gr0TyyAy61ZFkwvwSuvmStP5CduEGaOLWbn0cNB7n9guG/TKBuwjTZzVyvJZU=\"}],\"legacy\":false}"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/GuildAttendantConfig.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/GuildAttendantConfig.java new file mode 100644 index 000000000..b6419ef32 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/GuildAttendantConfig.java @@ -0,0 +1,39 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.ArrayList; +import java.util.List; + +public class GuildAttendantConfig extends NPCsConfigFields { + public GuildAttendantConfig() { + super("guild_attendant", + true, + "Gillian", + "", + Villager.Profession.LIBRARIAN, + "em_adventurers_guild,283.5,91,229.5,179,0", + new ArrayList<>(List.of( + "Welcome to the\\nAdventurer's Guild!", + "Welcome!")), + new ArrayList<>(List.of( + "Check the questboard to\\nsee active quests!", + "You can talk to me to\\nchange your guild rank!", + "You can sell items to the\\nblacksmith for coins!", + "You can talk to the arena\\nmaster to take the arena on!", + "You can buy equipment from\\nthe blacksmith!", + "You can talk to the combat\\nmaster to check your combat level!", + "Unlocking new guid tiers\\nincreases your maximum health!")), + new ArrayList<>(List.of( + "See you soon!", + "Thanks for stopping by!", + "Happy hunting!")), + true, + 3, + NPCInteractions.NPCInteractionType.GUILD_GREETER); + setDisguise("custom:ag_guild_attendant"); + setCustomDisguiseData("player ag_guild_attendant setskin {\"id\":\"be36a657-78e8-45e5-bd91-ea5404863495\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTYyMjk3ODkyNzA0MiwKICAicHJvZmlsZUlkIiA6ICIxOTI1MjFiNGVmZGI0MjVjODkzMWYwMmE4NDk2ZTExYiIsCiAgInByb2ZpbGVOYW1lIiA6ICJTZXJpYWxpemFibGUiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTFmYmRiNzE5NTI0YWMxMDY1YTMyOWUwZjRhODAxZDM1M2UxOWU5MTVlNjE3ZDhkNDY0YTRjOWFkYzZiYmY2IgogICAgfQogIH0KfQ==\",\"signature\":\"OL866yngEcY+GnuMH1yDCYo+s3BXvKRGq1LhBSD+bwV7BxDSFqbEGjHTKVzU8xsn7EH5/dHovWm/lW48b7vEiV4UTzurHeF5rMPJxQuIE+B2qRCWiag3R6yyuP+iUwIzDPJcpFDr7CY/53eVJqLn4BEvN3iAPjyBSfeFvNzNgCA55I7L8wjfBVZfgJJB+y8fDe1+F3fc+kPm9NMncSbxeHrEhl7WWFTaVgRPrZWdWu4z9sYpktE0/qDKrKbhD8FUbk0z9VEOBenakPqpAuGmyRJGrvNMWeYrskxbcwtkPCYVlcKTrX7zYNPvHS3QsxcAVNtpPnawUa60Sp2TlGtsl/v5QGEj1J+Xisgr1b/sSdC+rNH6CUn0fNJmFDGwGUnaqS8v3iCSeTX7aZa0sc9tgl7VPGrXlD9juvXVKj5U0GOX2TQIU50dTQSuUmJNbHzp1p+L135tTuVmmnBoiyvg0cZN50ndVnR4qOlSP2OEOIx5kPV09Eu7HNiEArVCavzFQG38HzZsqtDJw6Hg/0NjiOd8CTrgw2ZS+NsR08U0ktEQxRAXs91pKMJ+ZpIrqzNpq/81Xmw3C7d0PgiAQPoQbg9fJMzfzwNuf2EcXhQssY881kEbOs6MiM9v3xT2d7gR50xe2WZCRxsbj10+UGGpdA414NmJWTQzX0MI0KucRnU=\"}],\"legacy\":false}"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/QuestGiverConfig.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/QuestGiverConfig.java new file mode 100644 index 000000000..c837a38e0 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/QuestGiverConfig.java @@ -0,0 +1,42 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.ArrayList; +import java.util.List; + +public class QuestGiverConfig extends NPCsConfigFields { + public QuestGiverConfig() { + super("quest_giver", + true, + "Qel'Thuzad", + "", + Villager.Profession.FLETCHER, + "em_adventurers_guild,278.5,91,215.5,0,0", + new ArrayList<>(List.of( + "Greetings, adventurer!\\nFancy a quest?", + "You! I've got a quest!", + "Feeling... adventurous?")), + new ArrayList<>(List.of( + "Complete guild quests\\nfor cool rewards!", + "Higher tier quests have\\nbetter rewards!", + "Higher tier quests make\\nyou hunt higher level mobs!", + "Want a harder challenge?\\nIncrease your guild rank!", + "Make sure you're well equipped\\nfor these quests!")), + new ArrayList<>(List.of( + "Safe travels, friend.", + "Happy hunting!", + "Live long and prosper!", + "Come back with your shield,\\n or on it.", + "Life before death!", + "Strength before weakness!", + "Journey before destination!")), + true, + 3, + NPCInteractions.NPCInteractionType.QUEST_GIVER); + setDisguise("custom:ag_quest_giver"); + setCustomDisguiseData("player ag_quest_giver setskin {\"id\":\"f376b40d-e47a-4b75-9b4e-cde815b00ee7\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTY3ODEyNjEwNjU1MiwKICAicHJvZmlsZUlkIiA6ICJlZDU0NDIxMDI0MTM0YjQ5YWQ5MjRmZDEzYWE2YWNiMSIsCiAgInByb2ZpbGVOYW1lIiA6ICJNYXJrdXpfRGlheiIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS9lYzc5NDJhYzExN2ViOTBmMTU5OTk1NWUzZjE1YjVmZTY4ODA0MWRlZWZmZmFkZDA5NDU2ZWZkNmFkNDkzNzBhIgogICAgfQogIH0KfQ==\",\"signature\":\"nHC4UYgMKgLiigQiEji57aSvQM+2vbeJmlKVf+WxnypQjh8c7+JhW1GjCPGK+d0H43wuT4V6G6pwps65rphnUAW0jhuf7G0wwJ8U/wYTeaDN+lNau0ssrBfufWmkAOGywpUHjrS4xfSxKRdBU4sKmjFoeCwOfRDdYPmgd7i7cSZqoWTuycFcwK9tfxuHGTflLFSfwKP5kul+TllapaQtcxm+tnYRWAwlSD0g6w4tbBqKvjKBF/hNm6sLEFc1Epuj7xXvmcOkXzmR3tDiA7Hnpam8YJHQmTFLhtUbNQ/H4bWVnWEeKAf1t8RbD96mdg56/ETl1+cQP3vjK6PPByqLLsEE+Rcwe0OgO3akMfiAkUDsyTKwCafs0exmjFTZqU5DlUpRCxXqw7QBwqajaBXqTCvazKxW9+00uWIGrdC7DJcpkATQF/BPeyDa/5n7UPCXjWIU/Qs3qHFKUGyTk+1H1CyBBS6djJynNJAPJQnogH5isMRjYw2JPwuCdzeQHvWpKxBtW9mxNCxvvpluVHwZsTthGNP3aM76D35hnm/xfcNnhkSKUbrEFVYAWGNlnOq1GVsLPbjuE+73t9rJ1w8PK+6nqOCqbw3cpALXZcL4NadeZWURlZ5M/+1HNwzhIj4Cm8nXvyJv1+NHZXL3EL33xkjBkJkwvXhO2dSiMdeDhQQ=\"}],\"legacy\":false}"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/RepairmanConfig.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/RepairmanConfig.java new file mode 100644 index 000000000..fd81233d7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/RepairmanConfig.java @@ -0,0 +1,40 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.ArrayList; +import java.util.List; + +public class RepairmanConfig extends NPCsConfigFields { + public RepairmanConfig() { + super("repairman_config", + true, + "Reggie", + "", + Villager.Profession.WEAPONSMITH, + "em_adventurers_guild,278.5,81,263.5,-90,0", + new ArrayList<>(List.of( + "Get your items repaired!", + "Repairing items for scrap!", + "Turn that scrap into durability!", + "Need a repair?", + "Got damaged items?")), + new ArrayList<>(List.of( + "Best repairs in town!", + "I got your fix!", + "Need a fix?", + "I'll repair your items!", + "Need elite items repaired?")), + new ArrayList<>(List.of( + "Don't forget to do maintenance!", + "I'll be here if you need me!", + "Call me beep me if you wanna reach me,\\nif you wanna page me that's ok")), + true, + 3, + NPCInteractions.NPCInteractionType.REPAIRMAN); + setDisguise("custom:ag_repairman"); + setCustomDisguiseData("player ag_repairman setskin {\"id\":\"09824045-9335-4ef9-9e6d-26d152afe4ee\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTY3ODI5MzYyNDE3NywKICAicHJvZmlsZUlkIiA6ICIwYTc1N2ZlZjYzODA0Njk3OGExMDExNjc4MDZhM2U0NCIsCiAgInByb2ZpbGVOYW1lIiA6ICJWYXBvcmtpdHRlbiIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS84NmM1ZThhNWUwYjAwYTUyNTcwZTA4MjVjNDAxN2Q1ODUwMjM4ZWM5ZDQ3MjU3OGQ4MzRjMjcwY2FjN2E0ZTVjIgogICAgfQogIH0KfQ==\",\"signature\":\"BASup7t5u1zwqWTzfOqVAy4rMA8ZvRdv5BISpEIUl/FEKGNt3fppJkB/EUvaU2TZuUTaYRTNih3VjtYIkajkp2TKAR+IRAJLurVEK/SidHmXXI39tnb3/bivBlGGCJRU8QU4OYyiNFK7HUyVCFFtJytRENdK0Cv/r83IAy/ac/rVzrI/HBSsdZ5iX304tBpWJlP1iwTC5ezJUpZRfxHdr/vD8ftdPftLJrG/41X+YL55gSOWjxD2o8IzNrTUcHitnTzf56pdxE+DSZkOe3RLnoc9+z+cm1r7+fzIbrV6FkmJ7GxVkFZyRpeFMKt7/4BZb2YPDmLfKyyVq+bPtoAaTr85EqjGY3iHLvxpaBV/wmM9hzqU+A0pN411VMPRJPTeqcp3PCYtqZY+LHMT7kkJqtC4cFyS3aPgeLblLO74oC4RhRLEICybvA68ypmIykHSEgQdGWgcuesE/8Mpibn4hEdvjbqHv6ZiXMjp6WWBIRvNtSBinxwGqofwC+6/KI4uJ1A25KCWyJR4Wb3dAnjy/eDNTkM0LnwpA0Ul9worI20H87NnEV/rmUNN2yBWDf718Tg6Wm7ZEQANp/dEy2S8fk+OkbVr9et1EilVK+Y9lb0rkAfiEFTxXCBykZv8KHGIH/nb09Er7/xguNpoDk4xHOVjO6pPM4RiU4Sluep1Mg4=\"}],\"legacy\":false}"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/SantaConfig.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/SantaConfig.java new file mode 100644 index 000000000..6c6e73174 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/SantaConfig.java @@ -0,0 +1,47 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class SantaConfig extends NPCsConfigFields { + public SantaConfig() { + super("santa.yml", + false, + "&4Saint Nick", + "&c", + Villager.Profession.NITWIT, + "em_adventurers_guild,212.5,88,236.5,104,0", + List.of( + "Ho ho ho!"), + new ArrayList<>(List.of( + "I have lost some presents, \\ncan you help me?", + "Dear traveller, I have\\na request for you!", + "Can you help an old man\\nin his time of need?")), + List.of( + "Ho ho ho!"), + true, + 5, + NPCInteractions.NPCInteractionType.CUSTOM_QUEST_GIVER); + super.setQuestFilenames(Collections.singletonList("xmas_quest_0.yml")); + super.setDisguise("custom:elitemobs_saint_nick_skin"); + super.setCustomDisguiseData("player elitemobs_saint_nick_skin setskin " + + "{\"id\":\"017f3d21-319d-48ab-b6b0-1084ca56c078\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"" + + "textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTY0MDAzNzk0Nzg2MywKICAicHJvZmlsZUlkIiA6ICJjNjEwOTExMDh" + + "lOTQ0MWRhODQyZDA5MDVmMDAyOWVhOCIsCiAgInByb2ZpbGVOYW1lIiA6ICJkZVlvbm8iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOi" + + "B0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZ" + + "nQubmV0L3RleHR1cmUvYThjNWMwZThhZmZkNTgyY2FiNjdhMGI1OGMyMDVkZjNjMGJhYTUwMzIxMDI3ZjZiY2FmYWQ2YjNjNDM4ZDMx" + + "NiIKICAgIH0KICB9Cn0=\",\"signature\":\"TvI5R8ftaZKTBAl5t6ON2aWbApJ5tQKN8caWuy3f/NJ0MFSk6PRiFzEfFIMHxLICJ" + + "D5sAQm8NhSGHCWMecLQtPJSoK9u3SSjSxr6wIHCD+AYFNeWAGRZP1swYq8E87nGslChlVB/1++MIpWAudM3HI5qxO3lzs9hDgLXRIEr" + + "MTolyqltAJXCyJbuho60+z8qRZaVx6NKiIB9bGwYYsDzAraPgn/bXd15nHW0hkal6adXBp45nRcGuD2iUp1X9tC1OBtTcAsjkhZjgki" + + "sw9b5gR0TFQpdvzezJbJCHKMIb0xAkRCIMaxnt2VSZ8eXGzg6wpTV8PXCRRNN0TXe/Bhodh/T8R7IUts6rz+6aYUCco4dCMDbfqWIFz" + + "NQ6JfFUPPXM5WhzmU0e/T05NYEKcP8dKAywC1OUPOT2MUNkS0IIXcQdwcdPxT2/YgWGUKKwaDcTcMqBVwbDhAvEl8xG8N8Wsm54YYy0" + + "McrnoogQZQ7VOMVZJDfeZmbA45fkHp5kSCJ5g9txgR4mRMmVz9mTxzyYUtTTrloey4EqOxJb8Rg/3S6QXGwIdMY+V7yptXAijm0T8qU" + + "VIWWcNlo7GeeSQ3VUI4L2EOk0xbiQMWMWDFwMcbKBrd6OHuyRbCe6CIZFLGjQDAM1xo/I4reRaagneM57rUTg/4xgGHWRhX1oFmZxGE=" + + "\"}],\"legacy\":false}"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/ScrapperConfig.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/ScrapperConfig.java new file mode 100644 index 000000000..7ebe75770 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/ScrapperConfig.java @@ -0,0 +1,40 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.ArrayList; +import java.util.List; + +public class ScrapperConfig extends NPCsConfigFields { + public ScrapperConfig() { + super("scrapper_config", + true, + "Kelly", + "", + Villager.Profession.WEAPONSMITH, + "em_adventurers_guild,292.5,81,263.5,90,0", + new ArrayList<>(List.of( + "Want to get rid of items?", + "Need to recycle items?", + "Looking to scrap?", + "It's scrap 'o clock!", + "Scrap time!")), + new ArrayList<>(List.of( + "Scrappy deals!", + "Get your scrap here!", + "75% chance to work!", + "There are no refunds.", + "Recycle, reuse, reduce!")), + new ArrayList<>(List.of( + "Come back when you have\\nmore to scrap", + "Don't forget to make that\\nscrap useful!", + "Happy scrapping!")), + true, + 3, + NPCInteractions.NPCInteractionType.SCRAPPER); + setDisguise("custom:ag_back_teleporter"); + setCustomDisguiseData("player ag_back_teleporter setskin {\"id\":\"884501c8-4d93-46bc-85fb-2028723de920\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTYxNDQ3NTk0OTk1NiwKICAicHJvZmlsZUlkIiA6ICJkZTU3MWExMDJjYjg0ODgwOGZlN2M5ZjQ0OTZlY2RhZCIsCiAgInByb2ZpbGVOYW1lIiA6ICJNSEZfTWluZXNraW4iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzE1YjRjNzk0NzJiMTVlZmRkOTRmZDQ2MmMxZGYzYTM2MjhhNjY2MDVkYjk5NjQ3ZTNhYzA5MzJiYTZlNzk0ZSIKICAgIH0KICB9Cn0=\",\"signature\":\"hAAiBL8a0UBXNdyYehx9AjWsz7EzhbnyldVEZPx2pd8N76TCgscu2ad8ypKj961D8iBl7u3GMmAtoAQtDSMIfaA8GteGu7nhBE4f9/+QXtzkFcudbk7C+Hq8LVLvWsbmVywrsNiqQ+6KFdT7/YnhPXO1xO1EjsnRbuynN/FhlJWdWwBLjuA9e/QA2LH8OgHHdAA73/gJfxH+5isc4sy0dVo+KwUjKaPGDem+eB2JlwSAfJECj9PiFNbdDKcjFNMVBQJOUZmrWH1eW4fYgk4I3mQ6uURmwp2Tp0zLu9Sgt0+wDNbYFb33x2XN4veDdEqTLoE55XqpSRmQAi9dAtyjiOc+3ATDV9pewcAjT+yk6IN5gR0qU36UM4E2uoZ+2tvgOlm9ZOoxx8nv0fWLUNEBnR16n8LCceisDh9KG8+MBtxvPLZnkghBNJmy6S6Fm1aPq4dZmCV/PlxMznN4ys/eG/QrmYguO8Wf9jNQiO47x745fBaD53W5A27GH7tChNgDFJ6pF3U/cfa0HdH5ddkGCYlfevWkOhEKdTxC//+R7+ryyaiBLsr1vTQvgTWYdvZKWIW8QLTTVktkhdZIApoTJMD8HxdvdxhulpyCIFBxkW+iXBkJLfBA93LrXvkNRmUoXl2OIyAxekhoL1Hj753l9PDkz4sqLx1nA18cb4TyQ0U=\"}],\"legacy\":false}"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/SpecialBlacksmithConfig.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/SpecialBlacksmithConfig.java new file mode 100644 index 000000000..cc919a417 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/SpecialBlacksmithConfig.java @@ -0,0 +1,42 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.ArrayList; +import java.util.List; + +public class SpecialBlacksmithConfig extends NPCsConfigFields { + public SpecialBlacksmithConfig() { + super("special_blacksmith", + true, + "Grog", + "", + Villager.Profession.WEAPONSMITH, + "em_adventurers_guild,282.5,93,258.5,-90,0", + new ArrayList<>(List.of( + "Need something?", + "Got anything good?", + "We have nothing but the best", + "Got anything worth selling?", + "We only buy elite mob gear.")), + new ArrayList<>(List.of( + "We buy low and sell high.", + "No refunds.", + "Absolutely no refunds.", + "There are no refunds.", + "No taksies backsies.", + "Shop purchases are final.")), + new ArrayList<>(List.of( + "Come back when you have\\nmore to spend", + "Don't get yourself killed,\\nwe want you to bring us\\nmore gear.", + "Next time buy something \\nmore expensive.", + "Don't forget, no refunds.")), + true, + 3, + NPCInteractions.NPCInteractionType.CUSTOM_SHOP); + setDisguise("custom:ag_special_blacksmith"); + setCustomDisguiseData("player ag_special_blacksmith setskin {\"id\":\"5a5bfe9e-6db4-4458-b66d-31d059260f1f\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTYxMjk2NjU5MTAzNCwKICAicHJvZmlsZUlkIiA6ICIxNzhmMTJkYWMzNTQ0ZjRhYjExNzkyZDc1MDkzY2JmYyIsCiAgInByb2ZpbGVOYW1lIiA6ICJzaWxlbnRkZXRydWN0aW9uIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzdhNjk2MWE4ZGQ3NDA1YWMzOGMxZWI3YmM0YTBhNzQ2NzdkMWU0NjZmNjM3NjRmZjhhYjIxYmNkMjQ4Yzg0ODUiCiAgICB9CiAgfQp9\",\"signature\":\"lIL1qePOExtPIFEK4r8woroF//ii3SOY7Rggh9Qwwj7qloAdKUg4+iGvllSD1SKOFoYP7SiUb37tU3CbfEbfr+W2lib1NF+NneHDdTmqngIoGrMS+ATSpzZvlx103tZQTLRytxoB2grMLtWprG5RXgBewqhvk0aXhIGYte3z8pyCX59YTI5ViKK7SWivIxKv5m2vOrW0Z2pVKvGst1Ck36/2vmLZmgRR3RVUkErxGcamsqhHlRCXW1swcWnZQJJbx4kWtAdkI0GtiRYkb7ZauVm9WC9Ip5ywN6hdTc+EZvtP7xfSsQjyI0kGpiw93GwBQY/hYEdqmPzTrdbC8qx09G6U7I9BwbSujDJDhS4LxwcxoMd8I4T8tDbDp8lFbTDldMVngWWTARE6gJZUwQo0ttkYUDADyi6tmAbyYrYGDxFz24rZRIEWUzxJqUmJ5NzWWvW5pBXZ7yJ8glYW86yjwwXO3b6Qg0VBlFQdEv6z6L90Ji3U3GzENMTdiyio+iqv8D/G5F0iN1D3Il9cS80ZvU3DhyxAH6DQOwN4mf6i+0Mud6t9Qz/pIMLAGgNWCz9VPm4yvPazMPFKLbaCTYwOui3d+J8sHbkrtYSRfT2oHnX5NzVC97b6F3W6IIXPbo/f+pku4AA5+0BawK1ECR3yYEz9w0KTwA2aRxkugeWsuqc=\"}],\"legacy\":false}"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/StoryDungeonsQuestGiver.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/StoryDungeonsQuestGiver.java new file mode 100644 index 000000000..2e39fcfaf --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/StoryDungeonsQuestGiver.java @@ -0,0 +1,38 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.List; + +public class StoryDungeonsQuestGiver extends NPCsConfigFields { + public StoryDungeonsQuestGiver() { + super("story_dungeons_quest_giver", + true, + "&eManager Wallitz", + "&e", + Villager.Profession.NITWIT, + "em_adventurers_guild,303.5,78.0,212.5,-17.84,3.6", + List.of("Salutations!", "Good day."), + List.of("I'm a bit busy..."), + List.of("Bye.", "Until next time."), + true, + 4.0, + NPCInteractions.NPCInteractionType.CUSTOM_QUEST_GIVER); + setDisguise("custom:elitemobs_story_dungeons_quest_npc"); + setCustomDisguiseData("player elitemobs_story_dungeons_quest_npc setskin {\"id\":\"ddc4255f-68b3-43d2-b253-c39d2e726314\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTY5OTU3NzAxMzU1NywKICAicHJvZmlsZUlkIiA6ICI1ZWQ4OTJiN2UyZGU0ZjYyYjIyNmFjNjQwZDA0YmJiOSIsCiAgInByb2ZpbGVOYW1lIiA6ICJmcm9zdGVkc3Vuc2hpbmUiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOWM2YzhhYzZmOTAwN2Y5NWE5YWI5YTBmZDY3MWEzMjgyODdhNGI2ODNiZDMyYzgyNmZkOWE5YTQ3YjRiMmNlMSIKICAgIH0KICB9Cn0=\",\"signature\":\"WM1SCqPKcMHM1e9me8QLQ0vs0EOda4aa57/Qo5vl7oBITM0LdbcO2BehBGrY+y3HfPjymwv8cyGA3JxP9jNeDzUQTECvjMsCOx9P0RteSjtRfZ4N/n2noDxv70et8BUOFs4p/bOZeEpFhu+pq3kdgfukwerCJCe4EJKCdwSdP9M1xZXHGp33rIHcQAGw5hsGRA77RVBFPs1iS0z7tMRbZYBOh99Rs6Da+fGOzK2QcReZSQBntP9xtDY2wXxIM71ePvf4mNAZ+FO8FosaXkJNKvRr7GorRLrMehgSOK0Veft/m5iZj8ozDAhhiGCn1qB82vg03qq3kyFCS48krQiT3dcTN+PvkbM9N84D6Xp4+nRm4jHHPpJcZeg3SkyTOpUOLAww18eSEMoJ2N0Fc3eR6HSMZacI5iYleNWFqnENk3Wpu2+MFRKDQk5NJJNRjDzwWSxIzW9jywg9pL2y7yqZddeCecIQSrFF+mVP2ruDjBSaf5r7oHnhMi0EtjM0JUBTTFrEeXjJjKoyLzFwjyVoymDm9DB27al2Vlcp4lidhl37rwadxRIgZPighVkJ74dcB1uCm9IeQv9LENaRHPqzhTW8C6V2dCat+jYFiCHTq23qIgIi6OpLL3ZRMoLtEKC6fV8v84sPZZ04eidXBRbirGiI9cBebqZSqcUZjslFTkA=\"}],\"legacy\":false}"); + setQuestFilenames(List.of( + "story_dungeons_quest_1_undead_attack.yml", + "story_dungeons_quest_2_broiled.yml", + "story_dungeons_quest_3_the_soulweaver.yml", + "story_dungeons_quest_4_bridged.yml", + "story_dungeons_quest_5_the_underground.yml", + "story_dungeons_quest_6_the_monarch.yml", + "story_dungeons_quest_7_down_below.yml", + "story_dungeons_quest_8_deep_down.yml", + "story_dungeons_quest_9_nether_vacation.yml", + "story_dungeons_quest_10_the_void_bell.yml" + )); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TestNPCConfig.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TestNPCConfig.java new file mode 100644 index 000000000..c6178cf2f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TestNPCConfig.java @@ -0,0 +1,25 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.List; + +public class TestNPCConfig extends NPCsConfigFields { + public TestNPCConfig() { + super("test_npc", + true, + "Test NPC", + "Testing!", + Villager.Profession.NITWIT, + null, + List.of("Test Greeting!"), + List.of("Test Dialog!"), + List.of("Test Farewell!"), + true, + 3, + NPCInteractions.NPCInteractionType.CUSTOM_QUEST_GIVER); + super.setQuestFilenames(List.of("test_quest.yml")); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TheBridgeTeleporter.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TheBridgeTeleporter.java new file mode 100644 index 000000000..4bb977981 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TheBridgeTeleporter.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.List; + +public class TheBridgeTeleporter extends NPCsConfigFields { + public TheBridgeTeleporter() { + super("the_bridge_teleporter", + true, + "Old Dwarf Jotun", + "<[25] The Bridge Teleporter>", + Villager.Profession.ARMORER, + "em_adventurers_guild,303.5,78.18,202.5,90,0", + List.of(""), + List.of(), + List.of(), + true, + 1, + NPCInteractions.NPCInteractionType.COMMAND); + setCommand("em dungeontp the_bridge_sanctum.yml"); + setDisguise("custom:elitemobs_the_bridge_teleporter"); + setCustomDisguiseData("player elitemobs_the_bridge_teleporter setskin {\"id\":\"4dc553ab-1814-4362-909f-d529ede78768\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTY5ODQzOTE5ODIwNiwKICAicHJvZmlsZUlkIiA6ICJkMjdhNDM3YmI2OWQ0N2E0OTY4NjU1OGFhYzA4NzA1OCIsCiAgInByb2ZpbGVOYW1lIiA6ICJEYWx5bmthYSIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS8xYzhiNWUzYzIxYjUxZWMwNWQwYmNmNmZlZWQ5Nzk0NTczMjkxN2I0Mjg3ZDY1NjJhYWFjOWI0NTY0OTBkOGExIgogICAgfQogIH0KfQ==\",\"signature\":\"KVTpE02yIZ99o6eFzO819AMrYvoASlq6SsZqqPXjrJD5unrKI+SW22fu8vAHlFdUbC//10dygqVzBo61yrtrbfxxXyFLMYdTrxqHpGvnCL2k64/sgVNEl9DZu0kZnLybXYnRTAQEU7bi8Piru4UrSp6GBD4lU0UMzXxcBk6ucj0yI3i2pmzKl0Sn/wzjoD/2xhfymYlBgZks8uxaWlfzZobZMhYSeCGgnANR3kkT9VbHvpyNOPYuWwWHvYjTUnyCZajz2RWgZzwGiKg2X5JIMW3KLfzljUlH+wPVApT6pfpx0nbw3Vt1Tf+0OSJmjscHbl5OvmnWmn8b2i+XgWlxylLKhZ52mCxy4ONqFDh3lwy5+ZEtZLsdhnsgxYWoenxdSTa0uSWas7GhRdvmZIeNDjn/TAbp5w0D8n4ycp7hatF+WlsE2CYB9Ycs9k99lanC3MA49bo1lz7/e3BAiJDIOsZJ3vOEIQgRt8TCl2reA2/j1rRisjexNLqM/nLzlZaGa0hxdddwuH43NBi13dkBIVn3g9dGGzOP6dSeGth1BXlSsTvINqlGMlMWKTlRwzf2Wolpopq0ndvPQ925XWOaykO45JxgrYIDksiPJek2+ZI3MSduAslXqykJEQ7CHAPqR9Nvllv1JM/osp4pTElBEAEpta2eQJuLYllf/jqIJBk=\"}],\"legacy\":false}"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TheCaveTeleporter.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TheCaveTeleporter.java new file mode 100644 index 000000000..c3f023d8c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TheCaveTeleporter.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.List; + +public class TheCaveTeleporter extends NPCsConfigFields { + public TheCaveTeleporter() { + super("the_cave_teleporter", + true, + "Village Mother Diane", + "<[15] The Cave Teleporter>", + Villager.Profession.ARMORER, + "em_adventurers_guild,303.5,78.18,206.5,90,0", + List.of(""), + List.of(), + List.of(), + true, + 1, + NPCInteractions.NPCInteractionType.COMMAND); + setCommand("em dungeontp the_cave_sanctum.yml"); + setDisguise("custom:elitemobs_the_cave_teleporter"); + setCustomDisguiseData("player elitemobs_the_cave_teleporter setskin {\"id\":\"acb830c3-4415-40b8-aec4-16f32c2f0424\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTY3NTg2MzQ2NDg5OCwKICAicHJvZmlsZUlkIiA6ICIzZmM3ZmRmOTM5NjM0YzQxOTExOTliYTNmN2NjM2ZlZCIsCiAgInByb2ZpbGVOYW1lIiA6ICJZZWxlaGEiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvN2I1MDg2NmE1ZjEzZTQxNmRhZGYxZDY2ZTNjOGJmOTY2NGI2MGE2N2RmNTBlZDM2ZWRiMWRiZjIxYjI1Mjc2NiIsCiAgICAgICJtZXRhZGF0YSIgOiB7CiAgICAgICAgIm1vZGVsIiA6ICJzbGltIgogICAgICB9CiAgICB9CiAgfQp9\",\"signature\":\"SFgkH/mIf2EL0V4DVNkdt6DcJh85XcLmwiM0cixad7x+ZTQA3nynhQJkUzM/0x4NsYEbvSbRINRPcI3CxuPg6XNwkYTRBKBoGHO33e/py5GJbah6t/Cqn4HG8CHs3kmlSbaOBirXsbclRlKfsEtbpxgNpjYRROyfZUPnDiFjDCKF9j0mO5EFPufEGmErYoJCvgZh4Cu9WFvImrVXVdI9/CR0yWU2isBS+sot9iCK97d7C9GSZL4ThTpxzDVajhBPVwccA4WsIdtyxyzN6DHkIeOmoKvan9U2HtttEUcGxwfuMmZEk8zqQHVSgkKpvDC7ZtzEKULfDx5+5l3getpbLFoVBur6XOPT+GgSMplfbx250fT20yCC62hr/z2h2aV2v9gHvFx18cPphqHaCcuSUpOPgdXoRA34xsarv6xZfZYkQ3h3vh9q6+Vii/hCHzcfJ9AZ2CVC8de2J0RGuQ3Q/F6FOzp6ZchuxqDpToQHjEWO8Ql3U+XvMYYdEUqHKQHFgucnk/z0hGadjQxvLQqqqILi2BGrvvXScupBpFlx+D4bRIXpX5NAw57hBAAO9bZqy6BST0/LS7LaAScl/ijgqcsczYi6TIe3ouWpDkAdF82Rt2geseZ1vBOAFTJY/Em6iG2H4YXDmH1qW/NyFeD8jzdC8Y+oM0V0wcwYxcEwY7Y=\"}],\"legacy\":false}"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TheCityTeleporter.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TheCityTeleporter.java new file mode 100644 index 000000000..d13203243 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TheCityTeleporter.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.List; + +public class TheCityTeleporter extends NPCsConfigFields { + public TheCityTeleporter() { + super("the_city_teleporter", + true, + "Dwarf Olav", + "<[30] The City Teleporter>", + Villager.Profession.ARMORER, + "em_adventurers_guild,302.5,78.18,201.5,0,0", + List.of(""), + List.of(), + List.of(), + true, + 1, + NPCInteractions.NPCInteractionType.COMMAND); + setCommand("em dungeontp the_city_dungeon.yml"); + setDisguise("custom:elitemobs_the_city_teleporter"); + setCustomDisguiseData("player elitemobs_the_city_teleporter setskin {\"id\":\"0912ce06-1d48-4e3b-8c06-21e274027bd7\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTY5MzQzMzgyNjI2NywKICAicHJvZmlsZUlkIiA6ICI1YzY1MGIwMWIyYWE0MTY2ODIyMDQyNzA3YzMyMmU5YSIsCiAgInByb2ZpbGVOYW1lIiA6ICJQdXJwTEFCIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzZlNmFlNDQ4ZWM5MDMxMjFmOGY2ODVhYzk0ZGE0N2FkYTQ1ZTE3ZGRmM2I5ZmM4OTVhMWJkYzM0ZmJiNWEzYmUiCiAgICB9CiAgfQp9\",\"signature\":\"qSe2tRxf7qD7q9FY+juA9WTmI7gKX8q8ZdL9Lq1pEkuv5TFqJRZNaCx81qSiBfMP0v4ynVdelt2i79EwJo2BmqlmJXMP3mZX8IAQel6v1bLClKVHfK4v1Yn9Z+fxVVWjxR+5qvGd0+W6Sa58/YVvS0Dm5BXsJJqybPxjDAOz9BsPqXIVfc5OyDO6kdvcjWs4i7jcKoStgfHOOqOdz0qF34lLeTMocysofekfqm8qPe3svdgPHFpNUd7OsaRCQ8ZisvGnIEhQN/dlQrxZgkXE4QHzHU3N1dUE1aNbEUiDbQmcW+sItJrI02oXV2B5wYstadKzt+ZtizEuzQ62Y/zxKVUhKg9GziEcQT4XUcPYm33Ra06NUTfGZZL9rjSCfpcUigni2VheBHc6952PIpfwsVlPl0+uRpBrFGvZF2VVIXILrYcbCuwYtIvN03N+T7qxeLVaIFCpZoObyAhmNVRNxhoiq/w0uK52Xn41jt5qrCKsM10JK9SnoKQ3YJ7q9bemw6SiprRejL0r7RRHvKDoEGRE0fifh4Gmr2Yep8gaZgBqf6DFDmaRR5iq2kjlVXTvURwvFNPYsI3SHBWVyfTM8V5nQ1OSEoJzyf1Z2llMS8b7uJQylygkS+cEStFNmsg0tyPN13TVef291kQ6q8L8lLB2j6mVOzPp+/97A495yGk=\"}],\"legacy\":false}"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TheClimbTeleporter.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TheClimbTeleporter.java new file mode 100644 index 000000000..9b13967ba --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TheClimbTeleporter.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.List; + +public class TheClimbTeleporter extends NPCsConfigFields { + public TheClimbTeleporter() { + super("the_climb_teleporter", + true, + "Miner Regulus", + "<[10] The Climb Teleporter>", + Villager.Profession.ARMORER, + "em_adventurers_guild,303.5,78.18,208.5,90,0", + List.of(""), + List.of(), + List.of(), + true, + 1, + NPCInteractions.NPCInteractionType.COMMAND); + setCommand("em dungeontp the_climb_dungeon.yml"); + setDisguise("custom:elitemobs_the_climb_teleporter"); + setCustomDisguiseData("player elitemobs_the_climb_teleporter setskin {\"id\":\"ad1681c1-65cd-4dc6-9ea0-fc9143fab444\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTY3Mjg4ODAxOTA2OCwKICAicHJvZmlsZUlkIiA6ICJkOGNkMTNjZGRmNGU0Y2IzODJmYWZiYWIwOGIyNzQ4OSIsCiAgInByb2ZpbGVOYW1lIiA6ICJaYWNoeVphY2giLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzE1N2IwNGNkMmExYTBjYWUxYjljYmFkNzk2MDY0OWIwMTI0NTMwMmE0MDlmYmQ2M2EyMTg4MWM2NWUwMGQ4YyIKICAgIH0KICB9Cn0=\",\"signature\":\"Bo9OzYaZuF8YVCO6+d5Vx5vYG5FsFQzBBbszlZj8rHL2jyDSecxojHqjC3k/T0wSsWW9cVS14xu3TkLyWcPJv9LWUE3F5pmiynQp1iAc75TIXYV3DU3uQQ8LZp/FehMquc7CoaIGaNh7ZYAHsJ/Rp2uYned6YGeAHtWCd+Um4HnekgZ8oAFxgySQTA8qP//N55VUcyRNvuRyEsEUnSQsi3dFJsDTR+QicOdrCPkPsnOgIrQaDiNu2sspr0pfuCalwVFivqf2eAt/s1MWuLNIzaBOHR/OTVlL2QAlRZPJJjfAVXGuq08Hb75YacrizwM2vVCpQ9DdiAA2EjnS19rEsK7IsP4xQsMvxZFpa/OqnEbHn1vQcKueQSWnj4BtmwmAP8HLhnL+HzOsEGenpurIQAohnWWr2NmbxsMDSSy5oAEalOVzglDdQl6E+tPNDf7YECRB7yOF4t88GIQrWNui2cFYjPuYd9tphxLkfN0ekY7rceoHwIU/Ebu3LpU3/al3X1c1kXNNLhmQrOivMTe2Zw6mILPjuPJyRR0aISP4DHDC+OB+dvDs0v9fqfM2S7U2mQzqob/BVFCthLioIoqbrc6UFk1FzOE5xUc4tbv1q00GOXLwM9i9OGMtVDfvNqZVRijlKNRC/xclTrmkxhpD9cQX2ihd/FjJCaaoe0WjaOM=\"}],\"legacy\":false}"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TheDeepMinesTeleporter.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TheDeepMinesTeleporter.java new file mode 100644 index 000000000..ec972daf5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TheDeepMinesTeleporter.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.List; + +public class TheDeepMinesTeleporter extends NPCsConfigFields { + public TheDeepMinesTeleporter() { + super("the_deep_mines", + true, + "Nether Lurk", + "<[45] The Deep Mines Teleporter>", + Villager.Profession.ARMORER, + "em_adventurers_guild,296.5,78.18,201.5,0,0", + List.of(""), + List.of(), + List.of(), + true, + 1, + NPCInteractions.NPCInteractionType.COMMAND); + setCommand("em dungeontp the_deep_mines_dungeon.yml"); + setDisguise("custom:elitemobs_the_deep_mines_teleporter"); + setCustomDisguiseData("player elitemobs_the_deep_mines_teleporter setskin {\"id\":\"ecf00747-d91c-4acb-82e9-320a70d924c0\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTcwOTc1MzAxMDgzMiwKICAicHJvZmlsZUlkIiA6ICI0OTY5YTVlZTYxMTY0MDBkYTM4YzhmZjRiMWJhZTZiZiIsCiAgInByb2ZpbGVOYW1lIiA6ICJSZWFjdFpJUCIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS84ZWM1NGI2YTYzNmViNzRlYTMyY2NhMTA5ZjUzOTY5OWZjZDM3ZjVjMjdhYzA5ZjM4YjFiNmQ4ODU4YjAzOGM2IgogICAgfQogIH0KfQ==\",\"signature\":\"USRl7qn5bARzqeZa8E+w2b/08LETpa1WvRe8nDcQntAMl34BR/AQxeoxCbU9nIov6tQLKgxwdlnlDx5m2JIs4hMnVPrJZQXKNuu+Il8K4r4hf6H59BlAHn1bkcLuMGhZRRjyyDf78itKli+5cw3pKm3K+3FilZZcj+NRT/+FrZa1ifXe8OKj/yTSigzI6v5OIwCn589KOi/66htbWIonfx5vWPp/+Lsi3SdNqgBS02N7cEUzdv/SxT5eq+x5hU2fNXKNkgmP09yysg7vDR+yMCKOTlaxhLbueoBjC/h5/aCbGH6kD1Ido8gyZbsS8oLK7yrGLxZSO+O1cko00FDHieOf8yhfpGSQTta93R/xYMTGPkW5Z0tXbf+gK7gWRz2Y/hWUHes8s2u32SQ6cTamO66sumFEn3dn+W1EFtKVMvjj5KQpnQ0hQ7zX0gqOnxbdYEr29FHIulgFQdiloogfrrl/PmizmmBVMylmu+m7nwKYlYQZWSKHIAzxU2F3RN2nX7Td5N6uJr05da9OLFGQJcwacXo2VQmxfO9L8kuYjMCtCHsW4gAP2pGX/u0D8O0tBHtu3jaqx62Jyc/5PgQXt8f3wKe1IQY3x9B8MwBi4mPA68CRSJzf7hPDPjHx3rLXfJzUFVWHn79gmMbZnthI+4q6lO+czDUHjyEYjOvuW0Y=\"}],\"legacy\":false}"); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TheMinesTeleporter.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TheMinesTeleporter.java new file mode 100644 index 000000000..9057f73c5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TheMinesTeleporter.java @@ -0,0 +1,28 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.List; + +public class TheMinesTeleporter extends NPCsConfigFields { + public TheMinesTeleporter() { + super( + "the_mines_teleporter", + true, + "Prospector Voultar", + "<[20] The Mines Teleporter>", + Villager.Profession.ARMORER, + "em_adventurers_guild,303.5,78.18,204.5,90,0", + List.of(""), + List.of(), + List.of(), + true, + 1, + NPCInteractions.NPCInteractionType.COMMAND); + setCommand("em dungeontp the_mines_dungeon.yml"); + setDisguise("custom:elitemobs_the_mines_teleporter"); + setCustomDisguiseData("player elitemobs_the_mines_teleporter setskin {\"id\":\"bc71543f-ec67-4d65-9b45-c1eab4cc85f4\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTY4MDYzOTE3NTU5MiwKICAicHJvZmlsZUlkIiA6ICI5MWYwNGZlOTBmMzY0M2I1OGYyMGUzMzc1Zjg2ZDM5ZSIsCiAgInByb2ZpbGVOYW1lIiA6ICJTdG9ybVN0b3JteSIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS82ZTJkMjhkNjZmMGY3ZmMxMzY5YWZiN2QyNjkzYjkyZGRlMTJjNjI4OTg4YWZiOTQ2Njk2ZjllZmQ2OTgyNjU2IgogICAgfQogIH0KfQ==\",\"signature\":\"UFasr3WLe1zDAH23jgTBC7Tr8tO2tSuzcxoGGAlNQz4fLvuUSNirPR3K6K7SSqHAk1yImchvW4Q/wakCjVmSJPwHLY253a+KkjmPcxQkabNusjyVAPew6gJpDRQJg2tLIxNQd+0Pam1xLDtJ0pg1JpBvcAlQ7OGOkBMIplxHlwFsJc3BFRsIjVAbKlzUT7YLFw85HEDT2nQuWxMZscwcopu2FEVs5cU8e/F8B86HsO42cAXKdui0TESdZy0AH8KbcGcYBf9qCu8gGFz+KtiM9zIb4ghSLlasK/ioTmSD6/qzraIuwaLin90NZXnotP2/OZ/1wEbn1rIyR5LDlk0fYxbsAZxUrISFC2xreD/uFepSAtrBO6li+Ie4StDuDdMKZKsr1tPAJGyc4+I9EjpFfXmXzMMkpafsW88bD9WrmdGoaFttsO6L2D3Pex8E9Q7HSPO4IxQ5lpnBPdevIh7zcY6MggLAvPTIDFjE6R/ka56/rReyAof8ocR4gUiioOjB/OB/t2WH3egO7sSBiIzof7oAtjL4vQ1MZVeWTLjTJQ0fk5rd6qkijTEv0bHfFR0ZMmkWN8mC0lBi2M34guHcxerYxBwjtu72gP9Hfmex28uZeNG2jG/MlDwhTHHGfY9Yv2lJLIWd8W9W5Wpk7IDgKaQ98q8hjyR6PjmPoCD8MOw=\"}],\"legacy\":false}"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TheNetherBellTeleporter.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TheNetherBellTeleporter.java new file mode 100644 index 000000000..f7c778eb5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TheNetherBellTeleporter.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.List; + +public class TheNetherBellTeleporter extends NPCsConfigFields { + public TheNetherBellTeleporter() { + super("the_nether_bell_teleported", + true, + "Ancient Corpse", + "<[50] The Nether Bell Teleporter>", + Villager.Profession.ARMORER, + "em_adventurers_guild,293.5,78.18,196.5,-90,0", + List.of(""), + List.of(), + List.of(), + true, + 1, + NPCInteractions.NPCInteractionType.COMMAND); + setCommand("em dungeontp the_nether_bell_sanctum.yml"); + setDisguise("BOGGED"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TheNetherWastesTeleporter.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TheNetherWastesTeleporter.java new file mode 100644 index 000000000..1a5ca48aa --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TheNetherWastesTeleporter.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.List; + +public class TheNetherWastesTeleporter extends NPCsConfigFields { + public TheNetherWastesTeleporter() { + super("the_nether_wastes_teleporter", + true, + "Nether Shroom", + "<[50] The Nether Wastes Teleporter>", + Villager.Profession.ARMORER, + "em_adventurers_guild,295.5,78.18,198.5,180,0", + List.of(""), + List.of(), + List.of(), + true, + 1, + NPCInteractions.NPCInteractionType.COMMAND); + setCommand("em dungeontp the_nether_wastes_dungeon.yml"); + setDisguise("custom:elitemobs_the_nether_wastes_teleporter"); + setCustomDisguiseData("player elitemobs_the_nether_wastes_teleporter setskin {\"id\":\"ebc6f487-4973-4941-9f41-30f957de3a00\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTY4OTI2NjE1MjExMSwKICAicHJvZmlsZUlkIiA6ICJlOWRlMDE0NjExZDI0NGY5OTVjNmNiMjhkMDk5MWExNSIsCiAgInByb2ZpbGVOYW1lIiA6ICJFbGl6YWJldGhUcnVzcyIsCiAgInNpZ25hdHVyZVJlcXVpcmVkIiA6IHRydWUsCiAgInRleHR1cmVzIiA6IHsKICAgICJTS0lOIiA6IHsKICAgICAgInVybCIgOiAiaHR0cDovL3RleHR1cmVzLm1pbmVjcmFmdC5uZXQvdGV4dHVyZS80MzZhYzQzNzhjOTlhMGIxYWQ1NjcyNjE4ODIxMGZhNGU2ZDI4YTRhYjk1MWQzYmFlZTM1OTEyNjcwNTI3MGM1IgogICAgfQogIH0KfQ==\",\"signature\":\"Z057s/MMryjQI0zTUrZDMCSS9+U1pnfY4Gfy1hdZPYBbuZlhOIAxIIRUoeP5fvRBOA6OlOuqsWvH1ihDNhX/KSAmJzIaaCyuCG4yb6ps63v/3mzdO4oJLR2pzB8iOMOBIsBRaEhf6CDhko2C3Moz5SC6Evn9AClt0E8NCXiINOciGU8i8tMM7JYk3JTswW2KWoBC05AO4c6I/FptYIoASpFZuy9Ie3CefRmTNsFfrSXhocWMNiYici9CB6iyz2Fm491U0imJpqx2i20iCuk8J9VbrGpu94i7sbzkZwCl7983RSa+u5k36q3TNmEg03xUlqoB4icOWN+kQc50MJs81IYnvnLqGwLYukiTExPlJ+CmoUE6bLIOQV8g/P8O1OecLw4IXQx9pSKdoUwb/eNNUsQ8Uk7yHtkgCBKN8CCLbN+s5hZ84+zLa1T5ITnrDfm3BBpjJ5yOFq6pK3WF7YuyOfwxrzs69vi/AMTQ68t8UVWzjHOG2nzQKIA3mlSbZ1RIpy5RgpGM3axwzJeTo1rLP4YGewf6XHStPeQkehotbUKcIzuq4hbdMHAZfpcCq0he7oXw6T5ulA4by9cDCLOgQZpZfDZdI4rvgZUkN12jH0WmrfHGqde2qRcoGS4u3tlw3YCXXQCa3UuhGEtkdCDBYQSbhs2i5DTcm7zaTGp38Bg=\"}],\"legacy\":false}"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/ThePalaceTeleporter.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/ThePalaceTeleporter.java new file mode 100644 index 000000000..aef54ac47 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/ThePalaceTeleporter.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.List; + +public class ThePalaceTeleporter extends NPCsConfigFields { + public ThePalaceTeleporter() { + super("the_palace_teleporter", + true, + "Royal Guard Sven", + "<[35] The Palace Teleporter>", + Villager.Profession.ARMORER, + "em_adventurers_guild,300.5,78.18,201.5,0,0", + List.of(""), + List.of(), + List.of(), + true, + 1, + NPCInteractions.NPCInteractionType.COMMAND); + setCommand("em dungeontp the_palace_sanctum.yml"); + setDisguise("custom:elitemobs_the_palace_teleporter"); + setCustomDisguiseData("player elitemobs_the_palace_teleporter setskin {\"id\":\"602af930-1f59-4ea4-8e9e-0416333e24d5\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTY0NzcxNzM2NzUwMiwKICAicHJvZmlsZUlkIiA6ICJkYmQ4MDQ2M2EwMzY0Y2FjYjI3OGNhODBhMDBkZGIxMyIsCiAgInByb2ZpbGVOYW1lIiA6ICJ4bG9nMjEiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDJhM2ExMTM1NTQ0MzkxZjFiZjZjYTJjYmI5YjA0YWNiNzJjZTFmNmIxZWU5ZWU4NWU4Y2QzY2ZjODU1ZDJiNyIKICAgIH0KICB9Cn0=\",\"signature\":\"W8hpBA1jku8YoGLiw5FYL3HXwCRi6ZAUV9LjHMZMWjjnBxqohyPYWd26J6CyuzR1LSo3nMqctc40qFme9GtTsHtjCeYjl7ep9MRB73637hzLKtkNHudnyoX09sSCRBhFABWaROxw4ZF9/WtRxkrrDwJpGYJl47MDcy8PRlZ6vPYKJcUxc1xWxm+JTNxgeAYoTXuya56gUgULduFPS7/5sVGtNviLKbYuxrg8O9RSiB3hSEGtcf2HtzSH0a1Nhdv7uwEhWjTmRrAABJeF16V8hdoiaYylHP8nSGCSbbJLhm/zc5AjkdK4riZG8wZVnheRtBWHsBl/dzbXqg60Fy5B+pwyRNgdDvq3fbcCkWbWE1f0GNWVwzSy/p/oUZUmggfPKGfFluvwT84NzXKstH6GsxXpDjz6Tg2mYGxihKvaV5alljlRqIOeQZ2YVmyn92C7T0a6omF1jbLtaew94PKBqSOZA4qa9nTfHZRbnpeBse9q/DxexJU2EfPMR7jE3S2sEXAlXu2RrvTOGTC5McivEaYSs+00ANHhATRMNYCJyAXYgR4lUA5YXU+Hi4u6ypSGnHH+IS49QjATyWhAdyJpftB5r0hlK1oONd/4Zhu0g/bsrNKRV9GRhW17Ny9Qmk0JidgF+JpHd4/jU3uwZmf61fLwxz3Ziq4prcUDBIskFt0=\"}],\"legacy\":false}"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TheQuarryTeleporter.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TheQuarryTeleporter.java new file mode 100644 index 000000000..60c665dc2 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TheQuarryTeleporter.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.List; + +public class TheQuarryTeleporter extends NPCsConfigFields { + public TheQuarryTeleporter() { + super("the_quarry_teleporter", + true, + "Dwarf Berge", + "<[40] The Quarry Teleporter>", + Villager.Profession.ARMORER, + "em_adventurers_guild,298.5,78.18,201.5,0,0", + List.of(""), + List.of(), + List.of(), + true, + 1, + NPCInteractions.NPCInteractionType.COMMAND); + setCommand("em dungeontp the_quarry_dungeon.yml"); + setDisguise("custom:elitemobs_the_quarry_teleporter"); + setCustomDisguiseData("player elitemobs_the_quarry_teleporter setskin {\"id\":\"da3c951f-2e67-4df4-8a86-dc6109ab9084\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTcxMDI0NDgwNzU1MSwKICAicHJvZmlsZUlkIiA6ICIwMDM4Y2RkYTcyNjU0MjE1YjdkNWZlNmNmYWZhZmM1ZSIsCiAgInByb2ZpbGVOYW1lIiA6ICJBR0E3T04iLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmIyMDYwMGMwOTM1Zjc2MTFlM2E2MTYyNGYyYWZmNjFlNjBkZDExMWFhMGIzYjA1YjAwN2UzZjljZWQ2MjUyOSIKICAgIH0KICB9Cn0=\",\"signature\":\"qJkykPsoNRZwCELGWQWi71i/Gq0tvCJY9cRz7LCdHN3cGBVnKkH8VhbR0Nl1HxyIJJn0H6Od+akbLP6i92+nhxHkGKbO862qDyR+2PnpGJ4FydAQ5+bZ+FkML/JtR2BxY8/5n9uz3SxmTwQOIT697900jHbAEB39BRR77An7Fz5wdNsAoW3rqgMHApaKTFzcH8PK6B9Vg7ksCOfMh7ckbWPkaB2fq9TVwFZsCOkBbAhSPXwYzI2faS9BBUoEUzWtMxcDLQGu3H3pY8lJaf1ErMXxuyAbN6wsADWqiJ1mlgHUvt5FFfCxXIOjJs0uWRSZsL7H9/6gXrZWQqOyDKQDS533iSM/eHNOdYgh9gTuDiAZtZ/624vJySsVo4PoJlhH631OEe7iaBR11AYiGeHBWDXvdOGm+lx6O6MhMRPQHIy9RjLE3fEDCSk2N1cGH+LAAf67I1i9u92m1IIrqfETzEy4ripy7wC2anC2s7vRkqWxl8pdvoipzMxle5OwP2shbMfwgP8R1uWn6iTLsv3RElqifhu+IMcB1fAgghWWXr8AamxrAff5DRY+5jqEIfRMisv9ML5ikU3wN1eNFkIk8lzLL3FHdW6zGXuD36LpUt+l7w12Iq8iA+sjyFs7+hIJv3fkpJ5I5DIkJQEJPqgtpJ8EOIbXGNixNiBERFTw7GY=\"}],\"legacy\":false}"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TravellingMerchantConfig.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TravellingMerchantConfig.java new file mode 100644 index 000000000..35172fc7a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/TravellingMerchantConfig.java @@ -0,0 +1,39 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.ArrayList; +import java.util.List; + +public class TravellingMerchantConfig extends NPCsConfigFields { + public TravellingMerchantConfig() { + super("travelling_merchant", + true, + "Jeeves", + "", + Villager.Profession.LIBRARIAN, + null, + new ArrayList<>(List.of( + "Got something to sell?", + "You called?", + "Huh?")), + new ArrayList<>(List.of( + "I'll buy it on the cheap!", + "Got something for me?", + "Time is money!")), + new ArrayList<>(List.of( + "Call me again anytime!", + "Was that all?", + "Safe travels!", + "Don't get yourself killed!", + "Good hunting!")), + true, + 3, + NPCInteractions.NPCInteractionType.SELL); + setTimeout(2); + setDisguise("custom:em_travelling_merchant"); + setCustomDisguiseData("player em_travelling_merchant setskin {\"id\":\"cec11e92-977e-4c19-ba39-dd547b65bb43\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTY2NzY4Mzc3NTg5MCwKICAicHJvZmlsZUlkIiA6ICJiMDM1OTg4MWIwMjk0NTNjYTk2MmFhNjA4NjI5ZTdhYyIsCiAgInByb2ZpbGVOYW1lIiA6ICJGYW5vNDMyIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlL2MyMjk3MDZjY2M4NzAzM2NhZTE3MjY0MTg5NjQyOGE0ZDBkMTFjYTIyOWJmNjE4MmMwNGI4NDNhNzA5ZmRiODAiCiAgICB9CiAgfQp9\",\"signature\":\"CGc4XyRbLSab5UhxSWVJ/fgTCThqFnc2LaURvp3UpjKXR29sUTqQJtIbrPC3c2IgQr+SyV24BYv7lGGYIIiAY0vjfk6LV6PiofMX0Hm/cg7S1TgvEFMpzRJB7dSEbW4HBT4hCnkjB0wbjRT2jfyy4lFJ2GpNmeyswfC+VAv093ziuwA61nqwl+vSb7yZcgEALdPnwiwb0wXLsQ6/7hq8E5iQsIsKR46CnuaQQoyOmb9en56rMmWXW9gJleGU1ht6LxNqkgCvpjIwa4PfjZbgfE+Fb0Wp7Nilomz+7UaBz3NBpK9ICuFXynCT4L/K4wef6/tMq/5EoUmEuIExgn2WMIh2yi5WTwp8iz7kMz9RNSJR+S9opG3Jq3YHlIaLPboUp6XQ3klX6Wzl9ScCM9K3rK4c6aysuc2qz3rzNcBuHd+ETgW3Ow1kg7qID+tVUgNABt+clpzRM3dE3rfHs2jsH3lsGX5H1iSnsYcjkJXwk5DVEQDacviwDGyN5vrMAPVW/17O3HvShAQJ4yRj5z9cAUADmFVAmk16nyLVb6bGeELVCV1xxue4dIBzWD5YDLkmSZusFAdOMh13SSJ6zr8ylxiZYue0OoJScJVH0rcbid8QDmcYDbATqVsgMS+LWpAiwh65WNKWeubimK683mccs1RlYbcBPxCR75TXt4gEFY8=\"}],\"legacy\":false}"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/UnbinderConfig.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/UnbinderConfig.java new file mode 100644 index 000000000..f2959d112 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/UnbinderConfig.java @@ -0,0 +1,38 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.ArrayList; +import java.util.List; + +public class UnbinderConfig extends NPCsConfigFields { + public UnbinderConfig() { + super("unbinder", + true, + "Ulfric", + "", + Villager.Profession.WEAPONSMITH, + "em_adventurers_guild,296.5,81,253.5,90,0", + new ArrayList<>(List.of( + "Greetings.", + "Well met.", + "Hail, friend.", + "Yes?", + "May I help you?")), + new ArrayList<>(List.of( + "I will unbind your items\\nfor an extremely rare unbind scroll.", + "I am the only one qualified\\nto unbind your goods.", + "Have an unbind scroll?")), + new ArrayList<>(List.of( + "Remember: Use unbind\\nscrolls wisely.", + "Safe travels, friend.")), + true, + + 3, + NPCInteractions.NPCInteractionType.UNBINDER); + setDisguise("custom:ag_unbinder"); + setCustomDisguiseData("player ag_unbinder setskin {\"id\":\"2bf6acbe-178e-4198-aed8-32428e461ae4\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTYxNTkxMzY0NjM4MSwKICAicHJvZmlsZUlkIiA6ICI5ZDQyNWFiOGFmZjg0MGU1OWM3NzUzZjc5Mjg5YjMyZSIsCiAgInByb2ZpbGVOYW1lIiA6ICJUb21wa2luNDIiLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYjZhZWIwMDZmMmRiMDY1ZjQ5ZmQwMzdjODQ0YWYzMTdmYjllZTI0Y2U2YjM3NWJhYjk2YzgyNTRjN2EwOWRiNiIKICAgIH0KICB9Cn0=\",\"signature\":\"iFzPu0XR6tKMFtW5optWWWPbBpe9zr92BcwDb/4ietoDII8ErHouGKzQuvkbBPDrHm3BVOZHpaMhW6Ks5hPhaHoAGAv3AZHE/h6MwXZU3cJtfqlLVN0EXgQwCh3iHApzd73IZPng1q8/C8YsHDKJB6JHUWQAzj0ohfUoW4jJJiDJ6+h22eUdiZ/mc7nIRUSdgtztAOvAT7i6kcnTq+Bxx6Iw/va3kE7cZmgHkaVKOYpPyxNNNYZE3/4V/gaSljPj3l3Z3hjPGVC1AD2eQK1RRClJKoiAfihj7BLw0mt2EJuTiJ3lWAda8ubjKetfB2AlWR7FLLbSdGh3fpkpVpq/2sis/nW3rRnHo4wZuzv387aIQj7YEpvH0YqB5sF7zF+qSqfp8ibipqbJqzn3F+P0jYivcmwToxFmeTUtON0Os3PI72ckAQumkt4ra6Uz7WMxMJlVg0umPcB0WwEx4JN13qqT34YLcj7IQS/x3gbpH/VxI0oE+jPS79ZhW3SjFcwbawgxA3tRGmqlO40/ImEePcbx8HrWkLHGbi/6KH9hcPSyQk1qm9bcI+TJj0jE2pIZk2Oi2kFbaLzpV5q7FWDpalTLBP12QlsGGkfmlVm7o8ASytULJk0Gqa34r4SYTr9Hx04hOOgUu/70ge1IzwJ5Gq2kqv89Gx+iNyaSaYC2mqQ=\"}],\"legacy\":false}"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/WoodLeagueArenaMasterConfig.java b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/WoodLeagueArenaMasterConfig.java new file mode 100644 index 000000000..266d0fd8e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/npcs/premade/WoodLeagueArenaMasterConfig.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.npcs.premade; + +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import org.bukkit.entity.Villager; + +import java.util.List; + +public class WoodLeagueArenaMasterConfig extends NPCsConfigFields { + public WoodLeagueArenaMasterConfig() { + super("wood_league_arena_master", + true, + "Gladius", + "", + Villager.Profession.ARMORER, + "em_adventurers_guild,240.5,92,270,-108,0", + List.of("Welcome to the\\nArena!"), + List.of("Prepared to face the arena?"), + List.of("Return with your shield, or on it!"), + true, + 3, + NPCInteractions.NPCInteractionType.ARENA_MASTER); + setArenaFilename("wood_league.yml"); + setDisguise("custom:ag_woodleague_master"); + setCustomDisguiseData("player ag_woodleague_master setskin {\"id\":\"76a269fa-65db-4e1a-bd33-a51b390bfd04\",\"name\":\"Unknown\",\"properties\":[{\"name\":\"textures\",\"value\":\"ewogICJ0aW1lc3RhbXAiIDogMTY3ODI5NDYzMDAzNSwKICAicHJvZmlsZUlkIiA6ICIyOGMxMDVkNWRmY2Y0MDYyYTBkYmNmMGJjMzMyMTFmMiIsCiAgInByb2ZpbGVOYW1lIiA6ICJZb3VuZ1N0cml4IiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzc5M2Y0MjllOTIxYWY3YzdlMTlhMjNjNjIxYTU2ZDBjNGZiNDZhYTlhMGQ3ZjZiOGRlYWEyNzgxMTMxZDNjZmMiCiAgICB9CiAgfQp9\",\"signature\":\"b89XDzrLpZAtqC887k0NHAyblnctYLxX9byh2p/W6pXE4/W0rP1qP/y008wms58ec8lgqcZ62J3vKs7VVouJb7PBw3BXSIz20Zs5VrbYRTWhGcorsqOIOl4J7qf2VNXeyJw+p08hi3vnmMS4T4+18/9KiLXWcXE5dKsBxufGTrr5Kthbf7Lo6XSEz1H/PGkSFtJdz63QN/Sb+BnnamLUoaSUyKLK/XsRY2WxqQ+HL/svgGNnY5b4oGewBWznaCmqjzwLsNbOfNMRzi4RMGVdg4Nf3Uct7NWxN1WHIKQwhlT0+3sAwFFaD4Brw72xDZdC8eLDefEt3iYs3MN+kUjFu7FnB8Fz8K71aY/8amdEob2tcMJlBy+962OcYJXvf/GX9yr3wY/e3FN/Y2Act3UdUNK+CY0I4m/0ntEx/wcy/tkFP8ygxB/PTUrgQDQf/1FGo8LdpcZ/lSCmbtr0pSpZacpMSMhwDlYOCCHBWYNgmaZu5m/vWRMLsRxKG7DRRFjRe4Vz/djCVUqQEbVt/UxHFQ+69DYzGtXC7fXnkb4zMFWGhAYKPRjIdVqWzJ29oy5CVoc7vNEVVxvWiIABwtdsgEsP6TR7S2wH9h8iPOVwe3mtJR58XOH0TAc9Ey9GIv+2s6cofOCZ4dA6kER57TPGmRlhGNR1YxFOnoutj0QZrCA=\"}],\"legacy\":false}"); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/PotionEffectsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/PotionEffectsConfig.java new file mode 100644 index 000000000..a16b6db8d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/PotionEffectsConfig.java @@ -0,0 +1,86 @@ +package com.magmaguy.elitemobs.config.potioneffects; + +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.potioneffects.premade.*; +import org.bukkit.configuration.file.FileConfiguration; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; + +public class PotionEffectsConfig { + + private static final HashMap potionEffects = new HashMap(); + private static final List potionEffectsConfigFields = new ArrayList<>(new ArrayList<>(List.of( + new AbsorptionConfig(), + new BlindnessConfig(), + new ConduitPowerConfig(), + new NauseaConfig(), + new ResistanceConfig(), + new DolphinsGraceConfig(), + new HasteConfig(), + new FireResistanceConfig(), + new GlowingConfig(), + new InstantDamageConfig(), + new InstantHealthConfig(), + new HealthBoostConfig(), + new HungerConfig(), + new StrengthConfig(), + new InvisibilityConfig(), + new JumpBoostConfig(), + new LevitationConfig(), + new LuckConfig(), + new NightVisionConfig(), + new PoisonConfig(), + new RegenerationConfig(), + new SaturationConfig(), + new SlownessConfig(), + new MiningFatigueConfig(), + new SlowFallingConfig(), + new SpeedConfig(), + new UnluckConfig(), + new WaterBreathingConfig(), + new WeaknessConfig(), + new WitherConfig(), + new DarknessConfig(), + new InfestedConfig(), + new OozingConfig(), + new RaidOmenConfig(), + new TrialOmenConfig(), + new WeavingConfig(), + new WindChargedConfig() + ))); + + public static void addPotionEffect(String fileName, PotionEffectsConfigFields powersConfigFields) { + potionEffects.put(fileName, powersConfigFields); + } + + public static PotionEffectsConfigFields getPotionEffect(String fileName) { + fileName = fileName.toLowerCase(Locale.ROOT); + if (!fileName.contains(".yml")) + fileName += ".yml"; + return potionEffects.get(fileName); + } + + public static void initializeConfigs() { + for (PotionEffectsConfigFields powersConfigFields : potionEffectsConfigFields) + initializeConfiguration(powersConfigFields); + } + + /** + * Initializes a single instance of a premade configuration using the default values. + */ + private static FileConfiguration initializeConfiguration(PotionEffectsConfigFields potionEffectsConfigFields) { + + File file = ConfigurationEngine.fileCreator("potionEffects", potionEffectsConfigFields.getFileName()); + FileConfiguration fileConfiguration = ConfigurationEngine.fileConfigurationCreator(file); + potionEffectsConfigFields.generateConfigDefaults(fileConfiguration); + ConfigurationEngine.fileSaverOnlyDefaults(fileConfiguration, file); + addPotionEffect(file.getName(), new PotionEffectsConfigFields(fileConfiguration, file)); + return fileConfiguration; + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/PotionEffectsConfigFields.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/PotionEffectsConfigFields.java new file mode 100644 index 000000000..650891df0 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/PotionEffectsConfigFields.java @@ -0,0 +1,85 @@ +package com.magmaguy.elitemobs.config.potioneffects; + +import com.magmaguy.elitemobs.config.translations.TranslationsConfig; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.potion.PotionEffectType; + +import java.io.File; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +public class PotionEffectsConfigFields { + + private final String fileName; + private final boolean isEnabled; + private final String name; + private final int onHitDuration; + private final double value; + private final HashMap additionalConfigOptions = new HashMap<>(); + private PotionEffectType potionEffectType; + private FileConfiguration configuration; + + public PotionEffectsConfigFields(String fileName, + boolean isEnabled, + String name, + int onHitDuration, + double value) { + this.fileName = fileName + ".yml"; + this.isEnabled = isEnabled; + this.name = name; + this.onHitDuration = onHitDuration; + this.value = value; + } + + public PotionEffectsConfigFields(FileConfiguration fileConfiguration, File file) { + this.fileName = file.getName(); + this.isEnabled = fileConfiguration.getBoolean("isEnabled"); + this.name = TranslationsConfig.add(fileName, "name", fileConfiguration.getString("name")); + this.onHitDuration = fileConfiguration.getInt("onHitDuration"); + this.value = fileConfiguration.getDouble("value"); + this.potionEffectType = PotionEffectType.getByName(this.fileName.toUpperCase(Locale.ROOT)); + this.configuration = fileConfiguration; + } + + public void generateConfigDefaults(FileConfiguration fileConfiguration) { + fileConfiguration.addDefault("isEnabled", isEnabled); + fileConfiguration.addDefault("name", name); + fileConfiguration.addDefault("onHitDuration", onHitDuration); + fileConfiguration.addDefault("value", value); + if (!additionalConfigOptions.isEmpty()) + fileConfiguration.addDefaults(additionalConfigOptions); + } + + public String getFileName() { + return fileName; + } + + public boolean isEnabled() { + return isEnabled; + } + + public String getName() { + return name; + } + + public PotionEffectType getPotionEffectType() { + return potionEffectType; + } + + public Map getAdditionalConfigOptions() { + return additionalConfigOptions; + } + + public FileConfiguration getConfiguration() { + return configuration; + } + + public double getValue() { + return value; + } + + public int getOnHitDuration() { + return onHitDuration; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/AbsorptionConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/AbsorptionConfig.java new file mode 100644 index 000000000..804a2c2ad --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/AbsorptionConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class AbsorptionConfig extends PotionEffectsConfigFields { + public AbsorptionConfig() { + super("absorption", + true, + "Absorption", + 2, + 100); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/BlindnessConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/BlindnessConfig.java new file mode 100644 index 000000000..8726ef592 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/BlindnessConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class BlindnessConfig extends PotionEffectsConfigFields { + public BlindnessConfig() { + super("blindness", + true, + "Blindness", + 5, + 50); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/ConduitPowerConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/ConduitPowerConfig.java new file mode 100644 index 000000000..472d7176f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/ConduitPowerConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class ConduitPowerConfig extends PotionEffectsConfigFields { + public ConduitPowerConfig() { + super("conduit_power", + true, + "Conduit Power", + 30, + 100); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/DarknessConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/DarknessConfig.java new file mode 100644 index 000000000..9cb0b2c27 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/DarknessConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class DarknessConfig extends PotionEffectsConfigFields { + public DarknessConfig() { + super("darkness", + true, + "Darkness", + 5, + 50); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/DolphinsGraceConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/DolphinsGraceConfig.java new file mode 100644 index 000000000..8d64e3efd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/DolphinsGraceConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class DolphinsGraceConfig extends PotionEffectsConfigFields { + public DolphinsGraceConfig() { + super("dolphins_grace", + true, + "Dolphin's Grace", + 30, + 100); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/FireResistanceConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/FireResistanceConfig.java new file mode 100644 index 000000000..d29a4f58c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/FireResistanceConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class FireResistanceConfig extends PotionEffectsConfigFields { + public FireResistanceConfig() { + super("fire_resistance", + true, + "Fire Resistance", + 15, + 50); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/GlowingConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/GlowingConfig.java new file mode 100644 index 000000000..99380b613 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/GlowingConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class GlowingConfig extends PotionEffectsConfigFields { + public GlowingConfig() { + super("glowing", + true, + "Glowing", + 60, + 10); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/HasteConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/HasteConfig.java new file mode 100644 index 000000000..a866f27b7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/HasteConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class HasteConfig extends PotionEffectsConfigFields { + public HasteConfig() { + super("haste", + true, + "Haste", + 30, + 100); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/HealthBoostConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/HealthBoostConfig.java new file mode 100644 index 000000000..4755e0789 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/HealthBoostConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class HealthBoostConfig extends PotionEffectsConfigFields { + public HealthBoostConfig() { + super("health_boost", + true, + "Health Boost", + 90, + 100); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/HungerConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/HungerConfig.java new file mode 100644 index 000000000..53339d68c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/HungerConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class HungerConfig extends PotionEffectsConfigFields { + public HungerConfig() { + super("hunger", + true, + "Hunger", + 30, + 10); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/InfestedConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/InfestedConfig.java new file mode 100644 index 000000000..82295efb2 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/InfestedConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class InfestedConfig extends PotionEffectsConfigFields { + public InfestedConfig() { + super("infested", + true, + "Infested", + 3 * 60 * 20, + 10); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/InstantDamageConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/InstantDamageConfig.java new file mode 100644 index 000000000..34d59bc51 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/InstantDamageConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class InstantDamageConfig extends PotionEffectsConfigFields { + public InstantDamageConfig() { + super("instant_damage", + true, + "Instant Damage", + 1, + 100); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/InstantHealthConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/InstantHealthConfig.java new file mode 100644 index 000000000..d204c0f52 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/InstantHealthConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class InstantHealthConfig extends PotionEffectsConfigFields { + public InstantHealthConfig() { + super("instant_health", + true, + "Instant Health", + 1, + 100); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/InvisibilityConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/InvisibilityConfig.java new file mode 100644 index 000000000..4f1918abd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/InvisibilityConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class InvisibilityConfig extends PotionEffectsConfigFields { + public InvisibilityConfig() { + super("invisibility", + true, + "Invisibility", + 3, + 50); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/JumpBoostConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/JumpBoostConfig.java new file mode 100644 index 000000000..f76eb9174 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/JumpBoostConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class JumpBoostConfig extends PotionEffectsConfigFields { + public JumpBoostConfig() { + super("jump_boost", + true, + "Jump Boost", + 10, + 50); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/LevitationConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/LevitationConfig.java new file mode 100644 index 000000000..de9e2c5ca --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/LevitationConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class LevitationConfig extends PotionEffectsConfigFields { + public LevitationConfig() { + super("levitation", + true, + "Levitation", + 5, + 50); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/LuckConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/LuckConfig.java new file mode 100644 index 000000000..3c08f7b16 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/LuckConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class LuckConfig extends PotionEffectsConfigFields { + public LuckConfig() { + super("luck", + true, + "Luck", + 30, + 50); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/MiningFatigueConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/MiningFatigueConfig.java new file mode 100644 index 000000000..0736a8f7e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/MiningFatigueConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class MiningFatigueConfig extends PotionEffectsConfigFields { + public MiningFatigueConfig() { + super("mining_fatigue", + true, + "Mining Fatigue", + 10, + 10); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/NauseaConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/NauseaConfig.java new file mode 100644 index 000000000..63da227dd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/NauseaConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class NauseaConfig extends PotionEffectsConfigFields { + public NauseaConfig() { + super("nausea", + true, + "Nausea", + 10, + 50); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/NightVisionConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/NightVisionConfig.java new file mode 100644 index 000000000..dfdd8dafd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/NightVisionConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class NightVisionConfig extends PotionEffectsConfigFields { + public NightVisionConfig() { + super("night_vision", + true, + "Night Vision", + 30, + 50); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/OozingConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/OozingConfig.java new file mode 100644 index 000000000..7a14c18e9 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/OozingConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class OozingConfig extends PotionEffectsConfigFields { + public OozingConfig() { + super("oozing", + true, + "Oozing", + 3 * 60 * 20, + 10); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/PoisonConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/PoisonConfig.java new file mode 100644 index 000000000..de91f0662 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/PoisonConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class PoisonConfig extends PotionEffectsConfigFields { + public PoisonConfig() { + super("poison", + true, + "Poison", + 20, + 50); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/RaidOmenConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/RaidOmenConfig.java new file mode 100644 index 000000000..2c595b3aa --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/RaidOmenConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class RaidOmenConfig extends PotionEffectsConfigFields { + public RaidOmenConfig() { + super("raid_omen", + true, + "Raid Omen", + 20 * 30, + 10); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/RegenerationConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/RegenerationConfig.java new file mode 100644 index 000000000..de38e7383 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/RegenerationConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class RegenerationConfig extends PotionEffectsConfigFields { + public RegenerationConfig() { + super("regeneration", + true, + "Regeneration", + 20, + 100); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/ResistanceConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/ResistanceConfig.java new file mode 100644 index 000000000..13c203e1e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/ResistanceConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class ResistanceConfig extends PotionEffectsConfigFields { + public ResistanceConfig() { + super("resistance", + true, + "Resistance", + 30, + 100); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/SaturationConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/SaturationConfig.java new file mode 100644 index 000000000..66e7bb5ba --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/SaturationConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class SaturationConfig extends PotionEffectsConfigFields { + public SaturationConfig() { + super("saturation", + true, + "Saturation", + 20, + 100); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/SlowFallingConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/SlowFallingConfig.java new file mode 100644 index 000000000..b90473552 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/SlowFallingConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class SlowFallingConfig extends PotionEffectsConfigFields { + public SlowFallingConfig() { + super("slow_falling", + true, + "Slow Falling", + 30, + 50); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/SlownessConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/SlownessConfig.java new file mode 100644 index 000000000..8f18ec095 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/SlownessConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class SlownessConfig extends PotionEffectsConfigFields { + public SlownessConfig() { + super("slowness", + true, + "Slowness", + 15, + 50); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/SpeedConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/SpeedConfig.java new file mode 100644 index 000000000..271b40dcb --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/SpeedConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class SpeedConfig extends PotionEffectsConfigFields { + public SpeedConfig() { + super("speed", + true, + "Speed", + 30, + 50); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/StrengthConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/StrengthConfig.java new file mode 100644 index 000000000..3d24d2fbb --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/StrengthConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class StrengthConfig extends PotionEffectsConfigFields { + public StrengthConfig() { + super("strength", + true, + "Strength", + 30, + 100); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/TrialOmenConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/TrialOmenConfig.java new file mode 100644 index 000000000..d9639e945 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/TrialOmenConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class TrialOmenConfig extends PotionEffectsConfigFields { + public TrialOmenConfig() { + super("trial_omen", + true, + "Trial Omen", + 60 * 20 * 15, + 10); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/UnluckConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/UnluckConfig.java new file mode 100644 index 000000000..7859e5080 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/UnluckConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class UnluckConfig extends PotionEffectsConfigFields { + public UnluckConfig() { + super("unluck", + true, + "Bad Luck", + 30, + 10); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/WaterBreathingConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/WaterBreathingConfig.java new file mode 100644 index 000000000..d5bec53ab --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/WaterBreathingConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class WaterBreathingConfig extends PotionEffectsConfigFields { + public WaterBreathingConfig() { + super("water_breathing", + true, + "Water Breathing", + 30, + 50); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/WeaknessConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/WeaknessConfig.java new file mode 100644 index 000000000..1033e94e6 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/WeaknessConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class WeaknessConfig extends PotionEffectsConfigFields { + public WeaknessConfig() { + super("weakness", + true, + "Weakness", + 15, + 50); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/WeavingConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/WeavingConfig.java new file mode 100644 index 000000000..2a01de3dc --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/WeavingConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class WeavingConfig extends PotionEffectsConfigFields { + public WeavingConfig() { + super("weaving", + true, + "Weaving", + 3 * 60 * 20, + 10); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/WindChargedConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/WindChargedConfig.java new file mode 100644 index 000000000..9feb9c40d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/WindChargedConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class WindChargedConfig extends PotionEffectsConfigFields { + public WindChargedConfig() { + super("wind_charged", + true, + "Wind Charged", + 3 * 60 * 20, + 10); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/WitherConfig.java b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/WitherConfig.java new file mode 100644 index 000000000..96a388909 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/potioneffects/premade/WitherConfig.java @@ -0,0 +1,13 @@ +package com.magmaguy.elitemobs.config.potioneffects.premade; + +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfigFields; + +public class WitherConfig extends PotionEffectsConfigFields { + public WitherConfig() { + super("wither", + true, + "Wither", + 15, + 100); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/PowersConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/PowersConfig.java new file mode 100644 index 000000000..d7b170c4c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/PowersConfig.java @@ -0,0 +1,33 @@ +package com.magmaguy.elitemobs.config.powers; + +import com.magmaguy.elitemobs.powers.meta.ElitePower; +import com.magmaguy.magmacore.config.CustomConfig; + +import java.util.HashMap; +import java.util.Map; + +public class PowersConfig extends CustomConfig { + + private static Map powers = new HashMap<>(); + + public PowersConfig() { + super("powers", "com.magmaguy.elitemobs.config.powers.premade", PowersConfigFields.class); + powers = new HashMap<>(); + for (String key : super.getCustomConfigFieldsHashMap().keySet()) { + PowersConfigFields powersConfigFields = (PowersConfigFields) super.getCustomConfigFieldsHashMap().get(key); + powers.put(key, powersConfigFields); + powersConfigFields.initializeScripts(); + } + + ElitePower.initializePowers(); + } + + public static Map getPowers() { + return powers; + } + + public static PowersConfigFields getPower(String filename) { + return powers.get(filename); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/PowersConfigFields.java b/src/main/java/com/magmaguy/elitemobs/config/powers/PowersConfigFields.java new file mode 100644 index 000000000..1ae1358df --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/PowersConfigFields.java @@ -0,0 +1,151 @@ +package com.magmaguy.elitemobs.config.powers; + +import com.magmaguy.elitemobs.config.CustomConfigFields; +import com.magmaguy.elitemobs.powers.meta.ElitePower; +import com.magmaguy.elitemobs.powers.scripts.caching.EliteScriptBlueprint; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.configuration.ConfigurationSection; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class PowersConfigFields extends CustomConfigFields { + + @Getter + @Setter + private String effect; + @Getter + @Setter + private int powerCooldown = 0; + @Getter + @Setter + private int globalCooldown = 0; + @Getter + @Setter + private ConfigurationSection scripts = null; + @Getter + @Setter + private Map rawScripts = new HashMap<>(); + @Getter + @Setter + private List eliteScriptBlueprints = new ArrayList<>(); + @Getter + private Class elitePowerClass = null; + + @Getter + private PowerType powerType; + + /** + * Constructor for hardcoded powers + * + * @param fileName Filename of the power + * @param isEnabled If the power is enabled + * @param material Material of the trail + * @param elitePowerClass Class of the hardcoded power + */ + public PowersConfigFields(String fileName, + boolean isEnabled, + String material, + Class elitePowerClass, + PowerType powerType) { + super(fileName, isEnabled); + this.effect = material; + this.elitePowerClass = elitePowerClass; + this.powerType = powerType; + } + + /** + * Constructor for script-based powers + * + * @param fileName Filename of the power + * @param isEnabled If the power is enabled + * @param material Material of the power + * @param rawScripts Script of the power + */ + public PowersConfigFields(String fileName, + boolean isEnabled, + String material, + Map rawScripts, + PowerType powerType) { + super(fileName, isEnabled); + this.effect = material; + this.rawScripts = rawScripts; + this.powerType = powerType; + } + + public PowersConfigFields(String fileName, + boolean isEnabled, + String material, + int powerCooldown, + int globalCooldown, + Class elitePowerClass, + PowerType powerType) { + super(fileName, isEnabled); + this.effect = material; + this.powerCooldown = powerCooldown; + this.globalCooldown = globalCooldown; + this.elitePowerClass = elitePowerClass; + this.powerType = powerType; + } + + + public PowersConfigFields(String fileName, + boolean isEnabled) { + super(fileName, isEnabled); + } + + protected static Map addScriptEntry(String scriptName, + List events, + List conditions, + List> actions, + Map cooldowns) { + Map defaults = new HashMap<>(); + defaults.put("eliteScript" + "." + scriptName + "." + "Events", events); + defaults.put("eliteScript" + "." + scriptName + "." + "Conditions", conditions); + defaults.put("eliteScript" + "." + scriptName + "." + "Actions", actions); + defaults.put("eliteScript" + "." + scriptName + "." + "Cooldowns", cooldowns); + return defaults; + } + + @Override + public void processConfigFields() { + this.isEnabled = processBoolean("isEnabled", isEnabled, true, true); + this.effect = processString("effect", effect, null, false); + this.powerCooldown = processInt("powerCooldown", powerCooldown, 0, false); + this.globalCooldown = processInt("globalCooldown", globalCooldown, 0, false); + this.rawScripts = processMap("eliteScript", rawScripts); + this.scripts = processConfigurationSection("eliteScript", rawScripts); + this.powerType = processEnum("powerType", powerType, null, PowerType.class, false); + + processAdditionalFields(); + } + + public void initializeScripts() { + try { + if (scripts != null) eliteScriptBlueprints = EliteScriptBlueprint.parseBossScripts(scripts, this); + } catch (Exception exception) { + Logger.warn("You have a script with invalid data! Script in " + filename + " is not valid."); + exception.printStackTrace(); + } + } + + public void processAdditionalFields() { + } + + public enum PowerType { + OFFENSIVE, + DEFENSIVE, + MISCELLANEOUS, + MAJOR_ZOMBIE, + MAJOR_SKELETON, + MAJOR_BLAZE, + MAJOR_ENDERMAN, + MAJOR_GHAST, + UNIQUE + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ArrowFireworksConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ArrowFireworksConfig.java new file mode 100644 index 000000000..fc6638437 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ArrowFireworksConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.ArrowFireworks; +import org.bukkit.Material; + +public class ArrowFireworksConfig extends PowersConfigFields { + public ArrowFireworksConfig() { + super("arrow_fireworks", + true, + Material.FIREWORK_ROCKET.toString(), + ArrowFireworks.class, + PowerType.OFFENSIVE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ArrowRainConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ArrowRainConfig.java new file mode 100644 index 000000000..9907c4901 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ArrowRainConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.ArrowRain; +import org.bukkit.Particle; + +public class ArrowRainConfig extends PowersConfigFields { + public ArrowRainConfig() { + super("arrow_rain", + true, + Particle.DRIPPING_WATER.toString(), + ArrowRain.class, + PowerType.OFFENSIVE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackArrowConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackArrowConfig.java new file mode 100644 index 000000000..a041a00a0 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackArrowConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.AttackArrow; +import org.bukkit.Material; + +public class AttackArrowConfig extends PowersConfigFields { + public AttackArrowConfig() { + super("attack_arrow", + true, + Material.DISPENSER.toString(), + AttackArrow.class, + PowerType.OFFENSIVE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackBlindingConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackBlindingConfig.java new file mode 100644 index 000000000..5d5a63fc0 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackBlindingConfig.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import org.bukkit.Particle; + +import java.util.List; +import java.util.Map; + +public class AttackBlindingConfig extends PowersConfigFields { + public AttackBlindingConfig() { + super("attack_blinding", + true, + Particle.WITCH.toString(), + addScriptEntry("BlindPlayer", + List.of("PlayerDamagedByEliteMobEvent"), + null, + List.of(Map.of( + "action", "POTION_EFFECT", + "duration", 60, + "target", "DIRECT_TARGET", + "amplifier", 0, + "potionEffectType", "blindness" + )), + null), + PowerType.MISCELLANEOUS); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackConfusingConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackConfusingConfig.java new file mode 100644 index 000000000..4c120f901 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackConfusingConfig.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import org.bukkit.Particle; + +import java.util.List; +import java.util.Map; + +public class AttackConfusingConfig extends PowersConfigFields { + public AttackConfusingConfig() { + super("attack_confusing", + true, + Particle.WITCH.toString(), + addScriptEntry("ConfusePlayer", + List.of("PlayerDamagedByEliteMobEvent"), + null, + List.of(Map.of( + "action", "POTION_EFFECT", + "duration", 60, + "target", "DIRECT_TARGET", + "amplifier", 0, + "potionEffectType", "nausea" + )), + null), + PowerType.MISCELLANEOUS); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackFireConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackFireConfig.java new file mode 100644 index 000000000..4b069a260 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackFireConfig.java @@ -0,0 +1,25 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import org.bukkit.Material; + +import java.util.List; +import java.util.Map; + +public class AttackFireConfig extends PowersConfigFields { + public AttackFireConfig() { + super("attack_fire", + true, + Material.BLAZE_POWDER.toString(), + addScriptEntry("SetOnFire", + List.of("PlayerDamagedByEliteMobEvent"), + null, + List.of(Map.of( + "action", "SET_ON_FIRE", + "duration", 60, + "target", "DIRECT_TARGET")), + null), + PowerType.OFFENSIVE); + + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackFireballConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackFireballConfig.java new file mode 100644 index 000000000..673bffa50 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackFireballConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.AttackFireball; +import org.bukkit.Material; + +public class AttackFireballConfig extends PowersConfigFields { + public AttackFireballConfig() { + super("attack_fireball", + true, + Material.FIRE_CHARGE.toString(), + AttackFireball.class, + PowerType.OFFENSIVE); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackFreezeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackFreezeConfig.java new file mode 100644 index 000000000..9506be9c5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackFreezeConfig.java @@ -0,0 +1,39 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import org.bukkit.Material; + +import java.util.List; +import java.util.Map; + +public class AttackFreezeConfig extends PowersConfigFields { + + public AttackFreezeConfig() { + super("attack_freeze", + true, + Material.PACKED_ICE.toString(), + addScriptEntry("FreezePlayer", + List.of("PlayerDamagedByEliteMobEvent"), + null, + List.of(Map.of( + "action", "POTION_EFFECT", + "duration", 60, + "target", "DIRECT_TARGET", + "amplifier", 5, + "potionEffectType", "slowness"), + Map.of( + "action", "PLACE_BLOCK", + "target", "DIRECT_TARGET", + "duration", 60, + "material", "PACKED_ICE", + "conditions", Map.of("locationIsAir", true)), + Map.of( + "action", "VISUAL_FREEZE", + "target", "DIRECT_TARGET", + "repeatEvery", 1, + "times", 60)), + Map.of("local", 300, + "global", 60)), + PowerType.OFFENSIVE); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackGravityConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackGravityConfig.java new file mode 100644 index 000000000..c85692ae4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackGravityConfig.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import org.bukkit.Material; + +import java.util.List; +import java.util.Map; + +public class AttackGravityConfig extends PowersConfigFields { + public AttackGravityConfig() { + super("attack_gravity", + true, + Material.ELYTRA.toString(), + addScriptEntry("LevitatePlayer", + List.of("PlayerDamagedByEliteMobEvent"), + null, + List.of(Map.of( + "action", "POTION_EFFECT", + "duration", 60, + "target", "DIRECT_TARGET", + "amplifier", 0, + "potionEffectType", "levitation" + )), + null), + PowerType.OFFENSIVE); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackLightningConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackLightningConfig.java new file mode 100644 index 000000000..37f051511 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackLightningConfig.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.AttackLightning; +import org.bukkit.Material; + +public class AttackLightningConfig extends PowersConfigFields { + public static int delayBetweenStrikes; + + public AttackLightningConfig() { + super("attack_lightning", + true, + Material.HORN_CORAL.toString(), + AttackLightning.class, + PowerType.OFFENSIVE); + } + + @Override + public void processAdditionalFields() { + delayBetweenStrikes = ConfigurationEngine.setInt(fileConfiguration, "delayBetweenStrikes", 15); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackPoisonConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackPoisonConfig.java new file mode 100644 index 000000000..9cad0305d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackPoisonConfig.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import org.bukkit.Material; + +import java.util.List; +import java.util.Map; + +public class AttackPoisonConfig extends PowersConfigFields { + public AttackPoisonConfig() { + super("attack_poison", + true, + Material.EMERALD.toString(), + addScriptEntry("PoisonPlayer", + List.of("PlayerDamagedByEliteMobEvent"), + null, + List.of(Map.of( + "action", "POTION_EFFECT", + "duration", 60, + "target", "DIRECT_TARGET", + "amplifier", 0, + "potionEffectType", "poison" + )), + null), + PowerType.OFFENSIVE); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackPushConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackPushConfig.java new file mode 100644 index 000000000..02ea65e14 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackPushConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.AttackPush; +import org.bukkit.Material; + +public class AttackPushConfig extends PowersConfigFields { + public AttackPushConfig() { + super("attack_push", + true, + Material.PISTON.toString(), + AttackPush.class, + PowerType.OFFENSIVE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackVacuumConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackVacuumConfig.java new file mode 100644 index 000000000..4c5d6d011 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackVacuumConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.AttackVacuum; +import org.bukkit.Material; + +public class AttackVacuumConfig extends PowersConfigFields { + public AttackVacuumConfig() { + super("attack_vacuum", + true, + Material.LEAD.toString(), + AttackVacuum.class, + PowerType.OFFENSIVE); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackWeaknessConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackWeaknessConfig.java new file mode 100644 index 000000000..5ed497330 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackWeaknessConfig.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import org.bukkit.Material; + +import java.util.List; +import java.util.Map; + +public class AttackWeaknessConfig extends PowersConfigFields { + public AttackWeaknessConfig() { + super("attack_weakness", + true, + Material.TOTEM_OF_UNDYING.toString(), + addScriptEntry("WeakenPlayer", + List.of("PlayerDamagedByEliteMobEvent"), + null, + List.of(Map.of( + "action", "POTION_EFFECT", + "duration", 60, + "target", "DIRECT_TARGET", + "amplifier", 0, + "potionEffectType", "weakness" + )), + null), + PowerType.MISCELLANEOUS); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackWebConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackWebConfig.java new file mode 100644 index 000000000..275b0582b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackWebConfig.java @@ -0,0 +1,28 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import org.bukkit.Material; + +import java.util.List; +import java.util.Map; + +public class AttackWebConfig extends PowersConfigFields { + public AttackWebConfig() { + super("attack_web", + true, + Material.COBWEB.toString(), + addScriptEntry("WebPlayer", + List.of("PlayerDamagedByEliteMobEvent"), + null, + List.of(Map.of( + "action", "PLACE_BLOCK", + "target", "DIRECT_TARGET", + "duration", 120, + "material", "COBWEB", + "conditions", Map.of("locationIsAir", true) + )), + Map.of("local", 60, + "global", 20)), + PowerType.MISCELLANEOUS); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackWitherConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackWitherConfig.java new file mode 100644 index 000000000..539491da1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/AttackWitherConfig.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import org.bukkit.Material; + +import java.util.List; +import java.util.Map; + +public class AttackWitherConfig extends PowersConfigFields { + public AttackWitherConfig() { + super("attack_wither", + true, + Material.WITHER_SKELETON_SKULL.toString(), + addScriptEntry("WitherPlayer", + List.of("PlayerDamagedByEliteMobEvent"), + null, + List.of(Map.of( + "action", "POTION_EFFECT", + "duration", 60, + "target", "DIRECT_TARGET", + "amplifier", 0, + "potionEffectType", "wither" + )), + null), + PowerType.OFFENSIVE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/BonusCoinsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/BonusCoinsConfig.java new file mode 100644 index 000000000..aac08a98d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/BonusCoinsConfig.java @@ -0,0 +1,14 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.BonusCoins; + +public class BonusCoinsConfig extends PowersConfigFields { + public BonusCoinsConfig() { + super("bonus_coins", + true, + null, + BonusCoins.class, + PowerType.MISCELLANEOUS); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/BonusLootConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/BonusLootConfig.java new file mode 100644 index 000000000..bfa0d843c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/BonusLootConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.BonusLoot; +import org.bukkit.Material; + +public class BonusLootConfig extends PowersConfigFields { + public BonusLootConfig() { + super("bonus_loot", + true, + Material.CHEST.toString(), + BonusLoot.class, + PowerType.MISCELLANEOUS); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/BulletHellConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/BulletHellConfig.java new file mode 100644 index 000000000..c0522b91b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/BulletHellConfig.java @@ -0,0 +1,14 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.BulletHell; + +public class BulletHellConfig extends PowersConfigFields { + public BulletHellConfig() { + super("bullet_hell", + true, + null, + BulletHell.class, + PowerType.MAJOR_SKELETON); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ChannelHealingConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ChannelHealingConfig.java new file mode 100644 index 000000000..221405375 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ChannelHealingConfig.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.ChannelHealing; + +public class ChannelHealingConfig extends PowersConfigFields { + public ChannelHealingConfig() { + super("channel_healing", + true, + null, + 1, + 0, + ChannelHealing.class, + PowerType.MISCELLANEOUS); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/CorpseConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/CorpseConfig.java new file mode 100644 index 000000000..ec86d814d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/CorpseConfig.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import org.bukkit.Material; + +import java.util.List; +import java.util.Map; + +public class CorpseConfig extends PowersConfigFields { + public CorpseConfig() { + super("corpse", + true, + Material.BONE_BLOCK.toString(), + addScriptEntry("SpawnBoneBlock", + List.of("EliteMobDeathEvent"), + null, + List.of(Map.of( + "action", "PLACE_BLOCK", + "target", "SELF", + "duration", 2400, + "material", "BONE_BLOCK", + "conditions", Map.of("locationIsAir", true))), + null), + PowerType.MISCELLANEOUS); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/CustomSummonPowerConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/CustomSummonPowerConfig.java new file mode 100644 index 000000000..82a1503c1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/CustomSummonPowerConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.meta.CustomSummonPower; +import org.bukkit.Material; + +public class CustomSummonPowerConfig extends PowersConfigFields { + public CustomSummonPowerConfig() { + super("custom_summon", + true, + Material.AIR.toString(), + CustomSummonPower.class, + PowerType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/DeathSliceConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/DeathSliceConfig.java new file mode 100644 index 000000000..d4d5a4503 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/DeathSliceConfig.java @@ -0,0 +1,14 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.DeathSlice; + +public class DeathSliceConfig extends PowersConfigFields { + public DeathSliceConfig() { + super("death_slice", + true, + null, + DeathSlice.class, + PowerType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EliteScriptPowerConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EliteScriptPowerConfig.java new file mode 100644 index 000000000..e18383867 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EliteScriptPowerConfig.java @@ -0,0 +1,10 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.scripts.EliteScript; + +public class EliteScriptPowerConfig extends PowersConfigFields { + public EliteScriptPowerConfig() { + super("elite_script", true, null, EliteScript.class, PowerType.UNIQUE); + }//todo probably delete +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonAimedFireballConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonAimedFireballConfig.java new file mode 100644 index 000000000..462806836 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonAimedFireballConfig.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.EnderDragonAimedFireball; + +public class EnderDragonAimedFireballConfig extends PowersConfigFields { + public EnderDragonAimedFireballConfig() { + super("ender_dragon_aimed_fireball", + true, + null, + 30, + 5, + EnderDragonAimedFireball.class, + PowerType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonArrowBombardmentConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonArrowBombardmentConfig.java new file mode 100644 index 000000000..9eaf1bf0f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonArrowBombardmentConfig.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.EnderDragonArrowBombardment; + +public class EnderDragonArrowBombardmentConfig extends PowersConfigFields { + public EnderDragonArrowBombardmentConfig() { + super("ender_dragon_arrow_bombardment", + true, + null, + 30, + 5, + EnderDragonArrowBombardment.class, + PowerType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonDiscoFireballsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonDiscoFireballsConfig.java new file mode 100644 index 000000000..c86740b79 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonDiscoFireballsConfig.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.EnderDragonDiscoFireballs; + +public class EnderDragonDiscoFireballsConfig extends PowersConfigFields { + public EnderDragonDiscoFireballsConfig() { + super("ender_dragon_disco_fireballs", + true, + null, + 120, + 30, + EnderDragonDiscoFireballs.class, + PowerType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonEmpoweredLightningConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonEmpoweredLightningConfig.java new file mode 100644 index 000000000..3f8e37a85 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonEmpoweredLightningConfig.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.EnderDragonEmpoweredLightning; + +public class EnderDragonEmpoweredLightningConfig extends PowersConfigFields { + public EnderDragonEmpoweredLightningConfig() { + super("ender_dragon_empowered_lightning", + true, + null, + 120, + 30, + EnderDragonEmpoweredLightning.class, + PowerType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonEnderFireballBombardmentConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonEnderFireballBombardmentConfig.java new file mode 100644 index 000000000..6330adb8e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonEnderFireballBombardmentConfig.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.EnderDragonEnderFireballBombardment; + +public class EnderDragonEnderFireballBombardmentConfig extends PowersConfigFields { + public EnderDragonEnderFireballBombardmentConfig() { + super("ender_dragon_ender_fireball_bombardment", + true, + null, + 30, + 5, + EnderDragonEnderFireballBombardment.class, + PowerType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonEndermiteBombardmentConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonEndermiteBombardmentConfig.java new file mode 100644 index 000000000..ad81fbb30 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonEndermiteBombardmentConfig.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.EnderDragonEndermiteBombardment; + +public class EnderDragonEndermiteBombardmentConfig extends PowersConfigFields { + public EnderDragonEndermiteBombardmentConfig() { + super("ender_dragon_endermite_bombardment", + true, + null, + 120, + 30, + EnderDragonEndermiteBombardment.class, + PowerType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonFireballBombardment.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonFireballBombardment.java new file mode 100644 index 000000000..7018ff5ec --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonFireballBombardment.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.EnderDragonEnderFireballBombardment; + +public class EnderDragonFireballBombardment extends PowersConfigFields { + public EnderDragonFireballBombardment() { + super("ender_dragon_fireball_bombardment", + true, + null, + 30, + 5, + EnderDragonEnderFireballBombardment.class, + PowerType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonPotionBombardmentConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonPotionBombardmentConfig.java new file mode 100644 index 000000000..c8c23ba7b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonPotionBombardmentConfig.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.EnderDragonPotionBombardment; + +public class EnderDragonPotionBombardmentConfig extends PowersConfigFields { + public EnderDragonPotionBombardmentConfig() { + super("ender_dragon_potion_bombardment", + true, + null, + 30, + 5, + EnderDragonPotionBombardment.class, + PowerType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonShockwaveConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonShockwaveConfig.java new file mode 100644 index 000000000..a90d291f5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonShockwaveConfig.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.EnderDragonShockwave; + +public class EnderDragonShockwaveConfig extends PowersConfigFields { + public EnderDragonShockwaveConfig() { + super("ender_dragon_shockwave", + true, + null, + 60, + 30, + EnderDragonShockwave.class, + PowerType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonTornadoConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonTornadoConfig.java new file mode 100644 index 000000000..8580ff3dd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/EnderDragonTornadoConfig.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.EnderDragonTornado; + +public class EnderDragonTornadoConfig extends PowersConfigFields { + public EnderDragonTornadoConfig() { + super("ender_dragon_tornado", + true, + null, + 60, + 30, + EnderDragonTornado.class, + PowerType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/FirestormConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/FirestormConfig.java new file mode 100644 index 000000000..549f2b0d8 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/FirestormConfig.java @@ -0,0 +1,14 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.Firestorm; + +public class FirestormConfig extends PowersConfigFields { + public FirestormConfig() { + super("firestorm", + true, + null, + Firestorm.class, + PowerType.MAJOR_BLAZE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/FireworksBarrageConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/FireworksBarrageConfig.java new file mode 100644 index 000000000..a3a9915e4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/FireworksBarrageConfig.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.FireworksBarrage; + +public class FireworksBarrageConfig extends PowersConfigFields { + public FireworksBarrageConfig() { + super("fireworks_barrage", + true, + null, + 30, + 20, + FireworksBarrage.class, + PowerType.OFFENSIVE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/FlamePyreConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/FlamePyreConfig.java new file mode 100644 index 000000000..dfd0f5ea2 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/FlamePyreConfig.java @@ -0,0 +1,14 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.FlamePyre; + +public class FlamePyreConfig extends PowersConfigFields { + public FlamePyreConfig() { + super("flame_pyre", + true, + null, + FlamePyre.class, + PowerType.MAJOR_BLAZE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/FlamethrowerConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/FlamethrowerConfig.java new file mode 100644 index 000000000..27ee5ef35 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/FlamethrowerConfig.java @@ -0,0 +1,14 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.Flamethrower; + +public class FlamethrowerConfig extends PowersConfigFields { + public FlamethrowerConfig() { + super("flamethrower", + true, + null, + Flamethrower.class, + PowerType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/FrostConeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/FrostConeConfig.java new file mode 100644 index 000000000..a461ff5c3 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/FrostConeConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.FrostCone; + +public class FrostConeConfig extends PowersConfigFields { + public FrostConeConfig() { + super("frost_cone", + true, + null, + 15 * 20, + 7 * 20, + FrostCone.class, + PowerType.UNIQUE + ); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/FrostWalkerConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/FrostWalkerConfig.java new file mode 100644 index 000000000..fdeb57067 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/FrostWalkerConfig.java @@ -0,0 +1,10 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.FrostWalker; + +public class FrostWalkerConfig extends PowersConfigFields { + public FrostWalkerConfig() { + super("frost_walker", true, null, FrostWalker.class, PowerType.MISCELLANEOUS); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/GoldExplosionConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/GoldExplosionConfig.java new file mode 100644 index 000000000..3ac763e6d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/GoldExplosionConfig.java @@ -0,0 +1,14 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.GoldExplosion; + +public class GoldExplosionConfig extends PowersConfigFields { + public GoldExplosionConfig() { + super("gold_explosion", + true, + null, + GoldExplosion.class, + PowerType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/GoldShotgunConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/GoldShotgunConfig.java new file mode 100644 index 000000000..ce39081bd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/GoldShotgunConfig.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.GoldShotgun; + +public class GoldShotgunConfig extends PowersConfigFields { + public GoldShotgunConfig() { + super("gold_shotgun", + true, + null, + 20 * 20, + 20 * 7, + GoldShotgun.class, + PowerType.UNIQUE); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/GroundPoundConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/GroundPoundConfig.java new file mode 100644 index 000000000..3b1ed06db --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/GroundPoundConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.GroundPound; +import org.bukkit.Material; + +public class GroundPoundConfig extends PowersConfigFields { + public GroundPoundConfig() { + super("ground_pound", + true, + Material.DIRT.toString(), + GroundPound.class, + PowerType.MISCELLANEOUS); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/HyperLootConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/HyperLootConfig.java new file mode 100644 index 000000000..db37768cf --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/HyperLootConfig.java @@ -0,0 +1,14 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.HyperLoot; + +public class HyperLootConfig extends PowersConfigFields { + public HyperLootConfig() { + super("hyper_loot", + true, + null, + HyperLoot.class, + PowerType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ImplosionConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ImplosionConfig.java new file mode 100644 index 000000000..0cf86a766 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ImplosionConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.Implosion; +import org.bukkit.Material; + +public class ImplosionConfig extends PowersConfigFields { + public ImplosionConfig() { + super("implosion", + true, + Material.SLIME_BALL.toString(), + Implosion.class, + PowerType.MISCELLANEOUS); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/InvisibilityConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/InvisibilityConfig.java new file mode 100644 index 000000000..4850f35c0 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/InvisibilityConfig.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import org.bukkit.Material; + +import java.util.List; +import java.util.Map; + +public class InvisibilityConfig extends PowersConfigFields { + public InvisibilityConfig() { + super("invisibility", + true, + Material.GLASS_PANE.toString(), + addScriptEntry("BossInvisibility", + List.of("EliteMobSpawnEvent"), + null, + List.of(Map.of( + "action", "POTION_EFFECT", + "duration", Integer.MAX_VALUE, + "target", "SELF", + "amplifier", 0, + "potionEffectType", "invisibility" + )), + null), + PowerType.MISCELLANEOUS); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/InvulnerabilityArrowConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/InvulnerabilityArrowConfig.java new file mode 100644 index 000000000..3fcb7a08f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/InvulnerabilityArrowConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.InvulnerabilityArrow; +import org.bukkit.Material; + +public class InvulnerabilityArrowConfig extends PowersConfigFields { + public InvulnerabilityArrowConfig() { + super("invulnerability_arrow", + true, + Material.SPECTRAL_ARROW.toString(), + InvulnerabilityArrow.class, + PowerType.DEFENSIVE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/InvulnerabilityFallDamageConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/InvulnerabilityFallDamageConfig.java new file mode 100644 index 000000000..53615001a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/InvulnerabilityFallDamageConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.InvulnerabilityFallDamage; +import org.bukkit.Material; + +public class InvulnerabilityFallDamageConfig extends PowersConfigFields { + public InvulnerabilityFallDamageConfig() { + super("invulnerability_fall_damage", + true, + Material.FEATHER.toString(), + InvulnerabilityFallDamage.class, + PowerType.DEFENSIVE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/InvulnerabilityFireConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/InvulnerabilityFireConfig.java new file mode 100644 index 000000000..294987da1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/InvulnerabilityFireConfig.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import org.bukkit.Particle; + +import java.util.List; +import java.util.Map; + +public class InvulnerabilityFireConfig extends PowersConfigFields { + public InvulnerabilityFireConfig() { + super("invulnerability_fire", + true, + Particle.FLAME.toString(), + addScriptEntry("FireInvulnerability", + List.of("EliteMobSpawnEvent"), + null, + List.of(Map.of( + "action", "POTION_EFFECT", + "duration", Integer.MAX_VALUE, + "target", "SELF", + "amplifier", 1, + "potionEffectType", "fire_resistance" + )), + null), + PowerType.DEFENSIVE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/InvulnerabilityFireworkConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/InvulnerabilityFireworkConfig.java new file mode 100644 index 000000000..a12e31b93 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/InvulnerabilityFireworkConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.InvulnerabilityFireworks; +import org.bukkit.Material; + +public class InvulnerabilityFireworkConfig extends PowersConfigFields { + public InvulnerabilityFireworkConfig() { + super("invulnerability_fireworks.yml", + true, + Material.FIREWORK_ROCKET.toString(), + InvulnerabilityFireworks.class, + PowerType.DEFENSIVE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/InvulnerabilityKnockbackConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/InvulnerabilityKnockbackConfig.java new file mode 100644 index 000000000..2efea9a61 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/InvulnerabilityKnockbackConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.InvulnerabilityKnockback; +import org.bukkit.Material; + +public class InvulnerabilityKnockbackConfig extends PowersConfigFields { + public InvulnerabilityKnockbackConfig() { + super("invulnerability_knockback", + true, + Material.ANVIL.toString(), + InvulnerabilityKnockback.class, + PowerType.DEFENSIVE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/LightningBoltsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/LightningBoltsConfig.java new file mode 100644 index 000000000..9df34383c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/LightningBoltsConfig.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.LightningBolts; + +public class LightningBoltsConfig extends PowersConfigFields { + public static int delayBetweenStrikes; + + public LightningBoltsConfig() { + super("lightning_bolts", + true, + null, + 20 * 20, + 20 * 5, + LightningBolts.class, + PowerType.OFFENSIVE); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/MeteorShowerConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/MeteorShowerConfig.java new file mode 100644 index 000000000..ea9401392 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/MeteorShowerConfig.java @@ -0,0 +1,14 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.MeteorShower; + +public class MeteorShowerConfig extends PowersConfigFields { + public MeteorShowerConfig() { + super("meteor_shower", + true, + null, + MeteorShower.class, + PowerType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/MoonwalkConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/MoonwalkConfig.java new file mode 100644 index 000000000..572f08a44 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/MoonwalkConfig.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import org.bukkit.Material; + +import java.util.List; +import java.util.Map; + +public class MoonwalkConfig extends PowersConfigFields { + public MoonwalkConfig() { + super("moonwalk", + true, + Material.SLIME_BLOCK.toString(), + addScriptEntry("JumpBoost", + List.of("EliteMobSpawnEvent"), + null, + List.of(Map.of( + "action", "POTION_EFFECT", + "duration", Integer.MAX_VALUE, + "target", "SELF", + "amplifier", 3, + "potionEffectType", "jump_boost" + )), + null), + PowerType.MISCELLANEOUS); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/MovementSpeedConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/MovementSpeedConfig.java new file mode 100644 index 000000000..ba496c225 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/MovementSpeedConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.MovementSpeed; +import org.bukkit.Material; + +public class MovementSpeedConfig extends PowersConfigFields { + public MovementSpeedConfig() { + super("movement_speed", + true, + Material.GOLDEN_BOOTS.toString(), + MovementSpeed.class, + PowerType.MISCELLANEOUS); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/PhotonRayConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/PhotonRayConfig.java new file mode 100644 index 000000000..eece09e92 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/PhotonRayConfig.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.PhotonRay; + +public class PhotonRayConfig extends PowersConfigFields { + public PhotonRayConfig() { + super("photon_ray", + true, + null, + 60, + 20, + PhotonRay.class, + PowerType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/PlasmaBlasterConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/PlasmaBlasterConfig.java new file mode 100644 index 000000000..377eb0306 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/PlasmaBlasterConfig.java @@ -0,0 +1,14 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.PlasmaBlaster; + +public class PlasmaBlasterConfig extends PowersConfigFields { + public PlasmaBlasterConfig() { + super("plasma_blaster", + true, + null, + PlasmaBlaster.class, + PowerType.MAJOR_ENDERMAN); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ShieldWallConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ShieldWallConfig.java new file mode 100644 index 000000000..f6b9868b9 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ShieldWallConfig.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.ShieldWall; +import org.bukkit.Material; + +public class ShieldWallConfig extends PowersConfigFields { + public ShieldWallConfig() { + super("shield_wall", + true, + Material.SHIELD.toString(), + 60, + 7, + ShieldWall.class, + PowerType.DEFENSIVE); + } + + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/SkeletonPillarConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/SkeletonPillarConfig.java new file mode 100644 index 000000000..b54cc76ac --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/SkeletonPillarConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.SkeletonPillar; +import org.bukkit.Material; + +public class SkeletonPillarConfig extends PowersConfigFields { + public SkeletonPillarConfig() { + super("skeleton_pillar", + true, + Material.BONE.toString(), + SkeletonPillar.class, + PowerType.MAJOR_SKELETON); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/SkeletonTrackingArrowConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/SkeletonTrackingArrowConfig.java new file mode 100644 index 000000000..605d74da3 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/SkeletonTrackingArrowConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.SkeletonTrackingArrow; +import org.bukkit.Material; + +public class SkeletonTrackingArrowConfig extends PowersConfigFields { + public SkeletonTrackingArrowConfig() { + super("skeleton_tracking_arrow", + true, + Material.ARROW.toString(), + SkeletonTrackingArrow.class, + PowerType.MAJOR_SKELETON); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/SpiritWalkConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/SpiritWalkConfig.java new file mode 100644 index 000000000..595606da7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/SpiritWalkConfig.java @@ -0,0 +1,14 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.SpiritWalk; + +public class SpiritWalkConfig extends PowersConfigFields { + public SpiritWalkConfig() { + super("spirit_walk", + true, + null, + SpiritWalk.class, + PowerType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/SummonEmbersConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/SummonEmbersConfig.java new file mode 100644 index 000000000..a803af82b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/SummonEmbersConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.SummonEmbers; + +public class SummonEmbersConfig extends PowersConfigFields { + public SummonEmbersConfig() { + super("summon_embers", + true, + null, + SummonEmbers.class, + PowerType.UNIQUE); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/SummonTheReturnedConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/SummonTheReturnedConfig.java new file mode 100644 index 000000000..f74668a34 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/SummonTheReturnedConfig.java @@ -0,0 +1,14 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.SummonTheReturned; + +public class SummonTheReturnedConfig extends PowersConfigFields { + public SummonTheReturnedConfig() { + super("summon_the_returned", + true, + null, + SummonTheReturned.class, + PowerType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/TauntConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/TauntConfig.java new file mode 100644 index 000000000..adace69c9 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/TauntConfig.java @@ -0,0 +1,314 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.Taunt; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class TauntConfig extends PowersConfigFields { + public static List onDamaged, onDamagedByBow, onDamage, onDeath, onTarget; + + public TauntConfig() { + super("taunt", + true, + Material.JUKEBOX.toString(), + Taunt.class, + PowerType.MISCELLANEOUS); + } + + @Override + public void processAdditionalFields() { + onDamaged = ConfigurationEngine.setList(file, fileConfiguration, "onDamaged", new ArrayList<>(List.of( + "Ow!", + "Oi!", + "Stop that!", + "Why?!", + "You fight like a Dairy Farmer!", + "You are a pain in the backside!", + "En garde! Touche!", + "Hacks!", + "My health is bugged, unkillable!", + "Your hits only make me stronger!", + "Sticks and stones...", + "'tis but a flesh wound!", + "Emperor protects!", + "Herobrine, aid me!", + "Behind you! A creeper!", + "I have made a terrible mistake.", + "What doesn't kill me...", + "Zombies dig scars", + "I shall show you my true power!", + "Prepare for my ultimate attack!", + "My reinforcements are arriving!", + "You're going to pay for that!", + "That's going to leave a mark!", + "An eye for an eye!", + "Health insurance will cover that", + "I felt that one in my bones", + "'tis but a scratch", + "What was that? A soft breeze?", + "You'll never defeat me like that", + "Pathetic.", + "Weak.", + "That didn't even dent my armor!", + "This is going to be an easy one", + "My grandchildren will feel that", + "Are you even trying?", + "An admin just fully healed me", + "Haxxor!", + "Me? Damaged? Hacks!", + "I can't be defeated!", + "Good thing I'm using hacks!", + "Watch out! Herobrine behind you!", + "My life for Aiur!", + "Your home is getting griefed!", + "Why can't we be friends?", + "Valhalla!", + "Notch save me!", + "No retreat!", + "Hit me with your best shot!")), true); + + onDamagedByBow = ConfigurationEngine.setList(file, fileConfiguration, "onDamagedByBow", new ArrayList<>(List.of( + "Fight me like a Player!", + "Afraid to come up-close?", + "I can smell your fear from here!", + "Did you forget your sword?", + "Coward! Bow are no fair!", + "Bows? That's so 2011...", + "Bows are for the weak of mind!", + "Bows are for the weak of spirit!", + "Bows are for the weak of heart!", + "I thought we agreed no bows!", + "Bows? You'll regret that", + + //regular hits + "Ow!", + "Oi!", + "Stop that!", + "Why?!", + "You fight like a Dairy Farmer!", + "You are a pain in the backside!", + "En garde! Touche!", + "Hacks!", + "My health is bugged, unkillable!", + "Your hits only make me stronger!", + "Sticks and stones...", + "'tis but a flesh wound!", + "Emperor protects!", + "Herobrine, aid me!", + "Behind you! A creeper!", + "I have made a terrible mistake.", + "What doesn't kill me...", + "Zombies dig scars", + "I shall show you my true power!", + "Prepare for my ultimate attack!", + "My reinforcements are arriving!", + "You're going to pay for that!", + "That's going to leave a mark!", + "An eye for an eye!", + "Health insurance will cover that", + "I felt that one in my bones", + "'tis but a scratch", + "What was that? A soft breeze?", + "You'll never defeat me like that", + "Pathetic.", + "Weak.", + "That didn't even dent my armor!", + "This is going to be an easy one", + "My grandchildren will feel that", + "Are you even trying?", + "An admin just fully healed me", + "Haxxor!", + "Me? Damaged? Hacks!", + "I can't be defeated!", + "Good thing I'm using hacks!", + "Watch out! Herobrine behind you!", + "My life for Aiur!", + "Your home is getting griefed!", + "Why can't we be friends?", + "Valhalla!", + "Notch save me!", + "No retreat!", + "Hit me with your best shot!")), true); + + onDamage = ConfigurationEngine.setList(file, fileConfiguration, "onDamage", new ArrayList<>(List.of( + "A solid hit!", + "He shoots, and he scores!", + "You'll feel that in the morning!", + "Victory approaches!", + "Victory shall be mine!", + "That was only half of my power!", + "You came to the wrong hood!", + "You messed with the wrong mob!", + "Get ready to get mobbed on!", + "This was your last mistake!", + "Feel the burn!", + "John Cena", + "How are you still standing?", + "Just give up already!", + "Give up!", + "I have the high ground!", + "I will end you!", + "Hope you came prepared for pain!", + "The hunter becomes the hunted!", + "Blood for the blood throne!", + "Skulls for the skull throne!", + "A good player is a dead player!", + "Git gud!", + "Praise the Sun!", + "The end draws near!", + "You are not prepared.", + "Zug zug!", + "Hardly worth my time!", + "I thought this was a challenge?", + "Pro tip: don't get hit", + "Ima firin mah lazer bwooooooooo", + "For the Emperor!", + "Herobrine shall be pleased!", + "This is the end for you!", + "Are you even trying?", + "Weakling!", + "Pathetic.", + "Maybe this will wake you up.", + "This is just the beggining!", + "We're just getting started!", + "That was just a warm-up!", + "You are no match for me!", + "RKO out of nowhere!", + "I can do this all night long!", + "A fine punching bag!", + "I am the night!", + "I wonder what will break first", + "Revenge for Steve! You monster!", + "Join the mob side!", + "Too easy, too easy!", + "Too easy!", + "You can't defeat me!", + "Pikachuuuuuu", + "Avada kedavra!", + "Crucio!", + "Jierda!", + "A critical hit!", + "This is what skills looks like!", + "9001 damage!", + "Still standing?", + "Face your defeat!", + "A taste of pain to come!", + "I'll make you endangered!")), true); + + onDeath = ConfigurationEngine.setList(file, fileConfiguration, "onDeath", new ArrayList<>(List.of( + "Alas, poor Yorick!", + "The rest is silence", + "I shall return", + "Unforgivable", + "I live, I die, I live again!", + "WITNESS ME", + "I ride to valhalla!", + "VALHALLA!", + "VALHALLA! DELIVERANCE", + "You win, this time", + "A blight upon your land!", + "A pox upon thee!", + "You'll join me soon enough!", + "This is not over", + "Death is but a setback", + "Not like this...", + "I just wanted to go into space", + "We could've been friends", + "Your sins crawling on your back", + "See you in a bit", + "See you later", + "I'll be waiting for you", + "I will be avenged!", + "I won't go gently into the night", + "Should've gotten life insurance", + "It was my last day on the job", + "It was my last day here", + "Et tu, Brute?", + "RIP", + "x.x", + "(x.x)", + "xox", + "Fainted", + "GG, WP", + "GG", + "WP", + "GG no RE", + "HAX", + "Hacker", + "Not fair I was lagging", + "You win, this time", + "You monster...", + "Mediocre...")), true); + + onTarget = ConfigurationEngine.setList(file, fileConfiguration, "onTarget", new ArrayList<>(List.of( + "OI! Get over here!", + "What's that I see? A coward?", + "Sir, prepare your fisticuffs!", + "Let's settle this like cavemen!", + "En garde!", + "Look out! A creeper, behind you!", + "Aren't you a right ugly mug!", + "You look delicious.", + "Prepare for trouble!", + "Let the best click spammer win!", + "SPARTAAAAAA", + "I am actually level 9001", + "Not an Elite Mob", + "Poorly disguised Elite Mob", + "Ah, fresh prey!", + "The hunter becomes the hunted!", + "Killing me crashes the server", + "I'm actually a disguised player!", + "I'm not going to drop any loot!", + "Why can't we be friends?", + "Sssssss", + "This is my last day on the job!", + "Stop right there criminal scum!", + "Prepare to die!", + "Praise the Sun!", + "Git gud", + "Alea jacta est!", + "Facta, non verba!", + "Skulls for the skull throne!", + "Blood for the blood throne!", + "A sacrifice for Herobrine!", + "I shall pierce the heavens!", + "Just who do you think I am!?", + "A weakling! He's mine.", + "Dibs on the weakling!", + "Accio player!", + "A duel to the death!", + "I challenge you to a duel!", + "Pika pika!", + "Did you just call me an infernal", + "What did you just call me?", + "I know what you did you monster!", + "This is how your story ends!", + "Prepare for trouble!", + "I've been preparing for this!", + "I am prepared. Are you?", + "A worthy foe!", + "A worthy opponent!", + "A newbie! It's my lucky day!", + "Your stuff or your life!", + "This is a robbery!", + "It's you! You monster!", + "So hungry, give me your flesh!", + "There he is!", + "Must've been my imagination", + "Hi I'm Mr Meeseeks!", + "I'm Mr Meeseeks, look at me!", + "Your diamonds or your life!", + "For king and country!", + "Hit me with your best shot!", + "Witness me!", + "Witness me blood bag!", + "I go all shiny and chrome!")), true); + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/TazeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/TazeConfig.java new file mode 100644 index 000000000..060f640f6 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/TazeConfig.java @@ -0,0 +1,11 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.Taze; + +public class TazeConfig extends PowersConfigFields { + public TazeConfig() { + super("taze", true, null, 60, 20, Taze.class, + PowerType.OFFENSIVE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ThunderstormConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ThunderstormConfig.java new file mode 100644 index 000000000..f92ccc65c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ThunderstormConfig.java @@ -0,0 +1,14 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.Thunderstorm; + +public class ThunderstormConfig extends PowersConfigFields { + public ThunderstormConfig() { + super("thunderstorm", + true, + null, + Thunderstorm.class, + PowerType.UNIQUE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/TrackingFireballConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/TrackingFireballConfig.java new file mode 100644 index 000000000..c4f9821ad --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/TrackingFireballConfig.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.TrackingFireball; +import org.bukkit.Material; + +public class TrackingFireballConfig extends PowersConfigFields { + public static double fireballSpeed; + + public TrackingFireballConfig() { + super("tracking_fireball", + true, + Material.FIRE_CHARGE.toString(), + TrackingFireball.class, + PowerType.MAJOR_GHAST); + } + + @Override + public void processAdditionalFields() { + fireballSpeed = ConfigurationEngine.setDouble(fileConfiguration, "fireballSpeed", 0.5); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ZombieBloatConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ZombieBloatConfig.java new file mode 100644 index 000000000..5e6c1f634 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ZombieBloatConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.ZombieBloat; +import org.bukkit.Particle; + +public class ZombieBloatConfig extends PowersConfigFields { + public ZombieBloatConfig() { + super("zombie_bloat", + true, + Particle.TOTEM_OF_UNDYING.toString(), + ZombieBloat.class, + PowerType.MAJOR_ZOMBIE); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ZombieFriendsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ZombieFriendsConfig.java new file mode 100644 index 000000000..dcb5fbac5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ZombieFriendsConfig.java @@ -0,0 +1,67 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.ZombieFriends; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class ZombieFriendsConfig extends PowersConfigFields { + public static String friend1Name, friend2Name; + public static List friendDeathMessage, originalEntityDialog, reinforcementDialog; + + public ZombieFriendsConfig() { + super("zombie_friends", + true, + Material.ZOMBIE_HEAD.toString(), + ZombieFriends.class, + PowerType.MAJOR_ZOMBIE); + } + + @Override + public void processAdditionalFields() { + + friend1Name = ConfigurationEngine.setString(file, fileConfiguration, "friend1Name", "BFF #1", true); + friend2Name = ConfigurationEngine.setString(file, fileConfiguration, "friend2Name", "BFF #2", true); + + friendDeathMessage = ConfigurationEngine.setList(file, fileConfiguration, "friendDeathMessage", new ArrayList<>(List.of( + "Noooo!", + "Mediocre!", + "Zacharias!", + "He's deader than before!", + "Vengeance!", + "Revenge!", + "I can't believe you've done this.")), true); + + originalEntityDialog = ConfigurationEngine.setList(file, fileConfiguration, "originalEntityDialog", new ArrayList<>(List.of( + "Let's play ZombieCraft later!", + "Feel the power of friendship!", + "El pueblo, unido!", + "I called my friends over!", + "BFF power!", + "One for all!", + "Get him!", + "Screw you guys, I'm going home!")), true); + + reinforcementDialog = ConfigurationEngine.setList(file, fileConfiguration, "reinforcementDialog", new ArrayList<>(List.of( + "Don't mess with our friends!", + "We got your back Zach!", + "Backup has arrived!", + "One for all, one for all!", + "This is going to be easy!", + "Give up we have the high ground!", + "You wanna go bruv?", + "Worldstaaaaaaaaar!", + "What are you doing to our friend", + "Feel the power of friendship!", + "Friendship power at 100%!", + "Zombies, assemble!", + "We got your back mate!", + "Together we are better!", + "The more the merrier!", + "I got you fam!", + "All for one!")), true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ZombieNecronomiconConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ZombieNecronomiconConfig.java new file mode 100644 index 000000000..eeddcdfe1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ZombieNecronomiconConfig.java @@ -0,0 +1,45 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.ZombieNecronomicon; +import org.bukkit.Material; + +public class ZombieNecronomiconConfig extends PowersConfigFields { + public static String summoningChant; + + public ZombieNecronomiconConfig() { + super("zombie_necronomicon", + true, + Material.ENCHANTED_BOOK.toString(), + ZombieNecronomicon.class, + PowerType.MAJOR_ZOMBIE); + } + + @Override + public void processAdditionalFields() { + summoningChant = ConfigurationEngine.setString(file, fileConfiguration, "summoningChant", "Nor is it to be thought..." + + "that man is either the oldest " + + "or the last of earth's masters, or that the common bulk of life and substance walks alone. The Old Ones" + + " were, the Old Ones are, and the Old Ones shall be. Not in the spaces we know, but between them, they " + + "walk serene and primal, undimensioned and to us unseen. Yog-Sothoth knows the gate. Yog-Sothoth is the " + + "gate. Yog-Sothoth is the key and guardian of the gate. Past, present, future, all are one in Yog-Sothoth. " + + "He knows where the Old Ones broke through of old, and where They shall break through again. He knows " + + "where They had trod earth's fields, and where They still tread them, and why no one can behold Them as " + + "They tread. By Their smell can men sometimes know Them near, but of Their semblance can no man know, " + + "saving only in the features of those They have begotten on mankind; and of those are there many sorts, " + + "differing in likeness from man's truest eidolon to that shape without sight or substance which is Them. " + + "They walk unseen and foul in lonely places where the Words have been spoken and the Rites howled through " + + "at their Seasons. The wind gibbers with Their voices, and the earth mutters with Their consciousness. " + + "They bend the forest and crush the city, yet may not forest or city behold the hand that smites. Kadath " + + "in the cold waste hath known Them, and what man knows Kadath? The ice desert of the South and the sunken " + + "isles of Ocean hold stones whereon Their seal is engraver, but who hath seen the deep frozen city or the " + + "sealed tower long garlanded with seaweed and barnacles? Great Cthulhu is Their cousin, yet can he spy " + + "Them only dimly. Iä! Shub-Niggurath! As a foulness shall ye know Them. Their hand is at your throats, " + + "yet ye see Them not; and Their habitation is even one with your guarded threshold. Yog-Sothoth is the " + + "key to the gate, whereby the spheres meet. Man rules now where They ruled once; They shall soon rule " + + "where man rules now. After summer is winter, after winter summer. They wait patient and potent, for " + + "here shall They reign again.", true); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ZombieParentsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ZombieParentsConfig.java new file mode 100644 index 000000000..38229cb49 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/powers/premade/ZombieParentsConfig.java @@ -0,0 +1,79 @@ +package com.magmaguy.elitemobs.config.powers.premade; + +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.powers.ZombieParents; +import lombok.Getter; +import org.bukkit.Material; + +import java.util.ArrayList; +import java.util.List; + +public class ZombieParentsConfig extends PowersConfigFields { + @Getter + private static List deathMessage; + @Getter + private static List bossEntityDialog; + @Getter + private static List zombieDad; + @Getter + private static List zombieMom; + + public ZombieParentsConfig() { + super("zombie_parents", + true, + Material.SKELETON_SKULL.toString(), + ZombieParents.class, + PowerType.MAJOR_ZOMBIE); + } + + @Override + public void processAdditionalFields() { + deathMessage = ConfigurationEngine.setList(file, fileConfiguration, "deathMessage", new ArrayList<>(List.of( + "You monster!", + "My baby!", + "What have you done!?", + "Revenge!", + "Nooooo!", + "You will pay for that!", + "Eh, he was adopted", + "He's dead! Again!", + "He's deader than before!", + "You broke him!")), true); + + bossEntityDialog = ConfigurationEngine.setList(file, fileConfiguration, "bossEntityDialog", new ArrayList<>(List.of( + "You're embarrassing me!", + "He's bullying me!", + "He's the one picking on me!", + "I can deal with this alone!", + "Leave me alone, I got this!", + "Stop following me around!", + "God this is so embarrassing!", + "He took my lunch money!", + "He's bullying me!")), true); + + zombieDad = ConfigurationEngine.setList(file, fileConfiguration, "zombieDad", new ArrayList<>(List.of( + "Get away from my son!", + "Stand up for yourself son!", + "I'll deal with him!", + "Stop picking on my son!", + "Why are you doing this?", + "I'll talk to your parents!", + "You go kiddo!", + "Show him who's boss kiddo!", + "Nice punch kiddo!")), true); + + zombieMom = ConfigurationEngine.setList(file, fileConfiguration, "zombieMom", new ArrayList<>(List.of( + "Hands off my child!", + "Are you hurt sweetie?", + "Did he hurt you sweetie?", + "Let me see that booboo sweetie", + "I'll talk to his parents!", + "You forgot your jacket sweetie!", + "Posture, sweetheart", + "Break it up!", + "Stop this!", + "Did you take out the garbage?")), true); + } + +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/config/translations/TranslationsConfig.java b/src/main/java/com/magmaguy/elitemobs/config/translations/TranslationsConfig.java new file mode 100644 index 000000000..777e0d172 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/translations/TranslationsConfig.java @@ -0,0 +1,52 @@ +package com.magmaguy.elitemobs.config.translations; + +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.magmacore.config.CustomConfig; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; + +import java.util.HashMap; +import java.util.List; + +public class TranslationsConfig extends CustomConfig { + @Getter + private static HashMap translationConfigs = new HashMap<>(); + + /** + * Initializes all configurations and stores them in a list for later access + */ + public TranslationsConfig() { + super("translations", "com.magmaguy.elitemobs.config.translations.premade", TranslationsConfigFields.class); + translationConfigs = new HashMap<>(); + for (String key : super.getCustomConfigFieldsHashMap().keySet()) + translationConfigs.put(key, (TranslationsConfigFields) super.getCustomConfigFieldsHashMap().get(key)); + } + + /** + * This saves a translatable element to the configuration files. + */ + public static String add(String filename, String key, String value) { + if (DefaultConfig.getLanguage().equals("english")) + return value; + TranslationsConfigFields selectedLanguage = translationConfigs.get(DefaultConfig.getLanguage()); + if (selectedLanguage == null) { + Logger.warn("Failed to get valid language from " + filename + " , defaulting to English! (String)"); + return value; + } + selectedLanguage.add(filename, key, value); + return (String) selectedLanguage.get(filename, key); + } + + public static List add(String filename, String key, List value) { + if (DefaultConfig.getLanguage().equals("english")) + return value; + TranslationsConfigFields selectedLanguage = translationConfigs.get(DefaultConfig.getLanguage()); + if (selectedLanguage == null) { + Logger.warn("Failed to get valid language from " + filename + " , defaulting to English! (List)"); + return value; + } + selectedLanguage.add(filename, key, value); + return (List) selectedLanguage.get(filename, key); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/translations/TranslationsConfigFields.java b/src/main/java/com/magmaguy/elitemobs/config/translations/TranslationsConfigFields.java new file mode 100644 index 000000000..cb8a724e3 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/translations/TranslationsConfigFields.java @@ -0,0 +1,207 @@ +package com.magmaguy.elitemobs.config.translations; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.CustomConfigFields; +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.Bukkit; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; + +public class TranslationsConfigFields extends CustomConfigFields { + + private final List outdatedCustomKeys = new ArrayList<>(); + boolean saving = false; + private File translationDataFile; + private FileConfiguration translationData; + private FileConfiguration premadeTranslationsConfiguration; + private boolean customLanguage = false; + + /** + * Used by plugin-generated files (defaults) + * + * @param filename + * @param isEnabled + */ + public TranslationsConfigFields(String filename, boolean isEnabled) { + super(filename, isEnabled); + //Only process if the language is selected, translation files are very large and can cause very slow loading + if (!DefaultConfig.getLanguage().equals(filename)) return; + + //If the file doesn't exist, try to load it from the plugin resources to get the prepackaged translations + String parsedFilename = filename; + if (!parsedFilename.contains(".yml")) parsedFilename += ".yml"; + Path realPath = Paths.get(MetadataHandler.PLUGIN.getDataFolder().getAbsolutePath() + File.separatorChar + "translations" + File.separatorChar + parsedFilename); + //This happens the first time the plugin gets installed + if (!Files.exists(realPath)) { + try { + InputStream inputStream = MetadataHandler.PLUGIN.getResource("translations/" + parsedFilename); + InputStreamReader inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8); + BufferedReader bufferedReader = new BufferedReader(inputStreamReader); + YamlConfiguration config = YamlConfiguration.loadConfiguration(bufferedReader); + ConfigurationEngine.fileSaverCustomValues(config, realPath.toFile()); + inputStream.close(); + inputStreamReader.close(); + bufferedReader.close(); + } catch (Exception ex) { + Logger.info("Translation filename " + parsedFilename + " is not prepackaged. This is fine if it is meant to be a custom translation."); + customLanguage = true; + } + } + + } + + @Override + public void processConfigFields() { + //Only process if the language is selected, translation files are very large and can cause very slow loading + if (!DefaultConfig.getLanguage().equals(filename)) return; + + if (MetadataHandler.PLUGIN.getResource("translations/" + filename) == null) return; + if (customLanguage) return; + /* + Create translation_data file which will store the premade translations. This will be used to check if new premade translations are here. + */ + String languageDataFilename = filename.replace(".yml", ".translation_data"); + Path dataPath = Paths.get(MetadataHandler.PLUGIN.getDataFolder().getAbsolutePath() + File.separatorChar + "translations" + File.separatorChar + languageDataFilename); + if (!Files.exists(dataPath)) + try { + dataPath.toFile().createNewFile(); + } catch (Exception ex) { + Logger.info("Failed to create language data file for file " + filename + " backup file should've been " + languageDataFilename); + } + + + translationDataFile = dataPath.toFile(); + try { + translationData = YamlConfiguration.loadConfiguration(new InputStreamReader(new FileInputStream(translationDataFile), StandardCharsets.UTF_8)); + } catch (Exception ex) { + Logger.warn("Failed to read translation data!"); + return; + } + /* + Get the prepackaged translations file + */ + premadeTranslationsConfiguration = YamlConfiguration.loadConfiguration(new InputStreamReader(MetadataHandler.PLUGIN.getResource("translations/" + filename), StandardCharsets.UTF_8)); + + //Compare the prepackaged translation to the translation data + for (String path : premadeTranslationsConfiguration.getKeys(true)) { + //Value from the current premade translations + Object premadeValue = premadeTranslationsConfiguration.get(path); + if (!(premadeValue instanceof String || premadeValue instanceof List)) continue; + + //Value from the last known premade translations + Object dataValue = translationData.get(path); + //Actual current live value + Object liveValue = fileConfiguration.get(path); + + if (premadeValue == null) { + Logger.warn("Something went wrong updating the translations, report this to the developer!"); + continue; + } + + //Handle case in which the live translation does not have any values by assigning it the default value + if (dataValue == null) { + //Check if the live translation already has a custom value, shouldn't happen but who knows + if (liveValue != null) { + //If that is the case, the value is custom and the admin should be notified that it didn't update + outdatedCustomKeys.add(path); + Logger.info("Did not modify " + path + " because the value was custom"); + } else + //If there is no value set yet, set the default value + fileConfiguration.set(path, premadeValue); + } + //Check if the prepackaged value and the data value are different, meaning that the premade translation updated + else if (!premadeValue.equals(dataValue)) { + //Check if the live value is custom + if (!dataValue.equals(liveValue)) { + //The value is custom + outdatedCustomKeys.add(path); + Logger.info("Did not modify " + path + " because the value was custom"); + } else { + //The value is not custom, can safely be autoupdated + fileConfiguration.set(path, premadeValue); + Logger.info("Updated translation entry " + path + " for language " + filename); + } + } + + //Finally, make sure the translation data gets updated + if (!premadeValue.equals(dataValue)) + translationData.set(path, premadeValue); + } + + try { + //Save changes + translationData.save(translationDataFile); + fileConfiguration.save(file); + } catch (Exception exception) { + Logger.warn("Failed to save language files, report this to the developer!"); + } + } + + public void add(String filename, String key, Object value) { + if (value == null) return; + + //Clean the value up + String filteredFilename = filename.replace(".yml", ""); + if (value instanceof String) { + value = fixConfigColors((String) value); + if (((String) value).isEmpty()) return; + } else if (value instanceof List) { + value = fixConfigColors((List) value); + if (((List) value).isEmpty()) return; + } + + String realKey = filteredFilename + "." + key; + + if (fileConfiguration.get(realKey) != null) { + return; + } + + //Commit the value + fileConfiguration.set(realKey, value); + save(); + } + + private void save() { + if (saving) return; + saving = true; + Bukkit.getScheduler().scheduleSyncDelayedTask(MetadataHandler.PLUGIN, () -> { + ConfigurationEngine.fileSaverCustomValues(fileConfiguration, file); + if (translationData != null) + ConfigurationEngine.fileSaverCustomValues(translationData, translationDataFile); + saving = false; + }); + } + + public Object get(String filename, String key) { + String filteredFilename = filename.replace(".yml", ""); + Object object = fileConfiguration.get(filteredFilename + "." + key); + if (object instanceof String) + object = ChatColorConverter.convert((String) object); + else if (object instanceof List) + object = ChatColorConverter.convert((List) object); + return object; + } + + private String fixConfigColors(String value) { + if (value == null) return null; + return value.replace("§", "&"); + } + + private List fixConfigColors(List values) { + List uncoloredList = new ArrayList<>(); + values.forEach(s -> uncoloredList.add(fixConfigColors(s))); + return uncoloredList; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/translations/premade/ChineseSimplifiedConfig.java b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/ChineseSimplifiedConfig.java new file mode 100644 index 000000000..d870ba903 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/ChineseSimplifiedConfig.java @@ -0,0 +1,9 @@ +package com.magmaguy.elitemobs.config.translations.premade; + +import com.magmaguy.elitemobs.config.translations.TranslationsConfigFields; + +public class ChineseSimplifiedConfig extends TranslationsConfigFields { + public ChineseSimplifiedConfig() { + super("chinese_simplified", true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/translations/premade/ChineseTraditionalConfig.java b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/ChineseTraditionalConfig.java new file mode 100644 index 000000000..888c2b7f5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/ChineseTraditionalConfig.java @@ -0,0 +1,9 @@ +package com.magmaguy.elitemobs.config.translations.premade; + +import com.magmaguy.elitemobs.config.translations.TranslationsConfigFields; + +public class ChineseTraditionalConfig extends TranslationsConfigFields { + public ChineseTraditionalConfig() { + super("chinese_traditional", true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/translations/premade/CustomLanguageConfig.java b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/CustomLanguageConfig.java new file mode 100644 index 000000000..0ac23a803 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/CustomLanguageConfig.java @@ -0,0 +1,9 @@ +package com.magmaguy.elitemobs.config.translations.premade; + +import com.magmaguy.elitemobs.config.translations.TranslationsConfigFields; + +public class CustomLanguageConfig extends TranslationsConfigFields { + public CustomLanguageConfig() { + super("custom_language", true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/translations/premade/CzechConfig.java b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/CzechConfig.java new file mode 100644 index 000000000..38075f220 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/CzechConfig.java @@ -0,0 +1,9 @@ +package com.magmaguy.elitemobs.config.translations.premade; + +import com.magmaguy.elitemobs.config.translations.TranslationsConfigFields; + +public class CzechConfig extends TranslationsConfigFields { + public CzechConfig() { + super("czech", true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/translations/premade/FrenchConfig.java b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/FrenchConfig.java new file mode 100644 index 000000000..66104e836 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/FrenchConfig.java @@ -0,0 +1,9 @@ +package com.magmaguy.elitemobs.config.translations.premade; + +import com.magmaguy.elitemobs.config.translations.TranslationsConfigFields; + +public class FrenchConfig extends TranslationsConfigFields { + public FrenchConfig() { + super("french", true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/translations/premade/GermanConfig.java b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/GermanConfig.java new file mode 100644 index 000000000..f9396d098 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/GermanConfig.java @@ -0,0 +1,9 @@ +package com.magmaguy.elitemobs.config.translations.premade; + +import com.magmaguy.elitemobs.config.translations.TranslationsConfigFields; + +public class GermanConfig extends TranslationsConfigFields { + public GermanConfig() { + super("german", true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/translations/premade/IndonesianConfig.java b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/IndonesianConfig.java new file mode 100644 index 000000000..f055f9796 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/IndonesianConfig.java @@ -0,0 +1,9 @@ +package com.magmaguy.elitemobs.config.translations.premade; + +import com.magmaguy.elitemobs.config.translations.TranslationsConfigFields; + +public class IndonesianConfig extends TranslationsConfigFields { + public IndonesianConfig() { + super("indonesian", true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/translations/premade/ItalianConfig.java b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/ItalianConfig.java new file mode 100644 index 000000000..225e038ab --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/ItalianConfig.java @@ -0,0 +1,9 @@ +package com.magmaguy.elitemobs.config.translations.premade; + +import com.magmaguy.elitemobs.config.translations.TranslationsConfigFields; + +public class ItalianConfig extends TranslationsConfigFields { + public ItalianConfig() { + super("italian", true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/translations/premade/JapaneseConfig.java b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/JapaneseConfig.java new file mode 100644 index 000000000..50a426153 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/JapaneseConfig.java @@ -0,0 +1,9 @@ +package com.magmaguy.elitemobs.config.translations.premade; + +import com.magmaguy.elitemobs.config.translations.TranslationsConfigFields; + +public class JapaneseConfig extends TranslationsConfigFields { + public JapaneseConfig() { + super("japanese", true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/translations/premade/KoreanConfig.java b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/KoreanConfig.java new file mode 100644 index 000000000..afd91e30e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/KoreanConfig.java @@ -0,0 +1,9 @@ +package com.magmaguy.elitemobs.config.translations.premade; + +import com.magmaguy.elitemobs.config.translations.TranslationsConfigFields; + +public class KoreanConfig extends TranslationsConfigFields { + public KoreanConfig() { + super("korean", true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/translations/premade/PolishConfig.java b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/PolishConfig.java new file mode 100644 index 000000000..d184e16c1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/PolishConfig.java @@ -0,0 +1,9 @@ +package com.magmaguy.elitemobs.config.translations.premade; + +import com.magmaguy.elitemobs.config.translations.TranslationsConfigFields; + +public class PolishConfig extends TranslationsConfigFields { + public PolishConfig() { + super("polish", true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/translations/premade/PortugueseBrazilianConfig.java b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/PortugueseBrazilianConfig.java new file mode 100644 index 000000000..6862a13f5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/PortugueseBrazilianConfig.java @@ -0,0 +1,9 @@ +package com.magmaguy.elitemobs.config.translations.premade; + +import com.magmaguy.elitemobs.config.translations.TranslationsConfigFields; + +public class PortugueseBrazilianConfig extends TranslationsConfigFields { + public PortugueseBrazilianConfig() { + super("portuguese_brazilian", true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/translations/premade/RussianConfig.java b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/RussianConfig.java new file mode 100644 index 000000000..d8c07bd65 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/RussianConfig.java @@ -0,0 +1,9 @@ +package com.magmaguy.elitemobs.config.translations.premade; + +import com.magmaguy.elitemobs.config.translations.TranslationsConfigFields; + +public class RussianConfig extends TranslationsConfigFields { + public RussianConfig() { + super("russian", true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/translations/premade/SpanishConfig.java b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/SpanishConfig.java new file mode 100644 index 000000000..ae672199d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/translations/premade/SpanishConfig.java @@ -0,0 +1,9 @@ +package com.magmaguy.elitemobs.config.translations.premade; + +import com.magmaguy.elitemobs.config.translations.TranslationsConfigFields; + +public class SpanishConfig extends TranslationsConfigFields { + public SpanishConfig() { + super("spanish", true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/wormholes/WormholeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/wormholes/WormholeConfig.java new file mode 100644 index 000000000..1289e7493 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/wormholes/WormholeConfig.java @@ -0,0 +1,24 @@ +package com.magmaguy.elitemobs.config.wormholes; + +import com.magmaguy.elitemobs.wormhole.Wormhole; +import com.magmaguy.magmacore.config.CustomConfig; +import lombok.Getter; + +import java.util.HashMap; + +public class WormholeConfig extends CustomConfig { + @Getter + private static HashMap wormholes; + + public WormholeConfig() { + super("wormholes", "com.magmaguy.elitemobs.config.wormholes.premade", WormholeConfigFields.class); + wormholes = new HashMap<>(); + for (String key : super.getCustomConfigFieldsHashMap().keySet()) { + if (super.getCustomConfigFieldsHashMap().get(key).isEnabled()) { + wormholes.put(key, (WormholeConfigFields) super.getCustomConfigFieldsHashMap().get(key)); + if (super.getCustomConfigFieldsHashMap().get(key).isEnabled()) + new Wormhole((WormholeConfigFields) super.getCustomConfigFieldsHashMap().get(key)); + } + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/wormholes/WormholeConfigFields.java b/src/main/java/com/magmaguy/elitemobs/config/wormholes/WormholeConfigFields.java new file mode 100644 index 000000000..212d31f73 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/wormholes/WormholeConfigFields.java @@ -0,0 +1,86 @@ +package com.magmaguy.elitemobs.config.wormholes; + +import com.magmaguy.elitemobs.config.ConfigurationEngine; +import com.magmaguy.elitemobs.config.CustomConfigFields; +import com.magmaguy.elitemobs.utils.ConfigurationLocation; +import com.magmaguy.elitemobs.wormhole.Wormhole; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Location; + +public class WormholeConfigFields extends CustomConfigFields { + + @Getter + @Setter + private String location1; + @Getter + @Setter + private String location2; + @Getter + @Setter + private String location1Text; + @Getter + @Setter + private String location2Text; + @Getter + @Setter + private String permission; + @Getter + @Setter + private Wormhole.WormholeStyle style = Wormhole.WormholeStyle.CUBE; + @Getter + @Setter + private int particleColor; + @Getter + @Setter + private double coinCost; + @Getter + @Setter + private boolean blindPlayer; + @Getter + @Setter + private double sizeMultiplier = 1D; + + public WormholeConfigFields(String filename, + boolean isEnabled, + String location1, + String location2, + Wormhole.WormholeStyle style) { + super(filename, isEnabled); + this.location1 = location1; + this.location2 = location2; + this.style = style; + } + + public WormholeConfigFields(String filename, boolean isEnabled) { + super(filename, isEnabled); + } + + @Override + public void processConfigFields() { + this.isEnabled = processBoolean("isEnabled", isEnabled, true, true); + this.location1 = processString("location1", location1, null, true); + this.location1Text = processString("location1Text", location1Text, null, false); + this.location2 = processString("location2", location2, null, true); + this.location2Text = processString("location2Text", location2Text, null, false); + this.permission = processString("permission", permission, null, false); + this.coinCost = processDouble("coinCost", coinCost, 0, false); + this.style = processEnum("style", style, Wormhole.WormholeStyle.CUBE, Wormhole.WormholeStyle.class, false); + this.particleColor = processInt("particleColor", particleColor, 0x800080, false); + this.blindPlayer = processBoolean("blindPlayer", blindPlayer, false, false); + this.sizeMultiplier = processDouble("sizeMultiplier", sizeMultiplier, 1D, false); + } + + public void setWormholeEntryLocation(Location location, int wormholeNumber) { + if (wormholeNumber == 1) { + this.location1 = ConfigurationLocation.deserialize(location); + fileConfiguration.set("location1", location1); + ConfigurationEngine.fileSaverCustomValues(fileConfiguration, file); + } else { + this.location2 = ConfigurationLocation.deserialize(location); + fileConfiguration.set("location2", location2); + ConfigurationEngine.fileSaverCustomValues(fileConfiguration, file); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGAirshipWormholeConfig.off b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGAirshipWormholeConfig.off new file mode 100644 index 000000000..909b51308 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGAirshipWormholeConfig.off @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.wormholes.premade; + +import com.magmaguy.elitemobs.config.wormholes.WormholeConfigFields; +import com.magmaguy.elitemobs.wormhole.Wormhole; + +public class AGAirshipWormholeConfig extends WormholeConfigFields { + public AGAirshipWormholeConfig() { + super("ag_airship_wormhole", + true, + "em_adventurers_guild,296.5,102,296.5,-90,0", + "airship_minidungeon.yml", + Wormhole.WormholeStyle.CUBE); + setBlindPlayer(true); + setLocation1Text("&f『Airship Minidungeon』 &aLvls 45-55"); + setParticleColor(0xFFFFFF); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGBeastsSanctuaryWormholeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGBeastsSanctuaryWormholeConfig.java new file mode 100644 index 000000000..0abaee021 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGBeastsSanctuaryWormholeConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.wormholes.premade; + +import com.magmaguy.elitemobs.config.wormholes.WormholeConfigFields; +import com.magmaguy.elitemobs.wormhole.Wormhole; + +public class AGBeastsSanctuaryWormholeConfig extends WormholeConfigFields { + public AGBeastsSanctuaryWormholeConfig() { + super("ag_beasts_sanctuary_wormhole", + true, + "em_adventurers_guild,296.5,106,296.5,90,0", + "beasts_sanctuary_lair.yml", + Wormhole.WormholeStyle.CRYSTAL); + setBlindPlayer(true); + setLocation1Text("&5『Beasts Sanctuary Lair』 &cLvl 130"); + setParticleColor(0x9600FF); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGBinderOfWorldsLairWormholeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGBinderOfWorldsLairWormholeConfig.java new file mode 100644 index 000000000..6292ca0cf --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGBinderOfWorldsLairWormholeConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.wormholes.premade; + +import com.magmaguy.elitemobs.config.wormholes.WormholeConfigFields; +import com.magmaguy.elitemobs.wormhole.Wormhole; + +public class AGBinderOfWorldsLairWormholeConfig extends WormholeConfigFields { + public AGBinderOfWorldsLairWormholeConfig() { + super("ag_binder_of_worlds_wormhole", + true, + "em_adventurers_guild,290.5,123,302.5,90,0", + "shadow_of_the_binder_of_worlds_lair.yml", + Wormhole.WormholeStyle.CRYSTAL); + setBlindPlayer(true); + setLocation1Text("&5『Shadow of the Binder Of Worlds』 &5Lvl 200"); + setParticleColor(0x9600FF); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGCatacombsWormholeConfig.off b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGCatacombsWormholeConfig.off new file mode 100644 index 000000000..6a0f29a0b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGCatacombsWormholeConfig.off @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.wormholes.premade; + +import com.magmaguy.elitemobs.config.wormholes.WormholeConfigFields; +import com.magmaguy.elitemobs.wormhole.Wormhole; + +public class AGCatacombsWormholeConfig extends WormholeConfigFields { + public AGCatacombsWormholeConfig() { + super("ag_catacombs_wormhole", + true, + "em_adventurers_guild,296.5,98,296.5,98,0", + "catacombs_lair.yml", + Wormhole.WormholeStyle.CRYSTAL); + setBlindPlayer(true); + setLocation1Text("&7『Catacombs Lair』 &aLvl 10"); + setParticleColor(0x797979); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGColosseumWormholeConfig.off b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGColosseumWormholeConfig.off new file mode 100644 index 000000000..5789f54c1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGColosseumWormholeConfig.off @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.wormholes.premade; + +import com.magmaguy.elitemobs.config.wormholes.WormholeConfigFields; +import com.magmaguy.elitemobs.wormhole.Wormhole; + +public class AGColosseumWormholeConfig extends WormholeConfigFields { + public AGColosseumWormholeConfig() { + super("ag_colosseum_wormhole", + true, + "em_adventurers_guild,296.5,103,308.5,-175,0", + "colosseum_lair.yml", + Wormhole.WormholeStyle.CRYSTAL); + setBlindPlayer(true); + setLocation1Text("&6『Colosseum Minidungeon』 &6Lvl 70"); + setParticleColor(0xFFB000); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGDarkCathedralWormholeConfig.off b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGDarkCathedralWormholeConfig.off new file mode 100644 index 000000000..db71d8838 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGDarkCathedralWormholeConfig.off @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.wormholes.premade; + +import com.magmaguy.elitemobs.config.wormholes.WormholeConfigFields; +import com.magmaguy.elitemobs.wormhole.Wormhole; + +public class AGDarkCathedralWormholeConfig extends WormholeConfigFields { + public AGDarkCathedralWormholeConfig() { + super("ag_dark_cathedral_wormhole", + true, + "em_adventurers_guild,290.5,101.5,293.5,-40,0", + "dark_cathedral_lair.yml", + Wormhole.WormholeStyle.CUBE); + setBlindPlayer(true); + setLocation1Text("&0『Dark Cathedral Lair』 &6Lvl 40"); + setParticleColor(0x000000); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGDarkSpireWormholeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGDarkSpireWormholeConfig.java new file mode 100644 index 000000000..12a6b673b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGDarkSpireWormholeConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.wormholes.premade; + +import com.magmaguy.elitemobs.config.wormholes.WormholeConfigFields; +import com.magmaguy.elitemobs.wormhole.Wormhole; + +public class AGDarkSpireWormholeConfig extends WormholeConfigFields { + public AGDarkSpireWormholeConfig() { + super("ag_dark_spire_wormhole", + true, + "em_adventurers_guild,284.5,105,296.5,0,0", + "dark_spire_minidungeon.yml", + Wormhole.WormholeStyle.CUBE); + setBlindPlayer(true); + setLocation1Text("&0『Dark Spire Minidungeon』 &cLvls 100-120"); + setParticleColor(0x000000); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGFireworksWormholeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGFireworksWormholeConfig.java new file mode 100644 index 000000000..712f65478 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGFireworksWormholeConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.wormholes.premade; + +import com.magmaguy.elitemobs.config.wormholes.WormholeConfigFields; +import com.magmaguy.elitemobs.wormhole.Wormhole; + +public class AGFireworksWormholeConfig extends WormholeConfigFields { + public AGFireworksWormholeConfig() { + super("ag_fireworks_wormhole", + true, + "em_adventurers_guild,296.5,99,308.5,-174,0", + "fireworks_lair.yml", + Wormhole.WormholeStyle.CRYSTAL); + setBlindPlayer(true); + setLocation1Text("&6『Fireworks Lair』 &aLvl 20"); + setParticleColor(0xFFE100); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGHallosseumWormholeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGHallosseumWormholeConfig.java new file mode 100644 index 000000000..9b11d68a8 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGHallosseumWormholeConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.wormholes.premade; + +import com.magmaguy.elitemobs.config.wormholes.WormholeConfigFields; +import com.magmaguy.elitemobs.wormhole.Wormhole; + +public class AGHallosseumWormholeConfig extends WormholeConfigFields { + public AGHallosseumWormholeConfig() { + super("ag_hallosseum_wormhole", + true, + "em_adventurers_guild,281.5,100.5,302.5,-46,0", + "hallosseum_lair.yml", + Wormhole.WormholeStyle.CRYSTAL); + setBlindPlayer(true); + setLocation1Text("&4『Hallosseum Lair』 &aLvl 30"); + setParticleColor(0x680000); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGInvasionWormholeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGInvasionWormholeConfig.java new file mode 100644 index 000000000..0a2d8ae28 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGInvasionWormholeConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.wormholes.premade; + +import com.magmaguy.elitemobs.config.wormholes.WormholeConfigFields; +import com.magmaguy.elitemobs.wormhole.Wormhole; + +public class AGInvasionWormholeConfig extends WormholeConfigFields { + public AGInvasionWormholeConfig() { + super("ag_invasion_wormhole", + true, + "em_adventurers_guild,284.5,101,296.5,0,0", + "invasion_minidungeon.yml", + Wormhole.WormholeStyle.CUBE); + setBlindPlayer(true); + setLocation1Text("&8『Invasion Minidungeon』 &aLvls 35-45"); + setParticleColor(0x005600); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGIronLeagueWormholeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGIronLeagueWormholeConfig.java new file mode 100644 index 000000000..0f34faf7c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGIronLeagueWormholeConfig.java @@ -0,0 +1,18 @@ +package com.magmaguy.elitemobs.config.wormholes.premade; + +import com.magmaguy.elitemobs.config.wormholes.WormholeConfigFields; +import com.magmaguy.elitemobs.wormhole.Wormhole; + +public class AGIronLeagueWormholeConfig extends WormholeConfigFields { + public AGIronLeagueWormholeConfig() { + super("ag_iron_league_arena_wormhole", + true, + "em_adventurers_guild,246.5,93,275.5,-89,0", + "iron_league_arena.yml", + Wormhole.WormholeStyle.ICOSAHEDRON); + setLocation1Text("&f『Iron League Arena』 &aLvl 50"); + setLocation2Text("&f『Adventurers Guild』"); + setParticleColor(0); + setBlindPlayer(true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGKnightsCastleWormholeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGKnightsCastleWormholeConfig.java new file mode 100644 index 000000000..46fecb7df --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGKnightsCastleWormholeConfig.java @@ -0,0 +1,18 @@ +package com.magmaguy.elitemobs.config.wormholes.premade; + +import com.magmaguy.elitemobs.config.wormholes.WormholeConfigFields; +import com.magmaguy.elitemobs.wormhole.Wormhole; + +public class AGKnightsCastleWormholeConfig extends WormholeConfigFields { + public AGKnightsCastleWormholeConfig() { + super("ag_knights_castle_lair_wormhole", + true, + "em_adventurers_guild,281.5,104.5,302.5,-45,0", + "knights_castle_lair.yml", + Wormhole.WormholeStyle.ICOSAHEDRON); + setLocation1Text("&7『Knight's Castle』 &aLvl 95"); + setLocation2Text("&f『Adventurers Guild』"); + setParticleColor(0); + setBlindPlayer(true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGNorthPoleWormholeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGNorthPoleWormholeConfig.java new file mode 100644 index 000000000..d56e1aef7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGNorthPoleWormholeConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.wormholes.premade; + +import com.magmaguy.elitemobs.config.wormholes.WormholeConfigFields; +import com.magmaguy.elitemobs.wormhole.Wormhole; + +public class AGNorthPoleWormholeConfig extends WormholeConfigFields { + public AGNorthPoleWormholeConfig() { + super("ag_north_pole_wormhole", + true, + "em_adventurers_guild,299.5,102.5,302.5,-133,0", + "north_pole_minidungeon.yml", + Wormhole.WormholeStyle.CUBE); + setBlindPlayer(true); + setLocation1Text("&f『North Pole Minidungeon』 &6Lvls 55-60"); + setParticleColor(0xFFFFFF); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGOasisWormholeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGOasisWormholeConfig.java new file mode 100644 index 000000000..2c5af8fbe --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGOasisWormholeConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.wormholes.premade; + +import com.magmaguy.elitemobs.config.wormholes.WormholeConfigFields; +import com.magmaguy.elitemobs.wormhole.Wormhole; + +public class AGOasisWormholeConfig extends WormholeConfigFields { + public AGOasisWormholeConfig() { + super("ag_oasis_wormhole", + true, + "em_adventurers_guild,290.5,99.5,311.5,-133,0", + "oasis_adventure.yml", + Wormhole.WormholeStyle.ICOSAHEDRON); + setBlindPlayer(true); + setLocation1Text("&2『Oasis Adventure』 &aLvls 20-55"); + setParticleColor(0xFFFF00); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGPirateShipWormholeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGPirateShipWormholeConfig.java new file mode 100644 index 000000000..72306f2e6 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGPirateShipWormholeConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.wormholes.premade; + +import com.magmaguy.elitemobs.config.wormholes.WormholeConfigFields; +import com.magmaguy.elitemobs.wormhole.Wormhole; + +public class AGPirateShipWormholeConfig extends WormholeConfigFields { + public AGPirateShipWormholeConfig() { + super("ag_pirate_ship_wormhole", + true, + "em_adventurers_guild,299.5,98.5,302.5,133,0", + "pirate_ship_minidungeon.yml", + Wormhole.WormholeStyle.CUBE); + setBlindPlayer(true); + setLocation1Text("&9『Pirate Ship Minidungeon』 &aLvls 10-20"); + setParticleColor(0x000077); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGPrimisWormholeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGPrimisWormholeConfig.java new file mode 100644 index 000000000..110411925 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGPrimisWormholeConfig.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.config.wormholes.premade; + +import com.magmaguy.elitemobs.config.wormholes.WormholeConfigFields; +import com.magmaguy.elitemobs.wormhole.Wormhole; + +public class AGPrimisWormholeConfig extends WormholeConfigFields { + public AGPrimisWormholeConfig() { + super("ag_primis_wormhole", + true, + "em_adventurers_guild,290.5,98,302.5,109,0", + "primis_adventure.yml", + Wormhole.WormholeStyle.ICOSAHEDRON); + setBlindPlayer(true); + setLocation1Text("&2『Primis Adventure』 &aLvls 0-20"); + setParticleColor(0x008000); + setSizeMultiplier(2); + } +} + diff --git a/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGRuinsWormholeConfig.off b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGRuinsWormholeConfig.off new file mode 100644 index 000000000..ea4fa6e5e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGRuinsWormholeConfig.off @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.wormholes.premade; + +import com.magmaguy.elitemobs.config.wormholes.WormholeConfigFields; +import com.magmaguy.elitemobs.wormhole.Wormhole; + +public class AGRuinsWormholeConfig extends WormholeConfigFields { + public AGRuinsWormholeConfig() { + super("ag_ruins_wormhole", + true, + "em_adventurers_guild,290.5,107.5,311.5,-135,0", + "the_ruins.yml", + Wormhole.WormholeStyle.CRYSTAL); + setBlindPlayer(true); + setLocation1Text("&8『Ruins Lair』 &cLvl 150"); + setParticleColor(0x141414); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGSewersWormholeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGSewersWormholeConfig.java new file mode 100644 index 000000000..f46e4f684 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGSewersWormholeConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.wormholes.premade; + +import com.magmaguy.elitemobs.config.wormholes.WormholeConfigFields; +import com.magmaguy.elitemobs.wormhole.Wormhole; + +public class AGSewersWormholeConfig extends WormholeConfigFields { + public AGSewersWormholeConfig() { + super("ag_sewers_wormhole", + true, + "em_adventurers_guild,284.5,100,308.5,-90,0", + "sewers_minidungeon.yml", + Wormhole.WormholeStyle.CUBE); + setBlindPlayer(true); + setLocation1Text("&1『Sewers Minidungeon』 &aLvls 20-35"); + setParticleColor(0xCACBC); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGSteamworksLairWormholeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGSteamworksLairWormholeConfig.java new file mode 100644 index 000000000..acac8a5eb --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGSteamworksLairWormholeConfig.java @@ -0,0 +1,18 @@ +package com.magmaguy.elitemobs.config.wormholes.premade; + +import com.magmaguy.elitemobs.config.wormholes.WormholeConfigFields; +import com.magmaguy.elitemobs.wormhole.Wormhole; + +public class AGSteamworksLairWormholeConfig extends WormholeConfigFields { + public AGSteamworksLairWormholeConfig() { + super("ag_steamworks_lair_wormhole", + true, + "em_adventurers_guild,296.5,107,308.5,-175,0", + "steamworks_lair.yml", + Wormhole.WormholeStyle.ICOSAHEDRON); + setLocation1Text("&6『The Steamworks Lair』 &aLvl 140"); + setLocation2Text("&f『Adventurers Guild』"); + setParticleColor(0); + setBlindPlayer(true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGUnderGroveWormholeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGUnderGroveWormholeConfig.java new file mode 100644 index 000000000..b15b23177 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGUnderGroveWormholeConfig.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.wormholes.premade; + +import com.magmaguy.elitemobs.config.wormholes.WormholeConfigFields; +import com.magmaguy.elitemobs.wormhole.Wormhole; + +public class AGUnderGroveWormholeConfig extends WormholeConfigFields { + public AGUnderGroveWormholeConfig() { + super("ag_under_grove_wormhole", + true, + "em_adventurers_guild,284.5,109,296.5,0,0", + "under_grove_lair.yml", + Wormhole.WormholeStyle.CRYSTAL); + setBlindPlayer(true); + setLocation1Text("&2『Under Grove Lair』 &cLvl 170"); + setParticleColor(0x9600FF); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGVampireManorWormholeConfig.off b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGVampireManorWormholeConfig.off new file mode 100644 index 000000000..dcd185766 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AGVampireManorWormholeConfig.off @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.config.wormholes.premade; + +import com.magmaguy.elitemobs.config.wormholes.WormholeConfigFields; +import com.magmaguy.elitemobs.wormhole.Wormhole; + +public class AGVampireManorWormholeConfig extends WormholeConfigFields { + public AGVampireManorWormholeConfig() { + super("ag_vampire_manor_wormhole", + true, + "em_adventurers_guild,290.5,105.5,293.5,45,0", + "vampire_manor.yml", + Wormhole.WormholeStyle.CUBE); + setBlindPlayer(true); + setLocation1Text("&4『Vampire Manor Lair』 &5Lvls 120-140"); + setParticleColor(0x6A0000); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AdventurersGuildWormholeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AdventurersGuildWormholeConfig.java new file mode 100644 index 000000000..cad85ed0e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/AdventurersGuildWormholeConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.wormholes.premade; + +import com.magmaguy.elitemobs.config.wormholes.WormholeConfigFields; +import com.magmaguy.elitemobs.wormhole.Wormhole; + +public class AdventurersGuildWormholeConfig extends WormholeConfigFields { + public AdventurersGuildWormholeConfig() { + super("adventurers_guild_wormhole", + true, + "em_adventurers_guild,204.5,89,235.5,-89,0", + "your_world_here,0.5,64,0.5,0,0", + Wormhole.WormholeStyle.ICOSAHEDRON); + setBlindPlayer(true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/TestWormholeConfig.java b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/TestWormholeConfig.java new file mode 100644 index 000000000..7ef00a0a0 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/config/wormholes/premade/TestWormholeConfig.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.config.wormholes.premade; + +import com.magmaguy.elitemobs.config.wormholes.WormholeConfigFields; +import com.magmaguy.elitemobs.wormhole.Wormhole; + +public class TestWormholeConfig extends WormholeConfigFields { + public TestWormholeConfig() { + super("test_wormhole", + false, + "em_adventurers_guild,213.5,88,239.5,0,0", + "em_adventurers_guild,276.5,92,232.5,0,0", + Wormhole.WormholeStyle.CUBE); + setBlindPlayer(true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/dungeons/Arena.java b/src/main/java/com/magmaguy/elitemobs/dungeons/Arena.java new file mode 100644 index 000000000..99446df72 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/dungeons/Arena.java @@ -0,0 +1,4 @@ +package com.magmaguy.elitemobs.dungeons; + +interface Arena extends CombatContent { +} diff --git a/src/main/java/com/magmaguy/elitemobs/dungeons/CombatContent.java b/src/main/java/com/magmaguy/elitemobs/dungeons/CombatContent.java new file mode 100644 index 000000000..8cf112c65 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/dungeons/CombatContent.java @@ -0,0 +1,7 @@ +package com.magmaguy.elitemobs.dungeons; + +public interface CombatContent { + int getLowestLevel(); + + int getHighestLevel(); +} diff --git a/src/main/java/com/magmaguy/elitemobs/dungeons/Dungeon.java b/src/main/java/com/magmaguy/elitemobs/dungeons/Dungeon.java new file mode 100644 index 000000000..e46a0ba43 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/dungeons/Dungeon.java @@ -0,0 +1,5 @@ +package com.magmaguy.elitemobs.dungeons; + +public interface Dungeon extends CombatContent { + +} diff --git a/src/main/java/com/magmaguy/elitemobs/dungeons/DungeonProtector.java b/src/main/java/com/magmaguy/elitemobs/dungeons/DungeonProtector.java new file mode 100644 index 000000000..829acdaf7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/dungeons/DungeonProtector.java @@ -0,0 +1,197 @@ +package com.magmaguy.elitemobs.dungeons; + +import com.magmaguy.elitemobs.config.DungeonsConfig; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.*; +import org.bukkit.event.entity.*; +import org.bukkit.event.player.PlayerBucketEmptyEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.potion.PotionEffectType; + +import java.util.HashSet; +import java.util.Locale; +import java.util.UUID; + +public class DungeonProtector implements Listener { + private static final HashSet bypassingPlayers = new HashSet<>(); + + public static boolean toggleBypass(UUID playerUUID) { + if (bypassingPlayers.contains(playerUUID)) { + bypassingPlayers.remove(playerUUID); + return false; + } + bypassingPlayers.add(playerUUID); + return true; + } + + private boolean shouldBypass(Player player) { + return bypassingPlayers.contains(player.getUniqueId()); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void preventPlayerBlockDamage(BlockDamageEvent event) { + if (!EliteMobsWorld.isEliteMobsWorld(event.getBlock().getWorld().getUID())) return; + if (shouldBypass(event.getPlayer())) return; + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void preventPlayerBlockBreak(BlockBreakEvent event) { + if (!EliteMobsWorld.isEliteMobsWorld(event.getBlock().getWorld().getUID())) return; + if (shouldBypass(event.getPlayer())) return; + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void preventBlockBurnDamage(BlockBurnEvent event) { + if (!EliteMobsWorld.isEliteMobsWorld(event.getBlock().getWorld().getUID())) return; + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void preventPlayerBlockPlace(BlockCanBuildEvent event) { + if (!EliteMobsWorld.isEliteMobsWorld(event.getBlock().getWorld().getUID())) return; + if (event.getPlayer() != null && shouldBypass(event.getPlayer())) return; + event.setBuildable(false); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void preventBlockExplosionEvent(BlockExplodeEvent event) { + if (!EliteMobsWorld.isEliteMobsWorld(event.getBlock().getWorld().getUID())) return; + EliteMobsWorld eliteMobsWorld = EliteMobsWorld.getEliteMobsWorld(event.getBlock().getWorld().getUID()); + if (!eliteMobsWorld.isAllowExplosions()) + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void preventEntityExplosionEvent(EntityExplodeEvent event) { + if (!EliteMobsWorld.isEliteMobsWorld(event.getLocation().getWorld().getUID())) return; + EliteMobsWorld eliteMobsWorld = EliteMobsWorld.getEliteMobsWorld(event.getLocation().getWorld().getUID()); + if (!eliteMobsWorld.isAllowExplosions()) + event.blockList().clear(); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void preventTntPrimeEvent(TNTPrimeEvent event) { + if (!EliteMobsWorld.isEliteMobsWorld(event.getBlock().getWorld().getUID())) return; + EliteMobsWorld eliteMobsWorld = EliteMobsWorld.getEliteMobsWorld(event.getBlock().getWorld().getUID()); + if (!eliteMobsWorld.isAllowExplosions()) + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void preventBlockFadeEvent(BlockFadeEvent event) { + if (!EliteMobsWorld.isEliteMobsWorld(event.getBlock().getWorld().getUID())) return; + if (event.getBlock().getType().equals(Material.FROSTED_ICE)) return; + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void preventBonemeal(BlockFertilizeEvent event) { + if (!EliteMobsWorld.isEliteMobsWorld(event.getBlock().getWorld().getUID())) return; + if (event.getPlayer() != null && shouldBypass(event.getPlayer())) return; + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void preventLiquidFlow(BlockFromToEvent event) { + if (!EliteMobsWorld.isEliteMobsWorld(event.getBlock().getWorld().getUID())) return; + if (EliteMobsWorld.getEliteMobsWorld(event.getBlock().getWorld().getUID()).getDungeonPackagerConfigFields().isAllowLiquidFlow()) + return; + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void preventBlockFire(BlockIgniteEvent event) { + if (!EliteMobsWorld.isEliteMobsWorld(event.getBlock().getWorld().getUID())) return; + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void preventBlockPlace(BlockPlaceEvent event) { + if (!EliteMobsWorld.isEliteMobsWorld(event.getBlock().getWorld().getUID())) return; + if (shouldBypass(event.getPlayer())) return; + event.setCancelled(true); + } + + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void preventLiquidPlace(PlayerBucketEmptyEvent event) { + if (!EliteMobsWorld.isEliteMobsWorld(event.getBlock().getWorld().getUID())) return; + if (shouldBypass(event.getPlayer())) return; + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void preventLeafDecay(LeavesDecayEvent event) { + if (!EliteMobsWorld.isEliteMobsWorld(event.getBlock().getWorld().getUID())) return; + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void preventVanillaMobSpawning(CreatureSpawnEvent event) { + if (event.getSpawnReason().equals(CreatureSpawnEvent.SpawnReason.CUSTOM)) return; + if (!EliteMobsWorld.isEliteMobsWorld(event.getLocation().getWorld().getUID())) return; + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void preventFriendlyFireInDungeon(EntityDamageByEntityEvent event) { + if (DungeonsConfig.isFriendlyFireInDungeons()) return; + if (!EliteMobsWorld.isEliteMobsWorld(event.getEntity().getLocation().getWorld().getUID())) return; + if (!(event.getEntity() instanceof Player)) return; + if (event.getDamager() instanceof Player || event.getDamager() instanceof Projectile projectile && projectile.getShooter() instanceof Player) + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void preventDoorOpeningSpawning(PlayerInteractEvent event) { + if (!EliteMobsWorld.isEliteMobsWorld(event.getPlayer().getWorld().getUID())) return; + if (event.getClickedBlock() == null) return; + if (shouldBypass(event.getPlayer())) return; + Material material = event.getClickedBlock().getType(); + if (material.toString().toLowerCase(Locale.ROOT).endsWith("_door") || + material.toString().toLowerCase(Locale.ROOT).endsWith("_trapdoor")) + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void preventDoorOpeningSpawning(EntityChangeBlockEvent event) { + if (!EliteMobsWorld.isEliteMobsWorld(event.getEntity().getWorld().getUID())) return; + event.setCancelled(true); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void preventCobwebPotions(LingeringPotionSplashEvent event) { + if (!EliteMobsWorld.isEliteMobsWorld(event.getEntity().getWorld().getUID())) return; + if (event.getEntity().getShooter() == null) return; + if (!(event.getEntity().getShooter() instanceof Player)) return; + event.getEntity().getEffects().forEach(potionEffect -> { + if (potionEffect.getType().equals(PotionEffectType.WEAVING)) event.setCancelled(true); + }); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void preventCobwebPotions(PotionSplashEvent event) { + if (!EliteMobsWorld.isEliteMobsWorld(event.getEntity().getWorld().getUID())) return; + if (event.getEntity().getShooter() == null) return; + if (!(event.getEntity().getShooter() instanceof Player)) return; + event.getEntity().getEffects().forEach(potionEffect -> { + if (potionEffect.getType().equals(PotionEffectType.WEAVING)) event.setCancelled(true); + }); + } + + @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) + public void onPlayerInteract(PlayerInteractEvent event) { + if (!EliteMobsWorld.isEliteMobsWorld(event.getClickedBlock().getWorld().getUID())) return; + if (event.getClickedBlock() != null && event.getClickedBlock().getType() == Material.RESPAWN_ANCHOR) { + event.setCancelled(true); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/dungeons/EMPackage.java b/src/main/java/com/magmaguy/elitemobs/dungeons/EMPackage.java new file mode 100644 index 000000000..28622a17f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/dungeons/EMPackage.java @@ -0,0 +1,137 @@ +package com.magmaguy.elitemobs.dungeons; + +import com.magmaguy.elitemobs.api.DungeonInstallEvent; +import com.magmaguy.elitemobs.api.DungeonUninstallEvent; +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.npcs.NPCEntity; +import com.magmaguy.elitemobs.treasurechest.TreasureChest; +import com.magmaguy.elitemobs.utils.EventCaller; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class EMPackage { + + protected static final HashMap content = new HashMap<>(); + @Getter + private static final Map emPackages = new HashMap<>(); + @Getter + protected final DungeonPackagerConfigFields dungeonPackagerConfigFields; + @Getter + @Setter + protected boolean isDownloaded; + @Getter + @Setter + protected boolean isInstalled; + @Setter + protected boolean outOfDate = false; + @Getter + protected List customBossEntityList = new ArrayList<>(); + protected List treasureChestList = new ArrayList<>(); + protected List npcEntities = new ArrayList<>(); + + public EMPackage(DungeonPackagerConfigFields dungeonPackagerConfigFields) { + this.dungeonPackagerConfigFields = dungeonPackagerConfigFields; + emPackages.put(dungeonPackagerConfigFields.getFilename(), this); + baseInitialization(); + } + + /** + * Data gets stored under two formats: either the filename, i.e. the filename to a custom boss, or the name of a world + * for world-based content + * + * @param data name + * @return EM package associated to this data + */ + public static EMPackage getContent(String data) { + return content.get(data); + } + + public static void shutdown() { + content.clear(); + emPackages.clear(); + } + + public static void initialize(DungeonPackagerConfigFields dungeonPackagerConfigFields) { + if (dungeonPackagerConfigFields.getContentType() != null) { + switch (dungeonPackagerConfigFields.getContentType()) { + case INSTANCED_DUNGEON: + new WorldInstancedDungeonPackage(dungeonPackagerConfigFields); + break; + case OPEN_DUNGEON: + new WorldDungeonPackage(dungeonPackagerConfigFields); + break; + case HUB: + new WorldPackage(dungeonPackagerConfigFields); + break; + case SCHEMATIC_DUNGEON: + Logger.warn("Tried to load schematic dungeon " + dungeonPackagerConfigFields.getFilename() + "! This will not work because schematic dungeons have been removed as of EliteMobs 9.0 and replaced with world dungeons. If you want the schematic dungeon experience, I recommend you use BetterStructures with the elite shrines packages, which work better than schematics ever could. Fix this by deleting it from the dungeonpackager file."); + break; + } + } + } + + public boolean isOutOfDate() { + if (!isInstalled) return false; + return outOfDate; + } + + /** + * Very first initialization - checks if content is downloaded / installed, loads worlds + */ + public void baseInitialization() { + //Gets @Override by its children + } + + /** + * Initializes content - this means it associates bosses, treasure chests and NPCs to the dungeon + */ + public void initializeContent() { + //Gets @Override by its children + } + + /** + * Installation method used by world dungeons + * + * @return Whether the content was installed correctly + */ + public boolean install(Player player) { + DungeonInstallEvent event = new DungeonInstallEvent(dungeonPackagerConfigFields); + new EventCaller(event); + if (!event.isCancelled()) isInstalled = true; + return !event.isCancelled(); + } + + /** + * Installation method used by schematic packages + * + * @param player Player installing the content + * @return Whether the content was installed correctly + */ + public boolean install() { + DungeonInstallEvent event = new DungeonInstallEvent(dungeonPackagerConfigFields); + new EventCaller(event); + if (!event.isCancelled()) isInstalled = true; + return !event.isCancelled(); + } + + /** + * Uninstalls content, unloading entities, worlds and more + * + * @return Whether the uninstallation process was successful + */ + public boolean uninstall(Player player) { + DungeonUninstallEvent event = new DungeonUninstallEvent(dungeonPackagerConfigFields); + new EventCaller(event); + if (!event.isCancelled()) isInstalled = false; + return !event.isCancelled(); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/dungeons/EliteMobsWorld.java b/src/main/java/com/magmaguy/elitemobs/dungeons/EliteMobsWorld.java new file mode 100644 index 000000000..abac43260 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/dungeons/EliteMobsWorld.java @@ -0,0 +1,44 @@ +package com.magmaguy.elitemobs.dungeons; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import lombok.Getter; + +import javax.annotation.Nullable; +import java.util.HashMap; +import java.util.UUID; + +public class EliteMobsWorld { + private static final HashMap eliteMobsWorlds = new HashMap<>(); + @Getter + private final DungeonPackagerConfigFields dungeonPackagerConfigFields; + @Getter + private final boolean allowExplosions; + + private EliteMobsWorld(UUID worldUUID, DungeonPackagerConfigFields dungeonPackagerConfigFields) { + this.dungeonPackagerConfigFields = dungeonPackagerConfigFields; + this.allowExplosions = dungeonPackagerConfigFields.isAllowExplosions(); + eliteMobsWorlds.put(worldUUID, this); + } + + public static void shutdown() { + eliteMobsWorlds.clear(); + } + + @Nullable + public static EliteMobsWorld getEliteMobsWorld(UUID worldUUID) { + return eliteMobsWorlds.get(worldUUID); + } + + public static boolean isEliteMobsWorld(UUID worldUUID) { + return eliteMobsWorlds.containsKey(worldUUID); + } + + public static void create(UUID woldUUID, DungeonPackagerConfigFields dungeonPackagerConfigFields) { + new EliteMobsWorld(woldUUID, dungeonPackagerConfigFields); + } + + public static void destroy(UUID worldUUID) { + eliteMobsWorlds.remove(worldUUID); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/dungeons/WorldDungeonPackage.java b/src/main/java/com/magmaguy/elitemobs/dungeons/WorldDungeonPackage.java new file mode 100644 index 000000000..81b150fa3 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/dungeons/WorldDungeonPackage.java @@ -0,0 +1,103 @@ +package com.magmaguy.elitemobs.dungeons; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.dungeons.utility.DungeonUtils; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.custombosses.RegionalBossEntity; +import com.magmaguy.elitemobs.npcs.NPCEntity; +import com.magmaguy.elitemobs.treasurechest.TreasureChest; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.entity.Player; + +/** + * This class is specifically for world-based dungeons + */ +public class WorldDungeonPackage extends WorldPackage implements Dungeon { + private int lowestLevel; + private int highestLevel; + @Getter + private World wormholeWorld = null; + + public WorldDungeonPackage(DungeonPackagerConfigFields dungeonPackagerConfigFields) { + super(dungeonPackagerConfigFields); + } + + @Override + public void baseInitialization() { + super.baseInitialization(); + initializeWormholeWorld(); + } + + private void initializeWormholeWorld() { + if (dungeonPackagerConfigFields.getWormholeWorldName() != null && + !dungeonPackagerConfigFields.getWormholeWorldName().isEmpty() && + Bukkit.getWorld(dungeonPackagerConfigFields.getWormholeWorldName()) == null) { + wormholeWorld = DungeonUtils.loadWorld(this.getDungeonPackagerConfigFields().getWormholeWorldName(), this.getDungeonPackagerConfigFields().getEnvironment(), dungeonPackagerConfigFields); + } + } + + @Override + public void initializeContent() { + super.initializeContent(); + if (isInstalled) { + getEntities(); + qualifyEntities(); + getChests(); + getNPCs(); + } + } + + @Override + public boolean uninstall(Player player) { + if (!super.uninstall(player)) return false; + customBossEntityList.clear(); + treasureChestList.clear(); + return true; + } + + private void getEntities() { + for (RegionalBossEntity regionalBossEntity : RegionalBossEntity.getRegionalBossEntitySet()) + if (regionalBossEntity != null && + regionalBossEntity.getWorldName() != null && + world != null && + regionalBossEntity.getWorldName().equals(world.getName()) || + wormholeWorld != null && regionalBossEntity.getWorldName().equals(wormholeWorld.getName())) + customBossEntityList.add(regionalBossEntity); + } + + private void qualifyEntities() { + //Initialize data related to the highest and lowest levels for informational purposes + DungeonUtils.Pair lowestAndHighestValues = DungeonUtils.getLowestAndHighestLevels(customBossEntityList); + this.lowestLevel = lowestAndHighestValues.getLowestValue(); + this.highestLevel = lowestAndHighestValues.getHighestValue(); + } + + private void getChests() { + for (TreasureChest treasureChest : TreasureChest.getTreasureChestHashMap().values()) + if (treasureChest.getWorldName() != null && world != null && treasureChest.getWorldName().equals(world.getName()) || + wormholeWorld != null && + treasureChest.getWorldName().equals(wormholeWorld.getName())) + treasureChestList.add(treasureChest); + } + + private void getNPCs() { + if (world == null) return; + for (NPCEntity npcEntity : EntityTracker.getNpcEntities().values()) + if (npcEntity.getWorldName().equals(world.getName()) || + wormholeWorld != null && + npcEntity.getWorldName().equals(wormholeWorld.getName())) + npcEntities.add(npcEntity); + } + + @Override + public int getLowestLevel() { + return lowestLevel; + } + + @Override + public int getHighestLevel() { + return highestLevel; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/dungeons/WorldInstancedDungeonPackage.java b/src/main/java/com/magmaguy/elitemobs/dungeons/WorldInstancedDungeonPackage.java new file mode 100644 index 000000000..efee487af --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/dungeons/WorldInstancedDungeonPackage.java @@ -0,0 +1,78 @@ +package com.magmaguy.elitemobs.dungeons; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfig; +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Logger; +import org.apache.commons.io.FileUtils; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.io.File; + +public class WorldInstancedDungeonPackage extends EMPackage implements CombatContent { + private int level; + + public WorldInstancedDungeonPackage(DungeonPackagerConfigFields dungeonPackagerConfigFields) { + super(dungeonPackagerConfigFields); + } + + @Override + public void baseInitialization() { + super.baseInitialization(); + this.level = dungeonPackagerConfigFields.getContentLevel(); + File file = new File(MetadataHandler.PLUGIN.getDataFolder().getAbsolutePath() + + File.separatorChar + "world_blueprints" + File.separatorChar + dungeonPackagerConfigFields.getDungeonConfigFolderName()); + if (!file.exists()) { + this.isDownloaded = false; + this.isInstalled = false; + return; + } else { + //This removes all instanced worlds not previously correctly removed + for (File worldFile : Bukkit.getWorldContainer().listFiles()){ + if (worldFile.getName().contains(file.getName()) && worldFile.getName().matches(".*_\\d{1,2}$")) { + try{ + FileUtils.deleteDirectory(worldFile); + Logger.info("Removing previously instanced world " + worldFile.getName());}catch (Exception e){ + Logger.warn("Failed to remove previously instanced world " + worldFile.getName()); + } + } + } + } + this.isDownloaded = true; + this.isInstalled = dungeonPackagerConfigFields.isEnabled(); + } + + @Override + public boolean install(Player player) { + dungeonPackagerConfigFields.simpleInstall(); + this.isInstalled = true; + player.sendMessage(ChatColorConverter.convert("&2Dungeon " + dungeonPackagerConfigFields.getFilename() + " installed!")); + if (!dungeonPackagerConfigFields.isEnchantmentChallenge()) { + player.sendMessage(ChatColorConverter.convert("&6Instanced dungeons must be accessed either through the &a/em &6menu or an NPC! NPCs for premade EliteMobs content can be found at the Adventurer's Guild Hub map.")); + player.sendMessage("Remember that instanced dungeons create a world when you join them and remove that world when you are done playing in them!"); + } else { + player.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &2Enchantment instanced dungeon installed! This dungeon can only be accessed when attempting to enchant items and getting a challenge as a result!")); + DungeonPackagerConfig.getEnchantedChallengeDungeonPackages().put(dungeonPackagerConfigFields.getFilename(), dungeonPackagerConfigFields); + } + return true; + } + + @Override + public boolean uninstall(Player player) { + dungeonPackagerConfigFields.simpleUninstall(); + this.isInstalled = false; + return true; + } + + @Override + public int getLowestLevel() { + return level; + } + + @Override + public int getHighestLevel() { + return level; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/dungeons/WorldPackage.java b/src/main/java/com/magmaguy/elitemobs/dungeons/WorldPackage.java new file mode 100644 index 000000000..dac8d1c87 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/dungeons/WorldPackage.java @@ -0,0 +1,95 @@ +package com.magmaguy.elitemobs.dungeons; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.dungeons.utility.DungeonUtils; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomMusic; +import com.magmaguy.elitemobs.wormhole.Wormhole; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.entity.Player; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Paths; + +public class WorldPackage extends EMPackage { + + @Getter + protected World world; + + public WorldPackage(DungeonPackagerConfigFields dungeonPackagerConfigFields) { + super(dungeonPackagerConfigFields); + } + + @Override + public void baseInitialization() { + super.baseInitialization(); + if (dungeonPackagerConfigFields.getWorldName() == null || dungeonPackagerConfigFields.getWorldName().isEmpty()) { + this.isDownloaded = this.isInstalled = false; + Logger.warn("Packaged content " + dungeonPackagerConfigFields.getFilename() + " does not have a valid world name in the dungeon packager!"); + return; + } + + content.put(dungeonPackagerConfigFields.getWorldName(), this); + if (dungeonPackagerConfigFields.getWormholeWorldName() != null && + !dungeonPackagerConfigFields.getWormholeWorldName().isEmpty()) + content.put(dungeonPackagerConfigFields.getWormholeWorldName(), this); + + //Check if the world's been loaded + if (Bukkit.getWorld(dungeonPackagerConfigFields.getWorldName()) != null) { + this.isDownloaded = this.isInstalled = true; + world = Bukkit.getWorld(dungeonPackagerConfigFields.getWorldName()); + EliteMobsWorld.create(world.getUID(), dungeonPackagerConfigFields); + dungeonPackagerConfigFields.initializeWorld(); + return; + } + + //Since the world isn't loaded, check if it should be + this.isInstalled = dungeonPackagerConfigFields.isEnabled(); + + //Check if the world's been downloaded + isDownloaded = Files.exists(Paths.get(Bukkit.getWorldContainer() + File.separator + dungeonPackagerConfigFields.getWorldName())); + + if (isDownloaded && isInstalled) { + world = DungeonUtils.loadWorld(this); + if (dungeonPackagerConfigFields.getSong() != null) + new CustomMusic(dungeonPackagerConfigFields.getSong(), dungeonPackagerConfigFields, world); + dungeonPackagerConfigFields.initializeWorld(); + } else isInstalled = false; + } + + + @Override + public boolean install(Player player) { + if (!super.install(player)) return false; + DungeonUtils.loadWorld(this); + dungeonPackagerConfigFields.installWorld(); + player.teleport(dungeonPackagerConfigFields.getTeleportLocation()); + world = dungeonPackagerConfigFields.getTeleportLocation().getWorld(); + if (dungeonPackagerConfigFields.getSong() != null) + new CustomMusic(dungeonPackagerConfigFields.getSong(), dungeonPackagerConfigFields, world); +// WorldGuardCompatibility.protectWorldMinidugeonArea(dungeonPackagerConfigFields.getTeleportLocation()); + for (Wormhole wormhole : Wormhole.getWormholes()) + wormhole.onDungeonInstall(dungeonPackagerConfigFields.getFilename()); + player.sendMessage(ChatColorConverter.convert("[EliteMobs] Successfully installed " + dungeonPackagerConfigFields.getName() + "! To uninstall, do /em setup again and click on this content again.")); + return true; + } + + @Override + public boolean uninstall(Player player) { + if (!super.uninstall(player)) return false; + if (!DungeonUtils.unloadWorld(this)) { + isInstalled = true; + return false; + } + for (Wormhole wormhole : Wormhole.getWormholes()) + wormhole.onDungeonUninstall(dungeonPackagerConfigFields.getFilename()); + dungeonPackagerConfigFields.uninstallWorld(); + world = null; + return true; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/dungeons/utility/DungeonUtils.java b/src/main/java/com/magmaguy/elitemobs/dungeons/utility/DungeonUtils.java new file mode 100644 index 000000000..65069d565 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/dungeons/utility/DungeonUtils.java @@ -0,0 +1,79 @@ +package com.magmaguy.elitemobs.dungeons.utility; + +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.dungeons.EliteMobsWorld; +import com.magmaguy.elitemobs.dungeons.WorldDungeonPackage; +import com.magmaguy.elitemobs.dungeons.WorldPackage; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.magmacore.util.WorldLoader; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.World; +import org.bukkit.entity.Player; + +import java.util.List; + +public class DungeonUtils { + public static Pair getLowestAndHighestLevels(List customBossEntities) { + int lowestLevel = 0; + int highestLevel = 0; + + for (CustomBossEntity customBossEntity : customBossEntities) { + try { + int level = customBossEntity.getLevel(); + lowestLevel = lowestLevel == 0 ? level : Math.min(lowestLevel, level); + highestLevel = highestLevel == 0 ? level : Math.max(highestLevel, level); + } catch (Exception ex) { + } + } + return new Pair(lowestLevel, highestLevel); + } + + public static World loadWorld(WorldPackage worldPackage) { + String worldName = worldPackage.getDungeonPackagerConfigFields().getWorldName(); + World.Environment environment = worldPackage.getDungeonPackagerConfigFields().getEnvironment(); + World world = loadWorld(worldName, environment, worldPackage.getDungeonPackagerConfigFields()); + if (worldPackage.getDungeonPackagerConfigFields().getWormholeWorldName() != null) + loadWorld(worldPackage.getDungeonPackagerConfigFields().getWormholeWorldName(), environment, worldPackage.getDungeonPackagerConfigFields()); + if (world != null) worldPackage.setInstalled(true); + return world; + } + + public static World loadWorld(String worldName, World.Environment environment, DungeonPackagerConfigFields dungeonPackagerConfigFields) { + World world = WorldLoader.loadVoidTemporaryWorld(worldName, environment); + if (world != null) EliteMobsWorld.create(world.getUID(), dungeonPackagerConfigFields); + return world; + } + + public static boolean unloadWorld(WorldPackage worldPackage) { + World defaultWorld = Bukkit.getWorlds().get(0); + World wormholeWorld = null; + if (worldPackage instanceof WorldDungeonPackage && ((WorldDungeonPackage) worldPackage).getWormholeWorld() != null) + wormholeWorld = ((WorldDungeonPackage) worldPackage).getWormholeWorld(); + for (Player player : Bukkit.getOnlinePlayers()) + if (player.getWorld() == worldPackage.getWorld() || player.getWorld() == wormholeWorld) + if (defaultWorld == null) + return false; + else + player.teleport(defaultWorld.getSpawnLocation()); + Bukkit.unloadWorld(worldPackage.getWorld(), false); + if (worldPackage instanceof WorldDungeonPackage && ((WorldDungeonPackage) worldPackage).getWormholeWorld() != null) + Bukkit.unloadWorld(((WorldDungeonPackage) worldPackage).getWormholeWorld(), false); + + EliteMobsWorld.destroy(worldPackage.getWorld().getUID()); + + return true; + } + + public static class Pair { + @Getter + Integer lowestValue; + @Getter + Integer highestValue; + + public Pair(Integer lowestValue, Integer highestValue) { + this.lowestValue = lowestValue; + this.highestValue = highestValue; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/economy/EconomyHandler.java b/src/main/java/com/magmaguy/elitemobs/economy/EconomyHandler.java index 20d81626e..9a7c05450 100644 --- a/src/main/java/com/magmaguy/elitemobs/economy/EconomyHandler.java +++ b/src/main/java/com/magmaguy/elitemobs/economy/EconomyHandler.java @@ -1,24 +1,7 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package com.magmaguy.elitemobs.economy; -import com.magmaguy.elitemobs.config.PlayerMoneyData; -import com.magmaguy.elitemobs.playerdata.PlayerData; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.magmacore.util.Round; import java.util.UUID; @@ -27,84 +10,46 @@ */ public class EconomyHandler { - private static PlayerMoneyData playerMoneyData = new PlayerMoneyData(); - public static void addCurrency(UUID user, double amount) { - - if (!checkUserExists(user)) createUser(user); - - PlayerData.playerCurrency.put(user, roundDecimals(checkCurrency(user) + amount)); - PlayerData.playerCurrencyChanged = true; - + if (VaultCompatibility.VAULT_ENABLED) { + VaultCompatibility.addVaultCurrency(user, amount); + return; + } + PlayerData.setCurrency(user, Round.twoDecimalPlaces(checkCurrency(user) + amount)); } public static void subtractCurrency(UUID user, double amount) { - - if (!checkUserExists(user)) createUser(user); - - PlayerData.playerCurrency.put(user, roundDecimals(checkCurrency(user) - amount)); - PlayerData.playerCurrencyChanged = true; - + if (VaultCompatibility.VAULT_ENABLED) { + VaultCompatibility.subtractCurrency(user, amount); + return; + } + PlayerData.setCurrency(user, Round.twoDecimalPlaces(checkCurrency(user) - amount)); } public static void setCurrency(UUID user, double amount) { - if (!checkUserExists(user)) createUser(user); + if (VaultCompatibility.VAULT_ENABLED) { + VaultCompatibility.setCurrency(user, amount); + return; + } - PlayerData.playerCurrency.put(user, roundDecimals(amount)); - PlayerData.playerCurrencyChanged = true; + PlayerData.setCurrency(user, Round.twoDecimalPlaces(amount)); } public static double checkCurrency(UUID user) { + if (VaultCompatibility.VAULT_ENABLED) + return VaultCompatibility.checkCurrency(user); - if (!checkUserExists(user)) - createUser(user); - - return PlayerData.playerCurrency.get(user); - + return PlayerData.getCurrency(user); } - private static void createUser(UUID uuid) { - - PlayerData.playerCurrency.put(uuid, 0.0); - PlayerData.playerCurrencyChanged = true; - - } - - private static boolean checkUserExists(UUID uuid) { - - checkUserIsCached(uuid); - return PlayerData.playerCurrency.containsKey(uuid); - - } - - private static void checkUserIsCached(UUID uuid) { - - boolean playerIsOnline = false; - - for (Player player : Bukkit.getOnlinePlayers()) - if(player.getUniqueId().equals(uuid)){ - playerIsOnline = true; - break; - } - - - if (!PlayerData.playerDisplayName.containsKey(uuid) || playerIsOnline && - !PlayerData.playerDisplayName.get(uuid).equals(Bukkit.getPlayer(uuid).getDisplayName())) { - - PlayerData.playerDisplayName.put(uuid, Bukkit.getPlayer(uuid).getDisplayName()); - PlayerData.playerCacheChanged = true; - - } - - } - - private static double roundDecimals(double rawValue) { - - return (double) Math.round(rawValue * 100) / 100; + public static double checkCurrency(UUID user, boolean databaseAccess) { + if (VaultCompatibility.VAULT_ENABLED) + return VaultCompatibility.checkCurrency(user); + return PlayerData.getCurrency(user, databaseAccess); } } diff --git a/src/main/java/com/magmaguy/elitemobs/economy/UUIDFilter.java b/src/main/java/com/magmaguy/elitemobs/economy/UUIDFilter.java deleted file mode 100644 index bbe1da6c2..000000000 --- a/src/main/java/com/magmaguy/elitemobs/economy/UUIDFilter.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.economy; - -import com.magmaguy.elitemobs.playerdata.PlayerData; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.entity.Player; - -import java.util.UUID; - -/** - * Created by MagmaGuy on 20/06/2017. - */ -public class UUIDFilter { - - public static UUID guessUUI(String string) { - - for (Player player : Bukkit.getOnlinePlayers()) { - - if (player.getName().equalsIgnoreCase(string) || player.getDisplayName().equalsIgnoreCase(string)) { - - return player.getUniqueId(); - - } - - } - - for (UUID uuid : PlayerData.playerDisplayName.keySet()) { - - if (ChatColor.stripColor(PlayerData.playerDisplayName.get(uuid)).equalsIgnoreCase(string)) - return uuid; - - } - - return null; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/economy/VaultCompatibility.java b/src/main/java/com/magmaguy/elitemobs/economy/VaultCompatibility.java new file mode 100644 index 000000000..169169996 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/economy/VaultCompatibility.java @@ -0,0 +1,69 @@ +package com.magmaguy.elitemobs.economy; + +import com.magmaguy.elitemobs.config.EconomySettingsConfig; +import com.magmaguy.magmacore.util.Logger; +import net.milkbowl.vault.economy.Economy; +import org.bukkit.Bukkit; +import org.bukkit.plugin.RegisteredServiceProvider; + +import java.util.UUID; + +public class VaultCompatibility { + + public static boolean VAULT_ENABLED = false; + private static Economy econ = null; + + public static void vaultSetup() { + if (Bukkit.getServer().getPluginManager().isPluginEnabled("Vault")) { + Logger.info("[(EliteMobs] Vault detected."); + if (EconomySettingsConfig.isUseVault()) { + Logger.warn("Vault preference detected. This is not the recommended setting. " + + "Ask the dev or check the wiki as to why."); + VAULT_ENABLED = true; + VaultCompatibility.setupEconomy(); + } + + } + } + + public static void setupEconomy() { + if (Bukkit.getServer().getPluginManager().getPlugin("Vault") == null) { + return; + } + RegisteredServiceProvider rsp = Bukkit.getServer().getServicesManager().getRegistration(Economy.class); + if (rsp == null) { + return; + } + econ = rsp.getProvider(); + } + + public static void addVaultCurrency(UUID user, double amount) { + econ.depositPlayer(Bukkit.getOfflinePlayer(user), amount); + } + + public static void subtractCurrency(UUID user, double amount) { + econ.withdrawPlayer(Bukkit.getOfflinePlayer(user), amount); + } + + public static void setCurrency(UUID user, double amount) { + Logger.warn("Someone just attempted to set the Vault currency through EliteMobs." + + " For safety reasons, this command is off. Please use your dedicated economy plugin for this."); + } + + public static double checkCurrency(UUID user) { + double currency = 0; + try { + currency = econ.getBalance(Bukkit.getOfflinePlayer(user)); + } catch (NullPointerException e) { + Logger.warn("Player tried to check currency when they had no economy entry" + + "associated to them. This is an issue with your Vault/economy implementation, not EliteMobs."); + } + return currency; + + } + + public static Economy getEconomy() { + return econ; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/entitytracker/CustomProjectileData.java b/src/main/java/com/magmaguy/elitemobs/entitytracker/CustomProjectileData.java new file mode 100644 index 000000000..af143725f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/entitytracker/CustomProjectileData.java @@ -0,0 +1,72 @@ +package com.magmaguy.elitemobs.entitytracker; + +import com.magmaguy.elitemobs.MetadataHandler; +import lombok.Getter; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.entity.Trident; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.ProjectileHitEvent; +import org.bukkit.event.entity.ProjectileLaunchEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.HashMap; + +public class CustomProjectileData implements Listener { + @Getter + private static final HashMap customProjectileDataHashMap = new HashMap<>(); + private final Player player; + @Getter + private ItemStack projectileShooter = null; + @Getter + private Material projectileShooterMaterial = null; + + private CustomProjectileData(Player player, Projectile projectile) { + this.player = player; + if (projectile instanceof Trident trident) { + projectileShooter = trident.getItem(); + projectileShooterMaterial = Material.TRIDENT; + return; + } + if (player.getInventory().getItemInMainHand().getType() == Material.BOW || player.getInventory().getItemInMainHand().getType() == Material.CROSSBOW) { + projectileShooter = player.getInventory().getItemInMainHand(); + projectileShooterMaterial = projectileShooter.getType(); + } else if (player.getInventory().getItemInOffHand().getType() == Material.BOW || player.getInventory().getItemInOffHand().getType() == Material.CROSSBOW) { + projectileShooter = player.getInventory().getItemInOffHand(); + projectileShooterMaterial = projectileShooter.getType(); + } + } + + public static void shutdown() { + customProjectileDataHashMap.clear(); + } + + @EventHandler + public void onPlayerFireProjectile(ProjectileLaunchEvent event) { + if (event.getEntity().getShooter() == null || !(event.getEntity().getShooter() instanceof Player player)) + return; + customProjectileDataHashMap.put(event.getEntity(), new CustomProjectileData(player, event.getEntity())); + //Cull entity 5 minutes later to avoid leaking + new BukkitRunnable() { + @Override + public void run() { + customProjectileDataHashMap.remove(event.getEntity()); + } + }.runTaskLater(MetadataHandler.PLUGIN, 60 * 20 * 5); + } + + @EventHandler + public void onArrowLandEvent(ProjectileHitEvent event) { + if (customProjectileDataHashMap.containsKey(event.getEntity())) + //Delay removal by 1 just in case the data needs to be used for some event that runs after the hit event + new BukkitRunnable() { + @Override + public void run() { + customProjectileDataHashMap.remove(event.getEntity()); + } + }.runTaskLater(MetadataHandler.PLUGIN, 1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/entitytracker/EntityTracker.java b/src/main/java/com/magmaguy/elitemobs/entitytracker/EntityTracker.java new file mode 100644 index 000000000..9b2aaaeff --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/entitytracker/EntityTracker.java @@ -0,0 +1,216 @@ +package com.magmaguy.elitemobs.entitytracker; + +import com.magmaguy.elitemobs.CrashFix; +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobSpawnEvent; +import com.magmaguy.elitemobs.api.NPCEntitySpawnEvent; +import com.magmaguy.elitemobs.api.internal.RemovalReason; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.npcs.NPCEntity; +import com.magmaguy.elitemobs.tagger.PersistentTagger; +import com.magmaguy.elitemobs.utils.EventCaller; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.Chunk; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Projectile; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.world.ChunkUnloadEvent; +import org.bukkit.event.world.WorldUnloadEvent; +import org.bukkit.scheduler.BukkitRunnable; + +import javax.annotation.Nullable; +import java.util.HashMap; +import java.util.HashSet; +import java.util.UUID; + +public class EntityTracker implements Listener { + + @Getter + private static final HashMap eliteMobEntities = new HashMap<>(); + @Getter + private static final HashMap npcEntities = new HashMap<>(); + @Getter + private static final HashSet temporaryBlocks = new HashSet<>(); + + public static void registerEliteMob(EliteEntity eliteEntity) { + EliteMobSpawnEvent eliteMobSpawnEvent = new EliteMobSpawnEvent(eliteEntity); + new EventCaller(eliteMobSpawnEvent); + if (eliteMobSpawnEvent.isCancelled()) return; + PersistentTagger.tagElite(eliteEntity.getLivingEntity(), eliteEntity.getEliteUUID()); + eliteMobEntities.put(eliteEntity.getEliteUUID(), eliteEntity); + } + + public static void registerEliteMob(EliteEntity eliteEntity, LivingEntity livingEntity) { + EliteMobSpawnEvent eliteMobSpawnEvent = new EliteMobSpawnEvent(eliteEntity); + new EventCaller(eliteMobSpawnEvent); + if (eliteMobSpawnEvent.isCancelled()) return; + PersistentTagger.tagElite(livingEntity, eliteEntity.getEliteUUID()); + eliteMobEntities.put(eliteEntity.getEliteUUID(), eliteEntity); + } + + public static boolean isEliteMob(Entity entity) { + return PersistentTagger.isEliteEntity(entity); + } + + @Nullable + public static EliteEntity getEliteMobEntity(Entity entity) { + return PersistentTagger.getEliteEntity(entity); + } + + public static void unregisterEliteEntity(Entity entity, RemovalReason removalReason) { + EliteEntity eliteEntity = getEliteMobEntity(entity); + if (eliteEntity == null) return; + //Removal from the hashmap is not guaranteed here as some forms of removal don't completely wipe the elite entity out + eliteEntity.remove(removalReason); + } + + public static void registerVisualEffects(Entity entity) { + PersistentTagger.tagVisualEffect(entity); + } + + public static boolean isVisualEffect(Entity entity) { + return PersistentTagger.isVisualEffect(entity); + } + + public static void unregisterVisualEffect(Entity entity) { + if (isVisualEffect(entity)) entity.remove(); + } + + public static void registerNPCEntity(NPCEntity npc) { + NPCEntitySpawnEvent npcEntitySpawnEvent = new NPCEntitySpawnEvent(npc.getVillager(), npc); + new EventCaller(npcEntitySpawnEvent); + if (npcEntitySpawnEvent.isCancelled()) return; + npcEntities.put(npc.getUuid(), npc); + PersistentTagger.tagNPC(npc.getVillager(), npc.getUuid()); + } + + public static boolean isNPCEntity(Entity entity) { + return PersistentTagger.isNPC(entity); + } + + public static NPCEntity getNPCEntity(Entity entity) { + return PersistentTagger.getNPC(entity); + } + + public static void unregisterNPCEntity(Entity entity, RemovalReason removalReason) { + NPCEntity npcEntity = getNPCEntity(entity); + if (npcEntity == null) return; + //Removal from the hashmap is not guaranteed here as some forms of removal don't completely wipe the elite entity out + npcEntity.remove(removalReason); + } + + //Temporary blocks - blocks in powers + public static void addTemporaryBlock(Block block, int ticks, Material replacementMaterial) { + BlockData previousBlockData = block.getBlockData().clone(); + if (temporaryBlocks.contains(block)) previousBlockData = null; + //Don't override death banners, this causes issues + if (temporaryBlocks.contains(block) && block.getType().equals(Material.RED_BANNER)) return; + temporaryBlocks.add(block); + block.setType(replacementMaterial); + UUID worldUUID = block.getWorld().getUID(); + BlockData finalPreviousBlockData = previousBlockData; + //Death banners for instanced content don't timeout + if (ticks < 0) return; + new BukkitRunnable() { + @Override + public void run() { + if (Bukkit.getWorld(worldUUID) == null) return; + temporaryBlocks.remove(block); + if (!block.getBlockData().equals(finalPreviousBlockData)) + if (finalPreviousBlockData != null) + //Case if a temp block was placed and now needs to be restored + block.setBlockData(finalPreviousBlockData); + else + //Case if a temp block was placed on a temp block + block.setType(Material.AIR); + } + }.runTaskLater(MetadataHandler.PLUGIN, ticks); + } + + public static boolean isTemporaryBlock(Block block) { + return temporaryBlocks.contains(block); + } + + public static void removeTemporaryBlock(Block block) { + temporaryBlocks.remove(block); + } + + //Projectile entities - Minecraft already stores data about who fired them, so just simple entities. + //NOTE: there are no events for firing elitemobs projectiles, does not seem like it would serve a good function as of right now + public static void registerProjectileEntity(Projectile projectile) { + PersistentTagger.tagEliteProjectile(projectile); + } + + public static boolean isProjectileEntity(Entity entity) { + return PersistentTagger.isEliteProjectile(entity); + } + + public static void unregisterProjectileEntity(Entity entity) { + if (isProjectileEntity(entity)) entity.remove(); + } + + public static void unregister(Entity entity, RemovalReason removalReason) { + unregisterEliteEntity(entity, removalReason); + unregisterVisualEffect(entity); + unregisterProjectileEntity(entity); + unregisterNPCEntity(entity, removalReason); + } + + public static void wipeChunk(Chunk chunk, RemovalReason removalReason) { + for (Entity entity : chunk.getEntities()) + unregister(entity, removalReason); + } + + public static void wipeWorld(World world, RemovalReason removalReason) { + for (Chunk chunk : world.getLoadedChunks()) + wipeChunk(chunk, removalReason); + } + + public static void wipeShutdown() { + for (EliteEntity eliteEntity : ((HashMap) eliteMobEntities.clone()).values()) + eliteEntity.remove(RemovalReason.SHUTDOWN); + getEliteMobEntities().clear(); + for (NPCEntity npcEntity : ((HashMap) npcEntities.clone()).values()) + npcEntity.remove(RemovalReason.SHUTDOWN); + getNpcEntities().clear(); + for (Block block : temporaryBlocks) + block.setType(Material.AIR); + temporaryBlocks.clear(); + //Necessary for things such as visual effects which are not stored in memory, only tagged + for (World world : Bukkit.getWorlds()) + for (Entity entity : world.getEntities()) + unregister(entity, RemovalReason.SHUTDOWN); + CustomBossEntity.getTrackableCustomBosses().clear(); + CrashFix.knownSessionChunks.clear(); + } + + + //Events + @EventHandler(ignoreCancelled = true) + public void onUnload(ChunkUnloadEvent event) { + EntityTracker.wipeChunk(event.getChunk(), RemovalReason.CHUNK_UNLOAD); + } + + @EventHandler(ignoreCancelled = true) + public void onWorldUnload(WorldUnloadEvent event) { + EntityTracker.wipeWorld(event.getWorld(), RemovalReason.WORLD_UNLOAD); + temporaryBlocks.removeIf(block -> block.getWorld().equals(event.getWorld())); + } + + @EventHandler(ignoreCancelled = true) + public void onMine(BlockBreakEvent event) { + if (!isTemporaryBlock(event.getBlock())) return; + event.setDropItems(false); + removeTemporaryBlock(event.getBlock()); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/events/ActionEvent.java b/src/main/java/com/magmaguy/elitemobs/events/ActionEvent.java new file mode 100644 index 000000000..43dd58b52 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/events/ActionEvent.java @@ -0,0 +1,162 @@ +package com.magmaguy.elitemobs.events; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.adventurersguild.GuildRank; +import com.magmaguy.elitemobs.api.CustomEventStartEvent; +import com.magmaguy.elitemobs.config.EventsConfig; +import com.magmaguy.elitemobs.config.customevents.CustomEventsConfig; +import com.magmaguy.elitemobs.config.customevents.CustomEventsConfigFields; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.player.PlayerFishEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class ActionEvent extends CustomEvent { + + private static final List blueprintEvents = new ArrayList<>(); + private static final HashSet playerCooldowns = new HashSet<>(); + private final double chance; + private final List breakableMaterials; + private Player player; + + public ActionEvent(CustomEventsConfigFields customEventsConfigFields) { + super(customEventsConfigFields); + this.chance = customEventsConfigFields.getChance(); + this.breakableMaterials = customEventsConfigFields.getBreakableMaterials(); + setPrimaryCustomBossFilenames(primaryCustomBossFilenames); + } + + public static void shutdown() { + blueprintEvents.clear(); + playerCooldowns.clear(); + } + + /** + * Initializes events directly from the configuration files, and keeps a copy to run checks over in order to instantiate + * events for the server to run + */ + public static void initializeBlueprintEvents() { + if (!EventsConfig.isActionEventsEnabled()) return; + for (CustomEventsConfigFields customEventsConfigFields : CustomEventsConfig.getCustomEvents().values()) { + if (customEventsConfigFields.isEnabled()) + switch (customEventsConfigFields.getEventType()) { + case BREAK_BLOCK, FISH, TILL_SOIL: + blueprintEvents.add(new ActionEvent(customEventsConfigFields)); + break; + default: + break; + } + } + } + + public boolean checkBlockBreakStartConditions(Material material) { + if (ThreadLocalRandom.current().nextDouble() >= chance) return false; + return breakableMaterials.contains(material); + } + + public boolean checkFishStartConditions() { + return ThreadLocalRandom.current().nextDouble() < chance; + } + + public boolean checkTillSoilStartConditions() { + return ThreadLocalRandom.current().nextDouble() < chance; + } + + public void instantiateEvent(Location location, Player player) { + this.player = player; + //Peaceful mode players should not count + if (GuildRank.isAtOrAboveGuildRank(player, 0, 0)) return; + ActionEvent actionEvent = new ActionEvent(customEventsConfigFields); + actionEvent.setEventStartLocation(location); + CustomEventStartEvent customEventStartEvent = new CustomEventStartEvent(actionEvent); + if (customEventStartEvent.isCancelled()) return; + if (!actionEvent.startConditions.areValid()) return; + + for (String filename : primaryCustomBossFilenames) { + CustomBossEntity customBossEntity = CustomBossEntity.createCustomBossEntity(filename); + if (customBossEntity == null) { + Logger.warn("Failed to generate custom boss " + filename + " ! This has cancelled action event " + customEventsConfigFields.getFilename() + " !"); + return; + } + customBossEntity.spawn(actionEvent.getEventStartLocation(), false); + actionEvent.primaryEliteMobs.add(customBossEntity); + } + + actionEvent.start(); + } + + @Override + public void startModifiers() { + playerCooldowns.add(player); + Bukkit.getScheduler().runTaskLater(MetadataHandler.PLUGIN, () -> playerCooldowns.remove(player), 20L * 60L * EventsConfig.getActionEventMinimumCooldown()); + } + + @Override + public void eventWatchdog() { + //Nothing really for the duration here + } + + @Override + public void endModifiers() { + //No need to track action events + } + + public static class ActionEventEvents implements Listener { + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + public void onBlockBreakEvent(BlockBreakEvent event) { + if (playerCooldowns.contains(event.getPlayer())) return; + if (!CustomEvent.isLocationValid(event.getBlock().getLocation())) return; + for (ActionEvent actionEvent : blueprintEvents) + if (actionEvent.eventType.equals(EventType.BREAK_BLOCK) && + actionEvent.checkBlockBreakStartConditions(event.getBlock().getType())) + actionEvent.instantiateEvent(event.getBlock().getLocation().clone().add(new Vector(0.5, 0, 0.5)), event.getPlayer()); + } + + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + public void onFishEvent(PlayerFishEvent event) { + if (event.getCaught() == null) return; + if (playerCooldowns.contains(event.getPlayer())) return; + if (!CustomEvent.isLocationValid(event.getCaught().getLocation())) return; + for (ActionEvent actionEvent : blueprintEvents) + if (actionEvent.eventType.equals(EventType.FISH) && actionEvent.checkFishStartConditions()) + actionEvent.instantiateEvent(event.getCaught().getLocation(), event.getPlayer()); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + public void onTillSoil(PlayerInteractEvent event) { + if (!event.getAction().equals(Action.RIGHT_CLICK_BLOCK)) return; + if (event.getClickedBlock() == null) return; + if (playerCooldowns.contains(event.getPlayer())) return; + Location location = event.getClickedBlock().getLocation().clone().add(new Vector(0.5, 1, 0.5)); + if (!CustomEvent.isLocationValid(location)) return; + if (!(event.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.DIAMOND_HOE) || + event.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.IRON_HOE) || + event.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.GOLDEN_HOE) || + event.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.STONE_HOE) || + event.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.WOODEN_HOE) || + event.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.NETHERITE_HOE))) + return; + if (!(event.getClickedBlock().getType().equals(Material.DIRT) || + event.getClickedBlock().getType().equals(Material.GRASS_BLOCK))) return; + for (ActionEvent actionEvent : blueprintEvents) + if (actionEvent.eventType.equals(EventType.TILL_SOIL) && actionEvent.checkTillSoilStartConditions()) + actionEvent.instantiateEvent(location, event.getPlayer()); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/events/BossCustomAttackDamage.java b/src/main/java/com/magmaguy/elitemobs/events/BossCustomAttackDamage.java new file mode 100644 index 000000000..5b9ba2806 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/events/BossCustomAttackDamage.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.events; + +import com.magmaguy.elitemobs.api.PlayerDamagedByEliteMobEvent; +import org.bukkit.GameMode; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; + +public class BossCustomAttackDamage { + + public static double dealCustomDamage(LivingEntity damager, LivingEntity damagee, double damage) { + + if (damager == null || damagee == null) return 0; + if (damager.equals(damagee)) return 0; + if (damagee.isInvulnerable() || damagee.getHealth() <= 0) return 0; + + if (damagee instanceof Player) + if (!(((Player) damagee).getGameMode().equals(GameMode.SURVIVAL) || + ((Player) damagee).getGameMode().equals(GameMode.ADVENTURE))) return 0; + + PlayerDamagedByEliteMobEvent.PlayerDamagedByEliteMobEventFilter.setBypass(true); + damagee.damage(damage, damager); + damagee.setNoDamageTicks(0); + + return damage; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/events/BossSpecialAttackDamage.java b/src/main/java/com/magmaguy/elitemobs/events/BossSpecialAttackDamage.java deleted file mode 100644 index 3b129a6c7..000000000 --- a/src/main/java/com/magmaguy/elitemobs/events/BossSpecialAttackDamage.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.events; - -import com.magmaguy.elitemobs.collateralminecraftchanges.PlayerDeathMessageByEliteMob; -import org.bukkit.GameMode; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; - -public class BossSpecialAttackDamage { - - public static boolean dealSpecialDamage(LivingEntity damager, LivingEntity damagee, double damage) { - - if (damagee.isInvulnerable() || damagee.getHealth() <= 0) return false; - - if (damagee instanceof Player) { - - if (!(((Player) damagee).getGameMode().equals(GameMode.SURVIVAL) || - ((Player) damagee).getGameMode().equals(GameMode.ADVENTURE))) return false; - - } - - damagee.damage(damage); - damagee.setNoDamageTicks(0); - - if (damagee instanceof Player && damagee.getHealth() <= 0) { - - PlayerDeathMessageByEliteMob.intializeDeathMessage((Player) damagee, damager); - - } - - return true; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/events/CustomEvent.java b/src/main/java/com/magmaguy/elitemobs/events/CustomEvent.java new file mode 100644 index 000000000..b5873d709 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/events/CustomEvent.java @@ -0,0 +1,187 @@ +package com.magmaguy.elitemobs.events; + +import com.magmaguy.elitemobs.EliteMobs; +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.announcements.AnnouncementPriority; +import com.magmaguy.elitemobs.api.internal.RemovalReason; +import com.magmaguy.elitemobs.config.ValidWorldsConfig; +import com.magmaguy.elitemobs.config.customevents.CustomEventsConfigFields; +import com.magmaguy.elitemobs.dungeons.EliteMobsWorld; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.thirdparty.worldguard.WorldGuardCompatibility; +import com.magmaguy.elitemobs.thirdparty.worldguard.WorldGuardFlagChecker; +import com.magmaguy.elitemobs.utils.CommandRunner; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.atomic.AtomicBoolean; + +public abstract class CustomEvent { + + //Start Conditions + public StartConditions startConditions; + //Common fields + public EventType eventType; + public ArrayList primaryEliteMobs = new ArrayList<>(); + public BukkitTask eventWatchdog; + public int announcementPriority; + public CustomEventsConfigFields customEventsConfigFields; + public String startMessage, endMessage; + public List startEventCommands, endEventCommands; + public List primaryCustomBossFilenames; + public Location eventStartLocation; + public float eventStartTime; + public int currentDay; + + /** + * Instantiates a Custom Event, does not necessarily start one but starts scanning for whether one should happen + */ + public CustomEvent(CustomEventsConfigFields customEventsConfigFields) { + this.startConditions = new StartConditions(customEventsConfigFields); + + this.customEventsConfigFields = customEventsConfigFields; + this.eventType = customEventsConfigFields.getEventType(); + this.startMessage = customEventsConfigFields.getStartMessage(); + this.endMessage = customEventsConfigFields.getEndMessage(); + this.startEventCommands = customEventsConfigFields.getEventStartCommands(); + this.endEventCommands = customEventsConfigFields.getEventEndCommands(); + this.announcementPriority = customEventsConfigFields.getAnnouncementPriority(); + this.primaryCustomBossFilenames = customEventsConfigFields.getBossFilenames(); + } + + public static boolean isLocationValid(Location location) { + if (!ValidWorldsConfig.getValidWorlds().contains(Objects.requireNonNull(location.getWorld()).getName())) + return false; + if (EliteMobsWorld.isEliteMobsWorld(location.getWorld().getUID())) + return false; + return !(EliteMobs.worldGuardIsEnabled && + !WorldGuardFlagChecker.checkFlag(location, WorldGuardCompatibility.getELITEMOBS_EVENTS())); + } + + public CustomEventsConfigFields getCustomEventsConfigFields() { + return customEventsConfigFields; + } + + public List getPrimaryCustomBossFilenames() { + return primaryCustomBossFilenames; + } + + public void setPrimaryCustomBossFilenames(List primaryCustomBossFilenames) { + this.primaryCustomBossFilenames = primaryCustomBossFilenames; + } + + public Location getEventStartLocation() { + return eventStartLocation; + } + + public void setEventStartLocation(Location eventStartLocation) { + this.eventStartLocation = eventStartLocation; + } + + /** + * Starts a Custom Event watchdog, which will scan whether the event is still ongoing or if it has ended every second + */ + public void start() { + startModifiers(); + if (primaryEliteMobs.isEmpty()) { + Logger.warn("Event " + customEventsConfigFields.getFilename() + " has failed to start because the bosses failed to spawn correctly!" + + "This could be due to an issue with the configuration of the bosses in the event, with the configuration" + + " of the event or due to a protection in the target location!"); + Logger.warn("Target location: " + getEventStartLocation().toString()); + } + if (this.startMessage != null) + AnnouncementPriority.announce(this.startMessage, eventStartLocation.getWorld(), this.announcementPriority); + if (this.startEventCommands != null) + CommandRunner.runCommandFromList(this.startEventCommands, new ArrayList<>()); + eventStartTime = System.currentTimeMillis(); + currentDay = dayCalculator(); + eventWatchdog = new BukkitRunnable() { + @Override + public void run() { + commonWatchdogBehavior(); + eventWatchdog(); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 20, 20); + } + + private int dayCalculator() { + return (int) Math.floor(eventStartLocation.getWorld().getFullTime() / 24000f); + } + + //START CHECKS - currently in each class + + //ACTIVE + + public abstract void startModifiers(); + + /** + * Runs checks that are common to all event types + */ + public void commonWatchdogBehavior() { + if (customEventsConfigFields.getEventEndTime() != -1) + if (eventStartLocation.getWorld().getTime() > customEventsConfigFields.getEventEndTime()) { + end(); + return; + } + if (customEventsConfigFields.getEventDuration() > 0) + if (System.currentTimeMillis() - eventStartTime > customEventsConfigFields.getEventDuration() * 60 * 1000) { + end(); + return; + } + if (customEventsConfigFields.isEndEventWithBossDeath()) { + AtomicBoolean allBossesAreDead = new AtomicBoolean(true); + primaryEliteMobs.forEach((primaryEliteMob) -> { + if (primaryEliteMob.exists()) + allBossesAreDead.set(false); + }); + if (allBossesAreDead.get()) { + end(); + } + } + } + + /** + * Checks whether the conditions for the event to end have been met + */ + public abstract void eventWatchdog(); + + /** + * Starts the end of the event, deletes all EliteMobEntities spawned by the event and queues further event completion requirements + */ + public void end() { + Logger.info("Event " + customEventsConfigFields.getFilename() + " ended!"); + if (eventWatchdog != null) + eventWatchdog.cancel(); + primaryEliteMobs.forEach(eliteMobEntity -> { + if (eliteMobEntity.exists()) eliteMobEntity.remove(RemovalReason.BOSS_TIMEOUT); + }); + if (this.endMessage != null) + AnnouncementPriority.announce(this.endMessage, eventStartLocation.getWorld(), this.announcementPriority); + if (this.endEventCommands != null) + Bukkit.getScheduler().runTask(MetadataHandler.PLUGIN, () -> CommandRunner.runCommandFromList(this.endEventCommands, new ArrayList<>())); + endModifiers(); + } + + //END + + /** + * Gets called by the end() method, completes any extension-specific behavior for the end of the event, such as + * implementing cooldowns or doing announcements. + */ + public abstract void endModifiers(); + + public enum EventType { + //Action Events + DEFAULT, + BREAK_BLOCK, + FISH, + TILL_SOIL, + TIMED + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/events/DeadMoon.java b/src/main/java/com/magmaguy/elitemobs/events/DeadMoon.java deleted file mode 100644 index 75f15291f..000000000 --- a/src/main/java/com/magmaguy/elitemobs/events/DeadMoon.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.events; - -import com.magmaguy.elitemobs.EliteMobs; -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.EventsConfig; -import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; -import com.magmaguy.elitemobs.config.ValidMobsConfig; -import com.magmaguy.elitemobs.events.mobs.TheReturned; -import com.magmaguy.elitemobs.events.mobs.ZombieKing; -import com.magmaguy.elitemobs.mobspawning.NaturalEliteMobSpawnEventHandler; -import org.bukkit.World; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Zombie; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.CreatureSpawnEvent; -import org.bukkit.scheduler.BukkitRunnable; - -import static org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CUSTOM; -import static org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.NATURAL; - -public class DeadMoon implements Listener { - - public static boolean entityQueued = false; - public static boolean eventOngoing = false; - - public static void initializeEvent() { - entityQueued = true; - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onSpawn(CreatureSpawnEvent event) { - - if (event.isCancelled()) return; - - if (event.getEntity().getWorld().getTime() < 13184 || event.getEntity().getWorld().getTime() > 22800) return; - if (!event.getSpawnReason().equals(CreatureSpawnEvent.SpawnReason.NATURAL)) return; - if (!(event.getEntity() instanceof Zombie)) return; - if (!EventLauncher.verifyPlayerCount()) return; - - if (!EliteMobs.validWorldList.contains(event.getEntity().getWorld())) return; - - if (event.getEntity().getWorld().getEnvironment().equals(World.Environment.NETHER) || - event.getEntity().getWorld().getEnvironment().equals(World.Environment.THE_END)) return; - - if (MoonPhaseDetector.detectMoonPhase(event.getEntity().getWorld()) != MoonPhaseDetector.moonPhase.NEW_MOON) - return; - - if (!ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.NATURAL_MOB_SPAWNING) || - !ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_AGGRESSIVE_ELITEMOBS)) - return; - - - if (event.getSpawnReason().equals(CreatureSpawnEvent.SpawnReason.SPAWNER) && !ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.SPAWNERS_SPAWN_ELITE_MOBS)) - return; - - if (!(event.getSpawnReason() == NATURAL || event.getSpawnReason() == CUSTOM)) return; - - if (!EntityTracker.isEliteMob(event.getEntity())) - NaturalEliteMobSpawnEventHandler.naturalMobProcessor(event.getEntity()); - - //add entityQueued - if (entityQueued && !TheReturned.isTheReturned(event.getEntity()) - && (event.getSpawnReason().equals(CreatureSpawnEvent.SpawnReason.NATURAL) || - event.getSpawnReason().equals(CreatureSpawnEvent.SpawnReason.CUSTOM))) { - - eventOngoing = true; - entityQueued = false; - - EventMessage.sendEventMessage(event.getEntity(), ConfigValues.eventsConfig.getString(EventsConfig.DEADMOON_ANNOUNCEMENT_MESSAGE)); - - ZombieKing.spawnZombieKing(event.getLocation()); - terminateEvent(event.getEntity()); - - } - - } - - private void terminateEvent(LivingEntity livingEntity) { - - World world = livingEntity.getWorld(); - - new BukkitRunnable() { - - @Override - public void run() { - - if (world.getTime() > 22800 || world.getTime() < 13184 || MoonPhaseDetector.detectMoonPhase(world) != MoonPhaseDetector.moonPhase.NEW_MOON) { - - eventOngoing = false; - - EventMessage.sendEventMessage(livingEntity, ConfigValues.eventsConfig.getString(EventsConfig.DEADMOON_END_MESSAGE)); - - cancel(); - - } - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 1, 1); - - } - - -} diff --git a/src/main/java/com/magmaguy/elitemobs/events/EventLauncher.java b/src/main/java/com/magmaguy/elitemobs/events/EventLauncher.java deleted file mode 100644 index 674561a1c..000000000 --- a/src/main/java/com/magmaguy/elitemobs/events/EventLauncher.java +++ /dev/null @@ -1,132 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.events; - -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.EventsConfig; -import org.bukkit.Bukkit; -import org.bukkit.plugin.Plugin; -import org.bukkit.scheduler.BukkitRunnable; - -import java.util.HashMap; - -import static com.magmaguy.elitemobs.utils.WeightedProbablity.pickWeighedProbability; - -public class EventLauncher { - - Plugin plugin = Bukkit.getPluginManager().getPlugin(MetadataHandler.ELITE_MOBS); - - public void eventRepeatingTask() { - - if (!ConfigValues.eventsConfig.getBoolean(EventsConfig.ENABLE_EVENTS)) return; - - new BukkitRunnable() { - - int counter = 0; - - @Override - public void run() { - - if (verifyPlayerCount()) { - - //if enough time has passed, run the event and reset the counter - if (timeCheck(counter)) { - - eventSelector(); - counter = 0; - return; - - } - - counter++; - - } - - } - - }.runTaskTimer(plugin, 20 * 60, 20 * 60); - - } - - public static boolean verifyPlayerCount() { - - return ConfigValues.eventsConfig.getInt(EventsConfig.MINIMUM_ONLINE_PLAYERS) <= Bukkit.getOnlinePlayers().size(); - - } - - private boolean timeCheck(int counter) { - - if (ConfigValues.eventsConfig.getInt(EventsConfig.MAXIMUM_ONLINE_PLAYERS) <= Bukkit.getOnlinePlayers().size()) { - - return counter >= ConfigValues.eventsConfig.getInt(EventsConfig.MAXIMUM_EVENT_FREQUENCY); - - } - - if (ConfigValues.eventsConfig.getInt(EventsConfig.MINIMUM_ONLINE_PLAYERS) == Bukkit.getOnlinePlayers().size()) { - - return counter >= ConfigValues.eventsConfig.getInt(EventsConfig.MINIMUM_EVENT_FREQUENCY); - - } - - int minPlayers = ConfigValues.eventsConfig.getInt(EventsConfig.MINIMUM_ONLINE_PLAYERS); - int maxPlayers = ConfigValues.eventsConfig.getInt(EventsConfig.MAXIMUM_ONLINE_PLAYERS); - double minFrequency = ConfigValues.eventsConfig.getInt(EventsConfig.MINIMUM_EVENT_FREQUENCY); - double maxFrequency = ConfigValues.eventsConfig.getInt(EventsConfig.MAXIMUM_EVENT_FREQUENCY); - - //y=mx slope = m - double slope = ((maxFrequency - minFrequency) / (maxPlayers - minPlayers)); - - double newTimerValue = slope * Bukkit.getOnlinePlayers().size() + minFrequency; - - return counter >= newTimerValue; - - - } - - private void eventSelector() { - - //todo: once more events are added, randomize which one gets picked in a weighed fashion - HashMap weighedConfigValues = new HashMap<>(); - if (ConfigValues.eventsConfig.getBoolean(EventsConfig.TREASURE_GOBLIN_SMALL_ENABLED)) { - - weighedConfigValues.put(EventsConfig.SMALL_TREASURE_GOBLIN_EVENT_WEIGHT, ConfigValues.eventsConfig.getDouble(EventsConfig.SMALL_TREASURE_GOBLIN_EVENT_WEIGHT)); - - } - - if (ConfigValues.eventsConfig.getBoolean(EventsConfig.DEAD_MOON_ENABLED)) { - - weighedConfigValues.put(EventsConfig.DEAD_MOON_EVENT_WEIGHT, ConfigValues.eventsConfig.getDouble(EventsConfig.DEAD_MOON_EVENT_WEIGHT)); - - } - - if (weighedConfigValues.isEmpty()) return; - - switch (pickWeighedProbability(weighedConfigValues)) { - - case EventsConfig.SMALL_TREASURE_GOBLIN_EVENT_WEIGHT: - SmallTreasureGoblin.initializeEvent(); - return; - case EventsConfig.DEAD_MOON_EVENT_WEIGHT: - DeadMoon.initializeEvent(); - return; - - } - - } - - -} diff --git a/src/main/java/com/magmaguy/elitemobs/events/EventMessage.java b/src/main/java/com/magmaguy/elitemobs/events/EventMessage.java deleted file mode 100644 index c2fb39cef..000000000 --- a/src/main/java/com/magmaguy/elitemobs/events/EventMessage.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.events; - -import com.magmaguy.elitemobs.ChatColorConverter; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.EventsConfig; -import org.bukkit.Bukkit; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; - -public class EventMessage { - - public static void sendEventMessage(LivingEntity livingEntity, String configMessage) { - - String coordinates = livingEntity.getLocation().getBlockX() + ", " + livingEntity.getLocation().getBlockY() + ", " + livingEntity.getLocation().getBlockZ(); - String sendString = configMessage.replace("$location", coordinates); - String worldName = ""; - - if (livingEntity.getWorld().getName().contains("_")) { - - for (String string : livingEntity.getWorld().getName().split("_")) { - - worldName += string.substring(0, 1).toUpperCase() + string.substring(1).toLowerCase() + " "; - - } - - } else { - - worldName = livingEntity.getWorld().getName().substring(0, 1).toUpperCase() + livingEntity.getWorld().getName().substring(1).toLowerCase(); - - } - - sendString = ChatColorConverter.convert(sendString.replace("$world", worldName)); - - if (ConfigValues.eventsConfig.getBoolean(EventsConfig.ANNOUNCEMENT_BROADCAST_WORLD_ONLY)) { - for (Player player : Bukkit.getServer().getOnlinePlayers()) - if (player.getWorld().equals(livingEntity.getWorld())) - player.sendMessage(sendString); - } else - Bukkit.getServer().broadcastMessage(sendString); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/events/MoonPhaseDetector.java b/src/main/java/com/magmaguy/elitemobs/events/MoonPhaseDetector.java index 1f6e3f9c3..fec10ff81 100644 --- a/src/main/java/com/magmaguy/elitemobs/events/MoonPhaseDetector.java +++ b/src/main/java/com/magmaguy/elitemobs/events/MoonPhaseDetector.java @@ -1,58 +1,42 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package com.magmaguy.elitemobs.events; -import org.bukkit.Bukkit; +import com.magmaguy.magmacore.util.Logger; import org.bukkit.World; public class MoonPhaseDetector { - public static moonPhase detectMoonPhase(World eventWorld) { + public static MoonPhase detectMoonPhase(World eventWorld) { int days = (int) eventWorld.getFullTime() / 24000; - int phase = days % 8; + int phase = Math.abs(days % 8); switch (phase) { case 0: - return moonPhase.FULL_MOON; + return MoonPhase.FULL_MOON; case 1: - return moonPhase.WANING_GIBBOUS; + return MoonPhase.WANING_GIBBOUS; case 2: - return moonPhase.LAST_QUARTER; + return MoonPhase.LAST_QUARTER; case 3: - return moonPhase.WANING_CRESCENT; + return MoonPhase.WANING_CRESCENT; case 4: - return moonPhase.NEW_MOON; + return MoonPhase.NEW_MOON; case 5: - return moonPhase.WAXING_CRESCENT; + return MoonPhase.WAXING_CRESCENT; case 6: - return moonPhase.FIRST_QUARTER; + return MoonPhase.FIRST_QUARTER; case 7: - return moonPhase.WAXING_GIBBOUS; + return MoonPhase.WAXING_GIBBOUS; default: - Bukkit.getLogger().info("Unhandled moon phase."); - return null; + Logger.info("Unhandled moon phase. Phase " + phase + " was " + days + ". Defaulting to full moon..."); + return MoonPhase.FULL_MOON; } } - public enum moonPhase { - + public enum MoonPhase { FULL_MOON, WANING_GIBBOUS, LAST_QUARTER, @@ -61,7 +45,6 @@ public enum moonPhase { WAXING_CRESCENT, FIRST_QUARTER, WAXING_GIBBOUS - } } diff --git a/src/main/java/com/magmaguy/elitemobs/events/SmallTreasureGoblin.java b/src/main/java/com/magmaguy/elitemobs/events/SmallTreasureGoblin.java deleted file mode 100644 index 746a69b60..000000000 --- a/src/main/java/com/magmaguy/elitemobs/events/SmallTreasureGoblin.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.events; - -import com.magmaguy.elitemobs.EliteMobs; -import com.magmaguy.elitemobs.events.mobs.TreasureGoblin; -import org.bukkit.Location; -import org.bukkit.entity.Zombie; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.CreatureSpawnEvent; - -public class SmallTreasureGoblin implements Listener { - - public static boolean entityQueued = false; - - public static void initializeEvent() { - entityQueued = true; - } - - public static void initalizeEvent(Location location) { - - TreasureGoblin.createGoblin(location); - - entityQueued = false; - - } - - - @EventHandler (priority = EventPriority.HIGHEST) - public void onSpawn(CreatureSpawnEvent event) { - - if (event.isCancelled()) return; - if (!EventLauncher.verifyPlayerCount()) return; - - if (EliteMobs.validWorldList.contains(event.getEntity().getWorld())) { - - if (entityQueued && (event.getSpawnReason().equals(CreatureSpawnEvent.SpawnReason.NATURAL) || - event.getSpawnReason().equals(CreatureSpawnEvent.SpawnReason.CUSTOM)) && - event.getEntity() instanceof Zombie) { - - initalizeEvent(event.getLocation()); - - } - - } - - } - - -} diff --git a/src/main/java/com/magmaguy/elitemobs/events/StartConditions.java b/src/main/java/com/magmaguy/elitemobs/events/StartConditions.java new file mode 100644 index 000000000..0c2f3ec0e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/events/StartConditions.java @@ -0,0 +1,18 @@ +package com.magmaguy.elitemobs.events; + +import com.magmaguy.elitemobs.config.customevents.CustomEventsConfigFields; +import org.bukkit.Bukkit; + +public class StartConditions { + + private final int minimumPlayerCount; + + public StartConditions(CustomEventsConfigFields customEventsConfigFields) { + this.minimumPlayerCount = customEventsConfigFields.getMinimumPlayerCount(); + } + + public boolean areValid() { + return Bukkit.getServer().getOnlinePlayers().size() >= minimumPlayerCount; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/events/TimedEvent.java b/src/main/java/com/magmaguy/elitemobs/events/TimedEvent.java new file mode 100644 index 000000000..32c87af61 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/events/TimedEvent.java @@ -0,0 +1,190 @@ +package com.magmaguy.elitemobs.events; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.adventurersguild.GuildRank; +import com.magmaguy.elitemobs.api.CustomEventStartEvent; +import com.magmaguy.elitemobs.config.EventsConfig; +import com.magmaguy.elitemobs.config.customevents.CustomEventsConfig; +import com.magmaguy.elitemobs.config.customevents.CustomEventsConfigFields; +import com.magmaguy.elitemobs.mobconstructor.CustomSpawn; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.utils.WeightedProbability; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class TimedEvent extends CustomEvent implements Listener { + + @Getter + protected static List blueprintEvents = new ArrayList<>(); + protected static List timedEvents = new ArrayList<>(); + //stores the time of the last global trigger + @Getter + private static double nextEventTrigger = System.currentTimeMillis() + 5D * 60D * 1000D; + @Getter + private static double nextEventStartMinimum = System.currentTimeMillis(); + private final double localCooldown; + private final double globalCooldown; + private final double weight; + private final String filename; + private double nextLocalEventTrigger = 0; + private CustomSpawn customSpawn; + private boolean silentRetry = false; + + public TimedEvent(CustomEventsConfigFields customEventsConfigFields) { + super(customEventsConfigFields); + this.localCooldown = customEventsConfigFields.getLocalCooldown(); + this.globalCooldown = customEventsConfigFields.getGlobalCooldown(); + this.weight = customEventsConfigFields.getWeight(); + this.filename = customEventsConfigFields.getFilename(); + } + + public static void shutdown() { + blueprintEvents.clear(); + timedEvents.clear(); + } + + public static void initializeBlueprintEvents() { + if (!EventsConfig.isTimedEventsEnabled()) return; + for (CustomEventsConfigFields customEventsConfigFields : CustomEventsConfig.getCustomEvents().values()) + if (customEventsConfigFields.isEnabled() && customEventsConfigFields.getEventType() == EventType.TIMED) + blueprintEvents.add(new TimedEvent(customEventsConfigFields)); + startEventPicker(); + } + + private static void startEventPicker() { + new BukkitRunnable() { + @Override + public void run() { + if (Bukkit.getServer().getOnlinePlayers().isEmpty()) return; + boolean validPlayer = false; + for (Player onlinePlayer : Bukkit.getServer().getOnlinePlayers()) + if (!GuildRank.isAtOrAboveGuildRank(onlinePlayer, 0, 0)) { + validPlayer = true; + break; + } + if (!validPlayer) return; + if (System.currentTimeMillis() < nextEventTrigger) return; + pickEvent(); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 20L * 60L * 5L, 20L * 60L); + } + + private static void pickEvent() { + HashMap weighedProbabilities = new HashMap<>(); + for (TimedEvent timedEvent : blueprintEvents) { + boolean isRunning = false; + for (TimedEvent activeTimedEvent : timedEvents) + if (activeTimedEvent != null && + activeTimedEvent.getCustomEventsConfigFields().getFilename().equals(timedEvent.getCustomEventsConfigFields().getFilename())) { + isRunning = true; + break; + } + if (isRunning) + continue; + if (timedEvent.nextLocalEventTrigger < System.currentTimeMillis()) + weighedProbabilities.put(timedEvent.filename, timedEvent.weight); + } + String pickedEvent = WeightedProbability.pickWeighedProbability(weighedProbabilities); + for (TimedEvent timedEvent : blueprintEvents) + if (timedEvent.filename.equals(pickedEvent)) { + timedEvent.nextLocalEventTrigger = System.currentTimeMillis() + timedEvent.localCooldown * 60 * 1000; + timedEvent.instantiateEvent(); + return; + } + } + + /** + * Just because the event is instantiated, does not necessarily mean it started. If the spawn isn't instant, then + * it needs to be queued for a later date. If the spawn is instant but no valid location can be found, it should retry + * on a delay. + */ + public void instantiateEvent() { + Logger.info("Event " + getCustomEventsConfigFields().getFilename() + " has been queued!"); + TimedEvent timedEvent = new TimedEvent(customEventsConfigFields); + CustomEventStartEvent customEventStartEvent = new CustomEventStartEvent(timedEvent); + if (customEventStartEvent.isCancelled()) return; + + timedEvent.customSpawn = new CustomSpawn(customEventsConfigFields.getSpawnType(), + customEventsConfigFields.getBossFilenames(), + timedEvent); + + //Failed to initialize event + if (timedEvent.customSpawn.getCustomSpawnConfigFields() == null) + return; + + //This handles the elitemobs-events flag + timedEvent.customSpawn.setEvent(true); + + //Note: this will finish running at an arbitrary time in the future + timedEvent.customSpawn.queueSpawn(); + + //global cooldown - 60 seconds right now + setNextEventTrigger(); + + timedEvents.add(timedEvent); + } + + private void setNextEventTrigger() { + setNextEventTrigger(globalCooldown); + } + + private void setNextEventTrigger(double timeMinutes) { + nextEventTrigger = System.currentTimeMillis() + timeMinutes * 60 * 1000; + } + + /** + * Queues an event to start when the start conditions are met + */ + public void queueEvent() { + this.primaryEliteMobs = customSpawn.getCustomBossEntities(); + setEventStartLocation(customSpawn.getSpawnLocation()); + + for (CustomBossEntity customBossEntity : primaryEliteMobs) + if (!customBossEntity.exists()) { + if (!silentRetry) { + Logger.info("Boss " + customBossEntity.getCustomBossesConfigFields().getFilename() + " for event " + + getCustomEventsConfigFields().getFilename() + " wasn't considered to be valid. Trying spawn again ."); + Logger.info("Note: further failures will be silent. EliteMobs can only predict WorldGuard protections," + + " so it will keep trying to spawn things until plugins preventing spawning allow it to do so. This might take a while."); + silentRetry = true; + } + + Bukkit.getScheduler().runTaskLater(MetadataHandler.PLUGIN, () -> { + customSpawn.setSpawnLocation(null); + customSpawn.queueSpawn(); + }, 1); + return; + } + + primaryEliteMobs.forEach(CustomBossEntity::announceSpawn); + + //Hardcoded 5 minute minimum wait time between events before the next event can get queued + setNextEventTrigger(5); + nextEventStartMinimum = System.currentTimeMillis() + (EventsConfig.getTimedEventMinimumCooldown() * 60 * 1000D); + start(); + } + + @Override + public void startModifiers() { + //Start cooldown for the blueprints, not the instantiated event because that one will be deleted at the end of its runtime + this.nextLocalEventTrigger = System.currentTimeMillis() + localCooldown * 60000; + } + + @Override + public void eventWatchdog() { + //No specific checks are currently required while the timed event occurs + } + + @Override + public void endModifiers() { + timedEvents.remove(this); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/events/actionevents/BalrogEvent.java b/src/main/java/com/magmaguy/elitemobs/events/actionevents/BalrogEvent.java deleted file mode 100644 index c22500f36..000000000 --- a/src/main/java/com/magmaguy/elitemobs/events/actionevents/BalrogEvent.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.magmaguy.elitemobs.events.actionevents; - -import com.magmaguy.elitemobs.EliteMobs; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.EventsConfig; -import com.magmaguy.elitemobs.events.mobs.Balrog; -import org.bukkit.GameMode; -import org.bukkit.Material; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.block.BlockBreakEvent; - -import java.util.concurrent.ThreadLocalRandom; - -public class BalrogEvent implements Listener { - - @EventHandler - public void onMine(BlockBreakEvent event) { - - if (event.isCancelled()) return; - if (!EliteMobs.validWorldList.contains(event.getPlayer().getWorld())) return; - if (event.getPlayer().getGameMode() == GameMode.CREATIVE || event.getPlayer().getGameMode() == GameMode.SPECTATOR) return; -// if (!event.getPlayer().hasPermission("elitemobs.events.balrog")) return; - if (event.getPlayer().getInventory().getItemInMainHand().hasItemMeta() && - event.getPlayer().getInventory().getItemInMainHand().getEnchantments().containsKey(Enchantment.SILK_TOUCH)) - return; - if (!(event.getBlock().getType().equals(Material.DIAMOND_ORE) || event.getBlock().getType().equals(Material.IRON_ORE) || - event.getBlock().getType().equals(Material.COAL_ORE) || event.getBlock().getType().equals(Material.REDSTONE_ORE) || - event.getBlock().getType().equals(Material.LAPIS_ORE) || event.getBlock().getType().equals(Material.GOLD_ORE))) return; - if (ThreadLocalRandom.current().nextDouble() > ConfigValues.eventsConfig.getDouble(EventsConfig.BALROG_CHANCE_ON_MINE)) return; - - Balrog.spawnBalrog(event.getBlock().getLocation()); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/events/actionevents/FaeEvent.java b/src/main/java/com/magmaguy/elitemobs/events/actionevents/FaeEvent.java deleted file mode 100644 index 14c51f71d..000000000 --- a/src/main/java/com/magmaguy/elitemobs/events/actionevents/FaeEvent.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.magmaguy.elitemobs.events.actionevents; - -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.EventsConfig; -import com.magmaguy.elitemobs.events.mobs.Fae; -import org.bukkit.GameMode; -import org.bukkit.Material; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.block.BlockBreakEvent; - -import java.util.concurrent.ThreadLocalRandom; - -public class FaeEvent implements Listener { - - @EventHandler - public void onTreeFell(BlockBreakEvent event) { - - if (event.isCancelled()) return; - if (event.getPlayer().getGameMode() == GameMode.CREATIVE || event.getPlayer().getGameMode() == GameMode.SPECTATOR) return; - if (!(event.getBlock().getType().equals(Material.LOG) || event.getBlock().getType().equals(Material.LOG_2))) - return; -// if (!event.getPlayer().hasPermission("elitemobs.events.fae")) return; - if (ThreadLocalRandom.current().nextDouble() > ConfigValues.eventsConfig.getDouble(EventsConfig.FAE_CHANCE_ON_CHOP)) - return; - - Fae.spawnFae(event.getBlock().getLocation()); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/events/actionevents/KrakenEvent.java b/src/main/java/com/magmaguy/elitemobs/events/actionevents/KrakenEvent.java deleted file mode 100644 index 2feca9d41..000000000 --- a/src/main/java/com/magmaguy/elitemobs/events/actionevents/KrakenEvent.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.magmaguy.elitemobs.events.actionevents; - -import com.magmaguy.elitemobs.EliteMobs; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.EventsConfig; -import com.magmaguy.elitemobs.events.mobs.Kraken; -import org.bukkit.GameMode; -import org.bukkit.Material; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerFishEvent; - -import java.util.concurrent.ThreadLocalRandom; - -import static com.magmaguy.elitemobs.utils.VersionChecker.currentVersionIsUnder; - -public class KrakenEvent implements Listener { - - @EventHandler - public void onFishingStart(PlayerFishEvent event) { - - if (event.isCancelled()) return; - if (!currentVersionIsUnder(13, 0)) return; - if (!EliteMobs.validWorldList.contains(event.getPlayer().getWorld())) return; -// if (!event.getPlayer().hasPermission("elitemobs.events.kraken")) return; - if (event.getPlayer().getGameMode() == GameMode.CREATIVE || event.getPlayer().getGameMode() == GameMode.SPECTATOR) - return; - if (event.getHook().getLocation().getBlock().isEmpty() || !event.getHook().getLocation().getBlock().isEmpty() && - !event.getHook().getLocation().getBlock().getType().equals(Material.WATER)) return; - if (ThreadLocalRandom.current().nextDouble() > ConfigValues.eventsConfig.getDouble(EventsConfig.KRAKEN_CHANCE_ON_FISH)) - return; - - Kraken.spawnKraken(event.getHook().getLocation()); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/events/mobs/Balrog.java b/src/main/java/com/magmaguy/elitemobs/events/mobs/Balrog.java deleted file mode 100644 index 4b6a0a710..000000000 --- a/src/main/java/com/magmaguy/elitemobs/events/mobs/Balrog.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.magmaguy.elitemobs.events.mobs; - -import com.magmaguy.elitemobs.ChatColorConverter; -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.EventsConfig; -import com.magmaguy.elitemobs.events.mobs.sharedeventproperties.ActionDynamicBossLevelConstructor; -import com.magmaguy.elitemobs.events.mobs.sharedeventproperties.BossMobDeathCountdown; -import com.magmaguy.elitemobs.items.uniqueitems.DwarvenGreed; -import com.magmaguy.elitemobs.mobconstructor.ActionBossMobEntity; -import com.magmaguy.elitemobs.mobconstructor.TrashMobEntity; -import org.bukkit.Location; -import org.bukkit.Particle; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Silverfish; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.Vector; - -import java.util.HashSet; - -public class Balrog implements Listener { - - public static void spawnBalrog(Location location) { - balrogSpawnEffect(location.add(new Vector(0.5, 0.5, 0.5))); - } - - private static void balrogSpawnEffect(Location location) { - - new BukkitRunnable() { - - int i = 0; - - @Override - public void run() { - - if (i > 20 * 3) { - - intializeBalrog(location); - cancel(); - return; - - } - - location.getWorld().spawnParticle(Particle.SMOKE_LARGE, location, 4, 0.1, 0.1, 0.1, 0.05); - location.getWorld().spawnParticle(Particle.FLAME, location, 2, 0.1, 0.1, 0.1, 0.05); - - i++; - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); - - } - - private static void intializeBalrog(Location location) { - - int eliteLevel = ActionDynamicBossLevelConstructor.determineDynamicBossLevel(location); - ActionBossMobEntity bossMobEntity = new ActionBossMobEntity(EntityType.SILVERFISH, location, eliteLevel, ConfigValues.eventsConfig.getString(EventsConfig.BALROG_NAME)); - balrogList.add(bossMobEntity.getLivingEntity()); - - balrogVisualEffectLoop((Silverfish) bossMobEntity.getLivingEntity()); - - BossMobDeathCountdown.startDeathCountdown(bossMobEntity.getLivingEntity()); - - } - - private static void balrogVisualEffectLoop(Silverfish balrog) { - - new BukkitRunnable() { - @Override - public void run() { - - if (!balrog.isValid()) { - - cancel(); - return; - - } - - balrog.getWorld().spawnParticle(Particle.FLAME, balrog.getLocation(), 2, 0.1, 0.1, 0.1, 0.05); - balrog.getWorld().spawnParticle(Particle.SMOKE_LARGE, balrog.getLocation(), 4, 0.1, 0.1, 0.1, 0.05); - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); - - } - - private static HashSet balrogList = new HashSet<>(); - - @EventHandler - public void onDeath(EntityDeathEvent event) { - - if (!balrogList.contains(event.getEntity())) return; - - balrogList.remove(event.getEntity()); - - DwarvenGreed dwarvenGreed = new DwarvenGreed(); - ItemStack dwarvenGreedItemStack = dwarvenGreed.constructItemStack(); - - event.getEntity().getWorld().dropItem(event.getEntity().getLocation(), dwarvenGreedItemStack); - - } - - @EventHandler(priority = EventPriority.HIGHEST) - public void onHit(EntityDamageEvent event) { - - if (event.isCancelled()) return; - if (!balrogList.contains(event.getEntity())) return; - if (event.getFinalDamage() < 2) return; - - spawnTrashMobs((Silverfish) event.getEntity()); - spawnTrashMobs((Silverfish) event.getEntity()); - - } - - private static void spawnTrashMobs(Silverfish balrog) { - - TrashMobEntity trashMobEntity = new TrashMobEntity(EntityType.SILVERFISH, balrog.getLocation(), - ChatColorConverter.convert(ConfigValues.eventsConfig.getString(EventsConfig.BALROG_TRASH_MOB_NAME))); - - trashMobVisualEffect((Silverfish) trashMobEntity.getLivingEntity()); - - } - - private static void trashMobVisualEffect(Silverfish raug) { - - new BukkitRunnable() { - - @Override - public void run() { - - if (!raug.isValid() || raug.isDead()) { - - cancel(); - return; - - } - - raug.getWorld().spawnParticle(Particle.FLAME, raug.getLocation(), 1, 0.1, 0.1, 0.1, 0.05); - raug.getWorld().spawnParticle(Particle.SMOKE_LARGE, raug.getLocation(), 1, 0.1, 0.1, 0.1, 0.05); - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 1, 1); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/events/mobs/Fae.java b/src/main/java/com/magmaguy/elitemobs/events/mobs/Fae.java deleted file mode 100644 index 60f7c7fba..000000000 --- a/src/main/java/com/magmaguy/elitemobs/events/mobs/Fae.java +++ /dev/null @@ -1,226 +0,0 @@ -package com.magmaguy.elitemobs.events.mobs; - -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.EventsConfig; -import com.magmaguy.elitemobs.events.mobs.sharedeventproperties.ActionDynamicBossLevelConstructor; -import com.magmaguy.elitemobs.items.uniqueitems.TheFeller; -import com.magmaguy.elitemobs.mobconstructor.ActionBossMobEntity; -import com.magmaguy.elitemobs.mobpowers.offensivepowers.AttackFire; -import com.magmaguy.elitemobs.mobpowers.offensivepowers.AttackFreeze; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Particle; -import org.bukkit.entity.*; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.Vector; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.UUID; -import java.util.concurrent.ThreadLocalRandom; - -public class Fae implements Listener { - - public static void spawnFae(Location location) { - - vexSpawnEffect(location); - - } - - private static void vexSpawnEffect(Location location) { - - new BukkitRunnable() { - - int counter = 0; - - @Override - public void run() { - - if (counter > 20 * 3) { - - initializeVex(location); - cancel(); - return; - - } - - location.getWorld().spawnParticle(Particle.WATER_DROP, location, 5, 0.1, 0.1, 0.1, 1); - location.getWorld().spawnParticle(Particle.FLAME, location, 3, 0.1, 0.1, 0.1, 0.01); - location.getWorld().spawnParticle(Particle.SPELL, location, 3, 0.1, 0.1, 0.1, 0.02); - - counter++; - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); - - } - - private static void initializeVex(Location location) { - - /* - Good for all fae - */ - int level = ActionDynamicBossLevelConstructor.determineDynamicBossLevel(location) / 3; - - /* - Construct specific fae - */ - ActionBossMobEntity fireFaeBoss = new ActionBossMobEntity( - EntityType.VEX, - location, - level, - ConfigValues.eventsConfig.getString(EventsConfig.FAE_NAME)); - - ActionBossMobEntity lightningFaeBoss = new ActionBossMobEntity( - EntityType.VEX, - location, - level, - ConfigValues.eventsConfig.getString(EventsConfig.FAE_NAME), - new HashSet<>(Arrays.asList(new AttackFire()))); - - ActionBossMobEntity frostFaeBoss = new ActionBossMobEntity( - EntityType.VEX, - location, - level, - ConfigValues.eventsConfig.getString(EventsConfig.FAE_NAME), - new HashSet<>(Arrays.asList(new AttackFreeze()))); - - faeList.addAll(Arrays.asList(lightningFaeBoss.getLivingEntity(), fireFaeBoss.getLivingEntity(), frostFaeBoss.getLivingEntity())); - - faeVisualEffect((Vex) lightningFaeBoss.getLivingEntity(), faeType.LIGHTING_FAE); - faeVisualEffect((Vex) fireFaeBoss.getLivingEntity(), faeType.FIRE_FAE); - faeVisualEffect((Vex) frostFaeBoss.getLivingEntity(), faeType.FROST_FAE); - - initializeSmiteAttack((Vex) lightningFaeBoss.getLivingEntity()); - - } - - private enum faeType { - - LIGHTING_FAE, - FIRE_FAE, - FROST_FAE - - } - - private static void faeVisualEffect(Vex fae, faeType faeType) { - - Particle particle = Particle.SMOKE_LARGE; - - switch (faeType) { - - case LIGHTING_FAE: - particle = Particle.SPELL; - break; - case FIRE_FAE: - particle = Particle.FLAME; - break; - case FROST_FAE: - particle = Particle.WATER_DROP; - break; - - } - - final Particle finalParticle = particle; - - new BukkitRunnable() { - - UUID uuid = fae.getUniqueId(); - - @Override - public void run() { - - Vex localFae = fae; - - if (!localFae.isValid()) - if (Bukkit.getEntity(uuid) != null && Bukkit.getEntity(uuid).isValid()) - localFae = (Vex) Bukkit.getEntity(uuid); - - if (localFae.isDead()) { - - cancel(); - return; - - } - - switch (finalParticle) { - - case SPELL: - localFae.getWorld().spawnParticle(finalParticle, localFae.getLocation().add(new Vector(0, 0.25, 0)), 3, 0.1, 0.1, 0.1, 0.02); - break; - case FLAME: - localFae.getWorld().spawnParticle(finalParticle, localFae.getLocation().add(new Vector(0, 0.25, 0)), 3, 0.1, 0.1, 0.1, 0.01); - break; - case WATER_DROP: - localFae.getWorld().spawnParticle(finalParticle, localFae.getLocation().add(new Vector(0, 0.25, 0)), 5, 0.1, 0.1, 0.1, 1); - break; - - } - - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 1, 1); - - } - - private static void initializeSmiteAttack(Vex lightingFae) { - - new BukkitRunnable() { - - UUID uuid = lightingFae.getUniqueId(); - - @Override - public void run() { - - Vex localFae = lightingFae; - - if (!lightingFae.isValid()) - if (Bukkit.getEntity(uuid) != null && Bukkit.getEntity(uuid).isValid()) - localFae = (Vex) Bukkit.getEntity(uuid); - - if (localFae.isDead()) { - - cancel(); - return; - - } - - for (Entity entity : localFae.getNearbyEntities(16, 16, 16)) { - - if (entity instanceof Player) { - - entity.getWorld().strikeLightning(entity.getLocation()); - - } - - } - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 20 * 20, 20 * 20); - - } - - private static HashSet faeList = new HashSet<>(); - - @EventHandler - public void onFaeDeath(EntityDeathEvent event) { - - if (!faeList.contains(event.getEntity())) return; - if (ThreadLocalRandom.current().nextDouble() > 0.33) return; - - TheFeller theFeller = new TheFeller(); - ItemStack theFellerItemStack = theFeller.constructItemStack(); - - event.getEntity().getWorld().dropItem(event.getEntity().getLocation(), theFellerItemStack); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/events/mobs/Kraken.java b/src/main/java/com/magmaguy/elitemobs/events/mobs/Kraken.java deleted file mode 100644 index c5bd902e7..000000000 --- a/src/main/java/com/magmaguy/elitemobs/events/mobs/Kraken.java +++ /dev/null @@ -1,227 +0,0 @@ -package com.magmaguy.elitemobs.events.mobs; - -import com.magmaguy.elitemobs.ChatColorConverter; -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.EventsConfig; -import com.magmaguy.elitemobs.events.mobs.sharedeventproperties.BossMobDeathCountdown; -import com.magmaguy.elitemobs.items.uniqueitems.DepthsSeeker; -import com.magmaguy.elitemobs.mobpowers.ProjectileLocationGenerator; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Particle; -import org.bukkit.entity.*; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.Vector; - -import java.util.HashSet; -import java.util.UUID; - -public class Kraken implements Listener { - - private static HashSet krakens = new HashSet<>(); - - public static boolean isKraken(Squid kraken) { - return krakens.contains(kraken); - } - - public static void removeKraken(Squid kraken) { - krakens.remove(kraken); - } - - private static HashSet fireballs = new HashSet<>(); - - public static boolean isFireball(Fireball fireball) { - return fireballs.contains(fireball); - } - - public static void removeFireball(Fireball fireball) { - fireballs.remove(fireball); - } - - public static void spawnKraken(Location location) { - krakenSpawnEffect(location); - } - - private static void krakenSpawnEffect(Location location) { - - new BukkitRunnable() { - - int counter = 0; - - @Override - public void run() { - - if (counter > 20 * 3) { - - initializeKraken(location); - cancel(); - return; - - } - - location.getWorld().spawnParticle(Particle.PORTAL, location, 20, 1, 1, 1, 0.1); - - counter++; - - } - - - }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); - - } - - private static void initializeKraken(Location location) { - - Squid kraken = (Squid) location.getWorld().spawnEntity(location, EntityType.SQUID); - - krakens.add(kraken); - - /* - This boss is not fully integrated into the plugin yet, might not really make the cut - */ - - kraken.setMaxHealth(100); - kraken.setHealth(100); - - kraken.setCustomName(ChatColorConverter.convert(ConfigValues.eventsConfig.getString(EventsConfig.KRAKEN_NAME))); - kraken.setCustomNameVisible(true); - - krakenDamageLoop(kraken); - krakenVisualEffectLoop(kraken); - - BossMobDeathCountdown.startDeathCountdown(kraken); - - } - - private static void krakenDamageLoop(Squid kraken) { - - new BukkitRunnable() { - - @Override - public void run() { - - if (kraken.isDead()) { - cancel(); - return; - } - - for (Entity entity : kraken.getNearbyEntities(16, 16, 16)) - if (entity instanceof Player) - fireballInitializer(kraken, (Player) entity); - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 20 * 3, 20 * 3); - - } - - private static void fireballInitializer(Squid kraken, Player target) { - - Location offsetLocation = ProjectileLocationGenerator.generateLocation(kraken, target); - Fireball repeatingFireball = (Fireball) kraken.getWorld().spawnEntity(offsetLocation, EntityType.FIREBALL); - Vector targetterToTargetted = target.getEyeLocation().subtract(repeatingFireball.getLocation()).toVector() - .normalize().multiply(1); - - repeatingFireball.setDirection(targetterToTargetted); - repeatingFireball.setIsIncendiary(true); - repeatingFireball.setYield(2F); - - fireballs.add(repeatingFireball); - - } - - private static void krakenVisualEffectLoop(Squid kraken) { - - new BukkitRunnable() { - - UUID uuid = kraken.getUniqueId(); - - @Override - public void run() { - - Squid localKraken = kraken; - - if (!kraken.isValid()) - if (Bukkit.getEntity(uuid) != null) - localKraken = (Squid) Bukkit.getEntity(uuid); - - if (kraken.isDead()) { - - cancel(); - return; - - } - - localKraken.getWorld().spawnParticle(Particle.FLAME, localKraken.getLocation(), 10, 0.1, 0.1, 0.1, 0.05); - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); - - } - - @EventHandler - public void onSuffocate(EntityDamageEvent event) { - - if (event.isCancelled()) return; - if (!event.getEntity().getType().equals(EntityType.SQUID)) return; - if (!isKraken((Squid) event.getEntity())) return; - if (!event.getCause().equals(EntityDamageEvent.DamageCause.DROWNING) && - !event.getCause().equals(EntityDamageEvent.DamageCause.FIRE)) return; - - event.setCancelled(true); - - } - - @EventHandler - public void onSelfDamage(EntityDamageByEntityEvent event) { - - if (event.getDamager() instanceof Fireball && ((Fireball) event.getDamager()).getShooter() != null && - ((Fireball) event.getDamager()).getShooter() instanceof Squid) { - event.setCancelled(true); - removeFireball((Fireball) event.getDamager()); - } - - } - - @EventHandler - public void fireballDamage(EntityDamageByEntityEvent event) { - - if (event.isCancelled()) return; - if (!event.getEntity().getType().equals(EntityType.PLAYER)) return; - if (!event.getDamager().getType().equals(EntityType.FIREBALL)) return; - if (!isFireball((Fireball) event.getDamager())) return; - - for (EntityDamageByEntityEvent.DamageModifier modifier : EntityDamageByEntityEvent.DamageModifier.values()) - if (event.isApplicable(modifier)) - event.setDamage(modifier, 0); - - event.setDamage(EntityDamageEvent.DamageModifier.BASE, 2); - - removeFireball((Fireball) event.getDamager()); - - } - - @EventHandler - public void onDeath(EntityDeathEvent event) { - - if (!event.getEntity().getType().equals(EntityType.SQUID)) return; - if (!isKraken((Squid) event.getEntity())) return; - - DepthsSeeker depthsSeeker = new DepthsSeeker(); - ItemStack depthSeekerItemStack = depthsSeeker.constructItemStack(); - event.getEntity().getWorld().dropItem(event.getEntity().getLocation(), depthSeekerItemStack); - removeKraken((Squid) event.getEntity()); - - } - -} - - diff --git a/src/main/java/com/magmaguy/elitemobs/events/mobs/TheReturned.java b/src/main/java/com/magmaguy/elitemobs/events/mobs/TheReturned.java deleted file mode 100644 index c71a3aa13..000000000 --- a/src/main/java/com/magmaguy/elitemobs/events/mobs/TheReturned.java +++ /dev/null @@ -1,128 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.events.mobs; - -import com.magmaguy.elitemobs.ChatColorConverter; -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.EventsConfig; -import com.magmaguy.elitemobs.events.DeadMoon; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Husk; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Zombie; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.event.entity.EntitySpawnEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.Vector; - -import java.util.HashSet; -import java.util.concurrent.ThreadLocalRandom; - -public class TheReturned implements Listener { - - private static HashSet theReturnedList = new HashSet<>(); - - public static boolean isTheReturned(LivingEntity livingEntity) { - return theReturnedList.contains(livingEntity); - } - - @EventHandler - public void onSpawn(EntitySpawnEvent event) { - - if (!DeadMoon.eventOngoing) return; - - if (event.getEntity() instanceof LivingEntity && theReturnedList.contains(event.getEntity())) - spawnTheReturned((Zombie) event.getEntity()); - - } - - private void spawnTheReturned(Zombie zombie) { - - /* - Wait a tick before spawning as third party compatibility can get messy with spawn events - */ - new BukkitRunnable() { - - @Override - public void run() { - - if (!zombie.isValid()) return; - - if (theReturnedList.contains(zombie)) return; - - int mobLevel; - - if (EntityTracker.isEliteMob(zombie)) - mobLevel = (int) Math.ceil(EntityTracker.getEliteMobEntity(zombie).getLevel() / 2); - else mobLevel = 1; - - theReturnedConstructor(mobLevel, zombie); - theReturnedConstructor(mobLevel, zombie); - - } - - }.runTaskLater(MetadataHandler.PLUGIN, 1); - - } - - public static void theReturnedConstructor(int mobLevel, Zombie zombie) { - - Location spawnLocation = zombie.getLocation(); - - Husk theReturned = (Husk) spawnLocation.getWorld().spawnEntity(spawnLocation, EntityType.HUSK); - - EliteMobEntity eliteMobEntity = new EliteMobEntity(theReturned, mobLevel); - eliteMobEntity.setHasCustomArmor(true); - eliteMobEntity.setHasCustomPowers(true); - eliteMobEntity.setHasStacking(false); - eliteMobEntity.setName(ChatColorConverter.convert(ConfigValues.eventsConfig.getString(EventsConfig.DEAD_MOON_THE_RETURNED_NAME))); - - double x = ThreadLocalRandom.current().nextDouble() - 0.5; - double z = ThreadLocalRandom.current().nextDouble() - 0.5; - - theReturned.setVelocity(new Vector(x, 0.5, z)); - - new BukkitRunnable() { - - @Override - public void run() { - - theReturned.getEquipment().setBoots(new ItemStack(Material.AIR)); - theReturned.getEquipment().setLeggings(new ItemStack(Material.AIR)); - theReturned.getEquipment().setChestplate(new ItemStack(Material.AIR)); - theReturned.getEquipment().setHelmet(new ItemStack(Material.AIR)); - theReturned.getEquipment().setItemInMainHand(new ItemStack(Material.AIR)); - - } - - }.runTaskLater(MetadataHandler.PLUGIN, 1); - - } - - @EventHandler - public void onDeath(EntityDeathEvent event) { - theReturnedList.remove(event.getEntity()); - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/events/mobs/TreasureGoblin.java b/src/main/java/com/magmaguy/elitemobs/events/mobs/TreasureGoblin.java deleted file mode 100644 index c0a940596..000000000 --- a/src/main/java/com/magmaguy/elitemobs/events/mobs/TreasureGoblin.java +++ /dev/null @@ -1,443 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.events.mobs; - -import com.magmaguy.elitemobs.ChatColorConverter; -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.EventsConfig; -import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; -import com.magmaguy.elitemobs.events.BossSpecialAttackDamage; -import com.magmaguy.elitemobs.events.EventMessage; -import com.magmaguy.elitemobs.events.mobs.sharedeventproperties.DynamicBossLevelConstructor; -import com.magmaguy.elitemobs.items.LootTables; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobconstructor.TimedBossMobEntity; -import com.magmaguy.elitemobs.mobpowers.PowerCooldown; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Particle; -import org.bukkit.entity.*; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.Vector; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.concurrent.ThreadLocalRandom; - -public class TreasureGoblin implements Listener { - - private static HashSet treasureGoblinList = new HashSet<>(); - private static HashSet radialGoldExplosionCooldown = new HashSet<>(); - private static HashSet goldShotgunCooldown = new HashSet<>(); - - public static EliteMobEntity getTreasureGoblin(Zombie zombie) { - if (treasureGoblinList.isEmpty()) return null; - for (TimedBossMobEntity bossMobEntity : treasureGoblinList) - if (bossMobEntity.getLivingEntity().equals(zombie)) - return bossMobEntity; - return null; - } - - public static void createGoblin(Location location) { - - int mobLevel = DynamicBossLevelConstructor.findDynamicBossLevel(); - TimedBossMobEntity treasureGoblinPluginEntity = new TimedBossMobEntity(EntityType.ZOMBIE, location, mobLevel, - ConfigValues.eventsConfig.getString(EventsConfig.TREASURE_GOBLIN_NAME)); - - treasureGoblinList.add(treasureGoblinPluginEntity); - - ((Zombie) treasureGoblinPluginEntity.getLivingEntity()).setBaby(true); - - equipTreasureGoblin((Zombie) treasureGoblinPluginEntity.getLivingEntity()); - EventMessage.sendEventMessage(treasureGoblinPluginEntity.getLivingEntity(), ConfigValues.eventsConfig.getString(EventsConfig.SMALL_TREASURE_GOBLIN_EVENT_ANNOUNCEMENT_TEXT)); - - } - - @EventHandler - public void onDeath(EntityDeathEvent event) { - - if (!event.getEntity().getType().equals(EntityType.ZOMBIE)) return; - - EliteMobEntity eliteMobEntity = getTreasureGoblin((Zombie) event.getEntity()); - if (eliteMobEntity == null) return; - - Zombie zombieKing = (Zombie) event.getEntity(); - - for (int i = 0; i < ConfigValues.eventsConfig.getInt(EventsConfig.SMALL_TREASURE_GOBLIN_REWARD); i++) - LootTables.generateLoot(eliteMobEntity); - - - for (Player player : Bukkit.getServer().getOnlinePlayers()) { - - if (zombieKing.getKiller() != null) { - - String newMessage = ConfigValues.eventsConfig.getString(EventsConfig.SMALL_TREASURE_GOBLIN_EVENT_PLAYER_END_TEXT) - .replace("$player", (zombieKing).getKiller().getDisplayName()); - player.sendMessage(ChatColorConverter.convert(newMessage)); - - } else - player.sendMessage(ChatColorConverter.convert(ConfigValues.eventsConfig.getString(EventsConfig.SMALL_TREASURE_GOBLIN_EVENT_OTHER_END_TEXT))); - - } - - } - - @EventHandler - public void onHit(EntityDamageByEntityEvent event) { - - if (!(event.getDamager().getType().equals(EntityType.ZOMBIE) || - event.getDamager() instanceof Projectile && ((Projectile) event.getDamager()).getShooter() instanceof Zombie)) - return; - - if (ThreadLocalRandom.current().nextDouble() > 0.5) return; - - LivingEntity livingEntity; - - if (event.getDamager() instanceof Projectile) - livingEntity = (LivingEntity) ((Projectile) event.getDamager()).getShooter(); - else - livingEntity = (LivingEntity) event.getDamager(); - - EliteMobEntity eliteMobEntity = getTreasureGoblin((Zombie) livingEntity); - if (eliteMobEntity == null) return; - - if (!PowerCooldown.isInCooldown(eliteMobEntity, radialGoldExplosionCooldown)) { - - PowerCooldown.startCooldownTimer(eliteMobEntity, radialGoldExplosionCooldown, - 20 * ConfigValues.eventsConfig.getInt(EventsConfig.TREASURE_GOBLIN_RADIAL_EXPLOSION)); - radialGoldExplosionInitializer((Zombie) event.getDamager()); - - } else if (!PowerCooldown.isInCooldown(eliteMobEntity, goldShotgunCooldown)) { - - PowerCooldown.startCooldownTimer(eliteMobEntity, goldShotgunCooldown, - 20 * ConfigValues.eventsConfig.getInt(EventsConfig.TREASURE_GOBLIN_GOLD_SHOTGUN_INTERVAL)); - goldShotgunInitializer((Zombie) event.getDamager(), livingEntity.getLocation()); - - } - - } - - private void radialGoldExplosionInitializer(Zombie zombie) { - - zombie.setAI(false); - - new BukkitRunnable() { - - int counter = 0; - - @Override - public void run() { - - if (counter == 20 * 1.5) { - - radialGoldExplosion(zombie); - zombie.setAI(true); - cancel(); - - } - - if (ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.ENABLE_WARNING_VISUAL_EFFECTS)) - zombie.getWorld().spawnParticle(Particle.SMOKE_NORMAL, zombie.getLocation(), counter, 1, 1, 1, 0); - - counter++; - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); - - } - - private static void radialGoldExplosion(Zombie zombie) { - - int projectileCount = 200; - List itemList = new ArrayList<>(); - - for (int i = 0; i < projectileCount; i++) { - - double x = ThreadLocalRandom.current().nextDouble() - 0.5; - double y = ThreadLocalRandom.current().nextDouble() / 1.5; - double z = ThreadLocalRandom.current().nextDouble() - 0.5; - - Vector locationAdjuster = new Vector(x, 0, z).normalize(); - - Location zombieLocation = zombie.getLocation().add(new Vector(0, 0.5, 0)); - Location projectileLocation = zombieLocation.add(locationAdjuster); - ItemStack visualProjectileItemStack = new ItemStack(Material.GOLD_NUGGET, 1); - - /* - Set custom lore to prevent item stacking - */ - ItemMeta itemMeta = visualProjectileItemStack.getItemMeta(); - List lore = new ArrayList<>(); - lore.add("" + ThreadLocalRandom.current().nextDouble() + "" + ThreadLocalRandom.current().nextDouble()); - itemMeta.setLore(lore); - visualProjectileItemStack.setItemMeta(itemMeta); - - Item visualProjectile = projectileLocation.getWorld().dropItem(projectileLocation, visualProjectileItemStack); - - Vector velocity = new Vector(x, y, z).multiply(2); - visualProjectile.setVelocity(velocity); - visualProjectile.setPickupDelay(Integer.MAX_VALUE); - EntityTracker.registerCullableEntity(visualProjectile); - - itemList.add(visualProjectile); - - } - - new BukkitRunnable() { - - int counter = 0; - - @Override - public void run() { - - if (itemList.size() == 0) cancel(); - - Iterator iterator = itemList.iterator(); - - while (iterator.hasNext()) { - - Item item = iterator.next(); - - if (counter > 20 * 5) { - - if (item != null && item.isValid()) iterator.remove(); - if (item != null && item.isValid()) item.remove(); - continue; - - } - - if (item == null || !item.isValid() || item.isDead()) - iterator.remove(); - - else if (item.isOnGround()) { - iterator.remove(); - item.remove(); - } else if (goldNuggetDamage(item.getNearbyEntities(0, 0, 0), zombie)) { - - iterator.remove(); - item.remove(); - - } - - } - - if (counter > 20 * 5) - cancel(); - - counter++; - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); - - } - - private static void goldShotgunInitializer(Zombie zombie, Location targetLocation) { - - zombie.setAI(false); - - List locationList = new ArrayList<>(); - - int projectileCount = 200; - - for (int i = 0; i < projectileCount; i++) { - - double x = ThreadLocalRandom.current().nextDouble() * 2 - 1; - double y = ThreadLocalRandom.current().nextDouble() * 2 - 1; - double z = ThreadLocalRandom.current().nextDouble() * 2 - 1; - - Location tempLocation = targetLocation.clone(); - - Location simulatedLocation = tempLocation.add(new Location(tempLocation.getWorld(), 0.0, 1.0, 0.0)) - .add(new Location(tempLocation.getWorld(), x, y, z)); - - Vector toPlayer = simulatedLocation.subtract(zombie.getLocation()).toVector().normalize(); - - locationList.add(toPlayer); - - } - - new BukkitRunnable() { - - int counter = 0; - - @Override - public void run() { - - if (counter == 20 * 1) { - - goldShotgun(zombie, targetLocation); - zombie.setAI(true); - cancel(); - - } - - if (ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.ENABLE_WARNING_VISUAL_EFFECTS)) { - - - Location zombieLocation = zombie.getLocation().clone(); - - int particleCount = 20; - - for (int i = 0; i < particleCount; i++) { - - double x = ThreadLocalRandom.current().nextDouble() * 2 - 1; - double y = ThreadLocalRandom.current().nextDouble() * 2 - 1; - double z = ThreadLocalRandom.current().nextDouble() * 2 - 1; - - Location tempLocation = targetLocation.clone(); - - Location simulatedLocation = tempLocation.add(new Location(tempLocation.getWorld(), 0.0, 1.0, 0.0)) - .add(new Location(tempLocation.getWorld(), x, y, z)); - - Vector toTarget = simulatedLocation.subtract(zombie.getLocation()).toVector().normalize(); - - zombieLocation.getWorld().spawnParticle(Particle.SMOKE_NORMAL, zombieLocation.clone().add(new Vector(0, 0.5, 0)), 0, toTarget.getX(), toTarget.getY(), toTarget.getZ(), 0.75); - - } - - } - - counter++; - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); - - } - - private static void goldShotgun(Zombie zombie, Location livingEntityLocation) { - - int projectileCount = 200; - ItemStack visualProjectileItemStack = new ItemStack(Material.GOLD_NUGGET, 1); - List itemList = new ArrayList<>(); - - for (int i = 0; i < projectileCount; i++) { - - double x = ThreadLocalRandom.current().nextDouble() * 2 - 1; - double y = ThreadLocalRandom.current().nextDouble() * 2 - 1; - double z = ThreadLocalRandom.current().nextDouble() * 2 - 1; - - Location tempLocation = livingEntityLocation.clone(); - - Location simulatedLocation = tempLocation.add(new Location(tempLocation.getWorld(), 0.0, 1.0, 0.0)) - .add(new Location(tempLocation.getWorld(), x, y, z)); - - Vector toPlayer = simulatedLocation.subtract(zombie.getLocation()).toVector().normalize(); - - /* - Set custom lore to prevent item stacking - */ - ItemMeta itemMeta = visualProjectileItemStack.getItemMeta(); - List lore = new ArrayList<>(); - lore.add("" + ThreadLocalRandom.current().nextDouble() + "" + ThreadLocalRandom.current().nextDouble()); - itemMeta.setLore(lore); - visualProjectileItemStack.setItemMeta(itemMeta); - - Item visualProjectile = zombie.getLocation().add(new Location(livingEntityLocation.getWorld(), 0.0, 1.0, 0.0)).getWorld().dropItem(zombie.getLocation(), visualProjectileItemStack); - - visualProjectile.setGravity(false); - visualProjectile.setVelocity(toPlayer.multiply(0.9)); - visualProjectile.setPickupDelay(Integer.MAX_VALUE); - EntityTracker.registerCullableEntity(visualProjectile); - - itemList.add(visualProjectile); - - } - - new BukkitRunnable() { - - int counter = 0; - - @Override - public void run() { - - if (itemList.size() == 0) cancel(); - - Iterator iterator = itemList.iterator(); - - while (iterator.hasNext()) { - - Item item = iterator.next(); - - if (item == null || !item.isValid() || item.isDead()) - iterator.remove(); - - else if (goldNuggetDamage(item.getNearbyEntities(0.5, 0.5, 0.5), zombie)) { - - iterator.remove(); - item.remove(); - - } - - - if (counter > 20 * 3) { - - iterator.remove(); - if (item != null) item.remove(); - - } - - } - - if (counter > 20 * 3) - cancel(); - - counter++; - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); - - } - - private static boolean goldNuggetDamage(List entityList, Zombie zombie) { - - for (Entity entity : entityList) { - - if (!(entity instanceof LivingEntity)) continue; - if (entity.getType().equals(EntityType.ZOMBIE)) continue; - return BossSpecialAttackDamage.dealSpecialDamage(zombie, (LivingEntity) entity, 1); - - } - - return false; - - } - - public static void equipTreasureGoblin(Zombie zombie) { - - zombie.getEquipment().setHelmet(new ItemStack(Material.GOLD_HELMET, 1)); - zombie.getEquipment().setChestplate(new ItemStack(Material.GOLD_CHESTPLATE)); - zombie.getEquipment().setLeggings(new ItemStack(Material.GOLD_LEGGINGS)); - zombie.getEquipment().setBoots(new ItemStack(Material.GOLD_BOOTS)); - - } - - -} diff --git a/src/main/java/com/magmaguy/elitemobs/events/mobs/ZombieKing.java b/src/main/java/com/magmaguy/elitemobs/events/mobs/ZombieKing.java deleted file mode 100644 index fb9d64c75..000000000 --- a/src/main/java/com/magmaguy/elitemobs/events/mobs/ZombieKing.java +++ /dev/null @@ -1,529 +0,0 @@ -package com.magmaguy.elitemobs.events.mobs; - -import com.magmaguy.elitemobs.ChatColorConverter; -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.EventsConfig; -import com.magmaguy.elitemobs.events.BossSpecialAttackDamage; -import com.magmaguy.elitemobs.events.DeadMoon; -import com.magmaguy.elitemobs.events.EventMessage; -import com.magmaguy.elitemobs.events.mobs.sharedeventproperties.DynamicBossLevelConstructor; -import com.magmaguy.elitemobs.items.uniqueitems.ZombieKingsAxe; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobconstructor.TimedBossMobEntity; -import com.magmaguy.elitemobs.mobpowers.PowerCooldown; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.Particle; -import org.bukkit.entity.*; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.Vector; - -import java.util.HashSet; -import java.util.UUID; -import java.util.concurrent.ThreadLocalRandom; - -public class ZombieKing implements Listener { - - private static HashSet zombieKingList = new HashSet<>(); - - public static EliteMobEntity getZombieKing(Zombie zombie) { - if (zombieKingList.isEmpty()) return null; - for (EliteMobEntity bossMobEntity : zombieKingList) - if (bossMobEntity.getLivingEntity().equals(zombie)) - return bossMobEntity; - return null; - } - - public static void spawnZombieKing(Location location) { - - DeadMoon.entityQueued = false; - - int kingLevel = DynamicBossLevelConstructor.findDynamicBossLevel(); - TimedBossMobEntity zombieKing = new TimedBossMobEntity(EntityType.ZOMBIE, location, kingLevel, - ConfigValues.eventsConfig.getString(EventsConfig.DEAD_MOON_ZOMBIE_KING_NAME)); - - zombieKingList.add(zombieKing); - zombieKingFlair((Zombie) zombieKing.getLivingEntity()); - - ((Zombie) zombieKing.getLivingEntity()).setBaby(false); - - zombieKing.getLivingEntity().getEquipment().setBoots(new ItemStack(Material.DIAMOND_BOOTS)); - zombieKing.getLivingEntity().getEquipment().setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS)); - zombieKing.getLivingEntity().getEquipment().setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE)); - zombieKing.getLivingEntity().getEquipment().setHelmet(new ItemStack(Material.GOLD_HELMET)); - zombieKing.getLivingEntity().getEquipment().setItemInMainHand(new ItemStack(Material.GOLD_AXE)); - - EventMessage.sendEventMessage(zombieKing.getLivingEntity(), ConfigValues.eventsConfig.getString(EventsConfig.DEAD_MOON_EVENT_ANNOUNCEMENT_TEXT)); - - } - - private static void zombieKingFlair(Zombie zombieKing) { - - new BukkitRunnable() { - - UUID uuid = zombieKing.getUniqueId(); - - @Override - public void run() { - - Zombie localZombieKing = zombieKing; - - if (!zombieKing.isValid()) - if (Bukkit.getEntity(uuid) != null && Bukkit.getEntity(uuid).isValid()) - localZombieKing = (Zombie) Bukkit.getEntity(uuid); - - if (!zombieKing.isDead()) { - - localZombieKing.getWorld().spawnParticle(Particle.FLAME, localZombieKing.getLocation(), 4, 0.05, 0.15, 0.05, 0.03); - localZombieKing.getWorld().spawnParticle(Particle.FLAME, localZombieKing.getLocation().add(new Vector(0, 0.5, 0)), 3, 0.05, 0.15, 0.05, 0.03); - localZombieKing.getWorld().spawnParticle(Particle.FLAME, localZombieKing.getLocation().add(new Vector(0, 1, 0)), 2, 0.05, 0.15, 0.05, 0.03); - - } else - cancel(); - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); - - } - - private static HashSet flamethrowerCooldown = new HashSet<>(); - private static HashSet unholySmiteCooldown = new HashSet<>(); - private static HashSet minionsCooldown = new HashSet<>(); - - @EventHandler - public void onHit(EntityDamageByEntityEvent event) { - - if (!event.getEntity().getType().equals(EntityType.ZOMBIE)) return; - EliteMobEntity eliteMobEntity = getZombieKing((Zombie) event.getEntity()); - if (eliteMobEntity == null) return; - - LivingEntity livingEntity; - - if (event.getDamager() instanceof LivingEntity) - livingEntity = (LivingEntity) event.getDamager(); - else if (event.getDamager() instanceof Projectile && - ((Projectile) event.getDamager()).getShooter() instanceof LivingEntity) - livingEntity = (LivingEntity) ((Projectile) event.getDamager()).getShooter(); - else - livingEntity = null; - - if (livingEntity == null) return; - - if (ThreadLocalRandom.current().nextDouble() < 0.20) { - - if (ThreadLocalRandom.current().nextDouble() < 0.33) { - - if (!PowerCooldown.isInCooldown(eliteMobEntity, flamethrowerCooldown)) { - - PowerCooldown.startCooldownTimer(eliteMobEntity, flamethrowerCooldown, - 20 * ConfigValues.eventsConfig.getInt(EventsConfig.ZOMBIE_KING_FLAMETHROWER_INTERVAL)); - initializeFlamethrower(event.getEntity().getLocation().clone(), livingEntity.getLocation().clone(), (LivingEntity) event.getEntity()); - - } - - } else if (ThreadLocalRandom.current().nextDouble() < 0.66) { - - if (PowerCooldown.isInCooldown(eliteMobEntity, unholySmiteCooldown)) { - - PowerCooldown.startCooldownTimer(eliteMobEntity, unholySmiteCooldown, - 20 * ConfigValues.eventsConfig.getInt(EventsConfig.ZOMBIE_KING_UNHOLY_SMITE_INTERVAL)); - initializeUnholySmite((LivingEntity) event.getEntity()); - - } - - } else { - - if (PowerCooldown.isInCooldown(eliteMobEntity, minionsCooldown)) { - - PowerCooldown.startCooldownTimer(eliteMobEntity, minionsCooldown, - 20 * ConfigValues.eventsConfig.getInt(EventsConfig.ZOMBIE_KING_SUMMON_MINIONS_INTERVAL)); - initializeSummonMinions((LivingEntity) event.getEntity()); - - } - - } - - } - - } - - private static void initializeFlamethrower(Location sourceLocation, Location targetLocation, LivingEntity shooter) { - - Vector toTarget = targetLocation.clone().subtract(sourceLocation).toVector().normalize(); - shooter.setAI(false); - - initializeFlamethrower(sourceLocation, toTarget, shooter, false); - - } - - public static void initializeFlamethrower(Location sourceLocation, Vector targetVector, LivingEntity shooter, boolean shotByPlayer) { - - createDamagePath(sourceLocation.add(new Vector(0, 1, 0)), targetVector, shooter, shotByPlayer); - - } - - private static void createDamagePath(Location sourceLocation, Vector toTarget, LivingEntity shooter, boolean shotByPlayer) { - - int flamePoints = 20; - - new BukkitRunnable() { - - int counter = 0; - - @Override - public void run() { - - if (counter > flamePoints) - cancel(); - - Location newLocation = sourceLocation.add(toTarget); - - flamethrowerDamage(newLocation, shooter, toTarget, shotByPlayer); - - counter++; - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); - - } - - private static void flamethrowerDamage(Location location, LivingEntity shooter, Vector directionVector, boolean shotByPlayer) { - - new BukkitRunnable() { - - int counter = 0; - - @Override - public void run() { - - if (counter > 3 * 20) { - - if (!(shooter instanceof Player)) shooter.setAI(true); - cancel(); - - } - - /* - Reserve first second to early warning, remaining two seconds for damage - */ - if (counter > 10) { - - if (counter < 2 * 20) { - - for (int i = 0; i < 5; i++) { - - double offsetX = (ThreadLocalRandom.current().nextDouble() - 0.5) * 0.1 + directionVector.getX(); - double offsetY = (ThreadLocalRandom.current().nextDouble() - 0.5) * 0.1 + directionVector.getY(); - double offsetZ = (ThreadLocalRandom.current().nextDouble() - 0.5) * 0.1 + directionVector.getZ(); - double offsetVelocity = ThreadLocalRandom.current().nextDouble() + 0.05; - - if (shooter instanceof Player) - shooter.getLocation().getWorld().spawnParticle(Particle.FLAME, shooter.getEyeLocation().clone().add(directionVector), 0, offsetX, offsetY, offsetZ, offsetVelocity); - else - shooter.getLocation().getWorld().spawnParticle(Particle.FLAME, shooter.getEyeLocation().clone().subtract(new Vector(0, 0.5, 0)).clone().add(directionVector), 0, offsetX, offsetY, offsetZ, offsetVelocity); - - } - - } - - for (Entity entity : location.getWorld().getNearbyEntities(location, 1, 1, 1)) { - - if (!entity.equals(shooter) && entity instanceof LivingEntity) { - - if (shotByPlayer && entity instanceof Player) { - - //TODO: add pvp mechanics here - - } else { - BossSpecialAttackDamage.dealSpecialDamage(shooter, (LivingEntity) entity, 1); - } - - } - - } - - } - - if (counter < 10 || counter > 2 * 20) { - - for (int i = 0; i < 5; i++) { - - double offsetX = (ThreadLocalRandom.current().nextDouble() - 0.5) * 0.1 + directionVector.getX(); - double offsetY = (ThreadLocalRandom.current().nextDouble() - 0.5) * 0.1 + directionVector.getY(); - double offsetZ = (ThreadLocalRandom.current().nextDouble() - 0.5) * 0.1 + directionVector.getZ(); - double offsetVelocity = ThreadLocalRandom.current().nextDouble() + 0.05; - - if (shooter instanceof Player) - shooter.getLocation().getWorld().spawnParticle(Particle.SMOKE_NORMAL, shooter.getEyeLocation().clone().add(directionVector), 0, offsetX, offsetY, offsetZ, offsetVelocity); - else - shooter.getLocation().getWorld().spawnParticle(Particle.SMOKE_NORMAL, shooter.getEyeLocation().subtract(new Vector(0, 0.5, 0)).clone().add(directionVector), 0, offsetX, offsetY, offsetZ, offsetVelocity); - } - - } - - counter++; - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 1, 1); - - } - - private void initializeUnholySmite(LivingEntity livingEntity) { - - livingEntity.setAI(false); - unholySmitePhaseOne(livingEntity, Particle.SMOKE_NORMAL, false, 10); - - } - - private void unholySmitePhaseOne(LivingEntity zombieKing, Particle particle, boolean doDamage, double duration) { - - new BukkitRunnable() { - - int counter = 0; - - @Override - public void run() { - - if (counter > duration) { - - if (!doDamage) { - - unholySmitePhaseOne(zombieKing, Particle.FLAME, true, 20 * 2 + 1); - unholySmitePhaseTwo(zombieKing, Particle.SMOKE_NORMAL, false, 10); - - } - - cancel(); - - } - - Vector directionVector = new Vector(0, 1, 0); - - if (!doDamage) { - - spawnUnholySmitePhaseOneParticle(directionVector, zombieKing, particle); - - } else { - - spawnUnholySmitePhaseOneParticle(directionVector, zombieKing, particle); - unholySmiteDamage(zombieKing, 0.5, 50, 0.5); - - } - - counter++; - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); - - } - - private void unholySmitePhaseTwo(LivingEntity zombieKing, Particle particle, boolean doDamage, double duration) { - - new BukkitRunnable() { - - int counter = 0; - - @Override - public void run() { - - if (counter > duration) { - - if (!doDamage) { - - unholySmitePhaseTwo(zombieKing, Particle.FLAME, true, 20 * 2 + 0.5); - unholySmitePhaseThree(zombieKing, Particle.SMOKE_NORMAL, false, 10); - - } - cancel(); - - } - - Vector directionVector = new Vector(0, 1, 0); - - if (!doDamage) { - - spawnUnholySmitePhaseTwoParticle(directionVector, zombieKing, particle); - - } else { - - spawnUnholySmitePhaseTwoParticle(directionVector, zombieKing, particle); - unholySmiteDamage(zombieKing, 3, 50, 3); - - } - - counter++; - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); - - } - - private void unholySmitePhaseThree(LivingEntity zombieKing, Particle particle, boolean doDamage, double duration) { - - new BukkitRunnable() { - - int counter = 0; - - @Override - public void run() { - - if (counter > duration) { - - if (!doDamage) unholySmitePhaseThree(zombieKing, Particle.FLAME, true, 20 * 2); - else zombieKing.setAI(true); - cancel(); - - } - - if (!doDamage) { - - spawnUnholySmitePhaseThreeParticle(zombieKing, particle); - - } else { - - spawnUnholySmitePhaseThreeParticle(zombieKing, particle); - unholySmiteDamage(zombieKing, 5, 4, 5); - - } - - counter++; - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); - - } - - - private void spawnUnholySmitePhaseOneParticle(Vector directionVector, LivingEntity livingEntity, Particle particle) { - - for (int i = 0; i < 10; i++) { - - double offsetVelocity = ThreadLocalRandom.current().nextDouble() * 2; - - double offsetLocationX = (ThreadLocalRandom.current().nextDouble() - 0.5) * 0.5 + livingEntity.getLocation().getX(); - double offsetLocationZ = (ThreadLocalRandom.current().nextDouble() - 0.5) * 0.5 + livingEntity.getLocation().getZ(); - - Location offsetLocation = new Location(livingEntity.getWorld(), offsetLocationX, livingEntity.getLocation().getY(), offsetLocationZ); - - livingEntity.getLocation().getWorld().spawnParticle(particle, offsetLocation, 0, directionVector.getX(), directionVector.getY(), directionVector.getZ(), offsetVelocity); - - } - - } - - private void spawnUnholySmitePhaseTwoParticle(Vector directionVector, LivingEntity livingEntity, Particle particle) { - - for (int i = 0; i < 10; i++) { - - double offsetVelocity = ThreadLocalRandom.current().nextDouble() * 2; - - double offsetLocationX = (ThreadLocalRandom.current().nextDouble() - 0.5) * 3 + livingEntity.getLocation().getX(); - double offsetLocationZ = (ThreadLocalRandom.current().nextDouble() - 0.5) * 3 + livingEntity.getLocation().getZ(); - - Location offsetLocation = new Location(livingEntity.getWorld(), offsetLocationX, livingEntity.getLocation().getY(), offsetLocationZ); - - livingEntity.getLocation().getWorld().spawnParticle(particle, offsetLocation, 0, directionVector.getX(), directionVector.getY(), directionVector.getZ(), offsetVelocity); - - } - - } - - private void spawnUnholySmitePhaseThreeParticle(LivingEntity livingEntity, Particle particle) { - - livingEntity.getLocation().getWorld().spawnParticle(particle, livingEntity.getLocation(), 50, 0.01, 0.01, 0.01, 0.1); - - } - - private void unholySmiteDamage(LivingEntity zombieKing, double range1, double range2, double range3) { - - for (Entity entity : zombieKing.getNearbyEntities(range1, range2, range3)) { - - if (entity instanceof LivingEntity && !entity.equals(zombieKing)) { - - BossSpecialAttackDamage.dealSpecialDamage(zombieKing, (LivingEntity) entity, 1); - } - - } - - } - - private void initializeSummonMinions(LivingEntity zombieKing) { - - zombieKing.setAI(false); - summonMinions(zombieKing); - - } - - private void summonMinions(LivingEntity zombieKing) { - - new BukkitRunnable() { - - int counter = 0; - - @Override - public void run() { - - if (counter > 20 * 3) { - - int amountOfSummonedMobs = 10; - - for (int i = 0; i < amountOfSummonedMobs; i++) - TheReturned.theReturnedConstructor(50, (Zombie) zombieKing); - - zombieKing.setAI(true); - cancel(); - - } - - zombieKing.getWorld().spawnParticle(Particle.PORTAL, zombieKing.getLocation().add(new Vector(0, 1, 0)), 50, 0.01, 0.01, 0.01, 1); - - counter++; - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); - - } - - @EventHandler - public void onDeath(EntityDeathEvent event) { - - if (!event.getEntity().getType().equals(EntityType.ZOMBIE)) return; - EliteMobEntity eliteMobEntity = getZombieKing((Zombie) event.getEntity()); - if (eliteMobEntity == null) return; - - Zombie zombieKing = (Zombie) event.getEntity(); - - ZombieKingsAxe zombieKingAxe = new ZombieKingsAxe(); - ItemStack zombieKingAxeItemStack = zombieKingAxe.constructItemStack(); - - zombieKing.getWorld().dropItem(zombieKing.getLocation(), zombieKingAxeItemStack); - - if (event.getEntity().getKiller() != null) { - - String newMessage = ConfigValues.eventsConfig.getString(EventsConfig.DEAD_MOON_EVENT_PLAYER_END_TEXT) - .replace("$player", event.getEntity().getKiller().getDisplayName()); - - EventMessage.sendEventMessage(event.getEntity(), newMessage); - - } else - EventMessage.sendEventMessage(event.getEntity(), ConfigValues.eventsConfig.getString( - ChatColorConverter.convert(EventsConfig.DEAD_MOON_EVENT_OTHER_END_TEXT))); - - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/events/mobs/sharedeventpowers/SpiritWalk.java b/src/main/java/com/magmaguy/elitemobs/events/mobs/sharedeventpowers/SpiritWalk.java deleted file mode 100644 index ec20d674d..000000000 --- a/src/main/java/com/magmaguy/elitemobs/events/mobs/sharedeventpowers/SpiritWalk.java +++ /dev/null @@ -1,181 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.events.mobs.sharedeventpowers; - -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.EventsConfig; -import com.magmaguy.elitemobs.events.mobs.TreasureGoblin; -import com.magmaguy.elitemobs.events.mobs.ZombieKing; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Projectile; -import org.bukkit.entity.Zombie; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.Vector; - -import java.util.HashMap; -import java.util.concurrent.ThreadLocalRandom; - -public class SpiritWalk implements Listener { - - HashMap entityHitCount = new HashMap<>(); - - @EventHandler - public void onBossMobGotHit(EntityDamageEvent event) { - - if (!(event.getEntity().getType().equals(EntityType.ZOMBIE) && - (ZombieKing.getZombieKing((Zombie) event.getEntity()) != null || - TreasureGoblin.getTreasureGoblin((Zombie) event.getEntity()) != null))) - return; - - if (entityHitCount.containsKey(event.getEntity())) - entityHitCount.put((LivingEntity) event.getEntity(), entityHitCount.get(event.getEntity()) + 1); - else entityHitCount.put((LivingEntity) event.getEntity(), 1); - - if (entityHitCount.get(event.getEntity()) > ConfigValues.eventsConfig.getInt(EventsConfig.SPIRIT_WALK_HIT_INTERVAL)) { - - initializeSpiritWalk((LivingEntity) event.getEntity()); - entityHitCount.put((LivingEntity) event.getEntity(), 0); - } - - } - - @EventHandler - public void onBossMobHit(EntityDamageByEntityEvent event) { - - if (event.getDamager() instanceof Projectile && !(((Projectile) event.getDamager()).getShooter() instanceof LivingEntity)) - return; - if (event.getEntity().getType().equals(EntityType.ZOMBIE) && - (!(ZombieKing.getZombieKing((Zombie) event.getEntity()) != null || - TreasureGoblin.getTreasureGoblin((Zombie) event.getEntity()) != null))) - return; - if (!(event.getDamager() instanceof LivingEntity)) return; - entityHitCount.put((LivingEntity) event.getDamager(), 0); - - } - - private void initializeSpiritWalk(LivingEntity bossMob) { - - new BukkitRunnable() { - - int counter = 1; - - @Override - public void run() { - - if (counter > 3) cancel(); - - Location bossLocation = bossMob.getLocation().clone(); - - for (int i = 0; i < 20; i++) { - - double randomizedX = (ThreadLocalRandom.current().nextDouble() - 0.5) * 5; - double randomizedY = ThreadLocalRandom.current().nextDouble() - 0.5; - double randomizedZ = (ThreadLocalRandom.current().nextDouble() - 0.5) * 5; - - Vector normalizedVector = new Vector(randomizedX, randomizedY, randomizedZ).normalize().multiply(7).multiply(counter); - - Location newSimulatedLocation = bossLocation.add(normalizedVector).clone(); - - Location newValidLocation = checkLocationValidity(newSimulatedLocation); - - if (newValidLocation != null) { - - spiritWalkAnimation(bossMob, bossMob.getLocation(), newValidLocation.add(new Vector(0.5, 1, 0.5))); - cancel(); - break; - } - - } - - counter++; - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); - - } - - private void spiritWalkAnimation(LivingEntity bossMob, Location entityLocation, Location finalLocation) { - - bossMob.setAI(false); - bossMob.setInvulnerable(true); - bossMob.addPotionEffect(new PotionEffect(PotionEffectType.GLOWING, 20 * 10, 1)); - Vector toDestination = finalLocation.clone().subtract(entityLocation.clone()).toVector().normalize().divide(new Vector(2, 2, 2)); - - new BukkitRunnable() { - - int counter = 0; - - @Override - public void run() { - - if (bossMob.getLocation().clone().distance(finalLocation) < 2 || counter > 20 * 10) { - - bossMob.teleport(finalLocation); - bossMob.setAI(true); - bossMob.setInvulnerable(false); - bossMob.removePotionEffect(PotionEffectType.GLOWING); - cancel(); - - } - - bossMob.teleport(bossMob.getLocation().clone().add(toDestination.clone())); - - counter++; - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); - - } - - private Location checkLocationValidity(Location simulatedLocation) { - - if (simulatedLocation.getBlock().getType().equals(Material.AIR)) { - - int counter = 1; - - while (true) { - - if (simulatedLocation.getY() < 1) return null; - - Location blockUnderCurrentBlock = simulatedLocation.clone().subtract(new Vector(0, counter, 0)); - - if (blockUnderCurrentBlock.getBlock().getType() != Material.AIR) return blockUnderCurrentBlock; - - if (counter > 10) return null; - - counter++; - - } - - } - - return null; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/events/mobs/sharedeventproperties/ActionDynamicBossLevelConstructor.java b/src/main/java/com/magmaguy/elitemobs/events/mobs/sharedeventproperties/ActionDynamicBossLevelConstructor.java deleted file mode 100644 index aa2962635..000000000 --- a/src/main/java/com/magmaguy/elitemobs/events/mobs/sharedeventproperties/ActionDynamicBossLevelConstructor.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.magmaguy.elitemobs.events.mobs.sharedeventproperties; - -import com.magmaguy.elitemobs.mobspawning.MobLevelCalculator; -import org.bukkit.Location; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; - -public class ActionDynamicBossLevelConstructor { - - public static int determineDynamicBossLevel(Location bossLocation) { - - int bossLevel = 1; - - for (Entity entity : bossLocation.getWorld().getNearbyEntities(bossLocation, 50, 50, 50)) { - - if (entity instanceof Player) { - - bossLevel += MobLevelCalculator.determineMobLevel((Player) entity); - - } - - } - - return bossLevel; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/events/mobs/sharedeventproperties/BossMobDeathCountdown.java b/src/main/java/com/magmaguy/elitemobs/events/mobs/sharedeventproperties/BossMobDeathCountdown.java deleted file mode 100644 index 3d6dcdb50..000000000 --- a/src/main/java/com/magmaguy/elitemobs/events/mobs/sharedeventproperties/BossMobDeathCountdown.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.events.mobs.sharedeventproperties; - -import com.magmaguy.elitemobs.ChatColorConverter; -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.EventsConfig; -import com.magmaguy.elitemobs.events.EventMessage; -import org.bukkit.entity.LivingEntity; -import org.bukkit.scheduler.BukkitRunnable; - -public class BossMobDeathCountdown { - - public static void startDeathCountdown(LivingEntity entity) { - - new BukkitRunnable() { - - @Override - public void run() { - - if (entity.isDead()) return; - - entity.remove(); - String eventMessage = ChatColorConverter.convert(ConfigValues.eventsConfig.getString(EventsConfig.EVENT_TIMEOUT_MESSAGE) - .replace("$bossmob", entity.getCustomName())); - EventMessage.sendEventMessage(entity, eventMessage); - - } - - }.runTaskLater(MetadataHandler.PLUGIN, (long) (20 * 60 * ConfigValues.eventsConfig.getDouble(EventsConfig.EVENT_TIMEOUT_TIME))); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/events/mobs/sharedeventproperties/DynamicBossLevelConstructor.java b/src/main/java/com/magmaguy/elitemobs/events/mobs/sharedeventproperties/DynamicBossLevelConstructor.java deleted file mode 100644 index 6cf3aef70..000000000 --- a/src/main/java/com/magmaguy/elitemobs/events/mobs/sharedeventproperties/DynamicBossLevelConstructor.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.magmaguy.elitemobs.events.mobs.sharedeventproperties; - -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; -import com.magmaguy.elitemobs.items.ItemTierFinder; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; - -public class DynamicBossLevelConstructor { - - public static int findDynamicBossLevel() { - - int mobLevel = 0; - - for (Player player : Bukkit.getServer().getOnlinePlayers()) - if (ItemTierFinder.findPlayerTier(player) * ConfigValues.mobCombatSettingsConfig.getInt(MobCombatSettingsConfig.PER_TIER_LEVEL_INCREASE) > mobLevel) - mobLevel = (int) ((ItemTierFinder.findPlayerTier(player) + 2.5) * ConfigValues.mobCombatSettingsConfig.getInt(MobCombatSettingsConfig.PER_TIER_LEVEL_INCREASE)); - - if (mobLevel == 0) - mobLevel = (int) (2.5 * ConfigValues.mobCombatSettingsConfig.getInt(MobCombatSettingsConfig.PER_TIER_LEVEL_INCREASE)); - - return mobLevel; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/explosionregen/Explosion.java b/src/main/java/com/magmaguy/elitemobs/explosionregen/Explosion.java new file mode 100644 index 000000000..848fe63e0 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/explosionregen/Explosion.java @@ -0,0 +1,339 @@ +package com.magmaguy.elitemobs.explosionregen; + +import com.magmaguy.elitemobs.EliteMobs; +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteExplosionEvent; +import com.magmaguy.elitemobs.combatsystem.EliteProjectile; +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.thirdparty.worldguard.WorldGuardFlagChecker; +import com.magmaguy.elitemobs.utils.EntityFinder; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.block.*; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Projectile; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityExplodeEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.persistence.PersistentDataType; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.BoundingBox; +import org.bukkit.util.Vector; + +import java.util.*; + +public class Explosion { + + private static final HashSet explosions = new HashSet<>(); + public final List detonatedBlocks = new ArrayList<>(); + private final int delayBeforeRegen = 2; + private UUID worldUUID; + + public Explosion(List detonatedBlocks) { + if (detonatedBlocks == null || detonatedBlocks.isEmpty()) return; + //sort blocks bottom to top + HashMap unsortedBlocks = new HashMap<>(); + for (BlockState blockState : detonatedBlocks) + unsortedBlocks.put(blockState, blockState.getY()); + + unsortedBlocks.entrySet().stream().sorted(Map.Entry.comparingByValue()) + .forEachOrdered(x -> this.detonatedBlocks.add(x.getKey())); + + worldUUID = detonatedBlocks.get(0).getWorld().getUID(); + + explosions.add(this); + regenerate(); + } + + public static void regenerateAllPendingBlocks() { + for (Explosion explosion : explosions) + explosion.resetAllBlocks(); + } + + public static void generateFakeExplosion(List blockList, Entity entity, PowersConfigFields powersConfigFields, Location explosionSourceLocation) { + generateExplosion(blockList, entity, powersConfigFields, explosionSourceLocation); + } + + public static void generateFakeExplosion(List blockList, Entity entity) { + generateExplosion(blockList, entity, null, null); + } + + private static void generateExplosion(EntityExplodeEvent event) { + generateExplosion(event.blockList(), event.getEntity(), null, event.getEntity().getLocation()); + } + + private static void generateExplosion(List blockList, Entity entity, PowersConfigFields powersConfigFields, Location explosionSource) { + if (!DefaultConfig.isDoExplosionRegen()) return; + if (EliteMobs.worldGuardIsEnabled && + explosionSource != null && + !WorldGuardFlagChecker.doExplosionRegenFlag(explosionSource)) + return; + + ArrayList blockStates = new ArrayList<>(); + + for (Block block : blockList) { + if (block.getType().isAir() || + block.getType().equals(Material.FIRE) || + block.isLiquid() || + EntityTracker.isTemporaryBlock(block)) + continue; + nearbyBlockScan(blockStates, block.getState()); + } + + Entity shooter = EntityFinder.filterRangedDamagers(entity); + EliteEntity eliteEntity = null; + if (shooter != null) + eliteEntity = EntityTracker.getEliteMobEntity(shooter); + + EliteExplosionEvent eliteExplosionEvent = null; + + //for projectiles + if (entity instanceof Projectile) { + eliteExplosionEvent = new EliteExplosionEvent( + eliteEntity, + powersConfigFields = PowersConfig.getPower(EliteProjectile.readExplosivePower((Projectile) entity)), + entity.getLocation(), + blockStates); + } else { + eliteExplosionEvent = new EliteExplosionEvent( + eliteEntity, + powersConfigFields, + entity.getLocation(), + blockStates); + } + if (eliteExplosionEvent.isCancelled()) return; + + if (explosionSource != null) + eliteExplosionEvent.setExplosionSourceLocation(explosionSource); + + eliteExplosionEvent.visualExplosionEffect(powersConfigFields); + + for (BlockState blockState : blockStates) { + blockState.getBlock().setType(Material.AIR); + blockState.getBlock().getState().update(true); + } + + new Explosion(blockStates); + + } + + /** + * This scans the blocks adjacent to the block getting blown up. This is because certain blocks like ladders will break + * when lacking the support of the source block + * + * @param blockState + */ + private static void nearbyBlockScan(ArrayList blockStates, BlockState blockState) { + queueBlock(blockStates, blockState); + for (int x = -1; x < 2; x++) + for (int y = -1; y < 2; y++) + for (int z = -1; z < 2; z++) { + Location blockLocation = blockState.getLocation().clone().add(new Vector(x, y, z)); + BlockState iteratedBlockState = blockLocation.getBlock().getState(); + if (blockStates.contains(iteratedBlockState)) continue; + if (!isCodependentBlock(iteratedBlockState, y)) continue; + nearbyBlockScan(blockStates, iteratedBlockState); + } + } + + private static boolean isCodependentBlock(BlockState blockState, int y) { + //Getter for blocks that will break if the block below breaks + if (y == 1) { + switch (blockState.getType()) { + case SUGAR_CANE: + case STRUCTURE_BLOCK: + case TALL_GRASS: + + case BLACK_CARPET: + case BLUE_CARPET: + case BROWN_CARPET: + case CYAN_CARPET: + case GRAY_CARPET: + case GREEN_CARPET: + case LIGHT_BLUE_CARPET: + case LIGHT_GRAY_CARPET: + case LIME_CARPET: + case MAGENTA_CARPET: + case ORANGE_CARPET: + case CARVED_PUMPKIN: + case PINK_CARPET: + case PURPLE_CARPET: + case RED_CARPET: + case WHITE_CARPET: + case YELLOW_CARPET: + + case DARK_OAK_DOOR: + case ACACIA_DOOR: + case BIRCH_DOOR: + case CRIMSON_DOOR: + case IRON_DOOR: + case JUNGLE_DOOR: + case OAK_DOOR: + case SPRUCE_DOOR: + case WARPED_DOOR: + + + case SUNFLOWER: + case WHEAT: + case BROWN_MUSHROOM: + case RED_MUSHROOM: + case DANDELION: + case NETHER_WART: + + + case REDSTONE: + case COMPARATOR: + case REPEATER: + + case TORCH: + case REDSTONE_TORCH: + + return true; + } + } + + //Getter for blocks that will break if the block above goes away + if (y == -1) { + if (blockState.getType() == Material.VINE) { + return true; + } + } + + //Generic getter for codependent blocks, blocks that would break if the adjacent block breaks + switch (blockState.getType()) { + case PAINTING: + case LADDER: + case LANTERN: + case VINE: + case SOUL_LANTERN: + + case TRIPWIRE: + case TRIPWIRE_HOOK: + + case REDSTONE_WALL_TORCH: + case WALL_TORCH: + + case ACACIA_TRAPDOOR: + case BIRCH_TRAPDOOR: + case CRIMSON_TRAPDOOR: + case DARK_OAK_TRAPDOOR: + case IRON_TRAPDOOR: + case JUNGLE_TRAPDOOR: + case OAK_TRAPDOOR: + case SPRUCE_TRAPDOOR: + case WARPED_TRAPDOOR: + + case COCOA_BEANS: + return true; + + default: + return false; + } + } + + private static void queueBlock(ArrayList blockStates, BlockState blockState) { + if (!DefaultConfig.isDoRegenerateContainers() && blockState instanceof Container) + return; + blockStates.add(blockState.getBlock().getState()); + if (blockState instanceof Container) + if (blockState instanceof Chest) + ((Chest) blockState).getBlockInventory().setContents(new ItemStack[0]); + else + ((Container) blockState).getInventory().setContents(new ItemStack[0]); + } + + public void resetAllBlocks() { + for (BlockState blockState : detonatedBlocks) + fullBlockRestore(blockState, true); + detonatedBlocks.clear(); + } + + public void regenerate() { + + Explosion explosion = this; + + new BukkitRunnable() { + @Override + public void run() { + if (detonatedBlocks.isEmpty()) { + explosions.remove(explosion); + cancel(); + return; + } + + BlockState firstBlock = detonatedBlocks.get(0); + fullBlockRestore(firstBlock, false); + + } + }.runTaskTimer(MetadataHandler.PLUGIN, 20 * 60 * delayBeforeRegen, 1); + + } + + private void fullBlockRestore(BlockState blockState, boolean isShutdown) { + + //Things like instanced dungeons can unload in the meanwhile + if (Bukkit.getWorld(worldUUID) == null) return; + + for (Entity entity : blockState.getWorld().getNearbyEntities(new BoundingBox(blockState.getX(), blockState.getY(), blockState.getZ(), + blockState.getX() + 1, blockState.getY() + 1, blockState.getZ() + 1))) + entity.teleport(entity.getLocation().clone().add(new Vector(0, 1, 0))); + + blockState.setBlockData(blockState.getBlockData()); + + if (blockState instanceof Container) { + + Inventory container = null; + + switch (blockState.getType()) { + + case LECTERN: + container = ((Lectern) blockState).getInventory(); + break; + + case JUKEBOX: + //((Jukebox) blockState).setRecord(this.items.get(0)); + blockState.update(true, false); + break; + + default: + container = ((Container) blockState).getInventory(); + } + + if (container != null) container.setContents(((Container) blockState).getInventory().getContents()); + } + + blockState.update(true); + if (!isShutdown) + detonatedBlocks.remove(blockState); + } + + public static class ExplosionEvent implements Listener { + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void entityExplodeEvent(EntityExplodeEvent event) { + Entity entity = event.getEntity(); + if (entity instanceof Projectile projectile && projectile.getShooter() instanceof LivingEntity shooter) + entity = shooter; + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(entity); + if (eliteEntity != null) { + generateExplosion(event); + return; + } + if (EntityTracker.isProjectileEntity(event.getEntity())) + generateExplosion(event); + //binder of worlds fight bypass, set in the custom reinforcements + if (event.getEntity().getPersistentDataContainer().has(new NamespacedKey(MetadataHandler.PLUGIN, "eliteCrystal"), PersistentDataType.STRING)) + generateExplosion(event); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/initialsetup/FirstTimeSetup.java b/src/main/java/com/magmaguy/elitemobs/initialsetup/FirstTimeSetup.java new file mode 100644 index 000000000..ffd3842a0 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/initialsetup/FirstTimeSetup.java @@ -0,0 +1,43 @@ +package com.magmaguy.elitemobs.initialsetup; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import com.magmaguy.magmacore.util.ChatColorConverter; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.scheduler.BukkitRunnable; + +public class FirstTimeSetup implements Listener { + @EventHandler + public void onPlayerLogin(PlayerJoinEvent event) { + if (DefaultConfig.isSetupDone()) return; + if (!event.getPlayer().hasPermission("elitemobs.*")) return; + new BukkitRunnable() { + @Override + public void run() { + if (!event.getPlayer().isOnline()) return; + event.getPlayer().sendMessage("----------------------------------------------------"); + event.getPlayer().sendMessage(ChatColorConverter.convert("&7[EliteMobs] &fInitial setup message:")); + event.getPlayer().sendMessage(ChatColorConverter.convert("&7Welcome to EliteMobs!" + + " &c&lIt looks like you may not have set up EliteMobs yet! &2To install EliteMobs, do &a/em setup &2!")); + event.getPlayer().sendMessage(ChatColorConverter.convert("&7Need command help? &6&l/em help")); + event.getPlayer().sendMessage(ChatColorConverter.convert("&7You can get support over at &9&n" + DiscordLinks.mainLink)); + TextComponent setupMessage = new TextComponent(ChatColorConverter.convert("&cAlready completed your installation?")); + TextComponent setupDone = new TextComponent(ChatColorConverter.convert("&c&nClick here!")); + setupDone.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder("Never show this again!").create())); + setupDone.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/elitemobs setup done")); + setupMessage.addExtra(setupDone); + event.getPlayer().spigot().sendMessage(setupMessage); + event.getPlayer().sendMessage(ChatColorConverter.convert("&8&oThis message will only be sent to admins!")); + + event.getPlayer().sendMessage("----------------------------------------------------"); + } + }.runTaskLater(MetadataHandler.PLUGIN, 20 * 10); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/instanced/InstanceDeathLocation.java b/src/main/java/com/magmaguy/elitemobs/instanced/InstanceDeathLocation.java new file mode 100644 index 000000000..696e75ff1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/instanced/InstanceDeathLocation.java @@ -0,0 +1,85 @@ +package com.magmaguy.elitemobs.instanced; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.internal.RemovalReason; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.utils.VisualDisplay; +import com.magmaguy.magmacore.util.ChatColorConverter; +import lombok.Getter; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.entity.TextDisplay; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +public class InstanceDeathLocation { + private final MatchInstance matchInstance; + @Getter + private Block bannerBlock; + @Getter + private Player deadPlayer; + private Location deathLocation = null; + private TextDisplay nameTag; + private TextDisplay livesLeft; + private TextDisplay instructions; + + + protected InstanceDeathLocation(Player player, MatchInstance matchInstance) { + this.matchInstance = matchInstance; + if (matchInstance.playerLives.get(player) < 1) + return; + this.deadPlayer = player; + this.bannerBlock = player.getLocation().getBlock(); + findBannerLocation(player.getLocation()); + instructions = VisualDisplay.generateTemporaryTextDisplay(deathLocation.clone().add(new Vector(0, 2.2, 0)), ChatColorConverter.convert("&2Punch to rez!")); + nameTag = VisualDisplay.generateTemporaryTextDisplay(deathLocation.clone().add(new Vector(0, 2, 0)), player.getDisplayName()); + livesLeft = VisualDisplay.generateTemporaryTextDisplay(deathLocation.clone().add(new Vector(0, 1.8, 0)), matchInstance.playerLives.get(deadPlayer) + " lives left!"); + if (deathLocation != null) + matchInstance.deathBanners.put(bannerBlock, this); + + bannerWatchdog(); + } + + private void findBannerLocation(Location location) { + if (location.getBlock().getType().isAir()) + setBannerBlock(location); + else if (location.getY() < 320) + findBannerLocation(location.add(new Vector(0, 1, 0))); + } + + private void setBannerBlock(Location location) { + deathLocation = location; + bannerBlock = location.getBlock(); + EntityTracker.addTemporaryBlock(location.getBlock(), -1, Material.RED_BANNER); + } + + public void clear(boolean resurrect) { + bannerBlock.setType(Material.AIR); + EntityTracker.unregister(nameTag, RemovalReason.EFFECT_TIMEOUT); + EntityTracker.unregister(instructions, RemovalReason.EFFECT_TIMEOUT); + EntityTracker.unregister(livesLeft, RemovalReason.EFFECT_TIMEOUT); + matchInstance.deathBanners.remove(bannerBlock); + if (resurrect) + matchInstance.revivePlayer(deadPlayer, this); + } + + //This is necessary because physics updates might remove the banner while it should still be on there + public void bannerWatchdog() { + new BukkitRunnable() { + @Override + public void run() { + if (!matchInstance.deathBanners.containsKey(bannerBlock)) { + cancel(); + return; + } + if (bannerBlock.getType().equals(Material.RED_BANNER)) return; + EntityTracker.unregister(nameTag, RemovalReason.EFFECT_TIMEOUT); + EntityTracker.unregister(instructions, RemovalReason.EFFECT_TIMEOUT); + EntityTracker.unregister(livesLeft, RemovalReason.EFFECT_TIMEOUT); + findBannerLocation(deathLocation); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 5, 5); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/instanced/InstancePlayerManager.java b/src/main/java/com/magmaguy/elitemobs/instanced/InstancePlayerManager.java new file mode 100644 index 000000000..ac8ea6c47 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/instanced/InstancePlayerManager.java @@ -0,0 +1,182 @@ +package com.magmaguy.elitemobs.instanced; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.PlayerJoinArenaEvent; +import com.magmaguy.elitemobs.api.PlayerJoinDungeonEvent; +import com.magmaguy.elitemobs.api.instanced.MatchJoinEvent; +import com.magmaguy.elitemobs.api.instanced.MatchLeaveEvent; +import com.magmaguy.elitemobs.collateralminecraftchanges.AlternativeDurabilityLoss; +import com.magmaguy.elitemobs.config.ArenasConfig; +import com.magmaguy.elitemobs.instanced.arena.ArenaInstance; +import com.magmaguy.elitemobs.instanced.dungeons.DungeonInstance; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.utils.EventCaller; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.attribute.Attribute; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +public class InstancePlayerManager { + + public static boolean addNewPlayer(Player player, MatchInstance matchInstance) { + MatchJoinEvent event = new MatchJoinEvent(matchInstance, player); + if (event.isCancelled()) return false; + + //Right now new players can't join ongoing instances + if (!matchInstance.state.equals(MatchInstance.InstancedRegionState.WAITING)) { + player.sendMessage(ArenasConfig.getArenasOngoingMessage()); + return false; + } + //Check if match is full + if (matchInstance.players.size() + 1 > matchInstance.maxPlayers) { + player.sendMessage(ArenasConfig.getArenaFullMessage()); + return false; + } + //Check permissions + if (matchInstance.getPermission() != null && !player.hasPermission(matchInstance.getPermission())) + return false; + + //Add the player to the relevant fields + matchInstance.participants.add(player); + matchInstance.players.add(player); + PlayerData.setMatchInstance(player, matchInstance); + player.sendMessage(ArenasConfig.getArenaJoinPlayerMessage().replace("$count", matchInstance.minPlayers + "")); + player.sendTitle(ArenasConfig.getJoinPlayerTitle(), ArenasConfig.getJoinPlayerSubtitle(), 60, 60 * 3, 60); + + //Should be the first join of the player, do the join events + matchInstance.getPreviousPlayerLocations().put(player, player.getLocation()); + if (matchInstance instanceof ArenaInstance arenaInstance) + new EventCaller(new PlayerJoinArenaEvent(arenaInstance)); + else if (matchInstance instanceof DungeonInstance dungeonInstance) + new EventCaller(new PlayerJoinDungeonEvent(dungeonInstance)); + + + new BukkitRunnable() { + @Override + public void run() { + //Teleport the player to the correct location + MatchInstance.MatchInstanceEvents.teleportBypass = true; + if (matchInstance.state.equals(MatchInstance.InstancedRegionState.WAITING) && matchInstance.lobbyLocation != null) + player.teleport(matchInstance.lobbyLocation); + else + player.teleport(matchInstance.startLocation); + + //Set the lives that the player has //todo: this needs to become configurable and be expanded upon in the future + matchInstance.playerLives.put(player, 3); + } + }.runTaskLater(MetadataHandler.PLUGIN, 1); + + return true; + } + + public static void removePlayer(Player player, MatchInstance matchInstance) { + new MatchLeaveEvent(matchInstance, player); + + //Remove match instance where needed + PlayerData.setMatchInstance(player, null); + matchInstance.players.remove(player); + if (!matchInstance.spectators.contains(player)) { + matchInstance.participants.remove(player); + PlayerData.setMatchInstance(player, null); + } + + if (matchInstance.players.isEmpty() && matchInstance.getDeathLocationByPlayer(player) != null) + matchInstance.getDeathLocationByPlayer(player).clear(false); + + //Teleport the player out + if (player.isOnline()) { + MatchInstance.MatchInstanceEvents.teleportBypass = true; + if (matchInstance instanceof DungeonInstance) { + Location location = matchInstance.previousPlayerLocations.get(player); + if (location != null) player.teleport(location); + else player.teleport(matchInstance.exitLocation); + } else + player.teleport(matchInstance.exitLocation); + } + + //End the match if there are no players left because they all died + if (matchInstance.state != MatchInstance.InstancedRegionState.COMPLETED && + matchInstance.state != MatchInstance.InstancedRegionState.COMPLETED_DEFEAT && + matchInstance.state != MatchInstance.InstancedRegionState.COMPLETED_VICTORY && + matchInstance.players.isEmpty()) { + matchInstance.defeat(); + } else + //Remove lives + matchInstance.playerLives.remove(player); + } + + public static void playerDeath(MatchInstance matchInstance, Player player) { + if (!matchInstance.players.contains(player)) return; + AlternativeDurabilityLoss.doDurabilityLoss(player); + player.setHealth(player.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()); + matchInstance.players.remove(player); + if (matchInstance.players.isEmpty()) { + matchInstance.defeat(); + MatchInstance.MatchInstanceEvents.teleportBypass = true; + if (matchInstance.previousPlayerLocations.get(player) != null) + player.teleport(matchInstance.previousPlayerLocations.get(player)); + else if (matchInstance.exitLocation != null) + player.teleport(matchInstance.exitLocation); + PlayerData.setMatchInstance(player, null); + matchInstance.participants.remove(player); + return; + } + new InstanceDeathLocation(player, matchInstance); + matchInstance.addSpectator(player, true); + } + + public static void revivePlayer(MatchInstance matchInstance, Player player, InstanceDeathLocation deathLocation) { + matchInstance.playerLives.put(player, matchInstance.playerLives.get(player) - 1); + matchInstance.players.add(player); + player.setGameMode(GameMode.SURVIVAL); + matchInstance.spectators.remove(player); + MatchInstance.MatchInstanceEvents.teleportBypass = true; + player.teleport(deathLocation.getBannerBlock().getLocation()); + PlayerData.setMatchInstance(player, matchInstance); + } + + public static void addSpectator(MatchInstance matchInstance, Player player, boolean wasPlayer) { + new MatchJoinEvent(matchInstance, player); + + if (!wasPlayer) matchInstance.previousPlayerLocations.put(player, player.getLocation()); + matchInstance.participants.add(player); + player.sendMessage(ArenasConfig.getArenaJoinSpectatorMessage()); + player.sendTitle(ArenasConfig.getJoinSpectatorTitle(), ArenasConfig.getJoinSpectatorSubtitle(), 60, 60 * 3, 60); + matchInstance.spectators.add(player); + player.setGameMode(GameMode.SPECTATOR); + if (!wasPlayer) { + MatchInstance.MatchInstanceEvents.teleportBypass = true; + player.teleport(matchInstance.startLocation); + } + PlayerData.setMatchInstance(player, matchInstance); + } + + public static void removeSpectator(MatchInstance matchInstance, Player player) { + matchInstance.spectators.remove(player); + if (!matchInstance.players.contains(player)) { + PlayerData.setMatchInstance(player, null); + matchInstance.participants.remove(player); + } + player.setGameMode(GameMode.SURVIVAL); + MatchInstance.MatchInstanceEvents.teleportBypass = true; + if (matchInstance instanceof DungeonInstance) { + Location location = matchInstance.previousPlayerLocations.get(player); + if (location != null) player.teleport(location); + else player.teleport(matchInstance.exitLocation); + } else + player.teleport(matchInstance.exitLocation); + PlayerData.setMatchInstance(player, null); + matchInstance.playerLives.remove(player); + if (matchInstance.getDeathLocationByPlayer(player) != null) + matchInstance.getDeathLocationByPlayer(player).clear(false); + } + + public static void removeAnyKind(MatchInstance matchInstance, Player player) { + if (matchInstance.players.contains(player)) matchInstance.removePlayer(player); + if (matchInstance.spectators.contains(player)) matchInstance.removeSpectator(player); + matchInstance.participants.remove(player); + PlayerData.setMatchInstance(player, null); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/instanced/MatchInstance.java b/src/main/java/com/magmaguy/elitemobs/instanced/MatchInstance.java new file mode 100644 index 000000000..a888875c2 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/instanced/MatchInstance.java @@ -0,0 +1,348 @@ +package com.magmaguy.elitemobs.instanced; + + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.instanced.MatchDestroyEvent; +import com.magmaguy.elitemobs.api.instanced.MatchInstantiateEvent; +import com.magmaguy.elitemobs.api.instanced.MatchJoinEvent; +import com.magmaguy.elitemobs.api.instanced.MatchLeaveEvent; +import com.magmaguy.elitemobs.config.ArenasConfig; +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.magmacore.util.ChatColorConverter; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.block.BlockDamageEvent; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.event.player.PlayerTeleportEvent; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; + +public abstract class MatchInstance { + + protected static final HashSet instances = new HashSet<>(); + @Getter + protected final HashMap deathBanners = new HashMap<>(); + @Getter + protected final Map previousPlayerLocations = new HashMap<>(); + @Getter + protected HashSet players = new HashSet<>(); + protected HashMap playerLives = new HashMap(); + @Getter + protected HashSet participants = new HashSet<>(); + protected HashSet spectators = new HashSet<>(); + @Getter + protected InstancedRegionState state = InstancedRegionState.WAITING; + protected Location lobbyLocation = null; + protected Location startLocation; + protected Location exitLocation; + protected int minPlayers; + protected int maxPlayers; + protected World world; + @Getter + protected String permission = null; + @Getter + protected boolean cancelled = false; + + + public MatchInstance(Location startLocation, Location exitLocation, int minPlayers, int maxPlayers) { + MatchInstantiateEvent matchInstantiateEvent = new MatchInstantiateEvent(this); + if (matchInstantiateEvent.isCancelled()) { + cancelled = true; + return; + } + + this.startLocation = startLocation; + this.exitLocation = exitLocation; + this.minPlayers = minPlayers; + this.maxPlayers = maxPlayers; + + startWatchdogs(); + instanceMessages(); + instances.add(this); + } + + public static void shutdown() { + HashSet cloneInstance = new HashSet<>(instances); + cloneInstance.forEach(MatchInstance::destroyMatch); + instances.clear(); + } + + public static MatchInstance getPlayerInstance(Player player) { + for (MatchInstance matchInstance : instances) + for (Player iteratedPlayer : matchInstance.players) + if (iteratedPlayer.equals(player)) return matchInstance; + return null; + } + + public static MatchInstance getSpectatorInstance(Player player) { + for (MatchInstance matchInstance : instances) + for (Player iteratedPlayer : matchInstance.spectators) + if (iteratedPlayer.equals(player)) return matchInstance; + return null; + } + + public static MatchInstance getAnyPlayerInstance(Player player) { + for (MatchInstance matchInstance : instances) { + for (Player iteratedPlayer : matchInstance.players) + if (iteratedPlayer.equals(player)) return matchInstance; + for (Player iteratedPlayer : matchInstance.spectators) + if (iteratedPlayer.equals(player)) return matchInstance; + } + return null; + } + + public boolean addNewPlayer(Player player) { + new MatchJoinEvent(this, player); + return InstancePlayerManager.addNewPlayer(player, this); + } + + public void removePlayer(Player player) { + new MatchLeaveEvent(this, player); + InstancePlayerManager.removePlayer(player, this); + } + + public void playerDeath(Player player) { + InstancePlayerManager.playerDeath(this, player); + } + + public void revivePlayer(Player player, InstanceDeathLocation deathLocation) { + InstancePlayerManager.revivePlayer(this, player, deathLocation); + } + + public void addSpectator(Player player, boolean wasPlayer) { + InstancePlayerManager.addSpectator(this, player, wasPlayer); + } + + public void removeSpectator(Player player) { + new MatchLeaveEvent(this, player); + InstancePlayerManager.removeSpectator(this, player); + } + + public void removeAnyKind(Player player) { + new MatchLeaveEvent(this, player); + InstancePlayerManager.removeAnyKind(this, player); + } + + private void startWatchdogs() { + new WatchdogTask().runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + public void countdownMatch() { + if (state != InstancedRegionState.WAITING) return; + if (players.size() < minPlayers) { + announce(ArenasConfig.getNotEnoughPlayersMessage().replace("$amount", minPlayers + "")); + return; + } + state = InstancedRegionState.STARTING; + new CountdownTask().runTaskTimer(MetadataHandler.PLUGIN, 0L, 20L); + } + + private void playerWatchdog() { + ((HashSet) players.clone()).forEach(player -> { + if (!player.isOnline()) removePlayer(player); + if (!isInRegion(player.getLocation())) { + MatchInstanceEvents.teleportBypass = true; + player.teleport(startLocation); + } + }); + } + + private void spectatorWatchdog() { + ((HashSet) spectators.clone()).forEach(player -> { + if (!player.isOnline()) removeSpectator(player); + if (!isInRegion(player.getLocation())) { + MatchInstanceEvents.teleportBypass = true; + player.teleport(startLocation); + } + }); + } + + private void intruderWatchdog() { + if (state != InstancedRegionState.ONGOING) return; + for (Player player : Bukkit.getOnlinePlayers()) + if (!players.contains(player) && + !spectators.contains(player) && + !player.hasPermission("elitemobs.*") && + isInRegion(player.getLocation())) { + MatchInstanceEvents.teleportBypass = true; + if (exitLocation != null) player.teleport(exitLocation); + else if (PlayerData.getBackTeleportLocation(player) != null) + player.teleport(PlayerData.getBackTeleportLocation(player)); + else player.teleport(DefaultConfig.getDefaultSpawnLocation()); + } + } + + private void instanceMessages() { + Bukkit.getScheduler().scheduleSyncRepeatingTask(MetadataHandler.PLUGIN, () -> { + if (state == InstancedRegionState.WAITING) + announce(ArenasConfig.getArenaStartHintMessage().replace("$count", minPlayers + "")); + }, 0L, 20 * 60L); + } + + protected void announce(String message) { + participants.forEach(player -> player.sendMessage(ChatColorConverter.convert(message))); + } + + private class WatchdogTask extends BukkitRunnable { + @Override + public void run() { + playerWatchdog(); + spectatorWatchdog(); + intruderWatchdog(); + } + } + + private class CountdownTask extends BukkitRunnable { + int counter = 0; + + @Override + public void run() { + if (players.size() < minPlayers) { + cancel(); + endMatch(); + return; + } + counter++; + players.forEach(player -> startMessage(counter, player)); + spectators.forEach(player -> startMessage(counter, player)); + if (counter >= 3) { + startMatch(); + cancel(); + } + } + } + + private void startMessage(int counter, Player player) { + player.sendTitle(ArenasConfig.getStartingTitle(), ArenasConfig.getStartingSubtitle() + .replace("$count", (3 - counter) + ""), 0, 20, 0); + } + + protected abstract boolean isInRegion(Location location); + + protected void startMatch() { + state = InstancedRegionState.ONGOING; + players.forEach(player -> { + MatchInstanceEvents.teleportBypass = true; + player.teleport(startLocation); + }); + participants = (HashSet) players.clone(); + } + + /* + This is useful for extending behavior down the line like the enchanted dungeon loot + */ + protected void victory() { + state = InstancedRegionState.COMPLETED_VICTORY; + endMatch(); + } + + protected void defeat() { + state = InstancedRegionState.COMPLETED_DEFEAT; + endMatch(); + } + + protected void endMatch() { + if (state != InstancedRegionState.COMPLETED_VICTORY && + state != InstancedRegionState.COMPLETED_DEFEAT) + state = InstancedRegionState.COMPLETED; + //todo this should probable call resetMatch() and resetMatch() should probably be renamed because that's not what it does + new MatchDestroyEvent(this); + } + + protected void destroyMatch() { + state = InstancedRegionState.WAITING; + HashSet copy = new HashSet<>(participants); + copy.forEach(this::removeAnyKind); + players.clear(); + spectators.clear(); + deathBanners.values().forEach(deathLocation -> deathLocation.clear(false)); + deathBanners.clear(); + new MatchDestroyEvent(this); + } + + protected InstanceDeathLocation getDeathLocationByPlayer(Player player) { + for (InstanceDeathLocation deathLocation : deathBanners.values()) + if (deathLocation.getDeadPlayer().equals(player)) + return deathLocation; + return null; + } + + public enum InstancedRegionState { + WAITING, STARTING, ONGOING, COMPLETED, COMPLETED_VICTORY, COMPLETED_DEFEAT + } + + public static class MatchInstanceEvents implements Listener { + public static boolean teleportBypass = false; + + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) { + HashSet copy = new HashSet<>(instances); + copy.forEach(instance -> instance.removeAnyKind(event.getPlayer())); + } + + @EventHandler + public void onPlayerBreakBlockEvent(BlockBreakEvent event) { + for (MatchInstance matchInstance : instances) + if (matchInstance.state.equals(InstancedRegionState.ONGOING)) + if (matchInstance.getDeathBanners().get(event.getBlock()) != null) + matchInstance.getDeathBanners().get(event.getBlock()).clear(true); + } + + @EventHandler + public void onPlayerHitFlagEvent(BlockDamageEvent event) { + for (MatchInstance matchInstance : instances) + if (matchInstance.state.equals(InstancedRegionState.ONGOING)) + if (matchInstance.getDeathBanners().get(event.getBlock()) != null) + matchInstance.getDeathBanners().get(event.getBlock()).clear(true); + } + + /** + * This event scans for damage that would kill the player and cancels it with custom behavior it if would + * + * @param event Damage event + */ + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void onPlayerDamage(EntityDamageEvent event) { + if (!event.getEntityType().equals(EntityType.PLAYER)) return; + Player player = (Player) event.getEntity(); + if (event.getFinalDamage() < player.getHealth()) return; + MatchInstance matchInstance = PlayerData.getMatchInstance(player); + if (matchInstance == null) return; + if (matchInstance.state != InstancedRegionState.ONGOING) matchInstance.removePlayer(player); + event.setCancelled(true); + matchInstance.playerDeath(player); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) + public void onPlayerTeleport(PlayerTeleportEvent event) { + if (teleportBypass) { + teleportBypass = false; + return; + } + + MatchInstance matchInstance = PlayerData.getMatchInstance(event.getPlayer()); + if (matchInstance == null) return; + + if (matchInstance.state == InstancedRegionState.WAITING) { + matchInstance.removeAnyKind(event.getPlayer()); + return; + } + event.setCancelled(true); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/instanced/arena/ArenaEntity.java b/src/main/java/com/magmaguy/elitemobs/instanced/arena/ArenaEntity.java new file mode 100644 index 000000000..7de2d2a72 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/instanced/arena/ArenaEntity.java @@ -0,0 +1,34 @@ +package com.magmaguy.elitemobs.instanced.arena; + +import lombok.Getter; +import lombok.Setter; + +import javax.xml.stream.Location; + +public class ArenaEntity { + @Getter + @Setter + private String spawnPointName; + @Getter + @Setter + private Location spawnLocation; + @Getter + @Setter + private int wave; + @Getter + @Setter + private String bossfile; + @Getter + @Setter + private boolean mythicMob = false; + @Getter + @Setter + private int level = -1; + + public ArenaEntity(String spawnPointName, int wave, String bossfile) { + this.spawnPointName = spawnPointName; + this.wave = wave; + this.bossfile = bossfile; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/instanced/arena/ArenaInstance.java b/src/main/java/com/magmaguy/elitemobs/instanced/arena/ArenaInstance.java new file mode 100644 index 000000000..d489b4bb7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/instanced/arena/ArenaInstance.java @@ -0,0 +1,359 @@ +package com.magmaguy.elitemobs.instanced.arena; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.ArenaCompleteEvent; +import com.magmaguy.elitemobs.api.ArenaStartEvent; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.api.EliteMobDeathEvent; +import com.magmaguy.elitemobs.api.internal.RemovalReason; +import com.magmaguy.elitemobs.config.AdventurersGuildConfig; +import com.magmaguy.elitemobs.config.ArenasConfig; +import com.magmaguy.elitemobs.config.ItemSettingsConfig; +import com.magmaguy.elitemobs.config.customarenas.CustomArenasConfigFields; +import com.magmaguy.elitemobs.instanced.MatchInstance; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.playerdata.ElitePlayerInventory; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.thirdparty.mythicmobs.MythicMobsInterface; +import com.magmaguy.elitemobs.utils.ConfigurationLocation; +import com.magmaguy.elitemobs.utils.EventCaller; +import com.magmaguy.elitemobs.utils.shapes.Cylinder; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.*; + + +public class ArenaInstance extends MatchInstance { + + @Getter + private static final HashMap arenaInstances = new HashMap<>(); + @Getter + private final HashSet customBosses = new HashSet<>(); + private final HashSet nonEliteMobsEntities = new HashSet<>(); + private final HashMap waveMessage = new HashMap<>(); + @Getter + private final HashMap roundDamage = new HashMap<>(); + protected HashMap spawnPoints = new HashMap<>(); + @Getter + private CustomArenasConfigFields customArenasConfigFields; + @Getter + private ArenaWaves arenaWaves; + private int minX; + private int maxX; + private int minY; + private int maxY; + private int minZ; + private int maxZ; + private boolean cylindricalArena; + @Getter + private int currentWave = 0; + @Getter + private ArenaState arenaState = ArenaState.IDLE; + private Cylinder cylinder; + private int highestArenaMobLevel = -1; + + public ArenaInstance(CustomArenasConfigFields customArenasConfigFields, Location corner1, Location corner2, Location startLocation, Location exitLocation) { + super(startLocation, exitLocation, customArenasConfigFields.getMinimumPlayerCount(), customArenasConfigFields.getMaximumPlayerCount()); + if (cancelled) return; + this.cylindricalArena = customArenasConfigFields.isCylindricalArena(); + + super.lobbyLocation = customArenasConfigFields.getTeleportLocation(); + + if (corner1.getX() < corner2.getX()) { + minX = (int) corner1.getX(); + maxX = (int) corner2.getX(); + } else { + minX = (int) corner2.getX(); + maxX = (int) corner1.getX(); + } + + if (corner1.getY() < corner2.getY()) { + minY = (int) corner1.getY(); + maxY = (int) corner2.getY(); + } else { + minY = (int) corner2.getY(); + maxY = (int) corner1.getY(); + } + + if (corner1.getZ() < corner2.getZ()) { + minZ = (int) corner1.getZ(); + maxZ = (int) corner2.getZ(); + } else { + minZ = (int) corner2.getZ(); + maxZ = (int) corner1.getZ(); + } + this.world = corner1.getWorld(); + this.state = InstancedRegionState.WAITING; + + if (cylindricalArena) + cylinder = new Cylinder(new Vector((maxX - minX) / 2D + minX, minY, (maxZ - minZ) / 2D + minZ), (Math.abs(maxX - minX)) / 2D, maxY - minY); + + addSpawnPoints(customArenasConfigFields.getSpawnPoints()); + this.customArenasConfigFields = customArenasConfigFields; + this.arenaWaves = new ArenaWaves(customArenasConfigFields.getBossList()); + + + arenaInstances.put(customArenasConfigFields.getFilename(), this); + arenaWatchdog(); + for (String string : customArenasConfigFields.getArenaMessages()) { + String[] splitString = string.split(":"); + String message = ""; + int wave = 0; + for (String subString : splitString) { + String[] finalString = subString.split("="); + switch (finalString[0].toLowerCase(Locale.ROOT)) { + case "wave": + try { + wave = Integer.parseInt(finalString[1]); + } catch (Exception ex) { + Logger.warn("Failed to parse wave for entry " + subString + " for arena " + customArenasConfigFields.getFilename()); + } + break; + case "message": + message = finalString[1]; + break; + default: + Logger.warn("Failed to parse arena message entry " + subString + " for arena " + customArenasConfigFields.getFilename()); + } + } + if (!message.isEmpty() && wave > 0) waveMessage.put(wave, ChatColorConverter.convert(message)); + } + + super.permission = customArenasConfigFields.getPermission(); + } + + public static void initializeArena(CustomArenasConfigFields customArenasConfigFields) { + Location corner1 = ConfigurationLocation.serialize(customArenasConfigFields.getCorner1()); + Location corner2 = ConfigurationLocation.serialize(customArenasConfigFields.getCorner2()); + Location startLocation = ConfigurationLocation.serialize(customArenasConfigFields.getStartLocation()); + Location exitLocation = ConfigurationLocation.serialize(customArenasConfigFields.getExitLocation()); + if (corner1 == null || corner2 == null || startLocation == null || exitLocation == null) { + //Logger.warn("Failed to correctly initialize arena " + customArenasConfigFields.getFilename() + " due to invalid locations for corner1/corner2/startLocation/exitLocation"); + return; + } + if (corner1.getWorld() == null || corner2.getWorld() == null || startLocation.getWorld() == null || exitLocation.getWorld() == null) { + //Logger.warn("Failed to correctly initialize arena " + customArenasConfigFields.getFilename() + " due to invalid world for corner1/corner2/startLocation/exitLocation"); + return; + } + new ArenaInstance(customArenasConfigFields, corner1, corner2, startLocation, exitLocation); + } + + public void addSpawnPoints(List rawSpawnPoints) { + for (String string : rawSpawnPoints) { + String[] splitEntry = string.split(":"); + String name = ""; + String location = ""; + for (String subString : splitEntry) { + String[] splitSubEntry = subString.split("="); + switch (splitSubEntry[0].toLowerCase(Locale.ROOT)) { + case "name": + name = splitSubEntry[1]; + break; + case "location": + location = splitSubEntry[1]; + break; + default: + Logger.warn("Invalid entry for the spawn points of instanced content: " + splitSubEntry[0]); + break; + } + } + spawnPoints.put(name, ConfigurationLocation.serialize(location)); + } + } + + @Override + protected boolean isInRegion(Location location) { + if (!cylindricalArena) + return location.getWorld().equals(world) && minX <= location.getX() && maxX >= location.getX() && minY <= location.getY() && maxY >= location.getY() && minZ <= location.getZ() && maxZ >= location.getZ(); + else return location.getWorld().equals(world) && cylinder.contains(location); + } + + @Override + protected void startMatch() { + super.startMatch(); + new EventCaller(new ArenaStartEvent(this)); + nextWave(); + } + + private void nextWave() { + currentWave++; + arenaState = ArenaState.COOLDOWN; + if (waveMessage.get(currentWave) != null) { + players.forEach(player -> player.sendMessage(waveMessage.get(currentWave))); + spectators.forEach(player -> player.sendMessage(waveMessage.get(currentWave))); + } + + doRewards(); + if (currentWave > customArenasConfigFields.getWaveCount()) { + victory(); + return; + } + Bukkit.getScheduler().scheduleSyncDelayedTask(MetadataHandler.PLUGIN, () -> { + if (arenaState == ArenaState.IDLE) return; + String title = ArenasConfig.getWaveTitle(); + String subtitle = ArenasConfig.getWaveSubtitle(); + if (title == null) title = ""; + if (subtitle == null) subtitle = ""; + + String finalTitle = title; + String finalSubtitle = subtitle; + players.forEach(player -> player.sendTitle(finalTitle.replace("$wave", currentWave + ""), finalSubtitle.replace("$wave", currentWave + ""), 0, 20, 0)); + spectators.forEach(player -> player.sendTitle(finalTitle.replace("$wave", currentWave + ""), finalSubtitle.replace("$wave", currentWave + ""), 0, 20, 0)); + spawnBosses(); + arenaState = ArenaState.ACTIVE; + roundDamage.clear(); + }, 20L * customArenasConfigFields.getDelayBetweenWaves()); + } + + private void arenaWatchdog() { + new BukkitRunnable() { + @Override + public void run() { + if (arenaState != ArenaState.ACTIVE) return; + for (CustomBossEntity customBossEntity : (HashSet) customBosses.clone()) + if (!customBossEntity.exists()) removeBoss(customBossEntity); + if (!nonEliteMobsEntities.isEmpty()) + for (Entity entity : (HashSet) nonEliteMobsEntities.clone()) + if (!entity.isValid()) removeBoss(entity); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0L, 20L); + } + + public void removeBoss(CustomBossEntity customBossEntity) { + customBosses.remove(customBossEntity); + if (customBosses.isEmpty() && nonEliteMobsEntities.isEmpty()) nextWave(); + } + + public void removeBoss(Entity nonEliteEntity) { + nonEliteMobsEntities.remove(nonEliteEntity); + if (customBosses.isEmpty() && nonEliteMobsEntities.isEmpty()) nextWave(); + } + + private void spawnBosses() { + if (arenaWaves.getWaveEntities(currentWave) == null) return; + highestArenaMobLevel = -1; + for (ArenaEntity arenaEntity : arenaWaves.getWaveEntities(currentWave)) { + if (!arenaEntity.isMythicMob()) { + CustomBossEntity customBossEntity = CustomBossEntity.createCustomBossEntity(arenaEntity.getBossfile()); + if (customBossEntity == null) { + Logger.warn("Failed to generate custom boss " + arenaEntity.getBossfile() + " because the filename was not valid!"); + continue; + } + customBossEntity.setNormalizedCombat(); + customBossEntity.setEliteLoot(false); + customBossEntity.setVanillaLoot(false); + customBossEntity.setRandomLoot(false); + customBossEntity.spawn(spawnPoints.get(arenaEntity.getSpawnPointName()), true); + if (customBossEntity.getLevel() > highestArenaMobLevel) + highestArenaMobLevel = customBossEntity.getLevel(); + if (!customBossEntity.exists()) { + Logger.warn("Arena " + getCustomArenasConfigFields().getArenaName() + " failed to spawn boss " + customBossEntity.getCustomBossesConfigFields().getFilename()); + continue; + } else customBosses.add(customBossEntity); + + } else { + //MythicMobs integration + try { + Entity mythicMob = MythicMobsInterface.spawn(spawnPoints.get(arenaEntity.getSpawnPointName()), arenaEntity.getBossfile(), arenaEntity.getLevel()); + if (mythicMob != null) nonEliteMobsEntities.add(mythicMob); + else + Logger.warn("Failed to spawn MythicMobs entity '" + arenaEntity.getBossfile() + "' at spawn point " + arenaEntity.getSpawnPointName() + " with level " + arenaEntity.getLevel() + " because MythicMobs did not recognize the name of the entity!"); + } catch (Exception e) { + Logger.warn("Failed to spawn MythicMobs entity '" + arenaEntity.getBossfile() + "' at spawn point " + arenaEntity.getSpawnPointName() + " with level " + arenaEntity.getLevel() + " due to a MythicMobs error - there is a high chance mob spawning is being prevented in this area!"); + } + } + } + } + + private void doRewards() { + //Note: here current wave is decreased by 1 because the reward runs at the top of the next wave method. + //So basically it runs at the start of the wave, hence it should reward whatever the previous wave had. + ArrayList validPlayers = new ArrayList<>(); + double minimumDamageThreshold = 0; + double totalDamage = 0; + for (Map.Entry entry : roundDamage.entrySet()) + totalDamage += entry.getValue(); + + minimumDamageThreshold = totalDamage * .1; + for (Map.Entry entry : roundDamage.entrySet()) + if (entry.getValue() >= minimumDamageThreshold) validPlayers.add(entry.getKey()); + + + super.players.forEach(player -> { + if (highestArenaMobLevel > 0) { + if (AdventurersGuildConfig.isGuildLootLimiter() && + PlayerData.getMaxGuildLevel(player.getUniqueId()) < highestArenaMobLevel / 10) { + Logger.sendSimpleMessage(player, AdventurersGuildConfig.getLootLimiterMessage()); + return; + } else if (Math.abs(ElitePlayerInventory.getPlayer(player).getFullPlayerTier(true) - highestArenaMobLevel) > ItemSettingsConfig.getLootLevelDifferenceLockout()) { + Logger.sendSimpleMessage(player, ItemSettingsConfig.getLevelRangeTooDifferent() + .replace("$playerLevel", ElitePlayerInventory.playerInventories.get(player.getUniqueId()).getFullPlayerTier(false) + "") + .replace("$bossLevel", highestArenaMobLevel + "")); + return; + } + } + customArenasConfigFields.getArenaRewards().arenaReward(player, currentWave - 1); + }); + } + + @Override + protected void endMatch() { + super.endMatch(); + arenaState = ArenaState.IDLE; + //victory state + if (currentWave > getCustomArenasConfigFields().getWaveCount()) { + participants.forEach(player -> player.sendTitle(ArenasConfig.getVictoryTitle().replace("$wave", customArenasConfigFields.getWaveCount() + ""), ArenasConfig.getVictorySubtitle().replace("$wave", customArenasConfigFields.getWaveCount() + ""), 20, 20 * 10, 20)); + StringBuilder playerNames = new StringBuilder(); + for (Player player : participants) + playerNames.append(player.getName()).append(" "); + Bukkit.getServer().broadcastMessage(ArenasConfig.getVictoryBroadcast().replace("$players", playerNames.toString()).replace("$arenaName", customArenasConfigFields.getArenaName())); + ArenaCompleteEvent.ArenaCompleteEventHandler.call(this); + } else + participants.forEach(player -> player.sendTitle(ArenasConfig.getDefeatTitle().replace("$wave", currentWave + ""), ArenasConfig.getDefeatSubtitle().replace("$wave", currentWave + ""), 20, 20 * 10, 20)); + + Bukkit.getScheduler().scheduleSyncDelayedTask(MetadataHandler.PLUGIN, this::destroyMatch, customArenasConfigFields.getDelayBetweenWaves()); + } + + @Override + protected void destroyMatch() { + super.destroyMatch(); + arenaState = ArenaState.IDLE; + currentWave = 0; + customBosses.forEach(customBoss -> customBoss.remove(RemovalReason.ARENA_RESET)); + customBosses.clear(); + } + + private enum ArenaState { + IDLE, COOLDOWN, ACTIVE + } + + public static class ArenaInstanceEvents implements Listener { + @EventHandler + public void onEliteDeath(EliteMobDeathEvent event) { + if (!(event.getEliteEntity() instanceof CustomBossEntity)) return; + for (ArenaInstance arenaInstance : arenaInstances.values()) + if (arenaInstance.getCustomBosses().contains((CustomBossEntity) event.getEliteEntity())) { + arenaInstance.removeBoss((CustomBossEntity) event.getEliteEntity()); + return; + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onEliteDamages(EliteMobDamagedByPlayerEvent event) { + if (PlayerData.getMatchInstance(event.getPlayer()) == null) return; + if (!(PlayerData.getMatchInstance(event.getPlayer()) instanceof ArenaInstance arenaInstance)) return; + arenaInstance.getRoundDamage().merge(event.getPlayer(), event.getDamage(), Double::sum); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/instanced/arena/ArenaWaves.java b/src/main/java/com/magmaguy/elitemobs/instanced/arena/ArenaWaves.java new file mode 100644 index 000000000..d1ad17e7a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/instanced/arena/ArenaWaves.java @@ -0,0 +1,79 @@ +package com.magmaguy.elitemobs.instanced.arena; + +import com.magmaguy.magmacore.util.Logger; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; + +public class ArenaWaves { + + private final HashMap> arenaEntities = new HashMap(); + + //wave=X:spawnPoint=Y:boss=Z.yml:mythicmob=false + public ArenaWaves(List rawBosses) { + for (String iteratedBoss : rawBosses) { + String[] subString = iteratedBoss.split(":"); + String waveString = ""; + String spawnpointString = ""; + String boss = ""; + String mythicMobString = ""; + String levelString = ""; + for (String iteratedString : subString) { + String[] valuesString = iteratedString.split("="); + switch (valuesString[0].toLowerCase(Locale.ROOT)) { + case "wave": + waveString = valuesString[1]; + break; + case "spawnpoint": + spawnpointString = valuesString[1]; + break; + case "boss": + boss = valuesString[1]; + break; + case "mythicmob": + mythicMobString = valuesString[1]; + break; + case "level": + levelString = valuesString[1]; + break; + } + } + int wave; + try { + wave = Integer.valueOf(waveString); + } catch (Exception exception) { + Logger.warn("Invalid value for wave in arena wave: " + waveString); + continue; + } + boolean mythicMob; + if (mythicMobString.isEmpty()) mythicMob = false; + else + try { + mythicMob = Boolean.valueOf(mythicMobString); + } catch (Exception exception) { + Logger.warn("Invalid value for mythic mob in arena wave: " + waveString); + continue; + } + int level = -1; + if (!levelString.isEmpty()) try { + level = Integer.valueOf(levelString); + } catch (Exception exception) { + Logger.warn("Invalid value for level in: " + levelString); + continue; + } + ArenaEntity arenaEntity = new ArenaEntity(spawnpointString, wave, boss); + if (mythicMob) arenaEntity.setMythicMob(true); + if (level != -1) arenaEntity.setLevel(level); + if (arenaEntities.get(wave) == null) + arenaEntities.put(wave, new ArrayList<>(List.of(arenaEntity))); + else + arenaEntities.get(wave).add(arenaEntity); + } + } + + public List getWaveEntities(int wave) { + return arenaEntities.get(wave); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/instanced/dungeons/DungeonInstance.java b/src/main/java/com/magmaguy/elitemobs/instanced/dungeons/DungeonInstance.java new file mode 100644 index 000000000..94b26f0c1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/instanced/dungeons/DungeonInstance.java @@ -0,0 +1,334 @@ +package com.magmaguy.elitemobs.instanced.dungeons; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.DungeonCompleteEvent; +import com.magmaguy.elitemobs.api.DungeonStartEvent; +import com.magmaguy.elitemobs.api.InstancedDungeonRemoveEvent; +import com.magmaguy.elitemobs.api.WorldInstanceEvent; +import com.magmaguy.elitemobs.api.internal.RemovalReason; +import com.magmaguy.elitemobs.config.DungeonsConfig; +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfig; +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.dungeons.utility.DungeonUtils; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.instanced.MatchInstance; +import com.magmaguy.elitemobs.mobconstructor.custombosses.InstancedBossEntity; +import com.magmaguy.elitemobs.npcs.NPCEntity; +import com.magmaguy.elitemobs.treasurechest.TreasureChest; +import com.magmaguy.elitemobs.utils.ConfigurationLocation; +import com.magmaguy.elitemobs.utils.EventCaller; +import com.magmaguy.elitemobs.utils.MapListInterpreter; +import com.magmaguy.elitemobs.utils.WorldInstantiator; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.apache.commons.io.FileUtils; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +import java.io.File; +import java.util.*; +import java.util.concurrent.CompletableFuture; + +public class DungeonInstance extends MatchInstance { + @Getter + private static final Set dungeonInstances = new HashSet<>(); + private final List dungeonObjectives = new ArrayList<>(); + @Getter + private World world; + @Getter + private String instancedWorldName; + private File instancedWorldFile; + @Getter + private DungeonPackagerConfigFields dungeonPackagerConfigFields; + private List instancedBossEntities = new ArrayList<>(); + @Getter + private int levelSync = -1; + private String difficultyName = null; + @Getter + private String difficultyID = null; + + public DungeonInstance(DungeonPackagerConfigFields dungeonPackagerConfigFields, + Location lobbyLocation, + Location startLocation, + World world, + File instancedWorldFile, + Player player, + String difficultyName) { + super(startLocation, + null, //todo: the end location is currently not definable + dungeonPackagerConfigFields.getMinPlayerCount(), + dungeonPackagerConfigFields.getMaxPlayerCount()); + if (cancelled) return; + super.lobbyLocation = lobbyLocation; + this.dungeonPackagerConfigFields = dungeonPackagerConfigFields; + for (String rawObjective : dungeonPackagerConfigFields.getRawDungeonObjectives()) + this.dungeonObjectives.add(DungeonObjective.registerObjective(this, rawObjective)); + this.world = world; + this.instancedWorldName = world.getName(); + this.instancedWorldFile = instancedWorldFile; + this.difficultyName = difficultyName; + setDifficulty(difficultyName); + addNewPlayer(player); + new InitializeEntitiesTask(this, dungeonPackagerConfigFields, world).runTaskLater(MetadataHandler.PLUGIN, 20 * 3L); + dungeonInstances.add(this); + super.permission = dungeonPackagerConfigFields.getPermission(); + } + + public static void setupInstancedDungeon(Player player, String instancedDungeonConfigFieldsString, String difficultyName) { + DungeonPackagerConfigFields instancedDungeonsConfigFields = DungeonPackagerConfig.getDungeonPackages().get(instancedDungeonConfigFieldsString); + if (instancedDungeonsConfigFields == null) { + player.sendMessage("[EliteMobs] Failed to get data for dungeon " + instancedDungeonConfigFieldsString + "! The dungeon will not start."); + return; + } + + if (instancedDungeonsConfigFields.getPermission() != null && !instancedDungeonsConfigFields.getPermission().isEmpty()) + if (!player.hasPermission(instancedDungeonsConfigFields.getPermission())) { + player.sendMessage("[EliteMobs] You don't have the permission to go to this dungeon!"); + return; + } + + String instancedWorldName = WorldInstantiator.getNewWorldName(instancedDungeonsConfigFields.getWorldName()); + + if (!launchEvent(instancedDungeonsConfigFields, instancedWorldName, player)) return; + + CompletableFuture future = CompletableFuture.supplyAsync(() -> + cloneWorldFiles(instancedDungeonsConfigFields, instancedWorldName, player)); + future.thenAccept(file -> { + if (file == null) return; + new InitializeInstancedWorldTask(instancedDungeonsConfigFields, instancedWorldName, player, file, difficultyName).runTask(MetadataHandler.PLUGIN); + }); + } + + protected static boolean launchEvent(DungeonPackagerConfigFields instancedDungeonsConfigFields, String instancedWordName, Player player) { + WorldInstanceEvent worldInstanceEvent = new WorldInstanceEvent( + instancedDungeonsConfigFields.getWorldName(), + instancedWordName, + instancedDungeonsConfigFields); + new EventCaller(worldInstanceEvent); + if (worldInstanceEvent.isCancelled()) { + player.sendMessage("[EliteMobs] Something cancelled the instancing event! The dungeon will not start."); + return false; + } + return true; + } + + protected static File cloneWorldFiles(DungeonPackagerConfigFields instancedDungeonsConfigFields, String instancedWordName, Player player) { + File targetFile = WorldInstantiator.cloneWorld(instancedDungeonsConfigFields.getWorldName(), instancedWordName, instancedDungeonsConfigFields.getDungeonConfigFolderName()); + if (targetFile == null) { + player.sendMessage("[EliteMobs] Failed to copy the world! Report this to the dev. The dungeon will not start."); + return null; + } + return targetFile; + } + + protected static DungeonInstance initializeInstancedWorld(DungeonPackagerConfigFields instancedDungeonsConfigFields, + String instancedWordName, + Player player, + File targetFile, + String difficultyName) { + World world = DungeonUtils.loadWorld(instancedWordName, instancedDungeonsConfigFields.getEnvironment(), instancedDungeonsConfigFields); + if (world == null) { + player.sendMessage("[EliteMobs] Failed to load the world! Report this to the dev. The dungeon will not start."); + return null; + } + + //Location where players are teleported to start completing the dungeon + Location startLocation = ConfigurationLocation.serialize(instancedDungeonsConfigFields.getStartLocationString()); + startLocation.setWorld(world); + //Lobby location is optional, if null it should be the same as the start location + Location lobbyLocation = ConfigurationLocation.serialize(instancedDungeonsConfigFields.getTeleportLocationString()); + if (lobbyLocation != null) lobbyLocation.setWorld(world); + else lobbyLocation = startLocation; + //Location where players are teleported to upon completion, this usually gets overriden with the previous location players were at + //todo: will probably want to define this at some point Location endLocation = ConfigurationLocation.serialize(instancedDungeonsConfigFields.getEndLocation()); + //endLocation.setWorld(world); + if (!instancedDungeonsConfigFields.isEnchantmentChallenge()) + return new DungeonInstance(instancedDungeonsConfigFields, lobbyLocation, startLocation, world, targetFile, player, difficultyName); + else + return new EnchantmentDungeonInstance(instancedDungeonsConfigFields, lobbyLocation, startLocation, world, targetFile, player, difficultyName); + } + + @Override + public boolean addNewPlayer(Player player) { + if (!super.addNewPlayer(player)) return false; + if (levelSync > 0) + player.sendMessage("[EliteMobs] Dungeon difficulty is set to " + difficultyName + " ! Level sync caps your item level to " + levelSync + "."); + return true; + } + + @Override + protected void startMatch() { + updateBossHealth(); + super.startMatch(); + new EventCaller(new DungeonStartEvent(this)); + } + + //Runs when the instance starts, adjusting boss health to the amount of players in the instance + private void updateBossHealth() { + instancedBossEntities.forEach(instancedBossEntity -> { + instancedBossEntity.setNormalizedMaxHealth(players.size()); + }); + } + + public boolean checkCompletionStatus() { + //if (!super.state.equals(InstancedRegionState.ONGOING)) return; + for (DungeonObjective dungeonObjective : dungeonObjectives) + if (!dungeonObjective.isCompleted()) + return false; + new EventCaller(new DungeonCompleteEvent(this)); + //This means the dungeon just completed + victory(); + return true; + } + + @Override + public void endMatch() { + super.endMatch(); + if (players.isEmpty()) { + removeInstance(); + return; + } + announce(DungeonsConfig.getInstancedDungeonCompleteMessage()); + new DestroyMatchTask().runTaskLater(MetadataHandler.PLUGIN, 2 * 60 * 20L); + } + + @Override + public void destroyMatch() { + super.destroyMatch(); + removeInstance(); + } + + public void removeInstance() { + participants.forEach(player -> player.sendMessage(DungeonsConfig.getInstancedDungeonClosingInstanceMessage())); + HashSet participants = new HashSet<>(this.participants); + participants.forEach(this::removeAnyKind); + instances.remove(this); + DungeonInstance dungeonInstance = this; + if (world == null) { + Logger.warn("Instanced dungeon's world was already unloaded before removing the entities in it! This shouldn't happen, but doesn't break anything."); + return; + } + world.getEntities().forEach(entity -> EntityTracker.unregister(entity, RemovalReason.WORLD_UNLOAD)); + new RemoveInstanceTask(dungeonInstance, instancedWorldFile).runTaskLater(MetadataHandler.PLUGIN, 20 * 30L); + } + + private void setDifficulty(String difficultyName) { + if (difficultyName == null) return; + if (dungeonPackagerConfigFields.getDifficulties() == null || + dungeonPackagerConfigFields.getDifficulties().isEmpty()) + return; + Map difficulty = null; + for (Map difficultyMap : dungeonPackagerConfigFields.getDifficulties()) + if (difficultyMap.get("name") != null && difficultyMap.get("name").equals(difficultyName)) { + difficulty = difficultyMap; + break; + } + if (difficulty == null) { + Logger.warn("Failed to set difficulty " + difficulty + " for instanced dungeon " + dungeonPackagerConfigFields.getFilename()); + return; + } + + if (difficulty.get("levelSync") != null) { + try { + this.levelSync = MapListInterpreter.parseInteger("levelSync", difficulty.get("levelSync"), dungeonPackagerConfigFields.getFilename()); + } catch (Exception exception) { + Logger.warn("Incorrect level sync entry for dungeon " + dungeonPackagerConfigFields.getFilename() + " ! Value: " + levelSync + " . No level sync will be applied!"); + this.levelSync = 0; + } + } else + this.levelSync = 0; + + //Used for loot + if (difficulty.get("id") != null) { + this.difficultyID = MapListInterpreter.parseString("id", difficulty.get("id"), dungeonPackagerConfigFields.getFilename()); + } + } + + @Override + protected boolean isInRegion(Location location) { + return location.getWorld().equals(startLocation.getWorld()); + } + + private static class InitializeInstancedWorldTask extends BukkitRunnable { + private final DungeonPackagerConfigFields instancedDungeonsConfigFields; + private final String instancedWorldName; + private final Player player; + private final File file; + private final String difficultyName; + + public InitializeInstancedWorldTask(DungeonPackagerConfigFields instancedDungeonsConfigFields, + String instancedWorldName, + Player player, + File file, + String difficultyName) { + this.instancedDungeonsConfigFields = instancedDungeonsConfigFields; + this.instancedWorldName = instancedWorldName; + this.player = player; + this.file = file; + this.difficultyName = difficultyName; + } + + @Override + public void run() { + initializeInstancedWorld(instancedDungeonsConfigFields, instancedWorldName, player, file, difficultyName); + } + } + + private class InitializeEntitiesTask extends BukkitRunnable { + private final DungeonInstance dungeonInstance; + private final DungeonPackagerConfigFields dungeonPackagerConfigFields; + private final World world; + + public InitializeEntitiesTask(DungeonInstance dungeonInstance, DungeonPackagerConfigFields dungeonPackagerConfigFields, World world) { + this.dungeonInstance = dungeonInstance; + this.dungeonPackagerConfigFields = dungeonPackagerConfigFields; + this.world = world; + } + + @Override + public void run() { + instancedBossEntities = InstancedBossEntity.initializeInstancedBosses(dungeonPackagerConfigFields.getWorldName(), world, players.size(), dungeonInstance); + NPCEntity.initializeInstancedNPCs(dungeonPackagerConfigFields.getWorldName(), world, players.size(), dungeonInstance); + TreasureChest.initializeInstancedTreasureChests(dungeonPackagerConfigFields.getWorldName(), world); + } + } + + private class DestroyMatchTask extends BukkitRunnable { + @Override + public void run() { + destroyMatch(); + } + } + + private class RemoveInstanceTask extends BukkitRunnable { + private final DungeonInstance dungeonInstance; + private final File instancedWorldFile; + + public RemoveInstanceTask(DungeonInstance dungeonInstance, File instancedWorldFile) { + this.dungeonInstance = dungeonInstance; + this.instancedWorldFile = instancedWorldFile; + } + + @Override + public void run() { + new EventCaller(new InstancedDungeonRemoveEvent(dungeonInstance)); + dungeonInstances.remove(dungeonInstance); + + if (!Bukkit.unloadWorld(world, false)) { + Logger.warn("Failed to unload world " + instancedWorldName + " ! This is bad, report this to the developer!"); + return; + } + new BukkitRunnable() { + @Override + public void run() { + try{FileUtils.deleteDirectory(instancedWorldFile);} catch (Exception e){ + Logger.warn("Failed to delete " + instancedWorldFile + " ! This is bad, report this to the developer!"); + } + } + }.runTaskLaterAsynchronously(MetadataHandler.PLUGIN, 20L * 60 * 2); //wait 2 minutes after unloading world before removing files + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/instanced/dungeons/DungeonKillPercentageObjective.java b/src/main/java/com/magmaguy/elitemobs/instanced/dungeons/DungeonKillPercentageObjective.java new file mode 100644 index 000000000..448dd13ee --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/instanced/dungeons/DungeonKillPercentageObjective.java @@ -0,0 +1,37 @@ +package com.magmaguy.elitemobs.instanced.dungeons; + +import com.magmaguy.magmacore.util.Logger; + +import java.util.ArrayList; +import java.util.List; + +public class DungeonKillPercentageObjective extends DungeonObjective { + private static final List dungeonKillPercentageObjectiveList = new ArrayList<>(); + private final int currentAmount = 0; + private int targetAmount; + private double percentage; + + public DungeonKillPercentageObjective(DungeonInstance dungeonInstance, String objectiveString) { + super(dungeonInstance, objectiveString); + String[] strings = objectiveString.split(":"); + for (String seperatedByColon : strings) { + String[] separatedByEquals = seperatedByColon.split("="); + if (separatedByEquals[0].equalsIgnoreCase("percentage")) { + try { + this.percentage = Double.parseDouble(separatedByEquals[1]); + } catch (Exception ex) { + Logger.warn("Value " + separatedByEquals[1] + " is not a valid integer amount!"); + } + } else { + Logger.warn("Invalid entry for objective string! " + objectiveString + " could not be parsed correctly."); + } + } + } + + @Override + protected void initializeObjective(DungeonInstance dungeonInstance) { + super.initializeObjective(dungeonInstance); + dungeonKillPercentageObjectiveList.add(this); + } + +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/instanced/dungeons/DungeonKillTargetObjective.java b/src/main/java/com/magmaguy/elitemobs/instanced/dungeons/DungeonKillTargetObjective.java new file mode 100644 index 000000000..ec0f9d6ef --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/instanced/dungeons/DungeonKillTargetObjective.java @@ -0,0 +1,71 @@ +package com.magmaguy.elitemobs.instanced.dungeons; + +import com.magmaguy.elitemobs.api.EliteMobDeathEvent; +import com.magmaguy.elitemobs.mobconstructor.custombosses.InstancedBossEntity; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +import java.util.ArrayList; +import java.util.List; + +public class DungeonKillTargetObjective extends DungeonObjective { + private static final List dungeonKillTargetObjectiveList = new ArrayList<>(); + @Getter + private String bossFilename; + @Getter + private int targetAmount = 1; + @Getter + private int currentAmount = 0; + + + public DungeonKillTargetObjective(DungeonInstance dungeonInstance, String objectiveString) { + super(dungeonInstance, objectiveString); + String[] strings = objectiveString.split(":"); + for (String seperatedByColon : strings) { + String[] separatedByEquals = seperatedByColon.split("="); + if (separatedByEquals[0].equalsIgnoreCase("filename")) { + this.bossFilename = separatedByEquals[1]; + } else if (separatedByEquals[0].equalsIgnoreCase("amount")) { + try { + this.targetAmount = Integer.parseInt(separatedByEquals[1]); + } catch (Exception ex) { + Logger.warn("Value " + separatedByEquals[1] + " is not a valid integer amount!"); + } + } else { + Logger.warn("Invalid entry for objective string! " + objectiveString + " could not be parsed correctly."); + } + } + initializeObjective(dungeonInstance); + } + + @Override + protected void initializeObjective(DungeonInstance dungeonInstance) { + super.initializeObjective(dungeonInstance); + dungeonKillTargetObjectiveList.add(this); + } + + public void incrementKills() { + currentAmount++; + if (currentAmount >= targetAmount) { + super.completed = true; + dungeonInstance.checkCompletionStatus(); + dungeonKillTargetObjectiveList.remove(this); + } + } + + public static class DungeonKillTargetObjectiveListener implements Listener { + @EventHandler + public void onEliteDeath(EliteMobDeathEvent event) { + if (!(event.getEliteEntity() instanceof InstancedBossEntity instancedBossEntity)) return; + List cloneList = new ArrayList<>(dungeonKillTargetObjectiveList); + for (DungeonKillTargetObjective dungeonKillTargetObjective : cloneList) { + if (instancedBossEntity.getCustomBossesConfigFields().getFilename().equals(dungeonKillTargetObjective.getBossFilename()) || + instancedBossEntity.getPhaseBossEntity() != null && + instancedBossEntity.getPhaseBossEntity().getPhase1Config().getFilename().equals(dungeonKillTargetObjective.getBossFilename())) + dungeonKillTargetObjective.incrementKills(); + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/instanced/dungeons/DungeonObjective.java b/src/main/java/com/magmaguy/elitemobs/instanced/dungeons/DungeonObjective.java new file mode 100644 index 000000000..ef4c6d344 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/instanced/dungeons/DungeonObjective.java @@ -0,0 +1,36 @@ +package com.magmaguy.elitemobs.instanced.dungeons; + +import lombok.Getter; + +import java.util.Locale; + +public class DungeonObjective { + + @Getter + protected boolean completed = false; + @Getter + protected DungeonInstance dungeonInstance; + + /* + Valid configuration string formats: + Kill target: filename=boss.yml:amount=X + Kill percentage: clearpercentage=X.Y + */ + public DungeonObjective(DungeonInstance dungeonInstance, String objectiveString) { + this.dungeonInstance = dungeonInstance; + } + + public static DungeonObjective registerObjective(DungeonInstance dungeonInstance, String objectiveString) { + if (objectiveString.toLowerCase(Locale.ROOT).contains("filename")) { + return new DungeonKillTargetObjective(dungeonInstance, objectiveString); + } else if (objectiveString.toLowerCase(Locale.ROOT).contains("clearpercentage")) { + return new DungeonKillPercentageObjective(dungeonInstance, objectiveString); + } + return null; + } + + protected void initializeObjective(DungeonInstance dungeonInstance) { + this.dungeonInstance = dungeonInstance; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/instanced/dungeons/EnchantmentDungeonInstance.java b/src/main/java/com/magmaguy/elitemobs/instanced/dungeons/EnchantmentDungeonInstance.java new file mode 100644 index 000000000..ec4b511e7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/instanced/dungeons/EnchantmentDungeonInstance.java @@ -0,0 +1,136 @@ +package com.magmaguy.elitemobs.instanced.dungeons; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.SpecialItemSystemsConfig; +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfig; +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.menus.ItemEnchantmentMenu; +import com.magmaguy.elitemobs.utils.WorldInstantiator; +import com.magmaguy.magmacore.util.ChatColorConverter; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ThreadLocalRandom; + +public class EnchantmentDungeonInstance extends DungeonInstance { + @Getter + @Setter + Player player; + @Getter + @Setter + private ItemStack upgradedItem; + @Getter + @Setter + private ItemStack currentItem; + + public EnchantmentDungeonInstance(DungeonPackagerConfigFields dungeonPackagerConfigFields, + Location lobbyLocation, + Location startLocation, + World world, + File instancedWorldFile, + Player player, + String difficultyName) { + super(dungeonPackagerConfigFields, + lobbyLocation, + startLocation, + world, + instancedWorldFile, + player, + difficultyName); + this.player = player; + } + + public static boolean setupRandomEnchantedChallengeDungeon(Player player, ItemStack upgradedItem, ItemStack itemFromInventory) { + List dungeonPackagerConfigFieldsList = new ArrayList<>(DungeonPackagerConfig.getEnchantedChallengeDungeonPackages().values().stream().toList()); + dungeonPackagerConfigFieldsList.removeIf(dungeonPackagerConfigFields -> !dungeonPackagerConfigFields.isEnabled()); + if (dungeonPackagerConfigFieldsList.isEmpty()) { + player.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &cYou rolled challenge but your server has not installed any challenge dungeons! &2This will count as an automatic enchantment success.")); + return false; + } + DungeonPackagerConfigFields dungeonPackagerConfigFields = dungeonPackagerConfigFieldsList.get(ThreadLocalRandom.current().nextInt(0, dungeonPackagerConfigFieldsList.size())); + String instancedWordName = WorldInstantiator.getNewWorldName(dungeonPackagerConfigFields.getWorldName()); + + if (!launchEvent(dungeonPackagerConfigFields, instancedWordName, player)) return false; + + CompletableFuture future = CompletableFuture.supplyAsync(() -> + cloneWorldFiles(dungeonPackagerConfigFields, instancedWordName, player)); + future.thenAccept(file -> { + if (file == null) return; + new BukkitRunnable() { + @Override + public void run() { + DungeonInstance dungeonInstance = initializeInstancedWorld(dungeonPackagerConfigFields, instancedWordName, player, file, (String) dungeonPackagerConfigFields.getDifficulties().get(0).get("name")); + if (dungeonInstance instanceof EnchantmentDungeonInstance enchantmentDungeonInstance) { + enchantmentDungeonInstance.setUpgradedItem(upgradedItem.clone()); + enchantmentDungeonInstance.setCurrentItem(itemFromInventory.clone()); + } + } + }.runTask(MetadataHandler.PLUGIN); + }); + + return true; + } + + @Override + public void endMatch() { + new BukkitRunnable() { + @Override + public void run() { + removeInstance(); + } + }.runTaskLater(MetadataHandler.PLUGIN, 20 * 10); + } + + @Override + protected void victory() { + super.victory(); + player.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &2Challenge complete! Instance will close in 10 seconds. &6You can leave earlier by doing &9/em quit&6!")); + player.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &2You succeeded your item enchantment challenge! Your item has been successfully enchanted.")); + ItemEnchantmentMenu.broadcastEnchantmentMessage(upgradedItem, player, SpecialItemSystemsConfig.getSuccessAnnouncement()); + //scanCurrentItemForRemoval(); + HashMap leftOvers = player.getInventory().addItem(upgradedItem); + if (!leftOvers.isEmpty()) player.getWorld().dropItem(player.getLocation(), upgradedItem); + } + + @Override + protected void defeat() { + super.defeat(); + if (ThreadLocalRandom.current().nextDouble() < SpecialItemSystemsConfig.getCriticalFailureChanceDuringChallengeChance()) { + player.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &4Critical enchantment failure! You have lost " + currentItem.getItemMeta().getDisplayName() + " &c!")); + ItemEnchantmentMenu.broadcastEnchantmentMessage(upgradedItem, player, SpecialItemSystemsConfig.getCriticalFailureAnnouncement()); + //scanCurrentItemForRemoval(); + } else { + player.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &cYou have failed the enchantment challenge! Your item " + currentItem.getItemMeta().getDisplayName() + " &cwas not enchanted.")); + HashMap leftOvers = player.getInventory().addItem(currentItem); + if (!leftOvers.isEmpty()) player.getWorld().dropItem(player.getLocation(), currentItem); + } + } + + /* + private void scanCurrentItemForRemoval() { + if (player.getInventory().contains(currentItem)) + player.getInventory().remove(currentItem); + else if (player.getInventory().getHelmet() != null && player.getInventory().getHelmet().equals(currentItem)) + player.getInventory().setHelmet(null); + else if (player.getInventory().getChestplate() != null && player.getInventory().getChestplate().equals(currentItem)) + player.getInventory().setChestplate(null); + else if (player.getInventory().getLeggings() != null && player.getInventory().getLeggings().equals(currentItem)) + player.getInventory().setLeggings(null); + else if (player.getInventory().getBoots() != null && player.getInventory().getBoots().equals(currentItem)) + player.getInventory().setBoots(null); + else if (player.getInventory().getItemInOffHand().equals(currentItem)) + player.getInventory().setItemInOffHand(null); + } + */ + +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/CustomItemConstructor.java b/src/main/java/com/magmaguy/elitemobs/items/CustomItemConstructor.java deleted file mode 100644 index cfbe001e7..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/CustomItemConstructor.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.items; - -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.items.itemconstructor.ItemConstructor; -import com.magmaguy.elitemobs.items.parserutil.CustomEnchantmentConfigParser; -import com.magmaguy.elitemobs.items.parserutil.DropWeightConfigParser; -import com.magmaguy.elitemobs.items.parserutil.PotionEffectConfigParser; -import com.magmaguy.elitemobs.items.parserutil.ScalabilityConfigParser; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.configuration.Configuration; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.event.Listener; -import org.bukkit.inventory.ItemStack; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -import static com.magmaguy.elitemobs.ChatColorConverter.convert; -import static com.magmaguy.elitemobs.items.parserutil.ConfigPathBuilder.automatedStringBuilder; -import static com.magmaguy.elitemobs.items.parserutil.EnchantmentConfigParser.parseEnchantments; - -/** - * Created by MagmaGuy on 29/11/2016. - */ -public class CustomItemConstructor implements Listener { - - public static ArrayList customItemList = new ArrayList(); - public static HashMap staticCustomItemHashMap = new HashMap<>(); - public static HashMap> dynamicRankedItemStacks = new HashMap<>(); - - public void superDropParser() { - - List lootCount = lootCounter(); - - for (String lootEntry : lootCount) { - - StringBuilder path = new StringBuilder(); - path.append(lootEntry); - - String previousPath = path.toString(); - - Material material = getMaterial(previousPath); - Bukkit.getLogger().info("Adding: " + previousPath); - String rawName = getName(previousPath); - - if (material == null) - continue; - - Configuration configuration = ConfigValues.itemsCustomLootListConfig; - - HashMap enchantments = parseEnchantments(configuration, previousPath); - HashMap customEnchantments = CustomEnchantmentConfigParser.parseCustomEnchantments(configuration, previousPath); - List potionEffects = PotionEffectConfigParser.itemPotionEffectHandler(configuration, previousPath); - List lore = getCustomLore(previousPath); - String dropType = DropWeightConfigParser.getDropType(configuration, previousPath); - String scalability = ScalabilityConfigParser.parseItemScalability(configuration, previousPath); - - ItemStack itemStack = ItemConstructor.constructItem(rawName, material, enchantments, customEnchantments, - potionEffects, lore, dropType, scalability); - - customItemList.add(itemStack); - - } - - } - - private List lootCounter() { - - List lootCount = new ArrayList(); - - for (String configIterator : ConfigValues.itemsCustomLootListConfig.getKeys(true)) { - - int dotCount = 0; - - if (configIterator.contains("Loot.")) { - - for (int i = 0; i < configIterator.length(); i++) - if (configIterator.charAt(i) == '.') - dotCount++; - - if (dotCount == 1) - lootCount.add(configIterator); - - } - - } - - return lootCount; - - } - - private Material getMaterial(String previousPath) { - - String path = automatedStringBuilder(previousPath, "Item Type"); - - Material material; - - try { - - material = Material.getMaterial(ConfigValues.itemsCustomLootListConfig.getString(path)); - - } catch (Error error) { - - Bukkit.getLogger().warning("[EliteMobs] Invalid material!"); - return null; - - } - - - return material; - - } - - private String getName(String previousPath) { - - String name = automatedStringBuilder(previousPath, "Item Name"); - - if (ConfigValues.itemsCustomLootListConfig.getString(name) == null || ConfigValues.itemsCustomLootListConfig.getString(name).isEmpty()) - Bukkit.getLogger().warning("[EliteMobs] Invalid name!"); - - return convert(ConfigValues.itemsCustomLootListConfig.getString(name)); - - } - - private List getCustomLore(String previousPath) { - - String path = automatedStringBuilder(previousPath, "Item Lore"); - - List itemLore = (List) ConfigValues.itemsCustomLootListConfig.getList(path); - - List newList = new ArrayList<>(); - - if (itemLore != null && !itemLore.isEmpty()) - for (String string : itemLore) - if (string != null && !string.isEmpty()) - newList.add(convert(string)); - - if (newList.isEmpty()) - return itemLore; - - return newList; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/DefaultDropsHandler.java b/src/main/java/com/magmaguy/elitemobs/items/DefaultDropsHandler.java index 248a5dc99..917841670 100644 --- a/src/main/java/com/magmaguy/elitemobs/items/DefaultDropsHandler.java +++ b/src/main/java/com/magmaguy/elitemobs/items/DefaultDropsHandler.java @@ -1,30 +1,13 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package com.magmaguy.elitemobs.items; -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.ItemsDropSettingsConfig; +import com.magmaguy.elitemobs.api.EliteMobDeathEvent; +import com.magmaguy.elitemobs.config.ItemSettingsConfig; import org.bukkit.Material; import org.bukkit.entity.ExperienceOrb; import org.bukkit.entity.LivingEntity; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.inventory.EntityEquipment; import org.bukkit.inventory.ItemStack; @@ -36,47 +19,45 @@ */ public class DefaultDropsHandler implements Listener { - private List wornItems = new ArrayList<>(); + private final List wornItems = new ArrayList<>(); @EventHandler(priority = EventPriority.HIGHEST) - public void onDeath(EntityDeathEvent event) { - - if (!EntityTracker.isEliteMob(event.getEntity())) return; + public void onDeath(EliteMobDeathEvent event) { - if (!EntityTracker.isNaturalEntity(event.getEntity()) && - !ConfigValues.itemsDropSettingsConfig.getBoolean(ItemsDropSettingsConfig.SPAWNER_DEFAULT_LOOT_MULTIPLIER)) - return; + if (!(event.getEntity() instanceof LivingEntity)) return; + if (!event.getEliteEntity().isVanillaLoot()) return; + if (event.getEntityDeathEvent() == null) return; - List droppedItems = event.getDrops(); - int mobLevel = (int) (EntityTracker.getEliteMobEntity(event.getEntity()).getLevel() * - ConfigValues.itemsDropSettingsConfig.getDouble(ItemsDropSettingsConfig.DEFAULT_LOOT_MULTIPLIER)); + List droppedItems = event.getEntityDeathEvent().getDrops(); + int mobLevel = event.getEliteEntity().getLevel(); - if (mobLevel > ConfigValues.itemsDropSettingsConfig.getInt(ItemsDropSettingsConfig.MAXIMUM_LEVEL_FOR_LOOT_MULTIPLIER)) - mobLevel = ConfigValues.itemsDropSettingsConfig.getInt(ItemsDropSettingsConfig.MAXIMUM_LEVEL_FOR_LOOT_MULTIPLIER); + if (mobLevel > ItemSettingsConfig.getMaxLevelForDefaultLootMultiplier()) + mobLevel = ItemSettingsConfig.getMaxLevelForDefaultLootMultiplier(); - inventoryItemsConstructor(event.getEntity()); + inventoryItemsConstructor((LivingEntity) event.getEntity()); - for (ItemStack itemStack : droppedItems) { + if (ItemSettingsConfig.getDefaultLootMultiplier() != 0) { + for (ItemStack itemStack : droppedItems) { -// ItemStack can be null for some reason, probably due to other plugins - if (itemStack == null) continue; - boolean itemIsWorn = false; + if (itemStack == null) continue; + if (itemStack.getType().equals(Material.AIR)) continue; + boolean itemIsWorn = false; - for (ItemStack wornItem : wornItems) - if (wornItem.isSimilar(itemStack)) - itemIsWorn = true; + for (ItemStack wornItem : wornItems) + if (wornItem.isSimilar(itemStack)) + itemIsWorn = true; - if (!itemIsWorn) - for (int i = 0; i < mobLevel * 0.1; i++) - event.getEntity().getLocation().getWorld().dropItem(event.getEntity().getLocation(), itemStack); + if (!itemIsWorn) + for (int i = 0; i < mobLevel * 0.1 * ItemSettingsConfig.getDefaultLootMultiplier(); i++) + event.getEntity().getLocation().getWorld().dropItem(event.getEntity().getLocation(), itemStack); + } } - mobLevel = (int) (EntityTracker.getEliteMobEntity(event.getEntity()).getLevel() * - ConfigValues.itemsDropSettingsConfig.getDouble(ItemsDropSettingsConfig.EXPERIENCE_LOOT_MULTIPLIER)); + mobLevel = (int) (event.getEliteEntity().getLevel() * ItemSettingsConfig.getDefaultExperienceMultiplier()); - int droppedXP = (int) (event.getDroppedExp() + event.getDroppedExp() * 0.1 * mobLevel); - event.setDroppedExp(0); + int droppedXP = (int) (event.getEntityDeathEvent().getDroppedExp() + event.getEntityDeathEvent().getDroppedExp() * 0.1 * mobLevel); + event.getEntityDeathEvent().setDroppedExp(0); event.getEntity().getWorld().spawn(event.getEntity().getLocation(), ExperienceOrb.class).setExperience(droppedXP); } diff --git a/src/main/java/com/magmaguy/elitemobs/items/DynamicLore.java b/src/main/java/com/magmaguy/elitemobs/items/DynamicLore.java deleted file mode 100644 index 7548ea337..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/DynamicLore.java +++ /dev/null @@ -1,184 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.items; - -import com.magmaguy.elitemobs.ChatColorConverter; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.EconomySettingsConfig; -import com.magmaguy.elitemobs.config.ItemsDropSettingsConfig; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.ArrayList; -import java.util.List; - -public class DynamicLore { - - public static boolean displayWorth = true; - - /* - This method runs inside of a repeating task that runs on a set interval - */ - public static void refreshDynamicLore() { - - for (Player player : Bukkit.getOnlinePlayers()) - for (ItemStack itemStack : player.getInventory().getContents()) { - - if (!(itemStack != null && itemStack.hasItemMeta() - && itemStack.getItemMeta().hasLore())) - continue; - - if (ObfuscatedSignatureLoreData.obfuscatedSignatureDetector(itemStack) - && !player.getInventory().getItemInMainHand().equals(itemStack) - && !player.getInventory().getItemInOffHand().equals(itemStack)) { - - if (displayWorth) { - - setLoreToWorth(itemStack); - - } else { - - setLoreToResale(itemStack); - - } - - } - - - } - - - displayWorth = !displayWorth; - - } - - private static void setLoreToWorth(ItemStack itemStack) { - - double itemWorth = ItemWorthCalculator.determineItemWorth(itemStack); - double itemResale = ItemWorthCalculator.determineResaleWorth(itemStack); - - ItemMeta itemMeta = itemStack.getItemMeta(); - - List newLore = new ArrayList<>(); - - for (String loreLine : itemMeta.getLore()) { - - if (isEconomyLoreLine(loreLine, itemWorth, itemResale)) { - - String lorePrefix = lorePrefix(loreLine, itemWorth, itemResale); - - newLore.add(lorePrefix + targetValueLine(itemWorth)); - - } else { - - newLore.add(loreLine); - - } - - } - - itemMeta.setLore(newLore); - itemStack.setItemMeta(itemMeta); - - } - - private static void setLoreToResale(ItemStack itemStack) { - - double itemWorth = ItemWorthCalculator.determineItemWorth(itemStack); - double itemResale = ItemWorthCalculator.determineResaleWorth(itemStack); - - ItemMeta itemMeta = itemStack.getItemMeta(); - - List newLore = new ArrayList<>(); - - for (String loreLine : itemMeta.getLore()) { - - if (isEconomyLoreLine(loreLine, itemWorth, itemResale)) { - - String lorePrefix = lorePrefix(loreLine, itemWorth, itemResale); - - newLore.add(lorePrefix + targetResaleLine(itemResale)); - - } else { - - newLore.add(loreLine); - - } - - } - - itemMeta.setLore(newLore); - itemStack.setItemMeta(itemMeta); - - } - - private static boolean isEconomyLoreLine(String loreLine, double worth, double resale) { - - String targetWorthLine = targetValueLine(worth); - String targetResaleLine = targetResaleLine(resale); - - return loreLine.contains(targetResaleLine) || loreLine.contains(targetWorthLine); - - } - - private static String lorePrefix(String loreLine, double worth, double resale) { - - String targetWorthLine = targetValueLine(worth); - String targetResaleLine = targetResaleLine(resale); - String lorePrefix = ""; - - if (loreLine.contains(targetWorthLine)) { - - lorePrefix = loreLine.substring(0, loreLine.indexOf(targetWorthLine)); - - } - - if (loreLine.contains(targetResaleLine)) { - - lorePrefix = loreLine.substring(0, loreLine.indexOf(targetResaleLine)); - - } - - return lorePrefix; - - } - - private static String targetValueLine(double worthOrResale) { - - String worthLore = ConfigValues.itemsDropSettingsConfig.getString(ItemsDropSettingsConfig.LORE_WORTH); - worthLore = worthLore.replace("$worth", worthOrResale + ""); - worthLore = worthLore.replace("$currencyName", ConfigValues.economyConfig.getString(EconomySettingsConfig.CURRENCY_NAME)); - worthLore = ChatColorConverter.convert(worthLore); - - return worthLore; - - } - - private static String targetResaleLine(double resale) { - - String resaleLore = ConfigValues.itemsDropSettingsConfig.getString(ItemsDropSettingsConfig.LORE_RESALE_WORTH); - resaleLore = resaleLore.replace("$resale", resale + ""); - resaleLore = resaleLore.replace("$currencyName", ConfigValues.economyConfig.getString(EconomySettingsConfig.CURRENCY_NAME)); - resaleLore = ChatColorConverter.convert(resaleLore); - - return resaleLore; - - } - - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/EliteEnchantments.java b/src/main/java/com/magmaguy/elitemobs/items/EliteEnchantments.java new file mode 100644 index 000000000..533ceb90d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/EliteEnchantments.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.items; + +import com.magmaguy.elitemobs.config.ItemSettingsConfig; +import org.bukkit.enchantments.Enchantment; + +public class EliteEnchantments { + + public static boolean isPotentialEliteEnchantment(Enchantment enchantment) { + if (!ItemSettingsConfig.isUseEliteEnchantments()) return false; + return enchantment.getKey().equals(Enchantment.SHARPNESS.getKey()) || + enchantment.getKey().equals(Enchantment.POWER.getKey()) || + enchantment.getKey().equals(Enchantment.PROTECTION.getKey()) || + enchantment.getKey().equals(Enchantment.BANE_OF_ARTHROPODS.getKey()) || + enchantment.getKey().equals(Enchantment.SMITE.getKey()) || + enchantment.getKey().equals(Enchantment.BLAST_PROTECTION.getKey()) || + enchantment.getKey().equals(Enchantment.FIRE_PROTECTION.getKey()) || + enchantment.getKey().equals(Enchantment.PROJECTILE_PROTECTION.getKey()) || + enchantment.getKey().equals(Enchantment.THORNS.getKey()); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/EliteItemLore.java b/src/main/java/com/magmaguy/elitemobs/items/EliteItemLore.java new file mode 100644 index 000000000..3edba4109 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/EliteItemLore.java @@ -0,0 +1,289 @@ +package com.magmaguy.elitemobs.items; + +import com.magmaguy.elitemobs.api.utils.EliteItemManager; +import com.magmaguy.elitemobs.config.EconomySettingsConfig; +import com.magmaguy.elitemobs.config.ItemSettingsConfig; +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfig; +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfig; +import com.magmaguy.elitemobs.items.customenchantments.CustomEnchantment; +import com.magmaguy.elitemobs.items.customenchantments.SoulbindEnchantment; +import com.magmaguy.elitemobs.items.potioneffects.ElitePotionEffect; +import com.magmaguy.elitemobs.items.potioneffects.ElitePotionEffectContainer; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Logger; +import com.magmaguy.magmacore.util.Round; +import lombok.Getter; +import org.bukkit.ChatColor; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemFlag; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; + +public class EliteItemLore { + + private final List vanillaEnchantmentsLore = new ArrayList<>(); + private final HashMap eliteVanillaEnchantments = new HashMap<>(); + private final ArrayList eliteVanillaEnchantmentsLore = new ArrayList<>(); + private final HashMap customEnchantments = new HashMap<>(); + private final ArrayList customEnchantmentLore = new ArrayList<>(); + private final List potionListLore = new ArrayList<>(); + @Getter + private ItemStack itemStack; + private ItemMeta itemMeta; + private List lore; + private String soulbindInfo = null; + private boolean showItemWorth; + private String itemWorth = null; + private String itemSource = null; + private EliteEntity eliteEntity; + private Player soulboundPlayer = null; + private List customLore = new ArrayList<>(); + private int prestigeLevel = 0; + private int enchantmentCount = 0; + + + public EliteItemLore(ItemStack itemStack, boolean showItemWorth) { + + if (!EliteItemManager.isEliteMobsItem(itemStack)) { + Logger.warn("Attempted to rewrite the lore of a non-elitemobs item! This is not supposed to happen."); + return; + } + + this.itemStack = itemStack; + this.itemMeta = itemStack.getItemMeta(); + this.lore = new ArrayList<>(); + this.showItemWorth = showItemWorth; + + if (ItemSettingsConfig.isHideAttributes()) itemMeta.addItemFlags(ItemFlag.HIDE_ATTRIBUTES); + + constructVanillaEnchantments(); + + parseAllEliteEnchantments(); + constructEliteEnchantments(); + + parseCustomEnchantments(); + constructCustomEnchantments(); + + constructSoulbindEntry(); + constructSoulboundOwner(); + constructItemSource(); + constructCustomLore(); + constructPrestigeLevel(); + + constructPotionEffects(); + + constructItemWorth(); + + writeNewLore(); + + this.itemMeta.setLore(lore); + ItemTagger.registerEnchantmentCount(itemMeta, enchantmentCount); + this.itemStack.setItemMeta(this.itemMeta); + + } + + private void constructVanillaEnchantments() { + for (Enchantment enchantment : itemMeta.getEnchants().keySet()) { + if (enchantment.getName().contains("CURSE")) + vanillaEnchantmentsLore.add(ChatColorConverter.convert( + "&c" + EnchantmentsConfig.getEnchantment(enchantment).getName() + " " + + itemMeta.getEnchants().get(enchantment))); + else + vanillaEnchantmentsLore.add(ChatColorConverter.convert( + "&7" + EnchantmentsConfig.getEnchantment(enchantment).getName() + " " + + itemMeta.getEnchants().get(enchantment))); + enchantmentCount += itemMeta.getEnchantLevel(enchantment); + } + } + + private void parseAllEliteEnchantments() { + parseEliteEnchantments(Enchantment.SHARPNESS); + parseEliteEnchantments(Enchantment.POWER); + parseEliteEnchantments(Enchantment.PROTECTION); + parseEliteEnchantments(Enchantment.BANE_OF_ARTHROPODS); + parseEliteEnchantments(Enchantment.SMITE); + parseEliteEnchantments(Enchantment.BLAST_PROTECTION); + parseEliteEnchantments(Enchantment.FIRE_PROTECTION); + parseEliteEnchantments(Enchantment.PROJECTILE_PROTECTION); + parseEliteEnchantments(Enchantment.THORNS); + } + + private void parseEliteEnchantments(Enchantment enchantment) { + int enchantmentLevel = ItemTagger.getEnchantment(itemMeta, enchantment.getKey()); + if (enchantmentLevel > enchantment.getMaxLevel()) { + int eliteLevel = enchantmentLevel - enchantment.getMaxLevel(); + eliteVanillaEnchantments.put(enchantment, eliteLevel); + enchantmentCount += eliteLevel; + } + } + + private void constructEliteEnchantments() { + for (Enchantment enchantment : eliteVanillaEnchantments.keySet()) + eliteVanillaEnchantmentsLore.add(ChatColorConverter.convert( + "&7" + ItemSettingsConfig.getEliteEnchantLoreString() + " " + + EnchantmentsConfig.getEnchantment(enchantment).getName() + + " " + eliteVanillaEnchantments.get(enchantment))); + + } + + /** + * Note: This excludes the soulbind enchantment as it doesn't store an integer value + */ + private void parseCustomEnchantments() { + for (CustomEnchantment customEnchantment : CustomEnchantment.getCustomEnchantmentMap().values()) { + int enchantmentLevel = ItemTagger.getEnchantment(itemMeta, customEnchantment.getKey()); + if (enchantmentLevel > 0) { + customEnchantments.put(customEnchantment, enchantmentLevel); + enchantmentCount += enchantmentLevel; + } + } + } + + private void constructCustomEnchantments() { + for (CustomEnchantment customEnchantment : customEnchantments.keySet()) + customEnchantmentLore.add(ChatColorConverter.convert + ("&6" + customEnchantment.getEnchantmentsConfigFields().getName() + " " + + customEnchantments.get(customEnchantment))); + } + + private void constructSoulbindEntry() { + Player player = SoulbindEnchantment.getSoulboundPlayer(itemMeta); + if (player == null) { + soulbindInfo = ChatColorConverter.convert(ItemSettingsConfig.getNoSoulbindLore()); + return; + } + soulbindInfo = ChatColorConverter.convert( + EnchantmentsConfig.getEnchantment("soulbind.yml") + .getFileConfiguration() + .getString("loreStrings") + .replace("$player", player.getDisplayName())); + } + + private void constructPrestigeLevel() { + this.prestigeLevel = SoulbindEnchantment.getPrestigeLevel(itemMeta); + } + + private void constructItemWorth() { + //Note: This writes a new value every time. Value might not have changed. This is not really an issue. + itemStack.setItemMeta(itemMeta); + ItemTagger.writeItemValue(itemStack, soulboundPlayer); + itemMeta = itemStack.getItemMeta(); + if (showItemWorth) + itemWorth = ItemSettingsConfig.getLoreWorth() + .replace("$worth", ItemWorthCalculator.determineItemWorth(itemStack, soulboundPlayer) + "") + .replace("$currencyName", EconomySettingsConfig.getCurrencyName()); + else + itemWorth = ItemSettingsConfig.getLoreResale() + .replace("$resale", ItemWorthCalculator.determineResaleWorth(itemStack, soulboundPlayer) + "") + .replace("$currencyName", EconomySettingsConfig.getCurrencyName()); + } + + private void constructSoulboundOwner() { + this.soulboundPlayer = SoulbindEnchantment.getSoulboundPlayer(itemMeta); + } + + private void constructItemSource() { + itemSource = ItemTagger.getItemSource(itemMeta); + } + + private void constructCustomLore() { + this.customLore = ItemTagger.getCustomLore(itemMeta); + } + + private void constructPotionEffects() { + for (ElitePotionEffect elitePotionEffect : ElitePotionEffectContainer.getElitePotionEffectContainer(itemMeta, ItemTagger.continuousPotionEffectKey)) + potionListLore.add(ChatColorConverter.convert(PotionEffectsConfig.getPotionEffect( + elitePotionEffect.getPotionEffect().getType().getKey().getKey().toLowerCase(Locale.ROOT) + ".yml").getName() + + ItemSettingsConfig.getPotionEffectContinuousLore() + " " + (elitePotionEffect.getPotionEffect().getAmplifier() + 1))); + for (ElitePotionEffect elitePotionEffect : ElitePotionEffectContainer.getElitePotionEffectContainer(itemMeta, ItemTagger.onHitPotionEffectKey)) + if (elitePotionEffect.getTarget().equals(ElitePotionEffect.Target.SELF)) + potionListLore.add(ChatColorConverter.convert(PotionEffectsConfig.getPotionEffect( + elitePotionEffect.getPotionEffect().getType().getKey().getKey().toLowerCase(Locale.ROOT) + ".yml").getName() + + ItemSettingsConfig.getPotionEffectOnHitSelfLore() + " " + (elitePotionEffect.getPotionEffect().getAmplifier() + 1))); + else + potionListLore.add(ChatColorConverter.convert(PotionEffectsConfig.getPotionEffect( + elitePotionEffect.getPotionEffect().getType().getKey().getKey().toLowerCase(Locale.ROOT) + ".yml").getName() + + ItemSettingsConfig.getPotionEffectOnHitTargetLore() + " " + (elitePotionEffect.getPotionEffect().getAmplifier() + 1))); + } + + private void writeNewLore() { + for (String string : ItemSettingsConfig.getLoreStructure()) { + + if (string.contains("$weaponOrArmorStats")) { + if (EliteItemManager.isWeapon(itemStack)) + string = ItemSettingsConfig.getWeaponEntry(); + else if (EliteItemManager.isArmor(itemStack)) + string = ItemSettingsConfig.getArmorEntry(); + else + string = ""; + } + + string = stringReplacer(string, "$EDPS", Round.twoDecimalPlaces(EliteItemManager.getDPS(itemStack))); + string = stringReplacer(string, "$EDEF", Round.twoDecimalPlaces(EliteItemManager.getEliteDefense(itemStack) + EliteItemManager.getBonusEliteDefense(itemStack))); + string = stringReplacer(string, "$prestigeLevel", prestigeLevel); + string = stringReplacer(string, "$itemLevel", EliteItemManager.getRoundedItemLevel(itemStack)); + + + if (string.contains("$enchantments")) { + for (String entry : vanillaEnchantmentsLore) + lore.add(ChatColorConverter.convert(ItemSettingsConfig.getVanillaEnchantmentColor() + entry)); + } else if (string.contains("$eliteEnchantments")) { + for (String entry : eliteVanillaEnchantmentsLore) + lore.add(ChatColorConverter.convert(ItemSettingsConfig.getEliteEnchantmentColor() + ChatColor.stripColor(entry))); + } else if (string.contains("$itemSource")) { + if (itemSource != null) + lore.add(itemSource); + } else if (string.contains("$potionEffect")) { + for (String entry : potionListLore) + lore.add(ChatColorConverter.convert(ItemSettingsConfig.getPotionEffectColor() + entry)); + } else if (string.contains("$customEnchantments")) { + for (String entry : customEnchantmentLore) + lore.add(ChatColorConverter.convert(ItemSettingsConfig.getCustomEnchantmentColor() + ChatColor.stripColor(entry))); + } else if (string.contains("$loreResaleValue")) { + lore.add(itemWorth); + } else if (string.contains("$customLore")) { + for (String entry : customLore) + lore.add(ChatColorConverter.convert(entry)); + } else if (string.contains("$soulbindInfo")) { + lore.add(soulbindInfo); + //bypasses in case of conditional formatting + } else if (string.contains("$ifPotionEffects")) { + if (!potionListLore.isEmpty()) + lore.add(string.replace("$ifPotionEffects", "")); + } else if (string.contains("$ifEnchantments")) { + if (!vanillaEnchantmentsLore.isEmpty()) + lore.add(string.replace("$ifEnchantments", "")); + } else if (string.contains("$ifLore")) { + if (!customLore.isEmpty()) + lore.add(string.replace("$ifLore", "")); + } else if (string.contains("$ifCustomEnchantments")) { + if (!customEnchantments.isEmpty()) + lore.add(string.replace("$ifCustomEnchantments", "")); + } else if (!string.isEmpty()) + lore.add(ChatColorConverter.convert(string)); + } + } + + private String stringReplacer(String originalString, String placeholder, int value) { + return stringReplacer(originalString, placeholder, value + ""); + } + + private String stringReplacer(String originalString, String placeholder, double value) { + return stringReplacer(originalString, placeholder, value + ""); + } + + private String stringReplacer(String originalString, String placeholder, String replacement) { + String processedString = originalString; + if (originalString.contains(placeholder)) + processedString = originalString.replace(placeholder, replacement); + return processedString; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/EnchantmentHider.java b/src/main/java/com/magmaguy/elitemobs/items/EnchantmentHider.java deleted file mode 100644 index 0d4c0e2e9..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/EnchantmentHider.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.items; - -import org.bukkit.inventory.ItemFlag; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - -public class EnchantmentHider { - - public static ItemStack hideEnchantments(ItemStack itemStack) { - - ItemMeta itemMeta = itemStack.getItemMeta(); - itemMeta.addItemFlags(ItemFlag.HIDE_ENCHANTS); - itemStack.setItemMeta(itemMeta); - - return itemStack; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/ItemDropVelocity.java b/src/main/java/com/magmaguy/elitemobs/items/ItemDropVelocity.java index 50ded0589..306c1ebb7 100644 --- a/src/main/java/com/magmaguy/elitemobs/items/ItemDropVelocity.java +++ b/src/main/java/com/magmaguy/elitemobs/items/ItemDropVelocity.java @@ -1,18 +1,3 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package com.magmaguy.elitemobs.items; import org.bukkit.util.Vector; diff --git a/src/main/java/com/magmaguy/elitemobs/items/ItemLootShower.java b/src/main/java/com/magmaguy/elitemobs/items/ItemLootShower.java new file mode 100644 index 000000000..71782f7d2 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/ItemLootShower.java @@ -0,0 +1,459 @@ +package com.magmaguy.elitemobs.items; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.adventurersguild.GuildRank; +import com.magmaguy.elitemobs.config.EconomySettingsConfig; +import com.magmaguy.elitemobs.config.ItemSettingsConfig; +import com.magmaguy.elitemobs.economy.EconomyHandler; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.items.customenchantments.SoulbindEnchantment; +import com.magmaguy.elitemobs.playerdata.ElitePlayerInventory; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import com.magmaguy.magmacore.util.Logger; +import com.magmaguy.magmacore.util.Round; +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityPickupItemEvent; +import org.bukkit.event.inventory.InventoryPickupItemEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.ThreadLocalRandom; + +public class ItemLootShower implements Listener { + + private static final HashMap playerCurrencyPickup = new HashMap<>(); + public static HashMap coinValues = new HashMap<>(); + private final Player player; + + public ItemLootShower(double itemLevel, double mobLevel, Location location, Player player) { + + this.player = player; + + if (ElitePlayerInventory.playerInventories.get(player.getUniqueId()) == null) return; + + if (!EconomySettingsConfig.isEnableCurrencyShower() || !SoulbindEnchantment.isEnabled) + return; + + if (Math.abs(mobLevel - ElitePlayerInventory.playerInventories.get(player.getUniqueId()).getFullPlayerTier(false)) + > ItemSettingsConfig.getLootLevelDifferenceLockout()) { + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + counter++; + if (!player.isValid() || counter > 20 * 5) { + cancel(); + return; + } + player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText( + ChatColorConverter.convert(ItemSettingsConfig.getLevelRangeTooDifferent()) + .replace("$playerLevel", ElitePlayerInventory.playerInventories.get(player.getUniqueId()).getFullPlayerTier(false) + "") + .replace("$bossLevel", (int) mobLevel + ""))); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + return; + } + if (ItemSettingsConfig.isPutLootDirectlyIntoPlayerInventory()) + addDirectly(getCurrencyAmount(itemLevel)); + else + addIndirectly(location, getCurrencyAmount(itemLevel)); + } + + public ItemLootShower(Location location, Player player, int amount) { + this.player = player; + addIndirectly(location, amount); + } + + private static void sendCurrencyNotification(Player player) { + if (playerCurrencyPickup.containsKey(player)) return; + + new BukkitRunnable() { + double oldAmount = 0; + + @Override + public void run() { + + if (!playerCurrencyPickup.containsKey(player)) { + playerCurrencyPickup.put(player, 0.0); + return; + } + + if (oldAmount != playerCurrencyPickup.get(player)) { + oldAmount = playerCurrencyPickup.get(player); + return; + } + + player.sendMessage(ChatColorConverter.convert(EconomySettingsConfig.getChatCurrencyShowerMessage() + .replace("$currency_name", EconomySettingsConfig.getCurrencyName()) + .replace("$amount", playerCurrencyPickup.get(player) + ""))); + + playerCurrencyPickup.remove(player); + sendAdventurersGuildNotification(player); + + cancel(); + + } + + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 40); + + } + + private static void sendAdventurersGuildNotification(Player player) { + player.spigot().sendMessage(ChatMessageType.ACTION_BAR, + TextComponent.fromLegacyText(ChatColorConverter.convert(EconomySettingsConfig.getAdventurersGuildNotificationMessage()))); + } + + private void addIndirectly(Location location, int currencyAmount2) { + new BukkitRunnable() { + int currencyAmount = currencyAmount2; + + @Override + public void run() { + + if (currencyAmount <= 0) { + cancel(); + return; + } + + if (currencyAmount >= 1000) { + if (ThreadLocalRandom.current().nextDouble() < 0.65) { + dropOneThousand(location); + currencyAmount -= 1000; + return; + } + } + + if (currencyAmount >= 500) { + if (ThreadLocalRandom.current().nextDouble() < 0.65) { + dropFiveHundred(location); + currencyAmount -= 500; + return; + } + } + + if (currencyAmount >= 100) { + if (ThreadLocalRandom.current().nextDouble() < 0.65) { + dropOneHundred(location); + currencyAmount -= 100; + } + + } else if (currencyAmount >= 50) { + if (ThreadLocalRandom.current().nextDouble() < 0.65) { + dropFifty(location); + currencyAmount -= 50; + } + + } else if (currencyAmount >= 20) { + if (ThreadLocalRandom.current().nextDouble() < 0.65) { + dropTwenty(location); + currencyAmount -= 20; + } + + } else if (currencyAmount >= 10) { + if (ThreadLocalRandom.current().nextDouble() < 0.65) { + dropTen(location); + currencyAmount -= 10; + } + + } else if (currencyAmount >= 5) { + if (ThreadLocalRandom.current().nextDouble() < 0.65) { + dropFive(location); + currencyAmount -= 5; + } + + } else { + dropOne(location); + currencyAmount--; + } + } + }.runTaskTimer(MetadataHandler.PLUGIN, 2, 2); + } + + private int getCurrencyAmount(double eliteMobTier) { + return (int) (eliteMobTier / 2D * EconomySettingsConfig.getCurrencyShowerMultiplier() * + GuildRank.currencyBonusMultiplier(GuildRank.getGuildPrestigeRank(player))); + } + + private void addDirectly(double eliteMobTier) { + EconomyHandler.addCurrency(player.getUniqueId(), getCurrencyAmount(eliteMobTier)); + player.sendMessage(ChatColorConverter.convert(EconomySettingsConfig.getChatCurrencyShowerMessage() + .replace("$currency_name", EconomySettingsConfig.getCurrencyName()) + .replace("$amount", getCurrencyAmount(eliteMobTier) + ""))); + } + + private Item generateCurrencyItem(Material material, Location location, double value) { + + ItemStack currencyItemStack = SoulbindEnchantment.addEnchantment(ItemStackGenerator.generateItemStack(material, "", + new ArrayList<>(List.of("EliteMobsCurrencyItem", value + "", ThreadLocalRandom.current().nextDouble() + ""))), player); + int model = 1; + try { + model = EconomySettingsConfig.getThisConfiguration().getInt("lootShowerData." + (int) value); + } catch (Exception ex) { + Logger.warn("Failed to get coin model for value " + value + " !"); + } + setCoinModel(currencyItemStack, model); + Item currencyItem = location.getWorld().dropItem(location.clone().add(new Vector(0, 1, 0)), currencyItemStack); + EntityTracker.registerVisualEffects(currencyItem); + currencyItem.setInvulnerable(true); + + currencyItem.setVelocity(new Vector( + (ThreadLocalRandom.current().nextDouble() - 0.5) / 2, + 0.5, + (ThreadLocalRandom.current().nextDouble() - 0.5) / 2)); + + SoulbindEnchantment.addPhysicalDisplay(currencyItem, this.player); + + new Coin(value, player, currencyItem); + + return currencyItem; + + } + + private void dropOne(Location location) { + + Item currencyItem; + try { + currencyItem = generateCurrencyItem(Material.getMaterial(EconomySettingsConfig.getLootShowerMaterial1()), location, 1); + } catch (Exception ex) { + Logger.warn("Material for EliteMob shower 1 is invalid. Defaulting to gold nugget."); + currencyItem = generateCurrencyItem(Material.GOLD_NUGGET, location, 1); + } + + currencyItem.setCustomName(ChatColorConverter.convert("&7" + 1 + " " + EconomySettingsConfig.getCurrencyName())); + currencyItem.setCustomNameVisible(true); + + } + + private void dropFive(Location location) { + + Item currencyItem; + try { + currencyItem = generateCurrencyItem(Material.getMaterial(EconomySettingsConfig.getLootShowerMaterial5()), location, 5); + } catch (Exception ex) { + Logger.warn("Material for EliteMob shower 5 is invalid. Defaulting to gold ingot."); + currencyItem = generateCurrencyItem(Material.GOLD_INGOT, location, 5); + } + + currencyItem.setCustomName(ChatColorConverter.convert("&f" + 5 + " " + EconomySettingsConfig.getCurrencyName())); + currencyItem.setCustomNameVisible(true); + } + + private void dropTen(Location location) { + + Item currencyItem; + try { + currencyItem = generateCurrencyItem(Material.getMaterial(EconomySettingsConfig.getLootShowerMaterial10()), location, 10); + } catch (Exception ex) { + Logger.warn("Material for EliteMob shower 10 is invalid. Defaulting to Gold block."); + currencyItem = generateCurrencyItem(Material.GOLD_BLOCK, location, 10); + } + + currencyItem.setCustomName(ChatColorConverter.convert("&a" + 10 + " " + EconomySettingsConfig.getCurrencyName())); + currencyItem.setCustomNameVisible(true); + } + + private void dropTwenty(Location location) { + + Item currencyItem; + try { + currencyItem = generateCurrencyItem(Material.getMaterial(EconomySettingsConfig.getLootShowerMaterial20()), location, 20); + } catch (Exception ex) { + Logger.warn("Material for EliteMob shower 20 is invalid. Defaulting to emerald."); + currencyItem = generateCurrencyItem(Material.EMERALD, location, 20); + } + + currencyItem.setCustomName(ChatColorConverter.convert("&2" + 20 + " " + EconomySettingsConfig.getCurrencyName())); + currencyItem.setCustomNameVisible(true); + } + + private void dropFifty(Location location) { + + Item currencyItem; + try { + currencyItem = generateCurrencyItem(Material.getMaterial(EconomySettingsConfig.getLootShowerMaterial50()), location, 50); + } catch (Exception ex) { + Logger.warn("Material for EliteMob shower 50 is invalid. Defaulting to emerald block."); + currencyItem = generateCurrencyItem(Material.EMERALD_BLOCK, location, 50); + } + + currencyItem.setCustomName(ChatColorConverter.convert("&2" + 50 + " " + EconomySettingsConfig.getCurrencyName())); + currencyItem.setCustomNameVisible(true); + } + + private void dropOneHundred(Location location) { + Item currencyItem; + try { + currencyItem = generateCurrencyItem(Material.getMaterial(EconomySettingsConfig.getLootShowerMaterial100()), location, 100); + } catch (Exception ex) { + Logger.warn("Material for EliteMob shower 100 is invalid. Defaulting to diamond."); + currencyItem = generateCurrencyItem(Material.DIAMOND, location, 100); + } + + currencyItem.setCustomName(ChatColorConverter.convert("&2" + 100 + " " + EconomySettingsConfig.getCurrencyName())); + currencyItem.setCustomNameVisible(true); + } + + private void dropFiveHundred(Location location) { + Item currencyItem; + try { + currencyItem = generateCurrencyItem(Material.getMaterial(EconomySettingsConfig.getLootShowerMaterial500()), location, 500); + } catch (Exception ex) { + Logger.warn("Material for EliteMob shower 500 is invalid. Defaulting to diamond block."); + currencyItem = generateCurrencyItem(Material.DIAMOND_BLOCK, location, 500); + } + + currencyItem.setCustomName(ChatColorConverter.convert("&2" + 500 + " " + EconomySettingsConfig.getCurrencyName())); + currencyItem.setCustomNameVisible(true); + } + + private void dropOneThousand(Location location) { + Item currencyItem; + try { + currencyItem = generateCurrencyItem(Material.getMaterial(EconomySettingsConfig.getLootShowerMaterial1000()), location, 1000); + } catch (Exception ex) { + Logger.warn("Material for EliteMob shower 1000 is invalid. Defaulting to nether star."); + currencyItem = generateCurrencyItem(Material.NETHER_STAR, location, 1000); + } + + currencyItem.setCustomName(ChatColorConverter.convert("&2" + 1000 + " " + EconomySettingsConfig.getCurrencyName())); + currencyItem.setCustomNameVisible(true); + } + + private ItemStack setCoinModel(ItemStack itemStack, int data) { + ItemMeta itemMeta = itemStack.getItemMeta(); + itemMeta.setCustomModelData(data); + itemStack.setItemMeta(itemMeta); + return itemStack; + } + + /** + * Currency pickup event + */ + public static class ItemLootShowerEvents implements Listener { + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public static void onItemPickup(EntityPickupItemEvent event) { + //coins are soulbound so if someone can pick them up they can have it + if (!coinValues.containsKey(event.getItem().getUniqueId())) return; + event.setCancelled(true); + if (!event.getEntity().getType().equals(EntityType.PLAYER)) return; + + Coin coin = coinValues.get(event.getItem().getUniqueId()); + if (!coin.pickupable) + return; + + coinValues.remove(event.getItem().getUniqueId()); + double amountIncremented = coin.value; + Player player = (Player) event.getEntity(); + event.getItem().remove(); + EconomyHandler.addCurrency(player.getUniqueId(), amountIncremented); + sendCurrencyNotification(player); + + //cache for counting how much coin they're getting over a short amount of time + if (playerCurrencyPickup.containsKey(player)) + playerCurrencyPickup.put(player, playerCurrencyPickup.get(player) + amountIncremented); + else + playerCurrencyPickup.put(player, amountIncremented); + + player.spigot().sendMessage(ChatMessageType.ACTION_BAR, + TextComponent.fromLegacyText( + ChatColorConverter.convert(EconomySettingsConfig.getActionBarCurrencyShowerMessage() + .replace("$currency_name", EconomySettingsConfig.getCurrencyName()) + .replace("$amount", Round.twoDecimalPlaces(playerCurrencyPickup.get(player)) + "")))); + } + + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public static void onItemPickup(InventoryPickupItemEvent event) { + if (!coinValues.containsKey(event.getItem().getUniqueId())) return; + event.setCancelled(true); + } + } + + private class Coin { + UUID player; + UUID item; + double value; + boolean pickupable; + + public Coin(double value, Player player, Item item) { + this.player = player.getUniqueId(); + this.value = value; + this.item = item.getUniqueId(); + coinValues.put(item.getUniqueId(), this); + pickupable = false; + item.setGravity(false); + new BukkitRunnable() { + @Override + public void run() { + if (coinValues.containsKey(item.getUniqueId())) { + if (Bukkit.getEntity(item.getUniqueId()) != null) + Bukkit.getEntity(item.getUniqueId()).remove(); + coinValues.remove(item.getUniqueId()); + } + } + }.runTaskLater(MetadataHandler.PLUGIN, 20 * 60 * 5); + + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + + if (!item.isValid() || + !player.isValid() || + !player.getWorld().equals(item.getWorld()) || + counter > 20 * 4 || + item.getLocation().distanceSquared(player.getLocation()) > 900) { + cancel(); + pickupable = true; + item.setGravity(true); + return; + } + + item.setVelocity(player.getLocation().clone().subtract(item.getLocation()).toVector().normalize().multiply(0.2)); + + if (player.getLocation().distanceSquared(item.getLocation()) <= 1) { + item.remove(); + EconomyHandler.addCurrency(player.getUniqueId(), value); + sendCurrencyNotification(player); + + //cache for counting how much coin they're getting over a short amount of time + if (playerCurrencyPickup.containsKey(player)) + playerCurrencyPickup.put(player, playerCurrencyPickup.get(player) + value); + else + playerCurrencyPickup.put(player, value); + + player.spigot().sendMessage(ChatMessageType.ACTION_BAR, + TextComponent.fromLegacyText( + ChatColorConverter.convert(EconomySettingsConfig.getActionBarCurrencyShowerMessage() + .replace("$currency_name", EconomySettingsConfig.getCurrencyName()) + .replace("$amount", Round.twoDecimalPlaces(playerCurrencyPickup.get(player)) + "")))); + coinValues.remove(item.getUniqueId()); + cancel(); + return; + } + + counter++; + } + }.runTaskTimer(MetadataHandler.PLUGIN, 1, 1); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/ItemTagger.java b/src/main/java/com/magmaguy/elitemobs/items/ItemTagger.java new file mode 100644 index 000000000..4d2df3b0a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/ItemTagger.java @@ -0,0 +1,320 @@ +package com.magmaguy.elitemobs.items; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.ItemSettingsConfig; +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfig; +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; +import com.magmaguy.elitemobs.items.customenchantments.CustomEnchantment; +import com.magmaguy.elitemobs.items.potioneffects.ElitePotionEffect; +import com.magmaguy.elitemobs.items.potioneffects.ElitePotionEffectContainer; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.utils.PersistentVanillaData; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.NamespacedKey; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.*; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.tags.ItemTagType; +import org.bukkit.persistence.PersistentDataType; + +import javax.annotation.Nullable; +import java.util.*; + +public class ItemTagger { + + public static final NamespacedKey eliteMobsItemNamespacedKey = new NamespacedKey(MetadataHandler.PLUGIN, "EliteMobsItem"); + public static final NamespacedKey customLore = new NamespacedKey(MetadataHandler.PLUGIN, "CustomLore"); + @Getter + private static final NamespacedKey ELITE_DAMAGE = new NamespacedKey(MetadataHandler.PLUGIN, "eliteDamage"); + @Getter + private static final NamespacedKey ELITE_DEFENSE = new NamespacedKey(MetadataHandler.PLUGIN, "eliteDefense"); + + public static String itemValue = "ItemValue"; + + public static NamespacedKey onHitPotionEffectKey = new NamespacedKey(MetadataHandler.PLUGIN, "onHitPotionEffect"); + public static NamespacedKey continuousPotionEffectKey = new NamespacedKey(MetadataHandler.PLUGIN, "continuousPotionEffect"); + public static NamespacedKey itemSource = new NamespacedKey(MetadataHandler.PLUGIN, "itemSource"); + public static NamespacedKey enchantmentCount = new NamespacedKey(MetadataHandler.PLUGIN, "enchantmentCount"); + + public static void registerEliteItem(ItemMeta itemMeta) { + itemMeta.getPersistentDataContainer().set(eliteMobsItemNamespacedKey, PersistentDataType.BYTE, (byte) 1); + } + + /** + * Used to register custom lore as a string to the item. This is necessary for the lore updater as it redraws the custom + * lore portion of the item based on these contents. + * + * @param itemMeta ItemStack to which custom lore should be added + * @param lore Custom part of the lore to add + */ + public static void registerCustomLore(ItemMeta itemMeta, List lore) { + StringBuilder parsedLore = new StringBuilder(); + for (int i = 0; i < lore.size(); i++) { + parsedLore.append(lore.get(i)); + if (i < lore.size() - 1) + parsedLore.append("\n"); + } + itemMeta.getPersistentDataContainer().set(customLore, PersistentDataType.STRING, parsedLore.toString()); + } + + /** + * Returns any custom lore stored in an item. Returns null if there isn't any. + * + * @param itemMeta + * @return + */ + public static List getCustomLore(ItemMeta itemMeta) { + String rawLore = itemMeta.getPersistentDataContainer().get(customLore, PersistentDataType.STRING); + if (rawLore == null) + return new ArrayList<>(); + ArrayList parsedLore = new ArrayList(); + Collections.addAll(parsedLore, rawLore.split("\n")); + return parsedLore; + } + + public static boolean isEliteItem(ItemStack itemStack) { + if (itemStack == null) return false; + if (!itemStack.hasItemMeta()) return false; + if (itemStack.getItemMeta().getCustomTagContainer().hasCustomTag(eliteMobsItemNamespacedKey, ItemTagType.BYTE)) + return true; + return itemStack.getItemMeta().getPersistentDataContainer().has(eliteMobsItemNamespacedKey, PersistentDataType.BYTE); + } + + /** + * Registers all enchantments as they'd appear when constructing an item in EliteMobs + * + * @param itemMeta + * @param enchantmentMap + */ + public static void registerEnchantments(ItemMeta itemMeta, HashMap enchantmentMap) { + for (Enchantment enchantment : enchantmentMap.keySet()) + if (EliteEnchantments.isPotentialEliteEnchantment(enchantment)) + registerEnchantment(itemMeta, enchantment.getKey(), enchantmentMap.get(enchantment)); + } + + /** + * For minecraft enchantments + * + * @param itemMeta + * @param enchantmentKey + * @param enchantmentLevel + */ + public static void registerEnchantment(ItemMeta itemMeta, NamespacedKey enchantmentKey, int enchantmentLevel) { + itemMeta.getPersistentDataContainer().set(enchantmentKey, PersistentDataType.INTEGER, enchantmentLevel); + } + + public static void registerCustomEnchantments(ItemMeta itemMeta, HashMap customEnchantments) { + for (String subString : customEnchantments.keySet()) + registerCustomEnchantment(itemMeta, subString, customEnchantments.get(subString)); + } + + /** + * For custom enchantments + * + * @param itemMeta + * @param enchantmentKey + * @param enchantmentLevel + */ + public static void registerCustomEnchantment(ItemMeta itemMeta, String enchantmentKey, int enchantmentLevel) { + itemMeta.getPersistentDataContainer().set(new NamespacedKey(MetadataHandler.PLUGIN, enchantmentKey), PersistentDataType.INTEGER, enchantmentLevel); + } + + public static void registerCustomEnchantment(ItemMeta itemMeta, String enchantmentKey, String uuid) { + itemMeta.getPersistentDataContainer().set(new NamespacedKey(MetadataHandler.PLUGIN, enchantmentKey), PersistentDataType.STRING, uuid); + } + + public static int getEnchantment(ItemMeta itemMeta, String enchantmentKey) { + return getEnchantment(itemMeta, new NamespacedKey(MetadataHandler.PLUGIN, enchantmentKey)); + } + + /** + * Returns the level of that enchantment on the item. 0 means the enchantment is not present. + * + * @param itemMeta + * @param enchantmentKey + * @return + */ + public static int getEnchantment(ItemMeta itemMeta, NamespacedKey enchantmentKey) { + if (itemMeta == null) + return 0; + Integer level = itemMeta.getPersistentDataContainer().get(enchantmentKey, PersistentDataType.INTEGER); + if (level == null) { + Enchantment enchantment = Enchantment.getByKey(enchantmentKey); + if (enchantment != null) + return itemMeta.getEnchantLevel(enchantment); + else + return 0; + } else + return level; + } + + public static boolean hasEnchantment(ItemMeta itemMeta, NamespacedKey enchantmentKey) { + if (!itemMeta.hasLore()) //early performance tweak + return false; + if (itemMeta.getCustomTagContainer().hasCustomTag(enchantmentKey, ItemTagType.INTEGER)) + return true; + return itemMeta.getPersistentDataContainer().has(enchantmentKey, PersistentDataType.INTEGER); + } + + public static boolean hasKey(ItemStack itemStack, String key) { + if (itemStack == null) return false; + if (!itemStack.hasItemMeta()) return false; + return Objects.requireNonNull(itemStack.getItemMeta()).getPersistentDataContainer().has(new NamespacedKey(MetadataHandler.PLUGIN, key), PersistentDataType.STRING); + } + + public static boolean hasEnchantment(ItemMeta itemMeta, String keyString) { + NamespacedKey enchantmentKey = new NamespacedKey(MetadataHandler.PLUGIN, keyString); + if (!itemMeta.hasLore()) //early performance tweak + return false; + if (itemMeta.getCustomTagContainer().hasCustomTag(enchantmentKey, ItemTagType.INTEGER)) + return true; + return itemMeta.getPersistentDataContainer().has(enchantmentKey, PersistentDataType.INTEGER); + } + + public static ArrayList getPotionEffects(ItemMeta itemMeta, NamespacedKey namespacedKey) { + return ElitePotionEffectContainer.getElitePotionEffectContainer(itemMeta, namespacedKey); + } + + public static void registerItemSource(EliteEntity eliteEntity, ItemMeta itemMeta) { + if (eliteEntity == null) { + itemMeta.getPersistentDataContainer().set(itemSource, PersistentDataType.STRING, ChatColorConverter.convert(ItemSettingsConfig.getShopItemSource())); + return; + } + itemMeta.getPersistentDataContainer().set(itemSource, PersistentDataType.STRING, ChatColorConverter.convert(ItemSettingsConfig.getMobItemSource().replace("$mob", eliteEntity.getName()))); + } + + public static String getItemSource(ItemMeta itemMeta) { + return itemMeta.getPersistentDataContainer().get(itemSource, PersistentDataType.STRING); + } + + /** + * Writes the value into the persistent data container. This is used to only ever calculate item worth once. + * The weakness with this system is that if admins change the price scaling, the changes will not affect older items. + * This is still worth it to only ever calculate the price of items once, as mass calculating item prices can be costly. + * Also, item values will be updated with each lore refresh. + * NOTE: This is the item value, not the resale value. These are two very different values! + * + * @param itemStack ItemStack to register the value onto. + * @param player Player associated to the ItemStack. This is necessary because different prestige tiers will result in + * different prices. + */ + public static void writeItemValue(ItemStack itemStack, Player player) { + PersistentVanillaData.write(itemStack, itemValue, ItemWorthCalculator.writeItemWorth(itemStack, player)); + } + + /** + * Gets the item value for the selected Elite Item. + * + * @param itemStack ItemStack to get value from + * @return Value. Will be -1 if no values is registered! + */ + public static double getItemValue(ItemStack itemStack) { + return PersistentVanillaData.getDouble(itemStack, itemValue); + } + + public static double getEliteDamageAttribute(@Nullable ItemStack itemStack) { + double value = 0; + if (itemStack != null && + itemStack.getItemMeta() != null && + itemStack.getItemMeta().getPersistentDataContainer().get(ELITE_DAMAGE, PersistentDataType.DOUBLE) != null) + return itemStack.getItemMeta().getPersistentDataContainer().get(ELITE_DAMAGE, PersistentDataType.DOUBLE); + return value; + } + + public static double getEliteDamageAttribute(@Nullable Projectile projectile) { + if (projectile == null) return 0D; + if (projectile.getPersistentDataContainer().get(ELITE_DAMAGE, PersistentDataType.DOUBLE) == null) return 0D; + return projectile.getPersistentDataContainer().get(ELITE_DAMAGE, PersistentDataType.DOUBLE); + } + + public static void setEliteDamageAttribute(ItemStack itemStack, double damageValue) { + if (itemStack == null || itemStack.getItemMeta() == null) return; + ItemMeta itemMeta = itemStack.getItemMeta(); + itemMeta.getPersistentDataContainer().set(ELITE_DAMAGE, PersistentDataType.DOUBLE, damageValue); + itemStack.setItemMeta(itemMeta); + } + + public static void setEliteDamageAttribute(@Nullable Projectile projectile, double damageValue) { + if (projectile == null) return; + if (ItemSettingsConfig.isUseEliteEnchantments()) + projectile.getPersistentDataContainer().set(ELITE_DAMAGE, PersistentDataType.DOUBLE, damageValue); + else { + if (projectile.getType().equals(EntityType.ARROW)) { + Arrow arrow = (Arrow) projectile; + arrow.setDamage(arrow.getDamage() + damageValue); + } else if (projectile.getType().equals(EntityType.TRIDENT)) { + Trident trident = (Trident) projectile; + trident.setDamage(trident.getDamage() + damageValue); + } + } + } + + public static double getEliteDefenseAttribute(@Nullable ItemStack itemStack) { + if (itemStack == null) return 0D; + if (itemStack.getItemMeta() == null) return 0D; + if (itemStack.getItemMeta().getPersistentDataContainer().get(ELITE_DEFENSE, PersistentDataType.DOUBLE) == null) + return 0D; + return itemStack.getItemMeta().getPersistentDataContainer().get(ELITE_DEFENSE, PersistentDataType.DOUBLE); + } + + public static void setEliteDefenseAttribute(@Nullable ItemStack itemStack, double defenseValue) { + if (itemStack == null || itemStack.getItemMeta() == null) return; + ItemMeta itemMeta = itemStack.getItemMeta(); + itemMeta.getPersistentDataContainer().set(ELITE_DEFENSE, PersistentDataType.DOUBLE, defenseValue); + itemStack.setItemMeta(itemMeta); + } + + public static void registerEnchantmentCount(@Nullable ItemMeta itemMeta, int count) { + if (itemMeta == null) return; + itemMeta.getPersistentDataContainer().set(enchantmentCount, PersistentDataType.INTEGER, count); + } + + public static int getEnchantmentCount(@Nullable ItemStack itemStack) { + if (itemStack == null || itemStack.getItemMeta() == null) return 0; + Integer value = itemStack.getItemMeta().getPersistentDataContainer().get(enchantmentCount, PersistentDataType.INTEGER); + return value == null ? 0 : value; + } + + public static HashMap getItemEnchantments(@Nullable ItemStack itemStack) { + HashMap itemEnchantmentFilenames = new HashMap<>(); + if (itemStack == null || itemStack.getItemMeta() == null) return itemEnchantmentFilenames; + ItemMeta itemMeta = itemStack.getItemMeta(); + for (Enchantment enchantment : Enchantment.values()) { + int enchantmentLevel = getEnchantment(itemMeta, enchantment.getKey()); + if (enchantmentLevel > 0) + itemEnchantmentFilenames.put(enchantment.getKey(), enchantmentLevel); + } + for (CustomEnchantment customEnchantment : CustomEnchantment.getCustomEnchantmentMap().values()) { + int enchantmentLevel = getEnchantment(itemMeta, customEnchantment.getKey()); + if (enchantmentLevel > 0) + itemEnchantmentFilenames.put(new NamespacedKey(MetadataHandler.PLUGIN, customEnchantment.getKey()), enchantmentLevel); + } + return itemEnchantmentFilenames; + } + + public static HashMap getItemEnchantmentConfigFields(@Nullable ItemStack itemStack) { + HashMap itemEnchantmentFilenames = new HashMap<>(); + if (itemStack == null || itemStack.getItemMeta() == null) return itemEnchantmentFilenames; + ItemMeta itemMeta = itemStack.getItemMeta(); + for (Enchantment enchantment : Enchantment.values()) { + int enchantmentLevel = getEnchantment(itemMeta, enchantment.getKey()); + if (enchantmentLevel > 0) { + EnchantmentsConfigFields enchantmentsConfigFields = EnchantmentsConfig.getEnchantment(enchantment.getName().toLowerCase(Locale.ROOT) + ".yml"); + if (enchantmentsConfigFields == null) { + Logger.warn("Failed to get configuration file for enchantment called " + enchantment.getName().toLowerCase(Locale.ROOT) + ".yml"); + continue; + } + itemEnchantmentFilenames.put(enchantmentsConfigFields, enchantmentLevel); + } + } + for (CustomEnchantment customEnchantment : CustomEnchantment.getCustomEnchantmentMap().values()) { + int enchantmentLevel = getEnchantment(itemMeta, customEnchantment.getKey()); + if (enchantmentLevel > 0) + itemEnchantmentFilenames.put(customEnchantment.getEnchantmentsConfigFields(), enchantmentLevel); + } + return itemEnchantmentFilenames; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/ItemTierFinder.java b/src/main/java/com/magmaguy/elitemobs/items/ItemTierFinder.java deleted file mode 100644 index 0db959a06..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/ItemTierFinder.java +++ /dev/null @@ -1,253 +0,0 @@ -package com.magmaguy.elitemobs.items; - -import com.magmaguy.elitemobs.items.itemconstructor.LoreGenerator; -import com.magmaguy.elitemobs.mobconstructor.CombatSystem; -import org.bukkit.Material; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class ItemTierFinder { - - public static double findPlayerTier(Player player) { - - return (4 * findArmorSetTier(player) + findWeaponTier(player)) / 5; - - } - - public static double findArmorSetTier(Player player) { - - double totalArmorThreat = 0; - - if (player.getEquipment().getHelmet() != null) { - - ItemStack helmet = player.getEquipment().getHelmet(); - - totalArmorThreat += findBattleTier(helmet); - - } - - if (player.getEquipment().getChestplate() != null) { - - ItemStack chestplate = player.getEquipment().getChestplate(); - - totalArmorThreat += findBattleTier(chestplate); - - } - - if (player.getEquipment().getLeggings() != null) { - - ItemStack leggings = player.getEquipment().getLeggings(); - - totalArmorThreat += findBattleTier(leggings); - - } - - if (player.getEquipment().getBoots() != null) { - - ItemStack boots = player.getEquipment().getBoots(); - - totalArmorThreat += findBattleTier(boots); - - } - - double averageArmorThreat = totalArmorThreat / 4; - - return averageArmorThreat; - - } - - public static double findWeaponTier(Player player) { - - List itemList = new ArrayList<>(); - - if (player.getInventory().getItemInOffHand() != null && !player.getInventory().getItemInOffHand().getType().equals(Material.AIR)) { - - itemList.add(player.getInventory().getItemInOffHand()); - - } - - for (int i = 0; i < 9; i++) { - - if (player.getInventory().getItem(i) != null && !player.getInventory().getItem(i).getType().equals(Material.AIR)) { - - Material material = player.getInventory().getItem(i).getType(); - - if (material.equals(Material.DIAMOND_SWORD) || material.equals(Material.DIAMOND_AXE) || - material.equals(Material.IRON_SWORD) || material.equals(Material.IRON_AXE) || - material.equals(Material.STONE_SWORD) || material.equals(Material.STONE_AXE) || - material.equals(Material.GOLD_SWORD) || material.equals(Material.GOLD_AXE) || - material.equals(Material.WOOD_SWORD) || material.equals(Material.WOOD_AXE) || - material.equals(Material.BOW)) { - - itemList.add(player.getInventory().getItem(i)); - - } - - } - - } - - double highestTier = 0; - - if (itemList.size() > 0) { - - for (ItemStack itemStack : itemList) { - - double currentTier = findBattleTier(itemStack); - - if (currentTier > highestTier) { - - highestTier = currentTier; - - } - - } - - } - - return highestTier; - - } - - private static final double IRON_TIER = CombatSystem.IRON_TIER_LEVEL; - private static final double STONE_CHAIN_TIER = CombatSystem.IRON_TIER_LEVEL; - private static final double GOLD_WOOD_LEATHER_TIER = CombatSystem.GOLD_WOOD_LEATHER_TIER_LEVEL; - private static final double DIAMOND_TIER = CombatSystem.DIAMOND_TIER_LEVEL; - - public static double findGenericTier(Material material, HashMap enchantmentList) { - - double tier = 0; - - switch (material) { - case DIAMOND_PICKAXE: - case DIAMOND_SPADE: - return DIAMOND_TIER + findMainEnchantment(enchantmentList, Enchantment.DIG_SPEED); - case STONE_PICKAXE: - case STONE_SPADE: - return STONE_CHAIN_TIER + findMainEnchantment(enchantmentList, Enchantment.DIG_SPEED); - case IRON_PICKAXE: - case IRON_SPADE: - return IRON_TIER + findMainEnchantment(enchantmentList, Enchantment.DIG_SPEED); - case GOLD_PICKAXE: - case GOLD_SPADE: - case WOOD_PICKAXE: - case WOOD_SPADE: - return GOLD_WOOD_LEATHER_TIER + findMainEnchantment(enchantmentList, Enchantment.DIG_SPEED); - } - - if (tier == 0) - tier = findBattleTier(material, enchantmentList); - - return tier; - - } - - public static double findBattleTier(Material material, HashMap enchantmentList) { - - return parseMaterials(material, findMainEnchantment(enchantmentList, Enchantment.DAMAGE_ALL), findMainEnchantment(enchantmentList, Enchantment.PROTECTION_ENVIRONMENTAL), findMainEnchantment(enchantmentList, Enchantment.ARROW_DAMAGE)); - - } - - public static double findBattleTier(ItemStack itemStack) { - - Material material = itemStack.getType(); - - return parseMaterials(material, findMainEnchantment(itemStack, Enchantment.DAMAGE_ALL), findMainEnchantment(itemStack, Enchantment.PROTECTION_ENVIRONMENTAL), findMainEnchantment(itemStack, Enchantment.ARROW_DAMAGE)); - - } - - private static double parseMaterials(Material material, int mainEnchantment, int mainEnchantment2, int mainEnchantment3) { - switch (material) { - case DIAMOND_SWORD: - case DIAMOND_AXE: - return DIAMOND_TIER + mainEnchantment; - case DIAMOND_BOOTS: - case DIAMOND_CHESTPLATE: - case DIAMOND_HELMET: - case DIAMOND_LEGGINGS: - return DIAMOND_TIER + mainEnchantment2; - case IRON_AXE: - case IRON_SWORD: - return IRON_TIER + mainEnchantment; - case IRON_BOOTS: - case IRON_CHESTPLATE: - case IRON_HELMET: - case IRON_LEGGINGS: - return IRON_TIER + mainEnchantment2; - case SHIELD: - return IRON_TIER + mainEnchantment2; - case CHAINMAIL_BOOTS: - case CHAINMAIL_CHESTPLATE: - case CHAINMAIL_HELMET: - case CHAINMAIL_LEGGINGS: - return STONE_CHAIN_TIER + mainEnchantment2; - case STONE_SWORD: - return STONE_CHAIN_TIER + mainEnchantment; - case GOLD_BOOTS: - case GOLD_CHESTPLATE: - case GOLD_HELMET: - case GOLD_LEGGINGS: - case LEATHER_BOOTS: - case LEATHER_CHESTPLATE: - case LEATHER_HELMET: - case LEATHER_LEGGINGS: - return GOLD_WOOD_LEATHER_TIER + mainEnchantment2; - case WOOD_SWORD: - case WOOD_AXE: - case GOLD_SWORD: - case GOLD_AXE: - return GOLD_WOOD_LEATHER_TIER + mainEnchantment; - case BOW: - return IRON_TIER + mainEnchantment3; - default: - return 0; - } - } - - private static int findMainEnchantment(HashMap enchantmentMap, Enchantment enchantment) { - - int enchantments = 0; - - if (!enchantmentMap.isEmpty()) - for (Enchantment currentEnchantment : enchantmentMap.keySet()) - if (currentEnchantment.equals(enchantment)) - enchantments += enchantmentMap.get(currentEnchantment); - - return enchantments; - - } - - private static int findMainEnchantment(ItemStack itemStack, Enchantment enchantment) { - - int enchantments = 0; - - if (ObfuscatedSignatureLoreData.obfuscatedSignatureDetector(itemStack)) { - String deobfuscatedString = itemStack.getItemMeta().getLore().get(0).replace("§", ""); - if (deobfuscatedString.contains(LoreGenerator.OBFUSCATED_ENCHANTMENTS)) - return findObfuscatedMainEnchantment(deobfuscatedString, enchantment); - } - - if (!itemStack.getEnchantments().isEmpty()) - for (Map.Entry entry : itemStack.getEnchantments().entrySet()) - if (entry.getKey().equals(enchantment)) - enchantments += entry.getValue(); - - return enchantments; - - } - - private static int findObfuscatedMainEnchantment(String deobfuscatedLore, Enchantment enchantment) { - for (String string : deobfuscatedLore.split(",")) - if (string.contains(enchantment.getName())) - return Integer.parseInt(string.split(":")[1]); - - return 0; - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/ItemWorthCalculator.java b/src/main/java/com/magmaguy/elitemobs/items/ItemWorthCalculator.java index 62113c9c1..842bdd18a 100644 --- a/src/main/java/com/magmaguy/elitemobs/items/ItemWorthCalculator.java +++ b/src/main/java/com/magmaguy/elitemobs/items/ItemWorthCalculator.java @@ -1,411 +1,81 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package com.magmaguy.elitemobs.items; -import com.magmaguy.elitemobs.config.ConfigValues; +import com.magmaguy.elitemobs.adventurersguild.GuildRank; import com.magmaguy.elitemobs.config.EconomySettingsConfig; -import com.magmaguy.elitemobs.items.itemconstructor.LoreGenerator; +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfig; +import com.magmaguy.elitemobs.items.customenchantments.CustomEnchantment; +import com.magmaguy.elitemobs.items.potioneffects.ElitePotionEffect; +import com.magmaguy.elitemobs.items.potioneffects.ElitePotionEffectContainer; +import com.magmaguy.magmacore.util.Round; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static com.magmaguy.elitemobs.config.EconomySettingsConfig.*; +import org.bukkit.inventory.meta.ItemMeta; public class ItemWorthCalculator { - public static double determineItemWorth(ItemStack itemStack) { - - double itemWorth = 1 + Math.round((itemTypeWorth(itemStack.getType()) + getAllEnchantmentsValue(itemStack) + potionEffectValue(itemStack)) * 100.0) / 100.0; - - return itemWorth; - - } - - public static double determineItemWorth(Material material, HashMap enchantmentsMap) { - - double itemWorth = 1 + Math.round((itemTypeWorth(material) + getAllEnchantmentsValue(enchantmentsMap)) * 100.0) / 100.0; - - return itemWorth; - - } - - public static double determineItemWorth(Material material, HashMap enchantmentsMap, List potionsMap) { - - double itemWorth = 1 + Math.round((itemTypeWorth(material) + getAllEnchantmentsValue(enchantmentsMap) + potionEffectValue(potionsMap)) * 100.0) / 100.0; - - return itemWorth; - - } - - public static double determineResaleWorth(ItemStack itemStack) { - - double resaleWorth = Math.round((determineItemWorth(itemStack) * (ConfigValues.economyConfig.getDouble(EconomySettingsConfig.RESALE_VALUE) / 100)) * 100.0) / 100.0; + public static double determineItemWorth(ItemStack itemStack, Player player) { - return resaleWorth; + if (itemStack == null || itemStack.getItemMeta() == null || itemStack.getType().equals(Material.AIR)) return 0; - } + //Check if value's already been written into the item. If it hasn't, the value will be -1 + // double value = ItemTagger.getItemValue(itemStack); + // if (value != -1) return value; - private static double configGetter(String string) { + double prestigeMultiplier; + if (player == null) + prestigeMultiplier = 1; + else + prestigeMultiplier = GuildRank.currencyBonusMultiplier(GuildRank.getGuildPrestigeRank(player)); - return ConfigValues.economyConfig.getDouble(string); + return 1 + Round.twoDecimalPlaces( + (EconomySettingsConfig.getMaterialWorth(itemStack.getType()) + + getAllEnchantmentValues(itemStack) + + getAllPotionEffectValues(itemStack.getItemMeta())) * + prestigeMultiplier); } - public static double itemTypeWorth(Material material) { - - switch (material) { - - case DIAMOND_AXE: - return configGetter(DIAMOND_AXE); - case DIAMOND_BARDING: - return configGetter(DIAMOND_BARDING); - case DIAMOND_BLOCK: - return configGetter(DIAMOND_BLOCK); - case DIAMOND_BOOTS: - return configGetter(DIAMOND_BOOTS); - case DIAMOND_CHESTPLATE: - return configGetter(DIAMOND_CHESTPLATE); - case DIAMOND_HELMET: - return configGetter(DIAMOND_HELMET); - case DIAMOND_HOE: - return configGetter(DIAMOND_HOE); - case DIAMOND_LEGGINGS: - return configGetter(DIAMOND_LEGGINGS); - case DIAMOND_ORE: - return configGetter(DIAMOND_ORE); - case DIAMOND_PICKAXE: - return configGetter(DIAMOND_PICKAXE); - case DIAMOND_SPADE: - return configGetter(DIAMOND_SPADE); - case DIAMOND_SWORD: - return configGetter(DIAMOND_SWORD); - case IRON_AXE: - return configGetter(IRON_AXE); - case IRON_BARDING: - return configGetter(IRON_BARDING); - case IRON_BLOCK: - return configGetter(IRON_BLOCK); - case IRON_BOOTS: - return configGetter(IRON_BOOTS); - case IRON_CHESTPLATE: - return configGetter(IRON_CHESTPLATE); - case IRON_HELMET: - return configGetter(IRON_HELMET); - case IRON_HOE: - return configGetter(IRON_HOE); - case IRON_INGOT: - return configGetter(IRON_INGOT); - case IRON_LEGGINGS: - return configGetter(IRON_LEGGINGS); - case IRON_NUGGET: - return configGetter(IRON_NUGGET); - case IRON_ORE: - return configGetter(IRON_ORE); - case IRON_PICKAXE: - return configGetter(IRON_PICKAXE); - case IRON_SPADE: - return configGetter(IRON_SPADE); - case IRON_SWORD: - return configGetter(IRON_SWORD); - case BOW: - return configGetter(BOW); - case SHIELD: - return configGetter(SHIELD); - case CHAINMAIL_BOOTS: - return configGetter(CHAINMAIL_BOOTS); - case CHAINMAIL_CHESTPLATE: - return configGetter(CHAINMAIL_CHESTPLATE); - case CHAINMAIL_HELMET: - return configGetter(CHAINMAIL_HELMET); - case CHAINMAIL_LEGGINGS: - return configGetter(CHAINMAIL_LEGGINGS); - case STONE_SWORD: - return configGetter(STONE_SWORD); - case STONE_SPADE: - return configGetter(STONE_SPADE); - case STONE_AXE: - return configGetter(STONE_AXE); - case STONE_PICKAXE: - return configGetter(STONE_PICKAXE); - case GOLD_AXE: - return configGetter(GOLD_AXE); - case GOLD_BARDING: - return configGetter(GOLD_BARDING); - case GOLD_BLOCK: - return configGetter(GOLD_BLOCK); - case GOLD_BOOTS: - return configGetter(GOLD_BOOTS); - case GOLD_CHESTPLATE: - return configGetter(GOLD_CHESTPLATE); - case GOLD_HELMET: - return configGetter(GOLD_HELMET); - case GOLD_HOE: - return configGetter(GOLD_HOE); - case GOLD_INGOT: - return configGetter(GOLD_INGOT); - case GOLD_LEGGINGS: - return configGetter(GOLD_LEGGINGS); - case GOLD_NUGGET: - return configGetter(GOLD_NUGGET); - case GOLD_ORE: - return configGetter(GOLD_ORE); - case GOLD_PICKAXE: - return configGetter(GOLD_PICKAXE); - case GOLD_SPADE: - return configGetter(GOLD_SPADE); - case GOLD_SWORD: - return configGetter(GOLD_SWORD); - case GOLDEN_APPLE: - return configGetter(GOLDEN_APPLE); - case GOLDEN_CARROT: - return configGetter(GOLDEN_CARROT); - case LEATHER_BOOTS: - return configGetter(LEATHER_BOOTS); - case LEATHER_CHESTPLATE: - return configGetter(LEATHER_CHESTPLATE); - case LEATHER_HELMET: - return configGetter(LEATHER_HELMET); - case LEATHER_LEGGINGS: - return configGetter(LEATHER_LEGGINGS); - case WOOD_SWORD: - return configGetter(WOOD_SWORD); - case WOOD_AXE: - return configGetter(WOOD_AXE); - case WOOD_PICKAXE: - return configGetter(WOOD_PICKAXE); - case WOOD_HOE: - return configGetter(WOOD_HOE); - default: - return configGetter(OTHER); - - } - + public static double writeItemWorth(ItemStack itemStack, Player player) { + return determineItemWorth(itemStack, player); } - private static double getAllEnchantmentsValue(ItemStack itemStack) { - - double enchantmentsValue = 0; - - if (!itemStack.getEnchantments().isEmpty()) { - - for (Map.Entry entry : itemStack.getEnchantments().entrySet()) { - - enchantmentsValue += enchantmentWorthGetter(entry.getKey()) * entry.getValue(); - - } - - } - - return enchantmentsValue; - + public static double determineResaleWorth(ItemStack itemStack, Player player) { + double value = ItemTagger.getItemValue(itemStack); + value = value == -1 ? Round.twoDecimalPlaces(determineItemWorth(itemStack, player) * (EconomySettingsConfig.getResaleValue() / 100)) : + Round.twoDecimalPlaces(value * (EconomySettingsConfig.getResaleValue() / 100)); + return value; } - private static double getAllEnchantmentsValue(HashMap enchantmentsMap) { - - double enchantmentsValue = 0; - - if (!enchantmentsMap.isEmpty()) { - - for (Enchantment enchantment : enchantmentsMap.keySet()) { - - enchantmentsValue += enchantmentWorthGetter(enchantment) * enchantmentsMap.get(enchantment); - - } - + private static double getAllEnchantmentValues(ItemStack itemStack) { + double value = 0; + for (Enchantment enchantment : itemStack.getEnchantments().keySet()) { + if (EliteEnchantments.isPotentialEliteEnchantment(enchantment)) { + if (ItemTagger.getEnchantment(itemStack.getItemMeta(), enchantment.getKey()) != 0) { + value += EnchantmentsConfig.getEnchantment(enchantment).getValue() * ItemTagger.getEnchantment(itemStack.getItemMeta(), enchantment.getKey()); + continue; + } + } else + value += EnchantmentsConfig.getEnchantment(enchantment).getValue() * itemStack.getEnchantments().get(enchantment); } - - return enchantmentsValue; - - } - - public static double enchantmentWorthGetter(Enchantment enchantment) { - - if (enchantment == null) return 0; - - String enchantmentName = enchantment.getName(); - - switch (enchantmentName) { - - case "ARROW_DAMAGE": - return configGetter(ARROW_DAMAGE); - case "ARROW_FIRE": - return configGetter(ARROW_FIRE); - case "ARROW_INFINITE": - return configGetter(ARROW_INFINITE); - case "ARROW_KNOCKBACK": - return configGetter(ARROW_KNOCKBACK); - case "BINDING_CURSE": - return configGetter(BINDING_CURSE); - case "DAMAGE_ALL": - return configGetter(DAMAGE_ALL); - case "DAMAGE_ARTHROPODS": - return configGetter(DAMAGE_ARTHROPODS); - case "DAMAGE_UNDEAD": - return configGetter(DAMAGE_UNDEAD); - case "DEPTH_STRIDER": - return configGetter(DEPTH_STRIDER); - case "DIG_SPEED": - return configGetter(DIG_SPEED); - case "DURABILITY": - return configGetter(DURABILITY); - case "FIRE_ASPECT": - return configGetter(FIRE_ASPECT); - case "FROST_WALKER": - return configGetter(FROST_WALKER); - case "KNOCKBACK": - return configGetter(KNOCKBACK); - case "LOOT_BONUS_BLOCKS": - return configGetter(LOOT_BONUS_BLOCKS); - case "LOOT_BONUS_MOBS": - return configGetter(LOOT_BONUS_MOBS); - case "LUCK": - return configGetter(LUCK_ENCHANTMENT); - case "LURE": - return configGetter(LURE); - case "MENDING": - return configGetter(MENDING); - case "OXYGEN": - return configGetter(OXYGEN); - case "PROTECTION_ENVIRONMENTAL": - return configGetter(PROTECTION_ENVIRONMENTAL); - case "PROTECTION_EXPLOSIONS": - return configGetter(PROTECTION_EXPLOSIONS); - case "PROTECTION_FALL": - return configGetter(PROTECTION_FALL); - case "PROTECTION_PROJECTILE": - return configGetter(PROTECTION_PROJECTILE); - case "PROTECTION_FIRE": - return configGetter(PROTECTION_FIRE); - case "SILK_TOUCH": - return configGetter(SILK_TOUCH); - case "SWEEPING_EDGE": - return configGetter(SWEEPING_EDGE); - case "THORNS": - return configGetter(THORNS); - case "VANISHING_CURSE": - return configGetter(VANISHING_CURSE); - case "WATER_WORKER": - return configGetter(WATER_WORKER); - default: - return 0; + for (CustomEnchantment customEnchantment : CustomEnchantment.getCustomEnchantmentMap().values()) { + int enchantmentLevel = ItemTagger.getEnchantment(itemStack.getItemMeta(), customEnchantment.key); + if (enchantmentLevel > 0) + value += customEnchantment.getEnchantmentsConfigFields().getValue() * ItemTagger.getEnchantment(itemStack.getItemMeta(), customEnchantment.key); } - + return value; } - private static double potionEffectValue(ItemStack itemStack) { - - double potionEffectValue = 0; - if (!itemStack.hasItemMeta() && itemStack.getItemMeta().hasLore()) return potionEffectValue; - - String potionEffectLoreLine = itemStack.getItemMeta().getLore().get(0).replace("§", ""); - if (!potionEffectLoreLine.contains(LoreGenerator.OBFUSCATED_POTIONS)) return potionEffectValue; - - for (String substring : potionEffectLoreLine.split(",")) { - - List parsedSubstring = Arrays.asList(substring.split(":")); - if (parsedSubstring.size() > 1) { - potionEffectValue += getPotionEffectValue(parsedSubstring.get(0)) * (Integer.valueOf(parsedSubstring.get(1)) + 1); - } - + private static double getAllPotionEffectValues(ItemMeta itemMeta) { + double value = 0; + for (ElitePotionEffect elitePotionEffect : ElitePotionEffectContainer.getElitePotionEffectContainer(itemMeta, ItemTagger.continuousPotionEffectKey)) { + value += (elitePotionEffect.getValue() * (elitePotionEffect.getPotionEffect().getAmplifier() + 1)); } - - return potionEffectValue; - - } - - private static double potionEffectValue(List potionString) { - - double potionEffectValue = 0; - - if (potionString == null || potionString.isEmpty()) return potionEffectValue; - - for (String string : potionString) - potionEffectValue += getPotionEffectValue(string.split(",")[0]) * (Integer.parseInt(string.split(",")[1]) + 1); - - return potionEffectValue; - - } - - private static double getPotionEffectValue(String string) { - - switch (string) { - - case "ABSORPTION": - return configGetter(ABSORPTION); - case "BLINDNESS": - return configGetter(BLINDNESS); - case "CONFUSION": - return configGetter(CONFUSION); - case "DAMAGE_RESISTANCE": - return configGetter(DAMAGE_RESISTANCE); - case "FAST_DIGGING": - return configGetter(FAST_DIGGING); - case "FIRE_RESISTANCE": - return configGetter(FIRE_RESISTANCE); - case "GLOWING": - return configGetter(GLOWING); - case "HARM": - return configGetter(HARM); - case "HEAL": - return configGetter(HEAL); - case "HEALTH_BOOST": - return configGetter(HEALTH_BOOST); - case "HUNGER": - return configGetter(HUNGER); - case "INCREASE_DAMAGE": - return configGetter(INCREASE_DAMAGE); - case "INVISIBILITY": - return configGetter(INVISIBILITY); - case "JUMP": - return configGetter(JUMP); - case "LEVITATION": - return configGetter(LEVITATION); - case "LUCK": - return configGetter(LUCK_POTION); - case "NIGHT_VISION": - return configGetter(NIGHT_VISION); - case "POISON": - return configGetter(POISON); - case "REGENERATION": - return configGetter(REGENERATION); - case "SATURATION": - return configGetter(SATURATION); - case "SLOW": - return configGetter(SLOW); - case "SLOW_DIGGING": - return configGetter(SLOW_DIGGING); - case "SPEED": - return configGetter(SPEED); - case "UNLUCK": - return configGetter(UNLUCK); - case "WATER_BREATHING": - return configGetter(WATER_BREATHING); - case "WEAKNESS": - return configGetter(WEAKNESS); - case "WITHER": - return configGetter(WITHER); - default: - return 0; + for (ElitePotionEffect elitePotionEffect : ElitePotionEffectContainer.getElitePotionEffectContainer(itemMeta, ItemTagger.onHitPotionEffectKey)) { + value += (elitePotionEffect.getValue() * (elitePotionEffect.getPotionEffect().getAmplifier() + 1)); } - + return value; } } diff --git a/src/main/java/com/magmaguy/elitemobs/items/LootTables.java b/src/main/java/com/magmaguy/elitemobs/items/LootTables.java index 10c6b0468..6fcc717f7 100644 --- a/src/main/java/com/magmaguy/elitemobs/items/LootTables.java +++ b/src/main/java/com/magmaguy/elitemobs/items/LootTables.java @@ -1,139 +1,235 @@ package com.magmaguy.elitemobs.items; -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.ItemsDropSettingsConfig; -import com.magmaguy.elitemobs.config.ItemsProceduralSettingsConfig; +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.adventurersguild.GuildRank; +import com.magmaguy.elitemobs.api.EliteMobDeathEvent; +import com.magmaguy.elitemobs.config.AdventurersGuildConfig; +import com.magmaguy.elitemobs.config.ItemSettingsConfig; +import com.magmaguy.elitemobs.config.ProceduralItemGenerationSettingsConfig; +import com.magmaguy.elitemobs.config.SpecialItemSystemsConfig; +import com.magmaguy.elitemobs.items.customenchantments.SoulbindEnchantment; +import com.magmaguy.elitemobs.items.customitems.CustomItem; import com.magmaguy.elitemobs.items.itemconstructor.ItemConstructor; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.RegionalBossEntity; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.utils.WeightedProbability; +import com.magmaguy.magmacore.util.Logger; +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.Location; import org.bukkit.entity.Item; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; import java.util.HashMap; import java.util.concurrent.ThreadLocalRandom; -import static com.magmaguy.elitemobs.utils.WeightedProbablity.pickWeighedProbability; +import static com.magmaguy.elitemobs.utils.WeightedProbability.pickWeighedProbability; /** * Created by MagmaGuy on 04/06/2017. */ public class LootTables implements Listener { - @EventHandler(priority = EventPriority.LOWEST) - public void onDeath(EntityDeathEvent event) { - - if (event.getEntity() == null) return; - - EliteMobEntity eliteMobEntity = EntityTracker.getEliteMobEntity(event.getEntity()); - if (eliteMobEntity == null) return; + private static boolean proceduralItemsOn; + private static boolean customItemsOn; + private static boolean weighedItemsExist; + private static boolean fixedItemsExist; + private static boolean limitedItemsExist; + private static boolean scalableItemsExist; + + public static void generatePlayerLoot(EliteEntity eliteEntity) { + if (eliteEntity.isTriggeredAntiExploit()) return; + for (Player player : eliteEntity.getDamagers().keySet()) { + + if (player.hasMetadata("NPC") || !PlayerData.isInMemory(player.getUniqueId())) continue; + + if (eliteEntity.getDamagers().get(player) / eliteEntity.getMaxHealth() < 0.1) continue; + + if (!eliteEntity.isEliteLoot()) continue; + + double itemLevel = setItemTier(eliteEntity.getLevel()); + double eliteLevel = eliteEntity.getLevel(); + if (AdventurersGuildConfig.isGuildLootLimiter()) { + if (itemLevel > GuildRank.getActiveGuildRank(player) * 10) { + itemLevel = GuildRank.getActiveGuildRank(player) * 10D; + new BukkitRunnable() { + @Override + public void run() { + player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(AdventurersGuildConfig.getLootLimiterMessage())); + } + }.runTaskLater(MetadataHandler.PLUGIN, 20 * 10L); + } + } - if (!eliteMobEntity.isNaturalEntity()) return; - if (!eliteMobEntity.getHasNormalLoot()) return; + if (eliteEntity.getPower("bonus_coins.yml") == null) + new ItemLootShower(itemLevel, eliteLevel, eliteEntity.getUnsyncedLivingEntity().getLocation(), player); - if (eliteMobEntity.getLevel() < 2) return; + if (!(eliteEntity.isRandomLoot())) continue; - Item item = generateLoot(eliteMobEntity); + if (AdventurersGuildConfig.isGuildLootLimiter()) + generateLoot((int) Math.floor(itemLevel), eliteEntity, player); + else + generateLoot(eliteEntity, player); - if (item == null) return; + if (SpecialItemSystemsConfig.isDropSpecialLoot()) { + if (eliteEntity instanceof CustomBossEntity customBossEntity && + customBossEntity.getCustomBossesConfigFields().getHealthMultiplier() > 1.0 && + ThreadLocalRandom.current().nextDouble() < SpecialItemSystemsConfig.getBossChanceToDrop()) + generateSpecialLoot(player, 0, eliteEntity); + else if (eliteEntity instanceof CustomBossEntity && + ThreadLocalRandom.current().nextDouble() < SpecialItemSystemsConfig.getNonEliteChanceToDrop()) + generateSpecialLoot(player, 0, eliteEntity); + } + } + } - RareDropEffect.runEffect(item); + public static void initialize() { + proceduralItemsOn = ProceduralItemGenerationSettingsConfig.isDoProceduralItemDrops(); + customItemsOn = ItemSettingsConfig.isDoEliteMobsLoot() && !CustomItem.getCustomItemStackList().isEmpty(); + weighedItemsExist = CustomItem.getWeighedFixedItems() != null && !CustomItem.getWeighedFixedItems().isEmpty(); + fixedItemsExist = CustomItem.getFixedItems() != null && !CustomItem.getFixedItems().isEmpty(); + limitedItemsExist = CustomItem.getLimitedItems() != null && !CustomItem.getLimitedItems().isEmpty(); + scalableItemsExist = CustomItem.getScalableItems() != null && !CustomItem.getScalableItems().isEmpty(); } - private static boolean proceduralItemsOn = ConfigValues.itemsProceduralSettingsConfig.getBoolean(ItemsProceduralSettingsConfig.DROP_ITEMS_ON_DEATH); - private static boolean customItemsOn = ConfigValues.itemsDropSettingsConfig.getBoolean(ItemsDropSettingsConfig.DROP_CUSTOM_ITEMS) && - !CustomItemConstructor.customItemList.isEmpty(); - private static boolean staticWeightCustomItemsExist = CustomItemConstructor.staticCustomItemHashMap.size() > 0; - private static boolean dynamicWeightCustomItemsExist = CustomItemConstructor.dynamicRankedItemStacks.size() > 0; - - public static Item generateLoot(EliteMobEntity eliteMobEntity) { + private static ItemStack generateLoot(EliteEntity eliteEntity, Player player) { + int mobTier = (int) MobTierCalculator.findMobTier(eliteEntity); - int mobTier = (int) MobTierFinder.findMobTier(eliteMobEntity); /* Add some wiggle room to avoid making obtaining loot too linear */ int itemTier = (int) setItemTier(mobTier); - /* - Handle the odds of an item dropping - */ - double baseChance = ConfigValues.itemsDropSettingsConfig.getDouble(ItemsDropSettingsConfig.ELITE_ITEM_FLAT_DROP_RATE) / 100; - double dropChanceBonus = ConfigValues.itemsDropSettingsConfig.getDouble(ItemsDropSettingsConfig.ELITE_ITEM_TIER_DROP_RATE) / 100 * itemTier; + return generateLoot(itemTier, eliteEntity, player); - if (ThreadLocalRandom.current().nextDouble() > baseChance + dropChanceBonus) - return null; + } - /* - First split: Check if the loot should be procedural or based on unique/custom items - This makes more sense because the ratio between custom/unique items and procedural items is quite drastic - */ - if (!proceduralItemsOn && !customItemsOn) return null; - if (proceduralItemsOn && customItemsOn) { + public static ItemStack generateLoot(int itemTier, EliteEntity eliteEntity, Player player) { - HashMap weightedConfigValues = new HashMap<>(); - weightedConfigValues.put(ItemsDropSettingsConfig.PROCEDURAL_ITEM_WEIGHT, ConfigValues.itemsDropSettingsConfig.getDouble(ItemsDropSettingsConfig.PROCEDURAL_ITEM_WEIGHT)); - weightedConfigValues.put(ItemsDropSettingsConfig.CUSTOM_ITEM_WEIGHT, ConfigValues.itemsDropSettingsConfig.getDouble(ItemsDropSettingsConfig.CUSTOM_ITEM_WEIGHT)); + /* + Handle the odds of an item dropping + */ + double baseChance = ItemSettingsConfig.getFlatDropRate(); + if (eliteEntity instanceof RegionalBossEntity) + baseChance = ItemSettingsConfig.getRegionalBossNonUniqueDropRate(); + double dropChanceBonus = ItemSettingsConfig.getLevelIncreaseDropRate() * itemTier; - String selectedLootSystem = pickWeighedProbability(weightedConfigValues); + if (ThreadLocalRandom.current().nextDouble() > baseChance + dropChanceBonus) return null; - if (selectedLootSystem.equals(ItemsDropSettingsConfig.PROCEDURAL_ITEM_WEIGHT)) - return dropProcedurallyGeneratedItem(itemTier, eliteMobEntity); + HashMap weightedProbability = new HashMap<>(); + if (proceduralItemsOn) weightedProbability.put("procedural", ItemSettingsConfig.getProceduralItemWeight()); + if (customItemsOn) { + if (weighedItemsExist) weightedProbability.put("weighed", ItemSettingsConfig.getWeighedItemWeight()); + if (fixedItemsExist) if (CustomItem.getFixedItems().containsKey(itemTier)) + weightedProbability.put("fixed", ItemSettingsConfig.getFixedItemWeight()); + if (limitedItemsExist) weightedProbability.put("limited", ItemSettingsConfig.getLimitedItemWeight()); + if (scalableItemsExist) weightedProbability.put("scalable", ItemSettingsConfig.getScalableItemWeight()); + } + String selectedLootSystem = pickWeighedProbability(weightedProbability); + if (selectedLootSystem == null) { + Logger.info("Your EliteMobs loot configuration resulted in no loot getting dropped. This is not a bug. " + "If you want! players to be able to progress at all in the EliteMobs plugin, review your configuration settings."); + return null; } + switch (selectedLootSystem) { + case "procedural": + return dropProcedurallyGeneratedItem(itemTier, eliteEntity, player); + case "weighed": + return dropWeighedFixedItem(eliteEntity, player); + case "fixed": + return dropFixedItem(eliteEntity, itemTier, player); + case "limited": + return dropLimitedItem(eliteEntity, itemTier, player); + case "scalable": + return dropScalableItem(eliteEntity, itemTier, player); + } - if (proceduralItemsOn && !customItemsOn) - return dropProcedurallyGeneratedItem(itemTier, eliteMobEntity); + return null; + } + /** + * Used for "fake" drops. Currently this means it's used by the SimLootHandler, reason will default to shop. + * + * @param itemLevel + * @param location + * @param player + * @return + */ + public static ItemStack generateLoot(int itemLevel, Location location, Player player) { - /* - First split is done, moving on to second split - Split between static and dynamic weight loot + /* + Handle the odds of an item dropping */ - if (staticWeightCustomItemsExist && dynamicWeightCustomItemsExist) { - - HashMap weightedConfigValues = new HashMap<>(); - weightedConfigValues.put(ItemsDropSettingsConfig.CUSTOM_DYNAMIC_ITEM_WEIGHT, ConfigValues.itemsDropSettingsConfig.getDouble(ItemsDropSettingsConfig.CUSTOM_DYNAMIC_ITEM_WEIGHT)); - weightedConfigValues.put(ItemsDropSettingsConfig.CUSTOM_STATIC_ITEM_WEIGHT, ConfigValues.itemsDropSettingsConfig.getDouble(ItemsDropSettingsConfig.CUSTOM_STATIC_ITEM_WEIGHT)); + double baseChance = ItemSettingsConfig.getFlatDropRate(); + double dropChanceBonus = ItemSettingsConfig.getLevelIncreaseDropRate() * itemLevel; - String selectedLootSystem = pickWeighedProbability(weightedConfigValues); + if (ThreadLocalRandom.current().nextDouble() > baseChance + dropChanceBonus) return null; - if (selectedLootSystem.equals(ItemsDropSettingsConfig.CUSTOM_STATIC_ITEM_WEIGHT)) { - return dropCustomStaticLoot(eliteMobEntity.getLivingEntity().getLocation()); + HashMap weightedProbability = new HashMap<>(); + if (proceduralItemsOn) weightedProbability.put("procedural", ItemSettingsConfig.getProceduralItemWeight()); + if (customItemsOn) { + if (weighedItemsExist) weightedProbability.put("weighed", ItemSettingsConfig.getWeighedItemWeight()); + if (fixedItemsExist) if (CustomItem.getFixedItems().containsKey(itemLevel)) + weightedProbability.put("fixed", ItemSettingsConfig.getFixedItemWeight()); + if (limitedItemsExist) weightedProbability.put("limited", ItemSettingsConfig.getLimitedItemWeight()); + if (scalableItemsExist) weightedProbability.put("scalable", ItemSettingsConfig.getScalableItemWeight()); + } - } + String selectedLootSystem = pickWeighedProbability(weightedProbability); + switch (selectedLootSystem) { + case "procedural": + return dropProcedurallyGeneratedItem(itemLevel, location, player); + case "weighed": + return dropWeighedFixedItem(location, player); + case "fixed": + return dropFixedItem(location, itemLevel, player); + case "limited": + return dropLimitedItem(location, itemLevel, player); + case "scalable": + return dropScalableItem(location, itemLevel, player); } - /* - Second split is done, moving on to third split - At this point only scalability type is left, can be either static, limited or dynamic - */ + return null; + + } + + public static ItemStack generateItemStack(int itemTier, Player player, EliteEntity eliteEntity) { + HashMap weightedProbability = new HashMap<>(); - if (ScalableItemConstructor.dynamicallyScalableItems.size() > 0) - weightedProbability.put("dynamic", 33.0); - if (ScalableItemConstructor.limitedScalableItems.size() > 0) - weightedProbability.put("limited", 33.0); - if (ScalableItemConstructor.staticItems.size() > 0) - weightedProbability.put("static", 33.0); + if (proceduralItemsOn) weightedProbability.put("procedural", ItemSettingsConfig.getProceduralItemWeight()); + if (customItemsOn) { + if (weighedItemsExist) weightedProbability.put("weighed", ItemSettingsConfig.getWeighedItemWeight()); + if (fixedItemsExist) if (CustomItem.getFixedItems().containsKey(itemTier)) + weightedProbability.put("fixed", ItemSettingsConfig.getFixedItemWeight()); + if (limitedItemsExist) weightedProbability.put("limited", ItemSettingsConfig.getLimitedItemWeight()); + if (scalableItemsExist) weightedProbability.put("scalable", ItemSettingsConfig.getScalableItemWeight()); + } String selectedLootSystem = pickWeighedProbability(weightedProbability); switch (selectedLootSystem) { - case "dynamic": - return dropDynamicallyScalingItem(eliteMobEntity, itemTier); + case "procedural": + return generateProcedurallyGeneratedItem(itemTier, player, eliteEntity); + case "weighed": + return generateWeighedFixedItemStack(player); + case "fixed": + return generateFixedItem(itemTier, player, eliteEntity); case "limited": - return dropLimitedScalingItem(eliteMobEntity, itemTier); - case "static": - return dropStaticScalingItem(eliteMobEntity, itemTier); + return generateLimitedItem(itemTier, player, eliteEntity); + case "scalable": + return generateScalableItem(itemTier, player, eliteEntity); } return null; @@ -142,10 +238,9 @@ public static Item generateLoot(EliteMobEntity eliteMobEntity) { public static double setItemTier(int mobTier) { - double chanceToUpgradeTier = 10 / (double) mobTier * ConfigValues.itemsDropSettingsConfig.getDouble(ItemsDropSettingsConfig.MAXIMUM_LOOT_TIER); + double chanceToUpgradeTier = 10 / (double) mobTier * ItemSettingsConfig.getMaximumItemLevel(); - if (ThreadLocalRandom.current().nextDouble() * 100 < chanceToUpgradeTier) - return mobTier + 1; + if (ThreadLocalRandom.current().nextDouble() * 100 < chanceToUpgradeTier) return mobTier + 1D; double diceRoll = ThreadLocalRandom.current().nextDouble(); @@ -156,10 +251,8 @@ public static double setItemTier(int mobTier) { 50% of the time, give an item better than what the player is wearing If you're wondering why this isn't configurable, wonder instead why no one has noticed it isn't before you reading this */ - if (diceRoll < 0.10) - mobTier -= 2; - else if (diceRoll < 0.50) - mobTier -= 1; + if (diceRoll < 0.10) mobTier -= 2; + else if (diceRoll < 0.50) mobTier -= 1; if (mobTier < 0) mobTier = 0; @@ -167,61 +260,143 @@ else if (diceRoll < 0.50) } - private static Item dropCustomStaticLoot(Location location) { + public static ItemStack dropWeighedFixedItem(EliteEntity eliteEntity, Player player) { + ItemStack itemStack = generateWeighedFixedItemStack(player); + if (ItemSettingsConfig.isPutLootDirectlyIntoPlayerInventory()) player.getInventory().addItem(itemStack); + else processPhysicalItem(eliteEntity.getLocation(), itemStack, player); + return itemStack; + } + - double totalWeight = 0; + public static ItemStack dropWeighedFixedItem(Location location, Player player) { + ItemStack itemStack = generateWeighedFixedItemStack(player); + if (ItemSettingsConfig.isPutLootDirectlyIntoPlayerInventory()) player.getInventory().addItem(itemStack); + else processPhysicalItem(location, itemStack, player); + return itemStack; + } - for (ItemStack itemStack : CustomItemConstructor.staticCustomItemHashMap.keySet()) - totalWeight += CustomItemConstructor.staticCustomItemHashMap.get(itemStack); + private static ItemStack generateWeighedFixedItemStack(Player player) { + double totalWeight = 0; + for (ItemStack itemStack : CustomItem.getWeighedFixedItems().keySet()) { + Double shouldntBeNull = CustomItem.getWeighedFixedItems().get(itemStack); + if (shouldntBeNull != null) totalWeight += CustomItem.getWeighedFixedItems().get(itemStack); + else Logger.warn("Item " + itemStack.getItemMeta().getDisplayName() + " reported a null weight!"); + } ItemStack generatedItemStack = null; double random = Math.random() * totalWeight; - for (ItemStack itemStack : CustomItemConstructor.staticCustomItemHashMap.keySet()) { - - random -= CustomItemConstructor.staticCustomItemHashMap.get(itemStack); - + for (ItemStack itemStack : CustomItem.getWeighedFixedItems().keySet()) { + random -= CustomItem.getWeighedFixedItems().get(itemStack); if (random <= 0) { - - generatedItemStack = itemStack; + generatedItemStack = itemStack.clone(); break; - } - } - return location.getWorld().dropItem(location, generatedItemStack); + SoulbindEnchantment.addEnchantment(generatedItemStack, player); + return generatedItemStack; + } + + private static ItemStack dropProcedurallyGeneratedItem(int itemLevel, EliteEntity eliteEntity, Player player) { + ItemStack itemStack = generateProcedurallyGeneratedItem(itemLevel, player, eliteEntity); + if (ItemSettingsConfig.isPutLootDirectlyIntoPlayerInventory()) player.getInventory().addItem(itemStack); + else processPhysicalItem(eliteEntity.getLocation(), itemStack, player); + return itemStack; + } + + private static ItemStack dropProcedurallyGeneratedItem(int itemLevel, Location location, Player player) { + ItemStack itemStack = generateProcedurallyGeneratedItem(itemLevel, player, null); + if (ItemSettingsConfig.isPutLootDirectlyIntoPlayerInventory()) player.getInventory().addItem(itemStack); + else processPhysicalItem(location, itemStack, player); + return itemStack; + } + + private static ItemStack generateProcedurallyGeneratedItem(int itemLevel, Player player, EliteEntity eliteEntity) { + return ItemConstructor.constructItem(itemLevel, eliteEntity, player, false); + } + + private static ItemStack dropScalableItem(EliteEntity eliteEntity, int itemLevel, Player player) { + ItemStack itemStack = generateScalableItem(itemLevel, player, eliteEntity); + if (ItemSettingsConfig.isPutLootDirectlyIntoPlayerInventory()) player.getInventory().addItem(itemStack); + else processPhysicalItem(eliteEntity.getLocation(), itemStack, player); + return itemStack; + } + private static ItemStack dropScalableItem(Location location, int itemLevel, Player player) { + ItemStack itemStack = generateScalableItem(itemLevel, player, null); + if (ItemSettingsConfig.isPutLootDirectlyIntoPlayerInventory()) player.getInventory().addItem(itemStack); + else processPhysicalItem(location, itemStack, player); + return itemStack; } - private static Item dropProcedurallyGeneratedItem(int tierLevel, EliteMobEntity eliteMobEntity) { + private static ItemStack generateScalableItem(int itemTier, Player player, EliteEntity eliteEntity) { + return ScalableItemConstructor.randomizeScalableItem(itemTier, player, eliteEntity); + } - ItemStack randomLoot = ItemConstructor.constructItem(tierLevel, eliteMobEntity); - return eliteMobEntity.getLivingEntity().getWorld().dropItem(eliteMobEntity.getLivingEntity().getLocation(), randomLoot); + private static ItemStack dropLimitedItem(EliteEntity eliteEntity, int itemLevel, Player player) { + ItemStack itemStack = generateLimitedItem(itemLevel, player, eliteEntity); + if (ItemSettingsConfig.isPutLootDirectlyIntoPlayerInventory()) player.getInventory().addItem(itemStack); + else processPhysicalItem(eliteEntity.getLocation(), itemStack, player); + return itemStack; + } + private static ItemStack dropLimitedItem(Location location, int itemTier, Player player) { + ItemStack itemStack = generateLimitedItem(itemTier, player, null); + if (ItemSettingsConfig.isPutLootDirectlyIntoPlayerInventory()) player.getInventory().addItem(itemStack); + else processPhysicalItem(location, itemStack, player); + return itemStack; } - private static Item dropDynamicallyScalingItem(EliteMobEntity eliteMobEntity, int itemTier) { + private static ItemStack generateLimitedItem(int itemTier, Player player, EliteEntity eliteEntity) { + return ScalableItemConstructor.randomizeLimitedItem(itemTier, player, eliteEntity); + } - return eliteMobEntity.getLivingEntity().getWorld().dropItem(eliteMobEntity.getLivingEntity().getLocation(), - ScalableItemConstructor.constructDynamicItem(itemTier)); + private static ItemStack dropFixedItem(EliteEntity eliteEntity, int itemTier, Player player) { + ItemStack itemStack = generateFixedItem(itemTier, player, eliteEntity); + if (ItemSettingsConfig.isPutLootDirectlyIntoPlayerInventory()) player.getInventory().addItem(itemStack); + else processPhysicalItem(eliteEntity.getLocation(), itemStack, player); + return itemStack; + } + private static ItemStack dropFixedItem(Location location, int itemTier, Player player) { + ItemStack itemStack = generateFixedItem(itemTier, player, null); + if (ItemSettingsConfig.isPutLootDirectlyIntoPlayerInventory()) player.getInventory().addItem(itemStack); + else processPhysicalItem(location, itemStack, player); + return itemStack; } - private static Item dropLimitedScalingItem(EliteMobEntity eliteMobEntity, int itemTier) { + private static ItemStack generateFixedItem(int itemTier, Player player, EliteEntity eliteEntity) { + return CustomItem.getFixedItems().get(itemTier).get(ThreadLocalRandom.current().nextInt(CustomItem.getFixedItems().get(itemTier).size())).generateDefaultsItemStack(player, false, eliteEntity); + } - return eliteMobEntity.getLivingEntity().getWorld().dropItem(eliteMobEntity.getLivingEntity().getLocation(), - ScalableItemConstructor.constructLimitedItem(itemTier)); + private static void processPhysicalItem(Location location, ItemStack itemStack, Player player) { + Item item = location.getWorld().dropItem(location, itemStack); + if (item.getItemStack().hasItemMeta() && item.getItemStack().getItemMeta().hasDisplayName()) { + item.setCustomName(item.getItemStack().getItemMeta().getDisplayName()); + item.setCustomNameVisible(true); + } + SoulbindEnchantment.addPhysicalDisplay(item, player); + RareDropEffect.runEffect(item); + } + public static void generateSpecialLoot(Player player, int level, EliteEntity eliteEntity) { + CustomItem customItem = WeightedProbability.pickWeighedProbabilityFromCustomItems(SpecialItemSystemsConfig.getSpecialValues()); + if (customItem == null) return; + player.getWorld().dropItem(player.getLocation(), customItem.generateItemStack(level, player, eliteEntity)); } - private static Item dropStaticScalingItem(EliteMobEntity eliteMobEntity, int itemTier) { - return eliteMobEntity.getLivingEntity().getWorld().dropItem(eliteMobEntity.getLivingEntity().getLocation(), - ScalableItemConstructor.staticItems.get(itemTier).get(ThreadLocalRandom.current() - .nextInt(ScalableItemConstructor.staticItems.get(itemTier).size()) - 1)); + @EventHandler + public void onDeath(EliteMobDeathEvent event) { + if (event.getEntityDeathEvent() != null && !event.getEliteEntity().isVanillaLoot()) + event.getEntityDeathEvent().getDrops().clear(); + if (!event.getEliteEntity().isEliteLoot()) return; + if (event.getEliteEntity().getLevel() < 1) return; + if (event.getEliteEntity().getDamagers().isEmpty()) return; + generatePlayerLoot(event.getEliteEntity()); } } diff --git a/src/main/java/com/magmaguy/elitemobs/items/MobTierCalculator.java b/src/main/java/com/magmaguy/elitemobs/items/MobTierCalculator.java new file mode 100644 index 000000000..1b01bdabf --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/MobTierCalculator.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.items; + +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; + +public class MobTierCalculator { + public static final double PER_TIER_LEVEL_INCREASE = 1; + + private MobTierCalculator() { + } + + public static double findMobTier(EliteEntity eliteEntity) { + return eliteEntity.getLevel() / PER_TIER_LEVEL_INCREASE; + } + + public static double findMobTier(int mobLevel) { + return mobLevel / PER_TIER_LEVEL_INCREASE; + } + + public static int findMobLevel(int mobTier) { + return (int) (mobTier * PER_TIER_LEVEL_INCREASE); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/MobTierFinder.java b/src/main/java/com/magmaguy/elitemobs/items/MobTierFinder.java deleted file mode 100644 index 44a01c0ed..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/MobTierFinder.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.magmaguy.elitemobs.items; - -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; - -public class MobTierFinder { - - public static final double PER_TIER_LEVEL_INCREASE = ConfigValues.mobCombatSettingsConfig.getDouble(MobCombatSettingsConfig.PER_TIER_LEVEL_INCREASE); - - public static double findMobTier(EliteMobEntity eliteMobEntity) { - - return eliteMobEntity.getLevel() / PER_TIER_LEVEL_INCREASE; - - } - - public static double findMobTier(int mobLevel) { - - return mobLevel / PER_TIER_LEVEL_INCREASE; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/ObfuscatedSignatureLoreData.java b/src/main/java/com/magmaguy/elitemobs/items/ObfuscatedSignatureLoreData.java deleted file mode 100644 index e533f1876..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/ObfuscatedSignatureLoreData.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.items; - -import org.bukkit.Material; -import org.bukkit.inventory.ItemStack; - -public class ObfuscatedSignatureLoreData { - - public static final String ITEM_SIGNATURE = "EliteItem"; - - public static Boolean obfuscatedSignatureDetector(ItemStack itemStack) { - - if (itemStack == null || itemStack.getType().equals(Material.AIR) || !itemStack.getItemMeta().hasLore()) return false; - - return itemStack.getItemMeta().getLore().get(0).replace("§", "").contains(ITEM_SIGNATURE); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/PlaceEventPrevent.java b/src/main/java/com/magmaguy/elitemobs/items/PlaceEventPrevent.java index 93c1e1904..5a63b6087 100644 --- a/src/main/java/com/magmaguy/elitemobs/items/PlaceEventPrevent.java +++ b/src/main/java/com/magmaguy/elitemobs/items/PlaceEventPrevent.java @@ -1,22 +1,6 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package com.magmaguy.elitemobs.items; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.ItemsCustomLootSettingsConfig; +import com.magmaguy.elitemobs.config.ItemSettingsConfig; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; @@ -27,7 +11,7 @@ public class PlaceEventPrevent implements Listener { @EventHandler public void onPlaceForbiddenItem(PlayerInteractEvent event) { - if (!ConfigValues.itemsCustomLootSettingsConfig.getBoolean(ItemsCustomLootSettingsConfig.PREVENT_CUSTOM_ITEM_PLACING)) + if (!ItemSettingsConfig.isPreventCustomItemPlacement()) return; if (!event.isBlockInHand()) return; @@ -36,7 +20,7 @@ public void onPlaceForbiddenItem(PlayerInteractEvent event) { if (event.getItem() == null || event.getItem().getItemMeta() == null) return; - if (ObfuscatedSignatureLoreData.obfuscatedSignatureDetector(event.getItem())) + if (ItemTagger.isEliteItem(event.getItem())) event.setCancelled(true); } diff --git a/src/main/java/com/magmaguy/elitemobs/items/PotionEffectApplier.java b/src/main/java/com/magmaguy/elitemobs/items/PotionEffectApplier.java deleted file mode 100644 index 678cfde04..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/PotionEffectApplier.java +++ /dev/null @@ -1,441 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.items; - -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.ItemsCustomLootSettingsConfig; -import com.magmaguy.elitemobs.items.itemconstructor.LoreGenerator; -import org.bukkit.Bukkit; -import org.bukkit.entity.Arrow; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; - -/** - * Created by MagmaGuy on 14/03/2017. - */ -public class PotionEffectApplier implements Listener { - - public static final String TARGET = "TARGET"; - public static final String SELF = "SELF"; - public static final String CONTINUOUS = "CONTINUOUS"; - public static final String ONHIT = "ONHIT"; - List offensivePotionEffects = new ArrayList<>(Arrays.asList( - PotionEffectType.BLINDNESS, - PotionEffectType.CONFUSION, - PotionEffectType.GLOWING, - PotionEffectType.HARM, - PotionEffectType.HUNGER, - PotionEffectType.LEVITATION, - PotionEffectType.POISON, - PotionEffectType.SLOW, - PotionEffectType.SLOW_DIGGING, - PotionEffectType.UNLUCK, - PotionEffectType.WEAKNESS, - PotionEffectType.WITHER - )); - - public void potionEffectApplier() { - - //scan through what players are wearing - for (Player player : Bukkit.getOnlinePlayers()) { - - if (player.getInventory().getItemInMainHand() != null) { - - itemPotionEffectCheck(player.getInventory().getItemInMainHand(), player, false); - - } - - if (player.getInventory().getItemInOffHand() != null) { - - itemPotionEffectCheck(player.getInventory().getItemInOffHand(), player, false); - - } - - if (player.getInventory().getBoots() != null) { - - itemPotionEffectCheck(player.getInventory().getBoots(), player, false); - - } - - if (player.getInventory().getLeggings() != null) { - - itemPotionEffectCheck(player.getInventory().getLeggings(), player, false); - - } - - if (player.getInventory().getChestplate() != null) { - - itemPotionEffectCheck(player.getInventory().getChestplate(), player, false); - - } - - if (player.getInventory().getHelmet() != null) { - - itemPotionEffectCheck(player.getInventory().getHelmet(), player, false); - - } - - } - - } - - private void itemPotionEffectCheck(ItemStack itemStack, Player player, boolean event) { - - itemPotionEffectCheck(itemStack, player, event, null); - - } - - private void itemPotionEffectCheck(ItemStack itemStack, Player player, boolean event, LivingEntity livingEntity) { - - if (itemStack.getItemMeta() == null || itemStack.getItemMeta().getLore() == null) return; - - List deobfuscatedLore = loreDeobfuscator(itemStack); - - if (deobfuscatedLore.size() > 0) { - - HashMap> potionEffects = potionEffectCreator(deobfuscatedLore, event); - - if (!event) { - - continuousPotionEffectApplier(potionEffects, player); - - } - - if (event) { - - eventPotionEffectApplier(potionEffects, player, livingEntity); - - } - - } - - } - - public List loreDeobfuscator(ItemStack itemStack) { - - List lore = itemStack.getItemMeta().getLore(); - List deobfuscatedPotionEffect = new ArrayList<>(); - - if (lore.isEmpty()) return deobfuscatedPotionEffect; - - String deobfuscatedString = lore.get(0).replace("§", ""); - - if (!deobfuscatedString.contains(LoreGenerator.OBFUSCATED_POTIONS)) return deobfuscatedPotionEffect; - - for (PotionEffectType potionEffectType : PotionEffectType.values()) - if (potionEffectType != null) - for (String spaceSeparation : deobfuscatedString.split(",")) { - //individual potion effects are separated at this level - List amplifierSeparation = Arrays.asList(spaceSeparation.split(":")); - - if (amplifierSeparation.size() > 1 && amplifierSeparation.get(0).equals(potionEffectType.getName())) - deobfuscatedPotionEffect.add(spaceSeparation); - - } - - - return deobfuscatedPotionEffect; - - } - - private HashMap> potionEffectCreator(List deobfuscatedLore, boolean event) { - - HashMap> potionEffects = new HashMap<>(); - - - for (String string : deobfuscatedLore) { - - int substringIndex = 0; - PotionEffectType potionEffectType = null; - int potionEffectMagnitude = 0; - String victim; - List tags = new ArrayList<>(); - - - for (String substring : string.split(":")) { - - if (substringIndex == 0) { - - potionEffectType = PotionEffectType.getByName(substring); - - } - - if (substringIndex == 1) { - - potionEffectMagnitude = Integer.parseInt(substring); - - } - - if (substringIndex == 2) { - - victim = substring; - if (victim.equalsIgnoreCase(TARGET) || victim.equalsIgnoreCase(SELF)) { - - tags.add(victim); - - } else { - - Bukkit.getLogger().info("[EliteMobs] Error with ItemsCustomLootList.yml: was expecting '" + TARGET + "' or '" - + SELF + "' values but got '" + victim + "' instead."); - - } - - } - - if (substringIndex == 3) { - - if (substring.equalsIgnoreCase(CONTINUOUS)) { - - tags.add(substring); - - } else if (substring.equalsIgnoreCase(ONHIT)) { - - tags.add(substring); - - } else { - - Bukkit.getLogger().info("[EliteMobs] Error with ItemsCustomLootList.yml: was expecting '" + CONTINUOUS + - "' or '" + ONHIT + "' value but got '" + substring + "' instead."); - - } - - } - - substringIndex++; - - } - - if (potionEffectType != null && potionEffectMagnitude > 0) { - - PotionEffect potionEffect; - - if (!event) potionEffect = continuousPotionEffect(potionEffectType, potionEffectMagnitude - 1); - else potionEffect = eventPotionEffect(potionEffectType, potionEffectMagnitude - 1); - - potionEffects.put(potionEffect, tags); - - } else { - - Bukkit.getLogger().info("[EliteMobs] There seems to be something very wrong with one of your potion effects."); - Bukkit.getLogger().info("[EliteMobs] An item has an invalid potion effect or potion effect level."); - Bukkit.getLogger().info("[EliteMobs] Problematic entry has the follow settings: " + string); - - } - - } - - - return potionEffects; - - } - - private PotionEffect continuousPotionEffect(PotionEffectType potionEffectType, int potionEffectMagnitude) { - - if (potionEffectType.equals(PotionEffectType.NIGHT_VISION)) { - return new PotionEffect(potionEffectType, 15 * 20, potionEffectMagnitude); - } - return new PotionEffect(potionEffectType, 2 * 20, potionEffectMagnitude); - - } - - private PotionEffect eventPotionEffect(PotionEffectType potionEffectType, int potionEffectMagnitude) { - - return new PotionEffect(potionEffectType, potionEffectDuration(potionEffectType), potionEffectMagnitude); - - } - - private int potionEffectDuration(PotionEffectType potionEffectType) { - - if (ConfigValues.itemsCustomLootSettingsConfig.contains(ItemsCustomLootSettingsConfig.DEFAULT_POTION_EFFECT_DURATION_NODE_PREFIX + potionEffectType.getName())) { - - return 20 * ConfigValues.itemsCustomLootSettingsConfig.getInt(ItemsCustomLootSettingsConfig.DEFAULT_POTION_EFFECT_DURATION_NODE_PREFIX + potionEffectType.getName()); - - } else { - - return 1; - - } - - } - - private void continuousPotionEffectApplier(HashMap> potionEffects, Player - player) { - - for (PotionEffect potionEffect : potionEffects.keySet()) { - - if (potionEffects.get(potionEffect).size() > 0) { - - if (potionEffects.get(potionEffect).get(0).equalsIgnoreCase(SELF)) { - - if ((!offensivePotionEffects.contains(potionEffect.getType()) && potionEffects.get(potionEffect).size() == 1) || - (!offensivePotionEffects.contains(potionEffect.getType()) && potionEffects.get(potionEffect).get(1).equalsIgnoreCase(CONTINUOUS))) { - - player.removePotionEffect(potionEffect.getType()); - player.addPotionEffect(potionEffect); - - } - - if (offensivePotionEffects.contains(potionEffect.getType()) && potionEffects.get(potionEffect).size() > 1) { - - if (potionEffects.get(potionEffect).get(1).equalsIgnoreCase(CONTINUOUS)) { - - player.removePotionEffect(potionEffect.getType()); - player.addPotionEffect(potionEffect); - - } - - } - - - } else if (potionEffects.get(potionEffect).get(0).equalsIgnoreCase(TARGET)) { - - //this doesn't do anything since this will only continuously apply to the player. - - } - - } else { - - //legacy config settings where there are no tags - if (!offensivePotionEffects.contains(potionEffect.getType())) { - - player.removePotionEffect(potionEffect.getType()); - player.addPotionEffect(potionEffect); - - } - - } - - } - - } - - private void eventPotionEffectApplier(HashMap> potionEffects, Player - player, LivingEntity livingEntity) { - - for (PotionEffect potionEffect : potionEffects.keySet()) { - - if (potionEffects.get(potionEffect).size() > 0) { - - if (potionEffects.get(potionEffect).get(0).equalsIgnoreCase(SELF)) { - - player.removePotionEffect(potionEffect.getType()); - player.addPotionEffect(potionEffect); - - if (potionEffects.get(potionEffect).size() > 1) { - - if (potionEffects.get(potionEffect).get(1).equalsIgnoreCase(CONTINUOUS)) { - - player.removePotionEffect(potionEffect.getType()); - - } - - } - - - } else if (potionEffects.get(potionEffect).get(0).equalsIgnoreCase(TARGET)) { - - livingEntity.removePotionEffect(potionEffect.getType()); - livingEntity.addPotionEffect(potionEffect); - - } - - } else { - - //legacy config settings where there are no tags - if (offensivePotionEffects.contains(potionEffect.getType())) { - - livingEntity.removePotionEffect(potionEffect.getType()); - livingEntity.addPotionEffect(potionEffect); - - } - - } - - } - - } - - @EventHandler - public void onPlayerHitWithPotionEffect(EntityDamageByEntityEvent event) { - - if (event.isCancelled()) return; - - Player player; - - //deal with bows - if (event.getDamager() instanceof Arrow) { - - Arrow arrow = (Arrow) event.getDamager(); - - if (arrow.getShooter() instanceof Player) { - - player = (Player) arrow.getShooter(); - - } else { - - return; - - } - - } else if (event.getDamager() instanceof Player) { - - player = (Player) event.getDamager(); - - } else { - - return; - - } - - LivingEntity damagee; - - if (event.getEntity() instanceof LivingEntity) { - - damagee = (LivingEntity) event.getEntity(); - - } else { - - return; - - } - - if (player.getInventory().getItemInMainHand() != null) { - - itemPotionEffectCheck(player.getInventory().getItemInMainHand(), player, true, damagee); - - } - - if (player.getInventory().getItemInOffHand() != null) { - - itemPotionEffectCheck(player.getInventory().getItemInOffHand(), player, true, damagee); - - } - - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/RareDropEffect.java b/src/main/java/com/magmaguy/elitemobs/items/RareDropEffect.java index 848cfa9d2..2d007a551 100644 --- a/src/main/java/com/magmaguy/elitemobs/items/RareDropEffect.java +++ b/src/main/java/com/magmaguy/elitemobs/items/RareDropEffect.java @@ -1,27 +1,26 @@ package com.magmaguy.elitemobs.items; import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.ItemSettingsConfig; import com.magmaguy.elitemobs.items.itemconstructor.ItemQualityColorizer; -import org.bukkit.Location; import org.bukkit.Particle; import org.bukkit.entity.Item; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.entity.ItemSpawnEvent; import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.Vector; - -import java.util.concurrent.ThreadLocalRandom; public class RareDropEffect implements Listener { public static void runEffect(Item item) { + if (!ItemSettingsConfig.isEnableRareItemParticleEffects()) return; if (!(ItemQualityColorizer.getItemQuality(item.getItemStack()).equals(ItemQualityColorizer.ItemQuality.LIGHT_BLUE) || ItemQualityColorizer.getItemQuality(item.getItemStack()).equals(ItemQualityColorizer.ItemQuality.GOLD))) return; new BukkitRunnable() { + int counter = 0; @Override public void run() { @@ -31,31 +30,21 @@ public void run() { return; } - for (int i = 0; i < 3; i++) { - - Location location = item.getLocation().clone(); - double randomizedY = ThreadLocalRandom.current().nextDouble() * 2; - double randomizedX = (ThreadLocalRandom.current().nextDouble() * 2 - 1) / randomizedY; - double randomizedZ = (ThreadLocalRandom.current().nextDouble() * 2 - 1) / randomizedY; - location.add(new Vector(randomizedX, randomizedY, randomizedZ)); - - location.getWorld().spawnParticle(Particle.FIREWORKS_SPARK, location, 1, 0, 0, 0, 0); - - } + item.getWorld().spawnParticle(Particle.PORTAL, item.getLocation(), 5, 0.01, 0.01, 0.01, 0.5); + counter += 20; + if (counter > 20 * 60 * 2) + cancel(); } - }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 20); } @EventHandler public void onItemDrop(ItemSpawnEvent event) { - - if (!ObfuscatedSignatureLoreData.obfuscatedSignatureDetector(event.getEntity().getItemStack())) return; - + if (!ItemTagger.isEliteItem(event.getEntity().getItemStack())) return; runEffect(event.getEntity()); - } } diff --git a/src/main/java/com/magmaguy/elitemobs/items/ScalableItemConstructor.java b/src/main/java/com/magmaguy/elitemobs/items/ScalableItemConstructor.java index e4c73f470..9fcc16397 100644 --- a/src/main/java/com/magmaguy/elitemobs/items/ScalableItemConstructor.java +++ b/src/main/java/com/magmaguy/elitemobs/items/ScalableItemConstructor.java @@ -1,10 +1,12 @@ package com.magmaguy.elitemobs.items; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.ItemsDropSettingsConfig; +import com.magmaguy.elitemobs.items.customitems.CustomItem; import com.magmaguy.elitemobs.items.itemconstructor.ItemConstructor; -import com.magmaguy.elitemobs.items.itemconstructor.ScallableItemObject; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import java.util.ArrayList; @@ -14,90 +16,53 @@ public class ScalableItemConstructor { + private ScalableItemConstructor() { + } - public static List dynamicallyScalableItems = new ArrayList<>(); - public static HashMap> limitedScalableItems = new HashMap<>(); - public static HashMap> staticItems = new HashMap<>(); - - /* - Fully dynamic scalable items can be of any item rank all the way up to the maximum valid item tier. - As such, there is no sense in trying to sort this by tiers. - */ - public static ItemStack constructDynamicItem(int itemTier) { - - ScallableItemObject scalableItemObject = dynamicallyScalableItems.get(ThreadLocalRandom.current().nextInt(dynamicallyScalableItems.size())); - - HashMap newEnchantmentList = updateDynamicEnchantments(scalableItemObject.enchantments, itemTier); + public static ItemStack randomizeScalableItem(int itemTier, Player player, EliteEntity eliteEntity) { + CustomItem customItem = CustomItem.getScalableItems().get(ThreadLocalRandom.current().nextInt(CustomItem.getScalableItems().size())); + return constructScalableItem(itemTier, customItem, player, eliteEntity); + } + public static ItemStack constructScalableItem(int itemTier, CustomItem customItem, Player player, EliteEntity eliteEntity) { + if (!customItem.getPermission().isEmpty() && !player.hasPermission(customItem.getPermission())) return null; + HashMap newEnchantmentList = updateDynamicEnchantments(customItem.getEnchantments()); return ItemConstructor.constructItem( - scalableItemObject.rawName, - scalableItemObject.material, + itemTier, + customItem.getCustomItemsConfigFields().getName(), + customItem.getCustomItemsConfigFields().getMaterial(), newEnchantmentList, - scalableItemObject.customEnchantments, - scalableItemObject.potionEffects, - scalableItemObject.lore + customItem.getCustomEnchantments(), + customItem.getPotionEffects(), + customItem.getCustomItemsConfigFields().getLore(), + eliteEntity, + player, + false, + customItem.getCustomItemsConfigFields().getCustomModelID(), + customItem.getCustomItemsConfigFields().isSoulbound(), + customItem.getCustomItemsConfigFields().getFilename() ); - } - private static HashMap updateDynamicEnchantments(HashMap enchantmentsList, int itemTier) { - - if (enchantmentsList.containsKey(Enchantment.PROTECTION_ENVIRONMENTAL) && - enchantmentsList.get(Enchantment.PROTECTION_ENVIRONMENTAL) > - ConfigValues.itemsDropSettingsConfig.getInt(ItemsDropSettingsConfig.MAXIMUM_LOOT_TIER)) - itemTier = ConfigValues.itemsDropSettingsConfig.getInt(ItemsDropSettingsConfig.MAXIMUM_LOOT_TIER); - - if (enchantmentsList.containsKey(Enchantment.DAMAGE_ALL) && - enchantmentsList.get(Enchantment.DAMAGE_ALL) > - ConfigValues.itemsDropSettingsConfig.getInt(ItemsDropSettingsConfig.MAXIMUM_LOOT_TIER)) - itemTier = ConfigValues.itemsDropSettingsConfig.getInt(ItemsDropSettingsConfig.MAXIMUM_LOOT_TIER); - - if (enchantmentsList.containsKey(Enchantment.ARROW_DAMAGE) && - enchantmentsList.get(Enchantment.ARROW_DAMAGE) > - ConfigValues.itemsDropSettingsConfig.getInt(ItemsDropSettingsConfig.MAXIMUM_LOOT_TIER)) - itemTier = ConfigValues.itemsDropSettingsConfig.getInt(ItemsDropSettingsConfig.MAXIMUM_LOOT_TIER); - - HashMap newEnchantmentList = new HashMap<>(); - HashMap secondaryEnchantmentList = new HashMap<>(); - - /* - Small limitation of this system, it doesn't take into account the material tier and just defaults to assume it's - diamond (hence the -1 enchantment). - It's such a small thing that I don't feel it's worth the hassle of adjusting it. - */ + private static HashMap updateDynamicEnchantments(HashMap enchantmentsList) { + List enchantmentsArray = new ArrayList<>(); for (Enchantment enchantment : enchantmentsList.keySet()) - if (enchantment.equals(Enchantment.DAMAGE_ALL) || - enchantment.equals(Enchantment.ARROW_DAMAGE) || - enchantment.equals(Enchantment.PROTECTION_ENVIRONMENTAL)) - newEnchantmentList.put(enchantment, itemTier - 1); - else - secondaryEnchantmentList.put(enchantment, enchantmentsList.get(enchantment)); - - int secondaryEnchantmentPool = ThreadLocalRandom.current().nextInt((int) Math.ceil((double) itemTier / 2)); + for (int i = 0; i < enchantmentsList.get(enchantment); i++) + enchantmentsArray.add(enchantment); - for (int i = 0; i < secondaryEnchantmentPool; i++) { - - if (secondaryEnchantmentList.isEmpty()) break; - - int randomIndex = ThreadLocalRandom.current().nextInt(secondaryEnchantmentList.size()); - Enchantment randomizedEnchantment = (Enchantment) secondaryEnchantmentList.keySet().toArray()[randomIndex]; + HashMap newEnchantmentList = new HashMap<>(); - if (newEnchantmentList.isEmpty() || !newEnchantmentList.containsKey(randomizedEnchantment)) { - newEnchantmentList.put(randomizedEnchantment, 1); - } else { - int newEnchantmentLevel = newEnchantmentList.get(randomizedEnchantment) + 1; - newEnchantmentList.put(randomizedEnchantment, newEnchantmentLevel); + for (int i = 0; i < enchantmentsArray.size(); i++) { + int random = ThreadLocalRandom.current().nextInt(0, enchantmentsArray.size()); + if (!newEnchantmentList.containsKey(enchantmentsArray.get(random))) + newEnchantmentList.put(enchantmentsArray.get(random), 1); + else { + int currentValue = newEnchantmentList.get(enchantmentsArray.get(random)) + 1; + newEnchantmentList.put(enchantmentsArray.get(random), currentValue); } - - int leftoverPoolEnchantment = secondaryEnchantmentList.get(randomizedEnchantment) - 1; - if (leftoverPoolEnchantment <= 0) - secondaryEnchantmentList.remove(randomizedEnchantment); - else - secondaryEnchantmentList.put(randomizedEnchantment, leftoverPoolEnchantment); - + enchantmentsArray.remove(random); } - return newEnchantmentList; } @@ -107,49 +72,49 @@ private static HashMap updateDynamicEnchantments(HashMap localLootList = new ArrayList<>(); + List localLootList = new ArrayList<>(); for (int i = 0; i < itemTier; i++) - if (limitedScalableItems.containsKey(i)) - localLootList.addAll(limitedScalableItems.get(i)); + if (CustomItem.getLimitedItems().containsKey(i)) + localLootList.addAll(CustomItem.getLimitedItems().get(i)); + /* + Currently elitemobs has no way of telling if there will be a limited item available for the specific asked tier + //todo: fix this + */ + if (localLootList.size() == 0) + ItemStackGenerator.generateItemStack(Material.AIR); - ScallableItemObject scalableItemObject = localLootList.get(ThreadLocalRandom.current().nextInt(localLootList.size()) - 1); - HashMap newEnchantmentList = updateLimitedEnchantments(scalableItemObject.enchantments, itemTier); + CustomItem customItem = localLootList.get(ThreadLocalRandom.current().nextInt(localLootList.size())); + if (!customItem.getPermission().isEmpty() && !player.hasPermission(customItem.getPermission())) return null; - return ItemConstructor.constructItem( - scalableItemObject.rawName, - scalableItemObject.material, - newEnchantmentList, - scalableItemObject.customEnchantments, - scalableItemObject.potionEffects, - scalableItemObject.lore - ); + return constructLimitedItem(itemTier, customItem, player, eliteEntity); } - private static HashMap updateLimitedEnchantments(HashMap enchantmentsList, - int itemTier) { - if (enchantmentsList.containsKey(Enchantment.PROTECTION_ENVIRONMENTAL) && - enchantmentsList.get(Enchantment.PROTECTION_ENVIRONMENTAL) < itemTier) - itemTier = enchantmentsList.get(Enchantment.PROTECTION_ENVIRONMENTAL); - - if (enchantmentsList.containsKey(Enchantment.DAMAGE_ALL) && - enchantmentsList.get(Enchantment.DAMAGE_ALL) > - ConfigValues.itemsDropSettingsConfig.getInt(ItemsDropSettingsConfig.MAXIMUM_LOOT_TIER)) - itemTier = enchantmentsList.get(Enchantment.DAMAGE_ALL); + public static ItemStack constructLimitedItem(int itemTier, CustomItem customItem, Player player, EliteEntity eliteEntity) { + int adjustedItemLevel = Math.min(itemTier, customItem.getItemLevel()); - if (enchantmentsList.containsKey(Enchantment.ARROW_DAMAGE) && - enchantmentsList.get(Enchantment.ARROW_DAMAGE) > - ConfigValues.itemsDropSettingsConfig.getInt(ItemsDropSettingsConfig.MAXIMUM_LOOT_TIER)) - itemTier = enchantmentsList.get(Enchantment.ARROW_DAMAGE); + HashMap newEnchantmentList = updateDynamicEnchantments(customItem.getEnchantments()); - - return updateDynamicEnchantments(enchantmentsList, itemTier); + return ItemConstructor.constructItem( + adjustedItemLevel, + customItem.getCustomItemsConfigFields().getName(), + customItem.getCustomItemsConfigFields().getMaterial(), + newEnchantmentList, + customItem.getCustomEnchantments(), + customItem.getPotionEffects(), + customItem.getCustomItemsConfigFields().getLore(), + eliteEntity, + player, + false, + customItem.getCustomItemsConfigFields().getCustomModelID(), + customItem.getCustomItemsConfigFields().isSoulbound(), + customItem.getCustomItemsConfigFields().getFilename() + ); } - } diff --git a/src/main/java/com/magmaguy/elitemobs/items/ShareItem.java b/src/main/java/com/magmaguy/elitemobs/items/ShareItem.java new file mode 100644 index 000000000..54c58554d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/ShareItem.java @@ -0,0 +1,52 @@ +package com.magmaguy.elitemobs.items; + +import com.magmaguy.elitemobs.api.utils.EliteItemManager; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +public class ShareItem { + + public static void showOnChat(Player player) { + if (player.getInventory().getItemInMainHand().getType().equals(Material.AIR)) return; + ItemStack itemStack = player.getInventory().getItemInMainHand(); + if (!itemStack.hasItemMeta()) return; + if (!itemStack.getItemMeta().hasDisplayName()) return; + if (!itemStack.getItemMeta().hasLore()) return; + + String name = itemStack.getItemMeta().getDisplayName(); + + TextComponent interactiveMessage = new TextComponent(player.getDisplayName() + ": " + name); + setItemHoverEvent(interactiveMessage, itemStack); + + for (Player onlinePlayer : Bukkit.getServer().getOnlinePlayers()) + onlinePlayer.spigot().sendMessage(interactiveMessage); + } + + public static void setItemHoverEvent(TextComponent textComponent, ItemStack itemStack) { + if (!EliteItemManager.isEliteMobsItem(itemStack)) + return; + String stringList = itemStack.getItemMeta().getDisplayName(); + if (itemStack.getItemMeta().hasLore()) + for (String loreString : itemStack.getItemMeta().getLore()) + stringList += "\n" + ChatColor.DARK_PURPLE + ChatColor.ITALIC + loreString; + textComponent.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(stringList).create())); + } + + public static TextComponent hoverableItemTextComponent(ItemStack itemStack) { + TextComponent textComponent = new TextComponent(); + String stringList = ""; + if (itemStack.getItemMeta().hasLore()) + for (String loreString : itemStack.getItemMeta().getLore()) + stringList += "\n" + ChatColor.DARK_PURPLE + ChatColor.ITALIC + loreString; + textComponent.setText(itemStack.getItemMeta().getDisplayName()); + textComponent.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(stringList).create())); + return textComponent; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/customenchantments/CriticalStrikesEnchantment.java b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/CriticalStrikesEnchantment.java new file mode 100644 index 000000000..ecf37b917 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/CriticalStrikesEnchantment.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.items.customenchantments; + +import com.magmaguy.elitemobs.config.enchantments.premade.CriticalStrikesConfig; +import com.magmaguy.elitemobs.utils.DialogArmorStand; +import org.bukkit.entity.Entity; +import org.bukkit.util.Vector; + + +public class CriticalStrikesEnchantment extends CustomEnchantment { + + public static String key = "critical_strikes"; + + public CriticalStrikesEnchantment() { + super(key, true); + } + + public static void criticalStrikePopupMessage(Entity entity, Vector offset) { + DialogArmorStand.createDialogArmorStand(entity, CriticalStrikesConfig.getCriticalHitPopup(), offset); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/customenchantments/CustomEnchantment.java b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/CustomEnchantment.java index a5fcc7c61..d65203650 100644 --- a/src/main/java/com/magmaguy/elitemobs/items/customenchantments/CustomEnchantment.java +++ b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/CustomEnchantment.java @@ -1,76 +1,89 @@ package com.magmaguy.elitemobs.items.customenchantments; +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfig; +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; +import com.magmaguy.elitemobs.items.ItemTagger; +import lombok.Getter; import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; -import java.util.List; +import java.util.HashMap; public abstract class CustomEnchantment { - /* - Code here has been maintained as static because the key value is frequently accessed and stores a static value - setKey() and setName() need to be rewritten in every class - */ - - public void initialize() { - - setKey(); - + @Getter + private static final HashMap customEnchantmentMap = new HashMap(); + public final String key; + private final boolean dynamic; + private final EnchantmentsConfigFields enchantmentsConfigFields; + private final Enchantment originalEnchantment = null; + + public CustomEnchantment(String key, boolean dynamic) { + this.key = key; + this.dynamic = dynamic; + this.enchantmentsConfigFields = EnchantmentsConfig.getEnchantment(key + ".yml"); + customEnchantmentMap.put(enchantmentsConfigFields.getFilename(), this); } - /* - Key is used to hide the enchantment in the lore to later ID the item, is independent from name to avoid issues with - config changes invalidating old enchantment names - It's also used as the value to write in for the configuration file - */ - public String key = setKey(); - - public String setKey() { - return "placeholder key"; + public static void initializeCustomEnchantments() { + new FlamethrowerEnchantment(); + new PlasmaBootsEnchantment(); + new HunterEnchantment(); + new CriticalStrikesEnchantment(); + new DrillingEnchantment(); + new IceBreakerEnchantment(); + new MeteorShowerEnchantment(); + new SummonMerchantEnchantment(); + new SummonWolfEnchantment(); + new UnbindEnchantment(); + new LightningEnchantment(); + new GrapplingHookEnchantment(); + new EarthquakeEnchantment(); + new LoudStrikesEnchantment(); + new RepairEnchantment(); + new LuckySourceEnchantment(); + new EnchantedSourceEnchantment(); } - public String getKey() { - return key; - } - - /* - Get the enchantment string for assembling configurations - */ - public String assembleConfigString(int enchantmentLevel) { - return key + "," + enchantmentLevel; + public static boolean isCustomEnchantment(String enchantmentFilename) { + for (CustomEnchantment customEnchantment : customEnchantmentMap.values()) + if (customEnchantment.getKey().equalsIgnoreCase(enchantmentFilename)) + return true; + return false; } /* Check an itemstack has this enchantment */ - public boolean hasCustomEnchantment(ItemStack itemStack) { + public static boolean hasCustomEnchantment(ItemStack itemStack, String key) { if (itemStack == null || itemStack.getType().equals(Material.AIR)) return false; if (!itemStack.hasItemMeta()) return false; if (!itemStack.getItemMeta().hasLore()) return false; - return hasCustomEnchantment(itemStack.getItemMeta().getLore()); + return hasCustomEnchantment(itemStack.getItemMeta(), key); } - public boolean hasCustomEnchantment(List lore) { - return (lore.get(0).replace("§", "").contains(key)); + public static boolean hasCustomEnchantment(ItemMeta itemMeta, String key) { + return ItemTagger.getEnchantment(itemMeta, new NamespacedKey(MetadataHandler.PLUGIN, key)) > 0; } /* Get a custom enchantment's level */ - public int getCustomEnchantmentLevel(ItemStack itemStack) { - if (!itemStack.hasItemMeta()) return 0; - if (!itemStack.getItemMeta().hasLore()) return 0; - return getCustomEnchantmentLevel(itemStack.getItemMeta().getLore()); + public static int getCustomEnchantmentLevel(ItemStack itemStack, String key) { + if (itemStack == null) return 0; + return ItemTagger.getEnchantment(itemStack.getItemMeta(), new NamespacedKey(MetadataHandler.PLUGIN, key)); } - public int getCustomEnchantmentLevel(List lore) { - - for (String string : lore.get(0).replace("§", "").split(",")) - if (string.contains(key)) - return Integer.parseInt(string.split(":")[1]); - - return 0; + public String getKey() { + return key; + } + public EnchantmentsConfigFields getEnchantmentsConfigFields() { + return enchantmentsConfigFields; } } diff --git a/src/main/java/com/magmaguy/elitemobs/items/customenchantments/CustomEnchantmentCache.java b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/CustomEnchantmentCache.java deleted file mode 100644 index 791d7aa34..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/customenchantments/CustomEnchantmentCache.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.magmaguy.elitemobs.items.customenchantments; - -public class CustomEnchantmentCache { - - /* - In order to implement use inheritance the custom enchantments can't be static - However, accessing the data stored in them benefits from static access, as ultimately the custom enchantments just - store a bunch on unchanging values - Hence, static access to these basically final values is provided in this class. - It also prevents issues related with having to re-initialize the values every time an instance of the method is invoked. - There's probably a better way of doing this, but I don't know it. If you do, let me know. - */ - - public static FlamethrowerEnchantment flamethrowerEnchantment = new FlamethrowerEnchantment(); - public static HunterEnchantment hunterEnchantment = new HunterEnchantment(); - -// Necessary for registering the config keys and item names, needs to run before items get constructed - public static void initialize(){ - - flamethrowerEnchantment.initialize(); - hunterEnchantment.initialize(); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/customenchantments/DrillingEnchantment.java b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/DrillingEnchantment.java new file mode 100644 index 000000000..693660bae --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/DrillingEnchantment.java @@ -0,0 +1,224 @@ +package com.magmaguy.elitemobs.items.customenchantments; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfig; +import com.magmaguy.elitemobs.items.ItemTagger; +import com.magmaguy.elitemobs.utils.EventCaller; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.Vector; + +import java.util.HashSet; +import java.util.Set; + +public class DrillingEnchantment extends CustomEnchantment { + + public static String key = "drilling"; + + public DrillingEnchantment() { + super(key, false); + } + + public static class DrillingEnchantmentEvents implements Listener { + private static final Set activePlayers = new HashSet<>(); + private Material material = null; + private ItemStack itemStack = null; + private MiningDirection miningDirection = null; + private Player player; + + @EventHandler(priority = EventPriority.HIGHEST) + public void onDig(BlockBreakEvent event) { + if (event.isCancelled()) return; + if (!event.getPlayer().getInventory().getItemInMainHand().hasItemMeta() || + event.getPlayer().getInventory().getItemInMainHand().getItemMeta() == null) return; + if (!ItemTagger.hasEnchantment(event.getPlayer().getInventory().getItemInMainHand().getItemMeta(), new NamespacedKey(MetadataHandler.PLUGIN, key))) + return; + if (event.getPlayer().isSneaking()) return; + if (!EnchantmentsConfig.getEnchantment("drilling.yml").isEnabled()) return; + if (activePlayers.contains(event.getPlayer())) return; + + drillBlocks(event.getBlock(), + ItemTagger.getEnchantment(event.getPlayer().getInventory().getItemInMainHand().getItemMeta(), new NamespacedKey(MetadataHandler.PLUGIN, key)), + event.getPlayer().getLocation(), + event.getPlayer().getInventory().getItemInMainHand(), + event.getPlayer()); + + } + + private void drillBlocks(Block originalBlock, int enchantmentLevel, Location playerLocation, ItemStack playerItem, Player player) { + + this.player = player; + this.material = originalBlock.getType(); + this.itemStack = playerItem; + this.miningDirection = determineDirection(originalBlock.getLocation(), playerLocation); + + activePlayers.add(player); + + switch (enchantmentLevel) { + case 1: + drillLevel1(originalBlock); + break; + case 2: + drillLevel2(originalBlock); + break; + case 3: + drillLevel3(originalBlock); + drillLevel2(drillLevel1(originalBlock)); + break; + case 4: + drillLevel3(originalBlock); + drillLevel3(drillLevel1(originalBlock)); + drillLevel2(drillLevel1(drillLevel1(originalBlock))); + break; + case 5: + default: + drillLevel3(originalBlock); + drillLevel3(drillLevel1(originalBlock)); + drillLevel3(drillLevel1(drillLevel1(originalBlock))); + } + + activePlayers.remove(player); + + } + + private MiningDirection determineDirection(Location blockLocation, Location playerLocation) { + + Location adjustedPlayerLocation = playerLocation.clone().add(new Vector(0, 1, 0)); + Location adjustedBlockLocation = blockLocation.clone().add(new Vector(0.5, 0.5, 0.5)); + + Vector directionVector = adjustedBlockLocation.clone().subtract(adjustedPlayerLocation).toVector().normalize(); + + double x = directionVector.getX(); + double y = directionVector.getY(); + double z = directionVector.getZ(); + + if (Math.abs(y) > 0.9) { + if (y > 0) + return MiningDirection.UP; + else + return MiningDirection.DOWN; + } + + if (Math.abs(x) > Math.abs(z)) { + if (x > 0) + return MiningDirection.EAST; + else + return MiningDirection.WEST; + } + + if (z > 0) + return MiningDirection.NORTH; + + return MiningDirection.SOUTH; + + } + + private Block processBlock(Block originalBlock, Vector addedVector) { + if (originalBlock == null) return null; + Block finalBlock = originalBlock.getWorld().getBlockAt(originalBlock.getLocation().clone().add(addedVector)); + if (!this.material.equals(finalBlock.getType())) return finalBlock; + + BlockBreakEvent blockBreakEvent = new BlockBreakEvent(finalBlock, player); + new EventCaller(blockBreakEvent); + if (blockBreakEvent.isCancelled()) return null; + + finalBlock.breakNaturally(this.itemStack); + return finalBlock; + } + + private Block drillLevel1(Block originalBlock) { + + switch (miningDirection) { + case NORTH: + return processBlock(originalBlock, new Vector(0, 0, 1)); + case SOUTH: + return processBlock(originalBlock, new Vector(0, 0, -1)); + case EAST: + return processBlock(originalBlock, new Vector(1, 0, 0)); + case WEST: + return processBlock(originalBlock, new Vector(-1, 0, 0)); + case UP: + return processBlock(originalBlock, new Vector(0, 1, 0)); + case DOWN: + return processBlock(originalBlock, new Vector(0, -1, 0)); + default: + return null; + } + + } + + private void drillLevel2(Block originalBlock) { + + switch (miningDirection) { + case NORTH: + case SOUTH: + processBlock(originalBlock, new Vector(0, 1, 0)); + processBlock(originalBlock, new Vector(0, -1, 0)); + processBlock(originalBlock, new Vector(1, 0, 0)); + processBlock(originalBlock, new Vector(-1, 0, 0)); + break; + case EAST: + case WEST: + processBlock(originalBlock, new Vector(0, 1, 0)); + processBlock(originalBlock, new Vector(0, -1, 0)); + processBlock(originalBlock, new Vector(0, 0, 1)); + processBlock(originalBlock, new Vector(0, 0, -1)); + break; + case UP: + case DOWN: + processBlock(originalBlock, new Vector(1, 0, 0)); + processBlock(originalBlock, new Vector(-1, 0, 0)); + processBlock(originalBlock, new Vector(0, 0, 1)); + processBlock(originalBlock, new Vector(0, 0, -1)); + break; + } + + } + + private void drillLevel3(Block originalBlock) { + + switch (miningDirection) { + case NORTH: + case SOUTH: + for (int x = -1; x < 2; x++) + for (int y = -1; y < 2; y++) + if (!(x == 0 && y == 0)) + processBlock(originalBlock, new Vector(x, y, 0)); + break; + case EAST: + case WEST: + for (int y = -1; y < 2; y++) + for (int z = -1; z < 2; z++) + if (!(y == 0 && z == 0)) + processBlock(originalBlock, new Vector(0, y, z)); + break; + case UP: + case DOWN: + for (int x = -1; x < 2; x++) + for (int z = -1; z < 2; z++) + if (!(x == 0 && z == 0)) + processBlock(originalBlock, new Vector(x, 0, z)); + break; + } + + } + + private enum MiningDirection { + UP, + DOWN, + NORTH, + SOUTH, + EAST, + WEST + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/customenchantments/EarthquakeEnchantment.java b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/EarthquakeEnchantment.java new file mode 100644 index 000000000..7e3553b1e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/EarthquakeEnchantment.java @@ -0,0 +1,101 @@ +package com.magmaguy.elitemobs.items.customenchantments; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.enchantments.premade.EarthquakeConfig; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.playerdata.ElitePlayerInventory; +import org.bukkit.Bukkit; +import org.bukkit.Color; +import org.bukkit.Particle; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerToggleSneakEvent; +import org.bukkit.util.Vector; + +import java.util.HashSet; +import java.util.UUID; +import java.util.concurrent.ThreadLocalRandom; + +public class EarthquakeEnchantment extends CustomEnchantment { + public static String key = "earthquake"; + + public EarthquakeEnchantment() { + super(key, false); + } + + public static void doEarthquakeEnchantment(int earthquakeLevel, Player player) { + player.sendMessage(EarthquakeConfig.getEarthquakeActivationMessage()); + player.setVelocity(player.getLocation().getDirection().normalize().multiply((Math.log(earthquakeLevel + 2 / 2D) + 1) / 20D).setY(Math.log(earthquakeLevel + 2 / 2D))); + Bukkit.getScheduler().runTaskTimer(MetadataHandler.PLUGIN, (task) -> { + player.setFallDistance(0f); + if (!player.isValid() || !player.getLocation().clone().subtract(new Vector(0, 1, 0)).getBlock().isPassable() + && player.getLocation().getY() - player.getLocation().getBlock().getY() < 0.1 || !player.getLocation().clone().getBlock().isPassable()) { + task.cancel(); + doLanding(earthquakeLevel, player); + return; + } + player.getWorld().spawnParticle(Particle.DUST, player.getLocation().getX(), player.getLocation().getY(), player.getLocation().getZ(), + 20, 0.1, 0.1, 0.1, 1, new Particle.DustOptions(Color.fromRGB( + ThreadLocalRandom.current().nextInt(80, 100), + ThreadLocalRandom.current().nextInt(20, 40), + ThreadLocalRandom.current().nextInt(10, 20) + ), 1)); + }, 5, 1); + } + + public static void doLanding(int level, Player player) { + double distance = Math.log(level + 2 / 2D) * 3; + for (Entity entity : player.getNearbyEntities(distance, distance, distance)) { + if (entity instanceof LivingEntity) { + if (entity.getType().equals(EntityType.PLAYER)) continue; + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(entity); + if (eliteEntity == null) { + try { + entity.setVelocity(entity.getLocation().subtract(player.getLocation()).toVector().normalize().setY(.3).multiply(distance / 2d)); + } catch (Exception e) { + //non finite values, doesn't really matter + } + } else { + entity.setVelocity(entity.getLocation().subtract(player.getLocation()).toVector().normalize().setY(.3) + .multiply((distance / 2d) / (eliteEntity.getLevel() * eliteEntity.getHealthMultiplier()))); + } + } + } + } + + public static class EarthquakeEnchantmentEvents implements Listener { + private static final HashSet players = new HashSet<>(); + private static final HashSet cooldownPlayers = new HashSet<>(); + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + public void onSneak(PlayerToggleSneakEvent event) { + if (!event.isSneaking()) return; + if (event.getPlayer().isFlying()) return; + if (cooldownPlayers.contains(event.getPlayer().getUniqueId())) return; + //todo: don't check this event if the power is disabled + if (ElitePlayerInventory.playerInventories.get(event.getPlayer().getUniqueId()) == null) return; + double earthquakeLevel = ElitePlayerInventory.playerInventories.get(event.getPlayer().getUniqueId()).getEarthquakeLevel(true); + if (earthquakeLevel < 1) return; + if (!players.contains(event.getPlayer().getUniqueId())) { + players.add(event.getPlayer().getUniqueId()); + Bukkit.getScheduler().runTaskLater(MetadataHandler.PLUGIN, (task) -> players.remove(event.getPlayer().getUniqueId()), 10); + return; + } + players.remove(event.getPlayer().getUniqueId()); + cooldownPlayers.add(event.getPlayer().getUniqueId()); + Bukkit.getScheduler().runTaskLater(MetadataHandler.PLUGIN, (task) -> { + event.getPlayer().sendMessage(EarthquakeConfig.getEarthquakeAvailableMessage()); + cooldownPlayers.remove(event.getPlayer().getUniqueId()); + }, 20L * 60 * 2); + + doEarthquakeEnchantment((int) earthquakeLevel, event.getPlayer()); + + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/customenchantments/EnchantedSourceEnchantment.java b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/EnchantedSourceEnchantment.java new file mode 100644 index 000000000..c726afa8f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/EnchantedSourceEnchantment.java @@ -0,0 +1,9 @@ +package com.magmaguy.elitemobs.items.customenchantments; + +public class EnchantedSourceEnchantment extends CustomEnchantment { + public static String key = "enchanted_source"; + + public EnchantedSourceEnchantment() { + super(key, false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/customenchantments/FlamethrowerEnchantment.java b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/FlamethrowerEnchantment.java index bca993415..91f205f2b 100644 --- a/src/main/java/com/magmaguy/elitemobs/items/customenchantments/FlamethrowerEnchantment.java +++ b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/FlamethrowerEnchantment.java @@ -1,7 +1,16 @@ package com.magmaguy.elitemobs.items.customenchantments; -import com.magmaguy.elitemobs.events.mobs.ZombieKing; -import com.magmaguy.elitemobs.utils.Cooldown; +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfig; +import com.magmaguy.elitemobs.events.BossCustomAttackDamage; +import com.magmaguy.elitemobs.playerdata.ElitePlayerInventory; +import com.magmaguy.elitemobs.utils.CooldownHandler; +import org.apache.commons.math3.exception.NotFiniteNumberException; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -10,41 +19,161 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; -public class FlamethrowerEnchantment extends CustomEnchantment implements Listener { +public class FlamethrowerEnchantment extends CustomEnchantment { - public String setKey() { - return "FLAMETHROWER"; + private static final List playersUsingFlamethrower = new ArrayList<>(); + public static String key = "flamethrower"; + + public FlamethrowerEnchantment() { + super(key, false); + } + + private static List generateDamagePoints(Player player, Location fixedPlayerLocation) { + List locations = new ArrayList<>(); + Location eliteMobLocation = player.getLocation().clone(); + Vector toPlayerVector = fixedPlayerLocation.clone().subtract(eliteMobLocation).toVector().normalize().multiply(0.5); + for (int i = 0; i < 40; i++) + locations.add(eliteMobLocation.add(toPlayerVector).clone()); + return locations; } - private static ArrayList playersUsingFlamethrower = new ArrayList<>(); + private static void doDamage(List locations, Player player) { + for (Location location : locations) + try { + for (Entity entity : location.getWorld().getNearbyEntities(location, 0.5, 0.5, 0.5)) + if (entity instanceof LivingEntity) { + if (entity.getType().equals(EntityType.PLAYER)) continue; + if (((LivingEntity) entity).hasPotionEffect(PotionEffectType.FIRE_RESISTANCE)) continue; + BossCustomAttackDamage.dealCustomDamage(player, (LivingEntity) entity, ElitePlayerInventory.playerInventories.get(player.getUniqueId()).getWeaponLevel(false)); + } + } catch (NotFiniteNumberException e) { + //don't really know why this happens, also doesn't really seem to matter. Seems like an internal MC or API issue.s + } - @EventHandler - public void onIteract(PlayerInteractEvent event) { + } - Player player = event.getPlayer(); - if (!(event.getAction().equals(Action.RIGHT_CLICK_BLOCK) || event.getAction().equals(Action.RIGHT_CLICK_AIR))) - return; + public static class FlamethrowerEnchantmentEvents implements Listener { - if (playersUsingFlamethrower.contains(player)) return; + @EventHandler + public void onInteract(PlayerInteractEvent event) { - ItemStack zombieKingAxe = player.getInventory().getItemInMainHand(); + if (!EnchantmentsConfig.getEnchantment("flamethrower.yml").isEnabled()) return; - if (hasCustomEnchantment(zombieKingAxe)) { + Player player = event.getPlayer(); - if (zombieKingAxe.getDurability() + 4 > zombieKingAxe.getType().getMaxDurability()) { + if (!(event.getAction().equals(Action.RIGHT_CLICK_BLOCK) || event.getAction().equals(Action.RIGHT_CLICK_AIR))) return; - } else zombieKingAxe.setDurability((short) (zombieKingAxe.getDurability() + 4)); - ZombieKing.initializeFlamethrower(player.getLocation(), player.getLocation().getDirection(), player, true); - Cooldown.initialize(playersUsingFlamethrower, player, 3 * 60); - player.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 3 * 20, 5)); + if (playersUsingFlamethrower.contains(player)) return; + + ItemStack zombieKingAxe = player.getInventory().getItemInMainHand(); + + if (hasCustomEnchantment(zombieKingAxe, "flamethrower")) { + + if (zombieKingAxe.getDurability() + 4 > zombieKingAxe.getType().getMaxDurability()) { + return; + } else zombieKingAxe.setDurability((short) (zombieKingAxe.getDurability() + 4)); + + + doFlamethrowerPhase1(player, player.getTargetBlock(null, 30).getLocation().clone().add(0.5, 1, 0.5)); + CooldownHandler.initialize(playersUsingFlamethrower, player, 3 * 60); + player.addPotionEffect(new PotionEffect(PotionEffectType.SLOWNESS, 5 * 20, 20)); + + } + + } + + private void doFlamethrowerPhase1(Player player, Location targetLocation) { + + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + + if (!player.isValid() || !player.getLocation().getWorld().equals(targetLocation.getWorld())) { + cancel(); + return; + } + + doParticleEffect(player, targetLocation, Particle.SMOKE); + counter++; + + if (counter < 20) return; + doFlamethrowerPhase2(player, targetLocation); + cancel(); + + } + + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); } + private void doParticleEffect(Player player, Location target, Particle particle) { + if (!player.getWorld().equals(target.getWorld())) return; + Vector directionVector = target.clone().subtract(player.getLocation()).toVector().normalize(); + for (int i = 0; i < 5; i++) { + player.getWorld().spawnParticle(particle, player.getEyeLocation().clone().add(directionVector.getX(), -0.5, directionVector.getZ()), 0, (ThreadLocalRandom.current().nextDouble() - 0.5) * 0.1 + directionVector.getX(), (ThreadLocalRandom.current().nextDouble() - 0.5) * 0.1 + directionVector.getY(), (ThreadLocalRandom.current().nextDouble() - 0.5) * 0.1 + directionVector.getZ(), ThreadLocalRandom.current().nextDouble() + 0.05); + } + } + + /** + * Damage phase + * + * @param player + */ + private void doFlamethrowerPhase2(Player player, Location target) { + List damagePoints = generateDamagePoints(player, target); + new BukkitRunnable() { + int timer = 0; + + @Override + public void run() { + if (!player.isValid() || !player.getLocation().getWorld().equals(target.getWorld())) { + cancel(); + return; + } + doParticleEffect(player, target, Particle.FLAME); + if (timer % 20 == 0) doDamage(damagePoints, player); + timer++; + if (timer < 20 * 3) return; + doFlamethrowerPhase3(player, target); + cancel(); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + + /** + * Cooldown phase + * + * @param player + */ + private void doFlamethrowerPhase3(Player player, Location fixedPlayerLocation) { + new BukkitRunnable() { + int timer = 0; + + @Override + public void run() { + if (!player.isValid() || !player.getLocation().getWorld().equals(fixedPlayerLocation.getWorld())) { + cancel(); + return; + } + timer++; + doParticleEffect(player, fixedPlayerLocation, Particle.SMOKE); + if (timer < 20) return; + cancel(); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } } } diff --git a/src/main/java/com/magmaguy/elitemobs/items/customenchantments/GrapplingHookEnchantment.java b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/GrapplingHookEnchantment.java new file mode 100644 index 000000000..67c506906 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/GrapplingHookEnchantment.java @@ -0,0 +1,108 @@ +package com.magmaguy.elitemobs.items.customenchantments; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.items.ItemTagger; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.AbstractArrow; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityShootBowEvent; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +public class GrapplingHookEnchantment extends CustomEnchantment { + public static String key = "grappling_hook"; + + public GrapplingHookEnchantment() { + super(key, false); + } + + public static boolean isGrapplingHookProjectile(ItemMeta itemMeta) { + return ItemTagger.getEnchantment(itemMeta, key) > 0; + } + + public static void trackGrapplingHook(AbstractArrow arrow, Player player) { + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + if (counter > 20 * 10 || arrow.isInBlock()) { + if (arrow.getAttachedBlock() != null) { + Location targetBlock = getTargetBlock(arrow.getLocation()); + if (targetBlock != null) { + zipline(player, arrow.getAttachedBlock().getRelative(arrow.getFacing()).getLocation().add(new Vector(0.5, 0.5, 0.5))); + arrow.setPickupStatus(AbstractArrow.PickupStatus.DISALLOWED); + } + } + cancel(); + return; + } + counter++; + } + }.runTaskTimer(MetadataHandler.PLUGIN, 1, 1); + } + + private static void zipline(Player player, Location location) { + player.addPotionEffect(new PotionEffect(PotionEffectType.LEVITATION, 20 * 10, 1)); + new BukkitRunnable() { + int timer = 0; + + @Override + public void run() { + if (timer > 20 * 10 || player.getLocation().distance(location) < 1) { + player.setGravity(true); + player.removePotionEffect(PotionEffectType.LEVITATION); + player.addPotionEffect(new PotionEffect(PotionEffectType.SLOW_FALLING, 20 * 3, 1)); + cancel(); + return; + } + player.setVelocity(location.clone().subtract(player.getLocation()).toVector().normalize().multiply(.5)); + timer++; + } + }.runTaskTimer(MetadataHandler.PLUGIN, 1L, 1L); + } + + private static Location getTargetBlock(Location airLocation) { + if (checkBlock(airLocation)) return airLocation; + Location up = airLocation.clone().add(new Vector(0, 1, 0)); + if (checkBlock(up)) return up; + Location down = airLocation.clone().add(new Vector(0, -1, 0)); + if (checkBlock(down)) return down; + Location front = airLocation.clone().add(new Vector(1, 0, 0)); + if (checkBlock(front)) return front; + Location back = airLocation.clone().add(new Vector(-1, 0, 0)); + if (checkBlock(back)) return back; + Location left = airLocation.clone().add(new Vector(0, 0, 1)); + if (checkBlock(left)) return left; + Location right = airLocation.clone().add(new Vector(0, 0, -1)); + if (checkBlock(right)) return right; + return null; + } + + private static boolean checkBlock(Location location) { + return location.getBlock().getType().equals(Material.TARGET); + } + + public static class GrapplingHookEnchantmentEvents implements Listener { + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onArrowFire(EntityShootBowEvent event) { + if (!(event.getEntity() instanceof Player)) return; + if (!event.getProjectile().getType().equals(EntityType.ARROW) && + !event.getProjectile().getType().equals(EntityType.SPECTRAL_ARROW)) return; + if (event.getConsumable() == null || !isGrapplingHookProjectile(event.getConsumable().getItemMeta())) + return; + ((AbstractArrow) event.getProjectile()).setBounce(false); + event.getEntity().setLeashHolder(event.getEntity()); + trackGrapplingHook((AbstractArrow) event.getProjectile(), (Player) event.getEntity()); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/customenchantments/HunterEnchantment.java b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/HunterEnchantment.java index 893b7a639..a32a1b0d8 100644 --- a/src/main/java/com/magmaguy/elitemobs/items/customenchantments/HunterEnchantment.java +++ b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/HunterEnchantment.java @@ -1,9 +1,23 @@ package com.magmaguy.elitemobs.items.customenchantments; +import com.magmaguy.elitemobs.playerdata.ElitePlayerInventory; +import org.bukkit.entity.Player; + +import java.util.List; + public class HunterEnchantment extends CustomEnchantment { - public String setKey() { - return "HUNTER"; + public static String key = "hunter"; + + public HunterEnchantment() { + super(key, false); + } + + public static double getHuntingGearBonus(List players) { + double huntingGearChanceAdder = 0; + for (Player player : players) + huntingGearChanceAdder += ElitePlayerInventory.playerInventories.get(player.getUniqueId()).getHunterChance(true); + return huntingGearChanceAdder; } } diff --git a/src/main/java/com/magmaguy/elitemobs/items/customenchantments/IceBreakerEnchantment.java b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/IceBreakerEnchantment.java new file mode 100644 index 000000000..39413b3d8 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/IceBreakerEnchantment.java @@ -0,0 +1,95 @@ +package com.magmaguy.elitemobs.items.customenchantments; + +import org.bukkit.FluidCollisionMode; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.Vector; + +public class IceBreakerEnchantment extends CustomEnchantment { + + public static String key = "ice_breaker"; + + public IceBreakerEnchantment() { + super(key, false); + } + + private static boolean isValidBlock(Block block) { + if (block == null) + return false; + Material material = block.getType(); + return material.equals(Material.WATER) || + material.equals(Material.ICE) || + material.equals(Material.BLUE_ICE) || + material.equals(Material.FROSTED_ICE) || + material.equals(Material.PACKED_ICE); + } + + private static void freezeBlocks(Block block, ItemStack itemStack) { + switch (getCustomEnchantmentLevel(itemStack, key)) { + case 1: + freezeBlocks1(block, itemStack); + break; + case 2: + default: + freezeBlocks2(block, itemStack); + break; + } + } + + private static void freezeBlocks1(Block block, ItemStack itemStack) { + parseBlock(block, 0, 0, 0, itemStack); + } + + private static void freezeBlocks2(Block block, ItemStack itemStack) { + parseBlock(block, 0, 0, 0, itemStack); + parseBlock(block, 1, 0, 0, itemStack); + parseBlock(block, -1, 0, 0, itemStack); + parseBlock(block, 0, 1, 0, itemStack); + parseBlock(block, 0, -1, 0, itemStack); + parseBlock(block, 0, 0, 1, itemStack); + parseBlock(block, 0, 0, -1, itemStack); + } + + private static void parseBlock(Block block, int x, int y, int z, ItemStack itemStack) { + Block newBlock = block.getLocation().clone().add(new Vector(x, y, z)).getBlock(); + if (!newBlock.getType().equals(Material.WATER)) + return; + + newBlock.setType(Material.ICE); + itemStack.setDurability((short) (itemStack.getDurability() + 1)); + } + + public static class IceBreakerEnchantmentEvent implements Listener { + + @EventHandler + public void onInteract(PlayerInteractEvent event) { + ItemStack mainHandItem = event.getPlayer().getInventory().getItemInMainHand(); + if (!hasCustomEnchantment(mainHandItem, IceBreakerEnchantment.key)) return; + + if (event.getPlayer().rayTraceBlocks(6, FluidCollisionMode.ALWAYS) == null) return; + + Block block = event.getPlayer().rayTraceBlocks(6, FluidCollisionMode.ALWAYS).getHitBlock(); + + if (!isValidBlock(block)) return; + + freezeBlocks(block, mainHandItem); + } + + @EventHandler + public void onMine(BlockBreakEvent event) { + if (event.isCancelled()) return; + if (!isValidBlock(event.getBlock())) return; + ItemStack mainHandItem = event.getPlayer().getInventory().getItemInMainHand(); + if (!hasCustomEnchantment(mainHandItem, IceBreakerEnchantment.key)) return; + freezeBlocks(event.getBlock(), mainHandItem); + event.getBlock().setType(Material.AIR); + } + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/customenchantments/LightningEnchantment.java b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/LightningEnchantment.java new file mode 100644 index 000000000..9751f1e20 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/LightningEnchantment.java @@ -0,0 +1,63 @@ +package com.magmaguy.elitemobs.items.customenchantments; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.collateralminecraftchanges.LightningSpawnBypass; +import com.magmaguy.elitemobs.config.enchantments.premade.LightningConfig; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.playerdata.ElitePlayerInventory; +import com.magmaguy.elitemobs.utils.EventCaller; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.damage.DamageSource; +import org.bukkit.damage.DamageType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; + +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; +import java.util.concurrent.ThreadLocalRandom; + +public class LightningEnchantment extends CustomEnchantment { + public static final String key = "lightning"; + + public LightningEnchantment() { + super(key, false); + } + + public static void playerLightning(Player player, Location location) { + LightningSpawnBypass.bypass(); + Objects.requireNonNull(location.getWorld()).strikeLightningEffect(location); + location.getWorld().getNearbyEntities(location, 2.5, 2.5, 2.5).forEach((entity -> { + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(entity); + if (eliteEntity == null) return; + double damage = ElitePlayerInventory.playerInventories.get(player.getUniqueId()).getWeaponLevel(true) * 2.5; + EliteMobDamagedByPlayerEvent.EliteMobDamagedByPlayerEventFilter.bypass = true; + EntityDamageByEntityEvent entityDamageByEntityEvent = new EntityDamageByEntityEvent(player, eliteEntity.getLivingEntity(), EntityDamageEvent.DamageCause.CUSTOM, DamageSource.builder(DamageType.MOB_ATTACK).build(), damage); + new EventCaller(entityDamageByEntityEvent); + })); + } + + public static class LightningEnchantmentEvents implements Listener { + private static final Set playersInCooldown = new HashSet<>(); + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + public void onEntityDamagedByPlayer(EliteMobDamagedByPlayerEvent event) { + if (event.getPlayer().hasMetadata("NPC") || + !ElitePlayerInventory.playerInventories.containsKey(event.getPlayer().getUniqueId())) return; + if (playersInCooldown.contains(event.getPlayer())) return; + double lightningChance = ElitePlayerInventory.playerInventories.get(event.getPlayer().getUniqueId()).getLightningChance(true); + if (lightningChance <= 0) return; + if (lightningChance >= ThreadLocalRandom.current().nextDouble()) return; + playersInCooldown.add(event.getPlayer()); + Bukkit.getScheduler().runTaskLater(MetadataHandler.PLUGIN, () -> playersInCooldown.remove(event.getPlayer()), LightningConfig.minimumCooldown * 20L); + playerLightning(event.getPlayer(), event.getEliteMobEntity().getLivingEntity().getLocation()); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/customenchantments/LoudStrikesEnchantment.java b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/LoudStrikesEnchantment.java new file mode 100644 index 000000000..8555111b1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/LoudStrikesEnchantment.java @@ -0,0 +1,9 @@ +package com.magmaguy.elitemobs.items.customenchantments; + +public class LoudStrikesEnchantment extends CustomEnchantment { + public static String key = "loud_strikes"; + + public LoudStrikesEnchantment() { + super(key, false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/customenchantments/LuckySourceEnchantment.java b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/LuckySourceEnchantment.java new file mode 100644 index 000000000..70a3955ef --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/LuckySourceEnchantment.java @@ -0,0 +1,9 @@ +package com.magmaguy.elitemobs.items.customenchantments; + +public class LuckySourceEnchantment extends CustomEnchantment { + public static String key = "lucky_source"; + + public LuckySourceEnchantment() { + super(key, false); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/customenchantments/MeteorShowerEnchantment.java b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/MeteorShowerEnchantment.java new file mode 100644 index 000000000..d4899d964 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/MeteorShowerEnchantment.java @@ -0,0 +1,90 @@ +package com.magmaguy.elitemobs.items.customenchantments; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.items.ItemTagger; +import org.bukkit.Location; +import org.bukkit.NamespacedKey; +import org.bukkit.Particle; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Fireball; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.concurrent.ThreadLocalRandom; + +public class MeteorShowerEnchantment extends CustomEnchantment { + + public static String key = "meteor_shower"; + + public MeteorShowerEnchantment() { + super(key, false); + } + + public static void doMeteorShower(Player player) { + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + + if (!player.isValid()) { + cancel(); + return; + } + + if (counter > 10 * 20) { + cancel(); + return; + } + + counter++; + + doCloudEffect(player.getLocation().clone().add(new Vector(0, 10, 0))); + + if (counter > 2 * 20) { + + doFireballs(player.getLocation().clone().add(new Vector(0, 10, 0)), player); + + } + + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + private static void doCloudEffect(Location location) { + for (int i = 0; i < 1; i++) { + int randX = ThreadLocalRandom.current().nextInt(30) - 15; + int randY = ThreadLocalRandom.current().nextInt(2); + int randZ = ThreadLocalRandom.current().nextInt(30) - 15; + Location newLocation = location.clone().add(new Vector(randX, randY, randZ)); + location.getWorld().spawnParticle(Particle.EXPLOSION, newLocation, 1, 0, 0, 0, 0); + } + } + + private static void doFireballs(Location location, Player player) { + for (int i = 0; i < 1; i++) { + int randX = ThreadLocalRandom.current().nextInt(30) - 15; + int randY = ThreadLocalRandom.current().nextInt(2); + int randZ = ThreadLocalRandom.current().nextInt(30) - 15; + Location newLocation = location.clone().add(new Vector(randX, randY, randZ)); + newLocation = newLocation.setDirection(new Vector(ThreadLocalRandom.current().nextDouble() - 0.5, -1, ThreadLocalRandom.current().nextDouble() - 0.5)); + Fireball fireball = (Fireball) location.getWorld().spawnEntity(newLocation, EntityType.FIREBALL); + fireball.setShooter(player); + } + } + + public static class MeteorShowerEvents implements Listener { + @EventHandler + public void onInteract(PlayerInteractEvent event) { + int meteorShower = ItemTagger.getEnchantment(event.getPlayer().getInventory().getItemInMainHand().getItemMeta(), new NamespacedKey(MetadataHandler.PLUGIN, MeteorShowerEnchantment.key)); + if (meteorShower < 1) return; + event.getItem().setAmount(event.getItem().getAmount() - 1); + MeteorShowerEnchantment.doMeteorShower(event.getPlayer()); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/customenchantments/PlasmaBootsEnchantment.java b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/PlasmaBootsEnchantment.java new file mode 100644 index 000000000..c1cd9a0b2 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/PlasmaBootsEnchantment.java @@ -0,0 +1,138 @@ +package com.magmaguy.elitemobs.items.customenchantments; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.playerdata.ElitePlayerInventory; +import org.bukkit.Bukkit; +import org.bukkit.Color; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerToggleSneakEvent; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.HashSet; +import java.util.Objects; +import java.util.UUID; +import java.util.concurrent.ThreadLocalRandom; + +public class PlasmaBootsEnchantment extends CustomEnchantment { + public static String key = "plasma_boots"; + + public PlasmaBootsEnchantment() { + super(key, false); + } + + public static void doPlasmaBootsEnchantment(int level, Player player) { + player.setVelocity(new Vector(0, .8, 0)); + Bukkit.getScheduler().runTaskTimer(MetadataHandler.PLUGIN, (task) -> { + if (!player.isValid() || !player.getLocation().clone().subtract(new Vector(0, 1, 0)).getBlock().isPassable() + && player.getLocation().getY() - player.getLocation().getBlock().getY() < 0.1 || !player.getLocation().clone().getBlock().isPassable()) { + task.cancel(); + doLanding(level, player); + return; + } + player.getWorld().spawnParticle(Particle.DUST, player.getLocation().getX(), player.getLocation().getY(), player.getLocation().getZ(), + 20, 0.1, 0.1, 0.1, 1, new Particle.DustOptions(Color.fromRGB( + ThreadLocalRandom.current().nextInt(0, 100), + ThreadLocalRandom.current().nextInt(122, 255), + ThreadLocalRandom.current().nextInt(0, 100) + ), 1)); + }, 5, 1); + } + + private static void doLanding(int level, Player player) { + for (int i = 1; i < level + 1; i++) + doProjectileArray(i, player); + } + + private static void doProjectileArray(int level, Player player) { + double height = (level + .2 - 1) / 2; + Vector vector = new Vector(1, height, 0); + for (int i = 0; i < 8; i++) { + Vector offsetVector = vector.rotateAroundY(i * Math.PI / 4); + Location shotLocation = player.getLocation().clone().add(offsetVector); + Vector shotVector = shotLocation.clone().subtract(player.getLocation()).toVector().normalize().multiply(0.2); + createProjectile(shotVector, shotLocation, player); + } + } + + private static void createProjectile(Vector shotVector, Location sourceLocation, Player player) { + new BukkitRunnable() { + final Location currentLocation = sourceLocation.clone(); + int counter = 0; + + @Override + public void run() { + if (counter > 20 * 3) { + cancel(); + return; + } + counter++; + for (Entity entity : Objects.requireNonNull(currentLocation.getWorld()) + .getNearbyEntities(currentLocation, 0.1, 0.1, 0.1)) { + if (!(entity instanceof LivingEntity)) continue; + if (entity.getType().equals(EntityType.PLAYER)) continue; + cancel(); + doDamage(player, (LivingEntity) entity); + break; + } + + doVisualEffect(currentLocation); + + currentLocation.add(shotVector); + if (!currentLocation.getBlock().isPassable()) { + cancel(); + } + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + private static void doDamage(Player player, LivingEntity livingEntity) { + livingEntity.damage(2, player); + } + + private static void doVisualEffect(Location currentLocation) { + Objects.requireNonNull(currentLocation.getWorld()) + .spawnParticle(Particle.DUST, currentLocation.getX(), currentLocation.getY(), currentLocation.getZ(), + 5, 0.1, 0.1, 0.1, 1, new Particle.DustOptions(Color.fromRGB( + ThreadLocalRandom.current().nextInt(0, 100), + ThreadLocalRandom.current().nextInt(122, 255), + ThreadLocalRandom.current().nextInt(0, 100)), + 1)); + } + + public static class PlasmaBootsEnchantmentEvents implements Listener { + private static final HashSet players = new HashSet<>(); + private static final HashSet cooldownPlayers = new HashSet<>(); + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + public void onSneak(PlayerToggleSneakEvent event) { + if (!event.isSneaking()) return; + if (event.getPlayer().isFlying()) return; + if (cooldownPlayers.contains(event.getPlayer().getUniqueId())) return; + //todo: don't check this event if the power is disabled + if (ElitePlayerInventory.playerInventories.get(event.getPlayer().getUniqueId()) == null) return; + double plasmaBootLevel = ElitePlayerInventory.playerInventories.get(event.getPlayer().getUniqueId()).getPlasmaBootsLevel(true); + if (plasmaBootLevel < 1) return; + if (!players.contains(event.getPlayer().getUniqueId())) { + players.add(event.getPlayer().getUniqueId()); + Bukkit.getScheduler().runTaskLater(MetadataHandler.PLUGIN, task -> players.remove(event.getPlayer().getUniqueId()), 10); + return; + } + players.remove(event.getPlayer().getUniqueId()); + cooldownPlayers.add(event.getPlayer().getUniqueId()); + Bukkit.getScheduler().runTaskLater(MetadataHandler.PLUGIN, task -> cooldownPlayers.remove(event.getPlayer().getUniqueId()), 20L * 60 * 2); + + doPlasmaBootsEnchantment((int) plasmaBootLevel, event.getPlayer()); + + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/customenchantments/RepairEnchantment.java b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/RepairEnchantment.java new file mode 100644 index 000000000..e5a762f7c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/RepairEnchantment.java @@ -0,0 +1,50 @@ +package com.magmaguy.elitemobs.items.customenchantments; + +import com.magmaguy.elitemobs.api.utils.EliteItemManager; +import com.magmaguy.elitemobs.items.ItemTagger; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +public class RepairEnchantment extends CustomEnchantment { + public static String key = "repair"; + + public RepairEnchantment() { + super(key, false); + } + + public static ItemStack generateScrap(ItemStack itemToScrap, Player player, EliteEntity eliteEntity) { + int tier = EliteItemManager.getRoundedItemLevel(itemToScrap); + int scrapLevel; + if (tier < 50) scrapLevel = 1; + else if (tier < 100) scrapLevel = 2; + else if (tier < 150) scrapLevel = 3; + else if (tier < 200) scrapLevel = 4; + else scrapLevel = 5; + CustomItem scrapItem = switch (scrapLevel) { + case 1 -> CustomItem.getCustomItem("elite_scrap_tiny.yml"); + case 2 -> CustomItem.getCustomItem("elite_scrap_small.yml"); + case 3 -> CustomItem.getCustomItem("elite_scrap_medium.yml"); + case 4 -> CustomItem.getCustomItem("elite_scrap_large.yml"); + case 5 -> CustomItem.getCustomItem("elite_scrap_huge.yml"); + default -> CustomItem.getCustomItem("elite_scrap_tiny.yml"); + }; + if (scrapItem == null) { + Logger.warn("Failed to generate scrap! Was the default elite scrap disabled?"); + return null; + } + return scrapItem.generateItemStack(scrapLevel, player, eliteEntity); + } + + public static boolean isRepairItem(ItemStack itemStack) { + if (itemStack == null || itemStack.getItemMeta() == null) return false; + return ItemTagger.hasEnchantment(itemStack.getItemMeta(), RepairEnchantment.key); + } + + public static int getRepairLevel(ItemStack itemStack) { + if (itemStack == null || itemStack.getItemMeta() == null) return 0; + return ItemTagger.getEnchantment(itemStack.getItemMeta(), key); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/customenchantments/SoulbindEnchantment.java b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/SoulbindEnchantment.java new file mode 100644 index 000000000..cf24b7dba --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/SoulbindEnchantment.java @@ -0,0 +1,146 @@ +package com.magmaguy.elitemobs.items.customenchantments; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.adventurersguild.GuildRank; +import com.magmaguy.elitemobs.api.internal.RemovalReason; +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfig; +import com.magmaguy.elitemobs.config.enchantments.premade.SoulbindConfig; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.items.EliteItemLore; +import com.magmaguy.elitemobs.utils.VisualDisplay; +import com.magmaguy.magmacore.util.ChatColorConverter; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.NamespacedKey; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.entity.TextDisplay; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerPickupItemEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataType; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.UUID; + +public class SoulbindEnchantment extends CustomEnchantment { + + public static final NamespacedKey PRESTIGE_KEY = new NamespacedKey(MetadataHandler.PLUGIN, "prestige"); + public static String key = "soulbind"; + public static final NamespacedKey SOULBIND_KEY = new NamespacedKey(MetadataHandler.PLUGIN, key); + public static boolean isEnabled; + + public SoulbindEnchantment() { + super(key, true); + } + + public static ItemStack addEnchantment(ItemStack itemStack, Player player) { + isEnabled = EnchantmentsConfig.getEnchantment(SoulbindEnchantment.key + ".yml").isEnabled(); + if (!isEnabled) return null; + if (itemStack == null || player == null) return null; + ItemMeta itemMeta = itemStack.getItemMeta(); + itemMeta.getPersistentDataContainer().set(SOULBIND_KEY, PersistentDataType.STRING, player.getUniqueId().toString()); + setPrestigeLevel(itemMeta, GuildRank.getGuildPrestigeRank(player)); + itemStack.setItemMeta(itemMeta); + return itemStack; + } + + public static void removeEnchantment(ItemStack itemStack) { + if (itemStack == null) return; + ItemMeta itemMeta = itemStack.getItemMeta(); + itemMeta.getPersistentDataContainer().remove(SOULBIND_KEY); + itemStack.setItemMeta(itemMeta); + //update item lore display + new EliteItemLore(itemStack, false); + } + + public static void addPhysicalDisplay(Item item, Player player) { + new BukkitRunnable() { + @Override + public void run() { + if (item == null) + return; + TextDisplay soulboundPlayer = VisualDisplay.generateTemporaryTextDisplay(item.getLocation().clone().add(new Vector(0, -50, 0)), ChatColorConverter.convert( + SoulbindConfig.hologramStrings.replace("$player", player.getDisplayName()))); + new BukkitRunnable() { + final Location lastLocation = item.getLocation().clone(); + int counter = 0; + + @Override + public void run() { + counter++; + if (counter > 20 * 60 * 5 || !item.isValid()) { + cancel(); + EntityTracker.unregister(soulboundPlayer, RemovalReason.EFFECT_TIMEOUT); + return; + } + if (!lastLocation.equals(item.getLocation())) + soulboundPlayer.teleport(item.getLocation().clone().add(new Vector(0, 0.5, 0))); + if (counter == 1) + soulboundPlayer.teleport(item.getLocation().clone().add(new Vector(0, 0.5, 0))); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 1, 1); + } + }.runTaskLater(MetadataHandler.PLUGIN, 20 * 3); + } + + public static boolean isValidSoulbindUser(ItemMeta itemMeta, Player player) { + if (!isEnabled) return true; + if (player.hasPermission("elitemobs.soulbind.bypass")) return true; + if (itemMeta == null) + return true; + if (!itemMeta.getPersistentDataContainer().has(SOULBIND_KEY, PersistentDataType.STRING)) + return true; + if (GuildRank.getGuildPrestigeRank(player) == 0) + return itemMeta.getPersistentDataContainer().get(new NamespacedKey(MetadataHandler.PLUGIN, key), PersistentDataType.STRING).equals(player.getUniqueId().toString()); + //this is kept for legacy reasons, old items just appended the prestige tier at the end of the uuid + else if ((itemMeta.getPersistentDataContainer().get(new NamespacedKey(MetadataHandler.PLUGIN, key), PersistentDataType.STRING)).equals(player.getUniqueId().toString() + GuildRank.getGuildPrestigeRank(player))) + return true; + else + return getPrestigeLevel(itemMeta) == GuildRank.getGuildPrestigeRank(player) && + itemMeta.getPersistentDataContainer().get(new NamespacedKey(MetadataHandler.PLUGIN, key), PersistentDataType.STRING).equals(player.getUniqueId().toString()); + } + + public static Player getSoulboundPlayer(ItemMeta itemMeta) { + if (!itemMeta.getPersistentDataContainer().has(SOULBIND_KEY, PersistentDataType.STRING)) + return null; + try { + UUID uuid = UUID.fromString(itemMeta.getPersistentDataContainer().get(new NamespacedKey(MetadataHandler.PLUGIN, key), PersistentDataType.STRING)); + return Bukkit.getPlayer(uuid); + } catch (Exception ex) { + + } + return null; + //return Bukkit.getPlayer(UUID.fromString(itemMeta.getPersistentDataContainer().get(new NamespacedKey(MetadataHandler.PLUGIN, key), PersistentDataType.STRING))); + } + + public static boolean itemHasSoulbindEnchantment(ItemMeta itemMeta) { + return itemMeta.getPersistentDataContainer().has(SOULBIND_KEY, PersistentDataType.STRING); + } + + private static void setPrestigeLevel(ItemMeta itemMeta, int prestigeLevel) { + itemMeta.getPersistentDataContainer().set(PRESTIGE_KEY, PersistentDataType.INTEGER, prestigeLevel); + } + + public static int getPrestigeLevel(ItemMeta itemMeta) { + if (!itemMeta.getPersistentDataContainer().has(SOULBIND_KEY, PersistentDataType.STRING)) + return 0; + int prestige = 0; + if (itemMeta.getPersistentDataContainer().get(PRESTIGE_KEY, PersistentDataType.INTEGER) != null) + prestige = itemMeta.getPersistentDataContainer().get(PRESTIGE_KEY, PersistentDataType.INTEGER); + return prestige; + } + + public static class SoulbindEnchantmentEvents implements Listener { + @EventHandler(priority = EventPriority.LOWEST) + public void onPickup(PlayerPickupItemEvent event) { + if (isValidSoulbindUser(event.getItem().getItemStack().getItemMeta(), event.getPlayer())) return; + event.setCancelled(true); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/customenchantments/SummonMerchantEnchantment.java b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/SummonMerchantEnchantment.java new file mode 100644 index 000000000..04fcec804 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/SummonMerchantEnchantment.java @@ -0,0 +1,102 @@ +package com.magmaguy.elitemobs.items.customenchantments; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfig; +import com.magmaguy.elitemobs.items.ItemTagger; +import com.magmaguy.elitemobs.npcs.NPCEntity; +import com.magmaguy.magmacore.util.ChatColorConverter; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.AsyncPlayerChatEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.ArrayList; +import java.util.List; + +public class SummonMerchantEnchantment extends CustomEnchantment implements Listener { + + private static final String merchantMessage = EnchantmentsConfig.getEnchantment("summon_merchant.yml").getFileConfiguration().getString("message"); + public static String key = "summon_merchant"; + + public SummonMerchantEnchantment() { + super(key, false); + } + + /** + * If the value is 0, it means that the enchantment isn't present + */ + private static int getEnchantment(ItemMeta itemMeta) { + return ItemTagger.getEnchantment(itemMeta, key); + } + + /** + * Summons the merchant + * + * @param player + */ + public static void doSummonMerchant(Player player, boolean fromMessage, ItemStack itemStack) { + if (itemStack != null) + itemStack.setAmount(itemStack.getAmount() - 1); + if (!fromMessage) { + new NPCEntity(player.getLocation()); + if (!merchantMessage.isEmpty()) + player.chat(ChatColorConverter.convert(merchantMessage)); + return; + } + //pass to a sync task + new BukkitRunnable() { + @Override + public void run() { + new NPCEntity(player.getLocation()); + } + }.runTask(MetadataHandler.PLUGIN); + } + + public static class SummonMerchantEvents implements Listener { + private static final List playerCooldowns = new ArrayList<>(); + + @EventHandler + public void onItemInteract(PlayerInteractEvent event) { + if (!(event.getAction().equals(Action.RIGHT_CLICK_AIR) || event.getAction().equals(Action.RIGHT_CLICK_BLOCK))) + return; + if (getEnchantment(event.getPlayer().getInventory().getItemInMainHand().getItemMeta()) < 1) + return; + if (playerCooldowns.contains(event.getPlayer())) return; + playerCooldowns.add(event.getPlayer()); + new BukkitRunnable() { + @Override + public void run() { + playerCooldowns.remove(event.getPlayer()); + } + }.runTaskLater(MetadataHandler.PLUGIN, 20 * 60); + doSummonMerchant(event.getPlayer(), false, event.getPlayer().getInventory().getItemInMainHand()); + } + + @EventHandler + public void onPlayerChat(AsyncPlayerChatEvent event) { + if (merchantMessage.isEmpty()) return; + if (event.getMessage().equalsIgnoreCase(merchantMessage)) { + if (playerCooldowns.contains(event.getPlayer())) return; + playerCooldowns.add(event.getPlayer()); + new BukkitRunnable() { + @Override + public void run() { + playerCooldowns.remove(event.getPlayer()); + } + }.runTaskLater(MetadataHandler.PLUGIN, 20 * 60); + for (ItemStack itemStack : event.getPlayer().getInventory()) + if (itemStack != null) + if (getEnchantment(itemStack.getItemMeta()) > 0) { + doSummonMerchant(event.getPlayer(), true, itemStack); + return; + } + } + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/customenchantments/SummonWolfEnchantment.java b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/SummonWolfEnchantment.java new file mode 100644 index 000000000..b5c51789f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/SummonWolfEnchantment.java @@ -0,0 +1,93 @@ +package com.magmaguy.elitemobs.items.customenchantments; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.items.ItemTagger; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.playerdata.ElitePlayerInventory; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.entity.Wolf; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class SummonWolfEnchantment extends CustomEnchantment { + + public static final String key = "summon_wolf"; + + public SummonWolfEnchantment() { + super(key, false); + } + + public static void summonWolf(Player player, ItemStack itemStack) { + Wolf wolf; + if (itemStack != null) + itemStack.setAmount(itemStack.getAmount() - 1); + if (ThreadLocalRandom.current().nextDouble() < 1D / 1000D) + wolf = summonSnoopy(player); + else + wolf = summonGenericWolf(player); + if (wolf == null) return; + wolf.setAngry(false); + wolf.setOwner(player); + } + + private static Wolf summonGenericWolf(Player player) { + CustomBossEntity customBossEntity = CustomBossEntity.createCustomBossEntity("summonable_wolf.yml"); + customBossEntity.setSpawnLocation(player.getLocation()); + customBossEntity.setLevel(ElitePlayerInventory.playerInventories.get(player.getUniqueId()).getFullPlayerTier(true)); + customBossEntity.spawn(false); + if (customBossEntity.getCustomBossesConfigFields().getEntityType() != EntityType.WOLF) { + Logger.warn("snoopy.yml boss file was not set to a wolf entity type! It must be a wolf for the summon mechanic to work correctly!"); + return null; + } + return (Wolf) customBossEntity.getLivingEntity(); + } + + private static Wolf summonSnoopy(Player player) { + CustomBossEntity customBossEntity = CustomBossEntity.createCustomBossEntity("summonable_wolf.yml"); + customBossEntity.setSpawnLocation(player.getLocation()); + customBossEntity.setLevel(ElitePlayerInventory.playerInventories.get(player.getUniqueId()).getFullPlayerTier(true)); + if (customBossEntity.getLivingEntity().getType() != EntityType.WOLF) { + Logger.warn("snoopy.yml boss file was not set to a wolf entity type! It must be a wolf for the summon mechanic to work correctly!"); + return null; + } + return (Wolf) customBossEntity.getLivingEntity(); + } + + private static int getEnchantment(ItemMeta itemMeta) { + return ItemTagger.getEnchantment(itemMeta, key); + } + + public static class SummonWolfEnchantmentEvent implements Listener { + private static final List playerCooldowns = new ArrayList<>(); + + @EventHandler(ignoreCancelled = true) + public void onRightClick(PlayerInteractEvent event) { + if (playerCooldowns.contains(event.getPlayer())) return; + playerCooldowns.add(event.getPlayer()); + new BukkitRunnable() { + @Override + public void run() { + playerCooldowns.remove(event.getPlayer()); + } + }.runTaskLater(MetadataHandler.PLUGIN, 20 * 60L); + if (!(event.getAction().equals(Action.RIGHT_CLICK_AIR) || event.getAction().equals(Action.RIGHT_CLICK_BLOCK))) + return; + if (getEnchantment(event.getPlayer().getInventory().getItemInMainHand().getItemMeta()) > 0) + summonWolf(event.getPlayer(), event.getPlayer().getInventory().getItemInMainHand()); + if (getEnchantment(event.getPlayer().getInventory().getItemInOffHand().getItemMeta()) > 0) + summonWolf(event.getPlayer(), event.getPlayer().getInventory().getItemInOffHand()); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/customenchantments/UnbindEnchantment.java b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/UnbindEnchantment.java new file mode 100644 index 000000000..c304f40b8 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/customenchantments/UnbindEnchantment.java @@ -0,0 +1,48 @@ +package com.magmaguy.elitemobs.items.customenchantments; + +import com.magmaguy.elitemobs.items.EliteItemLore; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +public class UnbindEnchantment extends CustomEnchantment { + public static String key = "unbind"; + + public UnbindEnchantment() { + super(key, true); + } + + public static ItemStack unbindItem(ItemStack itemStack) { + ItemStack newItemStack = itemStack.clone(); + ItemMeta itemMeta = newItemStack.getItemMeta(); + itemMeta.getPersistentDataContainer().remove(SoulbindEnchantment.SOULBIND_KEY); + itemMeta.getPersistentDataContainer().remove(SoulbindEnchantment.PRESTIGE_KEY); + newItemStack.setItemMeta(itemMeta); + new EliteItemLore(newItemStack, false); + return newItemStack; + } + + /* + public static class UnbindEvents implements Listener { + @EventHandler (ignoreCancelled = true) + public void onItemPlace(PrepareAnvilEvent event) { + if (event.getInventory().getItem(0) == null || + event.getInventory().getItem(0).getType().equals(Material.AIR) || + event.getInventory().getItem(1) == null || + event.getInventory().getItem(1).getType().equals(Material.AIR)) + return; + if (ItemTagger.getEnchantment(event.getInventory().getItem(0).getItemMeta(), key) > 0 && + SoulbindEnchantment.itemHasSoulbindEnchantment(event.getInventory().getItem(1).getItemMeta())) { + event.setResult(unbindItem(event.getInventory().getItem(1))); + event.getInventory().setRepairCost(39); + } else if (ItemTagger.getEnchantment(event.getInventory().getItem(1).getItemMeta(), key) > 0 && + SoulbindEnchantment.itemHasSoulbindEnchantment(event.getInventory().getItem(0).getItemMeta())) { + event.setResult(unbindItem(event.getInventory().getItem(0))); + event.getInventory().setRepairCost(39); + } + + } + } + + */ + +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/customitems/CustomItem.java b/src/main/java/com/magmaguy/elitemobs/items/customitems/CustomItem.java new file mode 100644 index 000000000..4c09742b5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/customitems/CustomItem.java @@ -0,0 +1,354 @@ +package com.magmaguy.elitemobs.items.customitems; + +import com.magmaguy.elitemobs.adventurersguild.GuildRank; +import com.magmaguy.elitemobs.api.utils.EliteItemManager; +import com.magmaguy.elitemobs.config.AdventurersGuildConfig; +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfig; +import com.magmaguy.elitemobs.config.customitems.CustomItemsConfigFields; +import com.magmaguy.elitemobs.items.LootTables; +import com.magmaguy.elitemobs.items.ScalableItemConstructor; +import com.magmaguy.elitemobs.items.customenchantments.CustomEnchantment; +import com.magmaguy.elitemobs.items.customenchantments.SoulbindEnchantment; +import com.magmaguy.elitemobs.items.itemconstructor.ItemConstructor; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.Location; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.*; + +public class CustomItem { + + @Getter + private static final HashMap customItems = new HashMap<>(); + // Used to get loot via commands + @Getter + private static final ArrayList customItemStackList = new ArrayList<>(); + // Used to get loot via custom shop, used for efficiency (avoids the double calc of the lore) + @Getter + private static final ArrayList customItemStackShopList = new ArrayList<>(); + @Getter + // Used to drop static loot using the weighed chance system + private static final HashMap weighedFixedItems = new HashMap<>(); + @Getter + private static final HashMap> tieredLoot = new HashMap<>(); + @Getter + private static final HashMap> fixedItems = new HashMap<>(); + @Getter + private static final List scalableItems = new ArrayList<>(); + @Getter + private static final HashMap> limitedItems = new HashMap<>(); + @Getter + private final CustomItemsConfigFields customItemsConfigFields; + @Getter + private final HashMap enchantments = new HashMap<>(); + @Getter + private final HashMap customEnchantments = new HashMap<>(); + @Getter + private final String permission; + @Getter + private List potionEffects = new ArrayList<>(); + @Getter + private double dropWeight = 0; + @Getter + private Scalability scalability; + @Getter + private ItemType itemType; + @Getter + private int itemLevel = -1; + + /** + * Generates a CustomItem object. This holds values for limited and dynamic items until a tier is determined for them. + * + * @param customItemsConfigFields Config fields upon which the values are based. + */ + public CustomItem(CustomItemsConfigFields customItemsConfigFields) { + this.customItemsConfigFields = customItemsConfigFields; + this.itemLevel = customItemsConfigFields.getLevel(); + if (itemLevel == 0) + itemLevel = (int) EliteItemManager.getItemLevel(new ItemStack(customItemsConfigFields.getMaterial())); + this.permission = customItemsConfigFields.getPermission(); + if (!customItemsConfigFields.isEnabled()) return; + if (customItemsConfigFields.getMaterial() == null) return; + parseEnchantments(); + parsePotionEffects(); + parseItemType(); + parseItemLevel(); + //give getloot menu items to work with + addCustomItem(customItemsConfigFields.getFilename(), this); + addCustomItem(this); + addTieredLoot(this); + if (parseDropWeight()) { + //item is weighed and fixed + addFixedItem(this); + addWeighedFixedItems(this); + this.scalability = Scalability.FIXED; + return; + } + parseScalability(); + } + + public static CustomItem getCustomItem(String fileName) { + if (!fileName.contains(".yml")) fileName += ".yml"; + if (!customItems.containsKey(fileName)) + return null; + return customItems.get(fileName); + } + + private static void addCustomItem(String fileName, CustomItem customItem) { + customItems.put(fileName, customItem); + } + + // Adds custom items to the list used by the getloot GUI + private static void addCustomItem(CustomItem customItem) { + customItemStackList.add(customItem.generateDefaultsItemStack(null, false, null)); + if (customItem.getItemType().equals(ItemType.UNIQUE)) return; + customItemStackShopList.add(customItem.generateDefaultsItemStack(null, true, null)); + } + + // Adds weighed static items + private static void addWeighedFixedItems(CustomItem customItem) { + ItemStack itemStack = customItem.generateDefaultsItemStack(null, false, null); + weighedFixedItems.put(itemStack, customItem.getDropWeight()); + } + + public static void addTieredLoot(CustomItem customItem) { + ItemStack itemStack = customItem.generateDefaultsItemStack(null, false, null); + int itemTier = customItem.getItemLevel(); + + if (tieredLoot.get(itemTier) == null) + tieredLoot.put(itemTier, new ArrayList<>(Collections.singletonList(itemStack))); + + else { + ArrayList list = tieredLoot.get(itemTier); + list.add(itemStack); + tieredLoot.put(itemTier, list); + } + } + + private static void addFixedItem(CustomItem customItem) { + if (fixedItems.get(customItem.getItemLevel()) == null || fixedItems.get(customItem.getItemLevel()).isEmpty()) + fixedItems.put(customItem.getItemLevel(), new ArrayList<>(Collections.singletonList(customItem))); + else + fixedItems.get(customItem.getItemLevel()).add(customItem); + } + + private static void addLimitedItem(CustomItem customItem) { + if (limitedItems.get(customItem.getItemLevel()) == null || limitedItems.get(customItem.getItemLevel()).isEmpty()) + limitedItems.put(customItem.getItemLevel(), new ArrayList<>(Collections.singletonList(customItem))); + else + limitedItems.get(customItem.getItemLevel()).add(customItem); + } + + /** + * Initializes all config items on startup. Needs to run after the config initialization as it relies on those values. + */ + public static void initializeCustomItems() { + for (CustomItemsConfigFields configFields : CustomItemsConfig.getCustomItems().values()) + try { + new CustomItem(configFields); + } catch (Exception ex) { + Logger.warn("Failed to generate custom item in file " + configFields.getFilename() + " !"); + ex.printStackTrace(); + } + } + + public static int limitItemLevel(Player player, int originalLevel) { + int itemLevel; + if (AdventurersGuildConfig.isGuildLootLimiter()) { + itemLevel = (int) LootTables.setItemTier(originalLevel); + if (itemLevel > GuildRank.getActiveGuildRank(player) * 10) + itemLevel = GuildRank.getActiveGuildRank(player) * 10; + } else + itemLevel = originalLevel + 1; + return itemLevel; + } + + public Item dropPlayerLoot(Player player, int tier, Location location, EliteEntity eliteEntity) { + if (!permission.isEmpty() && !player.hasPermission(permission)) return null; + Item loot = null; + int itemTier = limitItemLevel(player, tier); + + switch (getScalability()) { + case LIMITED: + loot = location.getWorld().dropItem(location, + ScalableItemConstructor.constructLimitedItem(itemTier, this, player, eliteEntity)); + break; + case SCALABLE: + loot = location.getWorld().dropItem(location, + ScalableItemConstructor.constructScalableItem(itemTier + 1, this, player, eliteEntity)); + break; + case FIXED: + loot = location.getWorld().dropItem(location, generateItemStack(itemLevel + 1, player, eliteEntity)); + default: + } + + SoulbindEnchantment.addPhysicalDisplay(loot, player); + loot.setCustomName(loot.getItemStack().getItemMeta().getDisplayName()); + loot.setCustomNameVisible(true); + + return loot; + } + + private void parseEnchantments() { + for (String string : this.customItemsConfigFields.getEnchantments()) + try { + String name = string.split(",")[0]; + int level = 1; + try { + level = Integer.parseInt(string.split(",")[1]); + } catch (Exception ex) { + Logger.warn("Custom Item Entry " + customItemsConfigFields.getFilename() + " has an invalid enchantment entry."); + Logger.warn("Enchantment " + name + " is missing a level."); + Logger.warn("Reminder - The correct format for these is [enchantmentName],[level]"); + Logger.warn("The name should follow the API names and the level should be above 0."); + Logger.warn("Defaulting " + name + " to level 1."); + } + + if (CustomEnchantment.isCustomEnchantment(name)) { + customEnchantments.put(name.toLowerCase(Locale.ROOT), level); + continue; + } + + Enchantment enchantment; + try { + enchantment = Enchantment.getByName(name); + if (enchantment == null) + throw new Exception("Null enchantment"); + } catch (Exception ex) { + Logger.warn("Custom Item Entry " + customItemsConfigFields.getFilename() + " has an invalid enchantment entry."); + Logger.warn("Enchantment " + name + " is not a valid enchantment. Check the Spigot API for the correct names!"); + Logger.warn("The invalid entry will be skipped."); + continue; + } + + enchantments.put(enchantment, level); + + } catch (Exception ex) { + Logger.warn("Invalid enchantment entry for item " + customItemsConfigFields.getFilename()); + Logger.warn("[" + string + "] is not a valid entry and will be ignored."); + Logger.warn("Reminder - The correct format for these is [enchantmentName],[level]"); + Logger.warn("The name should follow the API names and the level should be above 0."); + } + } + + private void parsePotionEffects() { + this.potionEffects = this.customItemsConfigFields.getPotionEffects(); + } + + private void parseItemType() { + if (this.customItemsConfigFields.getItemType() == null) { + this.itemType = ItemType.CUSTOM; + return; + } + this.itemType = customItemsConfigFields.getItemType(); + } + + private boolean parseDropWeight() { + if (this.customItemsConfigFields.getDropWeight() == null) return false; + if (this.customItemsConfigFields.getDropWeight().equalsIgnoreCase("dynamic")) return false; + try { + this.dropWeight = Double.parseDouble(this.customItemsConfigFields.getDropWeight()); + return true; + } catch (Exception e) { + Logger.warn("Item " + customItemsConfigFields.getFilename() + " does not have a valid itemWeight."); + } + return false; + } + + private void parseScalability() { + if (this.customItemsConfigFields.getScalability() == null) { + this.scalability = Scalability.SCALABLE; + return; + } + this.scalability = customItemsConfigFields.getScalability(); + switch (this.customItemsConfigFields.getScalability()) { + case FIXED: + if (!itemType.equals(ItemType.UNIQUE)) + addFixedItem(this); + break; + case LIMITED: + if (!itemType.equals(ItemType.UNIQUE)) + addLimitedItem(this); + break; + case SCALABLE: + if (!itemType.equals(ItemType.UNIQUE)) + scalableItems.add(this); + break; + default: + this.scalability = Scalability.SCALABLE; + if (!itemType.equals(ItemType.UNIQUE)) + scalableItems.add(this); + Logger.warn("Item " + customItemsConfigFields.getFilename() + " does not have a valid scalability type! Defaulting to scalable."); + + } + } + + private void parseItemLevel() { + this.itemLevel = (int) Math.round(EliteItemManager.getItemLevel(generateDefaultsItemStack(null, false, null))); + } + + public ItemStack generateDefaultsItemStack(Player player, boolean showItemWorth, EliteEntity eliteEntity) { + return generateDefaultsItemStack(player, showItemWorth, eliteEntity, false); + } + + public ItemStack generateDefaultsItemStack(Player player, boolean showItemWorth, EliteEntity eliteEntity, boolean bypass) { + if (!bypass && player != null && !permission.isEmpty() && !player.hasPermission(permission)) return null; + ItemStack itemStack = + ItemConstructor.constructItem( + itemLevel, + customItemsConfigFields.getName(), + customItemsConfigFields.getMaterial(), + getEnchantments(), + getCustomEnchantments(), + getPotionEffects(), + customItemsConfigFields.getLore(), + eliteEntity, + player, + showItemWorth, + customItemsConfigFields.getCustomModelID(), + customItemsConfigFields.isSoulbound(), + getCustomItemsConfigFields().getFilename() + ); + ItemMeta itemMeta = itemStack.getItemMeta(); + //Adds the filename to the persistent data container, useful for several things but mostly used for tracking quest keys +// Objects.requireNonNull(itemMeta).getPersistentDataContainer().set(new NamespacedKey(MetadataHandler.PLUGIN, customItemsConfigFields.getFilename()), PersistentDataType.STRING, customItemsConfigFields.getFilename()); + itemStack.setItemMeta(itemMeta); + return itemStack; + } + + public ItemStack generateItemStack(int itemTier, Player player, EliteEntity eliteEntity) { + ItemStack itemStack = null; + //This can happen when doing drop tables, the loot is not yet assigned to anyone + if (player != null) + itemTier = limitItemLevel(player, itemTier); + switch (this.scalability) { + case FIXED: + itemStack = generateDefaultsItemStack(player, false, eliteEntity); + break; + case LIMITED: + itemStack = ScalableItemConstructor.constructLimitedItem(itemTier, this, player, eliteEntity); + break; + case SCALABLE: + itemStack = ScalableItemConstructor.constructScalableItem(itemTier, this, player, eliteEntity); + } + return itemStack; + } + + public enum ItemType { + CUSTOM, + UNIQUE + } + + public enum Scalability { + FIXED, + LIMITED, + SCALABLE + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/customloottable/CommandLootTable.java b/src/main/java/com/magmaguy/elitemobs/items/customloottable/CommandLootTable.java new file mode 100644 index 000000000..f374830f7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/customloottable/CommandLootTable.java @@ -0,0 +1,84 @@ +package com.magmaguy.elitemobs.items.customloottable; + +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.io.Serializable; +import java.util.List; +import java.util.Locale; +import java.util.concurrent.ThreadLocalRandom; + +public class CommandLootTable extends CustomLootEntry implements Serializable { + @Getter + private String command = null; + + public CommandLootTable(List entries, String rawString, String configFilename) { + super(); + parseNewFormat(rawString, configFilename); + entries.add(this); + } + + //Format: command=my cool command:chance=X.Y:amount=X:permission=per.miss.ion + private void parseNewFormat(String rawString, String configFilename) { + for (String string : rawString.split(":")) { + String[] strings = string.split("="); + switch (strings[0].toLowerCase(Locale.ROOT)) { + case "command": + try { + this.command = strings[1]; + } catch (Exception ex) { + errorMessage(rawString, configFilename, "filename"); + } + break; + case "amount": + try { + super.setAmount(Integer.parseInt(strings[1])); + } catch (Exception ex) { + errorMessage(rawString, configFilename, "amount"); + } + break; + case "chance": + try { + super.setChance(Double.parseDouble(strings[1])); + } catch (Exception ex) { + errorMessage(rawString, configFilename, "chance"); + } + break; + case "permission": + try { + super.setPermission(strings[1]); + } catch (Exception ex) { + errorMessage(rawString, configFilename, "permission"); + } + break; + case "wave": + try { + super.setWave(Integer.parseInt(strings[1])); + } catch (Exception ex) { + errorMessage(rawString, configFilename, "wave"); + } + break; + default: + } + } + } + + //treasure chest + @Override + public void locationDrop(int itemTier, Player player, Location location) { + if (!getPermission().isEmpty() && !player.hasPermission(getPermission())) return; + if (ThreadLocalRandom.current().nextDouble() < getChance()) return; + for (int i = 0; i < getAmount(); i++) + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command.replace("%player%", player.getName())); + } + + @Override + public void directDrop(int itemTier, Player player) { + if (!getPermission().isEmpty() && !player.hasPermission(getPermission())) return; + if (ThreadLocalRandom.current().nextDouble() < getChance()) return; + for (int i = 0; i < getAmount(); i++) + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command.replace("%player%", player.getName())); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/customloottable/CurrencyCustomLootEntry.java b/src/main/java/com/magmaguy/elitemobs/items/customloottable/CurrencyCustomLootEntry.java new file mode 100644 index 000000000..ef49f86ae --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/customloottable/CurrencyCustomLootEntry.java @@ -0,0 +1,108 @@ +package com.magmaguy.elitemobs.items.customloottable; + +import com.magmaguy.elitemobs.adventurersguild.GuildRank; +import com.magmaguy.elitemobs.config.EconomySettingsConfig; +import com.magmaguy.elitemobs.config.ItemSettingsConfig; +import com.magmaguy.elitemobs.economy.EconomyHandler; +import com.magmaguy.elitemobs.items.ItemLootShower; +import com.magmaguy.elitemobs.utils.MapListInterpreter; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.io.Serializable; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +public class CurrencyCustomLootEntry extends CustomLootEntry implements Serializable { + @Getter + private int currencyAmount = 0; + + public CurrencyCustomLootEntry(List entries, int currencyAmount) { + this.currencyAmount = currencyAmount; + entries.add(this); + } + + public CurrencyCustomLootEntry(List entries, String rawString, String configFilename) { + for (String string : rawString.split(":")) { + String[] strings = string.split("="); + switch (strings[0].toLowerCase(Locale.ROOT)) { + case "currencyamount": + try { + this.currencyAmount = Integer.parseInt(strings[1]); + } catch (Exception ex) { + errorMessage(rawString, configFilename, "currencyAmount"); + } + break; + case "amount": + try { + super.setAmount(Integer.parseInt(strings[1])); + } catch (Exception ex) { + errorMessage(rawString, configFilename, "amount"); + } + break; + case "chance": + try { + super.setChance(Double.parseDouble(strings[1])); + } catch (Exception ex) { + errorMessage(rawString, configFilename, "chance"); + } + break; + case "permission": + try { + super.setPermission(strings[1]); + } catch (Exception ex) { + errorMessage(rawString, configFilename, "permission"); + } + break; + case "wave": + try { + super.setWave(Integer.parseInt(strings[1])); + } catch (Exception ex) { + errorMessage(rawString, configFilename, "wave"); + } + break; + default: + } + } + if (currencyAmount == 0) { + errorMessage(rawString, configFilename, "currencyAmount"); + return; + } + entries.add(this); + } + + public CurrencyCustomLootEntry(List entries, Map configMap, String configFilename) { + for (Map.Entry mapEntry : configMap.entrySet()) { + String key = (String) mapEntry.getKey(); + switch (key.toLowerCase(Locale.ROOT)) { + case "chance" -> + super.setChance(MapListInterpreter.parseDouble(key, mapEntry.getValue(), configFilename)); + case "permission" -> + super.setPermission(MapListInterpreter.parseString(key, mapEntry.getValue(), configFilename)); + case "amount" -> setAmount(MapListInterpreter.parseInteger(key, mapEntry.getValue(), configFilename)); + case "currencyamount" -> + currencyAmount = MapListInterpreter.parseInteger(key, mapEntry.getValue(), configFilename); + default -> Logger.warn("Failed to read custom loot option " + key + " in " + configFilename); + } + } + entries.add(this); + } + + + @Override + public void locationDrop(int itemTier, Player player, Location location) { + currencyAmount = (int) (currencyAmount * GuildRank.currencyBonusMultiplier(player.getUniqueId())); + new ItemLootShower(location, player, currencyAmount); + } + + @Override + public void directDrop(int itemTier, Player player) { + EconomyHandler.addCurrency(player.getUniqueId(), currencyAmount * GuildRank.currencyBonusMultiplier(player.getUniqueId())); + player.sendMessage(ItemSettingsConfig.getDirectDropCoinMessage() + .replace("$amount", currencyAmount + "") + .replace("$currencyName", EconomySettingsConfig.getCurrencyName())); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/customloottable/CustomLootEntry.java b/src/main/java/com/magmaguy/elitemobs/items/customloottable/CustomLootEntry.java new file mode 100644 index 000000000..988009efc --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/customloottable/CustomLootEntry.java @@ -0,0 +1,59 @@ +package com.magmaguy.elitemobs.items.customloottable; + +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.io.Serializable; +import java.util.concurrent.ThreadLocalRandom; + +public class CustomLootEntry implements Serializable { + @Getter + @Setter + private double chance = 1; + @Getter + @Setter + private int amount = 1; + @Getter + @Setter + private String permission = ""; + @Getter + @Setter + private int wave = -1; + @Getter + @Setter + private int itemLevel = 1; + + public CustomLootEntry() { + } + + public static void errorMessage(String rawString, String configFilename, String reason) { + Logger.warn("Failed to parse entry " + rawString + " for file " + configFilename + " due to invalid: " + reason); + } + + public boolean willDrop(Player player) { + if (!permission.isEmpty() && !player.hasPermission(permission)) return false; + return ThreadLocalRandom.current().nextDouble() < chance; + } + + public void locationDrop(int itemTier, Player player, Location dropLocation) { + //meant to be overriden by the classes that extend it + } + + public void directDrop(int itemTier, Player player) { + //meant to be overriden by the classes that extend it + } + + //used specifically so loot can be attributed to the right source + public void locationDrop(int itemTier, Player player, Location dropLocation, EliteEntity eliteEntity) { + //meant to be overriden by the classes that extend it + } + + //used specifically so loot can be attributed to the right source + public void directDrop(int itemTier, Player player, EliteEntity eliteEntity) { + //meant to be overriden by the classes that extend it + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/customloottable/CustomLootTable.java b/src/main/java/com/magmaguy/elitemobs/items/customloottable/CustomLootTable.java new file mode 100644 index 000000000..7e3df5e43 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/customloottable/CustomLootTable.java @@ -0,0 +1,129 @@ +package com.magmaguy.elitemobs.items.customloottable; + +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.config.ItemSettingsConfig; +import com.magmaguy.elitemobs.config.customarenas.CustomArenasConfigFields; +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import com.magmaguy.elitemobs.config.customquests.CustomQuestsConfigFields; +import com.magmaguy.elitemobs.config.customtreasurechests.CustomTreasureChestConfigFields; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.magmacore.util.ChatColorConverter; +import lombok.Getter; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.io.Serializable; +import java.util.*; + +public class CustomLootTable implements Serializable { + + @Getter + private final List entries = new ArrayList<>(); + private final Map> waveRewards = new HashMap(); + + public CustomLootTable() { + } + + public CustomLootTable(CustomBossesConfigFields customBossesConfigFields) { + List rawStrings = customBossesConfigFields.getUniqueLootList(); + parseConfig(rawStrings, customBossesConfigFields.getFilename()); + } + + public CustomLootTable(CustomTreasureChestConfigFields treasureChestConfigFields) { + List rawStrings = treasureChestConfigFields.getLootList(); + parseConfig(rawStrings, treasureChestConfigFields.getFilename()); + } + + public CustomLootTable(CustomQuestsConfigFields questsConfigFields) { + List rawStrings = questsConfigFields.getCustomRewardsList(); + parseConfig(rawStrings, questsConfigFields.getFilename()); + } + + public CustomLootTable(CustomArenasConfigFields customArenasConfigFields) { + List rawStrings = customArenasConfigFields.getRawArenaRewards(); + parseConfig(rawStrings, customArenasConfigFields.getFilename()); + } + + private void parseConfig(List lootTable, String filename) { + if (lootTable == null) return; + for (Object object : lootTable) + if (object instanceof String rawString) + switch (rawString.split(":")[0].toLowerCase(Locale.ROOT)) { + case "minecraft": + new VanillaCustomLootEntry(entries, rawString, filename); + break; + default: + if (rawString.toLowerCase(Locale.ROOT).contains("currencyamount=")) + new CurrencyCustomLootEntry(entries, rawString, filename); + else if (rawString.contains("material=")) + new VanillaCustomLootEntry(entries, rawString, filename); + else if (rawString.contains("command=")) new CommandLootTable(entries, rawString, filename); + else new EliteCustomLootEntry(entries, rawString, filename); + } + else if (object instanceof Map configMap) { + //This is used for the instanced loot + if (((Map) object).containsKey("currencyAmount") || + ((Map) object).containsKey("currencyamount")) { + new CurrencyCustomLootEntry(entries, configMap, filename); + } + new EliteCustomLootEntry(entries, configMap, filename); + } + for (CustomLootEntry customLootEntry : entries) { + if (customLootEntry.getWave() > 0) { + if (this.waveRewards.get(customLootEntry.getWave()) != null) { + List rewards = this.waveRewards.get(customLootEntry.getWave()); + rewards.add(customLootEntry); + this.waveRewards.put(customLootEntry.getWave(), rewards); + } else waveRewards.put(customLootEntry.getWave(), new ArrayList<>(List.of(customLootEntry))); + } + } + } + + public void generateCurrencyEntry(int currencyAmount) { + new CurrencyCustomLootEntry(entries, currencyAmount); + } + + public void generateEliteEntry(ItemStack itemStack) { + new ItemStackCustomLootEntry(entries, itemStack); + } + + public void bossDrop(Player player, int level, Location dropLocation, EliteEntity eliteEntity) { + for (CustomLootEntry customLootEntry : entries) { + if (customLootEntry.willDrop(player)) { + if (ItemSettingsConfig.isPutLootDirectlyIntoPlayerInventory()) + customLootEntry.directDrop(level, player, eliteEntity); + else { + customLootEntry.locationDrop(level, player, dropLocation, eliteEntity); + } + } + } + } + + public void treasureChestDrop(Player player, int chestLevel, Location dropLocation) { + boolean anythingDropped = false; + for (CustomLootEntry customLootEntry : entries) + if (customLootEntry.willDrop(player)) { + anythingDropped = true; + if (ItemSettingsConfig.isPutLootDirectlyIntoPlayerInventory()) { + customLootEntry.directDrop(chestLevel * 10, player); + } else { + customLootEntry.locationDrop(chestLevel * 10, player, dropLocation); + } + } + if (!anythingDropped) + player.sendMessage(ChatColorConverter.convert(DefaultConfig.getTreasureChestNoDropMessage())); + } + + public void questDrop(Player player, int questRewardLevel) { + for (CustomLootEntry customLootEntry : entries) + if (customLootEntry.willDrop(player)) customLootEntry.directDrop(questRewardLevel, player); + } + + public void arenaReward(Player player, int wave) { + if (waveRewards.get(wave) == null) return; + waveRewards.get(wave).forEach(reward -> { + if (reward.willDrop(player)) reward.directDrop(reward.getItemLevel(), player); + }); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/customloottable/EliteCustomLootEntry.java b/src/main/java/com/magmaguy/elitemobs/items/customloottable/EliteCustomLootEntry.java new file mode 100644 index 000000000..f1b748ccc --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/customloottable/EliteCustomLootEntry.java @@ -0,0 +1,238 @@ +package com.magmaguy.elitemobs.items.customloottable; + +import com.magmaguy.elitemobs.config.ItemSettingsConfig; +import com.magmaguy.elitemobs.instanced.MatchInstance; +import com.magmaguy.elitemobs.instanced.dungeons.DungeonInstance; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.utils.MapListInterpreter; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.io.Serializable; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +public class EliteCustomLootEntry extends CustomLootEntry implements Serializable { + @Getter + private String filename = null; + private String difficultyID = null; + + public EliteCustomLootEntry(List entries, String rawString, String configFilename) { + super(); + //old format + if (!rawString.contains("filename=")) { + parseLegacyFormat(rawString, configFilename); + } + //new format + else { + parseNewFormat(rawString, configFilename); + } + if (filename == null) return; + CustomItem customItem = CustomItem.getCustomItem(filename); + if (customItem == null) { + errorMessage(rawString, configFilename, "filename"); + return; + } + entries.add(this); + } + + public EliteCustomLootEntry(List entries, Map configMap, String configFilename) { + for (Map.Entry mapEntry : configMap.entrySet()) { + String key = (String) mapEntry.getKey(); + switch (key.toLowerCase(Locale.ROOT)) { + case "filename" -> filename = MapListInterpreter.parseString(key, mapEntry.getValue(), configFilename); + case "chance" -> + super.setChance(MapListInterpreter.parseDouble(key, mapEntry.getValue(), configFilename)); + case "difficultyid" -> + difficultyID = MapListInterpreter.parseString(key, mapEntry.getValue(), configFilename); + case "permission" -> + super.setPermission(MapListInterpreter.parseString(key, mapEntry.getValue(), configFilename)); + case "amount" -> setAmount(MapListInterpreter.parseInteger(key, mapEntry.getValue(), configFilename)); + default -> Logger.warn("Failed to read custom loot option " + key + " in " + configFilename); + } + } + entries.add(this); + } + + //Format: filename.yml:chance:permission + private void parseLegacyFormat(String rawString, String configFilename) { + String[] stringArray = rawString.split(":"); + try { + filename = stringArray[0]; + } catch (Exception ex) { + errorMessage(rawString, configFilename, "filename"); + return; + } + + try { + super.setChance(Double.parseDouble(stringArray[1])); + } catch (Exception ex) { + errorMessage(rawString, configFilename, "chance"); + return; + } + + if (stringArray.length > 2) + try { + super.setPermission(stringArray[2]); + } catch (Exception ex) { + errorMessage(rawString, configFilename, "permission"); + } + } + + //Format: filename=filename.yml:chance=X.Y:amount=X:permission=per.miss.ion + private void parseNewFormat(String rawString, String configFilename) { + for (String string : rawString.split(":")) { + String[] strings = string.split("="); + switch (strings[0].toLowerCase(Locale.ROOT)) { + case "filename": + try { + this.filename = strings[1]; + } catch (Exception ex) { + errorMessage(rawString, configFilename, "filename"); + } + break; + case "amount": + try { + super.setAmount(Integer.parseInt(strings[1])); + } catch (Exception ex) { + errorMessage(rawString, configFilename, "amount"); + } + break; + case "chance": + try { + super.setChance(Double.parseDouble(strings[1])); + } catch (Exception ex) { + errorMessage(rawString, configFilename, "chance"); + } + break; + case "permission": + try { + super.setPermission(strings[1]); + } catch (Exception ex) { + errorMessage(rawString, configFilename, "permission"); + } + break; + case "itemlevel": + try { + super.setItemLevel(Integer.parseInt(strings[1])); + } catch (Exception ex) { + errorMessage(rawString, configFilename, "level"); + } + break; + case "wave": + try { + super.setWave(Integer.parseInt(strings[1])); + } catch (Exception ex) { + errorMessage(rawString, configFilename, "wave"); + } + break; + default: + } + } + } + + private CustomItem generateCustomItem() { + return CustomItem.getCustomItem(filename); + } + + public ItemStack generateItemStack(int level, Player player, EliteEntity eliteEntity) { + return generateCustomItem().generateItemStack(level, player, eliteEntity); + } + + //treasure chest + @Override + public void locationDrop(int itemTier, Player player, Location location) { + for (int i = 0; i < getAmount(); i++) + generateCustomItem().dropPlayerLoot(player, itemTier, location, null); + } + + //This is for the custom boss drop + @Override + public void locationDrop(int itemTier, Player player, Location location, EliteEntity eliteEntity) { + if (isGroupLoot(itemTier, player, eliteEntity)) return; + if (generateCustomItem() == null) { + Logger.warn("Invalid loot entry for boss " + eliteEntity.getName() + "! Entry: " + filename); + if (eliteEntity instanceof CustomBossEntity customBossEntity) + Logger.warn("Boss filename: " + customBossEntity.getCustomBossesConfigFields().getFilename()); + return; + } + for (int i = 0; i < getAmount(); i++) + generateCustomItem().dropPlayerLoot(player, itemTier, location, eliteEntity); + } + + @Override + public void directDrop(int itemTier, Player player) { + String name = null; + for (int i = 0; i < getAmount(); i++) { + ItemStack itemStack = generateCustomItem().generateItemStack(itemTier, player, null); + player.getInventory().addItem(itemStack); + if (name == null && itemStack.getItemMeta() != null) { + if (itemStack.getItemMeta().hasDisplayName()) name = itemStack.getItemMeta().getDisplayName(); + else name = itemStack.getType().toString().replace("_", " "); + } + } + if (name != null) + player.sendMessage(ItemSettingsConfig.getDirectDropCustomLootMessage().replace("$itemName", getAmount() + "x " + name)); + } + + //This is the drop for boss loot + @Override + public void directDrop(int itemTier, Player player, EliteEntity eliteEntity) { + if (isGroupLoot(itemTier, player, eliteEntity)) return; + String name = null; + for (int i = 0; i < getAmount(); i++) { + ItemStack itemStack = generateCustomItem().generateItemStack(itemTier, player, eliteEntity); + if (itemStack == null) return; + player.getInventory().addItem(itemStack); + if (name == null && itemStack.getItemMeta() != null) { + if (itemStack.getItemMeta().hasDisplayName()) name = itemStack.getItemMeta().getDisplayName(); + else name = itemStack.getType().toString().replace("_", " "); + } + } + if (name != null) + player.sendMessage(ItemSettingsConfig.getDirectDropCustomLootMessage().replace("$itemName", getAmount() + "x " + name)); + } + + private boolean isGroupLoot(int itemTier, Player player, EliteEntity eliteEntity) { + if (difficultyID == null) return false; + MatchInstance matchInstance = PlayerData.getMatchInstance(player); + String dungeonDifficultyID = null; + if (matchInstance instanceof DungeonInstance dungeonInstance) + dungeonDifficultyID = dungeonInstance.getDifficultyID(); + if (dungeonDifficultyID == null) return false; + //Beyond this point the item is for instanced dungeons + if (!dungeonDifficultyID.equals(difficultyID)) return true; + addGroupLoot(itemTier, eliteEntity); + return true; + } + + private void addGroupLoot(int itemTier, EliteEntity eliteEntity) { + SharedLootTable sharedLootTable = SharedLootTable.getSharedLootTables().get(eliteEntity); + String name = null; + for (int i = 0; i < getAmount(); i++) { + CustomItem customItem = generateCustomItem(); + if (customItem == null) { + Logger.warn("Failed to generate a custom item for the boss " + eliteEntity.getName() + "! The configuration file for one of its loot items is not correctly configured."); + return; + } + ItemStack itemStack = customItem.generateItemStack(itemTier, null, eliteEntity); + if (sharedLootTable == null) sharedLootTable = new SharedLootTable(eliteEntity); + if (itemStack == null) { + Logger.warn("A custom item for boss " + eliteEntity.getName() + " was null! This item will be skipped."); + return; + } + sharedLootTable.addLoot(itemStack); + if (name == null && itemStack.getItemMeta() != null) { + if (itemStack.getItemMeta().hasDisplayName()) name = itemStack.getItemMeta().getDisplayName(); + else name = itemStack.getType().toString().replace("_", " "); + } + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/customloottable/ItemStackCustomLootEntry.java b/src/main/java/com/magmaguy/elitemobs/items/customloottable/ItemStackCustomLootEntry.java new file mode 100644 index 000000000..3706fe409 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/customloottable/ItemStackCustomLootEntry.java @@ -0,0 +1,36 @@ +package com.magmaguy.elitemobs.items.customloottable; + +import com.magmaguy.elitemobs.utils.ObjectSerializer; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.io.Serializable; +import java.util.List; + +public class ItemStackCustomLootEntry extends CustomLootEntry implements Serializable { + private final String serializedItemStack; + + public ItemStackCustomLootEntry(List entries, ItemStack itemStack) { + super(); + this.serializedItemStack = ObjectSerializer.itemStackArrayToBase64(itemStack); + entries.add(this); + } + + public ItemStack generateItemStack() { + try { + return ObjectSerializer.itemStackArrayFromBase64(serializedItemStack); + } catch (Exception ex) { + Logger.warn("Failed to serialize item stack from Custom Loot Table"); + return null; + } + } + + @Override + public void directDrop(int itemTier, Player player) { + ItemStack itemStack = generateItemStack(); + if (itemStack == null) return; + for (int i = 0; i < getAmount(); i++) + player.getInventory().addItem(itemStack); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/customloottable/SharedLootTable.java b/src/main/java/com/magmaguy/elitemobs/items/customloottable/SharedLootTable.java new file mode 100644 index 000000000..3beeedbcd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/customloottable/SharedLootTable.java @@ -0,0 +1,134 @@ +package com.magmaguy.elitemobs.items.customloottable; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.utils.EliteItemManager; +import com.magmaguy.elitemobs.items.EliteItemLore; +import com.magmaguy.elitemobs.items.customenchantments.SoulbindEnchantment; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import com.magmaguy.elitemobs.menus.LootMenu; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.magmacore.util.ChatColorConverter; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class SharedLootTable { + @Getter + private static final HashMap sharedLootTables = new HashMap<>(); + + private final int durationInSeconds = 60; + @Getter + private final List loot = new ArrayList<>(); + private final EliteEntity eliteEntity; + private final List damagers; + private final List lootMenus = new ArrayList<>(); + private final HashMap playerTables = new HashMap<>(); + + public SharedLootTable(EliteEntity eliteEntity) { + this.eliteEntity = eliteEntity; + + this.damagers = eliteEntity.getDamagers().keySet().stream().toList(); + sharedLootTables.put(eliteEntity, this); + damagers.forEach(damager -> lootMenus.add(new LootMenu(damager, this, getPlayerTable(damager)))); + if (damagers.size() > 1) + Bukkit.getScheduler().runTaskLater(MetadataHandler.PLUGIN, this::messagePlayers, 1); + endLoot(); + } + + private void messagePlayers() { + damagers.forEach(damagers -> { + damagers.sendMessage(ChatColorConverter.convert("&e&l---------------------------------------------")); + damagers.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &6Loot vote! Do &9/em loot &6 to vote on " + loot.size() + " items!")); + damagers.sendMessage(ChatColorConverter.convert("&e&l---------------------------------------------")); + }); + } + + public void addLoot(ItemStack itemStack) { + loot.add(itemStack); + } + + private void endLoot() { + if (damagers.size() < 2) { + new BukkitRunnable() { + @Override + public void run() { + distribute(); + } + }.runTaskLater(MetadataHandler.PLUGIN, 1); + return; + } + + new BukkitRunnable() { + @Override + public void run() { + distribute(); + } + }.runTaskLater(MetadataHandler.PLUGIN, 20L * durationInSeconds); + } + + private void distribute() { + for (ItemStack lootInstance : loot) { + List needPlayers = new ArrayList<>(); + for (PlayerTable playerTable : playerTables.values()) + for (ItemStack neededLoot : playerTable.getNeedItems()) { + if (neededLoot.isSimilar(lootInstance)) { + needPlayers.add(playerTable.player); + } + } + if (needPlayers.isEmpty()) { + rollLoot(lootInstance, damagers); + } else rollLoot(lootInstance, needPlayers); + } + sharedLootTables.remove(eliteEntity); + lootMenus.forEach(LootMenu::removeMenu); + } + + private void rollLoot(ItemStack item, List players) { + Player player = players.get(ThreadLocalRandom.current().nextInt(players.size())); + SoulbindEnchantment.addEnchantment(item, player); + new EliteItemLore(item, false); + int newLevel = CustomItem.limitItemLevel(player, EliteItemManager.getRoundedItemLevel(item)); + EliteItemManager.setEliteLevel(item, newLevel); + HashMap pendingItems = player.getInventory().addItem(item); + if (!pendingItems.isEmpty()) player.getWorld().dropItemNaturally(player.getLocation(), item); + players.forEach(thisPlayer -> thisPlayer.sendMessage( + player.getDisplayName() + ChatColor.GREEN + " received " + item.getItemMeta().getDisplayName() + " !")); + } + + public PlayerTable getPlayerTable(Player player) { + PlayerTable playerTable = playerTables.get(player); + if (playerTable == null) playerTable = new PlayerTable(player, this); + return playerTable; + } + + public class PlayerTable { + @Getter + private final List needItems = new ArrayList<>(); + private final Player player; + private final SharedLootTable sharedLootTable; + + public PlayerTable(Player player, SharedLootTable sharedLootTable) { + this.player = player; + this.sharedLootTable = sharedLootTable; + playerTables.put(player, this); + } + + public void addNeed(ItemStack itemStack) { + needItems.add(itemStack); + sharedLootTable.damagers.forEach(damager -> damager.sendMessage(ChatColorConverter.convert(player.getDisplayName() + " &chas selected need for " + itemStack.getItemMeta().getDisplayName() + " !"))); + } + + public void removeNeed(ItemStack itemStack) { + needItems.remove(itemStack); + sharedLootTable.damagers.forEach(damager -> damager.sendMessage(ChatColorConverter.convert(player.getDisplayName() + " &2has selected greed for " + itemStack.getItemMeta().getDisplayName() + " !"))); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/customloottable/VanillaCustomLootEntry.java b/src/main/java/com/magmaguy/elitemobs/items/customloottable/VanillaCustomLootEntry.java new file mode 100644 index 000000000..caa946298 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/customloottable/VanillaCustomLootEntry.java @@ -0,0 +1,94 @@ +package com.magmaguy.elitemobs.items.customloottable; + +import com.magmaguy.elitemobs.config.ItemSettingsConfig; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import lombok.Getter; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.io.Serializable; +import java.util.List; +import java.util.Locale; +import java.util.concurrent.ThreadLocalRandom; + +public class VanillaCustomLootEntry extends CustomLootEntry implements Serializable { + @Getter + private Material material = null; + + public VanillaCustomLootEntry(List entries, String rawString, String configFilename) { + parseAllFormats(rawString, configFilename); + if (this.material == null) return; + entries.add(this); + } + + private void parseAllFormats(String rawString, String configFilename) { + for (String processedString : rawString.split(":")) { + String[] strings = processedString.split("="); + switch (strings[0].toLowerCase(Locale.ROOT)) { + case "type": + case "material": + try { + this.material = Material.valueOf(strings[1]); + } catch (Exception ex) { + errorMessage(rawString, configFilename, "material"); + } + break; + case "amount": + try { + super.setAmount(Integer.parseInt(strings[1])); + } catch (Exception ex) { + errorMessage(rawString, configFilename, "amount"); + } + break; + case "chance": + try { + super.setChance(Double.parseDouble(strings[1])); + } catch (Exception ex) { + errorMessage(rawString, configFilename, "chance"); + } + break; + case "wave": + try { + super.setWave(Integer.parseInt(strings[1])); + } catch (Exception ex) { + errorMessage(rawString, configFilename, "wave"); + } + break; + } + } + } + + public ItemStack generateItemStack() { + return new ItemStack(material, 1); + } + + @Override + public void locationDrop(int itemTier, Player player, Location location) { + for (int i = 0; i < getAmount(); i++) + location.getWorld().dropItem(location, generateItemStack()); + } + + @Override + public void locationDrop(int itemTier, Player player, Location location, EliteEntity eliteEntity) { + for (int i = 0; i < getAmount(); i++) + location.getWorld().dropItem(location, generateItemStack()); + } + + @Override + public void directDrop(int itemTier, Player player) { + String name = null; + for (int i = 0; i < getAmount(); i++) { + if (ThreadLocalRandom.current().nextDouble() > getChance()) return; + ItemStack itemStack = generateItemStack(); + player.getInventory().addItem(itemStack); + if (name == null && itemStack.getItemMeta() != null) { + if (itemStack.getItemMeta().hasDisplayName()) name = itemStack.getItemMeta().getDisplayName(); + else name = itemStack.getType().toString().replace("_", " "); + } + } + if (name != null) + player.sendMessage(ItemSettingsConfig.getDirectDropMinecraftLootMessage().replace("$itemName", getAmount() + "x " + name)); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/DropWeightHandler.java b/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/DropWeightHandler.java deleted file mode 100644 index 5edf9efd1..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/DropWeightHandler.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.magmaguy.elitemobs.items.itemconstructor; - -import com.magmaguy.elitemobs.items.CustomItemConstructor; -import com.magmaguy.elitemobs.items.ItemTierFinder; -import com.magmaguy.elitemobs.items.uniqueitems.UniqueItemInitializer; -import org.bukkit.Bukkit; -import org.bukkit.inventory.ItemStack; - -import java.util.ArrayList; -import java.util.List; - - -public class DropWeightHandler { - - public static void process(String dropType, ItemStack itemStack) { - - /* - This field is not mandatory, all parent keys missing this key will be considered dynamic - */ - if (dropType == null || dropType.isEmpty()) { - - rankedItemMapCreator(itemStack); - return; - - } - - /* - Code doesn't check for "dynamic" as it's the same behavior as nothing being in this key - */ - if (dropType.equalsIgnoreCase("dynamic")) { - - rankedItemMapCreator(itemStack); - return; - - } - - /* - Unique items only ever drop from specific bosses - */ - if (dropType.equalsIgnoreCase("unique")) { - - UniqueItemInitializer.uniqueItemsList.add(itemStack); - return; - - } - - - /* - Static items can drop at any point - */ - try { - - Double dropWeight = Double.valueOf(dropType); - CustomItemConstructor.staticCustomItemHashMap.put(itemStack, dropWeight); - - } catch (NumberFormatException e) { - - Bukkit.getLogger().info("[EliteMobs] Your item " + itemStack.getItemMeta().getDisplayName() + - " contains an invalid drop weight value (" + dropType + ")"); - - } - - } - - private static void rankedItemMapCreator(ItemStack itemStack) { - - int itemTier = (int) ItemTierFinder.findBattleTier(itemStack); - - if (CustomItemConstructor.dynamicRankedItemStacks.get(itemTier) == null) { - - List list = new ArrayList<>(); - - list.add(itemStack); - - CustomItemConstructor.dynamicRankedItemStacks.put(itemTier, list); - - } else { - - List list = CustomItemConstructor.dynamicRankedItemStacks.get(itemTier); - - list.add(itemStack); - - CustomItemConstructor.dynamicRankedItemStacks.put(itemTier, list); - - } - - } - - public static boolean isDynamic(String dropType){ - - /* - This field is not mandatory, all parent keys missing this key will be considered dynamic - */ - if (dropType == null || dropType.isEmpty()) { - - return true; - - } - - /* - Code doesn't check for "dynamic" as it's the same behavior as nothing being in this key - */ - if (dropType.equalsIgnoreCase("dynamic")) { - - return true; - - } - - return false; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/EnchantmentGenerator.java b/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/EnchantmentGenerator.java index a56401bdf..725ce0426 100644 --- a/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/EnchantmentGenerator.java +++ b/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/EnchantmentGenerator.java @@ -1,261 +1,302 @@ package com.magmaguy.elitemobs.items.itemconstructor; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.ItemsDropSettingsConfig; -import com.magmaguy.elitemobs.config.ItemsProceduralSettingsConfig; -import com.magmaguy.elitemobs.utils.VersionChecker; +import com.magmaguy.elitemobs.combatsystem.CombatSystem; +import com.magmaguy.elitemobs.config.ItemSettingsConfig; +import com.magmaguy.elitemobs.config.ProceduralItemGenerationSettingsConfig; +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfig; +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; +import com.magmaguy.elitemobs.items.EliteEnchantments; +import com.magmaguy.elitemobs.items.customenchantments.CriticalStrikesEnchantment; +import com.magmaguy.elitemobs.items.customenchantments.HunterEnchantment; import org.bukkit.Material; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.meta.ItemMeta; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; +import java.util.*; import java.util.concurrent.ThreadLocalRandom; public class EnchantmentGenerator { public static ItemMeta generateEnchantments(ItemMeta itemMeta, HashMap enchantmentMap) { - - for (Enchantment enchantment : enchantmentMap.keySet()) - if (enchantmentMap.get(enchantment) > 5 && ConfigValues.itemsDropSettingsConfig.getBoolean(ItemsDropSettingsConfig.ENABLE_CUSTOM_ENCHANTMENT_SYSTEM)) - itemMeta.addEnchant(enchantment, 5, true); - else - itemMeta.addEnchant(enchantment, enchantmentMap.get(enchantment), true); - + for (Map.Entry entry : enchantmentMap.entrySet()) { + if (entry == null) continue; + EnchantmentsConfigFields enchantmentsConfigFields = EnchantmentsConfig.getEnchantment(entry.getKey().getKey().getKey().toLowerCase(Locale.ROOT) + ".yml"); + if (enchantmentsConfigFields == null || !enchantmentsConfigFields.isEnabled()) continue; + if (enchantmentMap.get(entry.getKey()) > entry.getKey().getMaxLevel()) { + if (EliteEnchantments.isPotentialEliteEnchantment(entry.getKey())) { + if (enchantmentMap.get(entry.getKey()) > entry.getKey().getMaxLevel()) { + itemMeta.addEnchant(entry.getKey(), entry.getKey().getMaxLevel(), true); + } else + itemMeta.addEnchant(entry.getKey(), enchantmentMap.get(entry.getKey()), true); + } else + itemMeta.addEnchant(entry.getKey(), entry.getValue(), true); + } else { + itemMeta.addEnchant(entry.getKey(), entry.getValue(), true); + } + } return itemMeta; - } /* Note: For procedurally generated items the enchantments only get applied to the item at the lore phase This only gathers the list of enchantments to be applied */ - public static HashMap generateEnchantments(double itemTier, Material material) { + public static HashMap generateEnchantments(double itemTier, Material material, ItemMeta itemMeta) { HashMap enchantmentMap = new HashMap<>(); + itemTier -= CombatSystem.getMaterialTier(material); + /* No enchantments for items too low tier to have one */ if (itemTier < 1) return enchantmentMap; - HashMap validSecondaryEnchantments = new HashMap(); + HashMap validEnchantments = new HashMap(); /* Primary enchantments get instantly validated and applies since there is only one per item type Secondary enchantments get added to a common pool to be randomized later */ switch (material) { + case TRIDENT: + if (ThreadLocalRandom.current().nextDouble() < 0.5) + validEnchantments.putAll(validateEnchantments("LOYALTY")); + else + validEnchantments.putAll(validateEnchantments("CHANNELING")); + validEnchantments.putAll(validateEnchantments("RIPTIDE")); + validEnchantments.putAll(validateEnchantments("IMPALING")); case DIAMOND_SWORD: - case GOLD_SWORD: + case GOLDEN_SWORD: case IRON_SWORD: case STONE_SWORD: - case WOOD_SWORD: - enchantmentMap.putAll(validateAndApplyPrimaryEnchantment("DAMAGE_ALL", itemTier)); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("DAMAGE_ARTHROPODS")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("DAMAGE_UNDEAD")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("DURABILITY")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("FIRE_ASPECT")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("KNOCKBACK")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("LOOT_BONUS_MOBS")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("MENDING")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("SWEEPING_EDGE")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("VANISHING_CURSE")); + case WOODEN_SWORD: + validEnchantments.putAll(validateEnchantments("SHARPNESS")); + validEnchantments.putAll(validateEnchantments("BANE_OF_ARTHROPODS")); + validEnchantments.putAll(validateEnchantments("SMITE")); + validEnchantments.putAll(validateEnchantments("UNBREAKING")); + validEnchantments.putAll(validateEnchantments("FIRE_ASPECT")); + validEnchantments.putAll(validateEnchantments("KNOCKBACK")); + validEnchantments.putAll(validateEnchantments("LOOTING")); + validEnchantments.putAll(validateEnchantments("MENDING")); + validEnchantments.putAll(validateEnchantments("SWEEPING_EDGE")); + validEnchantments.putAll(validateEnchantments("VANISHING_CURSE")); break; case BOW: - enchantmentMap.putAll(validateAndApplyPrimaryEnchantment("ARROW_DAMAGE", itemTier)); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("ARROW_FIRE")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("ARROW_INFINITE")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("ARROW_KNOCKBACK")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("DURABILITY")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("MENDING")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("VANISHING_CURSE")); + validEnchantments.putAll(validateEnchantments("POWER")); + validEnchantments.putAll(validateEnchantments("FLAME")); + validEnchantments.putAll(validateEnchantments("INFINITY")); + validEnchantments.putAll(validateEnchantments("PUNCH")); + validEnchantments.putAll(validateEnchantments("UNBREAKING")); + validEnchantments.putAll(validateEnchantments("MENDING")); + validEnchantments.putAll(validateEnchantments("VANISHING_CURSE")); + break; + case CROSSBOW: + validEnchantments.putAll(validateEnchantments("POWER")); + validEnchantments.putAll(validateEnchantments("QUICK_CHARGE")); + validEnchantments.putAll(validateEnchantments("MULTISHOT")); + validEnchantments.putAll(validateEnchantments("PIERCING")); + validEnchantments.putAll(validateEnchantments("UNBREAKING")); + validEnchantments.putAll(validateEnchantments("MENDING")); + validEnchantments.putAll(validateEnchantments("VANISHING_CURSE")); break; case DIAMOND_PICKAXE: - case GOLD_PICKAXE: + case GOLDEN_PICKAXE: case IRON_PICKAXE: case STONE_PICKAXE: - case WOOD_PICKAXE: - enchantmentMap.putAll(validateAndApplyPrimaryEnchantment("DIG_SPEED", itemTier)); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("DURABILITY")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("MENDING")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("VANISHING_CURSE")); + case WOODEN_PICKAXE: + validEnchantments.putAll(validateEnchantments("EFFICIENCY")); + validEnchantments.putAll(validateEnchantments("UNBREAKING")); + validEnchantments.putAll(validateEnchantments("MENDING")); + validEnchantments.putAll(validateEnchantments("VANISHING_CURSE")); //TODO: this doesn't take config into account if (ThreadLocalRandom.current().nextDouble() < 0.5) { - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("LOOT_BONUS_BLOCKS")); + validEnchantments.putAll(validateEnchantments("FORTUNE")); } else { - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("SILK_TOUCH")); + validEnchantments.putAll(validateEnchantments("SILK_TOUCH")); } break; - case DIAMOND_SPADE: - case GOLD_SPADE: - case IRON_SPADE: - case STONE_SPADE: - case WOOD_SPADE: - enchantmentMap.putAll(validateAndApplyPrimaryEnchantment("DIG_SPEED", itemTier)); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("DURABILITY")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("MENDING")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("VANISHING_CURSE")); + case DIAMOND_SHOVEL: + case GOLDEN_SHOVEL: + case IRON_SHOVEL: + case STONE_SHOVEL: + case WOODEN_SHOVEL: + validEnchantments.putAll(validateEnchantments("EFFICIENCY")); + validEnchantments.putAll(validateEnchantments("UNBREAKING")); + validEnchantments.putAll(validateEnchantments("MENDING")); + validEnchantments.putAll(validateEnchantments("VANISHING_CURSE")); if (ThreadLocalRandom.current().nextDouble() < 0.5) { - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("LOOT_BONUS_BLOCKS")); + validEnchantments.putAll(validateEnchantments("FORTUNE")); } else { - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("SILK_TOUCH")); + validEnchantments.putAll(validateEnchantments("SILK_TOUCH")); } break; case DIAMOND_HOE: - case GOLD_HOE: + case GOLDEN_HOE: case IRON_HOE: case STONE_HOE: - case WOOD_HOE: + case WOODEN_HOE: + if (ItemSettingsConfig.isUseHoesAsWeapons()) + validEnchantments.putAll(validateEnchantments("SHARPNESS")); + validEnchantments.putAll(validateEnchantments("EFFICIENCY")); + validEnchantments.putAll(validateEnchantments("UNBREAKING")); + validEnchantments.putAll(validateEnchantments("MENDING")); + validEnchantments.putAll(validateEnchantments("VANISHING_CURSE")); + if (ThreadLocalRandom.current().nextDouble() < 0.5) { + validEnchantments.putAll(validateEnchantments("FORTUNE")); + } else { + validEnchantments.putAll(validateEnchantments("SILK_TOUCH")); + } + break; case SHIELD: - enchantmentMap.putAll(validateAndApplyPrimaryEnchantment("DURABILITY", itemTier)); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("MENDING")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("VANISHING_CURSE")); + validEnchantments.putAll(validateEnchantments("UNBREAKING")); + validEnchantments.putAll(validateEnchantments("MENDING")); + validEnchantments.putAll(validateEnchantments("VANISHING_CURSE")); break; case DIAMOND_AXE: - case GOLD_AXE: + case GOLDEN_AXE: case IRON_AXE: case STONE_AXE: - case WOOD_AXE: - enchantmentMap.putAll(validateAndApplyPrimaryEnchantment("DAMAGE_ALL", itemTier)); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("DAMAGE_ARTHROPODS")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("DAMAGE_UNDEAD")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("DURABILITY")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("MENDING")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("VANISHING_CURSE")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("DIG_SPEED")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("LOOT_BONUS_BLOCKS")); + case WOODEN_AXE: + validEnchantments.putAll(validateEnchantments("SHARPNESS")); + validEnchantments.putAll(validateEnchantments("BANE_OF_ARTHROPODS")); + validEnchantments.putAll(validateEnchantments("SMITE")); + validEnchantments.putAll(validateEnchantments("UNBREAKING")); + validEnchantments.putAll(validateEnchantments("MENDING")); + validEnchantments.putAll(validateEnchantments("VANISHING_CURSE")); + validEnchantments.putAll(validateEnchantments("EFFICIENCY")); + validEnchantments.putAll(validateEnchantments("FORTUNE")); break; case CHAINMAIL_HELMET: case DIAMOND_HELMET: - case GOLD_HELMET: + case GOLDEN_HELMET: case IRON_HELMET: case LEATHER_HELMET: - enchantmentMap.putAll(validateAndApplyPrimaryEnchantment("PROTECTION_ENVIRONMENTAL", itemTier)); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("BINDING_CURSE")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("DURABILITY")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("MENDING")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("OXYGEN")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("PROTECTION_EXPLOSIONS")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("PROTECTION_FIRE")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("PROTECTION_PROJECTILE")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("THORNS")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("VANISHING_CURSE")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("WATER_WORKER")); + case TURTLE_HELMET: + validEnchantments.putAll(validateEnchantments("PROTECTION")); + validEnchantments.putAll(validateEnchantments("BINDING_CURSE")); + validEnchantments.putAll(validateEnchantments("UNBREAKING")); + validEnchantments.putAll(validateEnchantments("MENDING")); + validEnchantments.putAll(validateEnchantments("RESPIRATION")); + validEnchantments.putAll(validateEnchantments("BLAST_PROTECTION")); + validEnchantments.putAll(validateEnchantments("FIRE_PROTECTION")); + validEnchantments.putAll(validateEnchantments("PROJECTILE_PROTECTION")); + validEnchantments.putAll(validateEnchantments("THORNS")); + validEnchantments.putAll(validateEnchantments("VANISHING_CURSE")); + validEnchantments.putAll(validateEnchantments("AQUA_AFFINITY")); break; case CHAINMAIL_CHESTPLATE: case DIAMOND_CHESTPLATE: - case GOLD_CHESTPLATE: + case GOLDEN_CHESTPLATE: case IRON_CHESTPLATE: case LEATHER_CHESTPLATE: - enchantmentMap.putAll(validateAndApplyPrimaryEnchantment("PROTECTION_ENVIRONMENTAL", itemTier)); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("DURABILITY")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("MENDING")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("PROTECTION_EXPLOSIONS")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("PROTECTION_FIRE")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("PROTECTION_PROJECTILE")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("THORNS")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("VANISHING_CURSE")); + validEnchantments.putAll(validateEnchantments("PROTECTION")); + validEnchantments.putAll(validateEnchantments("UNBREAKING")); + validEnchantments.putAll(validateEnchantments("MENDING")); + validEnchantments.putAll(validateEnchantments("BLAST_PROTECTION")); + validEnchantments.putAll(validateEnchantments("FIRE_PROTECTION")); + validEnchantments.putAll(validateEnchantments("PROJECTILE_PROTECTION")); + validEnchantments.putAll(validateEnchantments("THORNS")); + validEnchantments.putAll(validateEnchantments("VANISHING_CURSE")); break; case CHAINMAIL_LEGGINGS: case DIAMOND_LEGGINGS: - case GOLD_LEGGINGS: + case GOLDEN_LEGGINGS: case IRON_LEGGINGS: case LEATHER_LEGGINGS: - enchantmentMap.putAll(validateAndApplyPrimaryEnchantment("PROTECTION_ENVIRONMENTAL", itemTier)); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("BINDING_CURSE")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("DURABILITY")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("MENDING")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("PROTECTION_EXPLOSIONS")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("PROTECTION_FIRE")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("PROTECTION_PROJECTILE")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("THORNS")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("VANISHING_CURSE")); + validEnchantments.putAll(validateEnchantments("PROTECTION")); + validEnchantments.putAll(validateEnchantments("BINDING_CURSE")); + validEnchantments.putAll(validateEnchantments("UNBREAKING")); + validEnchantments.putAll(validateEnchantments("MENDING")); + validEnchantments.putAll(validateEnchantments("BLAST_PROTECTION")); + validEnchantments.putAll(validateEnchantments("FIRE_PROTECTION")); + validEnchantments.putAll(validateEnchantments("PROJECTILE_PROTECTION")); + validEnchantments.putAll(validateEnchantments("THORNS")); + validEnchantments.putAll(validateEnchantments("VANISHING_CURSE")); break; case CHAINMAIL_BOOTS: case DIAMOND_BOOTS: - case GOLD_BOOTS: + case GOLDEN_BOOTS: case IRON_BOOTS: case LEATHER_BOOTS: - enchantmentMap.putAll(validateAndApplyPrimaryEnchantment("PROTECTION_ENVIRONMENTAL", itemTier)); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("BINDING_CURSE")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("DURABILITY")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("MENDING")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("PROTECTION_EXPLOSIONS")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("PROTECTION_FALL")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("PROTECTION_FIRE")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("PROTECTION_PROJECTILE")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("THORNS")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("VANISHING_CURSE")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("DEPTH_STRIDER")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("FROST_WALKER")); + validEnchantments.putAll(validateEnchantments("PROTECTION")); + validEnchantments.putAll(validateEnchantments("BINDING_CURSE")); + validEnchantments.putAll(validateEnchantments("UNBREAKING")); + validEnchantments.putAll(validateEnchantments("MENDING")); + validEnchantments.putAll(validateEnchantments("BLAST_PROTECTION")); + validEnchantments.putAll(validateEnchantments("FEATHER_FALLING")); + validEnchantments.putAll(validateEnchantments("FIRE_PROTECTION")); + validEnchantments.putAll(validateEnchantments("PROJECTILE_PROTECTION")); + validEnchantments.putAll(validateEnchantments("THORNS")); + validEnchantments.putAll(validateEnchantments("VANISHING_CURSE")); + validEnchantments.putAll(validateEnchantments("DEPTH_STRIDER")); + validEnchantments.putAll(validateEnchantments("FROST_WALKER")); + validEnchantments.putAll(validateEnchantments("SOUL_SPEED")); break; case FISHING_ROD: - enchantmentMap.putAll(validateAndApplyPrimaryEnchantment("DURABILITY", itemTier)); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("VANISHING_CURSE")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("MENDING")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("LUCK")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("LURE")); + validEnchantments.putAll(validateEnchantments("UNBREAKING")); + validEnchantments.putAll(validateEnchantments("VANISHING_CURSE")); + validEnchantments.putAll(validateEnchantments("MENDING")); + validEnchantments.putAll(validateEnchantments("LUCK_OF_THE_SEA")); + validEnchantments.putAll(validateEnchantments("LURE")); break; case SHEARS: - enchantmentMap.putAll(validateAndApplyPrimaryEnchantment("DIG_SPEED", itemTier)); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("VANISHING_CURSE")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("MENDING")); - validSecondaryEnchantments.putAll(validateSecondaryEnchantments("DURABILITY")); + validEnchantments.putAll(validateEnchantments("EFFICIENCY")); + validEnchantments.putAll(validateEnchantments("VANISHING_CURSE")); + validEnchantments.putAll(validateEnchantments("MENDING")); + validEnchantments.putAll(validateEnchantments("UNBREAKING")); break; } /* Now that the primary enchantments are applied and the secondary enchantments are parsed, apply secondary enchants */ - int secondaryEnchantmentTotalParsedLevel = totalSecondaryEnchantmentCount(validSecondaryEnchantments); + int secondaryEnchantmentTotalParsedLevel = totalSecondaryEnchantmentCount(validEnchantments); int maxSecondaryEnchantmentLevel = (secondaryEnchantmentTotalParsedLevel < itemTier - 2) ? secondaryEnchantmentTotalParsedLevel : (int) itemTier; int secondaryEnchantmentCount = ThreadLocalRandom.current().nextInt(maxSecondaryEnchantmentLevel + 1); - if (itemTier < 2 || secondaryEnchantmentCount < 1 || validSecondaryEnchantments.size() == 0) + if (itemTier < 2 || secondaryEnchantmentCount < 1 || validEnchantments.size() == 0) { + generateEnchantments(itemMeta, enchantmentMap); return enchantmentMap; + } - HashMap validEnchantmentsClone = (HashMap) validSecondaryEnchantments.clone(); - - while (secondaryEnchantmentCount != 0) { + HashMap validEnchantmentsClone = (HashMap) validEnchantments.clone(); - if (validSecondaryEnchantments.size() < 1) { + while (ThreadLocalRandom.current().nextBoolean()) { + if (validEnchantments.size() < 1) break; - } - - int randomIndex = ThreadLocalRandom.current().nextInt(validSecondaryEnchantments.size()); + int randomIndex = ThreadLocalRandom.current().nextInt(validEnchantments.size()); List enchantmentList = new ArrayList(); - for (Enchantment enchantment : validSecondaryEnchantments.keySet()) { - + for (Enchantment enchantment : validEnchantments.keySet()) enchantmentList.add(enchantment); - } - Enchantment enchantment = enchantmentList.get(randomIndex); - validSecondaryEnchantments.put(enchantment, validSecondaryEnchantments.get(enchantment) - 1); + validEnchantments.put(enchantment, validEnchantments.get(enchantment) - 1); - int finalEnchantLevel = validEnchantmentsClone.get(enchantment) - validSecondaryEnchantments.get(enchantment); + int finalEnchantLevel = validEnchantmentsClone.get(enchantment) - validEnchantments.get(enchantment); enchantmentMap.put(enchantment, finalEnchantLevel); - int newEnchantInt = validSecondaryEnchantments.get(enchantment); + int newEnchantInt = validEnchantments.get(enchantment); - if (newEnchantInt == 0) validSecondaryEnchantments.remove(enchantment); + if (newEnchantInt == 0) validEnchantments.remove(enchantment); secondaryEnchantmentCount--; } + //this applies the vanilla enchants + generateEnchantments(itemMeta, enchantmentMap); + return enchantmentMap; } - public static HashMap generateCustomEnchantments(double itemTier, Material material){ + public static HashMap generateCustomEnchantments(double itemTier, Material material) { HashMap enchantmentMap = new HashMap<>(); @@ -272,65 +313,70 @@ public static HashMap generateCustomEnchantments(double itemTie */ switch (material) { case DIAMOND_SWORD: - case GOLD_SWORD: + case GOLDEN_SWORD: case IRON_SWORD: case STONE_SWORD: - case WOOD_SWORD: + case WOODEN_SWORD: + case TRIDENT: + validSecondaryEnchantments.putAll(validateSecondaryCustomEnchantments(CriticalStrikesEnchantment.key)); break; case BOW: + case CROSSBOW: + validSecondaryEnchantments.putAll(validateSecondaryCustomEnchantments(CriticalStrikesEnchantment.key)); break; case DIAMOND_PICKAXE: - case GOLD_PICKAXE: + case GOLDEN_PICKAXE: case IRON_PICKAXE: case STONE_PICKAXE: - case WOOD_PICKAXE: + case WOODEN_PICKAXE: break; - case DIAMOND_SPADE: - case GOLD_SPADE: - case IRON_SPADE: - case STONE_SPADE: - case WOOD_SPADE: + case DIAMOND_SHOVEL: + case GOLDEN_SHOVEL: + case IRON_SHOVEL: + case STONE_SHOVEL: + case WOODEN_SHOVEL: break; case DIAMOND_HOE: - case GOLD_HOE: + case GOLDEN_HOE: case IRON_HOE: case STONE_HOE: - case WOOD_HOE: + case WOODEN_HOE: case SHIELD: break; case DIAMOND_AXE: - case GOLD_AXE: + case GOLDEN_AXE: case IRON_AXE: case STONE_AXE: - case WOOD_AXE: + case WOODEN_AXE: + validSecondaryEnchantments.putAll(validateSecondaryCustomEnchantments(CriticalStrikesEnchantment.key)); break; case CHAINMAIL_HELMET: case DIAMOND_HELMET: - case GOLD_HELMET: + case GOLDEN_HELMET: case IRON_HELMET: case LEATHER_HELMET: - validSecondaryEnchantments.putAll(validateSecondaryCustomEnchantments("HUNTER")); + validSecondaryEnchantments.putAll(validateSecondaryCustomEnchantments(HunterEnchantment.key)); break; case CHAINMAIL_CHESTPLATE: case DIAMOND_CHESTPLATE: - case GOLD_CHESTPLATE: + case GOLDEN_CHESTPLATE: case IRON_CHESTPLATE: case LEATHER_CHESTPLATE: - validSecondaryEnchantments.putAll(validateSecondaryCustomEnchantments("HUNTER")); + validSecondaryEnchantments.putAll(validateSecondaryCustomEnchantments(HunterEnchantment.key)); break; case CHAINMAIL_LEGGINGS: case DIAMOND_LEGGINGS: - case GOLD_LEGGINGS: + case GOLDEN_LEGGINGS: case IRON_LEGGINGS: case LEATHER_LEGGINGS: - validSecondaryEnchantments.putAll(validateSecondaryCustomEnchantments("HUNTER")); + validSecondaryEnchantments.putAll(validateSecondaryCustomEnchantments(HunterEnchantment.key)); break; case CHAINMAIL_BOOTS: case DIAMOND_BOOTS: - case GOLD_BOOTS: + case GOLDEN_BOOTS: case IRON_BOOTS: case LEATHER_BOOTS: - validSecondaryEnchantments.putAll(validateSecondaryCustomEnchantments("HUNTER")); + validSecondaryEnchantments.putAll(validateSecondaryCustomEnchantments(HunterEnchantment.key)); break; case FISHING_ROD: break; @@ -341,12 +387,12 @@ public static HashMap generateCustomEnchantments(double itemTie /* Now that the primary enchantments are applied and the secondary enchantments are parsed, apply secondary enchants */ - int secondaryEnchantmentTotalParsedLevel = totalSecondaryCustomEnchantmentCount(validSecondaryEnchantments); + int secondaryEnchantmentTotalParsedLevel = totalEnchantmentCount(validSecondaryEnchantments); if (itemTier < 2 || secondaryEnchantmentTotalParsedLevel < 1 || validSecondaryEnchantments.size() == 0) return enchantmentMap; - if (ThreadLocalRandom.current().nextDouble() > ConfigValues.itemsProceduralSettingsConfig.getDouble(ItemsProceduralSettingsConfig.CUSTOM_ENCHANTMENT_CHANCE)) + if (ThreadLocalRandom.current().nextDouble() > ProceduralItemGenerationSettingsConfig.getCustomEnchantmentChance()) return enchantmentMap; /* @@ -356,131 +402,69 @@ public static HashMap generateCustomEnchantments(double itemTie } - private static HashMap validateAndApplyPrimaryEnchantment(String string, double itemTier) { - - HashMap enchantmentMap = new HashMap<>(); + private static HashMap validateEnchantments(String string) { - String mainString = "Valid Enchantments." + string; + EnchantmentsConfigFields enchantmentsConfigFields = EnchantmentsConfig.getEnchantment(string.toLowerCase(Locale.ROOT) + ".yml"); - if (ConfigValues.itemsProceduralSettingsConfig.getBoolean(mainString + ".Allow")) { + if (enchantmentsConfigFields == null || + !enchantmentsConfigFields.isEnabled() || + !enchantmentsConfigFields.isEnabledForProcedurallyGeneratedItems()) + return new HashMap<>(); - int maxEnchantmentLevel; - - if (ConfigValues.itemsProceduralSettingsConfig.contains(mainString + ".Max Level")) { - - maxEnchantmentLevel = ConfigValues.itemsProceduralSettingsConfig.getInt(mainString + ".Max Level"); - - } else { - - maxEnchantmentLevel = 1; - - } - - int enchantmentLevel = (maxEnchantmentLevel < itemTier) ? maxEnchantmentLevel : (int) itemTier; - - //index for random getting + HashMap enchantmentMap = new HashMap<>(); - enchantmentMap.put(Enchantment.getByName(string), enchantmentLevel); + //Make sure vanishing and binding curses aren't always there + if (string.equalsIgnoreCase("VANISHING_CURSE") || string.equalsIgnoreCase("BINDING_CURSE")) + if (ThreadLocalRandom.current().nextDouble() < 0.5) + return enchantmentMap; + if (enchantmentsConfigFields != null && enchantmentsConfigFields.isEnabled()) { + Enchantment enchantment = enchantmentsConfigFields.getEnchantment(); + enchantmentMap.put(enchantment, enchantmentsConfigFields.getMaxLevel()); } return enchantmentMap; } - private static HashMap validateSecondaryEnchantments(String string) { - - HashMap hashMap = new HashMap(); - - if (enchantmentBackwardsCompatibility(7, 0, string, "LURE")) return hashMap; - if (enchantmentBackwardsCompatibility(7, 0, string, "LUCK")) return hashMap; - if (enchantmentBackwardsCompatibility(8, 0, string, "DEPTH_STRIDER")) return hashMap; - if (enchantmentBackwardsCompatibility(9, 0, string, "MENDING")) return hashMap; - if (enchantmentBackwardsCompatibility(9, 0, string, "FROST_WALKER")) return hashMap; - if (enchantmentBackwardsCompatibility(11, 0, string, "VANISHING_CURSE")) return hashMap; - if (enchantmentBackwardsCompatibility(11, 0, string, "BINDING_CURSE")) return hashMap; - if (enchantmentBackwardsCompatibility(11, 1, string, "SWEEP")) return hashMap; - - String mainString = "Valid Enchantments." + string; - - if (ConfigValues.itemsProceduralSettingsConfig.getBoolean(mainString + ".Allow")) { - - int enchantmentLevel; - - if (ConfigValues.itemsProceduralSettingsConfig.contains(mainString + ".Max Level")) { - - enchantmentLevel = ConfigValues.itemsProceduralSettingsConfig.getInt(mainString + ".Max Level"); - - } else { - - enchantmentLevel = 1; - - } - - hashMap.put(Enchantment.getByName(string), enchantmentLevel); - - } - - return hashMap; - - } - private static HashMap validateSecondaryCustomEnchantments(String string) { - HashMap hashMap = new HashMap(); + EnchantmentsConfigFields enchantmentsConfigFields = EnchantmentsConfig.getEnchantment(string.toLowerCase(Locale.ROOT) + ".yml"); - String mainString = "Valid Enchantments." + string; + if (enchantmentsConfigFields == null || + !enchantmentsConfigFields.isEnabled() || + !enchantmentsConfigFields.isEnabledForProcedurallyGeneratedItems()) + return new HashMap<>(); - if (ConfigValues.itemsProceduralSettingsConfig.getBoolean(mainString + ".Allow")) { - - int enchantmentLevel; - - if (ConfigValues.itemsProceduralSettingsConfig.contains(mainString + ".Max Level")) { - - //TODO: actually implement this properly - enchantmentLevel = ThreadLocalRandom.current().nextInt(ConfigValues.itemsProceduralSettingsConfig.getInt(mainString + ".Max Level")) + 1; - - } else { - - enchantmentLevel = 1; - - } - - hashMap.put(string, enchantmentLevel); + HashMap enchantmentMap = new HashMap<>(); - } + if (enchantmentsConfigFields != null && enchantmentsConfigFields.isEnabled()) + enchantmentMap.put(string, ThreadLocalRandom.current().nextInt(enchantmentsConfigFields.getMaxLevel()) + 1); - return hashMap; + return enchantmentMap; } - private static int totalSecondaryEnchantmentCount(HashMap validSecondaryEnchantments) { + private static int totalSecondaryEnchantmentCount(HashMap validEnchantments) { int totalCount = 0; - for (Enchantment enchantment : validSecondaryEnchantments.keySet()) - totalCount += validSecondaryEnchantments.get(enchantment); + for (Enchantment enchantment : validEnchantments.keySet()) + totalCount += validEnchantments.get(enchantment); return totalCount; } - private static int totalSecondaryCustomEnchantmentCount(HashMap validSecondaryEnchantments) { + private static int totalEnchantmentCount(HashMap validEnchantments) { int totalCount = 0; - for (String enchantment : validSecondaryEnchantments.keySet()) - totalCount += validSecondaryEnchantments.get(enchantment); + for (String enchantment : validEnchantments.keySet()) + totalCount += validEnchantments.get(enchantment); return totalCount; } - //Version and subVersion should be set to the update at which the enchantment was introduced - private static boolean enchantmentBackwardsCompatibility(int version, int subVersion, String actualEnchantement, String enchantmentToAvoid) { - - return !VersionChecker.currentVersionIsUnder(version, subVersion) && actualEnchantement.equalsIgnoreCase(enchantmentToAvoid); - - } - } diff --git a/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/ItemConstructor.java b/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/ItemConstructor.java index e4bebbff2..71a2cc1c7 100644 --- a/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/ItemConstructor.java +++ b/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/ItemConstructor.java @@ -1,39 +1,57 @@ package com.magmaguy.elitemobs.items.itemconstructor; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.ItemsDropSettingsConfig; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.utils.EliteItemManager; +import com.magmaguy.elitemobs.items.EliteItemLore; +import com.magmaguy.elitemobs.items.ItemTagger; +import com.magmaguy.elitemobs.items.customenchantments.SoulbindEnchantment; +import com.magmaguy.elitemobs.items.potioneffects.ElitePotionEffectContainer; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.ItemStackGenerator; import org.bukkit.Material; +import org.bukkit.NamespacedKey; import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemFlag; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataType; import java.util.HashMap; import java.util.List; +import java.util.Objects; public class ItemConstructor { - /* - For custom and unique items - */ - public static ItemStack constructItem(String rawName, Material material, HashMap enchantments, HashMap customEnchantments, List potionEffects, - List lore, String dropType, String scalabilityType) { - - ItemStack itemStack; - ItemMeta itemMeta; - + public static ItemStack constructItem(int level, + String rawName, + Material material, + HashMap enchantments, + HashMap customEnchantments, + List potionEffects, + List lore, + EliteEntity eliteEntity, + Player player, + boolean showItemWorth, + int customModelID, + boolean soulbound, + String filename) { /* - Generate material + Construct initial item */ - Material itemMaterial = MaterialGenerator.generateMaterial(material); - + ItemStack itemStack = ItemStackGenerator.generateItemStack(material); /* - Construct initial item + Set the item level + */ + if (level != -1) + EliteItemManager.setEliteLevel(itemStack, level); + /* + Get meta */ - itemStack = ItemStackGenerator.generateItemStack(material); - itemMeta = itemStack.getItemMeta(); + ItemMeta itemMeta = itemStack.getItemMeta(); + + itemMeta.setDisplayName(ChatColorConverter.convert(rawName)); /* Generate item enchantments @@ -41,90 +59,73 @@ public static ItemStack constructItem(String rawName, Material material, HashMap in the item lore and get interpreted by the combat system */ if (!enchantments.isEmpty()) - itemMeta = EnchantmentGenerator.generateEnchantments(itemMeta, enchantments); + EnchantmentGenerator.generateEnchantments(itemMeta, enchantments); - /* - Generate item lore - */ - itemMeta = LoreGenerator.generateLore(itemMeta, itemMaterial, enchantments, customEnchantments, potionEffects, lore); + itemStack.setItemMeta(itemMeta); /* - Remove vanilla enchantments + Generate item lore */ - if (ConfigValues.itemsDropSettingsConfig.getBoolean(ItemsDropSettingsConfig.ENABLE_CUSTOM_ENCHANTMENT_SYSTEM)) - itemMeta.addItemFlags(ItemFlag.HIDE_ENCHANTS); + if (lore != null && !lore.isEmpty()) + ItemTagger.registerCustomLore(itemMeta, lore); - /* - Generate item name last as it relies on material type and quality - */ - itemMeta.setDisplayName(NameGenerator.generateName(rawName)); + //Tag the potion effects + new ElitePotionEffectContainer(itemMeta, potionEffects); - /* - Colorize with MMO colors - */ itemStack.setItemMeta(itemMeta); - ItemQualityColorizer.dropQualityColorizer(itemStack); - /* - Add item to relevant loot lists - */ - DropWeightHandler.process(dropType, itemStack); + //Apply custom model id + if (customModelID > 0) { + itemMeta.setCustomModelData(customModelID); + itemStack.setItemMeta(itemMeta); + } - /* - Handle item scalability - */ - ScalabilityAssigner.assign(itemStack, rawName, material, enchantments, customEnchantments, potionEffects, lore, - dropType, scalabilityType); - return itemStack; + //Register filename of the custom item into the persistent metadata + Objects.requireNonNull(itemMeta).getPersistentDataContainer().set(new NamespacedKey(MetadataHandler.PLUGIN, filename), PersistentDataType.STRING, filename); + itemStack.setItemMeta(itemMeta); + return commonFeatures(itemStack, eliteEntity, player, enchantments, customEnchantments, showItemWorth, soulbound); } /* - For scalable items + For procedurally generated items */ - - public static ItemStack constructItem(String rawName, Material material, HashMap enchantments, HashMap customEnchantments, List potionEffects, - List lore) { - - ItemStack itemStack; - ItemMeta itemMeta; + public static ItemStack constructItem(double itemTier, EliteEntity killedMob, Player player, boolean showItemWorth) { /* Generate material */ - Material itemMaterial = MaterialGenerator.generateMaterial(material); - + Material itemMaterial = MaterialGenerator.generateMaterial(itemTier); /* Construct initial item */ - itemStack = ItemStackGenerator.generateItemStack(material); - itemMeta = itemStack.getItemMeta(); - + ItemStack itemStack = ItemStackGenerator.generateItemStack(itemMaterial); /* - Generate item enchantments - Note: This only applies enchantments up to a certain level, above that threshold item enchantments only exist - in the item lore and get interpreted by the combat system + Set the item level */ - if (!enchantments.isEmpty()) - itemMeta = EnchantmentGenerator.generateEnchantments(itemMeta, enchantments); - + EliteItemManager.setEliteLevel(itemStack, (int) Math.round(itemTier)); /* - Generate item lore + Get meta */ - itemMeta = LoreGenerator.generateLore(itemMeta, itemMaterial, enchantments, customEnchantments, potionEffects, lore); + ItemMeta itemMeta = itemStack.getItemMeta(); + + /* + Generate item enchantments + Note: This only gets a list of enchantments to be applied later at the lore stage + */ + HashMap enchantmentMap = EnchantmentGenerator.generateEnchantments(itemTier, itemMaterial, itemMeta); /* - Remove vanilla enchantments + Generate custom enchantments + Note: This only gets a list of enchantments to be applied later at the lore stage */ - if (ConfigValues.itemsDropSettingsConfig.getBoolean(ItemsDropSettingsConfig.ENABLE_CUSTOM_ENCHANTMENT_SYSTEM)) - itemMeta.addItemFlags(ItemFlag.HIDE_ENCHANTS); + HashMap customEnchantmentMap = EnchantmentGenerator.generateCustomEnchantments(itemTier, itemMaterial); /* - Generate item name last as it relies on material type and quality + Generate item name */ - itemMeta.setDisplayName(NameGenerator.generateName(rawName)); + itemMeta.setDisplayName(NameGenerator.generateName(itemMaterial)); /* Colorize with MMO colors @@ -132,65 +133,51 @@ public static ItemStack constructItem(String rawName, Material material, HashMap itemStack.setItemMeta(itemMeta); ItemQualityColorizer.dropQualityColorizer(itemStack); - return itemStack; + return commonFeatures(itemStack, killedMob, player, enchantmentMap, customEnchantmentMap, showItemWorth, true); + } - /* - For procedurally generated items - */ - public static ItemStack constructItem(double itemTier, EliteMobEntity killedMob) { + private static ItemStack commonFeatures(ItemStack itemStack, + EliteEntity eliteEntity, + Player player, + HashMap enchantments, + HashMap customEnchantments, + boolean showItemWorth, + boolean soulbound) { - ItemStack itemStack; - ItemMeta itemMeta; + ItemMeta itemMeta = itemStack.getItemMeta(); - /* - Generate material - */ - Material itemMaterial = MaterialGenerator.generateMaterial(itemTier); + //hide default lore + itemMeta.addItemFlags(ItemFlag.HIDE_ENCHANTS); /* - Construct initial item + Register elite item */ - itemStack = ItemStackGenerator.generateItemStack(itemMaterial); - itemMeta = itemStack.getItemMeta(); - - /* - Generate item enchantments - Note: This only gets a list of enchantments to be applied later at the lore stage - */ - HashMap enchantmentMap = EnchantmentGenerator.generateEnchantments(itemTier, itemMaterial); + ItemTagger.registerEliteItem(itemMeta); /* - Generate custom enchantments - Note: This only gets a list of enchantments to be applied later at the lore stage + Register item source for lore redraw */ - HashMap customEnchantmentMap = EnchantmentGenerator.generateCustomEnchantments(itemTier, itemMaterial); + ItemTagger.registerItemSource(eliteEntity, itemMeta); - /* - Generate item lore - */ - itemMeta = LoreGenerator.generateLore(itemMeta, itemMaterial, enchantmentMap, customEnchantmentMap, killedMob); + //Tag the item + ItemTagger.registerEnchantments(itemMeta, enchantments); + ItemTagger.registerCustomEnchantments(itemMeta, customEnchantments); - /* - Remove vanilla enchantments - */ - if (ConfigValues.itemsDropSettingsConfig.getBoolean(ItemsDropSettingsConfig.ENABLE_CUSTOM_ENCHANTMENT_SYSTEM)) - itemMeta.addItemFlags(ItemFlag.HIDE_ENCHANTS); + itemStack.setItemMeta(itemMeta); /* - Generate item name + Add soulbind if applicable */ - itemMeta.setDisplayName(NameGenerator.generateName(itemMaterial)); + if (soulbound) SoulbindEnchantment.addEnchantment(itemStack, player); /* - Colorize with MMO colors + Update lore */ - itemStack.setItemMeta(itemMeta); - ItemQualityColorizer.dropQualityColorizer(itemStack); + new EliteItemLore(itemStack, showItemWorth); return itemStack; } - } diff --git a/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/ItemQualityColorizer.java b/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/ItemQualityColorizer.java index b8b7190be..06e304329 100644 --- a/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/ItemQualityColorizer.java +++ b/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/ItemQualityColorizer.java @@ -1,26 +1,9 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package com.magmaguy.elitemobs.items.itemconstructor; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.DefaultConfig; -import com.magmaguy.elitemobs.config.ItemsProceduralSettingsConfig; +import com.magmaguy.elitemobs.config.ItemSettingsConfig; +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfig; import org.bukkit.ChatColor; import org.bukkit.Material; -import org.bukkit.configuration.Configuration; import org.bukkit.enchantments.Enchantment; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; @@ -30,50 +13,9 @@ public class ItemQualityColorizer { - public enum ItemQuality { - LIGHT_BLUE, - GOLD, - PURPLE, - BLUE, - GREEN, - WHITE, - GRAY - } - - /* - item quality: light blue (above max config enchant level) > gold > purple > blue > green > white > gray - */ - private static final int ARROW_DAMAGE = enchantMaxValueGetter(ItemsProceduralSettingsConfig.ARROW_DAMAGE_BOOL, ItemsProceduralSettingsConfig.ARROW_DAMAGE_MAX_LEVEL); - private static final int ARROW_FIRE = enchantMaxValueGetter(ItemsProceduralSettingsConfig.ARROW_FIRE_BOOL, ItemsProceduralSettingsConfig.ARROW_FIRE_MAX_LEVEL); - private static final int ARROW_INFINITE = enchantMaxValueGetter(ItemsProceduralSettingsConfig.ARROW_INFINITE_BOOL); - private static final int ARROW_KNOCKBACK = enchantMaxValueGetter(ItemsProceduralSettingsConfig.ARROW_KNOCKBACK_BOOL, ItemsProceduralSettingsConfig.ARROW_KNOCKBACK_MAX_LEVEL); - private static final int BINDING_CURSE = enchantMaxValueGetter(ItemsProceduralSettingsConfig.BINDING_CURSE_BOOL); - private static final int DAMAGE_ALL = enchantMaxValueGetter(ItemsProceduralSettingsConfig.DAMAGE_ALL_BOOL, ItemsProceduralSettingsConfig.DAMAGE_ALL_MAX_LEVEL); - private static final int DAMAGE_ARTHROPODS = enchantMaxValueGetter(ItemsProceduralSettingsConfig.DAMAGE_ARTHROPODS_BOOL, ItemsProceduralSettingsConfig.DAMAGE_ARTHROPODS_MAX_LEVEL); - private static final int DAMAGE_UNDEAD = enchantMaxValueGetter(ItemsProceduralSettingsConfig.DAMAGE_UNDEAD_BOOL, ItemsProceduralSettingsConfig.DAMAGE_UNDEAD_MAX_LEVEL); - private static final int DEPTH_STRIDER = enchantMaxValueGetter(ItemsProceduralSettingsConfig.DEPTH_STRIDER_BOOL, ItemsProceduralSettingsConfig.DEPTH_STRIDER_MAX_LEVEL); - private static final int DIG_SPEED = enchantMaxValueGetter(ItemsProceduralSettingsConfig.DIG_SPEED_BOOL, ItemsProceduralSettingsConfig.DIG_SPEED_MAX_LEVEL); - private static final int DURABILITY = enchantMaxValueGetter(ItemsProceduralSettingsConfig.DURABILITY_BOOL, ItemsProceduralSettingsConfig.DURABILITY_MAX_LEVEL); - private static final int FIRE_ASPECT = enchantMaxValueGetter(ItemsProceduralSettingsConfig.FIRE_ASPECT_BOOL, ItemsProceduralSettingsConfig.FIRE_ASPECT_MAX_LEVEL); - private static final int FROST_WALKER = enchantMaxValueGetter(ItemsProceduralSettingsConfig.FROST_WALKER_BOOL, ItemsProceduralSettingsConfig.FROST_WALKER_MAX_LEVEL); - private static final int KNOCKBACK = enchantMaxValueGetter(ItemsProceduralSettingsConfig.KNOCKBACK_BOOL, ItemsProceduralSettingsConfig.KNOCKBACK_MAX_LEVEL); - private static final int LOOT_BONUS_BLOCKS = enchantMaxValueGetter(ItemsProceduralSettingsConfig.LOOT_BONUS_BLOCKS_BOOL, ItemsProceduralSettingsConfig.LOOT_BONUS_BLOCKS_MAX_LEVEL); - private static final int LOOT_BONUS_MOBS = enchantMaxValueGetter(ItemsProceduralSettingsConfig.LOOT_BONUS_MOBS_BOOL, ItemsProceduralSettingsConfig.LOOT_BONUS_MOBS_MAX_LEVEL); - private static final int LUCK = enchantMaxValueGetter(ItemsProceduralSettingsConfig.LUCK_BOOL, ItemsProceduralSettingsConfig.LUCK_MAX_LEVEL); - private static final int LURE = enchantMaxValueGetter(ItemsProceduralSettingsConfig.LURE_BOOL, ItemsProceduralSettingsConfig.LURE_MAX_LEVEL); - private static final int MENDING = enchantMaxValueGetter(ItemsProceduralSettingsConfig.MENDING_BOOL); - private static final int OXYGEN = enchantMaxValueGetter(ItemsProceduralSettingsConfig.OXYGEN_BOOL, ItemsProceduralSettingsConfig.OXYGEN_MAX_LEVEL); - private static final int PROTECTION_ENVIRONMENTAL = enchantMaxValueGetter(ItemsProceduralSettingsConfig.PROTECTION_ENVIRONMENTAL_BOOL, ItemsProceduralSettingsConfig.PROTECTION_ENVIRONMENTAL_MAX_LEVEL); - private static final int PROTECTION_EXPLOSIONS = enchantMaxValueGetter(ItemsProceduralSettingsConfig.PROTECTION_EXPLOSIONS_BOOL, ItemsProceduralSettingsConfig.PROTECTION_EXPLOSIONS_MAX_LEVEL); - private static final int PROTECTION_FALL = enchantMaxValueGetter(ItemsProceduralSettingsConfig.PROTECTION_FALL_BOOL, ItemsProceduralSettingsConfig.PROTECTION_FALL_MAX_LEVEL); - private static final int PROTECTION_FIRE = enchantMaxValueGetter(ItemsProceduralSettingsConfig.PROTECTION_FIRE_BOOL, ItemsProceduralSettingsConfig.PROTECTION_FIRE_MAX_LEVEL); - private static final int PROTECTION_PROJECTILE = enchantMaxValueGetter(ItemsProceduralSettingsConfig.PROTECTION_PROJECTILE_BOOL, ItemsProceduralSettingsConfig.PROTECTION_PROJECTILE_MAX_LEVEL); - private static final int SILK_TOUCH = enchantMaxValueGetter(ItemsProceduralSettingsConfig.SILK_TOUCH_BOOL); - private static final int SWEEPING_EDGE = enchantMaxValueGetter(ItemsProceduralSettingsConfig.SWEEPING_EDGE_BOOL, ItemsProceduralSettingsConfig.SWEEPING_EDGE_MAX_LEVEL); - private static final int THORNS = enchantMaxValueGetter(ItemsProceduralSettingsConfig.THORNS_BOOL, ItemsProceduralSettingsConfig.THORNS_MAX_LEVEL); - private static final int VANISHING_CURSE = enchantMaxValueGetter(ItemsProceduralSettingsConfig.VANISHING_CURSE_BOOL); - private static final int WATER_WORKER = enchantMaxValueGetter(ItemsProceduralSettingsConfig.WATER_WORKER_BOOL, ItemsProceduralSettingsConfig.WATER_WORKER_MAX_LEVEL); - + // /* +// item quality: light blue (above max config enchant level) > gold > purple > blue > green > white > gray +// */ public static ItemQuality getItemQuality(ItemStack itemStack) { ItemMeta itemMeta = itemStack.getItemMeta(); @@ -94,9 +36,7 @@ public static ItemQuality getItemQuality(ItemStack itemStack) { //get percentage of max enchants it could have if (maxRankCalculator(itemStack) > 0) { - enchantPercentage = enchantmentCount * 100 / maxRankCalculator(itemStack); - } if (enchantPercentage > 100) @@ -109,7 +49,7 @@ else if (enchantPercentage > 100 / 6 * 3) return ItemQuality.BLUE; else if (enchantPercentage > 100 / 6 * 2) return ItemQuality.GREEN; - else if (enchantPercentage > 100 / 6 * 1) + else if (enchantPercentage > 100 / 6) return ItemQuality.WHITE; else return ItemQuality.GRAY; @@ -118,7 +58,7 @@ else if (enchantPercentage > 100 / 6 * 1) public static void dropQualityColorizer(ItemStack itemStack) { - if (ConfigValues.defaultConfig.getBoolean(DefaultConfig.MMORPG_COLORS)) { + if (ItemSettingsConfig.isDoMmorpgColors()) { ItemMeta itemMeta = itemStack.getItemMeta(); @@ -163,7 +103,7 @@ public static void dropQualityColorizer(ItemStack itemStack) { itemMeta = colorizeNameAndLore(ChatColor.GREEN, itemMeta); - } else if (enchantPercentage > 100 / 6 * 1) { + } else if (enchantPercentage > 100 / 6) { itemMeta = colorizeNameAndLore(ChatColor.WHITE, itemMeta); @@ -212,17 +152,17 @@ private static ItemMeta colorizeBoldNameAndLore(ChatColor chatColor, ItemMeta it Cancel colorization in case item already has a color (for custom and unique items) */ if (itemMeta.getDisplayName().equals(ChatColor.stripColor(itemMeta.getDisplayName()))) - itemMeta.setDisplayName(chatColor + "" + ChatColor.BOLD + "" + itemMeta.getDisplayName()); + itemMeta.setDisplayName(chatColor + "" + ChatColor.BOLD + itemMeta.getDisplayName()); List list = new ArrayList(); - if (!itemMeta.getLore().isEmpty()) { + if (itemMeta.getLore() != null && !itemMeta.getLore().isEmpty()) { for (String string : itemMeta.getLore()) { if (!string.isEmpty()) { - String colorizedString = chatColor + "" + ChatColor.BOLD + "" + ChatColor.ITALIC + string; + String colorizedString = chatColor + "" + ChatColor.BOLD + ChatColor.ITALIC + string; list.add(colorizedString); } @@ -243,156 +183,144 @@ private static int maxRankCalculator(ItemStack itemStack) { Material material = itemStack.getType(); - if (material.equals(Material.DIAMOND_SWORD) || material.equals(Material.GOLD_SWORD) || - material.equals(Material.IRON_SWORD) || material.equals(Material.STONE_SWORD) || - material.equals(Material.WOOD_SWORD)) { - - maxRank += DAMAGE_ARTHROPODS; - maxRank += VANISHING_CURSE; - maxRank += FIRE_ASPECT; - maxRank += KNOCKBACK; - maxRank += LOOT_BONUS_MOBS; - maxRank += MENDING; - maxRank += DAMAGE_ALL; - maxRank += DAMAGE_UNDEAD; - maxRank += SWEEPING_EDGE; - maxRank += DURABILITY; - - } else if (material.equals(Material.BOW)) { - - maxRank += VANISHING_CURSE; - maxRank += ARROW_FIRE; - maxRank += ARROW_INFINITE; - maxRank += MENDING; - maxRank += ARROW_DAMAGE; - maxRank += ARROW_KNOCKBACK; - maxRank += DURABILITY; - - } else if (material.equals(Material.DIAMOND_PICKAXE) || material.equals(Material.GOLD_PICKAXE) || - material.equals(Material.IRON_PICKAXE) || material.equals(Material.STONE_PICKAXE) || - material.equals(Material.WOOD_PICKAXE)) { - - maxRank += VANISHING_CURSE; - maxRank += DIG_SPEED; - maxRank += LOOT_BONUS_BLOCKS; - maxRank += MENDING; - maxRank += SILK_TOUCH; - maxRank += DURABILITY; - - } else if (material.equals(Material.DIAMOND_SPADE) || material.equals(Material.GOLD_SPADE) || - material.equals(Material.IRON_SPADE) || material.equals(Material.STONE_SPADE) || - material.equals(Material.WOOD_SPADE)) { - - maxRank += VANISHING_CURSE; - maxRank += DIG_SPEED; - maxRank += LOOT_BONUS_BLOCKS; - maxRank += MENDING; - maxRank += SILK_TOUCH; - maxRank += DURABILITY; - - } else if (material.equals(Material.DIAMOND_HOE) || material.equals(Material.GOLD_HOE) || - material.equals(Material.IRON_HOE) || material.equals(Material.STONE_HOE) || - material.equals(Material.WOOD_HOE)) { - - maxRank += VANISHING_CURSE; - maxRank += MENDING; - maxRank += DURABILITY; - - } else if (material.equals(Material.DIAMOND_AXE) || material.equals(Material.GOLD_AXE) || - material.equals(Material.IRON_AXE) || material.equals(Material.STONE_AXE) || - material.equals(Material.WOOD_AXE)) { - - maxRank += DAMAGE_ARTHROPODS; - maxRank += VANISHING_CURSE; - maxRank += DIG_SPEED; - maxRank += LOOT_BONUS_BLOCKS; - maxRank += MENDING; - maxRank += DAMAGE_ALL; - maxRank += SILK_TOUCH; - maxRank += DAMAGE_UNDEAD; - maxRank += DURABILITY; - - } else if (material.equals(Material.CHAINMAIL_HELMET) || material.equals(Material.DIAMOND_HELMET) || - material.equals(Material.GOLD_HELMET) || material.equals(Material.IRON_HELMET) || - material.equals(Material.LEATHER_HELMET)) { - - maxRank += BINDING_CURSE; - maxRank += DURABILITY; - maxRank += MENDING; - maxRank += OXYGEN; - maxRank += PROTECTION_ENVIRONMENTAL; - maxRank += PROTECTION_EXPLOSIONS; - maxRank += PROTECTION_FIRE; - maxRank += PROTECTION_PROJECTILE; - maxRank += THORNS; - maxRank += VANISHING_CURSE; - maxRank += WATER_WORKER; - - } else if (material.equals(Material.CHAINMAIL_CHESTPLATE) || material.equals(Material.DIAMOND_CHESTPLATE) || - material.equals(Material.GOLD_CHESTPLATE) || material.equals(Material.IRON_CHESTPLATE) || - material.equals(Material.LEATHER_CHESTPLATE)) { - - maxRank += BINDING_CURSE; - maxRank += DURABILITY; - maxRank += MENDING; - maxRank += PROTECTION_ENVIRONMENTAL; - maxRank += PROTECTION_EXPLOSIONS; - maxRank += PROTECTION_FIRE; - maxRank += PROTECTION_PROJECTILE; - maxRank += THORNS; - maxRank += VANISHING_CURSE; - - } else if (material.equals(Material.CHAINMAIL_LEGGINGS) || material.equals(Material.DIAMOND_LEGGINGS) || - material.equals(Material.GOLD_LEGGINGS) || material.equals(Material.IRON_LEGGINGS) || + switch (material) { + case DIAMOND_SWORD: + case GOLDEN_SWORD: + case IRON_SWORD: + case STONE_SWORD: + case WOODEN_SWORD: + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.BANE_OF_ARTHROPODS).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.FIRE_ASPECT).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.KNOCKBACK).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.FORTUNE).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.MENDING).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.SHARPNESS).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.SMITE).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.SWEEPING_EDGE).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.UNBREAKING).getMaxLevel(); + break; + case BOW: + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.FLAME).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.INFINITY).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.MENDING).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.POWER).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.PUNCH).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.UNBREAKING).getMaxLevel(); + break; + case DIAMOND_PICKAXE: + case GOLDEN_PICKAXE: + case IRON_PICKAXE: + case STONE_PICKAXE: + case WOODEN_PICKAXE: + case DIAMOND_SHOVEL: + case GOLDEN_SHOVEL: + case IRON_SHOVEL: + case STONE_SHOVEL: + case WOODEN_SHOVEL: + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.EFFICIENCY).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.FORTUNE).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.MENDING).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.SILK_TOUCH).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.UNBREAKING).getMaxLevel(); + break; + case DIAMOND_HOE: + case GOLDEN_HOE: + case IRON_HOE: + case STONE_HOE: + case WOODEN_HOE: + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.MENDING).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.UNBREAKING).getMaxLevel(); + break; + case DIAMOND_AXE: + case GOLDEN_AXE: + case IRON_AXE: + case STONE_AXE: + case WOODEN_AXE: + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.BANE_OF_ARTHROPODS).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.EFFICIENCY).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.FORTUNE).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.MENDING).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.SHARPNESS).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.SILK_TOUCH).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.SMITE).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.UNBREAKING).getMaxLevel(); + break; + case CHAINMAIL_HELMET: + case DIAMOND_HELMET: + case GOLDEN_HELMET: + case IRON_HELMET: + case LEATHER_HELMET: + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.UNBREAKING).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.MENDING).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.RESPIRATION).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.PROTECTION).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.BLAST_PROTECTION).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.FIRE_PROTECTION).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.PROJECTILE_PROTECTION).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.THORNS).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.AQUA_AFFINITY).getMaxLevel(); + break; + case CHAINMAIL_CHESTPLATE: + case DIAMOND_CHESTPLATE: + case GOLDEN_CHESTPLATE: + case IRON_CHESTPLATE: + case LEATHER_CHESTPLATE: + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.UNBREAKING).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.MENDING).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.PROTECTION).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.BLAST_PROTECTION).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.FIRE_PROTECTION).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.PROJECTILE_PROTECTION).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.THORNS).getMaxLevel(); + break; + + } + + + if (material.equals(Material.CHAINMAIL_LEGGINGS) || material.equals(Material.DIAMOND_LEGGINGS) || + material.equals(Material.GOLDEN_LEGGINGS) || material.equals(Material.IRON_LEGGINGS) || material.equals(Material.LEATHER_LEGGINGS)) { - maxRank += BINDING_CURSE; - maxRank += DURABILITY; - maxRank += MENDING; - maxRank += PROTECTION_ENVIRONMENTAL; - maxRank += PROTECTION_EXPLOSIONS; - maxRank += PROTECTION_FIRE; - maxRank += PROTECTION_PROJECTILE; - maxRank += THORNS; - maxRank += VANISHING_CURSE; + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.UNBREAKING).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.MENDING).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.PROTECTION).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.BLAST_PROTECTION).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.FIRE_PROTECTION).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.PROJECTILE_PROTECTION).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.THORNS).getMaxLevel(); } else if (material.equals(Material.CHAINMAIL_BOOTS) || material.equals(Material.DIAMOND_BOOTS) || - material.equals(Material.GOLD_BOOTS) || material.equals(Material.IRON_BOOTS) || + material.equals(Material.GOLDEN_BOOTS) || material.equals(Material.IRON_BOOTS) || material.equals(Material.LEATHER_BOOTS)) { - maxRank += BINDING_CURSE; - maxRank += DURABILITY; - maxRank += MENDING; - maxRank += PROTECTION_ENVIRONMENTAL; - maxRank += PROTECTION_EXPLOSIONS; - maxRank += PROTECTION_FALL; - maxRank += PROTECTION_FIRE; - maxRank += PROTECTION_PROJECTILE; - maxRank += THORNS; - maxRank += VANISHING_CURSE; - maxRank += DEPTH_STRIDER; - maxRank += FROST_WALKER; + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.UNBREAKING).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.MENDING).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.PROTECTION).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.BLAST_PROTECTION).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.FEATHER_FALLING).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.FIRE_PROTECTION).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.PROJECTILE_PROTECTION).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.THORNS).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.DEPTH_STRIDER).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.FROST_WALKER).getMaxLevel(); } else if (material.equals(Material.SHEARS)) { - maxRank += VANISHING_CURSE; - maxRank += DIG_SPEED; - maxRank += MENDING; - maxRank += DURABILITY; + EnchantmentsConfig.getEnchantment(Enchantment.EFFICIENCY).getMaxLevel(); + EnchantmentsConfig.getEnchantment(Enchantment.MENDING).getMaxLevel(); + EnchantmentsConfig.getEnchantment(Enchantment.UNBREAKING).getMaxLevel(); } else if (material.equals(Material.FISHING_ROD)) { - maxRank += VANISHING_CURSE; - maxRank += DURABILITY; - maxRank += MENDING; - maxRank += LUCK; - maxRank += LURE; + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.UNBREAKING).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.MENDING).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.LUCK_OF_THE_SEA).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.LURE).getMaxLevel(); } else if (material.equals(Material.SHIELD)) { - maxRank += VANISHING_CURSE; - maxRank += DURABILITY; - maxRank += MENDING; + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.UNBREAKING).getMaxLevel(); + maxRank += EnchantmentsConfig.getEnchantment(Enchantment.MENDING).getMaxLevel(); } @@ -400,32 +328,14 @@ private static int maxRankCalculator(ItemStack itemStack) { } - private static int enchantMaxValueGetter(String boolString) { - - Configuration configuration = ConfigValues.itemsProceduralSettingsConfig; - - if (configuration.getBoolean(boolString)) { - - return 1; - - } - - return 0; - - } - - private static int enchantMaxValueGetter(String boolString, String maxLevelString) { - - Configuration configuration = ConfigValues.itemsProceduralSettingsConfig; - - if (configuration.getBoolean(boolString)) { - - return configuration.getInt(maxLevelString); - - } - - return 0; - + public enum ItemQuality { + LIGHT_BLUE, + GOLD, + PURPLE, + BLUE, + GREEN, + WHITE, + GRAY } } diff --git a/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/ItemStackGenerator.java b/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/ItemStackGenerator.java deleted file mode 100644 index 31c1e97b4..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/ItemStackGenerator.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.magmaguy.elitemobs.items.itemconstructor; - -import org.bukkit.Material; -import org.bukkit.inventory.ItemStack; - -public class ItemStackGenerator { - - public static ItemStack generateItemStack (Material material){ - - return new ItemStack(material); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/LoreGenerator.java b/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/LoreGenerator.java deleted file mode 100644 index 98647772e..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/LoreGenerator.java +++ /dev/null @@ -1,374 +0,0 @@ -package com.magmaguy.elitemobs.items.itemconstructor; - -import com.magmaguy.elitemobs.ChatColorConverter; -import com.magmaguy.elitemobs.config.*; -import com.magmaguy.elitemobs.items.ItemTierFinder; -import com.magmaguy.elitemobs.items.ItemWorthCalculator; -import com.magmaguy.elitemobs.items.ObfuscatedSignatureLoreData; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import org.bukkit.Bukkit; -import org.bukkit.Material; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.LivingEntity; -import org.bukkit.inventory.meta.ItemMeta; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -public class LoreGenerator { - - public static ItemMeta generateLore(ItemMeta itemMeta, Material material, HashMap enchantmentMap, - HashMap customEnchantments, List potionList, List loreList) { - - List lore = new ArrayList<>(); - - for (Object object : ConfigValues.itemsCustomLootSettingsConfig.getList(ItemsCustomLootSettingsConfig.LORE_STRUCTURE)) { - - String string = (String) object; - - if (string.contains("$enchantments")) { - if (ConfigValues.itemsDropSettingsConfig.getBoolean(ItemsDropSettingsConfig.ENABLE_CUSTOM_ENCHANTMENT_SYSTEM)) { - if (!enchantmentMap.isEmpty()) { - lore.addAll(enchantmentLore(enchantmentMap)); - lore.addAll(customEnchantmentLore(customEnchantments)); - } - } - } else if (string.contains("$potionEffect")) - lore.addAll(potionsLore(potionList)); - else if (string.contains("$itemValue")) - lore.add(itemWorth(material, enchantmentMap, potionList)); - else if (string.contains("$tier")) - lore.add(string.replace("$tier", ItemTierFinder.findGenericTier(material, enchantmentMap) + "")); - else if (string.contains("$customLore")) { - if (loreList != null) - lore.addAll(colorizedLore(loreList)); - } else - lore.add(string); - - } - - /* - Obfuscate potion and enchantment info - */ - lore = generateObfuscatedLore(lore, getObfuscatedLoreString(enchantmentMap, customEnchantments, potionList)); - itemMeta.setLore(lore); - - return itemMeta; - - } - - public static ItemMeta generateLore(ItemMeta itemMeta, Material material, HashMap enchantmentMap, - HashMap customEnchantments, EliteMobEntity eliteMobEntity) { - - List lore = new ArrayList<>(); - - itemMeta = applyVanillaEnchantments(enchantmentMap, itemMeta); - - for (Object object : ConfigValues.itemsProceduralSettingsConfig.getList(ItemsProceduralSettingsConfig.LORE_STRUCTURE)) { - - String string = (String) object; - - if (string.contains("$potionEffect")) { - //TODO: Add potion effects to dynamic items - } else if (string.contains("$enchantments")) { - if (ConfigValues.itemsDropSettingsConfig.getBoolean(ItemsDropSettingsConfig.ENABLE_CUSTOM_ENCHANTMENT_SYSTEM)) { - lore.addAll(enchantmentLore(enchantmentMap)); - lore.addAll(customEnchantmentLore(customEnchantments)); - } - } else if (string.contains("$itemValue")) - lore.add(itemWorth(material, enchantmentMap)); - else if (string.contains("$tier")) - lore.add(string.replace("$tier", ItemTierFinder.findGenericTier(material, enchantmentMap) + "")); - else if (string.equals("$itemSource")) - lore.add(itemSource(eliteMobEntity)); - else - lore.add(string); - - } - - /* - Obfuscate potion and enchantment info - */ - lore = generateObfuscatedLore(lore, getObfuscatedLoreString(enchantmentMap, customEnchantments)); - itemMeta.setLore(lore); - - return itemMeta; - - } - - - private static List generateObfuscatedLore(List loreList, String obfuscatedLoreString) { - - List newList = new ArrayList<>(); - - int counter = 0; - - for (String string : loreList) { - - if (counter == 0) - newList.add(string + obfuscatedLoreString); - else - newList.add(string); - - counter++; - - } - - return newList; - - } - - public static final String OBFUSCATED_ENCHANTMENTS = "EliteEnchantments"; - public static final String OBFUSCATED_CUSTOM_ENCHANTMENTS = "EliteCustomEnchantments"; - public static final String OBFUSCATED_POTIONS = "ElitePotions"; - - private static String getObfuscatedLoreString(HashMap enchantmentMap, HashMap customEnchantments, List potionList) { - - StringBuilder obfuscatedString = new StringBuilder(); - - obfuscatedString.append(ObfuscatedSignatureLoreData.ITEM_SIGNATURE).append(","); - - if (!enchantmentMap.isEmpty()) { - obfuscatedString.append(OBFUSCATED_ENCHANTMENTS).append(","); - for (Enchantment enchantment : enchantmentMap.keySet()) - if (enchantment != null) - obfuscatedString.append(enchantment.getName()).append(":").append(enchantmentMap.get(enchantment)).append(","); - } - - if (!customEnchantments.isEmpty()) { - obfuscatedString.append(OBFUSCATED_CUSTOM_ENCHANTMENTS).append(","); - for (String string : customEnchantments.keySet()) - obfuscatedString.append(string).append(":").append(customEnchantments.get(string)).append(","); - } - - if (potionList != null && !potionList.isEmpty()) { - obfuscatedString.append(OBFUSCATED_POTIONS).append(","); - for (String string : potionList) - obfuscatedString.append(string.replace(",", ":")).append(","); - } - - String finalString = stringObfuscator(obfuscatedString); - - return finalString; - - } - - private static String getObfuscatedLoreString(HashMap enchantmentMap, HashMap customEnchantments) { - - StringBuilder obfuscatedString = new StringBuilder(); - - obfuscatedString.append(ObfuscatedSignatureLoreData.ITEM_SIGNATURE); - - if (!enchantmentMap.isEmpty()) { - obfuscatedString.append(OBFUSCATED_ENCHANTMENTS).append(","); - for (Enchantment enchantment : enchantmentMap.keySet()) - obfuscatedString.append(enchantment.getName()).append(":").append(enchantmentMap.get(enchantment)).append(","); - } - - if (!customEnchantments.isEmpty()){ - obfuscatedString.append(OBFUSCATED_CUSTOM_ENCHANTMENTS).append(","); - for (String string: customEnchantments.keySet()) - obfuscatedString.append(string).append(":").append(customEnchantments.get(string)).append(","); - } - - String finalString = stringObfuscator(obfuscatedString); - - return finalString; - - } - - private static String stringObfuscator(StringBuilder originalString) { - - String insert = "§"; - int period = 1; - - StringBuilder stringBuilder = new StringBuilder(originalString.length() + insert.length() * (originalString.length() / period)); - - int index = 0; - String prefix = ""; - - while (index < originalString.length()) { - - stringBuilder.append(prefix); - prefix = insert; - stringBuilder.append(originalString, index, Math.min(index + period, originalString.length())); - index += period; - - } - - String finalString = stringBuilder.toString(); - - finalString = "§" + finalString; - - return finalString; - - } - - private static List enchantmentLore(HashMap enchantmentMap) { - - List enchantmentsLore = new ArrayList<>(); - - for (Enchantment enchantment : enchantmentMap.keySet()) { - String loreLine; - if (enchantment.getName().contains("CURSE")) - loreLine = ChatColorConverter.convert("&c" + getEnchantmentName(enchantment) + " " + enchantmentMap.get(enchantment)); - else - loreLine = ChatColorConverter.convert("&7" + getEnchantmentName(enchantment) + " " + enchantmentMap.get(enchantment)); - enchantmentsLore.add(loreLine); - } - - return enchantmentsLore; - - } - - private static String getEnchantmentName(Enchantment enchantment) { - - if (!ConfigValues.itemsDropSettingsConfig.getKeys(true).contains(ItemsDropSettingsConfig.ENCHANTMENT_NAME + enchantment.getName())) { - Bukkit.getLogger().warning("[EliteMobs] Missing enchantment name " + enchantment.getName()); - Bukkit.getLogger().warning("[EliteMobs] Report this to the dev!"); - return enchantment.getName(); - } - - return ConfigValues.itemsDropSettingsConfig.getString(ItemsDropSettingsConfig.ENCHANTMENT_NAME + enchantment.getName()); - - } - - private static List customEnchantmentLore(HashMap customEnchantments) { - - List customEnchantmentLore = new ArrayList<>(); - - for (String string : customEnchantments.keySet()) { - - String loreLine; - loreLine = ChatColorConverter.convert("&6" + getCustomEnchantmentName(string) + " " + customEnchantments.get(string)); - customEnchantmentLore.add(loreLine); - - } - - return customEnchantmentLore; - - } - - private static String getCustomEnchantmentName(String customEnchantmentKey) { - - if (!ConfigValues.itemsDropSettingsConfig.getKeys(true).contains(ItemsDropSettingsConfig.ENCHANTMENT_NAME + customEnchantmentKey)) { - - Bukkit.getLogger().warning("[EliteMobs] Missing enchantment name " + customEnchantmentKey); - Bukkit.getLogger().warning("[EliteMobs] Report this to the dev!"); - return customEnchantmentKey; - - } - - return ConfigValues.itemsDropSettingsConfig.getString(ItemsDropSettingsConfig.ENCHANTMENT_NAME + customEnchantmentKey); - - } - - private static ItemMeta applyVanillaEnchantments(HashMap enchantmentMap, ItemMeta itemMeta) { - - for (Enchantment enchantment : enchantmentMap.keySet()) { - if (enchantmentMap.get(enchantment) > 5) - itemMeta.addEnchant(enchantment, 5, true); - else - itemMeta.addEnchant(enchantment, enchantmentMap.get(enchantment), true); - } - - return itemMeta; - - } - - private static List potionsLore(List potionList) { - - List potionsLore = new ArrayList<>(); - - - if (potionList == null || potionList.isEmpty()) return potionsLore; - - for (String string : potionList) { - String loreLine = ChatColorConverter.convert("&2" + getPotionName(string.split(",")[0]) + " " + string.split(",")[1]); - potionsLore.add(loreLine); - } - - return potionsLore; - - } - - private static String getPotionName(String string) { - - if (!ConfigValues.itemsDropSettingsConfig.getKeys(true).contains(ItemsDropSettingsConfig.POTION_EFFECT_NAME + string)) { - Bukkit.getLogger().warning("[EliteMobs] Missing potion name " + string); - Bukkit.getLogger().warning("[EliteMobs] Report this to the dev!"); - return string; - } - - return ConfigValues.itemsDropSettingsConfig.getString(ItemsDropSettingsConfig.POTION_EFFECT_NAME + string); - - } - - private static String itemWorth(Material material, HashMap enchantmentMap, List potionList) { - - return ConfigValues.itemsDropSettingsConfig.getString(ItemsDropSettingsConfig.LORE_WORTH) - .replace("$worth", ItemWorthCalculator.determineItemWorth(material, enchantmentMap, potionList) + "") - .replace("$currencyName", ConfigValues.economyConfig.getString(EconomySettingsConfig.CURRENCY_NAME)); - - } - - private static String itemWorth(Material material, HashMap enchantmentMap) { - - return ConfigValues.itemsDropSettingsConfig.getString(ItemsDropSettingsConfig.LORE_WORTH) - .replace("$worth", ItemWorthCalculator.determineItemWorth(material, enchantmentMap) + "") - .replace("$currencyName", ConfigValues.economyConfig.getString(EconomySettingsConfig.CURRENCY_NAME)); - - } - - private static String itemSource(EliteMobEntity eliteMobEntity) { - - LivingEntity livingEntity = eliteMobEntity.getLivingEntity(); - - String itemSource; - - if (livingEntity != null) { - - itemSource = ConfigValues.itemsProceduralSettingsConfig.getString(ItemsProceduralSettingsConfig.LORE_MOB_LEVEL_SOURCE).replace("$level", - eliteMobEntity.getLevel() + ""); - - String newName = ""; - - if (livingEntity.getType().name().contains("_")) { - - String[] tempSubList = livingEntity.getType().name().split("_"); - - for (String string : tempSubList) { - - string = string.toLowerCase().substring(0, 1).toUpperCase() + " "; - newName += string; - - } - - } else - newName = livingEntity.getType().name().substring(0, 1) + livingEntity.getType().name().substring(1).toLowerCase(); - - - itemSource = itemSource.replace("$mob", newName); - - - } else - itemSource = ConfigValues.itemsProceduralSettingsConfig.getString(ItemsProceduralSettingsConfig.LORE_SHOP_SOURCE); - - - return itemSource; - - } - - private static List colorizedLore(List rawLore) { - - List colorizedLore = new ArrayList<>(); - - for (String string : rawLore) - colorizedLore.add(ChatColorConverter.convert(string)); - - return colorizedLore; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/MaterialGenerator.java b/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/MaterialGenerator.java index 7c40f3703..740ae4a13 100644 --- a/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/MaterialGenerator.java +++ b/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/MaterialGenerator.java @@ -1,9 +1,9 @@ package com.magmaguy.elitemobs.items.itemconstructor; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.ItemsProceduralSettingsConfig; -import com.magmaguy.elitemobs.mobconstructor.CombatSystem; -import org.bukkit.Bukkit; +import com.magmaguy.elitemobs.combatsystem.CombatSystem; +import com.magmaguy.elitemobs.config.ItemSettingsConfig; +import com.magmaguy.elitemobs.config.ProceduralItemGenerationSettingsConfig; +import com.magmaguy.magmacore.util.Logger; import org.bukkit.Material; import java.util.ArrayList; @@ -14,53 +14,51 @@ public class MaterialGenerator { - public static Material generateMaterial(Material material){ + private static final ArrayList validProceduralMaterials = new ArrayList(); + + public static Material generateMaterial(Material material) { return material; } - public static Material generateMaterial(double itemTier){ + public static Material generateMaterial(double itemTier) { - List localValidMaterials = intializeValidProceduralMaterials(); + List localValidMaterials = (List) validProceduralMaterials.clone(); - if (localValidMaterials.isEmpty()) intializeValidProceduralMaterials(); + if (localValidMaterials.isEmpty()) initializeValidProceduralMaterials(); - if (itemTier < CombatSystem.DIAMOND_TIER_LEVEL) { + if (itemTier < CombatSystem.DIAMOND_TIER_LEVEL + ItemSettingsConfig.getMinimumProcedurallyGeneratedDiamondLootLevelPlusSeven()) + localValidMaterials.remove(TRIDENT); - localValidMaterials.remove(DIAMOND); + if (itemTier < CombatSystem.DIAMOND_TIER_LEVEL + ItemSettingsConfig.getMinimumProcedurallyGeneratedDiamondLootLevelPlusSeven()) { localValidMaterials.remove(DIAMOND_AXE); - localValidMaterials.remove(DIAMOND_BARDING); - localValidMaterials.remove(DIAMOND_BLOCK); + localValidMaterials.remove(DIAMOND_HORSE_ARMOR); localValidMaterials.remove(DIAMOND_CHESTPLATE); localValidMaterials.remove(DIAMOND_HELMET); localValidMaterials.remove(DIAMOND_HOE); localValidMaterials.remove(DIAMOND_LEGGINGS); - localValidMaterials.remove(DIAMOND_ORE); localValidMaterials.remove(DIAMOND_PICKAXE); - localValidMaterials.remove(DIAMOND_SPADE); + localValidMaterials.remove(DIAMOND_SHOVEL); localValidMaterials.remove(DIAMOND_SWORD); localValidMaterials.remove(DIAMOND_BOOTS); - } if (itemTier < CombatSystem.IRON_TIER_LEVEL) { localValidMaterials.remove(IRON_AXE); - localValidMaterials.remove(IRON_BARDING); - localValidMaterials.remove(IRON_BLOCK); + localValidMaterials.remove(IRON_HORSE_ARMOR); localValidMaterials.remove(IRON_BOOTS); localValidMaterials.remove(IRON_CHESTPLATE); localValidMaterials.remove(IRON_HELMET); localValidMaterials.remove(IRON_HOE); - localValidMaterials.remove(IRON_INGOT); localValidMaterials.remove(IRON_LEGGINGS); - localValidMaterials.remove(IRON_NUGGET); - localValidMaterials.remove(IRON_ORE); localValidMaterials.remove(IRON_PICKAXE); - localValidMaterials.remove(IRON_SPADE); + localValidMaterials.remove(IRON_SHOVEL); localValidMaterials.remove(IRON_SWORD); - + localValidMaterials.remove(BOW); + localValidMaterials.remove(CROSSBOW); + localValidMaterials.remove(TURTLE_HELMET); } if (itemTier < CombatSystem.STONE_CHAIN_TIER_LEVEL) { @@ -71,42 +69,49 @@ public static Material generateMaterial(double itemTier){ localValidMaterials.remove(CHAINMAIL_LEGGINGS); localValidMaterials.remove(STONE_SWORD); localValidMaterials.remove(STONE_HOE); - localValidMaterials.remove(STONE_SPADE); + localValidMaterials.remove(STONE_SHOVEL); localValidMaterials.remove(STONE_PICKAXE); localValidMaterials.remove(STONE_AXE); } - int index = ThreadLocalRandom.current().nextInt(localValidMaterials.size()); - - Material material = localValidMaterials.get(index); + if (itemTier < CombatSystem.GOLD_WOOD_LEATHER_TIER_LEVEL) { + localValidMaterials.remove(GOLDEN_BOOTS); + localValidMaterials.remove(GOLDEN_CHESTPLATE); + localValidMaterials.remove(GOLDEN_HELMET); + localValidMaterials.remove(GOLDEN_LEGGINGS); + localValidMaterials.remove(GOLDEN_SWORD); + localValidMaterials.remove(GOLDEN_HOE); + localValidMaterials.remove(GOLDEN_SHOVEL); + localValidMaterials.remove(GOLDEN_PICKAXE); + localValidMaterials.remove(GOLDEN_AXE); + } - return material; + return localValidMaterials.get(ThreadLocalRandom.current().nextInt(localValidMaterials.size())); } - private static List intializeValidProceduralMaterials(){ + public static void initializeValidProceduralMaterials() { - List validMaterials = new ArrayList<>(); + validProceduralMaterials.clear(); - for (Object object : ConfigValues.itemsProceduralSettingsConfig.getList(ItemsProceduralSettingsConfig.PROCEDURAL_ITEM_VALID_MATERIALS)) { + if (ProceduralItemGenerationSettingsConfig.getValidMaterials().isEmpty()) { + ProceduralItemGenerationSettingsConfig.getInstance().cacheMaterials(); + if (ProceduralItemGenerationSettingsConfig.getValidMaterials().isEmpty()) { + Logger.warn("No valid materials detected for the procedural item settings. If you are trying to disable" + + " them, use the 'dropProcedurallyGeneratedItems' option instead. Warn the developer."); + return; + } + } + for (String string : ProceduralItemGenerationSettingsConfig.getValidMaterials()) { try { - - Material parsedMaterial = getMaterial(object.toString()); - validMaterials.add(parsedMaterial); - + validProceduralMaterials.add(getMaterial(string)); } catch (Exception e) { - - Bukkit.getLogger().info("Invalid material type detected: " + object.toString()); - + Logger.info("Invalid material type detected: " + string); } - - } - return validMaterials; - } } diff --git a/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/NameGenerator.java b/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/NameGenerator.java index b56ee8c6c..548fcac2b 100644 --- a/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/NameGenerator.java +++ b/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/NameGenerator.java @@ -1,33 +1,32 @@ package com.magmaguy.elitemobs.items.itemconstructor; -import com.magmaguy.elitemobs.ChatColorConverter; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.ItemsProceduralSettingsConfig; -import org.bukkit.Bukkit; +import com.magmaguy.elitemobs.config.ProceduralItemGenerationSettingsConfig; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Logger; import org.bukkit.Material; -import java.util.ArrayList; +import java.util.List; +import java.util.Locale; import java.util.concurrent.ThreadLocalRandom; public class NameGenerator { + private static final List nouns = ProceduralItemGenerationSettingsConfig.getNouns(); + private static final List adjectives = ProceduralItemGenerationSettingsConfig.getAdjectives(); + private static final List verbs = ProceduralItemGenerationSettingsConfig.getVerbs(); + private static final List verbers = ProceduralItemGenerationSettingsConfig.getVerbers(); - public static String generateName(String rawName) { + private NameGenerator() { + } + public static String generateName(String rawName) { return ChatColorConverter.convert(rawName); - } - private static ArrayList nouns = (ArrayList) ConfigValues.itemsProceduralSettingsConfig.getList("Valid nouns"); - private static ArrayList adjectives = (ArrayList) ConfigValues.itemsProceduralSettingsConfig.getList("Valid adjectives"); - private static ArrayList verbs = (ArrayList) ConfigValues.itemsProceduralSettingsConfig.getList("Valid verbs"); - private static ArrayList verbers = (ArrayList) ConfigValues.itemsProceduralSettingsConfig.getList("Valid verb-er (noun)"); - public static String generateName(Material material) { - int nounConstructorSelector = ThreadLocalRandom.current().nextInt(ConfigValues.itemsProceduralSettingsConfig.getList(ItemsProceduralSettingsConfig.ITEM_NAME_FORMAT).size()); + int nounConstructorSelector = ThreadLocalRandom.current().nextInt(ProceduralItemGenerationSettingsConfig.getNameFormat().size()); - return ((String) ConfigValues.itemsProceduralSettingsConfig.getList(ItemsProceduralSettingsConfig.ITEM_NAME_FORMAT) - .get(nounConstructorSelector)) + return (ProceduralItemGenerationSettingsConfig.getNameFormat().get(nounConstructorSelector)) .replace("$noun", nouns.get(ThreadLocalRandom.current().nextInt(nouns.size()))) .replace("$verb-er", verbers.get(ThreadLocalRandom.current().nextInt(verbers.size()))) .replace("$verb", verbs.get(ThreadLocalRandom.current().nextInt(verbs.size()))) @@ -40,72 +39,80 @@ private static String materialStringParser(Material material) { switch (material) { case DIAMOND_SWORD: - case GOLD_SWORD: + case GOLDEN_SWORD: case IRON_SWORD: case STONE_SWORD: - case WOOD_SWORD: - return ConfigValues.itemsProceduralSettingsConfig.getString(ItemsProceduralSettingsConfig.SWORD_MATERIAL_NAME); + case WOODEN_SWORD: + return ProceduralItemGenerationSettingsConfig.getSwordName(); case BOW: - return ConfigValues.itemsProceduralSettingsConfig.getString(ItemsProceduralSettingsConfig.BOW_MATERIAL_NAME); + return ProceduralItemGenerationSettingsConfig.getBowName(); case DIAMOND_PICKAXE: - case GOLD_PICKAXE: + case GOLDEN_PICKAXE: case IRON_PICKAXE: case STONE_PICKAXE: - case WOOD_PICKAXE: - return ConfigValues.itemsProceduralSettingsConfig.getString(ItemsProceduralSettingsConfig.PICKAXE_MATERIAL_NAME); - case DIAMOND_SPADE: - case GOLD_SPADE: - case IRON_SPADE: - case STONE_SPADE: - case WOOD_SPADE: - return ConfigValues.itemsProceduralSettingsConfig.getString(ItemsProceduralSettingsConfig.SPADE_MATERIAL_NAME); + case WOODEN_PICKAXE: + return ProceduralItemGenerationSettingsConfig.getPickaxeName(); + case DIAMOND_SHOVEL: + case GOLDEN_SHOVEL: + case IRON_SHOVEL: + case STONE_SHOVEL: + case WOODEN_SHOVEL: + return ProceduralItemGenerationSettingsConfig.getSpadeName(); case DIAMOND_HOE: - case GOLD_HOE: + case GOLDEN_HOE: case IRON_HOE: case STONE_HOE: - case WOOD_HOE: - return ConfigValues.itemsProceduralSettingsConfig.getString(ItemsProceduralSettingsConfig.HOE_MATERIAL_NAME); + case WOODEN_HOE: + return ProceduralItemGenerationSettingsConfig.getHoeName(); case DIAMOND_AXE: - case GOLD_AXE: + case GOLDEN_AXE: case IRON_AXE: case STONE_AXE: - case WOOD_AXE: - return ConfigValues.itemsProceduralSettingsConfig.getString(ItemsProceduralSettingsConfig.AXE_MATERIAL_NAME); + case WOODEN_AXE: + return ProceduralItemGenerationSettingsConfig.getAxeName(); case CHAINMAIL_HELMET: case DIAMOND_HELMET: - case GOLD_HELMET: + case GOLDEN_HELMET: case IRON_HELMET: case LEATHER_HELMET: - return ConfigValues.itemsProceduralSettingsConfig.getString(ItemsProceduralSettingsConfig.HELMET_MATERIAL_NAME); + case TURTLE_HELMET: + return ProceduralItemGenerationSettingsConfig.getHelmetName(); case CHAINMAIL_CHESTPLATE: case DIAMOND_CHESTPLATE: - case GOLD_CHESTPLATE: + case GOLDEN_CHESTPLATE: case IRON_CHESTPLATE: case LEATHER_CHESTPLATE: - return ConfigValues.itemsProceduralSettingsConfig.getString(ItemsProceduralSettingsConfig.CHESTPLATE_MATERIAL_NAME); + return ProceduralItemGenerationSettingsConfig.getChestplateName(); case CHAINMAIL_LEGGINGS: case DIAMOND_LEGGINGS: - case GOLD_LEGGINGS: + case GOLDEN_LEGGINGS: case IRON_LEGGINGS: case LEATHER_LEGGINGS: - return ConfigValues.itemsProceduralSettingsConfig.getString(ItemsProceduralSettingsConfig.LEGGINGS_MATERIAL_NAME); + return ProceduralItemGenerationSettingsConfig.getLeggingsName(); case CHAINMAIL_BOOTS: case DIAMOND_BOOTS: - case GOLD_BOOTS: + case GOLDEN_BOOTS: case IRON_BOOTS: case LEATHER_BOOTS: - return ConfigValues.itemsProceduralSettingsConfig.getString(ItemsProceduralSettingsConfig.BOOTS_MATERIAL_NAME); + return ProceduralItemGenerationSettingsConfig.getBootsName(); case SHEARS: - return ConfigValues.itemsProceduralSettingsConfig.getString(ItemsProceduralSettingsConfig.SHEARS_MATERIAL_NAME); + return ProceduralItemGenerationSettingsConfig.getShearsName(); case FISHING_ROD: - return ConfigValues.itemsProceduralSettingsConfig.getString(ItemsProceduralSettingsConfig.FISHING_ROD_MATERIAL_NAME); + return ProceduralItemGenerationSettingsConfig.getFishingRodName(); case SHIELD: - return ConfigValues.itemsProceduralSettingsConfig.getString(ItemsProceduralSettingsConfig.SHIELD_MATERIAL_NAME); + return ProceduralItemGenerationSettingsConfig.getShieldName(); + case TRIDENT: + return ProceduralItemGenerationSettingsConfig.getTridentName(); + case CROSSBOW: + return ProceduralItemGenerationSettingsConfig.getCrossbowName(); } + if (ProceduralItemGenerationSettingsConfig.getInstance().getFileConfiguration().getString("materialNames." + material.toString().toLowerCase(Locale.ROOT)) != null) + return ProceduralItemGenerationSettingsConfig.getInstance().getFileConfiguration().getString("materialNames." + material.toString().toLowerCase(Locale.ROOT)); - Bukkit.getLogger().warning("[EliteMobs] Found unexpected material type in procedurally generated loot. Can't generate item type name."); - Bukkit.getLogger().warning("[EliteMobs] Material name: " + material.toString()); + Logger.warn("Found unexpected material type in procedurally generated loot. Can't generate item type name."); + Logger.warn("Material name: " + material); + Logger.warn("If you're trying to set a non-default item type, you need to add the name format like this under materialNames: " + material.toString().toLowerCase(Locale.ROOT) + ": Name"); return ""; } diff --git a/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/ScalabilityAssigner.java b/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/ScalabilityAssigner.java deleted file mode 100644 index 073ce21a5..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/ScalabilityAssigner.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.magmaguy.elitemobs.items.itemconstructor; - -import com.magmaguy.elitemobs.items.ItemTierFinder; -import com.magmaguy.elitemobs.items.ScalableItemConstructor; -import org.bukkit.Material; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.inventory.ItemStack; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; - -public class ScalabilityAssigner { - - public static void assign(ItemStack itemStack, String rawName, Material material, HashMap enchantments, HashMap customEnchantments, List potionEffects, - List lore, String dropType, String scalabilityType) { - - /* - For the sake of clarity for the users and just overall reliability scalability will only be assigned to dynamic - items, and all static items will be considered statically scalable - */ - if (!DropWeightHandler.isDynamic(dropType)) return; - if (!isScalable(scalabilityType)) return; - - ScallableItemObject scalableItemObject = new ScallableItemObject(); - scalableItemObject.initializeItemObject(rawName, material, enchantments, customEnchantments, potionEffects, - lore); - - if (scalabilityType == null || scalabilityType.equalsIgnoreCase("dynamic")) { - ScalableItemConstructor.dynamicallyScalableItems.add(scalableItemObject); - return; - } - - if (scalabilityType.equalsIgnoreCase("limited")) { - - int itemTier = (int) ItemTierFinder.findBattleTier(itemStack); - - if (!ScalableItemConstructor.limitedScalableItems.containsKey(itemTier)) - ScalableItemConstructor.limitedScalableItems.put((int) ItemTierFinder.findBattleTier(itemStack), new ArrayList<>(Arrays.asList(scalableItemObject))); - else { - List existingList = ScalableItemConstructor.limitedScalableItems.get(itemTier); - existingList.add(scalableItemObject); - ScalableItemConstructor.limitedScalableItems.put((int) ItemTierFinder.findBattleTier(itemStack), existingList); - } - - } - - if (scalabilityType.equalsIgnoreCase("static")) { - - int itemTier = (int) ItemTierFinder.findBattleTier(itemStack); - - if (!ScalableItemConstructor.staticItems.containsKey(itemTier)) - ScalableItemConstructor.staticItems.put((int) ItemTierFinder.findBattleTier(itemStack), new ArrayList<>(Arrays.asList(itemStack))); - else { - List existingList = ScalableItemConstructor.staticItems.get(itemTier); - existingList.add(itemStack); - ScalableItemConstructor.staticItems.put((int) ItemTierFinder.findBattleTier(itemStack), existingList); - } - - } - - } - - public static boolean isScalable(String scalabilityType) { - - return scalabilityType == null || scalabilityType.equalsIgnoreCase("dynamic") || scalabilityType.equalsIgnoreCase("dynamic_full"); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/ScallableItemObject.java b/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/ScallableItemObject.java deleted file mode 100644 index f9bbfb947..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/itemconstructor/ScallableItemObject.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.magmaguy.elitemobs.items.itemconstructor; - -import org.bukkit.Material; -import org.bukkit.enchantments.Enchantment; - -import java.util.HashMap; -import java.util.List; - -public class ScallableItemObject { - - public String rawName; - public Material material; - public HashMap enchantments; - public HashMap customEnchantments; - public List potionEffects; - public List lore; - - /* - Stores fields for later use - */ - public void initializeItemObject(String rawName, Material material, HashMap enchantments, HashMap customEnchantments, List potionEffects, - List lore) { - - this.rawName = rawName; - this.material = material; - this.enchantments = enchantments; - this.customEnchantments = customEnchantments; - this.potionEffects = potionEffects; - this.lore = lore; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/parserutil/ConfigPathBuilder.java b/src/main/java/com/magmaguy/elitemobs/items/parserutil/ConfigPathBuilder.java deleted file mode 100644 index 03d03ef4f..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/parserutil/ConfigPathBuilder.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.magmaguy.elitemobs.items.parserutil; - -public class ConfigPathBuilder { - - public static String automatedStringBuilder(String previousPath, String append) { - - StringBuilder automatedStringBuilder = new StringBuilder(); - - automatedStringBuilder.append(previousPath); - automatedStringBuilder.append("."); - automatedStringBuilder.append(append); - - String path = automatedStringBuilder.toString(); - - return path; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/parserutil/CustomEnchantmentConfigParser.java b/src/main/java/com/magmaguy/elitemobs/items/parserutil/CustomEnchantmentConfigParser.java deleted file mode 100644 index 016c06cda..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/parserutil/CustomEnchantmentConfigParser.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.magmaguy.elitemobs.items.parserutil; - -import com.magmaguy.elitemobs.items.customenchantments.CustomEnchantmentCache; -import org.bukkit.configuration.Configuration; - -import java.util.HashMap; -import java.util.List; - -import static com.magmaguy.elitemobs.items.parserutil.ConfigPathBuilder.automatedStringBuilder; - -public class CustomEnchantmentConfigParser { - - public static HashMap parseCustomEnchantments(Configuration configuration, String previousPath) { - - String path = automatedStringBuilder(previousPath, "Enchantments"); - List enchantments = configuration.getList(path); - HashMap customEnchantmentMap = new HashMap(); - - try { - for (Object object : enchantments) { - - String string = (String) object; - -// Avoid parsing a regular enchantment - if (!CustomEnchantmentConfigParser.isCustomEnchantment(string)) continue; - - String customEnchantment = string.split(",")[0]; - - customEnchantmentMap.put(customEnchantment, Integer.parseInt(string.split(",")[1])); - - } - - } catch (Exception e) { -// Already handled in the normal enchantment parser - } - - return customEnchantmentMap; - - } - - public static boolean isCustomEnchantment(String string) { - - if (string.contains(CustomEnchantmentCache.hunterEnchantment.getKey())) return true; - if (string.contains(CustomEnchantmentCache.flamethrowerEnchantment.getKey())) return true; - - return false; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/parserutil/DropWeightConfigParser.java b/src/main/java/com/magmaguy/elitemobs/items/parserutil/DropWeightConfigParser.java deleted file mode 100644 index 439f7b885..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/parserutil/DropWeightConfigParser.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.magmaguy.elitemobs.items.parserutil; - - -import org.bukkit.configuration.Configuration; - -import static com.magmaguy.elitemobs.items.parserutil.ConfigPathBuilder.automatedStringBuilder; - -public class DropWeightConfigParser { - - public static String getDropType(Configuration configuration, String previousPath) { - - String dropType = automatedStringBuilder(previousPath, "Drop Weight"); - - return configuration.getString(dropType); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/parserutil/EnchantmentConfigParser.java b/src/main/java/com/magmaguy/elitemobs/items/parserutil/EnchantmentConfigParser.java deleted file mode 100644 index 061403af9..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/parserutil/EnchantmentConfigParser.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.magmaguy.elitemobs.items.parserutil; - -import org.bukkit.Bukkit; -import org.bukkit.configuration.Configuration; -import org.bukkit.enchantments.Enchantment; - -import java.util.HashMap; -import java.util.List; - -import static com.magmaguy.elitemobs.items.parserutil.ConfigPathBuilder.automatedStringBuilder; - -public class EnchantmentConfigParser { - - public static HashMap parseEnchantments(Configuration configuration, String previousPath) { - - String path = automatedStringBuilder(previousPath, "Enchantments"); - List enchantments = configuration.getList(path); - HashMap enchantmentMap = new HashMap(); - - try { - for (Object object : enchantments) { - - String string = (String) object; - -// Custom enchantments have their own parser - if (CustomEnchantmentConfigParser.isCustomEnchantment(string)) continue; - - Enchantment enchantment = Enchantment.getByName(string.split(",")[0]); - - if (enchantment != null) - enchantmentMap.put(enchantment, Integer.parseInt(string.split(",")[1])); - - } - - } catch (Exception e) { - Bukkit.getLogger().warning("Warning: something on ItemsCustomLootList.yml is invalid."); - Bukkit.getLogger().warning("Make sure you add a valid enchantment type and a valid level for it!"); - } - - return enchantmentMap; - - } - - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/parserutil/PotionEffectConfigParser.java b/src/main/java/com/magmaguy/elitemobs/items/parserutil/PotionEffectConfigParser.java deleted file mode 100644 index d53ac0487..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/parserutil/PotionEffectConfigParser.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.magmaguy.elitemobs.items.parserutil; - -import org.bukkit.configuration.Configuration; - -import java.util.List; - -import static com.magmaguy.elitemobs.items.parserutil.ConfigPathBuilder.automatedStringBuilder; - -public class PotionEffectConfigParser { - - public static List itemPotionEffectHandler(Configuration configuration, String previousPath) { - - String path = automatedStringBuilder(previousPath, "Potion Effects"); - - List potionEffects = configuration.getList(path); - - return potionEffects; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/parserutil/ScalabilityConfigParser.java b/src/main/java/com/magmaguy/elitemobs/items/parserutil/ScalabilityConfigParser.java deleted file mode 100644 index dcf69e771..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/parserutil/ScalabilityConfigParser.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.magmaguy.elitemobs.items.parserutil; - - -import org.bukkit.configuration.Configuration; - -import static com.magmaguy.elitemobs.items.parserutil.ConfigPathBuilder.automatedStringBuilder; - -public class ScalabilityConfigParser { - - public static String parseItemScalability(Configuration configuration, String previousPath) { - - String path = automatedStringBuilder(previousPath, "Scalability"); - - return configuration.getString(path); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/potioneffects/ElitePotionEffect.java b/src/main/java/com/magmaguy/elitemobs/items/potioneffects/ElitePotionEffect.java new file mode 100644 index 000000000..268cd32ef --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/potioneffects/ElitePotionEffect.java @@ -0,0 +1,84 @@ +package com.magmaguy.elitemobs.items.potioneffects; + +import com.magmaguy.elitemobs.config.LegacyValueConverter; +import com.magmaguy.elitemobs.config.potioneffects.PotionEffectsConfig; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.NamespacedKey; +import org.bukkit.Registry; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; + +import java.util.Locale; + +public class ElitePotionEffect { + + private PotionEffect potionEffect; + private Target target; + private ApplicationMethod applicationMethod; + private double value; + + public ElitePotionEffect(String string) { + try { + String[] stringObject = string.split(","); + int duration = 2 * 20; + PotionEffectType potionEffectType = Registry.EFFECT.get(new NamespacedKey("minecraft", LegacyValueConverter.parsePotionEffect(stringObject[0]).toLowerCase(Locale.ROOT))); + if (potionEffectType == null) { + Logger.warn("Failed to get valid potion effect for " + stringObject[0].toLowerCase(Locale.ROOT)); + return; + } + if (potionEffectType.equals(PotionEffectType.NIGHT_VISION)) + duration = 15 * 20; + this.potionEffect = new PotionEffect(potionEffectType, duration, Integer.parseInt(stringObject[1])); + this.value = PotionEffectsConfig.getPotionEffect(potionEffectType.getKey().getKey()).getValue(); + if (stringObject.length < 3) { + this.target = Target.SELF; + this.applicationMethod = ApplicationMethod.CONTINUOUS; + return; + } + + this.target = Target.valueOf(stringObject[2].toUpperCase(Locale.ROOT)); + + if (stringObject.length < 4) { + applicationMethod = ApplicationMethod.CONTINUOUS; + return; + } + + this.applicationMethod = ApplicationMethod.valueOf(stringObject[3].toUpperCase(Locale.ROOT)); + + if (this.applicationMethod.equals(ApplicationMethod.ONHIT)) + this.potionEffect = new PotionEffect(potionEffectType, + PotionEffectsConfig.getPotionEffect(potionEffect.getType().getKey().getKey()).getOnHitDuration() * 20, + Integer.parseInt(stringObject[1])); + + } catch (Exception ex) { + Logger.warn("Detected invalid potion effect entry: " + string); + ex.printStackTrace(); + } + } + + public PotionEffect getPotionEffect() { + return potionEffect; + } + + public Target getTarget() { + return target; + } + + public ApplicationMethod getApplicationMethod() { + return applicationMethod; + } + + public double getValue() { + return value; + } + + public enum Target { + SELF, + TARGET + } + + public enum ApplicationMethod { + ONHIT, + CONTINUOUS + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/potioneffects/ElitePotionEffectContainer.java b/src/main/java/com/magmaguy/elitemobs/items/potioneffects/ElitePotionEffectContainer.java new file mode 100644 index 000000000..dccebfbc3 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/potioneffects/ElitePotionEffectContainer.java @@ -0,0 +1,58 @@ +package com.magmaguy.elitemobs.items.potioneffects; + +import com.magmaguy.elitemobs.items.ItemTagger; +import org.bukkit.NamespacedKey; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataType; + +import java.util.ArrayList; +import java.util.List; + +public class ElitePotionEffectContainer { + + /** + * Tags an item with the potion effects + * + * @param itemMeta + * @param potionEffects + */ + public ElitePotionEffectContainer(ItemMeta itemMeta, List potionEffects) { + + if (potionEffects.isEmpty()) return; + + StringBuilder onHit = new StringBuilder(); + StringBuilder continuous = new StringBuilder(); + + for (String substring : potionEffects) { + ElitePotionEffect elitePotionEffect = new ElitePotionEffect(substring); + switch (elitePotionEffect.getApplicationMethod()) { + case ONHIT: + onHit.append(substring).append(":"); + break; + case CONTINUOUS: + default: + continuous.append(substring).append(":"); + break; + } + } + + if (onHit.length() > 0) + itemMeta.getPersistentDataContainer().set(ItemTagger.onHitPotionEffectKey, PersistentDataType.STRING, onHit.toString()); + if (continuous.length() > 0) + itemMeta.getPersistentDataContainer().set(ItemTagger.continuousPotionEffectKey, PersistentDataType.STRING, continuous.toString()); + + } + + public static ArrayList getElitePotionEffectContainer(ItemMeta itemMeta, NamespacedKey namespacedKey) { + if (itemMeta == null) return new ArrayList<>(); + if (!itemMeta.getPersistentDataContainer().has(namespacedKey, PersistentDataType.STRING)) + return new ArrayList<>(); + ArrayList elitePotionEffects = new ArrayList<>(); + for (String string : itemMeta.getPersistentDataContainer().get(namespacedKey, PersistentDataType.STRING).split(":")) + if (string.length() > 0) + elitePotionEffects.add(new ElitePotionEffect(string)); + + return elitePotionEffects; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/potioneffects/PlayerPotionEffects.java b/src/main/java/com/magmaguy/elitemobs/items/potioneffects/PlayerPotionEffects.java new file mode 100644 index 000000000..57787dc66 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/potioneffects/PlayerPotionEffects.java @@ -0,0 +1,144 @@ +package com.magmaguy.elitemobs.items.potioneffects; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.items.potioneffects.custom.Harm; +import com.magmaguy.elitemobs.items.potioneffects.custom.Heal; +import com.magmaguy.elitemobs.items.potioneffects.custom.Saturation; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.playerdata.ElitePlayerInventory; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.utils.EntityFinder; +import org.bukkit.Bukkit; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.HashSet; + +/** + * Created by MagmaGuy on 14/03/2017. + */ +public class PlayerPotionEffects implements Listener { + + public PlayerPotionEffects() { + new BukkitRunnable() { + @Override + public void run() { + //scan through what players are wearing + for (Player player : Bukkit.getOnlinePlayers()) + if (ElitePlayerInventory.playerInventories.get(player.getUniqueId()) != null && + PlayerData.getPlayerData(player.getUniqueId()) != null) + for (ElitePotionEffect elitePotionEffect : ElitePlayerInventory.playerInventories.get(player.getUniqueId()).getContinuousPotionEffects(true)) + doContinuousPotionEffect(elitePotionEffect, player); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 20L, 20L); + } + + public static void addOnHitCooldown(HashSet cooldownList, Player player, long delay) { + cooldownList.add(player); + new BukkitRunnable() { + @Override + public void run() { + cooldownList.remove(player); + } + }.runTaskLater(MetadataHandler.PLUGIN, delay); + } + + private void doContinuousPotionEffect(ElitePotionEffect elitePotionEffect, Player player) { + + //This one doesn't work + if (elitePotionEffect.getPotionEffect().getType().equals(PotionEffectType.ABSORPTION)) return; + if (elitePotionEffect.getPotionEffect().getType().equals(PotionEffectType.HEALTH_BOOST)) return; + + + //if the player has a higher amplifier potion effect, ignore. If it's the same, reapply to refresh the effect + if (player.hasPotionEffect(elitePotionEffect.getPotionEffect().getType()) && + player.getPotionEffect(elitePotionEffect.getPotionEffect().getType()).getAmplifier() > elitePotionEffect.getPotionEffect().getAmplifier()) + return; + + if (elitePotionEffect.getPotionEffect().getType().equals(PotionEffectType.INSTANT_HEALTH)) { + Heal.doHeal(player, elitePotionEffect); + return; + } + + if (elitePotionEffect.getPotionEffect().getType().equals(PotionEffectType.SATURATION)) { + Saturation.doSaturation(player, elitePotionEffect); + return; + } + + if (elitePotionEffect.getPotionEffect().getType().equals(PotionEffectType.INSTANT_DAMAGE)) { + Harm.doHarm(player, elitePotionEffect); + return; + } + + if (player.hasPotionEffect(elitePotionEffect.getPotionEffect().getType())) + player.removePotionEffect(elitePotionEffect.getPotionEffect().getType()); + player.addPotionEffect(elitePotionEffect.getPotionEffect()); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void onPlayerHitWithPotionEffect(EntityDamageByEntityEvent event) { + LivingEntity damager = EntityFinder.getRealDamager(event); + if (damager == null || !damager.getType().equals(EntityType.PLAYER)) return; + Player player = (Player) damager; + + //citizens + if (player.hasMetadata("NPC")) + return; + + if (ElitePlayerInventory.playerInventories.get(player.getUniqueId()) == null) return; + + LivingEntity damagee; + if (event.getEntity() instanceof LivingEntity) + damagee = (LivingEntity) event.getEntity(); + else + return; + + for (ElitePotionEffect elitePotionEffect : ElitePlayerInventory.playerInventories.get(player.getUniqueId()).getOnHitPotionEffects(true)) + doOnHitPotionEffect(elitePotionEffect, player, damagee); + } + + private void doOnHitPotionEffect(ElitePotionEffect elitePotionEffect, Player player, LivingEntity damagee) { + //This one doesn't work + if (elitePotionEffect.getPotionEffect().getType().equals(PotionEffectType.ABSORPTION)) return; + if (elitePotionEffect.getPotionEffect().getType().equals(PotionEffectType.HEALTH_BOOST)) return; + switch (elitePotionEffect.getTarget()) { + case SELF: + if (elitePotionEffect.getPotionEffect().getType().equals(PotionEffectType.INSTANT_HEALTH)) { + Heal.doHeal(player, elitePotionEffect); + break; + } + + if (elitePotionEffect.getPotionEffect().getType().equals(PotionEffectType.SATURATION)) { + Saturation.doSaturation(player, elitePotionEffect); + break; + } + + if (elitePotionEffect.getPotionEffect().getType().equals(PotionEffectType.INSTANT_DAMAGE)) { + Harm.doHarm(player, elitePotionEffect); + return; + } + player.addPotionEffect(elitePotionEffect.getPotionEffect()); + break; + case TARGET: + if (elitePotionEffect.getPotionEffect().getType().equals(PotionEffectType.LEVITATION) || + elitePotionEffect.getPotionEffect().getType().equals(PotionEffectType.SLOWNESS) || + elitePotionEffect.getPotionEffect().getType().equals(PotionEffectType.BLINDNESS)) { + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(damagee); + if (eliteEntity != null && eliteEntity.getHealthMultiplier() > 1) + return; + } + damagee.addPotionEffect(elitePotionEffect.getPotionEffect()); + break; + } + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/potioneffects/custom/Harm.java b/src/main/java/com/magmaguy/elitemobs/items/potioneffects/custom/Harm.java new file mode 100644 index 000000000..cc1aae1cc --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/potioneffects/custom/Harm.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.items.potioneffects.custom; + +import com.magmaguy.elitemobs.items.potioneffects.ElitePotionEffect; +import com.magmaguy.elitemobs.items.potioneffects.PlayerPotionEffects; +import org.bukkit.entity.Player; + +import java.util.HashSet; + +public class Harm { + + private static final HashSet harmCooldown = new HashSet<>(); + + public static void doHarm(Player player, ElitePotionEffect elitePotionEffect) { + if (harmCooldown.contains(player)) return; + PlayerPotionEffects.addOnHitCooldown(harmCooldown, player, 20 * 5); + double harmAmount = (elitePotionEffect.getPotionEffect().getAmplifier() + 1); + player.damage(harmAmount); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/potioneffects/custom/Heal.java b/src/main/java/com/magmaguy/elitemobs/items/potioneffects/custom/Heal.java new file mode 100644 index 000000000..376faa6d3 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/potioneffects/custom/Heal.java @@ -0,0 +1,21 @@ +package com.magmaguy.elitemobs.items.potioneffects.custom; + +import com.magmaguy.elitemobs.items.potioneffects.ElitePotionEffect; +import com.magmaguy.elitemobs.items.potioneffects.PlayerPotionEffects; +import org.bukkit.attribute.Attribute; +import org.bukkit.entity.Player; + +import java.util.HashSet; + +public class Heal { + + private static final HashSet healCooldown = new HashSet<>(); + + public static void doHeal(Player player, ElitePotionEffect elitePotionEffect) { + if (healCooldown.contains(player)) return; + PlayerPotionEffects.addOnHitCooldown(healCooldown, player, 20 * 5); + double healedAmount = (elitePotionEffect.getPotionEffect().getAmplifier() + 1); + player.setHealth(Math.min(player.getHealth() + healedAmount, player.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue())); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/potioneffects/custom/Saturation.java b/src/main/java/com/magmaguy/elitemobs/items/potioneffects/custom/Saturation.java new file mode 100644 index 000000000..d83f73047 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/potioneffects/custom/Saturation.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.items.potioneffects.custom; + +import com.magmaguy.elitemobs.items.potioneffects.ElitePotionEffect; +import com.magmaguy.elitemobs.items.potioneffects.PlayerPotionEffects; +import org.bukkit.entity.Player; + +import java.util.HashSet; + +public class Saturation { + + private static final HashSet saturationCooldown = new HashSet<>(); + + public static void doSaturation(Player player, ElitePotionEffect elitePotionEffect) { + if (saturationCooldown.contains(player)) return; + PlayerPotionEffects.addOnHitCooldown(saturationCooldown, player, 20 * 5); + double foodRestoredAmount = (elitePotionEffect.getPotionEffect().getAmplifier() + 1); + foodRestoredAmount = foodRestoredAmount + player.getFoodLevel() > 20 ? + 20 - player.getFoodLevel() : foodRestoredAmount; + player.setFoodLevel((int) (player.getFoodLevel() + foodRestoredAmount)); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/ConfigAssembler.java b/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/ConfigAssembler.java deleted file mode 100644 index b1e697730..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/ConfigAssembler.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.magmaguy.elitemobs.items.uniqueitems; - -import org.bukkit.configuration.Configuration; - -import java.util.List; - -public class ConfigAssembler { - - public static void assemble(Configuration configuration, String path, String itemType, String itemName, - List itemLore, List enchantments, - List potionEffects, String itemWeight, String itemScalability) { - - configuration.addDefault("Items." + path + ".Item Type", itemType); - configuration.addDefault("Items." + path + ".Item Name", itemName); - configuration.addDefault("Items." + path + ".Item Lore", itemLore); - configuration.addDefault("Items." + path + ".Enchantments", enchantments); - configuration.addDefault("Items." + path + ".Potion Effects", potionEffects); - configuration.addDefault("Items." + path + ".Drop Weight", itemWeight); - configuration.addDefault("Items." + path + ".Scalability", itemScalability); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/DepthsSeeker.java b/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/DepthsSeeker.java deleted file mode 100644 index ce0746fa7..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/DepthsSeeker.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.magmaguy.elitemobs.items.uniqueitems; - -import org.bukkit.Material; - -import java.util.Arrays; -import java.util.List; - -public class DepthsSeeker extends UniqueItem{ - - @Override - public String definePath() { - return "Depths Seeker"; - } - - @Override - public String defineType() { - return Material.FISHING_ROD.toString(); - } - - @Override - public String defineName() { - return "&9Depths Seeker"; - } - - @Override - public List defineLore() { - return Arrays.asList( - "&9Come from depths immeasurable", - "&9and looted from monster most vile,", - "&9there is no telling what horrors", - "&9this fishing rod has seen." - ); - } - - @Override - public List defineEnchantments() { - return Arrays.asList( - "LURE,3", - "LUCK,3", - "DURABILITY,10", - "FIRE_ASPECT,1", - "VANISHING_CURSE,1" - ); - } - - @Override - public List definePotionEffects() { - return Arrays.asList( - "WATER_BREATHING,1,self,continuous", - "LUCK,1,self,continuous" - ); - } - - @Override - public String defineDropWeight() { - return "unique"; - } - - @Override - public String defineScalability() { - return "dynamic"; - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/DwarvenGreed.java b/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/DwarvenGreed.java deleted file mode 100644 index d4f34ba39..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/DwarvenGreed.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.magmaguy.elitemobs.items.uniqueitems; - -import org.bukkit.Material; - -import java.util.Arrays; -import java.util.List; - -public class DwarvenGreed extends UniqueItem { - @Override - public String definePath() { - return "Dwarven Greed"; - } - - @Override - public String defineType() { - return Material.DIAMOND_PICKAXE.toString(); - } - - @Override - public String defineName() { - return "&4Dwarven Greed"; - } - - @Override - public List defineLore() { - return Arrays.asList( - "&cThose who delve too greedily", - "&cand too deep may wake ancient", - "&chorrors of shadow and flame", - "&cbest left undisturbed." - ); - } - - @Override - public List defineEnchantments() { - return Arrays.asList( - "LOOT_BONUS_BLOCKS,4", - "DURABILITY,6", - "DIG_SPEED,6", - "VANISHING_CURSE,1" - ); - } - - @Override - public List definePotionEffects() { - return Arrays.asList( - "FAST_DIGGING,2,self,continuous", - "NIGHT_VISION,1,self,continuous" - ); - } - - @Override - public String defineDropWeight() { - return "unique"; - } - - @Override - public String defineScalability() { - return "dynamic"; - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/HuntingBoots.java b/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/HuntingBoots.java deleted file mode 100644 index 9c5d0dbf4..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/HuntingBoots.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.magmaguy.elitemobs.items.uniqueitems; - -import com.magmaguy.elitemobs.items.customenchantments.CustomEnchantmentCache; -import org.bukkit.Material; -import org.bukkit.configuration.Configuration; - -import java.util.Arrays; -import java.util.List; - -public class HuntingBoots extends UniqueItem { - - @Override - public String definePath() { - return "Hunting Boots"; - } - - @Override - public String defineType() { - return Material.DIAMOND_BOOTS.toString(); - } - - @Override - public String defineName() { - return "&4Elite Mob Hunting Boots"; - } - - - @Override - public List defineLore() { - return Arrays.asList("Only for those fleetest of foot."); - } - - @Override - public List defineEnchantments() { - return Arrays.asList("VANISHING_CURSE,1", "PROTECTION_ENVIRONMENTAL,1", CustomEnchantmentCache.hunterEnchantment.assembleConfigString(2)); - } - - @Override - public List definePotionEffects() { - return Arrays.asList("SPEED,2,self,continuous"); - } - - @Override - public String defineDropWeight() { - return "dynamic"; - } - - @Override - public String defineScalability() { - return "dynamic"; - } - - @Override - public void assembleConfigItem(Configuration configuration) { - super.assembleConfigItem(configuration); - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/HuntingBow.java b/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/HuntingBow.java deleted file mode 100644 index 65f77e73f..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/HuntingBow.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.magmaguy.elitemobs.items.uniqueitems; - -import org.bukkit.Material; -import org.bukkit.configuration.Configuration; - -import java.util.Arrays; -import java.util.List; - -public class HuntingBow extends UniqueItem { - - @Override - public String definePath() { - return "Hunting Bow"; - } - - @Override - public String defineType() { - return Material.BOW.toString(); - } - - @Override - public String defineName() { - return "&4Elite Mob Hunting Bow"; - } - - - @Override - public List defineLore() { - return Arrays.asList("Only for natural-born hunters."); - } - - @Override - public List defineEnchantments() { - return Arrays.asList("VANISHING_CURSE,1", "DAMAGE_ARROW,1"); - } - - @Override - public List definePotionEffects() { - return Arrays.asList("SATURATION,1,self,continuous"); - } - - @Override - public String defineDropWeight() { - return "dynamic"; - } - - @Override - public String defineScalability() { - return "dynamic"; - } - - @Override - public void assembleConfigItem(Configuration configuration) { - super.assembleConfigItem(configuration); - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/HuntingChestplate.java b/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/HuntingChestplate.java deleted file mode 100644 index cc675fb8e..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/HuntingChestplate.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.magmaguy.elitemobs.items.uniqueitems; - -import com.magmaguy.elitemobs.items.customenchantments.CustomEnchantmentCache; -import org.bukkit.Material; -import org.bukkit.configuration.Configuration; - -import java.util.Arrays; -import java.util.List; - -public class HuntingChestplate extends UniqueItem { - - @Override - public String definePath() { - return "Hunting Chestplate"; - } - - @Override - public String defineType() { - return Material.DIAMOND_CHESTPLATE.toString(); - } - - @Override - public String defineName() { - return "&4Elite Mob Hunting Chestplate"; - } - - - @Override - public List defineLore() { - return Arrays.asList("Only for the bravest souls."); - } - - @Override - public List defineEnchantments() { - return Arrays.asList("VANISHING_CURSE,1", "PROTECTION_ENVIRONMENTAL,1", CustomEnchantmentCache.hunterEnchantment.assembleConfigString(2)); - } - - @Override - public List definePotionEffects() { - return Arrays.asList("SATURATION,1,self,continuous"); - } - - @Override - public String defineDropWeight() { - return "dynamic"; - } - - @Override - public void assembleConfigItem(Configuration configuration) { - super.assembleConfigItem(configuration); - } - - @Override - public String defineScalability() { - return "dynamic"; - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/HuntingHelmet.java b/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/HuntingHelmet.java deleted file mode 100644 index 6a0007c6b..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/HuntingHelmet.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.magmaguy.elitemobs.items.uniqueitems; - -import com.magmaguy.elitemobs.items.customenchantments.CustomEnchantmentCache; -import org.bukkit.Material; -import org.bukkit.configuration.Configuration; - -import java.util.Arrays; -import java.util.List; - -public class HuntingHelmet extends UniqueItem { - - @Override - public String definePath() { - return "Hunting Helmet"; - } - - @Override - public String defineType() { - return Material.DIAMOND_HELMET.toString(); - } - - @Override - public String defineName() { - return "&4Elite Mob Hunting Helmet"; - } - - - @Override - public List defineLore() { - return Arrays.asList("Only for the sharpest of eyes."); - } - - @Override - public List defineEnchantments() { - return Arrays.asList("VANISHING_CURSE,1", "PROTECTION_ENVIRONMENTAL,1", CustomEnchantmentCache.hunterEnchantment.assembleConfigString(2)); - } - - @Override - public List definePotionEffects() { - return Arrays.asList("NIGHT_VISION,1,self,continuous"); - } - - @Override - public String defineDropWeight() { - return "dynamic"; - } - - @Override - public String defineScalability() { - return "dynamic"; - } - - @Override - public void assembleConfigItem(Configuration configuration) { - super.assembleConfigItem(configuration); - } - - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/HuntingLeggings.java b/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/HuntingLeggings.java deleted file mode 100644 index 910129f22..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/HuntingLeggings.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.magmaguy.elitemobs.items.uniqueitems; - -import com.magmaguy.elitemobs.items.customenchantments.CustomEnchantmentCache; -import org.bukkit.Material; -import org.bukkit.configuration.Configuration; - -import java.util.Arrays; -import java.util.List; - -public class HuntingLeggings extends UniqueItem { - - @Override - public String definePath() { - return "Hunting Leggings"; - } - - @Override - public String defineType() { - return Material.DIAMOND_LEGGINGS.toString(); - } - - @Override - public String defineName() { - return "&4Elite Mob Hunting Leggings"; - } - - - @Override - public List defineLore() { - return Arrays.asList("Only for those who aim the highest."); - } - - @Override - public List defineEnchantments() { - return Arrays.asList("VANISHING_CURSE,1", "PROTECTION_ENVIRONMENTAL,1", CustomEnchantmentCache.hunterEnchantment.assembleConfigString(2)); - } - - @Override - public List definePotionEffects() { - return Arrays.asList("JUMP,2,self,continuous"); - } - - @Override - public String defineDropWeight() { - return "dynamic"; - } - - @Override - public String defineScalability() { - return "dynamic"; - } - - @Override - public void assembleConfigItem(Configuration configuration) { - super.assembleConfigItem(configuration); - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/TheFeller.java b/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/TheFeller.java deleted file mode 100644 index e26a3f2be..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/TheFeller.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.magmaguy.elitemobs.items.uniqueitems; - -import org.bukkit.Material; - -import java.util.Arrays; -import java.util.List; - -public class TheFeller extends UniqueItem { - - @Override - public String definePath() { - return "The Feller"; - } - - @Override - public String defineType() { - return Material.DIAMOND_AXE.toString(); - } - - @Override - public String defineName() { - return "&2The Feller"; - } - - @Override - public List defineLore() { - return Arrays.asList( - "&aEven in your sleep,", - "&aYou can feel this axe's", - "&9saplust" - ); - } - - @Override - public List defineEnchantments() { - return Arrays.asList( - "LOOT_BONUS_BLOCKS,4", - "SILK_TOUCH,1", - "DURABILITY,6", - "DIG_SPEED,6", - "VANISHING_CURSE,1" - ); - } - - @Override - public List definePotionEffects() { - return Arrays.asList( - "FAST_DIGGING,2,self,continuous", - "NIGHT_VISION,1,self,continuous" - ); - } - - @Override - public String defineDropWeight() { - return "unique"; - } - - @Override - public String defineScalability() { - return "dynamic"; - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/UniqueItem.java b/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/UniqueItem.java deleted file mode 100644 index 0dc291e10..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/UniqueItem.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.magmaguy.elitemobs.items.uniqueitems; - -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.items.itemconstructor.ItemConstructor; -import com.magmaguy.elitemobs.items.parserutil.*; -import org.bukkit.Material; -import org.bukkit.configuration.Configuration; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.inventory.ItemStack; - -import java.util.HashMap; -import java.util.List; - -public abstract class UniqueItem { - - public abstract String definePath(); - - public abstract String defineType(); - - public abstract String defineName(); - - public abstract List defineLore(); - - /* - #defineEnchantments() also defines custom enchantments as they are written the same way into config files - */ - public abstract List defineEnchantments(); - - public abstract List definePotionEffects(); - - public abstract String defineDropWeight(); - - public abstract String defineScalability(); - - public void assembleConfigItem(Configuration configuration) { - ConfigAssembler.assemble(configuration, definePath(), defineType(), defineName(), defineLore(), - defineEnchantments(), definePotionEffects(), defineDropWeight(), defineScalability()); - } - - public ItemStack constructItemStack() { - HashMap enchantments = EnchantmentConfigParser.parseEnchantments(ConfigValues.itemsUniqueConfig, - "Items." + definePath()); - HashMap customEnchantments = CustomEnchantmentConfigParser.parseCustomEnchantments(ConfigValues.itemsUniqueConfig, - "Items." + definePath()); - List potionEffects = PotionEffectConfigParser.itemPotionEffectHandler(ConfigValues.itemsUniqueConfig, - "Items." + definePath()); - String dropType = DropWeightConfigParser.getDropType(ConfigValues.itemsUniqueConfig, "Items." + definePath()); - String scalability = ScalabilityConfigParser.parseItemScalability(ConfigValues.itemsUniqueConfig, "Items." + definePath()); - - return ItemConstructor.constructItem(defineName(), Material.getMaterial(defineType()), enchantments, customEnchantments, - potionEffects, defineLore(), dropType, scalability); - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/UniqueItemInitializer.java b/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/UniqueItemInitializer.java deleted file mode 100644 index a8eadb521..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/UniqueItemInitializer.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.magmaguy.elitemobs.items.uniqueitems; - -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.ItemsUniqueConfig; -import org.bukkit.inventory.ItemStack; - -import java.util.ArrayList; -import java.util.List; - -public class UniqueItemInitializer { - - /* - Elements are added to the list during the construction process - */ - public static List uniqueItemsList = new ArrayList(); - - public static void initialize() { - - if (!ConfigValues.itemsUniqueConfig.getBoolean(ItemsUniqueConfig.ENABLE_UNIQUE_ITEMS)) return; - - if (ConfigValues.itemsUniqueConfig.getBoolean(ItemsUniqueConfig.ENABLE_HUNTING_SET)) { - - HuntingHelmet huntingHelmet = new HuntingHelmet(); - huntingHelmet.constructItemStack(); - - HuntingChestplate huntingChestplate = new HuntingChestplate(); - huntingChestplate.constructItemStack(); - - HuntingLeggings huntingLeggings = new HuntingLeggings(); - huntingLeggings.constructItemStack(); - - HuntingBoots huntingBoots = new HuntingBoots(); - huntingBoots.constructItemStack(); - - HuntingBow huntingBow = new HuntingBow(); - huntingBow.constructItemStack(); - - } - - if (ConfigValues.itemsUniqueConfig.getBoolean(ItemsUniqueConfig.ENABLE_ZOMBIE_KING_AXE)) { - - ZombieKingsAxe zombieKingsAxe = new ZombieKingsAxe(); - zombieKingsAxe.constructItemStack(); - - } - - if (ConfigValues.itemsUniqueConfig.getBoolean(ItemsUniqueConfig.ENABLE_KRAKEN_FISHING_ROD)) { - - DepthsSeeker depthsSeeker = new DepthsSeeker(); - depthsSeeker.constructItemStack(); - - } - - if (ConfigValues.itemsUniqueConfig.getBoolean(ItemsUniqueConfig.ENABLE_GREED)) { - - DwarvenGreed dwarvenGreed = new DwarvenGreed(); - dwarvenGreed.constructItemStack(); - - } - - if (ConfigValues.itemsUniqueConfig.getBoolean(ItemsUniqueConfig.ENABLE_THE_FELLER)) { - - TheFeller theFeller = new TheFeller(); - theFeller.constructItemStack(); - - } - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/ZombieKingsAxe.java b/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/ZombieKingsAxe.java deleted file mode 100644 index 980913584..000000000 --- a/src/main/java/com/magmaguy/elitemobs/items/uniqueitems/ZombieKingsAxe.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.magmaguy.elitemobs.items.uniqueitems; - -import com.magmaguy.elitemobs.items.customenchantments.CustomEnchantmentCache; -import org.bukkit.Material; - -import java.util.Arrays; -import java.util.List; - -public class ZombieKingsAxe extends UniqueItem { - - @Override - public String definePath() { - return "Zombie Kings Axe"; - } - - @Override - public String defineType() { - return Material.GOLD_AXE.toString(); - } - - @Override - public String defineName() { - return "&4Zombie King's Axe"; - } - - @Override - public List defineLore() { - return Arrays.asList("The axe of the one Zombies", "call their king.", "The bloodlust is palpable."); - } - - @Override - public List defineEnchantments() { - return Arrays.asList( - "DAMAGE_ALL,10", - "DAMAGE_UNDEAD,5", - "DIG_SPEED,5", - "DURABILITY,5", - "KNOCKBACK,3", - "FIRE_ASPECT,4", - "LOOT_BONUS_MOBS,5", - "WATER_WORKER,5", - CustomEnchantmentCache.flamethrowerEnchantment.assembleConfigString(1) - ); - } - - @Override - public List definePotionEffects() { - return Arrays.asList( - "FAST_DIGGING,1,self,onHit", - "POISON,1,target,onHit", - "GLOWING,1,target,onHit", - "NIGHT_VISION,1,target,continuous", - "WITHER,1,target,onHit" - ); - } - - @Override - public String defineDropWeight() { - return "unique"; - } - - @Override - public String defineScalability() { - return "dynamic"; - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/items/upgradesystem/EliteEnchantmentItems.java b/src/main/java/com/magmaguy/elitemobs/items/upgradesystem/EliteEnchantmentItems.java new file mode 100644 index 000000000..e06def3ff --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/upgradesystem/EliteEnchantmentItems.java @@ -0,0 +1,32 @@ +package com.magmaguy.elitemobs.items.upgradesystem; + +import com.magmaguy.elitemobs.items.ItemTagger; +import com.magmaguy.elitemobs.items.customenchantments.CustomEnchantment; +import com.magmaguy.elitemobs.items.customenchantments.EnchantedSourceEnchantment; +import com.magmaguy.elitemobs.items.customenchantments.LuckySourceEnchantment; +import org.bukkit.inventory.ItemStack; + +import javax.annotation.Nullable; +import java.util.HashMap; +import java.util.Map; + +public class EliteEnchantmentItems { + + public static Map getEnchantedBookEnchantments(@Nullable ItemStack itemStack) { + Map enchantMap = new HashMap<>(); + if (itemStack == null || itemStack.getItemMeta() == null) return enchantMap; + CustomEnchantment.getCustomEnchantmentMap().values(); + return enchantMap; + } + + public static boolean isEliteEnchantmentBook(@Nullable ItemStack itemStack) { + if (itemStack == null || itemStack.getItemMeta() == null) return false; + return ItemTagger.hasEnchantment(itemStack.getItemMeta(), EnchantedSourceEnchantment.key); + } + + public static boolean isEliteLuckyTicket(@Nullable ItemStack itemStack) { + if (itemStack == null || itemStack.getItemMeta() == null) return false; + return ItemTagger.hasEnchantment(itemStack.getItemMeta(), LuckySourceEnchantment.key); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/items/upgradesystem/UpgradeSystem.java b/src/main/java/com/magmaguy/elitemobs/items/upgradesystem/UpgradeSystem.java new file mode 100644 index 000000000..ddc2d3aff --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/items/upgradesystem/UpgradeSystem.java @@ -0,0 +1,73 @@ +package com.magmaguy.elitemobs.items.upgradesystem; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfigFields; +import com.magmaguy.elitemobs.items.EliteItemLore; +import com.magmaguy.elitemobs.items.ItemTagger; +import com.magmaguy.elitemobs.items.customenchantments.EnchantedSourceEnchantment; +import com.magmaguy.elitemobs.items.itemconstructor.EnchantmentGenerator; +import org.bukkit.NamespacedKey; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.HashMap; +import java.util.Map; + +public class UpgradeSystem { + private UpgradeSystem() { + } + + public static ItemStack upgrade(ItemStack originalItemToUpgrade, ItemStack enchantedBook) { + ItemStack itemToUpgrade = originalItemToUpgrade.clone(); + ItemMeta itemMeta = itemToUpgrade.getItemMeta(); + Map currentEnchantments = ItemTagger.getItemEnchantments(itemToUpgrade); + Map bookEnchantments = ItemTagger.getItemEnchantments(enchantedBook); + Map newMap = new HashMap<>(); + //Remove the enchantment that makes this a book, it's non-transferable + bookEnchantments.remove(new NamespacedKey(MetadataHandler.PLUGIN, EnchantedSourceEnchantment.key)); + + //merge enchants + for (Map.Entry entrySet : bookEnchantments.entrySet()) { + if (!currentEnchantments.containsKey(entrySet.getKey())) + newMap.put(entrySet.getKey(), entrySet.getValue()); + else + newMap.put(entrySet.getKey(), currentEnchantments.get(entrySet.getKey()) + entrySet.getValue()); + } + + //get vanilla enchants + Map vanillaEnchantmentsNamespaced = new HashMap<>(); + HashMap vanillaEnchantments = new HashMap<>(); + for (Map.Entry entrySet : newMap.entrySet()) { + Enchantment enchantment = Enchantment.getByKey(entrySet.getKey()); + if (enchantment != null) { + vanillaEnchantments.put(enchantment, entrySet.getValue()); + vanillaEnchantmentsNamespaced.put(entrySet.getKey(), entrySet.getValue()); + } + } + + EnchantmentGenerator.generateEnchantments(itemMeta, vanillaEnchantments); + ItemTagger.registerEnchantments(itemMeta, vanillaEnchantments); + + //get custom enchantments + HashMap customEnchantments = new HashMap<>(); + for (Map.Entry entrySet : newMap.entrySet()) + if (!vanillaEnchantments.containsKey(entrySet.getKey())) + customEnchantments.put(entrySet.getKey().getKey(), entrySet.getValue()); + + ItemTagger.registerCustomEnchantments(itemMeta, customEnchantments); + + itemToUpgrade.setItemMeta(itemMeta); + new EliteItemLore(itemToUpgrade, false); + return itemToUpgrade; + } + + public static boolean isValidUpgrade(ItemStack originalItemToUpgrade, ItemStack enchantedBook) { + ItemStack finalItemStack = upgrade(originalItemToUpgrade, enchantedBook); + Map currentEnchantments = ItemTagger.getItemEnchantmentConfigFields(finalItemStack); + for (Map.Entry entry : currentEnchantments.entrySet()) + if (entry.getValue() > entry.getKey().getMaxEnchantmentLevel()) return false; + return true; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/menus/ArenaMenu.java b/src/main/java/com/magmaguy/elitemobs/menus/ArenaMenu.java new file mode 100644 index 000000000..44544f352 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/menus/ArenaMenu.java @@ -0,0 +1,84 @@ +package com.magmaguy.elitemobs.menus; + +import com.magmaguy.elitemobs.config.ArenasConfig; +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.config.DungeonsConfig; +import com.magmaguy.elitemobs.config.menus.premade.ArenaMenuConfig; +import com.magmaguy.elitemobs.instanced.arena.ArenaInstance; +import com.magmaguy.magmacore.util.ChatColorConverter; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.Inventory; + +import java.util.HashMap; +import java.util.Map; + +public class ArenaMenu { + public void constructArenaMenu(Player player, String arenaFilename) { + ArenaInstance arenaInstance = ArenaInstance.getArenaInstances().get(arenaFilename); + if (arenaInstance == null) { + player.sendMessage(ChatColorConverter.convert("&4[EliteMobs] &cInvalid arena name! The arena you are trying to join is not correctly setup.")); + return; + } + String menuName = ArenaMenuConfig.getMenuName() + arenaInstance.getCustomArenasConfigFields().getArenaName(); + if (DefaultConfig.isForceMenuUnicode() || Bukkit.getPluginManager().isPluginEnabled("ResourcePackManager")) + menuName = "\uF801\uDB80\uDD0B\uF805 " + menuName; + Inventory shopInventory = Bukkit.createInventory(player, 9, menuName); + shopInventory.setItem(ArenaMenuConfig.getPlayerItemSlot(), ArenaMenuConfig.getPlayerItem()); + if (DungeonsConfig.isAllowSpectatorsInInstancedContent()) + shopInventory.setItem(ArenaMenuConfig.getSpectatorItemSlot(), ArenaMenuConfig.getSpectatorItem()); + player.openInventory(shopInventory); + ArenaMenuEvents.menus.put(shopInventory, new MenuContainer(shopInventory, arenaInstance)); + } + + public static class ArenaMenuEvents implements Listener { + private static final Map menus = new HashMap<>(); + + @EventHandler(ignoreCancelled = true) + public void onInventoryClick(InventoryClickEvent event) { + Player player = ((Player) event.getWhoClicked()).getPlayer(); + if (!menus.containsKey(event.getInventory())) return; + event.setCancelled(true); + if (event.getSlot() == ArenaMenuConfig.getPlayerItemSlot()) { + ArenaInstance arenaInstance = menus.get(event.getInventory()).getArenaInstance(); + if (arenaInstance.getCustomArenasConfigFields().getPermission() != null && + !arenaInstance.getCustomArenasConfigFields().getPermission().isEmpty()) + if (!player.hasPermission(arenaInstance.getCustomArenasConfigFields().getPermission())) { + player.sendMessage(ArenasConfig.getNoArenaPermissionMessage()); + player.closeInventory(); + return; + } + menus.get(event.getInventory()).getArenaInstance().addNewPlayer(player); + player.closeInventory(); + return; + } + if (event.getSlot() == ArenaMenuConfig.getSpectatorItemSlot() && + DungeonsConfig.isAllowSpectatorsInInstancedContent()) { + menus.get(event.getInventory()).getArenaInstance().addSpectator(player, false); + player.closeInventory(); + } + } + + @EventHandler + public void onInventoryClose(InventoryCloseEvent event) { + menus.remove(event.getInventory()); + } + } + + private class MenuContainer { + @Getter + private final Inventory inventory; + @Getter + private final ArenaInstance arenaInstance; + + private MenuContainer(Inventory inventory, ArenaInstance arenaInstance) { + this.inventory = inventory; + this.arenaInstance = arenaInstance; + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/menus/BuyOrSellMenu.java b/src/main/java/com/magmaguy/elitemobs/menus/BuyOrSellMenu.java new file mode 100644 index 000000000..91c0656fb --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/menus/BuyOrSellMenu.java @@ -0,0 +1,94 @@ +package com.magmaguy.elitemobs.menus; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.config.menus.premade.BuyOrSellMenuConfig; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.HashSet; +import java.util.Set; + +import static com.magmaguy.elitemobs.menus.BuyOrSellMenu.BuyOrSellMenuEvents.menus; + +public class BuyOrSellMenu { + + public static void constructBuyOrSellMenu(Player player, ItemStack buyItemStack) { + String inventoryName = BuyOrSellMenuConfig.SHOP_NAME; + if (DefaultConfig.isForceMenuUnicode() || Bukkit.getPluginManager().isPluginEnabled("ResourcePackManager")) + inventoryName = ChatColor.WHITE + "\uF801\uDB80\uDC7B\uF805 " + inventoryName; + + Inventory shopInventory = Bukkit.createInventory(player, 18, inventoryName); + menus.add(shopInventory); + //information item + ItemStack info = BuyOrSellMenuConfig.INFORMATION_ITEM; + if (DefaultConfig.isForceMenuUnicode() || Bukkit.getPluginManager().isPluginEnabled("ResourcePackManager")) { + info.setType(Material.PAPER); + ItemMeta itemMeta = info.getItemMeta(); + itemMeta.setCustomModelData(MetadataHandler.signatureID); + info.setItemMeta(itemMeta); + } + + shopInventory.setItem(BuyOrSellMenuConfig.INFORMATION_SLOT, info); + //sell item + shopInventory.setItem(BuyOrSellMenuConfig.SELL_SLOT, BuyOrSellMenuConfig.SELL_ITEM); + //buy item + shopInventory.setItem(BuyOrSellMenuConfig.BUY_SLOT, buyItemStack); + player.openInventory(shopInventory); + } + + public static class BuyOrSellMenuEvents implements Listener { + public static final Set menus = new HashSet<>(); + + @EventHandler + public void onInventoryInteraction(InventoryClickEvent event) { + + if (!EliteMenu.isEliteMenu(event, menus)) return; + event.setCancelled(true); + if (!SharedShopElements.itemNullPointerPrevention(event)) return; + + //info button + if (event.getCurrentItem().equals(BuyOrSellMenuConfig.INFORMATION_ITEM)) { + return; + } + + //buy custom items button + if (event.getCurrentItem().getItemMeta().getDisplayName().equals(BuyOrSellMenuConfig.BUY_CUSTOM_ITEM.getItemMeta().getDisplayName())) { + CustomShopMenu.customShopConstructor((Player) event.getWhoClicked()); + menus.remove((Player) event.getWhoClicked()); + return; + } + + //buy procedural items button + if (event.getCurrentItem().getItemMeta().getDisplayName().equals(BuyOrSellMenuConfig.BUY_PROCEDURAL_ITEM.getItemMeta().getDisplayName())) { + ProceduralShopMenu.shopConstructor((Player) event.getWhoClicked()); + menus.remove((Player) event.getWhoClicked()); + return; + } + + //sell items button + if (event.getCurrentItem().getItemMeta().getDisplayName().equals(BuyOrSellMenuConfig.SELL_ITEM.getItemMeta().getDisplayName())) { + SellMenu sellMenu = new SellMenu(); + sellMenu.constructSellMenu((Player) event.getWhoClicked()); + menus.remove((Player) event.getWhoClicked()); + } + + } + + @EventHandler + public void onClose(InventoryCloseEvent event) { + menus.remove(event.getInventory()); + } + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/menus/CustomShopMenu.java b/src/main/java/com/magmaguy/elitemobs/menus/CustomShopMenu.java new file mode 100644 index 000000000..edfdcac3d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/menus/CustomShopMenu.java @@ -0,0 +1,198 @@ +package com.magmaguy.elitemobs.menus; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.config.EconomySettingsConfig; +import com.magmaguy.elitemobs.config.menus.premade.BuyOrSellMenuConfig; +import com.magmaguy.elitemobs.config.menus.premade.CustomShopMenuConfig; +import com.magmaguy.elitemobs.economy.EconomyHandler; +import com.magmaguy.elitemobs.items.EliteItemLore; +import com.magmaguy.elitemobs.items.ItemTagger; +import com.magmaguy.elitemobs.items.ItemWorthCalculator; +import com.magmaguy.elitemobs.items.customenchantments.SoulbindEnchantment; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.HashSet; +import java.util.Random; +import java.util.Set; +import java.util.UUID; + +/** + * Created by MagmaGuy on 20/06/2017. + */ +public class CustomShopMenu { + + public static Set cooldownPlayers = new HashSet<>(); + + public static void shutdown() { + cooldownPlayers.clear(); + CustomShopMenu.CustomShopMenuEvents.menus.clear(); + } + + /** + * Creates a new instance of a BuyOrSellMenu + * + * @param player Player for whom the new menu will show up + */ + public static void customShopInitializer(Player player) { + + if (!EconomySettingsConfig.isEnableEconomy()) return; + BuyOrSellMenu.constructBuyOrSellMenu(player, BuyOrSellMenuConfig.BUY_CUSTOM_ITEM); + + } + + /** + * Creates a new instance of a custom shop + * + * @param player Player for whom the new menu will show up + */ + public static void customShopConstructor(Player player) { + String menuName = CustomShopMenuConfig.shopName; + if (DefaultConfig.isForceMenuUnicode() || Bukkit.getPluginManager().isPluginEnabled("ResourcePackManager")) + menuName = ChatColor.WHITE + "\uF801\uDB80\uDC8B\uF805 " + menuName; + Inventory shopInventory = Bukkit.createInventory(player, 54, menuName); + populateShop(shopInventory, player); + player.openInventory(shopInventory); + CustomShopMenuEvents.menus.add(shopInventory); + } + + /** + * Preliminary shop fill + * + * @param shopInventory Inventory to be filled + */ + private static void populateShop(Inventory shopInventory, Player player) { + + ItemStack rerollButton = CustomShopMenuConfig.rerollItem; + if (DefaultConfig.isForceMenuUnicode() || Bukkit.getPluginManager().isPluginEnabled("ResourcePackManager")) { + rerollButton.setType(Material.PAPER); + ItemMeta itemMeta = rerollButton.getItemMeta(); + itemMeta.setCustomModelData(MetadataHandler.signatureID); + rerollButton.setItemMeta(itemMeta); + } + + shopInventory.setItem(CustomShopMenuConfig.rerollSlot, rerollButton); + shopContents(shopInventory, player); + + } + + /** + * Fills with the items to be sold in the shop + * + * @param shopInventory Inventory to be filled + */ + private static void shopContents(Inventory shopInventory, Player player) { + + //Anything after 8 is populated + Random random = new Random(); + + for (int i : CustomShopMenuConfig.storeSlots) { + + int itemEntryIndex = random.nextInt(CustomItem.getCustomItemStackShopList().size()); + + ItemStack itemStack = CustomItem.getCustomItemStackShopList().get(itemEntryIndex).clone(); + SoulbindEnchantment.addEnchantment(itemStack, player); + new EliteItemLore(itemStack, true); + + shopInventory.setItem(i, itemStack); + + } + + } + + public static class CustomShopMenuEvents implements Listener { + public static HashSet menus = new HashSet<>(); + + @EventHandler + public void onClick(InventoryClickEvent event) { + + if (!EliteMenu.isEliteMenu(event, menus)) return; + event.setCancelled(true); + if (!SharedShopElements.itemNullPointerPrevention(event)) return; + + //reroll loot button + if (event.getCurrentItem().getItemMeta().getDisplayName().equals(CustomShopMenuConfig.rerollItem.getItemMeta().getDisplayName())) { + + if (cooldownPlayers.contains(event.getWhoClicked().getUniqueId())) { + event.setCancelled(true); + return; + } + + cooldownPlayers.add(event.getWhoClicked().getUniqueId()); + new BukkitRunnable() { + @Override + public void run() { + cooldownPlayers.remove(event.getWhoClicked().getUniqueId()); + } + }.runTaskLater(MetadataHandler.PLUGIN, 20 * 2L); + + populateShop(event.getInventory(), Bukkit.getPlayer(event.getWhoClicked().getUniqueId())); + event.setCancelled(true); + return; + } + + if (!ItemTagger.isEliteItem(event.getCurrentItem())) { + event.setCancelled(true); + return; + } + + Player player = (Player) event.getWhoClicked(); + ItemStack itemStack = event.getCurrentItem(); + String itemDisplayName = event.getCurrentItem().getItemMeta().getDisplayName(); + + double itemValue = ItemWorthCalculator.determineItemWorth(itemStack, player); + + boolean inventoryHasFreeSlots = false; + for (ItemStack iteratedStack : player.getInventory().getStorageContents()) + if (iteratedStack == null) { + inventoryHasFreeSlots = true; + break; + } + + //These slots are for buying items + if (EliteMenu.isTopMenu(event)) { + + if (!inventoryHasFreeSlots) { + + player.sendMessage(CustomShopMenuConfig.messageFullInventory); + player.closeInventory(); + + } else if (EconomyHandler.checkCurrency(player.getUniqueId()) >= itemValue) { + //player has enough money + EconomyHandler.subtractCurrency(player.getUniqueId(), itemValue); + new EliteItemLore(itemStack, false); + player.getInventory().addItem(itemStack); + populateShop(event.getInventory(), Bukkit.getPlayer(event.getWhoClicked().getUniqueId())); + + SharedShopElements.buyMessage(player, itemDisplayName, itemValue); + + } else { + + player.closeInventory(); + SharedShopElements.insufficientFundsMessage(player, itemValue); + + } + + } + + } + + @EventHandler + public void onClose(InventoryCloseEvent event) { + menus.remove(event.getInventory()); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/menus/EliteMenu.java b/src/main/java/com/magmaguy/elitemobs/menus/EliteMenu.java new file mode 100644 index 000000000..f4c9f091e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/menus/EliteMenu.java @@ -0,0 +1,69 @@ +package com.magmaguy.elitemobs.menus; + +import org.bukkit.entity.HumanEntity; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import java.util.HashMap; +import java.util.List; +import java.util.Set; + +public class EliteMenu implements Listener { + + public static void createEliteMenu(Inventory inventory, Set inventories) { + inventories.add(inventory); + } + + public static boolean isEliteMenu(InventoryClickEvent event, Set inventories) { + return inventories.contains(event.getInventory()); + } + + public static boolean isTopMenu(InventoryClickEvent event) { + if (event.getClickedInventory() == null) return false; + return event.getClickedInventory().equals(event.getView().getTopInventory()); + } + + public static boolean isBottomMenu(InventoryClickEvent event) { + return !isTopMenu(event); + } + + public static void cancel(HumanEntity player, Inventory eliteInventory, Inventory playerInventory, List inputSlots) { + for (int slot : inputSlots) { + if (eliteInventory.getItem(slot) != null) { + HashMap leftOvers = playerInventory.addItem(eliteInventory.getItem(slot)); + eliteInventory.clear(slot); + if (!leftOvers.isEmpty()) + leftOvers.values().forEach(itemStack -> player.getWorld().dropItem(player.getLocation(), itemStack)); + } + } + } + + public static void moveOneItemUp(int targetSlot, InventoryClickEvent event) { + if (event.getCurrentItem() == null) return; + ItemStack newItemStack = event.getCurrentItem().clone(); + newItemStack.setAmount(1); + event.getView().getTopInventory().setItem(targetSlot, newItemStack); + event.getCurrentItem().setAmount(event.getCurrentItem().getAmount() - 1); + } + + //Returns true if there was an item loss + public static boolean moveItemDown(Inventory inventoryToClear, int slotToClear, HumanEntity player, boolean canDrop) { + boolean itemLoss = false; + if (inventoryToClear.getItem(slotToClear) == null) return itemLoss; + HashMap leftovers = player.getInventory().addItem(inventoryToClear.getItem(slotToClear)); + //Item is ultimately lost if the inventory is full and it can't be dropped + if (!leftovers.isEmpty() && canDrop) + player.getWorld().dropItem(player.getLocation(), inventoryToClear.getItem(slotToClear)); + else if (!leftovers.isEmpty()) + itemLoss = true; + inventoryToClear.setItem(slotToClear, null); + return itemLoss; + } + + public static void moveItemDown(Inventory inventoryToClear, int slotToClear, HumanEntity player) { + moveItemDown(inventoryToClear, slotToClear, player, true); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/menus/GetLootMenu.java b/src/main/java/com/magmaguy/elitemobs/menus/GetLootMenu.java new file mode 100644 index 000000000..769c81215 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/menus/GetLootMenu.java @@ -0,0 +1,206 @@ +package com.magmaguy.elitemobs.menus; + +import com.magmaguy.elitemobs.config.menus.premade.GetLootMenuConfig; +import com.magmaguy.elitemobs.items.customitems.CustomItem; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; + +/** + * Created by MagmaGuy on 04/05/2017. + */ +public class GetLootMenu extends EliteMenu implements Listener { + + private static final List lootSlots = new ArrayList<>(new ArrayList<>(List.of(10, 11, 12, 13, 14, 15, 16, 19, 20, 21, 22, 23, 24, 25, 28, 29, 30, 31, + 32, 33, 34, 37, 38, 39, 40, 41, 42, 43, 46, 47, 48, 49, 50, 51, 52))); + public static HashMap inventories = new HashMap<>(); + private final String shopName = GetLootMenuConfig.menuName; + public int currentHeaderPage = 1; + public int currentLootPage = 1; + public boolean filter = false; + public int filterRank = 0; + public Inventory inventory; + + public GetLootMenu(Player player) { + + Inventory fakeChestInventory = Bukkit.createInventory(null, 54, shopName); + tierConstructor(fakeChestInventory); + headerConstructor(fakeChestInventory); + lootNavigationConstructor(fakeChestInventory); + lootConstructor(fakeChestInventory); + + player.openInventory(fakeChestInventory); + inventory = fakeChestInventory; + + inventories.put(player, this); + } + + public GetLootMenu(Player player, GetLootMenu getLootMenu) { + this.currentHeaderPage = getLootMenu.currentHeaderPage; + this.currentLootPage = getLootMenu.currentLootPage; + this.filter = getLootMenu.filter; + this.filterRank = getLootMenu.filterRank; + Inventory fakeChestInventory = Bukkit.createInventory(null, 54, shopName); + tierConstructor(fakeChestInventory); + headerConstructor(fakeChestInventory); + lootNavigationConstructor(fakeChestInventory); + lootConstructor(fakeChestInventory); + + player.openInventory(fakeChestInventory); + inventory = fakeChestInventory; + + inventories.put(player, this); + } + + private void headerConstructor(Inventory inventory) { + inventory.setItem(0, GetLootMenuConfig.leftArrowItem); + inventory.setItem(8, GetLootMenuConfig.rightArrowItem); + inventory.setItem(4, GetLootMenuConfig.infoItem); + } + + private void tierConstructor(Inventory inventory) { + + List tierSlots = new ArrayList<>(); + + tierSlots.add(1); + tierSlots.add(2); + tierSlots.add(3); + tierSlots.add(5); + tierSlots.add(6); + tierSlots.add(7); + + List keySet = new ArrayList<>(CustomItem.getTieredLoot().keySet()); + Collections.sort(keySet); + + int counter = 1; + for (int number : tierSlots) { + if (keySet.size() >= counter + ((currentHeaderPage - 1) * 6)) { + ItemStack chest = new ItemStack(Material.CHEST, 1); + ItemMeta chestItemMeta = chest.getItemMeta(); + chestItemMeta.setDisplayName(GetLootMenuConfig.tierTranslation + " " + keySet.get((counter - 1) + ((currentHeaderPage - 1) * 6))); + List lore = new ArrayList(); + lore.add(GetLootMenuConfig.itemFilterTranslation); + chestItemMeta.setLore(lore); + chest.setItemMeta(chestItemMeta); + inventory.setItem(number, chest); + } + counter++; + } + + } + + private void lootNavigationConstructor(Inventory inventory) { + inventory.setItem(27, GetLootMenuConfig.previousLootItem); + inventory.setItem(35, GetLootMenuConfig.nextLootItem); + } + + private void lootConstructor(Inventory inventory) { + + List getLootList = new ArrayList<>(); + for (List list : CustomItem.getTieredLoot().values()) + getLootList.addAll(list); + + int counter = 1; + for (int number : lootSlots) { + if (!filter) { + if (getLootList.size() >= counter + ((currentLootPage - 1) * 35)) + inventory.setItem(number, getLootList.get(counter - 1 + ((currentLootPage - 1) * 35))); + } else { + List currentRankLoot = CustomItem.getTieredLoot().get(filterRank); + if (currentRankLoot.size() >= counter + ((currentLootPage - 1) * 35)) + inventory.setItem(number, currentRankLoot.get(counter - 1 + ((currentLootPage - 1) * 35))); + } + counter++; + } + } + + public static class GetLootMenuListener implements Listener { + @EventHandler + public void onClick(InventoryClickEvent event) { + + GetLootMenu getLootMenu = null; + for (GetLootMenu iteratedMenu : inventories.values()) + if (iteratedMenu != null && iteratedMenu.inventory.equals(event.getInventory())) { + getLootMenu = iteratedMenu; + break; + } + if (getLootMenu == null) return; + if (event.getClickedInventory() == null) return; + event.setCancelled(true); + + Player player = (Player) event.getWhoClicked(); + ItemStack currentItem = event.getCurrentItem(); + + if (!isTopMenu(event)) return; + //CASE: If the player clicked something in the actual getloot menu + + if (currentItem == null) return; + + //CASE: If it was one of the items that they can get + if (lootSlots.contains(event.getSlot())) { + player.getInventory().addItem(currentItem); + return; + } + + if (currentItem == null || currentItem.getItemMeta() == null) return; + //CASE: If it was the "back to home" button + if (event.getSlot() == 4) { + new GetLootMenu(player); + return; + } + + //CASE: Left header arrow, previous tier + if (event.getSlot() == 0) { + if (getLootMenu.currentHeaderPage - 1 > 1) { + getLootMenu.currentHeaderPage--; + new GetLootMenu(player, getLootMenu); + } + return; + } + + if (event.getSlot() == 8) { + getLootMenu.currentHeaderPage++; + new GetLootMenu(player, getLootMenu); + return; + } + + if (event.getSlot() == 27) { + if (getLootMenu.currentLootPage - 1 < 1) return; + getLootMenu.currentLootPage--; + new GetLootMenu(player, getLootMenu); + return; + } + + if (event.getSlot() == 35) { + getLootMenu.currentLootPage++; + new GetLootMenu(player, getLootMenu); + return; + } + + if (event.getSlot() == 1 || + event.getSlot() == 2 || + event.getSlot() == 3 || + event.getSlot() == 5 || + event.getSlot() == 6 || + event.getSlot() == 7) { + getLootMenu.filter = true; + getLootMenu.filterRank = Integer.parseInt(currentItem.getItemMeta().getDisplayName().split("\\s")[1]); + getLootMenu.currentLootPage = 1; + new GetLootMenu(player, getLootMenu); + } + } + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/menus/InstancedDungeonBrowser.java b/src/main/java/com/magmaguy/elitemobs/menus/InstancedDungeonBrowser.java new file mode 100644 index 000000000..e9bdefa43 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/menus/InstancedDungeonBrowser.java @@ -0,0 +1,129 @@ +package com.magmaguy.elitemobs.menus; + +import com.magmaguy.elitemobs.config.DungeonsConfig; +import com.magmaguy.elitemobs.dungeons.EMPackage; +import com.magmaguy.elitemobs.dungeons.WorldInstancedDungeonPackage; +import com.magmaguy.elitemobs.instanced.MatchInstance; +import com.magmaguy.elitemobs.instanced.dungeons.DungeonInstance; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import java.util.*; + +public class InstancedDungeonBrowser extends EliteMenu { + private static final HashMap inventories = new HashMap<>(); + + private final List difficultySlots = List.of(2, 4, 6, 0, 8, 1, 3, 5, 7); + private final List validSlots = new ArrayList<>(List.of(18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 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)); + @Getter + private final EMPackage emPackage; + private List instancesList; + + public InstancedDungeonBrowser(Player player, String instancedDungeonName) { + EMPackage emPackage = EMPackage.getEmPackages().get(instancedDungeonName); + this.emPackage = emPackage; + if (!(emPackage instanceof WorldInstancedDungeonPackage)) { + player.sendMessage("[EliteMobs] Not a valid instanced dungeon!"); + return; + } + Set dungeonInstances = new HashSet<>(); + DungeonInstance.getDungeonInstances().forEach(instance -> { + if (instance.getDungeonPackagerConfigFields().getFilename().equals(instancedDungeonName)) + dungeonInstances.add(instance); + }); + instancesList = new ArrayList<>(dungeonInstances); + int slots; + if (dungeonInstances.isEmpty()) slots = 9; + else slots = 54; + Inventory inventory = Bukkit.createInventory(player, slots); + int difficultyCounter = 0; + for (Map map : emPackage.getDungeonPackagerConfigFields().getDifficulties()) { + List description = new ArrayList<>(); + for (String string : DungeonsConfig.getInstancedDungeonDescription()) + description.add(string.replace("$dungeonName", emPackage.getDungeonPackagerConfigFields().getName())); + inventory.setItem(difficultySlots.get(difficultyCounter), ItemStackGenerator.generateItemStack(Material.GREEN_STAINED_GLASS_PANE, + DungeonsConfig.getInstancedDungeonTitle().replace("$difficulty", map.get("name") + ""), + description)); + + difficultyCounter++; + } + + for (int i = 0; i < dungeonInstances.size(); i++) { + ItemStack itemStack = null; + if (instancesList.get(i).getState().equals(MatchInstance.InstancedRegionState.WAITING)) + itemStack = playerItem(instancesList.get(i)); + else if (DungeonsConfig.isAllowSpectatorsInInstancedContent()) + itemStack = spectatorItem(instancesList.get(i)); + if (itemStack != null) + inventory.setItem(validSlots.get(i), itemStack); + } + player.openInventory(inventory); + inventories.put(inventory, this); + } + + private ItemStack spectatorItem(DungeonInstance dungeonInstance) { + List players = new ArrayList<>(); + players.add(ChatColorConverter.convert("&2Players:")); + dungeonInstance.getPlayers().forEach(player -> players.add(player.getDisplayName())); + return ItemStackGenerator.generateItemStack( + Material.ORANGE_STAINED_GLASS_PANE, + DungeonsConfig.getDungeonJoinAsSpectatorText().replace("$dungeonName", dungeonInstance.getDungeonPackagerConfigFields().getName()), + players); + } + + private ItemStack playerItem(DungeonInstance dungeonInstance) { + List players = new ArrayList<>(); + players.add(ChatColorConverter.convert("&2Players:")); + dungeonInstance.getPlayers().forEach(player -> players.add(player.getDisplayName())); + return ItemStackGenerator.generateItemStack( + Material.GREEN_STAINED_GLASS_PANE, + DungeonsConfig.getDungeonJoinAsPlayerText().replace("$dungeonName", dungeonInstance.getDungeonPackagerConfigFields().getName()), + players); + } + + public static class InstancedDungeonBrowserEvents implements Listener { + @EventHandler + public void onInventoryInteract(InventoryClickEvent event) { + if (!isEliteMenu(event, inventories.keySet())) return; + event.setCancelled(true); + if (!isTopMenu(event)) return; + if (event.getCurrentItem() == null || event.getCurrentItem().getType().equals(Material.AIR)) return; + InstancedDungeonBrowser instancedDungeonBrowser = inventories.get(event.getInventory()); + event.getWhoClicked().closeInventory(); + + //Case for creating a new instance + if (instancedDungeonBrowser.difficultySlots.contains(event.getSlot())) { + DungeonInstance.setupInstancedDungeon((Player) event.getWhoClicked(), + instancedDungeonBrowser.getEmPackage().getDungeonPackagerConfigFields().getFilename(), + (String) instancedDungeonBrowser.getEmPackage().getDungeonPackagerConfigFields().getDifficulties().get(instancedDungeonBrowser.difficultySlots.indexOf(event.getSlot())).get("name")); + } else { + DungeonInstance dungeonInstance = instancedDungeonBrowser.instancesList.get(instancedDungeonBrowser.validSlots.indexOf(event.getSlot())); + switch (dungeonInstance.getState()) { + case ONGOING, STARTING -> { + if (DungeonsConfig.isAllowSpectatorsInInstancedContent()) + dungeonInstance.addSpectator((Player) event.getWhoClicked(), false); + } + case WAITING -> dungeonInstance.addNewPlayer((Player) event.getWhoClicked()); + case COMPLETED -> + event.getWhoClicked().sendMessage("[EliteMobs] This match already ended! Can't join it!"); + } + } + } + + @EventHandler + public void onClose(InventoryCloseEvent event) { + inventories.remove(event.getInventory()); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/menus/ItemEnchantmentMenu.java b/src/main/java/com/magmaguy/elitemobs/menus/ItemEnchantmentMenu.java new file mode 100644 index 000000000..b0bf40320 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/menus/ItemEnchantmentMenu.java @@ -0,0 +1,321 @@ +package com.magmaguy.elitemobs.menus; + +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.config.EconomySettingsConfig; +import com.magmaguy.elitemobs.config.SpecialItemSystemsConfig; +import com.magmaguy.elitemobs.config.menus.premade.ItemEnchantmentMenuConfig; +import com.magmaguy.elitemobs.economy.EconomyHandler; +import com.magmaguy.elitemobs.instanced.dungeons.EnchantmentDungeonInstance; +import com.magmaguy.elitemobs.items.ItemTagger; +import com.magmaguy.elitemobs.items.ShareItem; +import com.magmaguy.elitemobs.items.upgradesystem.EliteEnchantmentItems; +import com.magmaguy.elitemobs.items.upgradesystem.UpgradeSystem; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Round; +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; + +public class ItemEnchantmentMenu extends EliteMenu { + + private static final String MENU_NAME = ItemEnchantmentMenuConfig.getMenuName(); + private static final int CANCEL_SLOT = ItemEnchantmentMenuConfig.getCancelSlot(); + private static final ItemStack cancelButton = ItemEnchantmentMenuConfig.getCancelButton(); + private static final int CONFIRM_SLOT = ItemEnchantmentMenuConfig.getConfirmSlot(); + private static final ItemStack confirmButton = ItemEnchantmentMenuConfig.getConfirmButton(); + private static final int INFO_SLOT = ItemEnchantmentMenuConfig.getInfoSlot(); + private static final ItemStack infoButton = ItemEnchantmentMenuConfig.getInfoButton(); + private static final int ITEM_SLOT = ItemEnchantmentMenuConfig.getItemSlot(); + private static final int ENCHANTED_BOOK_SLOT = ItemEnchantmentMenuConfig.getEnchantedBookSlot(); + private static final int ITEM_INFO_SLOT = ItemEnchantmentMenuConfig.getItemInfoSlot(); + private static final ItemStack itemInfoItemButton = ItemEnchantmentMenuConfig.getItemInfoButton(); + private static final int ENCHANTED_BOOK_INFO_SLOT = ItemEnchantmentMenuConfig.getEnchantedBookInfoSlot(); + private static final ItemStack enchantedBookInfoButton = ItemEnchantmentMenuConfig.getEnchantedBookInfoButton(); + private static final List confirmButtonLore = confirmButton.getItemMeta().getLore(); + private static final int LUCKY_TICKET_SLOT = ItemEnchantmentMenuConfig.getLuckyTicketSlot(); + private static final int LUCKY_TICKET_INFO_SLOT = ItemEnchantmentMenuConfig.getLuckyTicketInfoSlot(); + private static final ItemStack luckyTicketInfoButton = ItemEnchantmentMenuConfig.getLuckyTicketInfoButton(); + + private static final double LUCKY_TICKET_MULTIPLIER = SpecialItemSystemsConfig.getLuckyTicketMultiplier(); + private static final double CRITICAL_FAILURE_CHANCE = SpecialItemSystemsConfig.getCriticalFailureChance(); + private static final double CHALLENGE_CHANCE = SpecialItemSystemsConfig.getChallengeChance(); + + public ItemEnchantmentMenu(Player player) { + String name = MENU_NAME; + if (DefaultConfig.isForceMenuUnicode() || Bukkit.getPluginManager().isPluginEnabled("ResourcePackManager")) + name = ChatColor.WHITE + "\uF801\uDB80\uDC2A\uF805 " + MENU_NAME; + Inventory inventory = Bukkit.createInventory(player, 54, name); + ItemEnchantMenuEvents.menus.add(inventory); + + inventory.setItem(INFO_SLOT, infoButton); + inventory.setItem(ENCHANTED_BOOK_INFO_SLOT, enchantedBookInfoButton); + inventory.setItem(ITEM_INFO_SLOT, itemInfoItemButton); + inventory.setItem(CANCEL_SLOT, cancelButton); + inventory.setItem(CONFIRM_SLOT, confirmButton); + inventory.setItem(LUCKY_TICKET_INFO_SLOT, luckyTicketInfoButton); + + updateConfirmButton(inventory); + + player.openInventory(inventory); + } + + private static void updateConfirmButton(Inventory inventory) { + ItemStack newButton = confirmButton.clone(); + ItemMeta itemMeta = newButton.getItemMeta(); + List newLore = new ArrayList<>(); + EnumMap chances = getChanceBreakdown(inventory); + for (String string : confirmButtonLore) + newLore.add(string + .replace("$price", price(inventory) + "") + .replace("$currencyName", EconomySettingsConfig.getCurrencyName()) + .replace("$successChance", (Round.twoDecimalPlaces(chances.get(Chance.SUCCESS) * 100)) + "") + .replace("$criticalFailureChance", (Round.twoDecimalPlaces(chances.get(Chance.CRITICAL_FAILURE) * 100)) + "") + .replace("$challengeChance", (Round.twoDecimalPlaces(chances.get(Chance.CHALLENGE) * 100)) + "") + .replace("$failureChance", (Round.twoDecimalPlaces(chances.get(Chance.FAILURE) * 100)) + "")); + itemMeta.setLore(newLore); + newButton.setItemMeta(itemMeta); + inventory.setItem(CONFIRM_SLOT, newButton); + } + + //Order goes SUCCESS -> CRITICAL_FAILURE -> CHALLENGE -> FAILURE + private static EnumMap getChanceBreakdown(Inventory inventory) { + EnumMap chances = new EnumMap<>(Chance.class); + boolean luckyTicket = inventory.getItem(LUCKY_TICKET_SLOT) != null; + + double currentTotal = 1d; + double criticalFailure = CRITICAL_FAILURE_CHANCE; + + double success = successChance(inventory); + currentTotal -= success; + chances.put(Chance.SUCCESS, success); + if (success == 1) { + chances.put(Chance.SUCCESS, 1D); + chances.put(Chance.CRITICAL_FAILURE, 0D); + chances.put(Chance.CHALLENGE, 0D); + chances.put(Chance.FAILURE, 0D); + return chances; + } + + if (luckyTicket) criticalFailure /= 2D; + criticalFailure *= currentTotal; + criticalFailure = Round.twoDecimalPlaces(criticalFailure); + chances.put(Chance.CRITICAL_FAILURE, criticalFailure); + + currentTotal -= criticalFailure; + double challenge = Round.twoDecimalPlaces(currentTotal * CHALLENGE_CHANCE); + + chances.put(Chance.CHALLENGE, challenge); + + currentTotal -= challenge; + chances.put(Chance.FAILURE, Round.twoDecimalPlaces(currentTotal)); + + return chances; + } + + private static int price(Inventory inventory) { + ItemStack itemStack = inventory.getItem(ITEM_SLOT); + if (itemStack == null) return 0; + return (int) Math.pow(ItemTagger.getEnchantmentCount(itemStack) + 1D, 4); + } + + private static double successChance(Inventory inventory) { + ItemStack itemStack = inventory.getItem(ITEM_SLOT); + if (itemStack == null) return 0; + double chance = 100.0 / (ItemTagger.getEnchantmentCount(itemStack) + 1.0) * 4; + if (inventory.getItem(LUCKY_TICKET_SLOT) != null) chance *= LUCKY_TICKET_MULTIPLIER; + return Round.twoDecimalPlaces(Math.min(1, chance / 100)); + } + + public static void broadcastEnchantmentMessage(ItemStack upgradedItem, Player upgradingPlayer, String message) { + if (SpecialItemSystemsConfig.isAnnounceImportantEnchantments() && ItemTagger.getEnchantmentCount(upgradedItem) > 10) + if (!message.contains("$itemName")) + Bukkit.getOnlinePlayers().forEach(player -> player.spigot().sendMessage( + ChatMessageType.CHAT, TextComponent.fromLegacyText( + ChatColorConverter.convert(message.replace("$player", upgradingPlayer.getDisplayName()))))); + else { + TextComponent itemName = ShareItem.hoverableItemTextComponent(upgradedItem); + String[] text = message.replace("$itemName", "itemName").split("itemName"); + BaseComponent[] baseComponent1 = TextComponent.fromLegacyText(ChatColorConverter.convert(text[0].replace("$player", upgradingPlayer.getDisplayName()))); + BaseComponent[] baseComponent2 = TextComponent.fromLegacyText(ChatColorConverter.convert(text[1].replace("$player", upgradingPlayer.getDisplayName()))); + + ComponentBuilder componentBuilder = new ComponentBuilder(); + componentBuilder.append(baseComponent1); + componentBuilder.append(itemName); + componentBuilder.append(baseComponent2); + + Bukkit.getOnlinePlayers().forEach(player -> player.spigot().sendMessage(ChatMessageType.CHAT, componentBuilder.create())); + } + } + + private enum Chance { + SUCCESS, + CHALLENGE, + FAILURE, + CRITICAL_FAILURE + } + + public static class ItemEnchantMenuEvents implements Listener { + private static final Set menus = new HashSet<>(); + + @EventHandler(ignoreCancelled = true) + public void onInventoryInteract(InventoryClickEvent event) { + if (!EliteMenu.isEliteMenu(event, menus)) return; + event.setCancelled(true); + if (!SharedShopElements.itemNullPointerPrevention(event)) return; + + if (isTopMenu(event)) { + handleTopInventory(event); + } else { + handleBottomInventory(event); + } + + if (event.getInventory().getItem(ENCHANTED_BOOK_SLOT) != null && + event.getInventory().getItem(ITEM_SLOT) != null && + !UpgradeSystem.isValidUpgrade(event.getView().getTopInventory().getItem(ITEM_SLOT), + event.getView().getTopInventory().getItem(ENCHANTED_BOOK_SLOT))) { + event.getWhoClicked().sendMessage(ItemEnchantmentMenuConfig.getEnchantmentLimitMessage()); + event.getWhoClicked().closeInventory(); + } + } + + private void handleTopInventory(InventoryClickEvent event) { + int clickedSlot = event.getSlot(); + + if (clickedSlot == CANCEL_SLOT) event.getWhoClicked().closeInventory(); + else if (clickedSlot == CONFIRM_SLOT) confirm(event); + else if (clickedSlot == ITEM_SLOT || clickedSlot == ENCHANTED_BOOK_SLOT || clickedSlot == LUCKY_TICKET_SLOT) { + moveItemDown(event.getView().getTopInventory(), clickedSlot, event.getWhoClicked()); + event.getClickedInventory().clear(clickedSlot); + if (clickedSlot == ITEM_SLOT && event.getView().getTopInventory().getItem(ENCHANTED_BOOK_SLOT) != null) + moveItemDown(event.getView().getTopInventory(), ENCHANTED_BOOK_SLOT, event.getWhoClicked()); + updateConfirmButton(event.getInventory()); + } + + } + + private void handleBottomInventory(InventoryClickEvent event) { + if (EliteEnchantmentItems.isEliteEnchantmentBook(event.getCurrentItem())) { + if (event.getInventory().getItem(ENCHANTED_BOOK_SLOT) == null) + moveOneItemUp(ENCHANTED_BOOK_SLOT, event); + else + //Make sure enchant books themselves can't be enchanted + { + } + } else if (EliteEnchantmentItems.isEliteLuckyTicket(event.getCurrentItem()) && + event.getView().getTopInventory().getItem(LUCKY_TICKET_SLOT) == null) { + moveOneItemUp(LUCKY_TICKET_SLOT, event); + updateConfirmButton(event.getInventory()); + } else if (ItemTagger.isEliteItem(event.getCurrentItem()) && + event.getInventory().getItem(ITEM_SLOT) == null) { + moveOneItemUp(ITEM_SLOT, event); + updateConfirmButton(event.getInventory()); + } + } + + private void confirm(InventoryClickEvent event) { + double price = price(event.getView().getTopInventory()); + if (EconomyHandler.checkCurrency(event.getWhoClicked().getUniqueId()) < price) { + event.getWhoClicked().sendMessage(SpecialItemSystemsConfig.getInsufficientFundsMessage() + .replace("$price", Round.twoDecimalPlaces(price) + "") + .replace("$currencyName", EconomySettingsConfig.getCurrencyName()) + .replace("$currentAmount", EconomyHandler.checkCurrency(event.getWhoClicked().getUniqueId()) + "") + .replace("$itemName", event.getView().getTopInventory().getItem(ITEM_SLOT).getItemMeta().getDisplayName())); + event.getWhoClicked().closeInventory(); + return; + } + + if (event.getView().getTopInventory().getItem(ITEM_SLOT) == null || + event.getView().getTopInventory().getItem(ENCHANTED_BOOK_SLOT) == null) { + event.getWhoClicked().sendMessage(ChatColorConverter.convert("&8[EliteMobs] &cYou must add an elite item and an enchanted book to enchant an item!")); + return; + } + + EconomyHandler.subtractCurrency(event.getWhoClicked().getUniqueId(), price); + event.getWhoClicked().sendMessage(SpecialItemSystemsConfig.getNewFundsMessage() + .replace("$price", price + "") + .replace("$currencyName", EconomySettingsConfig.getCurrencyName()) + .replace("$currentAmount", EconomyHandler.checkCurrency(event.getWhoClicked().getUniqueId()) + "")); + + //challenge(event); cool for debugging, I'll remove this later + + EnumMap chance = getChanceBreakdown(event.getView().getTopInventory()); + double rolledChance = ThreadLocalRandom.current().nextDouble(); + if (rolledChance < chance.get(Chance.CRITICAL_FAILURE)) + criticalFailure(event); + else if (rolledChance < chance.get(Chance.CHALLENGE)) + challenge(event); + else if (rolledChance < chance.get(Chance.FAILURE)) + failure(event); + else + success(event); + + event.getView().getTopInventory().clear(); + event.getWhoClicked().closeInventory(); + } + + private void failure(InventoryClickEvent event) { + event.getWhoClicked().sendMessage(ChatColorConverter.convert("&8[EliteMobs] &cFailed enchantment! The enchantment did not bind to the item.")); + moveItemDown(event.getView().getTopInventory(), ITEM_SLOT, event.getWhoClicked()); + } + + private void challenge(InventoryClickEvent event) { + ItemStack currentItem = event.getView().getTopInventory().getItem(ITEM_SLOT); + if (!EnchantmentDungeonInstance.setupRandomEnchantedChallengeDungeon((Player) event.getWhoClicked(), + UpgradeSystem.upgrade(currentItem.clone(), event.getView().getTopInventory().getItem(ENCHANTED_BOOK_SLOT)), + currentItem.clone())) { + success(event); + return; + } + currentItem.setAmount(currentItem.getAmount() - 1); + if (currentItem.getAmount() > 0) + if (moveItemDown(event.getView().getTopInventory(), ITEM_SLOT, event.getWhoClicked(), false)) { + event.getWhoClicked().sendMessage(ChatColorConverter.convert( + "&8[EliteMobs] &cYour inventory was full so the item you were trying to upgrade has been deleted! It will be restored if your item is not full by the time you leave the instanced dungeon.")); + } + + event.getWhoClicked().sendMessage(ChatColorConverter.convert("&8[EliteMobs] &6Challenge! Defeat the boss to get your upgraded item!")); + event.getWhoClicked().sendMessage(ChatColorConverter.convert("&cThere's a 10% chance of losing your item if you lose the fight! Leaving the arena counts as losing.")); + broadcastEnchantmentMessage(currentItem, (Player) event.getWhoClicked(), SpecialItemSystemsConfig.getChallengeAnnouncement()); + } + + private void criticalFailure(InventoryClickEvent event) { + event.getWhoClicked().sendMessage(ChatColorConverter.convert("&8[EliteMobs] &4Critical failure! You lost the item!")); + broadcastEnchantmentMessage(event.getView().getTopInventory().getItem(ITEM_SLOT), (Player) event.getWhoClicked(), SpecialItemSystemsConfig.getCriticalFailureAnnouncement()); + } + + private void success(InventoryClickEvent event) { + ItemStack upgradedItem = UpgradeSystem.upgrade(event.getView().getTopInventory().getItem(ITEM_SLOT), + event.getView().getTopInventory().getItem(ENCHANTED_BOOK_SLOT)); + Player player = (Player) event.getWhoClicked(); + HashMap leftovers = player.getInventory().addItem(upgradedItem); + if (!leftovers.isEmpty()) + event.getWhoClicked().getWorld().dropItem(event.getWhoClicked().getLocation(), upgradedItem); + event.getWhoClicked().sendMessage(ChatColorConverter.convert("&8[EliteMobs] &2Successful enchantment!")); + broadcastEnchantmentMessage(upgradedItem, (Player) event.getWhoClicked(), SpecialItemSystemsConfig.getSuccessAnnouncement()); + } + + @EventHandler + public void onClose(InventoryCloseEvent event) { + if (menus.contains(event.getInventory())) { + menus.remove(event.getInventory()); + EliteMenu.cancel(event.getPlayer(), event.getView().getTopInventory(), event.getView().getBottomInventory(), + new ArrayList<>(List.of(ITEM_SLOT, ENCHANTED_BOOK_SLOT, LUCKY_TICKET_SLOT))); + } + } + + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/menus/LootMenu.java b/src/main/java/com/magmaguy/elitemobs/menus/LootMenu.java new file mode 100644 index 000000000..6f12a408c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/menus/LootMenu.java @@ -0,0 +1,121 @@ +package com.magmaguy.elitemobs.menus; + +import com.magmaguy.elitemobs.items.customloottable.SharedLootTable; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class LootMenu extends EliteMenu { + @Getter + private static final HashMap playerLoot = new HashMap<>(); + private static final List glassSlots = List.of(4, 13, 22, 31, 40, 49); + private static final int greedInfo = 2; + private static final int needInfo = 6; + private static final List greedSlots = List.of(9, 10, 11, 12, 18, 19, 20, 21, 27, 28, 29, 30, 36, 37, 38, 39, 45, 46, 47, 48); + private static final List needSlots = List.of(14, 15, 16, 17, 23, 24, 25, 26, 32, 33, 34, 35, 41, 42, 43, 44, 50, 51, 52, 53); + private final SharedLootTable sharedLootTable; + private final SharedLootTable.PlayerTable playerTable; + @Getter + private final Inventory inventory; + private final Player player; + + public LootMenu(Player player, SharedLootTable sharedLootTable, SharedLootTable.PlayerTable playerTable) { + this.inventory = Bukkit.createInventory(player, 54); + this.sharedLootTable = sharedLootTable; + this.playerTable = playerTable; + this.player = player; + for (int i : glassSlots) inventory.setItem(i, new ItemStack(Material.GRAY_STAINED_GLASS_PANE)); + //Info slots + inventory.setItem(greedInfo, + ItemStackGenerator.generateItemStack( + Material.ORANGE_STAINED_GLASS_PANE, + ChatColorConverter.convert("&2Greed Item List"), + List.of("Click to move to the Need item list!", + "Items in the greed list will only", + "be rolled for if no one needs them!"))); + inventory.setItem(needInfo, + ItemStackGenerator.generateItemStack( + Material.GREEN_STAINED_GLASS_PANE, + ChatColorConverter.convert("&2Need Item List"), + List.of("Click to move to the Greed item list!", + "Items in the need list will only", + "be rolled for people who needed them!"))); + playerLoot.put(player, this); + } + + public static void openMenu(Player player) { + LootMenu lootMenu = playerLoot.get(player); + if (lootMenu == null) { + player.sendMessage(ChatColorConverter.convert("&4[EliteMobs] &6You don't currently have any group loot to vote on!")); + return; + } + player.openInventory(lootMenu.renderMenu()); + } + + private Inventory renderMenu() { + greedSlots.forEach(slot -> inventory.setItem(slot, null)); + needSlots.forEach(slot -> inventory.setItem(slot, null)); + int greedIndex = 0; + List greedItems = new ArrayList<>(sharedLootTable.getLoot()); + greedItems.removeAll(playerTable.getNeedItems()); + for (ItemStack greedItem : greedItems) { + if (greedIndex >= greedSlots.size()) break; + inventory.setItem(greedSlots.get(greedIndex), greedItem); + greedIndex++; + } + int needIndex = 0; + for (ItemStack needItem : playerTable.getNeedItems()) { + if (needIndex >= needSlots.size()) break; + inventory.setItem(needSlots.get(needIndex), needItem); + needIndex++; + } + return inventory; + } + + public void removeMenu() { + LootMenu lootMenu = playerLoot.get(player); + if (lootMenu == this) { + if (player.getOpenInventory().getTopInventory().equals(lootMenu.getInventory())) + player.closeInventory(); + playerLoot.remove(player); + } + } + + + public static class LootMenuEvents implements Listener { + @EventHandler(ignoreCancelled = true) + public void onInventoryInteract(InventoryClickEvent event) { + Player player = ((Player) event.getWhoClicked()).getPlayer(); + LootMenu lootMenu = playerLoot.get(player); + if (lootMenu == null) return; + if (!lootMenu.inventory.equals(event.getInventory())) return; + event.setCancelled(true); + if (isBottomMenu(event)) return; + if (event.getCurrentItem() == null || event.getCurrentItem().getType().equals(Material.AIR)) return; + lootMenu.renderMenu(); + int slot = event.getSlot(); + //Greed slots + if (greedSlots.contains(slot)) { + lootMenu.playerTable.addNeed(event.getCurrentItem()); + openMenu(player); + } + //Need slots + else if (needSlots.contains(slot)) { + lootMenu.playerTable.removeNeed(event.getCurrentItem()); + openMenu(player); + } + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/menus/ProceduralShopMenu.java b/src/main/java/com/magmaguy/elitemobs/menus/ProceduralShopMenu.java new file mode 100644 index 000000000..9a3adf8c6 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/menus/ProceduralShopMenu.java @@ -0,0 +1,183 @@ +package com.magmaguy.elitemobs.menus; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.config.EconomySettingsConfig; +import com.magmaguy.elitemobs.config.menus.premade.BuyOrSellMenuConfig; +import com.magmaguy.elitemobs.config.menus.premade.ProceduralShopMenuConfig; +import com.magmaguy.elitemobs.economy.EconomyHandler; +import com.magmaguy.elitemobs.items.EliteItemLore; +import com.magmaguy.elitemobs.items.ItemTagger; +import com.magmaguy.elitemobs.items.ItemWorthCalculator; +import com.magmaguy.elitemobs.items.itemconstructor.ItemConstructor; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.*; + +/** + * Created by MagmaGuy on 17/06/2017. + */ +public class ProceduralShopMenu { + + private static final List validSlots = ProceduralShopMenuConfig.storeSlots; + public static Set cooldownPlayers = new HashSet<>(); + + public static void shutdown() { + cooldownPlayers.clear(); + ProceduralShopMenuEvents.menus.clear(); + } + + public static void shopInitializer(Player player) { + + if (!EconomySettingsConfig.isEnableEconomy()) return; + BuyOrSellMenu.constructBuyOrSellMenu(player, BuyOrSellMenuConfig.BUY_PROCEDURAL_ITEM); + + } + + public static void shopConstructor(Player player) { + String menuName = ProceduralShopMenuConfig.shopName; + if (DefaultConfig.isForceMenuUnicode() || Bukkit.getPluginManager().isPluginEnabled("ResourcePackManager")) + menuName = ChatColor.WHITE + "\uF801\uDB80\uDC8B\uF805 " + menuName; + Inventory shopInventory = Bukkit.createInventory(player, 54, menuName); + populateShop(shopInventory, player); + player.openInventory(shopInventory); + ProceduralShopMenuEvents.menus.add(shopInventory); + + } + + private static void populateShop(Inventory shopInventory, Player player) { + + ItemStack rerollButton = ProceduralShopMenuConfig.rerollItem; + if (DefaultConfig.isForceMenuUnicode() || Bukkit.getPluginManager().isPluginEnabled("ResourcePackManager")) { + rerollButton.setType(Material.PAPER); + ItemMeta itemMeta = rerollButton.getItemMeta(); + itemMeta.setCustomModelData(MetadataHandler.signatureID); + rerollButton.setItemMeta(itemMeta); + } + + shopInventory.setItem(ProceduralShopMenuConfig.rerollSlot, rerollButton); + shopContents(shopInventory, player); + + } + + private static void shopContents(Inventory shopInventory, Player player) { + + Random random = new Random(); + + for (int i : validSlots) { + + int balancedMax = ProceduralShopMenuConfig.maxTier - ProceduralShopMenuConfig.minTier; + int balancedMin = ProceduralShopMenuConfig.minTier; + + int randomTier = random.nextInt(balancedMax) + balancedMin; + + ItemStack itemStack = ItemConstructor.constructItem(randomTier, null, player, true); + //SoulbindEnchantment.addEnchantment(itemStack, player); + new EliteItemLore(itemStack, true); + + shopInventory.setItem(i, itemStack); + + } + + } + + public static class ProceduralShopMenuEvents implements Listener { + public static Set menus = new HashSet<>(); + + @EventHandler + public void onClick(InventoryClickEvent event) { + + if (!EliteMenu.isEliteMenu(event, menus)) return; + if (event.getClickedInventory() == null || !event.getClickedInventory().getType().equals(InventoryType.CHEST)) { + event.setCancelled(true); + return; + } + event.setCancelled(true); + if (!SharedShopElements.itemNullPointerPrevention(event)) return; + + //reroll loot button + if (event.getCurrentItem().getItemMeta().getDisplayName().equals(ProceduralShopMenuConfig.rerollItem.getItemMeta().getDisplayName())) { + if (cooldownPlayers.contains(event.getWhoClicked().getUniqueId())) { + event.setCancelled(true); + return; + } + + cooldownPlayers.add(event.getWhoClicked().getUniqueId()); + new BukkitRunnable() { + @Override + public void run() { + cooldownPlayers.remove(event.getWhoClicked().getUniqueId()); + } + }.runTaskLater(MetadataHandler.PLUGIN, 20 * 2L); + + populateShop(event.getInventory(), Bukkit.getPlayer(event.getWhoClicked().getUniqueId())); + event.setCancelled(true); + return; + } + + if (!ItemTagger.isEliteItem(event.getCurrentItem())) { + event.setCancelled(true); + return; + } + + Player player = (Player) event.getWhoClicked(); + ItemStack itemStack = event.getCurrentItem(); + String itemDisplayName = itemStack.getItemMeta().getDisplayName(); + + double itemValue = ItemWorthCalculator.determineItemWorth(itemStack, player); + + boolean inventoryHasFreeSlots = false; + for (ItemStack iteratedStack : player.getInventory().getStorageContents()) + if (iteratedStack == null) { + inventoryHasFreeSlots = true; + break; + } + + //These slots are for buying items + if (EliteMenu.isTopMenu(event)) { + + if (!inventoryHasFreeSlots) { + + player.sendMessage(ProceduralShopMenuConfig.messageFullInventory); + player.closeInventory(); + + } else if (EconomyHandler.checkCurrency(player.getUniqueId()) >= itemValue) { + //player has enough money + EconomyHandler.subtractCurrency(player.getUniqueId(), itemValue); + new EliteItemLore(itemStack, false); + player.getInventory().addItem(itemStack); + populateShop(event.getInventory(), Bukkit.getPlayer(event.getWhoClicked().getUniqueId())); + SharedShopElements.buyMessage(player, itemDisplayName, itemValue); + + } else { + + player.closeInventory(); + menus.remove(player); + SharedShopElements.insufficientFundsMessage(player, itemValue); + + } + + } + + } + + @EventHandler + public void onClose(InventoryCloseEvent event) { + menus.remove(event.getInventory()); + } + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/menus/RepairMenu.java b/src/main/java/com/magmaguy/elitemobs/menus/RepairMenu.java new file mode 100644 index 000000000..be98f13ea --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/menus/RepairMenu.java @@ -0,0 +1,207 @@ +package com.magmaguy.elitemobs.menus; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.utils.EliteItemManager; +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.config.menus.premade.RepairMenuConfig; +import com.magmaguy.elitemobs.items.customenchantments.RepairEnchantment; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class RepairMenu extends EliteMenu { + private static final int eliteItemInputSlot = RepairMenuConfig.eliteItemInputSlot; + private static final int scrapItemInputSlot = RepairMenuConfig.eliteScrapInputSlot; + private static final int outputSlot = RepairMenuConfig.outputSlot; + private static final int eliteItemInformationInputSlot = RepairMenuConfig.eliteItemInputInformationSlot; + private static final int eliteScrapInformationInputSlot = RepairMenuConfig.eliteScrapInputInformationSlot; + private static final int informationOutputSlot = RepairMenuConfig.outputInformationSlot; + public static Set inventories = new HashSet<>(); + + private static void calculateOutput(Inventory repairInventory) { + if (repairInventory.getItem(RepairMenuConfig.eliteScrapInputSlot) == null || repairInventory.getItem(RepairMenuConfig.eliteItemInputSlot) == null) { + repairInventory.setItem(RepairMenuConfig.outputSlot, null); + return; + } + + int scrapLevel = RepairEnchantment.getRepairLevel(repairInventory.getItem(RepairMenuConfig.eliteScrapInputSlot)); + ItemStack outputItem = repairInventory.getItem(RepairMenuConfig.eliteItemInputSlot).clone(); + int baselineRepair = 100; + int newDamage = baselineRepair * scrapLevel; + Damageable damageable = (Damageable) outputItem.getItemMeta(); + int damage = Math.min(Math.max((damageable.getDamage() - newDamage), 0), damageable.getDamage()); + damageable.setDamage(damage); + outputItem.setItemMeta(damageable); + repairInventory.setItem(outputSlot, outputItem); + } + + /** + * Creates a menu for scrapping elitemobs items. Only special Elite Mob items can be scrapped here. + * + * @param player Player for whom the inventory will be created + */ + public void constructRepairMenu(Player player) { + String menuName = RepairMenuConfig.shopName; + if (DefaultConfig.isForceMenuUnicode() || Bukkit.getPluginManager().isPluginEnabled("ResourcePackManager")) + menuName = ChatColor.WHITE + "\uF801\uDB80\uDC2A\uF805 " + menuName; + + Inventory repairInventory = Bukkit.createInventory(player, 54, menuName); + + for (int i = 0; i < repairInventory.getSize(); i++) { + + if (i == RepairMenuConfig.infoSlot) { + ItemStack infoButton = RepairMenuConfig.infoButton; + if (DefaultConfig.isForceMenuUnicode() || Bukkit.getPluginManager().isPluginEnabled("ResourcePackManager")) { + infoButton.setType(Material.PAPER); + ItemMeta itemMeta = infoButton.getItemMeta(); + itemMeta.setCustomModelData(MetadataHandler.signatureID); + infoButton.setItemMeta(itemMeta); + } + repairInventory.setItem(i, infoButton); + continue; + } + + if (i == RepairMenuConfig.cancelSlot) { + repairInventory.setItem(i, RepairMenuConfig.cancelButton); + continue; + } + + if (i == eliteItemInformationInputSlot) { + repairInventory.setItem(i, RepairMenuConfig.eliteItemInputInfoButton); + continue; + } + + if (i == eliteScrapInformationInputSlot) { + repairInventory.setItem(i, RepairMenuConfig.eliteScrapInputInfoButton); + continue; + } + + if (i == informationOutputSlot) { + repairInventory.setItem(i, RepairMenuConfig.outputInfoButton); + continue; + } + + + if (i == RepairMenuConfig.confirmSlot) { + + ItemStack clonedConfirmButton = RepairMenuConfig.confirmButton.clone(); + + List lore = new ArrayList<>(); + for (String string : RepairMenuConfig.confirmButton.getItemMeta().getLore()) + lore.add(string); + RepairMenuConfig.confirmButton.getItemMeta().setLore(lore); + ItemMeta clonedMeta = clonedConfirmButton.getItemMeta(); + clonedMeta.setLore(lore); + clonedConfirmButton.setItemMeta(clonedMeta); + repairInventory.setItem(i, clonedConfirmButton); + continue; + + } + + + if (i == RepairMenuConfig.eliteItemInputSlot || i == RepairMenuConfig.eliteScrapInputSlot || i == RepairMenuConfig.outputSlot) + continue; + + if (DefaultConfig.isUseGlassToFillMenuEmptySpace()) + repairInventory.setItem(i, ItemStackGenerator.generateItemStack(Material.GLASS_PANE)); + + } + + player.openInventory(repairInventory); + createEliteMenu(repairInventory, inventories); + } + + public static class RepairMenuEvents implements Listener { + @EventHandler + public void onInteract(InventoryClickEvent event) { + if (!isEliteMenu(event, inventories)) return; + event.setCancelled(true); + + Player player = (Player) event.getWhoClicked(); + ItemStack currentItem = event.getCurrentItem(); + Inventory repairInventory = event.getView().getTopInventory(); + Inventory playerInventory = event.getView().getBottomInventory(); + + if (currentItem == null) return; + + if (isBottomMenu(event)) { + //Item is scrap + if (RepairEnchantment.isRepairItem(currentItem) && repairInventory.getItem(scrapItemInputSlot) == null) { + int scrapLevel = RepairEnchantment.getRepairLevel(currentItem); + if (scrapLevel >= 0) { + moveOneItemUp(scrapItemInputSlot, event); + calculateOutput(repairInventory); + return; + } + } + + //Item is elite item + if (EliteItemManager.isEliteMobsItem(currentItem)) + if (currentItem.getItemMeta() instanceof Damageable) + if (repairInventory.getItem(eliteItemInputSlot) == null) { + repairInventory.setItem(eliteItemInputSlot, currentItem); + playerInventory.remove(currentItem); + calculateOutput(repairInventory); + } + + } else if (isTopMenu(event)) { + + if (currentItem == null) return; + + //return item to inventory + if (event.getSlot() == scrapItemInputSlot || event.getSlot() == eliteItemInputSlot) { + player.getWorld().dropItem(player.getLocation(), currentItem); + repairInventory.remove(currentItem); + calculateOutput(repairInventory); + return; + } + + //cancel button + if (event.getSlot() == RepairMenuConfig.cancelSlot) { + player.closeInventory(); + return; + } + + //confirm button + if (event.getSlot() == RepairMenuConfig.confirmSlot) { + if (repairInventory.getItem(outputSlot) != null) { + repairInventory.setItem(RepairMenuConfig.eliteItemInputSlot, null); + repairInventory.setItem(RepairMenuConfig.eliteScrapInputSlot, null); + if (repairInventory.getItem(outputSlot) != null) { + player.getWorld().dropItem(player.getLocation(), repairInventory.getItem(outputSlot)); + repairInventory.remove(repairInventory.getItem(outputSlot)); + } + repairInventory.setItem(outputSlot, null); + } + } + + } + + } + + @EventHandler + public void onClose(InventoryCloseEvent event) { + if (inventories.contains(event.getInventory())) { + inventories.remove(event.getInventory()); + EliteMenu.cancel(event.getPlayer(), event.getView().getTopInventory(), event.getView().getBottomInventory(), new ArrayList<>(List.of(eliteItemInputSlot, scrapItemInputSlot))); + } + } + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/menus/ScrapperMenu.java b/src/main/java/com/magmaguy/elitemobs/menus/ScrapperMenu.java new file mode 100644 index 000000000..55c881ab7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/menus/ScrapperMenu.java @@ -0,0 +1,199 @@ +package com.magmaguy.elitemobs.menus; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.utils.EliteItemManager; +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.config.EconomySettingsConfig; +import com.magmaguy.elitemobs.config.ItemSettingsConfig; +import com.magmaguy.elitemobs.config.menus.premade.ScrapperMenuConfig; +import com.magmaguy.elitemobs.items.customenchantments.RepairEnchantment; +import com.magmaguy.elitemobs.items.customenchantments.SoulbindEnchantment; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.concurrent.ThreadLocalRandom; + +public class ScrapperMenu extends EliteMenu { + private static final List validSlots = ScrapperMenuConfig.storeSlots; + + public static Set inventories = new HashSet<>(); + + /** + * Creates a menu for scrapping elitemobs items. Only special Elite Mob items can be scrapped here. + * + * @param player Player for whom the inventory will be created + */ + public void constructScrapMenu(Player player) { + + String menuName = ScrapperMenuConfig.shopName; + if (DefaultConfig.isForceMenuUnicode() || Bukkit.getPluginManager().isPluginEnabled("ResourcePackManager")) + menuName = ChatColor.WHITE + "\uF801\uDB80\uDC2B\uF805 " + menuName; + + Inventory scrapInventory = Bukkit.createInventory(player, 54, menuName); + + for (int i = 0; i < 54; i++) { + + if (i == ScrapperMenuConfig.infoSlot) { + ItemStack infoButton = ScrapperMenuConfig.infoButton; + if (DefaultConfig.isForceMenuUnicode() || Bukkit.getPluginManager().isPluginEnabled("ResourcePackManager")) { + infoButton.setType(Material.PAPER); + ItemMeta itemMeta = infoButton.getItemMeta(); + itemMeta.setCustomModelData(MetadataHandler.signatureID); + List parsedLore = new ArrayList<>(); + itemMeta.getLore().forEach(entry -> parsedLore.add(entry.replace("$chance", ScrapperMenuConfig.scrapChance * 100 + ""))); + itemMeta.setLore(parsedLore); + infoButton.setItemMeta(itemMeta); + } + scrapInventory.setItem(i, infoButton); + continue; + } + + if (i == ScrapperMenuConfig.cancelSlot) { + scrapInventory.setItem(i, ScrapperMenuConfig.cancelButton); + continue; + } + + if (i == ScrapperMenuConfig.confirmSlot) { + + ItemStack clonedConfirmButton = ScrapperMenuConfig.confirmButton.clone(); + + List lore = new ArrayList<>(); + for (String string : ScrapperMenuConfig.confirmButton.getItemMeta().getLore()) + lore.add(string.replace("$chance", ScrapperMenuConfig.scrapChance * 100 + "")); + ScrapperMenuConfig.confirmButton.getItemMeta().setLore(lore); + ItemMeta clonedMeta = clonedConfirmButton.getItemMeta(); + clonedMeta.setLore(lore); + clonedConfirmButton.setItemMeta(clonedMeta); + scrapInventory.setItem(i, clonedConfirmButton); + continue; + + } + + if (validSlots.contains(i)) + continue; + + if (DefaultConfig.isUseGlassToFillMenuEmptySpace()) + scrapInventory.setItem(i, ItemStackGenerator.generateItemStack(Material.GLASS_PANE)); + + } + + player.openInventory(scrapInventory); + createEliteMenu(scrapInventory, inventories); + + } + + public static class ScrapperMenuEvents implements Listener { + @EventHandler(ignoreCancelled = true) + public void onInventoryInteract(InventoryClickEvent event) { + if (!isEliteMenu(event, inventories)) return; + event.setCancelled(true); + + Player player = (Player) event.getWhoClicked(); + ItemStack currentItem = event.getCurrentItem(); + Inventory shopInventory = event.getView().getTopInventory(); + Inventory playerInventory = event.getView().getBottomInventory(); + + if (currentItem == null) return; + + if (EliteMenu.isBottomMenu(event)) { + //CASE: If the player clicked on something in their inventory to put it on the shop + + //Check if it's an elitemobs item. The soulbind check only says if the player would be able to pick it up, and vanilla items can be picked up + if (!EliteItemManager.isEliteMobsItem(event.getCurrentItem())) { + event.getWhoClicked().sendMessage(ChatColorConverter.convert(EconomySettingsConfig.getShopSaleInstructions())); + return; + } + + //If the item isn't soulbound to the player, it can't be sold by that player + if (!SoulbindEnchantment.isValidSoulbindUser(currentItem.getItemMeta(), player)) { + player.sendMessage(ChatColorConverter.convert(EconomySettingsConfig.getShopSaleOthersItems())); + return; + } + + //Do transfer + for (int slot : ScrapperMenuConfig.storeSlots) + if (shopInventory.getItem(slot) == null) { + shopInventory.setItem(slot, currentItem); + playerInventory.clear(event.getSlot()); + break; + } + + } else if (EliteMenu.isTopMenu(event)) { + + //CASE: Player clicked on the shop + + //Signature item, does nothing + if (currentItem.equals(ScrapperMenuConfig.infoButton)) + return; + + //sell items in shop + if (event.getSlot() == ScrapperMenuConfig.confirmSlot) { + int successes = 0; + int failures = 0; + for (Integer validSlot : validSlots) { + ItemStack itemStack = shopInventory.getItem(validSlot); + if (itemStack == null) + continue; + + ItemStack scrapItem = RepairEnchantment.generateScrap(itemStack, player, null); + + for (int i = 0; i < itemStack.getAmount(); i++) { + if (ThreadLocalRandom.current().nextDouble() > ScrapperMenuConfig.scrapChance) { + failures++; + continue; + } + player.getWorld().dropItem(player.getLocation(), scrapItem); + successes++; + } + itemStack.setAmount(0); + } + if (successes > 0) + player.sendMessage(ChatColorConverter.convert(ItemSettingsConfig.getScrapSucceededMessage().replace("$amount", successes + ""))); + if (failures > 0) + player.sendMessage(ChatColorConverter.convert(ItemSettingsConfig.getScrapFailedMessage().replace("$amount", failures + ""))); + + return; + } + + //cancel, transfer items back to player inv and exit + if (event.getSlot() == ScrapperMenuConfig.cancelSlot) { + player.closeInventory(); + return; + } + + //If player clicks on a border glass pane, do nothing + if (!validSlots.contains(event.getSlot())) return; + + + //If player clicks on one of the items already in the shop, return to their inventory + moveItemDown(event.getView().getTopInventory(), event.getSlot(), player); + } + + } + + @EventHandler + public void onClose(InventoryCloseEvent event) { + if (inventories.contains(event.getInventory())) { + inventories.remove(event.getInventory()); + EliteMenu.cancel(event.getPlayer(), event.getView().getTopInventory(), event.getView().getBottomInventory(), validSlots); + } + } + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/menus/SellMenu.java b/src/main/java/com/magmaguy/elitemobs/menus/SellMenu.java new file mode 100644 index 000000000..653e6e536 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/menus/SellMenu.java @@ -0,0 +1,233 @@ +package com.magmaguy.elitemobs.menus; + +import com.magmaguy.elitemobs.api.utils.EliteItemManager; +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.config.EconomySettingsConfig; +import com.magmaguy.elitemobs.config.menus.premade.SellMenuConfig; +import com.magmaguy.elitemobs.economy.EconomyHandler; +import com.magmaguy.elitemobs.items.ItemWorthCalculator; +import com.magmaguy.elitemobs.items.customenchantments.SoulbindEnchantment; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import com.magmaguy.magmacore.util.Round; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class SellMenu extends EliteMenu implements Listener { + + private static final List validSlots = SellMenuConfig.storeSlots; + + public static Set inventories = new HashSet<>(); + + private static double calculateShopValue(Inventory shopInventory, Player player) { + double itemWorth = 0; + for (Integer validSlot : validSlots) { + ItemStack itemStack = shopInventory.getItem(validSlot); + if (itemStack == null) continue; + itemWorth += (ItemWorthCalculator.determineResaleWorth(itemStack, player) * itemStack.getAmount()); + } + return itemWorth; + } + + private static ItemStack updateConfirmButton(double itemWorth) { + ItemStack clonedConfirmButton = SellMenuConfig.confirmButton.clone(); + + List lore = new ArrayList<>(); + for (String string : clonedConfirmButton.getItemMeta().getLore()) + lore.add(string + .replace("$currency_amount", itemWorth + "") + .replace("$currency_name", EconomySettingsConfig.getCurrencyName())); + + ItemMeta clonedMeta = clonedConfirmButton.getItemMeta(); + clonedMeta.setLore(lore); + clonedConfirmButton.setItemMeta(clonedMeta); + return clonedConfirmButton; + } + + /** + * Creates a menu for selling elitemobs items. Only special Elite Mob items can be sold here. + * + * @param player Player for whom the inventory will be created + */ + public void constructSellMenu(Player player) { + + String menuName = SellMenuConfig.shopName; + if (DefaultConfig.isForceMenuUnicode() || Bukkit.getPluginManager().isPluginEnabled("ResourcePackManager")) + menuName = ChatColor.WHITE + "\uF801\uDB80\uDC5B\uF805 " + menuName; + + Inventory sellInventory = Bukkit.createInventory(player, 54, menuName); + + for (int i = 0; i < 54; i++) { + + if (i == SellMenuConfig.infoSlot) { + sellInventory.setItem(i, SellMenuConfig.infoButton); + continue; + } + + if (i == SellMenuConfig.cancelSlot) { + sellInventory.setItem(i, SellMenuConfig.cancelButton); + continue; + } + + if (i == SellMenuConfig.confirmSlot) { + + ItemStack clonedConfirmButton = SellMenuConfig.confirmButton.clone(); + + List lore = new ArrayList<>(); + for (String string : SellMenuConfig.confirmButton.getItemMeta().getLore()) + lore.add(string + .replace("$currency_amount", 0 + "") + .replace("$currency_name", EconomySettingsConfig.getCurrencyName())); + SellMenuConfig.confirmButton.getItemMeta().setLore(lore); + ItemMeta clonedMeta = clonedConfirmButton.getItemMeta(); + clonedMeta.setLore(lore); + clonedConfirmButton.setItemMeta(clonedMeta); + sellInventory.setItem(i, clonedConfirmButton); + continue; + + } + + if (validSlots.contains(i)) + continue; + + if (DefaultConfig.isUseGlassToFillMenuEmptySpace()) + sellInventory.setItem(i, ItemStackGenerator.generateItemStack(Material.GLASS_PANE)); + + } + + player.openInventory(sellInventory); + createEliteMenu(sellInventory, inventories); + + } + + @EventHandler + public void onInventoryClick(InventoryClickEvent event) { + + if (!isEliteMenu(event, inventories)) return; + event.setCancelled(true); + + Player player = (Player) event.getWhoClicked(); + ItemStack currentItem = event.getCurrentItem(); + Inventory shopInventory = event.getView().getTopInventory(); + Inventory playerInventory = event.getView().getBottomInventory(); + + if (!SharedShopElements.itemNullPointerPrevention(event)) return; + + if (isBottomMenu(event)) { + //CASE: If the player clicked on something in their inventory to put it on the shop + + //Check if it's an elitemobs item. The soulbind check only says if the player would be able to pick it up, and vanilla items can be picked up + if (!EliteItemManager.isEliteMobsItem(event.getCurrentItem())) { + event.getWhoClicked().sendMessage(ChatColorConverter.convert(EconomySettingsConfig.getShopSaleInstructions())); + return; + } + + //If the item isn't soulbound to the player, it can't be sold by that player + if (!SoulbindEnchantment.isValidSoulbindUser(currentItem.getItemMeta(), player)) { + player.sendMessage(ChatColorConverter.convert(EconomySettingsConfig.getShopSaleOthersItems())); + return; + } + + //If the shop is full, don't let the player put stuff in it + int firstEmptySlot = -1; + for (int i : validSlots) + if (shopInventory.getItem(i) == null) { + firstEmptySlot = i; + break; + } + if (firstEmptySlot == -1) return; + + //Do transfer + shopInventory.setItem(firstEmptySlot, currentItem); + playerInventory.clear(event.getSlot()); + + //Update worth of things to be sold, now using cached prices + event.getInventory().setItem(SellMenuConfig.confirmSlot, updateConfirmButton(calculateShopValue(shopInventory, player))); + + } else { + //CASE: Player clicked on the shop + + //Signature item, does nothing + if (currentItem.equals(SellMenuConfig.infoButton)) + return; + + //sell items in shop + if (event.getSlot() == SellMenuConfig.confirmSlot) { + + int amount = (int) validSlots.stream().filter(validSlot -> shopInventory.getItem(validSlot) != null).count(); + double totalItemValue = 0; + + for (Integer validSlot : validSlots) { + ItemStack itemStack = shopInventory.getItem(validSlot); + if (itemStack == null) + continue; + double itemValue = ItemWorthCalculator.determineResaleWorth(itemStack, player) * itemStack.getAmount(); + EconomyHandler.addCurrency(player.getUniqueId(), itemValue); + totalItemValue += itemValue; + + if (amount < 4) + player.sendMessage(ChatColorConverter.convert( + EconomySettingsConfig.getShopSellMessage() + .replace("$item_name", itemStack.getItemMeta().getDisplayName()) + .replace("$currency_amount", Round.twoDecimalPlaces(itemValue) + "") + .replace("$currency_name", EconomySettingsConfig.getCurrencyName()))); + shopInventory.clear(validSlot); + } + + if (amount >= 3) + player.sendMessage(ChatColorConverter.convert( + EconomySettingsConfig.getShopBatchSellMessage() + .replace("$currency_amount", totalItemValue + "") + .replace("$currency_name", EconomySettingsConfig.getCurrencyName()))); + + player.sendMessage(ChatColorConverter.convert( + EconomySettingsConfig.getShopCurrentBalance() + .replace("$currency_amount", EconomyHandler.checkCurrency(player.getUniqueId()) + "") + .replace("$currency_name", EconomySettingsConfig.getCurrencyName()))); + updateConfirmButton(0); + return; + } + + //cancel, transfer items back to player inv and exit + if (event.getSlot() == SellMenuConfig.cancelSlot) { + event.getWhoClicked().closeInventory(); + return; + } + + //If player clicks on a border glass pane, do nothing + if (!validSlots.contains(event.getSlot())) return; + + + //If player clicks on one of the items already in the shop, return to their inventory + playerInventory.addItem(event.getCurrentItem()); + shopInventory.clear(event.getSlot()); + + event.getInventory().setItem(SellMenuConfig.confirmSlot, updateConfirmButton(calculateShopValue(shopInventory, player))); + + } + } + + + @EventHandler + public void onInventoryClose(InventoryCloseEvent event) { + if (inventories.contains(event.getInventory())) { + inventories.remove(event.getInventory()); + EliteMenu.cancel(event.getPlayer(), event.getView().getTopInventory(), event.getView().getBottomInventory(), SellMenuConfig.storeSlots); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/menus/SharedShopElements.java b/src/main/java/com/magmaguy/elitemobs/menus/SharedShopElements.java new file mode 100644 index 000000000..dc3d6d1f3 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/menus/SharedShopElements.java @@ -0,0 +1,84 @@ +package com.magmaguy.elitemobs.menus; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.EconomySettingsConfig; +import com.magmaguy.elitemobs.economy.EconomyHandler; +import com.magmaguy.magmacore.util.ChatColorConverter; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.scheduler.BukkitRunnable; + +public class SharedShopElements { + + public static boolean itemNullPointerPrevention(InventoryClickEvent event) { + //Check if current item is valid + if (event.getCurrentItem() == null) return false; + if (event.getCurrentItem().getType().equals(Material.AIR)) return false; + return event.getCurrentItem().getItemMeta() != null; + } + + public static void buyMessage(Player player, String itemDisplayName, double itemValue) { + + new BukkitRunnable() { + + @Override + public void run() { + + player.sendMessage( + ChatColorConverter.convert( + EconomySettingsConfig.getShopBuyMessage() + .replace("$item_name", itemDisplayName) + .replace("$item_value", itemValue + "") + .replace("$currency_name", EconomySettingsConfig.getCurrencyName()))); + + player.sendMessage( + ChatColorConverter.convert( + EconomySettingsConfig.getShopCurrentBalance() + .replace("$currency_amount", EconomyHandler.checkCurrency(player.getUniqueId()) + "") + .replace("$currency_name", EconomySettingsConfig.getCurrencyName()))); + + + } + + + }.runTaskLater(Bukkit.getPluginManager().getPlugin(MetadataHandler.ELITE_MOBS), 2); + + } + + public static void insufficientFundsMessage(Player player, double itemValue) { + + new BukkitRunnable() { + + @Override + public void run() { + + player.sendMessage( + ChatColorConverter.convert( + EconomySettingsConfig.getShopInsufficientFundsMessage() + .replace("$currency_name", EconomySettingsConfig.getCurrencyName()))); + + player.sendMessage( + ChatColorConverter.convert( + EconomySettingsConfig.getShopCurrentBalance() + .replace("$currency_amount", EconomyHandler.checkCurrency(player.getUniqueId()) + "") + .replace("$currency_name", EconomySettingsConfig.getCurrencyName()))); + + player.sendMessage( + ChatColorConverter.convert( + EconomySettingsConfig.getShopItemPrice() + .replace("$item_value", itemValue + "") + .replace("$currency_name", EconomySettingsConfig.getCurrencyName()))); + + } + + + }.runTaskLater(Bukkit.getPluginManager().getPlugin(MetadataHandler.ELITE_MOBS), 2); + + player.closeInventory(); + + } + + +} diff --git a/src/main/java/com/magmaguy/elitemobs/menus/UnbindMenu.java b/src/main/java/com/magmaguy/elitemobs/menus/UnbindMenu.java new file mode 100644 index 000000000..e55eca9bd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/menus/UnbindMenu.java @@ -0,0 +1,200 @@ +package com.magmaguy.elitemobs.menus; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.utils.EliteItemManager; +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.config.menus.premade.UnbinderMenuConfig; +import com.magmaguy.elitemobs.items.ItemTagger; +import com.magmaguy.elitemobs.items.customenchantments.SoulbindEnchantment; +import com.magmaguy.elitemobs.items.customenchantments.UnbindEnchantment; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.*; + +public class UnbindMenu extends EliteMenu { + private static final int eliteItemInputSlot = UnbinderMenuConfig.getEliteItemInputSlot(); + private static final int unbindScrollItemInputSlot = UnbinderMenuConfig.getEliteUnbindInputSlot(); + private static final int outputSlot = UnbinderMenuConfig.getOutputSlot(); + private static final int eliteItemInformationInputSlot = UnbinderMenuConfig.getEliteItemInputInformationSlot(); + private static final int unbindScrollInformationInputSlot = UnbinderMenuConfig.getEliteScrapInputInformationSlot(); + private static final int informationOutputSlot = UnbinderMenuConfig.getOutputInformationSlot(); + public static Set inventories = new HashSet<>(); + + private static void calculateOutput(Inventory UnbinderInventory) { + if (UnbinderInventory.getItem(UnbinderMenuConfig.getEliteUnbindInputSlot()) == null || + UnbinderInventory.getItem(UnbinderMenuConfig.getEliteItemInputSlot()) == null) { + UnbinderInventory.setItem(UnbinderMenuConfig.getOutputSlot(), null); + return; + } + ItemStack outputItem = UnbinderInventory.getItem(UnbinderMenuConfig.getEliteItemInputSlot()).clone(); + UnbinderInventory.setItem(outputSlot, UnbindEnchantment.unbindItem(outputItem)); + } + + /** + * Creates a menu for scrapping elitemobs items. Only special Elite Mob items can be scrapped here. + * + * @param player Player for whom the inventory will be created + */ + public void constructUnbinderMenu(Player player) { + String menuName = UnbinderMenuConfig.getShopName(); + if (DefaultConfig.isForceMenuUnicode() || Bukkit.getPluginManager().isPluginEnabled("ResourcePackManager")) + menuName = ChatColor.WHITE + "\uF801\uDB80\uDC9B\uF805 " + menuName; + Inventory UnbinderInventory = Bukkit.createInventory(player, 54, menuName); + + for (int i = 0; i < UnbinderInventory.getSize(); i++) { + + if (i == UnbinderMenuConfig.getInfoSlot()) { + ItemStack infoButton = UnbinderMenuConfig.getInfoButton(); + if (DefaultConfig.isForceMenuUnicode() || Bukkit.getPluginManager().isPluginEnabled("ResourcePackManager")) { + infoButton.setType(Material.PAPER); + ItemMeta itemMeta = infoButton.getItemMeta(); + itemMeta.setCustomModelData(MetadataHandler.signatureID); + infoButton.setItemMeta(itemMeta); + } + UnbinderInventory.setItem(i, infoButton); + continue; + } + + if (i == UnbinderMenuConfig.getCancelSlot()) { + UnbinderInventory.setItem(i, UnbinderMenuConfig.getCancelButton()); + continue; + } + + if (i == eliteItemInformationInputSlot) { + UnbinderInventory.setItem(i, UnbinderMenuConfig.getEliteItemInputInfoButton()); + continue; + } + + if (i == unbindScrollInformationInputSlot) { + UnbinderInventory.setItem(i, UnbinderMenuConfig.getEliteUnbindInputInfoButton()); + continue; + } + + if (i == informationOutputSlot) { + UnbinderInventory.setItem(i, UnbinderMenuConfig.getOutputInfoButton()); + continue; + } + + + if (i == UnbinderMenuConfig.getConfirmSlot()) { + + ItemStack clonedConfirmButton = UnbinderMenuConfig.getConfirmButton().clone(); + + List lore = new ArrayList<>(); + for (String string : UnbinderMenuConfig.getConfirmButton().getItemMeta().getLore()) + lore.add(string); + UnbinderMenuConfig.getConfirmButton().getItemMeta().setLore(lore); + ItemMeta clonedMeta = clonedConfirmButton.getItemMeta(); + clonedMeta.setLore(lore); + clonedConfirmButton.setItemMeta(clonedMeta); + UnbinderInventory.setItem(i, clonedConfirmButton); + continue; + + } + + + if (i == UnbinderMenuConfig.getEliteItemInputSlot() || i == UnbinderMenuConfig.getEliteUnbindInputSlot() || i == UnbinderMenuConfig.getOutputSlot()) + continue; + if (DefaultConfig.isUseGlassToFillMenuEmptySpace()) + UnbinderInventory.setItem(i, ItemStackGenerator.generateItemStack(Material.GLASS_PANE)); + + } + + player.openInventory(UnbinderInventory); + createEliteMenu(UnbinderInventory, inventories); + } + + public static class UnbinderMenuEvents implements Listener { + @EventHandler + public void onInteract(InventoryClickEvent event) { + if (!isEliteMenu(event, inventories)) return; + event.setCancelled(true); + + Player player = (Player) event.getWhoClicked(); + ItemStack currentItem = event.getCurrentItem(); + int clickedSlot = event.getSlot(); + Inventory unbinderInventory = event.getView().getTopInventory(); + Inventory playerInventory = event.getView().getBottomInventory(); + + if (currentItem == null) return; + + if (isBottomMenu(event)) { + //Item is unbind scroll + if (ItemTagger.hasEnchantment(currentItem.getItemMeta(), UnbindEnchantment.key) && SoulbindEnchantment.isValidSoulbindUser(currentItem.getItemMeta(), player)) { + if (unbinderInventory.getItem(unbindScrollItemInputSlot) == null) { + moveOneItemUp(unbindScrollItemInputSlot, event); + calculateOutput(unbinderInventory); + } + return; + } + + //Item is elite item + if (EliteItemManager.isEliteMobsItem(currentItem)) + if (currentItem.getItemMeta() instanceof Damageable) + if (unbinderInventory.getItem(eliteItemInputSlot) == null) { + unbinderInventory.setItem(eliteItemInputSlot, currentItem); + playerInventory.remove(currentItem); + calculateOutput(unbinderInventory); + } + + } else if (isTopMenu(event)) { + + if (currentItem == null) return; + + //return item to inventory + if (event.getSlot() == unbindScrollItemInputSlot || event.getSlot() == eliteItemInputSlot) { + moveItemDown(event.getView().getTopInventory(), clickedSlot, player); + calculateOutput(unbinderInventory); + return; + } + + //cancel button + if (event.getSlot() == UnbinderMenuConfig.getCancelSlot()) { + player.closeInventory(); + return; + } + + //confirm button + if (event.getSlot() == UnbinderMenuConfig.getConfirmSlot()) { + if (unbinderInventory.getItem(outputSlot) != null) { + unbinderInventory.setItem(UnbinderMenuConfig.getEliteItemInputSlot(), null); + unbinderInventory.setItem(UnbinderMenuConfig.getEliteUnbindInputSlot(), null); + if (unbinderInventory.getItem(outputSlot) != null) { + HashMap map = player.getInventory().addItem(unbinderInventory.getItem(outputSlot)); + if (!map.isEmpty()) map.forEach((key, itemStack) -> { + itemStack.setAmount(key); + player.getWorld().dropItem(player.getLocation(), itemStack); + }); + unbinderInventory.remove(unbinderInventory.getItem(outputSlot)); + } + unbinderInventory.setItem(outputSlot, null); + } + } + + } + + } + + @EventHandler + public void onClose(InventoryCloseEvent event) { + if (inventories.contains(event.getInventory())) { + inventories.remove(event.getInventory()); + EliteMenu.cancel(event.getPlayer(), event.getView().getTopInventory(), event.getView().getBottomInventory(), new ArrayList<>(List.of(eliteItemInputSlot, unbindScrollItemInputSlot))); + } + } + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/ActionBossMobEntity.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/ActionBossMobEntity.java deleted file mode 100644 index 34545dcc3..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/ActionBossMobEntity.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.magmaguy.elitemobs.mobconstructor; - -import com.magmaguy.elitemobs.mobpowers.ElitePower; -import org.bukkit.Location; -import org.bukkit.entity.EntityType; - -import java.util.HashSet; - -public class ActionBossMobEntity extends BossMobEntity { - - /* - These bosses can be removed when a chunk unloads - */ - public ActionBossMobEntity(EntityType entityType, Location location, int eliteMobLevel, String name) { - super(entityType, location, eliteMobLevel, name); - } - - public ActionBossMobEntity(EntityType entityType, Location location, int eliteMobsLevel, String name, HashSet elitePowers) { - super(entityType, location, eliteMobsLevel, name, elitePowers); - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/BossMobEntity.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/BossMobEntity.java deleted file mode 100644 index 5f53ec0f7..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/BossMobEntity.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.magmaguy.elitemobs.mobconstructor; - -import com.magmaguy.elitemobs.events.mobs.sharedeventproperties.BossMobDeathCountdown; -import com.magmaguy.elitemobs.mobpowers.ElitePower; -import org.bukkit.Location; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.LivingEntity; - -import java.util.HashSet; - -public class BossMobEntity extends EliteMobEntity { - - public BossMobEntity(EntityType entityType, Location location, int eliteMobLevel, String name) { - - super(entityType, location, eliteMobLevel, name); - setupBossMob(super.getLivingEntity()); - - } - - public BossMobEntity(EntityType entityType, Location location, int eliteMobLevel, String name, HashSet elitePowers) { - - super(entityType, location, eliteMobLevel, name); - setupBossMob(super.getLivingEntity(), elitePowers); - - } - - private void setupBossMob(LivingEntity livingEntity) { - - super.setHasNormalLoot(true); - BossMobDeathCountdown.startDeathCountdown(livingEntity); - - } - - private void setupBossMob(LivingEntity livingEntity, HashSet elitePowers) { - - setupBossMob(livingEntity); - super.setCustomPowers(elitePowers); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/BossType.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/BossType.java new file mode 100644 index 000000000..4009119dd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/BossType.java @@ -0,0 +1,9 @@ +package com.magmaguy.elitemobs.mobconstructor; + +public enum BossType { + NORMAL, + MINIBOSS, + BOSS, + REINFORCEMENT, + EVENT +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/CombatSystem.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/CombatSystem.java deleted file mode 100644 index 399524491..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/CombatSystem.java +++ /dev/null @@ -1,379 +0,0 @@ -package com.magmaguy.elitemobs.mobconstructor; - -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.collateralminecraftchanges.PlayerDeathMessageByEliteMob; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; -import com.magmaguy.elitemobs.items.ItemTierFinder; -import com.magmaguy.elitemobs.items.MobTierFinder; -import com.magmaguy.elitemobs.items.ObfuscatedSignatureLoreData; -import com.magmaguy.elitemobs.items.itemconstructor.LoreGenerator; -import com.magmaguy.elitemobs.utils.EntityFinder; -import org.bukkit.Material; -import org.bukkit.attribute.Attribute; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.entity.*; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.block.Action; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.ExplosionPrimeEvent; -import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.potion.PotionEffect; -import org.bukkit.scheduler.BukkitRunnable; - -import java.util.HashMap; - -public class CombatSystem implements Listener { - - public static final double PER_LEVEL_POWER_INCREASE = 0.1; - public static final double TARGET_HITS_TO_KILL = ConfigValues.mobCombatSettingsConfig.getDouble(MobCombatSettingsConfig.TARGET_HITS_TO_KILL); - public static final double BASE_DAMAGE_DEALT_TO_PLAYERS = ConfigValues.mobCombatSettingsConfig.getDouble(MobCombatSettingsConfig.BASE_DAMAGE_DEALT_TO_PLAYER); - public static final double TO_PLAYER_DAMAGE_TIER_HANDICAP = 0.75; - public static final double TO_ELITE_DAMAGE_TIER_HANDICAP = 0.33; - - public static final double DIAMOND_TIER_LEVEL = 3; - public static final double IRON_TIER_LEVEL = 2; - public static final double STONE_CHAIN_TIER_LEVEL = 1; - public static final double GOLD_WOOD_LEATHER_TIER_LEVEL = 0; - - //TODO: Handle thorns damage and potion effects - - //this event deals with elite mobs damaging players - @EventHandler(priority = EventPriority.HIGHEST) - public void eliteMobDamageHandler(EntityDamageByEntityEvent event) { - - if (event.isCancelled()) return; - if (!(event.getEntity() instanceof Player)) return; - - LivingEntity damager = EntityFinder.getRealDamager(event); - if (damager == null) return; - - if (!EntityTracker.isEliteMob(event.getDamager())) - return; - - EliteMobEntity eliteMobEntity = EntityTracker.getEliteMobEntity(damager); - if (eliteMobEntity == null) return; - - //From this point on, the damage event is fully altered by Elite Mobs - - //Get rid of all vanilla armor reduction - for (EntityDamageEvent.DamageModifier modifier : EntityDamageEvent.DamageModifier.values()) - if (event.isApplicable(modifier)) - event.setDamage(modifier, 0); - - Player player = (Player) event.getEntity(); - - //Determine tiers - double eliteTier = MobTierFinder.findMobTier(eliteMobEntity); - double playerTier = ItemTierFinder.findArmorSetTier(player); - - double newDamage = eliteToPlayerDamageFormula(eliteTier, playerTier, player, event); - - //Prevent untouchable armor and 1-shots - - if (newDamage < 1) newDamage = 1; - if (newDamage > 19) newDamage = 19; - - //Set the final damage value - event.setDamage(EntityDamageEvent.DamageModifier.BASE, newDamage); - - //Deal with the player getting killed - if (player.getHealth() - event.getDamage() <= 0) - PlayerDeathMessageByEliteMob.addDeadPlayer(player, PlayerDeathMessageByEliteMob.intializeDeathMessage(player, damager)); - - } - - private double eliteToPlayerDamageFormula(double eliteTier, double playerTier, Player player, EntityDamageByEntityEvent event) { - - double tierDifference = eliteTier - playerTier; - tierDifference = (Math.abs(tierDifference) < 2) ? tierDifference : tierDifference > 0 ? 2 : -2; - - /* - Apply secondary enchantment damage reduction - */ - double newBaseDamage = BASE_DAMAGE_DEALT_TO_PLAYERS - secondaryEnchantmentDamageReduction(player, event) * 2; - - return newBaseDamage + - newBaseDamage * (tierDifference) * TO_PLAYER_DAMAGE_TIER_HANDICAP; - - } - - private double secondaryEnchantmentDamageReduction(Player player, EntityDamageByEntityEvent event) { - - double totalReductionLevel = 0; - - for (ItemStack itemStack : player.getInventory().getArmorContents()) { - - if (itemStack == null) continue; - - for (Enchantment enchantment : itemStack.getEnchantments().keySet()) { - - if (enchantment.getName().equals(Enchantment.PROTECTION_PROJECTILE.getName()) && event.getDamager() instanceof Projectile) - totalReductionLevel += getDamageIncreasePercentage(enchantment, itemStack); - - - if (enchantment.getName().equals(Enchantment.PROTECTION_EXPLOSIONS.getName()) && event.getCause().equals(EntityDamageByEntityEvent.DamageCause.ENTITY_EXPLOSION)) - totalReductionLevel += getDamageIncreasePercentage(enchantment, itemStack); - - - } - - } - - totalReductionLevel = totalReductionLevel / 4; - totalReductionLevel = totalReductionLevel > 1 ? 1 : totalReductionLevel; - - return totalReductionLevel; - - } - - /* - Deal with elite creeper explosions (visually) - Damage is dealt by eliteMobDamageHandler - */ - @EventHandler(priority = EventPriority.HIGHEST) - public void onEliteCreeperDetonation(ExplosionPrimeEvent event) { - - if (event.isCancelled()) return; - if (!(event.getEntity() instanceof Creeper && EntityTracker.isEliteMob(event.getEntity()))) - return; - - /* - This is necessary because the propagate the same duration as they have, which is nearly infinite - */ - for (PotionEffect potionEffect : ((Creeper) event.getEntity()).getActivePotionEffects()) - ((Creeper) event.getEntity()).removePotionEffect(potionEffect.getType()); - - EliteMobEntity eliteMobEntity = EntityTracker.getEliteMobEntity(event.getEntity()); - - int mobLevel = eliteMobEntity.getLevel() < 1 ? 1 : eliteMobEntity.getLevel(); - - float newExplosionRange = (float) (event.getRadius() + Math.ceil(0.01 * mobLevel * event.getRadius() * - ConfigValues.mobCombatSettingsConfig.getDouble(MobCombatSettingsConfig.ELITE_CREEPER_EXPLOSION_MULTIPLIER))); - - if (newExplosionRange > 20) - newExplosionRange = 20; - - - event.setRadius(newExplosionRange); - - } - - /* - Elite Mobs have purely cosmetic armor. It doesn't do any actual damage reduction, as that would seriously complicate - the underlying math for dealing damage for no real reason. - */ - - /* - This deals with elite mobs being damaged by non-player entities - */ - @EventHandler(priority = EventPriority.HIGHEST) - public void eliteMobDamageGeneric(EntityDamageEvent event) { - - if (event.isCancelled()) return; - if (!(event.getEntity() instanceof LivingEntity)) return; - if (!EntityTracker.isEliteMob(event.getEntity())) return; - if (event.getCause().equals(EntityDamageEvent.DamageCause.ENTITY_ATTACK)) return; - if (!event.getCause().equals(EntityDamageEvent.DamageCause.CUSTOM)) - event.setDamage(EntityDamageEvent.DamageModifier.BASE, event.getDamage()); - - } - - /* - This deals with players hitting the elite mob - */ - @EventHandler(priority = EventPriority.HIGHEST) - public void eliteMobDamageByPlayer(EntityDamageByEntityEvent event) { - - if (event.isCancelled()) return; - LivingEntity damager = EntityFinder.getRealDamager(event); - if (damager == null) return; - - EliteMobEntity eliteMobEntity = EntityTracker.getEliteMobEntity(event.getEntity()); - if (eliteMobEntity == null) return; - - //From this point on, the event damage is handled by Elite Mobs - - /* - Case in which the player is not the entity dealing damage, just deal raw damage - */ - if (!damager.getType().equals(EntityType.PLAYER) && EntityTracker.isEliteMob(damager)) { - - event.setDamage(event.getDamage()); - return; - - } - - for (EntityDamageEvent.DamageModifier modifier : EntityDamageEvent.DamageModifier.values()) - if (event.isApplicable(modifier)) - event.setDamage(modifier, 0); - - /* - Case in which a player has hit the Elite Mob - */ - - if (!damager.getType().equals(EntityType.PLAYER)) return; - Player player = (Player) damager; - - double playerTier; - if (player.getInventory().getItemInMainHand() == null || player.getInventory().getItemInMainHand().getType().equals(Material.BOW) && event.getDamager() instanceof Player) - playerTier = 0; - else - playerTier = ItemTierFinder.findBattleTier(player.getInventory().getItemInMainHand()); - double eliteTier = MobTierFinder.findMobTier(eliteMobEntity); - double maxHealth = eliteMobEntity.getMaxHealth(); - - double newDamage = playerToEliteDamageFormula(eliteTier, playerTier, maxHealth, player, eliteMobEntity.getLivingEntity()); - - event.setDamage(EntityDamageEvent.DamageModifier.BASE, newDamage); - - } - - private double playerToEliteDamageFormula(double eliteTier, double playerTier, double maxHealth, Player player, LivingEntity eliteMob) { - - double tierDifference = playerTier - eliteTier; - - /* - This caps the tier difference between mobs and players to prevent insurmountable boss fights - */ - tierDifference = Math.abs(tierDifference) > 2.5 ? (tierDifference > 0 ? 2.5 : -2.5) : tierDifference; - - /* - This applies secondary enchantments, that is, it applies enchantments that only affect specific mob types - such as smite which only works with undead mobs - */ - double bonusSecondaryEnchantmentDamage = 3 * secondaryEnchantmentDamageIncrease(player.getInventory().getItemInMainHand(), eliteMob); - double newTargetHitsToKill = TARGET_HITS_TO_KILL - bonusSecondaryEnchantmentDamage; - - double finalDamage = getCooledAttackStrength(player) * (maxHealth / newTargetHitsToKill + - maxHealth / newTargetHitsToKill * (tierDifference) * TO_ELITE_DAMAGE_TIER_HANDICAP); - - /* - Make sure that players are dealing at least 1 damage as to not create unkillable bosses - */ - return finalDamage < 1 ? 1 : finalDamage; - - } - - /* - This deals with cooldown damage reduction based on the default cooldown property of minecraft and a custom - cooldown penalty on top of it (just linear) - */ - private float getCooledAttackStrength(Player player) { - - if (!playerHitCooldownHashMap.containsKey(player)) return 1; - - float swingDelay = clock - playerHitCooldownHashMap.get(player); - float cooldownPeriod = getCooldownPeriod(player); - - if (swingDelay > cooldownPeriod) return 1; - - return swingDelay / cooldownPeriod; - - } - - /* - This part is pretty much a copy of how Minecraft does the cooldown check - */ - private float getCooldownPeriod(Player player) { - return (float) (1.0D / player.getAttribute(Attribute.GENERIC_ATTACK_SPEED).getValue() * 20.0D); - } - - private static int clock = 0; - - public static void launchInternalClock() { - - new BukkitRunnable() { - - @Override - public void run() { - - if (clock == Integer.MAX_VALUE) clock = 0; - clock++; - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 1, 1); - - } - - - /* - This deals with damage increases specific to specific mob types - It returns a percentage where 0 is no relevant enchantment present and 1 is maximum potential level reached for - relevant enchantment - */ - private double secondaryEnchantmentDamageIncrease(ItemStack weapon, LivingEntity eliteMob) { - - if (ObfuscatedSignatureLoreData.obfuscatedSignatureDetector(weapon)) { - String deobfuscatedString = weapon.getItemMeta().getLore().get(0).replace("§", ""); - if (deobfuscatedString.contains(LoreGenerator.OBFUSCATED_ENCHANTMENTS)) { - if (eliteMob instanceof Spider || eliteMob instanceof Silverfish) - return getDamageIncreasePercentage(Enchantment.DAMAGE_ARTHROPODS, findObfuscatedMainEnchantment(deobfuscatedString, Enchantment.DAMAGE_ARTHROPODS)); - - if (eliteMob instanceof Zombie || eliteMob instanceof Skeleton) - return getDamageIncreasePercentage(Enchantment.DAMAGE_ARTHROPODS, findObfuscatedMainEnchantment(deobfuscatedString, Enchantment.DAMAGE_UNDEAD)); - } - } - - for (Enchantment enchantment : weapon.getEnchantments().keySet()) { - - if (enchantment.getName().equals(Enchantment.DAMAGE_ARTHROPODS.getName()) && (eliteMob instanceof Spider || eliteMob instanceof Silverfish)) - return getDamageIncreasePercentage(enchantment, weapon); - - if (enchantment.getName().equals(Enchantment.DAMAGE_UNDEAD.getName()) && (eliteMob instanceof Zombie || eliteMob instanceof Skeleton)) - return getDamageIncreasePercentage(enchantment, weapon); - - } - - return 0; - - } - - private static int findObfuscatedMainEnchantment(String deobfuscatedLore, Enchantment enchantment) { - for (String string : deobfuscatedLore.split(",")) - if (string.contains(enchantment.getName())) - return Integer.parseInt(string.split(":")[1]); - - return 0; - } - - private double getDamageIncreasePercentage(Enchantment enchantment, ItemStack weapon) { - - double maxEnchantmentLevel = getMaxEnchantmentLevel(enchantment); - double currentEnchantmentLevel = weapon.getEnchantmentLevel(enchantment); - - return currentEnchantmentLevel / maxEnchantmentLevel <= 1 ? currentEnchantmentLevel / maxEnchantmentLevel : 1; - - } - - private double getDamageIncreasePercentage(Enchantment enchantment, double level) { - - double maxEnchantmentLevel = getMaxEnchantmentLevel(enchantment); - - return level / maxEnchantmentLevel <= 1 ? level / maxEnchantmentLevel : 1; - - } - - private int getMaxEnchantmentLevel(Enchantment enchantment) { - return ConfigValues.itemsProceduralSettingsConfig.getInt("Valid Enchantments." + enchantment.getName() + ".Max Level"); - } - - private HashMap playerHitCooldownHashMap = new HashMap<>(); - - @EventHandler(priority = EventPriority.MONITOR) - public void onPlayerInteract(PlayerInteractEvent event) { - - if (!(event.getAction().equals(Action.LEFT_CLICK_AIR) || event.getAction().equals(Action.LEFT_CLICK_BLOCK) || - event.getAction().equals(Action.PHYSICAL))) return; - - playerHitCooldownHashMap.put(event.getPlayer(), clock); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/CustomSpawn.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/CustomSpawn.java new file mode 100644 index 000000000..2fcb4547a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/CustomSpawn.java @@ -0,0 +1,357 @@ +package com.magmaguy.elitemobs.mobconstructor; + +import com.magmaguy.elitemobs.EliteMobs; +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.adventurersguild.GuildRank; +import com.magmaguy.elitemobs.config.ValidWorldsConfig; +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfig; +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import com.magmaguy.elitemobs.config.customspawns.CustomSpawnConfig; +import com.magmaguy.elitemobs.config.customspawns.CustomSpawnConfigFields; +import com.magmaguy.elitemobs.dungeons.EliteMobsWorld; +import com.magmaguy.elitemobs.events.MoonPhaseDetector; +import com.magmaguy.elitemobs.events.TimedEvent; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.thirdparty.worldguard.WorldGuardFlagChecker; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.*; +import org.bukkit.block.Block; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Zombie; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.ThreadLocalRandom; + +public class CustomSpawn { + + @Getter + private final CustomSpawnConfigFields customSpawnConfigFields; + @Getter + private final ArrayList customBossEntities = new ArrayList<>(); + @Getter + @Setter + private boolean isEvent = false; + @Getter + @Setter + private World world; + private TimedEvent timedEvent; + private int allTries = 0; + @Getter + @Setter + private Location spawnLocation; + @Setter + private boolean keepTrying = true; + + /** + * Used by the TimedEvent system to find valid locations + */ + public CustomSpawn(String customSpawnConfig, List customBossesFilenames, TimedEvent timedEvent) { + this.customSpawnConfigFields = CustomSpawnConfig.getCustomEvent(customSpawnConfig); + this.timedEvent = timedEvent; + + if (customSpawnConfigFields == null) { + Logger.warn("Invalid custom spawn detected for file " + customSpawnConfig + " in event " + timedEvent.getCustomEventsConfigFields().getFilename()); + return; + } + + customBossesFilenames.forEach(bossString -> { + CustomBossesConfigFields customBossesConfigFields = CustomBossesConfig.getCustomBoss(bossString); + if (customBossesConfigFields == null) { + Logger.warn("Attempted to pass invalid boss into CustomSpawn: " + bossString); + return; + } + CustomBossEntity customBossEntity = new CustomBossEntity(customBossesConfigFields); + customBossEntities.add(customBossEntity); + customBossEntity.setCustomSpawn(this); + }); + } + + public CustomSpawn(String customSpawnConfig, CustomBossEntity customBossEntity) { + this.customSpawnConfigFields = CustomSpawnConfig.getCustomEvent(customSpawnConfig); + if (customSpawnConfigFields == null) { + Logger.warn("Invalid custom spawn detected for file " + customSpawnConfig); + return; + } + customBossEntities.add(customBossEntity); + } + + public static int getHighestValidBlock(Location location, int highestYLevel) { + int height = location.getBlockY() - 1; + //todo: when the Minecraft max height goes over 256 (and under 0) this will need to get reviewed + while (height < 256) { + height++; + if (height > highestYLevel) + return -1; + Location floorLocation = new Location(location.getWorld(), location.getX(), height - 1, location.getZ()); + if (floorLocation.getBlock().isPassable()) + continue; + Location tempLocation = new Location(location.getWorld(), location.getX(), height, location.getZ()); + if (!tempLocation.getBlock().getType().isAir()) + continue; + Location locationAbove = new Location(location.getWorld(), location.getX(), height + 1, location.getZ()); + if (!locationAbove.getBlock().getType().isAir()) + continue; + return height; + } + return -100; + } + + public void queueSpawn() { + //Make sure a location exists + if (spawnLocation == null) + new BukkitRunnable() { + @Override + public void run() { + generateCustomSpawn(); + } + }.runTaskAsynchronously(MetadataHandler.PLUGIN); + else + spawn(); + } + + private void spawn() { + //Pass back to sync if it's in async + new BukkitRunnable() { + @Override + public void run() { + if (spawnLocation == null) { + Bukkit.getScheduler().runTaskLater(MetadataHandler.PLUGIN, () -> generateCustomSpawn(), 1); + cancel(); + return; + } + //One last check + //Last line of defense - spawn a test mob. If some unknown protection system prevents spawning it should prevent this + LivingEntity testEntity = spawnLocation.getWorld().spawn(spawnLocation, Zombie.class); + if (!testEntity.isValid()) { + spawnLocation = null; + //Run 1 tick later to make sure it doesn't get stuck trying over and over again in the same tick + Bukkit.getScheduler().runTaskLater(MetadataHandler.PLUGIN, () -> generateCustomSpawn(), 1); + cancel(); + return; + } + testEntity.remove(); + + if (!keepTrying) cancel(); + + if (Objects.requireNonNull(spawnLocation.getWorld()).getTime() < customSpawnConfigFields.getEarliestTime() || + spawnLocation.getWorld().getTime() > customSpawnConfigFields.getLatestTime()) + return; + + if (customSpawnConfigFields.getMoonPhase() != null) + if (!MoonPhaseDetector.detectMoonPhase(spawnLocation.getWorld()).equals(customSpawnConfigFields.getMoonPhase())) + return; + + for (CustomBossEntity customBossEntity : customBossEntities) + if (!customBossEntity.exists()) + customBossEntity.spawn(spawnLocation, isEvent); + + cancel(); + + if (timedEvent != null) + timedEvent.queueEvent(); + + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + private void generateCustomSpawn() { + //If the global cooldown if enforced and this is a timed event wait for the cd to be over + + if (timedEvent != null && System.currentTimeMillis() < TimedEvent.getNextEventStartMinimum()) { + Bukkit.getScheduler().scheduleAsyncDelayedTask(MetadataHandler.PLUGIN, this::generateCustomSpawn, 20 * 60L); + return; + } + + + int maxTries = 100; + int tries = 0; + while (tries < maxTries && spawnLocation == null) { + if (!keepTrying) + return; + tries++; + allTries++; + this.spawnLocation = generateRandomSpawnLocation(); + if (spawnLocation != null) + break; + } + + if (spawnLocation == null) { + if (keepTrying) { + new BukkitRunnable() { + @Override + public void run() { + generateCustomSpawn(); + } + }.runTaskLaterAsynchronously(MetadataHandler.PLUGIN, 20 * 60); + } else { + customBossEntities.forEach((customBossEntity -> { + if (customBossEntity.summoningEntity != null) + customBossEntity.summoningEntity.removeReinforcement(customBossEntity); + })); + } + } else { + spawn(); + } + } + + public Location generateRandomSpawnLocation() { + if (customSpawnConfigFields == null) { + Logger.warn("Something tried to spawn but has invalid custom spawn config fields! This isn't good.", true); + Logger.warn("Bosses: "); + getCustomBossEntities().forEach((customBossEntity) -> { + if (customBossEntity != null) + if (customBossEntity.getName() != null) + Logger.warn(customBossEntity.getCustomBossesConfigFields().getName()); + }); + if (timedEvent != null) { + Logger.warn("Event: " + timedEvent.getCustomEventsConfigFields().getFilename()); + timedEvent.end(); + } + return null; + } + + //If there are no players online, don't spawn anything - this condition shouldn't be reachable in the first place + if (Bukkit.getOnlinePlayers().isEmpty()) { + keepTrying = false; + if (timedEvent != null) + timedEvent.end(); + return null; + } + + //Go through online players and select the ones in valid worlds + List validPlayers = new ArrayList<>(); + if (world == null) + for (Player player : Bukkit.getOnlinePlayers()) { + if (!PlayerData.isInMemory(player.getUniqueId())) continue; + if (GuildRank.isAtOrAboveGuildRank(player, 0, 0)) continue; + Location playerLocation = player.getLocation(); + if (!ValidWorldsConfig.getValidWorlds().contains(playerLocation.getWorld().getName())) + continue; + if (timedEvent != null && EliteMobsWorld.isEliteMobsWorld(player.getWorld().getUID())) continue; + if (Boolean.FALSE.equals(playerLocation.getWorld().getGameRuleValue(GameRule.DO_MOB_SPAWNING))) + continue; + if (!customSpawnConfigFields.getValidWorlds().isEmpty()) + if (!customSpawnConfigFields.getValidWorlds().contains(playerLocation.getWorld())) + continue; + if (!customSpawnConfigFields.getValidWorldEnvironments().isEmpty()) + if (!customSpawnConfigFields.getValidWorldEnvironments().contains(Objects.requireNonNull(playerLocation.getWorld()).getEnvironment())) + continue; + if (GuildRank.getActiveGuildRank(player) == 0) continue; + validPlayers.add(player); + } + else + validPlayers.addAll(world.getPlayers()); + + //If there are no players in valid worlds, skip + if (validPlayers.isEmpty()) + return null; + + //Select a random player + Player selectedPlayer = validPlayers.get(ThreadLocalRandom.current().nextInt(validPlayers.size())); + + //Randomize vector between 24 and 128 block away from a source location + Vector randomizedVector = new Vector(ThreadLocalRandom.current().nextInt(24, 128), + 0, //this doesn't really matter, it likely gets modified later + ThreadLocalRandom.current().nextInt(24, 128)); + + //Allow negative X and Z values + if (ThreadLocalRandom.current().nextBoolean()) + randomizedVector.setX(randomizedVector.getX() * -1); + if (ThreadLocalRandom.current().nextBoolean()) + randomizedVector.setY(randomizedVector.getY() * -1); + + //Temp location - do not run checks on it yet + Location location = selectedPlayer.getLocation().clone().add(randomizedVector); + //This doesn't matter too much since it will be parsed later, also these values are already tweaked for 1.18. + location.setY(ThreadLocalRandom.current().nextInt(-0, 256)); + World world = location.getWorld(); + + if (!customSpawnConfigFields.getValidBiomes().isEmpty() && !customSpawnConfigFields.getValidBiomes().contains(location.getBlock().getBiome())) + return null; + + //Set Y level - Location isn't final yet + if (customSpawnConfigFields.isSurfaceSpawn()) + //this won't work for Nether environments, but who wants surface spawns on the Nether? + location = Objects.requireNonNull(location.getWorld()).getHighestBlockAt(location).getLocation().add(new Vector(0.5, 1, 0.5)); + else if (customSpawnConfigFields.isUndergroundSpawn()) { + int highestBlockYAt = Objects.requireNonNull(location.getWorld()).getHighestBlockYAt(location); + //Let's hope there's caves + if (location.getY() > highestBlockYAt || + location.getY() > highestBlockYAt / 2D) { + for (int y = (int) location.getY(); y > -64; y--) { + Location tempLocation = location.clone(); + tempLocation.setY(y); + if (location.getBlock().getType().equals(Material.VOID_AIR)) return null; + if (y < customSpawnConfigFields.getLowestYLevel()) return null; + Block groundBlock = location.clone().subtract(new Vector(0, 1, 0)).getBlock(); + if (!groundBlock.getType().isSolid()) continue; + //Check temp location block + if (!tempLocation.getBlock().getType().isAir()) continue; + //Check block above temp location + if (!tempLocation.add(new Vector(0, 1, 0)).getBlock().getType().isAir()) continue; + location = tempLocation; + break; + } + } else { + for (int y = (int) location.getY(); y < highestBlockYAt; y++) { + Location tempLocation = location.clone(); + tempLocation.setY(y); + if (location.getBlock().getType().equals(Material.VOID_AIR)) return null; + if (y < customSpawnConfigFields.getLowestYLevel()) return null; + Block groundBlock = location.clone().subtract(new Vector(0, 1, 0)).getBlock(); + if (!groundBlock.getType().isSolid()) continue; + //Check temp location block + if (!tempLocation.getBlock().getType().isAir()) continue; + //Check block above temp location + if (!tempLocation.add(new Vector(0, 1, 0)).getBlock().getType().isAir()) continue; + location = tempLocation; + break; + } + } + } else + //Straight upwards check + location.setY(getHighestValidBlock(location, getHighestValidBlock(location, customSpawnConfigFields.getHighestYLevel()))); + + //Prevent spawning right on top of players + assert world != null; + for (Player player : world.getPlayers()) + if (player.getLocation().distanceSquared(location) < Math.pow(24, 2)) + return null; + + //Nether ceiling check + if (location.getY() > 127 && world.getEnvironment().equals(World.Environment.NETHER)) + return null; + + //Custom height check + if (location.getY() == -100 || location.getY() > customSpawnConfigFields.getHighestYLevel() || location.getY() < customSpawnConfigFields.getLowestYLevel()) + return null; + + //Check WorldGuard flags + if (EliteMobs.worldGuardIsEnabled) { + if (!WorldGuardFlagChecker.doEventFlag(location)) + return null; + + if (!WorldGuardFlagChecker.doEliteMobsSpawnFlag(location)) + return null; + + if (!WorldGuardFlagChecker.doMobSpawnFlag(location)) + return null; + } + + //Light level check - following 1.18 rules + if (!customSpawnConfigFields.isCanSpawnInLight()) + if (location.getBlock().getLightLevel() > 8) + return null; + + return location; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/EliteEntity.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/EliteEntity.java new file mode 100644 index 000000000..bb4e7e568 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/EliteEntity.java @@ -0,0 +1,699 @@ +package com.magmaguy.elitemobs.mobconstructor; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobHealEvent; +import com.magmaguy.elitemobs.api.internal.RemovalReason; +import com.magmaguy.elitemobs.collateralminecraftchanges.KeepNeutralsAngry; +import com.magmaguy.elitemobs.combatsystem.CombatSystem; +import com.magmaguy.elitemobs.combatsystem.antiexploit.AntiExploitMessage; +import com.magmaguy.elitemobs.config.AntiExploitConfig; +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.events.CustomEvent; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.RegionalBossEntity; +import com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs.EliteMobProperties; +import com.magmaguy.elitemobs.playerdata.ElitePlayerInventory; +import com.magmaguy.elitemobs.powers.meta.ElitePower; +import com.magmaguy.elitemobs.powerstances.MajorPowerPowerStance; +import com.magmaguy.elitemobs.powerstances.MinorPowerPowerStance; +import com.magmaguy.elitemobs.tagger.PersistentTagger; +import com.magmaguy.elitemobs.utils.EventCaller; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.attribute.Attribute; +import org.bukkit.entity.*; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; + +public class EliteEntity { + + protected final HashMap damagers = new HashMap<>(); + protected final UUID eliteUUID = UUID.randomUUID(); + //Used for custom arbitrary tags from elite scripts + private final HashSet customMetadata = new HashSet<>(); + /* + Store all powers in one set, makes no sense to access it in individual sets. + The reason they are split up in the first place is to add them in a certain ratio + Once added, they can just be stored in a pool + */ + @Getter + protected HashSet elitePowers = new HashSet<>(); + //coming soon - decoupling aggro from damage to allow for tanking mechanics + protected HashMap aggro = new HashMap<>(); + /* + Note that a lot of values here are defined by EliteMobProperties.java + */ + protected LivingEntity livingEntity; + //LivingEntity gets removed as soon as it dies, unsyncedLivingEntity only ever overwrites when a new living entity is created. + protected LivingEntity unsyncedLivingEntity; + @Getter + @Setter + protected int level = -1; + @Getter + protected double maxHealth; + @Getter + protected String name; + @Getter + protected int minorPowerCount = 0; + @Getter + protected int majorPowerCount = 0; + @Getter + @Setter + protected boolean minorVisualEffect = false; + @Getter + @Setter + protected boolean majorVisualEffect = false; + @Getter + @Setter + protected boolean visualEffectObfuscated = true; + @Getter + protected boolean isNaturalEntity; + protected EntityType entityType; + @Getter + protected Boolean isPersistent = false; + @Getter + @Setter + protected boolean vanillaLoot = true; + @Getter + @Setter + protected boolean eliteLoot = true; + @Getter + @Setter + protected boolean randomLoot = true; + @Getter + protected CreatureSpawnEvent.SpawnReason spawnReason; + @Getter + @Setter + protected double healthMultiplier = 1.0; + @Getter + @Setter + protected double damageMultiplier = 1.0; + protected double defaultMaxHealth; + @Getter + @Setter + protected boolean inCooldown = false; + @Getter + protected boolean triggeredAntiExploit = false; + protected int antiExploitPoints = 0; + @Getter + protected boolean inAntiExploitCooldown = false; + @Getter + @Setter + protected boolean inCombat = false; + @Getter + protected boolean inCombatGracePeriod = false; + @Setter + protected EliteEntity summoningEntity; + protected List globalReinforcementEntities = new ArrayList<>(); + protected List eliteReinforcementEntities = new ArrayList<>(); + //currently used to store ender crystals for the dragon boss fight + protected List nonEliteReinforcementEntities = new ArrayList<>(); + protected boolean bypassesProtections = false; + protected Double health = null; + @Setter + protected Location spawnLocation; + @Getter + @Setter + private boolean dying = false; + @Getter + @Setter + private boolean healing = false; + + /** + * Functions as a placeholder for {@link CustomBossEntity} that haven't been initialized yet. Uses the builder pattern + * in order to further initialize values at an arbitrary point in the future. + *

+ * Uses: + * - {@link CustomEvent} queueing through the {@link CustomSpawn} system + *

+ * {@link EliteEntity} constructed this way must at some point correctly invoke {@link CustomBossEntity#setSpawnLocation(Location)} + * for the spawn method. + */ + public EliteEntity() { + } + + /** + * This is the generic constructor used in most instances of natural elite mob generation + */ + public EliteEntity(LivingEntity livingEntity, + int level, + CreatureSpawnEvent.SpawnReason spawnReason) { + setLevel(level); + setLivingEntity(livingEntity, spawnReason); + //Get correct instance of plugin data, necessary for settings names and health among other things + EliteMobProperties eliteMobProperties = EliteMobProperties.getPluginData(livingEntity); + setName(eliteMobProperties); + setArmor(); + setMaxHealth(); + randomizePowers(eliteMobProperties); + } + + public Location getSpawnLocation() { + return spawnLocation.clone(); + } + + public boolean getBypassesProtections() { + return bypassesProtections; + } + + public void setBypassesProtections(boolean bypassesProtections) { + this.bypassesProtections = bypassesProtections; + } + + /** + * Elite UUID. This UUID is guaranteed to be final for the Elite Entity, and is not in sync with the {@link LivingEntity} {@link UUID} . + *

+ * Noteworthy uses: {@link EliteEntity} will survive chunk reloads, and in the case of {@link RegionalBossEntity} will survive deaths for the entirety of runtime. + * + * @return The final UUID value of this {@link EliteEntity} + */ + public UUID getEliteUUID() { + return eliteUUID; + } + + public void addDamager(Player player, double damage) { + if (!damagers.isEmpty()) + for (Player iteratedPlayer : damagers.keySet()) + if (iteratedPlayer.getUniqueId().equals(player.getUniqueId())) { + this.damagers.put(iteratedPlayer, this.damagers.get(iteratedPlayer) + damage); + this.aggro.put(iteratedPlayer, this.aggro.get(iteratedPlayer) + damage * + ElitePlayerInventory.getPlayer(player).getLoudStrikesBonusMultiplier(false)); + return; + } + this.damagers.put(player, damage); + this.aggro.put(player, damage * + ElitePlayerInventory.getPlayer(player).getLoudStrikesBonusMultiplier(false)); + } + + public boolean hasDamagers() { + return !damagers.isEmpty(); + } + + public Map getDamagers() { + return damagers; + } + + public boolean isCustomBossEntity() { + return this instanceof CustomBossEntity; + } + + /** + * Returns the {@link LivingEntity} currently being used by the {@link EliteEntity}. Returns null if none is currently active, even + * if one was active previously. + * + * @return Currently active {@link LivingEntity} + * @see EliteEntity#getUnsyncedLivingEntity() if you want a version that does get nulled once the {@link LivingEntity} stops being valid + */ + public LivingEntity getLivingEntity() { + return livingEntity; + } + + /** + * This {@link LivingEntity} represents the previous entity spawned by EliteMobs. It is only overwritten when a new one + * is generated, whereas {@link EliteEntity#getLivingEntity()} returns null as soon as the {@link LivingEntity} stops being alive + * for safety reasons. + *

+ * This is the method used when operations need to be run on dead instances, such as in {@link com.magmaguy.elitemobs.api.EliteMobDeathEvent}. + * + * @return The latest {@link LivingEntity} generated for this {@link EliteEntity} + */ + public LivingEntity getUnsyncedLivingEntity() { + return unsyncedLivingEntity; + } + + public void setUnsyncedLivingEntity(LivingEntity newEntity) { + unsyncedLivingEntity = newEntity; + } + + public void setLivingEntity(LivingEntity livingEntity, CreatureSpawnEvent.SpawnReason spawnReason) { + if (livingEntity == null) return; + if (!(this instanceof CustomBossEntity)) + this.spawnLocation = livingEntity.getLocation().clone(); + this.livingEntity = livingEntity; + this.unsyncedLivingEntity = livingEntity; + this.entityType = livingEntity.getType(); + + this.livingEntity.setCanPickupItems(false); + if (livingEntity.getEquipment() != null) { + livingEntity.getEquipment().setItemInMainHandDropChance(0); + livingEntity.getEquipment().setItemInOffHandDropChance(0); + livingEntity.getEquipment().setHelmetDropChance(0); + livingEntity.getEquipment().setChestplateDropChance(0); + livingEntity.getEquipment().setLeggingsDropChance(0); + livingEntity.getEquipment().setBootsDropChance(0); + } + + if (livingEntity.getType().equals(EntityType.RABBIT)) { + ((Rabbit) livingEntity).setRabbitType(Rabbit.Type.THE_KILLER_BUNNY); + } + + if (entityType.equals(EntityType.WOLF)) { + Wolf wolf = (Wolf) livingEntity; + wolf.setAngry(true); + wolf.setBreed(false); + KeepNeutralsAngry.showMeYouWarFace(this); + } + + if (entityType.equals(EntityType.POLAR_BEAR)) { + KeepNeutralsAngry.showMeYouWarFace(this); + } + + if (entityType.equals(EntityType.ENDER_DRAGON)) + if (((EnderDragon) livingEntity).getBossBar() != null) + ((EnderDragon) livingEntity).getBossBar().setTitle(getName()); + + if (entityType.equals(EntityType.LLAMA)) { + KeepNeutralsAngry.showMeYouWarFace(this); + } + + if (entityType.equals(EntityType.IRON_GOLEM) && this instanceof CustomBossEntity) + KeepNeutralsAngry.showMeYouWarFace(this); + + if (entityType.equals(EntityType.GOAT)) { + ((Goat) livingEntity).setScreaming(true); + } + + if (livingEntity instanceof Bee) { + KeepNeutralsAngry.showMeYouWarFace(this); + ((Bee) livingEntity).setCannotEnterHiveTicks(Integer.MAX_VALUE); + } + + if (livingEntity instanceof Wither wither) + wither.getBossBar().setVisible(false); + + this.spawnReason = spawnReason; + + //This sets whether the entity gets despawned when beyond a certain distance from the player, should only happen + //for entities which aren't pseudo-persistent + this.getLivingEntity().setRemoveWhenFarAway(!isPersistent); + this.getLivingEntity().setPersistent(false); + + setMaxHealth(); + + if (getName() == null) + setName(EliteMobProperties.getPluginData(entityType)); + + this.name = livingEntity.getCustomName(); + + PersistentTagger.tagElite(livingEntity, eliteUUID); + EntityTracker.registerEliteMob(this); + } + + public void setNameVisible(boolean isVisible) { + //Check if the boss is already dead + if (livingEntity == null) return; + livingEntity.setCustomNameVisible(isVisible); + } + + public void setMaxHealth() { + if (EliteMobProperties.getPluginData(entityType) != null) + this.defaultMaxHealth = EliteMobProperties.getPluginData(entityType).getDefaultMaxHealth(); + else this.defaultMaxHealth = 20; + this.maxHealth = (level * CombatSystem.TARGET_HITS_TO_KILL_MINUS_ONE + this.defaultMaxHealth) * healthMultiplier; + if (livingEntity != null) livingEntity.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(maxHealth); + if (health == null) { + if (livingEntity != null) livingEntity.setHealth(maxHealth); + this.health = maxHealth; + } + //This is useful for phase boss entities that spawn in unloaded chunks and shouldn't full heal between phases, like in dungeons + else if (livingEntity != null) + livingEntity.setHealth(Math.min(health, livingEntity.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue())); + } + + public void setNormalizedMaxHealth() { + this.defaultMaxHealth = MobCombatSettingsConfig.getNormalizedBaselineHealth(); + this.maxHealth = (level * CombatSystem.TARGET_HITS_TO_KILL_MINUS_ONE + this.defaultMaxHealth) * healthMultiplier; + if (livingEntity != null) { + livingEntity.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(maxHealth); + livingEntity.setHealth(maxHealth); + } + this.health = maxHealth; + } + + public void resetMaxHealth() { + livingEntity.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(maxHealth); + livingEntity.setHealth(maxHealth); + this.health = maxHealth; + } + + /** + * Health is cached by EliteMobs for when health needs to be displayed when the {@link LivingEntity} isn't valid, but + * return the field from the {@link LivingEntity} when available + * + * @return Boss health + */ + public double getHealth() { + if (livingEntity != null) + return livingEntity.getHealth(); + else if (this.health != null) + return this.health; + else { + setMaxHealth(); + return this.health; + } + } + + public void setHealth(double health) { + if (livingEntity == null) return; + this.health = Math.min(health, Math.min(this.maxHealth, livingEntity.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue())); + livingEntity.setHealth(this.health); + } + + public void syncPluginHealth(double health) { + this.health = health; + } + + public void heal(double healAmount) { + EliteMobHealEvent eliteMobHealEvent = new EliteMobHealEvent(this, healAmount); + new EventCaller(eliteMobHealEvent); + if (eliteMobHealEvent.isCancelled()) return; + setHealth(health + healAmount); + } + + public void fullHeal() { + EliteMobHealEvent eliteMobHealEvent = new EliteMobHealEvent(this, true); + new EventCaller(eliteMobHealEvent); + if (eliteMobHealEvent.isCancelled()) return; + setHealth(this.maxHealth); + this.health = maxHealth; + damagers.clear(); + } + + private void setArmor() { + if (!MobCombatSettingsConfig.isDoEliteArmor()) return; + if (livingEntity.getEquipment() == null) return; + + if (!(livingEntity instanceof Zombie || livingEntity instanceof PigZombie || + livingEntity instanceof Skeleton || livingEntity instanceof WitherSkeleton)) return; + + livingEntity.getEquipment().setBoots(new ItemStack(Material.AIR)); + livingEntity.getEquipment().setLeggings(new ItemStack(Material.AIR)); + livingEntity.getEquipment().setChestplate(new ItemStack(Material.AIR)); + livingEntity.getEquipment().setHelmet(new ItemStack(Material.AIR)); + + if (level >= 5 && MobCombatSettingsConfig.isDoEliteHelmets()) + livingEntity.getEquipment().setHelmet(new ItemStack(Material.LEATHER_HELMET)); + + if (level >= 10) livingEntity.getEquipment().setBoots(new ItemStack(Material.LEATHER_BOOTS)); + if (level >= 15) livingEntity.getEquipment().setLeggings(new ItemStack(Material.LEATHER_LEGGINGS)); + if (level >= 20) livingEntity.getEquipment().setChestplate(new ItemStack(Material.LEATHER_CHESTPLATE)); + if (level >= 25 && MobCombatSettingsConfig.isDoEliteHelmets()) + livingEntity.getEquipment().setHelmet(new ItemStack(Material.CHAINMAIL_HELMET)); + if (level >= 30) livingEntity.getEquipment().setBoots(new ItemStack(Material.CHAINMAIL_BOOTS)); + if (level >= 35) livingEntity.getEquipment().setLeggings(new ItemStack(Material.CHAINMAIL_LEGGINGS)); + if (level >= 40) livingEntity.getEquipment().setChestplate(new ItemStack(Material.CHAINMAIL_CHESTPLATE)); + if (level >= 45 && MobCombatSettingsConfig.isDoEliteHelmets()) + livingEntity.getEquipment().setHelmet(new ItemStack(Material.IRON_HELMET)); + if (level >= 50) livingEntity.getEquipment().setBoots(new ItemStack(Material.IRON_BOOTS)); + if (level >= 55) livingEntity.getEquipment().setLeggings(new ItemStack(Material.IRON_LEGGINGS)); + if (level >= 60) livingEntity.getEquipment().setChestplate(new ItemStack(Material.IRON_CHESTPLATE)); + if (level >= 65) livingEntity.getEquipment().setBoots(new ItemStack(Material.DIAMOND_BOOTS)); + if (level >= 70 && MobCombatSettingsConfig.isDoEliteHelmets()) + livingEntity.getEquipment().setHelmet(new ItemStack(Material.DIAMOND_HELMET)); + if (level >= 75) livingEntity.getEquipment().setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS)); + if (level >= 80) livingEntity.getEquipment().setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE)); + + if (livingEntity.getEquipment().getHelmet() != null) { + ItemMeta helmetMeta = livingEntity.getEquipment().getHelmet().getItemMeta(); + if (helmetMeta != null) { + helmetMeta.setUnbreakable(true); + livingEntity.getEquipment().getHelmet().setItemMeta(helmetMeta); + } + } + } + + public void randomizePowers(EliteMobProperties eliteMobProperties) { + + if (level < 1) return; + + int availableDefensivePowers = 0; + int availableOffensivePowers = 0; + int availableMiscellaneousPowers = 0; + int availableMajorPowers = 0; + + if (level >= 10) availableDefensivePowers = 1; + if (level >= 20) availableOffensivePowers = 1; + if (level >= 30) availableMiscellaneousPowers = 1; + if (level >= 40) availableMajorPowers = 1; + if (level >= 50) availableDefensivePowers = 2; + if (level >= 60) availableOffensivePowers = 2; + if (level >= 70) availableMiscellaneousPowers = 2; + if (level >= 80) availableMajorPowers = 2; + + //apply defensive powers + applyPowers((HashSet) eliteMobProperties.getValidDefensivePowers().clone(), availableDefensivePowers); + + //apply offensive powers + applyPowers((HashSet) eliteMobProperties.getValidOffensivePowers().clone(), availableOffensivePowers); + + //apply miscellaneous powers + applyPowers((HashSet) eliteMobProperties.getValidMiscellaneousPowers().clone(), availableMiscellaneousPowers); + + //apply major powers + applyPowers((HashSet) eliteMobProperties.getValidMajorPowers().clone(), availableMajorPowers); + + new MinorPowerPowerStance(this); + new MajorPowerPowerStance(this); + + } + + public void applyPowers(HashSet configFields, int availablePowerAmount) { + configFields.removeIf(iteratedField -> !iteratedField.isEnabled()); + + if (availablePowerAmount < 1) return; + + ArrayList localFields = new ArrayList<>(configFields); + + for (ElitePower mobPower : this.elitePowers) + localFields.remove(mobPower); + + for (int i = 0; i < availablePowerAmount; i++) + if (localFields.size() < 1) + break; + else { + PowersConfigFields selectedField = localFields.get(ThreadLocalRandom.current().nextInt(localFields.size())); + try { + ElitePower.addPower(this, selectedField); + localFields.remove(selectedField); + if (selectedField.getPowerType().equals(PowersConfigFields.PowerType.MAJOR_ZOMBIE) || + selectedField.getPowerType().equals(PowersConfigFields.PowerType.MAJOR_BLAZE) || + selectedField.getPowerType().equals(PowersConfigFields.PowerType.MAJOR_ENDERMAN) || + selectedField.getPowerType().equals(PowersConfigFields.PowerType.MAJOR_GHAST) || + selectedField.getPowerType().equals(PowersConfigFields.PowerType.MAJOR_SKELETON)) + this.majorPowerCount++; + else + this.minorPowerCount++; + } catch (Exception ex) { + Logger.warn("Failed to instance new power!"); + } + } + + } + + public void applyPowers(HashSet powersConfigFields) { + powersConfigFields.forEach(field -> ElitePower.addPower(this, field)); + } + + public boolean hasPower(ElitePower mobPower) { + for (ElitePower elitePower : elitePowers) + if (elitePower.getPowersConfigFields().equals(mobPower.getPowersConfigFields())) + return true; + return false; + } + + public boolean hasPower(PowersConfigFields mobPower) { + for (ElitePower elitePower : elitePowers) + if (elitePower.getPowersConfigFields().equals(mobPower)) + return true; + return false; + } + + public ElitePower getPower(ElitePower elitePower) { + for (ElitePower iteratedPower : getElitePowers()) + if (iteratedPower.getClass().equals(elitePower.getClass())) + return iteratedPower; + return null; + } + + public ElitePower getPower(String elitePower) { + for (ElitePower iteratedPower : getElitePowers()) + if (iteratedPower.getFileName().equals(elitePower)) + return iteratedPower; + return null; + } + + public void setName(EliteMobProperties eliteMobProperties) { + this.name = ChatColorConverter.convert( + eliteMobProperties.getName().replace( + "$level", level + "")); + livingEntity.setCustomName(this.name); + livingEntity.setCustomNameVisible(DefaultConfig.isAlwaysShowNametags()); + } + + public void setName(String name, boolean applyToLivingEntity) { + this.name = name; + //This is necessary for the custom boss mega consumer + if (applyToLivingEntity) + livingEntity.setCustomName(name); + } + + public void setPersistent(boolean bool) { + this.isPersistent = bool; + if (livingEntity != null) + livingEntity.setRemoveWhenFarAway(!isPersistent); + } + + public void doCooldown() { + setInCooldown(true); + new BukkitRunnable() { + @Override + public void run() { + setInCooldown(false); + } + }.runTaskLater(MetadataHandler.PLUGIN, 20 * 15); + } + + public void doGlobalPowerCooldown(int ticks) { + setInCooldown(true); + new BukkitRunnable() { + @Override + public void run() { + setInCooldown(false); + } + }.runTaskLater(MetadataHandler.PLUGIN, ticks); + } + + public void setTriggeredAntiExploit(boolean triggeredAntiExploit) { + this.triggeredAntiExploit = triggeredAntiExploit; + if (triggeredAntiExploit) { + this.eliteLoot = false; + this.vanillaLoot = false; + } + } + + public void incrementAntiExploit(int value, String cause) { + antiExploitPoints += value; + if (antiExploitPoints > AntiExploitConfig.getAntiExploitThreshold()) { + setTriggeredAntiExploit(true); + AntiExploitMessage.sendWarning(livingEntity, cause); + } + } + + public void decrementAntiExploit(int value) { + antiExploitPoints -= value; + } + + public void setInAntiExploitCooldown() { + this.inAntiExploitCooldown = true; + new BukkitRunnable() { + @Override + public void run() { + inAntiExploitCooldown = false; + } + }.runTaskLater(MetadataHandler.PLUGIN, 20); + } + + public void setCombatGracePeriod(int delayInTicks) { + this.inCombatGracePeriod = true; + new BukkitRunnable() { + @Override + public void run() { + inCombatGracePeriod = false; + } + }.runTaskLater(MetadataHandler.PLUGIN, delayInTicks); + } + + public void addGlobalReinforcement(CustomBossEntity customBossEntity) { + this.globalReinforcementEntities.add(customBossEntity); + } + + public void addReinforcement(CustomBossEntity customBossEntity) { + this.eliteReinforcementEntities.add(customBossEntity); + } + + public void addReinforcement(Entity entity) { + this.nonEliteReinforcementEntities.add(entity); + } + + /** + * Returns true if the {@link LivingEntity} is exists and loaded. + * + * @return Whether the EliteEntity is currently valid. + */ + public boolean isValid() { + if (livingEntity == null) return false; + return livingEntity.isValid(); + } + + public boolean exists() { + if (livingEntity == null) return false; + return !livingEntity.isDead(); + } + + public Location getLocation() { + if (livingEntity != null) return livingEntity.getLocation(); + if (unsyncedLivingEntity != null) return unsyncedLivingEntity.getLocation(); + return null; + } + + public void remove(RemovalReason removalReason) { + //This prevents the entity tracker from running this code twice when removing due to specific reasons + //Custom bosses have their own tracking removal rules + if (livingEntity != null && (!(this instanceof CustomBossEntity))) + EntityTracker.getEliteMobEntities().remove(eliteUUID); + if (livingEntity != null && !removalReason.equals(RemovalReason.DEATH)) + livingEntity.remove(); + if (livingEntity instanceof EnderDragon enderDragon && removalReason.equals(RemovalReason.DEATH)) { + enderDragon.setPhase(EnderDragon.Phase.DYING); + if (enderDragon.getDragonBattle() != null) + enderDragon.getDragonBattle().generateEndPortal(false); + } + this.livingEntity = null; + } + + public void removeReinforcement(CustomBossEntity customBossEntity) { + eliteReinforcementEntities.remove(customBossEntity); + globalReinforcementEntities.remove(customBossEntity); + } + + public int getGlobalReinforcementsCount() { + return this.globalReinforcementEntities.size(); + } + + public HashSet getTags() { + return customMetadata; + } + + public boolean hasTag(String tag) { + return customMetadata.contains(tag); + } + + public void addTag(String tag) { + customMetadata.add(tag); + } + + public void addTags(List tags) { + customMetadata.addAll(tags); + } + + public void removeTag(String tag) { + customMetadata.remove(tag); + } + + public void removeTags(List tags) { + customMetadata.removeAll(tags); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/EliteMobConstructor.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/EliteMobConstructor.java deleted file mode 100644 index 18b8caaa6..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/EliteMobConstructor.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.magmaguy.elitemobs.mobconstructor; - -import com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs.EliteMobProperties; -import org.bukkit.Bukkit; -import org.bukkit.entity.LivingEntity; - -public class EliteMobConstructor { - - /* - This class assumes that the entity has already been filtered and validated before being invoked - */ - public static EliteMobEntity constructEliteMob(LivingEntity livingEntity, int mobLevel) { - - if (!EliteMobProperties.isValidEliteMobType(livingEntity)) { - Bukkit.getLogger().warning("[EliteMobs] Attempted to construct an invalid Elite Mob. Report this to the dev!"); - Bukkit.getLogger().warning("[EliteMobs] Elite Mob type: " + livingEntity.getType()); - return null; - } - - return new EliteMobEntity(livingEntity, mobLevel); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/EliteMobEntity.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/EliteMobEntity.java deleted file mode 100644 index 38de3d31f..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/EliteMobEntity.java +++ /dev/null @@ -1,603 +0,0 @@ -package com.magmaguy.elitemobs.mobconstructor; - -import com.magmaguy.elitemobs.ChatColorConverter; -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.DefaultConfig; -import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; -import com.magmaguy.elitemobs.items.MobTierFinder; -import com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs.EliteMobProperties; -import com.magmaguy.elitemobs.mobpowers.ElitePower; -import com.magmaguy.elitemobs.mobpowers.majorpowers.MajorPower; -import com.magmaguy.elitemobs.mobpowers.minorpowers.MinorPower; -import com.magmaguy.elitemobs.mobspawning.NaturalMobSpawnEventHandler; -import com.magmaguy.elitemobs.powerstances.MajorPowerPowerStance; -import com.magmaguy.elitemobs.powerstances.MinorPowerPowerStance; -import com.magmaguy.elitemobs.utils.VersionChecker; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.attribute.Attribute; -import org.bukkit.entity.*; -import org.bukkit.inventory.ItemStack; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.concurrent.ThreadLocalRandom; - -public class EliteMobEntity { - - /* - Note that a lot of values here are defined by EliteMobProperties.java - */ - private LivingEntity eliteMob; - private int eliteMobLevel; - private double eliteMobTier; - private double maxHealth; - private String name; - /* - Store all powers in one set, makes no sense to access it in individual sets. - The reason they are split up in the first place is to add them in a certain ratio - Once added, they can just be stored in a pool - */ - private HashSet powers = new HashSet<>(); - private int minorPowerCount = 0; - private int majorPowerCount = 0; - private boolean hasMinorVisualEffect = false; - private boolean hasMajorVisualEffect = false; - private boolean hasVisualEffectObfuscated = true; - private boolean isNaturalEntity; - /* - This just defines default behavior - */ - private boolean hasStacking = true; - private boolean hasCustomArmor = false; - private boolean hasCustomName = false; - private boolean hasCustomPowers = false; - private boolean hasFarAwayUnload = true; - private boolean hasCustomHealth = false; - private boolean hasNormalLoot = true; - - /** - * This is the generic constructor used in most instances of natural elite mob generation - * - * @param livingEntity Minecraft entity associated to this elite mob - * @param eliteMobLevel Level of the mob, can be modified during runtime. Dynamically assigned. - */ - public EliteMobEntity(LivingEntity livingEntity, int eliteMobLevel) { - - /* - Register living entity to keep track of which entity this object is tied to - */ - this.eliteMob = livingEntity; - /* - Register level, this is variable as per stacking rules - */ - setEliteMobLevel(eliteMobLevel); - eliteMobTier = MobTierFinder.findMobTier(eliteMobLevel); - /* - Get correct instance of plugin data, necessary for settings names and health among other things - */ - EliteMobProperties eliteMobProperties = EliteMobProperties.getPluginData(livingEntity); - /* - Handle name, variable as per stacking rules - */ - setCustomName(eliteMobProperties); - /* - Handle health, max is variable as per stacking rules - Currently #setHealth() resets the health back to maximum - */ - setMaxHealth(eliteMobProperties); - setHealth(); - /* - Set the armor - */ - setArmor(); - /* - Register whether or not the elite mob is natural - */ - this.isNaturalEntity = EntityTracker.isNaturalEntity(livingEntity); - /* - Set the power list - */ - randomizePowers(eliteMobProperties); - /* - Start tracking the entity - */ - EntityTracker.registerEliteMob(this); - - eliteMob.setCanPickupItems(false); - - } - - /** - * This is the generic constructor used in most instances of natural elite mob generation - * - * @param livingEntity Minecraft entity associated to this elite mob - * @param eliteMobLevel Level of the mob, can be modified during runtime. Dynamically assigned. - */ - public EliteMobEntity(LivingEntity livingEntity, int eliteMobLevel, double currentHealthPercent) { - - /* - Register living entity to keep track of which entity this object is tied to - */ - this.eliteMob = livingEntity; - /* - Register level, this is variable as per stacking rules - */ - setEliteMobLevel(eliteMobLevel); - eliteMobTier = MobTierFinder.findMobTier(eliteMobLevel); - /* - Get correct instance of plugin data, necessary for settings names and health among other things - */ - EliteMobProperties eliteMobProperties = EliteMobProperties.getPluginData(livingEntity); - /* - Handle name, variable as per stacking rules - */ - setCustomName(eliteMobProperties); - /* - Handle health, max is variable as per stacking rules - Currently #setHealth() resets the health back to maximum - */ - setMaxHealth(eliteMobProperties); - setHealth(); - /* - Set the armor - */ - setArmor(); - /* - Register whether or not the elite mob is natural - */ - this.isNaturalEntity = EntityTracker.isNaturalEntity(livingEntity); - /* - Set the power list - */ - randomizePowers(eliteMobProperties); - /* - Start tracking the entity - */ - EntityTracker.registerEliteMob(this); - - eliteMob.setCanPickupItems(false); - - } - - - /** - * Spawning method for boss mobs. - * Assumes custom powers and custom names. - * - * @param livingEntity the living entity associated to the mob - * @param eliteMobLevel boss mob level, should be automatically generated based on the highest player tier online - * @param name the name for this boss mob, overrides the usual elite mob name format - * @see BossMobEntity - */ - public EliteMobEntity(EntityType entityType, Location location, int eliteMobLevel, String name) { - - /* - Register living entity to keep track of which entity this object is tied to - */ - this.eliteMob = spawnBossMobLivingEntity(entityType, location); - /* - Register level, this is variable as per stacking rules - */ - setEliteMobLevel(eliteMobLevel); - eliteMobTier = MobTierFinder.findMobTier(eliteMobLevel); - /* - Get correct instance of plugin data, necessary for settings names and health among other things - */ - EliteMobProperties eliteMobProperties = EliteMobProperties.getPluginData(entityType); - /* - Handle name, variable as per stacking rules - */ - setCustomName(name); - /* - Handle health, max is variable as per stacking rules - Currently #setHealth() resets the health back to maximum - */ - setMaxHealth(eliteMobProperties); - setHealth(); - /* - Register whether or not the elite mob is natural - */ - this.isNaturalEntity = EntityTracker.isNaturalEntity(this.eliteMob); - /* - These have custom powers - */ - this.hasCustomPowers = true; - /* - Start tracking the entity - */ - EntityTracker.registerEliteMob(this); - - if (ConfigValues.defaultConfig.getBoolean(DefaultConfig.PREVENT_ITEM_PICKUP)) - eliteMob.setCanPickupItems(false); - - this.setHasStacking(false); - this.setHasCustomArmor(true); - - } - - /* - This is the generic constructor for elite mobs spawned via commands - */ - public EliteMobEntity(EntityType entityType, Location location, int eliteMobLevel, HashSet mobPowers) { - - /* - Register living entity to keep track of which entity this object is tied to - */ - this.eliteMob = spawnBossMobLivingEntity(entityType, location); - /* - Register level, this is variable as per stacking rules - */ - setEliteMobLevel(eliteMobLevel); - eliteMobTier = MobTierFinder.findMobTier(eliteMobLevel); - /* - Get correct instance of plugin data, necessary for settings names and health among other things - */ - EliteMobProperties eliteMobProperties = EliteMobProperties.getPluginData(entityType); - /* - Handle name, variable as per stacking rules - */ - setCustomName(eliteMobProperties); - /* - Handle health, max is variable as per stacking rules - Currently #setHealth() resets the health back to maximum - */ - setMaxHealth(eliteMobProperties); - setHealth(); - /* - Set the armor - */ - setArmor(); - /* - Register whether or not the elite mob is natural - All mobs spawned via commands are considered natural - */ - this.isNaturalEntity = true; - /* - Set the power list - */ - this.powers = mobPowers; - /* - Start tracking the entity - */ - EntityTracker.registerEliteMob(new EliteMobEntity(this.eliteMob, this.eliteMobLevel)); - - if (ConfigValues.defaultConfig.getBoolean(DefaultConfig.PREVENT_ITEM_PICKUP)) - eliteMob.setCanPickupItems(false); - - } - - /* - This avoids accidentally assigning an elite mob to an entity spawned specifically to be a boss mob or reinforcement - */ - private static LivingEntity spawnBossMobLivingEntity(EntityType entityType, Location location) { - NaturalMobSpawnEventHandler.setIgnoreMob(true); - return (LivingEntity) location.getWorld().spawnEntity(location, entityType); - } - - private void setCustomName(EliteMobProperties eliteMobProperties) { - this.name = ChatColorConverter.convert( - eliteMobProperties.getName().replace( - "$level", eliteMobLevel + "")); - eliteMob.setCustomName(this.name); - if (ConfigValues.defaultConfig.getBoolean(DefaultConfig.ALWAYS_SHOW_NAMETAGS)) - eliteMob.setCustomNameVisible(true); - } - - private void setCustomName(String name) { - this.name = ChatColorConverter.convert(name); - this.getLivingEntity().setCustomName(this.name); - this.hasCustomName = true; - if (ConfigValues.defaultConfig.getBoolean(DefaultConfig.ALWAYS_SHOW_NAMETAGS)) - eliteMob.setCustomNameVisible(true); - } - - private void setEliteMobLevel(int newLevel) { - if (newLevel < 1) - newLevel = 1; - this.eliteMobLevel = newLevel; - } - - private void setMaxHealth(EliteMobProperties eliteMobProperties) { - double defaultMaxHealth = eliteMobProperties.getDefaultMaxHealth(); - this.maxHealth = (eliteMobLevel * CombatSystem.PER_LEVEL_POWER_INCREASE * defaultMaxHealth + defaultMaxHealth); - eliteMob.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(maxHealth); - } - - private void setHealth() { - eliteMob.setHealth(maxHealth = (maxHealth > 2048) ? 2048 : maxHealth); - } - - private void setHealth(double healthPercentage) { - eliteMob.setHealth(this.maxHealth * healthPercentage); - } - - - private void setArmor() { - - if (VersionChecker.currentVersionIsUnder(12, 2)) return; - if (!ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.ELITE_ARMOR)) return; - - eliteMob.getEquipment().setItemInMainHandDropChance(0); - eliteMob.getEquipment().setHelmetDropChance(0); - eliteMob.getEquipment().setChestplateDropChance(0); - eliteMob.getEquipment().setLeggingsDropChance(0); - eliteMob.getEquipment().setBootsDropChance(0); - - if (hasCustomArmor) return; - - if (!(eliteMob instanceof Zombie || eliteMob instanceof PigZombie || - eliteMob instanceof Skeleton || eliteMob instanceof WitherSkeleton)) return; - - eliteMob.getEquipment().setBoots(new ItemStack(Material.AIR)); - eliteMob.getEquipment().setLeggings(new ItemStack(Material.AIR)); - eliteMob.getEquipment().setChestplate(new ItemStack(Material.AIR)); - eliteMob.getEquipment().setHelmet(new ItemStack(Material.AIR)); - - if (eliteMobLevel >= 12) - if (ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.ELITE_HELMETS)) - eliteMob.getEquipment().setHelmet(new ItemStack(Material.LEATHER_HELMET)); - - if (eliteMobLevel >= 14) - eliteMob.getEquipment().setBoots(new ItemStack(Material.LEATHER_BOOTS)); - - if (eliteMobLevel >= 16) - eliteMob.getEquipment().setLeggings(new ItemStack(Material.LEATHER_LEGGINGS)); - - if (eliteMobLevel >= 18) - eliteMob.getEquipment().setChestplate(new ItemStack(Material.LEATHER_CHESTPLATE)); - - if (eliteMobLevel >= 20) - if (ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.ELITE_HELMETS)) - eliteMob.getEquipment().setHelmet(new ItemStack(Material.CHAINMAIL_HELMET)); - - if (eliteMobLevel >= 22) - eliteMob.getEquipment().setBoots(new ItemStack(Material.CHAINMAIL_BOOTS)); - - if (eliteMobLevel >= 24) - eliteMob.getEquipment().setLeggings(new ItemStack(Material.CHAINMAIL_LEGGINGS)); - - if (eliteMobLevel >= 26) - eliteMob.getEquipment().setChestplate(new ItemStack(Material.CHAINMAIL_CHESTPLATE)); - - if (eliteMobLevel >= 28) - if (ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.ELITE_HELMETS)) - eliteMob.getEquipment().setHelmet(new ItemStack(Material.IRON_HELMET)); - - if (eliteMobLevel >= 30) - eliteMob.getEquipment().setBoots(new ItemStack(Material.IRON_BOOTS)); - - if (eliteMobLevel >= 32) - eliteMob.getEquipment().setLeggings(new ItemStack(Material.IRON_LEGGINGS)); - - if (eliteMobLevel >= 34) - eliteMob.getEquipment().setChestplate(new ItemStack(Material.IRON_CHESTPLATE)); - - if (eliteMobLevel >= 36) - eliteMob.getEquipment().setBoots(new ItemStack(Material.DIAMOND_BOOTS)); - - if (eliteMobLevel >= 38) - if (ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.ELITE_HELMETS)) - eliteMob.getEquipment().setHelmet(new ItemStack(Material.DIAMOND_HELMET)); - - if (eliteMobLevel >= 40) - eliteMob.getEquipment().setLeggings(new ItemStack(Material.DIAMOND_LEGGINGS)); - - if (eliteMobLevel >= 42) - eliteMob.getEquipment().setChestplate(new ItemStack(Material.DIAMOND_CHESTPLATE)); - - } - - private void randomizePowers(EliteMobProperties eliteMobProperties) { - - if (hasCustomPowers) return; - if (eliteMobTier < 1) return; - - int availableDefensivePowers = 0; - int availableOffensivePowers = 0; - int availableMiscellaneousPowers = 0; - int availableMajorPowers = 0; - - if (eliteMobTier >= 1) availableDefensivePowers = 1; - if (eliteMobTier >= 2) availableOffensivePowers = 1; - if (eliteMobTier >= 3) availableMiscellaneousPowers = 1; - if (eliteMobTier >= 4) availableMajorPowers = 1; - if (eliteMobTier >= 5) availableDefensivePowers = 2; - if (eliteMobTier >= 6) availableOffensivePowers = 2; - if (eliteMobTier >= 7) availableMiscellaneousPowers = 2; - if (eliteMobTier >= 8) availableMajorPowers = 2; - - //apply defensive powers - applyPowers((HashSet) eliteMobProperties.getValidDefensivePowers().clone(), availableDefensivePowers); - - //apply offensive powers - applyPowers((HashSet) eliteMobProperties.getValidOffensivePowers().clone(), availableOffensivePowers); - - //apply miscellaneous powers - applyPowers((HashSet) eliteMobProperties.getValidMiscellaneousPowers().clone(), availableMiscellaneousPowers); - - //apply major powers - applyPowers((HashSet) eliteMobProperties.getValidMajorPowers().clone(), availableMajorPowers); - - MinorPowerPowerStance minorPowerStanceMath = new MinorPowerPowerStance(this); - MajorPowerPowerStance majorPowerPowerStance = new MajorPowerPowerStance(this); - - } - - private void applyPowers(HashSet elitePowers, int availablePowerAmount) { - - if (availablePowerAmount < 1) return; - - ArrayList localPowers = new ArrayList<>(elitePowers); - - for (ElitePower mobPower : this.powers) - localPowers.remove(mobPower); - - for (int i = 0; i < availablePowerAmount; i++) - if (localPowers.size() < 1) - break; - else { - ElitePower selectedPower = localPowers.get(ThreadLocalRandom.current().nextInt(localPowers.size())); - this.powers.add(selectedPower); - selectedPower.applyPowers(this.eliteMob); - localPowers.remove(selectedPower); - if (selectedPower instanceof MajorPower) - this.majorPowerCount++; - if (selectedPower instanceof MinorPower) - this.minorPowerCount++; - } - - } - - public void setCustomPowers(HashSet elitePowers) { - - this.powers = elitePowers; - for (ElitePower elitePower : elitePowers) { - elitePower.applyPowers(this.eliteMob); - if (elitePower instanceof MinorPower) - this.minorPowerCount++; - if (elitePower instanceof MajorPower) - this.majorPowerCount++; - } - - if (this.minorPowerCount > 0) { - MinorPowerPowerStance minorPowerStanceMath = new MinorPowerPowerStance(this); - } - - if (this.majorPowerCount > 0) { - MajorPowerPowerStance majorPowerPowerStance = new MajorPowerPowerStance(this); - } - - } - - public LivingEntity getLivingEntity() { - return eliteMob; - } - - public int getLevel() { - return eliteMobLevel; - } - - public boolean hasPower(ElitePower mobPower) { - for (ElitePower elitePower : powers) - if (elitePower.getClass().getTypeName().equals(mobPower.getClass().getTypeName())) - return true; - return false; - } - - public int getMinorPowerCount() { - return this.minorPowerCount; - } - - public int getMajorPowerCount() { - return this.majorPowerCount; - } - - public HashSet getPowers() { - return powers; - } - - public double getMaxHealth() { - return maxHealth; - } - - public void setHasStacking(boolean bool) { - this.hasStacking = bool; - } - - public boolean getHasCustomArmor() { - return this.hasCustomArmor; - } - - public void setHasCustomArmor(boolean bool) { - this.hasCustomArmor = bool; - } - - public boolean getHasCustomPowers() { - return this.hasCustomPowers; - } - - public void setHasCustomPowers(boolean bool) { - this.hasCustomPowers = bool; - } - - public String getName() { - return this.name; - } - - public boolean hasMinorVisualEffect() { - return this.hasMinorVisualEffect; - } - - public void setHasMinorVisualEffect(boolean bool) { - this.hasMinorVisualEffect = bool; - } - - public boolean hasMajorVisualEffect() { - return this.hasMajorVisualEffect; - } - - public void setHasMajorVisualEffect(boolean bool) { - this.hasMajorVisualEffect = bool; - } - - public boolean isNaturalEntity() { - return this.isNaturalEntity; - } - - public void setIsNaturalEntity(Boolean bool) { - this.isNaturalEntity = bool; - this.hasNormalLoot = bool; - } - - public boolean canStack() { - return this.hasStacking; - } - - public void setName(String name) { - this.name = name; - } - - public boolean getHasFarAwayUnload() { - return this.hasFarAwayUnload; - } - - public void setHasFarAwayUnload(boolean bool) { - this.hasFarAwayUnload = bool; - } - - public boolean getHasNormalLoot() { - return this.hasNormalLoot; - } - - public void setHasNormalLoot(boolean bool) { - this.isNaturalEntity = bool; - this.hasNormalLoot = bool; - } - - public boolean getHasCustomHealth() { - return this.hasCustomHealth; - } - - public void setHasCustomHealth(boolean bool) { - this.hasCustomHealth = bool; - } - - public boolean getHasCustomName() { - return this.hasCustomName; - } - - public void setHasCustomName(boolean bool) { - this.hasCustomName = bool; - } - - public void setHasVisualEffectObfuscated(boolean bool) { - this.hasVisualEffectObfuscated = bool; - } - - public boolean getHasVisualEffectObfuscated() { - return this.hasVisualEffectObfuscated; - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/MergeHandler.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/MergeHandler.java deleted file mode 100644 index f454a0ff9..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/MergeHandler.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobconstructor; - -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; -import com.magmaguy.elitemobs.config.ValidMobsConfig; -import com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs.EliteMobProperties; -import com.magmaguy.elitemobs.mobconstructor.mobdata.passivemobs.SuperMobProperties; -import com.magmaguy.elitemobs.mobscanner.EliteMobScanner; -import com.magmaguy.elitemobs.mobscanner.SuperMobScanner; -import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.EntitySpawnEvent; - -/** - * Created by MagmaGuy on 15/07/2017. - */ -public class MergeHandler implements Listener { - - @EventHandler - public void onDamageMerge(EntityDamageEvent event) { - - validateEntityType(event.getEntity()); - - } - - @EventHandler - public void onSpawnMerge(EntitySpawnEvent event) { - - validateEntityType(event.getEntity()); - - } - - private void validateEntityType(Entity eventEntity) { - - if (ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.AGGRESSIVE_MOB_STACKING) && - EliteMobProperties.isValidEliteMobType(eventEntity)) - EliteMobScanner.scanValidAggressiveLivingEntity((LivingEntity) eventEntity); - - if (ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_PASSIVE_SUPERMOBS) && - SuperMobProperties.isValidSuperMobType(eventEntity)) - SuperMobScanner.newSuperMobScan((LivingEntity) eventEntity); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/PersistentMovingEntity.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/PersistentMovingEntity.java new file mode 100644 index 000000000..d93dde968 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/PersistentMovingEntity.java @@ -0,0 +1,4 @@ +package com.magmaguy.elitemobs.mobconstructor; + +public interface PersistentMovingEntity { +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/PersistentObject.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/PersistentObject.java new file mode 100644 index 000000000..1eef87b5f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/PersistentObject.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.mobconstructor; + +import org.bukkit.Location; +import org.bukkit.World; + +public interface PersistentObject { + + /** + * Sets the behavior for chunk loads + */ + void chunkLoad(); + + /** + * Sets the behavior for chunk unloads + */ + void chunkUnload(); + + void worldLoad(World world); + + void worldUnload(); + + Location getPersistentLocation(); + + String getWorldName(); + +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/PersistentObjectHandler.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/PersistentObjectHandler.java new file mode 100644 index 000000000..a9190b581 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/PersistentObjectHandler.java @@ -0,0 +1,177 @@ +package com.magmaguy.elitemobs.mobconstructor; + +import com.google.common.collect.ArrayListMultimap; +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.InstancedDungeonRemoveEvent; +import com.magmaguy.elitemobs.utils.ChunkVectorizer; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.Chunk; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.world.ChunkLoadEvent; +import org.bukkit.event.world.ChunkUnloadEvent; +import org.bukkit.event.world.WorldLoadEvent; +import org.bukkit.event.world.WorldUnloadEvent; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class PersistentObjectHandler { + + /* + This ArrayListMultiMap keeps two types of string keys: The first type is a world name and the second type is a chunk vector converted to a string + */ + private static final ArrayListMultimap persistentObjects = ArrayListMultimap.create(); + private final PersistentObject persistentObject; + private final String worldName; + @Getter + private Location persistentLocation; + private String chunk; + + /** + * Used to store the locations of custom bosses that have gone into unloaded chunks. + * + * @param persistentObject + */ + public PersistentObjectHandler(PersistentObject persistentObject) { + this.persistentObject = persistentObject; + this.persistentLocation = persistentObject.getPersistentLocation(); + this.worldName = persistentObject.getWorldName(); + if (persistentLocation != null && + persistentLocation.getWorld() != null && + Bukkit.getWorld(persistentLocation.getWorld().getUID()) != null) + addChunkKey(this); + else + addWorldKey(this); + } + + /** + * Clears all data for a correct shutdown + */ + public static void shutdown() { + persistentObjects.clear(); + } + + /** + * Used to add persistent entities to the list. This inserts an arbitrary amount of persistent entities into a chunk. + * Called when a SimplePersistentEntity is created. + * + * @param simplePersistentEntity Entity to be added + */ + private void addChunkKey(PersistentObjectHandler simplePersistentEntity) { + if (persistentLocation.getWorld() == null) return; + this.chunk = ChunkVectorizer.hash(persistentLocation.getBlockX() >> 4, persistentLocation.getBlockZ() >> 4, persistentLocation.getWorld().getUID()) + ""; + persistentObjects.put(simplePersistentEntity.chunk, simplePersistentEntity); + } + + private void addWorldKey(PersistentObjectHandler persistentObjectHandler) { + persistentObjects.put(persistentObjectHandler.worldName, persistentObjectHandler); + } + + public void worldLoad(World world) { + //run implementations + persistentObject.worldLoad(world); + //convert persistent object handler to chunk-based detection + //Start by removing old key + remove(); + //Assign world to the location + this.persistentLocation.setWorld(world); + //Assign key + addChunkKey(this); + + } + + public void worldUnload() { + //run implementations + persistentObject.worldUnload(); + //convert persistent object handler to world-based detection + //Start by removing old key + remove(); + //Assign key + addWorldKey(this); + } + + public void updatePersistentLocation(Location location) { + remove(); + this.persistentLocation = location; + addChunkKey(this); + } + + + public void remove() { + persistentObjects.remove(this.chunk, this); + persistentObjects.remove(this.worldName, this); + } + + public static class PersistentObjectHandlerEvents implements Listener { + + private static int chunkLocation(Chunk chunk) { + return ChunkVectorizer.hash(chunk); + } + + + /** + * Behavior that runs when a chunk loads, spawning the entity + */ + private static void loadChunk(List persistentObjectHandlers) { + persistentObjectHandlers.forEach(persistentObjectHandler -> persistentObjectHandler.persistentObject.chunkLoad()); + } + + private static void unloadChunk(List persistentObjectHandlers) { + persistentObjectHandlers.forEach(persistentObjectHandler -> { + //The chunk unload for moving entities is handled by the EntityTracker + if (persistentObjectHandler.persistentObject instanceof PersistentMovingEntity) return; + persistentObjectHandler.persistentObject.chunkUnload(); + }); + } + + private static void unloadWorld(World world) { + List copy = new ArrayList<>(); + for (PersistentObjectHandler persistentObjectHandler : persistentObjects.values()) + if (Objects.equals(persistentObjectHandler.worldName, world.getName())) + copy.add(persistentObjectHandler); + copy.forEach(PersistentObjectHandler::worldUnload); + } + + private static void loadWorld(World world) { + List copy = new ArrayList<>(persistentObjects.get(world.getName())); + copy.forEach(persistentObjectHandler -> persistentObjectHandler.worldLoad(world)); + } + + //Store world names and serialized locations + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) + public void chunkLoadEvent(ChunkLoadEvent event) { + int chunkLocation = chunkLocation(event.getChunk()); + List simplePersistentEntityList = new ArrayList<>(persistentObjects.get(chunkLocation + "")); + Bukkit.getScheduler().scheduleSyncDelayedTask(MetadataHandler.PLUGIN, () -> loadChunk(simplePersistentEntityList), 1L); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) + public void worldUnloadEvent(WorldUnloadEvent event) { + unloadWorld(event.getWorld()); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR) + public void worldLoadEvent(WorldLoadEvent event) { + loadWorld(event.getWorld()); + } + + @EventHandler + public void chunkUnloadEvent(ChunkUnloadEvent event) { + int chunkLocation = chunkLocation(event.getChunk()); + List simplePersistentEntityList = new ArrayList<>(persistentObjects.get(chunkLocation + "")); + unloadChunk(simplePersistentEntityList); + } + + @EventHandler + public void onInstanceRemove(InstancedDungeonRemoveEvent event) { + persistentObjects.removeAll(event.getDungeonInstance().getInstancedWorldName()); + } + + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/ReinforcementMobEntity.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/ReinforcementMobEntity.java deleted file mode 100644 index b59bbec83..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/ReinforcementMobEntity.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.magmaguy.elitemobs.mobconstructor; - -import org.bukkit.Location; -import org.bukkit.entity.EntityType; - -public class ReinforcementMobEntity extends EliteMobEntity { - - /* - Half the level of the elite they're reinforcing - */ - public ReinforcementMobEntity(EntityType entityType, Location location, int eliteMobLevel, String name) { - super(entityType, location, (int) Math.ceil(eliteMobLevel / 2), name); - super.setHasNormalLoot(false); - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/SuperMobConstructor.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/SuperMobConstructor.java deleted file mode 100644 index 8da5a003b..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/SuperMobConstructor.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.magmaguy.elitemobs.mobconstructor; - -import com.magmaguy.elitemobs.ChatColorConverter; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.DefaultConfig; -import com.magmaguy.elitemobs.mobconstructor.mobdata.passivemobs.SuperMobProperties; -import org.bukkit.Bukkit; -import org.bukkit.attribute.Attribute; -import org.bukkit.entity.LivingEntity; - - -public class SuperMobConstructor { - - /* - This class assumes that the entity has already been filtered and validated before being invoked - */ - public static LivingEntity constructSuperMob(LivingEntity livingEntity) { - - if (!SuperMobProperties.isValidSuperMobType(livingEntity)) { - Bukkit.getLogger().warning("[EliteMobs] Attempted to construct an invalid supermob. Report this to the dev!"); - return null; - } - - String name = ChatColorConverter.convert(SuperMobProperties.getDataInstance(livingEntity).getName()); - double newMaxHealth = SuperMobProperties.getDataInstance(livingEntity).getDefaultMaxHealth() * ConfigValues.defaultConfig.getInt(DefaultConfig.SUPERMOB_STACK_AMOUNT); - - livingEntity.setCustomName(name); - livingEntity.setCustomNameVisible(true); - livingEntity.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(newMaxHealth); - livingEntity.setHealth(newMaxHealth); - - return livingEntity; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/TimedBossMobEntity.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/TimedBossMobEntity.java deleted file mode 100644 index 276c1d143..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/TimedBossMobEntity.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.magmaguy.elitemobs.mobconstructor; - -import com.magmaguy.elitemobs.events.mobs.sharedeventproperties.BossMobDeathCountdown; -import org.bukkit.Location; -import org.bukkit.entity.EntityType; - -public class TimedBossMobEntity extends BossMobEntity { - - public TimedBossMobEntity(EntityType entityType, Location location, int eliteMobLevel, String name) { - super(entityType, location, eliteMobLevel, name); - super.setHasFarAwayUnload(false); - super.getLivingEntity().setRemoveWhenFarAway(false); - BossMobDeathCountdown.startDeathCountdown(super.getLivingEntity()); - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/TrashMobEntity.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/TrashMobEntity.java deleted file mode 100644 index 67b75fef4..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/TrashMobEntity.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.magmaguy.elitemobs.mobconstructor; - -import org.bukkit.Location; -import org.bukkit.attribute.Attribute; -import org.bukkit.entity.EntityType; - -public class TrashMobEntity extends ReinforcementMobEntity { - - public TrashMobEntity(EntityType entityType, Location location, String name) { - - super(entityType, location, 1, name); - super.setHasCustomHealth(true); - super.getLivingEntity().getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(1); - super.getLivingEntity().setHealth(1); - super.setHasNormalLoot(false); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/AdvancedAggroManager.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/AdvancedAggroManager.java new file mode 100644 index 000000000..d7357f72a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/AdvancedAggroManager.java @@ -0,0 +1,48 @@ +package com.magmaguy.elitemobs.mobconstructor.custombosses; + +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Mob; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; + +import java.util.ArrayList; +import java.util.List; + +public class AdvancedAggroManager implements Listener { + + @EventHandler(priority = EventPriority.HIGH) + public void onHit(EliteMobDamagedByPlayerEvent event) { + if (event.isCancelled()) return; + if (!event.getEliteMobEntity().hasDamagers()) return; + if (event.getEliteMobEntity().getDamagers().size() < 2) return; + if (!(event.getEliteMobEntity().getLivingEntity() instanceof Mob)) return; + + List nearbyPlayers = new ArrayList<>(); + for (Entity entity : event.getEliteMobEntity().getLivingEntity().getNearbyEntities(35, 35, 35)) + if (entity.getType().equals(EntityType.PLAYER)) + nearbyPlayers.add((Player) entity); + + Player player = null; + double damage = 0; + for (Player iteratedPlayer : event.getEliteMobEntity().getDamagers().keySet()) { + if (event.getEliteMobEntity().getDamagers().get(iteratedPlayer) > damage && + nearbyPlayers.contains(iteratedPlayer)) { + player = iteratedPlayer; + damage = event.getEliteMobEntity().getDamagers().get(iteratedPlayer); + } + } + + if (player == null) return; + + if (((Mob) event.getEliteMobEntity().getLivingEntity()).getTarget() == null || + !((Mob) event.getEliteMobEntity().getLivingEntity()).getTarget().getUniqueId().equals(player.getUniqueId())) { + ((Mob) event.getEliteMobEntity().getLivingEntity()).setTarget(player); + } + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/CustomBossBossBar.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/CustomBossBossBar.java new file mode 100644 index 000000000..51655d24e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/CustomBossBossBar.java @@ -0,0 +1,175 @@ +package com.magmaguy.elitemobs.mobconstructor.custombosses; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Logger; +import com.magmaguy.magmacore.util.Round; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; +import org.bukkit.boss.BarColor; +import org.bukkit.boss.BarFlag; +import org.bukkit.boss.BarStyle; +import org.bukkit.boss.BossBar; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; + +public class CustomBossBossBar { + + private final CustomBossEntity customBossEntity; + private final Map bossBars = new HashMap<>(); + private final HashSet trackingPlayers = new HashSet<>(); + private BukkitTask bossBarUpdater; + private boolean warned = false; + + public CustomBossBossBar(CustomBossEntity customBossEntity) { + this.customBossEntity = customBossEntity; + start(); + sendLocation(); + } + + private void sendLocation() { + for (Player player : Bukkit.getOnlinePlayers()) { + if (!player.getWorld().equals(customBossEntity.getLocation().getWorld())) continue; + TextComponent interactiveMessage = new TextComponent(MobCombatSettingsConfig.getBossLocationMessage()); + interactiveMessage.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/elitemobs track boss " + customBossEntity.getEliteUUID())); + interactiveMessage.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(DefaultConfig.getTrackMessage().replace("$name", customBossEntity.getName())).create())); + player.spigot().sendMessage(interactiveMessage); + } + } + + public void addTrackingPlayer(Player player) { + if (!customBossEntity.exists()) { + remove(); + return; + } + if (!trackingPlayers.contains(player)) + trackingPlayers.add(player); + else + trackingPlayers.remove(player); + } + + public void removeTrackingPlayer(Player player) { + trackingPlayers.remove(player); + BossBar bossBar = bossBars.remove(player); + if (bossBar != null) bossBar.removeAll(); + } + + public void remove() { + bossBars.values().forEach(BossBar::removeAll); + bossBars.clear(); + trackingPlayers.clear(); + bossBarUpdater.cancel(); + CustomBossEntity.trackableCustomBosses.remove(customBossEntity); + } + + /** + * Used not only for generating the boss bar message, but also the message that appears on the tracking screen for players + * + * @param player + * @param locationString + * @return + */ + public String bossBarMessage(Player player, String locationString) { + if (customBossEntity.getCustomBossesConfigFields().getLocationMessage() == null) return ""; + if (customBossEntity.getCustomBossesConfigFields().getLocationMessage().contains("$distance") || + customBossEntity.getCustomBossesConfigFields().getLocationMessage().contains("$location")) { + if (!player.getLocation().getWorld().equals(customBossEntity.getLocation().getWorld())) + return ChatColorConverter.convert(MobCombatSettingsConfig.getDefaultOtherWorldBossLocationMessage() + .replace("$name", customBossEntity.getName())); + + return ChatColorConverter.convert(customBossEntity.getCustomBossesConfigFields().getLocationMessage() + .replace("$distance", "" + (int) customBossEntity.getLocation().distance(player.getLocation()))) + .replace("$location", locationString); + } + + return ChatColorConverter.convert(customBossEntity.getCustomBossesConfigFields().getLocationMessage()); + + } + + private void updateBossBar(Player player, BossBar bossBar) { + if (player == null) return; + if (bossBar == null) return; + String locationString = customBossEntity.getLocation().getBlockX() + + ", " + customBossEntity.getLocation().getBlockY() + + ", " + customBossEntity.getLocation().getBlockZ(); + bossBar.setTitle(bossBarMessage(player, locationString)); + double progress = Round.twoDecimalPlaces(customBossEntity.getHealth() / customBossEntity.getMaxHealth()); + if (progress > 1) return; + bossBar.setProgress(progress); + } + + public void start() { + bossBarUpdater = new BukkitRunnable() { + @Override + public void run() { + //This can happen on phase changes where boss bars might not be configured on subsequent entities + if (!customBossEntity.exists() || customBossEntity.getCustomBossesConfigFields().getLocationMessage() == null) { + cancel(); + remove(); + return; + } + + HashSet freshIteration = new HashSet<>(); + for (Player player : trackingPlayers) { + freshIteration.add(player); + if (!bossBars.containsKey(player)) createBossBar(player); + updateBossBar(player, bossBars.get(player)); + } + + //Remove players that have stopped + bossBars.entrySet().removeIf(entry -> { + if (!trackingPlayers.contains(entry.getKey())) { + entry.getValue().removeAll(); + return true; + } + return false; + }); + + //nearby player check + if (customBossEntity.isValid()) + for (Entity entity : customBossEntity.getLivingEntity().getNearbyEntities(30, 30, 30)) + if (entity.getType().equals(EntityType.PLAYER)) + if (!freshIteration.contains((Player) entity)) + createBossBar((Player) entity); + + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 5); + } + + private void createBossBar(Player player) { + String locationString = (int) customBossEntity.getLocation().getX() + + ", " + (int) customBossEntity.getLocation().getY() + + ", " + (int) customBossEntity.getLocation().getZ(); + BossBar bossBar = Bukkit.createBossBar(bossBarMessage(player, locationString), BarColor.GREEN, BarStyle.SOLID, BarFlag.PLAY_BOSS_MUSIC); + + if (!customBossEntity.exists()) return; + + if (customBossEntity.getHealth() / customBossEntity.getMaxHealth() > 1 || customBossEntity.getHealth() / customBossEntity.getMaxHealth() < 0) { + if (!warned) { + Logger.warn("The following boss had more health than it should: " + customBossEntity.getName()); + Logger.warn("This is a problem usually caused by running more than one plugin that modifies mob health!" + + " EliteMobs can't fix this issue because it is being caused by another plugin." + + " If you want EliteMobs to work correctly, find a way to fix this issue with whatever other plugin is causing it."); + warned = true; + } + return; + } + + bossBars.put(player, bossBar); + updateBossBar(player, bossBar); + bossBar.addPlayer(player); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/CustomBossDeath.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/CustomBossDeath.java new file mode 100644 index 000000000..d4654b4fc --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/CustomBossDeath.java @@ -0,0 +1,185 @@ +package com.magmaguy.elitemobs.mobconstructor.custombosses; + +import com.magmaguy.elitemobs.api.EliteMobDeathEvent; +import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; +import com.magmaguy.elitemobs.ondeathcommands.OnDeathCommands; +import com.magmaguy.elitemobs.thirdparty.discordsrv.DiscordSRVAnnouncement; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Round; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; + +import java.util.*; + +public class CustomBossDeath implements Listener { + + private static void doLoot(CustomBossEntity customBossEntity) { + if (customBossEntity.isTriggeredAntiExploit()) return; + if (customBossEntity.customBossesConfigFields.getUniqueLootList() == null || + customBossEntity.customBossesConfigFields.getUniqueLootList().isEmpty()) return; + for (Player player : customBossEntity.getDamagers().keySet()) + dropLoot(player, customBossEntity); + } + + public static void dropLoot(Player player, CustomBossEntity customBossEntity) { + customBossEntity.customBossesConfigFields.getCustomLootTable().bossDrop(player, customBossEntity.getLevel(), customBossEntity.getLocation(), customBossEntity); + } + + private static void doDeathMessage(CustomBossEntity customBossEntity) { + //Do death message + StringBuilder playersList = new StringBuilder(); + for (Player player : customBossEntity.getDamagers().keySet()) { + if (playersList.length() == 0) + playersList.append(player.getDisplayName()); + else + playersList.append(", &f").append(player.getDisplayName()); + } + + playersList = new StringBuilder(ChatColorConverter.convert(playersList.toString())); + + if (customBossEntity.hasDamagers()) + if (customBossEntity.customBossesConfigFields.getDeathMessages() != null && + !customBossEntity.customBossesConfigFields.getDeathMessages().isEmpty()) { + Player topDamager = null, secondDamager = null, thirdDamager = null; + + HashMap sortedMap = sortByComparator(customBossEntity.getDamagers(), false); + + Iterator sortedMapIterator = sortedMap.keySet().iterator(); + for (int i = 1; i < 4; i++) { + if (i > sortedMap.size()) + break; + Player nextPlayer = sortedMapIterator.next(); + switch (i) { + case 1: + topDamager = nextPlayer; + break; + case 2: + secondDamager = nextPlayer; + break; + case 3: + thirdDamager = nextPlayer; + break; + } + } + + for (String string : customBossEntity.customBossesConfigFields.getDeathMessages()) { + if (string.contains("$damager1name")) + if (topDamager != null) + string = string.replace("$damager1name", topDamager.getDisplayName()); + else + string = ""; + if (string.contains("$damager1damage")) + if (topDamager != null) + string = string.replace("$damager1damage", + Round.twoDecimalPlaces(customBossEntity.getDamagers().get(topDamager)) + ""); + else + string = ""; + if (string.contains("$damager2name")) + if (secondDamager != null) + string = string.replace("$damager2name", secondDamager.getDisplayName()); + else + string = ""; + if (string.contains("$damager2damage")) + if (secondDamager != null) + string = string.replace("$damager2damage", + Round.twoDecimalPlaces(customBossEntity.getDamagers().get(secondDamager)) + ""); + else + string = ""; + if (string.contains("$damager3name")) + if (thirdDamager != null) + string = string.replace("$damager3name", thirdDamager.getDisplayName()); + else + string = ""; + if (string.contains("$damager3damage")) + if (thirdDamager != null) + string = string.replace("$damager3damage", + Round.twoDecimalPlaces(customBossEntity.getDamagers().get(thirdDamager)) + ""); + else + string = ""; + if (string.contains("$players")) + string = string.replace("$players", playersList.toString()); + if (customBossEntity.customBossesConfigFields.getAnnouncementPriority() > 0) + Bukkit.broadcastMessage(ChatColorConverter.convert(string)); + if (string.length() > 0) + if (customBossEntity.customBossesConfigFields.getAnnouncementPriority() > 2) + new DiscordSRVAnnouncement(ChatColorConverter.convert(string)); + else if (customBossEntity.customBossesConfigFields.getAnnouncementPriority() < 1) + for (Player player : customBossEntity.getDamagers().keySet()) + player.sendMessage(ChatColorConverter.convert(string)); + } + + for (Player player : Bukkit.getOnlinePlayers()) + if (customBossEntity.getDamagers().containsKey(player)) + player.sendMessage( + ChatColorConverter.convert( + MobCombatSettingsConfig.getBossKillParticipationMessage().replace( + "$playerDamage", + Round.twoDecimalPlaces(customBossEntity.getDamagers().get(player)) + ""))); + + } else { + if (customBossEntity.customBossesConfigFields.getDeathMessage() != null) { + if (customBossEntity.customBossesConfigFields.getAnnouncementPriority() == 0) + for (Player player : customBossEntity.getDamagers().keySet()) + player.sendMessage(ChatColorConverter.convert( + customBossEntity.customBossesConfigFields.getDeathMessage().replace("$players", playersList.toString()))); + if (customBossEntity.customBossesConfigFields.getAnnouncementPriority() > 0) + Bukkit.broadcastMessage(ChatColorConverter.convert( + customBossEntity.customBossesConfigFields.getDeathMessage().replace("$players", playersList.toString()))); + if (customBossEntity.customBossesConfigFields.getAnnouncementPriority() > 2) + new DiscordSRVAnnouncement(ChatColorConverter.convert( + customBossEntity.customBossesConfigFields.getDeathMessage().replace("$players", playersList.toString()))); + } + } + } + + //sorts damagers + private static HashMap sortByComparator(Map unsortMap, final boolean order) { + + List> list = new LinkedList>(unsortMap.entrySet()); + + // Sorting the list based on values + Collections.sort(list, new Comparator>() { + public int compare(Map.Entry o1, + Map.Entry o2) { + if (order) + return o1.getValue().compareTo(o2.getValue()); + else + return o2.getValue().compareTo(o1.getValue()); + } + }); + + // Maintaining insertion order with the help of LinkedList + HashMap sortedMap = new LinkedHashMap(); + for (Map.Entry entry : list) + sortedMap.put(entry.getKey(), entry.getValue()); + + return sortedMap; + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onEliteMobDeath(EliteMobDeathEvent event) { + if (!(event.getEliteEntity() instanceof CustomBossEntity customBossEntity)) return; + + doLoot(customBossEntity); + doDeathMessage(customBossEntity); + + //untrack from trackable custom bosses + CustomBossEntity.trackableCustomBosses.remove(customBossEntity); + + if (customBossEntity.customBossesConfigFields.getOnDeathCommands() != null && + !customBossEntity.customBossesConfigFields.getOnDeathCommands().isEmpty()) + OnDeathCommands.parseConsoleCommand(customBossEntity.customBossesConfigFields.getOnDeathCommands(), event); + + if (!customBossEntity.customBossesConfigFields.isDropsVanillaLoot()) { + event.getEntityDeathEvent().setDroppedExp(0); + for (ItemStack itemStack : event.getEntityDeathEvent().getDrops()) + itemStack.setAmount(0); + } + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/CustomBossEntity.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/CustomBossEntity.java new file mode 100644 index 000000000..ecc48c5d1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/CustomBossEntity.java @@ -0,0 +1,638 @@ +package com.magmaguy.elitemobs.mobconstructor.custombosses; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobEnterCombatEvent; +import com.magmaguy.elitemobs.api.EliteMobExitCombatEvent; +import com.magmaguy.elitemobs.api.EliteMobRemoveEvent; +import com.magmaguy.elitemobs.api.EliteMobSpawnEvent; +import com.magmaguy.elitemobs.api.internal.RemovalReason; +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.config.EventsConfig; +import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfig; +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import com.magmaguy.elitemobs.dungeons.EMPackage; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.events.CustomEvent; +import com.magmaguy.elitemobs.mobconstructor.*; +import com.magmaguy.elitemobs.mobconstructor.custombosses.transitiveblocks.TransitiveBlock; +import com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs.EliteMobProperties; +import com.magmaguy.elitemobs.playerdata.ElitePlayerInventory; +import com.magmaguy.elitemobs.powers.meta.CustomSummonPower; +import com.magmaguy.elitemobs.powers.meta.ElitePower; +import com.magmaguy.elitemobs.thirdparty.custommodels.CustomModel; +import com.magmaguy.elitemobs.thirdparty.discordsrv.DiscordSRVAnnouncement; +import com.magmaguy.elitemobs.thirdparty.libsdisguises.DisguiseEntity; +import com.magmaguy.elitemobs.utils.ChunkLocationChecker; +import com.magmaguy.elitemobs.utils.CommandRunner; +import com.magmaguy.elitemobs.utils.EventCaller; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.attribute.Attribute; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; + +import javax.annotation.Nullable; +import java.util.*; + +public class CustomBossEntity extends EliteEntity implements Listener, PersistentObject, PersistentMovingEntity { + + @Getter + protected static HashSet trackableCustomBosses = new HashSet<>(); + private final List globalReinforcements = new ArrayList<>(); + @Getter + protected CustomBossesConfigFields customBossesConfigFields; + protected CustomBossEntity customBossMount = null; + protected LivingEntity livingEntityMount = null; + protected CustomBossEntity mount; + protected PersistentObjectHandler persistentObjectHandler = null; + @Setter + protected Location persistentLocation; + protected CustomBossTrail customBossTrail; + @Getter + protected CustomBossBossBar customBossBossBar; + protected Integer escapeMechanism; + @Getter + protected PhaseBossEntity phaseBossEntity = null; + protected String worldName; + private long lastTick = 0; + private int attemptsCounter = 1; + //For use by the phase switcher, which requires passing a specific spawn location for the phase, but when it's for a + //regional boss this causes issues such as reinforcements getting shifted over to the new spawn location + @Getter + @Setter + private Location respawnOverrideLocation = null; + @Getter + @Setter + private EMPackage emPackage = null; + @Setter + private CustomSpawn customSpawn = null; + private int existsFailureCount = 0; + @Getter + @Setter + private boolean isMount = false; + @Getter + @Setter + private CustomModel customModel = null; + @Getter + private boolean normalizedCombat; + @Getter + @Setter + private CustomMusic bossMusic = null; + @Getter + @Setter + private double followDistance; + @Getter + @Setter + private double movementSpeedAttribute; + @Getter + @Setter + private boolean dynamicLevel = false; + public static Set dynamicLevelBossEntities = new HashSet<>(); + + /** + * Uses a builder pattern in order to construct a CustomBossEntity at an arbitrary point in the future. Does not + * spawn an entity until the spawn method is invoked. The customBossesConfigFields value isn't final. + *

+ * The {@link CustomBossEntity#setSpawnLocation(Location)} can be assigned at an arbitrary point in the future before the spawn is invoked. + * Uses: + * - {@link CustomEvent} queueing through the {@link CustomSpawn} system + */ + public CustomBossEntity(CustomBossesConfigFields customBossesConfigFields) { + //This creates a placeholder empty EliteMobEntity to be filled in later + super(); + if (customBossesConfigFields.getSong() != null) + bossMusic = new CustomMusic(customBossesConfigFields.getSong(), this); + //This stores everything that will need to be initialized for the EliteMobEntity + setCustomBossesConfigFields(customBossesConfigFields); + super.setPersistent(customBossesConfigFields.isPersistent()); + //Phases are final + if (customBossesConfigFields.getPhases() != null) + this.phaseBossEntity = new PhaseBossEntity(this); + if (this instanceof RegionalBossEntity) + super.bypassesProtections = true; + this.emPackage = EMPackage.getContent(customBossesConfigFields.getFilename()); + this.followDistance = customBossesConfigFields.getFollowDistance(); + this.movementSpeedAttribute = customBossesConfigFields.getMovementSpeedAttribute() == null ? 0 : customBossesConfigFields.getMovementSpeedAttribute(); + } + + @Nullable + public static CustomBossEntity createCustomBossEntity(String filename) { + CustomBossesConfigFields customBossesConfigFields = CustomBossesConfig.getCustomBoss(filename); + if (customBossesConfigFields == null) + return null; + return new CustomBossEntity(customBossesConfigFields); + } + + @Override + public void setSummoningEntity(EliteEntity summoningEntity) { + this.summoningEntity = summoningEntity; + if (summoningEntity instanceof CustomBossEntity) + this.emPackage = ((CustomBossEntity) summoningEntity).emPackage; + } + + /** + * The customBossesConfigFields is not final, and changes if the boss has phases, loading the configuration from the phases as the fight goes along. + * + * @param customBossesConfigFields Configuration file to be used as the basis of the values of the boss. + */ + public void setCustomBossesConfigFields(CustomBossesConfigFields customBossesConfigFields) { + this.customBossesConfigFields = customBossesConfigFields; + normalizedCombat = customBossesConfigFields.isNormalizedCombat(); + if (phaseBossEntity != null) + normalizedCombat = phaseBossEntity.getPhase1Config().isNormalizedCombat(); + if (MobCombatSettingsConfig.isNormalizeRegionalBosses() && this instanceof RegionalBossEntity) + normalizedCombat = true; + super.setDamageMultiplier(customBossesConfigFields.getDamageMultiplier()); + super.setHealthMultiplier(customBossesConfigFields.getHealthMultiplier()); + super.setEliteLoot(customBossesConfigFields.isDropsEliteMobsLoot()); + super.setRandomLoot(customBossesConfigFields.isDropsRandomLoot()); + super.setVanillaLoot(customBossesConfigFields.isDropsVanillaLoot()); + super.setLevel(customBossesConfigFields.getLevel()); + setPluginName(); + super.elitePowers = ElitePowerParser.parsePowers(customBossesConfigFields, this); + if (this instanceof RegionalBossEntity) { + ((RegionalBossEntity) this).setOnSpawnTransitiveBlocks(TransitiveBlock.serializeTransitiveBlocks(customBossesConfigFields.getOnSpawnBlockStates(), customBossesConfigFields.getFilename())); + ((RegionalBossEntity) this).setOnRemoveTransitiveBlocks(TransitiveBlock.serializeTransitiveBlocks(customBossesConfigFields.getOnRemoveBlockStates(), customBossesConfigFields.getFilename())); + } + } + + public void spawn(Location spawnLocation, int level, boolean silent) { + super.level = level; + super.spawnLocation = spawnLocation; + spawn(spawnLocation, silent); + } + + public void spawn(Location spawnLocation, boolean silent) { + if (spawnLocation != null && spawnLocation.getWorld() != null && lastTick == spawnLocation.getWorld().getFullTime()) + attemptsCounter++; + else + attemptsCounter = 1; + if (spawnLocation != null && spawnLocation.getWorld() != null) + lastTick = spawnLocation.getWorld().getFullTime(); + //Use exists() here as the persistent entities will not try to respawn through this method + if (exists()) { + Logger.warn("Warning: " + customBossesConfigFields.getFilename() + " attempted to double spawn " + attemptsCounter + " times!", true); + return; + } + super.spawnLocation = spawnLocation; + this.persistentLocation = spawnLocation; + spawn(silent); + } + + public void spawn(boolean silent) { + if (livingEntity != null && livingEntity.isValid()) + return; + + if (isPersistent && persistentObjectHandler == null) + persistentObjectHandler = new PersistentObjectHandler(this); + else if (isPersistent) persistentObjectHandler.updatePersistentLocation(spawnLocation); + + if (spawnLocation == null) { + Logger.warn("Boss " + customBossesConfigFields.getFilename() + " has a null location! This is probably due to an incorrectly configured regional location!"); + return; + } + + //This is a bit dumb but -1 is reserved for dynamic levels, commands can force a dynamic to spawn with a level so check that + if (customBossesConfigFields.getLevel() == -1 && level == -1) { + dynamicLevel = true; + getDynamicLevel(spawnLocation); + } + + if (ChunkLocationChecker.locationIsLoaded(spawnLocation) || isMount) { + super.livingEntity = new CustomBossMegaConsumer(this).spawn(); + setNormalizedHealth(); + if (super.livingEntity == null) + Logger.warn("Something just prevented EliteMobs from spawning a Custom Boss! More info up next."); + } + if (!exists()) { + existsFailureCount++; + //this may seem odd but not setting it to null can cause double spawn attempts as the plugin catches itself + //correctly as not have a valid living entity but the checks are set up in such a way that if a living entity + //object is referenced then trying to spawn it again is a double spawn of the same entity + if (super.livingEntity != null) { + //Under very specific chunk loading conditions mobs can double spawn. It's never incorrect to remove the living entity silently when it spawns + super.livingEntity.remove(); + super.livingEntity = null; + } + if (existsFailureCount > 10) { + if (existsFailureCount == 11) { + Logger.warn("EliteMobs tried and failed to spawn " + customBossesConfigFields.getFilename() + " " + existsFailureCount + "times, probably due to regional protections or third party plugin incompatibilities."); + Logger.warn("To avoid cluttering up console, these warnings will now only appear once 6000 attempts for this boss. "); + } + if (existsFailureCount % 6000 == 0) { + Logger.warn("EliteMobs tried and failed to spawn " + customBossesConfigFields.getFilename() + " " + existsFailureCount + "times, probably due to regional protections or third party plugin incompatibilities."); + Logger.warn("To avoid cluttering up console, these warnings will now only appear once 6000 attempts for this boss. "); + } + return; + } + if (existsFailureCount > 1) { + Logger.warn("EliteMobs tried and failed to spawn " + customBossesConfigFields.getFilename() + " " + existsFailureCount + "times, probably due to regional protections."); + return; + } + Logger.warn("EliteMobs tried and failed to spawn " + customBossesConfigFields.getFilename() + " . Possible reasons for this:"); + Logger.warn("- The region was protected by a plugin (most likely)"); + Logger.warn("- The spawn was interfered with by some incompatible third party plugin"); + Logger.warn("Debug data: "); + Logger.warn("Chunk is loaded: " + ChunkLocationChecker.locationIsLoaded(spawnLocation)); + Logger.warn("Attempted spawn location: " + spawnLocation.toString(), true); + return; + } + + //It isn't worth initializing things that will notify players or spawn additional entities until we are certain that the boss has actually spawned + if (livingEntity != null) { + if (bossMusic != null) + bossMusic.start(this); + startBossTrails(); + mountEntity(); + //Prevent custom bosses from getting removed when far away, this is important for mounts and reinforcements in large arenas + getLivingEntity().setRemoveWhenFarAway(false); + } else + persistentLocation = spawnLocation; + + if (!silent) + announceSpawn(); + + if (summoningEntity != null) + summoningEntity.addReinforcement(this); + + if (spawnLocation.getWorld() != null) + for (ElitePower elitePower : elitePowers) + if (elitePower instanceof CustomSummonPower) + ((CustomSummonPower) elitePower).getCustomBossReinforcements().forEach((customBossReinforcement -> { + if (customBossReinforcement.summonType.equals(CustomSummonPower.SummonType.GLOBAL)) + globalReinforcements.add(CustomSummonPower.summonGlobalReinforcement(customBossReinforcement, this)); + })); + + CommandRunner.runCommandFromList(customBossesConfigFields.getOnSpawnCommands(), new ArrayList<>()); + } + + private void setNormalizedHealth() { + if (normalizedCombat) + setNormalizedMaxHealth(); + } + + public void setNormalizedCombat() { + normalizedCombat = true; + if (livingEntity != null) + setNormalizedMaxHealth(); + } + + private void setPluginName() { + if (customBossesConfigFields.getName() == null) return; + if (this.level == -1) + setName(ChatColorConverter.convert(customBossesConfigFields.getName().replace("$level", "?") + .replace("$normalLevel", ChatColorConverter.convert("&2[&a" + "?" + "&2]&f")) + .replace("$minibossLevel", ChatColorConverter.convert("&6〖&e" + "?" + "&6〗&f")) + .replace("$bossLevel", ChatColorConverter.convert("&4『&c" + "?" + "&4』&f")) + .replace("$reinforcementLevel", ChatColorConverter.convert("&8〔&7") + "?" + "&8〕&f") + .replace("$eventBossLevel", ChatColorConverter.convert("&4「&c" + "?" + "&4」&f"))), + false); + else + setName(ChatColorConverter.convert(customBossesConfigFields.getName().replace("$level", this.level + "") + .replace("$normalLevel", ChatColorConverter.convert("&2[&a" + this.level + "&2]&f")) + .replace("$minibossLevel", ChatColorConverter.convert("&6〖&e" + this.level + "&6〗&f")) + .replace("$bossLevel", ChatColorConverter.convert("&4『&c" + this.level + "&4』&f")) + .replace("$reinforcementLevel", ChatColorConverter.convert("&8〔&7") + this.level + "&8〕&f") + .replace("$eventBossLevel", ChatColorConverter.convert("&4「&c" + this.level + "&4」&f"))), + false); + } + + @Override + public void setName(String name, boolean applyToLivingEntity) { + super.setName(name, applyToLivingEntity); + if (isValid() && customModel != null) + customModel.setName(name, true); + } + + @Override + public void setName(EliteMobProperties eliteMobProperties) { + super.setName(eliteMobProperties); + if (isValid() && customModel != null) + customModel.setName(name, DefaultConfig.isAlwaysShowNametags()); + } + + @Override + public void setNameVisible(boolean isVisible) { + //Check if the boss is already dead + if (livingEntity == null) return; + super.setNameVisible(isVisible); + DisguiseEntity.setDisguiseNameVisibility(isVisible, livingEntity, name); + if (customModel != null && isValid()) + customModel.setNameVisible(isVisible); + } + + public void announceSpawn() { + setTracking(); + spawnMessage(); + startEscapeMechanismDelay(); + } + + private void setTracking() { + if (customBossesConfigFields.getAnnouncementPriority() < 1 || + !MobCombatSettingsConfig.isShowCustomBossLocation() || + customBossesConfigFields.getLocationMessage() == null) + return; + trackableCustomBosses.add(this); + customBossBossBar = new CustomBossBossBar(this); + } + + private void spawnMessage() { + if (customBossesConfigFields.getSpawnMessage() == null) return; + if (customBossesConfigFields.getAnnouncementPriority() < 1) return; + if (getLocation() == null) return; + if (getLocation().getWorld() == null) return; + if (!EventsConfig.isAnnouncementBroadcastWorldOnly()) + Bukkit.broadcastMessage(ChatColorConverter.convert(customBossesConfigFields.getSpawnMessage())); + else + for (Player player : getLocation().getWorld().getPlayers()) + player.sendMessage(ChatColorConverter.convert(customBossesConfigFields.getSpawnMessage())); + if (customBossesConfigFields.getAnnouncementPriority() < 3) return; + new DiscordSRVAnnouncement(ChatColorConverter.convert(customBossesConfigFields.getSpawnMessage())); + } + private static BukkitTask dynamicLevelUpdater = null; + + public static void addToUpdatingDynamicLevels(CustomBossEntity customBossEntity){ + if (!customBossEntity.dynamicLevel) return; + dynamicLevelBossEntities.add(customBossEntity); + } + + public static void startUpdatingDynamicLevels(){ + dynamicLevelUpdater = new BukkitRunnable() { + @Override + public void run() { + Iterator iterator = dynamicLevelBossEntities.iterator(); + while (iterator.hasNext()) { + CustomBossEntity customBossEntity = iterator.next(); + if (!customBossEntity.isValid()) { + iterator.remove(); // Remove from the list instead of canceling + continue; // Skip to the next iteration + } + int currentLevel = customBossEntity.getLevel(); + customBossEntity.getDynamicLevel(customBossEntity.getLocation()); + int newLevel = customBossEntity.getLevel(); + + if (currentLevel == newLevel) { + continue; // Skip to the next iteration if the level hasn't changed + } + + // In theory, the damage should update automatically; the only thing that needs updating should be the health + customBossEntity.setMaxHealth(); + customBossEntity.setNormalizedHealth(); + CustomBossMegaConsumer.setName(customBossEntity.getLivingEntity(), customBossEntity, customBossEntity.level); + } + } + }.runTaskTimer(MetadataHandler.PLUGIN, 20 * 5L, 20 * 5L); + } + + public static void shutdown(){ + dynamicLevelUpdater.cancel(); + dynamicLevelBossEntities.clear(); + } + + public void getDynamicLevel(Location bossLocation) { + int bossLevel = 1; + if (bossLocation.getWorld() != null) { + List players = bossLocation.getWorld().getPlayers(); + for (Player player : players) + if (player.getLocation().distanceSquared(bossLocation) <= Math.pow(16L * (Bukkit.getViewDistance() + 2D), 2)) { + ElitePlayerInventory playerInventory = ElitePlayerInventory.getPlayer(player); + if (playerInventory == null) continue; + int level = playerInventory.getNaturalMobSpawnLevel(false); + if (level < bossLevel) continue; + bossLevel = level; + } + } + startUpdatingDynamicLevel(); + super.setLevel(bossLevel); + } + + /** + * Upsettingly due to how chunk generation works regional bosses in general don't play along well with dynamic bosses + */ + private void startUpdatingDynamicLevel() { + if (dynamicLevelUpdater != null) return; + dynamicLevelBossEntities.add(this); + } + + private void startBossTrails() { + customBossTrail = new CustomBossTrail(this); + } + + private void mountEntity() { + mount = CustomBossMount.generateMount(this); + } + + private void startEscapeMechanismDelay() { + escapeMechanism = CustomBossEscapeMechanism.startEscape(customBossesConfigFields.getTimeout(), this); + } + + private void cullReinforcements(boolean cullGlobal) { + if (cullGlobal) + globalReinforcementEntities.forEach(customBossEntity -> customBossEntity.remove(RemovalReason.REINFORCEMENT_CULL)); + for (CustomBossEntity customBossEntity : eliteReinforcementEntities) + if (customBossEntity != null) + customBossEntity.remove(RemovalReason.REINFORCEMENT_CULL); + for (Entity entity : nonEliteReinforcementEntities) + if (entity != null) + entity.remove(); + + if (cullGlobal) + globalReinforcements.clear(); + eliteReinforcementEntities.clear(); + nonEliteReinforcementEntities.clear(); + } + + @Override + public Location getLocation() { + if (getLivingEntity() != null) return getLivingEntity().getLocation(); + else return persistentLocation; + } + + @Override + public Location getPersistentLocation() { + if (persistentLocation == null && getLocation() != null) persistentLocation = getLocation(); + if (persistentLocation == null && spawnLocation != null) persistentLocation = spawnLocation; + return persistentLocation; + } + + public String getWorldName() { + return worldName; + } + + + public double getDamageModifier(Material material) { + return customBossesConfigFields.getDamageModifier(material); + } + + public void resetLivingEntity(LivingEntity livingEntity, CreatureSpawnEvent.SpawnReason spawnReason) { + super.setLivingEntity(livingEntity, spawnReason); + new CustomBossMegaConsumer(this).applyBossFeatures(livingEntity); + } + + @Override + public boolean exists() { + return super.exists() || persistentObjectHandler != null; + } + + @Override + public void fullHeal() { + if (this instanceof InstancedBossEntity) { + return; + } + if (phaseBossEntity == null || phaseBossEntity.isInFirstPhase()) { + super.fullHeal(); + return; + } + phaseBossEntity.resetToFirstPhase(); + super.damagers.clear(); + } + + @Override + public void remove(RemovalReason removalReason) { + dynamicLevelBossEntities.remove(this); + if (livingEntity != null) persistentLocation = livingEntity.getLocation(); + //Remove the living entity + super.remove(removalReason); + //Remove things tied to the living entity + if (customBossTrail != null) customBossTrail.terminateTrails(); + if (livingEntityMount != null) livingEntityMount.remove(); + if (customBossMount != null) customBossMount.remove(RemovalReason.REINFORCEMENT_CULL); + if (customBossesConfigFields.isCullReinforcements() || removalReason.equals(RemovalReason.PHASE_BOSS_RESET)) + cullReinforcements(false); + + if (removalReason.equals(RemovalReason.PHASE_BOSS_PHASE_END)) + if (inCombat) + new EventCaller(new EliteMobExitCombatEvent(this, EliteMobExitCombatEvent.EliteMobExitCombatReason.PHASE_SWITCH)); + + boolean bossInstanceEnd = + removalReason.equals(RemovalReason.KILL_COMMAND) || + removalReason.equals(RemovalReason.DEATH) || + removalReason.equals(RemovalReason.BOSS_TIMEOUT) || + removalReason.equals(RemovalReason.SHUTDOWN) || + removalReason.equals(RemovalReason.ARENA_RESET) || + removalReason.equals(RemovalReason.REMOVE_COMMAND) || + removalReason.equals(RemovalReason.WORLD_UNLOAD) && this instanceof InstancedBossEntity; + + if (!isPersistent) bossInstanceEnd = true; + + if (bossInstanceEnd) { + if (!(this instanceof RegionalBossEntity) || this instanceof InstancedBossEntity) + EntityTracker.getEliteMobEntities().remove(super.eliteUUID); + new EventCaller(new EliteMobRemoveEvent(this, removalReason)); + if (escapeMechanism != null) Bukkit.getScheduler().cancelTask(escapeMechanism); + trackableCustomBosses.remove(this); + if (persistentObjectHandler != null) { + persistentObjectHandler.remove(); + persistentObjectHandler = null; + } + if (customBossBossBar != null) + customBossBossBar.remove(); + if (!removalReason.equals(RemovalReason.SHUTDOWN) && + !removalReason.equals(RemovalReason.DEATH) && + !removalReason.equals(RemovalReason.ARENA_RESET)) + if (phaseBossEntity != null) + phaseBossEntity.silentReset(); + globalReinforcements.forEach((bukkitTask -> { + if (bukkitTask != null) + bukkitTask.cancel(); + })); + globalReinforcements.clear(); + if (!removalReason.equals(RemovalReason.REINFORCEMENT_CULL)) { + if (summoningEntity != null) + summoningEntity.removeReinforcement(this); + if (customSpawn != null) + customSpawn.setKeepTrying(false); + } + + if (customBossesConfigFields.isCullReinforcements()) cullReinforcements(true); + + } else if (removalReason.equals(RemovalReason.CHUNK_UNLOAD) || removalReason.equals(RemovalReason.WORLD_UNLOAD)) + //when bosses get removed due to chunk unloads and are persistent they should remain stored + if (persistentObjectHandler != null) + persistentObjectHandler.updatePersistentLocation(getPersistentLocation()); + + if (!removalReason.equals(RemovalReason.PHASE_BOSS_PHASE_END) && bossMusic != null) { + bossMusic.stop(); + } + } + + @Override + public void chunkLoad() { + respawnOverrideLocation = persistentLocation; + spawn(true); + } + + @Override + public void chunkUnload() { + remove(RemovalReason.CHUNK_UNLOAD); + } + + @Override + public void worldLoad(World world) { + if (spawnLocation != null) + spawnLocation.setWorld(world); + } + + @Override + public void worldUnload() { + remove(RemovalReason.WORLD_UNLOAD); + } + + public static class CustomBossEntityEvents implements Listener { + public static void slowRegionalBoss(RegionalBossEntity regionalBossEntity) { + if (regionalBossEntity.getCustomBossesConfigFields().isAlert()) return; + if (regionalBossEntity.getLivingEntity() == null) return; + if (regionalBossEntity.getMovementSpeedAttribute() > .12) + regionalBossEntity.getLivingEntity().getAttribute(Attribute.GENERIC_MOVEMENT_SPEED).setBaseValue(.12); + regionalBossEntity.getLivingEntity().getAttribute(Attribute.GENERIC_FOLLOW_RANGE) + .setBaseValue(regionalBossEntity.getLivingEntity().getAttribute(Attribute.GENERIC_FOLLOW_RANGE).getBaseValue() / 3D); + } + + @EventHandler + public void slowAndBlindRegionalBossesOutOfCombat(EliteMobExitCombatEvent event) { + if (event.getEliteMobEntity() instanceof RegionalBossEntity regionalBossEntity && regionalBossEntity.exists()) + slowRegionalBoss(regionalBossEntity); + } + + @EventHandler + public void slowAndBlindRegionalBossesOnSpawn(EliteMobSpawnEvent event) { + if (event.getEliteMobEntity() instanceof RegionalBossEntity regionalBossEntity) + slowRegionalBoss(regionalBossEntity); + } + + @EventHandler(ignoreCancelled = true) + public void removeSlowEvent(EliteMobEnterCombatEvent eliteMobEnterCombatEvent) { + if (!(eliteMobEnterCombatEvent.getEliteMobEntity() instanceof RegionalBossEntity regionalBossEntity)) + return; + regionalBossEntity.removeSlow(); + } + + @EventHandler(ignoreCancelled = true) + public void onExitCombat(EliteMobExitCombatEvent event) { + if (!(event.getEliteMobEntity() instanceof CustomBossEntity)) return; + if (!((CustomBossEntity) event.getEliteMobEntity()).customBossesConfigFields.isCullReinforcements()) + return; + ((CustomBossEntity) event.getEliteMobEntity()).cullReinforcements(false); + } + + @EventHandler + public void onEliteSpawnEvent(EliteMobSpawnEvent event){ + if (event.getEliteMobEntity() instanceof CustomBossEntity customBossEntity) + addToUpdatingDynamicLevels(customBossEntity); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/CustomBossEscapeMechanism.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/CustomBossEscapeMechanism.java new file mode 100644 index 000000000..4ca03b294 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/CustomBossEscapeMechanism.java @@ -0,0 +1,37 @@ +package com.magmaguy.elitemobs.mobconstructor.custombosses; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.internal.RemovalReason; +import com.magmaguy.elitemobs.thirdparty.discordsrv.DiscordSRVAnnouncement; +import com.magmaguy.magmacore.util.ChatColorConverter; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +public class CustomBossEscapeMechanism { + + public static Integer startEscapeTicks(int timeout, CustomBossEntity customBossEntity) { + if (timeout < 1) return null; + return Bukkit.getScheduler().scheduleSyncDelayedTask(MetadataHandler.PLUGIN, () -> { + doEscapeMessage(customBossEntity); + }, timeout); + } + + public static Integer startEscape(int timeout, CustomBossEntity customBossEntity) { + if (timeout < 1) return null; + return Bukkit.getScheduler().scheduleSyncDelayedTask(MetadataHandler.PLUGIN, () -> { + doEscapeMessage(customBossEntity); + }, 20L * 60L * timeout); + } + + public static void doEscapeMessage(CustomBossEntity customBossEntity) { + customBossEntity.remove(RemovalReason.BOSS_TIMEOUT); + if (customBossEntity.customBossesConfigFields.getEscapeMessage() == null) return; + if (customBossEntity.customBossesConfigFields.getEscapeMessage().isEmpty()) return; + if (customBossEntity.customBossesConfigFields.getAnnouncementPriority() < 1) return; + for (Player player : Bukkit.getOnlinePlayers()) + if (player.getWorld().equals(customBossEntity.getLocation().getWorld())) + player.sendMessage(ChatColorConverter.convert(customBossEntity.customBossesConfigFields.getEscapeMessage())); + if (customBossEntity.customBossesConfigFields.getAnnouncementPriority() < 3) return; + new DiscordSRVAnnouncement(ChatColorConverter.convert(customBossEntity.customBossesConfigFields.getEscapeMessage())); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/CustomBossMegaConsumer.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/CustomBossMegaConsumer.java new file mode 100644 index 000000000..9056b374f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/CustomBossMegaConsumer.java @@ -0,0 +1,200 @@ +package com.magmaguy.elitemobs.mobconstructor.custombosses; + +import com.magmaguy.elitemobs.EliteMobs; +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.powers.meta.ElitePower; +import com.magmaguy.elitemobs.thirdparty.custommodels.CustomModel; +import com.magmaguy.elitemobs.thirdparty.libsdisguises.DisguiseEntity; +import com.magmaguy.elitemobs.thirdparty.worldguard.WorldGuardCompatibility; +import com.magmaguy.elitemobs.thirdparty.worldguard.WorldGuardFlagChecker; +import com.magmaguy.elitemobs.thirdparty.worldguard.WorldGuardSpawnEventBypasser; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.attribute.Attribute; +import org.bukkit.entity.*; +import org.bukkit.event.entity.CreatureSpawnEvent; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.HashSet; + +public class CustomBossMegaConsumer { + private final CustomBossesConfigFields customBossesConfigFields; + private final HashSet powers; + private final int level; + private final boolean bypassesWorldGuardSpawn; + private final Location spawnLocation; + CustomBossEntity customBossEntity; + + /** + * The objective of this class is to set as many fields as possible as a consumer for spawning a Custom Boss. + *

+ * By setting the values through a consumer, the entity shows up already modified by the time it gets to the spawn event. + * + * @param customBossEntity {@link CustomBossEntity spawning the {@link LivingEntity}} + */ + public CustomBossMegaConsumer(CustomBossEntity customBossEntity) { + this.customBossesConfigFields = customBossEntity.getCustomBossesConfigFields(); + this.customBossEntity = customBossEntity; + if (customBossEntity.getRespawnOverrideLocation() != null) { + this.spawnLocation = customBossEntity.getRespawnOverrideLocation(); + customBossEntity.setRespawnOverrideLocation(null); + } else { + this.spawnLocation = customBossEntity.getSpawnLocation(); + } + this.powers = customBossEntity.getElitePowers(); + this.level = customBossEntity.getLevel(); + this.bypassesWorldGuardSpawn = customBossEntity.getBypassesProtections(); + } + + protected static void setName(LivingEntity livingEntity, CustomBossEntity customBossEntity, int level) { + String parsedName = ChatColorConverter.convert(customBossEntity.customBossesConfigFields.getName().replace("$level", level + "") + .replace("$normalLevel", ChatColorConverter.convert("&2[&a" + level + "&2]&f")) + .replace("$minibossLevel", ChatColorConverter.convert("&6〖&e" + level + "&6〗&f")) + .replace("$bossLevel", ChatColorConverter.convert("&4『&c" + level + "&4』&f")) + .replace("$reinforcementLevel", ChatColorConverter.convert("&8〔&7") + level + "&8〕&f") + .replace("$eventBossLevel", ChatColorConverter.convert("&4「&c" + level + "&4」&f"))); + livingEntity.setCustomName(parsedName); + livingEntity.setCustomNameVisible(DefaultConfig.isAlwaysShowNametags()); + DisguiseEntity.setDisguiseNameVisibility(DefaultConfig.isAlwaysShowNametags(), livingEntity, parsedName); + customBossEntity.setName(parsedName, false); + } + + /** + * Attempts to spawn a {@link CustomBossEntity} whose spawn location has already been set. + * + * @return Whether the spawn succeeded or not. + */ + public LivingEntity spawn() { + if (spawnLocation == null) { + Logger.warn("Custom Boss Entity " + customBossesConfigFields.getFilename() + " tried to spawn without a valid spawn location getting assigned! Report this to the developer!"); + return null; + } + if (EliteMobs.worldGuardIsEnabled) { + if (!WorldGuardFlagChecker.checkFlag(spawnLocation, WorldGuardCompatibility.getELITEMOBS_SPAWN_FLAG())) { + Logger.warn("Attempted to spawn " + customBossesConfigFields.getFilename() + " in location " + + spawnLocation + " which is protected by WorldGuard with elitemobs-spawning deny! This should not have happened."); + return null; + } + if (bypassesWorldGuardSpawn || customBossEntity instanceof RegionalBossEntity) + WorldGuardSpawnEventBypasser.forceSpawn(); + } + + LivingEntity livingEntity = (LivingEntity) spawnLocation.getWorld().spawn(spawnLocation, + customBossesConfigFields.getEntityType().getEntityClass(), + entity -> applyBossFeatures((LivingEntity) entity)); + setCustomModel(livingEntity); + customBossEntity.setLivingEntity(livingEntity, CreatureSpawnEvent.SpawnReason.CUSTOM); + return livingEntity; + } + + private void setBaby(LivingEntity livingEntity) { + if (livingEntity instanceof Ageable) + if (customBossesConfigFields.isBaby()) + ((Ageable) livingEntity).setBaby(); + else + ((Ageable) livingEntity).setAdult(); + } + + + private void setDisguise(LivingEntity livingEntity) { + if (customBossesConfigFields.getDisguise() == null || + CustomModel.customModelsEnabled() && + customBossesConfigFields.isCustomModelExists() && + customBossesConfigFields.getCustomModel() != null && + !customBossesConfigFields.getCustomModel().isEmpty()) + return; + if (!Bukkit.getPluginManager().isPluginEnabled("LibsDisguises")) return; + try { + DisguiseEntity.disguise(customBossesConfigFields.getDisguise(), livingEntity, customBossesConfigFields.getCustomDisguiseData(), customBossesConfigFields.getFilename()); + } catch (Exception ex) { + Logger.warn("Failed to load LibsDisguises disguise correctly!"); + } + } + + private void setCustomModel(LivingEntity livingEntity) { + if (!customBossesConfigFields.isCustomModelExists()) return; + if (customBossesConfigFields.getCustomModel() == null || customBossesConfigFields.getCustomModel().isEmpty()) + return; + try { + customBossEntity.setCustomModel(CustomModel.generateCustomModel(livingEntity, customBossesConfigFields.getCustomModel(), customBossEntity.getName())); + } catch (Exception exception) { + customBossEntity.setCustomModel(null); + Logger.warn("Failed to initialize Custom Model for Custom Boss " + customBossesConfigFields.getFilename()); + exception.printStackTrace(); + } + } + + private void setFrozen(LivingEntity livingEntity) { + if (!customBossesConfigFields.isFrozen()) return; + livingEntity.getAttribute(Attribute.GENERIC_MOVEMENT_SPEED).setBaseValue(0); + livingEntity.setCollidable(false); + } + + private void setEquipment(LivingEntity livingEntity) { + try { + livingEntity.getEquipment().setHelmet(customBossesConfigFields.getHelmet()); + livingEntity.getEquipment().setChestplate(customBossesConfigFields.getChestplate()); + livingEntity.getEquipment().setLeggings(customBossesConfigFields.getLeggings()); + livingEntity.getEquipment().setBoots(customBossesConfigFields.getBoots()); + livingEntity.getEquipment().setItemInMainHand(customBossesConfigFields.getMainHand()); + livingEntity.getEquipment().setItemInOffHand(customBossesConfigFields.getOffHand()); + if (livingEntity.getEquipment().getHelmet() != null) { + ItemMeta helmetMeta = livingEntity.getEquipment().getHelmet().getItemMeta(); + if (helmetMeta != null) { + helmetMeta.setUnbreakable(true); + livingEntity.getEquipment().getHelmet().setItemMeta(helmetMeta); + } + } + } catch (Exception ex) { + Logger.warn("Tried to assign a material slot to an invalid entity! Boss is from file" + customBossesConfigFields.getFilename()); + } + } + + public void applyBossFeatures(LivingEntity livingEntity) { + for (ElitePower elitePower : powers) + elitePower.applyPowers(livingEntity); + setEquipment(livingEntity); + setBaby(livingEntity); + setDisguise(livingEntity); + setName(livingEntity, customBossEntity, level); + setFollowRange(livingEntity); + setMovementSpeed(livingEntity); + setFrozen(livingEntity); + setScale(livingEntity); + customBossEntity.setMovementSpeedAttribute(livingEntity.getAttribute(Attribute.GENERIC_MOVEMENT_SPEED).getBaseValue()); + customBossEntity.setFollowDistance(livingEntity.getAttribute(Attribute.GENERIC_FOLLOW_RANGE).getBaseValue()); + + if (livingEntity.getType().equals(EntityType.ENDER_DRAGON)) { + ((EnderDragon) livingEntity).setPhase(EnderDragon.Phase.CIRCLING); + if (((EnderDragon) livingEntity).getDragonBattle() != null) + ((EnderDragon) livingEntity).getDragonBattle().generateEndPortal(false); + } + + if (livingEntity instanceof Slime) { + ((Slime) livingEntity).setSize(customBossEntity.getCustomBossesConfigFields().getSlimeSize()); + } + customBossEntity.setUnsyncedLivingEntity(livingEntity); + EntityTracker.registerEliteMob(customBossEntity, livingEntity); + } + + private void setFollowRange(LivingEntity livingEntity) { + if (customBossesConfigFields.getFollowDistance() != null && + customBossesConfigFields.getFollowDistance() > 0 && + livingEntity instanceof Mob) + livingEntity.getAttribute(Attribute.GENERIC_FOLLOW_RANGE).setBaseValue(customBossesConfigFields.getFollowDistance()); + } + + private void setMovementSpeed(LivingEntity livingEntity) { + if (customBossesConfigFields.getMovementSpeedAttribute() != null) + livingEntity.getAttribute(Attribute.GENERIC_MOVEMENT_SPEED).setBaseValue(customBossesConfigFields.getMovementSpeedAttribute()); + } + + private void setScale(LivingEntity livingEntity) { + if (customBossesConfigFields.getScale() != 1D) + livingEntity.getAttribute(Attribute.GENERIC_SCALE).setBaseValue(customBossesConfigFields.getScale()); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/CustomBossMount.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/CustomBossMount.java new file mode 100644 index 000000000..66e8d4b28 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/CustomBossMount.java @@ -0,0 +1,69 @@ +package com.magmaguy.elitemobs.mobconstructor.custombosses; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.combatsystem.antiexploit.PreventMountExploit; +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfig; +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; +import org.bukkit.scheduler.BukkitRunnable; + +public class CustomBossMount { + private CustomBossMount() { + } + + //todo: Now that the boss megaconsumer exists, it's possible that delaying the mount by 5 ticks is no longer necessary and that we can just put it in the consumer... maybe + public static CustomBossEntity generateMount(CustomBossEntity customBossEntity) { + if (customBossEntity.customBossesConfigFields.getMountedEntity() == null) return null; + if (customBossEntity.getLivingEntity() == null) { + Logger.warn("Could not spawn mount for boss " + customBossEntity.customBossesConfigFields.getFilename() + " because the boss has no living entity! This probably means some other plugin is preventing this boss from spawning."); + return null; + } + try { + EntityType entityType = EntityType.valueOf(customBossEntity.customBossesConfigFields.getMountedEntity()); + LivingEntity livingEntity = (LivingEntity) customBossEntity.getLivingEntity().getWorld() + .spawnEntity(customBossEntity.getLivingEntity().getLocation(), entityType); + PreventMountExploit.bypass = true; + livingEntity.addPassenger(customBossEntity.getLivingEntity()); + livingEntity.setRemoveWhenFarAway(false); + customBossEntity.livingEntityMount = livingEntity; + } catch (Exception ex) { + //This runs when it's not an API entity + CustomBossesConfigFields customBossesConfigFields = CustomBossesConfig.getCustomBoss(customBossEntity.customBossesConfigFields.getMountedEntity()); + if (customBossesConfigFields != null) { + CustomBossEntity mountEntity = CustomBossEntity.createCustomBossEntity(customBossEntity.customBossesConfigFields.getMountedEntity()); + if (mountEntity == null) { + Logger.warn("Mount for boss " + customBossEntity.getCustomBossesConfigFields().getFilename() + " is not valid!"); + return null; + } + mountEntity.setSpawnLocation(customBossEntity.getLivingEntity().getLocation()); + mountEntity.setBypassesProtections(customBossEntity.getBypassesProtections()); + mountEntity.setPersistent(false); + mountEntity.setMount(true); + mountEntity.spawn(false); + + new BukkitRunnable() { + @Override + public void run() { + if (!mountEntity.isValid()) return; + if (customBossEntity.getLivingEntity() == null) return; + if (mountEntity.getCustomModel() != null) + mountEntity.getCustomModel().addPassenger(customBossEntity); + else { + PreventMountExploit.bypass = true; + if (mountEntity.getLivingEntity() != null) + mountEntity.getLivingEntity().addPassenger(customBossEntity.getLivingEntity()); + } + customBossEntity.customBossMount = mountEntity; + } + }.runTaskLater(MetadataHandler.PLUGIN, 5); + return mountEntity; + } + + Logger.warn("Attempted to make Custom Boss " + customBossEntity.customBossesConfigFields.getFilename() + " mount invalid" + + " entity or boss " + customBossEntity.customBossesConfigFields.getMountedEntity() + " . Fix this in the configuration file."); + } + return null; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/CustomBossTaunts.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/CustomBossTaunts.java new file mode 100644 index 000000000..6d7a6665c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/CustomBossTaunts.java @@ -0,0 +1,29 @@ +package com.magmaguy.elitemobs.mobconstructor.custombosses; + +import com.magmaguy.elitemobs.api.EliteMobDamagedEvent; +import com.magmaguy.elitemobs.api.PlayerDamagedByEliteMobEvent; +import com.magmaguy.elitemobs.powers.Taunt; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class CustomBossTaunts implements Listener { + @EventHandler + public void onDamagedMessages(EliteMobDamagedEvent eliteMobDamagedEvent) { + if (!(eliteMobDamagedEvent.getEliteEntity() instanceof CustomBossEntity)) return; + if (((CustomBossEntity) eliteMobDamagedEvent.getEliteEntity()).getCustomBossesConfigFields().getOnDamagedMessages() == null || + ((CustomBossEntity) eliteMobDamagedEvent.getEliteEntity()).getCustomBossesConfigFields().getOnDamagedMessages().isEmpty()) + return; + Taunt.nameTagProcessor(eliteMobDamagedEvent.getEliteEntity(), eliteMobDamagedEvent.getEliteEntity().getLivingEntity(), + ((CustomBossEntity) eliteMobDamagedEvent.getEliteEntity()).getCustomBossesConfigFields().getOnDamagedMessages()); + } + + @EventHandler + public void onDamageMessages(PlayerDamagedByEliteMobEvent playerDamagedByEliteMobEvent) { + if (!(playerDamagedByEliteMobEvent.getEliteMobEntity() instanceof CustomBossEntity)) return; + if (((CustomBossEntity) playerDamagedByEliteMobEvent.getEliteMobEntity()).getCustomBossesConfigFields().getOnDamageMessages() == null || + ((CustomBossEntity) playerDamagedByEliteMobEvent.getEliteMobEntity()).getCustomBossesConfigFields().getOnDamageMessages().isEmpty()) + return; + Taunt.nameTagProcessor(playerDamagedByEliteMobEvent.getEliteMobEntity(), playerDamagedByEliteMobEvent.getEliteMobEntity().getLivingEntity(), + ((CustomBossEntity) playerDamagedByEliteMobEvent.getEliteMobEntity()).getCustomBossesConfigFields().getOnDamageMessages()); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/CustomBossTrail.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/CustomBossTrail.java new file mode 100644 index 000000000..8bac40bfb --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/CustomBossTrail.java @@ -0,0 +1,114 @@ +package com.magmaguy.elitemobs.mobconstructor.custombosses; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.internal.RemovalReason; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.powerstances.VisualItemInitializer; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Particle; +import org.bukkit.entity.Item; +import org.bukkit.entity.LivingEntity; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class CustomBossTrail { + + private final CustomBossEntity customBossEntity; + private final ArrayList bukkitTasks = new ArrayList<>(); + private LivingEntity livingEntity; + + public CustomBossTrail(CustomBossEntity customBossEntity) { + this.customBossEntity = customBossEntity; + this.livingEntity = customBossEntity.getLivingEntity(); + startBossTrails(); + } + + private void startBossTrails() { + if (customBossEntity.customBossesConfigFields.getTrails() == null) return; + for (String string : customBossEntity.customBossesConfigFields.getTrails()) { + try { + Particle particle = Particle.valueOf(string); + if (particle.equals(Particle.BLOCK)) return; + doParticleTrail(particle); + } catch (Exception ex) { + } + try { + Material material = Material.valueOf(string); + doItemTrail(material); + } catch (Exception ex) { + } + } + } + + private void doParticleTrail(Particle particle) { + if (particle.equals(Particle.BLOCK_MARKER) || + particle.equals(Particle.ENTITY_EFFECT) || + particle.equals(Particle.DUST_PILLAR) || + particle.equals(Particle.FALLING_DUST) || + particle.equals(Particle.BLOCK) || + particle.equals(Particle.ITEM) || + particle.equals(Particle.DUST)) + return; + bukkitTasks.add(new BukkitRunnable() { + @Override + public void run() { + //In case of boss death or chunk unload, stop the effect + if (!livingEntity.isValid()) { + cancel(); + return; + } + //All conditions cleared, do the boss flair effect + Location entityCenter = livingEntity.getLocation().clone().add(0, livingEntity.getHeight() / 2, 0); + livingEntity.getWorld().spawnParticle(particle, entityCenter, 1, 0.1, 0.1, 0.1, 0.05); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1)); + } + + private void doItemTrail(Material material) { + bukkitTasks.add(new BukkitRunnable() { + + @Override + public void run() { + //In case of boss death, stop the effect + if (!livingEntity.isValid()) { + cancel(); + return; + } + //All conditions cleared, do the boss flair effect + Location entityCenter = livingEntity.getLocation().clone().add(0, livingEntity.getHeight() / 2, 0); + Item item = VisualItemInitializer.initializeItem(ItemStackGenerator.generateItemStack + (material, "visualItem", List.of(ThreadLocalRandom.current().nextDouble() + "")), entityCenter); + item.setVelocity(new Vector( + ThreadLocalRandom.current().nextDouble() / 5 - 0.10, + ThreadLocalRandom.current().nextDouble() / 5 - 0.10, + ThreadLocalRandom.current().nextDouble() / 5 - 0.10)); + new BukkitRunnable() { + @Override + public void run() { + item.remove(); + EntityTracker.unregister(item, RemovalReason.EFFECT_TIMEOUT); + } + }.runTaskLater(MetadataHandler.PLUGIN, 20); + + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 5)); + } + + public void terminateTrails() { + for (BukkitTask bukkitTask : bukkitTasks) bukkitTask.cancel(); + bukkitTasks.clear(); + } + + public void restartTrails() { + this.livingEntity = customBossEntity.getLivingEntity(); + startBossTrails(); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/CustomMusic.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/CustomMusic.java new file mode 100644 index 000000000..dc548b0b9 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/CustomMusic.java @@ -0,0 +1,243 @@ +package com.magmaguy.elitemobs.mobconstructor.custombosses; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.PlayerTeleportEvent; +import com.magmaguy.elitemobs.config.dungeonpackager.DungeonPackagerConfigFields; +import com.magmaguy.elitemobs.dungeons.EliteMobsWorld; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; + +import java.util.HashMap; +import java.util.Map; + + +public class CustomMusic { + private static final HashMap playerSongSingleton = new HashMap<>(); + private static final HashMap dungeonMusic = new HashMap<>(); + private final HashMap players = new HashMap<>(); + private final ContentType contentType; + private CustomBossEntity customBossEntity = null; + private DungeonPackagerConfigFields dungeonPackagerConfigFields = null; + @Getter + private String name; + @Getter + private int durationTicks; + @Getter + private String name2 = null; + @Getter + private int durationTicks2 = -1; + private BukkitTask bossScannerTask = null; + private BukkitTask songTask = null; + private World world; + + //Format: name=rsp.name length=durations_milliseconds->name=rsp.name length=duration_milliseconds + public CustomMusic(String rawString, CustomBossEntity customBossEntity) { + this.customBossEntity = customBossEntity; + contentType = ContentType.BOSS; + if (!rawString.contains("->")) { + parse(rawString, 1); + } else { + String[] rawEntries = rawString.split("->"); + parse(rawEntries[0], 1); + parse(rawEntries[1], 2); + } + } + + public CustomMusic(String rawString, DungeonPackagerConfigFields dungeonPackagerConfigFields, World world) { + this.world = world; + this.dungeonPackagerConfigFields = dungeonPackagerConfigFields; + contentType = ContentType.DUNGEON; + if (!rawString.contains("->")) { + parse(rawString, 1); + } else { + String[] rawEntries = rawString.split("->"); + parse(rawEntries[0], 1); + parse(rawEntries[1], 2); + } + dungeonMusic.put(world, this); + } + + public static void shutdown() { + dungeonMusic.clear(); + playerSongSingleton.clear(); + } + + private void parse(String rawString, int entryNumber) { + String[] strings = rawString.split(" "); + for (String string : strings) { + String[] parsed = string.split("="); + switch (parsed[0]) { + case "name": + if (entryNumber == 1) name = parsed[1]; + else name2 = parsed[1]; + break; + case "length": + if (entryNumber == 1) { + durationTicks = (int) (Integer.parseInt(parsed[1]) / 1000D * 20D); + } else { + durationTicks2 = (int) (Integer.parseInt(parsed[1]) / 1000D * 20D); + } + break; + default: + Logger.warn("Failed to get value for boss music!"); + } + } + } + + public void start(CustomBossEntity customBossEntity) { + if (bossScannerTask != null) { + bossScannerTask.cancel(); + } + bossScannerTask = new BukkitRunnable() { + @Override + public void run() { + if (!customBossEntity.exists()) { + stop(); + return; + } + play(customBossEntity.getLocation(), customBossEntity.getCustomBossesConfigFields().getFollowDistance()); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + public void stop() { + if (bossScannerTask != null) { + bossScannerTask.cancel(); + } + for (Map.Entry entry : players.entrySet()) { + entry.getKey().stopSound(name); + if (name2 != null) + entry.getKey().stopSound(name2); + entry.getValue().songTask.cancel(); + } + } + + private void play(Location location, double range) { + location.getWorld() + .getNearbyEntities( + location, + range, + range, + range, + entity -> entity.getType().equals(EntityType.PLAYER)) + .forEach(player -> { + CustomMusic currentCustomMusic = playerSongSingleton.get((Player) player); + if (currentCustomMusic != null && !currentCustomMusic.equals(this)) { + currentCustomMusic.songTask.cancel(); + ((Player) player).stopSound(currentCustomMusic.name); + if (name2 != null) + ((Player) player).stopSound(currentCustomMusic.name2); + playerSongSingleton.remove((Player) player); + } + if (!players.containsKey((Player) player)) { + ((Player) player).playSound(player.getLocation(), name, 1f, 1f); + startLoopingTask((Player) player, durationTicks); + } + }); + } + + private void play(Player player) { + startLoopingTask(player, durationTicks); + players.put(player, this); + //Boss music overrides dungeon music + if (playerSongSingleton.containsKey(player) && !players.get(player).equals(this)) return; + player.playSound(player.getLocation(), name, 1f, 1f); + playerSongSingleton.put(player, this); + } + + private void startLoopingTask(Player player, int durationTicks) { + //Case for a song with no transition + CustomMusic customMusic = this; + if (name2 == null) { + songTask = new BukkitRunnable() { + @Override + public void run() { + if (contentType == ContentType.BOSS && !customBossEntity.exists() || + contentType == ContentType.BOSS && player.getLocation().distanceSquared(customBossEntity.getLivingEntity().getLocation()) > Math.pow(customBossEntity.getFollowDistance() * 1.5, 2) || + contentType == ContentType.DUNGEON && !player.getWorld().equals(world)) { + cancel(); + players.remove(player); + playerSongSingleton.remove(player); + return; + } + if (playerSongSingleton.containsKey(player) && !players.get(player).equals(customMusic)) return; + if (!playerSongSingleton.containsKey(player)) playerSongSingleton.put(player, customMusic); + player.playSound(player.getLocation(), name, 1f, 1f); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, durationTicks); + } + //case for a song with a transition + else { + player.playSound(player.getLocation(), name, 1f, 1f); + songTask = new BukkitRunnable() { + @Override + public void run() { + if (contentType == ContentType.BOSS && !customBossEntity.exists() || + contentType == ContentType.BOSS && player.getLocation().distanceSquared(customBossEntity.getLivingEntity().getLocation()) > Math.pow(customBossEntity.getFollowDistance() * 1.5, 2) || + contentType == ContentType.DUNGEON && !player.getWorld().equals(world)) { + cancel(); + players.remove(player); + playerSongSingleton.remove(player); + return; + } + player.playSound(player.getLocation(), name2, 1f, 1f); + } + }.runTaskTimer(MetadataHandler.PLUGIN, durationTicks, durationTicks2); + } + + players.put(player, this); + } + + private enum ContentType { + BOSS, + DUNGEON + } + + public static class CustomMusicEvents implements Listener { + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onTeleport(PlayerTeleportEvent event) { + EliteMobsWorld eliteMobsWorld = EliteMobsWorld.getEliteMobsWorld(event.getDestination().getWorld().getUID()); + if (eliteMobsWorld == null || eliteMobsWorld.getDungeonPackagerConfigFields().getSong() == null) return; + CustomMusic customMusic = dungeonMusic.get(event.getDestination().getWorld()); + if (customMusic == null) { + Logger.warn("aFailed to get custom music for " + event.getDestination().getWorld().getName()); + return; + } + //Wait for a second after teleporting, just to make sure + new BukkitRunnable() { + @Override + public void run() { + customMusic.play(event.getPlayer()); + } + }.runTaskLater(MetadataHandler.PLUGIN, 20); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onLogin(PlayerJoinEvent event) { + EliteMobsWorld eliteMobsWorld = EliteMobsWorld.getEliteMobsWorld(event.getPlayer().getWorld().getUID()); + if (eliteMobsWorld == null || eliteMobsWorld.getDungeonPackagerConfigFields().getSong() == null) return; + CustomMusic customMusic = dungeonMusic.get(event.getPlayer().getWorld()); + if (customMusic == null) { + Logger.warn("Failed to get custom music for " + event.getPlayer().getWorld().getName()); + return; + } + //Wait for a second after teleporting, just to make sure + new BukkitRunnable() { + @Override + public void run() { + customMusic.play(event.getPlayer()); + } + }.runTaskLater(MetadataHandler.PLUGIN, 20); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/ElitePowerParser.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/ElitePowerParser.java new file mode 100644 index 000000000..5e5a59a2e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/ElitePowerParser.java @@ -0,0 +1,120 @@ +package com.magmaguy.elitemobs.mobconstructor.custombosses; + +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.BonusCoins; +import com.magmaguy.elitemobs.powers.meta.CustomSummonPower; +import com.magmaguy.elitemobs.powers.meta.ElitePower; +import com.magmaguy.elitemobs.powers.scripts.EliteScript; +import com.magmaguy.elitemobs.utils.MapListInterpreter; +import com.magmaguy.magmacore.util.Logger; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; + +public class ElitePowerParser { + + public static HashSet parsePowers(CustomBossesConfigFields customBossesConfigFields, CustomBossEntity customBossEntity) { + HashSet elitePowers = new HashSet<>(EliteScript.generateBossScripts(customBossesConfigFields.getEliteScript(), customBossEntity)); + if (customBossesConfigFields.getPowers() == null) return elitePowers; + CustomSummonPower customSummonPower = null; + List powers = new ArrayList<>(customBossesConfigFields.getPowers()); + if (powers == null) return elitePowers; + //Parses "traditional" powers + for (Object powerObject : powers) { + if (powerObject instanceof String powerName) { + if (powerName.split(":")[0].equalsIgnoreCase("summon") + || powerName.split(":")[0].equalsIgnoreCase("summonable")) + if (customSummonPower == null) { + customSummonPower = new CustomSummonPower(powerName, customBossesConfigFields); + elitePowers.add(customSummonPower); + } else + customSummonPower.addEntry(powerName, customBossesConfigFields.getFilename()); + else { + String[] parsedPowerName = powerName.split(":"); + ElitePower elitePower = addPower(parsedPowerName[0], elitePowers, customBossesConfigFields, customBossEntity); + if (elitePower == null) continue; + if (elitePower.getPowersConfigFields().getFilename().equals("bonus_coins.yml")) + if (parsedPowerName.length > 1) + try { + ((BonusCoins) elitePower).setCoinMultiplier(Double.parseDouble(parsedPowerName[1])); + } catch (Exception ex) { + Logger.warn("Multiplier " + parsedPowerName[1] + " for Bonus Coins power is not a valid multiplier!"); + } + } + //Parses more advanced powers, like reinforcements and powers with difficulty settings + } else if (powerObject instanceof Map map) { + + boolean isReinforcementsConfig = false; + for (Object key : map.keySet()) { + if (((String) key).equalsIgnoreCase("summontype")) { + isReinforcementsConfig = true; + break; + } + } + + if (customBossEntity instanceof InstancedBossEntity instancedBossEntity) { + List difficulties = new ArrayList<>(); + for (Map.Entry entry : map.entrySet()) { + if (((String) entry.getKey()).equalsIgnoreCase("difficultyID")) { + difficulties = MapListInterpreter.parseStringList((String) entry.getKey(), entry.getValue(), customBossesConfigFields.getFilename()); + break; + } + } + //If the boss is in an instanced dungeon with difficulties and the difficulty doesn't match, skip assigning that power + if (!difficulties.isEmpty() && + instancedBossEntity.getDungeonInstance() != null && //Annoyingly this has to be done in two passes for the instanced bosses due to initialization + !difficulties.contains(instancedBossEntity.getDungeonInstance().getDifficultyID())) + continue; + } + + if (isReinforcementsConfig) + //Parse reinforcements bosses + if (customSummonPower == null) { + customSummonPower = new CustomSummonPower(powerObject, customBossesConfigFields); + elitePowers.add(customSummonPower); + } else + customSummonPower.addEntry(powerObject, customBossesConfigFields.getFilename()); + else { + //Parse powers with difficulties in them + String string = MapListInterpreter.parseString("filename", map.get("filename"), customBossesConfigFields.getFilename()); + if (string != null && !string.isEmpty()) { + PowersConfigFields powersConfigFields = PowersConfig.getPower(string); + if (powersConfigFields == null) { + Logger.warn("Invalid power name " + string + " in file " + customBossesConfigFields.getFilename()); + } else { + addPower(string, elitePowers, customBossesConfigFields, customBossEntity); + } + } else + Logger.warn("No valid power name in boss config " + customBossesConfigFields.getFilename()); + } + } + } + return elitePowers; + } + + private static ElitePower addPower(String powerName, HashSet elitePowers, CustomBossesConfigFields customBossesConfigFields, EliteEntity eliteEntity) { + PowersConfigFields powersConfigFields = PowersConfig.getPower(powerName); + if (powersConfigFields != null) { + if (!powersConfigFields.getEliteScriptBlueprints().isEmpty()) { + elitePowers.addAll(EliteScript.generateBossScripts(powersConfigFields.getEliteScriptBlueprints(), eliteEntity)); + return null; + } + ElitePower elitePower; + try { + elitePower = powersConfigFields.getElitePowerClass().newInstance(); + elitePowers.add(elitePower); + return elitePower; + } catch (Exception ex) { + Logger.warn("Could not process power " + powerName); + return null; + } + } else + Logger.warn("Warning: power name " + powerName + " for boss " + customBossesConfigFields.getFilename() + " is not registered! Skipping it for custom mob construction..."); + return null; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/InstancedBossEntity.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/InstancedBossEntity.java new file mode 100644 index 000000000..c3e2d980b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/InstancedBossEntity.java @@ -0,0 +1,111 @@ +package com.magmaguy.elitemobs.mobconstructor.custombosses; + +import com.google.common.collect.ArrayListMultimap; +import com.magmaguy.elitemobs.api.internal.RemovalReason; +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import com.magmaguy.elitemobs.instanced.dungeons.DungeonInstance; +import com.magmaguy.elitemobs.mobconstructor.PersistentMovingEntity; +import com.magmaguy.elitemobs.mobconstructor.PersistentObject; +import com.magmaguy.elitemobs.playerdata.ElitePlayerInventory; +import com.magmaguy.elitemobs.utils.ConfigurationLocation; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.attribute.Attribute; + +import java.util.ArrayList; +import java.util.List; + +public class InstancedBossEntity extends RegionalBossEntity implements PersistentObject, PersistentMovingEntity { + private static final ArrayListMultimap instancedBossEntities = ArrayListMultimap.create(); + @Getter + private final DungeonInstance dungeonInstance; + + public InstancedBossEntity(CustomBossesConfigFields customBossesConfigFields, Location location, DungeonInstance dungeonInstance) { + super(customBossesConfigFields, location, false, true); + this.dungeonInstance = dungeonInstance; + super.elitePowers = ElitePowerParser.parsePowers(customBossesConfigFields, this); + if (level == -1) { + if (dungeonInstance.getPlayers().isEmpty()) + Logger.warn("Failed to get players for new instance when assigning dynamic level! The bosses will default to level 1."); + else + level = ElitePlayerInventory.getPlayer(dungeonInstance.getPlayers().stream().findFirst().get()).getNaturalMobSpawnLevel(true); + } + } + + public static void shutdown() { + instancedBossEntities.clear(); + } + + public static void add(String stringLocation, CustomBossesConfigFields customBossesConfigFields) { + String blueprintWorldName = stringLocation.split(",")[0]; + if (blueprintWorldName == null || blueprintWorldName.isEmpty()) { + Logger.warn("Failed to get blueprint world location for custom boss " + customBossesConfigFields.getFilename() + " !"); + return; + } + instancedBossEntities.put(blueprintWorldName, new InstancedBossContainer(ConfigurationLocation.serialize(stringLocation, true), customBossesConfigFields)); + } + + public static List initializeInstancedBosses(String blueprintWorldName, World newWorld, int playerCount, DungeonInstance dungeonInstance) { + List newDungeonList = new ArrayList<>(); + List rawBosses = instancedBossEntities.get(blueprintWorldName); + for (InstancedBossContainer containers : rawBosses) { + Location newLocation = containers.getLocation().clone(); + newLocation.setWorld(newWorld); + InstancedBossEntity newEntity = new InstancedBossEntity(containers.getCustomBossesConfigFields(), newLocation, dungeonInstance); + newEntity.spawn(false); + newDungeonList.add(newEntity); + } + return newDungeonList; + } + + public void setNormalizedMaxHealth(int playerCount) { + super.setNormalizedMaxHealth(); + if (playerCount < 2) return; + double normalizedDungeonMaxHealth = super.getMaxHealth() * .75 * playerCount; + super.maxHealth = normalizedDungeonMaxHealth; + super.health = maxHealth; + if (livingEntity != null) { + livingEntity.getAttribute(Attribute.GENERIC_MAX_HEALTH).setBaseValue(maxHealth); + livingEntity.setHealth(maxHealth); + } + } + + @Override + public void setMaxHealth() { + super.setNormalizedMaxHealth(); + if (dungeonInstance.getPlayers().size() < 2) return; + double normalizedDungeonMaxHealth = super.getMaxHealth() * .75 * dungeonInstance.getPlayers().size(); + super.maxHealth = normalizedDungeonMaxHealth; + if (health == null) { + if (livingEntity != null) livingEntity.setHealth(maxHealth); + this.health = maxHealth; + } + //This is useful for phase boss entities that spawn in unloaded chunks and shouldn't full heal between phases, like in dungeons + else if (livingEntity != null) + livingEntity.setHealth(Math.min(health, livingEntity.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue())); + } + + @Override + public void remove(RemovalReason removalReason) { + super.remove(removalReason); + if (removalReason.equals(RemovalReason.WORLD_UNLOAD)) + if (persistentObjectHandler != null) { + persistentObjectHandler.remove(); + persistentObjectHandler = null; + } + } + + private static class InstancedBossContainer { + @Getter + private final Location location; + @Getter + private final CustomBossesConfigFields customBossesConfigFields; + + public InstancedBossContainer(Location location, CustomBossesConfigFields customBossesConfigFields) { + this.location = location; + this.customBossesConfigFields = customBossesConfigFields; + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/PhaseBossEntity.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/PhaseBossEntity.java new file mode 100644 index 000000000..6bad14855 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/PhaseBossEntity.java @@ -0,0 +1,168 @@ +package com.magmaguy.elitemobs.mobconstructor.custombosses; + +import com.magmaguy.elitemobs.api.EliteMobDamagedEvent; +import com.magmaguy.elitemobs.api.EliteMobDeathEvent; +import com.magmaguy.elitemobs.api.ElitePhaseSwitchEvent; +import com.magmaguy.elitemobs.api.internal.RemovalReason; +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfig; +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import com.magmaguy.elitemobs.utils.ConfigurationLocation; +import com.magmaguy.elitemobs.utils.EventCaller; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.Location; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; + +import java.util.ArrayList; +import java.util.List; + +public class PhaseBossEntity { + + private final CustomBossEntity customBossEntity; + @Getter + private List bossPhases = new ArrayList(); + private BossPhase currentPhase = null; + private Location originalSpawnLocation; + + public PhaseBossEntity(CustomBossEntity customBossEntity) { + this.customBossEntity = customBossEntity; + try { + ArrayList unsortedBossPhases = new ArrayList<>(); + unsortedBossPhases.add(new BossPhase(customBossEntity.getCustomBossesConfigFields(), 1)); + for (String phaseConfigFile : customBossEntity.getCustomBossesConfigFields().getPhases()) { + CustomBossesConfigFields customBossesConfigFields = CustomBossesConfig.getCustomBoss(phaseConfigFile.split(":")[0]); + if (customBossesConfigFields == null) { + Logger.warn("Phase boss " + customBossEntity.getCustomBossesConfigFields() + " has an invalid config entry for phase " + phaseConfigFile.split(":")[0] + " - this file could not be found. The boss will not be able to do this phase until it is fixed!"); + } + double healthPercentage = Double.parseDouble(phaseConfigFile.split(":")[1]); + unsortedBossPhases.add(new BossPhase(customBossesConfigFields, healthPercentage)); + } + unsortedBossPhases.sort((o1, o2) -> (int) (o2.healthPercentage * 100 - o1.healthPercentage * 100)); + this.bossPhases = unsortedBossPhases; + currentPhase = bossPhases.get(0); + } catch (Exception ex) { + Logger.warn("Your phase boss " + customBossEntity.customBossesConfigFields.getFilename() + " does not have a valid phases setup. Its phases will not work."); + } + } + + public boolean isInFirstPhase() { + return bossPhases.get(0).equals(currentPhase); + } + + private void switchPhase(BossPhase bossPhase, RemovalReason removalReason, double healthPercentage) { + if (isInFirstPhase()) originalSpawnLocation = customBossEntity.getSpawnLocation().clone(); + if (bossPhase.equals(currentPhase)) { + Logger.warn("Attempted to change the boss phase to what it already was.", true); + return; + } + customBossEntity.remove(removalReason); + if (customBossEntity.getCustomModel() != null) customBossEntity.getCustomModel().switchPhase(); + if (bossPhase.customBossesConfigFields == null) { + Logger.warn("A phase for phase boss " + bossPhases.get(0).customBossesConfigFields.getFilename() + " was not valid! The boss will not be able to switch phases until it is fixed."); + return; + } + customBossEntity.setCustomBossesConfigFields(bossPhase.customBossesConfigFields); + if (removalReason.equals(RemovalReason.PHASE_BOSS_RESET)) { + if (bossPhase.customBossesConfigFields.getSong() != null) + customBossEntity.setBossMusic(new CustomMusic(bossPhase.customBossesConfigFields.getSong(), customBossEntity)); + //Necessary to reset phase bosses which move their spawn point via teleportation + customBossEntity.setSpawnLocation(originalSpawnLocation); + customBossEntity.setRespawnOverrideLocation(originalSpawnLocation); + customBossEntity.spawn(true); + } else { + if (bossPhase.customBossesConfigFields.getPhaseSpawnLocation() != null) { + Location location = ConfigurationLocation.serialize(bossPhase.customBossesConfigFields.getPhaseSpawnLocation(), true); + if (bossPhase.customBossesConfigFields.getPhaseSpawnLocation() != null && + bossPhase.customBossesConfigFields.getPhaseSpawnLocation().split(",")[0].equalsIgnoreCase("same_as_boss")) + location.setWorld(customBossEntity.getLocation().getWorld()); + if (location != null) { + customBossEntity.setSpawnLocation(location); + customBossEntity.setRespawnOverrideLocation(location); + customBossEntity.setPersistentLocation(location); + } else { + customBossEntity.setRespawnOverrideLocation(customBossEntity.getLocation()); + customBossEntity.setPersistentLocation(customBossEntity.getLocation()); + } + } else { + customBossEntity.setRespawnOverrideLocation(customBossEntity.getLocation()); + } + //Handle music, soundtrack shouldn't change if the new one is the same + if (bossPhase.customBossesConfigFields.getSong() != null) { + if (currentPhase.customBossesConfigFields.getSong() == null){ + customBossEntity.setBossMusic(new CustomMusic(bossPhase.customBossesConfigFields.getSong(), customBossEntity)); + customBossEntity.getBossMusic().start(customBossEntity); + } + if (!bossPhase.customBossesConfigFields.getSong().equals(currentPhase.customBossesConfigFields.getSong())) { + if (customBossEntity.getBossMusic() != null) customBossEntity.getBossMusic().stop(); + customBossEntity.setBossMusic(new CustomMusic(bossPhase.customBossesConfigFields.getSong(), customBossEntity)); + } + } + //Make sure the chunk is loaded so the boss can be initialized properly, or else you'll have some issues with health + customBossEntity.getSpawnLocation().getChunk().load(); + //spawn the boss + customBossEntity.spawn(true); + } + currentPhase = bossPhase; + ElitePhaseSwitchEvent elitePhaseSwitchEvent = new ElitePhaseSwitchEvent(customBossEntity, this); + new EventCaller(elitePhaseSwitchEvent); + customBossEntity.setHealth(customBossEntity.getMaxHealth() * healthPercentage); + customBossEntity.setCombatGracePeriod(20); + } + + public void resetToFirstPhase() { + switchPhase(bossPhases.get(0), RemovalReason.PHASE_BOSS_RESET, 1); + } + + public void silentReset() { + currentPhase = bossPhases.get(0); + customBossEntity.setCustomBossesConfigFields(currentPhase.customBossesConfigFields); + } + + /** + * Used to set the respawn time in the config file of Regional Bosses + * + * @return The configuration file for phase 1 of Phase Bosses + */ + public CustomBossesConfigFields getPhase1Config() { + return bossPhases.get(0).customBossesConfigFields; + } + + public void checkPhaseBossSwitch(EliteMobDamagedEvent event) { + if (bossPhases.indexOf(currentPhase) + 1 >= bossPhases.size()) return; + + BossPhase nextBossPhase = bossPhases.get(bossPhases.indexOf(currentPhase) + 1); + double newHealth = Math.max((customBossEntity.getHealth() - event.getDamage()) / customBossEntity.getMaxHealth(), 0); + if (newHealth > nextBossPhase.healthPercentage) return; + + event.setCancelled(true); + switchPhase(nextBossPhase, RemovalReason.PHASE_BOSS_PHASE_END, nextBossPhase.healthPercentage); + } + + public static class PhaseBossEntityListener implements Listener { + @EventHandler(ignoreCancelled = true) + public void onEliteDamaged(EliteMobDamagedEvent event) { + if (!(event.getEliteEntity() instanceof CustomBossEntity)) return; + if (((CustomBossEntity) event.getEliteEntity()).getPhaseBossEntity() == null) return; + ((CustomBossEntity) event.getEliteEntity()).getPhaseBossEntity().checkPhaseBossSwitch(event); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onEliteDeath(EliteMobDeathEvent event) { + if (!(event.getEliteEntity() instanceof CustomBossEntity customBossEntity)) return; + if (customBossEntity.getPhaseBossEntity() != null) + customBossEntity.phaseBossEntity.silentReset(); + } + } + + public class BossPhase { + public CustomBossesConfigFields customBossesConfigFields; + public double healthPercentage; + + public BossPhase(CustomBossesConfigFields customBossesConfigFields, double healthPercentage) { + this.customBossesConfigFields = customBossesConfigFields; + this.healthPercentage = healthPercentage; + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/RegionalBossEntity.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/RegionalBossEntity.java new file mode 100644 index 000000000..937ac2233 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/RegionalBossEntity.java @@ -0,0 +1,319 @@ +package com.magmaguy.elitemobs.mobconstructor.custombosses; + +import com.google.common.collect.ArrayListMultimap; +import com.magmaguy.easyminecraftgoals.NMSManager; +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.internal.RemovalReason; +import com.magmaguy.elitemobs.config.ItemSettingsConfig; +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfig; +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.PersistentMovingEntity; +import com.magmaguy.elitemobs.mobconstructor.PersistentObject; +import com.magmaguy.elitemobs.mobconstructor.custombosses.transitiveblocks.TransitiveBlock; +import com.magmaguy.elitemobs.pathfinding.Navigation; +import com.magmaguy.elitemobs.powers.SpiritWalk; +import com.magmaguy.elitemobs.utils.ConfigurationLocation; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.attribute.Attribute; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; + +import javax.annotation.Nullable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Objects; + +public class RegionalBossEntity extends CustomBossEntity implements PersistentObject, PersistentMovingEntity { + + private static final ArrayListMultimap regionalBossesFromConfigFields = ArrayListMultimap.create(); + @Getter + private final double leashRadius; + //Format: worldName,x,y,z,pitch,yaw:unixTimeForRespawn + private String rawString; + private String rawLocationString; + private long ticksBeforeRespawn = 0; + private long unixRespawnTime; + private int respawnCoolDownInMinutes = -1; + private boolean isRespawning = false; + private BukkitTask leashTask; + @Getter + @Setter + private List onSpawnTransitiveBlocks; + @Getter + @Setter + private List onRemoveTransitiveBlocks; + @Getter + private boolean removed = false; + private BukkitTask respawnTask = null; + + public RegionalBossEntity(CustomBossesConfigFields customBossesConfigFields, String rawString) { + super(customBossesConfigFields); + this.rawString = rawString; + this.rawLocationString = rawString.split(":")[0]; + this.respawnCoolDownInMinutes = customBossesConfigFields.getSpawnCooldown(); + this.leashRadius = customBossesConfigFields.getLeashRadius(); + this.onSpawnTransitiveBlocks = TransitiveBlock.serializeTransitiveBlocks(customBossesConfigFields.getOnSpawnBlockStates(), customBossesConfigFields.getFilename()); + this.onRemoveTransitiveBlocks = TransitiveBlock.serializeTransitiveBlocks(customBossesConfigFields.getOnRemoveBlockStates(), customBossesConfigFields.getFilename()); + + regionalBossesFromConfigFields.put(customBossesConfigFields, this); + + unixRespawnTime = 0; + if (rawString.contains(":")) + unixRespawnTime = Long.parseLong(rawString.split(":")[1]); + ticksBeforeRespawn = 0; + if (unixRespawnTime > 0) + ticksBeforeRespawn = (unixRespawnTime - System.currentTimeMillis()) / 1000 * 20 < 0 ? + 0 : (unixRespawnTime - System.currentTimeMillis()) / 1000 * 20; + super.worldName = rawLocationString.split(",")[0]; + super.spawnLocation = ConfigurationLocation.serialize(rawLocationString); + + super.setPersistent(true); + } + + public RegionalBossEntity(CustomBossesConfigFields customBossesConfigFields, Location location, boolean permanent, boolean persistent) { + super(customBossesConfigFields); + this.onSpawnTransitiveBlocks = TransitiveBlock.serializeTransitiveBlocks(customBossesConfigFields.getOnSpawnBlockStates(), customBossesConfigFields.getFilename()); + this.onRemoveTransitiveBlocks = TransitiveBlock.serializeTransitiveBlocks(customBossesConfigFields.getOnRemoveBlockStates(), customBossesConfigFields.getFilename()); + this.onSpawnTransitiveBlocks = TransitiveBlock.serializeTransitiveBlocks(customBossesConfigFields.getOnSpawnBlockStates(), customBossesConfigFields.getFilename()); + this.onRemoveTransitiveBlocks = TransitiveBlock.serializeTransitiveBlocks(customBossesConfigFields.getOnRemoveBlockStates(), customBossesConfigFields.getFilename()); + super.setPersistent(persistent); + super.spawnLocation = location; + this.leashRadius = customBossesConfigFields.getLeashRadius(); + if (permanent) { + this.rawString = ConfigurationLocation.deserialize(location); + this.rawLocationString = rawString.split(":")[0]; + this.unixRespawnTime = 0; + this.respawnCoolDownInMinutes = customBossesConfigFields.getSpawnCooldown(); + regionalBossesFromConfigFields.put(customBossesConfigFields, this); + saveNewLocation(); + } + } + + /** + * Used by third party plugins to spawn regional bosses (BetterStructures uses this) + * + * @param configurationFilename Filename of the configuration file as set in the custombosses folder of EliteMobs + * @param spawnLocation Spawn location of the regional boss + */ + @Nullable + public static RegionalBossEntity SpawnRegionalBoss(String configurationFilename, Location spawnLocation) { + CustomBossesConfigFields thisCustomBossConfigurationField = CustomBossesConfig.getCustomBoss(configurationFilename); + if (thisCustomBossConfigurationField == null) return null; + if (spawnLocation == null) return null; + return new RegionalBossEntity(thisCustomBossConfigurationField, spawnLocation, true, true); + } + + public static void regionalBossesShutdown() { + regionalBossesFromConfigFields.clear(); + } + + public static List getRegionalBossEntities(CustomBossesConfigFields customBossesConfigFields) { + return regionalBossesFromConfigFields.get(customBossesConfigFields); + } + + public static Collection getRegionalBossEntities() { + return regionalBossesFromConfigFields.values(); + } + + public static void regionalDataSaver() { + new BukkitRunnable() { + @Override + public void run() { + save(); + } + }.runTaskTimerAsynchronously(MetadataHandler.PLUGIN, 20L * 5, 20L * 5); + } + + public static void save() { + for (CustomBossesConfigFields customBossesConfigFields : regionalBossesFromConfigFields.keySet()) { + if (!customBossesConfigFields.isFilesOutOfSync()) continue; + customBossesConfigFields.setFilesOutOfSync(false); + List spawnLocations = new ArrayList<>(); + for (RegionalBossEntity regionalBossEntity : regionalBossesFromConfigFields.get(customBossesConfigFields)) + if (!regionalBossEntity.removed) + spawnLocations.add(regionalBossEntity.rawString); + customBossesConfigFields.getFileConfiguration().set("spawnLocations", spawnLocations); + try { + customBossesConfigFields.getFileConfiguration().save(customBossesConfigFields.getFile()); + } catch (Exception ex) { + Logger.warn("Failed to save respawn timer for " + customBossesConfigFields.getFileConfiguration().getName() + " !"); + } + } + } + + public static RegionalBossEntity getRegionalBoss(CustomBossesConfigFields customBossesConfigFields, Location spawnLocation) { + for (RegionalBossEntity regionalBossEntity : regionalBossesFromConfigFields.get(customBossesConfigFields)) + if (Objects.equals(regionalBossEntity.getSpawnLocation(), spawnLocation)) + return regionalBossEntity; + return null; + } + + public static List getRegionalBossEntitySet() { + return new ArrayList<>(regionalBossesFromConfigFields.values()); + } + + @Nullable + public static RegionalBossEntity createTemporaryRegionalBossEntity(String filename, Location spawnLocation) { + CustomBossesConfigFields customBossesConfigFields = CustomBossesConfig.getCustomBoss(filename); + if (customBossesConfigFields == null) + return null; + return new RegionalBossEntity(customBossesConfigFields, spawnLocation, false, false); + } + + public static RegionalBossEntity createPermanentRegionalBossEntity(CustomBossesConfigFields customBossesConfigFields, Location spawnLocation) { + RegionalBossEntity regionalBossEntity = new RegionalBossEntity(customBossesConfigFields, spawnLocation, true, true); + regionalBossEntity.initialize(); + return regionalBossEntity; + } + + public boolean isRespawning() { + return isRespawning; + } + + public void saveNewLocation() { + if (spawnLocation == null) { + Logger.warn("Failed to save regional boss because it failed to spawn correctly!"); + } + customBossesConfigFields.setFilesOutOfSync(true); + rawString = ConfigurationLocation.deserialize(spawnLocation); + } + + public void initialize() { + queueSpawn(false); + } + + public void queueSpawn(boolean silent) { + RegionalBossEntity regionalBossEntity = this; + this.isRespawning = true; + respawnTask = new BukkitRunnable() { + @Override + public void run() { + if (phaseBossEntity != null) phaseBossEntity.silentReset(); + ticksBeforeRespawn = 0; + //Reminder: this might not spawn a living entity as it gets queued for when the chunk loads + regionalBossEntity.spawn(silent); + regionalBossEntity.getDamagers().clear(); + } + }.runTaskLater(MetadataHandler.PLUGIN, ticksBeforeRespawn); + } + + public void forceRespawn() { + if (respawnTask == null) return; + respawnTask.cancel(); + ticksBeforeRespawn = 0; + spawn(false); + getDamagers().clear(); + } + + public void respawn() { + if (respawnCoolDownInMinutes < 0) return; + this.isRespawning = true; + unixRespawnTime = (respawnCoolDownInMinutes * 60L * 1000L) + System.currentTimeMillis(); + ticksBeforeRespawn = respawnCoolDownInMinutes * 60L * 20L; + rawString = rawLocationString + ":" + unixRespawnTime; + if (phaseBossEntity != null) + phaseBossEntity.getPhase1Config().setFilesOutOfSync(true); + else + customBossesConfigFields.setFilesOutOfSync(true); + queueSpawn(false); + } + + public void checkLeash() { + if (leashRadius < 1) + return; + RegionalBossEntity regionalBossEntity = this; + if (leashTask != null) leashTask.cancel(); + leashTask = Bukkit.getScheduler().runTaskTimerAsynchronously(MetadataHandler.PLUGIN, () -> { + try { + if (!isValid()) { + cancelLeash(); + return; + } + if (getLivingEntity().getLocation().distanceSquared(spawnLocation) > Math.pow(leashRadius, 2)) + SpiritWalk.spiritWalkRegionalBossAnimation(regionalBossEntity, getLivingEntity().getLocation(), getSpawnLocation()); + } catch (Exception ex) { + ex.printStackTrace(); + Logger.warn("Async leash task errored!"); + } + }, 20L * 3, 20L * 3); + } + + private void cancelLeash() { + if (leashTask == null) return; + leashTask.cancel(); + leashTask = null; + } + + public void setLeashRadius(int leashRadius) { + getCustomBossesConfigFields().setLeashRadius(leashRadius); + getCustomBossesConfigFields().setFilesOutOfSync(true); + } + + @Override + public void spawn(boolean silent) { + super.spawn(silent); + this.isRespawning = false; + if (!ItemSettingsConfig.isRegionalBossesDropVanillaLoot()) + super.vanillaLoot = false; + if (NMSManager.isEnabled()) { + if (livingEntity != null && leashRadius > 0) { + Navigation.addSoftLeashAI(this); + Navigation.addHardLeashAI(this); + } + } else if (livingEntity != null) + checkLeash(); + } + + @Override + public void remove(RemovalReason removalReason) { + cancelLeash(); + super.remove(removalReason); + + switch (removalReason) { + case REMOVE_COMMAND: + permanentlyRemove(); + break; + case DEATH: + case BOSS_TIMEOUT: + //this is used for 1-time regional bosses, such as the ones spawned by BetterStructures + if (customBossesConfigFields.isRemoveAfterDeath()) { + permanentlyRemove(); + break; + } + if (!(this instanceof InstancedBossEntity)) + respawn(); + break; + default: + break; + } + } + + private void permanentlyRemove() { + if (phaseBossEntity != null) + phaseBossEntity.silentReset(); + EntityTracker.getEliteMobEntities().remove(super.eliteUUID); + removed = true; + getCustomBossesConfigFields().setFilesOutOfSync(true); + } + + /** + * Runs on chunk load. Should start repeating tasks that rely on the boss being loaded. + */ + @Override + public void chunkLoad() { + super.chunkLoad(); + } + + public void removeSlow() { + if (getCustomBossesConfigFields().isAlert() || getLivingEntity() == null) return; + getLivingEntity().getAttribute(Attribute.GENERIC_FOLLOW_RANGE).setBaseValue(getFollowDistance()); + getLivingEntity().getAttribute(Attribute.GENERIC_MOVEMENT_SPEED).setBaseValue(getMovementSpeedAttribute()); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/transitiveblocks/TransitiveBlock.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/transitiveblocks/TransitiveBlock.java new file mode 100644 index 000000000..f51a2ff88 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/transitiveblocks/TransitiveBlock.java @@ -0,0 +1,47 @@ +package com.magmaguy.elitemobs.mobconstructor.custombosses.transitiveblocks; + +import com.magmaguy.elitemobs.config.LegacyValueConverter; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Bukkit; +import org.bukkit.block.data.BlockData; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; + + +public class TransitiveBlock { + + @Getter + private final BlockData blockData; + @Getter + private final Vector relativeLocation; + @Getter + @Setter + private boolean isAir; + + public TransitiveBlock(BlockData blockData, Vector relativeLocation) { + this.blockData = blockData; + this.relativeLocation = relativeLocation; + } + + public static List serializeTransitiveBlocks(List deserializedList, String filename) { + List transitiveBlocks = new ArrayList<>(); + for (String deserializedString : deserializedList) { + try { + String[] elements = deserializedString.split("/"); + String[] vector = elements[0].split(","); + double x = Double.parseDouble(vector[0]); + double y = Double.parseDouble(vector[1]); + double z = Double.parseDouble(vector[2]); + BlockData blockData = Bukkit.getServer().createBlockData(LegacyValueConverter.parseDeserializedBlocks(elements[1])); + transitiveBlocks.add(new TransitiveBlock(blockData, new Vector(x, y, z))); + } catch (Exception ex) { + Logger.warn("Failed to serialize Transitive Block! Issue with entry " + deserializedString + " in file " + filename); + } + } + return transitiveBlocks; + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/transitiveblocks/TransitiveBlockCommand.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/transitiveblocks/TransitiveBlockCommand.java new file mode 100644 index 000000000..2e1d9233b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/transitiveblocks/TransitiveBlockCommand.java @@ -0,0 +1,276 @@ +package com.magmaguy.elitemobs.mobconstructor.custombosses.transitiveblocks; + +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfig; +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import com.magmaguy.elitemobs.mobconstructor.custombosses.PhaseBossEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.RegionalBossEntity; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class TransitiveBlockCommand { + + public static HashMap activePlayers = new HashMap<>(); + private final Player player; + private final CustomBossesConfigFields customBossesConfigFields; + private final TransitiveBlockType transitiveBlockType; + private List transitiveBlockList = new ArrayList<>(); + private RegionalBossEntity regionalBossEntity; + @Getter + @Setter + private boolean regionalSelection = false; + private Location corner1, corner2; + + public TransitiveBlockCommand(Player player, CustomBossesConfigFields customBossesConfigFields, TransitiveBlockType transitiveBlockType, boolean edit) { + this.player = player; + this.customBossesConfigFields = customBossesConfigFields; + this.transitiveBlockType = transitiveBlockType; + List regionalBossEntities = RegionalBossEntity.getRegionalBossEntities(customBossesConfigFields); + if (regionalBossEntities.isEmpty()) { + //check phase bosses + for (RegionalBossEntity iteratedRegionalBossEntity : RegionalBossEntity.getRegionalBossEntitySet()) + if (iteratedRegionalBossEntity.getPhaseBossEntity() != null) + for (PhaseBossEntity.BossPhase bossPhase : iteratedRegionalBossEntity.getPhaseBossEntity().getBossPhases()) { + if (bossPhase.customBossesConfigFields == null) { + String message = "Could not find valid custom boss config fields for phase boss! This is probably a configuration issue. Check why your phase boss isn't valid on console logs on /em reload and make sure to test the phases in-game!"; + Logger.warn(message); + player.sendMessage(message); + } + if (bossPhase.customBossesConfigFields.equals(customBossesConfigFields)) { + this.regionalBossEntity = iteratedRegionalBossEntity; + break; + } + } + if (this.regionalBossEntity == null) { + player.sendMessage(ChatColor.RED + "[EliteMobs] Transitive blocks require one Regional Boss from the configuration files to be placed in order to add transitive blocks relative to the spawn coordinates of that boss."); + player.sendMessage(ChatColor.RED + "[EliteMobs] Cancelling block registration!"); + return; + } + } + + if (this.regionalBossEntity == null) { + if (regionalBossEntities.size() > 1) { + player.sendMessage(ChatColor.RED + "[EliteMobs] Transitive blocks require having ONLY one Regional Boss from the configuration files to be placed in order to add transitive blocks relative to the spawn coordinates of that boss." + + " If there is more than one boss, the plugin can't determine which boss specifically should be getting the transitive blocks"); + player.sendMessage(ChatColor.RED + "[EliteMobs] If want multiple bosses to have transitive blocks, you will need one configuration file per boss that has them!"); + player.sendMessage(ChatColor.RED + "[EliteMobs] Cancelling block registration!"); + return; + } + this.regionalBossEntity = regionalBossEntities.get(0); + } + + if (edit) + switch (transitiveBlockType) { + case ON_SPAWN: + transitiveBlockList = TransitiveBlock.serializeTransitiveBlocks(customBossesConfigFields.getOnSpawnBlockStates(), customBossesConfigFields.getFilename()); + break; + case ON_REMOVE: + transitiveBlockList = TransitiveBlock.serializeTransitiveBlocks(customBossesConfigFields.getOnRemoveBlockStates(), customBossesConfigFields.getFilename()); + } + + activePlayers.put(player, this); + player.sendMessage(ChatColor.GREEN + "[EliteMobs] Now registering " + transitiveBlockType.toString() + " blocks! " + ChatColor.DARK_GREEN + "Punch blocks to register air at that location, or right click blocks to register the block you right clicked!"); + player.sendMessage(ChatColor.GOLD + "[EliteMobs] Run the same command to stop registering blocks and save!"); + player.sendMessage(ChatColor.GOLD + "[EliteMobs] Or run the command " + "/em cancelblocks " + " to cancel the registration!"); + } + + public static TransitiveBlockCommand processCommand(Player player, String filename, String transitiveBlockType, boolean edit, boolean regionalSelection) { + TransitiveBlockCommand transitiveBlockCommand = processCommand(player, filename, transitiveBlockType, edit); + if (transitiveBlockCommand != null) + transitiveBlockCommand.setRegionalSelection(regionalSelection); + if (transitiveBlockCommand != null) + player.sendMessage("[EliteMobs] Now registering large selection for transitive blocks! Left click to set corner 1, right click to set corner 2! Run the same command again to stop registering blocks and run /em cancelblocks to cancel!"); + return transitiveBlockCommand; + } + + public static TransitiveBlockCommand processCommand(Player player, String filename, String transitiveBlockType, boolean edit) { + CustomBossesConfigFields customBossesConfigFields = CustomBossesConfig.getCustomBoss(filename); + if (customBossesConfigFields == null) { + player.sendMessage("Boss file isn't valid! Try again with a valid filename for your custom boss."); + return null; + } + if (!customBossesConfigFields.isRegionalBoss()) { + player.sendMessage(ChatColor.RED + "Boss file isn't for a regional boss! This feature only works for regional bosses."); + player.sendMessage(ChatColor.GREEN + "Ignore this warning if you are setting blocks for a phase boss whose first phase is a regional boss!"); + } + TransitiveBlockType tbt = null; + try { + tbt = TransitiveBlockType.valueOf(transitiveBlockType); + } catch (Exception ex) { + player.sendMessage("Not a valid transitive block type, use ON_SPAWN or ON_REMOVE !"); + return null; + } + if (activePlayers.containsKey(player)) { + activePlayers.get(player).commitLocations(); + return null; + } else + return new TransitiveBlockCommand(player, customBossesConfigFields, tbt, edit); + } + + /** + * Used for the cancel command + * + * @param player Player for whom registration should be cancelled + */ + public static void processCommand(Player player) { + activePlayers.remove(player); + player.sendMessage(ChatColor.RED + "[EliteMobs] Block registration successfully cancelled!"); + } + + public void setCorner(boolean leftClick, Location location) { + if (leftClick) { + corner1 = location; + player.sendMessage("Set corner 1!"); + } else { + corner2 = location; + player.sendMessage("Set corner 2!"); + } + + if (corner1 != null && corner2 != null && corner1.getWorld() == corner2.getWorld()) { + int blockCount = (int) ((Math.abs(corner1.getX() - corner2.getX()) + 1) * (Math.abs(corner1.getY() - corner2.getY()) + 1) * (Math.abs(corner1.getZ() - corner2.getZ()) + 1)); + if (blockCount > DefaultConfig.getDefaultTransitiveBlockLimiter()) + player.sendMessage("[EliteMobs] Current selection has " + blockCount + " blocks selected. For performance reasons, it is recommended you don't go over " + DefaultConfig.getDefaultTransitiveBlockLimiter() + " blocks!"); + } + + } + + private Vector getRelativeCoordinate(Location location) { + return new Vector(location.getX() - regionalBossEntity.getSpawnLocation().getX(), + location.getY() - regionalBossEntity.getSpawnLocation().getY(), + location.getZ() - regionalBossEntity.getSpawnLocation().getZ()); + } + + public void registerBlock(Block block) { + if (doubleEntryCheck(block, false)) return; + transitiveBlockList.add(new TransitiveBlock(block.getBlockData(), getRelativeCoordinate(block.getLocation()))); + player.sendMessage("Registered " + block.getType() + " block!"); + } + + public void registerAir(Block block) { + if (doubleEntryCheck(block, true)) return; + transitiveBlockList.add(new TransitiveBlock(Material.AIR.createBlockData(), getRelativeCoordinate(block.getLocation()))); + player.sendMessage("Registered air block!"); + } + + private boolean doubleEntryCheck(Block block, boolean isAir) { + TransitiveBlock transitiveBlock = null; + for (TransitiveBlock element : transitiveBlockList) + if (element.getRelativeLocation().equals(getRelativeCoordinate(block.getLocation()))) + if (element.isAir() && !isAir || !element.isAir() && isAir) { + transitiveBlock = element; + break; + } + if (transitiveBlock == null) return false; + transitiveBlockList.remove(transitiveBlock); + player.sendMessage("Unregistered block!"); + return true; + } + + public void commitLocations() { + activePlayers.remove(player); + player.sendMessage(ChatColor.GREEN + "[EliteMobs] Now saving " + transitiveBlockType.toString() + " blocks!"); + List deserializedData = new ArrayList<>(); + + if (regionalSelection) { + int blockCount = (int) ((Math.abs(corner1.getX() - corner2.getX()) + 1) * (Math.abs(corner1.getY() - corner2.getY()) + 1) * (Math.abs(corner1.getZ() - corner2.getZ()) + 1)); + if (blockCount > DefaultConfig.getDefaultTransitiveBlockLimiter()) { + player.sendMessage("[EliteMobs] You registered more than " + DefaultConfig.getDefaultTransitiveBlockLimiter() + " blocks at once. For performance reasons, it is recommended you keep the selections low. Avoid things like selecting a lot of unnecessary air blocks!"); + } + int lowestX, highestX, lowestY, highestY, lowestZ, highestZ; + lowestX = (int) Math.min(corner1.getX(), corner2.getX()); + highestX = (int) Math.max(corner1.getX(), corner2.getX()); + lowestY = (int) Math.min(corner1.getY(), corner2.getY()); + highestY = (int) Math.max(corner1.getY(), corner2.getY()); + lowestZ = (int) Math.min(corner1.getZ(), corner2.getZ()); + highestZ = (int) Math.max(corner1.getZ(), corner2.getZ()); + + for (int x = lowestX; x < highestX + 1; x++) + for (int y = lowestY; y < highestY + 1; y++) + for (int z = lowestZ; z < highestZ + 1; z++) { + Location blockLocation = new Location(player.getWorld(), x, y, z); + transitiveBlockList.add(new TransitiveBlock(blockLocation.getBlock().getBlockData(), getRelativeCoordinate(blockLocation))); + } + + player.sendMessage("Successfully registered " + transitiveBlockList.size() + " blocks between your corners!"); + + } + + for (TransitiveBlock transitiveBlock : transitiveBlockList) { + String deserializedString = transitiveBlock.getRelativeLocation().getX() + "," + + transitiveBlock.getRelativeLocation().getY() + "," + + transitiveBlock.getRelativeLocation().getZ() + "/" + + transitiveBlock.getBlockData().getAsString(); + deserializedData.add(deserializedString); + } + + switch (transitiveBlockType) { + case ON_SPAWN: + customBossesConfigFields.setOnSpawnBlockStates(deserializedData); + if (regionalBossEntity.getCustomBossesConfigFields().getFilename().equals(customBossesConfigFields.getFilename())) + regionalBossEntity.setOnSpawnTransitiveBlocks(TransitiveBlock.serializeTransitiveBlocks(deserializedData, customBossesConfigFields.getFilename())); + player.sendMessage("Locations registered correctly!"); + break; + case ON_REMOVE: + customBossesConfigFields.setOnRemoveBlockStates(deserializedData); + if (regionalBossEntity.getCustomBossesConfigFields().getFilename().equals(customBossesConfigFields.getFilename())) + regionalBossEntity.setOnRemoveTransitiveBlocks(TransitiveBlock.serializeTransitiveBlocks(deserializedData, customBossesConfigFields.getFilename())); + player.sendMessage("Locations registered correctly!"); + break; + default: + player.sendMessage("Failed to commit locations!"); + } + } + + public enum TransitiveBlockType { + ON_SPAWN, + ON_REMOVE + } + + public static class TemporaryBossBlockCommandEvents implements Listener { + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + public void onPlayerInteractBlockEvent(PlayerInteractEvent event) { + if (!activePlayers.containsKey(event.getPlayer())) return; + if (event.getHand() != EquipmentSlot.HAND) return; + if (event.getClickedBlock() == null) return; + if (event.getAction().equals(Action.RIGHT_CLICK_BLOCK)) { + if (event.getClickedBlock().getType().isAir()) return; + if (activePlayers.get(event.getPlayer()).isRegionalSelection()) + activePlayers.get(event.getPlayer()).setCorner(false, event.getClickedBlock().getLocation()); + else + activePlayers.get(event.getPlayer()).registerBlock(event.getClickedBlock()); + event.setCancelled(true); + } else if (event.getAction().equals(Action.LEFT_CLICK_BLOCK)) { + if (activePlayers.get(event.getPlayer()).isRegionalSelection()) + activePlayers.get(event.getPlayer()).setCorner(true, event.getClickedBlock().getLocation()); + else + activePlayers.get(event.getPlayer()).registerAir(event.getClickedBlock()); + event.setCancelled(true); + } + } + + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) { + if (!activePlayers.containsKey(event.getPlayer())) return; + activePlayers.remove(event.getPlayer()); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/transitiveblocks/TransitiveBossBlock.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/transitiveblocks/TransitiveBossBlock.java new file mode 100644 index 000000000..9b7e89f0d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/custombosses/transitiveblocks/TransitiveBossBlock.java @@ -0,0 +1,101 @@ +package com.magmaguy.elitemobs.mobconstructor.custombosses.transitiveblocks; + +import com.magmaguy.elitemobs.api.EliteMobRemoveEvent; +import com.magmaguy.elitemobs.api.EliteMobSpawnEvent; +import com.magmaguy.elitemobs.mobconstructor.custombosses.RegionalBossEntity; +import com.magmaguy.elitemobs.utils.ChunkLocationChecker; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.BlockFace; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.Directional; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class TransitiveBossBlock implements Listener { + + private static void setBlockData(RegionalBossEntity regionalBossEntity, TransitiveBlock transitiveBlock, Location spawnLocation) { + Location location; + if (!ChunkLocationChecker.locationIsLoaded(spawnLocation)) return; + double rotation = 0; + + BlockData blockData = transitiveBlock.getBlockData().clone(); + + if (rotation == 0) + location = spawnLocation.clone().add(transitiveBlock.getRelativeLocation()); + else { + location = spawnLocation.clone().add(transitiveBlock.getRelativeLocation().clone().rotateAroundY(Math.toRadians(rotation))); + if (blockData instanceof Directional) + ((Directional) blockData).setFacing(rotateBlockFace(((Directional) blockData).getFacing(), rotation)); + } + + //Minor optimization, does not replace blocks that are already identical + if (!location.getBlock().getBlockData().getMaterial().equals(blockData.getMaterial())) + location.getBlock().setBlockData(blockData, blockData.getMaterial() == Material.WATER || blockData.getMaterial() == Material.LAVA); + + } + + /* + 1 = north + 2 = east + 3 = south + 4 = west + */ + private static int blockFaceToInt(BlockFace blockFace) { + switch (blockFace) { + case NORTH: + return 1; + case EAST: + return 2; + case SOUTH: + return 3; + case WEST: + return 4; + default: + Logger.warn("Attempted to rotate a block through the transitive block system that does not have a north / south / east / west face. This is not currently supported."); + return 1; + } + } + + private static BlockFace intToBlockFace(int blockFaceValue) { + switch (blockFaceValue) { + case 1: + return BlockFace.NORTH; + case 2: + return BlockFace.EAST; + case 3: + return BlockFace.SOUTH; + case 4: + return BlockFace.WEST; + default: + Logger.warn("Attempted to rotate a block through the transitive block system that does not have a north / south / east / west face. This is not currently supported."); + return BlockFace.NORTH; + } + } + + private static BlockFace rotateBlockFace(BlockFace blockFace, double rotation) { + int adjustedRotation = (int) (rotation / 90d); + int blockFaceInt = blockFaceToInt(blockFace); + int result = blockFaceInt + adjustedRotation; + if (result > 4) result -= 4; + if (result < 1) result += 4; + return intToBlockFace(result); + } + + @EventHandler(ignoreCancelled = true) + public void onBossSpawn(EliteMobSpawnEvent event) { + if (!(event.getEliteMobEntity() instanceof RegionalBossEntity regionalBossEntity)) return; + if (regionalBossEntity.getOnSpawnTransitiveBlocks() != null && !regionalBossEntity.getOnSpawnTransitiveBlocks().isEmpty()) + for (TransitiveBlock transitiveBlock : regionalBossEntity.getOnSpawnTransitiveBlocks()) + setBlockData(regionalBossEntity, transitiveBlock, regionalBossEntity.getSpawnLocation()); + } + + @EventHandler(ignoreCancelled = true) + public void onBossRemove(EliteMobRemoveEvent event) { + if (!(event.getEliteMobEntity() instanceof RegionalBossEntity regionalBossEntity)) return; + if (regionalBossEntity.getOnRemoveTransitiveBlocks() != null && !regionalBossEntity.getOnRemoveTransitiveBlocks().isEmpty()) + for (TransitiveBlock transitiveBlock : regionalBossEntity.getOnRemoveTransitiveBlocks()) + setBlockData(regionalBossEntity, transitiveBlock, regionalBossEntity.getSpawnLocation()); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/displays/DamageDisplay.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/displays/DamageDisplay.java deleted file mode 100644 index 48ce5061e..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/displays/DamageDisplay.java +++ /dev/null @@ -1,126 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobconstructor.displays; - -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.entity.ArmorStand; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.LivingEntity; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.Vector; - -import java.util.Random; - -public class DamageDisplay implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onHitArmorStand(EntityDamageEvent event) { - - if (!EntityTracker.getIsArmorStand(event.getEntity())) return; - event.setCancelled(true); - - } - - @EventHandler(priority = EventPriority.MONITOR) - public void onHit(EntityDamageEvent event) { - - if (event.isCancelled()) return; - - if (!(event.getEntity() instanceof LivingEntity) || event.getEntity() instanceof ArmorStand) return; - - if (ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.ONLY_SHOW_DAMAGE_FOR_ELITE_MOBS)) { - - if (EntityTracker.isEliteMob(event.getEntity()) && event.getEntity() instanceof LivingEntity) { - - if (event.getDamage() > 0) displayDamage(event.getEntity(), event.getFinalDamage()); - - } - - } else { - - if (event.getDamage() > 0) displayDamage(event.getEntity(), event.getFinalDamage()); - - } - - } - - public static void displayDamage(Entity entity, double damage) { - - if (!ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.DISPLAY_DAMAGE_ON_HIT)) return; - - Location entityLocation = entity.getLocation(); - - Random random = new Random(); - double randomCoordX = (random.nextDouble() * 2) - 1 + entityLocation.getX(); - double randomCoordZ = (random.nextDouble() * 2) - 1 + entityLocation.getZ(); - - Location newLocation = new Location(entityLocation.getWorld(), randomCoordX, entityLocation.getY() + 1.7, randomCoordZ); - - /* - Dirty fix: armorstands don't render invisibly on their first tick, so it gets moved elsewhere temporarily - */ - ArmorStand armorStand = (ArmorStand) newLocation.getWorld().spawnEntity(newLocation.add(new Vector(0, 50, 0)), EntityType.ARMOR_STAND); - - armorStand.setVisible(false); - armorStand.setMarker(true); - int newDisplayDamage = (int) damage; - armorStand.setCustomName(ChatColor.RED + "" + ChatColor.BOLD + "" + newDisplayDamage + ""); - armorStand.setCustomNameVisible(true); - armorStand.setGravity(false); - EntityTracker.registerArmorStands(armorStand); - - new BukkitRunnable() { - - int taskTimer = 0; - - @Override - public void run() { - - if (taskTimer == 0) - armorStand.teleport(new Location(armorStand.getWorld(), armorStand.getLocation().getX(), - armorStand.getLocation().getY() - 50, armorStand.getLocation().getZ())); - else - armorStand.teleport(new Location(armorStand.getWorld(), armorStand.getLocation().getX(), - armorStand.getLocation().getY() + 0.1, armorStand.getLocation().getZ())); - - taskTimer++; - - if (taskTimer == 15) { - - cancel(); - EntityTracker.unregisterArmorStand(armorStand); - armorStand.remove(); - - } - - } - - }.runTaskTimer(Bukkit.getPluginManager().getPlugin(MetadataHandler.ELITE_MOBS), 0, 1); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/displays/DisplayMob.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/displays/DisplayMob.java deleted file mode 100644 index c74cac68c..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/displays/DisplayMob.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.magmaguy.elitemobs.mobconstructor.displays; - -import org.bukkit.event.Listener; - -public class DisplayMob implements Listener { - -// public static List livingEntityList = new ArrayList<>(); -// private static String encodedKey = ChatColorConverter.convert("&D&d&d&d&D&d&d&f"); -// -// public static void nameEncoder(LivingEntity livingEntity) { -// -// new BukkitRunnable() { -// @Override -// public void run() { -// livingEntity.setCustomName(ChatColorConverter.convert(encodedKey + livingEntity.getCustomName())); -// MetadataHandler.registerMetadata(livingEntity, MetadataHandler.CUSTOM_NAME, true); -// MetadataHandler.registerMetadata(livingEntity, MetadataHandler.LIVINGENTITY_DISPLAY, true); -// MetadataHandler.registerMetadata(livingEntity, MetadataHandler.PERSISTENT_ENTITY, true); -// livingEntityList.add(livingEntity); -// } -// }.runTaskLater(MetadataHandler.PLUGIN, 1); -// -// } -// -// public static boolean hasNameKey(LivingEntity livingEntity) { -// -// if (livingEntity.getCustomName() == null) return false; -// return (livingEntity.getCustomName().contains(encodedKey)); -// -// } -// -// @EventHandler -// public void onChunkLoad(ChunkLoadEvent event) { -// -// for (Entity entity : event.getChunk().getEntities()) -// if (entity instanceof LivingEntity) -// if (hasNameKey((LivingEntity) entity)) -// if (!livingEntityList.contains(entity)) -// livingEntityList.add((LivingEntity) entity); -// -// } -// -// @EventHandler(priority = EventPriority.LOWEST) -// public void onDamage(EntityDamageEvent event) { -// if (event.getEntity().hasMetadata(MetadataHandler.LIVINGENTITY_DISPLAY)) -// if (!event.getCause().equals(EntityDamageEvent.DamageCause.ENTITY_ATTACK)) -// event.setCancelled(true); -// -// } -// -// @EventHandler(priority = EventPriority.LOWEST) -// public void onEntityDamage(EntityDamageByEntityEvent event) { -// -// if (event.getEntity().hasMetadata(MetadataHandler.LIVINGENTITY_DISPLAY)) -// if (event.getDamager().isOp()) { -// event.getEntity().remove(); -// event.setCancelled(true); -// } else -// event.setCancelled(true); -// -// } -// -// @EventHandler -// public void onFire(EntityCombustEvent event) { -// -// if (event.getEntity().hasMetadata(MetadataHandler.LIVINGENTITY_DISPLAY)) -// event.setCancelled(true); -// -// } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/displays/HealthDisplay.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/displays/HealthDisplay.java deleted file mode 100644 index bb77ed956..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/displays/HealthDisplay.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobconstructor.displays; - -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.entity.ArmorStand; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.LivingEntity; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.Vector; - -public class HealthDisplay implements Listener { - - @EventHandler(priority = EventPriority.MONITOR) - public void onHit(EntityDamageEvent event) { - - if (event.isCancelled()) return; - - if (!(event.getEntity() instanceof LivingEntity) || event.getEntity() instanceof ArmorStand) return; - - if (ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.ONLY_SHOW_HEALTH_FOR_ELITE_MOBS)) { - if (EntityTracker.isEliteMob(event.getEntity())) - displayHealth((LivingEntity) event.getEntity(), event.getFinalDamage()); - - } else - displayHealth((LivingEntity) event.getEntity(), event.getFinalDamage()); - - } - - public static void displayHealth(LivingEntity livingEntity, double damage) { - - if (!ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.DISPLAY_HEALTH_ON_HIT)) return; - - int maxHealth = (int) livingEntity.getMaxHealth(); - int currentHealth = (int) (livingEntity.getHealth() - damage); - - Location entityLocation = new Location(livingEntity.getWorld(), livingEntity.getLocation().getX(), - livingEntity.getLocation().getY() + livingEntity.getEyeHeight() + 0.5, livingEntity.getLocation().getZ()); - - /* - Dirty fix: armorstands don't render invisibly on their first tick, so it gets moved elsewhere temporarily - */ - ArmorStand armorStand = (ArmorStand) entityLocation.getWorld().spawnEntity(entityLocation.add(new Vector(0, 50, 0)), EntityType.ARMOR_STAND); - - armorStand.setVisible(false); - armorStand.setMarker(true); - armorStand.setCustomName(setHealthColor(currentHealth, maxHealth) + "" + currentHealth + "/" + maxHealth); - armorStand.setGravity(false); - EntityTracker.registerCullableEntity(armorStand); - - - new BukkitRunnable() { - - int taskTimer = 0; - - @Override - public void run() { - - armorStand.setCustomNameVisible(true); - - Location newLocation = new Location(livingEntity.getWorld(), livingEntity.getLocation().getX(), - livingEntity.getLocation().getY() + livingEntity.getEyeHeight() + 0.5, livingEntity.getLocation().getZ()); - - armorStand.teleport(newLocation); - - taskTimer++; - - if (taskTimer == 15) { - - cancel(); - EntityTracker.unregisterCullableEntity(armorStand); - armorStand.remove(); - - } - - } - - }.runTaskTimer(Bukkit.getPluginManager().getPlugin(MetadataHandler.ELITE_MOBS), 1, 1L); - - } - - /* - Color progression: Dark green - Green - Red - Dark red - */ - private static ChatColor setHealthColor(int currentHealth, int maxHealth) { - - double healthPercentage = currentHealth * 100 / maxHealth; - - if (healthPercentage > 75) { - - return ChatColor.DARK_GREEN; - - } - - if (healthPercentage > 50) { - - return ChatColor.GREEN; - - } - - if (healthPercentage > 25) { - - return ChatColor.RED; - - } - - if (healthPercentage > 0) { - - return ChatColor.DARK_RED; - - } - - return ChatColor.DARK_RED; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/PluginMobProperties.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/PluginMobProperties.java index 2c0e1beb1..d857624db 100644 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/PluginMobProperties.java +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/PluginMobProperties.java @@ -1,9 +1,7 @@ package com.magmaguy.elitemobs.mobconstructor.mobdata; -import com.magmaguy.elitemobs.config.ConfigValues; import com.magmaguy.elitemobs.config.DefaultConfig; import com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs.EliteMobProperties; -import com.magmaguy.elitemobs.mobconstructor.mobdata.passivemobs.SuperMobProperties; import org.bukkit.entity.EntityType; public abstract class PluginMobProperties { @@ -12,6 +10,11 @@ public abstract class PluginMobProperties { public String name; public EntityType entityType; public double defaultMaxHealth; + public double baseDamage; + + public static void initializePluginMobValues() { + EliteMobProperties.initializeEliteMobValues(); + } public boolean isEnabled() { return isEnabled; @@ -21,22 +24,20 @@ public String getName() { return this.name; } + public String getName(int level) { + return this.name.replace("$level", level + ""); + } + public EntityType getEntityType() { return this.entityType; } - public double getDefaultMaxHealth() { return defaultMaxHealth; } public double getSuperMobMaxHealth() { - return defaultMaxHealth * ConfigValues.defaultConfig.getInt(DefaultConfig.SUPERMOB_STACK_AMOUNT); - } - - public static void initializePluginMobValues() { - SuperMobProperties.initializeSuperMobValues(); - EliteMobProperties.initializeEliteMobValues(); + return defaultMaxHealth * DefaultConfig.getSuperMobStackAmount(); } } diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteBee.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteBee.java new file mode 100644 index 000000000..fa108666e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteBee.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import org.bukkit.entity.EntityType; + +public class EliteBee extends EliteMobProperties { + + public EliteBee() { + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.BEE).getName(); + this.entityType = EntityType.BEE; + this.defaultMaxHealth = 10; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.BEE).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.BEE).isEnabled(); + eliteMobData.add(this); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteBlaze.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteBlaze.java index fdac8be09..026279fdd 100644 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteBlaze.java +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteBlaze.java @@ -1,30 +1,18 @@ package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.TranslationConfig; -import com.magmaguy.elitemobs.config.ValidMobsConfig; +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; import org.bukkit.entity.EntityType; public class EliteBlaze extends EliteMobProperties { public EliteBlaze() { - - this.name = ConfigValues.translationConfig.getString(TranslationConfig.NAME_BLAZE); - + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.BLAZE).getName(); this.entityType = EntityType.BLAZE; - this.defaultMaxHealth = 20; - - this.validDefensivePowers.addAll(super.getAllDefensivePowers()); - this.validOffensivePowers.addAll(super.getAllOffensivePowers()); - this.validMiscellaneousPowers.addAll(super.getAllMiscellaneousPowers()); - - this.isEnabled = ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.VALID_AGGRESSIVE_ELITEMOBS + getEntityType().toString()) && - ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_AGGRESSIVE_ELITEMOBS); - - if (this.isEnabled) - eliteMobData.add(this); - + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.BLAZE).getBaseDamage(); + super.addMajorPower("tracking_fireball.yml"); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.BLAZE).isEnabled(); + eliteMobData.add(this); } } diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteBogged.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteBogged.java new file mode 100644 index 000000000..a929f0cb7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteBogged.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import org.bukkit.entity.EntityType; + +public class EliteBogged extends EliteMobProperties { + + public EliteBogged() { + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.BOGGED).getName(); + this.entityType = EntityType.BOGGED; + this.defaultMaxHealth = 16; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.BOGGED).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.BOGGED).isEnabled(); + eliteMobData.add(this); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteBreeze.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteBreeze.java new file mode 100644 index 000000000..43fdb24bd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteBreeze.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import org.bukkit.entity.EntityType; + +public class EliteBreeze extends EliteMobProperties { + + public EliteBreeze() { + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.BREEZE).getName(); + this.entityType = EntityType.BREEZE; + this.defaultMaxHealth = 30; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.BREEZE).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.BREEZE).isEnabled(); + eliteMobData.add(this); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteCaveSpider.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteCaveSpider.java index b0f71d8c1..24538a02c 100644 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteCaveSpider.java +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteCaveSpider.java @@ -1,30 +1,17 @@ package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.TranslationConfig; -import com.magmaguy.elitemobs.config.ValidMobsConfig; +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; import org.bukkit.entity.EntityType; public class EliteCaveSpider extends EliteMobProperties { public EliteCaveSpider() { - - this.name = ConfigValues.translationConfig.getString(TranslationConfig.NAME_CAVE_SPIDER); - + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.CAVE_SPIDER).getName(); this.entityType = EntityType.CAVE_SPIDER; - this.defaultMaxHealth = 12; - - this.validDefensivePowers.addAll(super.getAllDefensivePowers()); - this.validOffensivePowers.addAll(super.getAllOffensivePowers()); - this.validMiscellaneousPowers.addAll(super.getAllMiscellaneousPowers()); - - this.isEnabled = ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.VALID_AGGRESSIVE_ELITEMOBS + getEntityType().toString()) && - ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_AGGRESSIVE_ELITEMOBS); - - if (this.isEnabled) - eliteMobData.add(this); - + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.CAVE_SPIDER).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.CAVE_SPIDER).isEnabled(); + eliteMobData.add(this); } } diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteCreeper.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteCreeper.java index 71710c87e..76cbe6679 100644 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteCreeper.java +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteCreeper.java @@ -1,34 +1,18 @@ package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.TranslationConfig; -import com.magmaguy.elitemobs.config.ValidMobsConfig; -import com.magmaguy.elitemobs.mobpowers.defensivepowers.Invisibility; +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; import org.bukkit.entity.EntityType; public class EliteCreeper extends EliteMobProperties { public EliteCreeper() { - - this.name = ConfigValues.translationConfig.getString(TranslationConfig.NAME_CREEPER); - + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.CREEPER).getName(); this.entityType = EntityType.CREEPER; - this.defaultMaxHealth = 20; - - this.validDefensivePowers.addAll(super.getAllDefensivePowers()); - this.validOffensivePowers.addAll(super.getAllOffensivePowers()); - this.validMiscellaneousPowers.addAll(super.getAllMiscellaneousPowers()); - -// todo: add a way to configure powers per entity type - this.validMiscellaneousPowers.remove(new Invisibility()); - - isEnabled = ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.VALID_AGGRESSIVE_ELITEMOBS + getEntityType().toString()) && - ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_AGGRESSIVE_ELITEMOBS); - - if (this.isEnabled) - eliteMobData.add(this); - + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.CREEPER).getBaseDamage(); + super.removeDefensivePower("invisibility.yml"); + isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.CREEPER).isEnabled(); + eliteMobData.add(this); } } diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteDrowned.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteDrowned.java new file mode 100644 index 000000000..9b40f6670 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteDrowned.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import org.bukkit.entity.EntityType; + +public class EliteDrowned extends EliteMobProperties { + + public EliteDrowned() { + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.DROWNED).getName(); + this.entityType = EntityType.DROWNED; + this.defaultMaxHealth = 20; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.DROWNED).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.DROWNED).isEnabled(); + eliteMobData.add(this); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteElderGuardian.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteElderGuardian.java new file mode 100644 index 000000000..7d7d07960 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteElderGuardian.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import org.bukkit.entity.EntityType; + +public class EliteElderGuardian extends EliteMobProperties { + public EliteElderGuardian() { + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.ELDER_GUARDIAN).getName(); + this.entityType = EntityType.ELDER_GUARDIAN; + this.defaultMaxHealth = 80; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.ELDER_GUARDIAN).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.ELDER_GUARDIAN).isEnabled(); + eliteMobData.add(this); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteEnderDragon.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteEnderDragon.java new file mode 100644 index 000000000..e2bd97794 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteEnderDragon.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import org.bukkit.entity.EntityType; + +public class EliteEnderDragon extends EliteMobProperties { + public EliteEnderDragon() { + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.ENDER_DRAGON).getName(); + this.entityType = EntityType.ENDER_DRAGON; + this.defaultMaxHealth = 200; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.ENDER_DRAGON).getBaseDamage(); + isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.ENDER_DRAGON).isEnabled(); + eliteMobData.add(this); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteEnderman.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteEnderman.java index e4eb34031..8f539b8e8 100644 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteEnderman.java +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteEnderman.java @@ -1,30 +1,17 @@ package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.TranslationConfig; -import com.magmaguy.elitemobs.config.ValidMobsConfig; +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; import org.bukkit.entity.EntityType; public class EliteEnderman extends EliteMobProperties { public EliteEnderman() { - - this.name = ConfigValues.translationConfig.getString(TranslationConfig.NAME_ENDERMAN); - + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.ENDERMAN).getName(); this.entityType = EntityType.ENDERMAN; - this.defaultMaxHealth = 40; - - this.validDefensivePowers.addAll(super.getAllDefensivePowers()); - this.validOffensivePowers.addAll(super.getAllOffensivePowers()); - this.validMiscellaneousPowers.addAll(super.getAllMiscellaneousPowers()); - - isEnabled = ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.VALID_AGGRESSIVE_ELITEMOBS + getEntityType().toString()) && - ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_AGGRESSIVE_ELITEMOBS); - - if (this.isEnabled) - eliteMobData.add(this); - + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.ENDERMAN).getBaseDamage(); + isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.ENDERMAN).isEnabled(); + eliteMobData.add(this); } } diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteEndermite.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteEndermite.java index 96beb4e9e..50698ab7d 100644 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteEndermite.java +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteEndermite.java @@ -1,30 +1,17 @@ package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.TranslationConfig; -import com.magmaguy.elitemobs.config.ValidMobsConfig; +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; import org.bukkit.entity.EntityType; public class EliteEndermite extends EliteMobProperties { public EliteEndermite() { - - this.name = ConfigValues.translationConfig.getString(TranslationConfig.NAME_ENDERMITE); - + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.ENDERMITE).getName(); this.entityType = EntityType.ENDERMITE; - this.defaultMaxHealth = 8; - - this.validDefensivePowers.addAll(super.getAllDefensivePowers()); - this.validOffensivePowers.addAll(super.getAllOffensivePowers()); - this.validMiscellaneousPowers.addAll(super.getAllMiscellaneousPowers()); - - this.isEnabled = ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.VALID_AGGRESSIVE_ELITEMOBS + getEntityType().toString()) && - ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_AGGRESSIVE_ELITEMOBS); - - if (this.isEnabled) - eliteMobData.add(this); - + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.ENDERMITE).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.ENDERMITE).isEnabled(); + eliteMobData.add(this); } } diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteEvoker.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteEvoker.java new file mode 100644 index 000000000..e614eeb75 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteEvoker.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import org.bukkit.entity.EntityType; + +public class EliteEvoker extends EliteMobProperties { + public EliteEvoker() { + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.EVOKER).getName(); + this.entityType = EntityType.EVOKER; + this.defaultMaxHealth = 24; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.EVOKER).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.EVOKER).isEnabled(); + eliteMobData.add(this); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteGhast.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteGhast.java new file mode 100644 index 000000000..d02c6bda3 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteGhast.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import org.bukkit.entity.EntityType; + +public class EliteGhast extends EliteMobProperties { + public EliteGhast() { + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.GHAST).getName(); + this.entityType = EntityType.GHAST; + this.defaultMaxHealth = 10; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.GHAST).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.GHAST).isEnabled(); + eliteMobData.add(this); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteGoat.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteGoat.java new file mode 100644 index 000000000..df8b1b73f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteGoat.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import org.bukkit.entity.EntityType; + +public class EliteGoat extends EliteMobProperties { + public EliteGoat() { + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.GOAT).getName(); + this.entityType = EntityType.GOAT; + this.defaultMaxHealth = 10; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.GOAT).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.GOAT).isEnabled(); + eliteMobData.add(this); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteGuardian.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteGuardian.java new file mode 100644 index 000000000..de088ce10 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteGuardian.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import org.bukkit.entity.EntityType; + +public class EliteGuardian extends EliteMobProperties { + public EliteGuardian() { + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.GUARDIAN).getName(); + this.entityType = EntityType.GUARDIAN; + this.defaultMaxHealth = 30; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.GUARDIAN).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.GUARDIAN).isEnabled(); + eliteMobData.add(this); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteHoglin.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteHoglin.java new file mode 100644 index 000000000..73f223ff0 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteHoglin.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import org.bukkit.entity.EntityType; + +public class EliteHoglin extends EliteMobProperties { + public EliteHoglin() { + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.HOGLIN).getName(); + this.entityType = EntityType.HOGLIN; + this.defaultMaxHealth = 40; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.HOGLIN).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.HOGLIN).isEnabled(); + eliteMobData.add(this); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteHusk.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteHusk.java index 4e90a0781..f599cbc6a 100644 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteHusk.java +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteHusk.java @@ -1,30 +1,17 @@ package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.TranslationConfig; -import com.magmaguy.elitemobs.config.ValidMobsConfig; +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; import org.bukkit.entity.EntityType; public class EliteHusk extends EliteMobProperties { public EliteHusk() { - - this.name = ConfigValues.translationConfig.getString(TranslationConfig.NAME_HUSK); - + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.HUSK).getName(); this.entityType = EntityType.HUSK; - this.defaultMaxHealth = 20; - - this.validDefensivePowers.addAll(super.getAllDefensivePowers()); - this.validOffensivePowers.addAll(super.getAllOffensivePowers()); - this.validMiscellaneousPowers.addAll(super.getAllMiscellaneousPowers()); - - isEnabled = ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.VALID_AGGRESSIVE_ELITEMOBS + getEntityType().toString()) && - ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_AGGRESSIVE_ELITEMOBS); - - if (this.isEnabled) - eliteMobData.add(this); - + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.HUSK).getBaseDamage(); + isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.HUSK).isEnabled(); + eliteMobData.add(this); } } diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteIllusioner.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteIllusioner.java new file mode 100644 index 000000000..7e4992c76 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteIllusioner.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import org.bukkit.entity.EntityType; + +public class EliteIllusioner extends EliteMobProperties { + public EliteIllusioner() { + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.ILLUSIONER).getName(); + this.entityType = EntityType.ILLUSIONER; + this.defaultMaxHealth = 32; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.ILLUSIONER).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.ILLUSIONER).isEnabled(); + eliteMobData.add(this); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteIronGolem.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteIronGolem.java index 195b44895..76807a989 100644 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteIronGolem.java +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteIronGolem.java @@ -1,30 +1,17 @@ package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.TranslationConfig; -import com.magmaguy.elitemobs.config.ValidMobsConfig; +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; import org.bukkit.entity.EntityType; public class EliteIronGolem extends EliteMobProperties { public EliteIronGolem() { - - this.name = ConfigValues.translationConfig.getString(TranslationConfig.NAME_IRON_GOLEM); - + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.IRON_GOLEM).getName(); this.entityType = EntityType.IRON_GOLEM; - this.defaultMaxHealth = 100; - - this.validDefensivePowers.addAll(super.getAllDefensivePowers()); - this.validOffensivePowers.addAll(super.getAllOffensivePowers()); - this.validMiscellaneousPowers.addAll(super.getAllMiscellaneousPowers()); - - isEnabled = ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.VALID_AGGRESSIVE_ELITEMOBS + getEntityType().toString()) && - ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_AGGRESSIVE_ELITEMOBS); - - if (this.isEnabled) - eliteMobData.add(this); - + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.IRON_GOLEM).getBaseDamage(); + isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.IRON_GOLEM).isEnabled(); + eliteMobData.add(this); } } diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteKillerBunny.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteKillerBunny.java new file mode 100644 index 000000000..46b0977b4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteKillerBunny.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import org.bukkit.entity.EntityType; + +public class EliteKillerBunny extends EliteMobProperties { + public EliteKillerBunny() { + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.RABBIT).getName(); + this.entityType = EntityType.RABBIT; + this.defaultMaxHealth = 3; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.RABBIT).getBaseDamage(); + isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.RABBIT).isEnabled(); + eliteMobData.add(this); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteLlama.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteLlama.java new file mode 100644 index 000000000..57838c767 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteLlama.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import org.bukkit.entity.EntityType; + +public class EliteLlama extends EliteMobProperties { + public EliteLlama() { + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.LLAMA).getName(); + this.entityType = EntityType.LLAMA; + this.defaultMaxHealth = 30; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.LLAMA).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.LLAMA).isEnabled(); + eliteMobData.add(this); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteMagmaCube.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteMagmaCube.java new file mode 100644 index 000000000..b266bef91 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteMagmaCube.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import org.bukkit.entity.EntityType; + +public class EliteMagmaCube extends EliteMobProperties { + public EliteMagmaCube() { + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.MAGMA_CUBE).getName(); + this.entityType = EntityType.MAGMA_CUBE; + this.defaultMaxHealth = 16; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.MAGMA_CUBE).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.MAGMA_CUBE).isEnabled(); + eliteMobData.add(this); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteMobProperties.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteMobProperties.java index 4f656174b..6f8ba741f 100644 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteMobProperties.java +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteMobProperties.java @@ -1,22 +1,19 @@ package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; +import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; import com.magmaguy.elitemobs.mobconstructor.mobdata.PluginMobProperties; -import com.magmaguy.elitemobs.mobpowers.defensivepowers.*; -import com.magmaguy.elitemobs.mobpowers.majorpowers.MajorPower; -import com.magmaguy.elitemobs.mobpowers.minorpowers.MinorPower; -import com.magmaguy.elitemobs.mobpowers.miscellaneouspowers.BonusLoot; -import com.magmaguy.elitemobs.mobpowers.miscellaneouspowers.MovementSpeed; -import com.magmaguy.elitemobs.mobpowers.miscellaneouspowers.Taunt; -import com.magmaguy.elitemobs.mobpowers.offensivepowers.*; +import com.magmaguy.elitemobs.powers.meta.ElitePower; +import lombok.Getter; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; -import java.util.Arrays; import java.util.HashSet; -import static com.magmaguy.elitemobs.utils.VersionChecker.currentVersionIsUnder; - public abstract class EliteMobProperties extends PluginMobProperties { /* @@ -24,117 +21,87 @@ public abstract class EliteMobProperties extends PluginMobProperties { */ public static HashSet eliteMobData = new HashSet<>(); - public HashSet validMajorPowers = new HashSet<>(); - public HashSet validDefensivePowers = new HashSet<>(); - public HashSet validOffensivePowers = new HashSet<>(); - public HashSet validMiscellaneousPowers = new HashSet<>(); - - public HashSet getValidMajorPowers() { - return validMajorPowers; - } - - public HashSet getValidDefensivePowers() { - return validDefensivePowers; - } + @Getter + private final HashSet validMajorPowers = new HashSet<>(); + @Getter + private final HashSet validDefensivePowers = (HashSet) ElitePower.getDefensivePowers().clone(); + @Getter + private final HashSet validOffensivePowers = (HashSet) ElitePower.getOffensivePowers().clone(); + @Getter + private final HashSet validMiscellaneousPowers = (HashSet) ElitePower.getMiscellaneousPowers().clone(); - public HashSet getValidOffensivePowers() { - return validOffensivePowers; - } - - public HashSet getValidMiscellaneousPowers() { - return validMiscellaneousPowers; - } - - public HashSet getAllDefensivePowers() { - return new HashSet<>(Arrays.asList( - new Invisibility(), - new InvulnerabilityArrow(), - new InvulnerabilityFallDamage(), - new InvulnerabilityFire(), - new InvulnerabilityKnockback() - )); - } - - public HashSet getAllOffensivePowers() { - return new HashSet<>(Arrays.asList( - new AttackArrow(), - new AttackBlinding(), - new AttackConfusing(), - new AttackFire(), - new AttackFireball(), - new AttackFreeze(), - new AttackGravity(), - new AttackPoison(), - new AttackPush(), - new AttackWeakness(), - new AttackWeb(), - new AttackWither() - )); - } - - public HashSet getAllMiscellaneousPowers() { - return new HashSet<>(Arrays.asList( - new BonusLoot(), - new MovementSpeed(), - new Taunt() - )); + public static void initializeEliteMobValues() { + new EliteBlaze(); + new EliteCaveSpider(); + new EliteCreeper(); + new EliteDrowned(); + new EliteElderGuardian(); + new EliteGuardian(); + new EliteEnderman(); + new EliteIronGolem(); + new ElitePhantom(); + new EliteZombifiedPiglin(); + new ElitePillager(); + new EliteSilverfish(); + new EliteSkeleton(); + new EliteSpider(); + new EliteWitch(); + new EliteWitherSkeleton(); + new EliteZombie(); + new EliteEndermite(); + new EliteEvoker(); + new EliteStray(); + new EliteHusk(); + new EliteIllusioner(); + new EliteVex(); + new EliteVindicator(); + new ElitePolarBear(); + new EliteRavager(); + new EliteGhast(); + new EliteZoglin(); + new ElitePiglin(); + new EliteHoglin(); + new ElitePiglinBrute(); + new EliteBee(); + new EliteWolf(); + new EliteEnderDragon(); + new EliteShulker(); + new EliteKillerBunny(); + new EliteGoat(); + new EliteLlama(); + new EliteWarden(); + new EliteSlime(); + new EliteMagmaCube(); + new EliteBogged(); + new EliteBreeze(); + new EliteWither(); } - public static void initializeEliteMobValues() { - EliteBlaze eliteBlaze = new EliteBlaze(); - EliteCaveSpider eliteCaveSpider = new EliteCaveSpider(); - EliteCreeper eliteCreeper = new EliteCreeper(); - EliteEnderman eliteEnderman = new EliteEnderman(); - EliteIronGolem eliteIronGolem = new EliteIronGolem(); - ElitePigZombie elitePigZombie = new ElitePigZombie(); - EliteSilverfish eliteSilverfish = new EliteSilverfish(); - EliteSkeleton eliteSkeleton = new EliteSkeleton(); - EliteSpider eliteSpider = new EliteSpider(); - EliteWitch eliteWitch = new EliteWitch(); - EliteWitherSkeleton eliteWitherSkeleton = new EliteWitherSkeleton(); - EliteZombie eliteZombie = new EliteZombie(); - /* - Post-1.8 - */ - if (!currentVersionIsUnder(1, 8)) { - EliteEndermite eliteEndermite = new EliteEndermite(); - } - /* - Post-1.11 - */ - if (!currentVersionIsUnder(1, 11)) { - EliteStray eliteStray = new EliteStray(); - EliteHusk eliteHusk = new EliteHusk(); - EliteVex eliteVex = new EliteVex(); - EliteVindicator eliteVindicator = new EliteVindicator(); - ElitePolarBear elitePolarBear = new ElitePolarBear(); - } + public static boolean isValidEliteMobType(Entity entity) { + if (entity instanceof LivingEntity) + return isValidEliteMobType(entity.getType()); + return false; } public static boolean isValidEliteMobType(EntityType entityType) { - for (EliteMobProperties eliteMobProperties : eliteMobData) if (eliteMobProperties.getEntityType().equals(entityType)) - return true; - - return false; - - } - - public static boolean isValidEliteMobType(Entity entity) { - if (entity instanceof LivingEntity) - return isValidEliteMobType(entity.getType()); + if (eliteMobProperties.isEnabled) + return true; return false; } public static EliteMobProperties getPluginData(EntityType entityType) { - for (EliteMobProperties eliteMobProperties : eliteMobData) if (eliteMobProperties.getEntityType().equals(entityType)) return eliteMobProperties; - return null; + } + public static double getBaselineDamage(EntityType entityType, EliteEntity eliteEntity) { + if (eliteEntity instanceof CustomBossEntity customBossEntity && customBossEntity.isNormalizedCombat()) + return MobCombatSettingsConfig.getNormalizedBaselineDamage(); + return getPluginData(entityType).baseDamage; } public static EliteMobProperties getPluginData(Entity entity) { @@ -148,4 +115,17 @@ public static HashSet getValidMobTypes() { return livingEntities; } + public void addMajorPower(String powerName) { + if (PowersConfig.getPower(powerName).isEnabled()) + validMajorPowers.add(PowersConfig.getPower(powerName)); + } + + public void removeOffensivePower(String filename) { + validOffensivePowers.remove(PowersConfig.getPower(filename)); + } + + public void removeDefensivePower(String filename) { + validOffensivePowers.remove(PowersConfig.getPower(filename)); + } + } diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/ElitePhantom.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/ElitePhantom.java new file mode 100644 index 000000000..2cd11ff0d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/ElitePhantom.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import org.bukkit.entity.EntityType; + +public class ElitePhantom extends EliteMobProperties { + + public ElitePhantom() { + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.PHANTOM).getName(); + this.entityType = EntityType.PHANTOM; + this.defaultMaxHealth = 20; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.PHANTOM).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.PHANTOM).isEnabled(); + removeOffensivePower("attack_lightning.yml"); + super.removeDefensivePower("ground_pound.yml"); + eliteMobData.add(this); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/ElitePigZombie.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/ElitePigZombie.java deleted file mode 100644 index 2ada22e7f..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/ElitePigZombie.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; - -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.TranslationConfig; -import com.magmaguy.elitemobs.config.ValidMobsConfig; -import org.bukkit.entity.EntityType; - -public class ElitePigZombie extends EliteMobProperties { - - public ElitePigZombie() { - - this.name = ConfigValues.translationConfig.getString(TranslationConfig.NAME_PIG_ZOMBIE); - - this.entityType = EntityType.PIG_ZOMBIE; - - this.defaultMaxHealth = 20; - - this.validDefensivePowers.addAll(super.getAllDefensivePowers()); - this.validOffensivePowers.addAll(super.getAllOffensivePowers()); - this.validMiscellaneousPowers.addAll(super.getAllMiscellaneousPowers()); - - this.isEnabled = ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.VALID_AGGRESSIVE_ELITEMOBS + getEntityType().toString()) && - ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_AGGRESSIVE_ELITEMOBS); - - if (this.isEnabled) - eliteMobData.add(this); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/ElitePiglin.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/ElitePiglin.java new file mode 100644 index 000000000..b809d6d98 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/ElitePiglin.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import org.bukkit.entity.EntityType; + +public class ElitePiglin extends EliteMobProperties { + public ElitePiglin() { + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.PIGLIN).getName(); + this.entityType = EntityType.PIGLIN; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.PIGLIN).getBaseDamage(); + this.defaultMaxHealth = 16; + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.PIGLIN).isEnabled(); + eliteMobData.add(this); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/ElitePiglinBrute.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/ElitePiglinBrute.java new file mode 100644 index 000000000..363171457 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/ElitePiglinBrute.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import org.bukkit.entity.EntityType; + +public class ElitePiglinBrute extends EliteMobProperties { + public ElitePiglinBrute() { + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.PIGLIN_BRUTE).getName(); + this.entityType = EntityType.PIGLIN_BRUTE; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.PIGLIN_BRUTE).getBaseDamage(); + this.defaultMaxHealth = 50; + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.PIGLIN_BRUTE).isEnabled(); + eliteMobData.add(this); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/ElitePillager.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/ElitePillager.java new file mode 100644 index 000000000..a83236a63 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/ElitePillager.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import org.bukkit.entity.EntityType; + +public class ElitePillager extends EliteMobProperties { + public ElitePillager() { + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.PILLAGER).getName(); + this.entityType = EntityType.PILLAGER; + this.defaultMaxHealth = 24; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.PILLAGER).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.PILLAGER).isEnabled(); + eliteMobData.add(this); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/ElitePolarBear.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/ElitePolarBear.java index fa6ae96e2..b582b08bc 100644 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/ElitePolarBear.java +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/ElitePolarBear.java @@ -1,30 +1,17 @@ package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.TranslationConfig; -import com.magmaguy.elitemobs.config.ValidMobsConfig; +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; import org.bukkit.entity.EntityType; public class ElitePolarBear extends EliteMobProperties { public ElitePolarBear() { - - this.name = ConfigValues.translationConfig.getString(TranslationConfig.NAME_POLAR_BEAR); - + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.POLAR_BEAR).getName(); this.entityType = EntityType.POLAR_BEAR; - this.defaultMaxHealth = 30; - - this.validDefensivePowers.addAll(super.getAllDefensivePowers()); - this.validOffensivePowers.addAll(super.getAllOffensivePowers()); - this.validMiscellaneousPowers.addAll(super.getAllMiscellaneousPowers()); - - this.isEnabled = ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.VALID_AGGRESSIVE_ELITEMOBS + getEntityType().toString()) && - ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_AGGRESSIVE_ELITEMOBS); - - if (this.isEnabled) - eliteMobData.add(this); - + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.POLAR_BEAR).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.POLAR_BEAR).isEnabled(); + eliteMobData.add(this); } } diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteRavager.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteRavager.java new file mode 100644 index 000000000..ea5d23785 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteRavager.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import org.bukkit.entity.EntityType; + +public class EliteRavager extends EliteMobProperties { + public EliteRavager() { + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.RAVAGER).getName(); + this.entityType = EntityType.RAVAGER; + this.defaultMaxHealth = 100; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.RAVAGER).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.RAVAGER).isEnabled(); + eliteMobData.add(this); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteShulker.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteShulker.java new file mode 100644 index 000000000..19563d869 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteShulker.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import org.bukkit.entity.EntityType; + +public class EliteShulker extends EliteMobProperties { + public EliteShulker() { + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.SHULKER).getName(); + this.entityType = EntityType.SHULKER; + this.defaultMaxHealth = 30; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.SHULKER).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.SHULKER).isEnabled(); + eliteMobData.add(this); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteSilverfish.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteSilverfish.java index 663e6b5d8..a13aa7e54 100644 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteSilverfish.java +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteSilverfish.java @@ -1,30 +1,17 @@ package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.TranslationConfig; -import com.magmaguy.elitemobs.config.ValidMobsConfig; +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; import org.bukkit.entity.EntityType; public class EliteSilverfish extends EliteMobProperties { public EliteSilverfish() { - - this.name = ConfigValues.translationConfig.getString(TranslationConfig.NAME_SILVERFISH); - + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.SILVERFISH).getName(); this.entityType = EntityType.SILVERFISH; - - this.defaultMaxHealth = 20; - - this.validDefensivePowers.addAll(super.getAllDefensivePowers()); - this.validOffensivePowers.addAll(super.getAllOffensivePowers()); - this.validMiscellaneousPowers.addAll(super.getAllMiscellaneousPowers()); - - this.isEnabled = ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.VALID_AGGRESSIVE_ELITEMOBS + getEntityType().toString()) && - ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_AGGRESSIVE_ELITEMOBS); - - if (this.isEnabled) - eliteMobData.add(this); - + this.defaultMaxHealth = 8; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.SILVERFISH).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.SILVERFISH).isEnabled(); + eliteMobData.add(this); } } diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteSkeleton.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteSkeleton.java index a2d957d1c..7dd77c301 100644 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteSkeleton.java +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteSkeleton.java @@ -1,39 +1,19 @@ package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.TranslationConfig; -import com.magmaguy.elitemobs.config.ValidMobsConfig; -import com.magmaguy.elitemobs.mobpowers.majorpowers.SkeletonPillar; -import com.magmaguy.elitemobs.mobpowers.majorpowers.SkeletonTrackingArrow; +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; import org.bukkit.entity.EntityType; -import java.util.Arrays; -import java.util.HashSet; - public class EliteSkeleton extends EliteMobProperties { public EliteSkeleton() { - - this.name = ConfigValues.translationConfig.getString(TranslationConfig.NAME_SKELETON); - + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.SKELETON).getName(); this.entityType = EntityType.SKELETON; - this.defaultMaxHealth = 20; - - SkeletonTrackingArrow skeletonTrackingArrow = new SkeletonTrackingArrow(); - SkeletonPillar skeletonPillar = new SkeletonPillar(); - this.validMajorPowers = new HashSet<>(Arrays.asList(skeletonPillar, skeletonTrackingArrow)); - - this.validDefensivePowers.addAll(super.getAllDefensivePowers()); - this.validOffensivePowers.addAll(super.getAllOffensivePowers()); - this.validMiscellaneousPowers.addAll(super.getAllMiscellaneousPowers()); - - this.isEnabled = ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.VALID_AGGRESSIVE_ELITEMOBS + getEntityType().toString()) && - ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_AGGRESSIVE_ELITEMOBS); - - if (this.isEnabled) - eliteMobData.add(this); - + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.SKELETON).getBaseDamage(); + super.addMajorPower("skeleton_pillar.yml"); + super.addMajorPower("skeleton_tracking_arrow.yml"); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.SKELETON).isEnabled(); + eliteMobData.add(this); } } diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteSlime.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteSlime.java new file mode 100644 index 000000000..72e9536e4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteSlime.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import org.bukkit.entity.EntityType; + +public class EliteSlime extends EliteMobProperties { + public EliteSlime() { + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.SLIME).getName(); + this.entityType = EntityType.SLIME; + this.defaultMaxHealth = 16; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.SLIME).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.SLIME).isEnabled(); + eliteMobData.add(this); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteSpider.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteSpider.java index 931b1f80a..7bc0015ad 100644 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteSpider.java +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteSpider.java @@ -1,30 +1,17 @@ package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.TranslationConfig; -import com.magmaguy.elitemobs.config.ValidMobsConfig; +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; import org.bukkit.entity.EntityType; public class EliteSpider extends EliteMobProperties { public EliteSpider() { - - this.name = ConfigValues.translationConfig.getString(TranslationConfig.NAME_SPIDER); - + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.SPIDER).getName(); this.entityType = EntityType.SPIDER; - this.defaultMaxHealth = 16; - - this.validDefensivePowers.addAll(super.getAllDefensivePowers()); - this.validOffensivePowers.addAll(super.getAllOffensivePowers()); - this.validMiscellaneousPowers.addAll(super.getAllMiscellaneousPowers()); - - this.isEnabled = ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.VALID_AGGRESSIVE_ELITEMOBS + getEntityType().toString()) && - ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_AGGRESSIVE_ELITEMOBS); - - if (this.isEnabled) - eliteMobData.add(this); - + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.SPIDER).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.SPIDER).isEnabled(); + eliteMobData.add(this); } } diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteStray.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteStray.java index fc0175c38..598078941 100644 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteStray.java +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteStray.java @@ -1,30 +1,17 @@ package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.TranslationConfig; -import com.magmaguy.elitemobs.config.ValidMobsConfig; +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; import org.bukkit.entity.EntityType; public class EliteStray extends EliteMobProperties { public EliteStray() { - - this.name = ConfigValues.translationConfig.getString(TranslationConfig.NAME_STRAY); - + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.STRAY).getName(); this.entityType = EntityType.STRAY; - this.defaultMaxHealth = 20; - - this.validDefensivePowers.addAll(super.getAllDefensivePowers()); - this.validOffensivePowers.addAll(super.getAllOffensivePowers()); - this.validMiscellaneousPowers.addAll(super.getAllMiscellaneousPowers()); - - this.isEnabled = ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.VALID_AGGRESSIVE_ELITEMOBS + getEntityType().toString()) && - ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_AGGRESSIVE_ELITEMOBS); - - if (this.isEnabled) - eliteMobData.add(this); - + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.STRAY).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.STRAY).isEnabled(); + eliteMobData.add(this); } } diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteVex.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteVex.java index bf1a346c8..d63d57a7e 100644 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteVex.java +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteVex.java @@ -1,30 +1,18 @@ package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.TranslationConfig; -import com.magmaguy.elitemobs.config.ValidMobsConfig; +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; import org.bukkit.entity.EntityType; public class EliteVex extends EliteMobProperties { public EliteVex() { - - this.name = ConfigValues.translationConfig.getString(TranslationConfig.NAME_VEX); - + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.VEX).getName(); this.entityType = EntityType.VEX; - this.defaultMaxHealth = 14; - - this.validDefensivePowers.addAll(super.getAllDefensivePowers()); - this.validOffensivePowers.addAll(super.getAllOffensivePowers()); - this.validMiscellaneousPowers.addAll(super.getAllMiscellaneousPowers()); - - this.isEnabled = ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.VALID_AGGRESSIVE_ELITEMOBS + getEntityType().toString()) && - ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_AGGRESSIVE_ELITEMOBS); - - if (this.isEnabled) - eliteMobData.add(this); - + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.VEX).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.VEX).isEnabled(); + super.removeDefensivePower("ground_pound.yml"); + eliteMobData.add(this); } } diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteVindicator.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteVindicator.java index e931beaef..18afb3a90 100644 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteVindicator.java +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteVindicator.java @@ -1,30 +1,15 @@ package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.TranslationConfig; -import com.magmaguy.elitemobs.config.ValidMobsConfig; +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; import org.bukkit.entity.EntityType; public class EliteVindicator extends EliteMobProperties { - public EliteVindicator() { - - this.name = ConfigValues.translationConfig.getString(TranslationConfig.NAME_VINDICATOR); - + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.VINDICATOR).getName(); this.entityType = EntityType.VINDICATOR; - this.defaultMaxHealth = 24; - - this.validDefensivePowers.addAll(super.getAllDefensivePowers()); - this.validOffensivePowers.addAll(super.getAllOffensivePowers()); - this.validMiscellaneousPowers.addAll(super.getAllMiscellaneousPowers()); - - this.isEnabled = ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.VALID_AGGRESSIVE_ELITEMOBS + getEntityType().toString()) && - ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_AGGRESSIVE_ELITEMOBS); - - if (this.isEnabled) - eliteMobData.add(this); - + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.VINDICATOR).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.VINDICATOR).isEnabled(); + eliteMobData.add(this); } - } diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteWarden.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteWarden.java new file mode 100644 index 000000000..fdbf04ac4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteWarden.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import org.bukkit.entity.EntityType; + +public class EliteWarden extends EliteMobProperties { + public EliteWarden() { + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.WARDEN).getName(); + this.entityType = EntityType.WARDEN; + this.defaultMaxHealth = 500; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.WARDEN).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.WARDEN).isEnabled(); + eliteMobData.add(this); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteWitch.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteWitch.java index 2cb112c0c..7a97e1c34 100644 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteWitch.java +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteWitch.java @@ -1,30 +1,17 @@ package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.TranslationConfig; -import com.magmaguy.elitemobs.config.ValidMobsConfig; +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; import org.bukkit.entity.EntityType; public class EliteWitch extends EliteMobProperties { public EliteWitch() { - - this.name = ConfigValues.translationConfig.getString(TranslationConfig.NAME_WITCH); - + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.WITCH).getName(); this.entityType = EntityType.WITCH; - this.defaultMaxHealth = 26; - - this.validDefensivePowers.addAll(super.getAllDefensivePowers()); - this.validOffensivePowers.addAll(super.getAllOffensivePowers()); - this.validMiscellaneousPowers.addAll(super.getAllMiscellaneousPowers()); - - this.isEnabled = ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.VALID_AGGRESSIVE_ELITEMOBS + getEntityType().toString()) && - ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_AGGRESSIVE_ELITEMOBS); - - if (this.isEnabled) - eliteMobData.add(this); - + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.WITCH).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.WITCH).isEnabled(); + eliteMobData.add(this); } } diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteWither.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteWither.java new file mode 100644 index 000000000..30484eec1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteWither.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import org.bukkit.entity.EntityType; + +public class EliteWither extends EliteMobProperties { + + public EliteWither() { + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.WITHER).getName(); + this.entityType = EntityType.WITHER; + this.defaultMaxHealth = 300; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.WITHER).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.WITHER).isEnabled(); + eliteMobData.add(this); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteWitherSkeleton.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteWitherSkeleton.java index c5cb0dc0c..e1024409d 100644 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteWitherSkeleton.java +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteWitherSkeleton.java @@ -1,30 +1,17 @@ package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.TranslationConfig; -import com.magmaguy.elitemobs.config.ValidMobsConfig; +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; import org.bukkit.entity.EntityType; public class EliteWitherSkeleton extends EliteMobProperties { public EliteWitherSkeleton() { - - this.name = ConfigValues.translationConfig.getString(TranslationConfig.NAME_WITHER_SKELETON); - + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.WITHER_SKELETON).getName(); this.entityType = EntityType.WITHER_SKELETON; - this.defaultMaxHealth = 20; - - this.validDefensivePowers.addAll(super.getAllDefensivePowers()); - this.validOffensivePowers.addAll(super.getAllOffensivePowers()); - this.validMiscellaneousPowers.addAll(super.getAllMiscellaneousPowers()); - - this.isEnabled = ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.VALID_AGGRESSIVE_ELITEMOBS + getEntityType().toString()) && - ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_AGGRESSIVE_ELITEMOBS); - - if (this.isEnabled) - eliteMobData.add(this); - + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.WITHER_SKELETON).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.WITHER_SKELETON).isEnabled(); + eliteMobData.add(this); } } diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteWolf.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteWolf.java new file mode 100644 index 000000000..95c7893ac --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteWolf.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import org.bukkit.entity.EntityType; + +public class EliteWolf extends EliteMobProperties { + + public EliteWolf() { + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.WOLF).getName(); + this.entityType = EntityType.WOLF; + this.defaultMaxHealth = 8; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.WOLF).getBaseDamage(); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.WOLF).isEnabled(); + eliteMobData.add(this); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteZoglin.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteZoglin.java new file mode 100644 index 000000000..26a1521ac --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteZoglin.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import org.bukkit.entity.EntityType; + +public class EliteZoglin extends EliteMobProperties { + public EliteZoglin() { + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.ZOGLIN).getName(); + this.entityType = EntityType.ZOGLIN; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.ZOGLIN).getBaseDamage(); + this.defaultMaxHealth = 40; + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.ZOGLIN).isEnabled(); + eliteMobData.add(this); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteZombie.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteZombie.java index 9a7497cdf..dfe993516 100644 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteZombie.java +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteZombie.java @@ -1,41 +1,21 @@ package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.TranslationConfig; -import com.magmaguy.elitemobs.config.ValidMobsConfig; -import com.magmaguy.elitemobs.mobpowers.majorpowers.*; +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; import org.bukkit.entity.EntityType; -import java.util.Arrays; -import java.util.HashSet; - public class EliteZombie extends EliteMobProperties { public EliteZombie() { - - this.name = ConfigValues.translationConfig.getString(TranslationConfig.NAME_ZOMBIE); - + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.ZOMBIE).getName(); this.entityType = EntityType.ZOMBIE; - this.defaultMaxHealth = 20; - - ZombieBloat zombieBloat = new ZombieBloat(); - ZombieFriends zombieFriends = new ZombieFriends(); - ZombieNecronomicon zombieNecronomicon = new ZombieNecronomicon(); - ZombieParents zombieParents = new ZombieParents(); - ZombieTeamRocket zombieTeamRocket = new ZombieTeamRocket(); - this.validMajorPowers = new HashSet<>(Arrays.asList(zombieBloat, zombieFriends, zombieNecronomicon, zombieParents, zombieTeamRocket)); - - this.validDefensivePowers.addAll(super.getAllDefensivePowers()); - this.validOffensivePowers.addAll(super.getAllOffensivePowers()); - this.validMiscellaneousPowers.addAll(super.getAllMiscellaneousPowers()); - - this.isEnabled = ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.VALID_AGGRESSIVE_ELITEMOBS + getEntityType().toString()) && - ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_AGGRESSIVE_ELITEMOBS); - - if (this.isEnabled) - eliteMobData.add(this); - + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.ZOMBIE).getBaseDamage(); + super.addMajorPower("zombie_bloat.yml"); + super.addMajorPower("zombie_friends.yml"); + super.addMajorPower("zombie_necronomicon.yml"); + super.addMajorPower("zombie_parents.yml"); + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.ZOMBIE).isEnabled(); + eliteMobData.add(this); } } diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteZombifiedPiglin.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteZombifiedPiglin.java new file mode 100644 index 000000000..5915832bc --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/aggressivemobs/EliteZombifiedPiglin.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs; + +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import org.bukkit.entity.EntityType; + +public class EliteZombifiedPiglin extends EliteMobProperties { + public EliteZombifiedPiglin() { + this.name = MobPropertiesConfig.getMobProperties().get(EntityType.ZOMBIFIED_PIGLIN).getName(); + this.entityType = EntityType.ZOMBIFIED_PIGLIN; + this.baseDamage = MobPropertiesConfig.getMobProperties().get(EntityType.ZOMBIFIED_PIGLIN).getBaseDamage(); + this.defaultMaxHealth = 20; + this.isEnabled = MobPropertiesConfig.getMobProperties().get(EntityType.ZOMBIFIED_PIGLIN).isEnabled(); + eliteMobData.add(this); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/passivemobs/SuperChicken.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/passivemobs/SuperChicken.java deleted file mode 100644 index b2269423e..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/passivemobs/SuperChicken.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.magmaguy.elitemobs.mobconstructor.mobdata.passivemobs; - -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.TranslationConfig; -import com.magmaguy.elitemobs.config.ValidMobsConfig; -import org.bukkit.entity.EntityType; - -public class SuperChicken extends SuperMobProperties { - - public SuperChicken() { - - this.name = ConfigValues.translationConfig.getString(TranslationConfig.NAME_CHICKEN); - - this.entityType = EntityType.CHICKEN; - - this.defaultMaxHealth = 4; - - this.isEnabled = ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.VALID_SUPERMOBS + getEntityType().toString()) && - ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_PASSIVE_SUPERMOBS); - - if (this.isEnabled) { - superMobTypeList.add(this.entityType); - superMobData.add(this); - } - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/passivemobs/SuperCow.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/passivemobs/SuperCow.java deleted file mode 100644 index 16131fb47..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/passivemobs/SuperCow.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.magmaguy.elitemobs.mobconstructor.mobdata.passivemobs; - -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.TranslationConfig; -import com.magmaguy.elitemobs.config.ValidMobsConfig; -import org.bukkit.entity.EntityType; - -public class SuperCow extends SuperMobProperties { - - public SuperCow() { - - this.name = ConfigValues.translationConfig.getString(TranslationConfig.NAME_COW); - - this.entityType = EntityType.COW; - - this.defaultMaxHealth = 10; - - this.isEnabled = ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.VALID_SUPERMOBS + getEntityType().toString()) && - ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_PASSIVE_SUPERMOBS); - - if (this.isEnabled) { - superMobTypeList.add(this.entityType); - superMobData.add(this); - } - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/passivemobs/SuperMobProperties.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/passivemobs/SuperMobProperties.java deleted file mode 100644 index 1b049af51..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/passivemobs/SuperMobProperties.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.magmaguy.elitemobs.mobconstructor.mobdata.passivemobs; - -import com.magmaguy.elitemobs.mobconstructor.mobdata.PluginMobProperties; -import org.bukkit.Bukkit; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.LivingEntity; - -import java.util.HashSet; - -public abstract class SuperMobProperties extends PluginMobProperties { - - public static HashSet superMobTypeList = new HashSet<>(); - public static HashSet superMobData = new HashSet<>(); - - public static void initializeSuperMobValues() { - SuperChicken superChicken = new SuperChicken(); - SuperCow superCow = new SuperCow(); - SuperMushroomCow superMushroomCow = new SuperMushroomCow(); - SuperPig superPig = new SuperPig(); - SuperSheep superSheep = new SuperSheep(); - } - - public static boolean isValidSuperMobType(EntityType entityType) { - return superMobTypeList.contains(entityType); - } - - public static boolean isValidSuperMobType(Entity entity) { - if (entity instanceof LivingEntity) - return isValidSuperMobType(entity.getType()); - return false; - } - - public static SuperMobProperties getDataInstance(EntityType entityType) { - - for (SuperMobProperties superMobType : superMobData) - if (superMobType.getEntityType().equals(entityType)) - return superMobType; - - Bukkit.getLogger().warning("[EliteMobs] Something is wrong with the Super Mob data, notify the dev!"); - return null; - - } - - public static SuperMobProperties getDataInstance(Entity entity) { - return getDataInstance(entity.getType()); - } - - public static double getSuperMobMaxHealth(Entity entity) { - return getDataInstance(entity.getType()).getSuperMobMaxHealth(); - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/passivemobs/SuperMushroomCow.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/passivemobs/SuperMushroomCow.java deleted file mode 100644 index 4aef0f914..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/passivemobs/SuperMushroomCow.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.magmaguy.elitemobs.mobconstructor.mobdata.passivemobs; - -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.TranslationConfig; -import com.magmaguy.elitemobs.config.ValidMobsConfig; -import org.bukkit.entity.EntityType; - -public class SuperMushroomCow extends SuperMobProperties { - - public SuperMushroomCow() { - - this.name = ConfigValues.translationConfig.getString(TranslationConfig.NAME_MUSHROOM_COW); - - this.entityType = EntityType.MUSHROOM_COW; - - this.defaultMaxHealth = 10; - - this.isEnabled = ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.VALID_SUPERMOBS + getEntityType().toString()) && - ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_PASSIVE_SUPERMOBS); - - if (this.isEnabled) { - superMobTypeList.add(this.entityType); - superMobData.add(this); - } - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/passivemobs/SuperPig.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/passivemobs/SuperPig.java deleted file mode 100644 index 47ef4dd6b..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/passivemobs/SuperPig.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.magmaguy.elitemobs.mobconstructor.mobdata.passivemobs; - -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.TranslationConfig; -import com.magmaguy.elitemobs.config.ValidMobsConfig; -import org.bukkit.entity.EntityType; - -public class SuperPig extends SuperMobProperties { - - public SuperPig() { - - this.name = ConfigValues.translationConfig.getString(TranslationConfig.NAME_PIG); - - this.entityType = EntityType.PIG; - - this.defaultMaxHealth = 10; - - this.isEnabled = ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.VALID_SUPERMOBS + getEntityType().toString()) && - ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_PASSIVE_SUPERMOBS); - - if (this.isEnabled) { - superMobTypeList.add(this.entityType); - superMobData.add(this); - } - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/passivemobs/SuperSheep.java b/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/passivemobs/SuperSheep.java deleted file mode 100644 index f29491706..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobconstructor/mobdata/passivemobs/SuperSheep.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.magmaguy.elitemobs.mobconstructor.mobdata.passivemobs; - -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.TranslationConfig; -import com.magmaguy.elitemobs.config.ValidMobsConfig; -import org.bukkit.entity.EntityType; - -public class SuperSheep extends SuperMobProperties { - - public SuperSheep() { - - this.name = ConfigValues.translationConfig.getString(TranslationConfig.NAME_SHEEP); - - this.entityType = EntityType.SHEEP; - - this.defaultMaxHealth = 8; - - this.isEnabled = ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.VALID_SUPERMOBS + getEntityType().toString()) && - ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_PASSIVE_SUPERMOBS); - - if (this.isEnabled) { - superMobTypeList.add(this.entityType); - superMobData.add(this); - } - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/AggroPrevention.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/AggroPrevention.java deleted file mode 100644 index 96b0a3762..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/AggroPrevention.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.magmaguy.elitemobs.mobpowers; - -import com.magmaguy.elitemobs.EntityTracker; -import org.bukkit.entity.IronGolem; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityTargetLivingEntityEvent; - -public class AggroPrevention implements Listener { - - @EventHandler - public void onTarget(EntityTargetLivingEntityEvent event) { - - if (EntityTracker.isEliteMob(event.getEntity()) && - event.getTarget() != null && EntityTracker.isEliteMob(event.getTarget()) && - !(event.getTarget() instanceof IronGolem) && !(event.getEntity() instanceof IronGolem)) - event.setCancelled(true); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/ElitePower.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/ElitePower.java deleted file mode 100644 index 6d39ac018..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/ElitePower.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.magmaguy.elitemobs.mobpowers; - -import org.bukkit.entity.Entity; - -public abstract class ElitePower { - - public abstract void applyPowers(Entity entity); - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/ProjectileLocationGenerator.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/ProjectileLocationGenerator.java deleted file mode 100644 index 52fa18eeb..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/ProjectileLocationGenerator.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers; - -import org.bukkit.Location; -import org.bukkit.entity.LivingEntity; -import org.bukkit.util.Vector; - -public class ProjectileLocationGenerator { - - public static Location generateLocation(LivingEntity targetter, LivingEntity targetted) { - - Location targetterLocation = targetter.getLocation(); - Vector toTargetVector = targetted.getEyeLocation().subtract(targetterLocation).toVector().normalize(); - Location offsetLocation = new Location(targetterLocation.getWorld(), - targetterLocation.getX() + toTargetVector.getX(), - targetterLocation.getY() + 1, - targetterLocation.getZ() + toTargetVector.getZ()); - - return offsetLocation; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/defensivepowers/Invisibility.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/defensivepowers/Invisibility.java deleted file mode 100644 index 1c4647c49..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/defensivepowers/Invisibility.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers.defensivepowers; - -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.mobpowers.minorpowers.MinorPower; -import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; -import org.bukkit.scheduler.BukkitRunnable; - -/** - * Created by MagmaGuy on 28/04/2017. - */ -public class Invisibility extends MinorPower { - - @Override - public void applyPowers(Entity entity) { - new BukkitRunnable() { - @Override - public void run() { - ((LivingEntity) entity).addPotionEffect(new PotionEffect(PotionEffectType.INVISIBILITY, Integer.MAX_VALUE, 1)); - } - }.runTaskLater(MetadataHandler.PLUGIN, 1); - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/defensivepowers/InvulnerabilityArrow.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/defensivepowers/InvulnerabilityArrow.java deleted file mode 100644 index e9dc8e4b8..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/defensivepowers/InvulnerabilityArrow.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers.defensivepowers; - -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.mobpowers.minorpowers.MinorPower; -import org.bukkit.entity.Entity; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageEvent; - -/** - * Created by MagmaGuy on 05/11/2016. - */ -public class InvulnerabilityArrow extends MinorPower implements Listener { - - @Override - public void applyPowers(Entity entity) { - } - - @EventHandler - public void invulnerablityArrow(EntityDamageEvent event) { - - if (EntityTracker.hasPower(this, event.getEntity())) - if (event.getCause().equals(EntityDamageEvent.DamageCause.PROJECTILE)) - event.setCancelled(true); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/defensivepowers/InvulnerabilityFallDamage.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/defensivepowers/InvulnerabilityFallDamage.java deleted file mode 100644 index 862900317..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/defensivepowers/InvulnerabilityFallDamage.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - - -package com.magmaguy.elitemobs.mobpowers.defensivepowers; - -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.mobpowers.minorpowers.MinorPower; -import org.bukkit.entity.Entity; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageEvent; - -/** - * Created by MagmaGuy on 28/11/2016. - */ -public class InvulnerabilityFallDamage extends MinorPower implements Listener { - - @Override - public void applyPowers(Entity entity) { - } - - @EventHandler - public void invulnerabilityFallDamage(EntityDamageEvent event) { - - if (event.getCause().equals(EntityDamageEvent.DamageCause.FALL) && EntityTracker.hasPower(this, event.getEntity())) - event.setCancelled(true); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/defensivepowers/InvulnerabilityFire.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/defensivepowers/InvulnerabilityFire.java deleted file mode 100644 index d8b00a308..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/defensivepowers/InvulnerabilityFire.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers.defensivepowers; - -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.mobpowers.minorpowers.MinorPower; -import org.bukkit.entity.Entity; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageEvent; - -/** - * Created by MagmaGuy on 05/11/2016. - */ -public class InvulnerabilityFire extends MinorPower implements Listener { - - @Override - public void applyPowers(Entity entity) { - } - - @EventHandler - public void invulnerabilityFire(EntityDamageEvent event) { - - if ((event.getCause().equals(EntityDamageEvent.DamageCause.FIRE) || - event.getCause().equals(EntityDamageEvent.DamageCause.FIRE_TICK)) && - EntityTracker.hasPower(this, event.getEntity())) - event.setCancelled(true); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/defensivepowers/InvulnerabilityKnockback.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/defensivepowers/InvulnerabilityKnockback.java deleted file mode 100644 index a46beb457..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/defensivepowers/InvulnerabilityKnockback.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers.defensivepowers; - -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.mobpowers.minorpowers.MinorPower; -import org.bukkit.entity.Entity; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.Vector; - -/** - * Created by MagmaGuy on 30/04/2017. - */ -public class InvulnerabilityKnockback extends MinorPower implements Listener { - - @Override - public void applyPowers(Entity entity) { - } - - @EventHandler - public void invulnerabilityKnockback(EntityDamageEvent event) { - - if (EntityTracker.hasPower(this, event.getEntity())) { - - event.getEntity().setVelocity(new Vector(0, 0, 0)); - - new BukkitRunnable() { - @Override - public void run() { - event.getEntity().setVelocity(new Vector(0, 0, 0)); - } - }.runTaskLater(MetadataHandler.PLUGIN, 1); - - } - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/majorpowers/MajorPower.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/majorpowers/MajorPower.java deleted file mode 100644 index a96aa30a8..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/majorpowers/MajorPower.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers.majorpowers; - -import com.magmaguy.elitemobs.mobpowers.ElitePower; - -/** - * Created by MagmaGuy on 10/05/2017. - */ -public abstract class MajorPower extends ElitePower { - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/majorpowers/SkeletonPillar.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/majorpowers/SkeletonPillar.java deleted file mode 100644 index 23da5e7ca..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/majorpowers/SkeletonPillar.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.magmaguy.elitemobs.mobpowers.majorpowers; - -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobpowers.PowerCooldown; -import com.magmaguy.elitemobs.powerstances.GenericRotationMatrixMath; -import org.bukkit.Location; -import org.bukkit.Particle; -import org.bukkit.entity.*; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.scheduler.BukkitRunnable; - -import java.util.HashSet; -import java.util.concurrent.ThreadLocalRandom; - -public class SkeletonPillar extends MajorPower implements Listener { - - private static HashSet cooldowns = new HashSet<>(); - - private static boolean isInCooldown(EliteMobEntity eliteMobEntity) { - return cooldowns.contains(eliteMobEntity); - } - - public static HashSet getCooldowns(EliteMobEntity eliteMobEntity) { - return cooldowns; - } - - @Override - public void applyPowers(Entity entity) { - } - - @EventHandler - public void onHit(EntityDamageByEntityEvent event) { - - if (event.isCancelled()) return; - if (!event.getEntity().getType().equals(EntityType.SKELETON)) return; - - /* - Run random check to see if the power should activate - */ - if (ThreadLocalRandom.current().nextDouble() > 0.20) return; - - EliteMobEntity eliteMobEntity = EntityTracker.getEliteMobEntity(event.getEntity()); - if (eliteMobEntity == null) return; - - if (!eliteMobEntity.hasPower(this)) return; - if (isInCooldown(eliteMobEntity)) return; - - eliteMobEntity.getLivingEntity().setAI(false); - PowerCooldown.startCooldownTimer(eliteMobEntity, cooldowns, 20 * 27); - - Location location1 = locationMover(eliteMobEntity.getLivingEntity().getLocation().clone(), 20, 7); - Location location2 = locationMover(eliteMobEntity.getLivingEntity().getLocation().clone(), 20, 7); - - new BukkitRunnable() { - - int timer = 1; - - @Override - public void run() { - - if (timer > 20 * 7 || !eliteMobEntity.getLivingEntity().isValid()) { - - eliteMobEntity.getLivingEntity().setAI(true); - cancel(); - - } else if (timer > 20 * 1 && timer < 20 * 7) { - - pillarEffect(location1, timer, 7); - pillarEffect(location2, timer, -7); - - } else { - - pillarWarningEffect(location1); - pillarWarningEffect(location2); - - } - - timer++; - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); - - } - - private void pillarEffect(Location location, int timer, int offset) { - - location.getWorld().spawnParticle(Particle.EXPLOSION_NORMAL, location, 50, 0.1, 5, 0.1, 0.05); - locationMover(location, timer, offset); - pillarDamage(location); - - } - - private void pillarWarningEffect(Location location) { - - location.getWorld().spawnParticle(Particle.SMOKE_LARGE, location, 10, 0.1, 5, 0.1, 0.05); - - } - - private void pillarDamage(Location location) { - - for (Entity entity : location.getWorld().getNearbyEntities(location, 2, 5, 2)) - if (entity instanceof LivingEntity && !(entity instanceof Pig || entity instanceof Cow || entity instanceof Chicken || - entity instanceof Wolf || entity instanceof Llama || entity instanceof Ocelot || entity instanceof Horse || - entity instanceof Sheep || entity instanceof Rabbit || entity instanceof Parrot || entity instanceof Villager)) { - - LivingEntity livingEntity = (LivingEntity) entity; - - if (livingEntity.isValid()) - livingEntity.damage(1); - - } - - } - - private Location locationMover(Location location, int timer, int offset) { - - int numberOfPointsPerRotation = 20 * 3; - - Location newLocation = GenericRotationMatrixMath.applyRotation(0, 1, 0, numberOfPointsPerRotation, - 0, 0, offset, timer).toLocation(location.getWorld()); - - return newLocation.add(location); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/majorpowers/SkeletonTrackingArrow.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/majorpowers/SkeletonTrackingArrow.java deleted file mode 100644 index 6c170fb31..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/majorpowers/SkeletonTrackingArrow.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers.majorpowers; - -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobpowers.minorpowers.EventValidator; -import com.magmaguy.elitemobs.mobpowers.offensivepowers.AttackArrow; -import com.magmaguy.elitemobs.utils.VersionChecker; -import org.bukkit.GameMode; -import org.bukkit.Particle; -import org.bukkit.entity.Arrow; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityTargetLivingEntityEvent; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.Vector; - -import java.util.HashSet; - -public class SkeletonTrackingArrow extends MajorPower implements Listener { - - private static HashSet currentlyFiringEntities = new HashSet<>(); - - @Override - public void applyPowers(Entity entity) { - - if (VersionChecker.currentVersionIsUnder(10, 0)) return; - - } - - @EventHandler - public void targetEvent(EntityTargetLivingEntityEvent event) { - - EliteMobEntity eliteMobEntity = EventValidator.getEventEliteMob(this, event); - if (eliteMobEntity == null) return; - if (currentlyFiringEntities.contains(eliteMobEntity)) return; - repeatingTrackingArrowTask(event.getEntity()); - currentlyFiringEntities.add(eliteMobEntity); - - } - - private void repeatingTrackingArrowTask(Entity entity) { - - new BukkitRunnable() { - - @Override - public void run() { - - if (!entity.isValid() || entity.isDead()) { - - cancel(); - return; - - } - - for (Entity nearbyEntity : entity.getNearbyEntities(20, 20, 20)) - if (nearbyEntity instanceof Player) - if (((Player) nearbyEntity).getGameMode().equals(GameMode.ADVENTURE) || - ((Player) nearbyEntity).getGameMode().equals(GameMode.SURVIVAL)) { - Arrow arrow = AttackArrow.shootArrow(entity, (Player) nearbyEntity); - arrow.setVelocity(arrow.getVelocity().multiply(0.1)); - arrow.setGravity(false); - trackingArrowLoop((Player) nearbyEntity, arrow); - } - - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 0, 20 * 8); - - } - - public static HashSet trackingArrowList = new HashSet<>(); - - private static void trackingArrowLoop(Player player, Arrow arrow) { - - trackingArrowList.add(arrow); - - new BukkitRunnable() { - - int counter = 0; - - @Override - public void run() { - - if (player.isValid() && !player.isDead() && arrow.isValid() && arrow.getWorld().equals(player.getWorld()) - && player.getLocation().distanceSquared(arrow.getLocation()) < 900 && !arrow.isOnGround()) { - - if (counter % 10 == 0) { - - arrow.setVelocity(arrow.getVelocity().add(arrowAdjustmentVector(arrow, player))); - - } - - arrow.getWorld().spawnParticle(Particle.FLAME, arrow.getLocation(), 10, 0.01, 0.01, 0.01, 0.01); - - } else { - - arrow.setGravity(true); - trackingArrowList.remove(arrow); - cancel(); - - } - - if (counter > 20 * 60) { - arrow.setGravity(true); - trackingArrowList.remove(arrow); - cancel(); - } - - counter++; - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); - - } - - private static Vector arrowAdjustmentVector(Arrow arrow, Player player) { - - return player.getEyeLocation().subtract(arrow.getLocation()).toVector() - .normalize().multiply(0.1); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/majorpowers/ZombieBloat.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/majorpowers/ZombieBloat.java deleted file mode 100644 index c49f91fe0..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/majorpowers/ZombieBloat.java +++ /dev/null @@ -1,222 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers.majorpowers; - -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobpowers.PowerCooldown; -import com.magmaguy.elitemobs.mobpowers.minorpowers.EventValidator; -import org.bukkit.Location; -import org.bukkit.Particle; -import org.bukkit.entity.*; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.Vector; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.concurrent.ThreadLocalRandom; - -public class ZombieBloat extends MajorPower implements Listener { - - private static HashSet cooldowns = new HashSet<>(); - - @Override - public void applyPowers(Entity entity) { - } - - @EventHandler - public void onHit(EntityDamageEvent event) { - - EliteMobEntity eliteMobEntity = EventValidator.getEventEliteMob(this, event); - if (eliteMobEntity == null) return; - if (cooldowns.contains(eliteMobEntity)) return; - if (ThreadLocalRandom.current().nextDouble() > 0.20) return; - cooldowns.add(eliteMobEntity); - - /* - Create early warning that entity is about to bloat - */ - new BukkitRunnable() { - - int timer = 1; - Zombie eventZombie = (Zombie) event.getEntity(); - - @Override - public void run() { - - if (timer > 40) { - bloatEffect(eventZombie); - cancel(); - } - - if (timer == 21) { - /* - Remove AI to prevent entity from moving while effect activates - */ - eventZombie.setAI(false); - /* - Start power cooldown, 10 seconds - */ - PowerCooldown.startCooldownTimer(eliteMobEntity, cooldowns, 10 * 20); - } - - if (ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.ENABLE_WARNING_VISUAL_EFFECTS)) - eventZombie.getWorld().spawnParticle(Particle.TOTEM, new Location(eventZombie.getWorld(), - eventZombie.getLocation().getX(), eventZombie.getLocation().getY() + - eventZombie.getHeight(), eventZombie.getLocation().getZ()), 20, timer / 24, - timer / 9, timer / 24, 0.1); - - timer++; - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); - - - } - - private void bloatEffect(Zombie eventZombie) { - /* - Spawn giant for "bloat" effect - */ - Giant giant = (Giant) eventZombie.getWorld().spawnEntity(eventZombie.getLocation(), EntityType.GIANT); - giant.setAI(false); - - /* - Apply knockback to all living entities around the giant except for the original zombie entity - */ - List nearbyEntities = giant.getNearbyEntities(4, 15, 4); - List nearbyValidLivingEntities = new ArrayList<>(); - - if (nearbyEntities.size() > 0) - for (Entity entity : nearbyEntities) - if (entity instanceof LivingEntity && !entity.equals(eventZombie)) - nearbyValidLivingEntities.add((LivingEntity) entity); - - Location entityLocation = eventZombie.getLocation(); - - for (LivingEntity livingEntity : nearbyValidLivingEntities) { - - - Location livingEntityLocation = livingEntity.getLocation(); - Vector toLivingEntityVector = livingEntityLocation.subtract(entityLocation).toVector(); - - /* - Normalize vector to apply powers uniformly - */ - Vector normalizedVector = toLivingEntityVector.normalize(); - normalizedVector = normalizedVector.multiply(new Vector(2, 0, 2)).add(new Vector(0, 1, 0)); - - try { - - livingEntity.setVelocity(normalizedVector); - - } catch (Exception e) { - - //Entity was too recent to set a velocity? - - } - - } - - livingEntityEffect(nearbyValidLivingEntities); - - /* - Effect is done, start task to remove giant - */ - new BukkitRunnable() { - - @Override - public void run() { - - giant.remove(); - eventZombie.setAI(true); - - } - - }.runTaskLater(MetadataHandler.PLUGIN, 10); - - } - - private void livingEntityEffect(List livingEntities) { - - if (livingEntities.size() == 0) return; - if (!ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.ENABLE_WARNING_VISUAL_EFFECTS)) - return; - - new BukkitRunnable() { - - int counter = 0; - - @Override - public void run() { - - if (counter > 1.5 * 20) - cancel(); - - for (LivingEntity livingEntity : livingEntities) - if (!(livingEntity == null || livingEntity.isDead() || !livingEntity.isValid())) - livingEntity.getWorld().spawnParticle(Particle.CLOUD, new Location(livingEntity.getWorld(), - livingEntity.getLocation().getX(), - livingEntity.getLocation().getY() + livingEntity.getHeight() - 1, - livingEntity.getLocation().getZ()), - 0, 0, 0, 0); - - counter++; - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/majorpowers/ZombieFriends.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/majorpowers/ZombieFriends.java deleted file mode 100644 index fee7fee16..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/majorpowers/ZombieFriends.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.magmaguy.elitemobs.mobpowers.majorpowers; - -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobconstructor.ReinforcementMobEntity; -import com.magmaguy.elitemobs.mobpowers.minorpowers.EventValidator; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.scheduler.BukkitRunnable; - -import java.util.HashSet; -import java.util.concurrent.ThreadLocalRandom; - -import static com.magmaguy.elitemobs.ChatColorConverter.convert; - -/** - * Created by MagmaGuy on 18/05/2017. - */ -public class ZombieFriends extends MajorPower implements Listener { - - public static HashSet activatedZombies = new HashSet<>(); - - @Override - public void applyPowers(Entity entity) { - } - - @EventHandler - public void onHit(EntityDamageEvent event) { - - EliteMobEntity eliteMobEntity = EventValidator.getEventEliteMob(this, event); - if (eliteMobEntity == null) return; - if (ThreadLocalRandom.current().nextDouble() > 0.01) return; - if (activatedZombies.contains(eliteMobEntity)) return; - activatedZombies.add(eliteMobEntity); - - ReinforcementMobEntity reinforcement1 = new ReinforcementMobEntity(EntityType.ZOMBIE, eliteMobEntity.getLivingEntity().getLocation(), - eliteMobEntity.getLevel(), ConfigValues.translationConfig.getString("ZombieFriends.Friend 1")); - - ReinforcementMobEntity reinforcement2 = new ReinforcementMobEntity(EntityType.ZOMBIE, eliteMobEntity.getLivingEntity().getLocation(), - eliteMobEntity.getLevel(), ConfigValues.translationConfig.getString("ZombieFriends.Friend 2")); - - new BukkitRunnable() { - @Override - public void run() { - if (!eliteMobEntity.getLivingEntity().isValid() || !reinforcement1.getLivingEntity().isValid() && !reinforcement2.getLivingEntity().isValid()) { - - if (reinforcement1.getLivingEntity().isValid()) { - - nameClearer(reinforcement1); - - reinforcement1.getLivingEntity().setCustomName(convert(ConfigValues.translationConfig.getStringList("ZombieFriends.DeathMessage"). - get(ThreadLocalRandom.current().nextInt(ConfigValues.translationConfig.getStringList("ZombieFriends.DeathMessage") - .size())))); - - } - - if (reinforcement2.getLivingEntity().isValid()) { - - - nameClearer(reinforcement2); - - reinforcement2.getLivingEntity().setCustomName(convert(ConfigValues.translationConfig.getStringList("ZombieFriends.DeathMessage"). - get(ThreadLocalRandom.current().nextInt(ConfigValues.translationConfig.getStringList("ZombieFriends.DeathMessage") - .size())))); - - } - - cancel(); - return; - - } else { - - if (ThreadLocalRandom.current().nextDouble() < 0.5) { - - nameClearer(eliteMobEntity); - - eliteMobEntity.getLivingEntity().setCustomName(convert(ConfigValues.translationConfig.getStringList("ZombieFriends.ZombieDialog"). - get(ThreadLocalRandom.current().nextInt(ConfigValues.translationConfig.getStringList("ZombieFriends.ZombieDialog") - .size())))); - - } - - if (ThreadLocalRandom.current().nextDouble() < 0.5 && reinforcement1.getLivingEntity().isValid()) { - - nameClearer(reinforcement1); - - reinforcement1.getLivingEntity().setCustomName(convert(ConfigValues.translationConfig.getStringList("ZombieFriends.FriendDialog"). - get(ThreadLocalRandom.current().nextInt(ConfigValues.translationConfig.getStringList("ZombieFriends.FriendDialog") - .size())))); - - } - - if (ThreadLocalRandom.current().nextDouble() < 0.5 && reinforcement2.getLivingEntity().isValid()) { - - nameClearer(reinforcement2); - - reinforcement2.getLivingEntity().setCustomName(convert(ConfigValues.translationConfig.getStringList("ZombieFriends.FriendDialog"). - get(ThreadLocalRandom.current().nextInt(ConfigValues.translationConfig.getStringList("ZombieFriends.FriendDialog") - .size())))); - - } - - } - } - }.runTaskTimer(MetadataHandler.PLUGIN, 20, 20 * 8); - - } - - private void nameClearer(EliteMobEntity eliteMobEntity) { - - new BukkitRunnable() { - @Override - public void run() { - if (eliteMobEntity.getLivingEntity().isValid()) - eliteMobEntity.setName(eliteMobEntity.getName()); - } - }.runTaskLater(MetadataHandler.PLUGIN, 20 * 3); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/majorpowers/ZombieNecronomicon.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/majorpowers/ZombieNecronomicon.java deleted file mode 100644 index 3f6905818..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/majorpowers/ZombieNecronomicon.java +++ /dev/null @@ -1,330 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers.majorpowers; - -import com.magmaguy.elitemobs.ChatColorConverter; -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobconstructor.ReinforcementMobEntity; -import com.magmaguy.elitemobs.mobpowers.minorpowers.EventValidator; -import com.magmaguy.elitemobs.powerstances.GenericRotationMatrixMath; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.entity.*; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.event.entity.EntityTargetLivingEntityEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.Vector; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.concurrent.ThreadLocalRandom; - -import static com.magmaguy.elitemobs.ChatColorConverter.convert; - -/** - * Created by MagmaGuy on 18/05/2017. - */ -public class ZombieNecronomicon extends MajorPower implements Listener { - - private int chantIndex = 0; - private boolean summoningEffectOn = false; - private HashSet chantingMobs = new HashSet<>(); - - @Override - public void applyPowers(Entity entity) { - } - - @EventHandler - public void onPlayerDetect(EntityTargetLivingEntityEvent event) { - - EliteMobEntity eliteMobEntity = EventValidator.getEventEliteMob(this, event); - if (eliteMobEntity == null) return; - - if (chantingMobs.contains(eliteMobEntity)) return; - chantingMobs.add(eliteMobEntity); - - necronomiconVisualEffect(eliteMobEntity); - spawnReinforcements(eliteMobEntity, event.getTarget()); - - } - - private void necronomiconVisualEffect(EliteMobEntity eliteMobEntity) { - - Zombie zombie = (Zombie) eliteMobEntity.getLivingEntity(); - - zombie.setAI(false); - summoningEffectOn = true; - nameScroller(zombie); - - if (!ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.ENABLE_WARNING_VISUAL_EFFECTS)) - return; - - new BukkitRunnable() { - - int counter = 0; - HashMap> fourTrack = new HashMap(); - - @Override - public void run() { - - if (!zombie.isValid() || zombie.hasAI()) { - - for (List itemList : fourTrack.values()) - for (Item item : itemList) - item.remove(); - - if (zombie.isValid()) - zombie.setCustomName(EntityTracker.getEliteMobEntity(zombie).getName()); - - summoningEffectOn = false; - cancel(); - return; - - } - - if (counter == 0) { - - //establish 4tracks - for (int i = 0; i < 8; i++) { - - List itemList = new ArrayList<>(); - - for (int j = 0; j < 4; j++) { - - ItemStack itemStack = new ItemStack(Material.WRITTEN_BOOK, 1); - - Item item = zombie.getWorld().dropItem(zombie.getLocation(), itemStack); - item.setGravity(false); - item.setPickupDelay(Integer.MAX_VALUE); - EntityTracker.registerItemVisualEffects(item); -// MetadataHandler.registerMetadata(item, MetadataHandler.BETTERDROPS_COMPATIBILITY_MD, true); - - itemList.add(item); - - } - - fourTrack.put(i, itemList); - - } - - } else - itemMover(fourTrack, zombie, counter); - - - counter++; - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 5, 5); - - } - - private void itemMover(HashMap> xTrack, Entity entity, int counter) { - - double a = 0; - double b = 1; - double c = 0; - - double numberOfPointsPerFullRotation = 64; - - double x = 0; - double y = 0; - double z; - - for (int trackNumber : xTrack.keySet()) { - - List itemList = xTrack.get(trackNumber); - - for (Item item : itemList) { - - //each track is offset by 45 degrees - //items are then offset on the Z value depending on their position - - z = (itemList.indexOf(item) + 1); - - //to predict the counter offset value you have to divide 8 (for 8 tracks total) - - int newCounter = (int) (counter + trackNumber * (numberOfPointsPerFullRotation / 8)); - - Location currentLocation = item.getLocation(); - - Location centerLocationFixed = entity.getLocation().add(0, 3, 0); - - Vector vector = GenericRotationMatrixMath.applyRotation(a, b, c, numberOfPointsPerFullRotation, x, y, z, newCounter); - Location newLocation = new Location(entity.getWorld(), vector.getX(), vector.getY(), vector.getZ()).add(centerLocationFixed); - - Vector velocity = (newLocation.subtract(currentLocation)).toVector().multiply(0.3); - item.setVelocity(velocity); - - } - - } - - } - - private void nameScroller(Zombie zombie) { - - new BukkitRunnable() { - - String fullChant = convert(ConfigValues.translationConfig.getString("ZombieNecronomicon.Summoning chant")); - - @Override - public void run() { - - if (!zombie.isValid() || zombie.hasAI()) { - - cancel(); - return; - - } - - if (chantIndex + 31 > fullChant.length()) { - - chantIndex = 0; - - } - - String subString = fullChant.substring(chantIndex, chantIndex + 31); - - zombie.setCustomName(subString); - - chantIndex++; - - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); - - } - - private void spawnReinforcements(EliteMobEntity eliteMobEntity, LivingEntity targetted) { - - LivingEntity targetter = eliteMobEntity.getLivingEntity(); - - new BukkitRunnable() { - - ArrayList entityList = new ArrayList<>(); - - @Override - public void run() { - - if (!targetted.isValid() || !targetter.isValid() || targetted.getWorld() != targetter.getWorld() - || targetted.getLocation().distance(targetter.getLocation()) > 30) { - - for (Entity entity : entityList) - if (entity.isValid()) - entity.remove(); - - targetter.setAI(true); - chantingMobs.remove(targetter); - cancel(); - return; - - } - - int randomizedNumber = ThreadLocalRandom.current().nextInt(5) + 1; - - entityList.removeIf(currentEntity -> !currentEntity.isValid()); - - if (entityList.size() < 11) { - - targetter.setAI(false); - - if (!summoningEffectOn) - necronomiconVisualEffect(eliteMobEntity); - - if (randomizedNumber < 5) { - - ReinforcementMobEntity trashMobEntity = new ReinforcementMobEntity(EntityType.ZOMBIE, targetter.getLocation(), eliteMobEntity.getLevel(), - ChatColorConverter.convert(ConfigValues.translationConfig.getString("ZombieNecronomicon.Summoned zombie"))); - - trashMobEntity.getLivingEntity().setVelocity(new Vector((ThreadLocalRandom.current().nextDouble() - 0.5) / 30, 0.5, - (ThreadLocalRandom.current().nextDouble() - 0.5) / 30)); - - entityList.add(trashMobEntity.getLivingEntity()); - - } else { - - ReinforcementMobEntity trashMobEntity = new ReinforcementMobEntity(EntityType.SKELETON, targetter.getLocation(), eliteMobEntity.getLevel(), - ChatColorConverter.convert(ConfigValues.translationConfig.getString("ZombieNecronomicon.Summoned skeleton"))); - - trashMobEntity.getLivingEntity().setVelocity(new Vector((ThreadLocalRandom.current().nextDouble() - 0.5) / 30, 0.5, - (ThreadLocalRandom.current().nextDouble() - 0.5) / 30)); - - entityList.add(trashMobEntity.getLivingEntity()); - - } - - } else - targetter.setAI(true); - - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 20 * 3, 20 * 5); - - } - - @EventHandler - public void onSummonedCreatureDeath(EntityDeathEvent event) { - - if (event.getEntity() instanceof Zombie && EntityTracker.isEliteMob(event.getEntity()) && event.getEntity().getCustomName() != null && - (event.getEntity().getCustomName().equals(ConfigValues.translationConfig.getString("ZombieNecronomicon.Summoned zombie")) || - event.getEntity().getCustomName().equals(ConfigValues.translationConfig.getString("ZombieNecronomicon.Summoned skeleton")))) - event.getDrops().clear(); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/majorpowers/ZombieParents.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/majorpowers/ZombieParents.java deleted file mode 100644 index 868bb5d10..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/majorpowers/ZombieParents.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers.majorpowers; - -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobconstructor.ReinforcementMobEntity; -import com.magmaguy.elitemobs.mobpowers.minorpowers.EventValidator; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.LivingEntity; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.scheduler.BukkitRunnable; - -import java.util.HashSet; -import java.util.concurrent.ThreadLocalRandom; - -import static com.magmaguy.elitemobs.ChatColorConverter.convert; - -/** - * Created by MagmaGuy on 13/05/2017. - */ -public class ZombieParents extends MajorPower implements Listener { - - public static HashSet activatedZombies = new HashSet<>(); - - @Override - public void applyPowers(Entity entity) { - } - - @EventHandler - public void onHit(EntityDamageEvent event) { - - EliteMobEntity eliteMobEntity = EventValidator.getEventEliteMob(this, event); - if (eliteMobEntity == null) return; - if (ThreadLocalRandom.current().nextDouble() > 0.01) return; - if (activatedZombies.contains(eliteMobEntity)) return; - - ReinforcementMobEntity reinforcementMom = new ReinforcementMobEntity(EntityType.ZOMBIE, eliteMobEntity.getLivingEntity().getLocation(), eliteMobEntity.getLevel(), - ConfigValues.translationConfig.getString("ZombieParents.Mom Name")); - - LivingEntity zombieMom = reinforcementMom.getLivingEntity(); - - ReinforcementMobEntity reinforcementDad = new ReinforcementMobEntity(EntityType.ZOMBIE, eliteMobEntity.getLivingEntity().getLocation(), eliteMobEntity.getLevel(), - ConfigValues.translationConfig.getString("ZombieParents.Dad Name")); - - LivingEntity zombieDad = reinforcementDad.getLivingEntity(); - - new BukkitRunnable() { - - @Override - public void run() { - - if (!eliteMobEntity.getLivingEntity().isValid()) { - - if (zombieDad.isValid()) { - - nameClearer(reinforcementDad); - - zombieDad.setCustomName(convert(ConfigValues.translationConfig.getStringList("ZombieParents.DeathMessage"). - get(ThreadLocalRandom.current().nextInt(ConfigValues.translationConfig.getStringList("ZombieParents.DeathMessage") - .size())))); - - } - - if (zombieMom.isValid()) { - - nameClearer(reinforcementMom); - - zombieMom.setCustomName(convert(ConfigValues.translationConfig.getStringList("ZombieParents.DeathMessage"). - get(ThreadLocalRandom.current().nextInt(ConfigValues.translationConfig.getStringList("ZombieParents.DeathMessage") - .size())))); - - } - - cancel(); - - } else { - - if (ThreadLocalRandom.current().nextDouble() < 0.5) { - - nameClearer(eliteMobEntity); - - eliteMobEntity.getLivingEntity().setCustomName(convert(ConfigValues.translationConfig.getStringList("ZombieParents.ZombieDialog"). - get(ThreadLocalRandom.current().nextInt(ConfigValues.translationConfig.getStringList("ZombieParents.ZombieDialog") - .size())))); - - } - - if (ThreadLocalRandom.current().nextDouble() < 0.5 && zombieDad.isValid()) { - - nameClearer(reinforcementDad); - - zombieDad.setCustomName(convert(ConfigValues.translationConfig.getStringList("ZombieParents.ZombieDadDialog"). - get(ThreadLocalRandom.current().nextInt(ConfigValues.translationConfig.getStringList("ZombieParents.ZombieDadDialog") - .size())))); - - } - - if (ThreadLocalRandom.current().nextDouble() < 0.5 && zombieMom.isValid()) { - - nameClearer(reinforcementMom); - - zombieMom.setCustomName(convert(ConfigValues.translationConfig.getStringList("ZombieParents.ZombieMomDialog"). - get(ThreadLocalRandom.current().nextInt(ConfigValues.translationConfig.getStringList("ZombieParents.ZombieMomDialog") - .size())))); - - } - - } - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 20, 20 * 8); - - } - - private void nameClearer(EliteMobEntity eliteMobEntity) { - - new BukkitRunnable() { - @Override - public void run() { - if (eliteMobEntity.getLivingEntity().isValid()) - eliteMobEntity.setName(eliteMobEntity.getName()); - } - }.runTaskLater(MetadataHandler.PLUGIN, 20 * 3); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/majorpowers/ZombieTeamRocket.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/majorpowers/ZombieTeamRocket.java deleted file mode 100644 index 59c567c42..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/majorpowers/ZombieTeamRocket.java +++ /dev/null @@ -1,252 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers.majorpowers; - -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobconstructor.ReinforcementMobEntity; -import com.magmaguy.elitemobs.mobpowers.minorpowers.EventValidator; -import org.bukkit.Color; -import org.bukkit.Material; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Ocelot; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.LeatherArmorMeta; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.Vector; - -import java.util.HashSet; -import java.util.concurrent.ThreadLocalRandom; - -import static com.magmaguy.elitemobs.ChatColorConverter.convert; - -/** - * Created by MagmaGuy on 07/05/2017. - */ -public class ZombieTeamRocket extends MajorPower implements Listener { - - private static final ItemStack TEAM_ROCKET_CHESTPIECE = new ItemStack(Material.LEATHER_CHESTPLATE, 1); - private static final ItemStack TEAM_ROCKET_LEGGINGS = new ItemStack(Material.LEATHER_LEGGINGS, 1); - private static final ItemStack TEAM_ROCKET_BOOTS = new ItemStack(Material.LEATHER_BOOTS, 1); - private static final ItemStack TEAM_ROCKET_HELMET = new ItemStack(Material.LEATHER_HELMET, 1); - public static HashSet activatedZombies = new HashSet<>(); - - @Override - public void applyPowers(Entity entity) { - } - - @EventHandler - public void onHit(EntityDamageEvent event) { - - EliteMobEntity eliteMobEntity = EventValidator.getEventEliteMob(this, event); - if (eliteMobEntity == null) return; - if (ThreadLocalRandom.current().nextDouble() < 0.20) return; - if (activatedZombies.contains(eliteMobEntity)) return; - activatedZombies.add(eliteMobEntity); - - LeatherArmorMeta teamRocketChestpieceMeta = (LeatherArmorMeta) TEAM_ROCKET_CHESTPIECE.getItemMeta(); - teamRocketChestpieceMeta.setColor(Color.WHITE); - TEAM_ROCKET_CHESTPIECE.setItemMeta(teamRocketChestpieceMeta); - - LeatherArmorMeta teamRocketLeggingsMeta = (LeatherArmorMeta) TEAM_ROCKET_CHESTPIECE.getItemMeta(); - teamRocketLeggingsMeta.setColor(Color.WHITE); - TEAM_ROCKET_LEGGINGS.setItemMeta(teamRocketLeggingsMeta); - - LeatherArmorMeta teamRocketBootsMeta = (LeatherArmorMeta) TEAM_ROCKET_BOOTS.getItemMeta(); - teamRocketBootsMeta.setColor(Color.BLACK); - TEAM_ROCKET_BOOTS.setItemMeta(teamRocketBootsMeta); - - ItemStack jesseHelmet = TEAM_ROCKET_HELMET.clone(); - LeatherArmorMeta jesseHelmetMeta = (LeatherArmorMeta) jesseHelmet.getItemMeta(); - jesseHelmetMeta.setColor(Color.PURPLE); - jesseHelmet.setItemMeta(jesseHelmetMeta); - - ItemStack jamesHelmet = TEAM_ROCKET_HELMET.clone(); - LeatherArmorMeta jamesHelmetMeta = (LeatherArmorMeta) jamesHelmet.getItemMeta(); - jamesHelmetMeta.setColor(Color.BLUE); - jamesHelmet.setItemMeta(jamesHelmetMeta); - - ReinforcementMobEntity jesseReinforcement = new ReinforcementMobEntity(EntityType.ZOMBIE, eliteMobEntity.getLivingEntity().getLocation(), eliteMobEntity.getLevel(), "Jesse"); - jesseReinforcement.getLivingEntity().getEquipment().setHelmet(jesseHelmet); - jesseReinforcement.getLivingEntity().getEquipment().setChestplate(TEAM_ROCKET_CHESTPIECE); - jesseReinforcement.getLivingEntity().getEquipment().setLeggings(TEAM_ROCKET_LEGGINGS); - jesseReinforcement.getLivingEntity().getEquipment().setBoots(TEAM_ROCKET_BOOTS); - - ReinforcementMobEntity jamesReinforcement = new ReinforcementMobEntity(EntityType.ZOMBIE, eliteMobEntity.getLivingEntity().getLocation(), eliteMobEntity.getLevel(), "James"); - jamesReinforcement.getLivingEntity().getEquipment().setHelmet(jamesHelmet); - jamesReinforcement.getLivingEntity().getEquipment().setChestplate(TEAM_ROCKET_CHESTPIECE); - jamesReinforcement.getLivingEntity().getEquipment().setLeggings(TEAM_ROCKET_LEGGINGS); - jamesReinforcement.getLivingEntity().getEquipment().setBoots(TEAM_ROCKET_BOOTS); - - Ocelot meowth = (Ocelot) eliteMobEntity.getLivingEntity().getWorld().spawnEntity(eliteMobEntity.getLivingEntity().getLocation(), EntityType.OCELOT); - meowth.setCustomName("Meowth"); - - (eliteMobEntity.getLivingEntity()).getEquipment().setChestplate(TEAM_ROCKET_CHESTPIECE); - (eliteMobEntity.getLivingEntity()).getEquipment().setLeggings(TEAM_ROCKET_LEGGINGS); - (eliteMobEntity.getLivingEntity()).getEquipment().setBoots(TEAM_ROCKET_BOOTS); - eliteMobEntity.setHasCustomPowers(true); - - new BukkitRunnable() { - - int counter = 1; - - @Override - public void run() { - - switch (counter) { - - case 1: - jesseReinforcement.getLivingEntity().setCustomNameVisible(true); - jesseReinforcement.getLivingEntity().setCustomName(convert(ConfigValues.translationConfig.getStringList("ZombieTeamRocket.Intro").get(0))); - break; - case 2: - jesseReinforcement.getLivingEntity().setCustomNameVisible(false); - jamesReinforcement.getLivingEntity().setCustomName(convert(ConfigValues.translationConfig.getStringList("ZombieTeamRocket.Intro").get(1))); - jamesReinforcement.getLivingEntity().setCustomNameVisible(true); - break; - case 3: - jamesReinforcement.getLivingEntity().setCustomNameVisible(false); - jesseReinforcement.getLivingEntity().setCustomName(convert(ConfigValues.translationConfig.getStringList("ZombieTeamRocket.Intro").get(2))); - jesseReinforcement.getLivingEntity().setCustomNameVisible(true); - break; - case 4: - jesseReinforcement.getLivingEntity().setCustomName(convert(ConfigValues.translationConfig.getStringList("ZombieTeamRocket.Intro").get(3))); - break; - case 5: - jesseReinforcement.getLivingEntity().setCustomNameVisible(false); - jamesReinforcement.getLivingEntity().setCustomName(convert(ConfigValues.translationConfig.getStringList("ZombieTeamRocket.Intro").get(4))); - jamesReinforcement.getLivingEntity().setCustomNameVisible(true); - break; - case 6: - jamesReinforcement.getLivingEntity().setCustomName(convert(ConfigValues.translationConfig.getStringList("ZombieTeamRocket.Intro").get(5))); - break; - case 7: - jamesReinforcement.getLivingEntity().setCustomNameVisible(false); - jesseReinforcement.getLivingEntity().setCustomName(convert(ConfigValues.translationConfig.getStringList("ZombieTeamRocket.Intro").get(6))); - jesseReinforcement.getLivingEntity().setCustomNameVisible(true); - break; - case 8: - jesseReinforcement.getLivingEntity().setCustomName(convert(ConfigValues.translationConfig.getStringList("ZombieTeamRocket.Intro").get(7))); - break; - case 9: - jesseReinforcement.getLivingEntity().setCustomNameVisible(false); - jamesReinforcement.getLivingEntity().setCustomName(convert(ConfigValues.translationConfig.getStringList("ZombieTeamRocket.Intro").get(8))); - jamesReinforcement.getLivingEntity().setCustomNameVisible(true); - break; - case 10: - jamesReinforcement.getLivingEntity().setCustomName(convert(ConfigValues.translationConfig.getStringList("ZombieTeamRocket.Intro").get(9))); - break; - case 11: - jamesReinforcement.getLivingEntity().setCustomNameVisible(false); - jesseReinforcement.getLivingEntity().setCustomName(convert(ConfigValues.translationConfig.getStringList("ZombieTeamRocket.Intro").get(10))); - jesseReinforcement.getLivingEntity().setCustomNameVisible(true); - break; - case 12: - jesseReinforcement.getLivingEntity().setCustomNameVisible(false); - jamesReinforcement.getLivingEntity().setCustomName(convert(ConfigValues.translationConfig.getStringList("ZombieTeamRocket.Intro").get(11))); - jamesReinforcement.getLivingEntity().setCustomNameVisible(true); - break; - case 13: - jamesReinforcement.getLivingEntity().setCustomNameVisible(false); - jesseReinforcement.getLivingEntity().setCustomName(convert(ConfigValues.translationConfig.getStringList("ZombieTeamRocket.Intro").get(12))); - jesseReinforcement.getLivingEntity().setCustomNameVisible(true); - break; - case 14: - jesseReinforcement.getLivingEntity().setCustomName(convert(ConfigValues.translationConfig.getStringList("ZombieTeamRocket.Intro").get(13))); - break; - case 15: - jesseReinforcement.getLivingEntity().setCustomNameVisible(false); - jamesReinforcement.getLivingEntity().setCustomName(convert(ConfigValues.translationConfig.getStringList("ZombieTeamRocket.Intro").get(14))); - jamesReinforcement.getLivingEntity().setCustomNameVisible(true); - break; - case 16: - jamesReinforcement.getLivingEntity().setCustomName(convert(ConfigValues.translationConfig.getStringList("ZombieTeamRocket.Intro").get(15))); - break; - case 17: - jamesReinforcement.getLivingEntity().setCustomNameVisible(false); - meowth.setCustomName(convert(ConfigValues.translationConfig.getStringList("ZombieTeamRocket.Intro").get(16))); - meowth.setCustomNameVisible(true); - break; - case 18: - jesseReinforcement.getLivingEntity().setCustomName(convert(ConfigValues.translationConfig.getString("ZombieTeamRocket.Jesse name"))); - jesseReinforcement.getLivingEntity().setCustomNameVisible(true); - jamesReinforcement.getLivingEntity().setCustomName(convert(ConfigValues.translationConfig.getString("ZombieTeamRocket.James name"))); - jamesReinforcement.getLivingEntity().setCustomNameVisible(true); - meowth.setCustomName(convert(ConfigValues.translationConfig.getString("ZombieTeamRocket.Meowth name"))); - case 30: - meowth.remove(); - cancel(); - break; - - } - - counter++; - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 1, 15 * 2); - - - } - - @EventHandler - public void onDeath(EntityDeathEvent event) { - - if (!EntityTracker.hasPower(this, event.getEntity())) return; - - event.getEntity().setCustomName(convert(ConfigValues.translationConfig.getString("ZombieTeamRocket.DeathMessage"))); - event.getEntity().setVelocity(new Vector(0, 2, 0)); - - } - -} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/minorpowers/EventValidator.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/minorpowers/EventValidator.java deleted file mode 100644 index 624cdb1b5..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/minorpowers/EventValidator.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers.minorpowers; - -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobpowers.ElitePower; -import com.magmaguy.elitemobs.utils.EntityFinder; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.EntityTargetLivingEntityEvent; - -public class EventValidator { - - /* - This class checks if the event is valid - It does so by checking if it isn't cancelled, if it contains an elite mob and if that elite mob has the relevant - power for that event - As such, the event should be cancelled at a power level when this returns null - */ - public static EliteMobEntity getEventEliteMob(ElitePower mobPower, EntityDamageByEntityEvent event) { - - if (event.isCancelled()) return null; - - Player player = EntityFinder.findPlayer(event); - - if (player == null) return null; - - LivingEntity livingEntity = EntityFinder.getRealDamager(event); - - if (livingEntity == null) return null; - - EliteMobEntity eliteMobEntity = EntityTracker.getEliteMobEntity(livingEntity); - - if (eliteMobEntity == null) return null; - - if (!EntityTracker.hasPower(mobPower, eliteMobEntity)) return null; - - return eliteMobEntity; - - } - - public static EliteMobEntity getEventEliteMob(ElitePower mobPower, EntityTargetLivingEntityEvent event) { - - if (event.isCancelled()) return null; - - Player player = EntityFinder.findPlayer(event); - - if (player == null) return null; - - LivingEntity livingEntity = EntityFinder.getRealDamager(event); - - if (livingEntity == null) return null; - - EliteMobEntity eliteMobEntity = EntityTracker.getEliteMobEntity(livingEntity); - - if (eliteMobEntity == null) return null; - - if (!EntityTracker.hasPower(mobPower, eliteMobEntity)) return null; - - return eliteMobEntity; - - } - - public static EliteMobEntity getEventEliteMob(ElitePower mobPower, EntityDamageEvent event) { - - if (event.isCancelled()) return null; - - if (!(event.getEntity() instanceof LivingEntity)) return null; - - EliteMobEntity eliteMobEntity = EntityTracker.getEliteMobEntity(event.getEntity()); - - if (eliteMobEntity == null) return null; - - if (!EntityTracker.hasPower(mobPower, eliteMobEntity)) return null; - - return eliteMobEntity; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/minorpowers/MinorPower.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/minorpowers/MinorPower.java deleted file mode 100644 index b9eb44337..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/minorpowers/MinorPower.java +++ /dev/null @@ -1,25 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers.minorpowers; - -import com.magmaguy.elitemobs.mobpowers.ElitePower; - -/** - * Created by MagmaGuy on 05/11/2016. - */ -public abstract class MinorPower extends ElitePower { - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/miscellaneouspowers/BonusLoot.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/miscellaneouspowers/BonusLoot.java deleted file mode 100644 index 9ddb13be0..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/miscellaneouspowers/BonusLoot.java +++ /dev/null @@ -1,46 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers.miscellaneouspowers; - -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.items.LootTables; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobpowers.minorpowers.MinorPower; -import org.bukkit.entity.Entity; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDeathEvent; - -/** - * Created by MagmaGuy on 28/04/2017. - */ -public class BonusLoot extends MinorPower implements Listener { - - @Override - public void applyPowers(Entity entity) { - } - - @EventHandler - public void onDeath(EntityDeathEvent event) { - - EliteMobEntity eliteMobEntity = EntityTracker.getEliteMobEntity(event.getEntity()); - if (eliteMobEntity == null) return; - if (!eliteMobEntity.hasPower(this)) return; - LootTables.generateLoot(eliteMobEntity); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/miscellaneouspowers/MovementSpeed.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/miscellaneouspowers/MovementSpeed.java deleted file mode 100644 index d53f99157..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/miscellaneouspowers/MovementSpeed.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers.miscellaneouspowers; - -import com.magmaguy.elitemobs.mobpowers.minorpowers.MinorPower; -import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; - -/** - * Created by MagmaGuy on 05/11/2016. - */ -public class MovementSpeed extends MinorPower { - - @Override - public void applyPowers(Entity entity) { - ((LivingEntity) entity).addPotionEffect(new PotionEffect(PotionEffectType.SPEED, Integer.MAX_VALUE, 2)); - } - -} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/miscellaneouspowers/Taunt.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/miscellaneouspowers/Taunt.java deleted file mode 100644 index f30a4e35e..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/miscellaneouspowers/Taunt.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers.miscellaneouspowers; - -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobpowers.minorpowers.EventValidator; -import com.magmaguy.elitemobs.mobpowers.minorpowers.MinorPower; -import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.event.entity.EntityTargetLivingEntityEvent; -import org.bukkit.scheduler.BukkitRunnable; - -import java.util.List; -import java.util.concurrent.ThreadLocalRandom; - -import static com.magmaguy.elitemobs.ChatColorConverter.convert; - -/** - * Created by MagmaGuy on 06/05/2017. - */ -public class Taunt extends MinorPower implements Listener { - - private final static List TARGET_TAUNT_LIST = ConfigValues.translationConfig.getStringList("Taunts.Target"); - private final static List GENERIC_DAMAGED_LIST = ConfigValues.translationConfig.getStringList("Taunts.Damaged"); - private final static List DAMAGED_BY_BOW_LIST = ConfigValues.translationConfig.getStringList("Taunts.BowDamaged"); - private final static List HIT_LIST = ConfigValues.translationConfig.getStringList("Taunts.Hit"); - private final static List DEATH_LIST = ConfigValues.translationConfig.getStringList("Taunts.Death"); - - @Override - public void applyPowers(Entity entity) { - } - - @EventHandler - public void onTarget(EntityTargetLivingEntityEvent event) { - - if (EntityTracker.hasPower(this, event.getEntity())) - if (event.getTarget() instanceof Player) { - Entity targetter = event.getEntity(); - nametagProcessor(targetter, TARGET_TAUNT_LIST); - } - - } - - @EventHandler - public void onDamaged(EntityDamageEvent event) { - - if (!(event.getEntity() instanceof LivingEntity) || - ((LivingEntity) event.getEntity()).getHealth() - event.getFinalDamage() <= 0 || - !event.getEntity().isValid()) - return; - - EliteMobEntity eliteMobEntity = EntityTracker.getEliteMobEntity(event.getEntity()); - if (eliteMobEntity == null) return; - if (EntityTracker.hasPower(this, event.getEntity())) { - Entity entity = event.getEntity(); - - if (event.getCause().equals(EntityDamageEvent.DamageCause.PROJECTILE)) - nametagProcessor(entity, DAMAGED_BY_BOW_LIST); - else - nametagProcessor(entity, GENERIC_DAMAGED_LIST); - - } - - } - - @EventHandler - public void onHit(EntityDamageByEntityEvent event) { - - EliteMobEntity eliteMobEntity = EventValidator.getEventEliteMob(this, event); - if (eliteMobEntity == null) return; - - nametagProcessor(eliteMobEntity.getLivingEntity(), HIT_LIST); - - } - - @EventHandler - public void onDeath(EntityDeathEvent event) { - - if (EntityTracker.hasPower(this, event.getEntity())) - nametagProcessor(event.getEntity(), DEATH_LIST); - - } - - private void nametagProcessor(Entity entity, List list) { - - int randomizedKey = ThreadLocalRandom.current().nextInt(list.size()); - String tempName = list.get(randomizedKey); - - entity.setCustomName(convert(tempName)); - - new BukkitRunnable() { - - @Override - public void run() { - - if (!entity.isValid()) - return; - - entity.setCustomName(EntityTracker.getEliteMobEntity(entity).getName()); - - } - - - }.runTaskLater(MetadataHandler.PLUGIN, 4 * 20); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackArrow.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackArrow.java deleted file mode 100644 index 5fa6d711d..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackArrow.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers.offensivepowers; - -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobpowers.ProjectileLocationGenerator; -import com.magmaguy.elitemobs.mobpowers.minorpowers.EventValidator; -import com.magmaguy.elitemobs.mobpowers.minorpowers.MinorPower; -import org.bukkit.GameMode; -import org.bukkit.Location; -import org.bukkit.entity.*; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityTargetLivingEntityEvent; -import org.bukkit.projectiles.ProjectileSource; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.Vector; - -import java.util.HashSet; - -/** - * Created by MagmaGuy on 06/05/2017. - */ -public class AttackArrow extends MinorPower implements Listener { - - private static HashSet currentlyFiringEntities = new HashSet<>(); - - @Override - - public void applyPowers(Entity entity) { - } - - @EventHandler - public void targetEvent(EntityTargetLivingEntityEvent event) { - EliteMobEntity eliteMobEntity = EventValidator.getEventEliteMob(this, event); - if (eliteMobEntity == null) return; - if (currentlyFiringEntities.contains(eliteMobEntity)) return; - repeatingArrowTask(eliteMobEntity); - currentlyFiringEntities.add(eliteMobEntity); - } - - private void repeatingArrowTask(EliteMobEntity eliteMobEntity) { - - new BukkitRunnable() { - - @Override - public void run() { - - if (!eliteMobEntity.getLivingEntity().isValid() || ((Monster) eliteMobEntity.getLivingEntity()).getTarget() == null) { - currentlyFiringEntities.remove(eliteMobEntity); - cancel(); - return; - } - - for (Entity nearbyEntity : eliteMobEntity.getLivingEntity().getNearbyEntities(20, 20, 20)) - if (nearbyEntity instanceof Player) - if (((Player) nearbyEntity).getGameMode().equals(GameMode.ADVENTURE) || - ((Player) nearbyEntity).getGameMode().equals(GameMode.SURVIVAL)) - shootArrow(eliteMobEntity.getLivingEntity(), (Player) nearbyEntity); - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 0, 20 * 8); - - } - - public static Arrow shootArrow(Entity entity, Player player) { - - Location offsetLocation = ProjectileLocationGenerator.generateLocation((LivingEntity) entity, player); - Arrow repeatingArrow = (Arrow) entity.getWorld().spawnEntity(offsetLocation, EntityType.ARROW); - Vector targetterToTargetted = player.getEyeLocation().subtract(repeatingArrow.getLocation()).toVector() - .normalize().multiply(2); - - repeatingArrow.setVelocity(targetterToTargetted); - repeatingArrow.setShooter((ProjectileSource) entity); - - return repeatingArrow; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackBlinding.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackBlinding.java deleted file mode 100644 index 0f930a8b1..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackBlinding.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers.offensivepowers; - -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobpowers.PowerCooldown; -import com.magmaguy.elitemobs.mobpowers.minorpowers.EventValidator; -import com.magmaguy.elitemobs.mobpowers.minorpowers.MinorPower; -import com.magmaguy.elitemobs.utils.EntityFinder; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; - -import java.util.HashSet; - -/** - * Created by MagmaGuy on 30/04/2017. - */ -public class AttackBlinding extends MinorPower implements Listener { - - private static HashSet cooldownList = new HashSet<>(); - - @Override - public void applyPowers(Entity entity) { - } - - @EventHandler - public void attackBlinding(EntityDamageByEntityEvent event) { - - EliteMobEntity eliteMobEntity = EventValidator.getEventEliteMob(this, event); - if (eliteMobEntity == null) return; - Player player = EntityFinder.findPlayer(event); - if (PowerCooldown.isInCooldown(eliteMobEntity, cooldownList)) return; - player.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 20 * 5, 3)); - PowerCooldown.startCooldownTimer(eliteMobEntity, cooldownList, 10 * 20); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackConfusing.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackConfusing.java deleted file mode 100644 index 498bd82a8..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackConfusing.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers.offensivepowers; - -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobpowers.PowerCooldown; -import com.magmaguy.elitemobs.mobpowers.minorpowers.EventValidator; -import com.magmaguy.elitemobs.mobpowers.minorpowers.MinorPower; -import com.magmaguy.elitemobs.utils.EntityFinder; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; - -import java.util.HashSet; - -/** - * Created by MagmaGuy on 30/04/2017. - */ -public class AttackConfusing extends MinorPower implements Listener { - - private static HashSet cooldowns = new HashSet<>(); - - @Override - public void applyPowers(Entity entity) { - } - - @EventHandler - public void attackConfusing(EntityDamageByEntityEvent event) { - - EliteMobEntity eliteMobEntity = EventValidator.getEventEliteMob(this, event); - if (eliteMobEntity == null) return; - Player player = EntityFinder.findPlayer(event); - if (PowerCooldown.isInCooldown(eliteMobEntity, cooldowns)) return; - - player.addPotionEffect(new PotionEffect(PotionEffectType.CONFUSION, 20 * 10, 3)); - PowerCooldown.startCooldownTimer(eliteMobEntity, cooldowns, 10 * 20); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackFire.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackFire.java deleted file mode 100644 index 7d0dd17a1..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackFire.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers.offensivepowers; - -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobpowers.PowerCooldown; -import com.magmaguy.elitemobs.mobpowers.minorpowers.EventValidator; -import com.magmaguy.elitemobs.mobpowers.minorpowers.MinorPower; -import com.magmaguy.elitemobs.utils.EntityFinder; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; - -import java.util.HashSet; - -/** - * Created by MagmaGuy on 28/04/2017. - */ -public class AttackFire extends MinorPower implements Listener { - - private static HashSet cooldownList = new HashSet<>(); - - @Override - public void applyPowers(Entity entity) { - } - - @EventHandler - public void attackFire(EntityDamageByEntityEvent event) { - - EliteMobEntity eliteMobEntity = EventValidator.getEventEliteMob(this, event); - if (eliteMobEntity == null) return; - Player player = EntityFinder.findPlayer(event); - if (PowerCooldown.isInCooldown(eliteMobEntity, cooldownList)) return; - - player.setFireTicks(40); - PowerCooldown.startCooldownTimer(eliteMobEntity, cooldownList, 10 * 20); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackFireball.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackFireball.java deleted file mode 100644 index ef1466ecf..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackFireball.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers.offensivepowers; - -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobpowers.minorpowers.EventValidator; -import com.magmaguy.elitemobs.mobpowers.minorpowers.MinorPower; -import org.bukkit.GameMode; -import org.bukkit.entity.*; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityTargetLivingEntityEvent; -import org.bukkit.projectiles.ProjectileSource; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.util.Vector; - -import java.util.HashSet; - -/** - * Created by MagmaGuy on 06/05/2017. - */ -public class AttackFireball extends MinorPower implements Listener { - - private static HashSet currentlyFiringEntities = new HashSet<>(); - - @Override - public void applyPowers(Entity entity) { - } - - @EventHandler - public void targetEvent(EntityTargetLivingEntityEvent event) { - EliteMobEntity eliteMobEntity = EventValidator.getEventEliteMob(this, event); - if (eliteMobEntity == null) return; - if (currentlyFiringEntities.contains(eliteMobEntity)) return; - repeatingFireballTask((Monster) event.getEntity()); - currentlyFiringEntities.add(eliteMobEntity); - } - - private void repeatingFireballTask(Monster monster) { - - new BukkitRunnable() { - - @Override - public void run() { - - if (!monster.isValid() || monster.getTarget() == null) { - cancel(); - return; - } - - for (Entity nearbyEntity : monster.getNearbyEntities(20, 20, 20)) - if (nearbyEntity instanceof Player) - if (((Player) nearbyEntity).getGameMode().equals(GameMode.ADVENTURE) || - ((Player) nearbyEntity).getGameMode().equals(GameMode.SURVIVAL)) - shootFireball(monster, (Player) nearbyEntity); - - } - - }.runTaskTimer(MetadataHandler.PLUGIN, 0, 20 * 8); - - } - - private static void shootFireball(Entity entity, Player player) { - - Fireball repeatingFireball = (Fireball) entity.getWorld().spawnEntity(entity.getLocation().add(0, 3, 0), EntityType.FIREBALL); - - Vector targetterToTargetted = player.getLocation().toVector().subtract(repeatingFireball.getLocation().toVector()).normalize(); - - repeatingFireball.setVelocity(targetterToTargetted); - repeatingFireball.setYield(1F); - repeatingFireball.setIsIncendiary(true); - repeatingFireball.setShooter((ProjectileSource) entity); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackFreeze.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackFreeze.java deleted file mode 100644 index 5a3d73952..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackFreeze.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers.offensivepowers; - -import com.magmaguy.elitemobs.ChatColorConverter; -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.MobPowersConfig; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobpowers.PowerCooldown; -import com.magmaguy.elitemobs.mobpowers.minorpowers.EventValidator; -import com.magmaguy.elitemobs.mobpowers.minorpowers.MinorPower; -import com.magmaguy.elitemobs.utils.EntityFinder; -import net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.chat.TextComponent; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; -import org.bukkit.scheduler.BukkitRunnable; - -import java.util.HashSet; - -/** - * Created by MagmaGuy on 28/04/2017. - */ -public class AttackFreeze extends MinorPower implements Listener { - - private static HashSet cooldowns = new HashSet<>(); - - @Override - public void applyPowers(Entity entity) { - } - - @EventHandler - public void attackFreeze(EntityDamageByEntityEvent event) { - - EliteMobEntity eliteMobEntity = EventValidator.getEventEliteMob(this, event); - if (eliteMobEntity == null) return; - Player player = EntityFinder.findPlayer(event); - if (PowerCooldown.isInCooldown(eliteMobEntity, cooldowns)) return; - - /* - Slow player down - */ - player.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 20 * 3, 10)); - player.spigot().sendMessage(ChatMessageType.ACTION_BAR, - TextComponent.fromLegacyText( - ChatColorConverter.convert( - ConfigValues.mobPowerConfig.getString( - MobPowersConfig.FROZEN_MESSAGE)))); - - PowerCooldown.startCooldownTimer(eliteMobEntity, cooldowns, 20 * 15); - - /* - Add block effect - */ - Block block = player.getLocation().getBlock(); - Material originalMaterial = block.getType(); - - if (!originalMaterial.equals(Material.AIR)) - return; - - block.setType(Material.PACKED_ICE); - - new BukkitRunnable() { - @Override - public void run() { - block.setType(originalMaterial); - } - }.runTaskLater(MetadataHandler.PLUGIN, 20 * 3); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackGravity.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackGravity.java deleted file mode 100644 index 69316c6e5..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackGravity.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers.offensivepowers; - -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobpowers.PowerCooldown; -import com.magmaguy.elitemobs.mobpowers.minorpowers.EventValidator; -import com.magmaguy.elitemobs.mobpowers.minorpowers.MinorPower; -import com.magmaguy.elitemobs.utils.EntityFinder; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; - -import java.util.HashSet; - -/** - * Created by MagmaGuy on 05/11/2016. - */ -public class AttackGravity extends MinorPower implements Listener { - - private static HashSet cooldowns = new HashSet<>(); - - @Override - public void applyPowers(Entity entity) { - } - - @EventHandler - public void attackGravity(EntityDamageByEntityEvent event) { - - EliteMobEntity eliteMobEntity = EventValidator.getEventEliteMob(this, event); - if (eliteMobEntity == null) return; - Player player = EntityFinder.findPlayer(event); - if (PowerCooldown.isInCooldown(eliteMobEntity, cooldowns)) return; - - player.addPotionEffect(new PotionEffect(PotionEffectType.LEVITATION, 2 * 20, 3)); - PowerCooldown.startCooldownTimer(eliteMobEntity, cooldowns, 10 * 20); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackPoison.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackPoison.java deleted file mode 100644 index 7a65b799a..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackPoison.java +++ /dev/null @@ -1,57 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers.offensivepowers; - -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobpowers.PowerCooldown; -import com.magmaguy.elitemobs.mobpowers.minorpowers.EventValidator; -import com.magmaguy.elitemobs.mobpowers.minorpowers.MinorPower; -import com.magmaguy.elitemobs.utils.EntityFinder; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; - -import java.util.HashSet; - -/** - * Created by MagmaGuy on 12/12/2016. - */ -public class AttackPoison extends MinorPower implements Listener { - - private static HashSet cooldowns = new HashSet<>(); - - @Override - public void applyPowers(Entity entity) { - } - - @EventHandler - public void onHit(EntityDamageByEntityEvent event) { - - EliteMobEntity eliteMobEntity = EventValidator.getEventEliteMob(this, event); - if (eliteMobEntity == null) return; - Player player = EntityFinder.findPlayer(event); - if (PowerCooldown.isInCooldown(eliteMobEntity, cooldowns)) return; - - player.addPotionEffect(new PotionEffect(PotionEffectType.POISON, 50, 3)); - PowerCooldown.startCooldownTimer(eliteMobEntity, cooldowns, 10 * 20); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackPush.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackPush.java deleted file mode 100644 index 9d55af287..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackPush.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers.offensivepowers; - -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobpowers.PowerCooldown; -import com.magmaguy.elitemobs.mobpowers.minorpowers.EventValidator; -import com.magmaguy.elitemobs.mobpowers.minorpowers.MinorPower; -import com.magmaguy.elitemobs.utils.EntityFinder; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.util.Vector; - -import java.util.HashSet; - -/** - * Created by MagmaGuy on 05/11/2016. - */ -public class AttackPush extends MinorPower implements Listener { - - private static HashSet cooldownList = new HashSet<>(); - - @Override - public void applyPowers(Entity entity) { - } - - @EventHandler - public void attackPush(EntityDamageByEntityEvent event) { - - EliteMobEntity eliteMobEntity = EventValidator.getEventEliteMob(this, event); - if (eliteMobEntity == null) return; - Player player = EntityFinder.findPlayer(event); - if (PowerCooldown.isInCooldown(eliteMobEntity, cooldownList)) return; - - Vector pushbackDirection = player.getLocation().subtract(eliteMobEntity.getLivingEntity().getLocation()).toVector(); - Vector pushbackApplied = pushbackDirection.normalize().multiply(3); - - player.setVelocity(pushbackApplied); - - PowerCooldown.startCooldownTimer(eliteMobEntity, cooldownList, 10 * 20); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackWeakness.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackWeakness.java deleted file mode 100644 index 8f6251a86..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackWeakness.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers.offensivepowers; - -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobpowers.PowerCooldown; -import com.magmaguy.elitemobs.mobpowers.minorpowers.EventValidator; -import com.magmaguy.elitemobs.mobpowers.minorpowers.MinorPower; -import com.magmaguy.elitemobs.utils.EntityFinder; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; - -import java.util.HashSet; - -/** - * Created by MagmaGuy on 06/05/2017. - */ -public class AttackWeakness extends MinorPower implements Listener { - - private static HashSet cooldownList = new HashSet<>(); - - @Override - public void applyPowers(Entity entity) { - } - - @EventHandler - public void attackWeakness(EntityDamageByEntityEvent event) { - - EliteMobEntity eliteMobEntity = EventValidator.getEventEliteMob(this, event); - if (eliteMobEntity == null) return; - Player player = EntityFinder.findPlayer(event); - if (PowerCooldown.isInCooldown(eliteMobEntity, cooldownList)) return; - - player.addPotionEffect(new PotionEffect(PotionEffectType.WEAKNESS, 20 * 3, 0)); - - PowerCooldown.startCooldownTimer(eliteMobEntity, cooldownList, 10 * 20); - - } - - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackWeb.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackWeb.java deleted file mode 100644 index da1218ca2..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackWeb.java +++ /dev/null @@ -1,73 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers.offensivepowers; - -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobpowers.PowerCooldown; -import com.magmaguy.elitemobs.mobpowers.minorpowers.EventValidator; -import com.magmaguy.elitemobs.mobpowers.minorpowers.MinorPower; -import com.magmaguy.elitemobs.utils.EntityFinder; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.scheduler.BukkitRunnable; - -import java.util.HashSet; - -/** - * Created by MagmaGuy on 28/04/2017. - */ -public class AttackWeb extends MinorPower implements Listener { - - private static HashSet cooldownList = new HashSet<>(); - - @Override - public void applyPowers(Entity entity) { - } - - @EventHandler - public void attackWeb(EntityDamageByEntityEvent event) { - - EliteMobEntity eliteMobEntity = EventValidator.getEventEliteMob(this, event); - if (eliteMobEntity == null) return; - Player player = EntityFinder.findPlayer(event); - if (PowerCooldown.isInCooldown(eliteMobEntity, cooldownList)) return; - - Block block = player.getLocation().getBlock(); - Material originalMaterial = block.getType(); - - if (!originalMaterial.equals(Material.AIR)) - return; - - block.setType(Material.WEB); - - new BukkitRunnable() { - @Override - public void run() { - block.setType(originalMaterial); - } - }.runTaskLater(MetadataHandler.PLUGIN, 20 * 3); - - PowerCooldown.startCooldownTimer(eliteMobEntity, cooldownList, 3 * 20); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackWither.java b/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackWither.java deleted file mode 100644 index b350be366..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/offensivepowers/AttackWither.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobpowers.offensivepowers; - -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobpowers.PowerCooldown; -import com.magmaguy.elitemobs.mobpowers.minorpowers.EventValidator; -import com.magmaguy.elitemobs.mobpowers.minorpowers.MinorPower; -import com.magmaguy.elitemobs.utils.EntityFinder; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.potion.PotionEffect; -import org.bukkit.potion.PotionEffectType; - -import java.util.HashSet; - -/** - * Created by MagmaGuy on 12/12/2016. - */ -public class AttackWither extends MinorPower implements Listener { - - private static HashSet cooldownList = new HashSet<>(); - - @Override - public void applyPowers(Entity entity) { - } - - @EventHandler - public void onHit(EntityDamageByEntityEvent event) { - - EliteMobEntity eliteMobEntity = EventValidator.getEventEliteMob(this, event); - if (eliteMobEntity == null) return; - Player player = EntityFinder.findPlayer(event); - if (PowerCooldown.isInCooldown(eliteMobEntity, cooldownList)) return; - player.addPotionEffect(new PotionEffect(PotionEffectType.WITHER, 50, 1)); - PowerCooldown.startCooldownTimer(eliteMobEntity, cooldownList, 10 * 20); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobs/passive/ChickenHandler.java b/src/main/java/com/magmaguy/elitemobs/mobs/passive/ChickenHandler.java deleted file mode 100644 index 57177bbac..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobs/passive/ChickenHandler.java +++ /dev/null @@ -1,245 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobs.passive; - -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.items.ItemDropVelocity; -import org.bukkit.Material; -import org.bukkit.entity.*; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.event.entity.EntitySpawnEvent; -import org.bukkit.event.entity.ItemMergeEvent; -import org.bukkit.event.inventory.InventoryPickupItemEvent; -import org.bukkit.event.world.ChunkUnloadEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; -import org.bukkit.scheduler.BukkitRunnable; - -import java.util.*; - -import static org.bukkit.Material.FEATHER; -import static org.bukkit.Material.RAW_CHICKEN; - -/** - * Created by MagmaGuy on 19/12/2016. - */ -public class ChickenHandler implements Listener { - - public static List activeChickenList = new ArrayList<>(); - - /* - Augmented egg drops - There's no egg dropping event and listening for new eggs can be extremely inaccurate due to high chicken density - Use events to add and remove loaded chicken and use the scanner to update the list of active chicken - */ - - @EventHandler(priority = EventPriority.HIGHEST) - public void superDrops(EntityDamageByEntityEvent event) { - - if (event.isCancelled()) { - - return; - - } - - if (event.getFinalDamage() < 1) { - - return; - - } - - if (event.getEntity() instanceof Chicken && EntityTracker.isSuperMob(event.getEntity())) { - - Random random = new Random(); - - Chicken chicken = (Chicken) event.getEntity(); - - double damage = event.getFinalDamage(); - //health is hardcoded here, maybe change it at some point? - double dropChance = damage / 4; - double dropRandomizer = random.nextDouble(); - //this rounds down - int dropMinAmount = (int) dropChance; - - ItemStack featherStack = new ItemStack(FEATHER, (random.nextInt(2) + 1)); - ItemStack poultryStack = new ItemStack(RAW_CHICKEN, 1); - - for (int i = 0; i < dropMinAmount; i++) { - - chicken.getWorld().dropItem(chicken.getLocation(), featherStack).setVelocity(ItemDropVelocity.ItemDropVelocity()); - chicken.getWorld().dropItem(chicken.getLocation(), poultryStack).setVelocity(ItemDropVelocity.ItemDropVelocity()); - - ExperienceOrb xpDrop = chicken.getWorld().spawn(chicken.getLocation(), ExperienceOrb.class); - xpDrop.setExperience(random.nextInt(3) + 1); - - } - - if (dropChance > dropRandomizer) { - - chicken.getWorld().dropItem(chicken.getLocation(), featherStack).setVelocity(ItemDropVelocity.ItemDropVelocity()); - chicken.getWorld().dropItem(chicken.getLocation(), poultryStack).setVelocity(ItemDropVelocity.ItemDropVelocity()); - - ExperienceOrb xpDrop = chicken.getWorld().spawn(chicken.getLocation(), ExperienceOrb.class); - xpDrop.setExperience(random.nextInt(3) + 1); - - } - - } - - } - - @EventHandler - public void superChickenAppearEvent(EntitySpawnEvent event) { - - if (event.getEntityType().equals(EntityType.CHICKEN)) { - - Chicken chicken = (Chicken) event.getEntity(); - - if (EntityTracker.isSuperMob(chicken)) { - - if (!activeChickenList.contains(chicken)) { - - activeChickenList.add(chicken); - - } - - } - - } - - } - - @EventHandler - public void superChickenDeathEvent(EntityDeathEvent event) { - - if (event.getEntityType().equals(EntityType.CHICKEN)) { - - Chicken chicken = (Chicken) event.getEntity(); - - activeChickenList.remove(chicken); - - } - - } - - @EventHandler - public void superChickenChunkUnloadEvent(ChunkUnloadEvent event) { - - Entity[] entityList = event.getChunk().getEntities(); - - for (Entity entity : entityList) { - - if (entity instanceof Chicken && EntityTracker.isSuperMob(entity)) { - - activeChickenList.remove(entity); - - } - - } - - } - - private List lore = new ArrayList<>(Arrays.asList("SuperChicken Egg")); - - //Egg drop chance is based on the underlying timer - public void dropEggs() { - - if (activeChickenList.isEmpty()) return; - - ItemStack eggStack = new ItemStack(Material.EGG, 1); - ItemMeta eggMeta = eggStack.getItemMeta(); - eggMeta.setLore(lore); - eggStack.setItemMeta(eggMeta); - - Iterator superChickenIterator = activeChickenList.iterator(); - - while (superChickenIterator.hasNext()) { - - Chicken chicken = superChickenIterator.next(); - - - if (chicken == null || !chicken.isValid()) { - - superChickenIterator.remove(); - - } else { - - Item droppedItem = chicken.getWorld().dropItem(chicken.getLocation(), eggStack); - droppedItem.setVelocity(ItemDropVelocity.ItemDropVelocity()); - new BukkitRunnable() { - - @Override - public void run() { - - if (droppedItem.isValid()) { - - droppedItem.remove(); - - } - - } - - }.runTaskLater(MetadataHandler.PLUGIN, 20 * 60); - - } - - } - - } - - @EventHandler - public void onHopperSuperEggPickup(InventoryPickupItemEvent event) { - - if (event.getItem().getItemStack().hasItemMeta() && event.getItem().getItemStack().getItemMeta().hasLore() && - event.getItem().getItemStack().getItemMeta().getLore().equals(lore)) { - - event.setCancelled(true); - - } - - } - - @EventHandler - public void onSuperEggMerge(ItemMergeEvent event) { - - if (event.getEntity().getItemStack().hasItemMeta() && event.getEntity().getItemStack().getItemMeta().hasLore() && - event.getEntity().getItemStack().getItemMeta().getLore().equals(lore)) { - - new BukkitRunnable() { - - @Override - public void run() { - - if (event.getTarget().isValid()) { - - event.getTarget().remove(); - - } - - } - - }.runTaskLater(MetadataHandler.PLUGIN, 20 * 60); - - } - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobs/passive/CowHandler.java b/src/main/java/com/magmaguy/elitemobs/mobs/passive/CowHandler.java deleted file mode 100644 index a618b4484..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobs/passive/CowHandler.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobs.passive; - -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.items.ItemDropVelocity; -import org.bukkit.entity.Cow; -import org.bukkit.entity.ExperienceOrb; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.Random; - -import static org.bukkit.Material.LEATHER; -import static org.bukkit.Material.RAW_BEEF; - -/** - * Created by MagmaGuy on 19/12/2016. - */ -public class CowHandler implements Listener { - - @EventHandler(priority = EventPriority.HIGHEST) - public void superDrops(EntityDamageByEntityEvent event) { - - if (event.isCancelled()) { - - return; - - } - - if (event.getFinalDamage() < 1) { - - return; - - } - - if (event.getEntity() instanceof Cow && EntityTracker.isSuperMob(event.getEntity())) { - - Random random = new Random(); - - Cow cow = (Cow) event.getEntity(); - - double damage = event.getFinalDamage(); - //health is hardcoded here, maybe change it at some point? - double dropChance = damage / 10; - double dropRandomizer = random.nextDouble(); - //this rounds down - int dropMinAmount = (int) dropChance; - - ItemStack beefStack = new ItemStack(RAW_BEEF, (random.nextInt(3) + 1)); - //leather can drop 0, meaning that it could create visual artifacts. Have to filter that out. - ItemStack leatherStack = new ItemStack(LEATHER, (random.nextInt(2))); - - for (int i = 0; i < dropMinAmount; i++) { - - cow.getWorld().dropItem(cow.getLocation(), beefStack).setVelocity(ItemDropVelocity.ItemDropVelocity()); - - ExperienceOrb xpDrop = cow.getWorld().spawn(cow.getLocation(), ExperienceOrb.class); - xpDrop.setExperience(random.nextInt(3) + 1); - - if (leatherStack.getAmount() != 0) { - - cow.getWorld().dropItem(cow.getLocation(), leatherStack).setVelocity(ItemDropVelocity.ItemDropVelocity()); - - } - - } - - if (dropChance > dropRandomizer) { - - cow.getWorld().dropItem(cow.getLocation(), beefStack).setVelocity(ItemDropVelocity.ItemDropVelocity()); - - ExperienceOrb xpDrop = cow.getWorld().spawn(cow.getLocation(), ExperienceOrb.class); - xpDrop.setExperience(random.nextInt(3) + 1); - - if (leatherStack.getAmount() != 0) { - - cow.getWorld().dropItem(cow.getLocation(), leatherStack).setVelocity(ItemDropVelocity.ItemDropVelocity()); - - } - - } - - } - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobs/passive/MushroomCowHandler.java b/src/main/java/com/magmaguy/elitemobs/mobs/passive/MushroomCowHandler.java deleted file mode 100644 index 0e34c8d15..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobs/passive/MushroomCowHandler.java +++ /dev/null @@ -1,119 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobs.passive; - -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.items.ItemDropVelocity; -import org.bukkit.entity.ExperienceOrb; -import org.bukkit.entity.MushroomCow; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.player.PlayerShearEntityEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.Random; - -import static org.bukkit.Material.*; - -/** - * Created by MagmaGuy on 19/12/2016. - */ -public class MushroomCowHandler implements Listener { - - @EventHandler(priority = EventPriority.HIGHEST) - public void superDrops(EntityDamageByEntityEvent event) { - - if (event.getFinalDamage() < 1) { - - return; - - } - - if (event.getEntity() instanceof MushroomCow && EntityTracker.isSuperMob(event.getEntity())) { - - Random random = new Random(); - - MushroomCow mushroomCow = (MushroomCow) event.getEntity(); - - double damage = event.getFinalDamage(); - //health is hardcoded here, maybe change it at some point? - double dropChance = damage / 10; - double dropRandomizer = random.nextDouble(); - //this rounds down - int dropMinAmount = (int) dropChance; - - ItemStack beefStack = new ItemStack(RAW_BEEF, (random.nextInt(3) + 1)); - //leather can drop 0, meaning that it could create visual artifacts. Have to filter that out. - ItemStack leatherStack = new ItemStack(LEATHER, (random.nextInt(2))); - - for (int i = 0; i < dropMinAmount; i++) { - - mushroomCow.getWorld().dropItem(mushroomCow.getLocation(), beefStack).setVelocity(ItemDropVelocity.ItemDropVelocity()); - - ExperienceOrb xpDrop = mushroomCow.getWorld().spawn(mushroomCow.getLocation(), ExperienceOrb.class); - xpDrop.setExperience(random.nextInt(3) + 1); - - if (leatherStack.getAmount() != 0) { - - mushroomCow.getWorld().dropItem(mushroomCow.getLocation(), leatherStack).setVelocity(ItemDropVelocity.ItemDropVelocity()); - - } - - } - - if (dropChance > dropRandomizer) { - - mushroomCow.getWorld().dropItem(mushroomCow.getLocation(), beefStack).setVelocity(ItemDropVelocity.ItemDropVelocity()); - - ExperienceOrb xpDrop = mushroomCow.getWorld().spawn(mushroomCow.getLocation(), ExperienceOrb.class); - xpDrop.setExperience(random.nextInt(3) + 1); - - if (leatherStack.getAmount() != 0) { - - mushroomCow.getWorld().dropItem(mushroomCow.getLocation(), leatherStack).setVelocity(ItemDropVelocity.ItemDropVelocity()); - - } - - } - - - } - - } - - - @EventHandler - public void onShear(PlayerShearEntityEvent event) { - - if (event.getEntity() instanceof MushroomCow && EntityTracker.isSuperMob(event.getEntity())) { - - MushroomCow mushroomCow = (MushroomCow) event.getEntity(); - - ItemStack mushroomStack = new ItemStack(RED_MUSHROOM, 5); - - for (int i = 0; i < 50; i++) { - - mushroomCow.getWorld().dropItem(mushroomCow.getLocation(), mushroomStack).setVelocity(ItemDropVelocity.ItemDropVelocity()); - - } - - } - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobs/passive/PassiveEliteMobDeathHandler.java b/src/main/java/com/magmaguy/elitemobs/mobs/passive/PassiveEliteMobDeathHandler.java deleted file mode 100644 index be031b33f..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobs/passive/PassiveEliteMobDeathHandler.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobs.passive; - -import com.magmaguy.elitemobs.EntityTracker; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDeathEvent; - -/** - * Created by MagmaGuy on 03/05/2017. - */ -public class PassiveEliteMobDeathHandler implements Listener { - - @EventHandler(priority = EventPriority.LOWEST) - public void onDeath(EntityDeathEvent event) { - - if (EntityTracker.isSuperMob(event.getEntity())) { - - event.getEntity().getLocation().getWorld().spawnEntity(event.getEntity().getLocation(), event.getEntityType()); - event.getEntity().getLocation().getWorld().spawnEntity(event.getEntity().getLocation(), event.getEntityType()); - - } - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobs/passive/PigHandler.java b/src/main/java/com/magmaguy/elitemobs/mobs/passive/PigHandler.java deleted file mode 100644 index 8a6bab31e..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobs/passive/PigHandler.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobs.passive; - -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.items.ItemDropVelocity; -import org.bukkit.entity.ExperienceOrb; -import org.bukkit.entity.Pig; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.Random; - -import static org.bukkit.Material.PORK; - -/** - * Created by MagmaGuy on 19/12/2016. - */ -public class PigHandler implements Listener { - - @EventHandler(priority = EventPriority.HIGHEST) - public void superDrops(EntityDamageByEntityEvent event) { - - if (event.isCancelled()) { - - return; - - } - - if (event.getFinalDamage() < 1) { - - return; - - } - - if (event.getEntity() instanceof Pig && EntityTracker.isSuperMob(event.getEntity())) { - - Random random = new Random(); - - Pig pig = (Pig) event.getEntity(); - - double damage = event.getFinalDamage(); - //health is hardcoded here, maybe change it at some point? - double dropChance = damage / 10; - double dropRandomizer = random.nextDouble(); - //this rounds down - int dropMinAmount = (int) dropChance; - - ItemStack porkchopStack = new ItemStack(PORK, random.nextInt(3) + 1); - - for (int i = 0; i < dropMinAmount; i++) { - - pig.getWorld().dropItem(pig.getLocation(), porkchopStack).setVelocity(ItemDropVelocity.ItemDropVelocity()); - - ExperienceOrb xpDrop = pig.getWorld().spawn(pig.getLocation(), ExperienceOrb.class); - xpDrop.setExperience(random.nextInt(3) + 1); - - } - - if (dropChance > dropRandomizer) { - - pig.getWorld().dropItem(pig.getLocation(), porkchopStack).setVelocity(ItemDropVelocity.ItemDropVelocity()); - - ExperienceOrb xpDrop = pig.getWorld().spawn(pig.getLocation(), ExperienceOrb.class); - xpDrop.setExperience(random.nextInt(3) + 1); - - } - - } - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobs/passive/SheepHandler.java b/src/main/java/com/magmaguy/elitemobs/mobs/passive/SheepHandler.java deleted file mode 100644 index eefc2a7fa..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobs/passive/SheepHandler.java +++ /dev/null @@ -1,239 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobs.passive; - -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.items.ItemDropVelocity; -import org.bukkit.entity.Sheep; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntityDamageByEntityEvent; -import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.event.player.PlayerShearEntityEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.Random; - -import static org.bukkit.Bukkit.getLogger; -import static org.bukkit.Material.*; - -/** - * Created by MagmaGuy on 19/12/2016. - */ -public class SheepHandler implements Listener { - - @EventHandler(priority = EventPriority.HIGHEST) - public void superDrops(EntityDamageByEntityEvent event) { - - if (event.isCancelled()) { - - return; - - } - - if (event.getFinalDamage() < 1) { - - return; - - } - - if (EntityTracker.isSuperMob(event.getEntity()) && event.getEntity() instanceof Sheep) { - - Random random = new Random(); - - Sheep sheep = (Sheep) event.getEntity(); - - double damage = event.getFinalDamage(); - //health is hardcoded here, maybe change it at some point? - double dropChance = damage / 8; - double dropRandomizer = random.nextDouble(); - //this rounds down - int dropMinAmount = (int) dropChance; - - ItemStack muttonStack = new ItemStack(MUTTON, random.nextInt(2) + 1); - ItemStack woolStack = new ItemStack(WOOL, 1); - - //for different wool colors - switch (sheep.getColor()) { - case WHITE: - woolStack = new ItemStack(WOOL, 1); - break; - case ORANGE: - woolStack = new ItemStack(WOOL, 1, (short) 1); - break; - case MAGENTA: - woolStack = new ItemStack(WOOL, 1, (short) 2); - break; - case LIGHT_BLUE: - woolStack = new ItemStack(WOOL, 1, (short) 3); - break; - case YELLOW: - woolStack = new ItemStack(WOOL, 1, (short) 4); - break; - case LIME: - woolStack = new ItemStack(WOOL, 1, (short) 5); - break; - case PINK: - woolStack = new ItemStack(WOOL, 1, (short) 6); - break; - case GRAY: - woolStack = new ItemStack(WOOL, 1, (short) 7); - break; - case SILVER: - woolStack = new ItemStack(WOOL, 1, (short) 8); - break; - case CYAN: - woolStack = new ItemStack(WOOL, 1, (short) 9); - break; - case PURPLE: - woolStack = new ItemStack(WOOL, 1, (short) 10); - break; - case BLUE: - woolStack = new ItemStack(WOOL, 1, (short) 11); - break; - case BROWN: - woolStack = new ItemStack(WOOL, 1, (short) 12); - break; - case GREEN: - woolStack = new ItemStack(WOOL, 1, (short) 13); - break; - case RED: - woolStack = new ItemStack(WOOL, 1, (short) 14); - break; - case BLACK: - woolStack = new ItemStack(WOOL, 1, (short) 15); - break; - default: - getLogger().info("Something went wrong with the sheep colors, one is missing. Contact the dev."); - break; - } - - for (int i = 0; i < dropMinAmount; i++) { - - sheep.getWorld().dropItem(sheep.getLocation(), muttonStack).setVelocity(ItemDropVelocity.ItemDropVelocity()); - sheep.getWorld().dropItem(sheep.getLocation(), woolStack).setVelocity(ItemDropVelocity.ItemDropVelocity()); - - } - - if (dropChance > dropRandomizer) { - - sheep.getWorld().dropItem(sheep.getLocation(), muttonStack).setVelocity(ItemDropVelocity.ItemDropVelocity()); - sheep.getWorld().dropItem(sheep.getLocation(), woolStack).setVelocity(ItemDropVelocity.ItemDropVelocity()); - - } - - } - - } - - @EventHandler - public void onDeath(EntityDeathEvent event) { - - if (event.getEntity() instanceof Sheep && EntityTracker.isSuperMob(event.getEntity())) { - - Sheep sheep = (Sheep) event.getEntity(); - - ItemStack sheepMonsterEgg = new ItemStack(MONSTER_EGG, 2, (short) 91); - sheep.getWorld().dropItem(sheep.getLocation(), sheepMonsterEgg); - - } - - } - - @EventHandler - public void onShear(PlayerShearEntityEvent event) { - - if (event.getEntity() instanceof Sheep && EntityTracker.isSuperMob(event.getEntity())) { - - Sheep sheep = (Sheep) event.getEntity(); - - for (int i = 0; i < 50; i++) { - - sheep.getWorld().dropItem(sheep.getLocation(), woolStackRandomizer(sheep)).setVelocity(ItemDropVelocity.ItemDropVelocity()); - - } - - } - - } - - public ItemStack woolStackRandomizer(Sheep sheep) { - - - Random random = new Random(); - - ItemStack woolStack = new ItemStack(WOOL, ((random.nextInt(3) + 1) * 50)); - - switch (sheep.getColor()) { - case WHITE: - woolStack = new ItemStack(WOOL, (random.nextInt(3) + 1)); - break; - case ORANGE: - woolStack = new ItemStack(WOOL, ((random.nextInt(3) + 1)), (short) 1); - break; - case MAGENTA: - woolStack = new ItemStack(WOOL, ((random.nextInt(3) + 1)), (short) 2); - break; - case LIGHT_BLUE: - woolStack = new ItemStack(WOOL, ((random.nextInt(3) + 1)), (short) 3); - break; - case YELLOW: - woolStack = new ItemStack(WOOL, ((random.nextInt(3) + 1)), (short) 4); - break; - case LIME: - woolStack = new ItemStack(WOOL, ((random.nextInt(3) + 1)), (short) 5); - break; - case PINK: - woolStack = new ItemStack(WOOL, ((random.nextInt(3) + 1)), (short) 6); - break; - case GRAY: - woolStack = new ItemStack(WOOL, ((random.nextInt(3) + 1)), (short) 7); - break; - case SILVER: - woolStack = new ItemStack(WOOL, ((random.nextInt(3) + 1)), (short) 8); - break; - case CYAN: - woolStack = new ItemStack(WOOL, ((random.nextInt(3) + 1)), (short) 9); - break; - case PURPLE: - woolStack = new ItemStack(WOOL, ((random.nextInt(3) + 1)), (short) 10); - break; - case BLUE: - woolStack = new ItemStack(WOOL, ((random.nextInt(3) + 1)), (short) 11); - break; - case BROWN: - woolStack = new ItemStack(WOOL, ((random.nextInt(3) + 1)), (short) 12); - break; - case GREEN: - woolStack = new ItemStack(WOOL, ((random.nextInt(3) + 1)), (short) 13); - break; - case RED: - woolStack = new ItemStack(WOOL, ((random.nextInt(3) + 1)), (short) 14); - break; - case BLACK: - woolStack = new ItemStack(WOOL, ((random.nextInt(3) + 1)), (short) 15); - break; - default: - getLogger().info("Something went wrong with the sheep colors, one is missing. Contact the dev."); - break; - } - - return woolStack; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobscanner/EliteMobScanner.java b/src/main/java/com/magmaguy/elitemobs/mobscanner/EliteMobScanner.java deleted file mode 100644 index e4ab9e76f..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobscanner/EliteMobScanner.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.magmaguy.elitemobs.mobscanner; - -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs.EliteMobProperties; -import org.bukkit.World; -import org.bukkit.attribute.Attribute; -import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; -import org.bukkit.scheduler.BukkitRunnable; - -import java.util.Iterator; - -import static com.magmaguy.elitemobs.EliteMobs.validWorldList; - -public class EliteMobScanner { - - private static int aggressiveRange = ConfigValues.mobCombatSettingsConfig.getInt(MobCombatSettingsConfig.AGGRESSIVE_STACK_RANGE); - - public static void scanElites() { - - for (World world : validWorldList) { - - if (world.getLivingEntities().isEmpty()) continue; - - Iterator iterator = world.getLivingEntities().iterator(); - - new BukkitRunnable() { - - @Override - public void run() { - - while (iterator.hasNext()) { - - LivingEntity livingEntity = iterator.next(); - - if (!EliteMobProperties.isValidEliteMobType(livingEntity)) continue; - - if (ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.STACK_AGGRESSIVE_NATURAL_MOBS)) - if (EntityTracker.isNaturalEntity(livingEntity)) - scanValidAggressiveLivingEntity(livingEntity); - - } - - } - - }.runTask(MetadataHandler.PLUGIN); - - } - - } - - public static void scanValidAggressiveLivingEntity(LivingEntity livingEntity) { - - if (!EntityTracker.isNaturalEntity(livingEntity) && - !ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.STACK_AGGRESSIVE_SPAWNER_MOBS)) - return; - if (EntityTracker.isNaturalEntity(livingEntity) && - !ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.STACK_AGGRESSIVE_NATURAL_MOBS)) - return; - - for (Entity secondEntity : livingEntity.getNearbyEntities(aggressiveRange, aggressiveRange, aggressiveRange)) { - - if (!secondEntity.getType().equals(livingEntity.getType())) continue; - if (!livingEntity.isValid() || !secondEntity.isValid()) continue; - - if (!EntityTracker.isNaturalEntity(secondEntity) && - !ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.STACK_AGGRESSIVE_SPAWNER_MOBS)) - return; - if (EntityTracker.isNaturalEntity(secondEntity) && - !ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.STACK_AGGRESSIVE_NATURAL_MOBS)) - return; - - - EliteMobEntity eliteMobEntity1 = null; - EliteMobEntity eliteMobEntity2 = null; - - int level1 = 1; - int level2 = 1; - - if (EntityTracker.isEliteMob(livingEntity)) { - eliteMobEntity1 = EntityTracker.getEliteMobEntity(livingEntity); - if (!eliteMobEntity1.canStack()) continue; - level1 = eliteMobEntity1.getLevel(); - } - - if (EntityTracker.isEliteMob(secondEntity)) { - eliteMobEntity2 = EntityTracker.getEliteMobEntity(secondEntity); - if (!eliteMobEntity2.canStack()) continue; - level2 = eliteMobEntity2.getLevel(); - } - - int newLevel = level1 + level2; - - if (newLevel > ConfigValues.mobCombatSettingsConfig.getInt(MobCombatSettingsConfig.ELITEMOB_STACKING_CAP)) - return; - - double healthPercentage = (livingEntity.getHealth() / livingEntity.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue() + - ((LivingEntity) secondEntity).getHealth() / ((LivingEntity) secondEntity).getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()) / 2; - - /* - This is a bit of a dirty hack - It won't register the entity twice, but it will overwrite the existing method - */ - eliteMobEntity1 = new EliteMobEntity(livingEntity, newLevel, healthPercentage); - secondEntity.remove(); - - } - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobscanner/SuperMobScanner.java b/src/main/java/com/magmaguy/elitemobs/mobscanner/SuperMobScanner.java deleted file mode 100644 index fb35fc20d..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobscanner/SuperMobScanner.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.magmaguy.elitemobs.mobscanner; - -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.DefaultConfig; -import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; -import com.magmaguy.elitemobs.mobconstructor.SuperMobConstructor; -import com.magmaguy.elitemobs.mobconstructor.mobdata.passivemobs.SuperMobProperties; -import org.bukkit.World; -import org.bukkit.attribute.Attribute; -import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; -import org.bukkit.scheduler.BukkitRunnable; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.concurrent.ThreadLocalRandom; - -import static com.magmaguy.elitemobs.EliteMobs.validWorldList; - -public class SuperMobScanner { - - private static int passiveRange = ConfigValues.mobCombatSettingsConfig.getInt(MobCombatSettingsConfig.PASSIVE_STACK_RANGE); - - public static void scanSuperMobs() { - - for (World world : validWorldList) { - - if (world.getLivingEntities().isEmpty()) continue; - - Iterator iterator = world.getLivingEntities().iterator(); - - new BukkitRunnable() { - - @Override - public void run() { - - while (iterator.hasNext()) { - - LivingEntity livingEntity = iterator.next(); - - if (!SuperMobProperties.isValidSuperMobType(livingEntity)) continue; - - /* - Re-register lost passive mob - */ - checkLostSuperMob(livingEntity); - - /* - Check passive mobs to register new super mobs - */ - newSuperMobScan(livingEntity); - - } - - } - - }.runTask(MetadataHandler.PLUGIN); - - } - - } - - private static void checkLostSuperMob(LivingEntity livingEntity) { - - if (livingEntity.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue() != - SuperMobProperties.getSuperMobMaxHealth(livingEntity)) - return; - - if (!EntityTracker.isSuperMob(livingEntity)) - EntityTracker.registerSuperMob(livingEntity); - - } - - public static void newSuperMobScan(LivingEntity livingEntity) { - - if (livingEntity.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue() == - SuperMobProperties.getSuperMobMaxHealth(livingEntity)) - return; - - if (ThreadLocalRandom.current().nextDouble() < 1 / ConfigValues.defaultConfig.getDouble(DefaultConfig.SUPERMOB_STACK_AMOUNT)) - return; - - ArrayList livingEntities = new ArrayList<>(); - - for (Entity entity : livingEntity.getNearbyEntities(passiveRange, passiveRange, passiveRange)) { - - if (!entity.getType().equals(livingEntity.getType())) continue; - if (EntityTracker.isSuperMob(entity)) continue; - livingEntities.add((LivingEntity) entity); - if (livingEntities.size() >= ConfigValues.defaultConfig.getInt(DefaultConfig.SUPERMOB_STACK_AMOUNT)) - break; - - } - - if (livingEntities.size() < ConfigValues.defaultConfig.getInt(DefaultConfig.SUPERMOB_STACK_AMOUNT)) - return; - - SuperMobConstructor.constructSuperMob(livingEntity); - for (Entity entity : livingEntities) { - entity.remove(); - } - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobspawning/MobLevelCalculator.java b/src/main/java/com/magmaguy/elitemobs/mobspawning/MobLevelCalculator.java deleted file mode 100644 index c65dcdf1f..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobspawning/MobLevelCalculator.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.magmaguy.elitemobs.mobspawning; - -import com.magmaguy.elitemobs.adventurersguild.GuildRank; -import com.magmaguy.elitemobs.items.ItemTierFinder; -import com.magmaguy.elitemobs.items.MobTierFinder; -import org.bukkit.entity.Player; - -public class MobLevelCalculator { - - public static int determineMobLevel(Player player) { - - //Add selected player gear tier modifier - double perPlayerEliteMobLevel = ItemTierFinder.findPlayerTier(player); - //Add selected guild rank modifier - perPlayerEliteMobLevel += (GuildRank.getGuildRank(player.getUniqueId()) - 10) * 0.2; - - int finalTieredMobLevel = (int) (perPlayerEliteMobLevel * MobTierFinder.PER_TIER_LEVEL_INCREASE); - - return finalTieredMobLevel; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobspawning/NaturalEliteMobSpawnEventHandler.java b/src/main/java/com/magmaguy/elitemobs/mobspawning/NaturalEliteMobSpawnEventHandler.java deleted file mode 100644 index a45a9f99b..000000000 --- a/src/main/java/com/magmaguy/elitemobs/mobspawning/NaturalEliteMobSpawnEventHandler.java +++ /dev/null @@ -1,85 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.mobspawning; - -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; -import com.magmaguy.elitemobs.items.MobTierFinder; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import org.bukkit.Bukkit; -import org.bukkit.GameMode; -import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; -import org.bukkit.event.Listener; - -import java.util.ArrayList; -import java.util.List; - -/** - * Created by MagmaGuy on 10/10/2016. - */ -public class NaturalEliteMobSpawnEventHandler implements Listener { - - private static int range = Bukkit.getServer().getViewDistance() * 16; - - /* - This manages elite mob entities that are spawned naturally - */ - public static void naturalMobProcessor(Entity entity) { - - List closePlayers = new ArrayList<>(); - - for (Player player : Bukkit.getOnlinePlayers()) - if (player.getWorld().equals(entity.getWorld()) && player.getLocation().distanceSquared(entity.getLocation()) < Math.pow(range, 2)) - if (!player.getGameMode().equals(GameMode.SPECTATOR) && (!player.hasMetadata(MetadataHandler.VANISH_NO_PACKET) || - player.hasMetadata(MetadataHandler.VANISH_NO_PACKET) && !player.getMetadata(MetadataHandler.VANISH_NO_PACKET).get(0).asBoolean())) - closePlayers.add(player); - - int eliteMobLevel = 1; - int playerCount = 0; - - for (Player player : closePlayers) { - - int individualPlayerThreat = MobLevelCalculator.determineMobLevel(player); - playerCount++; - - if (individualPlayerThreat > eliteMobLevel) - eliteMobLevel = individualPlayerThreat; - - } - - /* - Add in party system modifier - Each player adds a +0.2 tier bonus - */ - eliteMobLevel += playerCount * 0.2 * MobTierFinder.PER_TIER_LEVEL_INCREASE; - - if (ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.INCREASE_DIFFICULTY_WITH_SPAWN_DISTANCE)) { - - int levelIncrement = SpawnRadiusDifficultyIncrementer.distanceFromSpawnLevelIncrease((LivingEntity) entity); - eliteMobLevel += levelIncrement; - - } - - if (playerCount == 0 || eliteMobLevel < 1) return; - - EliteMobEntity eliteMobEntity = new EliteMobEntity((LivingEntity) entity, eliteMobLevel); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/mobspawning/NaturalMobSpawnEventHandler.java b/src/main/java/com/magmaguy/elitemobs/mobspawning/NaturalMobSpawnEventHandler.java index 5084889ad..a834e9ece 100644 --- a/src/main/java/com/magmaguy/elitemobs/mobspawning/NaturalMobSpawnEventHandler.java +++ b/src/main/java/com/magmaguy/elitemobs/mobspawning/NaturalMobSpawnEventHandler.java @@ -1,141 +1,165 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package com.magmaguy.elitemobs.mobspawning; -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.*; -import com.magmaguy.elitemobs.items.customenchantments.CustomEnchantmentCache; +import com.magmaguy.elitemobs.EliteMobs; +import com.magmaguy.elitemobs.adventurersguild.GuildRank; +import com.magmaguy.elitemobs.config.AdventurersGuildConfig; +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; +import com.magmaguy.elitemobs.config.ValidWorldsConfig; +import com.magmaguy.elitemobs.config.mobproperties.MobPropertiesConfig; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.items.MobTierCalculator; +import com.magmaguy.elitemobs.items.customenchantments.HunterEnchantment; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; import com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs.EliteMobProperties; -import org.bukkit.Bukkit; -import org.bukkit.entity.Entity; +import com.magmaguy.elitemobs.playerdata.ElitePlayerInventory; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.thirdparty.worldguard.WorldGuardCompatibility; +import com.magmaguy.elitemobs.thirdparty.worldguard.WorldGuardFlagChecker; +import com.magmaguy.elitemobs.thirdparty.worldguard.WorldGuardSpawnEventBypasser; +import com.magmaguy.elitemobs.utils.PlayerScanner; +import org.bukkit.Location; +import org.bukkit.entity.EntityType; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.entity.CreatureSpawnEvent; -import org.bukkit.inventory.ItemStack; +import java.util.List; import java.util.concurrent.ThreadLocalRandom; +import java.util.concurrent.atomic.AtomicInteger; -import static org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.CUSTOM; -import static org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.NATURAL; +import static org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason.*; /** * Created by MagmaGuy on 24/04/2017. */ public class NaturalMobSpawnEventHandler implements Listener { - private static int range = Bukkit.getServer().getViewDistance() * 16; - private static boolean ignoreMob = false; + /** + * This gets the level the natural Elite Mob should have. This level is determined by the power of the armor and weapons + * the players are wearing, as well as by how many players are in the area. + * + * @param spawnLocation Location to scan around for players + * @return + */ + public static int getNaturalMobLevel(Location spawnLocation, List nearbyPlayers) { - public static void setIgnoreMob(boolean bool) { - ignoreMob = bool; - } + int eliteMobLevel = 1; + int playerCount = 0; + + for (Player player : nearbyPlayers) { + int individualPlayerThreat = ElitePlayerInventory.playerInventories.get(player.getUniqueId()).getNaturalMobSpawnLevel(true); + playerCount++; + + if (individualPlayerThreat > eliteMobLevel) + eliteMobLevel = individualPlayerThreat; + } + + /* + Party system modifier + Each player adds a +2 tier bonus + */ + eliteMobLevel += playerCount * 2 * MobTierCalculator.PER_TIER_LEVEL_INCREASE; + + if (MobCombatSettingsConfig.isIncreaseDifficultyWithSpawnDistance()) { + int levelIncrement = SpawnRadiusDifficultyIncrementer.distanceFromSpawnLevelIncrease(spawnLocation); + eliteMobLevel += levelIncrement; + } + + if (playerCount == 0 || eliteMobLevel < 1) return 0; + + //add wiggle room + int wiggle = ThreadLocalRandom.current().nextInt(5) - 2; + eliteMobLevel = Math.max(wiggle + eliteMobLevel, 1); + + return eliteMobLevel; - private static boolean getIgnoreMob() { - return ignoreMob; } - @EventHandler(priority = EventPriority.HIGHEST) + @EventHandler(priority = EventPriority.HIGH, ignoreCancelled = true) public void onSpawn(CreatureSpawnEvent event) { - if (getIgnoreMob()) { - setIgnoreMob(false); + if (event.getSpawnReason().equals(DROWNED) || event.getSpawnReason().equals(BREEDING)) return; + + if (event.getEntity().getType().equals(EntityType.BEE)) return; - } - if (event.isCancelled()) return; + + if (MobPropertiesConfig.getMobProperties().get(event.getEntityType()) == null || + !MobPropertiesConfig.getMobProperties().get(event.getEntityType()).isEnabled()) + return; + + if (EliteMobs.worldGuardIsEnabled) + if (!WorldGuardFlagChecker.checkFlag(event.getLocation(), WorldGuardCompatibility.getELITEMOBS_SPAWN_FLAG())) + return; + + //This fires for custom bosses, so don't override those spawns + if (WorldGuardSpawnEventBypasser.isForcedSpawn()) return; + /* Deal with entities spawned within the plugin */ if (EntityTracker.isEliteMob(event.getEntity())) return; - if (!ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.NATURAL_MOB_SPAWNING)) - return; - if (!ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_AGGRESSIVE_ELITEMOBS)) + if (!MobCombatSettingsConfig.isDoNaturalMobSpawning()) return; - if (!ConfigValues.validWorldsConfig.getBoolean("Valid worlds." + event.getEntity().getWorld().getName())) + if (!ValidWorldsConfig.getInstance().getFileConfiguration().getBoolean("Valid worlds." + event.getEntity().getWorld().getName())) return; - if (event.getSpawnReason().equals(CreatureSpawnEvent.SpawnReason.SPAWNER) && !ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.SPAWNERS_SPAWN_ELITE_MOBS)) + if (event.getSpawnReason().equals(CreatureSpawnEvent.SpawnReason.SPAWNER) && + !MobCombatSettingsConfig.isDoSpawnersSpawnEliteMobs() || + event.getSpawnReason() != NATURAL && DefaultConfig.isDoStrictSpawningRules()) return; - if (event.getEntity().getCustomName() != null && ConfigValues.defaultConfig.getBoolean(DefaultConfig.PREVENT_ELITE_MOB_CONVERSION_OF_NAMED_MOBS)) + if (event.getEntity().getCustomName() != null && DefaultConfig.isPreventEliteMobConversionOfNamedMobs()) return; - if (!(event.getSpawnReason() == NATURAL || event.getSpawnReason() == CUSTOM && !ConfigValues.defaultConfig.getBoolean(DefaultConfig.STRICT_SPAWNING_RULES))) - return; if (!EliteMobProperties.isValidEliteMobType(event.getEntityType())) return; LivingEntity livingEntity = event.getEntity(); - int huntingGearChanceAdder = getHuntingGearBonus(livingEntity); - Double validChance = (ConfigValues.mobCombatSettingsConfig.getDouble(MobCombatSettingsConfig.AGGRESSIVE_MOB_CONVERSION_PERCENTAGE) + - huntingGearChanceAdder) / 100; + double validChance = MobCombatSettingsConfig.getAggressiveMobConversionPercentage(); - if (!(ThreadLocalRandom.current().nextDouble() < validChance)) - return; + List nearbyPlayers = PlayerScanner.getNearbyPlayers(livingEntity.getLocation()); - NaturalEliteMobSpawnEventHandler.naturalMobProcessor(livingEntity); + double huntingGearChanceAdder = HunterEnchantment.getHuntingGearBonus(nearbyPlayers); + validChance += huntingGearChanceAdder; - } - - private static int getHuntingGearBonus(Entity entity) { - - int huntingGearChanceAdder = 0; - - for (Player player : Bukkit.getOnlinePlayers()) { + AtomicInteger peacefulModeDebuffs = new AtomicInteger(); + nearbyPlayers.forEach(player -> { + //Handles situations where fake players got caught in the detection + if (PlayerData.getPlayerData(player.getUniqueId()) != null && GuildRank.getActiveGuildRank(player) == 0) + peacefulModeDebuffs.getAndIncrement(); + }); - if (player.getWorld().equals(entity.getWorld()) && - (!player.hasMetadata(MetadataHandler.VANISH_NO_PACKET) || - player.hasMetadata(MetadataHandler.VANISH_NO_PACKET) && !player.getMetadata(MetadataHandler.VANISH_NO_PACKET).get(0).asBoolean())) { + validChance -= peacefulModeDebuffs.get() * AdventurersGuildConfig.getPeacefulModeEliteChanceDecrease(); - if (player.getLocation().distance(entity.getLocation()) < range) { + if (ThreadLocalRandom.current().nextDouble() >= validChance) return; - ItemStack helmet = player.getInventory().getHelmet(); - ItemStack chestplate = player.getInventory().getChestplate(); - ItemStack leggings = player.getInventory().getLeggings(); - ItemStack boots = player.getInventory().getBoots(); - ItemStack heldItem = player.getInventory().getItemInMainHand(); - ItemStack offHandItem = player.getInventory().getItemInOffHand(); + int eliteMobLevel = getNaturalMobLevel(livingEntity.getLocation(), nearbyPlayers); - if (CustomEnchantmentCache.hunterEnchantment.hasCustomEnchantment(helmet)) - huntingGearChanceAdder += CustomEnchantmentCache.hunterEnchantment.getCustomEnchantmentLevel(helmet); - if (CustomEnchantmentCache.hunterEnchantment.hasCustomEnchantment(chestplate)) - huntingGearChanceAdder += CustomEnchantmentCache.hunterEnchantment.getCustomEnchantmentLevel(chestplate); - if (CustomEnchantmentCache.hunterEnchantment.hasCustomEnchantment(leggings)) - huntingGearChanceAdder += CustomEnchantmentCache.hunterEnchantment.getCustomEnchantmentLevel(leggings); - if (CustomEnchantmentCache.hunterEnchantment.hasCustomEnchantment(boots)) - huntingGearChanceAdder += CustomEnchantmentCache.hunterEnchantment.getCustomEnchantmentLevel(boots); - if (CustomEnchantmentCache.hunterEnchantment.hasCustomEnchantment(heldItem)) - huntingGearChanceAdder += CustomEnchantmentCache.hunterEnchantment.getCustomEnchantmentLevel(heldItem); - if (CustomEnchantmentCache.hunterEnchantment.hasCustomEnchantment(offHandItem)) - huntingGearChanceAdder += CustomEnchantmentCache.hunterEnchantment.getCustomEnchantmentLevel(offHandItem); - - } + //Takes worldguard minimum and maximum level flags into account + if (EliteMobs.worldGuardIsEnabled) { + Integer minLevel = WorldGuardFlagChecker.getRegionMinimumLevel(livingEntity.getLocation()); + Integer maxLevel = WorldGuardFlagChecker.getRegionMaximumLevel(livingEntity.getLocation()); + if (minLevel != null) + eliteMobLevel = minLevel > eliteMobLevel ? minLevel : eliteMobLevel; + if (maxLevel != null) + eliteMobLevel = maxLevel < eliteMobLevel ? maxLevel : eliteMobLevel; + } - } + if (eliteMobLevel < 0) return; - } + if (eliteMobLevel > MobCombatSettingsConfig.getNaturalEliteMobLevelCap()) + eliteMobLevel = MobCombatSettingsConfig.getNaturalEliteMobLevelCap(); - huntingGearChanceAdder = huntingGearChanceAdder * ConfigValues.customEnchantmentsConfig.getInt(CustomEnchantmentsConfig.HUNTER_SPAWN_BONUS); + EliteEntity eliteEntity = new EliteEntity(livingEntity, eliteMobLevel, event.getSpawnReason()); - return huntingGearChanceAdder; + if (event.getSpawnReason().equals(CreatureSpawnEvent.SpawnReason.SPAWNER)) + eliteEntity.setEliteLoot(false); } diff --git a/src/main/java/com/magmaguy/elitemobs/mobspawning/SpawnRadiusDifficultyIncrementer.java b/src/main/java/com/magmaguy/elitemobs/mobspawning/SpawnRadiusDifficultyIncrementer.java index 2f37f71ba..f009956fa 100644 --- a/src/main/java/com/magmaguy/elitemobs/mobspawning/SpawnRadiusDifficultyIncrementer.java +++ b/src/main/java/com/magmaguy/elitemobs/mobspawning/SpawnRadiusDifficultyIncrementer.java @@ -1,40 +1,21 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package com.magmaguy.elitemobs.mobspawning; -import com.magmaguy.elitemobs.config.ConfigValues; import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; import org.bukkit.Location; -import org.bukkit.entity.LivingEntity; public class SpawnRadiusDifficultyIncrementer { - public static int distanceFromSpawnLevelIncrease(LivingEntity livingEntity) { + public static int distanceFromSpawnLevelIncrease(Location location) { - double distanceUnit = ConfigValues.mobCombatSettingsConfig.getDouble(MobCombatSettingsConfig.DISTANCE_TO_INCREMENT); - double levelToIncrement = ConfigValues.mobCombatSettingsConfig.getDouble(MobCombatSettingsConfig.LEVEL_TO_INCREMENT); + double distanceUnit = MobCombatSettingsConfig.getDistanceToIncrement(); + double levelToIncrement = MobCombatSettingsConfig.getLevelToIncrement(); - Location spawnLocation = livingEntity.getWorld().getSpawnLocation(); - Location entityLocation = livingEntity.getLocation(); + Location spawnLocation = location.getWorld().getSpawnLocation(); + Location entityLocation = location; double distanceFromSpawn = spawnLocation.distance(entityLocation); - int levelIncrease = (int) (distanceFromSpawn / distanceUnit * levelToIncrement); - - return levelIncrease; + return (int) (distanceFromSpawn / distanceUnit * levelToIncrement); } diff --git a/src/main/java/com/magmaguy/elitemobs/npcs/NPCDamageEvent.java b/src/main/java/com/magmaguy/elitemobs/npcs/NPCDamageEvent.java new file mode 100644 index 000000000..cec2fa74b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/npcs/NPCDamageEvent.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.npcs; + +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; + +public class NPCDamageEvent implements Listener { + + @EventHandler(ignoreCancelled = true) + public void onNPCDamage(EntityDamageEvent event) { + if (!EntityTracker.isNPCEntity(event.getEntity())) return; + event.setCancelled(true); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/npcs/NPCEntity.java b/src/main/java/com/magmaguy/elitemobs/npcs/NPCEntity.java new file mode 100644 index 000000000..480d7af16 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/npcs/NPCEntity.java @@ -0,0 +1,379 @@ +package com.magmaguy.elitemobs.npcs; + +import com.google.common.collect.ArrayListMultimap; +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.internal.RemovalReason; +import com.magmaguy.elitemobs.config.npcs.NPCsConfig; +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.instanced.dungeons.DungeonInstance; +import com.magmaguy.elitemobs.mobconstructor.PersistentMovingEntity; +import com.magmaguy.elitemobs.mobconstructor.PersistentObject; +import com.magmaguy.elitemobs.mobconstructor.PersistentObjectHandler; +import com.magmaguy.elitemobs.npcs.chatter.NPCChatBubble; +import com.magmaguy.elitemobs.thirdparty.custommodels.CustomModel; +import com.magmaguy.elitemobs.thirdparty.libsdisguises.DisguiseEntity; +import com.magmaguy.elitemobs.thirdparty.worldguard.WorldGuardSpawnEventBypasser; +import com.magmaguy.elitemobs.utils.ChunkLocationChecker; +import com.magmaguy.elitemobs.utils.ConfigurationLocation; +import com.magmaguy.elitemobs.utils.NonSolidBlockTypes; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.attribute.Attribute; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Villager; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.world.WorldUnloadEvent; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Consumer; +import org.bukkit.util.Vector; + +import java.util.List; +import java.util.UUID; +import java.util.concurrent.ThreadLocalRandom; + +public class NPCEntity implements PersistentObject, PersistentMovingEntity { + + private static final ArrayListMultimap instancedNPCEntities = ArrayListMultimap.create(); + public final NPCsConfigFields npCsConfigFields; + @Getter + private final UUID uuid = UUID.randomUUID(); + private boolean isInstancedDuplicate = false; + private PersistentObjectHandler persistentObjectHandler; + private Villager villager = null; + private Location spawnLocation; + private boolean isTalking = false; + private ArmorStand roleDisplay; + private boolean isDisguised = false; + private String locationString; + /** + * Spawns NPC based off of the values in the NPCsConfig config file. Runs at startup and on reload. + */ + public NPCEntity(NPCsConfigFields npCsConfigFields, String locationString) { + this.npCsConfigFields = npCsConfigFields; + this.locationString = locationString; + if (!npCsConfigFields.isEnabled()) return; + if (npCsConfigFields.isInstanced()) { + Location location = ConfigurationLocation.serialize(locationString); + String blueprintWorldName = locationString.split(",")[0]; + instancedNPCEntities.put(blueprintWorldName, new InstancedNPCContainer(location, this)); + return; + } + //this is how the wandering trader works + if (locationString == null || + locationString.equalsIgnoreCase("null")) + return; + setSpawnLocation(); + spawn(); + persistentObjectHandler = new PersistentObjectHandler(this); + } + /** + * Spawns NPCs for dungeon instancing. + */ + public NPCEntity(NPCsConfigFields npCsConfigFields, Location location) { + this.npCsConfigFields = npCsConfigFields; + isInstancedDuplicate = true; + if (!npCsConfigFields.isEnabled()) return; + //this is how the wandering trader works + this.spawnLocation = location; + spawn(); + persistentObjectHandler = new PersistentObjectHandler(this); + } + + /** + * For the travelling merchant + * + * @param location + */ + public NPCEntity(Location location) { + this.npCsConfigFields = NPCsConfig.getNpcEntities().get("travelling_merchant.yml"); + if (!npCsConfigFields.isEnabled()) return; + Location potentialLocation = location.clone(); + potentialLocation.add(potentialLocation.getDirection().normalize()).setY(location.getY()); + if (NonSolidBlockTypes.isPassthrough(potentialLocation.getBlock().getType())) + this.spawnLocation = potentialLocation; + else this.spawnLocation = location.clone(); + this.spawnLocation.setDirection(this.spawnLocation.getDirection().multiply(-1)); + spawn(); + } + + public static void shutdown() { + instancedNPCEntities.clear(); + } + + public static void initializeInstancedNPCs(String blueprintWorldName, World newWorld, int playerCount, DungeonInstance dungeonInstance) { + List rawNPCs = instancedNPCEntities.get(blueprintWorldName); + for (InstancedNPCContainer instancedNPCContainer : rawNPCs) { + Location newLocation = instancedNPCContainer.getLocation(); + newLocation.setWorld(newWorld); + new NPCEntity(instancedNPCContainer.getNpcEntity().getNPCsConfigFields(), newLocation); + } + } + + public static void initializeNPCs(NPCsConfigFields npCsConfigFields) { + if (npCsConfigFields.getLocations() != null && !npCsConfigFields.getLocations().isEmpty()) { + for (String locationString : npCsConfigFields.getLocations()) + new NPCEntity(npCsConfigFields, locationString); + } else if (npCsConfigFields.getSpawnLocation() != null && !npCsConfigFields.getSpawnLocation().isEmpty()) { + new NPCEntity(npCsConfigFields, npCsConfigFields.getSpawnLocation()); + } + } + + public void remove(RemovalReason removalReason) { + if (roleDisplay != null) + roleDisplay.remove(); + if (villager != null) { + villager.remove(); + EntityTracker.getNpcEntities().remove(villager.getUniqueId()); + this.villager = null; + } + + if (removalReason.equals(RemovalReason.WORLD_UNLOAD) && isInstancedDuplicate) { + persistentObjectHandler.remove(); + return; + } + + if (removalReason.equals(RemovalReason.REMOVE_COMMAND)) { + if (npCsConfigFields.getLocations() != null && !npCsConfigFields.getLocations().isEmpty()) { + npCsConfigFields.removeNPC(locationString); + locationString = null; + spawnLocation = null; + } else { + npCsConfigFields.setEnabled(false); + spawnLocation = null; + } + if (persistentObjectHandler != null) + persistentObjectHandler.remove(); + } else if (persistentObjectHandler != null) + if (!removalReason.equals(RemovalReason.SHUTDOWN)) + persistentObjectHandler.updatePersistentLocation(getPersistentLocation()); + else + persistentObjectHandler.remove(); + } + + private void spawn() { + if (spawnLocation == null || + spawnLocation.getWorld() == null || + !ChunkLocationChecker.locationIsLoaded(spawnLocation)) return; + if (villager != null && villager.isValid()) return; + WorldGuardSpawnEventBypasser.forceSpawn(); + villager = spawnLocation.getWorld().spawn(spawnLocation, Villager.class, villagerInstance -> { + villagerInstance.setAI(false); + villagerInstance.setPersistent(false); + villagerInstance.setRemoveWhenFarAway(false); + villagerInstance.setCustomName(ChatColorConverter.convert(npCsConfigFields.getName())); + villagerInstance.setCustomNameVisible(true); + villagerInstance.setProfession(npCsConfigFields.getProfession()); + villagerInstance.getAttribute(Attribute.GENERIC_SCALE).setBaseValue(npCsConfigFields.getScale()); + if (getNPCsConfigFields().getCustomModel() != null && !getNPCsConfigFields().getCustomModel().isEmpty()) + setCustomModel(villagerInstance); + else + setDisguise(villagerInstance); + }); + EntityTracker.registerNPCEntity(this); + initializeRole(); + setTimeout(); + } + + private void setDisguise(LivingEntity livingEntity) { + if (npCsConfigFields.getDisguise() == null) return; + if (!Bukkit.getPluginManager().isPluginEnabled("LibsDisguises")) return; + try { + DisguiseEntity.disguise(npCsConfigFields.getDisguise(), livingEntity, npCsConfigFields.getCustomDisguiseData(), npCsConfigFields.getFilename()); + DisguiseEntity.setDisguiseNameVisibility(true, livingEntity, npCsConfigFields.getName()); + livingEntity.setCustomNameVisible(true); + isDisguised = true; + } catch (Exception ex) { + Logger.warn("Failed to load LibsDisguises disguise correctly!"); + ex.printStackTrace(); + } + } + + private void setCustomModel(LivingEntity livingEntity) { + CustomModel.generateCustomModel(livingEntity, getNPCsConfigFields().getCustomModel(), getNPCsConfigFields().getName()); + } + + public Villager getVillager() { + return villager; + } + + public boolean isValid() { + if (villager == null) return false; + return villager.isValid(); + } + + public NPCsConfigFields getNPCsConfigFields() { + return npCsConfigFields; + } + + public Location getSpawnLocation() { + return spawnLocation; + } + + public boolean setSpawnLocation() { + Location location = ConfigurationLocation.serialize(locationString); + if (location == null) return false; + this.spawnLocation = location; + return true; + } + + public boolean getIsTalking() { + return this.isTalking; + } + + @Override + public void chunkLoad() { + spawn(); + } + + @Override + public void chunkUnload() { + if (villager != null) + villager.remove(); + if (getNPCsConfigFields().getTimeout() > 0) return; + + if (villager != null) + villager.remove(); + } + + @Override + public void worldLoad(World world) { + setSpawnLocation(); + //queueSpawn(); + } + + @Override + public void worldUnload() { + spawnLocation.setWorld(null); + remove(RemovalReason.WORLD_UNLOAD); + } + + @Override + public Location getPersistentLocation() { + return getSpawnLocation(); + } + + @Override + public String getWorldName() { + if (getSpawnLocation() != null && getSpawnLocation().getWorld() != null) + return getSpawnLocation().getWorld().getName(); + String world = null; + if (locationString != null && !locationString.isEmpty()) + world = locationString.split(",")[0]; + return world; + } + + //Can't be used after the NPCEntity is done initialising + private void initializeRole() { + Vector offSet; + if (!isDisguised) + offSet = new Vector(0, 1.72, 0); + else + offSet = new Vector(0, 1.55, 0); + roleDisplay = this.villager.getWorld().spawn(villager.getLocation().add(offSet), ArmorStand.class, new Consumer() { + @Override + public void accept(ArmorStand armorStand) { + armorStand.setCustomName(ChatColorConverter.convert(npCsConfigFields.getRole())); + armorStand.setCustomNameVisible(true); + armorStand.setMarker(true); + armorStand.setVisible(false); + armorStand.setGravity(false); + armorStand.setPersistent(false); + } + }); + EntityTracker.registerVisualEffects(roleDisplay); + } + + /** + * Starts a cooldown for the talking state. Useful to avoid overlapping speech. + */ + public void startTalkingCooldown() { + this.isTalking = true; + new BukkitRunnable() { + @Override + public void run() { + isTalking = false; + } + }.runTaskLater(MetadataHandler.PLUGIN, 20 * 3L); + } + + public void setTimeout() { + if (npCsConfigFields.getTimeout() <= 0) return; + new BukkitRunnable() { + @Override + public void run() { + remove(RemovalReason.NPC_TIMEOUT); + } + }.runTaskLater(MetadataHandler.PLUGIN, (long) (npCsConfigFields.getTimeout() * 20 * 60)); + } + + /** + * Sends a greeting to a player from the list of greetings the NPCEntity has + * + * @param player Player to send the greeting to + */ + public void sayGreeting(Player player) { + new NPCChatBubble(selectString(npCsConfigFields.getGreetings()), this, player); + } + + /** + * Sends a dialog message to a player from the list of dialog messages the NPCEntity has + * + * @param player Player to send the dialog to + */ + public void sayDialog(Player player) { + new NPCChatBubble(selectString(npCsConfigFields.getDialog()), this, player); + } + + /** + * Sends a farewell message to a player from the list of farewell messages the NPCEntity has + * + * @param player + */ + public void sayFarewell(Player player) { + new NPCChatBubble(selectString(npCsConfigFields.getFarewell()), this, player); + } + + /** + * Selects a string from a list of strings + * + * @param strings List of string to select from + * @return Selected String + */ + private String selectString(List strings) { + if (strings != null && !strings.isEmpty()) + return strings.get(ThreadLocalRandom.current().nextInt(strings.size())); + return null; + } + + public static class NPCEntityEvents implements Listener { + @EventHandler + public void worldUnloadEvent(WorldUnloadEvent event) { + for (NPCEntity npcEntity : EntityTracker.getNpcEntities().values()) { + if (npcEntity.getSpawnLocation() != null && npcEntity.getSpawnLocation().getWorld() == event.getWorld()) { + npcEntity.worldUnload(); + } + } + } + } + + private class InstancedNPCContainer { + @Getter + private final Location location; + @Getter + private final NPCEntity npcEntity; + + public InstancedNPCContainer(Location location, NPCEntity npcEntity) { + this.location = location; + this.npcEntity = npcEntity; + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/npcs/NPCInteractions.java b/src/main/java/com/magmaguy/elitemobs/npcs/NPCInteractions.java new file mode 100644 index 000000000..e9723135c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/npcs/NPCInteractions.java @@ -0,0 +1,231 @@ +package com.magmaguy.elitemobs.npcs; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.adventurersguild.GuildRankMenuHandler; +import com.magmaguy.elitemobs.api.PlayerPreTeleportEvent; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.menus.*; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.quests.QuestInteractionHandler; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryOpenEvent; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.event.player.PlayerInteractAtEntityEvent; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.HashSet; + +public class NPCInteractions implements Listener { + + private static final HashSet cooldowns = new HashSet<>(); + + @EventHandler(priority = EventPriority.HIGHEST) + public void playerNPCInteract(PlayerInteractAtEntityEvent event) { + + if (cooldowns.contains(event.getPlayer())) return; + cooldowns.add(event.getPlayer()); + Bukkit.getScheduler().runTaskLater(MetadataHandler.PLUGIN, () -> cooldowns.remove(event.getPlayer()), 1); + if (event.isCancelled()) return; + + NPCEntity npcEntity = EntityTracker.getNPCEntity(event.getRightClicked()); + if (npcEntity == null) return; + if (event.getPlayer().getInventory().getItemInMainHand().getType().equals(Material.NAME_TAG)) { + event.setCancelled(true); + event.getPlayer().sendMessage("[EliteMobs] You can't rename NPCs using name tags!"); + return; + } + + event.setCancelled(true); + + switch (npcEntity.getNPCsConfigFields().getInteractionType()) { + case GUILD_GREETER: + if (event.getPlayer().hasPermission("elitemobs.rank.npc")) { + new BukkitRunnable() { + @Override + public void run() { + GuildRankMenuHandler.initializeGuildRankMenu(event.getPlayer()); + } + }.runTaskLater(MetadataHandler.PLUGIN, 1); + } + break; + case CHAT: + npcEntity.sayDialog(event.getPlayer()); + break; + case CUSTOM_SHOP: + if (event.getPlayer().hasPermission("elitemobs.shop.custom.npc")) + new BukkitRunnable() { + @Override + public void run() { + CustomShopMenu.customShopInitializer(event.getPlayer()); + } + }.runTaskLater(MetadataHandler.PLUGIN, 1); + + break; + case PROCEDURALLY_GENERATED_SHOP: + if (event.getPlayer().hasPermission("elitemobs.shop.dynamic.npc")) + new BukkitRunnable() { + @Override + public void run() { + ProceduralShopMenu.shopInitializer(event.getPlayer()); + } + }.runTaskLater(MetadataHandler.PLUGIN, 1); + break; + case QUEST_GIVER: + if (event.getPlayer().hasPermission("elitemobs.quest.npc")) + new BukkitRunnable() { + @Override + public void run() { + QuestInteractionHandler.processDynamicQuests(event.getPlayer(), npcEntity); + } + }.runTaskLater(MetadataHandler.PLUGIN, 1); + break; + case CUSTOM_QUEST_GIVER: + QuestInteractionHandler.processNPCQuests(event.getPlayer(), npcEntity); + break; + case BAR: + event.getPlayer().sendMessage("[EliteMobs] This feature is coming soon!"); + break; + case SELL: + if (event.getPlayer().hasPermission("elitemobs.shop.sell.npc")) + new BukkitRunnable() { + @Override + public void run() { + SellMenu sellMenu = new SellMenu(); + sellMenu.constructSellMenu(event.getPlayer()); + } + }.runTaskLater(MetadataHandler.PLUGIN, 1); + break; + case TELEPORT_BACK: + if (event.getPlayer().hasPermission("elitemobs.back.npc")) { + Location previousLocation = PlayerData.getBackTeleportLocation(event.getPlayer()); + if (previousLocation == null) { + if (npcEntity.npCsConfigFields.noPreviousLocationMessage != null) + event.getPlayer().sendMessage(ChatColorConverter.convert(npcEntity.npCsConfigFields.noPreviousLocationMessage)); + } else + PlayerPreTeleportEvent.teleportPlayer(event.getPlayer(), previousLocation); + } + break; + case SCRAPPER: + if (event.getPlayer().hasPermission("elitemobs.scrap.npc")) { + new BukkitRunnable() { + @Override + public void run() { + ScrapperMenu scrapperMenu = new ScrapperMenu(); + scrapperMenu.constructScrapMenu(event.getPlayer()); + } + }.runTaskLater(MetadataHandler.PLUGIN, 1); + } + break; + case REPAIRMAN: + if (event.getPlayer().hasPermission("elitemobs.repair.npc")) { + new BukkitRunnable() { + @Override + public void run() { + RepairMenu repairMenu = new RepairMenu(); + repairMenu.constructRepairMenu(event.getPlayer()); + } + }.runTaskLater(MetadataHandler.PLUGIN, 1); + } + break; + case UNBINDER: + if (event.getPlayer().hasPermission("elitemobs.unbind.npc")) { + new BukkitRunnable() { + @Override + public void run() { + UnbindMenu unbindMenu = new UnbindMenu(); + unbindMenu.constructUnbinderMenu(event.getPlayer()); + } + }.runTaskLater(MetadataHandler.PLUGIN, 1); + } + break; + case ARENA_MASTER: + new BukkitRunnable() { + @Override + public void run() { + ArenaMenu arenaMenu = new ArenaMenu(); + arenaMenu.constructArenaMenu(event.getPlayer(), npcEntity.getNPCsConfigFields().getArenaFilename()); + } + }.runTaskLater(MetadataHandler.PLUGIN, 1); + break; + case NONE: + default: + break; + case COMMAND: + if (npcEntity.getNPCsConfigFields().getCommand() == null) { + Logger.warn("Failed to run NPC command because none is configured for " + npcEntity.getNPCsConfigFields().getFilename()); + return; + } + new BukkitRunnable() { + @Override + public void run() { + event.getPlayer().performCommand(npcEntity.getNPCsConfigFields().getCommand()); + } + }.runTaskLater(MetadataHandler.PLUGIN, 1); + break; + case ENHANCER: + case REFINER: + case SMELTER: + event.getPlayer().sendMessage(ChatColorConverter.convert("&8[EliteMobs] &cThis feature has been replaced! This NPC should be removed by an admin as soon as possible.")); + if (event.getPlayer().isOp() || event.getPlayer().hasPermission("elitemobs.*")) { + event.getPlayer().sendMessage(ChatColorConverter.convert("&2To remove this NPC, use the command &6/em remove &2and hit the NPC!")); + } + break; + case ENCHANTER: + if (event.getPlayer().hasPermission("elitemobs.enchant.npc")) + new BukkitRunnable() { + @Override + public void run() { + new ItemEnchantmentMenu(event.getPlayer()); + } + }.runTaskLater(MetadataHandler.PLUGIN, 1); + break; + } + + } + + @EventHandler + public void onInventoryOpen(InventoryOpenEvent event) { + + if (!event.getInventory().getType().equals(InventoryType.MERCHANT)) return; + + for (NPCEntity npcEntity : EntityTracker.getNpcEntities().values()) + if (event.getView().getTitle().equals(npcEntity.getNPCsConfigFields().getName())) { + event.setCancelled(true); + return; + } + + } + + public enum NPCInteractionType { + GUILD_GREETER, + CHAT, + CUSTOM_SHOP, + PROCEDURALLY_GENERATED_SHOP, + BAR, + ARENA, + QUEST_GIVER, + CUSTOM_QUEST_GIVER, + NONE, + SELL, + TELEPORT_BACK, + SCRAPPER, + SMELTER, + REPAIRMAN, + ENHANCER, + REFINER, + UNBINDER, + ARENA_MASTER, + COMMAND, + ENCHANTER + } + + +} diff --git a/src/main/java/com/magmaguy/elitemobs/npcs/chatter/NPCChatBubble.java b/src/main/java/com/magmaguy/elitemobs/npcs/chatter/NPCChatBubble.java new file mode 100644 index 000000000..d0c13efa0 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/npcs/chatter/NPCChatBubble.java @@ -0,0 +1,67 @@ +package com.magmaguy.elitemobs.npcs.chatter; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.npcs.NPCEntity; +import com.magmaguy.elitemobs.utils.VisualDisplay; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.entity.TextDisplay; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class NPCChatBubble { + + public NPCChatBubble(String message, NPCEntity npcEntity, Player player) { + + if (!npcEntity.getNPCsConfigFields().isCanTalk()) return; + + if (message == null) return; + if (npcEntity.getVillager().hasPotionEffect(PotionEffectType.INVISIBILITY)) return; + if (npcEntity.getIsTalking()) return; + npcEntity.startTalkingCooldown(); + + int lineCounter = 0; + + for (String substring : message.split("\\\\n")) { + + Location newLocation = npcEntity.getVillager().getEyeLocation().clone() + .add(player.getLocation().clone().subtract(npcEntity.getVillager().getLocation()).toVector().normalize().multiply(0.5)) + .add(new Vector(0, -0.4 - (0.2 * lineCounter), 0)); + + TextDisplay visualArmorStand = VisualDisplay.generateTemporaryTextDisplay(newLocation, substring); + + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + if (counter > 20 * 5 || npcEntity.getVillager() == null || !npcEntity.getVillager().isValid() || !visualArmorStand.isValid()) { + visualArmorStand.remove(); + cancel(); + return; + } + visualArmorStand.teleport(visualArmorStand.getLocation().clone().add(new Vector(0, 0.005, 0))); + counter++; + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + + lineCounter++; + + } + + } + + public NPCChatBubble(List message, NPCEntity npcEntity, Player player) { + + String selectedMessage = message.get(ThreadLocalRandom.current().nextInt(message.size())); + + new NPCChatBubble(selectedMessage, npcEntity, player); + + } + + +} diff --git a/src/main/java/com/magmaguy/elitemobs/npcs/chatter/NPCProximitySensor.java b/src/main/java/com/magmaguy/elitemobs/npcs/chatter/NPCProximitySensor.java new file mode 100644 index 000000000..1389aa013 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/npcs/chatter/NPCProximitySensor.java @@ -0,0 +1,178 @@ +package com.magmaguy.elitemobs.npcs.chatter; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.internal.RemovalReason; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.npcs.NPCEntity; +import com.magmaguy.elitemobs.npcs.NPCInteractions; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.quests.CustomQuest; +import com.magmaguy.elitemobs.quests.DynamicQuest; +import com.magmaguy.elitemobs.quests.Quest; +import com.magmaguy.elitemobs.utils.VisualDisplay; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Location; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.entity.TextDisplay; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.HashSet; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; + +public class NPCProximitySensor implements Listener { + + private static final HashSet nearbyPlayers = new HashSet<>(); + + public NPCProximitySensor() { + new BukkitRunnable() { + + @Override + public void run() { + HashSet unseenPlayerList = (HashSet) nearbyPlayers.clone(); + for (NPCEntity npcEntity : EntityTracker.getNpcEntities().values()) { + if (!npcEntity.isValid()) continue; + for (Entity entity : npcEntity.getVillager().getNearbyEntities(npcEntity.getNPCsConfigFields().getActivationRadius(), + npcEntity.getNPCsConfigFields().getActivationRadius(), npcEntity.getNPCsConfigFields().getActivationRadius())) { + if (!entity.getType().equals(EntityType.PLAYER)) continue; + Player player = (Player) entity; + Location rotatedLocation = npcEntity.getVillager().getLocation().setDirection(entity.getLocation().subtract(npcEntity.getVillager().getLocation()).toVector()); + npcEntity.getVillager().teleport(rotatedLocation); + if (unseenPlayerList.contains(player)) { + if (!npcEntity.getNPCsConfigFields().getInteractionType().equals(NPCInteractions.NPCInteractionType.CHAT)) + npcEntity.sayDialog(player); + unseenPlayerList.remove(player); + } else { + npcEntity.sayGreeting(player); + nearbyPlayers.add(player); + startQuestIndicator(npcEntity, player); + } + } + } + + nearbyPlayers.removeIf(unseenPlayerList::contains); + + } + + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 20L * 5L); + + } + + private void startQuestIndicator(NPCEntity npcEntity, Player player) { + if (!npcEntity.getNPCsConfigFields().getInteractionType().equals(NPCInteractions.NPCInteractionType.QUEST_GIVER) && + !npcEntity.getNPCsConfigFields().getInteractionType().equals(NPCInteractions.NPCInteractionType.CUSTOM_QUEST_GIVER)) + return; + findQuestState(npcEntity, player); + + } + + private void findQuestState(NPCEntity npcEntity, Player player) { + //Case for NPCs needed for quests but who are not themselves quest givers + if (npcEntity.getNPCsConfigFields().getQuestFilenames() == null) return; + if (npcEntity.getNPCsConfigFields().getInteractionType().equals(NPCInteractions.NPCInteractionType.CUSTOM_QUEST_GIVER)) { + if (!PlayerData.getQuests(player.getUniqueId()).isEmpty()) { + for (String questString : npcEntity.getNPCsConfigFields().getQuestFilenames()) + for (Quest quest : PlayerData.getQuests(player.getUniqueId())) + if (quest instanceof CustomQuest && + questString.equals(((CustomQuest) quest).getCustomQuestsConfigFields().getFilename())) + if (!quest.isAccepted()) { + if (!((CustomQuest) quest).hasPermissionForQuest(player)) + return; + //Quest yet to be accepted + unacceptedQuestIndicator(npcEntity, player); + return; + } else if (!quest.getQuestObjectives().isOver()) { + //Quest has been accepted but not completed + acceptedQuestIndicator(npcEntity, player); + return; + } else { + //Quest has been completed + completedQuestIndicator(npcEntity, player); + return; + } + } + } else if (npcEntity.getNPCsConfigFields().getInteractionType().equals(NPCInteractions.NPCInteractionType.QUEST_GIVER)) { + for (Quest quest : PlayerData.getQuests(player.getUniqueId())) + if (quest instanceof DynamicQuest) + //Dynamic quest + if (!quest.isAccepted()) { + //Quest yet to be accepted + unacceptedQuestIndicator(npcEntity, player); + return; + } else if (!quest.getQuestObjectives().isOver()) { + //Quest has been accepted but not completed + acceptedQuestIndicator(npcEntity, player); + return; + } else { + //Quest has been completed + completedQuestIndicator(npcEntity, player); + return; + } + } + unacceptedQuestIndicator(npcEntity, player); + } + + private void unacceptedQuestIndicator(NPCEntity npcEntity, Player player) { + generateIndicator(npcEntity, player, ChatColor.YELLOW + "" + ChatColor.BOLD + "!", + ChatColor.GOLD + "" + ChatColor.BOLD + "!"); + } + + private void acceptedQuestIndicator(NPCEntity npcEntity, Player player) { + generateIndicator(npcEntity, player, ChatColor.GRAY + "" + ChatColor.BOLD + "?", + ChatColor.DARK_GRAY + "" + ChatColor.BOLD + "?"); + } + + private void completedQuestIndicator(NPCEntity npcEntity, Player player) { + generateIndicator(npcEntity, player, ChatColor.YELLOW + "" + ChatColor.BOLD + "?", + ChatColor.GOLD + "" + ChatColor.BOLD + "?"); + } + + private void generateIndicator(NPCEntity npcEntity, Player player, String messageUp, String messageDown) { + Location newLocation = npcEntity.getVillager().getEyeLocation().clone() + .add(player.getLocation().clone().subtract(npcEntity.getVillager().getLocation()).toVector().normalize().multiply(0.5)) + .add(new Vector(0, -0.1, 0)); + TextDisplay visualArmorStand = VisualDisplay.generateTemporaryTextDisplay(newLocation, messageUp); + AtomicInteger counter = new AtomicInteger(); + AtomicBoolean up = new AtomicBoolean(true); + Bukkit.getScheduler().runTaskTimer(MetadataHandler.PLUGIN, task -> { + if (!player.isValid() || + npcEntity.getVillager() == null || + !npcEntity.getVillager().isValid() || + !npcEntity.getVillager().getWorld().equals(player.getWorld()) || + npcEntity.getVillager().getLocation().distance(player.getLocation()) > npcEntity.getNPCsConfigFields().getActivationRadius()) { + task.cancel(); + EntityTracker.unregister(visualArmorStand, RemovalReason.EFFECT_TIMEOUT); + return; + } + + counter.getAndIncrement(); + + if (counter.get() % 20 == 0) { + up.getAndSet(!up.get()); + if (up.get()) + visualArmorStand.setCustomName(messageUp); + else + visualArmorStand.setCustomName(messageDown); + } + + visualArmorStand.teleport(visualArmorStand.getLocation().clone().add(new Vector(0, up.get() ? 0.01 : -0.01, 0))); + + }, 0L, 1L); + } + + @EventHandler + public void onInventoryClose(InventoryCloseEvent event) { + if (event.getView().getTitle().length() > 0) + for (Entity entity : event.getPlayer().getNearbyEntities(5, 5, 5)) + if (EntityTracker.isNPCEntity(entity)) + EntityTracker.getNPCEntity(entity).sayFarewell((Player) event.getPlayer()); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/ondeathcommands/OnDeathCommands.java b/src/main/java/com/magmaguy/elitemobs/ondeathcommands/OnDeathCommands.java new file mode 100644 index 000000000..2623443a3 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/ondeathcommands/OnDeathCommands.java @@ -0,0 +1,143 @@ +package com.magmaguy.elitemobs.ondeathcommands; + +import com.magmaguy.elitemobs.api.EliteMobDeathEvent; +import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; + +public class OnDeathCommands implements Listener { + + public static void parseConsoleCommand(List configStrings, EliteMobDeathEvent event) { + Player topDamager = null; + Player secondDamager = null; + Player thirdDamager = null; + HashMap sortedMap = sortByComparator(event.getEliteEntity().getDamagers(), false); + Iterator sortedMapIterator = sortedMap.keySet().iterator(); + for (int i = 1; i < 4; i++) { + if (i > sortedMap.size()) + break; + Player nextPlayer = sortedMapIterator.next(); + switch (i) { + case 1: + topDamager = nextPlayer; + break; + case 2: + secondDamager = nextPlayer; + break; + case 3: + thirdDamager = nextPlayer; + break; + } + } + for (String string : configStrings) { + double chance = 1; + string = parseCommonCommandStrings(string, event.getEliteEntity()); + if (string.contains("$damager1name")) { + if (topDamager != null) + string = string.replace("$damager1name", topDamager.getName()); + else + string = ""; + } + if (string.contains("$damager2name")) { + if (secondDamager != null) + string = string.replace("$damager2name", secondDamager.getName()); + else + string = ""; + } + if (string.contains("$damager3name")) { + if (thirdDamager != null) + string = string.replace("$damager3name", thirdDamager.getName()); + else + string = ""; + } + RunChance runChance = new RunChance(string); + string = runChance.getString(); + chance = runChance.getChance(); + if (string.contains("$players")) { + if (event.getEliteEntity().hasDamagers()) + for (Player player : event.getEliteEntity().getDamagers().keySet()) + if (chance == 1 || ThreadLocalRandom.current().nextDouble() < chance) + runConsoleCommand(string.replace("$players", player.getName())); + } else if (chance == 1 || ThreadLocalRandom.current().nextDouble() < chance) runConsoleCommand(string); + } + } + + public static String parseCommonCommandStrings(String string, EliteEntity eliteEntity) { + if (string.contains("$level")) + string = string.replace("$level", eliteEntity.getLevel() + ""); + if (string.contains("$name")) + string = string.replace("$name", eliteEntity.getName()); + if (eliteEntity.getLocation() != null) { + if (string.contains("$locationWorldName") && eliteEntity.getLocation() != null) + string = string.replace("$locationWorldName", Objects.requireNonNull(eliteEntity.getLocation().getWorld()).getName()); + if (string.contains("$locationX")) + string = string.replace("$locationX", eliteEntity.getLocation().getX() + ""); + if (string.contains("$locationY")) + string = string.replace("$locationY", eliteEntity.getLocation().getY() + ""); + if (string.contains("$locationZ")) + string = string.replace("$locationZ", eliteEntity.getLocation().getZ() + ""); + } + return string; + } + + private static HashMap sortByComparator(Map unsortMap, final boolean order) { + + List> list = new LinkedList<>(unsortMap.entrySet()); + + // Sorting the list based on values + list.sort((o1, o2) -> { + if (order) + return o1.getValue().compareTo(o2.getValue()); + else + return o2.getValue().compareTo(o1.getValue()); + }); + + // Maintaining insertion order with the help of LinkedList + HashMap sortedMap = new LinkedHashMap<>(); + for (Map.Entry entry : list) + sortedMap.put(entry.getKey(), entry.getValue()); + + return sortedMap; + } + + private static void runConsoleCommand(String command) { + Bukkit.dispatchCommand(Bukkit.getServer().getConsoleSender(), command); + } + + @EventHandler + public void onEliteMobDeath(EliteMobDeathEvent event) { + if (MobCombatSettingsConfig.getCommandsOnDeath().isEmpty()) return; + parseConsoleCommand(MobCombatSettingsConfig.getCommandsOnDeath(), event); + } + + public static class RunChance { + @Getter + private double chance = 1; + @Getter + private String string; + + public RunChance(String commandString) { + this.string = commandString; + if (string.contains("$chance=")) { + try { + String chanceString = string.split("\\$chance=")[1]; + chanceString = chanceString.split("\\$")[0]; + chance = Double.parseDouble(chanceString); + String fullString = "$chance=" + chanceString + "$"; + string = string.replace(fullString, ""); + } catch (Exception ex) { + Logger.warn("Failed to get the chance value of the command " + string + " . The correct format should be $chance=X.Y$", true); + } + } + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/pathfinding/Navigation.java b/src/main/java/com/magmaguy/elitemobs/pathfinding/Navigation.java new file mode 100644 index 000000000..f9599c613 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/pathfinding/Navigation.java @@ -0,0 +1,125 @@ +package com.magmaguy.elitemobs.pathfinding; + +import com.magmaguy.easyminecraftgoals.NMSManager; +import com.magmaguy.easyminecraftgoals.events.WanderBackToPointEndEvent; +import com.magmaguy.easyminecraftgoals.events.WanderBackToPointStartEvent; +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.RegionalBossEntity; +import org.bukkit.Location; +import org.bukkit.attribute.Attribute; +import org.bukkit.entity.Creature; +import org.bukkit.entity.EntityType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; + +import java.util.HashMap; + +public class Navigation implements Listener { + + private static final HashMap currentlyNavigating = new HashMap(); + + public static void addSoftLeashAI(RegionalBossEntity regionalBossEntity) { + if (NMSManager.getAdapter() == null) return; + if (regionalBossEntity.getUnsyncedLivingEntity() != null && + regionalBossEntity.getUnsyncedLivingEntity().getType() == EntityType.ENDER_DRAGON) return; + if (regionalBossEntity.getLivingEntity() instanceof Creature) + NMSManager.getAdapter().wanderBackToPoint( + regionalBossEntity.getLivingEntity(), + regionalBossEntity.getSpawnLocation(), + regionalBossEntity.getLeashRadius() / 2D, + 20 * 5) + .setSpeed(1.2f) + .setStopReturnDistance(1) + .setGoalRefreshCooldownTicks(20 * 3) + .setHardObjective(false) + .setTeleportOnFail(true) + .setStartWithCooldown(true) + .register(); + } + + public static void addHardLeashAI(RegionalBossEntity regionalBossEntity) { + if (NMSManager.getAdapter() == null) return; + if (regionalBossEntity.getUnsyncedLivingEntity() != null && + regionalBossEntity.getUnsyncedLivingEntity().getType() == EntityType.ENDER_DRAGON) return; + NMSManager.getAdapter().wanderBackToPoint( + regionalBossEntity.getLivingEntity(), + regionalBossEntity.getSpawnLocation(), + regionalBossEntity.getLeashRadius(), + 20 * 5) + .setSpeed(2f) + .setStopReturnDistance(0) + .setGoalRefreshCooldownTicks(20 * 3) + .setHardObjective(true) + .setTeleportOnFail(true) + .setStartWithCooldown(true) + .register(); + } + + public static void shutdown() { + currentlyNavigating.values().forEach(BukkitTask::cancel); + currentlyNavigating.clear(); + } + + public static void navigateTo(CustomBossEntity customBossEntity, Double speed, Location destination, boolean force, int duration) { + if (duration == 0) duration = 20 * 5; + if (customBossEntity.getLivingEntity() == null) return; + if (destination == null || destination.getWorld() == null) return; + if (speed == null) + speed = customBossEntity.getLivingEntity().getAttribute(Attribute.GENERIC_MOVEMENT_SPEED).getValue(); + Double finalSpeed = speed; + if (currentlyNavigating.get(customBossEntity) != null) currentlyNavigating.get(customBossEntity).cancel(); + int finalDuration = duration; + currentlyNavigating.put(customBossEntity, new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + if (counter >= finalDuration || + !customBossEntity.exists() || + customBossEntity.getLivingEntity().getLocation().distanceSquared(destination) < Math.pow(1, 2)) { + if (counter >= finalDuration && force) { + customBossEntity.getLivingEntity().teleport(destination); + } + cancel(); + currentlyNavigating.remove(customBossEntity); + return; + } + NMSManager.getAdapter().move(customBossEntity.getLivingEntity(), finalSpeed.floatValue(), destination); + counter++; + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1)); + } + + @EventHandler(ignoreCancelled = true) + public void makeReturningBossesInvulnerable(WanderBackToPointStartEvent event) { + if (!event.isHardObjective()) return; + if (event.getLivingEntity() == null) return; + if (event.getLivingEntity().getType() == EntityType.ENDER_DRAGON) return; + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(event.getLivingEntity()); + if (!(eliteEntity instanceof RegionalBossEntity regionalBossEntity)) return; + event.getLivingEntity().setInvulnerable(true); + event.getLivingEntity().getAttribute(Attribute.GENERIC_FOLLOW_RANGE).setBaseValue(regionalBossEntity.getCustomBossesConfigFields().getLeashRadius() * 1.5); + } + + @EventHandler(ignoreCancelled = true) + public void makeReturnedBossesVulnerable(WanderBackToPointEndEvent event) { + if (!event.isHardObjective()) return; + if (event.getLivingEntity() == null) return; + if (event.getLivingEntity().getType() == EntityType.ENDER_DRAGON) return; + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(event.getLivingEntity()); + if (eliteEntity == null || eliteEntity.getLivingEntity() == null) return; + if (!(eliteEntity instanceof RegionalBossEntity regionalBossEntity)) return; + event.getLivingEntity().setInvulnerable(false); + + if (regionalBossEntity.getCustomBossesConfigFields().getFollowDistance() != 0) + eliteEntity.getLivingEntity().getAttribute(Attribute.GENERIC_FOLLOW_RANGE).setBaseValue(regionalBossEntity.getCustomBossesConfigFields().getFollowDistance()); + else + eliteEntity.getLivingEntity().getAttribute(Attribute.GENERIC_FOLLOW_RANGE).setBaseValue(eliteEntity.getLivingEntity().getAttribute(Attribute.GENERIC_FOLLOW_RANGE).getDefaultValue()); + regionalBossEntity.fullHeal(); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/playerdata/ElitePlayerInventory.java b/src/main/java/com/magmaguy/elitemobs/playerdata/ElitePlayerInventory.java new file mode 100644 index 000000000..033f5c980 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/playerdata/ElitePlayerInventory.java @@ -0,0 +1,275 @@ +package com.magmaguy.elitemobs.playerdata; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.items.MobTierCalculator; +import com.magmaguy.elitemobs.items.potioneffects.ElitePotionEffect; +import org.bukkit.Bukkit; +import org.bukkit.GameMode; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +import java.util.*; + +public class ElitePlayerInventory { + + public static HashMap playerInventories = new HashMap<>(); + public final PlayerItem helmet, chestplate, leggings, boots, mainhand, offhand; + private final Player player; + //Used by elite scripts + private final HashSet customMetadata = new HashSet<>(); + private boolean isUpdateLock = false; + + /** + * Object of the player's inventory for EliteMobs. + * For performance reasons, values are cached and updated only when strictly necessary. + * Stores already parsed logic for weapon and armor tiers, as well as potion effects associated to weapons. + * + * @param player Inventory th + */ + public ElitePlayerInventory(Player player) { + this.player = player; + this.helmet = new PlayerItem(player.getInventory().getHelmet(), PlayerItem.EquipmentSlot.HELMET, player); + this.chestplate = new PlayerItem(player.getInventory().getChestplate(), PlayerItem.EquipmentSlot.CHESTPLATE, player); + this.leggings = new PlayerItem(player.getInventory().getLeggings(), PlayerItem.EquipmentSlot.LEGGINGS, player); + this.boots = new PlayerItem(player.getInventory().getBoots(), PlayerItem.EquipmentSlot.BOOTS, player); + this.mainhand = new PlayerItem(player.getInventory().getItemInMainHand(), PlayerItem.EquipmentSlot.MAINHAND, player); + this.offhand = new PlayerItem(player.getInventory().getItemInOffHand(), PlayerItem.EquipmentSlot.OFFHAND, player); + playerInventories.put(player.getUniqueId(), this); + } + + public static ElitePlayerInventory getPlayer(Player player) { + return playerInventories.get(player.getUniqueId()); + } + + public static void initialize() { + for (Player player : Bukkit.getOnlinePlayers()) + playerInventories.put(player.getUniqueId(), new ElitePlayerInventory(player)); + } + + public double getEliteDamage(boolean update) { + if (isUpdateLock) update = false; + double eliteDamage = helmet.getEliteDamage(player.getInventory().getHelmet(), update) + + chestplate.getEliteDamage(player.getInventory().getChestplate(), update) + + leggings.getEliteDamage(player.getInventory().getLeggings(), update) + + boots.getEliteDamage(player.getInventory().getBoots(), update) + + mainhand.getEliteDamage(player.getInventory().getItemInMainHand(), update) + + offhand.getEliteDamage(player.getInventory().getItemInOffHand(), update); + updateLock(); + return eliteDamage; + } + + public double getEliteDefense(boolean update) { + if (isUpdateLock) update = false; + double defense = helmet.getEliteDefense(player.getInventory().getHelmet(), update) + + chestplate.getEliteDefense(player.getInventory().getChestplate(), update) + + leggings.getEliteDefense(player.getInventory().getLeggings(), update) + + boots.getEliteDefense(player.getInventory().getBoots(), update) + + mainhand.getEliteDefense(player.getInventory().getItemInMainHand(), update) + + offhand.getEliteDefense(player.getInventory().getItemInOffHand(), update); + updateLock(); + return defense; + } + + public double getEliteProjectileProtection(boolean update) { + if (isUpdateLock) update = false; + + double eliteProjectileProtection = (helmet.getProtectionProjectile(player.getInventory().getHelmet(), update) + + chestplate.getProtectionProjectile(player.getInventory().getChestplate(), update) + + leggings.getProtectionProjectile(player.getInventory().getLeggings(), update) + + boots.getProtectionProjectile(player.getInventory().getBoots(), update) + + mainhand.getProtectionProjectile(player.getInventory().getItemInMainHand(), update) + + offhand.getProtectionProjectile(player.getInventory().getItemInOffHand(), update)) + / 6d; + updateLock(); + return eliteProjectileProtection; + } + + public double getEliteBlastProtection(boolean update) { + if (isUpdateLock) update = false; + double eliteBlastProtection = (helmet.getBlastProtection(player.getInventory().getHelmet(), update) + + chestplate.getBlastProtection(player.getInventory().getChestplate(), update) + + leggings.getBlastProtection(player.getInventory().getLeggings(), update) + + boots.getBlastProtection(player.getInventory().getBoots(), update) + + mainhand.getBlastProtection(player.getInventory().getItemInMainHand(), update) + + offhand.getBlastProtection(player.getInventory().getItemInOffHand(), update)) + / 6d; + updateLock(); + return eliteBlastProtection; + } + + private boolean updateLock() { + isUpdateLock = true; + Bukkit.getScheduler().runTaskLater(MetadataHandler.PLUGIN, () -> isUpdateLock = false, 1); + return true; + } + + /** + * Tier of the weapon in the main hand. + * + * @return Tier of the weapon in the main hand. + */ + public int getWeaponLevel(boolean update) { + if (isUpdateLock) update = false; + int weaponLevel = mainhand.getTier(player.getInventory().getItemInMainHand(), update); + updateLock(); + return weaponLevel; + } + + public int getFullPlayerTier(boolean update) { + if (isUpdateLock) update = false; + int fullPlayerTier = (int) ((helmet.getTier(player.getInventory().getHelmet(), update) + + chestplate.getTier(player.getInventory().getChestplate(), update) + + leggings.getTier(player.getInventory().getLeggings(), update) + + boots.getTier(player.getInventory().getBoots(), update) + + mainhand.getTier(player.getInventory().getItemInMainHand(), update)) + / 5D); + updateLock(); + return fullPlayerTier; + } + + public int getNaturalMobSpawnLevel(boolean update) { + if (isUpdateLock) update = false; + if (player.getGameMode().equals(GameMode.SPECTATOR)) return 0; + int naturalMobSpawnLevel = (int) ((helmet.getTier(player.getInventory().getHelmet(), update) + + chestplate.getTier(player.getInventory().getChestplate(), update) + + leggings.getTier(player.getInventory().getLeggings(), update) + + boots.getTier(player.getInventory().getBoots(), update) + + mainhand.getTier(player.getInventory().getItemInMainHand(), update)) + / 5D * MobTierCalculator.PER_TIER_LEVEL_INCREASE); + updateLock(); + return naturalMobSpawnLevel; + } + + /** + * Returns a list of all continuous potion effects in armor/weapons, may contain duplicate effects. + * + * @return ArrayList of all continuous potion effects. + */ + public ArrayList getContinuousPotionEffects(boolean update) { + if (isUpdateLock) update = false; + ArrayList elitePotionEffects = new ArrayList<>(); + elitePotionEffects.addAll(helmet.getContinuousPotionEffects(player.getInventory().getHelmet(), update)); + elitePotionEffects.addAll(chestplate.getContinuousPotionEffects(player.getInventory().getChestplate(), update)); + elitePotionEffects.addAll(leggings.getContinuousPotionEffects(player.getInventory().getLeggings(), update)); + elitePotionEffects.addAll(boots.getContinuousPotionEffects(player.getInventory().getBoots(), update)); + elitePotionEffects.addAll(mainhand.getContinuousPotionEffects(player.getInventory().getItemInMainHand(), update)); + elitePotionEffects.addAll(offhand.getContinuousPotionEffects(player.getInventory().getItemInOffHand(), update)); + updateLock(); + return elitePotionEffects; + } + + /** + * Returns a list of all on hit potion effects in armor/weapons, may contain duplicates. + * + * @return ArrayList of all onHit potion effects. + */ + public ArrayList getOnHitPotionEffects(boolean update) { + if (isUpdateLock) update = false; + ArrayList elitePotionEffects = new ArrayList<>(); + elitePotionEffects.addAll(helmet.getOnHitPotionEffects(player.getInventory().getHelmet(), update)); + elitePotionEffects.addAll(chestplate.getOnHitPotionEffects(player.getInventory().getChestplate(), update)); + elitePotionEffects.addAll(leggings.getOnHitPotionEffects(player.getInventory().getLeggings(), update)); + elitePotionEffects.addAll(boots.getOnHitPotionEffects(player.getInventory().getBoots(), update)); + elitePotionEffects.addAll(mainhand.getOnHitPotionEffects(player.getInventory().getItemInMainHand(), update)); + elitePotionEffects.addAll(offhand.getOnHitPotionEffects(player.getInventory().getItemInOffHand(), update)); + updateLock(); + return elitePotionEffects; + } + + public double getCritChance(boolean update) { + if (isUpdateLock) update = false; + double critChance = mainhand.getCritChance(player.getInventory().getItemInMainHand(), update); + updateLock(); + return critChance; + } + + public double getLightningChance(boolean update) { + if (isUpdateLock) update = false; + double lightningChance = mainhand.getLightningChance(player.getInventory().getItemInMainHand(), update); + updateLock(); + return lightningChance; + } + + public double getHunterChance(boolean update) { + if (isUpdateLock) update = false; + double hunterChance = helmet.getHunterChance(player.getInventory().getHelmet(), update) + + chestplate.getHunterChance(player.getInventory().getChestplate(), update) + + leggings.getHunterChance(player.getInventory().getLeggings(), update) + + boots.getHunterChance(player.getInventory().getBoots(), update); + updateLock(); + return hunterChance; + } + + public double getPlasmaBootsLevel(boolean update) { + if (isUpdateLock) update = false; + double plasmaBootsLevel = boots.getPlasmaBootsLevel(player.getInventory().getBoots(), update); + updateLock(); + return plasmaBootsLevel; + } + + public double getEarthquakeLevel(boolean update) { + //todo: should earthquake really apply for things other than the boots? + if (isUpdateLock) update = false; + double earthquakeLevel = helmet.getEarthquakeLevel(player.getInventory().getHelmet(), update) + + chestplate.getEarthquakeLevel(player.getInventory().getChestplate(), update) + + leggings.getEarthquakeLevel(player.getInventory().getLeggings(), update) + + boots.getEarthquakeLevel(player.getInventory().getBoots(), update); + updateLock(); + return earthquakeLevel; + } + + /** + * Outputs the base damage of the player given the current gear. Does not take secondary enchantments into account, + * such as Smite + * + * @return Base damage value + */ + public double baseDamage() { + if (getWeaponLevel(true) == 0) + return 1; + return getWeaponLevel(false); + } + + public double getLoudStrikesBonusMultiplier(boolean update) { + if (isUpdateLock) update = false; + double loudStrikesBonusMultiplier = helmet.getLoudStrikesBonus(player.getInventory().getHelmet(), update) + + chestplate.getLoudStrikesBonus(player.getInventory().getChestplate(), update) + + leggings.getLoudStrikesBonus(player.getInventory().getLeggings(), update) + + boots.getLoudStrikesBonus(player.getInventory().getBoots(), update) + + mainhand.getLoudStrikesBonus(player.getInventory().getItemInMainHand(), update) + + offhand.getLoudStrikesBonus(player.getInventory().getItemInOffHand(), update); + updateLock(); + return loudStrikesBonusMultiplier; + } + + public boolean hasTag(String string) { + return customMetadata.contains(string); + } + + public HashSet getTags() { + return customMetadata; + } + + public void addTags(List string) { + customMetadata.addAll(string); + } + + public void removeTags(List string) { + customMetadata.removeAll(string); + } + + public static class ElitePlayerInventoryEvents implements Listener { + @EventHandler + public void onPlayerLogin(PlayerLoginEvent event) { + playerInventories.put(event.getPlayer().getUniqueId(), new ElitePlayerInventory(event.getPlayer())); + } + + @EventHandler + public void onPlayerLogout(PlayerQuitEvent event) { + playerInventories.remove(event.getPlayer().getUniqueId()); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/playerdata/PlayerData.java b/src/main/java/com/magmaguy/elitemobs/playerdata/PlayerData.java deleted file mode 100644 index aa966dc26..000000000 --- a/src/main/java/com/magmaguy/elitemobs/playerdata/PlayerData.java +++ /dev/null @@ -1,181 +0,0 @@ -package com.magmaguy.elitemobs.playerdata; - -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.*; -import org.bukkit.scheduler.BukkitRunnable; - -import java.util.HashMap; -import java.util.UUID; - -public class PlayerData { - - public static HashMap playerDisplayName = new HashMap<>(); - public static HashMap playerCurrency = new HashMap<>(); - public static HashMap playerMaxGuildRank = new HashMap<>(); - public static HashMap playerSelectedGuildRank = new HashMap<>(); - - public static void initializePlayerData() { - - initializeDisplayName(); - initializeCurrency(); - initializeSelectedGuildRank(); - initializeMaxGuildRank(); - - } - - public static void clearPlayerData() { - - playerDisplayName.clear(); - playerCurrency.clear(); - playerMaxGuildRank.clear(); - playerSelectedGuildRank.clear(); - - } - - public static int databaseSyncTaskID = 0; - public static boolean playerCacheChanged = false; - public static boolean playerCurrencyChanged = false; - public static boolean playerSelectedGuildRankChanged = false; - public static boolean playerMaxGuildRankChanged = false; - - public static void synchronizeDatabases() { - - databaseSyncTaskID = new BukkitRunnable() { - - @Override - public void run() { - - saveDatabases(); - - } - - }.runTaskTimerAsynchronously(MetadataHandler.PLUGIN, 20 * 60, 20 * 60).getTaskId(); - - } - - public static void saveDatabases() { - - if (playerCacheChanged) - saveDisplayName(); - if (playerCurrencyChanged) - saveCurrency(); - if (playerSelectedGuildRankChanged) - saveSelectedGuildRank(); - if (playerMaxGuildRankChanged) - saveMaxGuildRank(); - - } - - private static void initializeDisplayName() { - - PlayerCacheData playerCacheData = new PlayerCacheData(); - - for (String string : playerCacheData.configuration.getKeys(true)) { - - playerDisplayName.put(UUID.fromString(string), ConfigValues.playerCacheConfig.getString(string)); - - } - - } - - private static void saveDisplayName() { - - PlayerCacheData playerCacheData = new PlayerCacheData(); - - for (UUID uuid : playerDisplayName.keySet()) { - - playerCacheData.configuration.set(uuid.toString(), playerDisplayName.get(uuid)); - - } - - playerCacheData.customConfigLoader.saveCustomConfig(PlayerCacheData.CONFIG_NAME, true); - - playerCacheChanged = false; - - } - - private static void initializeCurrency() { - - PlayerMoneyData playerMoneyData = new PlayerMoneyData(); - - for (String string : playerMoneyData.configuration.getKeys(true)) { - - playerCurrency.put(UUID.fromString(string), ConfigValues.playerMoneyData.getDouble(string)); - - } - - } - - private static void saveCurrency() { - - PlayerMoneyData playerMoneyData = new PlayerMoneyData(); - - for (UUID uuid : playerCurrency.keySet()) { - - playerMoneyData.configuration.set(uuid.toString(), playerCurrency.get(uuid)); - - } - - playerMoneyData.customConfigLoader.saveCustomConfig(PlayerMoneyData.CONFIG_NAME, true); - - playerCurrencyChanged = false; - - } - - private static void initializeMaxGuildRank() { - - PlayerMaxGuildRank playerMaxGuildRankClass = new PlayerMaxGuildRank(); - - for (String string : playerMaxGuildRankClass.configuration.getKeys(true)){ - - playerMaxGuildRank.put(UUID.fromString(string), playerMaxGuildRankClass.configuration.getInt(string)); - - } - - } - - private static void saveMaxGuildRank() { - - PlayerMaxGuildRank playerMaxGuildRankClass = new PlayerMaxGuildRank(); - - for (UUID uuid : playerMaxGuildRank.keySet()) { - - playerMaxGuildRankClass.configuration.set(uuid.toString(), playerMaxGuildRank.get(uuid)); - - } - - playerMaxGuildRankClass.customConfigLoader.saveCustomConfig(PlayerMaxGuildRank.CONFIG_NAME, true); - - playerMaxGuildRankChanged = false; - - } - - private static void initializeSelectedGuildRank() { - - PlayerGuildRank playerGuildRankClass = new PlayerGuildRank(); - - for (String string : playerGuildRankClass.configuration.getKeys(true)){ - - playerSelectedGuildRank.put(UUID.fromString(string), playerGuildRankClass.configuration.getInt(string)); - - } - - } - - private static void saveSelectedGuildRank() { - - PlayerGuildRank playerGuildRankClass = new PlayerGuildRank(); - - for (UUID uuid : playerSelectedGuildRank.keySet()) { - - playerGuildRankClass.configuration.set(uuid.toString(), playerSelectedGuildRank.get(uuid)); - - } - - playerGuildRankClass.customConfigLoader.saveCustomConfig(PlayerGuildRank.CONFIG_NAME, true); - - playerSelectedGuildRankChanged = false; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/playerdata/PlayerItem.java b/src/main/java/com/magmaguy/elitemobs/playerdata/PlayerItem.java new file mode 100644 index 000000000..dfcd53f2b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/playerdata/PlayerItem.java @@ -0,0 +1,255 @@ +package com.magmaguy.elitemobs.playerdata; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.utils.EliteItemManager; +import com.magmaguy.elitemobs.config.ItemSettingsConfig; +import com.magmaguy.elitemobs.config.enchantments.EnchantmentsConfig; +import com.magmaguy.elitemobs.instanced.dungeons.DungeonInstance; +import com.magmaguy.elitemobs.items.ItemTagger; +import com.magmaguy.elitemobs.items.customenchantments.*; +import com.magmaguy.elitemobs.items.potioneffects.ElitePotionEffect; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.utils.BossBarUtil; +import com.magmaguy.magmacore.util.ChatColorConverter; +import org.bukkit.Material; +import org.bukkit.NamespacedKey; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; + +import java.util.ArrayList; + +public class PlayerItem { + + public EquipmentSlot equipmentSlot; + public Player player; + public ItemStack itemStack = null; + public int itemTier = 0; + public ArrayList continuousPotionEffects = new ArrayList<>(); + public ArrayList onHitPotionEffects = new ArrayList<>(); + public int damageArthropodsLevel = 0; + public int damageUndeadLevel = 0; + public int thornsLevel = 0; + private double plasmaBootsLevel = 0; + private double critChance = 0; + private double hunterChance = 0; + private double lightningChance = 0; + private double earthquakeLevel = 0; + private double eliteDamageReduction = 0; + private double protectionProjectile = 0; + private double eliteDamage = 0; + private double blastProtection = 0; + private double loudStrikesBonus = 0; + + private boolean displayingAsBroken = false; + + /** + * Stores an instance of the custom EliteMobs values of what a player is wearing. This is used to reduce the amount + * of checks done by EliteMobs during combat and for passive potion effect applications. It should (largely) only update + * when necessary. + * + * @param itemStack ItemStack in the equipment slot. Does not update. + * @param equipmentSlot Player's equipment slot. This is used to quickly access weapons and armor for the combat system. Updates when the ItemStack changes. + * @param player Player associated to the gear. Does not update. + */ + public PlayerItem(ItemStack itemStack, EquipmentSlot equipmentSlot, Player player) { + this.equipmentSlot = equipmentSlot; //equipment slot never updates + this.player = player; + fullUpdate(itemStack); + } + + private boolean isOnLastDamage(ItemStack itemStack) { + if (!itemStack.hasItemMeta()) return false; + if (!ItemTagger.isEliteItem(itemStack)) return false; + if (!(itemStack.getItemMeta() instanceof Damageable)) return false; + if (itemStack.getType().getMaxDurability() == 0) return false; + return ((Damageable) itemStack.getItemMeta()).getDamage() + 1 >= itemStack.getType().getMaxDurability(); + } + + private boolean fullUpdate(ItemStack itemStack) { + + //case when both are null + if (itemStack == null && this.itemStack == null) + return false; + + //case when it became null + if (itemStack == null) + return fillNullItem(); + + if (isOnLastDamage(itemStack)) { + if (!displayingAsBroken) { + BossBarUtil.DisplayBrokenItemBossBar(equipmentSlot, player, ChatColorConverter.convert(ItemSettingsConfig.getNoItemDurabilityMessage().replace("$item", !itemStack.getItemMeta().hasDisplayName() ? itemStack.getType().toString() : itemStack.getItemMeta().getDisplayName()))); + displayingAsBroken = true; + } +// player.sendMessage(ChatColorConverter.convert(ItemSettingsConfig.getNoItemDurabilityMessage().replace( +// "$item", !itemStack.getItemMeta().hasDisplayName() ? itemStack.getType().toString() : itemStack.getItemMeta().getDisplayName()))); + return fillNullItem(); + } + + if (displayingAsBroken) { + BossBarUtil.HideBrokenItemBossBar(equipmentSlot, player); + displayingAsBroken = false; + } + +// //case when it's the same item as before - best performance todo: causes issues with the prestige system +// if (itemStack.isSimilar(this.itemStack)) +// return false; + + if (EnchantmentsConfig.getEnchantment(SoulbindEnchantment.key + ".yml").isEnabled()) { + if (!SoulbindEnchantment.isValidSoulbindUser(itemStack.getItemMeta(), player)) { + player.getWorld().dropItem(player.getLocation(), itemStack); + itemStack.setAmount(0); + itemStack = new ItemStack(Material.AIR); + } + } + + //Neither offhand nor armor contribute to baseline damage outside of the enchants, so we reset the damage before anything + this.eliteDamage = 0; + + //case when the item changed during runtime to another valid ItemStack + this.itemStack = itemStack; + if (equipmentSlot.equals(EquipmentSlot.MAINHAND)) { + this.itemTier = (int) Math.round(EliteItemManager.getWeaponLevel(itemStack)); + this.eliteDamage = EliteItemManager.getEliteDamageFromEliteAttributes(itemStack); + } else + this.itemTier = (int) Math.round(EliteItemManager.getArmorLevel(itemStack)); + + //Level sync for instanced dungeons - limits the max level of the item + if (PlayerData.getMatchInstance(player) != null && + PlayerData.getMatchInstance(player) instanceof DungeonInstance dungeonInstance && + dungeonInstance.getLevelSync() > 0) { + if (itemTier > dungeonInstance.getLevelSync()) { + itemTier = dungeonInstance.getLevelSync(); + if (equipmentSlot.equals(EquipmentSlot.MAINHAND)) + this.eliteDamage = EliteItemManager.calculateEliteBonus(itemStack, itemTier); + } + } + + this.continuousPotionEffects = ItemTagger.getPotionEffects(itemStack.getItemMeta(), ItemTagger.continuousPotionEffectKey); + this.onHitPotionEffects = ItemTagger.getPotionEffects(itemStack.getItemMeta(), ItemTagger.onHitPotionEffectKey); + + //Enchantments are global, any inventory slot will add to the total of any enchantment + this.eliteDamageReduction = EliteItemManager.getEliteDefense(itemStack) + EliteItemManager.getBonusEliteDefense(itemStack); + this.protectionProjectile = ItemTagger.getEnchantment(itemStack.getItemMeta(), Enchantment.PROJECTILE_PROTECTION.getKey()); + this.blastProtection = ItemTagger.getEnchantment(itemStack.getItemMeta(), Enchantment.BLAST_PROTECTION.getKey()); + this.damageArthropodsLevel = ItemTagger.getEnchantment(itemStack.getItemMeta(), Enchantment.BANE_OF_ARTHROPODS.getKey()); + this.damageUndeadLevel = ItemTagger.getEnchantment(itemStack.getItemMeta(), Enchantment.SMITE.getKey()); + this.critChance = ItemTagger.getEnchantment(itemStack.getItemMeta(), new NamespacedKey(MetadataHandler.PLUGIN, CriticalStrikesEnchantment.key)) / 10D; + this.lightningChance = Math.pow(ItemTagger.getEnchantment(itemStack.getItemMeta(), new NamespacedKey(MetadataHandler.PLUGIN, LightningEnchantment.key)), 2) / 1000D; + this.plasmaBootsLevel = ItemTagger.getEnchantment(itemStack.getItemMeta(), new NamespacedKey(MetadataHandler.PLUGIN, PlasmaBootsEnchantment.key)); + this.hunterChance = ItemTagger.getEnchantment(itemStack.getItemMeta(), new NamespacedKey(MetadataHandler.PLUGIN, HunterEnchantment.key)) * EnchantmentsConfig.getEnchantment("hunter.yml").getFileConfiguration().getDouble("hunterSpawnBonus"); + this.earthquakeLevel = ItemTagger.getEnchantment(itemStack.getItemMeta(), new NamespacedKey(MetadataHandler.PLUGIN, EarthquakeEnchantment.key)); + this.thornsLevel = ItemTagger.getEnchantment(itemStack.getItemMeta(), Enchantment.THORNS.getKey()); + this.loudStrikesBonus = ItemTagger.getEnchantment(itemStack.getItemMeta(), new NamespacedKey(MetadataHandler.PLUGIN, LoudStrikesEnchantment.key)) / 3d; + eliteDamage += EliteItemManager.getEliteDamageFromEnchantments(itemStack); + + return true; + + } + + private boolean fillNullItem() { + itemStack = null; + continuousPotionEffects = new ArrayList<>(); + onHitPotionEffects = new ArrayList<>(); + damageArthropodsLevel = 0; + damageUndeadLevel = 0; + thornsLevel = 0; + plasmaBootsLevel = 0; + critChance = 0; + hunterChance = 0; + lightningChance = 0; + earthquakeLevel = 0; + eliteDamageReduction = 0; + protectionProjectile = 0; + eliteDamage = 0; + blastProtection = 0; + loudStrikesBonus = 0; + return true; + } + + public int getTier(ItemStack itemStack, boolean update) { + if (update) fullUpdate(itemStack); + return this.itemTier; + } + + public double getEliteDamage(ItemStack itemStack, boolean update) { + if (update) fullUpdate(itemStack); + return this.eliteDamage; + } + + public double getEliteDefense(ItemStack itemStack, boolean update) { + if (update) fullUpdate(itemStack); + return this.eliteDamageReduction; + } + + public double getProtectionProjectile(ItemStack itemStack, boolean update) { + if (update) fullUpdate(itemStack); + return this.protectionProjectile; + } + + public double getBlastProtection(ItemStack itemStack, boolean update) { + if (update) fullUpdate(itemStack); + return this.blastProtection; + } + + public ArrayList getContinuousPotionEffects(ItemStack itemStack, boolean update) { + if (update) fullUpdate(itemStack); + return this.continuousPotionEffects; + } + + public ArrayList getOnHitPotionEffects(ItemStack itemStack, boolean update) { + if (update) fullUpdate(itemStack); + return this.onHitPotionEffects; + } + + public int getDamageArthropodsLevel(ItemStack itemStack, boolean update) { + if (update) fullUpdate(itemStack); + return this.damageArthropodsLevel; + } + + public int getDamageUndeadLevel(ItemStack itemStack, boolean update) { + if (update) fullUpdate(itemStack); + return this.damageUndeadLevel; + } + + public double getCritChance(ItemStack itemStack, boolean update) { + if (update) fullUpdate(itemStack); + return this.critChance; + } + + public double getHunterChance(ItemStack itemStack, boolean update) { + if (update) fullUpdate(itemStack); + return this.hunterChance; + } + + public double getLightningChance(ItemStack itemStack, boolean update) { + if (update) fullUpdate(itemStack); + return this.lightningChance; + } + + public double getPlasmaBootsLevel(ItemStack itemStack, boolean update) { + if (update) fullUpdate(itemStack); + return this.plasmaBootsLevel; + } + + public double getEarthquakeLevel(ItemStack itemStack, boolean update) { + if (update) fullUpdate(itemStack); + return this.earthquakeLevel; + } + + public double getLoudStrikesBonus(ItemStack itemStack, boolean update) { + if (update) fullUpdate(itemStack); + return this.loudStrikesBonus; + } + + public enum EquipmentSlot { + HELMET, + CHESTPLATE, + LEGGINGS, + BOOTS, + MAINHAND, + OFFHAND + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/playerdata/PlayerStatsTracker.java b/src/main/java/com/magmaguy/elitemobs/playerdata/PlayerStatsTracker.java new file mode 100644 index 000000000..58db5a158 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/playerdata/PlayerStatsTracker.java @@ -0,0 +1,29 @@ +package com.magmaguy.elitemobs.playerdata; + +import com.magmaguy.elitemobs.api.EliteMobDeathEvent; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class PlayerStatsTracker implements Listener { + + public static void registerPlayerDeath(Player player) { + PlayerData.incrementDeaths(player.getUniqueId()); + PlayerData.decrementScore(player.getUniqueId()); + } + + @EventHandler + public void onEliteDeath(EliteMobDeathEvent event) { + if (event.getEliteEntity().isTriggeredAntiExploit()) return; + if (event.getEliteEntity().getDamagers().isEmpty()) return; + //todo : optimize + for (Player player : event.getEliteEntity().getDamagers().keySet()) { + if (player.hasMetadata("NPC")) continue; + if (!PlayerData.isInMemory(player.getUniqueId())) continue; + PlayerData.incrementKills(player.getUniqueId()); + PlayerData.setHighestLevelKilled(player.getUniqueId(), event.getEliteEntity().getLevel()); + PlayerData.incrementScore(player.getUniqueId(), event.getEliteEntity().getLevel()); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/playerdata/database/GenerateDatabase.java b/src/main/java/com/magmaguy/elitemobs/playerdata/database/GenerateDatabase.java new file mode 100644 index 000000000..eecd9e4ba --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/playerdata/database/GenerateDatabase.java @@ -0,0 +1,92 @@ +package com.magmaguy.elitemobs.playerdata.database; + +import com.magmaguy.magmacore.util.Logger; + +import java.sql.DatabaseMetaData; +import java.sql.ResultSet; +import java.sql.Statement; + +public class GenerateDatabase { + private GenerateDatabase() { + } + + public static void generate() throws Exception { + Statement statement = PlayerData.getConnection().createStatement(); + // Create table with all columns defined + String sql = "CREATE TABLE IF NOT EXISTS " + PlayerData.getPLAYER_DATA_TABLE_NAME() + " (" + + "PlayerUUID VARCHAR(36) PRIMARY KEY NOT NULL, " + + "DisplayName TEXT, " + + "Currency DOUBLE, " + + "GuildPrestigeLevel INT, " + + "GuildMaxLevel INT, " + + "GuildActiveLevel INT, " + + "QuestStatus BLOB, " + + "Score INT, " + + "Kills INT, " + + "HighestLevelKilled INT, " + + "Deaths INT, " + + "QuestsCompleted INT, " + + "PlayerQuestCooldowns BLOB, " + + "BackTeleportLocation TEXT, " + + "UseBookMenus TINYINT(1), " + + "DismissEMStatusScreenMessage TINYINT(1)" + + ");"; + statement.executeUpdate(sql); + statement.close(); + + // Check and add missing columns if any + addEntryIfEmpty("DisplayName", ColumnValues.TEXT); + addEntryIfEmpty("Currency", ColumnValues.REAL); + addEntryIfEmpty("GuildPrestigeLevel", ColumnValues.INT); + addEntryIfEmpty("GuildMaxLevel", ColumnValues.INT); + addEntryIfEmpty("GuildActiveLevel", ColumnValues.INT); + addEntryIfEmpty("QuestStatus", ColumnValues.BLOB); + addEntryIfEmpty("Score", ColumnValues.INT); + addEntryIfEmpty("Kills", ColumnValues.INT); + addEntryIfEmpty("HighestLevelKilled", ColumnValues.INT); + addEntryIfEmpty("Deaths", ColumnValues.INT); + addEntryIfEmpty("QuestsCompleted", ColumnValues.INT); + addEntryIfEmpty("PlayerQuestCooldowns", ColumnValues.BLOB); + addEntryIfEmpty("BackTeleportLocation", ColumnValues.TEXT); + addEntryIfEmpty("UseBookMenus", ColumnValues.BOOLEAN); + addEntryIfEmpty("DismissEMStatusScreenMessage", ColumnValues.BOOLEAN); + } + + private static void addEntryIfEmpty(String columnName, ColumnValues columnValues) { + try { + DatabaseMetaData metaData = PlayerData.getConnection().getMetaData(); + ResultSet resultSet = metaData.getColumns(null, null, PlayerData.getPLAYER_DATA_TABLE_NAME(), columnName); + if (resultSet.next()) { + //Logger.message("Database already had " + columnName); + } else { + Logger.info("Adding new database column " + columnName); + addColumn(columnName, columnValues); + } + resultSet.close(); + } catch (Exception ex) { + Logger.warn("Could not process column " + columnName); + ex.printStackTrace(); + } + } + + private static void addColumn(String columnName, ColumnValues type) { + try { + Statement statement = PlayerData.getConnection().createStatement(); + String sql = "ALTER TABLE " + PlayerData.getPLAYER_DATA_TABLE_NAME() + " ADD " + columnName + " " + type.toString(); + statement.executeUpdate(sql); + statement.close(); + } catch (Exception ex) { + Logger.warn("Failed to insert new column " + columnName); + ex.printStackTrace(); + } + } + + private enum ColumnValues { + BLOB, + INT, + TEXT, + REAL, + BOOLEAN + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/playerdata/database/PlayerData.java b/src/main/java/com/magmaguy/elitemobs/playerdata/database/PlayerData.java new file mode 100644 index 000000000..5686ed26a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/playerdata/database/PlayerData.java @@ -0,0 +1,726 @@ +package com.magmaguy.elitemobs.playerdata.database; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.DatabaseConfig; +import com.magmaguy.elitemobs.instanced.MatchInstance; +import com.magmaguy.elitemobs.quests.CustomQuest; +import com.magmaguy.elitemobs.quests.Quest; +import com.magmaguy.elitemobs.quests.playercooldowns.PlayerQuestCooldowns; +import com.magmaguy.elitemobs.utils.ConfigurationLocation; +import com.magmaguy.elitemobs.utils.ObjectSerializer; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.permissions.PermissionAttachment; +import org.bukkit.scheduler.BukkitRunnable; + +import javax.annotation.Nullable; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.sql.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.UUID; + +public class PlayerData { + + @Getter + private static final String DATABASE_NAME = "player_data.db"; + @Getter + private static final String PLAYER_DATA_TABLE_NAME = "PlayerData"; + @Getter + private static final HashMap playerDataHashMap = new HashMap<>(); + private static Connection connection = null; + @Getter + @Setter + private double currency; + @Getter + @Setter + private int guildPrestigeLevel; + @Getter + @Setter + private int maxGuildLevel; + @Getter + @Setter + private int activeGuildLevel; + @Getter + @Setter + private int score; + @Getter + @Setter + private int kills; + @Getter + @Setter + private int highestLevelKilled; + @Getter + @Setter + private int deaths; + @Getter + @Setter + private int questsCompleted; + @Getter + @Setter + private List quests = new ArrayList<>(); + @Getter + @Setter + private PlayerQuestCooldowns playerQuestCooldowns = null; + @Getter + @Setter + private Location backTeleportLocation; + @Getter + @Setter + private boolean useBookMenus; + @Getter + @Setter + private boolean dismissEMStatusScreenMessage; + @Getter + @Setter + private MatchInstance matchInstance = null; + + public PlayerData(UUID uuid) { + Player player = Bukkit.getPlayer(uuid); + if (player == null) { + Logger.warn("EliteMobs did not initialize player data for uuid " + uuid + " because Minecraft does not recognize this as a valid player!"); + return; + } + PermissionAttachment permissionAttachment = player.addAttachment(MetadataHandler.PLUGIN); + permissionAttachment.setPermission("elitequest.*", false); + new BukkitRunnable() { + @Override + public void run() { + Statement statement = null; + try { + statement = getConnection().createStatement(); + ResultSet resultSet = statement.executeQuery("SELECT * FROM " + PLAYER_DATA_TABLE_NAME + " WHERE PlayerUUID = '" + uuid + "';"); + if (resultSet.next()) { + readExistingData(statement, uuid, resultSet); + } else { + writeNewData(statement, uuid); + } + resultSet.close(); + statement.close(); + } catch (Exception e) { + if (statement != null) { + try { + statement.close(); + } catch (SQLException throwables) { + Logger.warn("Failed to close statement after failing player data creation!"); + throwables.printStackTrace(); + } + } + Logger.warn("Something went wrong while generating a new player entry. This is bad! Tell the dev."); + Logger.warn(e.getClass().getName() + ": " + e.getMessage()); + } + } + }.runTaskAsynchronously(MetadataHandler.PLUGIN); + } + + public static PlayerData getPlayerData(UUID player) { + return playerDataHashMap.get(player); + } + + public static void updateQuestStatus(UUID uuid) { + List playerQuests = getQuests(uuid); + try { + setDatabaseValue(uuid, "QuestStatus", ObjectSerializer.toString((ArrayList) playerQuests)); + if (playerDataHashMap.containsKey(uuid)) + playerDataHashMap.get(uuid).quests = playerQuests; + } catch (Exception ex) { + Logger.warn("Failed to serialize player quest data!"); + ex.printStackTrace(); + } + } + + public static void clearPlayerData(UUID uuid) { + playerDataHashMap.remove(uuid); + } + + public static boolean isInMemory(Player player) { + return playerDataHashMap.containsKey(player.getUniqueId()); + } + + public static boolean isInMemory(UUID uuid) { + return playerDataHashMap.containsKey(uuid); + } + + public static String getDisplayName(UUID uuid) { + if (!isInMemory(uuid)) + return getDatabaseString(uuid, "DisplayName"); + return Bukkit.getPlayer(uuid).getCustomName(); + } + + public static void setDisplayName(UUID uuid, String displayName) { + setDatabaseValue(uuid, "DisplayName", displayName); + } + + public static double getCurrency(UUID uuid) { + if (!isInMemory(uuid)) + return getDatabaseDouble(uuid, "Currency"); + return playerDataHashMap.get(uuid).currency; + } + + public static double getCurrency(UUID uuid, boolean databaseAccess) { + if (!isInMemory(uuid)) + if (databaseAccess) + return getDatabaseDouble(uuid, "Currency"); + else + return 0; + return playerDataHashMap.get(uuid).currency; + } + + public static void setCurrency(UUID uuid, double currency) { + setDatabaseValue(uuid, "Currency", currency); + if (playerDataHashMap.containsKey(uuid)) + playerDataHashMap.get(uuid).currency = currency; + } + + public static int getGuildPrestigeLevel(UUID uuid) { + if (!isInMemory(uuid)) + return getDatabaseInteger(uuid, "GuildPrestigeLevel"); + return playerDataHashMap.get(uuid).guildPrestigeLevel; + } + + public static int getGuildPrestigeLevel(UUID uuid, boolean databaseAccess) { + if (!isInMemory(uuid)) + if (databaseAccess) + return getDatabaseInteger(uuid, "GuildPrestigeLevel"); + else + return 0; + return playerDataHashMap.get(uuid).guildPrestigeLevel; + } + + public static void setGuildPrestigeLevel(UUID uuid, int newPrestigeLevel) { + setDatabaseValue(uuid, "GuildPrestigeLevel", newPrestigeLevel); + if (playerDataHashMap.containsKey(uuid)) + playerDataHashMap.get(uuid).guildPrestigeLevel = newPrestigeLevel; + } + + public static int getMaxGuildLevel(UUID uuid) { + if (!isInMemory(uuid)) + return getDatabaseInteger(uuid, "GuildMaxLevel"); + return playerDataHashMap.get(uuid).maxGuildLevel; + } + + public static int getMaxGuildLevel(UUID uuid, boolean databaseAccess) { + if (!isInMemory(uuid)) + if (databaseAccess) + return getDatabaseInteger(uuid, "GuildMaxLevel"); + else + return 0; + return playerDataHashMap.get(uuid).maxGuildLevel; + } + + public static void setMaxGuildLevel(UUID uuid, int maxGuildLevel) { + setDatabaseValue(uuid, "GuildMaxLevel", maxGuildLevel); + if (playerDataHashMap.containsKey(uuid)) + playerDataHashMap.get(uuid).maxGuildLevel = maxGuildLevel; + } + + public static int getActiveGuildLevel(UUID uuid) { + if (!isInMemory(uuid)) + return getDatabaseInteger(uuid, "GuildActiveLevel"); + return playerDataHashMap.get(uuid).activeGuildLevel; + } + + public static int getActiveGuildLevel(UUID uuid, boolean databaseAccess) { + if (!isInMemory(uuid)) + if (databaseAccess) + return getDatabaseInteger(uuid, "GuildActiveLevel"); + else + return 0; + return playerDataHashMap.get(uuid).activeGuildLevel; + } + + public static void setActiveGuildLevel(UUID uuid, int activeGuildLevel) { + setDatabaseValue(uuid, "GuildActiveLevel", activeGuildLevel); + if (playerDataHashMap.containsKey(uuid)) + playerDataHashMap.get(uuid).activeGuildLevel = activeGuildLevel; + } + + public static List getQuests(UUID uuid) { + try { + if (!isInMemory(uuid)) + return (List) ObjectSerializer.fromString((String) getDatabaseBlob(uuid, "QuestStatus")); + if (playerDataHashMap.get(uuid) == null) return new ArrayList<>(); + return playerDataHashMap.get(uuid).quests == null ? new ArrayList<>() : playerDataHashMap.get(uuid).quests; + } catch (Exception ex) { + return new ArrayList<>(); + } + } + + public static Quest getQuest(UUID uuid, String questID) { + try { + UUID questUUID = UUID.fromString(questID); + return getQuest(uuid, questUUID); + } catch (Exception ex) { + Logger.warn("Failed to convert quest ID from command into a valid UUID format!"); + return null; + } + } + + public static Quest getQuest(UUID uuid, UUID questUUID) { + List questList = null; + try { + if (!isInMemory(uuid)) + questList = (List) ObjectSerializer.fromString((String) getDatabaseBlob(uuid, "QuestStatus")); + else + questList = playerDataHashMap.get(uuid).quests; + } catch (Exception ex) { + return null; + } + for (Quest iteratedQuest : questList) + if (iteratedQuest.getQuestID().equals(questUUID)) + return iteratedQuest; + return null; + } + + public static void resetQuests(UUID uuid) { + getQuests(uuid).clear(); + updateQuestStatus(uuid); + } + + public static void removeQuest(UUID uuid, Quest quest) { + if (quest == null) return; + playerDataHashMap.get(uuid).quests.removeIf(iteratedQuest -> iteratedQuest.getQuestID().equals(quest.getQuestID())); + updateQuestStatus(uuid); + } + + public static void addQuest(UUID uuid, Quest quest) { + playerDataHashMap.get(uuid).quests.add(quest); + updateQuestStatus(uuid); + } + + public static void updateQuestStatus(UUID uuid, Quest quest) { + updateQuestStatus(uuid); + } + + @Nullable + public static PlayerQuestCooldowns getPlayerQuestCooldowns(UUID uuid) { + try { + if (!isInMemory(uuid)) + return (PlayerQuestCooldowns) ObjectSerializer.fromString((String) getDatabaseBlob(uuid, "PlayerQuestCooldowns")); + if (playerDataHashMap.get(uuid) == null) return PlayerQuestCooldowns.initializePlayer(); + return playerDataHashMap.get(uuid).playerQuestCooldowns == null ? PlayerQuestCooldowns.initializePlayer() : playerDataHashMap.get(uuid).playerQuestCooldowns; + } catch (Exception ex) { + return null; + } + } + + public static void resetPlayerQuestCooldowns(UUID uuid) { + updatePlayerQuestCooldowns(uuid, PlayerQuestCooldowns.initializePlayer()); + } + + public static void updatePlayerQuestCooldowns(UUID uuid, PlayerQuestCooldowns playerQuestCooldowns) { + try { + setDatabaseValue(uuid, "PlayerQuestCooldowns", ObjectSerializer.toString(playerQuestCooldowns)); + } catch (Exception ex) { + Logger.warn("Failed to register player quest cooldowns!"); + ex.printStackTrace(); + } + } + + public static void setDatabaseValue(UUID uuid, String key, Object value) { + new BukkitRunnable() { + @Override + public void run() { + Statement statement = null; + try { + statement = getConnection().createStatement(); + String sql; + if (value instanceof String) { + sql = "UPDATE " + PLAYER_DATA_TABLE_NAME + " SET " + key + " = '" + value + "' WHERE PlayerUUID = '" + uuid.toString() + "';"; + } else if (value instanceof Boolean) { + sql = "UPDATE " + PLAYER_DATA_TABLE_NAME + " SET " + key + " = " + (((Boolean) value) ? 1 : 0) + " WHERE PlayerUUID = '" + uuid.toString() + "';"; + } else { + sql = "UPDATE " + PLAYER_DATA_TABLE_NAME + " SET " + key + " = " + value + " WHERE PlayerUUID = '" + uuid.toString() + "';"; + } + statement.executeUpdate(sql); + statement.close(); + } catch (Exception e) { + Logger.warn("Failed to update database value."); + e.printStackTrace(); + } + } + }.runTaskAsynchronously(MetadataHandler.PLUGIN); + } + + private static Object getDatabaseBlob(UUID uuid, String value) { + try { + Statement statement = getConnection().createStatement(); + ResultSet resultSet = statement.executeQuery("SELECT * FROM " + PLAYER_DATA_TABLE_NAME + " WHERE PlayerUUID = '" + uuid.toString() + "';"); + byte[] bytes = resultSet.getBytes(value); + resultSet.close(); + statement.close(); + if (bytes == null) return null; + return new String(bytes); + } catch (Exception e) { + Logger.warn("Failed to get blob value from database!"); + Logger.warn("UUID: " + uuid + " | Value: " + value); + e.printStackTrace(); + return null; + } + } + + public static int getScore(UUID uuid) { + if (!isInMemory(uuid)) + return getDatabaseInteger(uuid, "Score"); + return playerDataHashMap.get(uuid).score; + } + + public static void incrementScore(UUID uuid, int levelToIncrement) { + setDatabaseValue(uuid, "Score", getScore(uuid) + levelToIncrement * 2); + if (playerDataHashMap.containsKey(uuid)) + playerDataHashMap.get(uuid).score += (levelToIncrement * 2); + } + + public static void decrementScore(UUID uuid) { + setDatabaseValue(uuid, "Score", getScore(uuid) - 100); + if (playerDataHashMap.containsKey(uuid)) + playerDataHashMap.get(uuid).score -= 100; + } + + public static int getKills(UUID uuid) { + if (!isInMemory(uuid)) + return getDatabaseInteger(uuid, "Kills"); + return playerDataHashMap.get(uuid).kills; + } + + public static void incrementKills(UUID uuid) { + setDatabaseValue(uuid, "Kills", getKills(uuid) + 1); + if (playerDataHashMap.containsKey(uuid)) + playerDataHashMap.get(uuid).kills += 1; + } + + public static int getHighestLevelKilled(UUID uuid) { + if (!isInMemory(uuid)) + return getDatabaseInteger(uuid, "HighestLevelKilled"); + return playerDataHashMap.get(uuid).highestLevelKilled; + } + + public static void setHighestLevelKilled(UUID uuid, int tentativeNewLevel) { + if (tentativeNewLevel < getHighestLevelKilled(uuid)) return; + setDatabaseValue(uuid, "HighestLevelKilled", tentativeNewLevel); + if (playerDataHashMap.containsKey(uuid)) + playerDataHashMap.get(uuid).highestLevelKilled = tentativeNewLevel; + } + + public static int getDeaths(UUID uuid) { + if (!isInMemory(uuid)) + return getDatabaseInteger(uuid, "Deaths"); + return playerDataHashMap.get(uuid).deaths; + } + + public static void incrementDeaths(UUID uuid) { + setDatabaseValue(uuid, "Deaths", getDeaths(uuid) + 1); + if (playerDataHashMap.containsKey(uuid)) + playerDataHashMap.get(uuid).deaths += 1; + } + + public static int getQuestsCompleted(UUID uuid) { + if (!isInMemory(uuid)) + return getDatabaseInteger(uuid, "QuestsCompleted"); + return playerDataHashMap.get(uuid).questsCompleted; + } + + public static void incrementQuestsCompleted(UUID uuid) { + setDatabaseValue(uuid, "QuestsCompleted", getQuestsCompleted(uuid) + 1); + if (playerDataHashMap.containsKey(uuid)) + playerDataHashMap.get(uuid).questsCompleted += 1; + } + + public static Location getBackTeleportLocation(Player player) { + if (!isInMemory(player.getUniqueId())) + return ConfigurationLocation.serialize(getDatabaseString(player.getUniqueId(), "BackTeleportLocation")); + return playerDataHashMap.get(player.getUniqueId()).backTeleportLocation; + } + + public static void setBackTeleportLocation(Player player, Location location) { + setDatabaseValue(player.getUniqueId(), "BackTeleportLocation", ConfigurationLocation.deserialize(location)); + playerDataHashMap.get(player.getUniqueId()).backTeleportLocation = location; + } + + public static boolean getUseBookMenus(UUID uuid) { + if (!isInMemory(uuid)) + return getDatabaseBoolean(uuid, "UseBookMenus"); + return playerDataHashMap.get(uuid).useBookMenus; + } + + public static void setUseBookMenus(Player player, boolean use) { + setDatabaseValue(player.getUniqueId(), "UseBookMenus", use); + playerDataHashMap.get(player.getUniqueId()).useBookMenus = use; + } + + public static boolean getDismissEMStatusScreenMessage(UUID uuid) { + if (!isInMemory(uuid)) + return getDatabaseBoolean(uuid, "DismissEMStatusScreenMessage"); + return playerDataHashMap.get(uuid).dismissEMStatusScreenMessage; + } + + public static void setDismissEMStatusScreenMessage(Player player, boolean use) { + setDatabaseValue(player.getUniqueId(), "DismissEMStatusScreenMessage", use); + playerDataHashMap.get(player.getUniqueId()).dismissEMStatusScreenMessage = use; + } + + public static MatchInstance getMatchInstance(Player player) { + if (player == null || playerDataHashMap.get(player.getUniqueId()) == null) return null; + return playerDataHashMap.get(player.getUniqueId()).matchInstance; + } + + public static void setMatchInstance(Player player, MatchInstance newMatchInstance) { + if (playerDataHashMap.get(player.getUniqueId()) != null) + playerDataHashMap.get(player.getUniqueId()).matchInstance = newMatchInstance; + } + + private static Boolean getDatabaseBoolean(UUID uuid, String value) { + try { + Statement statement = getConnection().createStatement(); + ResultSet resultSet = statement.executeQuery("SELECT * FROM " + PLAYER_DATA_TABLE_NAME + " WHERE PlayerUUID = '" + uuid.toString() + "';"); + boolean reply = resultSet.getBoolean(value); + resultSet.close(); + statement.close(); + return reply; + } catch (Exception e) { + Logger.warn("Failed to get boolean value from database!"); + e.printStackTrace(); + return null; + } + } + + private static String getDatabaseString(UUID uuid, String value) { + try { + Statement statement = getConnection().createStatement(); + ResultSet resultSet = statement.executeQuery("SELECT * FROM " + PLAYER_DATA_TABLE_NAME + " WHERE PlayerUUID = '" + uuid.toString() + "';"); + String reply = resultSet.getString(value); + resultSet.close(); + statement.close(); + return reply; + } catch (Exception e) { + Logger.warn("Failed to get string value from database!"); + e.printStackTrace(); + return null; + } + } + + private static Double getDatabaseDouble(UUID uuid, String value) { + try { + Statement statement = getConnection().createStatement(); + ResultSet resultSet = statement.executeQuery("SELECT * FROM " + PLAYER_DATA_TABLE_NAME + " WHERE PlayerUUID = '" + uuid.toString() + "';"); + double reply = resultSet.getDouble(value); + resultSet.close(); + statement.close(); + return reply; + } catch (Exception e) { + Logger.warn("Failed to get double value from database!"); + e.printStackTrace(); + return null; + } + } + + private static Integer getDatabaseInteger(UUID uuid, String value) { + try { + Statement statement = getConnection().createStatement(); + ResultSet resultSet = statement.executeQuery("SELECT * FROM " + PLAYER_DATA_TABLE_NAME + " WHERE PlayerUUID = '" + uuid.toString() + "';"); + int reply = resultSet.getInt(value); + resultSet.close(); + statement.close(); + return reply; + } catch (Exception e) { + Logger.warn("Failed to get integer value from database!"); + e.printStackTrace(); + return null; + } + } + + public static Connection getConnection() throws Exception { + File dataFolder = new File(MetadataHandler.PLUGIN.getDataFolder(), "data/" + DATABASE_NAME); + if (connection == null || connection.isClosed()) { + if (!DatabaseConfig.isUseMySQL()) { + Class.forName("org.sqlite.JDBC"); + connection = DriverManager.getConnection("jdbc:sqlite:" + dataFolder); + connection.setAutoCommit(true); + } else { + Class.forName("com.mysql.jdbc.Driver"); + String URL = "jdbc:mysql://" + DatabaseConfig.getMysqlHost() + ":" + + DatabaseConfig.getMysqlPort() + "/" + DatabaseConfig.mysqlDatabaseName + + "?useSSL=" + DatabaseConfig.useSSL + + "&createDatabaseIfNotExist=true"; + String USER = DatabaseConfig.getMysqlUsername(); + String PASS = DatabaseConfig.getMysqlPassword(); + connection = DriverManager.getConnection(URL, USER, PASS); + connection.setAutoCommit(true); + } + } + return connection; + } + + public static void initializeDatabaseConnection() { + new File(MetadataHandler.PLUGIN.getDataFolder().getPath() + "/data").mkdirs(); + try { + Logger.info("Opened database successfully"); + GenerateDatabase.generate(); + for (Player player : Bukkit.getOnlinePlayers()) + new PlayerData(player.getUniqueId()); + } catch (Exception e) { + Logger.warn(e.getClass().getName() + ": " + e.getMessage()); + Logger.warn("Failed to establish a connection to the SQLite database. Player data will not be saved! Is your MySQL configuration valid and is your MySQL server running?"); + e.printStackTrace(); + } + + new PortOldData(); + } + + public static void closeConnection() { + try { + if (connection == null) return; + connection.close(); + } catch (Exception ex) { + Logger.warn("Could not correctly close database connection."); + } + } + + private void readExistingData(Statement statement, UUID uuid, ResultSet resultSet) throws Exception { + playerDataHashMap.put(uuid, this); + currency = resultSet.getDouble("Currency"); + guildPrestigeLevel = resultSet.getInt("GuildPrestigeLevel"); + maxGuildLevel = resultSet.getInt("GuildMaxLevel"); + activeGuildLevel = resultSet.getInt("GuildActiveLevel"); + score = resultSet.getInt("Score"); + kills = resultSet.getInt("Kills"); + highestLevelKilled = resultSet.getInt("HighestLevelKilled"); + deaths = resultSet.getInt("Deaths"); + questsCompleted = resultSet.getInt("QuestsCompleted"); + backTeleportLocation = ConfigurationLocation.serialize(resultSet.getString("BackTeleportLocation")); + + if (resultSet.getBytes("QuestStatus") != null) { + try { + quests = (List) ObjectSerializer.fromString(new String(resultSet.getBytes("QuestStatus"), StandardCharsets.UTF_8)); + //Serializes ItemStack which require specific handling, necessary recovering the rewards + for (Quest quest : quests) + if (quest instanceof CustomQuest) + ((CustomQuest) quest).applyTemporaryPermissions(Bukkit.getPlayer(uuid)); + } catch (Exception ex) { + Logger.warn("Failed to serialize quest data for player " + Bukkit.getPlayer(uuid) + " ! This player's quest data will be wiped to prevent future errors."); + try { + resetQuests(uuid); + } catch (Exception ex2) { + Logger.warn("Failed to reset quest data! Ironic."); + ex2.printStackTrace(); + } + } + } + + if (resultSet.getBytes("PlayerQuestCooldowns") != null) { + try { + playerQuestCooldowns = (PlayerQuestCooldowns) ObjectSerializer.fromString(new String(resultSet.getBytes("PlayerQuestCooldowns"), StandardCharsets.UTF_8)); + playerQuestCooldowns.startCooldowns(uuid); + } catch (Exception exception) { + Logger.warn("Failed to get player quest cooldowns! ! This player's quest cooldowns will be wiped to prevent future errors."); + try { + resetPlayerQuestCooldowns(uuid); + } catch (Exception ex2) { + Logger.warn("Failed to reset quest cooldowns! Ironic."); + ex2.printStackTrace(); + } + } + } + + if (resultSet.getObject("UseBookMenus") != null) { + useBookMenus = resultSet.getBoolean("UseBookMenus"); + } else { + setUseBookMenus(Bukkit.getPlayer(uuid), true); + } + + if (resultSet.getObject("DismissEMStatusScreenMessage") != null) { + dismissEMStatusScreenMessage = resultSet.getBoolean("DismissEMStatusScreenMessage"); + } else { + setDismissEMStatusScreenMessage(Bukkit.getPlayer(uuid), false); + } + + Logger.info("User " + uuid + " data successfully read!"); + } + + private void writeNewData(Statement statement, UUID uuid) throws Exception { + playerDataHashMap.put(uuid, this); + currency = 0; + guildPrestigeLevel = 0; + maxGuildLevel = 1; + activeGuildLevel = 1; + score = 0; + kills = 0; + highestLevelKilled = 0; + deaths = 0; + questsCompleted = 0; + statement = getConnection().createStatement(); + String sql = "INSERT INTO " + PLAYER_DATA_TABLE_NAME + " (" + + "PlayerUUID," + + " DisplayName," + + " Currency," + + " GuildPrestigeLevel," + + " GuildMaxLevel," + + " GuildActiveLevel," + + " Score," + + " Kills," + + " HighestLevelKilled," + + " Deaths," + + " QuestsCompleted) " + + //identifier + "VALUES ('" + uuid + "'," + + //display name + " '" + Bukkit.getPlayer(uuid).getName() + "'," + + //currency + " 0," + + //guild_prestige_level + " 0," + + //guild_max_level + " 1," + + //guild_active_level + " 1," + + //score + "0," + + //kills + "0," + + //highestLevelKilled + "0," + + //deaths + "0," + + //questsCompleted + "0);"; + statement.executeUpdate(sql); + statement.close(); + Logger.info("No player entry detected, generating new entry!"); + } + + public static class PlayerDataEvents implements Listener { + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerLogin(PlayerJoinEvent event) { + new BukkitRunnable() { + @Override + public void run() { + if (Bukkit.getPlayer(event.getPlayer().getUniqueId()) == null) return; + new PlayerData(event.getPlayer().getUniqueId()); + } + }.runTaskLaterAsynchronously(MetadataHandler.PLUGIN, 20); + } + + @EventHandler + public void onPlayerLogout(PlayerQuitEvent event) { + new BukkitRunnable() { + @Override + public void run() { + clearPlayerData(event.getPlayer().getUniqueId()); + setDisplayName(event.getPlayer().getUniqueId(), event.getPlayer().getName()); + } + }.runTaskLaterAsynchronously(MetadataHandler.PLUGIN, 20); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/playerdata/database/PortOldData.java b/src/main/java/com/magmaguy/elitemobs/playerdata/database/PortOldData.java new file mode 100644 index 000000000..6218efae6 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/playerdata/database/PortOldData.java @@ -0,0 +1,161 @@ +package com.magmaguy.elitemobs.playerdata.database; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; +import java.sql.Statement; +import java.util.HashSet; +import java.util.UUID; + +public class PortOldData { + + public PortOldData() { + File playerCache = new File(MetadataHandler.PLUGIN.getDataFolder().getPath() + "/data/playerCache.yml"); + File playerGuildRank = new File(MetadataHandler.PLUGIN.getDataFolder().getPath() + "/data/playerGuildRank.yml"); + File playerMaxGuildRank = new File(MetadataHandler.PLUGIN.getDataFolder().getPath() + "/data/playerMaxGuildRank.yml"); + File playerMoneyData = new File(MetadataHandler.PLUGIN.getDataFolder().getPath() + "/data/playerMoneyData.yml"); + + if (!playerCache.isFile() && !playerGuildRank.isFile() && !playerMaxGuildRank.isFile() && !playerMoneyData.isFile()) + return; + + FileConfiguration playerCacheConfig = null, + playerGuildRankConfig = null, + playerMaxGuildRankConfig = null, + playerMoneyDataConfig = null; + + HashSet uuids = new HashSet<>(); + + if (playerCache.exists()) { + playerCacheConfig = YamlConfiguration.loadConfiguration(playerCache); + for (String string : playerCacheConfig.getKeys(false)) + uuids.add(UUID.fromString(string)); + } + + if (playerGuildRank.exists()) { + playerGuildRankConfig = YamlConfiguration.loadConfiguration(playerGuildRank); + for (String string : playerGuildRankConfig.getKeys(false)) + uuids.add(UUID.fromString(string)); + } + + if (playerMaxGuildRank.exists()) { + playerMaxGuildRankConfig = YamlConfiguration.loadConfiguration(playerMaxGuildRank); + for (String string : playerMaxGuildRankConfig.getKeys(false)) + uuids.add(UUID.fromString(string)); + } + + if (playerMoneyData.exists()) { + playerMoneyDataConfig = YamlConfiguration.loadConfiguration(playerMoneyData); + for (String string : playerMoneyDataConfig.getKeys(false)) + uuids.add(UUID.fromString(string)); + } + + if (uuids.isEmpty()) { + deleteConfigs(playerCache, playerGuildRank, playerMaxGuildRank, playerMoneyData); + return; + } + + boolean errored = false; + + for (UUID uuid : uuids) { + + boolean wasOldMaxRank = false; + + String displayName = null; + if (playerCacheConfig != null) { + if (playerCacheConfig.contains(uuid.toString())) + displayName = playerCacheConfig.getString(uuid.toString()); + } + if (displayName == null) { + displayName = "PlaceholderName"; + } + + Integer playerActiveGuildRank = null; + if (playerGuildRankConfig != null) { + if (playerGuildRankConfig.contains(uuid.toString())) + playerActiveGuildRank = playerGuildRankConfig.getInt(uuid.toString()); + } + if (playerActiveGuildRank == null) { + playerActiveGuildRank = 1; + } + + Integer playerMaxGuildRankValue = null; + if (playerMaxGuildRankConfig != null) { + if (playerMaxGuildRankConfig.contains(uuid.toString())) + playerMaxGuildRankValue = playerMaxGuildRankConfig.getInt(uuid.toString()); + } + if (playerMaxGuildRankValue == null) { + playerMaxGuildRankValue = 1; + } + if (playerMaxGuildRankValue == 11) { + playerActiveGuildRank = 10; + playerMaxGuildRankValue = 10; + wasOldMaxRank = true; + } + + Double currency = null; + if (playerMoneyDataConfig != null) { + if (playerMoneyDataConfig.contains(uuid.toString())) + currency = playerMoneyDataConfig.getDouble(uuid.toString()); + } + if (currency == null) { + currency = 0.0; + } + if (wasOldMaxRank) + currency += 30000; + + try { + Statement statement = null; + statement = PlayerData.getConnection().createStatement(); + String sql = "INSERT INTO " + PlayerData.getPLAYER_DATA_TABLE_NAME() + + " (PlayerUUID, DisplayName, Currency, GuildPrestigeLevel, GuildMaxLevel, GuildActiveLevel) " + + //identifier + "VALUES ('" + uuid.toString() + "'," + + //display name + " '" + displayName + "'," + + //currency + " " + currency + "," + + //guild_prestige_level + " 0," + + //guild_max_level + " " + playerMaxGuildRankValue + "," + + //guild_active_level + " " + playerActiveGuildRank + ");"; + statement.executeUpdate(sql); + statement.close(); + PlayerData.getConnection().commit(); + PlayerData.getConnection().close(); + } catch (Exception e) { + Logger.warn("Warning: Failed to write values from old config files to new database system. Tell the dev!"); + System.err.println(e.getClass().getName() + ": " + e.getMessage()); + errored = true; + } + + } + + if (!errored) + deleteConfigs(playerCache, playerGuildRank, playerMaxGuildRank, playerMoneyData); + + } + + private void deleteConfigs(File playerCache, File playerGuildRank, File playerMaxGuildRank, File playerMoneyData) { + deleteConfig(playerCache); + deleteConfig(playerGuildRank); + deleteConfig(playerMaxGuildRank); + deleteConfig(playerMoneyData); + } + + private void deleteConfig(File file) { + try { + if (file.exists() && file.isFile()) { + file.delete(); + Logger.warn("Deleted data file " + file.getName() + " - was no longer in use, moved to SQLite"); + } + } catch (Exception ex) { + + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/playerdata/statusscreen/BossTrackingPage.java b/src/main/java/com/magmaguy/elitemobs/playerdata/statusscreen/BossTrackingPage.java new file mode 100644 index 000000000..de32c0cb9 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/playerdata/statusscreen/BossTrackingPage.java @@ -0,0 +1,130 @@ +package com.magmaguy.elitemobs.playerdata.statusscreen; + +import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; +import com.magmaguy.elitemobs.config.menus.premade.PlayerStatusMenuConfig; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import com.magmaguy.magmacore.util.Logger; +import com.magmaguy.magmacore.util.SpigotMessage; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.Inventory; + +import java.util.*; + +public class BossTrackingPage { + private BossTrackingPage() { + } + + protected static TextComponent[] bossTrackingPage(Player player) { + + TextComponent configTextComponent = new TextComponent(); + + for (int i = 0; i < 3; i++) { + + if (PlayerStatusMenuConfig.getBossTrackerHoverLines()[i] == null) continue; + + TextComponent line = new TextComponent(PlayerStatusMenuConfig.getBossTrackerTextLines()[i] + "\n"); + + if (!PlayerStatusMenuConfig.getBossTrackerHoverLines()[i].isEmpty()) + PlayerStatusScreen.setHoverText(line, PlayerStatusMenuConfig.getBossTrackerHoverLines()[i]); + + if (!PlayerStatusMenuConfig.getBossTrackerCommandLines()[i].isEmpty()) + line.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, PlayerStatusMenuConfig.getBossTrackerCommandLines()[i])); + + configTextComponent.addExtra(line); + } + + ArrayList textComponents = new ArrayList<>(); + int counter = 0; + + //Fixes the issue where sometimes trackable bosses stay on the tracking page for no reason + HashSet tempSet = new HashSet<>(CustomBossEntity.getTrackableCustomBosses()); + tempSet.forEach(customBossEntity -> { + if (!customBossEntity.exists()) + CustomBossEntity.getTrackableCustomBosses().remove(customBossEntity); + }); + + for (CustomBossEntity customBossEntity : CustomBossEntity.getTrackableCustomBosses()) { + try { + textComponents.add(SpigotMessage.commandHoverMessage( + customBossEntity.getCustomBossBossBar().bossBarMessage(player, customBossEntity.getCustomBossesConfigFields().getLocationMessage()) + "\n", + PlayerStatusMenuConfig.getOnBossTrackHover(), + "/elitemobs track boss " + customBossEntity.getEliteUUID())); + + counter++; + } catch (Exception ex) { + Logger.warn("Failed to correctly get elements for boss tracking page!"); + ex.printStackTrace(); + } + } + + TextComponent[] textComponent; + if (counter == 0) { + textComponent = new TextComponent[1]; + textComponent[0] = configTextComponent; + } else { + textComponent = new TextComponent[(int) Math.floor(counter / 6D) + 1]; + int internalCounter = 0; + textComponent[0] = configTextComponent; + for (TextComponent text : textComponents) { + int currentPage = (int) Math.floor(internalCounter / 6D); + if (textComponent[currentPage] == null) + textComponent[currentPage] = new TextComponent(); + textComponent[currentPage].addExtra(text); + internalCounter++; + } + } + return textComponent; + } + + protected static void bossTrackingPage(Player targetPlayer, Player requestingPlayer) { + Inventory inventory = Bukkit.createInventory(requestingPlayer, 54, PlayerStatusMenuConfig.getBossTrackerChestMenuName()); + int counter = 0; + BossTrackingPageEvents.bosses.clear(); + for (CustomBossEntity customBossEntity : CustomBossEntity.getTrackableCustomBosses()) { + BossTrackingPageEvents.bosses.add(customBossEntity); + inventory.setItem(counter, ItemStackGenerator.generateItemStack(Material.ZOMBIE_HEAD, + customBossEntity.getCustomBossBossBar().bossBarMessage(targetPlayer, customBossEntity.getCustomBossesConfigFields().getLocationMessage()), + Collections.singletonList(MobCombatSettingsConfig.getBossLocationMessage()))); + counter++; + } + inventory.setItem(53, PlayerStatusMenuConfig.getBackItem()); + requestingPlayer.openInventory(inventory); + BossTrackingPageEvents.pageInventories.add(inventory); + } + + public static class BossTrackingPageEvents implements Listener { + private static final Set pageInventories = new HashSet<>(); + private static final List bosses = new ArrayList<>(); + + @EventHandler(ignoreCancelled = true) + public void onInventoryInteract(InventoryClickEvent event) { + if (event.getSlot() < 0) return; + Player player = ((Player) event.getWhoClicked()).getPlayer(); + if (!pageInventories.contains(event.getInventory())) return; + event.setCancelled(true); + if (bosses.size() - 1 >= event.getSlot()) { + player.closeInventory(); + bosses.get(event.getSlot()).getCustomBossBossBar().addTrackingPlayer(player); + return; + } + if (event.getSlot() == 53) { + player.closeInventory(); + CoverPage.coverPage(player); + } + } + + @EventHandler + public void onInventoryClose(InventoryCloseEvent event) { + pageInventories.remove(event.getInventory()); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/playerdata/statusscreen/CommandsPage.java b/src/main/java/com/magmaguy/elitemobs/playerdata/statusscreen/CommandsPage.java new file mode 100644 index 000000000..fcb19a294 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/playerdata/statusscreen/CommandsPage.java @@ -0,0 +1,71 @@ +package com.magmaguy.elitemobs.playerdata.statusscreen; + +import com.magmaguy.elitemobs.config.menus.premade.PlayerStatusMenuConfig; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.Inventory; + +import java.util.HashSet; +import java.util.Set; + +public class CommandsPage { + + private CommandsPage() { + } + + protected static TextComponent commandsPage() { + + TextComponent textComponent = new TextComponent(); + + for (int i = 0; i < 13; i++) { + + if (PlayerStatusMenuConfig.getCommandsHoverLines()[i] == null) continue; + + TextComponent line = new TextComponent(PlayerStatusMenuConfig.getCommandsTextLines()[i] + "\n"); + + if (!PlayerStatusMenuConfig.getCommandsHoverLines()[i].isEmpty()) + PlayerStatusScreen.setHoverText(line, PlayerStatusMenuConfig.getCommandsHoverLines()[i]); + + if (!PlayerStatusMenuConfig.getCommandsCommandLines()[i].isEmpty()) + line.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, PlayerStatusMenuConfig.getCommandsCommandLines()[i])); + + textComponent.addExtra(line); + } + return textComponent; + } + + protected static void commandsPage(Player targetPlayer, Player requestingPlayer) { + Inventory inventory = Bukkit.createInventory(requestingPlayer, 27, PlayerStatusMenuConfig.getCommandsChestMenuName()); + inventory.setItem(PlayerStatusMenuConfig.getCommandsAGSlot(), PlayerStatusMenuConfig.getCommandsAGItem()); + inventory.setItem(PlayerStatusMenuConfig.getCommandsShareItemSlot(), PlayerStatusMenuConfig.getCommandsShareItemItem()); + inventory.setItem(26, PlayerStatusMenuConfig.getBackItem()); + CommandsPageEvents.pageInventories.add(inventory); + requestingPlayer.openInventory(inventory); + } + + public static class CommandsPageEvents implements Listener { + private static final Set pageInventories = new HashSet<>(); + + @EventHandler(ignoreCancelled = true) + public void onInventoryInteract(InventoryClickEvent event) { + Player player = ((Player) event.getWhoClicked()).getPlayer(); + if (!pageInventories.contains(event.getInventory())) return; + event.setCancelled(true); + if (event.getSlot() == 26) { + player.closeInventory(); + CoverPage.coverPage(player); + } + } + + @EventHandler + public void onInventoryClose(InventoryCloseEvent event) { + pageInventories.remove(event.getInventory()); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/playerdata/statusscreen/CoverPage.java b/src/main/java/com/magmaguy/elitemobs/playerdata/statusscreen/CoverPage.java new file mode 100644 index 000000000..0e64f8d1d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/playerdata/statusscreen/CoverPage.java @@ -0,0 +1,139 @@ +package com.magmaguy.elitemobs.playerdata.statusscreen; + +import com.magmaguy.elitemobs.commands.guild.AdventurersGuildCommand; +import com.magmaguy.elitemobs.config.menus.premade.PlayerStatusMenuConfig; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.Inventory; + +import java.util.HashSet; +import java.util.Set; + +public class CoverPage { + protected static TextComponent coverPage(int statsPage, int gearPage, int teleportsPage, int commandsPage, int questsPage, int bossTrackingPage) { + + TextComponent textComponent = new TextComponent(); + + for (int i = 0; i < 13; i++) { + if (PlayerStatusMenuConfig.getIndexTextLines()[i] == null) continue; + TextComponent line = new TextComponent( + PlayerStatusMenuConfig.getIndexTextLines()[i] + .replace("$statsPage", statsPage + "") + .replace("$gearPage", gearPage + "") + .replace("$teleportsPage", teleportsPage + "") + .replace("$commandsPage", commandsPage + "") + .replace("$questsPage", questsPage + "") + .replace("$bossTrackingPage", bossTrackingPage + "") + + "\n"); + + if (PlayerStatusMenuConfig.getIndexHoverLines()[i] == null) continue; + + if (!PlayerStatusMenuConfig.getIndexHoverLines()[i].isEmpty()) + PlayerStatusScreen.setHoverText(line, PlayerStatusMenuConfig.getIndexHoverLines()[i]); + + if (PlayerStatusMenuConfig.getIndexCommandLines()[i].contains("$statsPage")) + line.setClickEvent(new ClickEvent(ClickEvent.Action.CHANGE_PAGE, PlayerStatusMenuConfig.getIndexCommandLines()[i].replace("$statsPage", statsPage + ""))); + else if (PlayerStatusMenuConfig.getIndexCommandLines()[i].contains("$gearPage")) + line.setClickEvent(new ClickEvent(ClickEvent.Action.CHANGE_PAGE, PlayerStatusMenuConfig.getIndexCommandLines()[i].replace("$gearPage", gearPage + ""))); + else if (PlayerStatusMenuConfig.getIndexCommandLines()[i].contains("$teleportsPage")) + line.setClickEvent(new ClickEvent(ClickEvent.Action.CHANGE_PAGE, PlayerStatusMenuConfig.getIndexCommandLines()[i].replace("$teleportsPage", teleportsPage + ""))); + else if (PlayerStatusMenuConfig.getIndexCommandLines()[i].contains("$commandsPage")) + line.setClickEvent(new ClickEvent(ClickEvent.Action.CHANGE_PAGE, PlayerStatusMenuConfig.getIndexCommandLines()[i].replace("$commandsPage", commandsPage + ""))); + else if (PlayerStatusMenuConfig.getIndexCommandLines()[i].contains("$questsPage")) + line.setClickEvent(new ClickEvent(ClickEvent.Action.CHANGE_PAGE, PlayerStatusMenuConfig.getIndexCommandLines()[i].replace("$questsPage", questsPage + ""))); + else if (PlayerStatusMenuConfig.getIndexCommandLines()[i].contains("$bossTrackingPage")) + line.setClickEvent(new ClickEvent(ClickEvent.Action.CHANGE_PAGE, PlayerStatusMenuConfig.getIndexCommandLines()[i].replace("$bossTrackingPage", bossTrackingPage + ""))); + + else + line.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, PlayerStatusMenuConfig.getIndexCommandLines()[i])); + + textComponent.addExtra(line); + } + + return textComponent; + + } + + protected static void coverPage(Player requestingPlayer) { + Inventory inventory = Bukkit.createInventory(requestingPlayer, 27, PlayerStatusMenuConfig.getIndexChestMenuName()); + inventory.setItem(PlayerStatusMenuConfig.getIndexHeaderSlot(), PlayerStatusMenuConfig.getIndexHeaderItem()); + + if (PlayerStatusMenuConfig.isDoStatsPage()) + inventory.setItem(PlayerStatusMenuConfig.getIndexStatsSlot(), PlayerStatusMenuConfig.getIndexStatsItem()); + if (PlayerStatusMenuConfig.isDoGearPage()) + inventory.setItem(PlayerStatusMenuConfig.getIndexGearSlot(), PlayerStatusMenuConfig.getIndexGearItem()); + if (PlayerStatusMenuConfig.isDoTeleportsPage()) + inventory.setItem(PlayerStatusMenuConfig.getIndexTeleportsSlot(), PlayerStatusMenuConfig.getIndexTeleportsItem()); + if (PlayerStatusMenuConfig.isDoCommandsPage()) + inventory.setItem(PlayerStatusMenuConfig.getIndexCommandsSlot(), PlayerStatusMenuConfig.getIndexCommandsItem()); + if (PlayerStatusMenuConfig.isDoQuestTrackingPage()) + inventory.setItem(PlayerStatusMenuConfig.getIndexQuestTrackingSlot(), PlayerStatusMenuConfig.getIndexQuestTrackingItem()); + if (PlayerStatusMenuConfig.isDoBossTrackingPage()) + inventory.setItem(PlayerStatusMenuConfig.getIndexBossTrackingSlot(), PlayerStatusMenuConfig.getIndexBossTrackingItem()); + CoverPageEvents.pageInventories.add(inventory); + requestingPlayer.openInventory(inventory); + } + + public static class CoverPageEvents implements Listener { + private static final Set pageInventories = new HashSet<>(); + + @EventHandler + public void onInventoryInteract(InventoryClickEvent event) { + Player player = ((Player) event.getWhoClicked()).getPlayer(); + if (!pageInventories.contains(event.getInventory())) return; + event.setCancelled(true); + + if (event.getSlot() == PlayerStatusMenuConfig.getIndexHeaderSlot()) { + player.closeInventory(); + AdventurersGuildCommand.adventurersGuildCommand(player); + return; + } + + if (event.getSlot() == PlayerStatusMenuConfig.getIndexGearSlot() && PlayerStatusMenuConfig.isDoGearPage()) { + player.closeInventory(); + GearPage.gearPage(player, player); + return; + } + + if (event.getSlot() == PlayerStatusMenuConfig.getIndexStatsSlot() && PlayerStatusMenuConfig.isDoStatsPage()) { + player.closeInventory(); + StatsPage.statsPage(player, player); + return; + } + + if (event.getSlot() == PlayerStatusMenuConfig.getIndexCommandsSlot() && PlayerStatusMenuConfig.isDoCommandsPage()) { + player.closeInventory(); + CommandsPage.commandsPage(player, player); + return; + } + + if (event.getSlot() == PlayerStatusMenuConfig.getIndexTeleportsSlot() && PlayerStatusMenuConfig.isDoTeleportsPage()) { + player.closeInventory(); + TeleportsPage.teleportsPage(player, player); + return; + } + + if (event.getSlot() == PlayerStatusMenuConfig.getIndexQuestTrackingSlot() && PlayerStatusMenuConfig.isDoQuestTrackingPage()) { + player.closeInventory(); + QuestsPage.questsPage(player, player); + return; + } + + if (event.getSlot() == PlayerStatusMenuConfig.getIndexBossTrackingSlot() && PlayerStatusMenuConfig.isDoBossTrackingPage()) { + player.closeInventory(); + BossTrackingPage.bossTrackingPage(player, player); + } + } + + @EventHandler + public void onInventoryClose(InventoryCloseEvent event) { + pageInventories.remove(event.getInventory()); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/playerdata/statusscreen/GearPage.java b/src/main/java/com/magmaguy/elitemobs/playerdata/statusscreen/GearPage.java new file mode 100644 index 000000000..ff2bad8b1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/playerdata/statusscreen/GearPage.java @@ -0,0 +1,268 @@ +package com.magmaguy.elitemobs.playerdata.statusscreen; + +import com.magmaguy.elitemobs.api.utils.EliteItemManager; +import com.magmaguy.elitemobs.config.menus.premade.PlayerStatusMenuConfig; +import com.magmaguy.elitemobs.items.ShareItem; +import com.magmaguy.elitemobs.playerdata.ElitePlayerInventory; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.HashSet; +import java.util.Set; + +public class GearPage { + protected static TextComponent gearPage(Player targetPlayer) { + + TextComponent textComponent = new TextComponent(); + + for (int i = 0; i < 13; i++) { + + TextComponent line; + if (PlayerStatusMenuConfig.getGearTextLines()[i] == null) continue; + if (!PlayerStatusMenuConfig.getGearTextLines()[i].contains("{")) { + line = new TextComponent(parseGearPlaceholders(PlayerStatusMenuConfig.getGearTextLines()[i], targetPlayer) + "\n"); + gearMultiComponentLine(textComponent, line, i, targetPlayer, false, 0); + } else { + TextComponent prePlaceholderElements = new TextComponent(parseGearPlaceholders(PlayerStatusMenuConfig.getGearTextLines()[i].split("\\{")[0], targetPlayer)); + gearMultiComponentLine(textComponent, prePlaceholderElements, i, targetPlayer, false, 0); + for (int j = 0; j < PlayerStatusMenuConfig.getGearTextLines()[i].split("\\{").length; j++) { + TextComponent placeholderString = new TextComponent(parseGearPlaceholders(PlayerStatusMenuConfig.getGearTextLines()[i].split("\\{")[j].split("}")[0], targetPlayer)); + gearMultiComponentLine(textComponent, placeholderString, i, targetPlayer, true, j); + if (PlayerStatusMenuConfig.getGearTextLines()[i].split("}").length > j + && PlayerStatusMenuConfig.getGearTextLines()[i].split("}")[j].contains("{")) { + TextComponent spaceBetweenPlaceholders = new TextComponent(parseGearPlaceholders(PlayerStatusMenuConfig.getGearTextLines()[i].split("}")[j].split("\\{")[0], targetPlayer)); + gearMultiComponentLine(textComponent, spaceBetweenPlaceholders, i, targetPlayer, false, 0); + } + } + TextComponent spaceAfterPlaceholders = new TextComponent("\n"); + gearMultiComponentLine(textComponent, spaceAfterPlaceholders, i, targetPlayer, false, 0); + } + + + } + + return textComponent; + } + + private static String parseGearPlaceholders(String string, Player targetPlayer) { + + if (string.contains("$helmettier")) + if (targetPlayer.getEquipment().getHelmet() != null) + return unicodeColorizer(targetPlayer.getEquipment().getHelmet().getType()) + + string.replace("$helmettier", + ElitePlayerInventory.playerInventories.get(targetPlayer.getUniqueId()).helmet.getTier(targetPlayer.getInventory().getHelmet(), true) + ""); + else + return string.replace("$helmettier", + ElitePlayerInventory.playerInventories.get(targetPlayer.getUniqueId()).helmet.getTier(targetPlayer.getInventory().getHelmet(), true) + ""); + if (string.contains("$chestplatetier")) + if (targetPlayer.getEquipment().getChestplate() != null) + return unicodeColorizer(targetPlayer.getEquipment().getChestplate().getType()) + + string.replace("$chestplatetier", + ElitePlayerInventory.playerInventories.get(targetPlayer.getUniqueId()).chestplate.getTier(targetPlayer.getInventory().getChestplate(), true) + ""); + else + return string.replace("$chestplatetier", + ElitePlayerInventory.playerInventories.get(targetPlayer.getUniqueId()).chestplate.getTier(targetPlayer.getInventory().getChestplate(), true) + ""); + if (string.contains("$leggingstier")) + if (targetPlayer.getEquipment().getLeggings() != null) + return unicodeColorizer(targetPlayer.getEquipment().getLeggings().getType()) + + string.replace("$leggingstier", + ElitePlayerInventory.playerInventories.get(targetPlayer.getUniqueId()).leggings.getTier(targetPlayer.getInventory().getLeggings(), true) + ""); + else + return string.replace("$leggingstier", + ElitePlayerInventory.playerInventories.get(targetPlayer.getUniqueId()).leggings.getTier(targetPlayer.getInventory().getLeggings(), true) + ""); + if (string.contains("$bootstier")) + if (targetPlayer.getEquipment().getBoots() != null) + return unicodeColorizer(targetPlayer.getEquipment().getBoots().getType()) + + string.replace("$bootstier", + ElitePlayerInventory.playerInventories.get(targetPlayer.getUniqueId()).boots.getTier(targetPlayer.getInventory().getBoots(), true) + ""); + else + return string.replace("$bootstier", + ElitePlayerInventory.playerInventories.get(targetPlayer.getUniqueId()).boots.getTier(targetPlayer.getInventory().getBoots(), true) + ""); + if (string.contains("$mainhandtier")) + return unicodeColorizer(targetPlayer.getEquipment().getItemInMainHand().getType()) + + string.replace("$mainhandtier", + ElitePlayerInventory.playerInventories.get(targetPlayer.getUniqueId()).mainhand.getTier(targetPlayer.getInventory().getItemInMainHand(), true) + ""); + if (string.contains("$offhandtier")) + return unicodeColorizer(targetPlayer.getEquipment().getItemInOffHand().getType()) + + string.replace("$offhandtier", + ElitePlayerInventory.playerInventories.get(targetPlayer.getUniqueId()).offhand.getTier(targetPlayer.getInventory().getItemInOffHand(), true) + ""); + if (string.contains("$damage")) + return string.replace("$damage", ElitePlayerInventory.playerInventories.get(targetPlayer.getUniqueId()).baseDamage() + ""); + if (string.contains("$armor")) + return string.replace("$armor", ElitePlayerInventory.playerInventories.get(targetPlayer.getUniqueId()).getEliteDefense(false) + ""); + if (string.contains("$threat")) + return string.replace("$threat", ElitePlayerInventory.playerInventories.get(targetPlayer.getUniqueId()).getNaturalMobSpawnLevel(true) + ""); + + return string; + + } + + private static void gearMultiComponentLine(TextComponent textComponent, TextComponent line, int i, Player targetPlayer, boolean brackets, int bracketCount) { + + if (PlayerStatusMenuConfig.getGearHoverLines()[i] != null && !PlayerStatusMenuConfig.getGearHoverLines()[i].isEmpty()) { + String hoverLines = PlayerStatusMenuConfig.getGearHoverLines()[i]; + if (hoverLines.contains("$helmet")) + ShareItem.setItemHoverEvent(line, targetPlayer.getInventory().getHelmet()); + else if (hoverLines.contains("$chestplate")) + ShareItem.setItemHoverEvent(line, targetPlayer.getInventory().getChestplate()); + else if (hoverLines.contains("$leggings")) + ShareItem.setItemHoverEvent(line, targetPlayer.getEquipment().getLeggings()); + else if (hoverLines.contains("$boots")) + ShareItem.setItemHoverEvent(line, targetPlayer.getInventory().getBoots()); + else if (brackets) { + if (hoverLines.contains("{") && hoverLines.contains("}")) + for (int j = 0; j < hoverLines.split("\\{").length; j++) + if (bracketCount == j) { + String parsedLine = hoverLines.split("\\{")[j].split("}")[0]; + if (parsedLine.contains("$mainhand")) { + ShareItem.setItemHoverEvent(line, targetPlayer.getInventory().getItemInMainHand()); + } else if (parsedLine.contains("$offhand")) { + ShareItem.setItemHoverEvent(line, targetPlayer.getInventory().getItemInOffHand()); + } else + PlayerStatusScreen.setHoverText(line, parsedLine); + } + } else if (!(hoverLines.contains("{") && hoverLines.contains("}"))) + PlayerStatusScreen.setHoverText(line, PlayerStatusMenuConfig.getGearHoverLines()[i]); + + } + + textComponent.addExtra(line); + } + + private static ChatColor unicodeColorizer(Material material) { + switch (material) { + case DIAMOND_AXE: + case DIAMOND_SWORD: + case DIAMOND_HOE: + case DIAMOND_HELMET: + case DIAMOND_CHESTPLATE: + case DIAMOND_LEGGINGS: + case DIAMOND_BOOTS: + case DIAMOND_SHOVEL: + case DIAMOND_PICKAXE: + return ChatColor.AQUA; + case IRON_AXE: + case IRON_SWORD: + case IRON_HOE: + case IRON_HELMET: + case IRON_CHESTPLATE: + case IRON_LEGGINGS: + case IRON_BOOTS: + case IRON_SHOVEL: + case IRON_PICKAXE: + case CHAINMAIL_HELMET: + case CHAINMAIL_CHESTPLATE: + case CHAINMAIL_LEGGINGS: + case CHAINMAIL_BOOTS: + case STONE_AXE: + case STONE_SWORD: + case STONE_HOE: + case STONE_SHOVEL: + case STONE_PICKAXE: + return ChatColor.GRAY; + case GOLDEN_AXE: + case GOLDEN_SWORD: + case GOLDEN_HOE: + case GOLDEN_HELMET: + case GOLDEN_CHESTPLATE: + case GOLDEN_LEGGINGS: + case GOLDEN_BOOTS: + case GOLDEN_SHOVEL: + case GOLDEN_PICKAXE: + return ChatColor.YELLOW; + case LEATHER_HELMET: + case LEATHER_CHESTPLATE: + case LEATHER_LEGGINGS: + case LEATHER_BOOTS: + case WOODEN_AXE: + case WOODEN_SWORD: + case WOODEN_HOE: + case WOODEN_SHOVEL: + case WOODEN_PICKAXE: + return ChatColor.GOLD; + case TURTLE_HELMET: + return ChatColor.GREEN; + default: + if (material.equals(Material.NETHERITE_HELMET) || + material.equals(Material.NETHERITE_CHESTPLATE) || + material.equals(Material.NETHERITE_LEGGINGS) || + material.equals(Material.NETHERITE_BOOTS) || + material.equals(Material.NETHERITE_SWORD) || + material.equals(Material.NETHERITE_AXE) || + material.equals(Material.NETHERITE_HOE) || + material.equals(Material.NETHERITE_PICKAXE)) + return ChatColor.BLACK; + return ChatColor.DARK_GRAY; + } + } + + protected static void gearPage(Player requestingPlayer, Player targetPlayer) { + Inventory inventory = Bukkit.createInventory(requestingPlayer, 54, PlayerStatusMenuConfig.getGearChestMenuName()); + //head + if (EliteItemManager.isEliteMobsItem(targetPlayer.getInventory().getArmorContents()[3])) + inventory.setItem(11, targetPlayer.getInventory().getArmorContents()[3]); + //main hand + if (EliteItemManager.isEliteMobsItem(targetPlayer.getInventory().getItemInMainHand())) + inventory.setItem(19, targetPlayer.getInventory().getItemInMainHand()); + //chestplate + if (EliteItemManager.isEliteMobsItem(targetPlayer.getInventory().getArmorContents()[2])) + inventory.setItem(20, targetPlayer.getInventory().getArmorContents()[2]); + //shield + if (EliteItemManager.isEliteMobsItem(targetPlayer.getInventory().getItemInOffHand())) + inventory.setItem(21, targetPlayer.getInventory().getItemInOffHand()); + //leggings + if (EliteItemManager.isEliteMobsItem(targetPlayer.getInventory().getArmorContents()[1])) + inventory.setItem(29, targetPlayer.getInventory().getArmorContents()[1]); + //boots + inventory.setItem(38, targetPlayer.getInventory().getArmorContents()[0]); + inventory.setItem(PlayerStatusMenuConfig.getGearDamageSlot(), + replaceItemNamePlaceholder(PlayerStatusMenuConfig.getGearDamageItem().clone(), "$damage", + ElitePlayerInventory.playerInventories.get(targetPlayer.getUniqueId()).baseDamage() + "")); + inventory.setItem(PlayerStatusMenuConfig.getGearArmorSlot(), + replaceItemNamePlaceholder(PlayerStatusMenuConfig.getGearArmorItem().clone(), "$defense", + ElitePlayerInventory.playerInventories.get(targetPlayer.getUniqueId()).getEliteDefense(false) + "")); + inventory.setItem(PlayerStatusMenuConfig.getGearThreatSlot(), + replaceItemNamePlaceholder(PlayerStatusMenuConfig.getGearThreatItem().clone(), "$threat", + ElitePlayerInventory.playerInventories.get(targetPlayer.getUniqueId()).getNaturalMobSpawnLevel(true) + "")); + inventory.setItem(53, PlayerStatusMenuConfig.getBackItem()); + GearPageEvents.pageInventories.add(inventory); + requestingPlayer.openInventory(inventory); + } + + private static ItemStack replaceItemNamePlaceholder(ItemStack itemStack, String placeholder, String replacement) { + ItemMeta itemMeta = itemStack.getItemMeta(); + itemMeta.setDisplayName(itemMeta.getDisplayName().replace(placeholder, replacement)); + itemStack.setItemMeta(itemMeta); + return itemStack; + } + + public static class GearPageEvents implements Listener { + private static final Set pageInventories = new HashSet<>(); + + @EventHandler(ignoreCancelled = true) + public void onInventoryInteract(InventoryClickEvent event) { + Player player = ((Player) event.getWhoClicked()).getPlayer(); + if (!pageInventories.contains(event.getInventory())) return; + event.setCancelled(true); + if (event.getSlot() == 53) { + player.closeInventory(); + CoverPage.coverPage(player); + } + } + + @EventHandler + public void onInventoryClose(InventoryCloseEvent event) { + pageInventories.remove(event.getInventory()); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/playerdata/statusscreen/PlayerStatusScreen.java b/src/main/java/com/magmaguy/elitemobs/playerdata/statusscreen/PlayerStatusScreen.java new file mode 100644 index 000000000..0ac3dd8c4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/playerdata/statusscreen/PlayerStatusScreen.java @@ -0,0 +1,129 @@ +package com.magmaguy.elitemobs.playerdata.statusscreen; + +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.config.menus.premade.PlayerStatusMenuConfig; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.thirdparty.geyser.GeyserDetector; +import com.magmaguy.elitemobs.utils.BookMaker; +import com.magmaguy.magmacore.util.ChatColorConverter; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.BookMeta; + +import java.util.ArrayList; +import java.util.List; + +public class PlayerStatusScreen implements Listener { + + public PlayerStatusScreen(Player requestingPlayer, Player targetPlayer) { + ItemStack writtenBook = generateBook(requestingPlayer, targetPlayer); + BookMeta bookMeta = (BookMeta) writtenBook.getItemMeta(); + List pages = bookMeta.getPages(); + String debugPage = ""; + debugPage += "Is in memory: " + PlayerData.isInMemory(targetPlayer); + ArrayList newPages = new ArrayList<>(pages); + newPages.add(debugPage); + BookMaker.generateBook(requestingPlayer, newPages); + } + + public PlayerStatusScreen(Player player) { + if (!PlayerData.getUseBookMenus(player.getUniqueId()) || GeyserDetector.bedrockPlayer(player) || DefaultConfig.isOnlyUseBedrockMenus()) { + generateChestMenu(player, player); + } else { + generateBook(player, player); + } + if (!PlayerData.getDismissEMStatusScreenMessage(player.getUniqueId()) && !DefaultConfig.isOnlyUseBedrockMenus()) { + player.sendMessage(DefaultConfig.getDismissEMMessage()); + } + } + + protected static void setHoverText(TextComponent textComponent, String text) { + textComponent.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(text).create())); + } + + public static String convertLightColorsToBlack(String string) { + string = ChatColorConverter.convert(string); + string = string.replace("§f", "§0").replace("§e", "§0"); + if (!string.startsWith("§")) + string = "§0" + string; + return string; + } + + private void generateChestMenu(Player requestingPlayer, Player targetPlayer) { + CoverPage.coverPage(requestingPlayer); + } + + private ItemStack generateBook(Player requestingPlayer, Player targetPlayer) { + TextComponent[] pages = new TextComponent[100]; + int pageCounter = 1; + pageCounter++; + int statsPage = -1; + int gearPage = -1; + int teleportsPage = -1; + int commandsPage = -1; + int questsPage = -1; + int bossTrackingPage = -1; + if (PlayerStatusMenuConfig.isDoStatsPage()) { + statsPage = pageCounter; + pages[pageCounter] = StatsPage.statsPage(targetPlayer); + pageCounter++; + } + if (PlayerStatusMenuConfig.isDoGearPage()) { + gearPage = pageCounter; + pages[pageCounter] = GearPage.gearPage(targetPlayer); + pageCounter++; + } + if (PlayerStatusMenuConfig.isDoTeleportsPage()) { + teleportsPage = pageCounter; + for (TextComponent textComponent : TeleportsPage.teleportsPage()) { + pages[pageCounter] = textComponent; + pageCounter++; + } + } + if (PlayerStatusMenuConfig.isDoCommandsPage()) { + commandsPage = pageCounter; + pages[pageCounter] = CommandsPage.commandsPage(); + pageCounter++; + } + if (PlayerStatusMenuConfig.isDoQuestTrackingPage()) { + questsPage = pageCounter; + for (TextComponent textComponent : QuestsPage.questsPage(targetPlayer)) { + pages[pageCounter] = textComponent; + pageCounter++; + } + } + + if (PlayerStatusMenuConfig.isDoBossTrackingPage()) { + bossTrackingPage = pageCounter; + for (TextComponent textComponent : BossTrackingPage.bossTrackingPage(targetPlayer)) { + pages[pageCounter] = textComponent; + pageCounter++; + } + } + + pages[0] = CoverPage.coverPage(statsPage, gearPage, teleportsPage, commandsPage, questsPage, bossTrackingPage); + + int counter = 0; + for (TextComponent textComponent : pages) { + if (textComponent != null) + counter++; + } + + TextComponent[] finalPages = new TextComponent[counter]; + int secondCounter = 0; + for (TextComponent textComponent : pages) { + if (textComponent != null) { + finalPages[secondCounter] = textComponent; + secondCounter++; + } + } + + return BookMaker.generateBook(requestingPlayer, finalPages); + } + + +} diff --git a/src/main/java/com/magmaguy/elitemobs/playerdata/statusscreen/QuestsPage.java b/src/main/java/com/magmaguy/elitemobs/playerdata/statusscreen/QuestsPage.java new file mode 100644 index 000000000..aa1977106 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/playerdata/statusscreen/QuestsPage.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.playerdata.statusscreen; + +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.quests.menus.QuestMenu; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.entity.Player; + +public class QuestsPage { + protected static TextComponent[] questsPage(Player targetPlayer) { + return QuestMenu.generateQuestEntry(targetPlayer, null); + } + + protected static void questsPage(Player targetPlayer, Player requestingPlayer) { + QuestMenu.generateQuestMenu(PlayerData.getQuests(targetPlayer.getUniqueId()), targetPlayer, null); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/playerdata/statusscreen/StatsPage.java b/src/main/java/com/magmaguy/elitemobs/playerdata/statusscreen/StatsPage.java new file mode 100644 index 000000000..d375db0d9 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/playerdata/statusscreen/StatsPage.java @@ -0,0 +1,113 @@ +package com.magmaguy.elitemobs.playerdata.statusscreen; + +import com.magmaguy.elitemobs.adventurersguild.GuildRank; +import com.magmaguy.elitemobs.config.AdventurersGuildConfig; +import com.magmaguy.elitemobs.config.menus.premade.PlayerStatusMenuConfig; +import com.magmaguy.elitemobs.economy.EconomyHandler; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.HashSet; +import java.util.Set; + +public class StatsPage { + private StatsPage() { + } + + protected static TextComponent statsPage(Player targetPlayer) { + + TextComponent textComponent = new TextComponent(); + + for (int i = 0; i < 13; i++) { + if (PlayerStatusMenuConfig.getStatsTextLines()[i] == null) continue; + TextComponent line = new TextComponent(PlayerStatusMenuConfig.getStatsTextLines()[i] + .replace("$money", EconomyHandler.checkCurrency(targetPlayer.getUniqueId()) + "") + .replace("$guildtier", PlayerStatusScreen.convertLightColorsToBlack(AdventurersGuildConfig.getShortenedRankName(GuildRank.getGuildPrestigeRank(targetPlayer), GuildRank.getActiveGuildRank(targetPlayer)))) + .replace("$kills", PlayerData.getKills(targetPlayer.getUniqueId()) + "") + .replace("$highestkill", PlayerData.getHighestLevelKilled(targetPlayer.getUniqueId()) + "") + .replace("$deaths", PlayerData.getDeaths(targetPlayer.getUniqueId()) + "") + .replace("$quests", PlayerData.getQuestsCompleted(targetPlayer.getUniqueId()) + "") + .replace("$score", PlayerData.getScore(targetPlayer.getUniqueId()) + "") + "\n"); + + if (PlayerStatusMenuConfig.getStatsHoverLines() != null && + PlayerStatusMenuConfig.getStatsHoverLines()[i] != null + && !PlayerStatusMenuConfig.getStatsHoverLines()[i].isEmpty()) + PlayerStatusScreen.setHoverText(line, PlayerStatusMenuConfig.getStatsHoverLines()[i]); + + if (PlayerStatusMenuConfig.getStatsCommandLines() != null && + PlayerStatusMenuConfig.getStatsCommandLines()[i] != null && + !PlayerStatusMenuConfig.getStatsCommandLines()[i].isEmpty()) + line.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, PlayerStatusMenuConfig.getStatsCommandLines()[i])); + + textComponent.addExtra(line); + } + + return textComponent; + + } + + protected static void statsPage(Player targetPlayer, Player requestingPlayer) { + Inventory inventory = Bukkit.createInventory(requestingPlayer, 27, PlayerStatusMenuConfig.getStatsChestMenuName()); + inventory.setItem(PlayerStatusMenuConfig.getStatsMoneySlot(), + replaceItemNamePlaceholder(PlayerStatusMenuConfig.getStatsMoneyItem().clone(), "$money", + EconomyHandler.checkCurrency(targetPlayer.getUniqueId()) + "")); + inventory.setItem(PlayerStatusMenuConfig.getStatsGuildTierSlot(), + replaceItemNamePlaceholder(PlayerStatusMenuConfig.getStatsGuildTierItem().clone(), "$tier", + AdventurersGuildConfig.getShortenedRankName(GuildRank.getGuildPrestigeRank(targetPlayer), GuildRank.getActiveGuildRank(targetPlayer)))); + inventory.setItem(PlayerStatusMenuConfig.getStatsEliteKillsSlot(), + replaceItemNamePlaceholder(PlayerStatusMenuConfig.getStatsEliteKillsItem().clone(), "$kills", + PlayerData.getKills(targetPlayer.getUniqueId()) + "")); + inventory.setItem(PlayerStatusMenuConfig.getStatsMaxEliteLevelKilledSlot(), + replaceItemNamePlaceholder(PlayerStatusMenuConfig.getStatsMaxEliteLevelKilledItem().clone(), "$maxKill", + PlayerData.getHighestLevelKilled(targetPlayer.getUniqueId()) + "")); + inventory.setItem(PlayerStatusMenuConfig.getStatsEliteDeathsSlot(), + replaceItemNamePlaceholder(PlayerStatusMenuConfig.getStatsEliteDeathsItem().clone(), "$deaths", + PlayerData.getDeaths(targetPlayer.getUniqueId()) + "")); + inventory.setItem(PlayerStatusMenuConfig.getStatsQuestsCompletedSlot(), + replaceItemNamePlaceholder(PlayerStatusMenuConfig.getStatsQuestsCompletedItem().clone(), "$questsCompleted", + PlayerData.getQuestsCompleted(targetPlayer.getUniqueId()) + "")); + inventory.setItem(PlayerStatusMenuConfig.getStatsScoreSlot(), + replaceItemNamePlaceholder(PlayerStatusMenuConfig.getStatsScoreItem().clone(), "$score", + PlayerData.getScore(targetPlayer.getUniqueId()) + "")); + inventory.setItem(26, PlayerStatusMenuConfig.getBackItem()); + requestingPlayer.openInventory(inventory); + StatsPageEvents.pageInventories.add(inventory); + } + + private static ItemStack replaceItemNamePlaceholder(ItemStack itemStack, String placeholder, String replacement) { + ItemMeta itemMeta = itemStack.getItemMeta(); + itemMeta.setDisplayName(itemMeta.getDisplayName().replace(placeholder, replacement)); + itemStack.setItemMeta(itemMeta); + return itemStack; + } + + public static class StatsPageEvents implements Listener { + private static final Set pageInventories = new HashSet<>(); + + @EventHandler + public void onInventoryInteract(InventoryClickEvent event) { + Player player = ((Player) event.getWhoClicked()).getPlayer(); + if (!pageInventories.contains(event.getInventory())) return; + event.setCancelled(true); + if (event.getSlot() == 26) { + player.closeInventory(); + CoverPage.coverPage(player); + } + } + + @EventHandler + public void onInventoryClose(InventoryCloseEvent event) { + pageInventories.remove(event.getInventory()); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/playerdata/statusscreen/TeleportsPage.java b/src/main/java/com/magmaguy/elitemobs/playerdata/statusscreen/TeleportsPage.java new file mode 100644 index 000000000..65d12c34a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/playerdata/statusscreen/TeleportsPage.java @@ -0,0 +1,139 @@ +package com.magmaguy.elitemobs.playerdata.statusscreen; + +import com.magmaguy.elitemobs.commands.DungeonCommands; +import com.magmaguy.elitemobs.config.menus.premade.PlayerStatusMenuConfig; +import com.magmaguy.elitemobs.dungeons.CombatContent; +import com.magmaguy.elitemobs.dungeons.EMPackage; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.Inventory; + +import java.util.*; + + +public class TeleportsPage { + + protected static TextComponent[] teleportsPage() { + TextComponent configTextComponent = new TextComponent(); + //Fills the non-dungeon lines + int textLineCounter = 0; + for (String string : PlayerStatusMenuConfig.getTeleportTextLines()) { + if (string == null || string.equals("null")) + continue; + TextComponent line = new TextComponent(string + "\n"); + if (PlayerStatusMenuConfig.getTeleportHoverLines()[textLineCounter] != null && !PlayerStatusMenuConfig.getTeleportHoverLines()[textLineCounter].isEmpty()) + PlayerStatusScreen.setHoverText(line, PlayerStatusMenuConfig.getTeleportHoverLines()[textLineCounter]); + + if (PlayerStatusMenuConfig.getTeleportCommandLines()[textLineCounter] != null && !PlayerStatusMenuConfig.getTeleportCommandLines()[textLineCounter].isEmpty()) + line.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, PlayerStatusMenuConfig.getTeleportCommandLines()[textLineCounter])); + + configTextComponent.addExtra(line); + textLineCounter++; + } + + //Fills the minidungeon components + int counter = 0; + ArrayList textComponents = new ArrayList<>(); + + for (EMPackage emPackage : EMPackage.getEmPackages().values()) { + if (!emPackage.isInstalled() || + !(emPackage instanceof CombatContent) || + emPackage.getDungeonPackagerConfigFields().isEnchantmentChallenge()) continue; + if (!emPackage.getDungeonPackagerConfigFields().isListedInTeleports()) continue; + + TextComponent message = new TextComponent(PlayerStatusScreen.convertLightColorsToBlack(emPackage.getDungeonPackagerConfigFields().getName() + "\n")); + String hoverMessage = ChatColorConverter.convert(PlayerStatusMenuConfig.getOnTeleportHover() + "\n" + + emPackage.getDungeonPackagerConfigFields().getPlayerInfo() + .replace("$bossCount", emPackage.getCustomBossEntityList().size() + "") + .replace("$lowestTier", ((CombatContent) emPackage).getLowestLevel() + "") + .replace("$highestTier", ((CombatContent) emPackage).getHighestLevel() + "")); + message.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new ComponentBuilder(hoverMessage).create())); + message.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/elitemobs dungeontp " + emPackage.getDungeonPackagerConfigFields().getFilename())); + textComponents.add(message); + + counter++; + } + + if (counter == 0) { + TextComponent[] textComponent = new TextComponent[1]; + textComponent[0] = configTextComponent; + return textComponent; + } else { + double elementsPerPage = 5D; + TextComponent[] textComponent = new TextComponent[(int) Math.floor(counter + 2 / elementsPerPage) + 1]; + int internalCounter = 2; + textComponent[0] = configTextComponent; + for (TextComponent text : textComponents) { + int currentPage = (int) Math.floor(internalCounter / elementsPerPage); + if (textComponent[currentPage] == null) + textComponent[currentPage] = new TextComponent(); + textComponent[currentPage].addExtra(text); + internalCounter++; + } + return textComponent; + } + } + + protected static void teleportsPage(Player targetPlayer, Player requestingPlayer) { + Inventory inventory = Bukkit.createInventory(requestingPlayer, 54, PlayerStatusMenuConfig.getTeleportChestMenuName()); + int counter = 0; + TeleportsPageEvents.orderedDungeons.clear(); + for (EMPackage emPackage : EMPackage.getEmPackages().values()) { + if (!emPackage.isInstalled() || + !(emPackage instanceof CombatContent) || + emPackage.getDungeonPackagerConfigFields().isEnchantmentChallenge()) continue; + if (!emPackage.getDungeonPackagerConfigFields().isListedInTeleports()) continue; + + TeleportsPageEvents.orderedDungeons.add(emPackage); + inventory.setItem(counter, ItemStackGenerator.generateItemStack(Material.PAPER, emPackage.getDungeonPackagerConfigFields().getName() + , Collections.singletonList(emPackage.getDungeonPackagerConfigFields().getPlayerInfo() + .replace("$bossCount", emPackage.getCustomBossEntityList().size() + "") + .replace("$lowestTier", ((CombatContent) emPackage).getLowestLevel() + "") + .replace("$highestTier", ((CombatContent) emPackage).getHighestLevel() + "")))); + counter++; + } + inventory.setItem(53, PlayerStatusMenuConfig.getBackItem()); + requestingPlayer.openInventory(inventory); + TeleportsPageEvents.pageInventories.add(inventory); + } + + public static class TeleportsPageEvents implements Listener { + private static final Set pageInventories = new HashSet<>(); + private static final List orderedDungeons = new ArrayList<>(); + + @EventHandler(ignoreCancelled = true) + public void onInventoryInteract(InventoryClickEvent event) { + Player player = ((Player) event.getWhoClicked()).getPlayer(); + if (!pageInventories.contains(event.getInventory())) return; + event.setCancelled(true); + if (event.getSlot() < 0) return; + if (orderedDungeons.size() - 1 >= event.getSlot()) { + player.closeInventory(); + DungeonCommands.teleport(player, orderedDungeons.get(event.getSlot()).getDungeonPackagerConfigFields().getFilename()); + return; + } + if (event.getSlot() == 53) { + player.closeInventory(); + CoverPage.coverPage(player); + } + } + + @EventHandler + public void onInventoryClose(InventoryCloseEvent event) { + pageInventories.remove(event.getInventory()); + } + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/ArrowFireworks.java b/src/main/java/com/magmaguy/elitemobs/powers/ArrowFireworks.java new file mode 100644 index 000000000..fb5bd284e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/ArrowFireworks.java @@ -0,0 +1,102 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.MinorPower; +import com.magmaguy.elitemobs.utils.NonSolidBlockTypes; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Monster; +import org.bukkit.entity.SpectralArrow; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.concurrent.ThreadLocalRandom; + +public class ArrowFireworks extends MinorPower implements Listener { + + public ArrowFireworks() { + super(PowersConfig.getPower("arrow_fireworks.yml")); + } + + private static void doArrowFireworks(EliteEntity eliteEntity) { + + Location centeredLocation = eliteEntity.getLivingEntity().getLocation().clone().add(new Vector(0, 3, 0)); + + for (int x = 0; x < eliteEntity.getDamagers().size(); x++) { + + Location newLocation = centeredLocation.clone(); + + boolean validBlockFound = false; + for (int i = 0; i < 5; i++) { + Vector randomizedVector = new Vector(ThreadLocalRandom.current().nextInt(9) - 4, 0, ThreadLocalRandom.current().nextInt(9) - 4); + newLocation = centeredLocation.clone().add(randomizedVector); + if (NonSolidBlockTypes.isPassthrough(newLocation.getBlock().getType())) { + validBlockFound = true; + break; + } + } + + if (!validBlockFound) return; + + SpectralArrow rocketArrow = (SpectralArrow) newLocation.getWorld().spawnEntity(newLocation, EntityType.SPECTRAL_ARROW); + rocketArrow.setShooter(eliteEntity.getLivingEntity()); + rocketArrow.setVelocity(new Vector(0, 0.5, 0)); + rocketArrow.setGravity(false); + rocketArrow.setGlowing(true); + + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + if (!rocketArrow.isValid() || !eliteEntity.isValid()) { + cancel(); + return; + } + + if (counter < 20 * 1.5) { + rocketArrow.getWorld().spawnParticle(Particle.CRIT, rocketArrow.getLocation(), 1); + } else { + + for (int i = 0; i < 30; i++) { + Arrow fireworkArrow = (Arrow) rocketArrow.getWorld().spawnEntity(rocketArrow.getLocation(), EntityType.ARROW); + Vector randomizedDirection = new Vector((ThreadLocalRandom.current().nextDouble() - 0.5) * 2, (ThreadLocalRandom.current().nextDouble() - 0.5) * 2, (ThreadLocalRandom.current().nextDouble() - 0.5) * 2); + fireworkArrow.setVelocity(randomizedDirection); + fireworkArrow.setShooter(eliteEntity.getLivingEntity()); + fireworkArrow.setGlowing(true); + } + + rocketArrow.remove(); + + cancel(); + } + + counter++; + + + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + + } + + } + + @EventHandler + public void onEliteDamagedByPlayer(EliteMobDamagedByPlayerEvent event) { + if (event.isCancelled()) return; + if (!(event.getEliteMobEntity().getLivingEntity() instanceof Monster)) return; + ArrowFireworks arrowFireworks = (ArrowFireworks) event.getEliteMobEntity().getPower(this); + if (arrowFireworks == null) return; + + if (ThreadLocalRandom.current().nextDouble() > 0.15) return; + doArrowFireworks(event.getEliteMobEntity()); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/ArrowRain.java b/src/main/java/com/magmaguy/elitemobs/powers/ArrowRain.java new file mode 100644 index 000000000..2acb1c38a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/ArrowRain.java @@ -0,0 +1,77 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.MinorPower; +import org.bukkit.Location; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.EntityType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.Objects; +import java.util.concurrent.ThreadLocalRandom; + +public class ArrowRain extends MinorPower implements Listener { + + public ArrowRain() { + super(PowersConfig.getPower("arrow_rain.yml")); + } + + public static void doArrowRain(EliteEntity eliteEntity) { + new BukkitRunnable() { + final Location initialLocation = eliteEntity.getLivingEntity().getLocation().clone(); + int counter = 0; + + @Override + public void run() { + + if (!eliteEntity.isValid()) { + cancel(); + return; + } + + if (counter > 10 * 20) { + cancel(); + eliteEntity.getLivingEntity().teleport(initialLocation); + return; + } + + counter++; + MeteorShower.doCloudEffect(eliteEntity.getLivingEntity().getLocation().clone().add(new Vector(0, 10, 0))); + if (counter > 20) + doArrows(eliteEntity.getLivingEntity().getLocation().clone().add(new Vector(0, 10, 0)), eliteEntity); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + private static void doArrows(Location location, EliteEntity eliteEntity) { + for (int i = 0; i < 1; i++) { + int randX = ThreadLocalRandom.current().nextInt(30) - 15; + int randY = ThreadLocalRandom.current().nextInt(2); + int randZ = ThreadLocalRandom.current().nextInt(30) - 15; + Location newLocation = location.clone().add(new Vector(randX, randY, randZ)); + newLocation = newLocation.setDirection(new Vector(ThreadLocalRandom.current().nextDouble() - 0.5, -0.5, ThreadLocalRandom.current().nextDouble() - 0.5)); + Arrow arrow = (Arrow) Objects.requireNonNull(location.getWorld()).spawnEntity(newLocation, EntityType.ARROW); + arrow.setShooter(eliteEntity.getLivingEntity()); + } + } + + @EventHandler + public void onEliteDamaged(EliteMobDamagedByPlayerEvent event) { + + ArrowRain arrowRain = (ArrowRain) event.getEliteMobEntity().getPower(this); + if (arrowRain == null) return; + if (!eventIsValid(event, arrowRain)) return; + if (ThreadLocalRandom.current().nextDouble() > 0.15) return; + + arrowRain.doGlobalCooldown(20 * 15, event.getEliteMobEntity()); + doArrowRain(event.getEliteMobEntity()); + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/AttackArrow.java b/src/main/java/com/magmaguy/elitemobs/powers/AttackArrow.java new file mode 100644 index 000000000..904b82c82 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/AttackArrow.java @@ -0,0 +1,65 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobTargetPlayerEvent; +import com.magmaguy.elitemobs.combatsystem.EliteProjectile; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.MinorPower; +import org.bukkit.GameMode; +import org.bukkit.entity.*; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; + +/** + * Created by MagmaGuy on 06/05/2017. + */ +public class AttackArrow extends MinorPower implements Listener { + + public AttackArrow() { + super(PowersConfig.getPower("attack_arrow.yml")); + } + + public static Arrow shootArrow(Entity entity, Player player) { + return (Arrow) EliteProjectile.create(EntityType.ARROW, entity, player, true); + } + + @EventHandler + public void targetEvent(EliteMobTargetPlayerEvent event) { + if (!(event.getEliteMobEntity().getLivingEntity() instanceof Monster)) return; + AttackArrow attackArrow = (AttackArrow) event.getEliteMobEntity().getPower(this); + if (attackArrow == null) return; + if (attackArrow.isFiring()) return; + + attackArrow.setFiring(true); + repeatingArrowTask(attackArrow, event.getEliteMobEntity()); + } + + private void repeatingArrowTask(AttackArrow attackArrow, EliteEntity eliteEntity) { + + new BukkitRunnable() { + + @Override + public void run() { + + if (!eliteEntity.isValid() || ((Monster) eliteEntity.getLivingEntity()).getTarget() == null) { + attackArrow.setFiring(false); + cancel(); + return; + } + + for (Entity nearbyEntity : eliteEntity.getLivingEntity().getNearbyEntities(20, 20, 20)) + if (nearbyEntity instanceof Player player) + if (!player.isDead() && + (player.getGameMode().equals(GameMode.ADVENTURE) || + player.getGameMode().equals(GameMode.SURVIVAL))) + shootArrow(eliteEntity.getLivingEntity(), (Player) nearbyEntity); + + } + + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 20 * 8); + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/AttackFireball.java b/src/main/java/com/magmaguy/elitemobs/powers/AttackFireball.java new file mode 100644 index 000000000..c8d7261e0 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/AttackFireball.java @@ -0,0 +1,70 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobTargetPlayerEvent; +import com.magmaguy.elitemobs.combatsystem.EliteProjectile; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.powers.meta.MinorPower; +import org.bukkit.GameMode; +import org.bukkit.entity.*; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.projectiles.ProjectileSource; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +/** + * Created by MagmaGuy on 06/05/2017. + */ +public class AttackFireball extends MinorPower implements Listener { + + public AttackFireball() { + super(PowersConfig.getPower("attack_fireball.yml")); + } + + public static Fireball shootFireball(Entity entity, Player player) { + Vector targetterToTargetted = player.getLocation().toVector().subtract(entity.getLocation().toVector()).normalize().multiply(0.01); + Fireball repeatingFireball = (Fireball) EliteProjectile.create(EntityType.FIREBALL, entity, player, targetterToTargetted, true); + repeatingFireball.setYield(3F); + repeatingFireball.setIsIncendiary(true); + repeatingFireball.setShooter((ProjectileSource) entity); + return repeatingFireball; + } + + @EventHandler + public void targetEvent(EliteMobTargetPlayerEvent event) { + if (!(event.getEliteMobEntity().getLivingEntity() instanceof Monster)) return; + AttackFireball attackFireball = (AttackFireball) event.getEliteMobEntity().getPower(this); + if (attackFireball == null) return; + if (attackFireball.isFiring()) return; + + attackFireball.setFiring(true); + repeatingFireballTask((Monster) event.getEntity(), attackFireball); + } + + private void repeatingFireballTask(Monster monster, AttackFireball attackFireball) { + + new BukkitRunnable() { + + @Override + public void run() { + + if (!monster.isValid() || monster.getTarget() == null) { + attackFireball.setFiring(false); + cancel(); + return; + } + + for (Entity nearbyEntity : monster.getNearbyEntities(20, 20, 20)) + if (nearbyEntity instanceof Player && + (((Player) nearbyEntity).getGameMode().equals(GameMode.ADVENTURE) || + ((Player) nearbyEntity).getGameMode().equals(GameMode.SURVIVAL))) + shootFireball(monster, (Player) nearbyEntity); + + } + + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 20L * 8); + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/AttackLightning.java b/src/main/java/com/magmaguy/elitemobs/powers/AttackLightning.java new file mode 100644 index 000000000..bd2b87d3c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/AttackLightning.java @@ -0,0 +1,59 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.collateralminecraftchanges.LightningSpawnBypass; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.MinorPower; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; + +public class AttackLightning extends MinorPower implements Listener { + public AttackLightning() { + super(PowersConfig.getPower("attack_lightning.yml")); + } + + @EventHandler + public void onDamagedEvent(EliteMobDamagedByPlayerEvent event) { + AttackLightning attackLightning = (AttackLightning) event.getEliteMobEntity().getPower(this); + if (attackLightning == null) return; + if (attackLightning.isInGlobalCooldown()) return; + + attackLightning.doGlobalCooldown(20 * PowersConfig.getPower("attack_lightning.yml").getFileConfiguration().getInt("delayBetweenStrikes")); + + attackLightning.setFiring(true); + fireLightning(event.getEliteMobEntity()); + } + + public void fireLightning(EliteEntity eliteEntity) { + for (Entity entity : eliteEntity.getLivingEntity().getLocation().getWorld().getNearbyEntities(eliteEntity.getLivingEntity().getLocation(), 20, 20, 20)) + if (entity.getType().equals(EntityType.PLAYER)) + lightningTask(entity.getLocation().clone()); + } + + public void lightningTask(Location location) { + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + counter++; + if (counter > 20 * 3) { + LightningSpawnBypass.bypass(); + location.getWorld().strikeLightning(location); + cancel(); + return; + } + location.getWorld().spawnParticle(Particle.CRIT, location, 10, 0.5, 1.5, 0.5, 0.3); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/AttackPush.java b/src/main/java/com/magmaguy/elitemobs/powers/AttackPush.java new file mode 100644 index 000000000..edf1b0294 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/AttackPush.java @@ -0,0 +1,35 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.api.PlayerDamagedByEliteMobEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.powers.meta.MinorPower; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +/** + * Created by MagmaGuy on 05/11/2016. + */ +public class AttackPush extends MinorPower implements Listener { + + public AttackPush() { + super(PowersConfig.getPower("attack_push.yml")); + } + + @EventHandler + public void attackPush(PlayerDamagedByEliteMobEvent event) { + if (event.isCancelled()) return; + AttackPush attackPush = (AttackPush) event.getEliteMobEntity().getPower(this); + if (!event.getPlayer().isValid()) return; + if (!event.getEliteMobEntity().isValid()) return; + if (!event.getPlayer().getWorld().equals(event.getEliteMobEntity().getLivingEntity().getWorld())) return; + if (attackPush == null) return; + if (attackPush.isInGlobalCooldown()) return; + + attackPush.doGlobalCooldown(20 * 10); + try { + event.getPlayer().setVelocity(event.getPlayer().getLocation().clone().subtract(event.getEliteMobEntity().getLivingEntity().getLocation()).toVector().normalize().multiply(3)); + } catch (Exception ex) { + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/AttackVacuum.java b/src/main/java/com/magmaguy/elitemobs/powers/AttackVacuum.java new file mode 100644 index 000000000..8e7510877 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/AttackVacuum.java @@ -0,0 +1,30 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.api.PlayerDamagedByEliteMobEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.powers.meta.MinorPower; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class AttackVacuum extends MinorPower implements Listener { + + public AttackVacuum() { + super(PowersConfig.getPower("attack_vacuum.yml")); + } + + @EventHandler + public void onHit(PlayerDamagedByEliteMobEvent event) { + if (event.isCancelled()) return; + AttackVacuum attackVacuum = (AttackVacuum) event.getEliteMobEntity().getPower(this); + if (attackVacuum == null) return; + + if (event.getPlayer().isValid() && event.getEliteMobEntity().isValid() && + event.getPlayer().getWorld().equals(event.getEliteMobEntity().getLivingEntity().getWorld())) + try { + event.getPlayer().setVelocity(event.getEliteMobEntity().getLivingEntity().getLocation().clone().subtract(event.getPlayer().getLocation()).toVector().normalize()); + } catch (Exception ex) { + //sometimes this results in non-finite vectors + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/BonusCoins.java b/src/main/java/com/magmaguy/elitemobs/powers/BonusCoins.java new file mode 100644 index 000000000..387f39857 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/BonusCoins.java @@ -0,0 +1,39 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.api.EliteMobDeathEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.items.ItemLootShower; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.powers.meta.BossPower; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class BonusCoins extends BossPower { + private double coinMultiplier = 2D; + + public BonusCoins() { + super(PowersConfig.getPower("bonus_coins.yml")); + } + + public void setCoinMultiplier(double coinMultiplier) { + this.coinMultiplier = coinMultiplier; + } + + public void doCoinDrop(EliteEntity eliteEntity, Player player) { + new ItemLootShower(eliteEntity.getLevel() * coinMultiplier, eliteEntity.getLevel(), eliteEntity.getUnsyncedLivingEntity().getLocation(), player); + } + + public static class BonusCoinsEvents implements Listener { + @EventHandler + public void onEliteDeath(EliteMobDeathEvent event) { + BonusCoins bonusCoins = (BonusCoins) event.getEliteEntity().getPower("bonus_coins.yml"); + if (bonusCoins == null) return; + for (Player player : event.getEliteEntity().getDamagers().keySet()) + if (!player.hasMetadata("NPC") && PlayerData.isInMemory(player.getUniqueId())) + if (event.getEliteEntity().getDamagers().get(player) / event.getEliteEntity().getMaxHealth() > 0.1) + bonusCoins.doCoinDrop(event.getEliteEntity(), player); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/BonusLoot.java b/src/main/java/com/magmaguy/elitemobs/powers/BonusLoot.java new file mode 100644 index 000000000..62fac4b69 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/BonusLoot.java @@ -0,0 +1,25 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.api.EliteMobDeathEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.items.LootTables; +import com.magmaguy.elitemobs.powers.meta.MinorPower; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +/** + * Created by MagmaGuy on 28/04/2017. + */ +public class BonusLoot extends MinorPower implements Listener { + + public BonusLoot() { + super(PowersConfig.getPower("bonus_loot.yml")); + } + + @EventHandler + public void onDeath(EliteMobDeathEvent event) { + if (!event.getEliteEntity().hasPower(this)) return; + LootTables.generatePlayerLoot(event.getEliteEntity()); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/BulletHell.java b/src/main/java/com/magmaguy/elitemobs/powers/BulletHell.java new file mode 100644 index 000000000..26d0e1bcd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/BulletHell.java @@ -0,0 +1,111 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.api.internal.RemovalReason; +import com.magmaguy.elitemobs.combatsystem.EliteProjectile; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.BossPower; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Particle; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.concurrent.ThreadLocalRandom; + +public class BulletHell extends BossPower implements Listener { + public BulletHell() { + super(PowersConfig.getPower("bullet_hell.yml")); + } + + private static void trackingArrowLoop(Player player, Arrow arrow) { + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + if (player.isValid() && !player.isDead() && arrow.isValid() && arrow.getWorld().equals(player.getWorld()) + && player.getLocation().distanceSquared(arrow.getLocation()) < 900 && !arrow.isOnGround()) { + if (counter % 10 == 0) + arrow.setVelocity(arrow.getVelocity().add(arrowAdjustmentVector(arrow, player))); + arrow.getWorld().spawnParticle(Particle.FLAME, arrow.getLocation(), 10, 0.01, 0.01, 0.01, 0.01); + } else { + arrow.setGravity(true); + EntityTracker.unregister(arrow, RemovalReason.EFFECT_TIMEOUT); + cancel(); + } + if (counter > 20 * 10) { + EntityTracker.unregister(arrow, RemovalReason.EFFECT_TIMEOUT); + arrow.setGravity(true); + cancel(); + } + counter++; + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + private static Vector arrowAdjustmentVector(Arrow arrow, Player player) { + return player.getEyeLocation().clone().subtract(new Vector(0, 0.5, 0)).subtract(arrow.getLocation()).toVector().normalize().multiply(0.1); + } + + @EventHandler + public void onDamage(EliteMobDamagedByPlayerEvent event) { + BulletHell bulletHell = (BulletHell) event.getEliteMobEntity().getPower(this); + if (bulletHell == null) return; + if (!eventIsValid(event, bulletHell)) return; + if (ThreadLocalRandom.current().nextDouble() > 0.25) return; + + bulletHell.doGlobalCooldown(20 * 20, event.getEliteMobEntity()); + doBulletHell(event.getEliteMobEntity()); + + } + + public void doBulletHell(EliteEntity eliteEntity) { + eliteEntity.getLivingEntity().setAI(false); + if (eliteEntity.getLivingEntity().getLocation().clone().add(new Vector(0, 10, 0)).getBlock().getType().equals(Material.AIR)) + eliteEntity.getLivingEntity().teleport(eliteEntity.getLivingEntity().getLocation().clone().add(new Vector(0, 10, 0))); + new BukkitRunnable() { + final Location initialLocation = eliteEntity.getLivingEntity().getLocation().clone(); + int counter = 0; + + @Override + public void run() { + + if (!eliteEntity.isValid()) { + cancel(); + return; + } + + eliteEntity.getLivingEntity().getWorld().spawnParticle(Particle.DRIPPING_WATER, eliteEntity.getLivingEntity().getLocation(), 10, 1, 1, 1); + + for (Entity nearbyEntity : eliteEntity.getLivingEntity().getNearbyEntities(20, 20, 20)) + if (nearbyEntity instanceof Player && + (((Player) nearbyEntity).getGameMode().equals(GameMode.ADVENTURE) || + ((Player) nearbyEntity).getGameMode().equals(GameMode.SURVIVAL))) { + Arrow arrow = (Arrow) EliteProjectile.create(EntityType.ARROW, eliteEntity.getLivingEntity(), (Player) nearbyEntity, false); + arrow.setVelocity(arrow.getVelocity().multiply(0.1)); + trackingArrowLoop((Player) nearbyEntity, arrow); + } + + counter++; + if (counter > 20) { + cancel(); + eliteEntity.getLivingEntity().setAI(true); + eliteEntity.getLivingEntity().teleport(initialLocation); + } + + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 10); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/ChannelHealing.java b/src/main/java/com/magmaguy/elitemobs/powers/ChannelHealing.java new file mode 100644 index 000000000..45fe68731 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/ChannelHealing.java @@ -0,0 +1,98 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.CombatEnterScanPower; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.Entity; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + + +public class ChannelHealing extends CombatEnterScanPower { + public ChannelHealing() { + super(PowersConfig.getPower("channel_healing.yml")); + } + + @Override + protected void finishActivation(EliteEntity eliteEntity) { + super.bukkitTask = new BukkitRunnable() { + + @Override + public void run() { + if (doExit(eliteEntity) || isInCooldown(eliteEntity)) { + return; + } + doPower(eliteEntity); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 20 * 2); + } + + private void doPower(EliteEntity eliteEntity) { + for (Entity entity : eliteEntity.getLivingEntity().getNearbyEntities(20, 20, 20)) { + EliteEntity parsedEntity = EntityTracker.getEliteMobEntity(entity); + if (parsedEntity == null) continue; + if (parsedEntity.getHealth() / parsedEntity.getMaxHealth() > .8) continue; + if (parsedEntity.isHealing()) continue; + channelHealing(eliteEntity, parsedEntity); + return; + } + + } + + private void channelHealing(EliteEntity healer, EliteEntity damagedEntity) { + super.setInCooldown(healer, true); + healer.getLivingEntity().setAI(false); + damagedEntity.setHealing(true); + new BukkitRunnable() { + int timer = 0; + + @Override + public void run() { + if (!healer.isValid() || + !damagedEntity.isValid() || + damagedEntity.getHealth() / damagedEntity.getMaxHealth() > .8 || + healer.getLocation().distance(damagedEntity.getLocation()) > 25) { + cancel(); + setInCooldown(healer, false); + doCooldown(healer); + damagedEntity.setHealing(false); + if (healer.isValid()) + healer.getLivingEntity().setAI(true); + return; + } + + if (timer % 10 == 0 && timer > 0) { + double healAmount = healer.getLevel() / 2d; + damagedEntity.heal(healAmount); + damagedEntity.getLocation().getWorld().spawnParticle(Particle.TOTEM_OF_UNDYING, damagedEntity.getLocation().add(new Vector(0, 1, 0)), 20, 0.1, 0.1, 0.1); + } + + Vector toDamaged = damagedEntity.getLocation().add(new Vector(0, 1, 0)) + .subtract(healer.getLocation().add(new Vector(0, 1, 0))) + .toVector().normalize().multiply(.5); + + Location rayLocation = healer.getLocation().add(new Vector(0, 1, 0)).add(toDamaged); + + for (int i = 0; i < 55; i++) { + rayLocation.getWorld().spawnParticle(Particle.TOTEM_OF_UNDYING, rayLocation, 1, toDamaged.getX(), toDamaged.getY(), toDamaged.getZ(), .2D); + rayLocation.add(toDamaged); + if (rayLocation.distance(damagedEntity.getLocation()) < 2) + break; + } + + timer++; + + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0L, 2L); + } + + @Override + protected void finishDeactivation(EliteEntity eliteEntity) { + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/DeathSlice.java b/src/main/java/com/magmaguy/elitemobs/powers/DeathSlice.java new file mode 100644 index 000000000..119a42430 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/DeathSlice.java @@ -0,0 +1,97 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.events.BossCustomAttackDamage; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.BossPower; +import com.magmaguy.elitemobs.powerstances.GenericRotationMatrixMath; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.concurrent.ThreadLocalRandom; + +public class DeathSlice extends BossPower implements Listener { + + public DeathSlice() { + super(PowersConfig.getPower("death_slice.yml")); + } + + private static void doDeathSlice(EliteEntity eliteEntity) { + ArrayList locations = raytracedLocationList(eliteEntity.getLivingEntity().getLocation()); + eliteEntity.getLivingEntity().setAI(false); + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + if (counter > 20 * 5 || !eliteEntity.isValid()) { + if (eliteEntity.getLivingEntity() != null) + eliteEntity.getLivingEntity().setAI(true); + cancel(); + return; + } + + if (counter < 20 * 2.5) { + for (Location location : locations) + doWarningParticle(location); + } else { + for (Location location : locations) + doDamagePhase(location, eliteEntity); + } + + counter++; + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 2); + + } + + private static ArrayList raytracedLocationList(Location originalLocation) { + ArrayList locations = new ArrayList<>(); + int safeSide = ThreadLocalRandom.current().nextInt(16); + for (int i = 0; i < 15; i++) + for (int j = 0; j < 16; j++) + for (int k = 0; k < 2; k++) { + if (safeSide == j) + continue; + locations.add(originalLocation.clone().add(GenericRotationMatrixMath.applyRotation(0, 1, 0, 16, i, 0, 0, j)).add(new Vector(0, k, 0))); + } + + return locations; + } + + private static void doWarningParticle(Location location) { + if (ThreadLocalRandom.current().nextDouble() < 0.3) + location.getWorld().spawnParticle(Particle.LARGE_SMOKE, location, 1, 0.05, 0.05, 0.05, 0.05); + } + + private static void doDamagePhase(Location location, EliteEntity eliteEntity) { + if (ThreadLocalRandom.current().nextDouble() < 0.3) + location.getWorld().spawnParticle(Particle.FLAME, location, 1, 0.1, 0.1, 0.1, 0.05); + for (Entity entity : location.getWorld().getNearbyEntities(location, 0.5, 0.5, 0.5)) + if (entity instanceof LivingEntity && !EntityTracker.isEliteMob(entity)) + BossCustomAttackDamage.dealCustomDamage(eliteEntity.getLivingEntity(), (LivingEntity) entity, 1); + } + + @EventHandler + public void onEliteDamaged(EliteMobDamagedByPlayerEvent event) { + DeathSlice deathSlice = (DeathSlice) event.getEliteMobEntity().getPower(this); + if (deathSlice == null) return; + if (deathSlice.isInGlobalCooldown()) return; + + if (ThreadLocalRandom.current().nextDouble() > 0.10) return; + deathSlice.doGlobalCooldown(20 * 20); + + doDeathSlice(event.getEliteMobEntity()); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonAimedFireball.java b/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonAimedFireball.java new file mode 100644 index 000000000..dcb4649d4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonAimedFireball.java @@ -0,0 +1,32 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.Bombardment; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Fireball; + +public class EnderDragonAimedFireball extends Bombardment { + + public EnderDragonAimedFireball() { + super(PowersConfig.getPower("ender_dragon_aimed_fireball.yml")); + } + + @Override + public void taskBehavior(EliteEntity eliteEntity) { + if (super.firingTimer % 20 != 0) + return; + for (Entity entity : eliteEntity.getLivingEntity().getNearbyEntities(200, 100, 200)) + if (entity.getType().equals(EntityType.PLAYER)) { + Fireball fireball = ((Fireball) eliteEntity.getLivingEntity().getWorld().spawnEntity( + eliteEntity.getLivingEntity().getLocation(), + EntityType.FIREBALL)); + fireball.setDirection(entity.getLocation().clone().subtract(eliteEntity.getLivingEntity().getLocation()).toVector().normalize()); + fireball.setYield(5F); + EntityTracker.registerProjectileEntity(fireball); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonArrowBombardment.java b/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonArrowBombardment.java new file mode 100644 index 000000000..85274e8e8 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonArrowBombardment.java @@ -0,0 +1,45 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.combatsystem.EliteProjectile; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.Bombardment; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Projectile; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.concurrent.ThreadLocalRandom; + +public class EnderDragonArrowBombardment extends Bombardment { + + public EnderDragonArrowBombardment() { + super(PowersConfig.getPower("ender_dragon_arrow_bombardment.yml")); + } + + @Override + public void taskBehavior(EliteEntity eliteEntity) { + for (Entity entity : eliteEntity.getLivingEntity().getNearbyEntities(200, 100, 200)) + + if (entity.getType().equals(EntityType.PLAYER)) { + Vector shotVector = entity.getLocation().clone().add(new Vector(0, 1, 0)) + .subtract(eliteEntity.getLivingEntity().getLocation().clone()) + .add(new Vector(ThreadLocalRandom.current().nextDouble() - 0.5, + ThreadLocalRandom.current().nextDouble() - 0.5, + ThreadLocalRandom.current().nextDouble() - 0.5)) + .toVector().normalize().multiply(2); + + Projectile arrow = EliteProjectile.create(EntityType.ARROW, eliteEntity.getLivingEntity(), shotVector, false); + + //anti-lag measure, culls arrows after 4 seconds + new BukkitRunnable() { + @Override + public void run() { + arrow.remove(); + } + }.runTaskLater(MetadataHandler.PLUGIN, 20L * 4); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonDiscoFireballs.java b/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonDiscoFireballs.java new file mode 100644 index 000000000..68136c38c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonDiscoFireballs.java @@ -0,0 +1,164 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.combatsystem.EliteProjectile; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.CombatEnterScanPower; +import com.magmaguy.elitemobs.utils.EnderDragonPhaseSimplifier; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.EnderDragon; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Fireball; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.concurrent.ThreadLocalRandom; + +public class EnderDragonDiscoFireballs extends CombatEnterScanPower { + + int randomTiltSeed; + private ArrayList relativeLocationOffsets; + private ArrayList realLocations = new ArrayList<>(); + private int warningCounter = 0; + private ArrayList fireballs = new ArrayList<>(); + + public EnderDragonDiscoFireballs() { + super(PowersConfig.getPower("ender_dragon_disco_fireballs.yml")); + } + + @Override + protected void finishActivation(EliteEntity eliteEntity) { + super.bukkitTask = new BukkitRunnable() { + @Override + public void run() { + if (doExit(eliteEntity) || isInCooldown(eliteEntity)) { + return; + } + + if (eliteEntity.getLivingEntity().getType().equals(EntityType.ENDER_DRAGON)) + if (!EnderDragonPhaseSimplifier.isLanded(((EnderDragon) eliteEntity.getLivingEntity()).getPhase())) + return; + + doPower(eliteEntity); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 10); + } + + @Override + protected void finishDeactivation(EliteEntity eliteEntity) { + + } + + private void doPower(EliteEntity eliteEntity) { + doCooldown(eliteEntity); + + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + + if (doExit(eliteEntity) || + eliteEntity.getLivingEntity().getType().equals(EntityType.ENDER_DRAGON) && + !EnderDragonPhaseSimplifier.isLanded(((EnderDragon) eliteEntity.getLivingEntity()).getPhase())) { + cancel(); + return; + } + + if (eliteEntity.getLivingEntity().getType().equals(EntityType.ENDER_DRAGON)) + ((EnderDragon) eliteEntity.getLivingEntity()).setPhase(EnderDragon.Phase.SEARCH_FOR_BREATH_ATTACK_TARGET); + + if (counter == 0) { + //todo: reset fields if needed + generateLocations(); + commitLocations(eliteEntity); + randomTiltSeed = ThreadLocalRandom.current().nextInt(); + warningCounter = 0; + } + + if (counter < 20 * 6) { + //todo: warning phase + doWarningPhase(eliteEntity); + warningCounter++; + } + + if (counter > 20 * 6) { + doDamagePhase(eliteEntity); + cancel(); + } + + counter++; + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + private void generateLocations() { + relativeLocationOffsets = new ArrayList<>(); + for (int i = 0; i < 12; i++) + relativeLocationOffsets.add(new Vector(7, 0, 0).rotateAroundY(2D * Math.PI / 12D * i)); + } + + private void commitLocations(EliteEntity eliteEntity) { + realLocations = new ArrayList<>(); + for (Vector vector : relativeLocationOffsets) + realLocations.add(eliteEntity.getLivingEntity().getLocation().clone().add(vector)); + } + + private void doWarningPhase(EliteEntity eliteEntity) { + //spawn fireballs and start rotation + if (warningCounter == 0) { + fireballs = new ArrayList<>(); + for (Location location : realLocations) { + Fireball fireball = (Fireball) location.getWorld().spawnEntity(location, EntityType.FIREBALL); + EntityTracker.registerProjectileEntity(fireball); + EliteProjectile.signExplosiveWithPower(fireball, getFileName()); + fireballs.add(fireball); + } + } + + warningCounter++; + + for (Fireball fireball : fireballs) { + if (fireball.isValid()) { + + if (warningCounter % 5 == 0) { + Vector relativeLocation = fireball.getLocation().clone().subtract(eliteEntity.getLivingEntity().getLocation()) + .toVector().rotateAroundY(2D * Math.PI / 96D); + Location rotatedLocation = eliteEntity.getLivingEntity().getLocation().clone().add(relativeLocation); + Vector velocity = rotatedLocation.clone().subtract(fireball.getLocation()).toVector().multiply(0.001); + fireball.setDirection(velocity); + fireball.setVelocity(velocity); + fireball.setYield(5F); + } + + generateVisualParticles(eliteEntity, fireball); + } + } + + } + + private void doDamagePhase(EliteEntity eliteEntity) { + for (Fireball fireball : fireballs) + fireball.setDirection(generateDownwardsVector(eliteEntity, fireball).multiply(0.1)); + } + + private Vector generateDownwardsVector(EliteEntity eliteEntity, Fireball fireball) { + double yValue = Math.cos(warningCounter) / 2 - 0.5; + return fireball.getLocation().clone().subtract(eliteEntity.getLivingEntity().getLocation()).toVector().normalize().setY(yValue); + } + + private void generateVisualParticles(EliteEntity eliteEntity, Fireball fireball) { + Vector downwardsVector = generateDownwardsVector(eliteEntity, fireball); + Location particleLocation = fireball.getLocation().clone(); + for (int i = 0; i < 200; i++) { + particleLocation.add(downwardsVector.clone().multiply(0.3)); + if (!particleLocation.getBlock().isPassable()) break; + fireball.getWorld().spawnParticle(Particle.SMOKE, particleLocation, 1, 1, 0, 0, 0); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonEmpoweredLightning.java b/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonEmpoweredLightning.java new file mode 100644 index 000000000..051b77401 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonEmpoweredLightning.java @@ -0,0 +1,138 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobEnterCombatEvent; +import com.magmaguy.elitemobs.api.EliteMobExitCombatEvent; +import com.magmaguy.elitemobs.collateralminecraftchanges.LightningSpawnBypass; +import com.magmaguy.elitemobs.combatsystem.EliteProjectile; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.MajorPower; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Fireball; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; +import org.bukkit.util.Vector; + +import java.util.concurrent.ThreadLocalRandom; + +public class EnderDragonEmpoweredLightning extends MajorPower { + + private boolean isActive = false; + private BukkitTask bukkitTask = null; + + public EnderDragonEmpoweredLightning() { + super(PowersConfig.getPower("ender_dragon_empowered_lightning.yml")); + } + + public static void lightningTask(Location location) { + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + counter++; + if (counter > 20 * 3) { + LightningSpawnBypass.bypass(); + location.getWorld().strikeLightning(location); + Fireball fireball = (Fireball) location.getWorld().spawnEntity(location, EntityType.FIREBALL); + EntityTracker.registerProjectileEntity(fireball); + fireball.setDirection(new Vector(0, -3, 0)); + fireball.setVelocity(new Vector(0, -3, 0)); + fireball.setYield(5F); + EliteProjectile.signExplosiveWithPower(fireball, "ender_dragon_empowered_lightning.yml"); + cancel(); + return; + } + location.getWorld().spawnParticle(Particle.SOUL_FIRE_FLAME, location, 10, 0.5, 1.5, 0.5, 0.3); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + + } + + private void activate(EliteEntity eliteEntity) { + if (isActive) + return; + + isActive = true; + + bukkitTask = new BukkitRunnable() { + @Override + public void run() { + if (!eliteEntity.isValid()) { + cancel(); + return; + } + if (isInCooldown(eliteEntity)) return; + fireLightning(eliteEntity); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 20); + + } + + private void deactivate() { + isActive = false; + if (bukkitTask != null) + bukkitTask.cancel(); + } + + public void fireLightning(EliteEntity eliteEntity) { + + doCooldown(eliteEntity); + + for (Entity entity : eliteEntity.getLivingEntity().getLocation().getWorld().getNearbyEntities(eliteEntity.getLivingEntity().getLocation(), 150, 150, 150)) + if (entity.getType().equals(EntityType.PLAYER)) + lightningTask(entity.getLocation().clone()); + + for (int i = 0; i < 50; i++) { + Location randomLocation = locationRandomizer(eliteEntity.getLivingEntity().getLocation(), 0); + if (randomLocation == null) continue; + + new BukkitRunnable() { + @Override + public void run() { + lightningTask(randomLocation); + } + }.runTaskLater(MetadataHandler.PLUGIN, ThreadLocalRandom.current().nextInt(20 * 5)); + + } + } + + private Location locationRandomizer(Location location, int counter) { + if (counter > 5) return null; + Location randomLocation = location.clone().add(new Vector( + ThreadLocalRandom.current().nextInt(-150, 150), + 0, + ThreadLocalRandom.current().nextInt(-150, 150))); + + randomLocation.setY(randomLocation.getWorld().getHighestBlockAt(randomLocation).getY()); + if (randomLocation.getY() == -1) + locationRandomizer(location, counter + 1); + + return randomLocation; + } + + public static class EnderDragonEmpoweredLightningEvents implements Listener { + @EventHandler + public void onCombatEnter(EliteMobEnterCombatEvent event) { + EnderDragonEmpoweredLightning empoweredLightning = (EnderDragonEmpoweredLightning) event.getEliteMobEntity().getPower("ender_dragon_empowered_lightning.yml"); + if (empoweredLightning == null) return; + empoweredLightning.activate(event.getEliteMobEntity()); + } + + @EventHandler + public void onCombatLeave(EliteMobExitCombatEvent event) { + EnderDragonEmpoweredLightning empoweredLightning = (EnderDragonEmpoweredLightning) event.getEliteMobEntity().getPower("ender_dragon_empowered_lightning.yml"); + if (empoweredLightning == null) return; + empoweredLightning.deactivate(); + } + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonEnderFireballBombardment.java b/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonEnderFireballBombardment.java new file mode 100644 index 000000000..386cd3648 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonEnderFireballBombardment.java @@ -0,0 +1,29 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.Bombardment; +import org.bukkit.entity.DragonFireball; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; + +import java.util.concurrent.ThreadLocalRandom; + +public class EnderDragonEnderFireballBombardment extends Bombardment { + + public EnderDragonEnderFireballBombardment() { + super(PowersConfig.getPower("ender_dragon_ender_fireball_bombardment.yml")); + } + + @Override + public void taskBehavior(EliteEntity eliteEntity) { + if (ThreadLocalRandom.current().nextDouble() > 0.1) return; + for (Entity entity : eliteEntity.getLivingEntity().getNearbyEntities(200, 100, 200)) + if (entity.getType().equals(EntityType.PLAYER)) + ((DragonFireball) eliteEntity.getLivingEntity().getWorld().spawnEntity( + eliteEntity.getLivingEntity().getLocation(), + EntityType.DRAGON_FIREBALL)).setDirection( + entity.getLocation().clone().subtract(eliteEntity.getLivingEntity().getLocation()).toVector().normalize()); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonEndermiteBombardment.java b/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonEndermiteBombardment.java new file mode 100644 index 000000000..dd4ca1352 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonEndermiteBombardment.java @@ -0,0 +1,47 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.powers.meta.Bombardment; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.util.Vector; + +public class EnderDragonEndermiteBombardment extends Bombardment { + public EnderDragonEndermiteBombardment() { + super(PowersConfig.getPower("ender_dragon_endermite_bombardment.yml")); + } + + @Override + public void taskBehavior(EliteEntity eliteEntity) { + try { + + Vector direction = eliteEntity.getLivingEntity().getLocation().getDirection(); + + float rotation = (float) (Math.atan2(direction.getX(), direction.getZ()) * 180 / Math.PI); + + Vector direction1 = new Vector(1, -4, 0); + Vector direction2 = new Vector(-1, -4, 0); + + direction1 = direction1.rotateAroundY(rotation); + direction2 = direction2.rotateAroundY(rotation); + + + CustomBossEntity customBossEntity1 = CustomBossEntity.createCustomBossEntity("binder_of_worlds_phase_1_endermite_reinforcement.yml"); + customBossEntity1.spawn(eliteEntity.getLivingEntity().getLocation().clone().add(direction1), false); + customBossEntity1.getLivingEntity().addPotionEffect(new PotionEffect(PotionEffectType.SLOW_FALLING, 20 * 5, 0)); + eliteEntity.addReinforcement(customBossEntity1); + + CustomBossEntity customBossEntity2 = CustomBossEntity.createCustomBossEntity("binder_of_worlds_phase_1_endermite_reinforcement.yml"); + customBossEntity2.spawn(eliteEntity.getLivingEntity().getLocation().clone().add(direction2), false); + customBossEntity2.getLivingEntity().addPotionEffect(new PotionEffect(PotionEffectType.SLOW_FALLING, 20 * 5, 0)); + eliteEntity.addReinforcement(customBossEntity2); + + } catch (Exception ex) { + Logger.warn("Failed to spawn binder of world's reinforcement endermite!"); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonFireballBombardment.java b/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonFireballBombardment.java new file mode 100644 index 000000000..11c85e2e1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonFireballBombardment.java @@ -0,0 +1,44 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.Bombardment; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Fireball; +import org.bukkit.util.Vector; + +public class EnderDragonFireballBombardment extends Bombardment { + public EnderDragonFireballBombardment() { + super(PowersConfig.getPower("ender_dragon_fireball_bombardment.yml")); + } + + @Override + public void taskBehavior(EliteEntity eliteEntity) { + if (super.firingTimer % 10 != 0) + return; + + Vector direction = eliteEntity.getLivingEntity().getLocation().getDirection(); + + float rotation = (float) (Math.atan2(direction.getX(), direction.getZ()) * 180 / Math.PI); + + Vector direction1 = new Vector(3, -4, 0); + Vector direction2 = new Vector(-3, -4, 0); + + direction1 = direction1.rotateAroundY(rotation); + direction2 = direction2.rotateAroundY(rotation); + + generateFireball(eliteEntity, direction1); + generateFireball(eliteEntity, direction2); + } + + private void generateFireball(EliteEntity eliteEntity, Vector vector) { + Fireball fireball = ((Fireball) eliteEntity.getLivingEntity().getWorld().spawnEntity( + eliteEntity.getLivingEntity().getLocation().clone().add(vector), + EntityType.FIREBALL)); + fireball.setDirection(new Vector(0, -0.1, 0)); + fireball.setYield(5F); + EntityTracker.registerProjectileEntity(fireball); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonPotionBombardment.java b/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonPotionBombardment.java new file mode 100644 index 000000000..e378e2674 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonPotionBombardment.java @@ -0,0 +1,54 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.Bombardment; +import org.bukkit.Material; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.ThrownPotion; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.PotionMeta; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.util.Vector; + +import java.util.concurrent.ThreadLocalRandom; + + +public class EnderDragonPotionBombardment extends Bombardment { + + public EnderDragonPotionBombardment() { + super(PowersConfig.getPower("ender_dragon_potion_bombardment.yml")); + } + + @Override + public void taskBehavior(EliteEntity eliteEntity) { + for (int i = 0; i < 5; i++) { + + ItemStack itemStack = new ItemStack(Material.SPLASH_POTION); + PotionMeta potionMeta = (PotionMeta) itemStack.getItemMeta(); + if (ThreadLocalRandom.current().nextBoolean()) + potionMeta.addCustomEffect(new PotionEffect(PotionEffectType.STRENGTH, 0, 1), true); + else potionMeta.addCustomEffect(new PotionEffect(PotionEffectType.SLOWNESS, 0, 1), true); + + itemStack.setItemMeta(potionMeta); + + + ThrownPotion thrownPotion = (ThrownPotion) eliteEntity.getLivingEntity().getWorld().spawnEntity( + eliteEntity.getLivingEntity().getLocation().clone().subtract( + new Vector(ThreadLocalRandom.current().nextInt(-1, 1), + 1, + ThreadLocalRandom.current().nextInt(-1, 1))) + , EntityType.POTION); + + thrownPotion.setItem(itemStack); + + thrownPotion.setVelocity( + new Vector(ThreadLocalRandom.current().nextDouble() - 0.5, + 0, + ThreadLocalRandom.current().nextDouble() - 0.5)); + + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonShockwave.java b/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonShockwave.java new file mode 100644 index 000000000..f8ec5b57f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonShockwave.java @@ -0,0 +1,209 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.events.BossCustomAttackDamage; +import com.magmaguy.elitemobs.explosionregen.Explosion; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.CombatEnterScanPower; +import com.magmaguy.elitemobs.utils.EnderDragonPhaseSimplifier; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.block.Block; +import org.bukkit.entity.EnderDragon; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.BoundingBox; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class EnderDragonShockwave extends CombatEnterScanPower { + + private final int radius = 30; + //this is structured like this because the relative block generator is moving out of this class + private final ArrayList realBlocks = new ArrayList<>(); + private ArrayList pieBlocks = new ArrayList<>(); + private int warningPhaseCounter = 0; + private int damagePhaseCounter = 0; + + public EnderDragonShockwave() { + super(PowersConfig.getPower("ender_dragon_shockwave.yml")); + } + + @Override + protected void finishActivation(EliteEntity eliteEntity) { + super.bukkitTask = new BukkitRunnable() { + + @Override + public void run() { + if (doExit(eliteEntity) || isInCooldown(eliteEntity)) { + return; + } + + if (eliteEntity.getLivingEntity().getType().equals(EntityType.ENDER_DRAGON)) { + EnderDragon.Phase phase = ((EnderDragon) eliteEntity.getLivingEntity()).getPhase(); + if (!EnderDragonPhaseSimplifier.isLanded(phase)) return; + } + + doPower(eliteEntity); + + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 10); + } + + private void doPower(EliteEntity eliteEntity) { + doCooldown(eliteEntity); + + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + + if (eliteEntity.isValid()) + if (eliteEntity.getLivingEntity().getType().equals(EntityType.ENDER_DRAGON)) + ((EnderDragon) eliteEntity.getLivingEntity()).setPhase(EnderDragon.Phase.SEARCH_FOR_BREATH_ATTACK_TARGET); + + if (doExit(eliteEntity) || eliteEntity.getLivingEntity().getType().equals(EntityType.ENDER_DRAGON) && + !EnderDragonPhaseSimplifier.isLanded(((EnderDragon) eliteEntity.getLivingEntity()).getPhase())) { + cancel(); + return; + } + + if (counter == 0) { + setAffectedBlocks(); + generateRealCircle(eliteEntity); + warningPhaseCounter = 0; + damagePhaseCounter = 0; + } + + if (counter < 20 * 3) { + doWarningPhase(eliteEntity); + } + + if (counter > 20 * 3) { + doDamagePhase(eliteEntity); + } + + if (counter >= 20 * (3 + 6)) { + cancel(); + } + + counter++; + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + //todo: move this to its own class, make sure it only generates once ever and then just randomizes rotations + private void setAffectedBlocks() { + pieBlocks = new ArrayList<>(); + double rotation = ThreadLocalRandom.current().nextDouble(2); + Vector relative0 = new Vector(0, 0, 0); + for (int x = -radius; x < radius; x++) + for (int z = -radius; z < radius; z++) { + if (x > 0 && z > 0) continue; + double distance = relative0.distance(new Vector(x, 0, z)); + if (distance > radius) continue; + + pieBlocks.add(new PieBlock((int) Math.ceil(distance), new Vector(x, 0, z).rotateAroundY(rotation))); + } + + } + + private void generateRealCircle(EliteEntity eliteEntity) { + for (PieBlock pieBlock : pieBlocks) { + Location rawPieBlock = eliteEntity.getLivingEntity().getLocation().clone().add(pieBlock.vector); + for (int y = 0; y > -10; y--) { + Location tempLocation = rawPieBlock.clone(); + tempLocation.setY(rawPieBlock.getY() + y); + if (!tempLocation.getBlock().isPassable()) { + Vector newVector = pieBlock.vector.clone(); + newVector.setY(newVector.getY() + y); + realBlocks.add(new PieBlock(pieBlock.distance, newVector)); + break; + } + } + } + + } + + private void doWarningPhase(EliteEntity eliteEntity) { + + Iterator pieBlockIterator = ((ArrayList) realBlocks.clone()).iterator(); + + while (pieBlockIterator.hasNext()) { + PieBlock pieBlock = pieBlockIterator.next(); + if (pieBlock.distance < warningPhaseCounter) { + Location rawPieBlock = eliteEntity.getLivingEntity().getLocation().clone().add(pieBlock.vector); + + pieBlockIterator.remove(); + + if (rawPieBlock.getBlock().isPassable()) + continue; + + rawPieBlock.getWorld().spawnParticle(Particle.SOUL, rawPieBlock.clone().add(0.5, 1, 0.5), 1, 0.1, 0.1, 0.1, 0.1); + } + } + + warningPhaseCounter++; + + } + + private void doDamagePhase(EliteEntity eliteEntity) { + List blockList = new ArrayList<>(); + Iterator pieBlockIterator = realBlocks.iterator(); + while (pieBlockIterator.hasNext()) { + if (eliteEntity.getLivingEntity() == null) return; + PieBlock pieBlock = pieBlockIterator.next(); + + if (pieBlock.distance < damagePhaseCounter) { + Location rawPieBlock = eliteEntity.getLivingEntity().getLocation().clone().add(pieBlock.vector); + + if (rawPieBlock.getBlock().isPassable()) continue; + + for (Entity entity : rawPieBlock.getWorld().getNearbyEntities( + new BoundingBox(rawPieBlock.getX(), rawPieBlock.getY(), rawPieBlock.getZ(), + rawPieBlock.getX() + 1, rawPieBlock.getY() + 3, rawPieBlock.getZ() + 1))) { + if (entity.getType().equals(EntityType.FALLING_BLOCK)) continue; + entity.setVelocity(entity.getLocation().clone().subtract(eliteEntity.getLivingEntity().getLocation()).toVector().setY(1).normalize().multiply(3)); + if (entity.getType().equals(EntityType.PLAYER)) + BossCustomAttackDamage.dealCustomDamage(eliteEntity.getLivingEntity(), (LivingEntity) entity, 20); + } + + if (rawPieBlock.getBlock().getType().getBlastResistance() >= 7) + continue; + + blockList.add(rawPieBlock.getBlock()); + pieBlockIterator.remove(); + + } + } + + damagePhaseCounter++; + + Explosion.generateFakeExplosion(blockList, eliteEntity.getLivingEntity()); + + } + + @Override + protected void finishDeactivation(EliteEntity eliteEntity) { + + } + + private class PieBlock { + public Integer distance; + public Vector vector; + + public PieBlock(Integer distance, Vector vector) { + this.distance = distance; + this.vector = vector; + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonTornado.java b/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonTornado.java new file mode 100644 index 000000000..2275bd811 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/EnderDragonTornado.java @@ -0,0 +1,142 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.explosionregen.Explosion; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.CombatEnterScanPower; +import com.magmaguy.elitemobs.utils.EnderDragonPhaseSimplifier; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.block.Block; +import org.bukkit.entity.EnderDragon; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class EnderDragonTornado extends CombatEnterScanPower { + + private Location tornadoEye = null; + private Vector tornadoSpeed = null; + + public EnderDragonTornado() { + super(PowersConfig.getPower("ender_dragon_tornado.yml")); + } + + @Override + protected void finishActivation(EliteEntity eliteEntity) { + super.bukkitTask = new BukkitRunnable() { + + @Override + public void run() { + if (doExit(eliteEntity) || isInCooldown(eliteEntity)) { + return; + } + + if (eliteEntity.getLivingEntity().getType().equals(EntityType.ENDER_DRAGON)) { + EnderDragon.Phase phase = ((EnderDragon) eliteEntity.getLivingEntity()).getPhase(); + if (!EnderDragonPhaseSimplifier.isLanded(phase)) return; + } + + doPower(eliteEntity); + + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 10); + } + + private void doPower(EliteEntity eliteEntity) { + doCooldown(eliteEntity); + + tornadoEye = eliteEntity.getLivingEntity().getLocation().clone().add(new Vector(6, -6, 0)) + .toVector().rotateAroundY(ThreadLocalRandom.current().nextDouble(0, 2 * Math.PI)) + .toLocation(eliteEntity.getLivingEntity().getWorld()); + + tornadoSpeed = tornadoEye.clone().subtract(eliteEntity.getLivingEntity().getLocation()).toVector().setY(0).normalize().multiply(0.2); + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + + if (!eliteEntity.isValid()) { + cancel(); + return; + } + + if (eliteEntity.getLivingEntity().getType().equals(EntityType.ENDER_DRAGON)) + ((EnderDragon) eliteEntity.getLivingEntity()).setPhase(EnderDragon.Phase.SEARCH_FOR_BREATH_ATTACK_TARGET); + + if (doExit(eliteEntity) || eliteEntity.getLivingEntity().getType().equals(EntityType.ENDER_DRAGON) && !EnderDragonPhaseSimplifier.isLanded(((EnderDragon) eliteEntity.getLivingEntity()).getPhase())) { + cancel(); + return; + } + + tornadoEye.add(tornadoSpeed); + + if (counter % 2 == 0) { + doTornadoParticles(); + doTerrainDestruction(eliteEntity); + doEntityDisplacement(eliteEntity.getLivingEntity()); + } + + if (counter > 20 * 6) { + cancel(); + } + + counter++; + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + private void doTornadoParticles() { + for (int i = 0; i < 21; i++) + for (int x = 0; x < (i ^ 2 + 1); x++) { + Location randomParticleLocation = tornadoEye.clone().add((new Vector(i / 2, i, 0)) + .rotateAroundY(ThreadLocalRandom.current().nextDouble(2 * Math.PI))); + randomParticleLocation.setDirection(randomParticleLocation.toVector().rotateAroundY(0.5 * Math.PI)); + if (ThreadLocalRandom.current().nextDouble() < 0.7) + tornadoEye.getWorld().spawnParticle(Particle.LARGE_SMOKE, randomParticleLocation, 1, 0, 0, 0, 0.05); + else + tornadoEye.getWorld().spawnParticle(Particle.SOUL_FIRE_FLAME, randomParticleLocation, 1, 0, 0, 0, 0.05); + } + } + + private void doTerrainDestruction(EliteEntity eliteEntity) { + List blockList = new ArrayList<>(); + for (int i = 0; i < 5; i++) { + Location location = tornadoEye.clone().add(new Vector( + ThreadLocalRandom.current().nextInt(-5, 5), + 0, + ThreadLocalRandom.current().nextInt(-5, 5))); + Block block = location.getWorld().getHighestBlockAt(location); + if (block.getType().getBlastResistance() > 7) continue; + if (block.getLocation().getY() != -1) + blockList.add(block); + } + Explosion.generateFakeExplosion(blockList, eliteEntity.getLivingEntity(), (PowersConfigFields) getPowersConfigFields(), tornadoEye.clone()); + } + + private void doEntityDisplacement(LivingEntity sourceEntity) { + for (Entity entity : tornadoEye.getWorld().getNearbyEntities(tornadoEye, 7, 21, 7)) + if (entity instanceof LivingEntity) { + if (entity.equals(sourceEntity)) continue; + Vector vector = entity.getLocation().clone().subtract(tornadoEye).toVector().rotateAroundY(0.5 * Math.PI) + .toLocation(entity.getWorld()).subtract(entity.getLocation().clone().subtract(tornadoEye).toVector()).toVector().normalize().multiply(0.5); + vector.setY(0.5); + entity.setVelocity(entity.getVelocity().add(vector)); + } + } + + @Override + protected void finishDeactivation(EliteEntity eliteEntity) { + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/Firestorm.java b/src/main/java/com/magmaguy/elitemobs/powers/Firestorm.java new file mode 100644 index 000000000..2e7783937 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/Firestorm.java @@ -0,0 +1,177 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.events.BossCustomAttackDamage; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.BossPower; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.concurrent.ThreadLocalRandom; + +public class Firestorm extends BossPower implements Listener { + + public Firestorm() { + super(PowersConfig.getPower("firestorm.yml")); + } + + private static void doFirestorm(EliteEntity eliteEntity) { + if (eliteEntity == null || !eliteEntity.isValid()) return; + eliteEntity.getLivingEntity().setAI(false); + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + counter++; + + if (counter > 20 * 10 || !eliteEntity.isValid()) { + if (eliteEntity.isValid()) + eliteEntity.getLivingEntity().setAI(true); + cancel(); + return; + } + + if (counter % 5 == 0) { + Location randomLocation = eliteEntity.getLivingEntity().getLocation().add(new Vector( + ThreadLocalRandom.current().nextInt(-20, 20), + 0, + ThreadLocalRandom.current().nextInt(-20, 20) + )); + doFlamePyrePhase1(randomLocation, eliteEntity); + } + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + /** + * Warning phase + */ + private static void doFlamePyrePhase1(Location location, EliteEntity eliteEntity) { + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + counter++; + spawnPhase1Particle(location, Particle.SMOKE); + if (counter < 20 * 2) return; + cancel(); + doFlamePyrePhase2(location, eliteEntity); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + private static void spawnPhase1Particle(Location location, Particle particle) { + for (int i = 0; i < 10; i++) { + location.getWorld().spawnParticle(particle, new Location( + location.getWorld(), + (ThreadLocalRandom.current().nextDouble() - 0.5) * 0.5 + location.getX(), + location.getY(), + (ThreadLocalRandom.current().nextDouble() - 0.5) * 0.5 + location.getZ() + ), 0, 0, 1, 0, ThreadLocalRandom.current().nextDouble() * 2); + } + } + + /** + * First damage phase + */ + private static void doFlamePyrePhase2(Location location, EliteEntity eliteEntity) { + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + counter++; + spawnPhase1Particle(location, Particle.FLAME); + doDamage(location, eliteEntity, 0.5, 50, 0.5); + spawnPhase2Particle(location, Particle.SMOKE); + if (counter < 20 * 2) return; + cancel(); + doFlamePyrePhase3(location, eliteEntity); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + private static void spawnPhase2Particle(Location location, Particle particle) { + for (int i = 0; i < 10; i++) { + location.getWorld().spawnParticle(particle, new Location( + location.getWorld(), + (ThreadLocalRandom.current().nextDouble() - 0.5) * 3 + location.getX(), + location.getY(), + (ThreadLocalRandom.current().nextDouble() - 0.5) * 3 + location.getZ() + ), 0, 0, 1, 0, ThreadLocalRandom.current().nextDouble() * 2); + } + } + + private static void doDamage(Location location, EliteEntity eliteEntity, double range1, double range2, double range3) { + for (Entity entity : location.getWorld().getNearbyEntities(location, range1, range2, range3)) + if (entity instanceof LivingEntity) + BossCustomAttackDamage.dealCustomDamage(eliteEntity.getLivingEntity(), (LivingEntity) entity, 1); + } + + /** + * Second damage phase / last warning phase + */ + private static void doFlamePyrePhase3(Location location, EliteEntity eliteEntity) { + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + counter++; + spawnPhase2Particle(location, Particle.FLAME); + doDamage(location, eliteEntity, 3, 50, 3); + spawnPhase3Particle(location, Particle.SMOKE); + if (counter < 20 * 2) return; + cancel(); + doFlamePyrePhase4(location, eliteEntity); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + private static void spawnPhase3Particle(Location location, Particle particle) { + location.getWorld().spawnParticle(particle, location, 50, 0.01, 0.01, 0.01, 0.1); + } + + /** + * Final/full damage phase + * + * @param eliteEntity + */ + private static void doFlamePyrePhase4(Location location, EliteEntity eliteEntity) { + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + counter++; + spawnPhase3Particle(location, Particle.FLAME); + doDamage(location, eliteEntity, 5, 50, 5); + if (counter < 20 * 2) return; + cancel(); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + @EventHandler + public void onDamage(EliteMobDamagedByPlayerEvent event) { + Firestorm firestorm = (Firestorm) event.getEliteMobEntity().getPower(this); + if (firestorm == null) return; + if (!eventIsValid(event, firestorm)) return; + if (ThreadLocalRandom.current().nextDouble() > 0.25) return; + + firestorm.doGlobalCooldown(20 * 20, event.getEliteMobEntity()); + doFirestorm(event.getEliteMobEntity()); + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/FireworksBarrage.java b/src/main/java/com/magmaguy/elitemobs/powers/FireworksBarrage.java new file mode 100644 index 000000000..43daabd1a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/FireworksBarrage.java @@ -0,0 +1,128 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.explosionregen.Explosion; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.BossPower; +import org.bukkit.*; +import org.bukkit.block.Block; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Firework; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.inventory.meta.FireworkMeta; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class FireworksBarrage extends BossPower { + public FireworksBarrage() { + super(PowersConfig.getPower("fireworks_barrage.yml")); + } + + public void doFireworksBarrage(EliteEntity eliteEntity) { + eliteEntity.getLivingEntity().setAI(false); + if (eliteEntity.getLivingEntity().getLocation().clone().add(new Vector(0, 10, 0)).getBlock().getType().equals(Material.AIR)) + if (!eliteEntity.getLivingEntity().getType().equals(EntityType.GHAST)) + eliteEntity.getLivingEntity().teleport(eliteEntity.getLivingEntity().getLocation().clone().add(new Vector(0, 10, 0))); + new BukkitRunnable() { + final Location initialLocation = eliteEntity.getLivingEntity().getLocation().clone(); + int counter = 0; + + @Override + public void run() { + + if (!eliteEntity.isValid()) { + cancel(); + return; + } + + for (int i = 0; i < 2; i++) { + Firework firework = (Firework) eliteEntity.getLivingEntity().getWorld().spawnEntity(eliteEntity.getLivingEntity().getLocation(), EntityType.FIREWORK_ROCKET); + FireworkMeta fireworkMeta = firework.getFireworkMeta(); + fireworkMeta.setPower(10); + fireworkMeta.addEffect(FireworkEffect.builder().withColor(Color.RED, Color.WHITE, Color.BLUE).flicker(true).build()); + firework.setFireworkMeta(fireworkMeta); + firework.setVelocity(new Vector(ThreadLocalRandom.current().nextDouble(-0.5, 0.5), + ThreadLocalRandom.current().nextDouble(), ThreadLocalRandom.current().nextDouble(-0.5, 0.5))); + firework.setPersistent(false); + } + + for (Entity nearbyEntity : eliteEntity.getLivingEntity().getNearbyEntities(20, 20, 20)) + if (nearbyEntity instanceof Player) + if (((Player) nearbyEntity).getGameMode().equals(GameMode.ADVENTURE) || + ((Player) nearbyEntity).getGameMode().equals(GameMode.SURVIVAL)) { + Firework firework = (Firework) eliteEntity.getLivingEntity().getWorld().spawnEntity(eliteEntity.getLivingEntity().getLocation(), EntityType.FIREWORK_ROCKET); + FireworkMeta fireworkMeta = firework.getFireworkMeta(); + fireworkMeta.setPower(10); + fireworkMeta.addEffect(FireworkEffect.builder().withColor(Color.RED, Color.WHITE, Color.BLUE).flicker(true).build()); + firework.setFireworkMeta(fireworkMeta); + firework.setVelocity( + ((Player) nearbyEntity).getEyeLocation().clone() + .subtract(firework.getLocation()) + .toVector().normalize().multiply(0.5)); + firework.setShotAtAngle(true); + firework.setPersistent(false); + new FireworkTask(firework, nearbyEntity.getLocation().clone(), eliteEntity); + } + + counter++; + if (counter > 10) { + cancel(); + eliteEntity.getLivingEntity().setAI(true); + eliteEntity.getLivingEntity().teleport(initialLocation); + } + + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 10); + } + + public static class FireworksBarrageEvents implements Listener { + @EventHandler + public void onDamage(EliteMobDamagedByPlayerEvent event) { + FireworksBarrage fireworksBarrage = (FireworksBarrage) event.getEliteMobEntity().getPower(new FireworksBarrage()); + if (fireworksBarrage == null) return; + if (!eventIsValid(event, fireworksBarrage)) return; + if (ThreadLocalRandom.current().nextDouble() > 0.25) return; + + fireworksBarrage.doCooldown(event.getEliteMobEntity()); + fireworksBarrage.doFireworksBarrage(event.getEliteMobEntity()); + } + } + + private class FireworkTask { + public FireworkTask(Firework firework, Location targetLocation, EliteEntity eliteEntity) { + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + counter++; + if (firework == null || counter > 20 * 5) { + cancel(); + return; + } + if (firework.getLocation().distanceSquared(targetLocation) < Math.pow(0.01, 2)) { + firework.detonate(); + List blockList = new ArrayList<>(); + for (int x = -1; x < 2; x++) + for (int y = -1; y < 2; y++) + for (int z = -1; z < 2; z++) + blockList.add(firework.getLocation().clone().add(new Vector(x, y, z)).getBlock()); + Explosion.generateFakeExplosion(blockList, eliteEntity.getLivingEntity(), (PowersConfigFields) getPowersConfigFields(), firework.getLocation()); + } + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/FlamePyre.java b/src/main/java/com/magmaguy/elitemobs/powers/FlamePyre.java new file mode 100644 index 000000000..f086a02e7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/FlamePyre.java @@ -0,0 +1,166 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.events.BossCustomAttackDamage; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.BossPower; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.concurrent.ThreadLocalRandom; + +public class FlamePyre extends BossPower implements Listener { + + public FlamePyre() { + super(PowersConfig.getPower("flame_pyre.yml")); + } + + @EventHandler + public void onHit(EliteMobDamagedByPlayerEvent event) { + + FlamePyre flamePyre = (FlamePyre) event.getEliteMobEntity().getPower(this); + if (flamePyre == null) return; + if (!eventIsValid(event, flamePyre)) return; + if (ThreadLocalRandom.current().nextDouble() > 0.25) return; + + flamePyre.doGlobalCooldown(20 * 20, event.getEliteMobEntity()); + doFlamePyrePhase1(event.getEliteMobEntity()); + + } + + /** + * Warning phase + */ + private void doFlamePyrePhase1(EliteEntity eliteEntity) { + eliteEntity.getLivingEntity().setAI(false); + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + counter++; + if (!eliteEntity.isValid()) { + cancel(); + return; + } + spawnPhase1Particle(eliteEntity.getLivingEntity().getLocation().clone(), Particle.SMOKE); + if (counter < 20 * 2) return; + cancel(); + doFlamePyrePhase2(eliteEntity); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + private void spawnPhase1Particle(Location location, Particle particle) { + for (int i = 0; i < 10; i++) { + location.getWorld().spawnParticle(particle, new Location( + location.getWorld(), + (ThreadLocalRandom.current().nextDouble() - 0.5) * 0.5 + location.getX(), + location.getY(), + (ThreadLocalRandom.current().nextDouble() - 0.5) * 0.5 + location.getZ() + ), 0, 0, 1, 0, ThreadLocalRandom.current().nextDouble() * 2); + } + } + + /** + * First damage phase + */ + private void doFlamePyrePhase2(EliteEntity eliteEntity) { + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + if (!eliteEntity.isValid()) { + cancel(); + return; + } + counter++; + spawnPhase1Particle(eliteEntity.getLivingEntity().getLocation().clone(), Particle.FLAME); + doDamage(eliteEntity, 0.5, 50, 0.5); + spawnPhase2Particle(eliteEntity.getLivingEntity().getLocation().clone(), Particle.SMOKE); + if (counter < 20 * 2) return; + cancel(); + doFlamePyrePhase3(eliteEntity); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + private void spawnPhase2Particle(Location location, Particle particle) { + for (int i = 0; i < 10; i++) { + location.getWorld().spawnParticle(particle, new Location( + location.getWorld(), + (ThreadLocalRandom.current().nextDouble() - 0.5) * 3 + location.getX(), + location.getY(), + (ThreadLocalRandom.current().nextDouble() - 0.5) * 3 + location.getZ() + ), 0, 0, 1, 0, ThreadLocalRandom.current().nextDouble() * 2); + } + } + + private void doDamage(EliteEntity eliteEntity, double range1, double range2, double range3) { + for (Entity entity : eliteEntity.getLivingEntity().getNearbyEntities(range1, range2, range3)) + if (entity instanceof LivingEntity) + BossCustomAttackDamage.dealCustomDamage(eliteEntity.getLivingEntity(), (LivingEntity) entity, 1); + } + + /** + * Second damage phase / last warning phase + * + * @param eliteEntity + */ + private void doFlamePyrePhase3(EliteEntity eliteEntity) { + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + if (!eliteEntity.isValid()) { + cancel(); + return; + } + counter++; + spawnPhase2Particle(eliteEntity.getLivingEntity().getLocation().clone(), Particle.FLAME); + doDamage(eliteEntity, 3, 50, 3); + spawnPhase3Particle(eliteEntity.getLivingEntity().getLocation().clone(), Particle.SMOKE); + if (counter < 20 * 2) return; + cancel(); + doFlamePyrePhase4(eliteEntity); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + private void spawnPhase3Particle(Location location, Particle particle) { + location.getWorld().spawnParticle(particle, location, 50, 0.01, 0.01, 0.01, 0.1); + } + + /** + * Final/full damage phase + */ + private void doFlamePyrePhase4(EliteEntity eliteEntity) { + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + if (!eliteEntity.isValid()) { + cancel(); + return; + } + counter++; + spawnPhase3Particle(eliteEntity.getLivingEntity().getLocation().clone(), Particle.FLAME); + doDamage(eliteEntity, 5, 50, 5); + if (counter < 20 * 2) return; + cancel(); + eliteEntity.getLivingEntity().setAI(true); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/Flamethrower.java b/src/main/java/com/magmaguy/elitemobs/powers/Flamethrower.java new file mode 100644 index 000000000..585550117 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/Flamethrower.java @@ -0,0 +1,158 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.events.BossCustomAttackDamage; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.BossPower; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class Flamethrower extends BossPower implements Listener { + + public Flamethrower() { + super(PowersConfig.getPower("flamethrower.yml")); + } + + private static List generateDamagePoints(EliteEntity eliteEntity, Location fixedPlayerLocation) { + List locations = new ArrayList<>(); + Location eliteMobLocation = eliteEntity.getLivingEntity().getLocation().clone(); + Vector toPlayerVector = fixedPlayerLocation.clone().subtract(eliteMobLocation).toVector().normalize().multiply(0.5); + for (int i = 0; i < 40; i++) + locations.add(eliteMobLocation.add(toPlayerVector).clone()); + return locations; + } + + private static void doDamage(List locations, EliteEntity eliteEntity) { + for (Location location : locations) + for (Entity entity : location.getWorld().getNearbyEntities(location, 0.5, 0.5, 0.5)) + if (entity instanceof LivingEntity) { + if (eliteEntity.getLivingEntity().equals(entity)) continue; + BossCustomAttackDamage.dealCustomDamage(eliteEntity.getLivingEntity(), (LivingEntity) entity, 1); + } + + } + + /** + * Warning phase + * + * @param eliteEntity + */ + private void doFlamethrowerPhase1(EliteEntity eliteEntity, Location fixedPlayerLocation) { + + eliteEntity.getLivingEntity().setAI(false); + + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + + if (!eliteEntity.isValid()) { + cancel(); + return; + } + + doParticleEffect(eliteEntity, fixedPlayerLocation, Particle.SMOKE); + counter++; + + if (counter < 20 * 2) return; + doFlamethrowerPhase2(eliteEntity, fixedPlayerLocation); + cancel(); + + } + + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + + } + + @EventHandler + public void onHit(EliteMobDamagedByPlayerEvent event) { + + Flamethrower flameThrower = (Flamethrower) event.getEliteMobEntity().getPower(this); + if (flameThrower == null) return; + if (!eventIsValid(event, flameThrower)) return; + if (ThreadLocalRandom.current().nextDouble() > 0.25) return; + + flameThrower.doGlobalCooldown(20 * 20, event.getEliteMobEntity()); + doFlamethrowerPhase1(event.getEliteMobEntity(), event.getPlayer().getLocation().clone()); + + } + + private void doParticleEffect(EliteEntity eliteEntity, Location fixedPlayerLocation, Particle particle) { + Vector directionVector = fixedPlayerLocation.clone().subtract(eliteEntity.getLivingEntity().getLocation()).toVector().normalize(); + for (int i = 0; i < 5; i++) { + eliteEntity.getLivingEntity().getWorld().spawnParticle( + particle, + eliteEntity.getLivingEntity().getEyeLocation().clone().add(directionVector.getX(), -0.5, directionVector.getZ()), + 0, + (ThreadLocalRandom.current().nextDouble() - 0.5) * 0.1 + directionVector.getX(), + (ThreadLocalRandom.current().nextDouble() - 0.5) * 0.1 + directionVector.getY(), + (ThreadLocalRandom.current().nextDouble() - 0.5) * 0.1 + directionVector.getZ(), + ThreadLocalRandom.current().nextDouble() + 0.05); + } + } + + /** + * Damage phase + * + * @param eliteEntity + */ + private void doFlamethrowerPhase2(EliteEntity eliteEntity, Location fixedPlayerLocation) { + List damagePoints = generateDamagePoints(eliteEntity, fixedPlayerLocation); + new BukkitRunnable() { + int timer = 0; + + @Override + public void run() { + if (!eliteEntity.isValid()) { + cancel(); + return; + } + + doParticleEffect(eliteEntity, fixedPlayerLocation, Particle.FLAME); + doDamage(damagePoints, eliteEntity); + timer++; + if (timer < 20 * 3) return; + doFlamethrowerPhase3(eliteEntity, fixedPlayerLocation); + cancel(); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + /** + * Cooldown phase + * + * @param eliteEntity + */ + private void doFlamethrowerPhase3(EliteEntity eliteEntity, Location fixedPlayerLocation) { + new BukkitRunnable() { + int timer = 0; + + @Override + public void run() { + if (!eliteEntity.isValid()) { + cancel(); + return; + } + timer++; + doParticleEffect(eliteEntity, fixedPlayerLocation, Particle.SMOKE); + if (timer < 20) return; + cancel(); + eliteEntity.getLivingEntity().setAI(true); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/FrostCone.java b/src/main/java/com/magmaguy/elitemobs/powers/FrostCone.java new file mode 100644 index 000000000..f7970bb4d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/FrostCone.java @@ -0,0 +1,148 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.api.PlayerDamagedByEliteMobEvent; +import com.magmaguy.elitemobs.combatsystem.EliteProjectile; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.BossPower; +import com.magmaguy.elitemobs.powers.meta.ProjectileTagger; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.NamespacedKey; +import org.bukkit.Particle; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.entity.Projectile; +import org.bukkit.entity.Snowball; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.persistence.PersistentDataType; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.HashMap; +import java.util.concurrent.ThreadLocalRandom; + +public class FrostCone extends BossPower implements Listener { + + private static final NamespacedKey frostConeSnowballKey = new NamespacedKey(MetadataHandler.PLUGIN, "frost_cone_snowball"); + private static final HashMap frostconePlayer = new HashMap<>(); + + public FrostCone() { + super(PowersConfig.getPower("frost_cone.yml")); + } + + public static void startFrostCone(EliteEntity eliteEntity, Location damager, FrostCone frostCone) { + + if (eliteEntity == null || eliteEntity.getLivingEntity() == null || !eliteEntity.getLivingEntity().isValid()) + return; + eliteEntity.getLivingEntity().setAI(false); + + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + counter++; + + //ending phase + if (counter > 20 * 6 || !isPowerStillValid(eliteEntity, damager)) { + cancel(); + if (eliteEntity.getLivingEntity() != null && !eliteEntity.getLivingEntity().isDead()) + eliteEntity.getLivingEntity().setAI(true); + frostCone.setFiring(false); + return; + } + + //warning phase + if (counter < 20 * 3) { + doSmokeEffect(eliteEntity, damager); + return; + } + + //firing phase + for (int i = 0; i < 10; i++) + createSnowball(eliteEntity, damager); + + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + + + } + + private static void doSmokeEffect(EliteEntity eliteEntity, Location location) { + for (int i = 0; i < 100; i++) { + Vector shotVector = getShotVector(eliteEntity, location); + eliteEntity.getLivingEntity().getWorld().spawnParticle( + Particle.SMOKE, + eliteEntity.getLivingEntity().getLocation().clone().add(new Vector(0, 1, 0)), + 0, + shotVector.getX(), + shotVector.getY(), + shotVector.getZ(), + 0.75); + } + } + + private static boolean isPowerStillValid(EliteEntity eliteEntity, Location playerLocation) { + if (!eliteEntity.isValid()) + return false; + return eliteEntity.getLivingEntity().getWorld().equals(playerLocation.getWorld()); + } + + private static Vector getShotVector(EliteEntity eliteEntity, Location location) { + return location.clone().subtract(eliteEntity.getLivingEntity().getLocation().clone()).toVector() + .normalize() + .add(new Vector( + ThreadLocalRandom.current().nextDouble() * 1 - 0.5, + ThreadLocalRandom.current().nextDouble() * 0.5 - 0.25, + ThreadLocalRandom.current().nextDouble() * 1 - 0.5)) + .normalize(); + } + + private static Snowball createSnowball(EliteEntity eliteEntity, Location location) { + Projectile snowball = EliteProjectile.create(EntityType.SNOWBALL, eliteEntity.getLivingEntity(), getShotVector(eliteEntity, location), false); + ProjectileTagger.tagProjectileWithCustomDamage(snowball, 2); + snowball.getPersistentDataContainer().set(frostConeSnowballKey, PersistentDataType.STRING, "true"); + Bukkit.getScheduler().runTaskLater(MetadataHandler.PLUGIN, snowball::remove, 20L * 3); + return (Snowball) snowball; + } + + @EventHandler + public void onDamagedEvent(EliteMobDamagedByPlayerEvent event) { + FrostCone frostCone = (FrostCone) event.getEliteMobEntity().getPower(this); + if (frostCone == null) return; + if (frostCone.isInCooldown(event.getEliteMobEntity())) return; + frostCone.doCooldownTicks(event.getEliteMobEntity()); + + frostCone.setFiring(true); + startFrostCone(event.getEliteMobEntity(), event.getPlayer().getLocation().clone(), frostCone); + } + + @EventHandler(ignoreCancelled = true) + public void playerHitByFrostConeSnowball(PlayerDamagedByEliteMobEvent event) { + if (event.getProjectile() == null) return; + if (!event.getProjectile().getPersistentDataContainer().has(frostConeSnowballKey, PersistentDataType.STRING)) + return; + if (!frostconePlayer.containsKey(event.getPlayer())) + frostconePlayer.put(event.getPlayer(), 1); + else + frostconePlayer.put(event.getPlayer(), frostconePlayer.get(event.getPlayer()) + 1); + event.getPlayer().addPotionEffect(new PotionEffect(PotionEffectType.SLOWNESS, 20 * 7, frostconePlayer.get(event.getPlayer()))); + new BukkitRunnable() { + final int amount = frostconePlayer.get(event.getPlayer()); + + @Override + public void run() { + if (!frostconePlayer.containsKey(event.getPlayer())) return; + if (amount != frostconePlayer.get(event.getPlayer())) return; + frostconePlayer.remove(event.getPlayer()); + } + }.runTaskLater(MetadataHandler.PLUGIN, 20L * 5); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/FrostWalker.java b/src/main/java/com/magmaguy/elitemobs/powers/FrostWalker.java new file mode 100644 index 000000000..6de6226d7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/FrostWalker.java @@ -0,0 +1,31 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.powers.meta.MinorPower; +import org.bukkit.Material; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.entity.LivingEntity; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; + +public class FrostWalker extends MinorPower { + + public FrostWalker() { + super(PowersConfig.getPower("frost_walker.yml")); + } + + @Override + public void applyPowers(LivingEntity livingEntity) { + new BukkitRunnable() { + @Override + public void run() { + ItemStack frostWalkerBoots = new ItemStack(Material.LEATHER_BOOTS); + frostWalkerBoots.addEnchantment(Enchantment.FROST_WALKER, 2); + frostWalkerBoots.addEnchantment(Enchantment.DEPTH_STRIDER, 3); + livingEntity.getEquipment().setBoots(frostWalkerBoots); + } + }.runTaskLater(MetadataHandler.PLUGIN, 1); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/GoldExplosion.java b/src/main/java/com/magmaguy/elitemobs/powers/GoldExplosion.java new file mode 100644 index 000000000..1cad9a8f4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/GoldExplosion.java @@ -0,0 +1,92 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.BossPower; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import org.bukkit.Material; +import org.bukkit.Particle; +import org.bukkit.entity.Item; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class GoldExplosion extends BossPower implements Listener { + + public GoldExplosion() { + super(PowersConfig.getPower("gold_explosion.yml")); + } + + @EventHandler + public void onHit(EliteMobDamagedByPlayerEvent event) { + + GoldExplosion goldExplosion = (GoldExplosion) event.getEliteMobEntity().getPower(this); + if (goldExplosion == null) return; + if (!eventIsValid(event, goldExplosion)) return; + if (ThreadLocalRandom.current().nextDouble() > 0.25) return; + + goldExplosion.doGlobalCooldown(20 * 20, event.getEliteMobEntity()); + doGoldExplosion(event.getEliteMobEntity()); + + } + + private void doGoldExplosion(EliteEntity eliteEntity) { + + eliteEntity.getLivingEntity().setAI(false); + + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + if (!eliteEntity.isValid()) { + cancel(); + return; + } + + counter++; + if (MobCombatSettingsConfig.isEnableWarningVisualEffects()) + eliteEntity.getLivingEntity().getWorld().spawnParticle(Particle.SMOKE, eliteEntity.getLivingEntity().getLocation(), counter, 1, 1, 1, 0); + + if (counter < 20 * 1.5) return; + cancel(); + eliteEntity.getLivingEntity().setAI(true); + List goldNuggets = generateVisualItems(eliteEntity); + ProjectileDamage.doGoldNuggetDamage(goldNuggets, eliteEntity); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + + } + + private List generateVisualItems(EliteEntity eliteEntity) { + List visualItemsList = new ArrayList<>(); + for (int i = 0; i < 200; i++) { + Vector velocityVector = new Vector( + ThreadLocalRandom.current().nextDouble() - 0.5, + ThreadLocalRandom.current().nextDouble() / 1.5, + ThreadLocalRandom.current().nextDouble() - 0.5); + + Item visualProjectile = eliteEntity.getLivingEntity().getWorld().dropItem( + eliteEntity.getLivingEntity().getLocation().clone() + .add(new Vector(velocityVector.getX(), + 0.5, + velocityVector.getZ())), + ItemStackGenerator.generateItemStack( + Material.GOLD_NUGGET, + "visual projectile", + List.of(ThreadLocalRandom.current().nextDouble() + ""))); + ProjectileDamage.configureVisualProjectile(visualProjectile); + visualProjectile.setVelocity(velocityVector); + visualItemsList.add(visualProjectile); + } + return visualItemsList; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/GoldShotgun.java b/src/main/java/com/magmaguy/elitemobs/powers/GoldShotgun.java new file mode 100644 index 000000000..fbdbc838a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/GoldShotgun.java @@ -0,0 +1,109 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.BossPower; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import org.bukkit.Material; +import org.bukkit.Particle; +import org.bukkit.entity.Item; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class GoldShotgun extends BossPower implements Listener { + + public GoldShotgun() { + super(PowersConfig.getPower("gold_shotgun.yml")); + } + + @EventHandler + public void onHit(EliteMobDamagedByPlayerEvent event) { + + GoldShotgun goldShotgun = (GoldShotgun) event.getEliteMobEntity().getPower(this); + if (goldShotgun == null) return; + if (!eventIsValid(event, goldShotgun)) return; + + goldShotgun.doCooldownTicks(event.getEliteMobEntity()); + goldShotgun.doGoldShotgun(event.getEliteMobEntity(), event.getPlayer()); + + } + + private void doGoldShotgun(EliteEntity eliteEntity, Player player) { + + eliteEntity.getLivingEntity().setAI(false); + Vector shotVector = player.getLocation().add(new Vector(0, 1, 0)).toVector().subtract(eliteEntity.getLivingEntity().getLocation().toVector()).normalize().multiply(.5); + + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + + if (!eliteEntity.isValid()) { + cancel(); + return; + } + + if (counter % 10 == 0) + doSmokeEffect(eliteEntity, shotVector); + counter++; + + if (counter < 20 * 3) return; + + cancel(); + eliteEntity.getLivingEntity().setAI(true); + List nuggetList = generateVisualItems(eliteEntity, shotVector); + if (nuggetList == null) return; + ProjectileDamage.doGoldNuggetDamage(nuggetList, eliteEntity); + + } + + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + + } + + private void doSmokeEffect(EliteEntity eliteEntity, Vector shotVector) { + for (int i = 0; i < 200; i++) { + Vector visualShotVector = getShotVector(shotVector); + eliteEntity.getLivingEntity().getWorld().spawnParticle( + Particle.SMOKE, + eliteEntity.getLivingEntity().getLocation().clone().add(new Vector(0, 0.5, 0)), + 0, + visualShotVector.getX(), + visualShotVector.getY(), + visualShotVector.getZ(), + 0.75); + } + } + + private List generateVisualItems(EliteEntity eliteEntity, Vector shotVector) { + List nuggetList = new ArrayList<>(); + for (int i = 0; i < 200; i++) { + Item visualProjectile = eliteEntity.getLivingEntity().getWorld().dropItem( + eliteEntity.getLivingEntity().getLocation(), + ItemStackGenerator.generateItemStack( + Material.GOLD_NUGGET, + "visual projectile", + List.of(ThreadLocalRandom.current().nextDouble() + ""))); + ProjectileDamage.configureVisualProjectile(visualProjectile); + visualProjectile.setVelocity(getShotVector(shotVector)); + visualProjectile.setGravity(false); + nuggetList.add(visualProjectile); + } + return nuggetList; + } + + private Vector getShotVector(Vector originalShotVector) { + return originalShotVector.clone().add(new Vector(ThreadLocalRandom.current().nextDouble(-.1, .1), ThreadLocalRandom.current().nextDouble(-.1, .1), ThreadLocalRandom.current().nextDouble(-.1, .1)).normalize().multiply(0.1)); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/GroundPound.java b/src/main/java/com/magmaguy/elitemobs/powers/GroundPound.java new file mode 100644 index 000000000..b6037fe74 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/GroundPound.java @@ -0,0 +1,127 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.MinorPower; +import com.magmaguy.elitemobs.utils.NonSolidBlockTypes; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.concurrent.ThreadLocalRandom; + +public class GroundPound extends MinorPower implements Listener { + + public GroundPound() { + super(PowersConfig.getPower("ground_pound.yml")); + } + + private static void cloudParticle(Location location) { + location.getWorld().spawnParticle(Particle.CLOUD, location, 10, 0.01, 0.01, 0.01, 0.7); + } + + private static void landCloudParticle(Location location) { + location.getWorld().spawnParticle(Particle.CLOUD, location, 20, 0.1, 0.01, 0.1, 0.7); + } + + @EventHandler + public void onEliteDamaged(EliteMobDamagedByPlayerEvent event) { + GroundPound groundPound = (GroundPound) event.getEliteMobEntity().getPower(this); + if (groundPound == null) return; + if (groundPound.isInGlobalCooldown()) return; + + if (ThreadLocalRandom.current().nextDouble() > 0.10) return; + groundPound.doGlobalCooldown(20 * 10); + + doGroundPound(event.getEliteMobEntity()); + + } + + public void doGroundPound(EliteEntity eliteEntity) { + + //step 1: make boss go up + new BukkitRunnable() { + @Override + public void run() { + if (!eliteEntity.isValid()) { + cancel(); + return; + } + eliteEntity.getLivingEntity().setVelocity(new Vector(0, 1.5, 0)); + cloudParticle(eliteEntity.getLivingEntity().getLocation()); + + } + }.runTaskLater(MetadataHandler.PLUGIN, 1); + + //step 2: make boss go down + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + if (!eliteEntity.isValid()) { + cancel(); + return; + } + counter++; + if (!NonSolidBlockTypes.isPassthrough(eliteEntity.getLivingEntity().getLocation().clone().subtract(new Vector(0, 0.2, 0)).getBlock().getType())) { + + eliteEntity.getLivingEntity().setVelocity(new Vector(0, -2, 0)); + cloudParticle(eliteEntity.getLivingEntity().getLocation()); + + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + if (counter > 20 * 5 || !eliteEntity.isValid()) { + cancel(); + return; + } + + counter++; + + if (!eliteEntity.getLivingEntity().isOnGround()) + return; + + cancel(); + + landCloudParticle(eliteEntity.getLivingEntity().getLocation()); + + for (Entity entity : eliteEntity.getLivingEntity().getNearbyEntities(10, 10, 10)) { + try { + entity.setVelocity(entity.getLocation().clone().subtract(eliteEntity.getLivingEntity().getLocation()).toVector().normalize().multiply(2).setY(1.5)); + } catch (Exception ex) { + entity.setVelocity(new Vector(0, 1.5, 0)); + } + if (entity instanceof LivingEntity) + ((LivingEntity) entity).addPotionEffect(new PotionEffect(PotionEffectType.SLOWNESS, 20 * 3, 2)); + } + + + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + + cancel(); + return; + + } + + if (counter > 20 * 5) + cancel(); + + } + }.runTaskTimer(MetadataHandler.PLUGIN, 20, 1); + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/HyperLoot.java b/src/main/java/com/magmaguy/elitemobs/powers/HyperLoot.java new file mode 100644 index 000000000..643960f14 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/HyperLoot.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.api.EliteMobDeathEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.items.LootTables; +import com.magmaguy.elitemobs.powers.meta.BossPower; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class HyperLoot extends BossPower implements Listener { + + public HyperLoot() { + super(PowersConfig.getPower("hyper_loot.yml")); + } + + @EventHandler + public void onEliteMobDeath(EliteMobDeathEvent event) { + if (!event.getEliteEntity().hasPower(this)) return; + for (int i = 0; i < 10; i++) + LootTables.generatePlayerLoot(event.getEliteEntity()); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/Implosion.java b/src/main/java/com/magmaguy/elitemobs/powers/Implosion.java new file mode 100644 index 000000000..501fad51c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/Implosion.java @@ -0,0 +1,61 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDeathEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.powers.meta.MinorPower; +import org.bukkit.GameMode; +import org.bukkit.Particle; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; + +public class Implosion extends MinorPower implements Listener { + + public Implosion() { + super(PowersConfig.getPower("implosion.yml")); + } + + @EventHandler + public void onDeath(EliteMobDeathEvent event) { + if (!event.getEliteEntity().hasPower(this)) return; + + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + if (counter < 20) + for (int i = 0; i < 20; i++) + event.getEntity().getLocation().getWorld().spawnParticle(Particle.PORTAL, event.getEntity().getLocation(), 1, 0.1, 0.1, 0.1, 1); + if (counter > 20 * 3) { + for (Entity entity : event.getEntity().getWorld().getNearbyEntities(event.getEntity().getLocation(), 10, 10, 10)) + if (entity instanceof LivingEntity) { + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(entity); + if (eliteEntity instanceof CustomBossEntity customBossEntity) { + if (customBossEntity.getCustomBossesConfigFields().isFrozen()) + continue; + } + if (entity.getType().equals(EntityType.PLAYER) && ((Player) entity).getGameMode().equals(GameMode.SPECTATOR)) + continue; + try { + entity.setVelocity(event.getEliteEntity().getLocation().clone().subtract(entity.getLocation()).toVector().normalize()); + } catch (Exception ex) { + //Sometimes this is infinite. That just means players shouldn't move. + } + } + cancel(); + } + counter++; + } + }.runTaskTimer(MetadataHandler.PLUGIN, 1, 0); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/InvulnerabilityArrow.java b/src/main/java/com/magmaguy/elitemobs/powers/InvulnerabilityArrow.java new file mode 100644 index 000000000..07775fe93 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/InvulnerabilityArrow.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.powers.meta.MinorPower; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; + +/** + * Created by MagmaGuy on 05/11/2016. + */ +public class InvulnerabilityArrow extends MinorPower implements Listener { + + public InvulnerabilityArrow() { + super(PowersConfig.getPower("invulnerability_arrow.yml")); + } + + @EventHandler(ignoreCancelled = true) + public void invulnerabilityArrow(EliteMobDamagedByPlayerEvent event) { + if (!event.getEliteMobEntity().hasPower(this)) return; + if (!event.getEntityDamageByEntityEvent().getCause().equals(EntityDamageEvent.DamageCause.PROJECTILE)) return; + event.setCancelled(true); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/InvulnerabilityFallDamage.java b/src/main/java/com/magmaguy/elitemobs/powers/InvulnerabilityFallDamage.java new file mode 100644 index 000000000..78ee1acc6 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/InvulnerabilityFallDamage.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.api.EliteMobDamagedEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.powers.meta.MinorPower; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; + +/** + * Created by MagmaGuy on 28/11/2016. + */ +public class InvulnerabilityFallDamage extends MinorPower implements Listener { + + public InvulnerabilityFallDamage() { + super(PowersConfig.getPower("invulnerability_fall_damage.yml")); + } + + @EventHandler(ignoreCancelled = true) + public void invulnerabilityFallDamage(EliteMobDamagedEvent event) { + if (!event.getEliteEntity().hasPower(this)) return; + if (!event.getEntityDamageEvent().getCause().equals(EntityDamageEvent.DamageCause.FALL)) return; + event.setCancelled(true); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/InvulnerabilityFireworks.java b/src/main/java/com/magmaguy/elitemobs/powers/InvulnerabilityFireworks.java new file mode 100644 index 000000000..68345f4d7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/InvulnerabilityFireworks.java @@ -0,0 +1,25 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.MinorPower; +import org.bukkit.entity.Firework; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; + +public class InvulnerabilityFireworks extends MinorPower implements Listener { + public InvulnerabilityFireworks() { + super(PowersConfig.getPower("invulnerability_fireworks.yml")); + } + + @EventHandler(ignoreCancelled = true) + public void onEliteDamaged(EntityDamageByEntityEvent event) { + if (!(event.getDamager() instanceof Firework)) return; + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(event.getEntity()); + if (eliteEntity == null) return; + if (!eliteEntity.hasPower(this)) return; + event.setCancelled(true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/InvulnerabilityKnockback.java b/src/main/java/com/magmaguy/elitemobs/powers/InvulnerabilityKnockback.java new file mode 100644 index 000000000..fa28d4713 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/InvulnerabilityKnockback.java @@ -0,0 +1,40 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.powers.meta.MinorPower; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +/** + * Created by MagmaGuy on 30/04/2017. + */ +public class InvulnerabilityKnockback extends MinorPower implements Listener { + + public InvulnerabilityKnockback() { + super(PowersConfig.getPower("invulnerability_knockback.yml")); + } + + @EventHandler + public void invulnerabilityKnockback(EliteMobDamagedEvent event) { + if (event.getEliteEntity().hasPower(this) || + event.getEliteEntity() instanceof CustomBossEntity && + ((CustomBossEntity) event.getEliteEntity()).getCustomBossesConfigFields().isFrozen()) { + if (!event.getEliteEntity().isValid()) return; + event.getEntity().setVelocity(new Vector(0, 0, 0)); + new BukkitRunnable() { + @Override + public void run() { + if (!event.getEliteEntity().isValid()) return; + event.getEntity().setVelocity(new Vector(0, 0, 0)); + } + }.runTaskLater(MetadataHandler.PLUGIN, 1); + } + } + +} + diff --git a/src/main/java/com/magmaguy/elitemobs/powers/LightningBolts.java b/src/main/java/com/magmaguy/elitemobs/powers/LightningBolts.java new file mode 100644 index 000000000..4d660b161 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/LightningBolts.java @@ -0,0 +1,81 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.collateralminecraftchanges.LightningSpawnBypass; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.BossPower; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + + +public class LightningBolts extends BossPower implements Listener { + + public LightningBolts() { + super(PowersConfig.getPower("lightning_bolts.yml")); + } + + private static void setLightiningPaths(EliteEntity eliteEntity) { + if (eliteEntity.getLivingEntity() == null) return; + eliteEntity.getLivingEntity().setAI(false); + for (Entity entity : eliteEntity.getLivingEntity().getNearbyEntities(20, 20, 20)) { + if (entity.getType().equals(EntityType.PLAYER)) { + Location playerLocationClone = entity.getLocation().clone(); + Location powerLocation = eliteEntity.getLivingEntity().getLocation().clone(); + Vector powerDirection = playerLocationClone.clone().subtract(powerLocation).toVector().normalize(); + int counter = 0; + while (playerLocationClone.distance(powerLocation) > 0.55) { + counter++; + powerLocation.add(powerDirection); + lightningTask(powerLocation.clone(), counter); + } + } + } + new BukkitRunnable() { + @Override + public void run() { + if (eliteEntity != null && eliteEntity.getLivingEntity() != null) + eliteEntity.getLivingEntity().setAI(true); + } + }.runTaskLater(MetadataHandler.PLUGIN, 4L * 20); + } + + public static void lightningTask(Location location, int counter) { + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + counter++; + if (counter > 20 * 2) { + LightningSpawnBypass.bypass(); + location.getWorld().strikeLightning(location); + cancel(); + return; + } + location.getWorld().spawnParticle(Particle.CRIT, location, 10, 0.5, 1.5, 0.5, 0.3); + } + }.runTaskTimer(MetadataHandler.PLUGIN, counter * 5L, 1); + + } + + @EventHandler + public void onDamagedEvent(EliteMobDamagedByPlayerEvent event) { + LightningBolts lightningBolts = (LightningBolts) event.getEliteMobEntity().getPower(this); + if (lightningBolts == null) return; + if (lightningBolts.isInCooldown(event.getEliteMobEntity())) return; + + lightningBolts.doCooldownTicks(event.getEliteMobEntity()); + + lightningBolts.setFiring(true); + setLightiningPaths(event.getEliteMobEntity()); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/MeteorShower.java b/src/main/java/com/magmaguy/elitemobs/powers/MeteorShower.java new file mode 100644 index 000000000..5e17c1eb3 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/MeteorShower.java @@ -0,0 +1,94 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.BossPower; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Fireball; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.concurrent.ThreadLocalRandom; + +public class MeteorShower extends BossPower implements Listener { + public MeteorShower() { + super(PowersConfig.getPower("meteor_shower.yml")); + } + + public static void doMeteorShower(EliteEntity eliteEntity) { + eliteEntity.getLivingEntity().setAI(false); + new BukkitRunnable() { + final Location initialLocation = eliteEntity.getLivingEntity().getLocation().clone(); + int counter = 0; + + @Override + public void run() { + + if (!eliteEntity.isValid()) { + cancel(); + return; + } + + if (counter > 10 * 20) { + cancel(); + eliteEntity.getLivingEntity().setAI(true); + eliteEntity.getLivingEntity().teleport(initialLocation); + return; + } + + counter++; + + doCloudEffect(eliteEntity.getLivingEntity().getLocation().clone().add(new Vector(0, 10, 0))); + + if (counter > 2 * 20) { + + doFireballs(eliteEntity.getLivingEntity().getLocation().clone().add(new Vector(0, 10, 0)), eliteEntity); + + } + + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + public static void doCloudEffect(Location location) { + for (int i = 0; i < 1; i++) { + int randX = ThreadLocalRandom.current().nextInt(30) - 15; + int randY = ThreadLocalRandom.current().nextInt(2); + int randZ = ThreadLocalRandom.current().nextInt(30) - 15; + Location newLocation = location.clone().add(new Vector(randX, randY, randZ)); + location.getWorld().spawnParticle(Particle.EXPLOSION, newLocation, 1, 0, 0, 0, 0); + } + } + + private static void doFireballs(Location location, EliteEntity eliteEntity) { + for (int i = 0; i < 1; i++) { + int randX = ThreadLocalRandom.current().nextInt(30) - 15; + int randY = ThreadLocalRandom.current().nextInt(2); + int randZ = ThreadLocalRandom.current().nextInt(30) - 15; + Location newLocation = location.clone().add(new Vector(randX, randY, randZ)); + newLocation = newLocation.setDirection(new Vector(ThreadLocalRandom.current().nextDouble() - 0.5, -0.5, ThreadLocalRandom.current().nextDouble() - 0.5)); + Fireball fireball = (Fireball) location.getWorld().spawnEntity(newLocation, EntityType.FIREBALL); + fireball.setShooter(eliteEntity.getLivingEntity()); + fireball.setDirection(fireball.getDirection().multiply(0.5)); + } + } + + @EventHandler + public void onDamage(EliteMobDamagedByPlayerEvent event) { + MeteorShower meteorShower = (MeteorShower) event.getEliteMobEntity().getPower(this); + if (meteorShower == null) return; + if (!eventIsValid(event, meteorShower)) return; + if (ThreadLocalRandom.current().nextDouble() > 0.25) return; + + meteorShower.doGlobalCooldown(20 * 20, event.getEliteMobEntity()); + doMeteorShower(event.getEliteMobEntity()); + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/MovementSpeed.java b/src/main/java/com/magmaguy/elitemobs/powers/MovementSpeed.java new file mode 100644 index 000000000..529f1f153 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/MovementSpeed.java @@ -0,0 +1,30 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.powers.meta.MinorPower; +import org.bukkit.entity.LivingEntity; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scheduler.BukkitRunnable; + +/** + * Created by MagmaGuy on 05/11/2016. + */ +public class MovementSpeed extends MinorPower { + + public MovementSpeed() { + super(PowersConfig.getPower("movement_speed.yml")); + } + + @Override + public void applyPowers(LivingEntity livingEntity) { + new BukkitRunnable() { + @Override + public void run() { + livingEntity.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, 100000, 1)); + } + }.runTaskLater(MetadataHandler.PLUGIN, 1); + } + +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/powers/PhotonRay.java b/src/main/java/com/magmaguy/elitemobs/powers/PhotonRay.java new file mode 100644 index 000000000..6ca9a72a3 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/PhotonRay.java @@ -0,0 +1,174 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.events.BossCustomAttackDamage; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.CombatEnterScanPower; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.Color; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class PhotonRay extends CombatEnterScanPower { + + private final int range = 60; + private List playerLocations = new ArrayList<>(5); + private int tickCounter = 0; + + public PhotonRay() { + super(PowersConfig.getPower("photon_ray.yml")); + } + + private void doDamage(Location location, EliteEntity eliteEntity) { + for (Entity entity : location.getWorld().getNearbyEntities(location, 0.5, 0.5, 0.5)) + if (entity instanceof LivingEntity) { + if (eliteEntity.getLivingEntity().equals(entity)) continue; + BossCustomAttackDamage.dealCustomDamage(eliteEntity.getLivingEntity(), (LivingEntity) entity, 1); + } + + tickCounter++; + + } + + @Override + protected void finishActivation(EliteEntity eliteEntity) { + super.bukkitTask = new BukkitRunnable() { + @Override + public void run() { + if (doExit(eliteEntity) || isInCooldown(eliteEntity)) { + return; + } + doPower(eliteEntity); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + private void doPower(EliteEntity eliteEntity) { + doCooldown(eliteEntity); + for (Entity entity : eliteEntity.getLivingEntity().getNearbyEntities(60, 60, 60)) + if (entity.getType().equals(EntityType.PLAYER)) { + if (((Player) entity).getGameMode().equals(GameMode.SPECTATOR)) continue; + //Vector shotVector = entity.getLocation().subtract(eliteEntity.getLivingEntity().getLocation()).toVector().normalize().multiply(0.5); + createRay((Player) entity, eliteEntity.getLocation(), eliteEntity); + break; + } + } + + private void createRay(Player target, Location sourceLocation, EliteEntity sourceEntity) { + sourceEntity.getLivingEntity().setAI(false); + + new BukkitRunnable() { + int counter = 0; + Vector laserVector = generateRayVector(sourceLocation, target.getLocation()); + + @Override + public void run() { + if (counter > 30 || + !target.isValid() || + !target.getLocation().getWorld().equals(sourceLocation.getWorld()) || + target.getLocation().distanceSquared(sourceLocation) > range * range || + !sourceEntity.isValid()) { + if (sourceEntity.getLivingEntity() != null) + sourceEntity.getLivingEntity().setAI(true); + cancel(); + return; + } + + laserVector = dragTarget(laserVector, sourceEntity.getLocation(), target.getLocation()); + + doRaytraceLaser(laserVector, sourceEntity.getLocation(), counter < 20 / 4d, sourceEntity); + + counter++; + + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 2); + } + + private void doRaytraceLaser(Vector laserVector, Location source, boolean warningPhase, EliteEntity eliteEntity) { + Location cloneLocation = source.clone().add(new Vector(0, 1, 0)); + for (int i = 0; i < range * 2; i++) { + if (!cloneLocation.clone().add(laserVector).getBlock().isPassable()) { + Vector tentativeDistance = cloneLocation.clone().add(laserVector).getBlock().getLocation().add(new Vector(0.5, 0.5, 0.5)) + .subtract(cloneLocation.clone()).toVector(); + double x = laserVector.getX(), y = laserVector.getY(), z = laserVector.getZ(); + double xAbs = Math.abs(tentativeDistance.getX()), yAbs = Math.abs(tentativeDistance.getY()), zAbs = Math.abs(tentativeDistance.getZ()); + if (xAbs > yAbs && xAbs > zAbs) + x *= -1; + else if (yAbs > xAbs && yAbs > zAbs) + y *= -1; + else if (zAbs > yAbs && zAbs > xAbs) + z *= -1; + else Logger.warn("MagmaGuy is bad at math!"); + laserVector.setX(x); + laserVector.setY(y); + laserVector.setZ(z); + } + if (warningPhase) + doWarningParticle(cloneLocation.add(laserVector)); + else + doDamageParticles(eliteEntity, cloneLocation.add(laserVector)); + } + } + + private Vector generateRayVector(Location source, Location target) { + return target.clone().add(new Vector(0, 1, 0)) + .subtract(source.clone().add(new Vector(0, 1, 0))).toVector().normalize().multiply(.5); + } + + private Vector dragTarget(Vector originalVector, Location sourceLocation, Location targetLocation) { + if (playerLocations.size() < 5) { + playerLocations.add(targetLocation); + return originalVector; + } + + Location oldTarget = playerLocations.get(0); + Vector newVector = generateRayVector(sourceLocation, oldTarget); + + playerLocations.remove(0); + List newLocation = new ArrayList<>(playerLocations); + newLocation.add(targetLocation); + playerLocations = newLocation; + + + return newVector; + } + + private void doWarningParticle(Location location) { + location.getWorld().spawnParticle(Particle.DUST, location.getX(), location.getY(), location.getZ(), + 5, 0.2, 0.2, 0.2, + 1, new Particle.DustOptions(Color.BLACK, 1)); + } + + private void doDamageParticles(EliteEntity eliteEntity, Location location) { + location.getWorld().spawnParticle(Particle.DUST, location.getX(), location.getY(), location.getZ(), + 5, 0.2, 0.2, 0.2, + 1, new Particle.DustOptions(Color.fromRGB( + ThreadLocalRandom.current().nextInt(0, 100), + ThreadLocalRandom.current().nextInt(0, 100), + ThreadLocalRandom.current().nextInt(100, 255) + ), 1)); + for (Entity entity : location.getWorld().getNearbyEntities(location, 0.25, 0.25, 0.25)) + if (entity.getType() == EntityType.PLAYER) + doDamage(location, eliteEntity); + + + } + + + @Override + protected void finishDeactivation(EliteEntity eliteEntity) { + + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/PlasmaBlaster.java b/src/main/java/com/magmaguy/elitemobs/powers/PlasmaBlaster.java new file mode 100644 index 000000000..de4b19d1b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/PlasmaBlaster.java @@ -0,0 +1,103 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.CombatEnterScanPower; +import org.bukkit.Color; +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.concurrent.ThreadLocalRandom; + + +public class PlasmaBlaster extends CombatEnterScanPower { + + public PlasmaBlaster() { + super(PowersConfig.getPower("plasma_blaster.yml")); + } + + + @Override + protected void finishActivation(EliteEntity eliteEntity) { + super.bukkitTask = new BukkitRunnable() { + @Override + public void run() { + if (doExit(eliteEntity) || isInCooldown(eliteEntity)) { + return; + } + doPower(eliteEntity); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 20 * 4); + } + + private void doPower(EliteEntity eliteEntity) { + for (Entity entity : eliteEntity.getLivingEntity().getNearbyEntities(30, 30, 30)) + if (entity.getType().equals(EntityType.PLAYER)) { + if (((Player) entity).getGameMode().equals(GameMode.SPECTATOR)) continue; + Vector shotVector = entity.getLocation().subtract(eliteEntity.getLivingEntity().getLocation()).toVector().normalize().multiply(0.5); + createProjectile(shotVector, eliteEntity.getLocation(), eliteEntity, (Player) entity); + break; + } + } + + private void createProjectile(Vector shotVector, Location sourceLocation, EliteEntity sourceEntity, Player player) { + new BukkitRunnable() { + final Location currentLocation = sourceLocation.clone().add(new Vector(0, 1, 0)); + int counter = 0; + + @Override + public void run() { + if (counter > 20 * 3) { + cancel(); + return; + } + counter++; + + if (player.getBoundingBox().overlaps(new Vector(currentLocation.getX() - .5, currentLocation.getY() - .5, currentLocation.getZ() - .5), new Vector(currentLocation.getX() + .5, currentLocation.getY() + .5, currentLocation.getZ() + .5))) + doDamage(player, sourceEntity); + if (counter % 5 == 0) + doVisualEffect(currentLocation, counter); + + currentLocation.add(shotVector); + if (!currentLocation.getBlock().isPassable()) cancel(); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + private void doDamage(Player player, EliteEntity sourceEntity) { + player.damage(1, sourceEntity.getLivingEntity()); + doDamageFireworks(player.getLocation().clone().add(new Vector(0, 1, 0))); + } + + private void doDamageFireworks(Location endLocation) { + for (int i = 0; i < 200; i++) { + endLocation.getWorld().spawnParticle(Particle.DUST, endLocation.getX(), endLocation.getY(), endLocation.getZ(), + 1, 3, 3, 3, + 1, new Particle.DustOptions(Color.fromRGB( + ThreadLocalRandom.current().nextInt(122, 255), + ThreadLocalRandom.current().nextInt(122, 255), + ThreadLocalRandom.current().nextInt(0, 100) + ), 1)); + } + } + + private void doVisualEffect(Location location, int counter) { + location.getWorld().spawnParticle(Particle.DUST, location.getX(), location.getY(), location.getZ(), + 10, 0.1 * counter / 12d, 0.1 * counter / 12d, 0.1 * counter / 12d, 1, new Particle.DustOptions(Color.fromRGB( + ThreadLocalRandom.current().nextInt(0, 100), + ThreadLocalRandom.current().nextInt(122, 255), + ThreadLocalRandom.current().nextInt(0, 100) + ), 1)); + } + + protected void finishDeactivation(EliteEntity eliteEntity) { + + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/ProjectileDamage.java b/src/main/java/com/magmaguy/elitemobs/powers/ProjectileDamage.java new file mode 100644 index 000000000..3e50dec9a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/ProjectileDamage.java @@ -0,0 +1,79 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.events.BossCustomAttackDamage; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Item; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.Iterator; +import java.util.List; + +public class ProjectileDamage { + + public static void doGoldNuggetDamage(List goldNuggets, EliteEntity eliteEntity) { + + new BukkitRunnable() { + + int timer = 0; + + @Override + public void run() { + + timer++; + if (goldNuggets.isEmpty()) { + cancel(); + return; + } + + for (Iterator iterator = goldNuggets.iterator(); iterator.hasNext(); ) { + Item goldNugget = iterator.next(); + if (goldNugget == null) { + iterator.remove(); + continue; + } + boolean removed = false; + for (Entity entity : goldNugget.getNearbyEntities(0.1, 0.1, 0.1)) + if (entity != eliteEntity.getLivingEntity() && entity instanceof LivingEntity livingEntity) { + if (entity instanceof Player player && player.isBlocking()) continue; + BossCustomAttackDamage.dealCustomDamage(eliteEntity.getLivingEntity(), livingEntity, 1); + removed = true; + } + + if (removed) { + iterator.remove(); + goldNugget.remove(); + } + + if (!removed && goldNugget.isOnGround()) { + iterator.remove(); + goldNugget.remove(); + } + } + + if (timer < 5 * 20) return; + + for (Iterator endIterator = goldNuggets.iterator(); endIterator.hasNext(); ) { + Item goldNugget = endIterator.next(); + goldNugget.remove(); + endIterator.remove(); + } + + cancel(); + + } + + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + + } + + public static void configureVisualProjectile(Item goldNugget) { + EntityTracker.registerVisualEffects(goldNugget); + goldNugget.setPickupDelay(Integer.MAX_VALUE); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/ShieldWall.java b/src/main/java/com/magmaguy/elitemobs/powers/ShieldWall.java new file mode 100644 index 000000000..07a235deb --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/ShieldWall.java @@ -0,0 +1,281 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.api.EliteMobExitCombatEvent; +import com.magmaguy.elitemobs.api.internal.RemovalReason; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.ElitePower; +import com.magmaguy.elitemobs.powers.meta.MinorPower; +import com.magmaguy.elitemobs.utils.VisualDisplay; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.EulerAngle; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.ThreadLocalRandom; + +public class ShieldWall extends MinorPower { + private final HashMap> armorStands = new HashMap<>(); + private final HashMap armorStandOffBaseOffsets = new HashMap<>(); + private double northHealthPool; + private double southHealthPool; + private double eastHealthPool; + private double westHealthPool; + @Getter + @Setter + private boolean isActive = false; + + public ShieldWall() { + super(PowersConfig.getPower("shield_wall.yml")); + offsetInitializer(); + } + + public boolean preventDamage(Player player, EliteEntity eliteEntity, double damage) { + if (!Objects.equals(player.getLocation().getWorld(), eliteEntity.getLocation().getWorld())) return false; + Vector direction = player.getLocation().subtract(eliteEntity.getLocation()).toVector().normalize(); + Direction damageDirection; + if (Math.abs(direction.getX()) > Math.abs(direction.getZ())) { + if (direction.getX() > 0) + damageDirection = Direction.EAST; + else + damageDirection = Direction.WEST; + } else if (direction.getZ() > 0) + damageDirection = Direction.SOUTH; + else + damageDirection = Direction.NORTH; + + switch (damageDirection) { + case NORTH: + if (northHealthPool > 0) { + northHealthPool -= damage; + return true; + } + break; + case SOUTH: + if (southHealthPool > 0) { + southHealthPool -= damage; + return true; + } + break; + case EAST: + if (eastHealthPool > 0) { + eastHealthPool -= damage; + return true; + } + break; + case WEST: + default: + if (westHealthPool > 0) { + westHealthPool -= damage; + return true; + } + } + return false; + } + + public void initialize(EliteEntity eliteEntity) { + if (ThreadLocalRandom.current().nextDouble() >= .1) return; + doCooldown(eliteEntity); + /* + 1 = north + 2 = east + 3 = south + 4 = west + */ + int direction = ThreadLocalRandom.current().nextInt(1, 5); + northHealthPool = eliteEntity.getLevel(); + southHealthPool = eliteEntity.getLevel(); + eastHealthPool = eliteEntity.getLevel(); + westHealthPool = eliteEntity.getLevel(); + switch (direction) { + case 1: + northHealthPool = 0; + break; + case 2: + eastHealthPool = 0; + break; + case 3: + southHealthPool = 0; + break; + case 4: + westHealthPool = 0; + break; + } + + for (int i = 1; i < 5; i++) + if (direction != i) + armorStands.put(directionConverter(i), armorStandCreator(directionConverter(i), eliteEntity)); + + armorStandTracker(eliteEntity); + setActive(true); + } + + private Direction directionConverter(int direction) { + switch (direction) { + case 1: + return Direction.NORTH; + case 2: + return Direction.EAST; + case 3: + return Direction.SOUTH; + case 4: + default: + return Direction.WEST; + } + } + + private void offsetInitializer() { + for (int i = 1; i < 5; i++) { + switch (i) { + case 1: + armorStandOffBaseOffsets.put(directionConverter(i), new Vector(0, 0, -1)); + break; + case 2: + armorStandOffBaseOffsets.put(directionConverter(i), new Vector(1, 0, 0)); + break; + case 3: + armorStandOffBaseOffsets.put(directionConverter(i), new Vector(0, 0, 1)); + break; + case 4: + default: + armorStandOffBaseOffsets.put(directionConverter(i), new Vector(-1, 0, 0)); + break; + } + } + } + + private Location getRealLocation(Direction direction, Location livingEntityLocation, int iteration) { + Vector finalOffsetVector; + if (direction.equals(Direction.NORTH) || direction.equals(Direction.SOUTH)) + finalOffsetVector = armorStandOffBaseOffsets.get(direction).clone().add(new Vector(iteration, 0, 0)); + else + finalOffsetVector = armorStandOffBaseOffsets.get(direction).clone().add(new Vector(0, 0, iteration)); + Location realLocation = livingEntityLocation.clone().add(finalOffsetVector); + switch (direction) { + case NORTH: + realLocation.setYaw(180); + break; + case SOUTH: + realLocation.setYaw(0f); + break; + case EAST: + realLocation.setYaw(-90); + break; + case WEST: + default: + realLocation.setYaw(90); + } + realLocation.setPitch(0); + return realLocation; + } + + private List armorStandCreator(Direction direction, EliteEntity eliteEntity) { + List armorStands = new ArrayList<>(); + for (int i = -1; i < 2; i++) { + ArmorStand armorStand = VisualDisplay.generateTemporaryArmorStand(getRealLocation(direction, eliteEntity.getLivingEntity().getLocation(), i), "Barrier"); + armorStands.add(armorStand); + armorStand.getEquipment().setItemInMainHand(new ItemStack(Material.SHIELD)); + armorStand.addEquipmentLock(EquipmentSlot.HAND, ArmorStand.LockType.REMOVING_OR_CHANGING); + armorStand.setRightArmPose(new EulerAngle(Math.PI / 2d, Math.PI + Math.PI / 2d, Math.PI)); + } + return armorStands; + } + + private void armorStandTracker(EliteEntity eliteEntity) { + Bukkit.getScheduler().runTaskTimer(MetadataHandler.PLUGIN, (task) -> { + if (!eliteEntity.isValid() || (northHealthPool == 0 && southHealthPool == 0 && eastHealthPool == 0 && westHealthPool == 0) || !isActive) { + task.cancel(); + setActive(false); + + for (List armorStands : armorStands.values()) + if (armorStands != null) + for (ArmorStand armorStand : armorStands) + if (armorStand != null && armorStand.isValid()) + EntityTracker.unregister(armorStand, RemovalReason.EFFECT_TIMEOUT); + + return; + } + int visualShieldsLeft = 0; + for (Direction direction : armorStands.keySet()) { + for (int i = -1; i < 2; i++) { + ArmorStand armorStand = armorStands.get(direction).get(i + 1); + if (armorStand == null || !armorStand.isValid()) continue; + switch (direction) { + case NORTH: + if (0.33 * (i + 1) >= northHealthPool / (double) eliteEntity.getLevel()) + EntityTracker.unregister(armorStand, RemovalReason.EFFECT_TIMEOUT); + break; + case SOUTH: + if (0.33 * (i + 1) >= southHealthPool / (double) eliteEntity.getLevel()) + EntityTracker.unregister(armorStand, RemovalReason.EFFECT_TIMEOUT); + break; + case EAST: + if (0.33 * (i + 1) >= eastHealthPool / (double) eliteEntity.getLevel()) + EntityTracker.unregister(armorStand, RemovalReason.EFFECT_TIMEOUT); + break; + case WEST: + default: + if (0.33 * (i + 1) >= westHealthPool / (double) eliteEntity.getLevel()) + EntityTracker.unregister(armorStand, RemovalReason.EFFECT_TIMEOUT); + } + + visualShieldsLeft++; + armorStand.teleport(getRealLocation(direction, eliteEntity.getLivingEntity().getLocation(), i)); + } + } + if (visualShieldsLeft == 0) { + task.cancel(); + setActive(false); + } + }, 1, 1); + } + + private enum Direction { + NORTH, + SOUTH, + EAST, + WEST + } + + public static class ShieldWallEvents implements Listener { + @EventHandler + public void onEliteHit(EliteMobDamagedByPlayerEvent event) { + ElitePower elitePower = event.getEliteMobEntity().getPower(new ShieldWall()); + if (elitePower == null) return; + ShieldWall shieldWall = (ShieldWall) elitePower; + if (!shieldWall.isActive()) { + if (!eventIsValid(event, elitePower)) return; + shieldWall.initialize(event.getEliteMobEntity()); + } else { + if (shieldWall.preventDamage(event.getPlayer(), event.getEliteMobEntity(), event.getDamage())) + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + public void onCombatLeaveEvent(EliteMobExitCombatEvent event) { + ElitePower elitePower = event.getEliteMobEntity().getPower(new ShieldWall()); + if (elitePower == null) return; + ShieldWall shieldWall = (ShieldWall) elitePower; + if (shieldWall.isActive) shieldWall.setActive(false); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/SkeletonPillar.java b/src/main/java/com/magmaguy/elitemobs/powers/SkeletonPillar.java new file mode 100644 index 000000000..6961ce965 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/SkeletonPillar.java @@ -0,0 +1,298 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.powers.meta.MajorPower; +import com.magmaguy.elitemobs.powerstances.GenericRotationMatrixMath; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.Sound; +import org.bukkit.entity.*; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.concurrent.ThreadLocalRandom; + +public class SkeletonPillar extends MajorPower implements Listener { + + private Location soundLocation; + + public SkeletonPillar() { + super(PowersConfig.getPower("skeleton_pillar.yml")); + } + + @EventHandler + public void onHit(EliteMobDamagedByPlayerEvent event) { + SkeletonPillar skeletonPillar = (SkeletonPillar) event.getEliteMobEntity().getPower(this); + if (skeletonPillar == null) return; + if (skeletonPillar.isInGlobalCooldown()) return; + + /* + Run random check to see if the power should activate + */ + if (ThreadLocalRandom.current().nextDouble() > 0.20) return; + skeletonPillar.doGlobalCooldown(20 * 27); + + event.getEliteMobEntity().getLivingEntity().setAI(false); + playPillarSong(event.getEntity().getLocation()); + + Location location1 = event.getEliteMobEntity().getLivingEntity().getLocation().clone() + .add(locationMover(event.getEliteMobEntity().getLivingEntity().getLocation().clone(), 20, 7)); + Location location2 = event.getEliteMobEntity().getLivingEntity().getLocation().clone() + .add(locationMover(event.getEliteMobEntity().getLivingEntity().getLocation().clone(), 20, -7)); + + new BukkitRunnable() { + + int timer = 1; + + @Override + public void run() { + + if (timer > 20 * 7 || !event.getEliteMobEntity().isValid()) { + + if (event.getEliteMobEntity().getLivingEntity() != null) + event.getEliteMobEntity().getLivingEntity().setAI(true); + cancel(); + + } else if (timer > 20 && timer < 20 * 7) { + + pillarEffect(event.getEliteMobEntity().getLivingEntity().getLocation().clone(), timer, 7); + pillarEffect(event.getEliteMobEntity().getLivingEntity().getLocation().clone(), timer, -7); + + } else { + + pillarWarningEffect(location1); + pillarWarningEffect(location2); + + } + + timer++; + + } + + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + + } + + private void pillarEffect(Location location, int timer, int offset) { + location.add(locationMover(location, timer, offset)); + location.getWorld().spawnParticle(Particle.EXPLOSION, location, 15, 0.1, 5, 0.1, 0.05); + pillarDamage(location); + } + + private void pillarWarningEffect(Location location) { + location.getWorld().spawnParticle(Particle.LARGE_SMOKE, location, 5, 0.1, 5, 0.1, 0.05); + } + + private void pillarDamage(Location location) { + for (Entity entity : location.getWorld().getNearbyEntities(location, 2, 5, 2)) + if (entity instanceof LivingEntity livingEntity && !(entity instanceof Pig || entity instanceof Cow || entity instanceof Chicken || + entity instanceof Wolf || entity instanceof Llama || entity instanceof Ocelot || entity instanceof Horse || + entity instanceof Sheep || entity instanceof Rabbit || entity instanceof Parrot || entity instanceof Villager)) { + + if (livingEntity.isValid()) + livingEntity.damage(1); + } + } + + private Location locationMover(Location location, int timer, int offset) { + int numberOfPointsPerRotation = 20 * 3; + Location newLocation = GenericRotationMatrixMath.applyRotation(0, 1, 0, numberOfPointsPerRotation, + 0, 0, offset, timer).toLocation(location.getWorld()); + return newLocation; + } + + private void playPillarSong(Location location) { + soundLocation = location; + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + counter++; + switch (counter) { + case 1: + playSound(d()); + break; + case 2: + playSound(d()); + break; + case 4: + playSound(eHigher()); + break; + case 7: + playSound(aHigher()); + break; + case 10: + playSound(aSharpHigher()); + break; + case 12: + playSound(gHigher()); + break; + case 14: + playSound(f()); + break; + case 16: + playSound(f()); + break; + case 17: + playSound(d()); + break; + case 18: + playSound(f()); + break; + case 19: + playSound(gHigher()); + break; + case 21: + playSound(c()); + break; + case 22: + playSound(c()); + break; + case 24: + playSound(eHigher()); + break; + case 27: + playSound(aHigher()); + break; + case 30: + playSound(aSharpHigher()); + break; + case 32: + playSound(gHigher()); + break; + case 34: + playSound(f()); + break; + case 36: + playSound(f()); + break; + case 37: + playSound(d()); + break; + case 38: + playSound(f()); + break; + case 39: + playSound(gHigher()); + break; + case 41: + playSound(b()); + break; + case 42: + playSound(b()); + break; + case 44: + playSound(eHigher()); + break; + case 47: + playSound(aHigher()); + break; + case 50: + playSound(aSharpHigher()); + break; + case 52: + playSound(gHigher()); + break; + case 54: + playSound(f()); + break; + case 56: + playSound(f()); + break; + case 57: + playSound(d()); + break; + case 58: + playSound(f()); + break; + case 59: + playSound(gHigher()); + break; + case 61: + playSound(aSharp()); + break; + case 62: + playSound(aSharp()); + break; + case 64: + playSound(eHigher()); + break; + case 67: + playSound(aHigher()); + break; + case 70: + playSound(aSharpHigher()); + break; + case 72: + playSound(gHigher()); + break; + case 74: + playSound(f()); + break; + case 76: + playSound(f()); + break; + case 77: + playSound(d()); + break; + case 78: + playSound(f()); + break; + case 79: + playSound(gHigher()); + break; + case 80: + cancel(); + break; + default: + break; + } + } + }.runTaskTimer(MetadataHandler.PLUGIN, 1, 2); + } + + private void playSound(float pitch) { + soundLocation.getWorld().playSound(soundLocation, Sound.BLOCK_NOTE_BLOCK_IRON_XYLOPHONE, 2f, pitch); + } + + private float d() { + return 0.793701f; + } + + private float eHigher() { + return 1.781797f; + } + + private float aHigher() { + return 1.189207f; + } + + private float aSharpHigher() { + return 1.259921f; + } + + private float gHigher() { + return 1.122462f; + } + + private float f() { + return 0.943874f; + } + + private float c() { + return 0.707107f; + } + + private float b() { + return 0.667420f; + } + + private float aSharp() { + return 0.629961f; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/SkeletonTrackingArrow.java b/src/main/java/com/magmaguy/elitemobs/powers/SkeletonTrackingArrow.java new file mode 100644 index 000000000..f0e83baf9 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/SkeletonTrackingArrow.java @@ -0,0 +1,86 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobTargetPlayerEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.MajorPower; +import org.bukkit.GameMode; +import org.bukkit.Particle; +import org.bukkit.entity.Arrow; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +public class SkeletonTrackingArrow extends MajorPower implements Listener { + + public SkeletonTrackingArrow() { + super(PowersConfig.getPower("skeleton_tracking_arrow.yml")); + } + + private static void trackingArrowLoop(Player player, Arrow arrow) { + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + if (player.isValid() && arrow.isValid() && arrow.getWorld().equals(player.getWorld()) + && player.getLocation().distanceSquared(arrow.getLocation()) < 900 && !arrow.isOnGround()) { + if (counter % 10 == 0) + arrow.setVelocity(arrow.getVelocity().add(arrowAdjustmentVector(arrow, player))); + arrow.getWorld().spawnParticle(Particle.FLAME, arrow.getLocation(), 10, 0.01, 0.01, 0.01, 0.01); + } else { + arrow.setGravity(true); + cancel(); + } + if (counter > 20 * 60) { + arrow.setGravity(true); + cancel(); + } + counter++; + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + private static Vector arrowAdjustmentVector(Arrow arrow, Player player) { + return player.getEyeLocation().clone().subtract(new Vector(0, 0.5, 0)).subtract(arrow.getLocation()).toVector().normalize().multiply(0.1); + } + + @EventHandler + public void targetEvent(EliteMobTargetPlayerEvent event) { + SkeletonTrackingArrow skeletonTrackingArrow = (SkeletonTrackingArrow) event.getEliteMobEntity().getPower(this); + if (skeletonTrackingArrow == null) return; + if (skeletonTrackingArrow.isFiring()) return; + + skeletonTrackingArrow.setFiring(true); + repeatingTrackingArrowTask(event.getEliteMobEntity(), skeletonTrackingArrow); + } + + private void repeatingTrackingArrowTask(EliteEntity eliteEntity, SkeletonTrackingArrow skeletonTrackingArrow) { + new BukkitRunnable() { + + @Override + public void run() { + if (!eliteEntity.isValid()) { + skeletonTrackingArrow.setFiring(false); + cancel(); + return; + } + for (Entity nearbyEntity : eliteEntity.getLivingEntity().getNearbyEntities(20, 20, 20)) + if (nearbyEntity instanceof Player) + if (((Player) nearbyEntity).getGameMode().equals(GameMode.ADVENTURE) || + ((Player) nearbyEntity).getGameMode().equals(GameMode.SURVIVAL)) { + Arrow arrow = AttackArrow.shootArrow(eliteEntity.getLivingEntity(), (Player) nearbyEntity); + arrow.setVelocity(arrow.getVelocity().multiply(0.1)); + arrow.setGravity(false); + trackingArrowLoop((Player) nearbyEntity, arrow); + } + } + + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 20 * 8); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/SpiritWalk.java b/src/main/java/com/magmaguy/elitemobs/powers/SpiritWalk.java new file mode 100644 index 000000000..f8b084362 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/SpiritWalk.java @@ -0,0 +1,267 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedEvent; +import com.magmaguy.elitemobs.api.EliteMobExitCombatEvent; +import com.magmaguy.elitemobs.combatsystem.antiexploit.PreventMountExploit; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.RegionalBossEntity; +import com.magmaguy.elitemobs.powers.meta.BossPower; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Mob; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.concurrent.ThreadLocalRandom; + +public class SpiritWalk extends BossPower implements Listener { + + private int hitCounter = 0; + + public SpiritWalk() { + super(PowersConfig.getPower("spirit_walk.yml")); + } + + public static void spiritWalkAnimation(EliteEntity eliteEntity, Location entityLocation, Location finalLocation) { + + eliteEntity.getLivingEntity().setAI(false); + eliteEntity.getLivingEntity().setInvulnerable(true); + eliteEntity.getLivingEntity().addPotionEffect(new PotionEffect(PotionEffectType.GLOWING, 20 * 10, 1)); + Vector toDestination = finalLocation.clone().subtract(entityLocation.clone()).toVector().normalize().divide(new Vector(2, 2, 2)); + eliteEntity.setCombatGracePeriod(20 * 20); + + new BukkitRunnable() { + + int counter = 0; + + @Override + public void run() { + + if (!eliteEntity.isValid()) { + cancel(); + return; + } + + if (eliteEntity.getLivingEntity().getLocation().clone().distance(finalLocation) < 2 || counter > 20 * 10) { + + eliteEntity.getLivingEntity().teleport(finalLocation); + eliteEntity.getLivingEntity().setAI(true); + eliteEntity.getLivingEntity().setInvulnerable(false); + eliteEntity.getLivingEntity().removePotionEffect(PotionEffectType.GLOWING); + cancel(); + + } + + eliteEntity.getLivingEntity().teleport(eliteEntity.getLivingEntity().getLocation().clone().add(toDestination.clone())); + + counter++; + + } + + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + + } + + public static void spiritWalkRegionalBossAnimation(EliteEntity eliteEntity, Location entityLocation, Location finalLocation) { + Bukkit.getScheduler().runTask(MetadataHandler.PLUGIN, bukkitTask -> { + if (eliteEntity.getLivingEntity() == null) return; + eliteEntity.getLivingEntity().setAI(false); + eliteEntity.getLivingEntity().setInvulnerable(true); + Vector toDestination = finalLocation.clone().subtract(entityLocation.clone()).toVector().normalize().divide(new Vector(2, 2, 2)); + + Entity vehicle = null; + + if (eliteEntity.getLivingEntity().isInsideVehicle()) { + vehicle = eliteEntity.getLivingEntity().getVehicle(); + if (vehicle instanceof LivingEntity) + ((LivingEntity) vehicle).setAI(false); + vehicle.setInvulnerable(true); + if (((CustomBossEntity) eliteEntity).getPhaseBossEntity() != null) + vehicle.remove(); + } + + new BukkitRunnable() { + final Entity vehicle = eliteEntity.getLivingEntity().getVehicle(); + + int counter = 0; + + @Override + public void run() { + if (!eliteEntity.isValid()) { + cancel(); + return; + } + + if (eliteEntity.getLivingEntity().isInsideVehicle()) + eliteEntity.getLivingEntity().leaveVehicle(); + + if (eliteEntity.getLivingEntity().getLocation().clone().distance(finalLocation) < 2 || counter > 20 * 10) { + + eliteEntity.getLivingEntity().setAI(true); + eliteEntity.getLivingEntity().setInvulnerable(false); + + if (vehicle != null && !vehicle.isDead()) + vehicle.teleport(finalLocation); + eliteEntity.getLivingEntity().teleport(finalLocation); + + if (vehicle != null && !vehicle.isDead()) { + if (vehicle instanceof LivingEntity) { + ((LivingEntity) vehicle).setAI(true); + EliteEntity vehicleBoss = EntityTracker.getEliteMobEntity(vehicle); + if (vehicleBoss != null) + Bukkit.getServer().getPluginManager().callEvent(new EliteMobExitCombatEvent(vehicleBoss, EliteMobExitCombatEvent.EliteMobExitCombatReason.SPIRIT_WALK)); + + } + + vehicle.setInvulnerable(false); + new BukkitRunnable() { + @Override + public void run() { + PreventMountExploit.bypass = true; + vehicle.addPassenger(eliteEntity.getLivingEntity()); + } + }.runTaskLater(MetadataHandler.PLUGIN, 1); + } + cancel(); + + Bukkit.getServer().getPluginManager().callEvent(new EliteMobExitCombatEvent(eliteEntity, EliteMobExitCombatEvent.EliteMobExitCombatReason.SPIRIT_WALK)); + if (eliteEntity.getLivingEntity() instanceof Mob) + if (((Mob) eliteEntity.getLivingEntity()).getTarget() == null && eliteEntity instanceof RegionalBossEntity regionalBossEntity) + CustomBossEntity.CustomBossEntityEvents.slowRegionalBoss(regionalBossEntity); + + } + + if (vehicle != null && !vehicle.isDead()) { + vehicle.teleport(eliteEntity.getLivingEntity().getLocation().clone().add(toDestination.clone())); + } + eliteEntity.getLivingEntity().teleport(eliteEntity.getLivingEntity().getLocation().clone().add(toDestination.clone())); + + counter++; + + } + + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + ); + + } + + private void incrementHitCounter() { + hitCounter++; + } + + private void resetHitsCounter() { + hitCounter = 0; + } + + private int getHitsCounter() { + return hitCounter; + } + + @EventHandler(ignoreCancelled = true) + public void onBossMobGotHit(EliteMobDamagedEvent event) { + SpiritWalk spiritWalk = (SpiritWalk) event.getEliteEntity().getPower(this); + if (spiritWalk == null) return; + + switch (event.getEntityDamageEvent().getCause()) { + case FIRE: + case FIRE_TICK: + case POISON: + case WITHER: + case THORNS: + case ENTITY_SWEEP_ATTACK: + return; + } + + if (event.getEntityDamageEvent().getCause().equals(EntityDamageEvent.DamageCause.DROWNING) || + event.getEntityDamageEvent().getCause().equals(EntityDamageEvent.DamageCause.SUFFOCATION)) + initializeSpiritWalk(event.getEliteEntity()); + + spiritWalk.incrementHitCounter(); + + + if (spiritWalk.getHitsCounter() < 9) return; + + spiritWalk.resetHitsCounter(); + initializeSpiritWalk(event.getEliteEntity()); + + } + + public void initializeSpiritWalk(EliteEntity eliteEntity) { + new BukkitRunnable() { + + int counter = 1; + + @Override + public void run() { + + if (counter > 3 || !eliteEntity.isValid()) { + cancel(); + return; + } + + Location bossLocation = eliteEntity.getLocation().clone(); + + for (int i = 0; i < 20; i++) { + + double randomizedX = (ThreadLocalRandom.current().nextDouble() - 0.5) * 5; + double randomizedY = ThreadLocalRandom.current().nextDouble() * 5; + double randomizedZ = (ThreadLocalRandom.current().nextDouble() - 0.5) * 5; + + Vector normalizedVector = new Vector(randomizedX, randomizedY, randomizedZ).normalize().multiply(7).multiply(counter); + + Location newSimulatedLocation = bossLocation.add(normalizedVector).clone(); + + Location newValidLocation = scanVertically(newSimulatedLocation); + + if (newValidLocation != null) { + spiritWalkAnimation(eliteEntity, eliteEntity.getLivingEntity().getLocation(), newValidLocation.add(new Vector(0.5, 1, 0.5))); + cancel(); + break; + } + + } + + counter++; + + } + + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + + } + + private Location scanVertically(Location simulatedLocation) { + int counter = 0; + + while (true) { + Location newLocation = simulatedLocation.clone().subtract(new Vector(0, counter, 0)); + if (locationValid(newLocation)) return newLocation; + counter++; + if (counter > 8) return null; + } + } + + private boolean locationValid(Location feetLocation) { + Location groundLocation = feetLocation.clone().add(new Vector(0, -1, 0)); + Location headLocation = feetLocation.clone().add(new Vector(0, 1, 0)); + return isNonVoidAir(feetLocation.getBlock().getType()) && isNonVoidAir(headLocation.getBlock().getType()) && groundLocation.getBlock().getType().isSolid(); + } + + private boolean isNonVoidAir(Material material) { + return material.equals(Material.AIR) || material.equals(Material.CAVE_AIR); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/SummonEmbers.java b/src/main/java/com/magmaguy/elitemobs/powers/SummonEmbers.java new file mode 100644 index 000000000..894b4ef50 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/SummonEmbers.java @@ -0,0 +1,73 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.powers.meta.BossPower; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.concurrent.ThreadLocalRandom; + +public class SummonEmbers extends BossPower implements Listener { + public SummonEmbers() { + super(PowersConfig.getPower("summon_embers.yml")); + } + + @EventHandler + public void onDamage(EliteMobDamagedByPlayerEvent event) { + SummonEmbers summonEmbers = (SummonEmbers) event.getEliteMobEntity().getPower(this); + if (summonEmbers == null) return; + if (!eventIsValid(event, summonEmbers)) return; + if (ThreadLocalRandom.current().nextDouble() > 0.25) return; + + summonEmbers.doGlobalCooldown(20 * 20, event.getEliteMobEntity()); + doSummonParticles(event.getEliteMobEntity()); + + } + + private void doSummonParticles(EliteEntity eliteEntity) { + eliteEntity.getLivingEntity().setAI(false); + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + counter++; + if (!eliteEntity.isValid()) { + cancel(); + return; + } + eliteEntity.getLivingEntity().getWorld().spawnParticle(Particle.FLAME, + eliteEntity.getLivingEntity().getLocation().add(new Vector(0, 1, 0)), 50, 0.0001, 0.0001, 0.0001); + if (counter < 20 * 3) return; + cancel(); + doSummon(eliteEntity); + eliteEntity.getLivingEntity().setAI(true); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + + } + + private void doSummon(EliteEntity eliteEntity) { + + for (int i = 0; i < 10; i++) { + Location spawnLocation = eliteEntity.getLivingEntity().getLocation(); + + CustomBossEntity.createCustomBossEntity("ember.yml").spawn(spawnLocation, eliteEntity.getLevel(), false); + + double x = ThreadLocalRandom.current().nextDouble() - 0.5; + double z = ThreadLocalRandom.current().nextDouble() - 0.5; + + eliteEntity.getLivingEntity().setVelocity(new Vector(x, 0.5, z)); + } + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/SummonTheReturned.java b/src/main/java/com/magmaguy/elitemobs/powers/SummonTheReturned.java new file mode 100644 index 000000000..7e8071037 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/SummonTheReturned.java @@ -0,0 +1,79 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.powers.meta.BossPower; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.concurrent.ThreadLocalRandom; + +public class SummonTheReturned extends BossPower implements Listener { + + public SummonTheReturned() { + super(PowersConfig.getPower("summon_the_returned.yml")); + } + + @EventHandler + public void onDamage(EliteMobDamagedByPlayerEvent event) { + if (event.isCancelled()) return; + SummonTheReturned summonTheReturned = (SummonTheReturned) event.getEliteMobEntity().getPower(this); + if (summonTheReturned == null) return; + if (!eventIsValid(event, summonTheReturned)) return; + if (ThreadLocalRandom.current().nextDouble() > 0.25) return; + + summonTheReturned.doGlobalCooldown(20 * 20, event.getEliteMobEntity()); + doSummonParticles(event.getEliteMobEntity()); + } + + private void doSummonParticles(EliteEntity eliteEntity) { + eliteEntity.getLivingEntity().setAI(false); + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + if (!eliteEntity.isValid()) { + cancel(); + return; + } + counter++; + eliteEntity.getLivingEntity().getWorld().spawnParticle(Particle.PORTAL, + eliteEntity.getLivingEntity().getLocation().add(new Vector(0, 1, 0)), 50, 0.01, 0.01, 0.01, 1); + if (counter < 20 * 3) return; + cancel(); + doSummon(eliteEntity); + eliteEntity.getLivingEntity().setAI(true); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + + } + + private void doSummon(EliteEntity eliteEntity) { + + for (int i = 0; i < 10; i++) { + Location spawnLocation = eliteEntity.getLivingEntity().getLocation(); + + CustomBossEntity.createCustomBossEntity("the_returned.yml").spawn(spawnLocation, eliteEntity.getLevel(), false); + + double x = ThreadLocalRandom.current().nextDouble() - 0.5; + double z = ThreadLocalRandom.current().nextDouble() - 0.5; + + try { + eliteEntity.getLivingEntity().setVelocity(new Vector(x, 0.5, z)); + } catch (Exception ex) { + Logger.warn("Attempted to complete Summon the Returned power but a reinforcement mob wasn't detected! Did the boss move to an area that prevents spawning?"); + } + } + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/Taunt.java b/src/main/java/com/magmaguy/elitemobs/powers/Taunt.java new file mode 100644 index 000000000..94fd0b006 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/Taunt.java @@ -0,0 +1,118 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedEvent; +import com.magmaguy.elitemobs.api.EliteMobDeathEvent; +import com.magmaguy.elitemobs.api.EliteMobTargetPlayerEvent; +import com.magmaguy.elitemobs.api.PlayerDamagedByEliteMobEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.config.powers.premade.TauntConfig; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.MinorPower; +import com.magmaguy.magmacore.util.ChatColorConverter; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +/** + * Created by MagmaGuy on 06/05/2017. + */ +public class Taunt extends MinorPower implements Listener { + + private static final List TARGET_TAUNT_LIST = TauntConfig.onTarget; + private static final List GENERIC_DAMAGED_LIST = TauntConfig.onDamaged; + private static final List DAMAGED_BY_BOW_LIST = TauntConfig.onDamagedByBow; + private static final List HIT_LIST = TauntConfig.onDamage; + private static final List DEATH_LIST = TauntConfig.onDeath; + + public Taunt() { + super(PowersConfig.getPower("taunt.yml")); + } + + //Also used by the custom bosses + public static void nameTagProcessor(EliteEntity eliteEntity, Entity entity, List list) { + if (entity == null || !eliteEntity.isValid()) return; + int randomizedKey = ThreadLocalRandom.current().nextInt(list.size()); + String tempName = list.get(randomizedKey); + entity.setCustomName(ChatColorConverter.convert(tempName)); + new BukkitRunnable() { + + @Override + public void run() { + if (!entity.isValid()) + return; + entity.setCustomName(eliteEntity.getName()); + } + + + }.runTaskLater(MetadataHandler.PLUGIN, 4 * 20L); + } + + /** + * Runs when the Elite Mob targets a player + * + * @param event + */ + @EventHandler + public void onTarget(EliteMobTargetPlayerEvent event) { + if (!event.getEliteMobEntity().hasPower(this)) return; + nameTagProcessor(event.getEliteMobEntity(), event.getEliteMobEntity().getLivingEntity(), TARGET_TAUNT_LIST); + } + + /** + * Runs when the Elite Mob is damaged by a player + * + * @param event + */ + @EventHandler(ignoreCancelled = true) + public void onDamaged(EliteMobDamagedEvent event) { + if (!event.getEliteEntity().hasPower(this)) return; + + if (!(event.getEntity() instanceof LivingEntity) || + ((LivingEntity) event.getEntity()).getHealth() - event.getEntityDamageEvent().getFinalDamage() <= 0 || + !event.getEliteEntity().isValid()) + return; + + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(event.getEntity()); + if (eliteEntity == null) return; + if (eliteEntity.hasPower(this)) { + Entity entity = event.getEntity(); + + if (event.getEntityDamageEvent().getCause().equals(EntityDamageEvent.DamageCause.PROJECTILE)) + nameTagProcessor(eliteEntity, entity, DAMAGED_BY_BOW_LIST); + else + nameTagProcessor(eliteEntity, entity, GENERIC_DAMAGED_LIST); + } + + } + + /** + * Runs when the Elite Mob damages a player + * + * @param event + */ + @EventHandler + public void onHit(PlayerDamagedByEliteMobEvent event) { + if (!event.getEliteMobEntity().hasPower(this)) return; + nameTagProcessor(event.getEliteMobEntity(), event.getEliteMobEntity().getLivingEntity(), HIT_LIST); + } + + /** + * Runs when the Elite Mob dies + * + * @param event + */ + @EventHandler + public void onDeath(EliteMobDeathEvent event) { + if (!event.getEliteEntity().hasPower(this)) return; + nameTagProcessor(event.getEliteEntity(), event.getEntity(), DEATH_LIST); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/Taze.java b/src/main/java/com/magmaguy/elitemobs/powers/Taze.java new file mode 100644 index 000000000..1f28ca291 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/Taze.java @@ -0,0 +1,43 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.PlayerDamagedByEliteMobEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.powers.meta.BossPower; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scheduler.BukkitRunnable; + +public class Taze extends BossPower implements Listener { + + public Taze() { + super(PowersConfig.getPower("taze.yml")); + } + + @EventHandler(ignoreCancelled = true) + public void onPlayerDamagedEvent(PlayerDamagedByEliteMobEvent event) { + Taze taze = (Taze) event.getEliteMobEntity().getPower(this); + if (taze == null) return; + if (!eventIsValid(event, taze)) return; + taze.doCooldown(event.getEliteMobEntity()); + taze(event.getPlayer(), event.getEliteMobEntity().getLocation(), 0); + } + + public void taze(Player player, Location entityLocation, int counter) { + if (counter > 2) return; + player.setVelocity(player.getLocation().subtract(entityLocation.toVector()).toVector().normalize()); + player.sendTitle("", "Shocked!", 1, 30, 1); + player.addPotionEffect(new PotionEffect(PotionEffectType.SLOWNESS, 30, 5)); + new BukkitRunnable() { + @Override + public void run() { + taze(player, entityLocation, counter + 1); + } + }.runTaskLater(MetadataHandler.PLUGIN, 5); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/Thunderstorm.java b/src/main/java/com/magmaguy/elitemobs/powers/Thunderstorm.java new file mode 100644 index 000000000..2e84df92d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/Thunderstorm.java @@ -0,0 +1,92 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.collateralminecraftchanges.LightningSpawnBypass; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.BossPower; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.concurrent.ThreadLocalRandom; + +public class Thunderstorm extends BossPower implements Listener { + + public Thunderstorm() { + super(PowersConfig.getPower("thunderstorm.yml")); + } + + public static void doThunderstorm(EliteEntity eliteEntity) { + if (eliteEntity == null || !eliteEntity.getLivingEntity().isValid()) return; + eliteEntity.getLivingEntity().setAI(false); + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + counter++; + if (counter > 20 * 5 || eliteEntity.getLivingEntity() == null || !eliteEntity.getLivingEntity().isValid()) { + cancel(); + if (eliteEntity.getLivingEntity() != null) + eliteEntity.getLivingEntity().setAI(true); + return; + } + + if (counter % 2 == 0) { + Location randomLocation = eliteEntity.getLivingEntity().getLocation().clone().add(new Vector( + ThreadLocalRandom.current().nextInt(-20, 20), + 0, + ThreadLocalRandom.current().nextInt(-20, 20))); + lightningTask(randomLocation); + } + + + if (counter % 20 == 0) { + for (Entity entity : eliteEntity.getLivingEntity().getNearbyEntities(20, 20, 20)) + if (entity.getType().equals(EntityType.PLAYER)) + lightningTask(entity.getLocation()); + } + + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + public static void lightningTask(Location location) { + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + counter++; + if (counter > 20 * 3) { + LightningSpawnBypass.bypass(); + location.getWorld().strikeLightning(location); + cancel(); + return; + } + location.getWorld().spawnParticle(Particle.CRIT, location, 10, 0.5, 1.5, 0.5, 0.3); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + + } + + @EventHandler + public void onDamage(EliteMobDamagedByPlayerEvent event) { + Thunderstorm thunderstorm = (Thunderstorm) event.getEliteMobEntity().getPower(this); + if (thunderstorm == null) return; + if (!eventIsValid(event, thunderstorm)) return; + if (ThreadLocalRandom.current().nextDouble() > 0.25) return; + + thunderstorm.doGlobalCooldown(20 * 20, event.getEliteMobEntity()); + doThunderstorm(event.getEliteMobEntity()); + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/TrackingFireball.java b/src/main/java/com/magmaguy/elitemobs/powers/TrackingFireball.java new file mode 100644 index 000000000..37bf93c86 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/TrackingFireball.java @@ -0,0 +1,135 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobTargetPlayerEvent; +import com.magmaguy.elitemobs.combatsystem.EliteProjectile; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.powers.meta.MajorPower; +import org.bukkit.GameMode; +import org.bukkit.entity.*; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.projectiles.ProjectileSource; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.HashMap; +import java.util.UUID; + +public class TrackingFireball extends MajorPower { + + public TrackingFireball() { + super(PowersConfig.getPower("tracking_fireball.yml")); + } + + public static class TrackingFireballEvents implements Listener { + + public static HashMap trackingFireballs = new HashMap<>(); + + @EventHandler(ignoreCancelled = true) + public void targetEvent(EliteMobTargetPlayerEvent event) { + if (!(event.getEliteMobEntity().getLivingEntity() instanceof Monster)) return; + TrackingFireball trackingFireball = (TrackingFireball) event.getEliteMobEntity().getPower(new TrackingFireball()); + if (trackingFireball == null) return; + if (trackingFireball.isFiring()) return; + + trackingFireball.setFiring(true); + new TrackingFireballTasks((Monster) event.getEntity(), trackingFireball); + } + + @EventHandler(ignoreCancelled = true) + public void onFireballPunched(EntityDamageByEntityEvent event) { + TrackingFireballTasks.TrackingFireballTask trackingFireballTask = trackingFireballs.get(event.getEntity().getUniqueId()); + if (trackingFireballTask == null) return; + trackingFireballTask.isAfterPlayer = !trackingFireballTask.isAfterPlayer; + } + + private class TrackingFireballTasks { + + public TrackingFireballTasks(Monster monster, TrackingFireball trackingFireball) { + + new BukkitRunnable() { + + @Override + public void run() { + + if (!monster.isValid() || monster.getTarget() == null) { + trackingFireball.setFiring(false); + cancel(); + return; + } + + for (Entity nearbyEntity : monster.getNearbyEntities(20, 20, 20)) + if (nearbyEntity instanceof Player) + if (((Player) nearbyEntity).getGameMode().equals(GameMode.ADVENTURE) || + ((Player) nearbyEntity).getGameMode().equals(GameMode.SURVIVAL)) + new TrackingFireballTask(monster, (Player) nearbyEntity); + + } + + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 20 * 8); + + } + + public class TrackingFireballTask { + public boolean isAfterPlayer = true; + private Fireball repeatingFireball = null; + + public TrackingFireballTask(Entity entity, Player player) { + Vector targetterToTargetted = player.getLocation().clone().toVector().subtract(entity.getLocation().toVector()).normalize().multiply(0.0001); + repeatingFireball = (Fireball) EliteProjectile.create(EntityType.FIREBALL, entity, player, targetterToTargetted, true); + repeatingFireball.setYield(3F); + repeatingFireball.setIsIncendiary(true); + repeatingFireball.setShooter((ProjectileSource) entity); + trackingFireballs.put(repeatingFireball.getUniqueId(), this); + + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + if (repeatingFireball == null || + !repeatingFireball.isValid() || + !entity.isValid() || + player.isDead() || + counter > 20 * 60 * 3 || + repeatingFireball.getLocation().getWorld() != player.getWorld()) { + cancel(); + return; + } + + if (isAfterPlayer) { + repeatingFireball.setDirection(setFireballDirection(player)); + repeatingFireball.setVelocity(setFireballDirection(player)); + } else { + repeatingFireball.setDirection(setFireballDirection(entity)); + repeatingFireball.setVelocity(setFireballDirection(entity)); + } + counter++; + } + }.runTaskTimer(MetadataHandler.PLUGIN, 1, 1); + } + + + private Vector setFireballDirection(Entity target) { + double fireballVelocity = PowersConfig.getPower("tracking_fireball.yml").getFileConfiguration().getDouble("fireballSpeed"); + if (target.getLocation().distanceSquared(repeatingFireball.getLocation()) > 1) + return target.getLocation().clone() + .add(new Vector(0, 1, 0)) + .toVector() + .subtract(repeatingFireball.getLocation().toVector()) + .normalize() + .multiply(fireballVelocity); + //when close aim for the ground due to a bug where entity speed syncs up with fireball speed + return target.getLocation().clone() + .toVector() + .subtract(repeatingFireball.getLocation().toVector()) + .normalize() + .multiply(fireballVelocity); + } + } + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/ZombieBloat.java b/src/main/java/com/magmaguy/elitemobs/powers/ZombieBloat.java new file mode 100644 index 000000000..c4ace553c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/ZombieBloat.java @@ -0,0 +1,151 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.powers.meta.MajorPower; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Giant; +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class ZombieBloat extends MajorPower implements Listener { + + public ZombieBloat() { + super(PowersConfig.getPower("zombie_bloat.yml")); + } + + @EventHandler + public void onHit(EliteMobDamagedByPlayerEvent event) { + ZombieBloat zombieBloat = (ZombieBloat) event.getEliteMobEntity().getPower(this); + if (zombieBloat == null) return; + if (zombieBloat.isInGlobalCooldown()) return; + + if (ThreadLocalRandom.current().nextDouble() > 0.20) return; + zombieBloat.doGlobalCooldown(20 * 10); + + /* + Create early warning that entity is about to bloat + */ + new BukkitRunnable() { + + final LivingEntity eventZombie = (LivingEntity) event.getEntity(); + int timer = 0; + + @Override + public void run() { + + if (timer > 40) { + bloatEffect(eventZombie); + cancel(); + } + + if (timer == 21) + eventZombie.setAI(false); + + + if (MobCombatSettingsConfig.isEnableWarningVisualEffects()) + eventZombie.getWorld().spawnParticle(Particle.TOTEM_OF_UNDYING, new Location(eventZombie.getWorld(), + eventZombie.getLocation().getX(), eventZombie.getLocation().getY() + + eventZombie.getHeight(), eventZombie.getLocation().getZ()), 20, timer / 24, + timer / 9d, timer / 24d, 0.1); + + timer++; + } + + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + private void bloatEffect(LivingEntity eventZombie) { + /* + Spawn giant for "bloat" effect + */ + Giant giant = (Giant) eventZombie.getWorld().spawnEntity(eventZombie.getLocation(), EntityType.GIANT); + giant.setAI(false); + + /* + Apply knockback to all living entities around the giant except for the original zombie entity + */ + List nearbyEntities = giant.getNearbyEntities(4, 15, 4); + List nearbyValidLivingEntities = new ArrayList<>(); + + if (nearbyEntities.size() > 0) + for (Entity entity : nearbyEntities) + if (entity instanceof LivingEntity && !entity.equals(eventZombie)) + nearbyValidLivingEntities.add((LivingEntity) entity); + + Location entityLocation = eventZombie.getLocation(); + + for (LivingEntity livingEntity : nearbyValidLivingEntities) { + + Location livingEntityLocation = livingEntity.getLocation(); + Vector toLivingEntityVector = livingEntityLocation.subtract(entityLocation).toVector(); + + /* + Normalize vector to apply powers uniformly + */ + Vector normalizedVector = toLivingEntityVector.normalize(); + normalizedVector = normalizedVector.multiply(new Vector(2, 0, 2)).add(new Vector(0, 1, 0)); + + try { + livingEntity.setVelocity(normalizedVector); + } catch (Exception e) { + livingEntity.setVelocity(new Vector(0, 1.5, 0)); + } + + } + + livingEntityEffect(nearbyValidLivingEntities); + + /* + Effect is done, start task to remove giant + */ + new BukkitRunnable() { + + @Override + public void run() { + giant.remove(); + eventZombie.setAI(true); + } + + }.runTaskLater(MetadataHandler.PLUGIN, 10); + + } + + private void livingEntityEffect(List livingEntities) { + if (livingEntities.size() == 0) return; + if (!MobCombatSettingsConfig.isEnableWarningVisualEffects()) + return; + + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + if (counter > 1.5 * 20) + cancel(); + for (LivingEntity livingEntity : livingEntities) + if (!(livingEntity == null || livingEntity.isDead() || !livingEntity.isValid())) + livingEntity.getWorld().spawnParticle(Particle.CLOUD, new Location(livingEntity.getWorld(), + livingEntity.getLocation().getX(), + livingEntity.getLocation().getY() + livingEntity.getHeight() - 1, + livingEntity.getLocation().getZ()), + 0, 0, 0, 0); + counter++; + } + + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/ZombieFriends.java b/src/main/java/com/magmaguy/elitemobs/powers/ZombieFriends.java new file mode 100644 index 000000000..710bc54cb --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/ZombieFriends.java @@ -0,0 +1,97 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.config.powers.premade.ZombieFriendsConfig; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.powers.meta.MajorPower; +import com.magmaguy.magmacore.util.ChatColorConverter; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.concurrent.ThreadLocalRandom; + +/** + * Created by MagmaGuy on 18/05/2017. + */ +public class ZombieFriends extends MajorPower implements Listener { + + public ZombieFriends() { + super(PowersConfig.getPower("zombie_friends.yml")); + } + + @EventHandler + public void onHit(EliteMobDamagedByPlayerEvent event) { + ZombieFriends zombieFriendConfig = (ZombieFriends) event.getEliteMobEntity().getPower(this); + if (zombieFriendConfig == null) return; + if (zombieFriendConfig.isFiring()) return; + + if (ThreadLocalRandom.current().nextDouble() > 0.01) return; + zombieFriendConfig.setFiring(true); + + CustomBossEntity reinforcement1 = CustomBossEntity.createCustomBossEntity("zombie_friends_friend.yml"); + reinforcement1.spawn(event.getEntity().getLocation(), event.getEliteMobEntity().getLevel(), false); + CustomBossEntity reinforcement2 = CustomBossEntity.createCustomBossEntity("zombie_friends_friend.yml"); + reinforcement2.spawn(event.getEntity().getLocation(), event.getEliteMobEntity().getLevel(), false); + + new BukkitRunnable() { + @Override + public void run() { + if (!event.getEliteMobEntity().isValid() || !reinforcement1.isValid() && !reinforcement2.isValid()) { + + if (reinforcement1 != null && reinforcement1.isValid()) { + nameClearer(reinforcement1); + reinforcement1.getLivingEntity().setCustomName(ChatColorConverter.convert(ZombieFriendsConfig.friendDeathMessage + .get(ThreadLocalRandom.current().nextInt(ZombieFriendsConfig.friendDeathMessage.size())))); + } + + if (reinforcement2 != null && reinforcement2.isValid()) { + nameClearer(reinforcement2); + reinforcement2.getLivingEntity().setCustomName(ChatColorConverter.convert(ZombieFriendsConfig.friendDeathMessage + .get(ThreadLocalRandom.current().nextInt(ZombieFriendsConfig.friendDeathMessage.size())))); + } + + cancel(); + + } else { + + if (ThreadLocalRandom.current().nextDouble() < 0.5) { + nameClearer(event.getEliteMobEntity()); + event.getEliteMobEntity().getLivingEntity().setCustomName(ChatColorConverter.convert(ZombieFriendsConfig.originalEntityDialog + .get(ThreadLocalRandom.current().nextInt(ZombieFriendsConfig.originalEntityDialog.size())))); + } + + if (ThreadLocalRandom.current().nextDouble() < 0.5 && reinforcement1.isValid()) { + nameClearer(reinforcement1); + reinforcement1.getLivingEntity().setCustomName(ChatColorConverter.convert(ZombieFriendsConfig.reinforcementDialog + .get(ThreadLocalRandom.current().nextInt(ZombieFriendsConfig.reinforcementDialog.size())))); + } + + if (ThreadLocalRandom.current().nextDouble() < 0.5 && reinforcement2.isValid()) { + nameClearer(reinforcement2); + reinforcement2.getLivingEntity().setCustomName(ChatColorConverter.convert(ZombieFriendsConfig.reinforcementDialog + .get(ThreadLocalRandom.current().nextInt(ZombieFriendsConfig.reinforcementDialog.size())))); + } + + } + } + }.runTaskTimer(MetadataHandler.PLUGIN, 20, 20 * 8); + + } + + private void nameClearer(EliteEntity eliteEntity) { + + new BukkitRunnable() { + @Override + public void run() { + if (eliteEntity.isValid()) + eliteEntity.setName(eliteEntity.getName(), true); + } + }.runTaskLater(MetadataHandler.PLUGIN, 20 * 3); + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/ZombieNecronomicon.java b/src/main/java/com/magmaguy/elitemobs/powers/ZombieNecronomicon.java new file mode 100644 index 000000000..058503d28 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/ZombieNecronomicon.java @@ -0,0 +1,267 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.api.internal.RemovalReason; +import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.powers.meta.MajorPower; +import com.magmaguy.elitemobs.powerstances.GenericRotationMatrixMath; +import com.magmaguy.elitemobs.powerstances.VisualItemInitializer; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Item; +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +import static com.magmaguy.magmacore.util.ChatColorConverter.convert; + +/** + * Created by MagmaGuy on 18/05/2017. + */ +public class ZombieNecronomicon extends MajorPower implements Listener { + + private int chantIndex = 0; + private final ArrayList entityList = new ArrayList<>(); + + public ZombieNecronomicon() { + super(PowersConfig.getPower("zombie_necronomicon.yml")); + } + + @EventHandler + public void onPlayerDetect(EliteMobDamagedByPlayerEvent event) { + ZombieNecronomicon zombieNecronomicon = (ZombieNecronomicon) event.getEliteMobEntity().getPower(this); + if (zombieNecronomicon == null) return; + if (zombieNecronomicon.isFiring()) return; + zombieNecronomicon.entityList.removeIf(entity -> !entity.exists()); + if (zombieNecronomicon.entityList.size() > 9) return; + zombieNecronomicon.setFiring(true); + necronomiconVisualEffect(event.getEliteMobEntity(), zombieNecronomicon); + spawnReinforcements(event.getEliteMobEntity(), event.getPlayer(), zombieNecronomicon); + } + + private void necronomiconVisualEffect(EliteEntity eliteEntity, ZombieNecronomicon zombieNecronomicon) { + + LivingEntity livingEntity = eliteEntity.getLivingEntity(); + livingEntity.setAI(false); + zombieNecronomicon.setFiring(true); + nameScroller(livingEntity, zombieNecronomicon); + + if (!MobCombatSettingsConfig.isEnableWarningVisualEffects()) + return; + + new BukkitRunnable() { + final HashMap> fourTrack = new HashMap<>(); + int counter = 0; + + @Override + public void run() { + if (!livingEntity.isValid() || livingEntity.hasAI()) { + for (List itemList : fourTrack.values()) + for (Item item : itemList) + item.remove(); + if (livingEntity.isValid()) + livingEntity.setCustomName(EntityTracker.getEliteMobEntity(livingEntity).getName()); + zombieNecronomicon.setFiring(false); + cancel(); + return; + } + + if (counter == 0) { + + //establish 4tracks + for (int i = 0; i < 8; i++) { + List itemList = new ArrayList<>(); + for (int j = 0; j < 4; j++) { + ItemStack itemStack = new ItemStack(Material.WRITTEN_BOOK, 1); + Item item = VisualItemInitializer.initializeItem(itemStack, livingEntity.getLocation()); + itemList.add(item); + } + fourTrack.put(i, itemList); + } + } else + itemMover(fourTrack, livingEntity, counter); + + counter++; + } + + }.runTaskTimer(MetadataHandler.PLUGIN, 5, 5); + + } + + private void itemMover(HashMap> xTrack, Entity entity, int counter) { + + double a = 0; + double b = 1; + double c = 0; + + double numberOfPointsPerFullRotation = 64; + + double x = 0; + double y = 0; + double z; + + for (int trackNumber : xTrack.keySet()) { + + List itemList = xTrack.get(trackNumber); + + for (Item item : itemList) { + + //each track is offset by 45 degrees + //items are then offset on the Z value depending on their position + + z = (itemList.indexOf(item) + 1); + + //to predict the counter offset value you have to divide 8 (for 8 tracks total) + + int newCounter = (int) (counter + trackNumber * (numberOfPointsPerFullRotation / 8)); + + Location currentLocation = item.getLocation(); + + Location centerLocationFixed = entity.getLocation().add(0, 3, 0); + + Vector vector = GenericRotationMatrixMath.applyRotation(a, b, c, numberOfPointsPerFullRotation, x, y, z, newCounter); + Location newLocation = new Location(entity.getWorld(), vector.getX(), vector.getY(), vector.getZ()).add(centerLocationFixed); + + Vector velocity = (newLocation.subtract(currentLocation)).toVector().multiply(0.3); + item.setVelocity(velocity); + + } + + } + + } + + private void nameScroller(LivingEntity livingEntity, ZombieNecronomicon zombieNecronomicon) { + + new BukkitRunnable() { + final String fullChant = convert(PowersConfig.getPower("zombie_necronomicon.yml").getFileConfiguration().getString("summoningChant")); + + @Override + public void run() { + + if (!livingEntity.isValid() || livingEntity.hasAI()) { + cancel(); + return; + } + + if (zombieNecronomicon.chantIndex + 31 > fullChant.length()) + zombieNecronomicon.chantIndex = 0; + + String subString = fullChant.substring(zombieNecronomicon.chantIndex, zombieNecronomicon.chantIndex + 31); + livingEntity.setCustomName(subString); + zombieNecronomicon.chantIndex++; + } + + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + + } + + private void spawnReinforcements(EliteEntity eliteEntity, LivingEntity targetted, ZombieNecronomicon zombieNecronomicon) { + + LivingEntity targetter = eliteEntity.getLivingEntity(); + + new BukkitRunnable() { + + @Override + public void run() { + + if (!eliteEntity.isValid() || !targetted.isValid() || !targetter.isValid() || targetted.getWorld() != targetter.getWorld() + || targetted.getLocation().distance(targetter.getLocation()) > 30) { + + for (CustomBossEntity entity : entityList) + if (entity.isValid()) + entity.remove(RemovalReason.REINFORCEMENT_CULL); + + if (eliteEntity.isValid()) + targetter.setAI(true); + cancel(); + return; + + } + + int randomizedNumber = ThreadLocalRandom.current().nextInt(5) + 1; + + entityList.removeIf(currentEntity -> !currentEntity.exists()); + + if (entityList.size() < 11) { + + targetter.setAI(false); + + if (!zombieNecronomicon.isFiring()) + necronomiconVisualEffect(eliteEntity, zombieNecronomicon); + + if (randomizedNumber < 5) { + + CustomBossEntity customBossEntity = CustomBossEntity.createCustomBossEntity("necronomicon_zombie.yml"); + if (customBossEntity == null) { + Logger.warn("necronomicon_zombie.yml is not valid!"); + return; + } + customBossEntity.spawn(targetter.getLocation(), eliteEntity.getLevel(), false); + + if (!customBossEntity.exists() || !customBossEntity.getLivingEntity().isValid()) { + targetter.setAI(true); + cancel(); + targetter.setAI(true); + cancel(); + return; + } + + customBossEntity.getLivingEntity().setVelocity(new Vector((ThreadLocalRandom.current().nextDouble() - 0.5) / 30, 0.5, + (ThreadLocalRandom.current().nextDouble() - 0.5) / 30)); + + eliteEntity.addReinforcement(customBossEntity); + + entityList.add(customBossEntity); + + } else { + + CustomBossEntity customBossEntity = CustomBossEntity.createCustomBossEntity("necronomicon_skeleton.yml"); + if (customBossEntity == null) { + Logger.warn("necronomicon_skeleton.yml is not valid!"); + targetter.setAI(true); + cancel(); + return; + } + customBossEntity.spawn(targetter.getLocation(), eliteEntity.getLevel(), false); + + if (!customBossEntity.getLivingEntity().isValid()) { + targetter.setAI(true); + cancel(); + return; + } + + customBossEntity.getLivingEntity().setVelocity(new Vector((ThreadLocalRandom.current().nextDouble() - 0.5) / 30, 0.5, + (ThreadLocalRandom.current().nextDouble() - 0.5) / 30)); + + eliteEntity.addReinforcement(customBossEntity); + + entityList.add(customBossEntity); + + } + + } else + targetter.setAI(true); + + } + + }.runTaskTimer(MetadataHandler.PLUGIN, 20 * 3L, 20 * 3L); + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/ZombieParents.java b/src/main/java/com/magmaguy/elitemobs/powers/ZombieParents.java new file mode 100644 index 000000000..d1de3e264 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/ZombieParents.java @@ -0,0 +1,113 @@ +package com.magmaguy.elitemobs.powers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.config.powers.premade.ZombieParentsConfig; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.powers.meta.MajorPower; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.concurrent.ThreadLocalRandom; + +/** + * Created by MagmaGuy on 13/05/2017. + */ +public class ZombieParents extends MajorPower implements Listener { + + public ZombieParents() { + super(PowersConfig.getPower("zombie_parents.yml")); + } + + private static void startDialog(CustomBossEntity reinforcementMom, CustomBossEntity reinforcementDad, EliteEntity bossEntity) { + new BukkitRunnable() { + @Override + public void run() { + if (!bossEntity.isValid()) { + doDeathMessages(reinforcementDad, reinforcementMom); + cancel(); + } else { + doDialog(reinforcementDad, reinforcementMom, bossEntity); + } + } + }.runTaskTimer(MetadataHandler.PLUGIN, 20, 20L * 8); + } + + private static void doDeathMessages(CustomBossEntity reinforcementDad, CustomBossEntity reinforcementMom) { + if (reinforcementDad.isValid()) { + nameClearer(reinforcementDad); + reinforcementDad.getLivingEntity().setCustomName(ZombieParentsConfig.getDeathMessage(). + get(ThreadLocalRandom.current().nextInt(ZombieParentsConfig.getDeathMessage().size()))); + } + + if (reinforcementMom.isValid()) { + nameClearer(reinforcementMom); + reinforcementMom.getLivingEntity().setCustomName(ZombieParentsConfig.getDeathMessage(). + get(ThreadLocalRandom.current().nextInt(ZombieParentsConfig.getDeathMessage().size()))); + } + } + + private static void doDialog(CustomBossEntity reinforcementDad, CustomBossEntity reinforcementMom, EliteEntity bossEntity) { + if (ThreadLocalRandom.current().nextDouble() < 0.5) { + nameClearer(bossEntity); + bossEntity.getLivingEntity().setCustomName(ZombieParentsConfig.getBossEntityDialog(). + get(ThreadLocalRandom.current().nextInt(ZombieParentsConfig.getBossEntityDialog().size()))); + } + + if (ThreadLocalRandom.current().nextDouble() < 0.5 && reinforcementDad.isValid()) { + nameClearer(reinforcementDad); + reinforcementDad.getLivingEntity().setCustomName(ZombieParentsConfig.getZombieDad(). + get(ThreadLocalRandom.current().nextInt(ZombieParentsConfig.getZombieDad().size()))); + } + + if (ThreadLocalRandom.current().nextDouble() < 0.5 && reinforcementMom.isValid()) { + nameClearer(reinforcementMom); + reinforcementMom.getLivingEntity().setCustomName(ZombieParentsConfig.getZombieMom(). + get(ThreadLocalRandom.current().nextInt(ZombieParentsConfig.getZombieMom().size()))); + } + } + + private static void nameClearer(EliteEntity eliteEntity) { + + new BukkitRunnable() { + @Override + public void run() { + if (eliteEntity.isValid()) + eliteEntity.setName(eliteEntity.getName(), true); + } + }.runTaskLater(MetadataHandler.PLUGIN, 20L * 3); + + } + + @EventHandler + public void onHit(EliteMobDamagedByPlayerEvent event) { + ZombieParents zombieParents = (ZombieParents) event.getEliteMobEntity().getPower(this); + if (zombieParents == null) return; + if (zombieParents.isFiring()) return; + + if (ThreadLocalRandom.current().nextDouble() > 0.01) return; + zombieParents.setFiring(false); + + CustomBossEntity reinforcementMom = CustomBossEntity.createCustomBossEntity("zombie_parents_mom.yml"); + try { + reinforcementMom.spawn(event.getEntity().getLocation(), event.getEliteMobEntity().getLevel(), false); + } catch (Exception ex) { + Logger.warn("Failed to spawn Zombie Parents Mom reinforcement!"); + return; + } + CustomBossEntity reinforcementDad = CustomBossEntity.createCustomBossEntity("zombie_parents_dad.yml"); + try { + reinforcementDad.spawn(event.getEntity().getLocation(), event.getEliteMobEntity().getLevel(), false); + } catch (Exception ex) { + Logger.warn("Failed to spawn Zombie Parents Dad reinforcement!"); + return; + } + + startDialog(reinforcementMom, reinforcementDad, event.getEliteMobEntity()); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/meta/Bombardment.java b/src/main/java/com/magmaguy/elitemobs/powers/meta/Bombardment.java new file mode 100644 index 000000000..010d97790 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/meta/Bombardment.java @@ -0,0 +1,148 @@ +package com.magmaguy.elitemobs.powers.meta; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobEnterCombatEvent; +import com.magmaguy.elitemobs.api.EliteMobExitCombatEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.utils.EnderDragonPhaseSimplifier; +import org.bukkit.entity.EnderDragon; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; + +import java.util.ArrayList; +import java.util.concurrent.ThreadLocalRandom; + +public abstract class Bombardment extends MajorPower implements Listener { + + public static ArrayList bombardments = new ArrayList<>(); + public int firingTimer = 0; + private boolean isActive = false; + private boolean firing = false; + private BukkitTask task = null; + + public Bombardment(PowersConfigFields powersConfigFields) { + super(powersConfigFields); + bombardments.add(powersConfigFields.getFilename()); + } + + public void activate(EliteEntity eliteEntity) { + + if (isActive) return; + isActive = true; + + task = new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + + counter++; + + if (stopCondition(eliteEntity)) + return; + + if (firing || isInCooldown(eliteEntity)) + return; + + if (ThreadLocalRandom.current().nextDouble() > 0.1) return; + + if (eliteEntity.getLivingEntity().getType().equals(EntityType.ENDER_DRAGON)) { + EnderDragon.Phase phase = ((EnderDragon) eliteEntity.getLivingEntity()).getPhase(); + if (phase.equals(EnderDragon.Phase.DYING) || + phase.equals(EnderDragon.Phase.HOVER) || + phase.equals(EnderDragon.Phase.ROAR_BEFORE_ATTACK) || + phase.equals(EnderDragon.Phase.FLY_TO_PORTAL) || + phase.equals(EnderDragon.Phase.SEARCH_FOR_BREATH_ATTACK_TARGET)) { + return; + } + } + + for (Entity entity : eliteEntity.getLivingEntity().getNearbyEntities(10, 100, 10)) { + if (entity.getType().equals(EntityType.PLAYER)) { + firing = true; + fire(eliteEntity); + return; + } + } + + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 5); + } + + public void deactivate() { + firing = false; + isActive = false; + if (task != null) + task.cancel(); + } + + private boolean stopCondition(EliteEntity eliteEntity) { + if (eliteEntity == null || + eliteEntity.getLivingEntity() == null || + !eliteEntity.isValid() || + !eliteEntity.isInCombat()) { + deactivate(); + return true; + } + + if (eliteEntity.getLivingEntity().getType().equals(EntityType.ENDER_DRAGON)) + return !EnderDragonPhaseSimplifier.isFlying( + ((EnderDragon) eliteEntity.getLivingEntity()).getPhase(), + false); + + return false; + } + + private void fire(EliteEntity eliteEntity) { + + doCooldown(eliteEntity); + + isActive = true; + + firingTimer = 0; + + new BukkitRunnable() { + + @Override + public void run() { + firingTimer++; + if (stopCondition(eliteEntity) || firingTimer > 20 * 5) { + cancel(); + firing = false; + return; + } + + taskBehavior(eliteEntity); + + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + public abstract void taskBehavior(EliteEntity eliteEntity); + + public static class BombardmentEvents implements Listener { + @EventHandler + public void onCombatEnter(EliteMobEnterCombatEvent event) { + for (String bombardmentPower : bombardments) { + Bombardment bombardment = (Bombardment) event.getEliteMobEntity().getPower(bombardmentPower); + if (bombardment == null) continue; + bombardment.activate(event.getEliteMobEntity()); + } + } + + @EventHandler + public void onCombatLeave(EliteMobExitCombatEvent event) { + for (String bombardmentPower : bombardments) { + Bombardment bombardment = (Bombardment) event.getEliteMobEntity().getPower(bombardmentPower); + if (bombardment == null) continue; + bombardment.deactivate(); + } + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/meta/BossPower.java b/src/main/java/com/magmaguy/elitemobs/powers/meta/BossPower.java new file mode 100644 index 000000000..3a6c1a2b0 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/meta/BossPower.java @@ -0,0 +1,9 @@ +package com.magmaguy.elitemobs.powers.meta; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; + +public abstract class BossPower extends ElitePower { + protected BossPower(PowersConfigFields powersConfigFields) { + super(powersConfigFields); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/meta/CombatEnterScanPower.java b/src/main/java/com/magmaguy/elitemobs/powers/meta/CombatEnterScanPower.java new file mode 100644 index 000000000..3dfdd99ab --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/meta/CombatEnterScanPower.java @@ -0,0 +1,73 @@ +package com.magmaguy.elitemobs.powers.meta; + +import com.magmaguy.elitemobs.api.EliteMobEnterCombatEvent; +import com.magmaguy.elitemobs.api.EliteMobExitCombatEvent; +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.scheduler.BukkitTask; + +import java.util.HashSet; + +public abstract class CombatEnterScanPower extends MajorPower implements Listener { + + public static HashSet combatEnterScanPowers = new HashSet<>(); + public BukkitTask bukkitTask = null; + private boolean isActive = false; + + public CombatEnterScanPower(PowersConfigFields powersConfigFields) { + super(powersConfigFields); + combatEnterScanPowers.add(this); + } + + protected void activate(EliteEntity eliteEntity) { + if (isActive) return; + isActive = true; + finishActivation(eliteEntity); + } + + protected abstract void finishActivation(EliteEntity eliteEntity); + + public void deactivate(EliteEntity eliteEntity) { + if (bukkitTask != null && !bukkitTask.isCancelled()) bukkitTask.cancel(); + isActive = false; + finishDeactivation(eliteEntity); + } + + protected abstract void finishDeactivation(EliteEntity eliteEntity); + + protected boolean doExit(EliteEntity eliteEntity) { + if (eliteEntity == null || + !eliteEntity.isValid()) { + deactivate(eliteEntity); + return true; + } + + return false; + } + + public static class MajorCombatEnterScanningPowerEvents implements Listener { + @EventHandler + public void onCombatEnter(EliteMobEnterCombatEvent event) { + for (CombatEnterScanPower combatEnterScanPower : combatEnterScanPowers) { + ElitePower elitePowerInstance = event.getEliteMobEntity().getPower(combatEnterScanPower); + if (elitePowerInstance == null) + continue; + ((CombatEnterScanPower) elitePowerInstance).activate(event.getEliteMobEntity()); + } + + } + + @EventHandler + public void onCombatExit(EliteMobExitCombatEvent event) { + for (CombatEnterScanPower combatEnterScanPower : combatEnterScanPowers) { + ElitePower elitePowerInstance = event.getEliteMobEntity().getPower(combatEnterScanPower); + if (elitePowerInstance == null) + continue; + ((CombatEnterScanPower) elitePowerInstance).deactivate(event.getEliteMobEntity()); + } + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/meta/CustomSummonPower.java b/src/main/java/com/magmaguy/elitemobs/powers/meta/CustomSummonPower.java new file mode 100644 index 000000000..dcd160317 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/meta/CustomSummonPower.java @@ -0,0 +1,736 @@ +package com.magmaguy.elitemobs.powers.meta; + +import com.magmaguy.elitemobs.CrashFix; +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.api.EliteMobDeathEvent; +import com.magmaguy.elitemobs.api.EliteMobEnterCombatEvent; +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfig; +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfigFields; +import com.magmaguy.elitemobs.config.customspawns.CustomSpawnConfig; +import com.magmaguy.elitemobs.config.powers.PowersConfig; +import com.magmaguy.elitemobs.mobconstructor.CustomSpawn; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEscapeMechanism; +import com.magmaguy.elitemobs.mobconstructor.custombosses.RegionalBossEntity; +import com.magmaguy.elitemobs.powers.specialpowers.EnderCrystalLightningRod; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.Location; +import org.bukkit.NamespacedKey; +import org.bukkit.entity.*; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.persistence.PersistentDataType; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; +import org.bukkit.util.Vector; + +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; + +import static com.magmaguy.elitemobs.utils.MapListInterpreter.*; + +public class CustomSummonPower extends ElitePower implements Listener { + + private final List customBossReinforcements = new ArrayList<>(); + private final CustomBossesConfigFields customBossesConfigFields; + + public CustomSummonPower(Object powerObject, CustomBossesConfigFields customBossesConfigFields) { + super(PowersConfig.getPower("custom_summon.yml")); + this.customBossesConfigFields = customBossesConfigFields; + //This allows an arbitrary amount of reinforcements to be added at any point, class initialization just prepares the stage + addEntry(powerObject, customBossesConfigFields.getFilename()); + } + + public static CustomBossEntity summonReinforcement(EliteEntity summoningEntity, Location spawnLocation, String reinforcementFilename, int duration) { + CustomBossesConfigFields fields = CustomBossesConfig.getCustomBoss(reinforcementFilename); + if (fields == null) { + Logger.warn("Attempted to summon reinforcement " + reinforcementFilename + " which is not a valid reinforcement!"); + return null; + } + CustomBossEntity customBossEntity = new CustomBossEntity(fields); + customBossEntity.setSummoningEntity(summoningEntity); + if (summoningEntity instanceof CustomBossEntity summoner && summoner.isNormalizedCombat()) + customBossEntity.setNormalizedCombat(); + summoningEntity.addReinforcement(customBossEntity); + if (duration > 0) CustomBossEscapeMechanism.startEscapeTicks(duration, customBossEntity); + customBossEntity.spawn(spawnLocation, true); + return customBossEntity; + } + + public static BukkitTask summonGlobalReinforcement(CustomBossReinforcement customBossReinforcement, CustomBossEntity summoningEntity) { + if (customBossReinforcement.customSpawn == null || customBossReinforcement.customSpawn.isEmpty()) { + Logger.warn("Reinforcement for boss " + summoningEntity.getCustomBossesConfigFields().getFilename() + " has an incorrectly configured global reinforcement for " + customBossReinforcement.bossFileName); + return null; + } + return new BukkitRunnable() { + @Override + public void run() { + if (summoningEntity.getGlobalReinforcementsCount() > 30 * summoningEntity.getSpawnLocation().getWorld().getPlayers().size()) + return; + for (int i = 0; i < customBossReinforcement.amount; i++) { + CustomBossEntity customBossEntity = CustomBossEntity.createCustomBossEntity(customBossReinforcement.bossFileName); + if (customBossEntity == null) { + Logger.warn("Failed to spawn reinforcement because boss " + customBossReinforcement.bossFileName + " was invalid! Does the file exist? Is it configured correctly?"); + return; + } + if (summoningEntity.isNormalizedCombat()) + customBossEntity.setNormalizedCombat(); + CustomSpawn customSpawn = new CustomSpawn(customBossReinforcement.customSpawn, customBossEntity); + //Case if the spawn fails + if (customSpawn.getCustomSpawnConfigFields() == null) continue; + customSpawn.setWorld(summoningEntity.getSpawnLocation().getWorld()); + customSpawn.queueSpawn(); + summoningEntity.addGlobalReinforcement(customBossEntity); + customBossReinforcement.isSummoned = true; + customBossEntity.setSummoningEntity(summoningEntity); + } + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 20L * 10); + } + + public List getCustomBossReinforcements() { + return customBossReinforcements; + } + + public void addEntry(Object powerEntry, String filename) { + Map map; + if (powerEntry instanceof String) + processOldFormats((String) powerEntry, filename); + else if (powerEntry instanceof Map) { + map = (Map) powerEntry; + processNewFormat(map, filename); + } + } + + private void processNewFormat(Map map, String configFilename) { + SummonType summonType = null; + String filename = null; + Vector location = null; + Double chance = 1D; + boolean lightningRod = false; + boolean inheritAggro = false; + boolean inheritLevel = false; + String customSpawn = ""; + int amount = 1; + boolean spawnNearby = false; + for (Map.Entry entry : map.entrySet()) { + switch (entry.getKey().toLowerCase(Locale.ROOT)) { + //this just tags it for parsing + case "summonable": + break; + case "summontype": + summonType = parseEnum(entry.getKey(), entry.getValue(), SummonType.class, customBossesConfigFields.getFilename()); + break; + case "filename": + filename = parseString(entry.getKey(), entry.getValue(), customBossesConfigFields.getFilename()); + break; + case "chance": + chance = parseDouble(entry.getKey(), entry.getValue(), customBossesConfigFields.getFilename()); + break; + case "location": + String locationString = parseString(entry.getKey(), entry.getValue(), customBossesConfigFields.getFilename()); + try { + location = new Vector( + Double.parseDouble(locationString.split(",")[0]), + Double.parseDouble(locationString.split(",")[1]), + Double.parseDouble(locationString.split(",")[2])); + } catch (Exception ex) { + Logger.warn("Failed to get location for string " + locationString + " in " + customBossesConfigFields.getFilename()); + } + break; + case "lightningrod": + lightningRod = parseBoolean(entry.getKey(), entry.getValue(), customBossesConfigFields.getFilename()); + break; + case "inheritaggro": + inheritAggro = parseBoolean(entry.getKey(), entry.getValue(), customBossesConfigFields.getFilename()); + break; + case "amount": + amount = parseInteger(entry.getKey(), entry.getValue(), customBossesConfigFields.getFilename()); + break; + case "inheritlevel": + inheritLevel = parseBoolean(entry.getKey(), entry.getValue(), customBossesConfigFields.getFilename()); + break; + case "spawnnearby": + spawnNearby = parseBoolean(entry.getKey(), entry.getValue(), customBossesConfigFields.getFilename()); + break; + case "customspawn": + if (CustomSpawnConfig.getCustomEvent(parseString(entry.getKey(), entry.getValue(), customBossesConfigFields.getFilename())) == null) + Logger.warn("Failed to determine Custom Spawn file for filename " + entry.getValue()); + else { + customSpawn = parseString(entry.getKey(), entry.getValue(), customBossesConfigFields.getFilename()); + } + break; + default: + Logger.warn("Invalid boss reinforcement!"); + Logger.warn("Problematic entry: " + entry.getValue()); + } + } + + if (summonType == null) { + Logger.warn("No summon type detected in " + customBossesConfigFields.getFilename() + " ! This reinforcement will not work."); + return; + } + + CustomBossReinforcement customBossReinforcement; + switch (summonType) { + case ONCE: + customBossReinforcement = doOnce(filename); + break; + case ON_HIT: + customBossReinforcement = doOnHit(filename, chance); + break; + case ON_DEATH: + customBossReinforcement = doOnDeath(filename); + break; + case ON_COMBAT_ENTER: + customBossReinforcement = doOnCombatEnter(filename); + break; + case ON_COMBAT_ENTER_PLACE_CRYSTAL: + customBossReinforcement = doOnCombatEnterPlaceCrystal(location, lightningRod); + break; + case GLOBAL: + customBossReinforcement = doGlobalSummonReinforcement(filename); + break; + default: + customBossReinforcement = null; + Logger.warn("Failed to determine summon type for reinforcement in " + customBossesConfigFields.getFilename() + " ! Contact the developer with this error!"); + } + + if (summonType != SummonType.ON_COMBAT_ENTER_PLACE_CRYSTAL) + if (customBossReinforcement == null || + customBossReinforcement.bossFileName == null || + CustomBossesConfig.getCustomBoss(customBossReinforcement.bossFileName) == null) { + Logger.warn("Could not get filename for reinforcement in file " + configFilename); + return; + } + + if (customBossReinforcement == null) + return; + + customBossReinforcement.inheritAggro = inheritAggro; + customBossReinforcement.amount = amount; + customBossReinforcement.inheritLevel = inheritLevel; + customBossReinforcement.spawnNearby = spawnNearby; + customBossReinforcement.customSpawn = customSpawn; + customBossReinforcement.summonChance = chance; + customBossReinforcement.setSpawnLocationOffset(location); + } + + /** + * Important: All this does is covert bosses to the new format! + * + * @param powerString + * @param configFilename + */ + private void processOldFormats(String powerString, String configFilename) { + Map newMap = new HashMap<>(); + /* + valid formats: + summonable: + summonType=ONCE/ON_HIT/ON_COMBAT_ENTER/ON_COMBAT_ENTER_PLACE_CRYSTAL/GLOBAL/ON_DEATH: + filename=filename.yml: + chance=double; + location=x,y,z: + lightningRod=true/false: + inheritAggro=true/false: + amount=int: + customSpawn=filename.yml + + summon:once:filename.yml + summon:onHit:%:filename.yml + summon:onCombatEnter:x,y,z:filename.yml + summon:onCombatEnterPlaceCrystal:x,y,z:boolean + */ + + //this is now considered to be legacy + if (powerString.split(":")[0].equalsIgnoreCase("summon")) { + if (powerString.split(":")[1].equalsIgnoreCase("once")) { + newMap.put("summonType", "ONCE"); + parseOnce(powerString); + } else if (powerString.split(":")[1].equalsIgnoreCase("onHit")) { + newMap.put("summonType", "ON_HIT"); + parseOnHit(powerString); + } else if (powerString.split(":")[1].equalsIgnoreCase("onCombatEnter")) { + newMap.put("summonType", "ON_COMBAT_ENTER"); + parseOnCombatEnter(powerString); + } else if (powerString.split(":")[1].equalsIgnoreCase("onCombatEnterPlaceCrystal")) { + newMap.put("summonType", "ON_COMBAT_ENTER_PLACE_CRYSTAL"); + parseOnCombatEnterPlaceCrystal(powerString); + } + replaceOldFormat(powerString, newMap); + + return; + } + + //this is the new recommended format for reinforcements + if (powerString.split(":")[0].equalsIgnoreCase("summonable")) { + SummonType summonType = null; + String filename = null; + Vector location = null; + Double chance = null; + boolean lightningRod = false; + boolean inheritAggro = false; + boolean inheritLevel = false; + String customSpawn = ""; + int amount = 1; + boolean spawnNearby = false; + + for (String substring : powerString.split(":")) { + switch (substring.split("=")[0].toLowerCase(Locale.ROOT)) { + //this just tags it for parsing + case "summonable": + break; + case "summontype": + try { + summonType = SummonType.valueOf(getSubstringField(substring)); + newMap.put("summonType", summonType.toString()); + } catch (Exception ex) { + Logger.warn("Failed to determine summon type from " + getSubstringField(substring)); + } + break; + case "filename": + try { + filename = getSubstringField(substring); + newMap.put("filename", filename); + } catch (Exception ex) { + Logger.warn("Failed to determine filename from " + getSubstringField(substring)); + } + break; + case "chance": + try { + chance = Double.parseDouble(getSubstringField(substring)); + newMap.put("chance", chance); + } catch (Exception ex) { + Logger.warn("Failed to determine chance from " + getSubstringField(substring)); + } + break; + case "location": + try { + String locationString = getSubstringField(substring); + newMap.put("location", locationString); + location = new Vector( + Double.parseDouble(locationString.split(",")[0]), + Double.parseDouble(locationString.split(",")[1]), + Double.parseDouble(locationString.split(",")[2])); + } catch (Exception ex) { + Logger.warn("Failed to determine location from " + getSubstringField(substring)); + } + break; + case "lightningrod": + try { + lightningRod = Boolean.parseBoolean(getSubstringField(substring)); + newMap.put("lightningRod", lightningRod); + } catch (Exception ex) { + Logger.warn("Failed to determine lightningRod from " + getSubstringField(substring)); + } + break; + case "inheritaggro": + try { + inheritAggro = Boolean.parseBoolean(getSubstringField(substring)); + newMap.put("inheritAggro", inheritAggro); + } catch (Exception ex) { + Logger.warn("Failed to determine inheritAggro from " + getSubstringField(substring)); + } + break; + case "amount": + try { + amount = Integer.parseInt(getSubstringField(substring)); + newMap.put("amount", amount); + } catch (Exception ex) { + Logger.warn("Failed to determine inheritAggro from " + getSubstringField(substring)); + } + break; + case "inheritlevel": + try { + inheritLevel = Boolean.parseBoolean(getSubstringField(substring)); + newMap.put("inheritLevel", inheritLevel); + } catch (Exception ex) { + Logger.warn("Failed to determine inheritLevel from " + getSubstringField(substring)); + } + break; + case "spawnnearby": + try { + spawnNearby = Boolean.parseBoolean(getSubstringField(substring)); + newMap.put("spawnNearby", spawnNearby); + } catch (Exception ex) { + Logger.warn("Failed to determine spawnNearby from " + getSubstringField(substring)); + } + break; + case "customspawn": + if (CustomSpawnConfig.getCustomEvent(getSubstringField(substring)) == null) + Logger.warn("Failed to determine Custom Spawn file for filename " + substring); + else { + customSpawn = getSubstringField(substring); + newMap.put("customSpawn", customSpawn); + } + break; + default: + Logger.warn("Invalid boss reinforcement string for line " + powerString + " !"); + Logger.warn("Problematic entry: " + substring); + } + } + + replaceOldFormat(powerString, newMap); + + if (summonType == null) { + Logger.warn("No summon type detected in " + powerString + " ! This reinforcement will not work."); + return; + } + + CustomBossReinforcement customBossReinforcement; + switch (summonType) { + case ONCE: + customBossReinforcement = doOnce(filename); + break; + case ON_HIT: + customBossReinforcement = doOnHit(filename, chance); + break; + case ON_DEATH: + customBossReinforcement = doOnDeath(filename); + break; + case ON_COMBAT_ENTER: + customBossReinforcement = doOnCombatEnter(filename); + break; + case ON_COMBAT_ENTER_PLACE_CRYSTAL: + customBossReinforcement = doOnCombatEnterPlaceCrystal(location, lightningRod); + break; + case GLOBAL: + customBossReinforcement = doGlobalSummonReinforcement(filename); + break; + default: + customBossReinforcement = null; + Logger.warn("Failed to determine summon type for reinforcement " + powerString + " ! Contact the developer with this error!"); + } + + if (customBossReinforcement == null) + return; + + customBossReinforcement.inheritAggro = inheritAggro; + customBossReinforcement.amount = amount; + customBossReinforcement.inheritLevel = inheritLevel; + customBossReinforcement.spawnNearby = spawnNearby; + customBossReinforcement.customSpawn = customSpawn; + customBossReinforcement.summonChance = chance; + customBossReinforcement.setSpawnLocationOffset(location); + + if (customBossReinforcement == null || + customBossReinforcement.bossFileName == null || + CustomBossesConfig.getCustomBoss(customBossReinforcement.bossFileName) == null) { + Logger.warn("Could not get filename for reinforcement in file " + configFilename); + } + + } + } + + private void replaceOldFormat(String entry, Map replacement) { + Iterator iterator = customBossesConfigFields.getPowers().iterator(); + while (iterator.hasNext()) { + Object power = iterator.next(); + if (power.equals(entry)) { + iterator.remove(); + break; + } + } + customBossesConfigFields.getPowers().add(replacement); + customBossesConfigFields.getFileConfiguration().set("powers", customBossesConfigFields.getPowers()); + customBossesConfigFields.saveFile(); + } + + + private String getSubstringField(String string) { + if (string.split("=").length < 2) return ""; + return string.split("=")[1]; + } + + //summon:once:filename.yml + private void parseOnce(String powerString) { + String[] strings = powerString.split(":"); + doOnce(strings[2]); + } + + private CustomBossReinforcement doOnce(String filename) { + CustomBossReinforcement customBossReinforcement = new CustomBossReinforcement(SummonType.ONCE, filename); + if (CustomBossesConfig.getCustomBoss(customBossReinforcement.bossFileName) == null) { + Logger.warn("Reinforcement mob " + customBossReinforcement.bossFileName + " is not valid! Filename: " + filename); + return null; + } + customBossReinforcements.add(customBossReinforcement); + return customBossReinforcement; + } + + //summon:onHit:%:filename.yml + private void parseOnHit(String powerString) { + String[] strings = powerString.split(":"); + doOnHit(strings[3], Double.parseDouble(strings[2])); + } + + private CustomBossReinforcement doOnHit(String filename, double chance) { + CustomBossReinforcement customBossReinforcement = new CustomBossReinforcement(SummonType.ON_HIT, filename); + customBossReinforcement.setSummonChance(chance); + if (CustomBossesConfig.getCustomBoss(customBossReinforcement.bossFileName) == null) { + Logger.warn("Reinforcement mob " + customBossReinforcement.bossFileName + " is not valid! Filename: " + filename); + return customBossReinforcement; + } + customBossReinforcements.add(customBossReinforcement); + return customBossReinforcement; + } + + private CustomBossReinforcement doOnDeath(String filename) { + CustomBossReinforcement customBossReinforcement = new CustomBossReinforcement(SummonType.ON_DEATH, filename); + if (CustomBossesConfig.getCustomBoss(customBossReinforcement.bossFileName) == null) { + Logger.warn("Reinforcement mob " + customBossReinforcement.bossFileName + " is not valid! Filename: " + filename); + return null; + } + customBossReinforcements.add(customBossReinforcement); + return customBossReinforcement; + } + + //summon:onCombatEnter:x,y,z:filename.yml + private void parseOnCombatEnter(String powerString) { + String[] strings = powerString.split(":"); + doOnCombatEnter(strings[3], new Vector( + Double.parseDouble(strings[2].split(",")[0]), + Double.parseDouble(strings[2].split(",")[1]), + Double.parseDouble(strings[2].split(",")[2]))); + + } + + private CustomBossReinforcement doOnCombatEnter(String filename, Vector vector) { + CustomBossReinforcement customBossReinforcement = new CustomBossReinforcement(SummonType.ON_COMBAT_ENTER, filename); + customBossReinforcement.setSpawnLocationOffset(vector); + return doOnCombatEnter(filename); + } + + private CustomBossReinforcement doOnCombatEnter(String filename) { + CustomBossReinforcement customBossReinforcement = new CustomBossReinforcement(SummonType.ON_COMBAT_ENTER, filename); + + if (CustomBossesConfig.getCustomBoss(customBossReinforcement.bossFileName) == null) { + Logger.warn("Reinforcement mob " + customBossReinforcement.bossFileName + " is not valid! Filename: " + filename); + return customBossReinforcement; + } + customBossReinforcements.add(customBossReinforcement); + return customBossReinforcement; + } + + //summon:onCombatEnterPlaceCrystal:x,y,z:boolean + private void parseOnCombatEnterPlaceCrystal(String powerString) { + String[] strings = powerString.split(":"); + doOnCombatEnterPlaceCrystal(new Vector( + Double.parseDouble(strings[2].split(",")[0]), + Double.parseDouble(strings[2].split(",")[1]), + Double.parseDouble(strings[2].split(",")[2])), Boolean.parseBoolean(strings[3])); + } + + private CustomBossReinforcement doOnCombatEnterPlaceCrystal(Vector location, boolean lightningRod) { + CustomBossReinforcement customBossReinforcement = new CustomBossReinforcement(SummonType.ON_COMBAT_ENTER, EntityType.END_CRYSTAL, lightningRod); + customBossReinforcement.setSpawnLocationOffset(location); + customBossReinforcements.add(customBossReinforcement); + return customBossReinforcement; + } + + private CustomBossReinforcement doGlobalSummonReinforcement(String filename) { + CustomBossReinforcement customBossReinforcement = new CustomBossReinforcement(SummonType.GLOBAL, filename); + CustomBossesConfigFields customBossesConfigFields = CustomBossesConfig.getCustomBoss(customBossReinforcement.bossFileName); + if (customBossesConfigFields == null) { + Logger.warn("Reinforcement mob " + customBossReinforcement.bossFileName + " is not valid! Filename: " + filename); + return null; + } + customBossReinforcement.entityType = customBossesConfigFields.getEntityType(); + customBossReinforcements.add(customBossReinforcement); + return customBossReinforcement; + } + + private void onHitSummonReinforcement(EliteEntity spawningEntity) { + for (CustomBossReinforcement customBossReinforcement : customBossReinforcements) { + if (customBossReinforcement.summonType.equals(SummonType.ONCE) && !customBossReinforcement.isSummoned) + summonReinforcement(spawningEntity, customBossReinforcement); + + if (customBossReinforcement.summonType.equals(SummonType.ON_HIT)) + summonReinforcement(spawningEntity, customBossReinforcement); + } + } + + private void onCombatEnterSummonReinforcement(EliteEntity spawningEntity) { + for (CustomBossReinforcement customBossReinforcement : customBossReinforcements) { + if (!customBossReinforcement.summonType.equals(SummonType.ON_COMBAT_ENTER)) continue; + if (customBossReinforcement.bossFileName != null) { + summonReinforcement(spawningEntity, customBossReinforcement); + } else { + + Location spawnLocation = getFinalSpawnLocation(spawningEntity, customBossReinforcement.spawnLocationOffset); + + Entity entity = spawnLocation.getWorld().spawnEntity(spawnLocation, customBossReinforcement.entityType); + entity.getPersistentDataContainer().set(new NamespacedKey(MetadataHandler.PLUGIN, "eliteCrystal"), PersistentDataType.STRING, "eliteCrystal"); + entity.setPersistent(false); + CrashFix.persistentTracker(entity); + + if (entity instanceof Mob && !spawningEntity.getDamagers().isEmpty()) { + Player target = null; + double damageDealt = 0; + for (Player player : spawningEntity.getDamagers().keySet()) { + if (spawningEntity.getDamagers().get(player) < damageDealt) continue; + target = player; + damageDealt = spawningEntity.getDamagers().get(player); + } + if (target != null) + ((Mob) entity).setTarget(target); + + } + + + if (customBossReinforcement.isLightningRod) + new EnderCrystalLightningRod(spawningEntity, (EnderCrystal) entity); + + customBossReinforcement.isSummoned = true; + spawningEntity.addReinforcement(entity); + } + } + + } + + private void onDeathSummonReinforcement(EliteEntity spawningEntity) { + for (CustomBossReinforcement customBossReinforcement : customBossReinforcements) + if (customBossReinforcement.summonType.equals(SummonType.ON_DEATH)) + summonReinforcement(spawningEntity, customBossReinforcement); + } + + private void summonReinforcement(EliteEntity eliteEntity, CustomBossReinforcement customBossReinforcement) { + if (customBossReinforcement.summonChance != null && ThreadLocalRandom.current().nextDouble() > customBossReinforcement.summonChance) + return; + for (int i = 0; i < customBossReinforcement.amount; i++) { + Location spawnLocation = eliteEntity.getLocation(); + if (customBossReinforcement.spawnLocationOffset != null) { + spawnLocation = getFinalSpawnLocation(eliteEntity, customBossReinforcement.spawnLocationOffset); + } + if (customBossReinforcement.spawnNearby) + for (int loc = 0; loc < 30; loc++) { + Location randomLocation = spawnLocation.clone().add(new Vector( + ThreadLocalRandom.current().nextInt(-15, 15), + 0, + ThreadLocalRandom.current().nextInt(-15, 15))); + randomLocation.setY(CustomSpawn.getHighestValidBlock(randomLocation, 256)); + if (randomLocation.getY() == -100) continue; + spawnLocation = randomLocation; + break; + } + + if (CustomBossesConfig.getCustomBoss(customBossReinforcement.bossFileName).isRegionalBoss()) { + RegionalBossEntity regionalBossEntity = RegionalBossEntity.createTemporaryRegionalBossEntity(customBossReinforcement.bossFileName, spawnLocation); + if (regionalBossEntity == null) { + Logger.warn("Failed to spawn reinforcement for " + eliteEntity.getName() + " because boss " + customBossReinforcement.bossFileName + " was invalid! Does the file exist? Is it configured correctly?"); + return; + } + if (eliteEntity instanceof CustomBossEntity summoner && summoner.isNormalizedCombat()) + regionalBossEntity.setNormalizedCombat(); + if (customBossReinforcement.inheritLevel) + regionalBossEntity.setLevel(eliteEntity.getLevel()); + if (!customBossReinforcement.summonType.equals(SummonType.ON_DEATH)) + eliteEntity.addReinforcement(regionalBossEntity); + customBossReinforcement.isSummoned = true; + regionalBossEntity.setSummoningEntity(eliteEntity); + regionalBossEntity.initialize(); + } else { + CustomBossEntity customBossEntity = CustomBossEntity.createCustomBossEntity(customBossReinforcement.bossFileName); + if (customBossEntity == null) { + Logger.warn("Failed to spawn reinforcement for " + eliteEntity.getName() + " because boss " + customBossReinforcement.bossFileName + " was invalid! Does the file exist? Is it configured correctly?"); + return; + } + if (eliteEntity instanceof CustomBossEntity summoner && summoner.isNormalizedCombat()) + customBossEntity.setNormalizedCombat(); + customBossEntity.setSpawnLocation(spawnLocation); + customBossEntity.setBypassesProtections(eliteEntity.getBypassesProtections()); + if (customBossReinforcement.inheritLevel) + customBossEntity.setLevel(eliteEntity.getLevel()); + customBossEntity.spawn(false); + if (customBossEntity.getLivingEntity() != null) + customBossEntity.getLivingEntity().setVelocity(new Vector(ThreadLocalRandom.current().nextDouble(0.2), 0.2, ThreadLocalRandom.current().nextDouble(0.2))); + if (!customBossReinforcement.summonType.equals(SummonType.ON_DEATH)) + eliteEntity.addReinforcement(customBossEntity); + customBossReinforcement.isSummoned = true; + customBossEntity.setSummoningEntity(eliteEntity); + } + } + } + + private Location getFinalSpawnLocation(EliteEntity summoningEntity, Vector spawnLocationOffset) { + Location finalSpawnLocation; + if (summoningEntity instanceof RegionalBossEntity) + finalSpawnLocation = summoningEntity.getSpawnLocation().add(spawnLocationOffset); + else if (summoningEntity == null) + finalSpawnLocation = null; + else + finalSpawnLocation = summoningEntity.getLocation().add(spawnLocationOffset); + return finalSpawnLocation; + } + + public enum SummonType { + ONCE, + ON_HIT, + ON_COMBAT_ENTER, + ON_DEATH, + ON_COMBAT_ENTER_PLACE_CRYSTAL, + GLOBAL + } + + public static class CustomSummonPowerEvent implements Listener { + @EventHandler(ignoreCancelled = true) + public void onHit(EliteMobDamagedByPlayerEvent event) { + CustomSummonPower customSummonPower = (CustomSummonPower) event.getEliteMobEntity().getPower("custom_summon.yml"); + if (customSummonPower == null) return; + if (!eventIsValid(event, customSummonPower, true)) return; + if (event.getDamage() < 3) return; + customSummonPower.onHitSummonReinforcement(event.getEliteMobEntity()); + } + + @EventHandler(ignoreCancelled = true) + public void onCombatEnter(EliteMobEnterCombatEvent event) { + CustomSummonPower customSummonPower = (CustomSummonPower) event.getEliteMobEntity().getPower("custom_summon.yml"); + if (customSummonPower == null) return; + customSummonPower.onCombatEnterSummonReinforcement(event.getEliteMobEntity()); + } + + @EventHandler + public void onDeath(EliteMobDeathEvent event) { + CustomSummonPower customSummonPower = (CustomSummonPower) event.getEliteEntity().getPower("custom_summon.yml"); + if (customSummonPower == null) return; + customSummonPower.onDeathSummonReinforcement(event.getEliteEntity()); + } + } + + public class CustomBossReinforcement { + public final SummonType summonType; + public Double summonChance; + public String bossFileName = null; + public Vector spawnLocationOffset; + public EntityType entityType; + public boolean isLightningRod; + public boolean inheritAggro = false; + public int amount = 1; + public boolean inheritLevel = false; + public boolean spawnNearby = false; + public String customSpawn; + private boolean isSummoned = false; + + public CustomBossReinforcement(SummonType summonType, String bossFileName) { + this.summonType = summonType; + this.bossFileName = bossFileName; + } + + public CustomBossReinforcement(SummonType summonType, EntityType entityType, boolean isLightningRod) { + this.summonType = summonType; + this.entityType = entityType; + this.isLightningRod = isLightningRod; + } + + public void setSummonChance(double summonChance) { + this.summonChance = summonChance; + } + + public void setSpawnLocationOffset(Vector vector) { + this.spawnLocationOffset = vector; + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/meta/ElitePower.java b/src/main/java/com/magmaguy/elitemobs/powers/meta/ElitePower.java new file mode 100644 index 000000000..c206505e5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/meta/ElitePower.java @@ -0,0 +1,202 @@ +package com.magmaguy.elitemobs.powers.meta; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteMobDamagedByPlayerEvent; +import com.magmaguy.elitemobs.api.PlayerDamagedByEliteMobEvent; +import com.magmaguy.elitemobs.config.CustomConfigFields; +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.scripts.EliteScript; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.entity.LivingEntity; +import org.bukkit.scheduler.BukkitRunnable; +import org.reflections.Reflections; + +import java.util.HashMap; +import java.util.HashSet; + +public class ElitePower { + + @Getter + private static final HashMap elitePowers = new HashMap<>(); + @Getter + private static final HashSet bossPowers = new HashSet<>(); + @Getter + private static final HashSet majorPowers = new HashSet<>(); + @Getter + private static final HashSet defensivePowers = new HashSet<>(); + @Getter + private static final HashSet miscellaneousPowers = new HashSet<>(); + @Getter + private static final HashSet offensivePowers = new HashSet<>(); + @Getter + private static final HashSet specialPowers = new HashSet<>(); + + @Getter + private final String fileName; + @Getter + private final CustomConfigFields powersConfigFields; + @Getter + private String trail = null; + @Getter + @Setter + private int powerCooldownTime = 0; + @Getter + @Setter + private int globalCooldownTime = 0; + @Getter + @Setter + private boolean inGlobalCooldown = false; + @Getter + private boolean powerCooldownActive = false; + @Getter + @Setter + private boolean isFiring = false; + + + //Constructor for scripts + public ElitePower(CustomConfigFields customConfigFields) { + this.fileName = customConfigFields.getFilename(); + this.powersConfigFields = customConfigFields; + } + + //Costructor for classic powers + public ElitePower(PowersConfigFields powersConfigFields) { + this.powersConfigFields = powersConfigFields; + this.fileName = powersConfigFields.getFilename(); + this.trail = powersConfigFields.getEffect(); + this.powerCooldownTime = powersConfigFields.getPowerCooldown(); + this.globalCooldownTime = powersConfigFields.getGlobalCooldown(); + } + + public static void addPower(EliteEntity eliteEntity, PowersConfigFields configFields) { + if (configFields.getEliteScriptBlueprints().isEmpty()) + try { + ElitePower elitePower = configFields.getElitePowerClass().newInstance(); + eliteEntity.getElitePowers().add(elitePower); + elitePower.applyPowers(eliteEntity.getLivingEntity()); + } catch (Exception ex) { + Logger.warn("Failed to assign power for config field " + configFields.getFilename()); + } + else + eliteEntity.getElitePowers().addAll(EliteScript.generateBossScripts(configFields.getEliteScriptBlueprints(), eliteEntity)); + } + + public static void initializePowers() { + Reflections reflections = new Reflections("com.magmaguy.elitemobs.powers"); + reflections.getSubTypesOf(ElitePower.class).forEach(power -> { + try { + ElitePower thisPower = power.newInstance(); + switch (((PowersConfigFields) thisPower.getPowersConfigFields()).getPowerType()) { + case DEFENSIVE -> defensivePowers.add(thisPower.getPowersConfigFields()); + case OFFENSIVE -> offensivePowers.add(thisPower.getPowersConfigFields()); + case MAJOR_BLAZE, MAJOR_ENDERMAN, MAJOR_SKELETON, MAJOR_GHAST, MAJOR_ZOMBIE -> + majorPowers.add(thisPower.getPowersConfigFields()); + case MISCELLANEOUS -> miscellaneousPowers.add(thisPower.getPowersConfigFields()); + } + elitePowers.put(thisPower.getFileName(), thisPower.getPowersConfigFields()); + } catch (Exception ex) { + //Not sure why stuff in the meta package is getting scanned, seems like the package scan isn't working as intended + //todo: figure out why package scanning is getting more than what is in the packages here + //Logger.warn("Failed to initialize power " + power.getName()); + } + }); + } + + protected static boolean eventIsValid(EliteMobDamagedByPlayerEvent event, ElitePower elitePower, boolean ignoreGlobalCooldown) { + if (event.isCancelled()) return false; + if (event.getEliteMobEntity().getLivingEntity() == null) return false; + if (!event.getEliteMobEntity().getLivingEntity().hasAI()) return false; + if (!ignoreGlobalCooldown) + if (elitePower.isInGlobalCooldown()) return false; + return !event.getEliteMobEntity().isInCooldown(); + } + + protected static boolean eventIsValid(EliteMobDamagedByPlayerEvent event, ElitePower elitePower) { + if (event.isCancelled()) return false; + if (event.getEliteMobEntity().getLivingEntity() == null) return false; + if (!event.getEliteMobEntity().getLivingEntity().hasAI()) return false; + if (elitePower.isInGlobalCooldown()) return false; + if (elitePower.isInCooldown(event.getEliteMobEntity())) return false; + return !event.getEliteMobEntity().isInCooldown(); + } + + protected static boolean eventIsValid(PlayerDamagedByEliteMobEvent event, ElitePower elitePower) { + if (event.isCancelled()) return false; + if (event.getEliteMobEntity().getLivingEntity() == null) return false; + if (!event.getEliteMobEntity().getLivingEntity().hasAI()) return false; + if (elitePower.isInGlobalCooldown()) return false; + return !event.getEliteMobEntity().isInCooldown(); + } + + /** + * This is overwritten by certain classes to apply powers to a living entity upon activation + * + * @param livingEntity + */ + public void applyPowers(LivingEntity livingEntity) { + //This is overwritten by certain classes to apply powers to a living entity upon activation + } + + public boolean isInCooldown(EliteEntity eliteEntity) { + return this.powerCooldownActive || eliteEntity.isInCooldown(); + } + + public void setInCooldown(EliteEntity eliteEntity, boolean inCooldown) { + eliteEntity.setInCooldown(inCooldown); + setInGlobalCooldown(inCooldown); + } + + public void doCooldown(EliteEntity eliteEntity) { + this.powerCooldownActive = true; + if (globalCooldownTime < 1) return; + + eliteEntity.doGlobalPowerCooldown(globalCooldownTime * 20); + + new BukkitRunnable() { + @Override + public void run() { + powerCooldownActive = false; + } + }.runTaskLater(MetadataHandler.PLUGIN, powerCooldownTime * 20L); + + } + + public void doCooldownTicks(EliteEntity eliteEntity) { + this.powerCooldownActive = true; + if (globalCooldownTime > 0) + eliteEntity.doGlobalPowerCooldown(globalCooldownTime); + if (powerCooldownTime > 0) + new BukkitRunnable() { + @Override + public void run() { + powerCooldownActive = false; + } + }.runTaskLater(MetadataHandler.PLUGIN, powerCooldownTime); + + } + + protected void doGlobalCooldown(int ticks, EliteEntity eliteEntity) { + setInGlobalCooldown(true); + eliteEntity.doCooldown(); + new BukkitRunnable() { + @Override + public void run() { + setInGlobalCooldown(false); + } + }.runTaskLater(MetadataHandler.PLUGIN, ticks); + } + + protected void doGlobalCooldown(int ticks) { + setInGlobalCooldown(true); + new BukkitRunnable() { + @Override + public void run() { + setInGlobalCooldown(false); + } + }.runTaskLater(MetadataHandler.PLUGIN, ticks); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/meta/MajorPower.java b/src/main/java/com/magmaguy/elitemobs/powers/meta/MajorPower.java new file mode 100644 index 000000000..2913df338 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/meta/MajorPower.java @@ -0,0 +1,12 @@ +package com.magmaguy.elitemobs.powers.meta; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; + +/** + * Created by MagmaGuy on 10/05/2017. + */ +public abstract class MajorPower extends ElitePower { + protected MajorPower(PowersConfigFields powersConfigFields) { + super(powersConfigFields); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/meta/MinorPower.java b/src/main/java/com/magmaguy/elitemobs/powers/meta/MinorPower.java new file mode 100644 index 000000000..98b803157 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/meta/MinorPower.java @@ -0,0 +1,12 @@ +package com.magmaguy.elitemobs.powers.meta; + +import com.magmaguy.elitemobs.config.powers.PowersConfigFields; + +/** + * Created by MagmaGuy on 05/11/2016. + */ +public abstract class MinorPower extends ElitePower { + protected MinorPower(PowersConfigFields powersConfigFields) { + super(powersConfigFields); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/mobpowers/PowerCooldown.java b/src/main/java/com/magmaguy/elitemobs/powers/meta/PowerCooldown.java similarity index 79% rename from src/main/java/com/magmaguy/elitemobs/mobpowers/PowerCooldown.java rename to src/main/java/com/magmaguy/elitemobs/powers/meta/PowerCooldown.java index ecd534150..661b9fbf3 100644 --- a/src/main/java/com/magmaguy/elitemobs/mobpowers/PowerCooldown.java +++ b/src/main/java/com/magmaguy/elitemobs/powers/meta/PowerCooldown.java @@ -13,10 +13,10 @@ * along with this program. If not, see . */ -package com.magmaguy.elitemobs.mobpowers; +package com.magmaguy.elitemobs.powers.meta; import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; import org.bukkit.scheduler.BukkitRunnable; import java.util.HashSet; @@ -26,7 +26,7 @@ public class PowerCooldown { /* This class just removes metadata after a variable delay, allows */ - public static void startCooldownTimer(EliteMobEntity eliteMob, HashSet cooldownList, int duration) { + public static void startCooldownTimer(EliteEntity eliteMob, HashSet cooldownList, int duration) { cooldownList.add(eliteMob); @@ -46,7 +46,7 @@ public void run() { /* This method checks if the cooldown is active */ - public static boolean isInCooldown(EliteMobEntity eliteMob, HashSet cooldownList) { + public static boolean isInCooldown(EliteEntity eliteMob, HashSet cooldownList) { return cooldownList.contains(eliteMob); } diff --git a/src/main/java/com/magmaguy/elitemobs/powers/meta/ProjectileLocationGenerator.java b/src/main/java/com/magmaguy/elitemobs/powers/meta/ProjectileLocationGenerator.java new file mode 100644 index 000000000..5aeb9ebcd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/meta/ProjectileLocationGenerator.java @@ -0,0 +1,12 @@ +package com.magmaguy.elitemobs.powers.meta; + +import org.bukkit.Location; +import org.bukkit.entity.LivingEntity; + +public class ProjectileLocationGenerator { + + public static Location generateLocation(LivingEntity targetter, LivingEntity targetted) { + return targetter.getLocation().clone().add(0, 1, 0).add(targetted.getLocation().clone().subtract(targetter.getLocation().clone()).toVector().normalize()).setDirection(targetted.getLocation().clone().subtract(targetter.getLocation()).toVector()); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/meta/ProjectileTagger.java b/src/main/java/com/magmaguy/elitemobs/powers/meta/ProjectileTagger.java new file mode 100644 index 000000000..15a29b640 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/meta/ProjectileTagger.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.powers.meta; + +import com.magmaguy.elitemobs.MetadataHandler; +import org.bukkit.NamespacedKey; +import org.bukkit.entity.Projectile; +import org.bukkit.persistence.PersistentDataType; + +public class ProjectileTagger { + + public static final NamespacedKey customDamageKey = new NamespacedKey(MetadataHandler.PLUGIN, "custom_damage"); + + public static void tagProjectileWithCustomDamage(Projectile projectile, double customDamage) { + projectile.getPersistentDataContainer().set(customDamageKey, PersistentDataType.DOUBLE, customDamage); + } + + public static boolean projectileHasCustomDamage(Projectile projectile) { + return projectile.getPersistentDataContainer().has(customDamageKey, PersistentDataType.DOUBLE); + } + + public static double getProjectileCustomDamage(Projectile projectile) { + if (!projectileHasCustomDamage(projectile)) + return -1; + return projectile.getPersistentDataContainer().get(customDamageKey, PersistentDataType.DOUBLE); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/EliteScript.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/EliteScript.java new file mode 100644 index 000000000..2634c1fa7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/EliteScript.java @@ -0,0 +1,127 @@ +package com.magmaguy.elitemobs.powers.scripts; + +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.ElitePower; +import com.magmaguy.elitemobs.powers.scripts.caching.EliteScriptBlueprint; +import lombok.Getter; +import org.bukkit.Location; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +public class EliteScript extends ElitePower implements Cloneable { + protected final ScriptActions scriptActions; + //Parse from power file + private final ScriptEvents scriptEvents; + @Getter + private final ScriptZone scriptZone; + private final ScriptCooldowns scriptCooldowns; + private final ScriptConditions scriptConditions; + @Getter + protected Map eliteScriptMap; + + public EliteScript(EliteScriptBlueprint scriptBlueprint, Map eliteScriptMap, EliteEntity eliteEntity) { + super(scriptBlueprint.getCustomConfigFields()); + this.eliteScriptMap = eliteScriptMap; + this.scriptEvents = new ScriptEvents(scriptBlueprint.getScriptEventsBlueprint()); + this.scriptConditions = new ScriptConditions(scriptBlueprint.getScriptConditionsBlueprint(), this, false); + this.scriptZone = new ScriptZone(scriptBlueprint.getScriptZoneBlueprint(), this); + if (scriptEvents.getScriptEventsBlueprint().isZoneListener()) { + scriptZone.setZoneListener(true); + scriptZone.startZoneListener(eliteEntity); + } + this.scriptActions = new ScriptActions(scriptBlueprint.getScriptActionsBlueprint(), eliteScriptMap, this); + this.scriptCooldowns = new ScriptCooldowns(scriptBlueprint.getScriptCooldownsBlueprint(), this); + eliteScriptMap.put(scriptBlueprint.getScriptName(), this); + } + + //Parse from boss config + public static List generateBossScripts(List blueprints, EliteEntity eliteEntity) { + //The map is declared here because it needs to be shared inside of all scripts in the same file so they can be referenced. + HashMap powerMap = new HashMap(); + return blueprints.stream().map(eliteScriptBlueprint -> new EliteScript(eliteScriptBlueprint, powerMap, eliteEntity)).collect(Collectors.toList()); + } + + /** + * Used by events that call scripts + * + * @param event + * @param eliteEntity + * @param player + */ + public void check(Event event, EliteEntity eliteEntity, Player player) { + //If the script uses the cooldown system then it should respect if the boss is in a global or local cooldown state + //If the script does not define a local or global cooldown then it is considered to ignore cooldowns. This is an + //important bypass for a lot of behavior like teleporting at specific triggers regardless of state + if (getPowerCooldownTime() > 0 && getGlobalCooldownTime() > 0 && + scriptCooldowns != null && super.isInCooldown(eliteEntity)) return; + //Check if the event is relevant to the script + if (!scriptEvents.isTargetEvent(event.getClass())) return; + //Check if the event conditions are met + if (scriptConditions != null && !scriptConditions.meetsPreActionConditions(eliteEntity, player)) return; + //Let's do some actions + scriptActions.runScripts(eliteEntity, player, event); + //Cooldowns time + doCooldownTicks(eliteEntity); + } + + /** + * Used by elite damaged by elite event + * + * @param event + * @param eliteEntity + * @param damager + */ + public void check(Event event, EliteEntity eliteEntity, LivingEntity damager) { + //If the script uses the cooldown system then it should respect if the boss is in a global or local cooldown state + //If the script does not define a local or global cooldown then it is considered to ignore cooldowns. This is an + //important bypass for a lot of behavior like teleporting at specific triggers regardless of state + if (getPowerCooldownTime() > 0 && getGlobalCooldownTime() > 0 && + scriptCooldowns != null && super.isInCooldown(eliteEntity)) return; + //Check if the event is relevant to the script + if (!scriptEvents.isTargetEvent(event.getClass())) return; + //Check if the event conditions are met + if (scriptConditions != null && !scriptConditions.meetsPreActionConditions(eliteEntity, damager)) return; + //Let's do some actions + scriptActions.runScripts(eliteEntity, damager, event); + //Cooldowns time + doCooldownTicks(eliteEntity); + } + + /** + * Used by scripts that call other scripts as the trigger + * + * @param eliteEntity + * @param directTarget + */ + public void check(EliteEntity eliteEntity, LivingEntity directTarget, ScriptActionData previousScriptActionData) { + //Check if the event conditions are met + if (scriptConditions != null && !scriptConditions.meetsPreActionConditions(eliteEntity, directTarget)) + return; + //Let's do some actions + scriptActions.runScripts(previousScriptActionData); + //Cooldowns time + doCooldownTicks(eliteEntity); + } + + /** + * Used by scripts that call specific scripts when a projectile or falling block lands + * + * @param landingLocation Location where the projectile or block landed + */ + public void check(Location landingLocation, ScriptActionData previousScriptActionData) { + //Check if the event conditions are met + if (scriptConditions != null && !scriptConditions.meetsPreActionConditions(previousScriptActionData.getEliteEntity(), null)) + return; + //Let's do some actions + scriptActions.runScripts(previousScriptActionData, landingLocation); + //Cooldowns time + doCooldownTicks(previousScriptActionData.getEliteEntity()); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/FallingEntityDataPair.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/FallingEntityDataPair.java new file mode 100644 index 000000000..5fa539e9d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/FallingEntityDataPair.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.powers.scripts; + +import lombok.Getter; + +public class FallingEntityDataPair { + @Getter + private final ScriptAction scriptAction; + @Getter + private final ScriptActionData scriptActionData; + + public FallingEntityDataPair(ScriptAction scriptAction, ScriptActionData scriptActionData) { + this.scriptAction = scriptAction; + this.scriptActionData = scriptActionData; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptAction.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptAction.java new file mode 100644 index 000000000..7fca4400f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptAction.java @@ -0,0 +1,731 @@ +package com.magmaguy.elitemobs.powers.scripts; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.EliteDamageEvent; +import com.magmaguy.elitemobs.api.PlayerDamagedByEliteMobEvent; +import com.magmaguy.elitemobs.collateralminecraftchanges.LightningSpawnBypass; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.instanced.MatchInstance; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.pathfinding.Navigation; +import com.magmaguy.elitemobs.playerdata.ElitePlayerInventory; +import com.magmaguy.elitemobs.powers.meta.CustomSummonPower; +import com.magmaguy.elitemobs.powers.scripts.caching.ScriptActionBlueprint; +import com.magmaguy.elitemobs.powers.scripts.enums.ActionType; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; +import org.bukkit.Color; +import org.bukkit.FireworkEffect; +import org.bukkit.Location; +import org.bukkit.attribute.Attribute; +import org.bukkit.block.Block; +import org.bukkit.boss.BossBar; +import org.bukkit.entity.*; +import org.bukkit.event.Event; +import org.bukkit.inventory.meta.FireworkMeta; +import org.bukkit.potion.PotionEffect; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.*; +import java.util.concurrent.ThreadLocalRandom; + +public class ScriptAction { + + @Getter + private static final HashSet invulnerablePlayers = new HashSet<>(); + @Getter + private final ScriptActionBlueprint blueprint; + private final ScriptTargets scriptTargets; + private final ScriptConditions scriptConditions; + private final ScriptParticles scriptParticles; + @Getter + private final Map eliteScriptMap; + private final EliteScript eliteScript; + private ScriptTargets finalScriptTargets = null; + + public ScriptAction(ScriptActionBlueprint blueprint, Map eliteScriptMap, EliteScript eliteScript) { + this.blueprint = blueprint; + this.scriptTargets = new ScriptTargets(blueprint.getScriptTargets(), eliteScript); + if (blueprint.getFinalTarget() != null) + finalScriptTargets = new ScriptTargets(blueprint.getFinalTarget(), eliteScript); + this.scriptConditions = new ScriptConditions(blueprint.getConditionsBlueprint(), eliteScript, true); + this.scriptParticles = new ScriptParticles(blueprint.getScriptParticlesBlueprint()); + this.eliteScriptMap = eliteScriptMap; + this.eliteScript = eliteScript; + } + + public static void shutdown() { + invulnerablePlayers.forEach(player -> player.setInvulnerable(false)); + } + + /** + * Base case, runs based on actions, not called by other scripts + * + * @param eliteEntity EliteEntity that runs the script + * @param directTarget Direct target from the event that caused the script to run, if any + * @param event Event that caused the script to run + */ + public void runScript(EliteEntity eliteEntity, LivingEntity directTarget, Event event) { + if (blueprint.getActionType() == null) { + Logger.warn("Script " + blueprint.getScriptName() + " in file " + blueprint.getScriptFilename() + " does not have a valid action! Every action must define a valid action for the script to work."); + return; + } + + //Create script action data for this run of the script, this data may change on every run + ScriptActionData scriptActionData = new ScriptActionData(eliteEntity, directTarget, scriptTargets, eliteScript.getScriptZone(), event); + //Run script task + scriptTask(scriptActionData); + } + + + /** + * Called by other scripts, inherits targets from the previous scripts + * + * @param previousScriptActionData + */ + public void runScript(ScriptActionData previousScriptActionData) { + if (blueprint.getActionType() == null) { + Logger.warn("Script " + blueprint.getScriptName() + " in file " + blueprint.getScriptFilename() + " does not have a valid action! Every action must define a valid action for the script to work."); + return; + } + + //Create script action data for this run of the script, this data may change on every run + ScriptActionData scriptActionData = new ScriptActionData(scriptTargets, eliteScript.getScriptZone(), previousScriptActionData); + //Run script task + scriptTask(scriptActionData); + } + + /** + * Called by scripts that have a landing parameter, i.e. projectiles, fireworks and landing blocks. Only gets called on landing! + * + * @param previousScriptActionData The script action data from the script before the landing script + * @param landingLocation The "landing" location. Might not necessarily be on a block, more of an end location. + */ + public void runScript(ScriptActionData previousScriptActionData, Location landingLocation) { + //This caches the tracking mostly for zones to start at the wait time. This matters if you are making zones + //that go through a warning phase and then a damage phase. + ScriptActionData scriptActionData = new ScriptActionData(scriptTargets, eliteScript.getScriptZone(), previousScriptActionData, landingLocation); + + //Run script task + scriptTask(scriptActionData); + } + + /** + * The basic script task, used by all scripts + * + * @param scriptActionData The data for the script action + */ + private void scriptTask(ScriptActionData scriptActionData) { + //This caches the tracking mostly for zones to start at the wait time. This matters if you are making zones + //that go through a warning phase and then a damage phase. + scriptTargets.cacheTargets(scriptActionData); + if (finalScriptTargets != null) + finalScriptTargets.cacheTargets(scriptActionData); + if (blueprint.getWait() > 0) { + //First wait for allotted amount of time + new BukkitRunnable() { + @Override + public void run() { + runScriptTask(scriptActionData); + } + }.runTaskLater(MetadataHandler.PLUGIN, blueprint.getWait()); + } else runScriptTask(scriptActionData); + } + + private void runScriptTask(ScriptActionData scriptActionData) { + if (blueprint.getRepeatEvery() > 0) + //if it's a repeating task, run task repeatedly + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + counter++; + //Check if the script conditions of action are met, since repeating actions might've stopped being valid + if (blueprint.getConditionsBlueprint() != null && + !scriptConditions.meetsActionConditions(scriptActionData)) { + cancel(); + return; + } + //If it has run for the allotted amount times, stop + if (blueprint.getTimes() > 0 && counter > blueprint.getTimes()) { + cancel(); + return; + } + + //If a boss is dead and a script is set to repeat "forever", then the script should end when the boss dies + if (blueprint.getTimes() < 0 && !scriptActionData.getEliteEntity().isValid()) { + cancel(); + return; + } + + //Otherwise, run the condition + runActions(scriptActionData); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, blueprint.getRepeatEvery()); + else { + //Check for blocking conditions + if (blueprint.getConditionsBlueprint() != null && + !scriptConditions.meetsActionConditions(scriptActionData)) + return; + //If it's not a repeating task, just run it normally + runActions(scriptActionData); + } + } + + /** + * Routes the action type to the action behavior. + * + * @param scriptActionData Data of the current action. + */ + private void runActions(ScriptActionData scriptActionData) { + //Different actions have completely different behavior + switch (blueprint.getActionType()) { + case TELEPORT -> runTeleport(scriptActionData); + case MESSAGE -> runMessage(scriptActionData); + case ACTION_BAR_MESSAGE -> runActionBarMessage(scriptActionData); + case TITLE_MESSAGE -> runTitleMessage(scriptActionData); + case BOSS_BAR_MESSAGE -> runBossBarMessage(scriptActionData); + case POTION_EFFECT -> runPotionEffect(scriptActionData); + case DAMAGE -> runDamage(scriptActionData); + case SET_ON_FIRE -> runSetOnFire(scriptActionData); + case VISUAL_FREEZE -> runVisualFreeze(scriptActionData); + case PLACE_BLOCK -> runPlaceBlock(scriptActionData); + case RUN_COMMAND_AS_PLAYER -> runPlayerCommand(scriptActionData); + case RUN_COMMAND_AS_CONSOLE -> runConsoleCommand(scriptActionData); + case STRIKE_LIGHTNING -> runStrikeLighting(scriptActionData); + case SPAWN_PARTICLE -> runSpawnParticle(scriptActionData); + case SET_MOB_AI -> runSetMobAI(scriptActionData); + case SET_MOB_AWARE -> runSetMobAware(scriptActionData); + case PLAY_SOUND -> runPlaySound(scriptActionData); + case PUSH -> runPush(scriptActionData); + case SUMMON_REINFORCEMENT -> runSummonReinforcement(scriptActionData); + case RUN_SCRIPT -> runAdditionalScripts(scriptActionData); + case SPAWN_FIREWORKS -> runSpawnFireworks(scriptActionData); + case MAKE_INVULNERABLE -> runMakeInvulnerable(scriptActionData); + case TAG -> runTag(scriptActionData); + case UNTAG -> runUntag(scriptActionData); + case SET_TIME -> runSetTime(scriptActionData); + case SET_WEATHER -> runSetWeather(scriptActionData); + case PLAY_ANIMATION -> runPlayAnimation(scriptActionData); + case SPAWN_FALLING_BLOCK -> runSpawnFallingBlock(scriptActionData); + case MODIFY_DAMAGE -> runModifyDamage(scriptActionData); + case SUMMON_ENTITY -> runSummonEntity(scriptActionData); + case NAVIGATE -> runNavigate(scriptActionData); + case SCALE -> runScale(scriptActionData); + default -> + Logger.warn("Failed to determine action type " + blueprint.getActionType() + " in script " + blueprint.getScriptName() + " for file " + blueprint.getScriptFilename()); + } + //Run script will have already run this + if (!blueprint.getActionType().equals(ActionType.RUN_SCRIPT)) + runAdditionalScripts(scriptActionData); + } + + protected Collection getTargets(ScriptActionData scriptActionData) { + Collection livingTargets = scriptConditions.validateEntities(scriptActionData, scriptTargets.getTargetEntities(scriptActionData)); + scriptTargets.setAnonymousTargets(livingTargets.stream().toList()); + if (blueprint.isDebug()) + livingTargets.forEach(livingTarget -> Logger.showLocation(livingTarget.getLocation())); + return livingTargets; + } + + //Gets a list of locations + protected Collection getLocationTargets(ScriptActionData scriptActionData) { + Collection locationTargets = scriptConditions.validateLocations(scriptActionData, scriptTargets.getTargetLocations(scriptActionData)); + scriptTargets.setAnonymousTargets(locationTargets.stream().toList()); + if (blueprint.isDebug()) + locationTargets.forEach(Logger::showLocation); + return locationTargets; + } + + //Gets a list of locations + protected Collection getFinalLocationTargets(ScriptActionData scriptActionData) { + Collection locationTargets = scriptConditions.validateLocations(scriptActionData, finalScriptTargets.getTargetLocations(scriptActionData)); + finalScriptTargets.setAnonymousTargets(locationTargets.stream().toList()); + if (blueprint.isDebug()) { + locationTargets.forEach(Logger::showLocation); + } + return locationTargets; + } + + //Teleports the targets + private void runTeleport(ScriptActionData scriptActionData) { + getTargets(scriptActionData).forEach(iteratedTarget -> { + if (finalScriptTargets == null) { + Logger.warn("Failed to get teleport destination for script " + blueprint.getScriptName() + " because there is no set FinalTarget!"); + return; + } +// List destinationLocations = new ArrayList<>(finalScriptTargets.getTargetLocations(scriptActionData)); + List destinationLocations = getFinalLocationTargets(scriptActionData).stream().toList(); + if (destinationLocations.isEmpty()) return; + MatchInstance.MatchInstanceEvents.teleportBypass = true; + iteratedTarget.teleport(destinationLocations.get(0)); + }); + } + + //Sends a message to the targets + private void runMessage(ScriptActionData scriptActionData) { + getTargets(scriptActionData).forEach(iteratedTarget -> iteratedTarget.sendMessage(ChatColorConverter.convert(blueprint.getSValue()))); + } + + private void runTitleMessage(ScriptActionData scriptActionData) { + if (blueprint.getTitle().isEmpty() && blueprint.getSubtitle().isEmpty()) { + Logger.warn("TITLE_MESSAGE action does not have any titles or subtitles for script " + blueprint.getScriptName() + " in file " + blueprint.getScriptFilename()); + return; + } + getTargets(scriptActionData).forEach(iteratedTarget -> { + if (!(iteratedTarget instanceof Player)) { + Logger.warn("TITLE_MESSAGE actions must target players! Problematic script: " + blueprint.getScriptFilename() + " in " + blueprint.getScriptFilename()); + return; + } + ((Player) iteratedTarget).sendTitle(blueprint.getTitle(), blueprint.getSubtitle(), blueprint.getFadeIn(), blueprint.getDuration(), blueprint.getFadeOut()); + }); + } + + private void runActionBarMessage(ScriptActionData scriptActionData) { + if (blueprint.getSValue().isEmpty()) { + Logger.warn("ACTION_BAR_MESSAGE action does not have a sValue for script " + blueprint.getScriptName() + " in file " + blueprint.getScriptFilename()); + return; + } + getTargets(scriptActionData).forEach(iteratedTarget -> { + if (!(iteratedTarget instanceof Player)) { + Logger.warn("ACTION_BAR_MESSAGE actions must target players! Problematic script: " + blueprint.getScriptFilename() + " in " + blueprint.getScriptFilename()); + return; + } + ((Player) iteratedTarget).spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(blueprint.getSValue())); + }); + } + + private void runBossBarMessage(ScriptActionData scriptActionData) { + if (blueprint.getSValue().isEmpty()) { + Logger.warn("BOSS_BAR_MESSAGE action does not have a valid sValue for script " + blueprint.getScriptFilename() + " in file " + blueprint.getScriptFilename()); + return; + } + BossBar bossBar = Bukkit.createBossBar(blueprint.getSValue(), blueprint.getBarColor(), blueprint.getBarStyle()); + getTargets(scriptActionData).forEach(iteratedTarget -> { + if (!(iteratedTarget instanceof Player)) { + Logger.warn("BOSS_BAR_MESSAGE actions must target players! Problematic script: " + blueprint.getScriptFilename() + " in " + blueprint.getScriptFilename()); + return; + } + bossBar.addPlayer((Player) iteratedTarget); + if (blueprint.getDuration() > 0) + Bukkit.getScheduler().scheduleSyncDelayedTask(MetadataHandler.PLUGIN, bossBar::removeAll, blueprint.getDuration()); + }); + } + + //Applies a potion effect to the target living entity + private void runPotionEffect(ScriptActionData scriptActionData) { + getTargets(scriptActionData).forEach(iteratedTarget -> { + if (!(iteratedTarget.isValid())) return; + iteratedTarget.addPotionEffect(new PotionEffect(blueprint.getPotionEffectType(), blueprint.getDuration(), blueprint.getAmplifier())); + }); + } + + //Runs any scripts in the scripts field. Respects wait time and repeating tasks + private void runAdditionalScripts(ScriptActionData scriptActionData) { + if (blueprint.getActionType().equals(ActionType.RUN_SCRIPT) && blueprint.getScripts().isEmpty()) + Logger.warn("Did not find any scripts for action RUN_SCRIPT in script " + blueprint.getScriptName() + " in file " + blueprint.getScriptFilename()); + //This is a bit of a dirty hack but if there are no targets and an action called scripts then it is assumed that the script did not meet the conditions required to run and therefore additional scripts will also not run + /* + if (!blueprint.getActionType().equals(ActionType.RUN_SCRIPT) && + (scriptActionData.getScriptTargets().getAnonymousTargets() == null || + scriptActionData.getScriptTargets().getAnonymousTargets().isEmpty())) + return; + + */ + if (blueprint.getScripts() != null) + if (!blueprint.isOnlyRunOneScript()) + blueprint.getScripts().forEach(iteratedScriptName -> { + EliteScript iteratedScript = eliteScriptMap.get(iteratedScriptName); + if (iteratedScript == null) + Logger.warn("Failed to get script " + iteratedScriptName + " for script " + blueprint.getScriptName() + " in file " + blueprint.getScriptFilename()); + else { + iteratedScript.check(scriptActionData.getEliteEntity(), scriptActionData.getDirectTarget(), scriptActionData); + } + }); + else { + String scriptName = blueprint.getScripts().get(ThreadLocalRandom.current().nextInt(blueprint.getScripts().size())); + EliteScript randomizedScript = eliteScriptMap.get(scriptName); + if (randomizedScript == null) + Logger.warn("Failed to get script " + scriptName + " for script " + blueprint.getScriptName() + " in file " + blueprint.getScriptFilename()); + else + randomizedScript.check(scriptActionData.getEliteEntity(), scriptActionData.getDirectTarget(), scriptActionData); + } + } + + //Damages the target living entity + private void runDamage(ScriptActionData scriptActionData) { + getTargets(scriptActionData).forEach(targetEntity -> { + if (targetEntity instanceof Player) + PlayerDamagedByEliteMobEvent.PlayerDamagedByEliteMobEventFilter.setSpecialMultiplier(blueprint.getMultiplier()); + if (scriptActionData.getEliteEntity().getLivingEntity() != null) + targetEntity.damage(blueprint.getAmount(), scriptActionData.getEliteEntity().getLivingEntity()); + else + targetEntity.damage(blueprint.getAmount()); + }); + } + + //Sets a target on fire for the duration + private void runSetOnFire(ScriptActionData scriptActionData) { + getTargets(scriptActionData).forEach(iteratedTarget -> iteratedTarget.setFireTicks(blueprint.getDuration())); + } + + //Applies the freeze visual effect from Minecraft. Requires a repeating task to keep reapplying + private void runVisualFreeze(ScriptActionData scriptActionData) { + getTargets(scriptActionData).forEach(iteratedTarget -> iteratedTarget.setFreezeTicks((int) (iteratedTarget.getFreezeTicks() + blueprint.getAmount()))); + } + + //Places a block, temporarily if the duration is defined + private void runPlaceBlock(ScriptActionData scriptActionData) { + getLocationTargets(scriptActionData).forEach(targetLocation -> { + Block block = targetLocation.getBlock(); + if (blueprint.getDuration() > 0) { + EntityTracker.addTemporaryBlock(block, blueprint.getDuration(), blueprint.getMaterial()); + } else + block.setType(blueprint.getMaterial()); + }); + } + + //Runs a command as player + private void runPlayerCommand(ScriptActionData scriptActionData) { + getTargets(scriptActionData).forEach(targetEntity -> ((Player) targetEntity).performCommand(parseCommand(scriptActionData.getEliteEntity(), (Player) targetEntity))); + } + + //Runs a command as console + private void runConsoleCommand(ScriptActionData scriptActionData) { + getTargets(scriptActionData).forEach(targetEntity -> Bukkit.dispatchCommand(Bukkit.getConsoleSender(), parseCommand(scriptActionData.getEliteEntity(), (Player) targetEntity))); + } + + //Command placeholders + private String parseCommand(EliteEntity eliteEntity, Player player) { + return blueprint.getSValue() + .replace("$playerName", player.getName()) + .replace("$playerX", player.getLocation().getX() + "") + .replace("$playerY", player.getLocation().getY() + "") + .replace("$playerZ", player.getLocation().getZ() + "") + .replace("$bossName", eliteEntity.getName()) + .replace("$bossX", eliteEntity.getLocation().getX() + "") + .replace("$bossY", eliteEntity.getLocation().getY() + "") + .replace("$bossZ", eliteEntity.getLocation().getZ() + "") + .replace("$bossLevel", eliteEntity.getLevel() + "") + .replace("$bossWorldName", eliteEntity.getLocation().getWorld().getName()); + } + + //Strikes visual lightning at the target location + private void runStrikeLighting(ScriptActionData scriptActionData) { + getLocationTargets(scriptActionData).forEach(LightningSpawnBypass::strikeLightingIgnoreProtections); + } + + //Spawns a particle at the target location + private void runSpawnParticle(ScriptActionData scriptActionData) { + boolean needsCentering = false; + switch (scriptActionData.getTargetType()) { + case ZONE_FULL, ZONE_BORDER, INHERIT_SCRIPT_ZONE_FULL, INHERIT_SCRIPT_ZONE_BORDER, LOCATION, LOCATIONS, + LANDING_LOCATION: + needsCentering = true; + } + boolean finalNeedsCentering = needsCentering; + getLocationTargets(scriptActionData).forEach(targetLocation -> scriptParticles.visualize(scriptActionData, !finalNeedsCentering ? targetLocation : targetLocation.clone().add(new Vector(.5, 0, .5)), eliteScript)); + } + + //Sets mob AI + private void runSetMobAI(ScriptActionData scriptActionData) { + getTargets(scriptActionData).forEach(targetEntity -> { + targetEntity.setAI(blueprint.getBValue()); + if (blueprint.getDuration() > 0) + Bukkit.getScheduler().scheduleSyncDelayedTask(MetadataHandler.PLUGIN, () -> targetEntity.setAI(!blueprint.getBValue()), blueprint.getDuration()); + }); + } + + //Sets mob awareness + private void runSetMobAware(ScriptActionData scriptActionData) { + getTargets(scriptActionData).forEach(targetEntity -> { + ((Mob) targetEntity).setAware(blueprint.getBValue()); + if (blueprint.getDuration() > 0) + Bukkit.getScheduler().scheduleSyncDelayedTask(MetadataHandler.PLUGIN, () -> ((Mob) targetEntity).setAware(!blueprint.getBValue()), blueprint.getDuration()); + }); + + } + + //Plays a sound at the target location + private void runPlaySound(ScriptActionData scriptActionData) { + getLocationTargets(scriptActionData).forEach(targetLocation -> targetLocation.getWorld().playSound(targetLocation, blueprint.getSValue(), blueprint.getVolume(), blueprint.getPitch())); + } + + private void runPush(ScriptActionData scriptActionData) { + //When players get hit that resets their velocity (by Minecraft) and since this runs before the damage is applied + //any velocity set here would be cancelled if used in a damage event. To bypass it we just run it a tick later. + new BukkitRunnable() { + @Override + public void run() { + getTargets(scriptActionData).forEach(targetEntity -> { + if (blueprint.getScriptRelativeVectorBlueprint() != null) { + if (blueprint.getBValue() != null && blueprint.getBValue()) + targetEntity.setVelocity(targetEntity.getVelocity().add(new ScriptRelativeVector(blueprint.getScriptRelativeVectorBlueprint(), eliteScript, targetEntity.getLocation()).getVector(scriptActionData))); + else + targetEntity.setVelocity(new ScriptRelativeVector(blueprint.getScriptRelativeVectorBlueprint(), eliteScript, targetEntity.getLocation()).getVector(scriptActionData)); + } else if (blueprint.getVValue() != null) { + if (blueprint.getBValue() != null && blueprint.getBValue()) + targetEntity.setVelocity(targetEntity.getVelocity().add(blueprint.getVValue())); + else + targetEntity.setVelocity(blueprint.getVValue()); + } + }); + } + }.runTaskLater(MetadataHandler.PLUGIN, 1); + } + + private void runSummonReinforcement(ScriptActionData scriptActionData) { + getLocationTargets(scriptActionData).forEach(targetLocation -> { + CustomBossEntity customBossEntity = CustomSummonPower.summonReinforcement(scriptActionData.getEliteEntity(), targetLocation, blueprint.getSValue(), blueprint.getDuration()); + if (customBossEntity != null && + customBossEntity.getLivingEntity() != null) { + if (blueprint.getScriptRelativeVectorBlueprint() != null) + customBossEntity.getLivingEntity().setVelocity(new ScriptRelativeVector(blueprint.getScriptRelativeVectorBlueprint(), eliteScript, customBossEntity.getLivingEntity().getLocation()).getVector(scriptActionData)); + else if (blueprint.getVValue() != null) + customBossEntity.getLivingEntity().setVelocity(blueprint.getVValue()); + } + }); + } + + private void runSpawnFireworks(ScriptActionData scriptActionData) { + getLocationTargets(scriptActionData).forEach(targetLocation -> { + Firework firework = targetLocation.getWorld().spawn(targetLocation, Firework.class); + firework.setPersistent(false); + FireworkMeta fireworkMeta = firework.getFireworkMeta(); + + if (blueprint.getFireworkEffects().isEmpty()) { + Logger.warn("Tried to spawn fireworks for script " + eliteScript.getFileName() + " but no color for the fireworks was set! This part of the script will not run."); + return; + } + + if (blueprint.getFireworkEffectTypes() == null) { + List colors = blueprint.getFireworkEffects().get(0).stream().map(ScriptActionBlueprint.FireworkColor::getColor).toList(); + //Single effect + fireworkMeta.addEffect(FireworkEffect.builder() + .with(blueprint.getFireworkEffectType()) + .withColor(colors) + .flicker(blueprint.isFlicker()) + .trail(blueprint.isWithTrail()) + .build()); + + + } else { + int counter = 0; + //Multiple effects + for (FireworkEffect.Type fireworkEffectType : blueprint.getFireworkEffectTypes()) { + List colors; + if (blueprint.getFireworkEffects().size() - 1 >= counter) + colors = blueprint.getFireworkEffects().get(counter) + .stream().map(ScriptActionBlueprint.FireworkColor::getColor).toList(); + else + colors = blueprint.getFireworkEffects().get(blueprint.getFireworkEffects().size() - 1) + .stream().map(ScriptActionBlueprint.FireworkColor::getColor).toList(); + + fireworkMeta.addEffect(FireworkEffect.builder() + .with(fireworkEffectType) + .withColor(colors) + .flicker(blueprint.isFlicker()) + .trail(blueprint.isWithTrail()) + .build()); + counter++; + } + } + + fireworkMeta.setPower(blueprint.getPower()); + if (blueprint.getVValue() != null) { + firework.setVelocity(blueprint.getVValue()); + firework.setShotAtAngle(true); + } + firework.setFireworkMeta(fireworkMeta); + }); + } + + private void runMakeInvulnerable(ScriptActionData scriptActionData) { + getTargets(scriptActionData).forEach(targetEntity -> { + targetEntity.setInvulnerable(blueprint.isInvulnerable()); + if (targetEntity instanceof Player player) { + if (blueprint.isInvulnerable()) + invulnerablePlayers.add(player); + else + invulnerablePlayers.remove(player); + } + if (blueprint.getDuration() > 0) + Bukkit.getScheduler().scheduleSyncDelayedTask(MetadataHandler.PLUGIN, () -> targetEntity.setInvulnerable(!blueprint.isInvulnerable()), blueprint.getDuration()); + }); + } + + private void runTag(ScriptActionData scriptActionData) { + getTargets(scriptActionData).forEach(targetEntity -> { + EliteEntity bossEntity = EntityTracker.getEliteMobEntity(targetEntity); + if (bossEntity != null) + bossEntity.addTags(blueprint.getTags()); + if (targetEntity instanceof Player player && ElitePlayerInventory.getPlayer(player) != null) + ElitePlayerInventory.getPlayer(player).addTags(blueprint.getTags()); + if (blueprint.getDuration() > 0) { + if (bossEntity != null) + Bukkit.getScheduler().scheduleSyncDelayedTask(MetadataHandler.PLUGIN, () -> bossEntity.removeTags(blueprint.getTags()), blueprint.getDuration()); + if (targetEntity instanceof Player player && ElitePlayerInventory.getPlayer(player) != null) + Bukkit.getScheduler().scheduleSyncDelayedTask(MetadataHandler.PLUGIN, () -> ElitePlayerInventory.getPlayer(player).removeTags(blueprint.getTags()), blueprint.getDuration()); + } + }); + } + + private void runUntag(ScriptActionData scriptActionData) { + getTargets(scriptActionData).forEach(targetEntity -> { + EliteEntity bossEntity = EntityTracker.getEliteMobEntity(targetEntity); + if (bossEntity != null) + bossEntity.removeTags(blueprint.getTags()); + if (targetEntity instanceof Player player && ElitePlayerInventory.getPlayer(player) != null) + ElitePlayerInventory.getPlayer(player).removeTags(blueprint.getTags()); + if (blueprint.getDuration() > 0) { + if (bossEntity != null) + Bukkit.getScheduler().scheduleSyncDelayedTask(MetadataHandler.PLUGIN, () -> bossEntity.addTags(blueprint.getTags()), blueprint.getDuration()); + if (targetEntity instanceof Player player && ElitePlayerInventory.getPlayer(player) != null) + Bukkit.getScheduler().scheduleSyncDelayedTask(MetadataHandler.PLUGIN, () -> ElitePlayerInventory.getPlayer(player).addTags(blueprint.getTags()), blueprint.getDuration()); + } + }); + } + + private void runSetTime(ScriptActionData scriptActionData) { + getLocationTargets(scriptActionData).forEach(targetEntity -> targetEntity.getWorld().setTime(blueprint.getTime())); + } + + private void runSetWeather(ScriptActionData scriptActionData) { + getTargets(scriptActionData).forEach(targetEntity -> { + if (blueprint.getDuration() > 0) { + switch (blueprint.getWeatherType()) { + case CLEAR -> targetEntity.getWorld().setClearWeatherDuration(blueprint.getDuration()); + case PRECIPITATION -> { + targetEntity.getWorld().setClearWeatherDuration(0); + targetEntity.getWorld().setWeatherDuration(blueprint.getDuration()); + } + case THUNDER -> targetEntity.getWorld().setThunderDuration(blueprint.getDuration()); + } + } else { + switch (blueprint.getWeatherType()) { + case CLEAR -> targetEntity.getWorld().setClearWeatherDuration(6000); + case PRECIPITATION -> { + targetEntity.getWorld().setClearWeatherDuration(0); + targetEntity.getWorld().setWeatherDuration(6000); + } + case THUNDER -> targetEntity.getWorld().setThunderDuration(6000); + } + } + }); + } + + private void runPlayAnimation(ScriptActionData scriptActionData) { + getTargets(scriptActionData).forEach(targetEntity -> { + EliteEntity targetElite = EntityTracker.getEliteMobEntity(targetEntity); + if (targetElite == null) return; + if (!(targetElite instanceof CustomBossEntity customBossEntity)) return; + if (customBossEntity.getCustomModel() == null) return; + customBossEntity.getCustomModel().playAnimationByName(blueprint.getSValue()); + }); + } + + private void runSpawnFallingBlock(ScriptActionData scriptActionData) { + Collection locationTargets = getLocationTargets(scriptActionData); + locationTargets.forEach(targetLocation -> { + FallingBlock fallingBlock = targetLocation.getWorld().spawnFallingBlock(targetLocation, blueprint.getMaterial(), (byte) 0); + fallingBlock.setDropItem(false); + fallingBlock.setHurtEntities(false); + if (blueprint.getScriptRelativeVectorBlueprint() != null) + fallingBlock.setVelocity(new ScriptRelativeVector(blueprint.getScriptRelativeVectorBlueprint(), eliteScript, fallingBlock.getLocation()).getVector(scriptActionData)); + else if (blueprint.getVValue() != null) + fallingBlock.setVelocity(blueprint.getVValue()); + ScriptListener.fallingBlocks.put(fallingBlock, new FallingEntityDataPair(this, scriptActionData)); + }); + } + + private void runModifyDamage(ScriptActionData scriptActionData) { + if (scriptActionData.getEvent() instanceof EliteDamageEvent eliteDamageEvent) { + eliteDamageEvent.setDamage(eliteDamageEvent.getDamage() * blueprint.getMultiplier()); + } + } + + private void runSummonEntity(ScriptActionData scriptActionData) { + EntityType entityType; + try { + entityType = EntityType.valueOf(blueprint.getSValue()); + } catch (Exception ex) { + Logger.warn("Failed to get entity type for the projectile in the script " + getBlueprint().getScriptName() + " in the file " + blueprint.getScriptFilename()); + return; + } + + getLocationTargets(scriptActionData).forEach(targetLocation -> { + Vector velocity = new Vector(0, 0, 0); + if (blueprint.getScriptRelativeVectorBlueprint() != null) { + ScriptRelativeVector scriptRelativeVector = new ScriptRelativeVector(blueprint.getScriptRelativeVectorBlueprint(), eliteScript, targetLocation); + velocity = scriptRelativeVector.getVector(scriptActionData); + } else if (!blueprint.getVValue().isZero()) { + velocity = blueprint.getVValue(); + } + Entity entity; + if (scriptActionData.getEliteEntity().getLivingEntity() != null && + Projectile.class.isAssignableFrom(entityType.getEntityClass())) { + entity = scriptActionData.getEliteEntity().getLivingEntity().launchProjectile(entityType.getEntityClass().asSubclass(Projectile.class), velocity); + ((Projectile) entity).setShooter(scriptActionData.getEliteEntity().getLivingEntity()); + if (entity instanceof Fireball fireball) fireball.setDirection(velocity); + } else { + entity = targetLocation.getWorld().spawn(targetLocation, entityType.getEntityClass()); + entity.setVelocity(velocity); + } + + if (!blueprint.getLandingScripts().isEmpty()) { + FallingEntityDataPair fallingEntityDataPair = new FallingEntityDataPair(this, scriptActionData); + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + if (!entity.isValid() || entity.isOnGround()) { + ScriptListener.runEvent(fallingEntityDataPair, entity.getLocation()); + cancel(); + return; + } + counter++; + if (counter > 20 * 60 * 5) + cancel(); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 1, 1); + } + }); + } + + private void runNavigate(ScriptActionData scriptActionData) { + getTargets(scriptActionData).forEach(targetEntity -> { + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(targetEntity); + if (!(eliteEntity instanceof CustomBossEntity customBossEntity)) return; + + if (finalScriptTargets == null) { + Logger.warn("Failed to get teleport destination for script " + blueprint.getScriptName() + " because there is no set FinalTarget!"); + return; + } + + List destinationLocations = new ArrayList<>(finalScriptTargets.getTargetLocations(scriptActionData)); + if (destinationLocations.isEmpty()) return; + Navigation.navigateTo(customBossEntity, (double) blueprint.getVelocity(), destinationLocations.get(0), blueprint.getBValue(), blueprint.getDuration()); + }); + } + + private void runScale(ScriptActionData scriptActionData) { + getTargets(scriptActionData).forEach(targetEntity -> { + targetEntity.getAttribute(Attribute.GENERIC_SCALE).setBaseValue(blueprint.getScale()); + if (blueprint.getDuration() > 0) + new BukkitRunnable() { + @Override + public void run() { + targetEntity.getAttribute(Attribute.GENERIC_SCALE).setBaseValue(1f); + } + }.runTaskLater(MetadataHandler.PLUGIN, blueprint.getDuration()); + }); + } +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptActionData.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptActionData.java new file mode 100644 index 000000000..461676ec9 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptActionData.java @@ -0,0 +1,117 @@ +package com.magmaguy.elitemobs.powers.scripts; + +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.scripts.enums.TargetType; +import com.magmaguy.elitemobs.utils.shapes.Shape; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Location; +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.Event; + +import java.util.Collection; +import java.util.List; + +public class ScriptActionData { + @Getter + private final TargetType targetType; + @Getter + private final ScriptTargets scriptTargets; + @Getter + @Setter + private Collection locations = null; + @Getter + @Setter + private EliteEntity eliteEntity; + @Getter + @Setter + private LivingEntity directTarget = null; + @Getter + @Setter + private Location landingLocation = null; + @Getter + private ScriptZone scriptZone = null; + @Getter + @Setter + private ScriptActionData inheritedScriptActionData = null; + @Getter + private Event event; + + //previousEntityTargets and previousLocationTargets only have values when other scripts call this script + //in which case the targets are inherited by this script so they can be reused + @Setter + @Getter + private Collection previousEntityTargets; + @Setter + @Getter + private Collection previousLocationTargets; + + //This allows shapes to be cached in a way that is isolated to each script without contaminating scripts + @Getter + @Setter + private List shapesChachedByTarget; + + + public ScriptActionData(EliteEntity eliteEntity, LivingEntity directTarget, ScriptTargets scriptTargets, Event event) { + this.eliteEntity = eliteEntity; + this.directTarget = directTarget; + this.scriptTargets = scriptTargets; + //This stores the cache shape + this.targetType = scriptTargets.getTargetBlueprint().getTargetType(); + this.event = event; + } + + public ScriptActionData(EliteEntity eliteEntity, LivingEntity directTarget, ScriptTargets scriptTargets, ScriptZone scriptZone, Event event) { + this.eliteEntity = eliteEntity; + this.directTarget = directTarget; + this.scriptTargets = scriptTargets; + //This stores the cache shape + this.targetType = scriptTargets.getTargetBlueprint().getTargetType(); + this.scriptZone = scriptZone; + this.event = event; + } + + //Used by actions that call scripts + public ScriptActionData(ScriptTargets scriptTargets, ScriptZone scriptZone, ScriptActionData inheritedScriptActionData) { + this.eliteEntity = inheritedScriptActionData.getEliteEntity(); + this.directTarget = inheritedScriptActionData.getDirectTarget(); + this.scriptTargets = scriptTargets; + //This stores the cache shape + this.targetType = scriptTargets.getTargetBlueprint().getTargetType(); + this.scriptZone = scriptZone; + this.inheritedScriptActionData = inheritedScriptActionData; + this.landingLocation = inheritedScriptActionData.getLandingLocation(); + } + + //Used for the zone enter and leave, can't use direct targets + public ScriptActionData(EliteEntity eliteEntity, ScriptTargets scriptTargets, ScriptZone scriptZone) { + this.eliteEntity = eliteEntity; + this.scriptTargets = scriptTargets; + //This stores the cache shape + this.targetType = scriptTargets.getTargetBlueprint().getTargetType(); + this.scriptZone = scriptZone; + } + + //For data with landing locations + public ScriptActionData(ScriptTargets scriptTargets, ScriptZone scriptZone, ScriptActionData inheritedScriptActionData, Location landingLocation) { + this.eliteEntity = inheritedScriptActionData.getEliteEntity(); + this.directTarget = inheritedScriptActionData.getDirectTarget(); + this.scriptTargets = scriptTargets; + //This stores the cache shape + this.targetType = scriptTargets.getTargetBlueprint().getTargetType(); + this.scriptZone = scriptZone; + this.inheritedScriptActionData = inheritedScriptActionData; + this.landingLocation = landingLocation; + } + + //For data called by other scripts + public ScriptActionData(EliteEntity eliteEntity, LivingEntity directTarget, ScriptTargets scriptTargets, Collection previousEntityTargets, Collection previousLocationTargets) { + this.eliteEntity = eliteEntity; + this.directTarget = directTarget; + this.scriptTargets = scriptTargets; + //This stores the cache shape + this.targetType = scriptTargets.getTargetBlueprint().getTargetType(); + this.previousEntityTargets = previousEntityTargets; + this.previousLocationTargets = previousLocationTargets; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptActions.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptActions.java new file mode 100644 index 000000000..f03307858 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptActions.java @@ -0,0 +1,44 @@ +package com.magmaguy.elitemobs.powers.scripts; + +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.scripts.caching.ScriptActionsBlueprint; +import lombok.Getter; +import org.bukkit.Location; +import org.bukkit.entity.LivingEntity; +import org.bukkit.event.Event; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class ScriptActions { + @Getter + private final List scriptActionsList = new ArrayList(); + + public ScriptActions(ScriptActionsBlueprint scriptActionsBlueprint, Map eliteScriptMap, EliteScript eliteScript) { + scriptActionsBlueprint.getScriptActionsBlueprintList().forEach(scriptActionBlueprint -> scriptActionsList.add(new ScriptAction(scriptActionBlueprint, eliteScriptMap, eliteScript))); + } + + public void runScripts(EliteEntity eliteEntity, LivingEntity directTarget, Event event) { + for (ScriptAction scriptAction : scriptActionsList) + scriptAction.runScript(eliteEntity, directTarget, event); + } + + + //Used by scripts that call scripts + public void runScripts(ScriptActionData previousScriptActiondata) { + for (ScriptAction scriptAction : scriptActionsList) + scriptAction.runScript(previousScriptActiondata); + } + + //Used by landing blocks and projectiles + public void runScripts(ScriptActionData previousActionData, Location landingLocation) { + for (ScriptAction scriptAction : scriptActionsList) + scriptAction.runScript(previousActionData, landingLocation); + } + + public boolean isValid() { + return true; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptConditions.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptConditions.java new file mode 100644 index 000000000..18a6b3fc1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptConditions.java @@ -0,0 +1,189 @@ +package com.magmaguy.elitemobs.powers.scripts; + +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.playerdata.ElitePlayerInventory; +import com.magmaguy.elitemobs.powers.scripts.caching.ScriptConditionsBlueprint; +import com.magmaguy.elitemobs.powers.scripts.enums.ConditionType; +import com.magmaguy.elitemobs.powers.scripts.enums.TargetType; +import org.bukkit.Location; +import org.bukkit.block.Block; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class ScriptConditions { + + private final ScriptConditionsBlueprint conditionsBlueprint; + private final EliteScript eliteScript; + private ScriptTargets scriptTargets = null; + + public ScriptConditions(ScriptConditionsBlueprint scriptConditionsBlueprint, EliteScript eliteScript, boolean actionCondition) { + this.conditionsBlueprint = scriptConditionsBlueprint; + this.eliteScript = eliteScript; + //This is null if no conditions are set + if (conditionsBlueprint.getScriptTargets() != null) + this.scriptTargets = new ScriptTargets(conditionsBlueprint.getScriptTargets(), eliteScript); + if (conditionsBlueprint.getConditionType() == null) + if (actionCondition) + conditionsBlueprint.setConditionType(ConditionType.FILTERING); + else + conditionsBlueprint.setConditionType(ConditionType.BLOCKING); + } + + private boolean isAliveCheck(LivingEntity livingEntity) { + if (conditionsBlueprint.getIsAlive() == null) return true; + if (livingEntity == null) return false; + return livingEntity.isValid() == conditionsBlueprint.getIsAlive(); + } + + private boolean hasTagsCheck(LivingEntity target) { + if (conditionsBlueprint.getHasTags() == null) return true; + return checkTags(target, conditionsBlueprint.getHasTags()); + } + + private boolean doesNotHaveTags(LivingEntity target) { + if (conditionsBlueprint.getDoesNotHaveTags() == null) return true; + return !checkTags(target, conditionsBlueprint.getDoesNotHaveTags()); + } + + private boolean checkRandomizer() { + if (conditionsBlueprint.getRandomChance() == null) return true; + return ThreadLocalRandom.current().nextDouble() < conditionsBlueprint.getRandomChance(); + } + + private boolean checkTags(LivingEntity target, List blueprintTags) { + List entityTags = null; + if (target instanceof Player player && ElitePlayerInventory.getPlayer(player) != null) + entityTags = ElitePlayerInventory.getPlayer(player).getTags().stream().toList(); + else { + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(target); + if (eliteEntity != null) + entityTags = eliteEntity.getTags().stream().toList(); + } + + if (entityTags == null) return false; + + return entityTags.containsAll(blueprintTags); + } + + private boolean isAirCheck(Location targetLocation) { + if (conditionsBlueprint.getLocationIsAir() == null) return true; + return conditionsBlueprint.getLocationIsAir() == targetLocation.getBlock().getType().isAir(); + } + + private boolean isOnFloor(Location targetLocation) { + if (conditionsBlueprint.getIsOnFloor() == null) return true; + Block currentBlock = targetLocation.getBlock(); + Block floorBlock = targetLocation.clone().subtract(0, 1, 0).getBlock(); + return conditionsBlueprint.getIsOnFloor() == !currentBlock.getType().isSolid() && floorBlock.getType().isSolid(); + } + + private boolean isStandingOn(Location targetLocation) { + if (conditionsBlueprint.getIsStandingOnMaterial() == null) return true; + Block floorBlock = targetLocation.clone().subtract(0, 1, 0).getBlock(); + return floorBlock.getType() == conditionsBlueprint.getIsStandingOnMaterial(); + } + + public boolean meetsPreActionConditions(EliteEntity eliteEntity, LivingEntity directTarget) { + if (scriptTargets == null) return true; + ScriptActionData scriptActionData = new ScriptActionData(eliteEntity, directTarget, scriptTargets, null); + + for (LivingEntity livingEntity : scriptTargets.getTargetEntities(scriptActionData)) + if (!checkConditions(livingEntity)) return false; + + for (Location location : scriptTargets.getTargetLocations(scriptActionData)) + if (!checkConditions(location)) return false; + + return checkRandomizer(); + } + + /** + * Action conditions only care about blocking conditions + * + * @param scriptActionData + * @return + */ + public boolean meetsActionConditions(ScriptActionData scriptActionData) { + if (scriptTargets == null) return true; + //Can happen due to configuration mistakes related to setting the targets + if (scriptActionData == null) return false; + //if the target is self and the condition is isAlive the condition will always be blocking + if (scriptTargets.getTargetBlueprint().getTargetType().equals(TargetType.SELF) && + !isAliveCheck(scriptActionData.getEliteEntity().getLivingEntity())) return false; + //This method only cares about blocking conditions, the action either is entirely valid or not at all + if (!conditionsBlueprint.getConditionType().equals(ConditionType.BLOCKING)) return true; + + for (LivingEntity livingEntity : scriptTargets.getTargetEntities(scriptActionData)) + if (!checkConditions(livingEntity)) return false; + + for (Location location : scriptTargets.getTargetLocations(scriptActionData)) + if (!checkConditions(location)) return false; + + return checkRandomizer(); + } + + private boolean checkConditions(LivingEntity livingEntity) { + if (scriptTargets == null) return true; + + if (livingEntity == null) return false; + if (!isAliveCheck(livingEntity)) return false; + if (!hasTagsCheck(livingEntity)) return false; + if (!checkConditions(livingEntity.getLocation())) return false; + return doesNotHaveTags(livingEntity); + } + + private boolean checkConditions(Location location) { + if (scriptTargets == null) return true; + + if (location == null) return true; + return isAirCheck(location) && + isOnFloor(location) && + isStandingOn(location); + } + + + //Removes the locations that do not meet the conditions + protected Collection validateLocations(ScriptActionData scriptActionData, + @NotNull Collection originalLocations) { + if (scriptTargets == null) return originalLocations; + + if (scriptTargets.getTargetBlueprint().getTargetType().equals(TargetType.ACTION_TARGET)) { + //Specific case for when the locations to be validated are the ones from the action target. + //Note that non-conforming locations are excluded, but the script will still run. + originalLocations.removeIf(targetLocation -> !checkConditions(targetLocation)); + } else { + //If the condition has a target other than the one inherited from ACTION_TARGET, it cancels all effects. + Collection conditionTargetLocations = scriptTargets.getTargetLocations(scriptActionData); + for (Location location : conditionTargetLocations) + if (!checkConditions(location)) return new ArrayList<>(); + } + + return originalLocations; + } + + //Removes entities that do not meet the conditions + protected Collection validateEntities(ScriptActionData scriptActionData, + @NotNull Collection originalEntities) { + if (scriptTargets == null) return originalEntities; + + if (scriptTargets.getTargetBlueprint().getTargetType().equals(TargetType.ACTION_TARGET)) { + //Specific case for when the entities to be validated are the ones from the action target. + //Note that non-conforming entities are excluded, but the script will still run. + originalEntities.removeIf(targetEntity -> !checkConditions(targetEntity)); + } else { + //If the condition has a target other than the one inherited from ACTION_TARGET, it cancels all effects. + Collection conditionTargetLocations = scriptTargets.getTargetEntities(scriptActionData); + for (LivingEntity livingEntity : conditionTargetLocations) + if (!checkConditions(livingEntity)) return new ArrayList<>(); + } + + return originalEntities; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptCooldowns.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptCooldowns.java new file mode 100644 index 000000000..f8a193166 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptCooldowns.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.powers.scripts; + +import com.magmaguy.elitemobs.powers.meta.ElitePower; +import com.magmaguy.elitemobs.powers.scripts.caching.ScriptCooldownsBlueprint; +import lombok.Getter; + +public class ScriptCooldowns { + @Getter + private final ScriptCooldownsBlueprint scriptCooldownsBlueprint; + + public ScriptCooldowns(ScriptCooldownsBlueprint scriptCooldownsBlueprint, ElitePower elitePower) { + this.scriptCooldownsBlueprint = scriptCooldownsBlueprint; + elitePower.setGlobalCooldownTime(scriptCooldownsBlueprint.getGlobalCooldown()); + elitePower.setPowerCooldownTime(scriptCooldownsBlueprint.getLocalCooldown()); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptEvents.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptEvents.java new file mode 100644 index 000000000..8aa319030 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptEvents.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.powers.scripts; + +import com.magmaguy.elitemobs.powers.scripts.caching.ScriptEventsBlueprint; +import lombok.Getter; + + +public class ScriptEvents { + @Getter + private final ScriptEventsBlueprint scriptEventsBlueprint; + + public ScriptEvents(ScriptEventsBlueprint eventsBlueprint) { + this.scriptEventsBlueprint = eventsBlueprint; + } + + public boolean isTargetEvent(Class clazz) { + return scriptEventsBlueprint.getEvents().contains(clazz); + } + + public boolean isValid() { + //return !events.isEmpty(); todo: parse failed attempts, empty right now still means they can be called by other scripts + return true; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptListener.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptListener.java new file mode 100644 index 000000000..a2967870b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptListener.java @@ -0,0 +1,136 @@ +package com.magmaguy.elitemobs.powers.scripts; + +import com.magmaguy.elitemobs.api.*; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.ElitePower; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.Location; +import org.bukkit.entity.Entity; +import org.bukkit.entity.FallingBlock; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityChangeBlockEvent; + +import java.util.HashMap; + +public class ScriptListener implements Listener { + public static HashMap fallingBlocks = new HashMap(); + public static HashMap fallingEntities = new HashMap<>(); + + public static void runEvent(FallingEntityDataPair fallingEntityDataPair, Location landingLocation) { + for (String string : fallingEntityDataPair.getScriptAction().getBlueprint().getLandingScripts()) { + EliteScript iteratedScript = fallingEntityDataPair.getScriptAction().getEliteScriptMap().get(string); + if (iteratedScript == null) { + Logger.warn("Elite script " + string + " does not exist for landing scripts!"); + return; + } + iteratedScript.check(landingLocation, fallingEntityDataPair.getScriptActionData()); + } + } + + @EventHandler + public void onEliteMobDamagedByPlayerEvent(EliteMobDamagedByPlayerEvent event) { + if (event.isCancelled()) return; + runEvent(event, event.getEliteMobEntity(), event.getPlayer()); + } + + @EventHandler + public void onEliteMobDamagedByEliteMobEvent(EliteMobDamagedByEliteMobEvent event) { + if (event.isCancelled()) return; + runEventGeneric(event, event.getDamagee(), event.getDamager().getLivingEntity()); + } + + @EventHandler + public void onEliteMobDamagedEvent(EliteMobDamagedEvent event) { + if (event.isCancelled()) return; + runEvent(event, event.getEliteEntity()); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onEliteMobsEnterCombatEvent(EliteMobEnterCombatEvent event) { + runEvent(event, event.getEliteMobEntity(), event.getTargetEntity()); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onEliteMobDeathEvent(EliteMobDeathEvent event) { + runEvent(event, event.getEliteEntity()); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onEliteMobExitCombatEvent(EliteMobExitCombatEvent event) { + runEvent(event, event.getEliteMobEntity()); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onEliteMobHealEvent(EliteMobHealEvent event) { + if (event.isCancelled()) return; + runEvent(event, event.getEliteEntity()); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onEliteMobTargetPlayerEvent(EliteMobTargetPlayerEvent event) { + runEvent(event, event.getEliteMobEntity(), event.getPlayer()); + } + + @EventHandler + public void onPlayerDamagedByEliteMobEvent(PlayerDamagedByEliteMobEvent event) { + if (event.isCancelled()) return; + runEvent(event, event.getEliteMobEntity(), event.getPlayer()); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onEliteMobSpawnEvent(EliteMobSpawnEvent event) { + if (event.isCancelled()) return; + runEvent(event, event.getEliteMobEntity()); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onElitePhaseSwitchEvent(ElitePhaseSwitchEvent event) { + runEvent(event, event.getCustomBossEntity()); + } + + //This is use to track falling blocks + @EventHandler(priority = EventPriority.MONITOR) + public void onEntityChangeBlockEvent(EntityChangeBlockEvent event) { + if (fallingBlocks.isEmpty()) return; + FallingEntityDataPair fallingEntityDataPair = fallingBlocks.get(event.getEntity()); + if (fallingEntityDataPair == null) return; + ScriptAction scriptAction = fallingEntityDataPair.getScriptAction(); + if (scriptAction == null) return; + event.setCancelled(true); + runEvent(fallingBlocks.get(event.getEntity()), event.getBlock().getLocation()); + fallingBlocks.remove(event.getEntity()); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onZoneEnterEvent(ScriptZoneEnterEvent event) { + runEventGeneric(event, event.getEliteEntity(), event.getEntity()); + } + + @EventHandler(priority = EventPriority.MONITOR) + public void onZoneLeaveEvent(ScriptZoneLeaveEvent event) { + runEventGeneric(event, event.getEliteEntity(), event.getEntity()); + } + + private void runEvent(Event event, EliteEntity eliteEntity) { + for (ElitePower elitePower : eliteEntity.getElitePowers()) + if (elitePower instanceof EliteScript eliteScript) + eliteScript.check(event, eliteEntity, null); + } + + private void runEventGeneric(Event event, EliteEntity eliteEntity, LivingEntity directTarget) { + for (ElitePower elitePower : eliteEntity.getElitePowers()) + if (elitePower instanceof EliteScript eliteScript) + eliteScript.check(event, eliteEntity, directTarget); + } + + private void runEvent(Event event, EliteEntity eliteEntity, Player player) { + for (ElitePower elitePower : eliteEntity.getElitePowers()) + if (elitePower instanceof EliteScript eliteScript) + eliteScript.check(event, eliteEntity, player); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptParticles.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptParticles.java new file mode 100644 index 000000000..a8e35d721 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptParticles.java @@ -0,0 +1,105 @@ +package com.magmaguy.elitemobs.powers.scripts; + +import com.magmaguy.elitemobs.powers.scripts.caching.ScriptParticlesBlueprint; +import org.bukkit.Color; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.util.Vector; + +public class ScriptParticles { + + ScriptParticlesBlueprint particlesBlueprint; + + public ScriptParticles(ScriptParticlesBlueprint particlesBlueprint) { + this.particlesBlueprint = particlesBlueprint; + } + + public void visualize(ScriptActionData scriptActionData, Location location, EliteScript eliteScript) { + particlesBlueprint.getParticleBlueprints().forEach(particleBlueprint -> new ScriptParticle(particleBlueprint).visualize(scriptActionData, location, eliteScript)); + } + + private class ScriptParticle { + + private final ScriptParticlesBlueprint.ScriptParticleBlueprint particleBlueprint; + + public ScriptParticle(ScriptParticlesBlueprint.ScriptParticleBlueprint scriptParticlesBlueprint) { + this.particleBlueprint = scriptParticlesBlueprint; + } + + private void visualize(ScriptActionData scriptActionData, Location location, EliteScript eliteScript) { + double x = particleBlueprint.getX(); + double y = particleBlueprint.getY(); + double z = particleBlueprint.getZ(); + int amount = particleBlueprint.getAmount(); + + if (particleBlueprint.getRelativeVectorBlueprint() != null) { + ScriptRelativeVector scriptRelativeVector = null; + scriptRelativeVector = new ScriptRelativeVector(this.particleBlueprint.getRelativeVectorBlueprint(), eliteScript, location); + + Vector movementVector = scriptRelativeVector.getVector(scriptActionData); + amount = 0; + x = movementVector.getX(); + y = movementVector.getY(); + z = movementVector.getZ(); + } + + + if (particleBlueprint.getParticle().equals(Particle.DUST)) + location.getWorld().spawnParticle( + particleBlueprint.getParticle(), + location, + amount, + x, + y, + z, + particleBlueprint.getSpeed(), + new Particle.DustOptions( + Color.fromRGB( + particleBlueprint.getRed(), + particleBlueprint.getGreen(), + particleBlueprint.getBlue()), + 1)); + else if (particleBlueprint.getParticle().equals(Particle.DUST_COLOR_TRANSITION)) + location.getWorld().spawnParticle( + particleBlueprint.getParticle(), + location, + amount, + x, + y, + z, + particleBlueprint.getSpeed(), + new Particle.DustTransition( + Color.fromRGB( + particleBlueprint.getRed(), + particleBlueprint.getGreen(), + particleBlueprint.getBlue()), + Color.fromRGB( + particleBlueprint.getToRed(), + particleBlueprint.getToGreen(), + particleBlueprint.getToBlue()), + 1)); + else if (particleBlueprint.getParticle().equals(Particle.WITCH) + //|| particleBlueprint.getParticle().equals(Particle.WITCH_AMBIENT) todo: 1.20.6 changed this name + ) { + location.getWorld().spawnParticle( + particleBlueprint.getParticle(), + x, + y, + z, + amount, + particleBlueprint.getRed(), + particleBlueprint.getGreen(), + particleBlueprint.getBlue()); + } else + location.getWorld().spawnParticle( + particleBlueprint.getParticle(), + location, + amount, + x, + y, + z, + particleBlueprint.getSpeed()); + + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptRelativeVector.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptRelativeVector.java new file mode 100644 index 000000000..1ea3e7e2b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptRelativeVector.java @@ -0,0 +1,60 @@ +package com.magmaguy.elitemobs.powers.scripts; + +import com.magmaguy.elitemobs.powers.scripts.caching.ScriptRelativeVectorBlueprint; +import com.magmaguy.elitemobs.powers.scripts.enums.TargetType; +import org.bukkit.Location; +import org.bukkit.util.Vector; + +public class ScriptRelativeVector { + private final ScriptRelativeVectorBlueprint scriptRelativeVectorBlueprint; + private ScriptTargets sourceTarget = null; + private ScriptTargets destinationTarget = null; + private Vector cachedVector = null; + private Location actionLocation = null; + private boolean sourceIsAction = false; + private boolean destinationIsAction = false; + + public ScriptRelativeVector(ScriptRelativeVectorBlueprint scriptRelativeVectorBlueprint, EliteScript eliteScript, Location actionLocation) { + this.scriptRelativeVectorBlueprint = scriptRelativeVectorBlueprint; + this.actionLocation = actionLocation; + if (!scriptRelativeVectorBlueprint.getSourceTarget().getTargetType().equals(TargetType.ACTION_TARGET)) { + sourceTarget = new ScriptTargets(scriptRelativeVectorBlueprint.getSourceTarget(), eliteScript); + } else { + sourceIsAction = true; + } + if (!scriptRelativeVectorBlueprint.getDestinationTarget().getTargetType().equals(TargetType.ACTION_TARGET)) + destinationTarget = new ScriptTargets(scriptRelativeVectorBlueprint.getDestinationTarget(), eliteScript); + else + destinationIsAction = true; + } + + public Vector getVector(ScriptActionData scriptActionData) { + if (cachedVector != null) return cachedVector; + Location sourceLocation = null; + if (sourceIsAction) { + sourceLocation = actionLocation.clone(); + } else if (sourceTarget != null && !sourceTarget.getTargetLocations(scriptActionData).isEmpty()) + sourceLocation = sourceTarget.getTargetLocations(scriptActionData).iterator().next(); + else + return new Vector(0, 0, 0); + + Location destinationLocation = null; + + if (destinationIsAction) + destinationLocation = actionLocation.clone(); + else if (destinationTarget != null && !destinationTarget.getTargetLocations(scriptActionData).isEmpty()) + destinationLocation = destinationTarget.getTargetLocations(scriptActionData).iterator().next().clone(); + else + return new Vector(0, 0, 0); + + Vector vector = destinationLocation.clone().subtract(sourceLocation).toVector(); + if (scriptRelativeVectorBlueprint.isNormalize()) vector.normalize(); + vector.multiply(scriptRelativeVectorBlueprint.getMultiplier()); + vector.add(scriptRelativeVectorBlueprint.getOffset()); + return vector; + } + + public void cacheVector(ScriptActionData scriptActionData) { + cachedVector = getVector(scriptActionData); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptTargets.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptTargets.java new file mode 100644 index 000000000..89510d7b6 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptTargets.java @@ -0,0 +1,246 @@ +package com.magmaguy.elitemobs.powers.scripts; + +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.scripts.caching.ScriptTargetsBlueprint; +import com.magmaguy.elitemobs.utils.ConfigurationLocation; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.Collectors; + +public class ScriptTargets { + + @Getter + private final ScriptTargetsBlueprint targetBlueprint; + @Getter + private final EliteScript eliteScript; + //raw zone from the elite script + @Getter + private final ScriptZone scriptZone; + //collection of targets, can be shapes, entities or locations + private List anonymousTargets = null; + @Getter + private ScriptRelativeVector scriptRelativeVector = null; + + public ScriptTargets(ScriptTargetsBlueprint targetBlueprint, EliteScript eliteScript) { + this.targetBlueprint = targetBlueprint; + this.eliteScript = eliteScript; + this.scriptZone = eliteScript.getScriptZone(); + } + + public List getAnonymousTargets(boolean locations, ScriptActionData scriptActionData) { + if (anonymousTargets != null) { + return anonymousTargets; + } else if (locations) { + return getTargetLocations(scriptActionData).stream().toList(); + } else { + return getTargetEntities(scriptActionData).stream().toList(); + } + } + + public void setAnonymousTargets(List anonymousTargets) { + //Animated zones can't be cached! + if (getTargetBlueprint().isTrack() || eliteScript.getScriptZone().getZoneBlueprint().getAnimationDuration() > 1) + return; + //Non-animated zones must be cached for script inheritance and such + this.anonymousTargets = anonymousTargets; + } + + //Parse all string-based configuration locations + public Location processLocationFromString(EliteEntity eliteEntity, + String locationString, + ScriptActionData scriptActionData) { + if (locationString == null) { + Logger.warn("Failed to get location target in script " + targetBlueprint.getScriptName() + " in " + eliteScript.getFileName()); + return null; + } + Location parsedLocation = ConfigurationLocation.serialize(locationString); + if (parsedLocation.getWorld() == null && locationString.split(",")[0].equalsIgnoreCase("same_as_boss")) { + parsedLocation.setWorld(eliteEntity.getLocation().getWorld()); + } + + addOffsets(parsedLocation, scriptActionData); + + return parsedLocation; + } + + protected void cacheTargets(ScriptActionData scriptActionData) { + if (getTargetBlueprint().isTrack()) { + //Zones that animate independently can not be set to track, as this causes confusion. This is forced to make it easier on scripters. + if (eliteScript.getScriptZone().isValid() && eliteScript.getScriptZone().getZoneBlueprint().getAnimationDuration() > 0) + getTargetBlueprint().setTrack(false); + else return; + } + //Only cache locations - caching living entities would probably be very confusing + //if (actionType.isRequiresLivingEntity()) return; + boolean animatedScriptZone = false; + if (eliteScript.getScriptZone().isValid()) { + scriptActionData.setShapesChachedByTarget(eliteScript.getScriptZone().generateShapes(scriptActionData, true)); + if (eliteScript.getScriptZone().getZoneBlueprint().getAnimationDuration() > 0) animatedScriptZone = true; + anonymousTargets = null; + } + if (!animatedScriptZone) { + anonymousTargets = new ArrayList<>(getTargetLocations(scriptActionData)); + } + if (!getTargetBlueprint().isTrack() && targetBlueprint.getScriptRelativeVectorBlueprint() != null) { + scriptRelativeVector = new ScriptRelativeVector(targetBlueprint.getScriptRelativeVectorBlueprint(), eliteScript, null); + scriptRelativeVector.cacheVector(scriptActionData); + } + } + + //Get living entity targets. New array lists so they are not immutable. + protected Collection getTargetEntities(ScriptActionData scriptActionData) { + if (getTargetBlueprint().isTrack() && anonymousTargets != null && + (anonymousTargets.isEmpty() || anonymousTargets.get(0) instanceof LivingEntity)) { + return (List) anonymousTargets; + } + + //If a script zone exists, it overrides the check entirely to expose zone-based fields + Location eliteEntityLocation = scriptActionData.getEliteEntity().getLocation(); + + if (targetBlueprint == null) { + Logger.warn("An action tried to run with an invalid target! Check which on it is by reading the startup logs and fix it! No target will be acquired for now."); + return new ArrayList<>(); + } + + switch (targetBlueprint.getTargetType()) { + case ALL_PLAYERS: + return new ArrayList<>(Bukkit.getOnlinePlayers()); + case WORLD_PLAYERS: + return new ArrayList<>(eliteEntityLocation.getWorld().getPlayers()); + case NEARBY_PLAYERS: + return eliteEntityLocation.getWorld() + .getNearbyEntities( + eliteEntityLocation, + targetBlueprint.getRange(), + targetBlueprint.getRange(), + targetBlueprint.getRange(), + (entity -> entity.getType() == EntityType.PLAYER)) + .stream().map(Player.class::cast).collect(Collectors.toSet()); + case NEARBY_MOBS: + return eliteEntityLocation.getWorld() + .getNearbyEntities( + eliteEntityLocation, + targetBlueprint.getRange(), + targetBlueprint.getRange(), + targetBlueprint.getRange(), + (entity -> entity.getType() != EntityType.PLAYER && entity instanceof LivingEntity && + !entity.getUniqueId().equals(scriptActionData.getEliteEntity().getUnsyncedLivingEntity().getUniqueId()))) + .stream().map(LivingEntity.class::cast).collect(Collectors.toSet()); + case DIRECT_TARGET: + return new ArrayList<>(List.of(scriptActionData.getDirectTarget())); + case SELF: + case SELF_SPAWN: + return new ArrayList<>(List.of(scriptActionData.getEliteEntity().getUnsyncedLivingEntity())); + case ZONE_FULL, ZONE_BORDER, INHERIT_SCRIPT_ZONE_FULL, INHERIT_SCRIPT_ZONE_BORDER: + return eliteScript.getScriptZone().getZoneEntities(scriptActionData, targetBlueprint); + case INHERIT_SCRIPT_TARGET: + if (scriptActionData.getInheritedScriptActionData() != null) { + try { + return (List) scriptActionData.getInheritedScriptActionData().getScriptTargets().getAnonymousTargets(false, scriptActionData.getInheritedScriptActionData()); + } catch (Exception Ex) { + Logger.warn("Failed to get entity from INHERIT_SCRIPT_TARGET because the script inherits a location, not an entity"); + } + } else { + Logger.warn("Failed to get INHERIT_SCRIPT_TARGET because the script is not called by another script!"); + return new ArrayList<>(); + } + + default: + Logger.warn("Could not find default target for script in " + eliteScript.getFileName()); + return null; + } + } + + /** + * Obtains the target locations for a script. Some scripts require locations instead of living entities, and this + * method obtains those locations from the potential targets. + * + * @return Validated location for the script behavior + */ + protected Collection getTargetLocations(ScriptActionData scriptActionData) { + if (anonymousTargets != null && !anonymousTargets.isEmpty() && anonymousTargets.get(0) instanceof Location location) { + return (List) anonymousTargets; + } + + Collection newLocations = null; + + switch (this.getTargetBlueprint().getTargetType()) { + case ALL_PLAYERS, WORLD_PLAYERS, NEARBY_PLAYERS, DIRECT_TARGET, SELF, NEARBY_MOBS: + return getTargetEntities(scriptActionData).stream().map(targetEntity -> addOffsets(targetEntity.getLocation(), scriptActionData)).collect(Collectors.toSet()); + case SELF_SPAWN: + return new ArrayList<>(List.of(addOffsets(scriptActionData.getEliteEntity().getSpawnLocation(), scriptActionData))); + case LOCATION: + return new ArrayList<>(List.of(getLocation(scriptActionData.getEliteEntity(), scriptActionData))); + case LOCATIONS: + return getLocations(scriptActionData.getEliteEntity(), scriptActionData); + case LANDING_LOCATION: + return new ArrayList<>(List.of(scriptActionData.getLandingLocation().clone())); + case ZONE_FULL, ZONE_BORDER: + newLocations = getLocationFromZone(scriptActionData); + break; + case INHERIT_SCRIPT_ZONE_FULL, INHERIT_SCRIPT_ZONE_BORDER: + newLocations = getLocationFromZone(scriptActionData.getInheritedScriptActionData()); + break; + case INHERIT_SCRIPT_TARGET: + return scriptActionData.getInheritedScriptActionData().getScriptTargets().getAnonymousTargets( + true, scriptActionData.getInheritedScriptActionData()); + default: + Logger.warn("Failed to get target type in script " + getTargetBlueprint().getScriptName() + " !"); + } + + if (targetBlueprint.getCoverage() < 1) + newLocations.removeIf(targetLocation -> ThreadLocalRandom.current().nextDouble() > targetBlueprint.getCoverage()); + + return newLocations; + } + + private Collection getLocationFromZone(ScriptActionData scriptActionData) { + if (scriptActionData.getScriptZone() == null) { + Logger.warn("Your script " + targetBlueprint.getScriptName() + " uses " + targetBlueprint.getTargetType().toString() + " but does not have a valid Zone defined!"); + return new ArrayList<>(); + } + return addOffsets(eliteScript.getScriptZone().getZoneLocations(scriptActionData, this), scriptActionData); + } + + //Parse the locations key + private Collection getLocations(EliteEntity eliteEntity, ScriptActionData scriptActionData) { + return targetBlueprint.getLocations().stream().map(rawLocation -> processLocationFromString( + eliteEntity, + rawLocation, + scriptActionData)).collect(Collectors.toSet()); + } + + //Parse the location key + private Location getLocation(EliteEntity eliteEntity, ScriptActionData scriptActionData) { + return processLocationFromString(eliteEntity, targetBlueprint.getLocation(), scriptActionData); + } + + private Location addOffsets(Location originalLocation, ScriptActionData scriptActionData) { + Location location = originalLocation.clone().add(targetBlueprint.getOffset()); + //if (scriptRelativeVector == null) + if (targetBlueprint.getScriptRelativeVectorBlueprint() != null) + scriptRelativeVector = new ScriptRelativeVector(targetBlueprint.getScriptRelativeVectorBlueprint(), eliteScript, location); + else + return location; + + location.add(scriptRelativeVector.getVector(scriptActionData)); + + return location; + } + + private Collection addOffsets(Collection locations, ScriptActionData scriptActionData) { + if (targetBlueprint.getOffset().length() == 0 && scriptRelativeVector == null) return locations; + locations.forEach(entry -> addOffsets(entry, scriptActionData)); + return locations; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptZone.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptZone.java new file mode 100644 index 000000000..e066f3348 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/ScriptZone.java @@ -0,0 +1,279 @@ +package com.magmaguy.elitemobs.powers.scripts; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.ScriptZoneEnterEvent; +import com.magmaguy.elitemobs.api.ScriptZoneLeaveEvent; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.InstancedBossEntity; +import com.magmaguy.elitemobs.powers.scripts.caching.ScriptTargetsBlueprint; +import com.magmaguy.elitemobs.powers.scripts.caching.ScriptZoneBlueprint; +import com.magmaguy.elitemobs.powers.scripts.enums.TargetType; +import com.magmaguy.elitemobs.utils.EventCaller; +import com.magmaguy.elitemobs.utils.shapes.*; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Location; +import org.bukkit.entity.LivingEntity; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.List; +import java.util.stream.Collectors; + +public class ScriptZone { + + @Getter + private final ScriptZoneBlueprint zoneBlueprint; + private final ScriptTargets targets; + @Getter + private final boolean isValid; + private ScriptTargets finalTargets = null; + private ScriptTargets targets2 = null; + private ScriptTargets finalTargets2 = null; + @Setter + private boolean zoneListener = false; + //Used to do zone enter and leave events + private Collection entitiesInZone; + + public ScriptZone(ScriptZoneBlueprint zoneBlueprint, EliteScript eliteScript) { + this.zoneBlueprint = zoneBlueprint; + this.targets = new ScriptTargets(zoneBlueprint.getTarget(), eliteScript); + if (zoneBlueprint.getFinalTarget() != null) + finalTargets = new ScriptTargets(zoneBlueprint.getFinalTarget(), eliteScript); + if (zoneBlueprint.getTarget2() != null) targets2 = new ScriptTargets(zoneBlueprint.getTarget2(), eliteScript); + if (zoneBlueprint.getFinalTarget2() != null) + finalTargets2 = new ScriptTargets(zoneBlueprint.getFinalTarget2(), eliteScript); + isValid = zoneBlueprint.getTarget() != null; + } + + //todo: urgent: at a scale this will cause problems because it does not unschedule the task when a custom boss gets unloaded. Should be cancelling correctly though + public void startZoneListener(EliteEntity eliteEntity) { + if (!zoneListener) return; + entitiesInZone = new HashSet<>(); + ScriptActionData scriptActionData = new ScriptActionData(eliteEntity, targets, this); + new ZoneListenerTask(eliteEntity, scriptActionData).runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + } + + public void ZoneEnterEvent(EliteEntity eliteEntity, LivingEntity livingEntity) { + new EventCaller(new ScriptZoneEnterEvent(eliteEntity, livingEntity)); + } + + public void ZoneLeaveEvent(EliteEntity eliteEntity, LivingEntity livingEntity) { + new EventCaller(new ScriptZoneLeaveEvent(eliteEntity, livingEntity)); + } + + //Get living entities in zone + protected Collection getZoneEntities(ScriptActionData scriptActionData, ScriptTargetsBlueprint blueprintFromRequestingTarget) { + //Get the entities from those zones + switch (blueprintFromRequestingTarget.getTargetType()) { + case ZONE_FULL, ZONE_BORDER: + return getEntitiesInArea(generateShapes(scriptActionData, false), blueprintFromRequestingTarget.getTargetType()); + case INHERIT_SCRIPT_ZONE_FULL, INHERIT_SCRIPT_ZONE_BORDER: + return getEntitiesInArea(generateShapes(scriptActionData.getInheritedScriptActionData(), false), blueprintFromRequestingTarget.getTargetType()); + default: { + Logger.warn("Couldn't parse target " + targets.getTargetBlueprint().getTargetType() + " in script "); + return new ArrayList<>(); + } + } + } + + //Get locations in zone + protected Collection getZoneLocations(ScriptActionData scriptActionData, ScriptTargets actionTarget) { + //Get the locations from those zones + return switch (actionTarget.getTargetBlueprint().getTargetType()) { + case ZONE_FULL -> + consolidateLists(generateShapes(scriptActionData, false).stream().map(Shape::getLocations).collect(Collectors.toSet())); + case ZONE_BORDER -> + consolidateLists(generateShapes(scriptActionData, false).stream().map(Shape::getEdgeLocations).collect(Collectors.toSet())); + case INHERIT_SCRIPT_ZONE_FULL -> + consolidateLists(generateShapes(scriptActionData.getInheritedScriptActionData(), false).stream().map(Shape::getLocations).collect(Collectors.toSet())); + case INHERIT_SCRIPT_ZONE_BORDER -> + consolidateLists(generateShapes(scriptActionData.getInheritedScriptActionData(), false).stream().map(Shape::getEdgeLocations).collect(Collectors.toSet())); + default -> new ArrayList<>(); + }; + } + + //Consolidates lists of lists of locations -> lists of locations + private Collection consolidateLists(Collection> originalLocations) { + Collection parsedLocations = new ArrayList<>(); + originalLocations.forEach(parsedLocations::addAll); + return parsedLocations; + } + + //Generate shapes that define the zone, force is for caching strategies that require generating fresh (this is due to animated zones) + public List generateShapes(ScriptActionData scriptActionData, boolean force) { + //for cached shapes + if (!force && scriptActionData.getShapesChachedByTarget() != null) { + try { + return scriptActionData.getShapesChachedByTarget(); + } catch (Exception ex) { + Logger.warn("Failed to get list of shapes!"); + return new ArrayList<>(); + } + } + + //for non-cached shapes + List shapes = new ArrayList<>(); + + //Get the shapes from the targets of the zone + for (Location shapeTargetLocation : targets.getTargetLocations(scriptActionData)) { + switch (zoneBlueprint.getShapeTypeEnum()) { + case CYLINDER: + shapes.add(new Cylinder(shapeTargetLocation, zoneBlueprint.getRadius(), zoneBlueprint.getHeight(), zoneBlueprint.getBorderRadius())); + break; + case SPHERE: + shapes.add(new Sphere(zoneBlueprint.getRadius(), shapeTargetLocation, zoneBlueprint.getBorderRadius())); + break; + case DOME: + shapes.add(new Dome(zoneBlueprint.getRadius(), shapeTargetLocation, zoneBlueprint.getBorderRadius())); + break; + case STATIC_RAY: + if (targets2 == null) { + Logger.warn("Script for boss " + scriptActionData.getEliteEntity().getName() + " has a static ray but no set target2 for the ray!"); + break; + } + for (Location location : targets2.getTargetLocations(scriptActionData)) + if (rayLocationValidator(shapeTargetLocation, location)) + shapes.add(new StaticRay(zoneBlueprint.isIgnoresSolidBlocks(), zoneBlueprint.getPointRadius(), shapeTargetLocation, location)); + break; + case ROTATING_RAY: + if (targets2 == null) { + Logger.warn("Script for boss " + scriptActionData.getEliteEntity().getName() + " has a static ray but no set target2 for the ray!"); + break; + } + for (Location target2Location : targets2.getTargetLocations(scriptActionData)) + if (rayLocationValidator(shapeTargetLocation, target2Location)) + shapes.add(new RotatingRay(zoneBlueprint.isIgnoresSolidBlocks(), zoneBlueprint.getPointRadius(), shapeTargetLocation, target2Location, zoneBlueprint.getPitchPreRotation(), zoneBlueprint.getYawPreRotation(), zoneBlueprint.getPitchRotation(), zoneBlueprint.getYawRotation(), zoneBlueprint.getAnimationDuration())); + break; + case TRANSLATING_RAY: + if (targets2 == null) { + Logger.warn("Script for boss " + scriptActionData.getEliteEntity().getName() + " has a static ray but no set target2 for the ray!"); + break; + } + Location targetLocationEnd = null; + if (finalTargets != null) { + List finalTargetsList = finalTargets.getTargetLocations(scriptActionData).stream().toList(); + if (!finalTargetsList.isEmpty()) targetLocationEnd = finalTargetsList.get(0); + } + Location target2LocationEnd = null; + if (finalTargets2 != null) { + List finalTargetsList = finalTargets2.getTargetLocations(scriptActionData).stream().toList(); + if (!finalTargetsList.isEmpty()) target2LocationEnd = finalTargetsList.get(0); + } + for (Location location : targets2.getTargetLocations(scriptActionData)) + if (rayLocationValidator(shapeTargetLocation, location)) + shapes.add(new TranslatingRay(zoneBlueprint.isIgnoresSolidBlocks(), zoneBlueprint.getPointRadius(), shapeTargetLocation, targetLocationEnd, location, target2LocationEnd, zoneBlueprint.getAnimationDuration())); + break; + case CUBOID: + shapes.add(new Cuboid(zoneBlueprint.getX(), zoneBlueprint.getY(), zoneBlueprint.getZ(), zoneBlueprint.getXBorder(), zoneBlueprint.getYBorder(), zoneBlueprint.getZBorder(), shapeTargetLocation)); + break; + default: + continue; + } + } + return shapes; + } + + private boolean rayLocationValidator(Location location1, Location location2) { + return location1 != null && location2 != null && location1.getWorld().equals(location2.getWorld()); + } + + //Get entities in an area based on a filter + private Collection getEntitiesInArea(List shapes, TargetType targetType) { + //Get entities in the world + Collection livingEntities = new ArrayList<>(); + Collection validatedEntities = new ArrayList<>(); + for (Shape shape : shapes) { + if (zoneBlueprint.getFilter() == null) livingEntities = filterByLiving(shape.getCenter()); + else switch (zoneBlueprint.getFilter()) { + case PLAYER: + livingEntities = filterByPlayer(shape.getCenter()); + break; + case ELITE: + livingEntities = filterByElite(shape.getCenter()); + break; + case LIVING: + livingEntities = filterByLiving(shape.getCenter()); + break; + default: + return new ArrayList<>(); + } + + for (LivingEntity livingEntity : livingEntities) { + if (targetType.equals(TargetType.ZONE_FULL)) { + if (shape.contains(livingEntity)) validatedEntities.add(livingEntity); + } else if (targetType.equals(TargetType.ZONE_BORDER)) { + if (shape.borderContains(livingEntity.getLocation())) validatedEntities.add(livingEntity); + } + } + + } + + return validatedEntities; + } + + //Filter by player + private Collection filterByPlayer(Location center) { + return center.getWorld().getPlayers(); + } + + //Filter by elite entity + private Collection filterByElite(Location center) { + Collection entities = new ArrayList<>(); + center.getWorld().getEntities().forEach(entity -> { + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(entity); + if (eliteEntity != null) entities.add((LivingEntity) entity); + }); + return entities; + } + + //Filter by any kind of living entity + private Collection filterByLiving(Location center) { + Collection entities = new ArrayList<>(); + center.getWorld().getEntities().forEach(entity -> { + if (entity instanceof LivingEntity livingEntity) entities.add(livingEntity); + }); + return entities; + } + + private class ZoneListenerTask extends BukkitRunnable { + private final EliteEntity eliteEntity; + private final ScriptActionData scriptActionData; + + public ZoneListenerTask(EliteEntity eliteEntity, ScriptActionData scriptActionData) { + this.eliteEntity = eliteEntity; + this.scriptActionData = scriptActionData; + } + + @Override + public void run() { + if (eliteEntity.getLivingEntity() == null || !eliteEntity.getLivingEntity().isValid()) { + if (eliteEntity instanceof CustomBossEntity customBossEntity) { + if (customBossEntity.getHealth() <= 0) + cancel(); + if (customBossEntity instanceof InstancedBossEntity instancedBossEntity) + if (instancedBossEntity.isRemoved()) + //todo: check if this covers all cases + cancel(); + } else + //If it's not a custom entity there's no scenario where it should be able to survive an unload here + cancel(); + return; + } + Collection newEntities = getEntitiesInArea(generateShapes(scriptActionData, false), TargetType.ZONE_FULL); + newEntities.forEach(livingEntity -> { + if (!entitiesInZone.contains(livingEntity)) ZoneEnterEvent(eliteEntity, livingEntity); + }); + entitiesInZone.forEach(livingEntity -> { + if (!newEntities.contains(livingEntity)) ZoneLeaveEvent(eliteEntity, livingEntity); + }); + entitiesInZone = newEntities; + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/EliteScriptBlueprint.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/EliteScriptBlueprint.java new file mode 100644 index 000000000..1045db483 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/EliteScriptBlueprint.java @@ -0,0 +1,171 @@ +package com.magmaguy.elitemobs.powers.scripts.caching; + +import com.magmaguy.elitemobs.config.CustomConfigFields; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.configuration.ConfigurationSection; + +import java.util.*; + +import static com.magmaguy.elitemobs.utils.MapListInterpreter.*; + +public class EliteScriptBlueprint { + @Getter + private static final HashMap blueprints = new HashMap(); + + @Getter + private final CustomConfigFields customConfigFields; + @Getter + private final ScriptActionsBlueprint scriptActionsBlueprint; + @Getter + private final ScriptConditionsBlueprint scriptConditionsBlueprint; + @Getter + private final ScriptZoneBlueprint scriptZoneBlueprint; + @Getter + private final ScriptEventsBlueprint scriptEventsBlueprint; + @Getter + private final ScriptCooldownsBlueprint scriptCooldownsBlueprint; + private final String filename; + @Getter + private final String scriptName; + + + public EliteScriptBlueprint(CustomConfigFields customConfigFields, + ConfigurationSection configurationSection, + String scriptName) { + this.filename = customConfigFields.getFilename(); + this.scriptName = configurationSection.getName(); + this.customConfigFields = customConfigFields; + this.scriptEventsBlueprint = new ScriptEventsBlueprint(configurationSection, scriptName, filename); + this.scriptConditionsBlueprint = new ScriptConditionsBlueprint(configurationSection, scriptName, filename); + this.scriptZoneBlueprint = new ScriptZoneBlueprint(configurationSection, scriptName, filename); + this.scriptActionsBlueprint = new ScriptActionsBlueprint(configurationSection, scriptName, filename); + this.scriptCooldownsBlueprint = new ScriptCooldownsBlueprint(configurationSection, scriptName, filename); + blueprints.put(customConfigFields, this); + } + + public static List parseBossScripts(ConfigurationSection configurationSection, + CustomConfigFields customConfigFields) { + if (configurationSection == null) return Collections.emptyList(); + List eliteScripts = new ArrayList<>(); + Map permanentMap = new HashMap<>(); + //Check for legacy scripts, old target formatting + checkLegacyFormat(configurationSection, customConfigFields); + for (Map.Entry entry : configurationSection.getValues(false).entrySet()) { + EliteScriptBlueprint eliteScript = new EliteScriptBlueprint( + customConfigFields, configurationSection.getConfigurationSection(entry.getKey()), entry.getKey()); + eliteScripts.add(eliteScript); + permanentMap.put(entry.getKey(), eliteScript); + } + + return eliteScripts; + } + + private static void checkLegacyFormat(ConfigurationSection configurationSection, + CustomConfigFields customConfigFields) { + boolean updated = false; + for (String key : configurationSection.getKeys(true)) { + String[] splitKeys = key.split("\\."); + if (splitKeys.length < 1) continue; + String truncatedKey = splitKeys[splitKeys.length - 1]; + if (truncatedKey.equalsIgnoreCase("target") && configurationSection.get(key) instanceof String) { + updated = true; + String overallKey = key.replace(".target", ""); + new OldDataContainer(overallKey, configurationSection, overallKey); + } + //Actions are specific because they have "anonymous" keys since they are just in a list + if (truncatedKey.equalsIgnoreCase("Actions")) { + List> immutableMapList = new ArrayList<>(configurationSection.getMapList(key)); + List> mutableMapList = new ArrayList<>(); + immutableMapList.forEach(map -> mutableMapList.add(new HashMap<>(map))); + for (Map map : mutableMapList) { + Map clonedMap = new HashMap<>(map); + for (Map.Entry entry : clonedMap.entrySet()) { + if (((String) entry.getKey()).equalsIgnoreCase("target") && + !(entry.getValue() instanceof Map)) { + updated = true; + new OldDataContainer(map, customConfigFields.getFilename()); + } + } + } + if (updated) configurationSection.set(key, mutableMapList); + } + } + + if (!updated) return; + try { + customConfigFields.getFileConfiguration().set("eliteScript", configurationSection.getValues(false)); + customConfigFields.getFileConfiguration().save(customConfigFields.getFile()); + } catch (Exception exception) { + Logger.warn("Failed to update old script targets! Report this to the dev."); + } + } + + private static class OldDataContainer { + String location = null, targetType = null, offset = null; + List locations = null; + Double range = null; + Boolean track = null; + String newKey; + String scriptName; + + private OldDataContainer(String overallKey, ConfigurationSection configurationSection, String scriptName) { + processMapList(configurationSection.getConfigurationSection(overallKey).getValues(false).entrySet()); + this.newKey = overallKey + ".Target"; + this.scriptName = scriptName; + if (targetType != null) updateKey("targetType", targetType, configurationSection); + if (location != null) updateKey("location", location, configurationSection); + if (locations != null) updateKey("locations", locations, configurationSection); + if (range != null) updateKey("range", range, configurationSection); + if (offset != null) updateKey("offset", offset, configurationSection); + if (track != null) updateKey("track", track, configurationSection); + } + + private OldDataContainer(Map map, String scriptName) { + processMapList(((Map) map).entrySet()); + this.scriptName = scriptName; + Map newMap = new HashMap<>(); + if (targetType != null) updateKey("targetType", targetType, (Map) map, newMap); + if (location != null) updateKey("location", location, (Map) map, newMap); + if (locations != null) updateKey("locations", locations, (Map) map, newMap); + if (range != null) updateKey("range", range, (Map) map, newMap); + if (offset != null) updateKey("offset", offset, (Map) map, newMap); + if (track != null) updateKey("track", track, (Map) map, newMap); + ((Map) map).put("Target", newMap); + } + + private void updateKey(String key, Object value, ConfigurationSection configurationSection) { + configurationSection.set(newKey + "." + key, value); + configurationSection.set(newKey.replace(".Target", ".") + key, null); + if (key.contains("targetType")) + configurationSection.set(newKey.replace(".Target", ".") + key.replace("targetType", "target"), null); + } + + private void updateKey(String key, Object value, Map oldMap, Map newMap) { + oldMap.remove(key); + if (key.equals("targetType")) oldMap.remove("target"); + newMap.put(key, value); + } + + private void processMapList(Set> entry) { + for (Map.Entry entrySet : entry) { + String key = (String) entrySet.getKey(); + processKeyAndValue(key, entrySet.getValue()); + } + } + + + protected void processKeyAndValue(String key, Object value) { + switch (key.toLowerCase(Locale.ROOT)) { + case "location" -> location = parseString(key, value, scriptName); + case "locations" -> locations = parseStringList(key, value, scriptName); + case "target" -> targetType = parseString(key, value, scriptName); + case "range" -> range = parseDouble(key, value, scriptName); + case "offset" -> offset = parseString(key, value, scriptName); + case "track" -> track = parseBoolean(key, value, scriptName); + } + } + } + +} + diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/ScriptActionBlueprint.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/ScriptActionBlueprint.java new file mode 100644 index 000000000..cb784cc2c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/ScriptActionBlueprint.java @@ -0,0 +1,235 @@ +package com.magmaguy.elitemobs.powers.scripts.caching; + +import com.magmaguy.elitemobs.powers.scripts.enums.ActionType; +import com.magmaguy.elitemobs.powers.scripts.enums.WeatherType; +import com.magmaguy.elitemobs.utils.PotionEffectTypeUtil; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.Color; +import org.bukkit.FireworkEffect; +import org.bukkit.Material; +import org.bukkit.boss.BarColor; +import org.bukkit.boss.BarStyle; +import org.bukkit.configuration.MemorySection; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import static com.magmaguy.elitemobs.utils.MapListInterpreter.*; + +public class ScriptActionBlueprint { + @Getter + private final String scriptName; + @Getter + private final String scriptFilename; + @Getter + private ActionType actionType = null; + @Getter + private int duration = 0; + @Getter + private int wait = 0; + @Getter + private PotionEffectType potionEffectType; + @Getter + private int amplifier; + @Getter + private List scripts = new ArrayList<>(); + @Getter + private List landingScripts = new ArrayList<>(); + @Getter + private ScriptConditionsBlueprint conditionsBlueprint; + @Getter + private int times = -1; + @Getter + private int repeatEvery = 0; + @Getter + private ScriptParticlesBlueprint scriptParticlesBlueprint = new ScriptParticlesBlueprint(); + @Getter + private double multiplier = 1; + @Getter + private Material material = Material.TARGET; + @Getter + private double amount = 1; + @Getter + private Boolean bValue = null; + @Getter + private String sValue = ""; + @Getter + private Vector vValue = null; + @Getter + private ScriptTargetsBlueprint scriptTargets; + @Getter + private ScriptTargetsBlueprint finalTarget = null; + @Getter + private String title = ""; + @Getter + private String subtitle = ""; + @Getter + private BarColor barColor = BarColor.WHITE; + @Getter + private BarStyle barStyle = BarStyle.SOLID; + @Getter + private int fadeIn = 1; + @Getter + private int fadeOut = 1; + //fireworks + @Getter + private boolean flicker = true; + @Getter + private boolean withTrail = true; + @Getter + private FireworkEffect.Type fireworkEffectType = FireworkEffect.Type.BALL_LARGE; + @Getter + private List fireworkEffectTypes = null; + @Getter + private List> fireworkEffects = new ArrayList<>(); + @Getter + private int power = 10; + @Getter + private boolean invulnerable = true; + @Getter + private Vector offset = new Vector(0, 0, 0); + @Getter + private List tags; + @Getter + private int time = 0; + @Getter + private WeatherType weatherType = WeatherType.CLEAR; + @Getter + private boolean onlyRunOneScript = false; + @Getter + private ScriptRelativeVectorBlueprint scriptRelativeVectorBlueprint = null; + @Getter + private float volume = 1f; + @Getter + private float pitch = 1f; + @Getter + private float velocity = 1f; + @Getter + private double scale = 1f; + @Getter + private boolean debug = false; + + + public ScriptActionBlueprint(Map entry, String scriptName, String scriptFilename) { + this.scriptName = scriptName; + this.scriptFilename = scriptFilename; + processMapList(entry); + conditionsBlueprint = new ScriptConditionsBlueprint((Map) entry.get("Conditions"), scriptName, scriptFilename); + if (scriptTargets == null) scriptTargets = new ScriptTargetsBlueprint(entry, scriptName, scriptFilename); + if (actionType == ActionType.SPAWN_PARTICLE && + scriptTargets.isZoneTarget() && + scriptTargets.getCoverage() == 1D && + !scriptTargets.isCustomCoverage()) + scriptTargets.setCoverage(.3); + } + + private void processMapList(Map entry) { + for (Map.Entry entrySet : entry.entrySet()) { + String key = (String) entrySet.getKey(); + processKeyAndValue(key, entrySet.getValue()); + } + } + + protected void processKeyAndValue(String key, Object value) { + switch (key.toLowerCase(Locale.ROOT)) { + case "duration" -> duration = parseInteger(key, value, scriptName); + case "wait" -> wait = parseInteger(key, value, scriptName); + case "amplifier" -> amplifier = parseInteger(key, value, scriptName); + case "action" -> actionType = parseEnum(key, value, ActionType.class, scriptName); + case "potioneffecttype" -> { + try { + potionEffectType = PotionEffectTypeUtil.getByKey(((String) value).toLowerCase(Locale.ROOT)); + } catch (Exception ex) { + Logger.warn("Invalid potion effect type " + value + " in file " + scriptFilename + " for script " + scriptName + " !"); + } + } + case "scripts" -> scripts = parseStringList(key, value, scriptName); + case "landingscripts" -> landingScripts = parseStringList(key, value, scriptName); + case "conditions" -> + conditionsBlueprint = new ScriptConditionsBlueprint((Map) value, scriptName, scriptFilename); + case "times" -> times = parseInteger(key, value, scriptName); + case "repeatevery" -> repeatEvery = parseInteger(key, value, scriptName); + case "particles" -> + scriptParticlesBlueprint = new ScriptParticlesBlueprint((List>) value, scriptName, scriptFilename); + case "multiplier" -> multiplier = parseDouble(key, value, scriptName); + case "material" -> material = parseEnum(key, value, Material.class, scriptName); + case "amount" -> amount = parseInteger(key, value, scriptName); + case "bvalue" -> bValue = parseBoolean(key, value, scriptName); + case "svalue" -> sValue = parseString(key, value, scriptName); + case "vvalue" -> vValue = parseVector(key, value, scriptName); + case "title" -> title = parseString(key, value, scriptName); + case "subtitle" -> subtitle = parseString(key, value, scriptName); + case "barcolor" -> barColor = parseEnum(key, value, BarColor.class, scriptName); + case "barstyle" -> barStyle = parseEnum(key, value, BarStyle.class, scriptName); + case "fadein" -> fadeIn = parseInteger(key, value, scriptName); + case "fadeout" -> fadeOut = parseInteger(key, value, scriptName); + case "flicker" -> flicker = parseBoolean(key, value, scriptName); + case "withtrail" -> withTrail = parseBoolean(key, value, scriptName); + case "fireworkeffecttype" -> + fireworkEffectType = parseEnum(key, value, FireworkEffect.Type.class, scriptName); + case "fireworkeffecttypes" -> + fireworkEffectTypes = parseEnumList(key, value, FireworkEffect.Type.class, scriptName); + case "fireworkeffects" -> fireworkEffects = parseEnumListList(key, value, FireworkColor.class, scriptName); + case "power" -> power = parseInteger(key, value, scriptName); + case "invulnerable" -> invulnerable = parseBoolean(key, value, scriptName); + case "offset" -> offset = parseVector(key, value, scriptName); + case "tags" -> tags = parseStringList(key, value, scriptName); + case "time" -> time = parseInteger(key, value, scriptName); + case "weather" -> weatherType = parseEnum(key, value, WeatherType.class, scriptName); + case "target" -> { + if (value instanceof MemorySection) + scriptTargets = new ScriptTargetsBlueprint(((MemorySection) value).getValues(false), scriptName, scriptFilename); + else + scriptTargets = new ScriptTargetsBlueprint((Map) value, scriptName, scriptFilename); + } + case "finaltarget" -> { + if (value instanceof MemorySection) + finalTarget = new ScriptTargetsBlueprint(((MemorySection) value).getValues(false), scriptName, scriptFilename); + else + finalTarget = new ScriptTargetsBlueprint((Map) value, scriptName, scriptFilename); + } + case "onlyrunonescript" -> onlyRunOneScript = parseBoolean(key, value, scriptName); + case "relativevector" -> + scriptRelativeVectorBlueprint = new ScriptRelativeVectorBlueprint(scriptName, scriptFilename, (Map) value); + case "pitch" -> pitch = parseFloat(key, value, scriptName); + case "volume" -> volume = parseFloat(key, value, scriptName); + case "velocity" -> velocity = parseFloat(key, value, scriptName); + case "scale" -> scale = parseFloat(key, value, scriptName); + case "debug" -> debug = parseBoolean(key, value, scriptName); + default -> Logger.warn("Failed to read key " + key + " for script " + scriptName + " in " + scriptFilename); + } + + } + + public enum FireworkColor { + WHITE(Color.WHITE), + SILVER(Color.SILVER), + GRAY(Color.GRAY), + BLACK(Color.BLACK), + RED(Color.RED), + MAROON(Color.MAROON), + YELLOW(Color.YELLOW), + OLIVE(Color.OLIVE), + LIME(Color.LIME), + GREEN(Color.GREEN), + AQUA(Color.AQUA), + TEAL(Color.TEAL), + BLUE(Color.BLUE), + NAVY(Color.NAVY), + FUCHSIA(Color.FUCHSIA), + PURPLE(Color.PURPLE), + ORANGE(Color.ORANGE); + + @Getter + private final Color color; + + FireworkColor(Color color) { + this.color = color; + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/ScriptActionsBlueprint.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/ScriptActionsBlueprint.java new file mode 100644 index 000000000..37b8478c8 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/ScriptActionsBlueprint.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.powers.scripts.caching; + +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.configuration.ConfigurationSection; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class ScriptActionsBlueprint { + @Getter + private final List scriptActionsBlueprintList = new ArrayList<>(); + + public ScriptActionsBlueprint(ConfigurationSection configurationSection, String scriptName, String filename) { + List> values = configurationSection.getMapList("Actions"); + if (values.isEmpty()) { + Logger.warn("Script " + scriptName + " in file " + filename + " does not have any actions! You should probably fix this."); + return; + } + values.forEach(entry -> scriptActionsBlueprintList.add(new ScriptActionBlueprint(entry, scriptName, filename))); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/ScriptConditionsBlueprint.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/ScriptConditionsBlueprint.java new file mode 100644 index 000000000..f60aaa65f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/ScriptConditionsBlueprint.java @@ -0,0 +1,88 @@ +package com.magmaguy.elitemobs.powers.scripts.caching; + +import com.magmaguy.elitemobs.powers.scripts.enums.ConditionType; +import com.magmaguy.elitemobs.utils.MapListInterpreter; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.MemorySection; + +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +public class ScriptConditionsBlueprint { + + private final String scriptName; + private final String filename; + @Getter + private Boolean isAlive = null; + @Getter + private List hasTags = null; + @Getter + private Boolean locationIsAir = null; + @Getter + private Boolean isOnFloor = null; + @Getter + private List doesNotHaveTags = null; + @Getter + private ScriptTargetsBlueprint scriptTargets = null; + @Getter + private Double randomChance = null; + @Getter + @Setter + private ConditionType conditionType = null; + @Getter + @Setter + private Material isStandingOnMaterial = null; + + //Process from a script + public ScriptConditionsBlueprint(ConfigurationSection configurationSection, String scriptName, String filename) { + this.scriptName = scriptName; + this.filename = filename; + if (configurationSection.get("Conditions") == null) return; + Map values = ((ConfigurationSection) configurationSection.get("Conditions")).getValues(false); + processMapList(values); + if (scriptTargets == null) scriptTargets = new ScriptTargetsBlueprint(new HashMap<>(), scriptName, filename); + } + + //Process from an action + public ScriptConditionsBlueprint(Map values, String scriptName, String filename) { + this.scriptName = scriptName; + this.filename = filename; + if (values != null) processMapList(values); + if (scriptTargets == null) scriptTargets = new ScriptTargetsBlueprint(new HashMap<>(), scriptName, filename); + } + + private void processKeyAndValue(String key, Object value) { + switch (key.toLowerCase(Locale.ROOT)) { + case "isalive" -> isAlive = MapListInterpreter.parseBoolean(key, value, scriptName); + case "locationisair" -> locationIsAir = MapListInterpreter.parseBoolean(key, value, scriptName); + case "hastags" -> hasTags = MapListInterpreter.parseStringList(key, value, scriptName); + case "doesnothavetags" -> doesNotHaveTags = MapListInterpreter.parseStringList(key, value, scriptName); + case "isonfloor" -> isOnFloor = MapListInterpreter.parseBoolean(key, value, scriptName); + case "isstandingonmaterial" -> + isStandingOnMaterial = MapListInterpreter.parseEnum(key, value, Material.class, scriptName); + case "randomchance" -> randomChance = MapListInterpreter.parseDouble(key, value, scriptName); + case "conditiontype" -> + conditionType = MapListInterpreter.parseEnum(key, value, ConditionType.class, scriptName); + case "target" -> { + if (value instanceof MemorySection memorySection) + value = memorySection.getValues(false); + scriptTargets = new ScriptTargetsBlueprint((Map) value, scriptName, filename); + } + default -> Logger.warn("Failed to read key " + key + " for script " + scriptName); + } + } + + private void processMapList(Map entry) { + for (Map.Entry entrySet : entry.entrySet()) { + String key = (String) entrySet.getKey(); + processKeyAndValue(key, entrySet.getValue()); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/ScriptCooldownsBlueprint.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/ScriptCooldownsBlueprint.java new file mode 100644 index 000000000..4c12d641c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/ScriptCooldownsBlueprint.java @@ -0,0 +1,32 @@ +package com.magmaguy.elitemobs.powers.scripts.caching; + +import com.magmaguy.elitemobs.utils.MapListInterpreter; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.configuration.ConfigurationSection; + +import java.util.Locale; +import java.util.Map; + +public class ScriptCooldownsBlueprint { + @Getter + private int localCooldown = 0; + @Getter + private int globalCooldown = 0; + + public ScriptCooldownsBlueprint(ConfigurationSection configurationSection, String scriptName, String filename) { + ConfigurationSection subSection = configurationSection.getConfigurationSection("Cooldowns"); + if (subSection == null) return; + Map values = subSection.getValues(false); + for (Map.Entry entry : values.entrySet()) { + switch (entry.getKey().toLowerCase(Locale.ROOT)) { + case "local" -> + localCooldown = MapListInterpreter.parseInteger(entry.getKey(), entry.getValue(), scriptName); + case "global" -> + globalCooldown = MapListInterpreter.parseInteger(entry.getKey(), entry.getValue(), scriptName); + default -> + Logger.warn("Failed to parse cooldown entry for script name " + scriptName + " in config file " + filename); + } + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/ScriptEventsBlueprint.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/ScriptEventsBlueprint.java new file mode 100644 index 000000000..50d33811d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/ScriptEventsBlueprint.java @@ -0,0 +1,46 @@ +package com.magmaguy.elitemobs.powers.scripts.caching; + +import com.magmaguy.elitemobs.api.*; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.configuration.ConfigurationSection; + +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class ScriptEventsBlueprint { + @Getter + private final Set events = new HashSet<>(); + @Getter + private boolean zoneListener = false; + + public ScriptEventsBlueprint(ConfigurationSection configurationSection, String scriptName, String filename) { + List values = configurationSection.getStringList("Events"); + for (String entry : values) { + switch (entry) { + case "EliteMobDamagedByEliteMobEvent" -> events.add(EliteMobDamagedByEliteMobEvent.class); + case "EliteMobDamagedByPlayerEvent" -> events.add(EliteMobDamagedByPlayerEvent.class); + case "EliteMobDamagedEvent" -> events.add(EliteMobDamagedEvent.class); + case "EliteMobDeathEvent" -> events.add(EliteMobDeathEvent.class); + case "EliteMobEnterCombatEvent" -> events.add(EliteMobEnterCombatEvent.class); + case "EliteMobExitCombatEvent" -> events.add(EliteMobExitCombatEvent.class); + case "EliteMobHealEvent" -> events.add(EliteMobHealEvent.class); + case "EliteMobSpawnEvent" -> events.add(EliteMobSpawnEvent.class); + case "EliteMobTargetPlayerEvent" -> events.add(EliteMobTargetPlayerEvent.class); + case "PlayerDamagedByEliteMobEvent" -> events.add(PlayerDamagedByEliteMobEvent.class); + case "ElitePhaseSwitchEvent" -> events.add(ElitePhaseSwitchEvent.class); + case "ZoneEnterEvent" -> { + events.add(ScriptZoneEnterEvent.class); + zoneListener = true; + } + case "ZoneLeaveEvent" -> { + events.add(ScriptZoneLeaveEvent.class); + zoneListener = true; + } + default -> + Logger.warn("Failed to get valid script event from entry " + entry + " in " + scriptName + " for file " + filename + " !"); + } + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/ScriptParticlesBlueprint.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/ScriptParticlesBlueprint.java new file mode 100644 index 000000000..5ed7d9066 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/ScriptParticlesBlueprint.java @@ -0,0 +1,96 @@ +package com.magmaguy.elitemobs.powers.scripts.caching; + +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.Particle; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import static com.magmaguy.elitemobs.utils.MapListInterpreter.*; + +public class ScriptParticlesBlueprint { + @Getter + private final List particleBlueprints = new ArrayList<>(); + + public ScriptParticlesBlueprint(List> entries, String scriptName, String filename) { + for (Map entry : entries) + particleBlueprints.add(new ScriptParticleBlueprint(entry, scriptName, filename)); + } + + //Empty constructor to avoid having null values for this + public ScriptParticlesBlueprint() { + + } + + public class ScriptParticleBlueprint { + @Getter + private final String scriptName; + private final String filename; + @Getter + private double x = 0.01; + @Getter + private double y = 0.01; + @Getter + private double z = 0.01; + @Getter + private int amount = 1; + @Getter + private int red = 255; + @Getter + private int green = 255; + @Getter + private int blue = 255; + @Getter + private int toRed = 255; + @Getter + private int toGreen = 255; + @Getter + private int toBlue = 255; + @Getter + private Particle particle = Particle.FLAME; + @Getter + private double speed = 0.01; + @Getter + private Boolean moveToTarget = null; + @Getter + private ScriptRelativeVectorBlueprint relativeVectorBlueprint = null; + + public ScriptParticleBlueprint(Map entry, String scriptName, String filename) { + this.filename = filename; + this.scriptName = scriptName; + processMapList(entry); + } + + private void processMapList(Map entry) { + for (Map.Entry entrySet : entry.entrySet()) { + String key = (String) entrySet.getKey(); + processKeyAndValue(key, entrySet.getValue()); + } + } + + private void processKeyAndValue(String key, Object value) { + switch (key.toLowerCase(Locale.ROOT)) { + case "x" -> x = parseDouble(key, value, scriptName); + case "y" -> y = parseDouble(key, value, scriptName); + case "z" -> z = parseDouble(key, value, scriptName); + case "amount" -> amount = parseInteger(key, value, scriptName); + case "particle" -> particle = parseEnum(key, value, Particle.class, scriptName); + case "speed" -> speed = parseDouble(key, value, scriptName); + case "red" -> red = parseInteger(key, value, scriptName); + case "green" -> green = parseInteger(key, value, scriptName); + case "blue" -> blue = parseInteger(key, value, scriptName); + case "tored" -> toRed = parseInteger(key, value, scriptName); + case "togreen" -> toGreen = parseInteger(key, value, scriptName); + case "toblue" -> toBlue = parseInteger(key, value, scriptName); + case "movetotarget" -> moveToTarget = parseBoolean(key, value, scriptName); + case "relativevector" -> + relativeVectorBlueprint = new ScriptRelativeVectorBlueprint(scriptName, filename, (Map) value); + default -> + Logger.warn("Key " + key + " in script " + scriptName + " in file " + filename + " for script particles is not a valid key!"); + } + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/ScriptRelativeVectorBlueprint.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/ScriptRelativeVectorBlueprint.java new file mode 100644 index 000000000..a38bfcb70 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/ScriptRelativeVectorBlueprint.java @@ -0,0 +1,61 @@ +package com.magmaguy.elitemobs.powers.scripts.caching; + +import com.magmaguy.elitemobs.utils.MapListInterpreter; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.configuration.MemorySection; +import org.bukkit.util.Vector; + +import java.util.LinkedHashMap; +import java.util.Locale; +import java.util.Map; + +public class ScriptRelativeVectorBlueprint { + + private final String scriptName; + private final String scriptFilename; + + @Getter + private ScriptTargetsBlueprint sourceTarget = null; + @Getter + private ScriptTargetsBlueprint destinationTarget = null; + @Getter + private boolean normalize = false; + @Getter + private double multiplier = 1.0; + @Getter + private Vector offset = new Vector(0, 0, 0); + + public ScriptRelativeVectorBlueprint(String scriptName, String scriptFilename, Map configurationValues) { + this.scriptName = scriptName; + this.scriptFilename = scriptFilename; + configurationValues.entrySet().forEach(entry -> processKeyAndValue(entry.getKey(), entry.getValue())); + } + + public ScriptRelativeVectorBlueprint(String scriptName, String scriptFilename, LinkedHashMap configurationValues) { + this.scriptName = scriptName; + this.scriptFilename = scriptFilename; + configurationValues.entrySet().forEach(entry -> processKeyAndValue(entry.getKey(), entry.getValue())); + } + + protected void processKeyAndValue(String key, Object value) { + switch (key.toLowerCase(Locale.ROOT)) { + case "sourcetarget" -> { + if (value instanceof MemorySection) + sourceTarget = new ScriptTargetsBlueprint(((MemorySection) value).getValues(false), scriptName, scriptFilename); + else + sourceTarget = new ScriptTargetsBlueprint((Map) value, scriptName, scriptFilename); + } + case "destinationtarget" -> { + if (value instanceof MemorySection) + destinationTarget = new ScriptTargetsBlueprint(((MemorySection) value).getValues(false), scriptName, scriptFilename); + else + destinationTarget = new ScriptTargetsBlueprint((Map) value, scriptName, scriptFilename); + } + case "multiplier" -> multiplier = MapListInterpreter.parseDouble(key, value, scriptName); + case "normalize" -> normalize = MapListInterpreter.parseBoolean(key, value, scriptName); + case "offset" -> offset = MapListInterpreter.parseVector(key, value, scriptName); + default -> Logger.warn("Failed to read key " + key + " for script " + scriptName + " in " + scriptFilename); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/ScriptTargetsBlueprint.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/ScriptTargetsBlueprint.java new file mode 100644 index 000000000..455d24626 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/ScriptTargetsBlueprint.java @@ -0,0 +1,88 @@ +package com.magmaguy.elitemobs.powers.scripts.caching; + +import com.magmaguy.elitemobs.powers.scripts.enums.TargetType; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.configuration.MemorySection; +import org.bukkit.util.Vector; + +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; + +import static com.magmaguy.elitemobs.utils.MapListInterpreter.*; + +public class ScriptTargetsBlueprint { + private final String filename; + @Getter + private final String scriptName; + @Getter + protected TargetType targetType = TargetType.SELF; + @Getter + private List locations; + @Getter + private String location; + @Getter + private Vector offset = new Vector(0, 0, 0); + @Getter + private double range = 20; + @Getter + @Setter + private boolean track = true; + @Getter + @Setter + private double coverage = 1.0; + @Getter + private boolean isCustomCoverage = false; + @Getter + private ScriptRelativeVectorBlueprint scriptRelativeVectorBlueprint = null; + + public ScriptTargetsBlueprint(Map entry, String scriptName, String filename) { + this.scriptName = scriptName; + this.filename = filename; + processMapList(entry); + if (!isZoneTarget() && coverage < 1.0) { + Logger.warn("Coverage for script " + scriptName + " in file " + filename + " was less than 1.0 but the targetType is neither ZONE_FULL nor ZONE_BORDER! Coverage should only be used for ZONE_FULL or ZONE_BORDER"); + coverage = 1.0; + } + } + + public boolean isZoneTarget() { + return targetType == TargetType.ZONE_FULL || + targetType == TargetType.ZONE_BORDER || + targetType == TargetType.INHERIT_SCRIPT_ZONE_FULL || + targetType == TargetType.INHERIT_SCRIPT_ZONE_BORDER; + } + + private void processMapList(Map entry) { + for (Map.Entry entrySet : entry.entrySet()) { + String key = (String) entrySet.getKey(); + processKeyAndValue(key, entrySet.getValue()); + } + } + + protected void processKeyAndValue(String key, Object value) { + switch (key.toLowerCase(Locale.ROOT)) { + case "location" -> location = parseString(key, value, scriptName); + case "locations" -> locations = parseStringList(key, value, scriptName); + case "targettype" -> targetType = parseEnum(key, value, TargetType.class, scriptName); + case "range" -> range = parseDouble(key, value, scriptName); + case "offset" -> offset = parseVector(key, value, scriptName); + case "track" -> track = parseBoolean(key, value, scriptName); + case "coverage" -> { + isCustomCoverage = true; + coverage = parseDouble(key, value, scriptName); + } + case "relativeoffset" -> { + if (value instanceof MemorySection) + new ScriptRelativeVectorBlueprint(scriptName, filename, ((MemorySection) value).getValues(false)); + else if (value instanceof LinkedHashMap) + scriptRelativeVectorBlueprint = new ScriptRelativeVectorBlueprint(scriptName, filename, ((LinkedHashMap) value)); + else + Logger.warn("Failed to get valid format for relative offset in " + scriptName + " for file " + filename); + } + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/ScriptZoneBlueprint.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/ScriptZoneBlueprint.java new file mode 100644 index 000000000..642da8361 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/caching/ScriptZoneBlueprint.java @@ -0,0 +1,117 @@ +package com.magmaguy.elitemobs.powers.scripts.caching; + +import com.magmaguy.elitemobs.powers.scripts.enums.Filter; +import com.magmaguy.elitemobs.powers.scripts.enums.ShapeType; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.MemorySection; + +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; + +import static com.magmaguy.elitemobs.utils.MapListInterpreter.*; + +public class ScriptZoneBlueprint { + + private final String scriptName; + private final String filename; + @Getter + private ScriptTargetsBlueprint target = null; + @Getter + private ScriptTargetsBlueprint finalTarget = null; + @Getter + private ScriptTargetsBlueprint target2 = null; + @Getter + private ScriptTargetsBlueprint finalTarget2 = null; + @Getter + private ShapeType shapeTypeEnum = ShapeType.CYLINDER; + @Getter + private double height = 1; + @Getter + private Filter filter = Filter.PLAYER; + @Getter + private double radius = 5; + @Getter + private double borderRadius = 1; + @Getter + private double pointRadius = 0.5; + @Getter + private double pitchRotation = 0D; + @Getter + private double yawRotation = 0D; + @Getter + private double pitchPreRotation = 0D; + @Getter + private double yawPreRotation = 0D; + @Getter + private int animationDuration = 0; + @Getter + private double x = 0; + @Getter + private double y = 0; + @Getter + private double z = 0; + @Getter + private double xBorder = 0; + @Getter + private double yBorder = 0; + @Getter + private double zBorder = 0; + @Getter + private boolean ignoresSolidBlocks = true; + + public ScriptZoneBlueprint(ConfigurationSection configurationSection, String scriptName, String filename) { + this.scriptName = scriptName; + this.filename = filename; + ConfigurationSection subSection = configurationSection.getConfigurationSection("Zone"); + if (subSection == null) return; + Map values = subSection.getValues(false); + processMapList(values); + if (target == null) target = new ScriptTargetsBlueprint(new HashMap<>(), scriptName, filename); + } + + //Start processing entries + private void processMapList(Map entry) { + for (Map.Entry entrySet : entry.entrySet()) { + String key = (String) entrySet.getKey(); + processKeyAndValue(key, entrySet.getValue()); + } + } + + //Process entries + protected void processKeyAndValue(String key, Object value) { + switch (key.toLowerCase(Locale.ROOT)) { + case "shape" -> shapeTypeEnum = parseEnum(key, value, ShapeType.class, scriptName); + case "filter" -> filter = parseEnum(key, value, Filter.class, scriptName); + case "height" -> height = parseDouble(key, value, scriptName); + case "radius" -> radius = parseDouble(key, value, scriptName); + case "borderradius" -> borderRadius = parseDouble(key, value, scriptName); + case "pointradius" -> pointRadius = parseDouble(key, value, scriptName); + case "pitchrotation" -> pitchRotation = parseDouble(key, value, scriptName); + case "pitchprerotation" -> pitchPreRotation = parseDouble(key, value, scriptName); + case "yawrotation" -> yawRotation = parseDouble(key, value, scriptName); + case "yawprerotation" -> yawPreRotation = parseDouble(key, value, scriptName); + case "target" -> + target = new ScriptTargetsBlueprint(((MemorySection) value).getValues(false), scriptName, filename); + case "finaltarget" -> + finalTarget = new ScriptTargetsBlueprint(((MemorySection) value).getValues(false), scriptName, filename); + case "target2" -> + target2 = new ScriptTargetsBlueprint(((MemorySection) value).getValues(false), scriptName, filename); + case "finaltarget2" -> + finalTarget2 = new ScriptTargetsBlueprint(((MemorySection) value).getValues(false), scriptName, filename); + case "animationduration" -> animationDuration = parseInteger(key, value, scriptName); + case "ignoressolidblocks" -> ignoresSolidBlocks = parseBoolean(key, value, scriptName); + case "x" -> x = parseDouble(key, value, scriptName); + case "y" -> y = parseDouble(key, value, scriptName); + case "z" -> z = parseDouble(key, value, scriptName); + case "xborder" -> xBorder = parseDouble(key, value, scriptName); + case "yborder" -> yBorder = parseDouble(key, value, scriptName); + case "zborder" -> zBorder = parseDouble(key, value, scriptName); + default -> { + Logger.warn("Failed to read key " + key + " for script " + scriptName + " in file " + filename); + } + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/enums/ActionType.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/enums/ActionType.java new file mode 100644 index 000000000..475a59a82 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/enums/ActionType.java @@ -0,0 +1,45 @@ +package com.magmaguy.elitemobs.powers.scripts.enums; + +import lombok.Getter; + +public enum ActionType { + TELEPORT(false), + MESSAGE(true), + POTION_EFFECT(true), + DAMAGE(true), + RUN_SCRIPT(false), + SET_ON_FIRE(true), + VISUAL_FREEZE(true), + PLACE_BLOCK(false), + RUN_COMMAND_AS_PLAYER(true), + RUN_COMMAND_AS_CONSOLE(false), + STRIKE_LIGHTNING(false), + SPAWN_PARTICLE(false), + SET_MOB_AI(true), + SET_MOB_AWARE(true), + PLAY_SOUND(false), + PUSH(true), + SUMMON_REINFORCEMENT(false), + BOSS_BAR_MESSAGE(false), + ACTION_BAR_MESSAGE(false), + TITLE_MESSAGE(false), + SPAWN_FIREWORKS(false), + MAKE_INVULNERABLE(true), + TAG(true), + UNTAG(true), + SET_TIME(false), + SET_WEATHER(false), + PLAY_ANIMATION(true), + SPAWN_FALLING_BLOCK(false), + MODIFY_DAMAGE(true), + SUMMON_ENTITY(false), + NAVIGATE(false), + SCALE(false); + + @Getter + private final boolean requiresLivingEntity; + + ActionType(boolean requiresLivingEntity) { + this.requiresLivingEntity = requiresLivingEntity; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/enums/ConditionType.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/enums/ConditionType.java new file mode 100644 index 000000000..370b43368 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/enums/ConditionType.java @@ -0,0 +1,6 @@ +package com.magmaguy.elitemobs.powers.scripts.enums; + +public enum ConditionType { + BLOCKING, + FILTERING +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/enums/Filter.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/enums/Filter.java new file mode 100644 index 000000000..2a117608a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/enums/Filter.java @@ -0,0 +1,7 @@ +package com.magmaguy.elitemobs.powers.scripts.enums; + +public enum Filter { + PLAYER, + ELITE, + LIVING +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/enums/ShapeType.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/enums/ShapeType.java new file mode 100644 index 000000000..dc9ef1ee4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/enums/ShapeType.java @@ -0,0 +1,11 @@ +package com.magmaguy.elitemobs.powers.scripts.enums; + +public enum ShapeType { + CYLINDER, + SPHERE, + DOME, + STATIC_RAY, + ROTATING_RAY, + TRANSLATING_RAY, + CUBOID +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/enums/TargetType.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/enums/TargetType.java new file mode 100644 index 000000000..339d6f924 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/enums/TargetType.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.powers.scripts.enums; + +public enum TargetType { + NEARBY_PLAYERS, + NEARBY_MOBS, + WORLD_PLAYERS, + ALL_PLAYERS, + DIRECT_TARGET, + SELF, + SELF_SPAWN, + LOCATION, + LOCATIONS, + ZONE_FULL, + ZONE_BORDER, + LANDING_LOCATION, + ACTION_TARGET, + INHERIT_SCRIPT_TARGET, + INHERIT_SCRIPT_ZONE_FULL, + INHERIT_SCRIPT_ZONE_BORDER +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/scripts/enums/WeatherType.java b/src/main/java/com/magmaguy/elitemobs/powers/scripts/enums/WeatherType.java new file mode 100644 index 000000000..4de67cca2 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/scripts/enums/WeatherType.java @@ -0,0 +1,7 @@ +package com.magmaguy.elitemobs.powers.scripts.enums; + +public enum WeatherType { + CLEAR, + PRECIPITATION, + THUNDER +} diff --git a/src/main/java/com/magmaguy/elitemobs/powers/specialpowers/EnderCrystalLightningRod.java b/src/main/java/com/magmaguy/elitemobs/powers/specialpowers/EnderCrystalLightningRod.java new file mode 100644 index 000000000..b90c2cc26 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/powers/specialpowers/EnderCrystalLightningRod.java @@ -0,0 +1,58 @@ +package com.magmaguy.elitemobs.powers.specialpowers; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.EnderDragonEmpoweredLightning; +import org.bukkit.NamespacedKey; +import org.bukkit.entity.EnderCrystal; +import org.bukkit.entity.EntityType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageEvent; +import org.bukkit.persistence.PersistentDataType; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.concurrent.ThreadLocalRandom; + +public class EnderCrystalLightningRod { + + public EnderCrystalLightningRod(EliteEntity eliteEntity, EnderCrystal enderCrystal) { + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + if (!eliteEntity.isValid() || !enderCrystal.isValid()) { + cancel(); + return; + } + + if (counter % 5 == 0) { + Vector randomVector = new Vector( + ThreadLocalRandom.current().nextInt(-15, 15), + 0, + ThreadLocalRandom.current().nextInt(-15, 15)); + + EnderDragonEmpoweredLightning.lightningTask(enderCrystal.getLocation().clone().add(randomVector)); + } + + counter++; + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 20); + } + + public static class EnderCrystalLightningRodEvents implements Listener { + @EventHandler(ignoreCancelled = true) + public void damageEvent(EntityDamageEvent event) { + if (!event.getEntity().getType().equals(EntityType.END_CRYSTAL)) return; + if (!(event.getCause().equals(EntityDamageEvent.DamageCause.ENTITY_EXPLOSION) || + event.getCause().equals(EntityDamageEvent.DamageCause.FALLING_BLOCK) || + event.getCause().equals(EntityDamageEvent.DamageCause.LIGHTNING))) return; + if (!event.getEntity().getPersistentDataContainer().has(new NamespacedKey(MetadataHandler.PLUGIN, "eliteCrystal"), PersistentDataType.STRING)) + return; + event.setCancelled(true); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/powerstances/EffectEventHandlers.java b/src/main/java/com/magmaguy/elitemobs/powerstances/EffectEventHandlers.java index 35552855e..948950560 100644 --- a/src/main/java/com/magmaguy/elitemobs/powerstances/EffectEventHandlers.java +++ b/src/main/java/com/magmaguy/elitemobs/powerstances/EffectEventHandlers.java @@ -1,27 +1,12 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package com.magmaguy.elitemobs.powerstances; -import com.magmaguy.elitemobs.EntityTracker; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityPickupItemEvent; import org.bukkit.event.entity.EntityPortalEvent; -import org.bukkit.event.entity.ItemDespawnEvent; import org.bukkit.event.inventory.InventoryPickupItemEvent; -import org.bukkit.event.player.PlayerPickupItemEvent; /** * Created by MagmaGuy on 14/07/2017. @@ -29,29 +14,21 @@ public class EffectEventHandlers implements Listener { @EventHandler - public void playerPickupSafeguard(PlayerPickupItemEvent event) { - if (EntityTracker.isItemVisualEffect(event.getItem())) + public void playerPickupSafeguard(EntityPickupItemEvent event) { + if (EntityTracker.isVisualEffect(event.getItem())) event.setCancelled(true); } - @EventHandler + @EventHandler(priority = EventPriority.LOWEST) public void hopperPickupSafeguard(InventoryPickupItemEvent event) { - if (EntityTracker.isItemVisualEffect(event.getItem())) + if (EntityTracker.isVisualEffect(event.getItem())) event.setCancelled(true); } - //todo: this prevents elite mobs from going through portals, might want to change it at some point @EventHandler public void portalPickupSafeguard(EntityPortalEvent event) { - if (EntityTracker.isItemVisualEffect(event.getEntity()) || EntityTracker.isEliteMob(event.getEntity())) - event.setCancelled(true); - } - - @EventHandler - public void itemDespawnPrevention(ItemDespawnEvent event) { - if (EntityTracker.isItemVisualEffect(event.getEntity())) + if (EntityTracker.isVisualEffect(event.getEntity()) || EntityTracker.isEliteMob(event.getEntity())) event.setCancelled(true); - } } diff --git a/src/main/java/com/magmaguy/elitemobs/powerstances/GenericRotationMatrixMath.java b/src/main/java/com/magmaguy/elitemobs/powerstances/GenericRotationMatrixMath.java index 1db493ff5..07743c356 100644 --- a/src/main/java/com/magmaguy/elitemobs/powerstances/GenericRotationMatrixMath.java +++ b/src/main/java/com/magmaguy/elitemobs/powerstances/GenericRotationMatrixMath.java @@ -1,20 +1,6 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - package com.magmaguy.elitemobs.powerstances; +import org.bukkit.Location; import org.bukkit.util.Vector; import static java.lang.Math.*; @@ -60,10 +46,6 @@ previous point and applying the same rotation (using the counter). It doesn't ev it easier to predict where things are supposed to be. */ - //TODO: register points in hashmap > - private static Vector newVector; - private static double newX, newY, newZ; - public static Vector applyRotation(double a, double b, double c, double numberOfPointsPerFullRotation, double x, double y, double z, int counter) { double theta; @@ -73,15 +55,43 @@ public static Vector applyRotation(double a, double b, double c, double numberOf //Get the next rotation theta = theta + theta * counter; - newX = x * (cos(theta) + (1 - cos(theta)) * pow(a, 2)) + y * ((1 - cos(theta)) * a * b + (sin(theta)) * c) + z * ((1 - cos(theta)) * a * c - (sin(theta)) * b); - newY = x * ((1 - cos(theta)) * b * a - (sin(theta)) * c) + y * (cos(theta) + (1 - cos(theta)) * pow(b, 2)) + z * ((1 - cos(theta)) * b * c + (sin(theta)) * a); - newZ = x * ((1 - cos(theta)) * c * a + (sin(theta)) * b) + y * ((1 - cos(theta)) * c * b - (sin(theta)) * a) + z * (cos(theta) + (1 - cos(theta)) * pow(c, 2)); + double newX = x * (cos(theta) + (1 - cos(theta)) * pow(a, 2)) + y * ((1 - cos(theta)) * a * b + (sin(theta)) * c) + z * ((1 - cos(theta)) * a * c - (sin(theta)) * b); + double newY = x * ((1 - cos(theta)) * b * a - (sin(theta)) * c) + y * (cos(theta) + (1 - cos(theta)) * pow(b, 2)) + z * ((1 - cos(theta)) * b * c + (sin(theta)) * a); + double newZ = x * ((1 - cos(theta)) * c * a + (sin(theta)) * b) + y * ((1 - cos(theta)) * c * b - (sin(theta)) * a) + z * (cos(theta) + (1 - cos(theta)) * pow(c, 2)); //adjust rotated point - newVector = new Vector(newX, newY, newZ); + Vector newVector = new Vector(newX, newY, newZ); return newVector; } + private static Vector rotateSpecificLocation(double a, double b, double c, double theta, Vector relativeLocation) { + double x = relativeLocation.getX(); + double y = relativeLocation.getY(); + double z = relativeLocation.getZ(); + //Convert radian to degree + theta *= PI / 180; + + double newX = x * (cos(theta) + (1 - cos(theta)) * pow(a, 2)) + y * ((1 - cos(theta)) * a * b + (sin(theta)) * c) + z * ((1 - cos(theta)) * a * c - (sin(theta)) * b); + double newY = x * ((1 - cos(theta)) * b * a - (sin(theta)) * c) + y * (cos(theta) + (1 - cos(theta)) * pow(b, 2)) + z * ((1 - cos(theta)) * b * c + (sin(theta)) * a); + double newZ = x * ((1 - cos(theta)) * c * a + (sin(theta)) * b) + y * ((1 - cos(theta)) * c * b - (sin(theta)) * a) + z * (cos(theta) + (1 - cos(theta)) * pow(c, 2)); + + return new Vector(newX, newY, newZ); + } + + public static Location rotateLocationYAxis(double rotationAngleInDegrees, Location anchorPoint, Vector relativeLocation) { + //todo: fix this + if (rotationAngleInDegrees == 90) + rotationAngleInDegrees = -90; + else if (rotationAngleInDegrees == -90) + rotationAngleInDegrees = 90; + Vector rotatedVector = relativeLocation.clone().rotateAroundY(Math.toRadians(rotationAngleInDegrees)).add(anchorPoint.toVector()); + return new Location(anchorPoint.getWorld(), rotatedVector.getX(), rotatedVector.getY(), rotatedVector.getZ()); + } + + public static Vector rotateVectorYAxis(double rotationAngleInDegrees, Location anchorPoint, Vector relativeLocation) { + return rotateLocationYAxis(rotationAngleInDegrees, anchorPoint, relativeLocation).toVector(); + } + } diff --git a/src/main/java/com/magmaguy/elitemobs/powerstances/MajorPowerPowerStance.java b/src/main/java/com/magmaguy/elitemobs/powerstances/MajorPowerPowerStance.java index 518e764ab..64bf6a6ee 100644 --- a/src/main/java/com/magmaguy/elitemobs/powerstances/MajorPowerPowerStance.java +++ b/src/main/java/com/magmaguy/elitemobs/powerstances/MajorPowerPowerStance.java @@ -1,12 +1,10 @@ package com.magmaguy.elitemobs.powerstances; -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.config.ConfigValues; import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobpowers.ElitePower; -import com.magmaguy.elitemobs.mobpowers.majorpowers.*; -import com.magmaguy.elitemobs.utils.VersionChecker; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.ElitePower; +import com.magmaguy.elitemobs.powers.meta.MajorPower; import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.entity.Item; @@ -14,7 +12,7 @@ import org.bukkit.inventory.ItemStack; import java.util.ArrayList; -import java.util.Arrays; +import java.util.List; /** * Created by MagmaGuy on 11/05/2017. @@ -23,29 +21,28 @@ public class MajorPowerPowerStance implements Listener { public static int trackAmount = 2; public static int individualEffectsPerTrack = 2; - private EliteMobEntity eliteMobEntity; + private EliteEntity eliteEntity; - public MajorPowerPowerStance(EliteMobEntity eliteMobEntity) { + public MajorPowerPowerStance(EliteEntity eliteEntity) { - if (!ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.ENABLE_VISUAL_EFFECTS_FOR_NATURAL_MOBS)) + if (!MobCombatSettingsConfig.isEnableVisualEffectsForNaturalMobs()) return; - if (ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.DISABLE_VISUAL_EFFECTS_FOR_SPAWNER_MOBS) - && !eliteMobEntity.isNaturalEntity()) + if (MobCombatSettingsConfig.isDisableVisualEffectsForSpawnerMobs() && !eliteEntity.isNaturalEntity()) return; - this.eliteMobEntity = eliteMobEntity; + this.eliteEntity = eliteEntity; - if (eliteMobEntity.hasMajorVisualEffect()) return; - eliteMobEntity.setHasMajorVisualEffect(true); + if (eliteEntity.isMajorVisualEffect()) return; + eliteEntity.setMajorVisualEffect(true); - if (eliteMobEntity.getMajorPowerCount() < 1) + if (eliteEntity.getMajorPowerCount() < 1) return; /* Obfuscate powers to prevent TPS loss */ - if (ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.OBFUSCATE_MOB_POWERS)) - if (eliteMobEntity.getHasVisualEffectObfuscated()) { + if (MobCombatSettingsConfig.isObfuscateMobPowers()) + if (eliteEntity.isVisualEffectObfuscated()) { Object[][] multiDimensionalTrailTracker = new Object[trackAmount][individualEffectsPerTrack]; for (int i = 0; i < multiDimensionalTrailTracker.length; i++) { @@ -59,13 +56,13 @@ public MajorPowerPowerStance(EliteMobEntity eliteMobEntity) { } VisualItemProcessor visualItemProcessor = new VisualItemProcessor(multiDimensionalTrailTracker, - MajorPowerStanceMath.cachedVectors, eliteMobEntity.hasMajorVisualEffect(), - MajorPowerStanceMath.NUMBER_OF_POINTS_PER_FULL_ROTATION, eliteMobEntity); + MajorPowerStanceMath.cachedVectors, eliteEntity.isMajorVisualEffect(), + MajorPowerStanceMath.NUMBER_OF_POINTS_PER_FULL_ROTATION, eliteEntity); return; } - Object[][] multiDimensionalTrailTracker = new Object[trackAmount][eliteMobEntity.getMajorPowerCount() * individualEffectsPerTrack]; + Object[][] multiDimensionalTrailTracker = new Object[trackAmount][eliteEntity.getMajorPowerCount() * individualEffectsPerTrack]; for (int i = 0; i < multiDimensionalTrailTracker.length; i++) { ArrayList localObjects = new ArrayList<>(); @@ -77,65 +74,56 @@ public MajorPowerPowerStance(EliteMobEntity eliteMobEntity) { } VisualItemProcessor visualItemProcessor = new VisualItemProcessor(multiDimensionalTrailTracker, - MajorPowerStanceMath.cachedVectors, eliteMobEntity.hasMajorVisualEffect(), - MajorPowerStanceMath.NUMBER_OF_POINTS_PER_FULL_ROTATION, eliteMobEntity); + MajorPowerStanceMath.cachedVectors, eliteEntity.isMajorVisualEffect(), + MajorPowerStanceMath.NUMBER_OF_POINTS_PER_FULL_ROTATION, eliteEntity); } private ArrayList addObfuscatedEffects() { - return new ArrayList<>(Arrays.asList(Particle.END_ROD)); + return new ArrayList<>(List.of(Particle.END_ROD)); } private ArrayList addAllEffects() { ArrayList effects = new ArrayList<>(); - for (ElitePower elitePower : eliteMobEntity.getPowers()) { + for (ElitePower elitePower : eliteEntity.getElitePowers()) + if (elitePower instanceof MajorPower) + if (eliteEntity.getPower(elitePower).getTrail() != null) + effects.add(effectParser(eliteEntity.getPower(elitePower).getTrail())); - if (elitePower instanceof SkeletonPillar) - effects.add(addEffect(Material.BONE)); - - if (elitePower instanceof SkeletonTrackingArrow) - effects.add(addEffect(Material.TIPPED_ARROW)); - - if (elitePower instanceof ZombieBloat) - effects.add(addEffect(Material.RED_MUSHROOM)); - - if (elitePower instanceof ZombieFriends) - effects.add(addEffect(Material.SKULL_ITEM)); - - if (elitePower instanceof ZombieNecronomicon) - effects.add(addEffect(Material.WRITTEN_BOOK)); - - if (elitePower instanceof ZombieParents) - effects.add(addEffect(Material.MONSTER_EGG)); + return effects; - if (elitePower instanceof ZombieTeamRocket) - effects.add(addEffect(Material.FIREWORK)); + } + private Object effectParser(String powerString) { + try { + Material material = Material.valueOf(powerString); + return addEffect(material); + } catch (Exception ex) { } - - return effects; - + try { + Particle particle = Particle.valueOf(powerString); + return addEffect(particle); + } catch (Exception ex) { + } + return null; } private Object addEffect(Material material) { - Item item = eliteMobEntity.getLivingEntity().getWorld().dropItem(eliteMobEntity.getLivingEntity().getLocation(), + Item item = eliteEntity.getLivingEntity().getWorld().dropItem(eliteEntity.getLivingEntity().getLocation(), new ItemStack(material)); item.setPickupDelay(Integer.MAX_VALUE); - if (!VersionChecker.currentVersionIsUnder(1, 11)) - item.setGravity(false); + item.setGravity(false); item.setInvulnerable(true); - EntityTracker.registerItemVisualEffects(item); + EntityTracker.registerVisualEffects(item); return item; } private Object addEffect(Particle particle) { - return particle; - } } diff --git a/src/main/java/com/magmaguy/elitemobs/powerstances/MajorPowerStanceMath.java b/src/main/java/com/magmaguy/elitemobs/powerstances/MajorPowerStanceMath.java index d3cb6a6c0..3ea8a17c0 100644 --- a/src/main/java/com/magmaguy/elitemobs/powerstances/MajorPowerStanceMath.java +++ b/src/main/java/com/magmaguy/elitemobs/powerstances/MajorPowerStanceMath.java @@ -14,8 +14,8 @@ public class MajorPowerStanceMath { private final static double X = 0; private final static double Y = 1; private final static double Z = 0; - private static double a, b, c; public static Vector[][] cachedVectors = new Vector[MajorPowerPowerStance.trackAmount][NUMBER_OF_POINTS_PER_FULL_ROTATION]; + private static double a, b, c; public static void initializeVectorCache() { diff --git a/src/main/java/com/magmaguy/elitemobs/powerstances/MinorPowerPowerStance.java b/src/main/java/com/magmaguy/elitemobs/powerstances/MinorPowerPowerStance.java index 8db0d1546..d34c496cc 100644 --- a/src/main/java/com/magmaguy/elitemobs/powerstances/MinorPowerPowerStance.java +++ b/src/main/java/com/magmaguy/elitemobs/powerstances/MinorPowerPowerStance.java @@ -1,16 +1,10 @@ package com.magmaguy.elitemobs.powerstances; -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.config.ConfigValues; import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import com.magmaguy.elitemobs.mobpowers.ElitePower; -import com.magmaguy.elitemobs.mobpowers.defensivepowers.*; -import com.magmaguy.elitemobs.mobpowers.miscellaneouspowers.BonusLoot; -import com.magmaguy.elitemobs.mobpowers.miscellaneouspowers.MovementSpeed; -import com.magmaguy.elitemobs.mobpowers.miscellaneouspowers.Taunt; -import com.magmaguy.elitemobs.mobpowers.offensivepowers.*; -import com.magmaguy.elitemobs.utils.VersionChecker; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.powers.meta.ElitePower; +import com.magmaguy.elitemobs.powers.meta.MinorPower; import org.bukkit.Material; import org.bukkit.Particle; import org.bukkit.entity.Item; @@ -18,7 +12,7 @@ import org.bukkit.inventory.ItemStack; import java.util.ArrayList; -import java.util.Arrays; +import java.util.List; /** * Created by MagmaGuy on 04/11/2016. @@ -27,29 +21,28 @@ public class MinorPowerPowerStance implements Listener { public static int trackAmount = 2; public static int individualEffectsPerTrack = 2; - private EliteMobEntity eliteMobEntity; + private EliteEntity eliteEntity; //Secondary effect item processing - public MinorPowerPowerStance(EliteMobEntity eliteMobEntity) { + public MinorPowerPowerStance(EliteEntity eliteEntity) { - if (!ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.ENABLE_VISUAL_EFFECTS_FOR_NATURAL_MOBS)) + if (!MobCombatSettingsConfig.isEnableVisualEffectsForNaturalMobs()) return; - if (ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.DISABLE_VISUAL_EFFECTS_FOR_SPAWNER_MOBS) - && !eliteMobEntity.isNaturalEntity()) + if (MobCombatSettingsConfig.isDisableVisualEffectsForSpawnerMobs() && !eliteEntity.isNaturalEntity()) return; - this.eliteMobEntity = eliteMobEntity; - if (eliteMobEntity.hasMinorVisualEffect()) return; - eliteMobEntity.setHasMinorVisualEffect(true); + this.eliteEntity = eliteEntity; + if (eliteEntity.isMinorVisualEffect()) return; + eliteEntity.setMinorVisualEffect(true); - if (eliteMobEntity.getMinorPowerCount() < 1) + if (eliteEntity.getMinorPowerCount() < 1) return; /* Obfuscate powers to prevent TPS loss */ - if (ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.OBFUSCATE_MOB_POWERS)) - if (eliteMobEntity.getHasVisualEffectObfuscated()) { + if (MobCombatSettingsConfig.isObfuscateMobPowers()) + if (eliteEntity.isVisualEffectObfuscated()) { Object[][] multiDimensionalTrailTracker = new Object[trackAmount][individualEffectsPerTrack]; for (int i = 0; i < multiDimensionalTrailTracker.length; i++) { @@ -63,115 +56,68 @@ public MinorPowerPowerStance(EliteMobEntity eliteMobEntity) { } VisualItemProcessor visualItemProcessor = new VisualItemProcessor(multiDimensionalTrailTracker, - MinorPowerStanceMath.cachedVectors, eliteMobEntity.hasMinorVisualEffect(), - MinorPowerStanceMath.NUMBER_OF_POINTS_PER_FULL_ROTATION, eliteMobEntity); + MinorPowerStanceMath.cachedVectors, eliteEntity.isMinorVisualEffect(), + MinorPowerStanceMath.NUMBER_OF_POINTS_PER_FULL_ROTATION, eliteEntity); return; } - Object[][] multiDimensionalTrailTracker = new Object[trackAmount][eliteMobEntity.getMinorPowerCount() * individualEffectsPerTrack]; + Object[][] multiDimensionalTrailTracker = new Object[trackAmount][eliteEntity.getMinorPowerCount() * individualEffectsPerTrack]; for (int i = 0; i < multiDimensionalTrailTracker.length; i++) { ArrayList localObjects = new ArrayList<>(); for (int a = 0; a < multiDimensionalTrailTracker.length; a++) localObjects.addAll(addAllEffects()); - for (int j = 0; j < multiDimensionalTrailTracker[0].length; j++) + for (int j = 0; j < localObjects.size(); j++) if (localObjects.get(j) != null) multiDimensionalTrailTracker[i][j] = localObjects.get(j); } VisualItemProcessor visualItemProcessor = new VisualItemProcessor(multiDimensionalTrailTracker, - MinorPowerStanceMath.cachedVectors, eliteMobEntity.hasMinorVisualEffect(), - MinorPowerStanceMath.NUMBER_OF_POINTS_PER_FULL_ROTATION, eliteMobEntity); + MinorPowerStanceMath.cachedVectors, eliteEntity.isMinorVisualEffect(), + MinorPowerStanceMath.NUMBER_OF_POINTS_PER_FULL_ROTATION, eliteEntity); } private ArrayList addObfuscatedEffects() { - return new ArrayList<>(Arrays.asList(Particle.END_ROD)); + return new ArrayList<>(List.of(Particle.END_ROD)); } private ArrayList addAllEffects() { ArrayList effects = new ArrayList<>(); - for (ElitePower elitePower : eliteMobEntity.getPowers()) { + for (ElitePower elitePower : eliteEntity.getElitePowers()) + if (elitePower instanceof MinorPower) + if (eliteEntity.getPower(elitePower).getTrail() != null) + effects.add(effectParser(eliteEntity.getPower(elitePower).getTrail())); - if (elitePower instanceof AttackArrow) - effects.add(addEffect(Material.ARROW)); - - if (elitePower instanceof AttackBlinding) - effects.add(addEffect(Material.EYE_OF_ENDER)); - - if (elitePower instanceof AttackConfusing) - effects.add(addEffect(Particle.SPELL_MOB)); - - if (elitePower instanceof AttackFire) - effects.add(addEffect(Material.LAVA_BUCKET)); - - if (elitePower instanceof AttackFireball) - effects.add(addEffect(Material.FIREBALL)); - - if (elitePower instanceof AttackFreeze) - effects.add(addEffect(Material.PACKED_ICE)); - - if (elitePower instanceof AttackGravity) - effects.add(addEffect(Material.ELYTRA)); - - if (elitePower instanceof AttackPoison) - effects.add(addEffect(Material.EMERALD)); - - if (elitePower instanceof AttackPush) - effects.add(addEffect(Material.PISTON_BASE)); - - if (!VersionChecker.currentVersionIsUnder(11, 0)) - if (elitePower instanceof AttackWeakness) - effects.add(addEffect(Material.TOTEM)); - - if (elitePower instanceof AttackWeb) - effects.add(addEffect(Material.WEB)); - - if (elitePower instanceof AttackWither) - effects.add(addEffect(Material.SKULL_ITEM)); - - if (elitePower instanceof BonusLoot) - effects.add(addEffect(Material.CHEST)); - - if (elitePower instanceof MovementSpeed) - effects.add(addEffect(Material.GOLD_BOOTS)); - - if (elitePower instanceof Taunt) - effects.add(addEffect(Material.JUKEBOX)); - - if (elitePower instanceof Invisibility) - effects.add(addEffect(Material.THIN_GLASS)); - - if (elitePower instanceof InvulnerabilityArrow) - effects.add(addEffect(Material.SPECTRAL_ARROW)); - - if (elitePower instanceof InvulnerabilityFallDamage) - effects.add(addEffect(Material.FEATHER)); - - if (elitePower instanceof InvulnerabilityFire) - effects.add(addEffect(Particle.FLAME)); + return effects; - if (elitePower instanceof InvulnerabilityKnockback) - effects.add(addEffect(Material.ANVIL)); + } + private Object effectParser(String powerString) { + try { + Material material = Material.valueOf(powerString); + return addEffect(material); + } catch (Exception ex) { } - - return effects; - + try { + Particle particle = Particle.valueOf(powerString); + return addEffect(particle); + } catch (Exception ex) { + } + return null; } private Object addEffect(Material material) { - Item item = eliteMobEntity.getLivingEntity().getWorld().dropItem(eliteMobEntity.getLivingEntity().getLocation(), + Item item = eliteEntity.getLivingEntity().getWorld().dropItem(eliteEntity.getLivingEntity().getLocation(), new ItemStack(material)); item.setPickupDelay(Integer.MAX_VALUE); - if (!VersionChecker.currentVersionIsUnder(1, 11)) - item.setGravity(false); + item.setGravity(false); item.setInvulnerable(true); - EntityTracker.registerItemVisualEffects(item); + EntityTracker.registerVisualEffects(item); return item; } diff --git a/src/main/java/com/magmaguy/elitemobs/powerstances/MinorPowerStanceMath.java b/src/main/java/com/magmaguy/elitemobs/powerstances/MinorPowerStanceMath.java index f24926f4f..4cffd1134 100644 --- a/src/main/java/com/magmaguy/elitemobs/powerstances/MinorPowerStanceMath.java +++ b/src/main/java/com/magmaguy/elitemobs/powerstances/MinorPowerStanceMath.java @@ -10,10 +10,10 @@ public class MinorPowerStanceMath { public final static int NUMBER_OF_POINTS_PER_FULL_ROTATION = 30; private final static double X = 1; - private static double Y = 0; private final static double Z = 0; - private static double a, b, c; public static Vector[][] cachedVectors = new Vector[MinorPowerPowerStance.trackAmount][NUMBER_OF_POINTS_PER_FULL_ROTATION]; + private static double Y = 0; + private static double a, b, c; public static void initializeVectorCache() { diff --git a/src/main/java/com/magmaguy/elitemobs/powerstances/VisualEffectObfuscator.java b/src/main/java/com/magmaguy/elitemobs/powerstances/VisualEffectObfuscator.java index ab2cd40e9..f8b304642 100644 --- a/src/main/java/com/magmaguy/elitemobs/powerstances/VisualEffectObfuscator.java +++ b/src/main/java/com/magmaguy/elitemobs/powerstances/VisualEffectObfuscator.java @@ -1,7 +1,7 @@ package com.magmaguy.elitemobs.powerstances; -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; import com.magmaguy.elitemobs.utils.EntityFinder; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -14,19 +14,19 @@ public class VisualEffectObfuscator implements Listener { @EventHandler public void onTargetPlayer(EntityTargetLivingEntityEvent event) { if (!(event.getTarget() instanceof Player)) return; - EliteMobEntity eliteMobEntity = EntityTracker.getEliteMobEntity(event.getEntity()); - if (eliteMobEntity == null) return; + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(event.getEntity()); + if (eliteEntity == null) return; - eliteMobEntity.setHasVisualEffectObfuscated(false); + eliteEntity.setVisualEffectObfuscated(false); } - @EventHandler + @EventHandler(ignoreCancelled = true) public void onDamageByPlayer(EntityDamageByEntityEvent event) { if (!(EntityFinder.getRealDamager(event) instanceof Player)) return; - EliteMobEntity eliteMobEntity = EntityTracker.getEliteMobEntity(event.getEntity()); - if (eliteMobEntity == null) return; + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(event.getEntity()); + if (eliteEntity == null) return; - eliteMobEntity.setHasVisualEffectObfuscated(false); + eliteEntity.setVisualEffectObfuscated(false); } } diff --git a/src/main/java/com/magmaguy/elitemobs/powerstances/VisualItemInitializer.java b/src/main/java/com/magmaguy/elitemobs/powerstances/VisualItemInitializer.java index a92b36800..815ad6eeb 100644 --- a/src/main/java/com/magmaguy/elitemobs/powerstances/VisualItemInitializer.java +++ b/src/main/java/com/magmaguy/elitemobs/powerstances/VisualItemInitializer.java @@ -1,24 +1,24 @@ package com.magmaguy.elitemobs.powerstances; -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.utils.VersionChecker; +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; import org.bukkit.Location; import org.bukkit.entity.Item; import org.bukkit.inventory.ItemStack; +import org.bukkit.metadata.FixedMetadataValue; public class VisualItemInitializer { + private VisualItemInitializer() { + } - public static Item intializeItem(ItemStack itemStack, Location location) { - + public static Item initializeItem(ItemStack itemStack, Location location) { Item item = location.getWorld().dropItem(location, itemStack); item.setPickupDelay(Integer.MAX_VALUE); - EntityTracker.registerItemVisualEffects(item); - if (!VersionChecker.currentVersionIsUnder(1, 11)) - item.setGravity(false); + EntityTracker.registerVisualEffects(item); + item.setGravity(false); item.setInvulnerable(true); - + item.setMetadata(MetadataHandler.BETTERDROPS_COMPATIBILITY_MD, new FixedMetadataValue(MetadataHandler.PLUGIN, true)); return item; - } } diff --git a/src/main/java/com/magmaguy/elitemobs/powerstances/VisualItemProcessor.java b/src/main/java/com/magmaguy/elitemobs/powerstances/VisualItemProcessor.java index 7d2aa4d83..9db21188d 100644 --- a/src/main/java/com/magmaguy/elitemobs/powerstances/VisualItemProcessor.java +++ b/src/main/java/com/magmaguy/elitemobs/powerstances/VisualItemProcessor.java @@ -1,7 +1,7 @@ package com.magmaguy.elitemobs.powerstances; import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; import org.bukkit.Location; import org.bukkit.Particle; import org.bukkit.entity.Item; @@ -15,28 +15,39 @@ public class VisualItemProcessor { private boolean hasValidEffect; public VisualItemProcessor(Object[][] multiDimensionalTrailTracker, Vector[][] cachedVectorPositions, - boolean visualEffectBoolean, int pointsPerRotation, EliteMobEntity eliteMobEntity) { + boolean visualEffectBoolean, int pointsPerRotation, EliteEntity eliteEntity) { this.hasValidEffect = visualEffectBoolean; if (multiDimensionalTrailTracker.length < 1) return; - rotateExistingEffects(multiDimensionalTrailTracker, cachedVectorPositions, pointsPerRotation, eliteMobEntity); + rotateExistingEffects(multiDimensionalTrailTracker, cachedVectorPositions, pointsPerRotation, eliteEntity); } + /* + Adjusts the position in each item track based on the amount of powers currently in that track + */ + public static int adjustTrackPosition(double pointsPerRotation, int totalEffectQuantity, + int sectionCounter, int globalCounter) { + int location = (int) (pointsPerRotation / totalEffectQuantity * sectionCounter + globalCounter); + if (location >= 30) + location -= 30; + return location; + } + private void rotateExistingEffects(Object[][] multiDimensionalTrailTracker, Vector[][] cachedVectorPositions, - int pointsPerRotation, EliteMobEntity eliteMobEntity) { + int pointsPerRotation, EliteEntity eliteEntity) { new BukkitRunnable() { + final boolean isObfuscated = eliteEntity.isVisualEffectObfuscated(); int counter = 0; - boolean isObfuscated = eliteMobEntity.getHasVisualEffectObfuscated(); @Override public void run() { - if (!eliteMobEntity.getLivingEntity().isValid() || !hasValidEffect) { + if (!eliteEntity.isValid() || !hasValidEffect) { VisualItemRemover.removeItems(multiDimensionalTrailTracker); cancel(); return; @@ -55,10 +66,10 @@ public void run() { Vector vector = cachedVectorPositions[i][adjustedEffectPositionInRotation]; if (multiDimensionalTrailTracker[i][j] instanceof Item) - rotateItem(multiDimensionalTrailTracker[i][j], vector, eliteMobEntity); + rotateItem(multiDimensionalTrailTracker[i][j], vector, eliteEntity); if (multiDimensionalTrailTracker[i][j] instanceof Particle) - rotateParticle(multiDimensionalTrailTracker[i][j], vector, eliteMobEntity); + rotateParticle(multiDimensionalTrailTracker[i][j], vector, eliteEntity); sectionCounter++; if (sectionCounter >= pointsPerRotation) @@ -76,20 +87,20 @@ public void run() { /* Check if the effect has ceased being obfuscated */ - if (isObfuscated != eliteMobEntity.getHasVisualEffectObfuscated()){ + if (isObfuscated != eliteEntity.isVisualEffectObfuscated()) { VisualItemRemover.removeItems(multiDimensionalTrailTracker); cancel(); new BukkitRunnable() { @Override public void run() { - eliteMobEntity.setHasVisualEffectObfuscated(false); + eliteEntity.setVisualEffectObfuscated(false); if (Arrays.deepEquals(cachedVectorPositions, MinorPowerStanceMath.cachedVectors)) { - eliteMobEntity.setHasMinorVisualEffect(false); - new MinorPowerPowerStance(eliteMobEntity); + eliteEntity.setMinorVisualEffect(false); + new MinorPowerPowerStance(eliteEntity); } if (Arrays.deepEquals(cachedVectorPositions, MajorPowerStanceMath.cachedVectors)) { - eliteMobEntity.setHasMajorVisualEffect(false); - new MajorPowerPowerStance(eliteMobEntity); + eliteEntity.setMajorVisualEffect(false); + new MajorPowerPowerStance(eliteEntity); } } }.runTask(MetadataHandler.PLUGIN); @@ -102,49 +113,45 @@ public void run() { } - /* - Adjusts the position in each item track based on the amount of powers currently in that track - */ - public static int adjustTrackPosition(double pointsPerRotation, int totalEffectQuantity, - int sectionCounter, int globalCounter) { - int location = (int) (pointsPerRotation / totalEffectQuantity * sectionCounter + globalCounter); - if (location >= 30) - location -= 30; - return location; - } - - private void rotateItem(Object itemObject, Vector vector, EliteMobEntity eliteMobEntity) { + private void rotateItem(Object itemObject, Vector vector, EliteEntity eliteEntity) { Item item = (Item) itemObject; - if (!item.isValid()) - return; +// if (!item.isValid()) +// return; Location currentLocation = item.getLocation().clone(); - Location newLocation = eliteMobEntity.getLivingEntity().getLocation().clone().add(new Vector(0, 1, 0)).add(vector); + Location newLocation = eliteEntity.getLivingEntity().getLocation().clone().add(new Vector(0, 1, 0)).add(vector); + +// if (currentLocation.distanceSquared(newLocation) > Math.pow(3, 2)) { +// item.teleport(newLocation); +// item.setVelocity(new Vector(0.01, 0.01, 0.01)); +// return; +// } - if (currentLocation.distanceSquared(newLocation) > Math.pow(3, 2)) { - item.teleport(newLocation); - item.setVelocity(new Vector(0.01, 0.01, 0.01)); + //this sometimes happens due to other plugins which is really annoying + if (newLocation.getWorld() != currentLocation.getWorld()) { + hasValidEffect = false; return; } Vector movementVector = (newLocation.subtract(currentLocation)).toVector(); movementVector = movementVector.multiply(0.3); - if (Math.abs(movementVector.getX()) > 3 || Math.abs(movementVector.getY()) > 3 || Math.abs(movementVector.getZ()) > 3) { - item.teleport(newLocation); - } else { - item.setVelocity(movementVector); - } +// if (Math.abs(movementVector.getX()) > 3 || Math.abs(movementVector.getY()) > 3 || Math.abs(movementVector.getZ()) > 3) { +// item.teleport(newLocation); +// } else { + item.setVelocity(movementVector); +// } } - private void rotateParticle(Object particleObject, Vector vector, EliteMobEntity eliteMobEntity) { + private void rotateParticle(Object particleObject, Vector vector, EliteEntity eliteEntity) { Particle particle = (Particle) particleObject; - eliteMobEntity.getLivingEntity().getWorld().spawnParticle( - particle, eliteMobEntity.getLivingEntity().getLocation().add(0, 1, 0).add(vector), - 5, 0, 0, 0, 0.01); + if (eliteEntity.isValid()) + eliteEntity.getLivingEntity().getWorld().spawnParticle( + particle, eliteEntity.getLivingEntity().getLocation().add(0, 1, 0).add(vector), + 1, 0, 0, 0, 0.01); } } diff --git a/src/main/java/com/magmaguy/elitemobs/powerstances/VisualItemRemover.java b/src/main/java/com/magmaguy/elitemobs/powerstances/VisualItemRemover.java index 1450cfc74..2a5a8a32c 100644 --- a/src/main/java/com/magmaguy/elitemobs/powerstances/VisualItemRemover.java +++ b/src/main/java/com/magmaguy/elitemobs/powerstances/VisualItemRemover.java @@ -1,22 +1,28 @@ package com.magmaguy.elitemobs.powerstances; -import com.magmaguy.elitemobs.EntityTracker; +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.internal.RemovalReason; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; import org.bukkit.entity.Item; +import org.bukkit.scheduler.BukkitRunnable; public class VisualItemRemover { - public static void removeItems(Object[][] multiDimensionalTrailTracker) { - - for (int i = 0; i < multiDimensionalTrailTracker.length; i++) - for (int j = 0; j < multiDimensionalTrailTracker[i].length; j++) { - - if (!(multiDimensionalTrailTracker[i][j] instanceof Item)) continue; - Item item = (Item) multiDimensionalTrailTracker[i][j]; - item.remove(); - EntityTracker.unregisterItemEntity(item); + private VisualItemRemover() { + } + public static void removeItems(Object[][] multiDimensionalTrailTracker) { + for (Object[] objects : multiDimensionalTrailTracker) + for (Object object : objects) { + if (!(object instanceof Item item)) continue; + new BukkitRunnable() { + @Override + public void run() { + item.remove(); + EntityTracker.unregister(item, RemovalReason.EFFECT_TIMEOUT); + } + }.runTask(MetadataHandler.PLUGIN); } - } } diff --git a/src/main/java/com/magmaguy/elitemobs/quests/CustomQuest.java b/src/main/java/com/magmaguy/elitemobs/quests/CustomQuest.java new file mode 100644 index 000000000..9550652fd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/quests/CustomQuest.java @@ -0,0 +1,137 @@ +package com.magmaguy.elitemobs.quests; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.QuestAcceptEvent; +import com.magmaguy.elitemobs.api.QuestRewardEvent; +import com.magmaguy.elitemobs.config.customquests.CustomQuestsConfig; +import com.magmaguy.elitemobs.config.customquests.CustomQuestsConfigFields; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.quests.objectives.QuestObjectives; +import com.magmaguy.elitemobs.quests.playercooldowns.PlayerQuestCooldowns; +import com.magmaguy.elitemobs.quests.rewards.QuestReward; +import com.magmaguy.elitemobs.utils.EventCaller; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.permissions.PermissionAttachment; + +import java.util.UUID; + +public class CustomQuest extends Quest { + + @Getter + private final String configurationFilename; + private transient CustomQuestsConfigFields customQuestsConfigFields; + + public CustomQuest(Player player, CustomQuestsConfigFields customQuestsConfigFields) { + super(player, new QuestObjectives(new QuestReward(customQuestsConfigFields, player)), customQuestsConfigFields.getQuestLevel()); + this.customQuestsConfigFields = customQuestsConfigFields; + this.configurationFilename = customQuestsConfigFields.getFilename(); + super.questObjectives.setQuest(this); + super.questName = customQuestsConfigFields.getQuestName(); + super.questTaker = customQuestsConfigFields.getTurnInNPC(); + } + + public static CustomQuest getQuest(String questFilename, Player player) { + if (CustomQuestsConfig.getCustomQuests().get(questFilename) == null) return null; + Quest quest = null; + for (Quest iteratedQuest : PlayerData.getQuests(player.getUniqueId())) + if (iteratedQuest instanceof CustomQuest && ((CustomQuest) iteratedQuest).getConfigurationFilename().equals(questFilename)) { + quest = iteratedQuest; + break; + } + if (quest != null) + return (CustomQuest) quest; + else + return new CustomQuest(player, CustomQuestsConfig.getCustomQuests().get(questFilename)); + } + + public static Quest startQuest(String questID, Player player) { + Quest quest = null; + for (Quest iteratedQuest : pendingPlayerQuests.get(player.getUniqueId())) + if (iteratedQuest.getQuestID().equals(UUID.fromString(questID))) { + quest = iteratedQuest; + break; + } + if (quest == null) { + player.sendMessage(ChatColorConverter.convert("&8[EliteMobs] &cInvalid quest ID for ID " + questID)); + return null; + } + QuestAcceptEvent questAcceptEvent = new QuestAcceptEvent(player, quest); + new EventCaller(questAcceptEvent); + if (questAcceptEvent.isCancelled()) return null; + return quest; + } + + public CustomQuestsConfigFields getCustomQuestsConfigFields() { + if (customQuestsConfigFields == null) + this.customQuestsConfigFields = CustomQuestsConfig.getCustomQuests().get(configurationFilename); + if (customQuestsConfigFields == null) { + Logger.warn("Detected that Custom Quest " + configurationFilename + " got removed even though player " + + Bukkit.getPlayer(getPlayerUUID()).getName() + " is still trying to complete it. This player's quest will now be wiped."); + PlayerData.removeQuest(getPlayerUUID(), this); + return null; + } + return customQuestsConfigFields; + } + + public void applyTemporaryPermissions(Player player) { + if (!getCustomQuestsConfigFields().getTemporaryPermissions().isEmpty()) { + PermissionAttachment permissionAttachment = player.addAttachment(MetadataHandler.PLUGIN); + for (String permission : getCustomQuestsConfigFields().getTemporaryPermissions()) + permissionAttachment.setPermission(permission, true); + } + } + + public void applyEndPermissions(Player player) { + if (!getCustomQuestsConfigFields().getTemporaryPermissions().isEmpty()) { + PermissionAttachment permissionAttachment = player.addAttachment(MetadataHandler.PLUGIN); + for (String permission : getCustomQuestsConfigFields().getTemporaryPermissions()) + permissionAttachment.unsetPermission(permission); + } + if (!getCustomQuestsConfigFields().getQuestLockoutPermission().isEmpty()) { + PlayerQuestCooldowns.addCooldown(player, + getCustomQuestsConfigFields().getQuestLockoutPermission(), + getCustomQuestsConfigFields().getQuestLockoutMinutes()); + } + } + + public boolean hasPermissionForQuest(Player player) { + if (PlayerQuestCooldowns.bypassesQuestRestrictions(player)) return true; + if (customQuestsConfigFields.getQuestAcceptPermissions() != null && ! + customQuestsConfigFields.getQuestAcceptPermissions().isEmpty()) + for (String permission : customQuestsConfigFields.getQuestAcceptPermissions()) + if (!player.hasMetadata(permission)) + return false; + if (!customQuestsConfigFields.getQuestAcceptPermission().isEmpty() && + !player.hasMetadata(customQuestsConfigFields.getQuestAcceptPermission())) + return false; + return customQuestsConfigFields.getQuestLockoutPermission().isEmpty() || + !player.hasMetadata(customQuestsConfigFields.getQuestLockoutPermission()); + } + + public static class CustomQuestEvents implements Listener { + @EventHandler + public void onQuestReward(QuestRewardEvent event) { + if (event.getQuest() instanceof CustomQuest customQuest) { + CustomQuestsConfigFields customQuestsConfigFields = customQuest.getCustomQuestsConfigFields(); + customQuest.applyEndPermissions(event.getPlayer()); + if (customQuest.getCustomQuestsConfigFields().getQuestCompleteDialog() != null && + !customQuest.getCustomQuestsConfigFields().getQuestCompleteDialog().isEmpty()) + for (String dialog : customQuest.getCustomQuestsConfigFields().getQuestCompleteDialog()) + event.getPlayer().sendMessage(dialog); + for (String command : customQuestsConfigFields.getQuestCompleteCommands()) + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), + command.replace("$player", event.getPlayer().getName()) + .replace("$getX", event.getPlayer().getLocation().getX() + "") + .replace("$getY", event.getPlayer().getLocation().getY() + "") + .replace("$getZ", event.getPlayer().getLocation().getZ() + "")); + } + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/quests/DynamicQuest.java b/src/main/java/com/magmaguy/elitemobs/quests/DynamicQuest.java new file mode 100644 index 000000000..825625903 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/quests/DynamicQuest.java @@ -0,0 +1,96 @@ +package com.magmaguy.elitemobs.quests; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.adventurersguild.GuildRank; +import com.magmaguy.elitemobs.config.QuestsConfig; +import com.magmaguy.elitemobs.config.menus.premade.DynamicQuestMenuConfig; +import com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs.EliteMobProperties; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.quests.objectives.DynamicKillObjective; +import com.magmaguy.elitemobs.quests.objectives.QuestObjectives; +import com.magmaguy.elitemobs.quests.rewards.QuestReward; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class DynamicQuest extends Quest { + + //These are generated fresh every hour + private static final HashMap> threeRandomDynamicObjectives = new HashMap<>(); + private static BukkitTask randomizerTask; + + public DynamicQuest(Player player, int questLevel, QuestObjectives questObjectives) { + super(player, questObjectives, questLevel); + super.questName = DynamicQuestMenuConfig.getQuestName() + .replace("$amount", questObjectives.getObjectives().get(0).getTargetAmount() + "") + .replace("$name", ChatColor.stripColor(EliteMobProperties.getPluginData(((DynamicKillObjective) questObjectives.getObjectives().get(0)).getEntityType()).getName(questLevel * 10))); + questObjectives.setQuest(this); + } + + public static void startRandomizingQuests() { + randomizerTask = new BukkitRunnable() { + @Override + public void run() { + for (int activeLevel = 1; activeLevel < 21; activeLevel++) { + List questObjectives = new ArrayList<>(); + for (int questNumber = 0; questNumber < 3; questNumber++) { + questObjectives.add(new QuestObjectives(activeLevel)); + } + threeRandomDynamicObjectives.put(activeLevel, questObjectives); + } + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 20 * 60L); + } + + public static void shutdown() { + threeRandomDynamicObjectives.clear(); + if (randomizerTask != null) + randomizerTask.cancel(); + } + + public static List generateQuests(Player player) { + int questLevel = GuildRank.getActiveGuildRank(player); + if (questLevel == 0) { + player.sendMessage(QuestsConfig.getLowRankDynamicQuestWarning()); + return new ArrayList<>(); + } + List dynamicQuests = new ArrayList<>(); + + for (QuestObjectives questObjectives : threeRandomDynamicObjectives.get(questLevel)) { + QuestReward questReward = new QuestReward(questLevel, questObjectives, player); + questObjectives.setQuestReward(questReward); + dynamicQuests.add(new DynamicQuest(player, questLevel, questObjectives)); + } + + return dynamicQuests; + } + + public static List getQuests(Player player) { + List dynamicQuests = new ArrayList<>(); + + if (PlayerData.getQuests(player.getUniqueId()) != null) + for (Quest quest : PlayerData.getQuests(player.getUniqueId())) { + if (quest instanceof DynamicQuest dynamicQuest) + dynamicQuests.add(dynamicQuest); + } + + for (DynamicQuest generatedQuest : generateQuests(player)) { + boolean exists = false; + for (DynamicQuest dynamicQuest : dynamicQuests) { + if (dynamicQuest.getQuestObjectives().getUuid().equals(generatedQuest.getQuestObjectives().getUuid())) { + exists = true; + break; + } + } + if (!exists) dynamicQuests.add(generatedQuest); + } + + return dynamicQuests; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/quests/DynamicQuestInteractionHandler.java b/src/main/java/com/magmaguy/elitemobs/quests/DynamicQuestInteractionHandler.java new file mode 100644 index 000000000..4143724fb --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/quests/DynamicQuestInteractionHandler.java @@ -0,0 +1,8 @@ +package com.magmaguy.elitemobs.quests; + +public class DynamicQuestInteractionHandler { + private DynamicQuestInteractionHandler() { + } + + +} diff --git a/src/main/java/com/magmaguy/elitemobs/quests/Quest.java b/src/main/java/com/magmaguy/elitemobs/quests/Quest.java new file mode 100644 index 000000000..548c12457 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/quests/Quest.java @@ -0,0 +1,88 @@ +package com.magmaguy.elitemobs.quests; + +import com.magmaguy.elitemobs.api.QuestCompleteEvent; +import com.magmaguy.elitemobs.api.QuestLeaveEvent; +import com.magmaguy.elitemobs.config.QuestsConfig; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.quests.objectives.QuestObjectives; +import com.magmaguy.elitemobs.utils.EventCaller; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.entity.Player; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.UUID; + +public class Quest implements Serializable { + + @Getter + //Player UUID as key + //protected static final HashMap playerQuests = new HashMap<>(); + //Temporarily stores a list of quests a player might be considering joining + protected static final HashMap> pendingPlayerQuests = new HashMap<>(); + @Getter + protected final QuestObjectives questObjectives; + @Getter + private final UUID questID = UUID.randomUUID(); + @Getter + protected String questName; + @Getter + @Setter + //NPC the quest originates from + protected String questGiver = ""; + @Setter + //NPC the quest is turned in to + protected String questTaker = ""; + @Getter + @Setter + private UUID playerUUID; + @Getter + @Setter + private int questLevel; + @Getter + @Setter + private boolean accepted = false; + + public Quest(Player player, QuestObjectives questObjectives, int questLevel) { + this.playerUUID = player.getUniqueId(); + this.questObjectives = questObjectives; + this.questLevel = questLevel; + if (pendingPlayerQuests.get(playerUUID) == null) { + List quests = new ArrayList<>(); + quests.add(this); + pendingPlayerQuests.put(playerUUID, quests); + } else { + List quests = pendingPlayerQuests.get(playerUUID); + quests.add(this); + pendingPlayerQuests.put(playerUUID, quests); + } + } + + public static void stopPlayerQuest(Player player, String questID) { + if (PlayerData.getQuests(player.getUniqueId()) == null || + PlayerData.getQuest(player.getUniqueId(), questID) == null) { + player.sendMessage(QuestsConfig.getLeaveWhenNoActiveQuestsExist()); + return; + } + QuestLeaveEvent questLeaveEvent = new QuestLeaveEvent(player, PlayerData.getQuest(player.getUniqueId(), questID)); + new EventCaller(questLeaveEvent); + } + + public static Quest completeQuest(UUID questUUID, Player player) { + Quest quest = PlayerData.getQuest(player.getUniqueId(), questUUID); + if (quest == null) return null; + if (!quest.getQuestID().equals(questUUID)) return null; + if (!quest.getQuestObjectives().isOver()) return null; + QuestCompleteEvent questCompleteEvent = new QuestCompleteEvent(player, quest); + new EventCaller(questCompleteEvent); + return quest; + } + + public String getQuestTaker() { + return questTaker.isEmpty() ? questGiver : questTaker; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/quests/QuestInteractionHandler.java b/src/main/java/com/magmaguy/elitemobs/quests/QuestInteractionHandler.java new file mode 100644 index 000000000..232232854 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/quests/QuestInteractionHandler.java @@ -0,0 +1,93 @@ +package com.magmaguy.elitemobs.quests; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.QuestsConfig; +import com.magmaguy.elitemobs.npcs.NPCEntity; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.quests.menus.QuestMenu; +import com.magmaguy.elitemobs.quests.objectives.CustomFetchObjective; +import com.magmaguy.elitemobs.quests.objectives.Objective; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.ArrayList; +import java.util.List; + +public class QuestInteractionHandler { + private QuestInteractionHandler() { + } + + public static void processDynamicQuests(Player player, NPCEntity npcEntity) { + List dynamicQuests = new ArrayList<>(); + DynamicQuest.getQuests(player).forEach(quest -> { + if (!quest.getQuestObjectives().isTurnedIn()) dynamicQuests.add(quest); + }); + + if (!dynamicQuests.isEmpty()) + QuestMenu.generateDynamicQuestMenu(dynamicQuests, player, npcEntity); + } + + public static void processNPCQuests(Player player, NPCEntity npcEntity) { + List customQuestList = new ArrayList<>(); + + List quests = PlayerData.getQuests(player.getUniqueId()); + scanQuestTakerNPC(npcEntity, quests, customQuestList, player); + + boolean anyQuestIsValid = false; + int questCompleteCount = 0; + //This value can be null for NPC entities that have the custom quest interaction but are only used to turn quests in + if (npcEntity.getNPCsConfigFields().getQuestFilenames() != null) + for (String questString : npcEntity.getNPCsConfigFields().getQuestFilenames()) { + boolean activeQuest = false; + for (CustomQuest customQuest : customQuestList) + if (customQuest.getCustomQuestsConfigFields().getFilename().equals(questString)) { + activeQuest = true; + continue; + } + if (activeQuest) continue; + + CustomQuest customQuest = CustomQuest.getQuest(questString, player); + if (customQuest == null) { + player.sendMessage("[EliteMobs] This NPC's quest is not valid! This might be a configuration error on the NPC or on the quest."); + if (player.hasPermission("elitemobs.*")) + player.sendMessage("Invalid quest: " + questString); + continue; + } + + if (customQuest.hasPermissionForQuest(player)) { + customQuestList.add(customQuest); + customQuest.setQuestGiver(npcEntity.getNPCsConfigFields().getFilename()); + anyQuestIsValid = true; + } else if (!customQuest.getCustomQuestsConfigFields().getQuestLockoutPermission().isEmpty() && + player.hasMetadata(customQuest.getCustomQuestsConfigFields().getQuestLockoutPermission())) + questCompleteCount++; + } + + if (npcEntity.getNPCsConfigFields().getQuestFilenames() != null && + questCompleteCount == npcEntity.getNPCsConfigFields().getQuestFilenames().size()) + player.sendMessage(QuestsConfig.getQuestAlreadyCompletedMessage()); + else if (!anyQuestIsValid && npcEntity.getNPCsConfigFields().getQuestFilenames() != null) + player.sendMessage(QuestsConfig.getQuestPrerequisitesMissingMessage()); + + if (!customQuestList.isEmpty()) + new BukkitRunnable() { + @Override + public void run() { + QuestMenu.generateCustomQuestMenu(customQuestList, player, npcEntity); + } + }.runTaskLater(MetadataHandler.PLUGIN, 1); + } + + private static void scanQuestTakerNPC(NPCEntity npcEntity, List activeQuests, List npcQuests, Player player) { + for (Quest quest : activeQuests) { + if (quest instanceof CustomQuest && + quest.getQuestTaker().equals(npcEntity.getNPCsConfigFields().getFilename())) { + npcQuests.add((CustomQuest) quest); + for (Objective objective : quest.getQuestObjectives().getObjectives()) + if (objective instanceof CustomFetchObjective) + objective.progressNonlinearObjective(quest.getQuestObjectives(), player); + } + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/quests/QuestTracking.java b/src/main/java/com/magmaguy/elitemobs/quests/QuestTracking.java new file mode 100644 index 000000000..2b350027d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/quests/QuestTracking.java @@ -0,0 +1,397 @@ +package com.magmaguy.elitemobs.quests; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.QuestAcceptEvent; +import com.magmaguy.elitemobs.api.QuestCompleteEvent; +import com.magmaguy.elitemobs.api.QuestProgressionEvent; +import com.magmaguy.elitemobs.config.QuestsConfig; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.items.customloottable.CustomLootEntry; +import com.magmaguy.elitemobs.items.customloottable.EliteCustomLootEntry; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.quests.objectives.*; +import com.magmaguy.elitemobs.treasurechest.TreasureChest; +import com.magmaguy.elitemobs.wormhole.Wormhole; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.SpigotMessage; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.boss.BarColor; +import org.bukkit.boss.BarFlag; +import org.bukkit.boss.BarStyle; +import org.bukkit.boss.BossBar; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class QuestTracking { + + @Getter + private static final HashMap playerTrackingQuests = new HashMap<>(); + private final Player player; + @Getter + private final CustomQuest customQuest; + private final List turnInNPCs = new ArrayList<>(); + private List objectiveDestinations = new ArrayList<>(); + private BukkitTask locationRefresher; + private BukkitTask compassTask; + private BossBar compassBar; + private boolean questIsDone = false; + + public QuestTracking(Player player, CustomQuest customQuest) { + this.player = player; + this.customQuest = customQuest; + startLocationGetter(); + startCompass(); + playerTrackingQuests.put(player, this); + customQuest.getQuestObjectives().displayLazyObjectivesScoreboard(player); + } + + public static boolean isTracking(Player player) { + return playerTrackingQuests.containsKey(player); + } + + public static void clear() { + ((HashMap) playerTrackingQuests.clone()).values().forEach(QuestTracking::stop); + } + + public static void toggleTracking(Player player, String questID) { + CustomQuest customQuest = (CustomQuest) PlayerData.getQuest(player.getUniqueId(), questID); + if (customQuest == null) { + player.sendMessage("[EliteMobs] Failed to get a valid quest with that quest ID!"); + return; + } + toggleTracking(player, customQuest); + } + + public static void toggleTracking(Player player, CustomQuest quest) { + if (playerTrackingQuests.containsKey(player)) { + playerTrackingQuests.get(player).stop(); + } else { + if (quest == null) { + player.sendMessage("[EliteMobs] Failed to get a valid quest with that quest ID!"); + return; + } + if (!quest.getCustomQuestsConfigFields().isTrackable()) return; + new QuestTracking(player, quest); + } + } + + public void refreshScoreboard() { + customQuest.getQuestObjectives().displayLazyObjectivesScoreboard(player); + } + + private void startLocationGetter() { + locationRefresher = new BukkitRunnable() { + @Override + public void run() { + if (!player.isValid()) { + stop(); + return; + } + updateLocations(customQuest); + } + }.runTaskTimerAsynchronously(MetadataHandler.PLUGIN, 0L, 20L * 60L); + } + + public void updateLocations(Quest quest) { + List destinations = new ArrayList<>(); + if (!quest.getQuestObjectives().isOver()) { + questIsDone = false; + for (Objective objective : quest.getQuestObjectives().getObjectives()) + if (!objective.isObjectiveCompleted()) + if (objective instanceof CustomKillObjective) + destinations.addAll(getKillLocations((CustomKillObjective) objective)); + else if (objective instanceof DialogObjective) + destinations.addAll(getDialogLocations((DialogObjective) objective)); + else if (objective instanceof CustomFetchObjective) + destinations.addAll(getFetchLocations((CustomFetchObjective) objective)); + Bukkit.getScheduler().runTask(MetadataHandler.PLUGIN, () -> objectiveDestinations = destinations); + } else { + questIsDone = true; + getTurnInNPC(); + } + } + + private List getKillLocations(CustomKillObjective customKillObjective) { + List destinations = new ArrayList<>(); + List locations = new ArrayList<>(); + new ArrayList(EntityTracker.getEliteMobEntities().values()).forEach(eliteEntity -> { + if (eliteEntity instanceof CustomBossEntity) + if (((CustomBossEntity) eliteEntity).getPhaseBossEntity() != null && + ((CustomBossEntity) eliteEntity).getPhaseBossEntity().getPhase1Config().getFilename().equals(customKillObjective.getCustomBossFilename())) { + locations.add(eliteEntity.getLocation()); + } else if (((CustomBossEntity) eliteEntity).getCustomBossesConfigFields().getFilename() + .equals(customKillObjective.getCustomBossFilename())) { + locations.add(eliteEntity.getLocation()); + } + }); + destinations.add(new ObjectiveDestinations(customKillObjective, locations)); + return destinations; + } + + private List getDialogLocations(DialogObjective dialogObjective) { + List destinations = new ArrayList<>(); + EntityTracker.getNpcEntities().values().forEach(npcEntity -> { + List locations = new ArrayList<>(); + if (npcEntity.getNPCsConfigFields().getFilename().equals(dialogObjective.getNpcFilename())) + locations.add(npcEntity.getSpawnLocation()); + destinations.add(new ObjectiveDestinations(dialogObjective, locations)); + }); + return destinations; + } + + private List getFetchLocations(CustomFetchObjective customFetchObjective) { + List destinations = new ArrayList<>(); + List locations = new ArrayList<>(); + new ArrayList<>(EntityTracker.getEliteMobEntities().values()).forEach(eliteEntity -> { + if (eliteEntity instanceof CustomBossEntity customBossEntity) + for (CustomLootEntry customLootEntry : customBossEntity.getCustomBossesConfigFields().getCustomLootTable().getEntries()) + if (customLootEntry instanceof EliteCustomLootEntry eliteCustomLootEntry && eliteCustomLootEntry.getFilename().equals(customFetchObjective.getKey())) + locations.add(eliteEntity.getLocation()); + }); + new ArrayList<>(TreasureChest.getTreasureChestHashMap().values()).forEach((treasureChest -> { + for (CustomLootEntry customLootEntry : treasureChest.getCustomTreasureChestConfigFields().getCustomLootTable().getEntries()) + if (customLootEntry instanceof EliteCustomLootEntry eliteCustomLootEntry && eliteCustomLootEntry.getFilename().equals(customFetchObjective.getKey())) + locations.add(treasureChest.getLocation()); + })); + destinations.add(new ObjectiveDestinations(customFetchObjective, locations)); + return destinations; + } + + private void getTurnInNPC() { + EntityTracker.getNpcEntities().values().forEach(npcEntity -> { + if (npcEntity.getNPCsConfigFields().getFilename().equals(customQuest.getQuestTaker())) + turnInNPCs.add(npcEntity.getSpawnLocation()); + }); + } + + public void stop() { + playerTrackingQuests.remove(player); + new BukkitRunnable() { + @Override + public void run() { + player.setScoreboard(Bukkit.getScoreboardManager().getNewScoreboard()); + } + }.runTask(MetadataHandler.PLUGIN); + locationRefresher.cancel(); + compassTask.cancel(); + compassBar.removeAll(); + } + + private void startCompass() { + compassBar = Bukkit.createBossBar("", BarColor.GREEN, BarStyle.SOLID, BarFlag.PLAY_BOSS_MUSIC); + compassTask = new BukkitRunnable() { + @Override + public void run() { + if (!player.isOnline()) { + stop(); + return; + } + updateCompassContents(); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0L, 1L); + } + + private void updateCompassContents() { + //for reference, character 32 is straight ahead + String compassText = "---------------------------------------------------------------"; + List locationAndSymbols = projectLocations(); + if (!locationAndSymbols.isEmpty()) + for (LocationAndSymbol pair : locationAndSymbols) + compassText = compassText.substring(0, pair.getKey()) + pair.getValue() + compassText.substring(pair.getKey() + 1); + else { + World world = null; + boolean locationsOutOfBounds = false; + List tempDestinations = new ArrayList<>(objectiveDestinations); + for (ObjectiveDestinations destinations : tempDestinations) + for (Location location : destinations.getDestinations()) + if (location != null && location.getWorld() != null) { + world = location.getWorld(); + if (world.equals(player.getWorld())) { + locationsOutOfBounds = true; + break; + } + } + + if (!locationsOutOfBounds) { + if (world != null) { + boolean wormholeIsViable = false; + for (Wormhole wormhole : Wormhole.getWormholes()) { + if (wormhole.getWormholeEntry1().getLocation() != null && + wormhole.getWormholeEntry1().getLocation().getWorld() != null && + wormhole.getWormholeEntry1().getLocation().getWorld().equals(player.getWorld())) { + if (wormhole.getWormholeEntry2().getLocation() != null && + wormhole.getWormholeEntry2().getLocation().getWorld() != null && + wormhole.getWormholeEntry2().getLocation().getWorld().equals(world)) { + LocationAndSymbol pair = processLocations(wormhole.getWormholeEntry1().getLocation(), null); + if (pair != null) + compassText = compassText.substring(0, pair.getKey()) + pair.getValue() + compassText.substring(pair.getKey() + 1); + wormholeIsViable = true; + } + + } else if (wormhole.getWormholeEntry2().getLocation() != null && + wormhole.getWormholeEntry2().getLocation().getWorld() != null && + wormhole.getWormholeEntry2().getLocation().getWorld().equals(player.getWorld())) { + if (wormhole.getWormholeEntry1().getLocation() != null && + wormhole.getWormholeEntry1().getLocation().getWorld() != null && + wormhole.getWormholeEntry1().getLocation().getWorld().equals(world)) { + LocationAndSymbol pair = processLocations(wormhole.getWormholeEntry2().getLocation(), null); + if (pair != null) + compassText = compassText.substring(0, pair.getKey()) + pair.getValue() + compassText.substring(pair.getKey() + 1); + wormholeIsViable = true; + } + } + } + if (!wormholeIsViable) + compassText = QuestsConfig.getQuestDestinationInOtherWorld().replace("$world", world.getName()); + } else + compassText = QuestsConfig.getNoQuestDestinationFound(); + } + } + + compassBar.setTitle(compassText); + compassBar.addPlayer(player); + } + + private List projectLocations() { + List parsedVectors = new ArrayList<>(); + if (questIsDone) { + for (Location location : new ArrayList<>(turnInNPCs)) { + LocationAndSymbol locationAndSymbol = processLocations(location, null); + if (locationAndSymbol != null) parsedVectors.add(locationAndSymbol); + } + } else + for (ObjectiveDestinations iteratedObjectiveDestinations : new ArrayList<>(objectiveDestinations)) + for (Location location : iteratedObjectiveDestinations.getDestinations()) { + LocationAndSymbol locationAndSymbol = processLocations(location, iteratedObjectiveDestinations.getObjective()); + if (locationAndSymbol != null) parsedVectors.add(locationAndSymbol); + } + return parsedVectors; + } + + private LocationAndSymbol processLocations(Location location, Objective objective) { + if (player.getWorld().equals(location.getWorld())) { + Vector toTarget = toTargetVector(player, location); + double angle = getAngle(toTarget, player); + if (Math.abs(angle) > Math.PI / 2D) return null; + //Convert to degrees, each character has a resolution of 3 degrees + return new LocationAndSymbol((int) (angle * 57D / 3D), getSymbol(objective)); + } + return null; + } + + private Vector toTargetVector(Player player, Location location) { + return location.clone().add(new Vector(0, 1.85, 0)).subtract(player.getEyeLocation()).toVector().normalize(); + } + + private double getAngle(Vector toTarget, Player player) { + double angle = player.getEyeLocation().getDirection().setY(0).angle(toTarget.clone().setY(0)); + if (toTarget.getX() * player.getEyeLocation().getDirection().getZ() - toTarget.getZ() * player.getEyeLocation().getDirection().getX() > 0) + angle *= -1; + return angle; + } + + private String getSymbol(Objective objective) { + //case for portals + if (objective == null) return "⬯"; + + if (questIsDone) + return "⦿"; + if (objective instanceof KillObjective) + return "☠"; + else if (objective instanceof DialogObjective) + return "⦿"; + else if (objective instanceof CustomFetchObjective) + return "⚔"; + return "⦿"; + } + + public static class QuestTrackingEvents implements Listener { + @EventHandler + public void onPlayerLogout(PlayerQuitEvent event) { + QuestTracking questTracking = getPlayerTrackingQuests().get(event.getPlayer()); + if (questTracking == null) return; + questTracking.stop(); + } + + @EventHandler(ignoreCancelled = true) + public void onQuestProgressEvent(QuestProgressionEvent event) { + //if (event.getObjective().isObjectiveCompleted()) return; + if (!isTracking(event.getPlayer())) return; + if (!getPlayerTrackingQuests().get(event.getPlayer()).getCustomQuest().getQuestID().equals(event.getQuest().getQuestID())) + return; + getPlayerTrackingQuests().get(event.getPlayer()) + .updateLocations(getPlayerTrackingQuests().get(event.getPlayer()).getCustomQuest()); + getPlayerTrackingQuests().get(event.getPlayer()).refreshScoreboard(); + } + + @EventHandler(ignoreCancelled = true) + public void onQuestCompleteEvent(QuestCompleteEvent event) { + if (!isTracking(event.getPlayer())) return; + if (!getPlayerTrackingQuests().get(event.getPlayer()).getCustomQuest().getQuestID().equals(event.getQuest().getQuestID())) + return; + getPlayerTrackingQuests().get(event.getPlayer()).stop(); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) + public void onQuestAcceptEvent(QuestAcceptEvent event) { + if (!(event.getQuest() instanceof CustomQuest)) return; + if (!((CustomQuest) event.getQuest()).getCustomQuestsConfigFields().isTrackable()) return; + if (QuestsConfig.isAutoTrackQuestsOnAccept()) { + toggleTracking(event.getPlayer(), (CustomQuest) event.getQuest()); + event.getPlayer().spigot().sendMessage(SpigotMessage.commandHoverMessage( + ChatColorConverter.convert(QuestsConfig.getChatTrackingMessage()), + ChatColorConverter.convert(QuestsConfig.getChatTrackingHover()), + QuestsConfig.getChatTrackingCommand().replace("$questID", event.getQuest().getQuestID().toString()) + )); + } else + event.getPlayer().spigot().sendMessage(SpigotMessage.commandHoverMessage( + ChatColorConverter.convert(QuestsConfig.getChatTrackMessage()), + ChatColorConverter.convert(QuestsConfig.getChatTrackHover()), + QuestsConfig.getChatTrackCommand().replace("$questID", event.getQuest().getQuestID().toString()) + )); + } + + } + + private class ObjectiveDestinations { + @Getter + private final Objective objective; + @Getter + private final List destinations; + + private ObjectiveDestinations(Objective objective, List destinations) { + this.objective = objective; + this.destinations = destinations; + objectiveDestinations.add(this); + } + } + + private class LocationAndSymbol { + @Getter + private final int key; + @Getter + private final String value; + + private LocationAndSymbol(int key, String value) { + //adjust the key to the center of the compass display + this.key = key + 31; + this.value = value; + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/quests/menus/QuestBookMenu.java b/src/main/java/com/magmaguy/elitemobs/quests/menus/QuestBookMenu.java new file mode 100644 index 000000000..4f377dc4a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/quests/menus/QuestBookMenu.java @@ -0,0 +1,70 @@ +package com.magmaguy.elitemobs.quests.menus; + +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.npcs.NPCEntity; +import com.magmaguy.elitemobs.quests.CustomQuest; +import com.magmaguy.elitemobs.quests.Quest; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class QuestBookMenu { + private QuestBookMenu() { + } + + //NPC entity is null when the entry is generated based on a command and not a npc interaction + public static TextComponent[] generateQuestEntry(Quest quest, Player player, NPCEntity npcEntity) { + QuestMenu.QuestText questText = new QuestMenu.QuestText(quest, npcEntity, player); + + //Condense all page elements + List elements = new ArrayList<>(); + elements.add(questText.getHeader()); + if (quest instanceof CustomQuest && !quest.getQuestObjectives().isOver()) + elements.addAll(questText.getBody()); + elements.add(questText.getFixedSummary()); + elements.addAll(questText.getSummary()); + elements.add(questText.getFixedRewards()); + elements.addAll(questText.getRewards()); + elements.add(questText.getAccept()); + if (quest instanceof CustomQuest) + elements.add(questText.getTrack()); + + //Arrange them into pages, taking character count into account + List pagesList = new ArrayList<>(); + int pageIndex = 0; + int characterCount = 0; + int characterLimit = DefaultConfig.getCharacterLimitForBookMenuPages(); + for (TextComponent textComponent : elements) { + characterCount += ChatColor.stripColor(textComponent.getText()).length(); + textComponent.setText(ChatColor.BLACK + textComponent.getText() + .replace(ChatColor.WHITE + "", ChatColor.BLACK + "") + .replace(ChatColor.YELLOW + "", ChatColor.GOLD + "")); + if (pagesList.isEmpty()) { + textComponent.addExtra("\n"); + pagesList.add(textComponent); + } else if (characterCount > characterLimit) { + characterCount = 0; + characterCount += ChatColor.stripColor(textComponent.getText()).length(); + pageIndex++; + textComponent.addExtra("\n"); + pagesList.add(textComponent); + } else { + textComponent.addExtra("\n"); + pagesList.get(pageIndex).addExtra(textComponent); + } + } + + TextComponent[] pages = new TextComponent[pagesList.size()]; + + int pageCounter = 0; + for (TextComponent textComponent : pagesList) { + pages[pageCounter] = textComponent; + pageCounter++; + } + + return pages; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/quests/menus/QuestInventoryMenu.java b/src/main/java/com/magmaguy/elitemobs/quests/menus/QuestInventoryMenu.java new file mode 100644 index 000000000..b38f8a395 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/quests/menus/QuestInventoryMenu.java @@ -0,0 +1,259 @@ +package com.magmaguy.elitemobs.quests.menus; + +import com.magmaguy.elitemobs.commands.quests.QuestCommand; +import com.magmaguy.elitemobs.config.QuestsConfig; +import com.magmaguy.elitemobs.npcs.NPCEntity; +import com.magmaguy.elitemobs.quests.CustomQuest; +import com.magmaguy.elitemobs.quests.Quest; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.concurrent.atomic.AtomicInteger; + +public class QuestInventoryMenu { + private static final int trackEntry = 8; + private static final int acceptEntry = 26; + private static final HashMap questDirectories = new HashMap<>(); + private static final HashMap questInventories = new HashMap<>(); + + private QuestInventoryMenu() { + } + + public static void generateInventoryQuestEntries(List quests, Player player, NPCEntity npcEntity) { + if (quests.size() == 1) + QuestInventoryMenu.generateInventoryQuestEntry(quests.get(0), player, npcEntity); + else + QuestInventoryMenu.generateInventoryQuestDirectory(quests, player, npcEntity); + } + + public static void generateInventoryQuestDirectory(List quests, Player player, NPCEntity npcEntity) { + String menuTitle = "Quests"; + Inventory questInventory = Bukkit.createInventory(player, 27, menuTitle); + List questSlots = new ArrayList<>(new ArrayList<>(List.of(13, 11, 15, 9, 17, 10, 16, 12, 14, 8))); + Material acceptMaterial = Material.GREEN_STAINED_GLASS_PANE; + Material inProgressMaterial = Material.RED_STAINED_GLASS_PANE; + Material completeMaterial = Material.ORANGE_STAINED_GLASS_PANE; + HashMap questMap = new HashMap<>(); + for (int i = 0; i < quests.size(); i++) { + if (i > 10) break; + questMap.put(questSlots.get(i), quests.get(i)); + QuestMenu.QuestText questText = new QuestMenu.QuestText(quests.get(i), npcEntity, player); + if (!quests.get(i).isAccepted()) + questInventory.setItem(questSlots.get(i), ItemStackGenerator.generateItemStack(acceptMaterial, questText.getHeader().getText())); + else if (!quests.get(i).getQuestObjectives().isOver()) + questInventory.setItem(questSlots.get(i), ItemStackGenerator.generateItemStack(inProgressMaterial, questText.getHeader().getText())); + else + questInventory.setItem(questSlots.get(i), ItemStackGenerator.generateItemStack(completeMaterial, questText.getHeader().getText())); + } + + new QuestDirectory(player, questMap, questInventory, npcEntity); + player.openInventory(questInventory); + } + + public static void generateInventoryQuestEntry(Quest quest, Player player, NPCEntity npcEntity) { + QuestMenu.QuestText questText = new QuestMenu.QuestText(quest, npcEntity, player); + String title = ""; + if (questText.getHeader().getText() != null) + title = questText.getHeader().getText(); + Inventory questInventory = Bukkit.createInventory(player, 27, title); + int titleEntry = 4; + List loreEntries = new ArrayList<>(new ArrayList<>(List.of(13, 14, 12, 15, 11, 16, 10, 17, 9))); + List objectivesEntries = new ArrayList<>(new ArrayList<>(List.of(21, 20, 19, 18))); + List rewardEntries = new ArrayList<>(new ArrayList<>(List.of(23, 24, 25))); + + Material titleMaterial = Material.PAINTING; + Material trackingMaterial = Material.TARGET; + Material loreMaterial = Material.BOOK; + Material objectivesMaterial = Material.ITEM_FRAME; + Material rewardsMaterial = Material.GOLD_INGOT; + Material acceptMaterial = Material.EMERALD; + + questInventory.setItem(titleEntry, generateItemStackEntry(questText.getHeader(), new TextComponent(), titleMaterial).get(0)); + if (quest instanceof CustomQuest && quest.isAccepted()) + questInventory.setItem(trackEntry, generateItemStackEntry(questText.getTrack(), new TextComponent(), trackingMaterial).get(0)); + questInventory.setItem(acceptEntry, generateItemStackEntry(questText.getAccept(), new TextComponent(), acceptMaterial).get(0)); + if (quest instanceof CustomQuest) + fillItemSlotLists(questInventory, loreEntries, new TextComponent(" "), questText.getBody(), loreMaterial); + fillItemSlotLists(questInventory, objectivesEntries, questText.getFixedSummary(), questText.getSummary(), objectivesMaterial); + fillItemSlotLists(questInventory, rewardEntries, questText.getFixedRewards(), questText.getRewards(), rewardsMaterial); + + new QuestInventory(player, quest, questInventory, npcEntity); + player.openInventory(questInventory); + } + + public static void fillItemSlotLists(Inventory inventory, List entries, TextComponent title, List textComponents, Material material) { + List loreItems = generateItemStackEntry(title, textComponents, material); + List exactEntriesAmount = new ArrayList<>(entries); + exactEntriesAmount = exactEntriesAmount.subList(0, loreItems.size()); + Collections.sort(exactEntriesAmount); + for (int i = 0; i < exactEntriesAmount.size(); i++) + inventory.setItem(exactEntriesAmount.get(i), loreItems.get(i)); + } + + public static List generateItemStackEntry(TextComponent title, List textComponents, Material material) { + List list = new ArrayList<>(); + textComponents.forEach(component -> { + if (component.getText().length() < 27) + list.add(ChatColor.WHITE + component.getText().replace(ChatColor.BLACK + "", ChatColor.WHITE + "")); + else { + ChatColor currentColor = ChatColor.WHITE; + for (int i = 0; i < component.getText().length() / 26D; i++) { + String string = currentColor + ChatColorConverter.convert(component.getText().substring(i * 26, Math.min((i + 1) * 26, component.getText().length())).replace(ChatColor.BLACK + "", ChatColor.WHITE + "")); + list.add(string); + String lastColor = ChatColor.getLastColors(string); + if (!lastColor.isEmpty()) + currentColor = ChatColor.getByChar(lastColor); + if (currentColor == null) currentColor = ChatColor.WHITE; + } + } + }); + return generateParsedItemStackEntry(title.getText(), list, material); + } + + public static List generateItemStackEntry(TextComponent title, TextComponent textComponent, Material material) { + return generateParsedItemStackEntry(title.getText(), Collections.singletonList(textComponent.getText()), material); + } + + public static List generateParsedItemStackEntry(String title, List rawLore, Material material) { + title = title.replace(ChatColor.BLACK.toString(), ChatColor.WHITE.toString()); + List lore = new ArrayList<>(); + rawLore.forEach(raw -> lore.add(ChatColor.WHITE + raw.replace(ChatColor.BLACK.toString(), ChatColor.WHITE.toString()))); + int characterLimit = QuestsConfig.getItemEntryCharacterLimitBedrockMenu(); + List itemStacks = new ArrayList<>(); + AtomicInteger counter = new AtomicInteger(); + lore.forEach(entry -> counter.addAndGet(entry.length())); + if (counter.get() < characterLimit) { + itemStacks.add(ItemStackGenerator.generateItemStack(material, title, lore)); + return itemStacks; + } + + int maxCharactersPerLine = QuestsConfig.getHorizontalCharacterLimitBedrockMenu(); + List currentList = new ArrayList<>(); + int currentCharacterCount = 0; + for (String entry : lore) { + entry = entry.replace(ChatColor.BLACK.toString(), ChatColor.WHITE.toString()); + if (!currentList.isEmpty() && entry.length() + currentCharacterCount > characterLimit) { + itemStacks.add(ItemStackGenerator.generateItemStack(material, title, currentList)); + currentList.clear(); + currentCharacterCount = 0; + } + if (entry.length() > maxCharactersPerLine) { + int size = 30; + //for languages that have no spaces + if (!entry.contains(" ")) { + List substrings = new ArrayList<>((entry.length() + size - 1) / size); + for (int start = 0; start < entry.length(); start += size) + substrings.add(ChatColor.WHITE + entry.substring(start, Math.min(entry.length(), start + size))); + currentList.addAll(substrings); + //for other languages + } else { + String[] splitBySpaces = entry.split(" "); + List substrings = new ArrayList<>(); + StringBuilder currentString = new StringBuilder(); + currentString.append(ChatColor.WHITE); + for (String string : splitBySpaces) { + string += " "; + if (currentString.length() + string.length() > size) { + substrings.add(currentString.toString()); + currentString = new StringBuilder(); + currentString.append(ChatColor.WHITE); + } + currentString.append(string); + } + substrings.add(currentString.toString()); + currentList.addAll(substrings); + } + } else + currentList.add(entry); + currentCharacterCount += entry.length(); + } + itemStacks.add(ItemStackGenerator.generateItemStack(material, title, currentList)); + return itemStacks; + } + + private static class QuestDirectory { + HashMap questMap; + Inventory inventory; + NPCEntity npcEntity; + Player player; + + private QuestDirectory(Player player, HashMap questMap, Inventory inventory, NPCEntity npcEntity) { + this.questMap = questMap; + this.inventory = inventory; + this.npcEntity = npcEntity; + this.player = player; + questDirectories.put(inventory, this); + } + } + + private static class QuestInventory { + Quest quest; + Inventory inventory; + NPCEntity npcEntity; + Player player; + + private QuestInventory(Player player, Quest quest, Inventory inventory, NPCEntity npcEntity) { + this.quest = quest; + this.inventory = inventory; + this.npcEntity = npcEntity; + this.player = player; + questInventories.put(inventory, this); + } + } + + public static class QuestInventoryMenuEvents implements Listener { + @EventHandler(priority = EventPriority.HIGHEST) + public void onInventoryInteract(InventoryClickEvent event) { + Player player = ((Player) event.getWhoClicked()).getPlayer(); + if (questDirectories.containsKey(event.getInventory())) { + event.setCancelled(true); + QuestDirectory questDirectory = questDirectories.get(event.getInventory()); + if (questDirectory.questMap.get(event.getSlot()) == null) return; + player.closeInventory(); + generateInventoryQuestEntry(questDirectory.questMap.get(event.getSlot()), questDirectory.player, questDirectory.npcEntity); + } else if (questInventories.containsKey(event.getInventory())) { + event.setCancelled(true); + switch (event.getSlot()) { + case trackEntry: + QuestCommand.trackQuest(questInventories.get(event.getInventory()).quest.getQuestID().toString(), player); + player.closeInventory(); + break; + case acceptEntry: + Quest quest = questInventories.get(event.getInventory()).quest; + if (!quest.isAccepted()) + QuestCommand.joinQuest(quest.getQuestID().toString(), player); + else if (!quest.getQuestObjectives().isOver()) + QuestCommand.leaveQuest(player, quest.getQuestID().toString()); + else + QuestCommand.completeQuest(quest.getQuestID().toString(), player); + player.closeInventory(); + break; + } + } + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onInventoryClose(InventoryCloseEvent event) { + questDirectories.remove(event.getInventory()); + questInventories.remove(event.getInventory()); + } + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/quests/menus/QuestMenu.java b/src/main/java/com/magmaguy/elitemobs/quests/menus/QuestMenu.java new file mode 100644 index 000000000..642964af8 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/quests/menus/QuestMenu.java @@ -0,0 +1,252 @@ +package com.magmaguy.elitemobs.quests.menus; + +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.config.menus.premade.CustomQuestMenuConfig; +import com.magmaguy.elitemobs.config.menus.premade.DynamicQuestMenuConfig; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs.EliteMobProperties; +import com.magmaguy.elitemobs.npcs.NPCEntity; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.quests.CustomQuest; +import com.magmaguy.elitemobs.quests.DynamicQuest; +import com.magmaguy.elitemobs.quests.Quest; +import com.magmaguy.elitemobs.quests.QuestTracking; +import com.magmaguy.elitemobs.quests.objectives.DynamicKillObjective; +import com.magmaguy.elitemobs.quests.objectives.KillObjective; +import com.magmaguy.elitemobs.quests.objectives.Objective; +import com.magmaguy.elitemobs.thirdparty.geyser.GeyserDetector; +import com.magmaguy.elitemobs.utils.BookMaker; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.SpigotMessage; +import lombok.Getter; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +import static com.magmaguy.elitemobs.quests.menus.QuestInventoryMenu.generateInventoryQuestEntries; + + +public class QuestMenu { + + private QuestMenu() { + } + + public static void generateCustomQuestMenu(List customQuestList, Player player, NPCEntity npcEntity) { + generateQuestMenu(customQuestList, player, npcEntity); + } + + public static void generateDynamicQuestMenu(List dynamicQuests, Player player, NPCEntity npcEntity) { + generateQuestMenu(dynamicQuests, player, npcEntity); + } + + public static void generateQuestMenu(List quests, Player player, NPCEntity npcEntity) { + if (!PlayerData.getUseBookMenus(player.getUniqueId()) || GeyserDetector.bedrockPlayer(player) || DefaultConfig.isOnlyUseBedrockMenus()) { + generateInventoryQuestEntries(quests, player, npcEntity); + } else { + generateBookQuestEntries(quests, player, npcEntity); + } + } + + public static void generateBookQuestEntries(List quests, Player player, NPCEntity npcEntity) { + BookMaker.generateBook(player, generateBookQuestEntriesComponents(quests, player, npcEntity)); + } + + public static TextComponent[] generateBookQuestEntriesComponents(List quests, Player player, NPCEntity npcEntity) { + List textComponents = new ArrayList<>(); + int counter = 0; + for (Quest quest : quests) { + TextComponent[] iteratedTextComponent = QuestBookMenu.generateQuestEntry(quest, player, npcEntity); + counter += iteratedTextComponent.length; + textComponents.add(iteratedTextComponent); + } + + TextComponent[] allQuests = new TextComponent[counter]; + + int counter2 = 0; + for (TextComponent[] textComponentsArray : textComponents) + for (TextComponent textComponent : textComponentsArray) { + allQuests[counter2] = textComponent; + counter2++; + } + + return allQuests; + } + + + private static TextComponent generateHeader(Quest quest) { + if (quest instanceof CustomQuest) + return SpigotMessage.simpleMessage(CustomQuestMenuConfig.getHeaderTextLines().replace("$questName", quest.getQuestName())); + else + return SpigotMessage.simpleMessage(DynamicQuestMenuConfig.getHeaderTextLines().replace("$questName", quest.getQuestName())); + } + + private static List generateBody(Quest quest) { + List body = new ArrayList<>(); + if (quest instanceof CustomQuest) + for (String splitString : ((CustomQuest) quest).getCustomQuestsConfigFields().getQuestLore()) + body.add(new TextComponent(ChatColorConverter.convert(splitString))); + else if (quest instanceof DynamicQuest) + body.add(new TextComponent(DynamicQuestMenuConfig.getDefaultLoreTextLines() + .replace("$amount", quest.getQuestObjectives().getObjectives().get(0).getTargetAmount() + "") + .replace("$name", EliteMobProperties.getPluginData(((DynamicKillObjective) quest.getQuestObjectives().getObjectives().get(0)).getEntityType()).getName(quest.getQuestLevel() * 10)))); + return body; + } + + private static TextComponent generateFixedSummary(Quest quest) { + TextComponent fixedSummary = new TextComponent(); + if (quest instanceof CustomQuest) + fixedSummary.setText(CustomQuestMenuConfig.getObjectivesLine()); + else if (quest instanceof DynamicQuest) + fixedSummary.setText(DynamicQuestMenuConfig.getObjectivesLine()); + return fixedSummary; + } + + private static List generateSummary(Quest quest) { + List textComponents = new ArrayList<>(); + if (quest instanceof CustomQuest) { + for (Objective objective : quest.getQuestObjectives().getObjectives()) + textComponents.add(new TextComponent(SpigotMessage.commandHoverMessage(CustomQuestMenuConfig.getObjectiveLine(objective), "", ""))); + } else if (quest instanceof DynamicQuest) { + for (Objective objective : quest.getQuestObjectives().getObjectives()) + if (objective instanceof KillObjective) { + //todo: hover should show more boss details, command string should allow players to try to track the boss + textComponents.add(new TextComponent(SpigotMessage.commandHoverMessage(DynamicQuestMenuConfig.getKillQuestDefaultSummaryLine(objective), "", ""))); + } + } + return textComponents; + } + + private static TextComponent generateFixedRewards(Quest quest) { + TextComponent questRewards = new TextComponent(); + if (quest instanceof CustomQuest) + questRewards.setText(CustomQuestMenuConfig.getRewardsLine()); + else if (quest instanceof DynamicQuest) + questRewards.setText(DynamicQuestMenuConfig.getRewardsLine()); + return questRewards; + } + + private static List generateRewards(Quest quest) { + if (quest instanceof CustomQuest) + return CustomQuestMenuConfig.getRewardsDefaultSummaryLine(quest.getQuestObjectives().getQuestReward()); + else + return DynamicQuestMenuConfig.getRewardsDefaultSummaryLine(quest.getQuestObjectives().getQuestReward()); + } + + private static TextComponent generateAccept(Quest quest, NPCEntity npcEntity) { + //Before quest was accepted + if (!quest.isAccepted()) + return initialQuestAccept(quest); + + //Quest is complete, turn in placeholder + if (npcEntity != null && + quest.getQuestObjectives().isOver() && + (quest instanceof DynamicQuest || + quest instanceof CustomQuest && + quest.getQuestTaker().equals(npcEntity.getNPCsConfigFields().getFilename()))) + return questAcceptComplete(quest); + + //Quest has begun but is either not over or the player is not talking to the turn in npc + return questAcceptAlreadyAccepted(quest); + } + + //Appears when the player hasn't accepted the quest yet + private static TextComponent initialQuestAccept(Quest quest) { + if (quest instanceof CustomQuest) { + return SpigotMessage.commandHoverMessage(CustomQuestMenuConfig.getAcceptTextLines(), + CustomQuestMenuConfig.getAcceptHoverLines(), + CustomQuestMenuConfig.getAcceptCommandLines().replace("$questID", quest.getQuestID().toString())); + } else { + return SpigotMessage.commandHoverMessage(DynamicQuestMenuConfig.getAcceptTextLines(), + DynamicQuestMenuConfig.getAcceptHoverLines(), + DynamicQuestMenuConfig.getAcceptCommandLines().replace("$questID", quest.getQuestID().toString())); + } + } + + //Appears when the player has accepted the quest but has not completed it yet, so it is not ready for turn in + private static TextComponent questAcceptAlreadyAccepted(Quest quest) { + if (quest instanceof CustomQuest) { + String npcName = ""; + if (CustomQuestMenuConfig.getAcceptedTextLines().contains("$npcName")) { + for (NPCEntity npcEntity : EntityTracker.getNpcEntities().values()) + if (npcEntity.getNPCsConfigFields().getFilename().equals(quest.getQuestTaker())) { + npcName = npcEntity.getNPCsConfigFields().getName(); + break; + } + } + return SpigotMessage.commandHoverMessage( + CustomQuestMenuConfig.getAcceptedTextLines().replace("$npcName", npcName), + CustomQuestMenuConfig.getAcceptedHoverLines(), + CustomQuestMenuConfig.getAcceptedCommandLines() + .replace("$questID", quest.getQuestID().toString())); + } else { + return SpigotMessage.commandHoverMessage(DynamicQuestMenuConfig.getAcceptedTextLines(), + DynamicQuestMenuConfig.getAcceptedHoverLines(), + DynamicQuestMenuConfig.getAcceptedCommandLines().replace("$questID", quest.getQuestID().toString())); + } + } + + private static TextComponent generateTrack(Player player, Quest quest) { + if (!((CustomQuest) quest).getCustomQuestsConfigFields().isTrackable()) return new TextComponent(); + if (!CustomQuestMenuConfig.isUseQuestTracking()) return new TextComponent(); + if (!quest.isAccepted()) return new TextComponent(); + if (!QuestTracking.isTracking(player)) + return SpigotMessage.commandHoverMessage(CustomQuestMenuConfig.getTrackTextLines(), + CustomQuestMenuConfig.getTrackHoverLines(), CustomQuestMenuConfig.getTrackCommandLines().replace("$questID", quest.getQuestID() + "")); + else + return SpigotMessage.commandHoverMessage(CustomQuestMenuConfig.getUntrackTextLines(), + CustomQuestMenuConfig.getUntrackHoverLines(), CustomQuestMenuConfig.getUntrackCommandLines().replace("$questID", quest.getQuestID() + "")); + } + + //Appears when the player has completed the quest + private static TextComponent questAcceptComplete(Quest quest) { + if (quest instanceof CustomQuest) { + return SpigotMessage.commandHoverMessage(CustomQuestMenuConfig.getCompletedTextLines(), + CustomQuestMenuConfig.getCompletedHoverLines(), + CustomQuestMenuConfig.getCompletedCommandLines().replace("$questID", quest.getQuestID().toString())); + } else { + return SpigotMessage.commandHoverMessage(DynamicQuestMenuConfig.getCompletedTextLines(), + DynamicQuestMenuConfig.getCompletedHoverLines(), + DynamicQuestMenuConfig.getCompletedCommandLines().replace("$questID", quest.getQuestID().toString())); + } + } + + public static TextComponent[] generateQuestEntry(Player player, NPCEntity npcEntity) { + if (PlayerData.getQuests(player.getUniqueId()) == null) return new TextComponent[0]; + return generateBookQuestEntriesComponents(PlayerData.getQuests(player.getUniqueId()), player, npcEntity); + } + + public static class QuestText { + @Getter + private final TextComponent header; + @Getter + private final List body; + @Getter + private final TextComponent fixedSummary; + @Getter + private final List summary; + @Getter + private final TextComponent fixedRewards; + @Getter + private final List rewards; + @Getter + private final TextComponent accept; + @Getter + private TextComponent track; + + public QuestText(Quest quest, NPCEntity npcEntity, Player player) { + header = generateHeader(quest); + body = generateBody(quest); + fixedSummary = generateFixedSummary(quest); + summary = generateSummary(quest); + fixedRewards = generateFixedRewards(quest); + rewards = generateRewards(quest); + accept = generateAccept(quest, npcEntity); + track = null; + if (quest instanceof CustomQuest) + track = generateTrack(player, quest); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/quests/objectives/ArenaObjective.java b/src/main/java/com/magmaguy/elitemobs/quests/objectives/ArenaObjective.java new file mode 100644 index 000000000..d6ba09a23 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/quests/objectives/ArenaObjective.java @@ -0,0 +1,36 @@ +package com.magmaguy.elitemobs.quests.objectives; + +import com.magmaguy.elitemobs.api.ArenaCompleteEvent; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.quests.CustomQuest; +import com.magmaguy.elitemobs.quests.Quest; +import lombok.Getter; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public class ArenaObjective extends Objective { + + @Getter + public String arenaFilename; + + protected ArenaObjective(String objectiveName, String arenaFilename) { + super(1, objectiveName); + this.arenaFilename = arenaFilename; + } + + public static class ArenaObjectiveEvents implements Listener { + @EventHandler + public void onArenaComplete(ArenaCompleteEvent arenaCompleteEvent) { + for (Player player : arenaCompleteEvent.getArenaInstance().getPlayers()) + for (Quest quest : PlayerData.getQuests(player.getUniqueId())) + if (quest instanceof CustomQuest) + for (Objective objective : quest.getQuestObjectives().getObjectives()) + if (objective instanceof ArenaObjective arenaObjective && + arenaObjective.arenaFilename.equals(arenaCompleteEvent.getArenaInstance().getCustomArenasConfigFields().getFilename())) + objective.progressObjective(quest.getQuestObjectives()); + } + } + + +} diff --git a/src/main/java/com/magmaguy/elitemobs/quests/objectives/CustomFetchObjective.java b/src/main/java/com/magmaguy/elitemobs/quests/objectives/CustomFetchObjective.java new file mode 100644 index 000000000..71e74af09 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/quests/objectives/CustomFetchObjective.java @@ -0,0 +1,153 @@ +package com.magmaguy.elitemobs.quests.objectives; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.QuestAcceptEvent; +import com.magmaguy.elitemobs.api.QuestCompleteEvent; +import com.magmaguy.elitemobs.api.QuestProgressionEvent; +import com.magmaguy.elitemobs.api.QuestRewardEvent; +import com.magmaguy.elitemobs.items.ItemTagger; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.quests.Quest; +import com.magmaguy.elitemobs.utils.EventCaller; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Bukkit; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityPickupItemEvent; +import org.bukkit.event.player.PlayerDropItemEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.scheduler.BukkitRunnable; +import org.jetbrains.annotations.NotNull; + +public class CustomFetchObjective extends Objective { + + @Getter + private final String key; + @Getter + @Setter + /** + * This sets when a boss has been detected as having dropped the relevant item for the quest after the quest has been slated to begin. + */ + private boolean readyToPickUp = false; + /** + * This sets whether the items are lost upon turning the quest in + */ + @Getter + private boolean requireItemTurnIn; + + public CustomFetchObjective(int targetAmount, String objectiveName, String customItemFilename) { + super(targetAmount, objectiveName); + this.key = customItemFilename; + } + + private static void checkEvent(@NotNull Player player, @NotNull ItemStack itemStack) { + for (Quest quest : PlayerData.getQuests(player.getUniqueId())) + for (Objective objective : quest.getQuestObjectives().getObjectives()) + if (objective instanceof CustomFetchObjective) + ((CustomFetchObjective) objective).checkItem(player, itemStack, quest.getQuestObjectives()); + } + + private void checkItem(Player player, @NotNull ItemStack itemStack, QuestObjectives questObjectives) { + if (!ItemTagger.hasKey(itemStack, this.key)) return; + progressNonlinearObjective(questObjectives, player); + } + + private void turnItemsIn(Player player) { + int deletedItems = 0; + for (ItemStack itemStack : player.getInventory()) { + if (ItemTagger.hasKey(itemStack, this.key)) { + int existingAmount = itemStack.getAmount(); + int missingAmount = targetAmount - deletedItems; + if (existingAmount >= missingAmount) { + existingAmount -= missingAmount; + deletedItems += missingAmount; + } else + existingAmount = 0; + itemStack.setAmount(existingAmount); + if (deletedItems == targetAmount) + return; + } + } + Logger.warn("Player " + player.getName() + " managed to complete objective " + objectiveName + " without turning in the required amount of items! This isn't good, tell the developer!"); + } + + /** + * Updates a non-linear objective, sending an event + * + * @param questObjectives Objectives to update + * @param player Player to update + */ + @Override + public void progressNonlinearObjective(QuestObjectives questObjectives, Player player) { + CustomFetchObjective customFetchObjective = this; + new BukkitRunnable() { + @Override + public void run() { + fullUpdate(player); + if (questObjectives.isTurnedIn()) return; + objectiveCompleted = currentAmount >= targetAmount; + QuestProgressionEvent questProgressionEvent = new QuestProgressionEvent( + Bukkit.getPlayer(questObjectives.getQuest().getPlayerUUID()), + questObjectives.getQuest(), + customFetchObjective); + new EventCaller(questProgressionEvent); + } + }.runTaskLater(MetadataHandler.PLUGIN, 1); + } + + /** + * Fully updates the inventory and total amount + * + * @param player Player to update + */ + private void fullUpdate(Player player) { + super.currentAmount = 0; + for (ItemStack itemStack : player.getInventory()) + if (ItemTagger.hasKey(itemStack, this.key)) + super.currentAmount += itemStack.getAmount(); + } + + public static class CustomFetchObjectiveEvents implements Listener { + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onItemDrop(PlayerDropItemEvent event) { + checkEvent(event.getPlayer(), event.getItemDrop().getItemStack()); + } + + @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) + public void onItemPickup(EntityPickupItemEvent event) { + if (event.getEntity().getType() != EntityType.PLAYER) return; + checkEvent((Player) event.getEntity(), event.getItem().getItemStack()); + } + + @EventHandler(ignoreCancelled = true) + public void onQuestAcceptEvent(QuestAcceptEvent event) { + for (Objective objective : event.getQuest().getQuestObjectives().getObjectives()) + if (objective instanceof CustomFetchObjective) + objective.progressNonlinearObjective(event.getQuest().getQuestObjectives(), event.getPlayer()); + } + + @EventHandler(ignoreCancelled = true) + public void onQuestCompleteEvent(QuestCompleteEvent event) { + for (Objective objective : event.getQuest().getQuestObjectives().getObjectives()) + if (objective instanceof CustomFetchObjective) { + objective.progressNonlinearObjective(event.getQuest().getQuestObjectives(), event.getPlayer()); + if (objective.getCurrentAmount() < objective.getTargetAmount()) + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true) + public void onQuestRewardEvent(QuestRewardEvent event) { + for (Objective objective : event.getQuest().getQuestObjectives().getObjectives()) + if (objective instanceof CustomFetchObjective) + ((CustomFetchObjective) objective).turnItemsIn(event.getPlayer()); + } + } + + +} diff --git a/src/main/java/com/magmaguy/elitemobs/quests/objectives/CustomKillObjective.java b/src/main/java/com/magmaguy/elitemobs/quests/objectives/CustomKillObjective.java new file mode 100644 index 000000000..9d4f18ea8 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/quests/objectives/CustomKillObjective.java @@ -0,0 +1,28 @@ +package com.magmaguy.elitemobs.quests.objectives; + +import com.magmaguy.elitemobs.api.EliteMobDeathEvent; +import com.magmaguy.elitemobs.config.custombosses.CustomBossesConfig; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import lombok.Getter; + +public class CustomKillObjective extends KillObjective { + + @Getter + private final String customBossFilename; + + public CustomKillObjective(String customBossFilename, int targetKillAmount, int questLevel) { + super(targetKillAmount, CustomBossesConfig.getCustomBosses().get(customBossFilename).getCleanName(questLevel * 10)); + this.customBossFilename = customBossFilename; + } + + @Override + public void checkProgress(EliteMobDeathEvent event, QuestObjectives questObjectives) { + if (!(event.getEliteEntity() instanceof CustomBossEntity customBossEntity)) return; + String filename = customBossEntity.getCustomBossesConfigFields().getFilename(); + if (customBossEntity.getPhaseBossEntity() != null) + filename = customBossEntity.getPhaseBossEntity().getPhase1Config().getFilename(); + if (!filename.equals(customBossFilename)) return; + progressObjective(questObjectives); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/quests/objectives/CustomObjectivesParser.java b/src/main/java/com/magmaguy/elitemobs/quests/objectives/CustomObjectivesParser.java new file mode 100644 index 000000000..c97beb3a1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/quests/objectives/CustomObjectivesParser.java @@ -0,0 +1,88 @@ +package com.magmaguy.elitemobs.quests.objectives; + +import com.magmaguy.elitemobs.quests.CustomQuest; +import com.magmaguy.elitemobs.utils.MapListInterpreter; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Logger; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class CustomObjectivesParser { + /** + * Processes the custom objectives as set in the configuration file. These objectives must follow one or more of these formats: + * KILL_CUSTOM:filename=X.yml:amount=Y + * FETCH_ITEM:filename=X.yml:amount=Y + * ARENA:filename=X.yml + */ + public static List processCustomObjectives(CustomQuest customQuest) { + List objectives = new ArrayList<>(); + + for (Map maps : customQuest.getCustomQuestsConfigFields().getCustomObjectives().values()) + objectives.add(processObjectiveType(maps, customQuest)); + return objectives; + } + + private static Objective processObjectiveType(Map rawMap, CustomQuest customQuest) { + ObjectiveType objectiveType = null; + String filename = null; + String location = null; + List dialog = null; + String name = null; + Integer amount = 1; + for (Map.Entry entry : rawMap.entrySet()) { + switch (entry.getKey()) { + case "objectiveType": + objectiveType = MapListInterpreter.parseEnum(entry.getKey(), entry.getValue(), ObjectiveType.class, customQuest.getConfigurationFilename()); + break; + case "filename": + filename = MapListInterpreter.parseString(entry.getKey(), entry.getValue(), customQuest.getConfigurationFilename()); + break; + case "amount": + amount = MapListInterpreter.parseInteger(entry.getKey(), entry.getValue(), customQuest.getConfigurationFilename()); + if (amount == null) amount = 1; + break; + case "location": + location = MapListInterpreter.parseString(entry.getKey(), entry.getValue(), customQuest.getConfigurationFilename()); + break; + case "dialog": + dialog = ChatColorConverter.convert(MapListInterpreter.parseStringList(entry.getKey(), entry.getValue(), customQuest.getConfigurationFilename())); + break; + case "npcName": + case "itemName": + case "name": + name = ChatColorConverter.convert(MapListInterpreter.parseString(entry.getKey(), entry.getValue(), customQuest.getConfigurationFilename())); + break; + } + } + if (filename == null) { + Logger.warn("Invalid filename for entry " + rawMap + " in Custom Quest " + customQuest.getCustomQuestsConfigFields().getFilename() + " . This objective will not be registered."); + return null; + } + try { + if (objectiveType.equals(ObjectiveType.KILL_CUSTOM)) + return new CustomKillObjective(filename, amount, customQuest.getQuestLevel()); + else if (objectiveType.equals(ObjectiveType.FETCH_ITEM)) + return new CustomFetchObjective(amount, name, filename); + else if (objectiveType.equals(ObjectiveType.DIALOG)) + return new DialogObjective(filename, name, location, dialog); + else if (objectiveType.equals(ObjectiveType.ARENA)) + return new ArenaObjective(name, filename); + } catch (Exception ex) { + Logger.warn("Failed to register objective type for quest " + customQuest.getCustomQuestsConfigFields().getFilename() + " ! This quest will be skipped"); + Logger.warn("Invalid entry: " + rawMap); + ex.printStackTrace(); + } + + return null; + + } + + private enum ObjectiveType { + KILL_CUSTOM, + FETCH_ITEM, + DIALOG, + ARENA + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/quests/objectives/DialogObjective.java b/src/main/java/com/magmaguy/elitemobs/quests/objectives/DialogObjective.java new file mode 100644 index 000000000..f9a0bf748 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/quests/objectives/DialogObjective.java @@ -0,0 +1,55 @@ +package com.magmaguy.elitemobs.quests.objectives; + +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.npcs.NPCEntity; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.quests.Quest; +import lombok.Getter; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerInteractAtEntityEvent; + +import java.util.List; + +public class DialogObjective extends Objective { + + @Getter + private final String targetLocation; + @Getter + private final String npcFilename; + @Getter + private final List dialog; + + public DialogObjective(String npcFilename, String npcName, String targetLocation, List dialog) { + super(1, npcName); + this.targetLocation = targetLocation; + this.npcFilename = npcFilename; + this.dialog = dialog; + } + + public boolean checkProgress(Player player, QuestObjectives questObjectives) { + if (super.currentAmount >= super.targetAmount) return false; + progressObjective(questObjectives); + dialog.forEach(player::sendMessage); + return true; + } + + public static class DialogObjectiveEvents implements Listener { + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) + public void onInteract(PlayerInteractAtEntityEvent event) { + NPCEntity npcEntity = EntityTracker.getNPCEntity(event.getRightClicked()); + if (npcEntity == null) return; + for (Quest quest : PlayerData.getQuests(event.getPlayer().getUniqueId())) + for (Objective objective : quest.getQuestObjectives().getObjectives()) + if (objective instanceof DialogObjective && + ((DialogObjective) objective).getNpcFilename().equals(npcEntity.getNPCsConfigFields().getFilename())) + if (((DialogObjective) objective).checkProgress(event.getPlayer(), quest.getQuestObjectives())) { + event.setCancelled(true); + } + + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/quests/objectives/DynamicKillObjective.java b/src/main/java/com/magmaguy/elitemobs/quests/objectives/DynamicKillObjective.java new file mode 100644 index 000000000..83d44c44a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/quests/objectives/DynamicKillObjective.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.quests.objectives; + +import com.magmaguy.elitemobs.api.EliteMobDeathEvent; +import com.magmaguy.elitemobs.mobconstructor.mobdata.aggressivemobs.EliteMobProperties; +import lombok.Getter; +import org.bukkit.entity.EntityType; + +public class DynamicKillObjective extends KillObjective { + + @Getter + private final EntityType entityType; + @Getter + private final int minMobLevel; + + public DynamicKillObjective(int targetAmount, EntityType entityType, int questLevel) { + super(targetAmount, EliteMobProperties.getPluginData(entityType).getName(questLevel * 10)); + this.minMobLevel = questLevel * 10; + this.entityType = entityType; + } + + @Override + public void checkProgress(EliteMobDeathEvent event, QuestObjectives questObjectives) { + if (event.getEliteEntity().getLevel() < minMobLevel) return; + if (event.getEliteEntity().getUnsyncedLivingEntity().getType() != this.entityType) return; + progressObjective(questObjectives); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/quests/objectives/KillObjective.java b/src/main/java/com/magmaguy/elitemobs/quests/objectives/KillObjective.java new file mode 100644 index 000000000..b54c1a804 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/quests/objectives/KillObjective.java @@ -0,0 +1,32 @@ +package com.magmaguy.elitemobs.quests.objectives; + +import com.magmaguy.elitemobs.api.EliteMobDeathEvent; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.quests.Quest; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; + +public abstract class KillObjective extends Objective { + + protected KillObjective(int targetAmount, String objectiveName) { + super(targetAmount, objectiveName); + } + + public abstract void checkProgress(EliteMobDeathEvent event, QuestObjectives questObjectives); + + public static class KillObjectiveEvents implements Listener { + @EventHandler + public void onEliteDeath(EliteMobDeathEvent event) { + for (Player player : event.getEliteEntity().getDamagers().keySet()) { + if (!player.hasMetadata("NPC") && PlayerData.isInMemory(player.getUniqueId())) + for (Quest quest : PlayerData.getQuests(player.getUniqueId())) + if (quest != null) + for (Objective objective : quest.getQuestObjectives().getObjectives()) + if (objective instanceof KillObjective) + ((KillObjective) objective).checkProgress(event, quest.getQuestObjectives()); + } + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/quests/objectives/Objective.java b/src/main/java/com/magmaguy/elitemobs/quests/objectives/Objective.java new file mode 100644 index 000000000..8329dc0f4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/quests/objectives/Objective.java @@ -0,0 +1,48 @@ +package com.magmaguy.elitemobs.quests.objectives; + +import com.magmaguy.elitemobs.api.QuestProgressionEvent; +import com.magmaguy.elitemobs.utils.EventCaller; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +import java.io.Serializable; + +public abstract class Objective implements Serializable { + //todo: add the ability to have multiple quest objective types in here instead of just the one + //todo: this class should be the one that handles giving out quest rewards + + @Getter + protected boolean objectiveCompleted = false; + + @Getter + @Setter + protected int currentAmount = 0; + @Getter + protected int targetAmount; + + @Getter + protected String objectiveName; + + public Objective(int targetAmount, String objectiveName) { + this.targetAmount = targetAmount; + this.objectiveName = objectiveName; + } + + public void progressObjective(QuestObjectives questObjectives) { + currentAmount++; + if (currentAmount >= targetAmount) + objectiveCompleted = true; + QuestProgressionEvent questProgressionEvent = new QuestProgressionEvent( + Bukkit.getPlayer(questObjectives.getQuest().getPlayerUUID()), + questObjectives.getQuest(), + this); + new EventCaller(questProgressionEvent); + } + + public void progressNonlinearObjective(QuestObjectives questObjectives, Player player) { + //This gets implemented by extended classes, right now it's just fetch quests + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/quests/objectives/QuestObjectives.java b/src/main/java/com/magmaguy/elitemobs/quests/objectives/QuestObjectives.java new file mode 100644 index 000000000..17a23b443 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/quests/objectives/QuestObjectives.java @@ -0,0 +1,135 @@ +package com.magmaguy.elitemobs.quests.objectives; + +import com.magmaguy.elitemobs.api.QuestObjectivesCompletedEvent; +import com.magmaguy.elitemobs.config.QuestsConfig; +import com.magmaguy.elitemobs.config.npcs.NPCsConfig; +import com.magmaguy.elitemobs.config.npcs.NPCsConfigFields; +import com.magmaguy.elitemobs.quests.CustomQuest; +import com.magmaguy.elitemobs.quests.Quest; +import com.magmaguy.elitemobs.quests.rewards.QuestReward; +import com.magmaguy.elitemobs.utils.EventCaller; +import com.magmaguy.elitemobs.utils.SimpleScoreboard; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Bukkit; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.ThreadLocalRandom; + +public class QuestObjectives implements Serializable { + + @Getter + private final UUID uuid = UUID.randomUUID(); + @Getter + @Setter + protected QuestReward questReward; + @Getter + @Setter + private List objectives; + //The CustomQuest this objective belongs to + @Getter + private Quest quest; + private boolean over = false; + @Getter + @Setter + private boolean turnedIn = false; + @Setter + private boolean forceOver = false; + + /** + * Used for dynamic quests + */ + public QuestObjectives(int questLevel) { + generateRandomObjective(questLevel); + } + + /** + * Used for custom quests + * + * @param customQuestReward Predetermined Quest Reward + */ + public QuestObjectives(QuestReward customQuestReward) { + this.questReward = customQuestReward; + } + + private void generateRandomObjective(int questLevel) { + int killAmount = ThreadLocalRandom.current().nextInt(1 + questLevel, 1 + questLevel * 10); + EntityType entityType = QuestsConfig.getQuestEntityTypes().get(ThreadLocalRandom.current().nextInt(QuestsConfig.getQuestEntityTypes().size())); + KillObjective killObjective = new DynamicKillObjective(killAmount, entityType, questLevel); + this.objectives = Collections.singletonList(killObjective); + } + + public void setQuest(Quest quest) { + this.quest = quest; + if (quest instanceof CustomQuest) + this.objectives = CustomObjectivesParser.processCustomObjectives((CustomQuest) quest); + } + + /** + * Returns whether all the objectives have been cleared, meaning that the quest is over + * + * @return + */ + public boolean isOver() { + //used by the force bypass + if (forceOver) return true; + boolean checkOver = true; + for (Objective objective : objectives) { + if (objective == null) { + Logger.warn("Found a null objective for quest " + quest.getQuestName()); + continue; + } + if (!objective.isObjectiveCompleted()) { + checkOver = false; + break; + } + } + return checkOver; + } + + public void updateQuestStatus(UUID playerUUID) { + //This checks if the player managed to try to progress an already over and turned in quest, which would reward them again. + //This would in theory only be possible for quests that display the "completed" status, but should still be inaccessible in theory. + if (turnedIn) return; + if (over) return; + if (!isOver()) return; + over = true; + QuestObjectivesCompletedEvent questObjectivesCompletedEvent = new QuestObjectivesCompletedEvent(Bukkit.getPlayer(playerUUID), quest); + new EventCaller(questObjectivesCompletedEvent); + } + + + public void displayTemporaryObjectivesScoreboard(Player player) { + if (!QuestsConfig.isUseQuestScoreboards()) return; + SimpleScoreboard.temporaryScoreboard(player, ChatColorConverter.convert(getQuest().getQuestName()), getScoreboardObjectiveText(), 20 * 20); + } + + public void displayLazyObjectivesScoreboard(Player player) { + if (!QuestsConfig.isUseQuestScoreboards()) return; + SimpleScoreboard.lazyScoreboard(player, ChatColorConverter.convert(getQuest().getQuestName()), getScoreboardObjectiveText()); + } + + private List getScoreboardObjectiveText() { + List strings = new ArrayList<>(); + if (!isOver()) + for (Objective objective : objectives) + strings.add(QuestsConfig.getQuestScoreboardProgressionLine(objective)); + else { + if (quest.getQuestTaker() == null) return strings; + NPCsConfigFields npCsConfigFields = NPCsConfig.getNpcEntities().get(quest.getQuestTaker()); + if (npCsConfigFields == null) return strings; + strings.add(QuestsConfig.getQuestTurnInObjective().replace("$npcName", npCsConfigFields.getName())); + } + return strings; + } + + +} diff --git a/src/main/java/com/magmaguy/elitemobs/quests/playercooldowns/PlayerQuestCooldowns.java b/src/main/java/com/magmaguy/elitemobs/quests/playercooldowns/PlayerQuestCooldowns.java new file mode 100644 index 000000000..d52b2e98c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/quests/playercooldowns/PlayerQuestCooldowns.java @@ -0,0 +1,98 @@ +package com.magmaguy.elitemobs.quests.playercooldowns; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.customquests.CustomQuestsConfigFields; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.entity.Player; +import org.bukkit.permissions.PermissionAttachment; + +import java.io.Serializable; +import java.util.*; + +public class PlayerQuestCooldowns implements Serializable { + + @Getter + private static final HashSet bypassedPlayers = new HashSet<>(); + @Getter + private final List questCooldowns = new ArrayList<>(); + + /** + * Initializes cooldowns from scratch, assuming no preexisting player data + */ + public PlayerQuestCooldowns() { + //This just initializes the cooldown list + } + + public static void toggleBypass(Player player) { + if (!bypassedPlayers.contains(player)) + bypassedPlayers.add(player); + else + bypassedPlayers.remove(player); + } + + public static boolean bypassesQuestRestrictions(Player player) { + return bypassedPlayers.contains(player); + } + + public static PlayerQuestCooldowns initializePlayer() { + return new PlayerQuestCooldowns(); + } + + public static void resetPlayerQuests(Player player) { + if (PlayerData.getPlayerQuestCooldowns(player.getUniqueId()) == null) return; + PermissionAttachment permissionAttachment = Objects.requireNonNull(player).addAttachment(MetadataHandler.PLUGIN); + PlayerQuestCooldowns playerQuestCooldowns = PlayerData.getPlayerQuestCooldowns(player.getUniqueId()); + for (QuestCooldown questCooldown : playerQuestCooldowns.getQuestCooldowns()) { + if (questCooldown.getBukkitTask() != null) + questCooldown.getBukkitTask().cancel(); + permissionAttachment.setPermission(questCooldown.getPermission(), false); + player.removeMetadata(questCooldown.getPermission(), MetadataHandler.PLUGIN); + } + playerQuestCooldowns.getQuestCooldowns().clear(); + PlayerData.resetQuests(player.getUniqueId()); + PlayerData.resetPlayerQuestCooldowns(player.getUniqueId()); + } + + public static void resetPlayerQuestCooldown(Player player, CustomQuestsConfigFields customQuestsConfigFields) { + if (PlayerData.getPlayerQuestCooldowns(player.getUniqueId()) == null) return; + PermissionAttachment permissionAttachment = Objects.requireNonNull(player).addAttachment(MetadataHandler.PLUGIN); + String lockoutPermission = customQuestsConfigFields.getQuestLockoutPermission(); + if (lockoutPermission == null || lockoutPermission.isEmpty()) return; + PlayerQuestCooldowns playerQuestCooldowns = PlayerData.getPlayerQuestCooldowns(player.getUniqueId()); + for (QuestCooldown questCooldown : playerQuestCooldowns.getQuestCooldowns()) { + if (questCooldown.getPermission().equals(lockoutPermission)) { + if (questCooldown.getBukkitTask() != null) + questCooldown.getBukkitTask().cancel(); + permissionAttachment.setPermission(questCooldown.getPermission(), false); + player.removeMetadata(questCooldown.getPermission(), MetadataHandler.PLUGIN); + } + return; + } + } + + public static void addCooldown(Player player, String permission, int delayInMinutes) { + PlayerQuestCooldowns playerQuestCooldowns = PlayerData.getPlayerQuestCooldowns(player.getUniqueId()); + if (playerQuestCooldowns == null) { + playerQuestCooldowns = new PlayerQuestCooldowns(); + Logger.warn("For some reason the player cooldowns failed to read, warn the dev!", true); + } + playerQuestCooldowns.questCooldowns.add(new QuestCooldown(delayInMinutes, permission, player.getUniqueId())); + PlayerData.updatePlayerQuestCooldowns(player.getUniqueId(), playerQuestCooldowns); + } + + public static void flushPlayer(Player player) { + PlayerQuestCooldowns playerQuestCooldowns = PlayerData.getPlayerQuestCooldowns(player.getUniqueId()); + if (playerQuestCooldowns == null) return; + for (QuestCooldown questCooldown : Objects.requireNonNull(PlayerData.getPlayerQuestCooldowns(player.getUniqueId())).questCooldowns) + if (questCooldown.getBukkitTask() != null) + questCooldown.getBukkitTask().cancel(); + } + + public void startCooldowns(UUID player) { + for (QuestCooldown questCooldown : questCooldowns) + questCooldown.startCooldown(player); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/quests/playercooldowns/PlayerQuestCooldownsLogout.java b/src/main/java/com/magmaguy/elitemobs/quests/playercooldowns/PlayerQuestCooldownsLogout.java new file mode 100644 index 000000000..8df9d1348 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/quests/playercooldowns/PlayerQuestCooldownsLogout.java @@ -0,0 +1,12 @@ +package com.magmaguy.elitemobs.quests.playercooldowns; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; + +public class PlayerQuestCooldownsLogout implements Listener { + @EventHandler + public static void onPlayerLogout(PlayerQuitEvent event) { + PlayerQuestCooldowns.flushPlayer(event.getPlayer()); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/quests/playercooldowns/QuestCooldown.java b/src/main/java/com/magmaguy/elitemobs/quests/playercooldowns/QuestCooldown.java new file mode 100644 index 000000000..922d7452d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/quests/playercooldowns/QuestCooldown.java @@ -0,0 +1,55 @@ +package com.magmaguy.elitemobs.quests.playercooldowns; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.metadata.LazyMetadataValue; +import org.bukkit.permissions.PermissionAttachment; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; + +import java.io.Serializable; +import java.util.Objects; +import java.util.UUID; + +public class QuestCooldown implements Serializable { + @Getter + private final String permission; + private final boolean permanent; + @Getter + private long targetUnixTime = 0; + @Getter + private transient BukkitTask bukkitTask = null; + + public QuestCooldown(int delayInMinutes, String permission, UUID player) { + this.permanent = delayInMinutes < 1; + if (!permanent) + this.targetUnixTime = System.currentTimeMillis() + 60L * 1000 * delayInMinutes; + this.permission = permission; + startCooldown(player); + } + + public void startCooldown(UUID player) { + long delay = Math.max((targetUnixTime - System.currentTimeMillis()) / 1000L * 20L, 0L); + PermissionAttachment permissionAttachment = Objects.requireNonNull(Bukkit.getPlayer(player)).addAttachment(MetadataHandler.PLUGIN); + if (!permanent && delay < 1) { + permissionAttachment.unsetPermission(permission); + return; + } + permissionAttachment.setPermission(permission, true); + Bukkit.getPlayer(player).setMetadata(permission, new LazyMetadataValue(MetadataHandler.PLUGIN, () -> true)); + if (!permanent) + bukkitTask = new BukkitRunnable() { + @Override + public void run() { + if (Bukkit.getPlayer(player) != null) { + permissionAttachment.unsetPermission(permission); + Bukkit.getPlayer(player).removeMetadata(permission, MetadataHandler.PLUGIN); + PlayerData.updatePlayerQuestCooldowns(player, PlayerData.getPlayerQuestCooldowns(player)); + } + } + }.runTaskLater(MetadataHandler.PLUGIN, delay); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/quests/rewards/QuestReward.java b/src/main/java/com/magmaguy/elitemobs/quests/rewards/QuestReward.java new file mode 100644 index 000000000..a0dc829bd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/quests/rewards/QuestReward.java @@ -0,0 +1,52 @@ +package com.magmaguy.elitemobs.quests.rewards; + +import com.magmaguy.elitemobs.config.customquests.CustomQuestsConfigFields; +import com.magmaguy.elitemobs.items.LootTables; +import com.magmaguy.elitemobs.items.customloottable.CustomLootTable; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.elitemobs.quests.objectives.Objective; +import com.magmaguy.elitemobs.quests.objectives.QuestObjectives; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.io.Serializable; +import java.util.UUID; + +public class QuestReward implements Serializable { + + @Getter + private final int rewardLevel; + @Getter + private final UUID playerUUID; + @Getter + private CustomLootTable customLootTable = null; + + public QuestReward(int questLevel, QuestObjectives questObjectives, Player player) { + this.rewardLevel = questLevel * 10; + this.playerUUID = player.getUniqueId(); + int killAmount = questObjectives.getObjectives().stream().mapToInt(Objective::getTargetAmount).sum(); + int baselineReward = (int) (rewardLevel / 2D * killAmount); + customLootTable = new CustomLootTable(); + customLootTable.generateCurrencyEntry(baselineReward); + ItemStack itemReward = LootTables.generateItemStack(Math.min(rewardLevel, PlayerData.getMaxGuildLevel(player.getUniqueId()) * 10), player, null); + customLootTable.generateEliteEntry(itemReward); + } + + /** + * This generates a list of custom quest rewards based on configuration file entries. It uses the following formats: + * Custom Items: filename=X.yml:amount=Y:chance=Z + * Vanilla Items: material=X:amount=Y:chance=Z + */ + public QuestReward(CustomQuestsConfigFields customQuestsConfigFields, Player player) { + this.rewardLevel = customQuestsConfigFields.getQuestLevel() * 10; + this.playerUUID = player.getUniqueId(); + this.customLootTable = new CustomLootTable(customQuestsConfigFields); + } + + public void doRewards() { + customLootTable.questDrop(Bukkit.getPlayer(playerUUID), rewardLevel); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/quests/rewards/RewardEntry.java b/src/main/java/com/magmaguy/elitemobs/quests/rewards/RewardEntry.java new file mode 100644 index 000000000..a7dfb8e6e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/quests/rewards/RewardEntry.java @@ -0,0 +1,80 @@ +package com.magmaguy.elitemobs.quests.rewards; + +import com.magmaguy.elitemobs.adventurersguild.GuildRank; +import com.magmaguy.elitemobs.economy.EconomyHandler; +import com.magmaguy.elitemobs.utils.ObjectSerializer; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.io.Serializable; +import java.util.UUID; +import java.util.concurrent.ThreadLocalRandom; + +public class RewardEntry implements Serializable { + @Getter + private final double chance; + @Getter + private final int amount; + @Getter + private byte[] deserializedCustomItem; + @Getter + private transient ItemStack itemStack; + @Getter + private String deserializedItemStack; + @Getter + private String command; + @Getter + private double currencyAmount = 0; + + public RewardEntry(ItemStack itemStack, double chance, int amount) { + this.itemStack = itemStack; + try { + this.deserializedItemStack = ObjectSerializer.itemStackArrayToBase64(itemStack); + } catch (Exception ex) { + ex.printStackTrace(); + } + + this.chance = chance; + this.amount = amount; + } + + public RewardEntry(String command, double chance, int amount) { + this.command = command; + this.chance = chance; + this.amount = amount; + } + + public RewardEntry(double currencyAmount, double chance, int amount, Player player) { + this.currencyAmount = currencyAmount * GuildRank.currencyBonusMultiplier(player.getUniqueId()); + this.chance = chance; + this.amount = amount; + } + + public void serializeReward() { + if (itemStack == null && deserializedItemStack != null) + try { + this.itemStack = ObjectSerializer.itemStackArrayFromBase64(deserializedItemStack); + } catch (Exception ex) { + Logger.warn("Failed to serialize item stack"); + ex.printStackTrace(); + } + } + + public void doReward(UUID playerUUID) { + //todo: check if quest is limiting loot level as it should + Player player = Bukkit.getPlayer(playerUUID); + if (ThreadLocalRandom.current().nextDouble() < chance) + for (int i = 0; i < amount; i++) + if (itemStack != null) + player.getInventory().addItem(itemStack); + else if (command != null) + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command.replace("$player", player.getName())); + else if (currencyAmount != 0) + EconomyHandler.addCurrency(playerUUID, currencyAmount); + else + Logger.warn("Quest failed to dispatch reward! Report this to the dev!", true); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/runnables/DynamicLoreUpdater.java b/src/main/java/com/magmaguy/elitemobs/runnables/DynamicLoreUpdater.java deleted file mode 100644 index 12c015100..000000000 --- a/src/main/java/com/magmaguy/elitemobs/runnables/DynamicLoreUpdater.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.magmaguy.elitemobs.runnables; - -import com.magmaguy.elitemobs.items.DynamicLore; -import org.bukkit.scheduler.BukkitRunnable; - -public class DynamicLoreUpdater extends BukkitRunnable { - - @Override - public void run() { - - DynamicLore.refreshDynamicLore(); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/runnables/EggRunnable.java b/src/main/java/com/magmaguy/elitemobs/runnables/EggRunnable.java deleted file mode 100644 index 333f571e5..000000000 --- a/src/main/java/com/magmaguy/elitemobs/runnables/EggRunnable.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.magmaguy.elitemobs.runnables; - -import com.magmaguy.elitemobs.mobs.passive.ChickenHandler; -import org.bukkit.scheduler.BukkitRunnable; - -public class EggRunnable extends BukkitRunnable { - - static final ChickenHandler CHICKEN_HANDLER = new ChickenHandler(); - - @Override - public void run() { - - //drops 1 egg for every loaded super chicken - CHICKEN_HANDLER.dropEggs(); - - } -} diff --git a/src/main/java/com/magmaguy/elitemobs/runnables/EntityListUpdater.java b/src/main/java/com/magmaguy/elitemobs/runnables/EntityListUpdater.java deleted file mode 100644 index 0e4a4377b..000000000 --- a/src/main/java/com/magmaguy/elitemobs/runnables/EntityListUpdater.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.magmaguy.elitemobs.runnables; - -public class EntityListUpdater { - -// public static void startUpdating(){ -// -// EntityTracker.checkEntityState(); -// -// } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/runnables/EntityScanner.java b/src/main/java/com/magmaguy/elitemobs/runnables/EntityScanner.java deleted file mode 100644 index 72fec1753..000000000 --- a/src/main/java/com/magmaguy/elitemobs/runnables/EntityScanner.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.magmaguy.elitemobs.runnables; - -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.config.MobCombatSettingsConfig; -import com.magmaguy.elitemobs.config.ValidMobsConfig; -import com.magmaguy.elitemobs.mobscanner.EliteMobScanner; -import com.magmaguy.elitemobs.mobscanner.SuperMobScanner; -import org.bukkit.scheduler.BukkitRunnable; -import org.bukkit.scheduler.BukkitTask; - -public class EntityScanner extends BukkitRunnable { - - @Override - public void run() { - if (ConfigValues.mobCombatSettingsConfig.getBoolean(MobCombatSettingsConfig.AGGRESSIVE_MOB_STACKING)) { - BukkitTask scanElites = new BukkitRunnable() { - @Override - public void run() { - EliteMobScanner.scanElites(); - } - }.runTaskTimer(MetadataHandler.PLUGIN, 20 * 5, 20 * 5); - } - - - if (ConfigValues.validMobsConfig.getBoolean(ValidMobsConfig.ALLOW_PASSIVE_SUPERMOBS)) { - BukkitTask scanSuperMobs = new BukkitRunnable() { - @Override - public void run() { - SuperMobScanner.scanSuperMobs(); - } - }.runTaskTimer(MetadataHandler.PLUGIN, 20 * 12, 20 * 12); - } - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/runnables/PotionEffectApplier.java b/src/main/java/com/magmaguy/elitemobs/runnables/PotionEffectApplier.java deleted file mode 100644 index 103ebb329..000000000 --- a/src/main/java/com/magmaguy/elitemobs/runnables/PotionEffectApplier.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.magmaguy.elitemobs.runnables; - -import org.bukkit.scheduler.BukkitRunnable; - -public class PotionEffectApplier extends BukkitRunnable { - - public static com.magmaguy.elitemobs.items.PotionEffectApplier potionEffectApplier = new com.magmaguy.elitemobs.items.PotionEffectApplier(); - - @Override - public void run() { - - potionEffectApplier.potionEffectApplier(); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/runnables/ReapplyDisplayEffects.java b/src/main/java/com/magmaguy/elitemobs/runnables/ReapplyDisplayEffects.java deleted file mode 100644 index 3ea7b0fd4..000000000 --- a/src/main/java/com/magmaguy/elitemobs/runnables/ReapplyDisplayEffects.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.magmaguy.elitemobs.runnables; - -public class ReapplyDisplayEffects { - -// @Override -// public void run() { -// -// if (livingEntityList.isEmpty()) return; -// -// Iterator iterator = livingEntityList.iterator(); -// -// while (iterator.hasNext()) { -// -// Object currentEntity = iterator.next(); -// -// if (currentEntity == null) { -// -// iterator.remove(); -// -// } else { -// -// LivingEntity iteratedEntity = (LivingEntity) currentEntity; -// -// if (iteratedEntity.isDead() || !iteratedEntity.isValid()) { -// -// iterator.remove(); -// -// } -// -// } -// -// } -// -// for (LivingEntity livingEntity : livingEntityList) { -// if (livingEntity.isValid()) { -// MajorPowerPowerStance majorPowerPowerStance = new MajorPowerPowerStance(); -// majorPowerPowerStance.itemEffect(livingEntity); -// MinorPowerPowerStance minorPowerPowerStance = new MinorPowerPowerStance(); -// minorPowerPowerStance.itemEffect(livingEntity); -// } -// } -// -// } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/runnables/ScoreboardUpdater.java b/src/main/java/com/magmaguy/elitemobs/runnables/ScoreboardUpdater.java deleted file mode 100644 index b5793095d..000000000 --- a/src/main/java/com/magmaguy/elitemobs/runnables/ScoreboardUpdater.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.magmaguy.elitemobs.runnables; - -import com.magmaguy.elitemobs.scoreboard.ScoreboardHandler; -import org.bukkit.scheduler.BukkitRunnable; - -public class ScoreboardUpdater extends BukkitRunnable { - - ScoreboardHandler scoreboardHandler = new ScoreboardHandler(); - - @Override - public void run() { - - scoreboardHandler.scanSight(); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/scoreboard/ScoreboardHandler.java b/src/main/java/com/magmaguy/elitemobs/scoreboard/ScoreboardHandler.java deleted file mode 100644 index b7d118889..000000000 --- a/src/main/java/com/magmaguy/elitemobs/scoreboard/ScoreboardHandler.java +++ /dev/null @@ -1,188 +0,0 @@ -/* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.magmaguy.elitemobs.scoreboard; - -import com.magmaguy.elitemobs.EntityTracker; -import com.magmaguy.elitemobs.MetadataHandler; -import com.magmaguy.elitemobs.config.ConfigValues; -import com.magmaguy.elitemobs.mobconstructor.EliteMobEntity; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.Location; -import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; -import org.bukkit.entity.Player; -import org.bukkit.event.Listener; -import org.bukkit.plugin.Plugin; -import org.bukkit.scoreboard.*; - -import java.util.Collection; -import java.util.HashMap; - -/** - * Created by MagmaGuy on 03/05/2017. - */ -public class ScoreboardHandler implements Listener { - - static HashMap playerHasScoreboard = new HashMap(); - Plugin plugin = Bukkit.getPluginManager().getPlugin(MetadataHandler.ELITE_MOBS); - int processID; - - public void scanSight() { - - for (Player player : Bukkit.getOnlinePlayers()) { - - if (player.hasPermission("elitemobs.scoreboard") && playerHasScoreboard.containsKey(player) && - (Boolean) playerHasScoreboard.get(player) == false || !playerHasScoreboard.containsKey(player) && - player.hasPermission("elitemobs.scoreboard")) { - - Location playerLocation = player.getLocation(); - - Collection nearbyEntities = playerLocation.getWorld().getNearbyEntities(playerLocation, 7, 7, 7); - - for (Entity entity : nearbyEntities) { - - if (EntityTracker.isEliteMob(entity)) { - - aggressiveEliteMobScoreboard(entity, player); - return; - - } else if (EntityTracker.isSuperMob(entity)) { - - aggressiveEliteMobScoreboard(entity, player); - return; - - } - - } - - } - - } - - } - - public void aggressiveEliteMobScoreboard(Entity entity, Player player) { - - EliteMobEntity eliteMobEntity = EntityTracker.getEliteMobEntity(entity); - - processID = Bukkit.getServer().getScheduler().scheduleSyncRepeatingTask(plugin, new Runnable() { - - int iterator = 0; - - public void run() { - - if (!entity.isValid() || player.getWorld() != entity.getWorld() || - player.getLocation().distance(entity.getLocation()) > 7) { - - player.setScoreboard(Bukkit.getScoreboardManager().getNewScoreboard()); - playerHasScoreboard.put(player, false); - Bukkit.getScheduler().cancelTask(processID); - return; - - } - - int powerCounter = eliteMobEntity.getPowers().size(); - - ScoreboardManager scoreboardManager = Bukkit.getScoreboardManager(); - Scoreboard board = scoreboardManager.getNewScoreboard(); - Objective objective = board.registerNewObjective("test", "dummy"); - - objective.setDisplaySlot(DisplaySlot.SIDEBAR); - objective.setDisplayName(entity.getName()); - - - int currentHealth = (int) ((LivingEntity) entity).getHealth(); - int maxHealth = (int) ((LivingEntity) entity).getMaxHealth(); - - int counter = 0; - -// for (String string : MetadataHandler.allPowersList()) { -// -// if (entity.hasMetadata(string)) { -// -// String finalString = MetadataHandler.machineToHumanTranslator(string); -// -// if (powerCounter > 13) { -// -// Score score = null; -// -// if (MetadataHandler.defensivePowerList.contains(string) || MetadataHandler.offensivePowerList.contains(string) || -// MetadataHandler.miscellaneousPowerList.contains(string)) { -// -// score = objective.getScore(ChatColor.AQUA + finalString); -// -// } else if (MetadataHandler.majorPowerList.contains(string)) { -// -// score = objective.getScore(ChatColor.DARK_AQUA + finalString); -// -// } -// -// if (counter + iterator < powerCounter) { -// -// score.setScore(counter + iterator); -// -// } else { -// -// int currentValue = (int) ((counter + iterator) - Math.floor(((counter + iterator) / powerCounter) * powerCounter)); -// -// score.setScore(currentValue); -// -// } -// -// -// } else { -// -// Score score; -// -// if (MetadataHandler.defensivePowerList.contains(string) || MetadataHandler.offensivePowerList.contains(string) || -// MetadataHandler.miscellaneousPowerList.contains(string)) { -// -// score = objective.getScore(ChatColor.AQUA + finalString); -// -// } else { -// -// score = objective.getScore(ChatColor.DARK_AQUA + finalString); -// -// } -// -// score.setScore(counter); -// -// } -// -// counter++; -// -// } -// -// } - - player.setScoreboard(board); - playerHasScoreboard.put(player, true); - - Score healthScore = objective.getScore(String.format("%s%s", ChatColor.DARK_RED, ChatColor.BOLD) + - ConfigValues.translationConfig.getString("ScoreBoard.Health") + ChatColor.RED + currentHealth - + ChatColor.DARK_RED + "/" + ChatColor.RED + maxHealth); - healthScore.setScore(powerCounter); - - iterator++; - - } - - }, 4, 4); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/tagger/PersistentTagger.java b/src/main/java/com/magmaguy/elitemobs/tagger/PersistentTagger.java new file mode 100644 index 000000000..6682ba813 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/tagger/PersistentTagger.java @@ -0,0 +1,102 @@ +package com.magmaguy.elitemobs.tagger; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.npcs.NPCEntity; +import lombok.Getter; +import org.bukkit.NamespacedKey; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Projectile; +import org.bukkit.persistence.PersistentDataType; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; +import java.util.UUID; + +public class PersistentTagger { + @Getter + private static final String ELITE_ENTITY = "EliteEntity"; + @Getter + private static final String NPC_ENTITY = "NPCEntity"; + @Getter + private static final String SUPER_MOB = "SuperMob"; + @Getter + private static final String VISUAL_EFFECT = "VisualEffect"; + @Getter + private static final String ELITE_PROJECTILE = "EliteProjectile"; + + private PersistentTagger() { + } + + public static void tag(@NotNull Entity entity, String key, String value) { + if (entity == null) return; + entity.getPersistentDataContainer().set(new NamespacedKey(MetadataHandler.PLUGIN, key), PersistentDataType.STRING, value); + } + + public static void tagElite(Entity entity, @NotNull UUID eliteUUID) { + tag(entity, ELITE_ENTITY, eliteUUID.toString()); + } + + public static boolean isEliteEntity(Entity entity) { + if (entity == null) return false; + return entity.getPersistentDataContainer().has(new NamespacedKey(MetadataHandler.PLUGIN, ELITE_ENTITY), PersistentDataType.STRING); + } + + public static EliteEntity getEliteEntity(Entity entity) { + UUID uuid = getUUID(entity, ELITE_ENTITY); + if (uuid == null) return null; + return EntityTracker.getEliteMobEntities().get(uuid); + } + + public static void tagNPC(Entity entity, @NotNull UUID npcUUID) { + tag(entity, NPC_ENTITY, npcUUID.toString()); + } + + public static boolean isNPC(Entity entity) { + if (entity == null) return false; + return entity.getPersistentDataContainer().has(new NamespacedKey(MetadataHandler.PLUGIN, NPC_ENTITY), PersistentDataType.STRING); + } + + public static NPCEntity getNPC(Entity entity) { + UUID uuid = getUUID(entity, NPC_ENTITY); + if (uuid == null) return null; + return EntityTracker.getNpcEntities().get(uuid); + } + + public static void tagSuperMob(Entity entity) { + tag(entity, SUPER_MOB, entity.getType().toString()); + } + + public static boolean isSuperMob(Entity entity) { + if (entity == null) return false; + return entity.getPersistentDataContainer().has(new NamespacedKey(MetadataHandler.PLUGIN, SUPER_MOB), PersistentDataType.STRING); + } + + public static void tagVisualEffect(Entity entity) { + tag(entity, VISUAL_EFFECT, entity.getType().toString()); + } + + public static boolean isVisualEffect(Entity entity) { + if (entity == null) return false; + return entity.getPersistentDataContainer().has(new NamespacedKey(MetadataHandler.PLUGIN, VISUAL_EFFECT), PersistentDataType.STRING); + } + + public static void tagEliteProjectile(Projectile projectile) { + tag(projectile, ELITE_PROJECTILE, ""); + } + + public static boolean isEliteProjectile(Entity entity) { + if (entity == null) return false; + return entity.getPersistentDataContainer().has(new NamespacedKey(MetadataHandler.PLUGIN, ELITE_PROJECTILE), PersistentDataType.STRING); + } + + @Nullable + public static UUID getUUID(Entity entity, String key) { + if (entity == null) return null; + String uuidString = entity.getPersistentDataContainer().get(new NamespacedKey(MetadataHandler.PLUGIN, key), PersistentDataType.STRING); + if (uuidString == null) return null; + return UUID.fromString(uuidString); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/thirdparty/bstats/CustomCharts.java b/src/main/java/com/magmaguy/elitemobs/thirdparty/bstats/CustomCharts.java new file mode 100644 index 000000000..3975b1369 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/thirdparty/bstats/CustomCharts.java @@ -0,0 +1,25 @@ +package com.magmaguy.elitemobs.thirdparty.bstats; + +import com.magmaguy.elitemobs.EliteMobs; +import com.magmaguy.elitemobs.dungeons.EMPackage; +import org.bstats.bukkit.Metrics; +import org.bstats.charts.AdvancedPie; +import org.bukkit.ChatColor; + +import java.util.HashMap; +import java.util.Map; + +public class CustomCharts { + public CustomCharts() { + Metrics metrics = EliteMobs.metrics; + metrics.addCustomChart(new AdvancedPie("minidungeons", () -> { + Map valueMap = new HashMap<>(); + for (EMPackage emPackage : EMPackage.getEmPackages().values()) { + valueMap.put( + ChatColor.stripColor(emPackage.getDungeonPackagerConfigFields().getFilename()), + emPackage.isInstalled() ? 1 : 0); + } + return valueMap; + })); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/thirdparty/custommodels/CustomModel.java b/src/main/java/com/magmaguy/elitemobs/thirdparty/custommodels/CustomModel.java new file mode 100644 index 000000000..33b7f4250 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/thirdparty/custommodels/CustomModel.java @@ -0,0 +1,160 @@ +package com.magmaguy.elitemobs.thirdparty.custommodels; + +import com.magmaguy.elitemobs.api.EliteMobDeathEvent; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.thirdparty.custommodels.freeminecraftmodels.CustomModelFMM; +import com.magmaguy.elitemobs.thirdparty.custommodels.modelengine.CustomModelMEG; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Projectile; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntitySpawnEvent; + + +public class CustomModel implements CustomModelInterface { + @Getter + private static final boolean usingModels = false; + @Getter + private static ModelPlugin modelPlugin; + private CustomModelMEG customModelMEG; + private CustomModelFMM customModelFMM; + private boolean initialized = false; + + private CustomModel(LivingEntity livingEntity, String modelName, String nametagName) { + switch (modelPlugin) { + case FREE_MINECRAFT_MODELS: + customModelFMM = new CustomModelFMM(livingEntity, modelName, nametagName); + initialized = true; + break; + case MODEL_ENGINE: + customModelMEG = new CustomModelMEG(livingEntity, modelName, nametagName); + initialized = true; + break; + } + } + + public static void initialize() { + if (Bukkit.getPluginManager().isPluginEnabled("FreeMinecraftModels")) + modelPlugin = ModelPlugin.FREE_MINECRAFT_MODELS; + else if (Bukkit.getPluginManager().isPluginEnabled("ModelEngine") && Bukkit.getPluginManager().getPlugin("ModelEngine").getDescription().getVersion().contains("R3")) + modelPlugin = ModelPlugin.MODEL_ENGINE; + else modelPlugin = ModelPlugin.NONE; + } + + public static void reloadModels() { + switch (modelPlugin) { + case FREE_MINECRAFT_MODELS -> CustomModelFMM.reloadModels(); + case MODEL_ENGINE -> CustomModelMEG.reloadModels(); + } + } + + public static boolean modelExists(String modelName) { + switch (modelPlugin) { + case FREE_MINECRAFT_MODELS: + return CustomModelFMM.modelExists(modelName); + case MODEL_ENGINE: + return CustomModelMEG.modelExists(modelName); + } + return false; + } + + public static CustomModel generateCustomModel(LivingEntity livingEntity, String modelName, String nametagName) { + CustomModel customModel = new CustomModel(livingEntity, modelName, nametagName); + return customModel.initialized ? customModel : null; + } + + public static boolean customModelsEnabled() { + return modelPlugin != ModelPlugin.NONE; + } + + @Override + public void shoot() { + switch (modelPlugin) { + case FREE_MINECRAFT_MODELS -> customModelFMM.shoot(); + case MODEL_ENGINE -> customModelMEG.shoot(); + } + } + + @Override + public void melee() { + switch (modelPlugin) { + case FREE_MINECRAFT_MODELS -> customModelFMM.melee(); + case MODEL_ENGINE -> customModelMEG.melee(); + } + } + + @Override + public void playAnimationByName(String animationName) { + switch (modelPlugin) { + case FREE_MINECRAFT_MODELS -> customModelFMM.playAnimationByName(animationName); + case MODEL_ENGINE -> customModelMEG.playAnimationByName(animationName); + } + } + + @Override + public void setName(String nametagName, boolean visible) { + switch (modelPlugin) { + case FREE_MINECRAFT_MODELS -> customModelFMM.setName(nametagName, visible); + case MODEL_ENGINE -> customModelMEG.setName(nametagName, visible); + } + } + + @Override + public void setNameVisible(boolean visible) { + switch (modelPlugin) { + case FREE_MINECRAFT_MODELS -> customModelFMM.setNameVisible(visible); + case MODEL_ENGINE -> customModelMEG.setNameVisible(visible); + } + } + + @Override + public void addPassenger(CustomBossEntity passenger) { + switch (modelPlugin) { + case FREE_MINECRAFT_MODELS -> customModelFMM.addPassenger(passenger); + case MODEL_ENGINE -> customModelMEG.addPassenger(passenger); + } + } + + @Override + public void switchPhase() { + switch (modelPlugin) { + case FREE_MINECRAFT_MODELS -> customModelFMM.switchPhase(); + case MODEL_ENGINE -> customModelMEG.switchPhase(); + } + } + + public enum ModelPlugin { + NONE, FREE_MINECRAFT_MODELS, MODEL_ENGINE + } + + public static class ModelEntityEvents implements Listener { + @EventHandler(ignoreCancelled = true) + public void onMeleeHit(EntityDamageByEntityEvent event) { + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(event.getDamager()); + if (!(eliteEntity instanceof CustomBossEntity)) return; + if (((CustomBossEntity) eliteEntity).getCustomModel() == null) return; + ((CustomBossEntity) eliteEntity).getCustomModel().melee(); + } + + @EventHandler(ignoreCancelled = true) + public void onRangedShot(EntitySpawnEvent event) { + if (!(event.getEntity() instanceof Projectile)) return; + if (!(((Projectile) event.getEntity()).getShooter() instanceof LivingEntity)) return; + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity((LivingEntity) ((Projectile) event.getEntity()).getShooter()); + if (!(eliteEntity instanceof CustomBossEntity)) return; + if (((CustomBossEntity) eliteEntity).getCustomModel() == null) return; + ((CustomBossEntity) eliteEntity).getCustomModel().shoot(); + } + + @EventHandler + public void onDeathEvent(EliteMobDeathEvent event) { + if (event.getEliteEntity() instanceof CustomBossEntity customBossEntity && customBossEntity.getCustomModel() != null) + customBossEntity.getCustomModel().playAnimationByName("death"); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/thirdparty/custommodels/CustomModelInterface.java b/src/main/java/com/magmaguy/elitemobs/thirdparty/custommodels/CustomModelInterface.java new file mode 100644 index 000000000..e2c1da363 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/thirdparty/custommodels/CustomModelInterface.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.thirdparty.custommodels; + +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; + +public interface CustomModelInterface { + void shoot(); + + void melee(); + + void playAnimationByName(String animationName); + + void setName(String nametagName, boolean visible); + + void setNameVisible(boolean visible); + + void addPassenger(CustomBossEntity passenger); + + void switchPhase(); +} diff --git a/src/main/java/com/magmaguy/elitemobs/thirdparty/custommodels/freeminecraftmodels/CustomModelFMM.java b/src/main/java/com/magmaguy/elitemobs/thirdparty/custommodels/freeminecraftmodels/CustomModelFMM.java new file mode 100644 index 000000000..173f46be5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/thirdparty/custommodels/freeminecraftmodels/CustomModelFMM.java @@ -0,0 +1,65 @@ +package com.magmaguy.elitemobs.thirdparty.custommodels.freeminecraftmodels; + +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.thirdparty.custommodels.CustomModelInterface; +import com.magmaguy.freeminecraftmodels.api.ModeledEntityManager; +import com.magmaguy.freeminecraftmodels.customentity.DynamicEntity; +import lombok.Getter; +import org.bukkit.entity.LivingEntity; + +public class CustomModelFMM implements CustomModelInterface { + @Getter + private final DynamicEntity dynamicEntity; + + public CustomModelFMM(LivingEntity livingEntity, String modelName, String nametagName) { + dynamicEntity = DynamicEntity.create(modelName, livingEntity); + if (dynamicEntity == null) return; + dynamicEntity.setName(nametagName); + } + + public static void reloadModels() { + ModeledEntityManager.reload(); + } + + public static boolean modelExists(String modelName) { + return ModeledEntityManager.modelExists(modelName); + } + + @Override + public void shoot() { + if (dynamicEntity.hasAnimation("attack_ranged")) dynamicEntity.playAnimation("attack_ranged", false); + else dynamicEntity.playAnimation("attack", false); + } + + @Override + public void melee() { + if (dynamicEntity.hasAnimation("attack_melee")) dynamicEntity.playAnimation("attack_melee", false); + else dynamicEntity.playAnimation("attack", false); + } + + @Override + public void playAnimationByName(String animationName) { + dynamicEntity.playAnimation(animationName, false); + } + + @Override + public void setName(String nametagName, boolean visible) { + dynamicEntity.setName(nametagName); + dynamicEntity.setNameVisible(visible); + } + + @Override + public void setNameVisible(boolean visible) { + dynamicEntity.setNameVisible(visible); + } + + @Override + public void addPassenger(CustomBossEntity passenger) { + //currently unimplemented + } + + @Override + public void switchPhase() { + dynamicEntity.stopCurrentAnimations(); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/thirdparty/custommodels/modelengine/CustomModelMEG.java b/src/main/java/com/magmaguy/elitemobs/thirdparty/custommodels/modelengine/CustomModelMEG.java new file mode 100644 index 000000000..0fac1c220 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/thirdparty/custommodels/modelengine/CustomModelMEG.java @@ -0,0 +1,157 @@ +package com.magmaguy.elitemobs.thirdparty.custommodels.modelengine; + +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.thirdparty.custommodels.CustomModelInterface; +import com.magmaguy.magmacore.util.Logger; +import com.ticxo.modelengine.api.ModelEngineAPI; +import com.ticxo.modelengine.api.animation.state.ModelState; +import com.ticxo.modelengine.api.generator.model.ModelBlueprint; +import com.ticxo.modelengine.api.model.ActiveModel; +import com.ticxo.modelengine.api.model.ModeledEntity; +import com.ticxo.modelengine.api.model.bone.Nameable; +import lombok.Getter; +import org.bukkit.entity.LivingEntity; + +public class CustomModelMEG implements CustomModelInterface { + + ActiveModel activeModel; + ModeledEntity modeledEntity; + + ModelBlueprint modelBlueprint; + + @Getter + private boolean success = false; + + public CustomModelMEG(LivingEntity livingEntity, String modelName, String nametagName) { + try { + if (ModelEngineAPI.api.getModelRegistry().getBlueprint(modelName) == null) { + Logger.info("Model " + modelName + " was not found! Make sure you install the model correctly if you have it. This entry will be skipped!"); + return; + } + } catch (NoSuchMethodError ex) { + Logger.warn("Model Engine API version is not supported. Currently Elitemobs can only support ModelEngine R3.0.0."); + return; + } + + modelBlueprint = ModelEngineAPI.api.getModelRegistry().getBlueprint(modelName); + + activeModel = ModelEngineAPI.createActiveModel(modelBlueprint); + + if (activeModel == null) { + Logger.warn("Failed to load model from " + modelName + " ! Is the model name correct, and has the model been installed correctly?"); + return; + } + + modeledEntity = ModelEngineAPI.createModeledEntity(livingEntity); + + if (modeledEntity == null) { + Logger.warn("Failed to create model entity " + modelName + " ! This means the entity that was meant to get disguised has a problem!"); + return; + } + + try { + modeledEntity.addModel(activeModel, true); + activeModel.playDefaultAnimation(ModelState.IDLE); + modeledEntity.setBaseEntityVisible(false); + setName(nametagName, true); + success = true; + } catch (Exception exception) { + modeledEntity.removeModel(modelName); + Logger.warn("Failed to make model entity " + modelName + " ! Couldn't assign model or visibility status."); + exception.printStackTrace(); + } + + } + + public static CustomModelMEG generateCustomModel(LivingEntity livingEntity, String modelName, String nametagName) { + CustomModelMEG customModel = new CustomModelMEG(livingEntity, modelName, nametagName); + return customModel.isSuccess() ? customModel : null; + } + + public static void reloadModels() { + try { + ModelEngineAPI.api.getGenerator().importModelsAsync(); + } catch (Exception ex) { + Logger.warn("Model Engine API version is not supported. Currently Elitemobs can only support ModelEngine R3.0.0."); + } + } + + public static boolean modelExists(String modelName) { + if (modelName == null || modelName.isEmpty()) return false; + try { + if (ModelEngineAPI.api.getModelRegistry().getBlueprint(modelName) == null) { + Logger.info("Model " + modelName + " was not found! Make sure you install the model correctly if you have it. This entry will be skipped!"); + return false; + } + } catch (NoSuchMethodError ex) { + Logger.warn("Model Engine API version is not supported. Currently Elitemobs can only support ModelEngine R3.0.0, documentation for other versions doesn't exist."); + return false; + } + + return true; + } + + public void shoot() { + if (activeModel == null) return; + if (modelBlueprint.getAnimations().containsKey("attack_ranged")) + activeModel.getAnimationHandler().playAnimation("attack_ranged", .1, .1, 1, true); + else + activeModel.getAnimationHandler().playAnimation("attack", .1, .1, 1, true); + } + + public void melee() { + if (activeModel == null) return; + if (modelBlueprint.getAnimations().containsKey("attack_melee")) + activeModel.getAnimationHandler().playAnimation("attack_melee", .1, .1, 1, true); + else + activeModel.getAnimationHandler().playAnimation("attack", .1, .1, 1, true); + } + + public void playAnimationByName(String string) { + if (activeModel == null) return; + if (!modelBlueprint.getAnimations().containsKey(string)) return; + activeModel.getAnimationHandler().playAnimation(string, .1, .1, 1, true); + } + + @Override + public void setName(String nametagName, boolean visible) { + if (modeledEntity == null) return; + Nameable nametag = getNameableBone(); + if (nametag == null) { + Logger.warn("Failed to get hitbox nametag for disguise!"); + return; + } + nametag.setCustomName(nametagName); + nametag.setCustomNameVisible(visible); + } + + public void setNameVisible(boolean visible) { + Nameable nametag = getNameableBone(); + if (nametag == null) { + return; + } + nametag.setCustomNameVisible(visible); + } + + private Nameable getNameableBone() { + for (Nameable nameable : activeModel.getNametagHandler().getBones().values()) return nameable; + return null; + } + + public void addPassenger(CustomBossEntity passenger) { + if (passenger.getCustomBossesConfigFields().getCustomModelMountPointID() == null) { + Logger.warn("Attempted to add " + passenger.getCustomBossesConfigFields().getFilename() + " as a mounted entity for a custom model but it does not have customModelMountPointID set! The boss can't guess where it needs to be mounted, and therefore this will not work."); + return; + } + modeledEntity.getMountManager().addPassengerToSeat( + modelBlueprint.getModelId(), + passenger.getCustomBossesConfigFields().getCustomModelMountPointID(), + passenger.getLivingEntity(), + modeledEntity.getMountManager().getDriverController()); + } + + public void switchPhase() { + activeModel.getAnimationHandler().forceStopAllAnimations(); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/thirdparty/custommodels/modelengine/ModelEngineReservedAddresses.java b/src/main/java/com/magmaguy/elitemobs/thirdparty/custommodels/modelengine/ModelEngineReservedAddresses.java new file mode 100644 index 000000000..556bc7a8c --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/thirdparty/custommodels/modelengine/ModelEngineReservedAddresses.java @@ -0,0 +1,42 @@ +package com.magmaguy.elitemobs.thirdparty.custommodels.modelengine; + +import com.magmaguy.elitemobs.MetadataHandler; +import org.bukkit.Bukkit; + +import java.io.File; +import java.nio.file.Path; +import java.nio.file.Paths; + +public class ModelEngineReservedAddresses { + /** + * This method reserves ModelEngine IDs for use with the resource pack distributed by EliteMobs. + * By default, ModelEngine increments the ID of anything in directories by 1000, and anything inside of that directory + * inherits and increments this value. + * That means that if you have 3 folders, the first folder starts counting at 1000, the second at 2000 and the third at 3000. + * These are reserved slots, so they are not offset by anything other than folders. + * This is required because ModelEngine assigns IDs based on the files it reads on boot in alphabetical order. This + * also means that if you have more - or less - than the entirety of the content expected by ModelEngine in your + * resource pack, it will simply not work. + * By reserving specific addresses ahead of time the EliteMobs resource pack can distribute valid coordinates and + * textures for all models and servers can pick which packs they want to use without causing issues. + * This also means that all EliteMobs reservations must be made in the form of valid directories. + * For future and backward compatibility reasons, EliteMobs folders for ModelEngine follow the format em_NUMBER_NAME + * where NUMBER is the number of the resource pack, in release order (guarantees a consistent alphabetical read order) + * and the NAME is the identifier for that specific package. For Primis, this would be em_1_primis. For the goblins, it's em_2_goblins. + */ + public static void reserve() { + //Nothing gets reserved if ModelEngine isn't installed + if (!Bukkit.getPluginManager().isPluginEnabled("ModelEngine")) return; + Path modelEngineBlueprintsPath = Paths.get(MetadataHandler.PLUGIN.getDataFolder().getParentFile().getAbsolutePath() + File.separatorChar + "ModelEngine" + File.separatorChar + "blueprints"); + //These are hardcoded and kept updated with releases. No two ways about it! + makeDirectory(modelEngineBlueprintsPath, "em_1_primis"); + makeDirectory(modelEngineBlueprintsPath, "em_2_goblins"); + } + + private static void makeDirectory(Path originalPath, String directory) { + Path primisPath = Paths.get(originalPath.toString() + File.separatorChar + directory); + if (!primisPath.toFile().exists()) + primisPath.toFile().mkdir(); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/thirdparty/discordsrv/DiscordSRVAnnouncement.java b/src/main/java/com/magmaguy/elitemobs/thirdparty/discordsrv/DiscordSRVAnnouncement.java new file mode 100644 index 000000000..658bb71c1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/thirdparty/discordsrv/DiscordSRVAnnouncement.java @@ -0,0 +1,50 @@ +package com.magmaguy.elitemobs.thirdparty.discordsrv; + +import com.magmaguy.elitemobs.config.DiscordSRVConfig; +import com.magmaguy.magmacore.util.Logger; +import github.scarsz.discordsrv.DiscordSRV; +import github.scarsz.discordsrv.dependencies.jda.api.entities.TextChannel; +import github.scarsz.discordsrv.util.DiscordUtil; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; + +public class DiscordSRVAnnouncement { + + private static TextChannel textChannel = null; + private static boolean isInitialized = false; + + public DiscordSRVAnnouncement(String announcement) { + + if (Bukkit.getPluginManager().getPlugin("DiscordSRV") == null) return; + if (DiscordSRVConfig.getAnnouncementRoomName().equals("YOU_NEED_TO_PUT_THE_NAME_OF_THE_DISCORD_ROOM_YOU_WANT_ELITEMOBS" + + "_ANNOUNCEMENTS_TO_BE_BROADCASTED_IN_AS_YOU_HAVE_IN_YOUR_DISCORDSRV_CONFIGURATION_FILE_CHECK_ELITEMOBS_WIKI_FOR_DETAILS")) + return; + + try { + //Initialize which room will be used regardless of whether it's using config name, id or discord room name + if (!isInitialized) { + if (textChannel == null) + textChannel = DiscordUtil.getTextChannelById(DiscordSRVConfig.getAnnouncementRoomName()); + + if (textChannel == null) + textChannel = DiscordSRV.getPlugin().getDestinationTextChannelForGameChannelName(DiscordSRVConfig.getAnnouncementRoomName()); + + if (textChannel == null && !DiscordUtil.getJda().getTextChannelsByName(DiscordSRVConfig.getAnnouncementRoomName(), true).isEmpty()) + textChannel = DiscordUtil.getJda().getTextChannelsByName(DiscordSRVConfig.getAnnouncementRoomName(), true).get(0); + + isInitialized = true; + } + + if (textChannel != null) + textChannel.sendMessage(ChatColor.stripColor(announcement)).queue(); + else + Logger.warn("Channel room " + DiscordSRVConfig.getAnnouncementRoomName() + " is not valid!"); + + } catch (Exception ex) { + Logger.warn("Failed to send announcement via DiscordsSRV! Is it configured correctly?"); + } + + } + + +} diff --git a/src/main/java/com/magmaguy/elitemobs/thirdparty/geyser/GeyserDetector.java b/src/main/java/com/magmaguy/elitemobs/thirdparty/geyser/GeyserDetector.java new file mode 100644 index 000000000..43292e35e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/thirdparty/geyser/GeyserDetector.java @@ -0,0 +1,12 @@ +package com.magmaguy.elitemobs.thirdparty.geyser; + +import org.bukkit.entity.Player; + +public class GeyserDetector { + + public static boolean bedrockPlayer(Player player) { + //This is where I would detect if this is a bedrock player if Geyser didn't require 1.16 and actually had an all-in-one way of letting me know if it's a bedrock client + //maintained because hope is the last one to die, will be replaced with something that works... some day + return false; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/thirdparty/libsdisguises/DisguiseEntity.java b/src/main/java/com/magmaguy/elitemobs/thirdparty/libsdisguises/DisguiseEntity.java new file mode 100644 index 000000000..9e030fd0e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/thirdparty/libsdisguises/DisguiseEntity.java @@ -0,0 +1,140 @@ +package com.magmaguy.elitemobs.thirdparty.libsdisguises; + +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.magmacore.util.Logger; +import me.libraryaddict.disguise.DisguiseAPI; +import me.libraryaddict.disguise.disguisetypes.*; +import org.bukkit.Bukkit; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; + +public class DisguiseEntity { + + public static void initialize() { +// DisguiseConfig.setPlayerNameType(DisguiseConfig.PlayerNameType.ARMORSTANDS); + } + + /** + * This method disguises the entity based on a config entry. It should be invoked after checking if libsdisguises + * is in the server. + * + * @param disguiseName Raw name following config format + */ + public static void disguise(String disguiseName, Entity entity, String customDisguiseData, String filename) { + + if (disguiseName.contains("player:")) { + playerDisguise(disguiseName.replace("player:", ""), entity); + return; + } + + if (disguiseName.contains("custom")) { + try { + customDisguise(disguiseName.replace("custom:", ""), entity, customDisguiseData, filename); + } catch (Exception ex) { + Logger.warn("Failed to assign custom disguise " + disguiseName + "! Did you configure the disguise correctly?"); + } + return; + } + + + boolean baby = false; + if (disguiseName.contains(":baby")) { + disguiseName = disguiseName.replace(":baby", ""); + baby = true; + } + + DisguiseType disguiseType; + + try { + disguiseType = DisguiseType.valueOf(disguiseName); + } catch (Exception ex) { + Logger.warn("Disguise " + disguiseName + " is not a valid disguise name! Entity " + entity.getCustomName() + " will not have a disguise."); + return; + } + + if (disguiseType.isMob()) + livingEntityDisguise(disguiseType, entity, baby); + else if (disguiseType.isMisc()) + miscEntityDisguise(disguiseType, entity); + else + Logger.warn("Disguise " + disguiseName + " is not a valid disguise name! Entity " + entity.getCustomName() + " will not have a disguise."); + } + + private static void playerDisguise(String playerName, Entity entity) { + PlayerDisguise playerDisguise = new PlayerDisguise(playerName); + playerDisguise.setEntity(entity); + playerDisguise.setName(entity.getCustomName()); + playerDisguise.setNameVisible(true); //libs really doesn't like dynamic name displays + //playerDisguise.setNameVisible(DefaultConfig.isAlwaysShowNametags() || entity.getType().equals(EntityType.VILLAGER)); + playerDisguise.setDynamicName(true); + playerDisguise.startDisguise(); + } + + private static void livingEntityDisguise(DisguiseType disguiseType, Entity entity, boolean baby) { + MobDisguise mobDisguise = new MobDisguise(disguiseType, !baby); + mobDisguise.setEntity(entity); + mobDisguise.setDisguiseName(entity.getCustomName()); + mobDisguise.setDynamicName(true); + mobDisguise.startDisguise(); + } + + private static void miscEntityDisguise(DisguiseType disguiseType, Entity entity) { + MiscDisguise miscDisguise = new MiscDisguise(disguiseType); + miscDisguise.setDisguiseName(entity.getCustomName()); + miscDisguise.setDynamicName(true); + miscDisguise.setEntity(entity); + miscDisguise.startDisguise(); + } + + private static void customDisguise(String customDisguise, Entity entity, String customDisguiseData, String filename) { + Disguise disguise = DisguiseAPI.getCustomDisguise(customDisguise); + try { + if (disguise == null) + if (customDisguiseData != null) { + DisguiseAPI.addCustomDisguise(customDisguise, customDisguiseData); + disguise = DisguiseAPI.getCustomDisguise(customDisguise); + } + if (disguise == null) + throw new NullPointerException(); + disguise.setEntity(entity); + disguise.setDisguiseName(entity.getCustomName()); + disguise.setDynamicName(true); + if ((DefaultConfig.isAlwaysShowNametags() || entity.getType().equals(EntityType.VILLAGER)) + && disguise instanceof PlayerDisguise) { + ((PlayerDisguise) disguise).setNameVisible(true); + } else if (disguise instanceof PlayerDisguise) { + ((PlayerDisguise) disguise).setNameVisible(false); + } + disguise.startDisguise(); + } catch (Exception ex) { + Logger.warn("Failed to set custom disguise for " + filename + " !"); + Logger.warn("Does the disguise exist? Is LibsDisguises up-to-date?"); + } + } + + public static void setDisguiseNameVisibility(boolean disguiseNameVisibility, Entity entity, String name) { + if (!Bukkit.getPluginManager().isPluginEnabled("LibsDisguises")) return; + Disguise disguise = DisguiseAPI.getDisguise(entity); + if (disguise == null) return; + if (disguise instanceof PlayerDisguise) { + /* + Currently broken, waiting for libs to fix it + if (disguiseNameVisibility) { + entity.setCustomName(name); + disguise.setDisguiseName(name); + disguise.setDynamicName(true); + } + */ + //((PlayerDisguise) disguise).setNameVisible(disguiseNameVisibility); + ((PlayerDisguise) disguise).setNameVisible(true); + } + //todo: This doesn't work yes, check with libs later to see if he found a solution + /* + if (!(disguise.getWatcher() instanceof PlayerWatcher)) return; + PlayerWatcher playerWatcher = (PlayerWatcher) disguise.getWatcher(); + playerWatcher.setNameVisible(disguiseNameVisibility); + playerWatcher.setCustomNameVisible(disguiseNameVisibility); + */ + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/thirdparty/mythicmobs/MythicMobs.java b/src/main/java/com/magmaguy/elitemobs/thirdparty/mythicmobs/MythicMobs.java new file mode 100644 index 000000000..95638a510 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/thirdparty/mythicmobs/MythicMobs.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.thirdparty.mythicmobs; + + +import io.lumine.mythic.api.mobs.MythicMob; +import io.lumine.mythic.bukkit.BukkitAdapter; +import io.lumine.mythic.bukkit.MythicBukkit; +import io.lumine.mythic.core.mobs.ActiveMob; +import org.bukkit.Location; +import org.bukkit.entity.Entity; + +public class MythicMobs { + public static Entity spawn(Location location, String name, int level) { + MythicMob mythicMob = MythicBukkit.inst().getMobManager().getMythicMob(name).orElse(null); + if (mythicMob != null) { + ActiveMob activeMob = mythicMob.spawn(BukkitAdapter.adapt(location), level); + return activeMob.getEntity().getBukkitEntity(); + } + return null; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/thirdparty/mythicmobs/MythicMobsInterface.java b/src/main/java/com/magmaguy/elitemobs/thirdparty/mythicmobs/MythicMobsInterface.java new file mode 100644 index 000000000..c9e51aea9 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/thirdparty/mythicmobs/MythicMobsInterface.java @@ -0,0 +1,12 @@ +package com.magmaguy.elitemobs.thirdparty.mythicmobs; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Entity; + +public class MythicMobsInterface { + public static Entity spawn(Location location, String name, int level) { + if (!Bukkit.getPluginManager().isPluginEnabled("MythicMobs")) return null; + return MythicMobs.spawn(location, name, level); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/thirdparty/paper/PaperMC.java b/src/main/java/com/magmaguy/elitemobs/thirdparty/paper/PaperMC.java new file mode 100644 index 000000000..650ed5161 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/thirdparty/paper/PaperMC.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.thirdparty.paper; + +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.entity.Player; + +public class PaperMC { + @Getter + private static boolean paperMC = false; + + public static void initialize() { + try { + paperMC = Class.forName("com.destroystokyo.paper.VersionHistoryManager$VersionData") != null; + } catch (ClassNotFoundException e) { + Logger.info("Not paper"); + } + } + + public static boolean checkClient(Player player) { + + return true; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/thirdparty/placeholderapi/Placeholders.java b/src/main/java/com/magmaguy/elitemobs/thirdparty/placeholderapi/Placeholders.java new file mode 100644 index 000000000..530501678 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/thirdparty/placeholderapi/Placeholders.java @@ -0,0 +1,152 @@ +package com.magmaguy.elitemobs.thirdparty.placeholderapi; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.adventurersguild.GuildRank; +import com.magmaguy.elitemobs.config.AdventurersGuildConfig; +import com.magmaguy.elitemobs.economy.EconomyHandler; +import com.magmaguy.elitemobs.playerdata.ElitePlayerInventory; +import com.magmaguy.elitemobs.playerdata.database.PlayerData; +import com.magmaguy.magmacore.util.Round; +import me.clip.placeholderapi.expansion.PlaceholderExpansion; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + +public class Placeholders extends PlaceholderExpansion { + + /** + * Because this is an internal class, + * you must override this method to let PlaceholderAPI know to not unregister your expansion class when + * PlaceholderAPI is reloaded + * + * @return true to persist through reloads + */ + @Override + public boolean persist() { + return true; + } + + /** + * Because this is a internal class, this check is not needed + * and we can simply return {@code true} + * + * @return Always true since it's an internal class. + */ + @Override + public boolean canRegister() { + return true; + } + + /** + * The name of the person who created this expansion should go here. + *
For convienience do we return the author from the plugin.yml + * + * @return The name of the author as a String. + */ + @Override + public String getAuthor() { + return MetadataHandler.PLUGIN.getDescription().getAuthors().toString(); + } + + /** + * The placeholder identifier should go here. + *
This is what tells PlaceholderAPI to call our onRequest + * method to obtain a value if a placeholder starts with our + * identifier. + *
This must be unique and can not contain % or _ + * + * @return The identifier in {@code %_%} as String. + */ + @Override + public String getIdentifier() { + return "elitemobs"; + } + + /** + * This is the version of the expansion. + *
You don't have to use numbers, since it is set as a String. + *

+ * For convienience do we return the version from the plugin.yml + * + * @return The version as a String. + */ + @Override + public String getVersion() { + return MetadataHandler.PLUGIN.getDescription().getVersion(); + } + + /** + * This is the method called when a placeholder with our identifier + * is found and needs a value. + *
We specify the value identifier in this method. + *
Since version 2.9.1 can you use OfflinePlayers in your requests. + * + * @param player A {@link org.bukkit.OfflinePlayer Player}. + * @param identifier A String containing the identifier/value. + * @return possibly-null String of the requested identifier. + */ + @Override + public String onPlaceholderRequest(Player player, String identifier) { + + if (player == null) + return "Only online players!"; + + /* + There is a weird bug with PAPI where, under certain circumstances, it seems to fail to see cached values and + queries the database. This is usually fine for something like chat, but it quickly becomes a massive issue for + tablists, scoreboards and other places that might display several placeholders simultaneously and update them + every tick, quickly racking up hundreds or thousands of queries per tick, on top of the normal runtime accesses + that EliteMobs does. At scale, this causes large issues. Hence, at least for now, PAPI does not have access to the + databases for safety purposes. All of the queries should be in memory regardless. + */ + + if (!PlayerData.isInMemory(player.getUniqueId()) || PlayerData.getPlayerData(player.getUniqueId()) == null) + return "Uninitialized player data!"; + + switch (identifier) { + case "player_combat_tier": + return "" + ElitePlayerInventory.playerInventories.get(player.getUniqueId()).getFullPlayerTier(true); + case "player_active_guild_rank_numerical": + return "" + GuildRank.getActiveGuildRank(player, false); + case "player_maximum_guild_rank_numerical": + return "" + GuildRank.getMaxGuildRank(player, false); + case "player_active_guild_rank_name": + return GuildRank.getRankName(GuildRank.getGuildPrestigeRank(player, false), GuildRank.getActiveGuildRank(player, false)); + case "player_maximum_guild_rank_name": + return GuildRank.getRankName(GuildRank.getGuildPrestigeRank(player, false), GuildRank.getMaxGuildRank(player, false)); + case "player_prestige_guild_rank_numerical": + return "" + GuildRank.getGuildPrestigeRank(player, false); + case "player_money": + return "" + Round.twoDecimalPlaces(EconomyHandler.checkCurrency(player.getUniqueId())); + case "player_top_tier": + double highestThreat = 0; + for (Player iteratedPlayer : Bukkit.getOnlinePlayers()) { + double currentTier = ElitePlayerInventory.playerInventories.get(iteratedPlayer.getUniqueId()).getFullPlayerTier(true); + if (currentTier > highestThreat) + highestThreat = currentTier; + } + return "" + highestThreat; + case "player_top_guild_rank": + int highestGuildRank = 0; + String highestGuildUser = ""; + for (Player iteratedPlayer : Bukkit.getOnlinePlayers()) { + int currentGuildRank = GuildRank.getMaxGuildRank(iteratedPlayer, false); + if (currentGuildRank > highestGuildRank) { + highestGuildRank = currentGuildRank; + highestGuildUser = iteratedPlayer.getDisplayName(); + } + } + return highestGuildUser; + case "player_shortened_guild_rank": + return AdventurersGuildConfig.getShortenedRankName(GuildRank.getGuildPrestigeRank(player, false), GuildRank.getActiveGuildRank(player, false)); + case "player_kills": + return "" + PlayerData.getKills(player.getUniqueId()); + case "player_deaths": + return "" + PlayerData.getDeaths(player.getUniqueId()); + } + + // We return null if an invalid placeholder (f.e. %someplugin_placeholder3%) + // was provided + return null; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/thirdparty/worldguard/WorldGuardCompatibility.java b/src/main/java/com/magmaguy/elitemobs/thirdparty/worldguard/WorldGuardCompatibility.java new file mode 100644 index 000000000..2a7cee438 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/thirdparty/worldguard/WorldGuardCompatibility.java @@ -0,0 +1,296 @@ +package com.magmaguy.elitemobs.thirdparty.worldguard; + +import com.magmaguy.magmacore.util.Logger; +import com.sk89q.worldguard.WorldGuard; +import com.sk89q.worldguard.protection.flags.IntegerFlag; +import com.sk89q.worldguard.protection.flags.StateFlag; +import com.sk89q.worldguard.protection.flags.registry.FlagConflictException; +import com.sk89q.worldguard.protection.flags.registry.FlagRegistry; +import lombok.Getter; +import org.bukkit.Bukkit; + +public class WorldGuardCompatibility { + + @Getter + private static final StateFlag.State allow = StateFlag.State.ALLOW; + @Getter + private static final StateFlag.State deny = StateFlag.State.DENY; + @Getter + private static StateFlag ELITEMOBS_SPAWN_FLAG; + @Getter + private static StateFlag ELITEMOBS_ONLY_SPAWN_FLAG; + @Getter + private static StateFlag ELITEMOBS_ANTIEXPLOIT; + @Getter + private static StateFlag ELITEMOBS_DUNGEON; + @Getter + private static StateFlag ELITEMOBS_EVENTS; + @Getter + private static IntegerFlag ELITEMOBS_MINIMUM_LEVEL; + @Getter + private static IntegerFlag ELITEMOBS_MAXIMUM_LEVEL; + @Getter + private static StateFlag ELITEMOBS_EXPLOSION_REGEN; + @Getter + private static StateFlag ELITEMOBS_EXPLOSION_BLOCK_DAMAGE; + + public static boolean initialize() { + + //Enable WorldGuard + if (Bukkit.getPluginManager().getPlugin("WorldGuard") == null) + return false; + + Logger.info(" WorldGuard detected."); + + FlagRegistry registry = null; + + try { + registry = WorldGuard.getInstance().getFlagRegistry(); + } catch (Exception ex) { + Logger.warn("Something went wrong while loading WorldGuard. Are you using the right WorldGuard version?"); + return false; + } + + Logger.info(" Enabling flags:"); + try { + ELITEMOBS_SPAWN_FLAG = new StateFlag("elitemob-spawning", true); + registry.register(ELITEMOBS_SPAWN_FLAG); + Logger.info(" - elitemob-spawning"); + } catch (FlagConflictException | IllegalStateException e) { + Logger.warn(" Warning: flag elitemob-spawning already exists! This is normal if you've just now reloaded EliteMobs."); + ELITEMOBS_SPAWN_FLAG = (StateFlag) registry.get("elitemob-spawning"); + } + try { + ELITEMOBS_ONLY_SPAWN_FLAG = new StateFlag("elitemob-only-spawning", false); + registry.register(ELITEMOBS_ONLY_SPAWN_FLAG); + Logger.info(" - elitemob-only-spawning"); + } catch (FlagConflictException | IllegalStateException e) { + Logger.warn(" Warning: flag elitemob-only-spawning already exists! This is normal if you've just now reloaded EliteMobs."); + ELITEMOBS_ONLY_SPAWN_FLAG = (StateFlag) registry.get("elitemob-only-spawning"); + } + try { + ELITEMOBS_ANTIEXPLOIT = new StateFlag("elitemobs-antiexploit", true); + registry.register(ELITEMOBS_ANTIEXPLOIT); + Logger.info(" - elitemobs-antiexploit"); + } catch (FlagConflictException | IllegalStateException e) { + Logger.warn(" Warning: flag elitemob-antiexploit already exists! This is normal if you've just now reloaded EliteMobs."); + ELITEMOBS_ANTIEXPLOIT = (StateFlag) registry.get("elitemobs-antiexploit"); + } + try { + ELITEMOBS_DUNGEON = new StateFlag("elitemobs-dungeon", false); + registry.register(ELITEMOBS_DUNGEON); + Logger.info(" - elitemobs-dungeon"); + } catch (FlagConflictException | IllegalStateException e) { + Logger.warn(" Warning: flag elitemob-dungeon already exists! This is normal if you've just now reloaded EliteMobs."); + ELITEMOBS_DUNGEON = (StateFlag) registry.get("elitemobs-dungeon"); + } + try { + ELITEMOBS_EVENTS = new StateFlag("elitemobs-events", true); + registry.register(ELITEMOBS_EVENTS); + Logger.info(" - elitemobs-events"); + } catch (FlagConflictException | IllegalStateException e) { + Logger.warn("Warning: flag elitemob-events already exists! This is normal if you've just now reloaded EliteMobs."); + ELITEMOBS_EVENTS = (StateFlag) registry.get("elitemobs-events"); + } + try { + ELITEMOBS_MINIMUM_LEVEL = new IntegerFlag("elitemobs-minimum-level"); + registry.register(ELITEMOBS_MINIMUM_LEVEL); + Logger.info(" - elitemobs-minimum-level"); + } catch (FlagConflictException | IllegalStateException e) { + Logger.warn(" Warning: flag elitemob-minimum-level already exists! This is normal if you've just now reloaded EliteMobs."); + ELITEMOBS_MINIMUM_LEVEL = (IntegerFlag) registry.get("elitemobs-minimum-level"); + } + try { + ELITEMOBS_MAXIMUM_LEVEL = new IntegerFlag("elitemobs-maximum-level"); + registry.register(ELITEMOBS_MAXIMUM_LEVEL); + Logger.info("- elitemobs-maximum-level"); + } catch (FlagConflictException | IllegalStateException e) { + Logger.warn("Warning: flag elitemob-maximum-level already exists! This is normal if you've just now reloaded EliteMobs."); + ELITEMOBS_MAXIMUM_LEVEL = (IntegerFlag) registry.get("elitemobs-maximum-level"); + } + + try { + ELITEMOBS_EXPLOSION_REGEN = new StateFlag("elitemobs-explosion-regen", true); + registry.register(ELITEMOBS_EXPLOSION_REGEN); + Logger.info(" - elitemobs-explosion-regen"); + } catch (FlagConflictException | IllegalStateException e) { + Logger.warn("Warning: flag elitemob-explosion-regen already exists! This is normal if you've just now reloaded EliteMobs."); + ELITEMOBS_EXPLOSION_REGEN = (StateFlag) registry.get("elitemobs-explosion-regen"); + } + + try { + ELITEMOBS_EXPLOSION_BLOCK_DAMAGE = new StateFlag("elitemobs-explosion-block-damage", true); + registry.register(ELITEMOBS_EXPLOSION_BLOCK_DAMAGE); + Logger.info(" - elitemobs-explosion-block-damage"); + } catch (FlagConflictException | IllegalStateException e) { + Logger.warn(" Warning: flag elitemobs-explosion-block-damage already exists! This is normal if you've just now reloaded EliteMobs."); + ELITEMOBS_EXPLOSION_REGEN = (StateFlag) registry.get("elitemobs-explosion-block-damage"); + } + + return true; + + } + +// public static void protectWorldMinidugeonArea(Location location, WorldDungeonPackage dungeonWorldPackage) { +// try { +// RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer(); +// RegionManager regions = container.get(BukkitAdapter.adapt(location.getWorld())); +// ProtectedRegion global = regions.getRegion("__global__"); +// +// if (global == null) { +// // But we want a __global__, so let's create one +// global = new GlobalProtectedRegion("__global__"); +// regions.addRegion(global); +// } +// +// protectMinidungeonArea(global, dungeonWorldPackage); +// DefaultDomain members = global.getMembers(); +// members.addPlayer(UUID.fromString("198c4123-cafc-45df-ba79-02a421eb8ce7")); +// global.setOwners(members); +// } catch (Exception ex) { +// Logger.warn("Failed to protect minidungeon world area!"); +// } +// } +// +// public static void protectWorldMinidugeonArea(World world) { +// try { +// RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer(); +// RegionManager regions = container.get(BukkitAdapter.adapt(world)); +// ProtectedRegion global = regions.getRegion("__global__"); +// +// if (global == null) { +// // But we want a __global__, so let's create one +// global = new GlobalProtectedRegion("__global__"); +// regions.addRegion(global); +// } +// +// protectMinidungeonArea(global); +// DefaultDomain members = global.getMembers(); +// members.addPlayer(UUID.fromString("198c4123-cafc-45df-ba79-02a421eb8ce7")); +// global.setOwners(members); +// } catch (Exception ex) { +// Logger.warn("Failed to protect minidungeon world area!"); +// } +// } +// +// public static void protectWorldMinidugeonArea(Location location) { +// protectWorldMinidugeonArea(location.getWorld()); +// } +// +// public static void protectMinidungeonArea(ProtectedRegion protectedRegion, EMPackage dungeonWorldPackage) { +// //elitemobs events +// protectedRegion.setFlag(ELITEMOBS_DUNGEON, allow); +// protectedRegion.setFlag(ELITEMOBS_ANTIEXPLOIT, deny); +// protectedRegion.setFlag(ELITEMOBS_EVENTS, deny); +// //WG events +// protectedRegion.setFlag(Flags.PASSTHROUGH, deny); +// protectedRegion.setFlag(Flags.INTERACT, deny); +// protectedRegion.setFlag(Flags.CREEPER_EXPLOSION, deny); +// protectedRegion.setFlag(Flags.FIRE_SPREAD, deny); +// protectedRegion.setFlag(Flags.LAVA_FIRE, deny); +// protectedRegion.setFlag(Flags.LAVA_FLOW, deny); +// protectedRegion.setFlag(Flags.SNOW_FALL, deny); +// protectedRegion.setFlag(Flags.SNOW_MELT, deny); +// protectedRegion.setFlag(Flags.ICE_FORM, deny); +// protectedRegion.setFlag(Flags.ICE_MELT, deny); +// protectedRegion.setFlag(Flags.LEAF_DECAY, deny); +// protectedRegion.setFlag(Flags.GRASS_SPREAD, deny); +// protectedRegion.setFlag(Flags.MYCELIUM_SPREAD, deny); +// protectedRegion.setFlag(Flags.CROP_GROWTH, deny); +// protectedRegion.setFlag(Flags.SOIL_DRY, deny); +// //missing coral-fade +// //missing ravager-grief +// protectedRegion.setFlag(Flags.GHAST_FIREBALL, deny); +// protectedRegion.setFlag(Flags.WITHER_DAMAGE, deny); +// protectedRegion.setFlag(Flags.ENDER_BUILD, deny); +// protectedRegion.setFlag(Flags.ITEM_FRAME_ROTATE, deny); +// protectedRegion.setFlag(Flags.PLACE_VEHICLE, deny); +// protectedRegion.setFlag(Flags.DESTROY_VEHICLE, deny); +// protectedRegion.setFlag(Flags.PVP, deny); +// protectedRegion.setFlag(Flags.OTHER_EXPLOSION, deny); +// protectedRegion.setFlag(Flags.TRAMPLE_BLOCKS, deny); +// protectedRegion.setFlag(Flags.VINE_GROWTH, deny); +// protectedRegion.setFlag(Flags.MUSHROOMS, deny); +// protectedRegion.setFlag(Flags.DAMAGE_ANIMALS, allow); +// protectedRegion.setFlag(Flags.SLEEP, deny); +// protectedRegion.setFlag(Flags.CHEST_ACCESS, allow); +// protectedRegion.setFlag(Flags.ENTITY_ITEM_FRAME_DESTROY, deny); +// protectedRegion.setFlag(Flags.ENTITY_PAINTING_DESTROY, deny); +// protectedRegion.setFlag(Flags.MOB_SPAWNING, allow); +// protectedRegion.setFlag(Flags.TNT, deny); +// protectedRegion.setFlag(Flags.ENDERDRAGON_BLOCK_DAMAGE, deny); +// protectedRegion.setFlag(Flags.LIGHTER, deny); +// protectedRegion.setFlag(Flags.ENDERPEARL, deny); +// //Bypass for redstone and doors +// protectedRegion.setFlag(Flags.USE, allow); +// protectedRegion.setFlag(Flags.GREET_MESSAGE, dungeonWorldPackage.getDungeonPackagerConfigFields().getRegionEnterMessage()); +// protectedRegion.setFlag(Flags.FAREWELL_MESSAGE, dungeonWorldPackage.getDungeonPackagerConfigFields().getRegionLeaveMessage()); +// } +// +// public static boolean protectMinidungeonArea(String regionName, Location location) { +// try { +// RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer(); +// RegionManager regions = container.get(BukkitAdapter.adapt(location.getWorld())); +// ProtectedRegion protectedRegion = regions.getRegion(regionName); +// if (protectedRegion == null) { +// Logger.warn("The region name picked did not exist!"); +// return false; +// } +// protectMinidungeonArea(protectedRegion); +// return true; +// } catch (Exception ex) { +// Logger.warn("Failed to protect region " + regionName + " !"); +// return false; +// } +// } +// +// public static void protectMinidungeonArea(ProtectedRegion protectedRegion) { +// //elitemobs events +// protectedRegion.setFlag(ELITEMOBS_DUNGEON, allow); +// protectedRegion.setFlag(ELITEMOBS_ANTIEXPLOIT, deny); +// protectedRegion.setFlag(ELITEMOBS_EVENTS, deny); +// //WG events +// protectedRegion.setFlag(Flags.PASSTHROUGH, deny); +// protectedRegion.setFlag(Flags.INTERACT, deny); +// protectedRegion.setFlag(Flags.CREEPER_EXPLOSION, deny); +// protectedRegion.setFlag(Flags.FIRE_SPREAD, deny); +// protectedRegion.setFlag(Flags.LAVA_FIRE, deny); +// protectedRegion.setFlag(Flags.LAVA_FLOW, deny); +// protectedRegion.setFlag(Flags.SNOW_FALL, deny); +// protectedRegion.setFlag(Flags.SNOW_MELT, deny); +// protectedRegion.setFlag(Flags.ICE_FORM, deny); +// protectedRegion.setFlag(Flags.ICE_MELT, deny); +// protectedRegion.setFlag(Flags.LEAF_DECAY, deny); +// protectedRegion.setFlag(Flags.GRASS_SPREAD, deny); +// protectedRegion.setFlag(Flags.MYCELIUM_SPREAD, deny); +// protectedRegion.setFlag(Flags.CROP_GROWTH, deny); +// protectedRegion.setFlag(Flags.SOIL_DRY, deny); +// //missing coral-fade +// //missing ravager-grief +// //protectedRegion.setFlag(Flags.GHAST_FIREBALL, deny); - this completely stops fireballs from working +// protectedRegion.setFlag(ELITEMOBS_EXPLOSION_BLOCK_DAMAGE, deny); +// protectedRegion.setFlag(Flags.WITHER_DAMAGE, deny); +// protectedRegion.setFlag(Flags.ENDER_BUILD, deny); +// protectedRegion.setFlag(Flags.ITEM_FRAME_ROTATE, deny); +// protectedRegion.setFlag(Flags.PLACE_VEHICLE, deny); +// protectedRegion.setFlag(Flags.DESTROY_VEHICLE, deny); +// protectedRegion.setFlag(Flags.PVP, deny); +// protectedRegion.setFlag(Flags.OTHER_EXPLOSION, deny); +// protectedRegion.setFlag(Flags.TRAMPLE_BLOCKS, deny); +// protectedRegion.setFlag(Flags.VINE_GROWTH, deny); +// protectedRegion.setFlag(Flags.MUSHROOMS, deny); +// protectedRegion.setFlag(Flags.DAMAGE_ANIMALS, allow); +// protectedRegion.setFlag(Flags.SLEEP, deny); +// protectedRegion.setFlag(Flags.CHEST_ACCESS, allow); +// protectedRegion.setFlag(Flags.ENTITY_ITEM_FRAME_DESTROY, deny); +// protectedRegion.setFlag(Flags.ENTITY_PAINTING_DESTROY, deny); +// protectedRegion.setFlag(Flags.MOB_SPAWNING, allow); +// protectedRegion.setFlag(Flags.TNT, deny); +// protectedRegion.setFlag(Flags.ENDERDRAGON_BLOCK_DAMAGE, deny); +// protectedRegion.setFlag(Flags.LIGHTER, deny); +// protectedRegion.setFlag(Flags.ENDERPEARL, deny); +// //Bypass for redstone and doors +// protectedRegion.setFlag(Flags.USE, allow); +// } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/thirdparty/worldguard/WorldGuardDungeonFlag.java b/src/main/java/com/magmaguy/elitemobs/thirdparty/worldguard/WorldGuardDungeonFlag.java new file mode 100644 index 000000000..174125359 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/thirdparty/worldguard/WorldGuardDungeonFlag.java @@ -0,0 +1,29 @@ +package com.magmaguy.elitemobs.thirdparty.worldguard; + +import com.magmaguy.elitemobs.EliteMobs; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.EliteEntity; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import org.bukkit.entity.EntityType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.CreatureSpawnEvent; + +public class WorldGuardDungeonFlag implements Listener { + + @EventHandler(ignoreCancelled = true) + public void onSpawn(CreatureSpawnEvent event) { + if (!EliteMobs.worldGuardIsEnabled) return; + if (event.getEntity().getType().equals(EntityType.ARMOR_STAND) || + event.getSpawnReason().equals(CreatureSpawnEvent.SpawnReason.CUSTOM)) + return; + if (WorldGuardFlagChecker.checkFlag(event.getLocation(), WorldGuardCompatibility.getELITEMOBS_DUNGEON())) { + EliteEntity eliteEntity = EntityTracker.getEliteMobEntity(event.getEntity()); + if (eliteEntity instanceof CustomBossEntity) + return; + event.setCancelled(true); + event.getEntity().remove(); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/thirdparty/worldguard/WorldGuardEliteMobOnlySpawnFlag.java b/src/main/java/com/magmaguy/elitemobs/thirdparty/worldguard/WorldGuardEliteMobOnlySpawnFlag.java new file mode 100644 index 000000000..f75d95850 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/thirdparty/worldguard/WorldGuardEliteMobOnlySpawnFlag.java @@ -0,0 +1,26 @@ +package com.magmaguy.elitemobs.thirdparty.worldguard; + +import com.magmaguy.elitemobs.EliteMobs; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import org.bukkit.entity.EntityType; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.CreatureSpawnEvent; + +public class WorldGuardEliteMobOnlySpawnFlag implements Listener { + + @EventHandler(priority = EventPriority.HIGHEST) + public void onSpawn(CreatureSpawnEvent event) { + if (!EliteMobs.worldGuardIsEnabled) return; + if (event.getEntity().getType().equals(EntityType.ARMOR_STAND) || + event.getEntity().getType().equals(EntityType.VILLAGER) && event.getSpawnReason().equals(CreatureSpawnEvent.SpawnReason.CUSTOM)) + return; + if (WorldGuardFlagChecker.checkFlag(event.getLocation(), WorldGuardCompatibility.getELITEMOBS_ONLY_SPAWN_FLAG())) { + if (EntityTracker.isEliteMob(event.getEntity())) return; + event.setCancelled(true); + event.getEntity().remove(); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/thirdparty/worldguard/WorldGuardExplosionBlockDamageFlag.java b/src/main/java/com/magmaguy/elitemobs/thirdparty/worldguard/WorldGuardExplosionBlockDamageFlag.java new file mode 100644 index 000000000..1b2eade04 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/thirdparty/worldguard/WorldGuardExplosionBlockDamageFlag.java @@ -0,0 +1,18 @@ +package com.magmaguy.elitemobs.thirdparty.worldguard; + +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityExplodeEvent; + +public class WorldGuardExplosionBlockDamageFlag implements Listener { + @EventHandler(priority = EventPriority.LOWEST) + public void WorldGuardExplosionBlockDamageFlag(EntityExplodeEvent event) { + if (WorldGuardFlagChecker.checkFlag(event.getLocation(), WorldGuardCompatibility.getELITEMOBS_EXPLOSION_BLOCK_DAMAGE())) + return; + if (!EntityTracker.isProjectileEntity(event.getEntity()) && !EntityTracker.isEliteMob(event.getEntity())) + return; + event.blockList().clear(); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/thirdparty/worldguard/WorldGuardFlagChecker.java b/src/main/java/com/magmaguy/elitemobs/thirdparty/worldguard/WorldGuardFlagChecker.java new file mode 100644 index 000000000..c1b3b6c39 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/thirdparty/worldguard/WorldGuardFlagChecker.java @@ -0,0 +1,90 @@ +package com.magmaguy.elitemobs.thirdparty.worldguard; + +import com.sk89q.worldedit.bukkit.BukkitAdapter; +import com.sk89q.worldguard.WorldGuard; +import com.sk89q.worldguard.protection.ApplicableRegionSet; +import com.sk89q.worldguard.protection.flags.Flag; +import com.sk89q.worldguard.protection.flags.Flags; +import com.sk89q.worldguard.protection.flags.StateFlag; +import com.sk89q.worldguard.protection.regions.RegionContainer; +import com.sk89q.worldguard.protection.regions.RegionQuery; +import org.bukkit.Location; + +import javax.annotation.Nullable; + +public class WorldGuardFlagChecker { + + private WorldGuardFlagChecker() { + } + + public static Boolean checkNullableFlag(Location location, StateFlag stateFlag) { + com.sk89q.worldedit.util.Location wgLocation = BukkitAdapter.adapt(location); + RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer(); + RegionQuery query = container.createQuery(); + ApplicableRegionSet set = query.getApplicableRegions(wgLocation); + StateFlag.State state = set.queryState(null, stateFlag); + if (state == null) return null; + return state == StateFlag.State.ALLOW; + } + + public static Boolean checkFlag(Location location, StateFlag stateFlag) { + com.sk89q.worldedit.util.Location wgLocation = BukkitAdapter.adapt(location); + RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer(); + RegionQuery query = container.createQuery(); + ApplicableRegionSet set = query.getApplicableRegions(wgLocation); + return set.testState(null, stateFlag); + } + + @Nullable + public static Integer getIntegerFlagValue(Location location, Flag flag) { + com.sk89q.worldedit.util.Location wgLocation = BukkitAdapter.adapt(location); + RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer(); + RegionQuery query = container.createQuery(); + ApplicableRegionSet set = query.getApplicableRegions(wgLocation); + Object object = set.queryValue(null, flag); + return object == null ? null : (Integer) object; + } + + @Nullable + public static Integer getRegionMinimumLevel(Location location) { + return WorldGuardFlagChecker.getIntegerFlagValue(location, WorldGuardCompatibility.getELITEMOBS_MINIMUM_LEVEL()); + } + + @Nullable + public static Integer getRegionMaximumLevel(Location location) { + return WorldGuardFlagChecker.getIntegerFlagValue(location, WorldGuardCompatibility.getELITEMOBS_MAXIMUM_LEVEL()); + } + + public static boolean doExplosionRegenFlag(Location location) { + com.sk89q.worldedit.util.Location wgLocation = BukkitAdapter.adapt(location); + RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer(); + RegionQuery query = container.createQuery(); + ApplicableRegionSet set = query.getApplicableRegions(wgLocation); + return set.testState(null, WorldGuardCompatibility.getELITEMOBS_EXPLOSION_REGEN()); + } + + public static boolean doEventFlag(Location location) { + com.sk89q.worldedit.util.Location wgLocation = BukkitAdapter.adapt(location); + RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer(); + RegionQuery query = container.createQuery(); + ApplicableRegionSet set = query.getApplicableRegions(wgLocation); + return set.testState(null, WorldGuardCompatibility.getELITEMOBS_EVENTS()); + } + + public static boolean doEliteMobsSpawnFlag(Location location) { + com.sk89q.worldedit.util.Location wgLocation = BukkitAdapter.adapt(location); + RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer(); + RegionQuery query = container.createQuery(); + ApplicableRegionSet set = query.getApplicableRegions(wgLocation); + return set.testState(null, WorldGuardCompatibility.getELITEMOBS_SPAWN_FLAG()); + } + + public static boolean doMobSpawnFlag(Location location) { + com.sk89q.worldedit.util.Location wgLocation = BukkitAdapter.adapt(location); + RegionContainer container = WorldGuard.getInstance().getPlatform().getRegionContainer(); + RegionQuery query = container.createQuery(); + ApplicableRegionSet set = query.getApplicableRegions(wgLocation); + return set.testState(null, Flags.MOB_SPAWNING); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/thirdparty/worldguard/WorldGuardSpawnEventBypasser.java b/src/main/java/com/magmaguy/elitemobs/thirdparty/worldguard/WorldGuardSpawnEventBypasser.java new file mode 100644 index 000000000..6db8572fb --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/thirdparty/worldguard/WorldGuardSpawnEventBypasser.java @@ -0,0 +1,27 @@ +package com.magmaguy.elitemobs.thirdparty.worldguard; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.entity.CreatureSpawnEvent; + +public class WorldGuardSpawnEventBypasser implements Listener { + + private static boolean force = false; + + public static void forceSpawn() { + force = true; + } + + public static boolean isForcedSpawn() { + return force; + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onSpawn(CreatureSpawnEvent event) { + if (!force) return; + event.setCancelled(false); + force = false; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/treasurechest/TreasureChest.java b/src/main/java/com/magmaguy/elitemobs/treasurechest/TreasureChest.java new file mode 100644 index 000000000..122ef2245 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/treasurechest/TreasureChest.java @@ -0,0 +1,304 @@ +package com.magmaguy.elitemobs.treasurechest; + +import com.google.common.collect.ArrayListMultimap; +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.adventurersguild.GuildRank; +import com.magmaguy.elitemobs.config.DefaultConfig; +import com.magmaguy.elitemobs.config.SoundsConfig; +import com.magmaguy.elitemobs.config.customtreasurechests.CustomTreasureChestConfigFields; +import com.magmaguy.elitemobs.config.customtreasurechests.CustomTreasureChestsConfig; +import com.magmaguy.elitemobs.dungeons.EMPackage; +import com.magmaguy.elitemobs.mobconstructor.PersistentObject; +import com.magmaguy.elitemobs.mobconstructor.PersistentObjectHandler; +import com.magmaguy.elitemobs.mobconstructor.custombosses.CustomBossEntity; +import com.magmaguy.elitemobs.utils.ConfigurationLocation; +import com.magmaguy.elitemobs.utils.WeightedProbability; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Logger; +import com.magmaguy.magmacore.util.Round; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.data.Directional; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockBreakEvent; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.scheduler.BukkitRunnable; + +import java.time.Instant; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.UUID; +import java.util.concurrent.ThreadLocalRandom; + +public class TreasureChest implements PersistentObject { + + @Getter + private static final HashMap treasureChestHashMap = new HashMap<>(); + private static final ArrayListMultimap instancedTreasureChests = ArrayListMultimap.create(); + @Getter + private final CustomTreasureChestConfigFields customTreasureChestConfigFields; + private final String locationString; + private final String worldName; + private final HashSet blacklistedPlayersInstance = new HashSet<>(); + @Getter + private Location location; + private long restockTime; + @Getter + @Setter + private EMPackage emPackage = null; + + public TreasureChest(CustomTreasureChestConfigFields customTreasureChestConfigFields, String locationString, long restockTime) { + this.customTreasureChestConfigFields = customTreasureChestConfigFields; + this.locationString = locationString; + this.worldName = ConfigurationLocation.worldName(locationString); + this.location = ConfigurationLocation.serialize(locationString); + this.restockTime = restockTime; + this.emPackage = EMPackage.getContent(customTreasureChestConfigFields.getFilename()); + + if (!customTreasureChestConfigFields.isEnabled()) + return; + + if (customTreasureChestConfigFields.getChestMaterial() == null) + return; + + if (!customTreasureChestConfigFields.isInstanced()) { + initializeChest(); + new PersistentObjectHandler(this); + treasureChestHashMap.put(location, this); + } else + instancedTreasureChests.put(worldName, this); + } + + public static void initializeInstancedTreasureChests(String instanceWorldName, World instancedWorld) { + List chests = instancedTreasureChests.get(instanceWorldName); + chests.forEach(treasureChest -> { + treasureChest.location = ConfigurationLocation.serializeWithInstance(instancedWorld, treasureChest.locationString); + treasureChest.restockTime = 0; + new PersistentObjectHandler(treasureChest); + treasureChest.generateChest(); + treasureChestHashMap.put(treasureChest.location, treasureChest); + }); + } + + public static void clearTreasureChests() { + treasureChestHashMap.clear(); + } + + public static TreasureChest getTreasureChest(Location location) { + return getTreasureChestHashMap().get(location); + } + + private void initializeChest() { + if (customTreasureChestConfigFields.isInstanced()) return; + if (location != null && location.getWorld() != null) { + long time = (restockTime - Instant.now().getEpochSecond()) * 20L; + if (time < 0) + generateChest(); + else + Bukkit.getScheduler().scheduleSyncDelayedTask(MetadataHandler.PLUGIN, this::generateChest, time); + } + } + + private void generateChest() { + try { + if (!location.getWorld() + .getBlockAt(location).getType().equals(customTreasureChestConfigFields.getChestMaterial())) + location.getWorld().getBlockAt(location).setType(customTreasureChestConfigFields.getChestMaterial()); + } catch (Exception ex) { + Logger.warn("Custom Treasure Chest " + customTreasureChestConfigFields.getFilename() + " has an invalid location and can not be placed."); + return; + } + if (location.getBlock().getBlockData() instanceof Directional chest) { + chest.setFacing(customTreasureChestConfigFields.getFacing()); + location.getBlock().setBlockData(chest); + } else { + Logger.warn("Treasure chest " + customTreasureChestConfigFields.getFilename() + + " does not have a directional block for the Treasure Chest material " + + customTreasureChestConfigFields.getChestMaterial() + " ! Chest materials are directional, is your chest a chest?"); + } + location.getBlock().getState().update(); + } + + public void doInteraction(Player player) { + + if (customTreasureChestConfigFields.getDropStyle().equals(DropStyle.GROUP)) + if (playerIsInCooldown(player)) { + if (!customTreasureChestConfigFields.isInstanced()) + groupTimerCooldownMessage(player, getPlayerCooldown(player)); + return; + } else if (restockTime > Instant.now().getEpochSecond()) + return; + + if (ThreadLocalRandom.current().nextDouble() < customTreasureChestConfigFields.getMimicChance()) doMimic(); + else doTreasure(player); + + player.playSound(player.getLocation(), SoundsConfig.treasureChestOpenSound, 1, 1); + + if (customTreasureChestConfigFields.getDropStyle().equals(DropStyle.GROUP)) { + if (customTreasureChestConfigFields.isInstanced()) { + blacklistedPlayersInstance.add(player.getUniqueId()); + } else if (customTreasureChestConfigFields.getRestockTimers() != null) { + customTreasureChestConfigFields.getRestockTimers().add(cooldownStringConstructor(player)); + new BukkitRunnable() { + @Override + public void run() { + customTreasureChestConfigFields.getRestockTimers().removeIf(restockTime -> restockTime.split(":")[0].equals(player.getUniqueId().toString())); + } + }.runTaskLater(MetadataHandler.PLUGIN, 20L * 60 * customTreasureChestConfigFields.getRestockTimer()); + } + return; + } + + location.getBlock().setType(Material.AIR); + + restockTime = cooldownTime(); + customTreasureChestConfigFields.setRestockTime(location, restockTime); + + if (!customTreasureChestConfigFields.isInstanced()) + Bukkit.getScheduler().scheduleSyncDelayedTask(MetadataHandler.PLUGIN, this::generateChest, 20L * 60 * customTreasureChestConfigFields.getRestockTimer()); + + } + + private void doMimic() { + HashMap weighedValues = new HashMap<>(); + for (String string : this.customTreasureChestConfigFields.getMimicCustomBossesList()) { + String filename = string.split(":")[0]; + double weight = 1; + try { + weight = Double.parseDouble(string.split(":")[1]); + } catch (Exception ex) { + weight = 1; + } + weighedValues.put(filename, weight); + } + CustomBossEntity customBossEntity = CustomBossEntity.createCustomBossEntity(WeightedProbability.pickWeighedProbability(weighedValues)); + customBossEntity.spawn(location, randomizeTier(), false); + } + + private void doTreasure(Player player) { + this.customTreasureChestConfigFields.getCustomLootTable().treasureChestDrop(player, customTreasureChestConfigFields.getChestTier(), location); + } + + private int randomizeTier() { + return customTreasureChestConfigFields.getChestTier() * 10 + ThreadLocalRandom.current().nextInt(11); + } + + private void lowRankMessage(Player player) { + player.sendMessage(ChatColorConverter.convert(DefaultConfig.getChestLowRankMessage().replace("$rank", GuildRank.getRankName(Math.max(0, customTreasureChestConfigFields.getChestTier() - 10), customTreasureChestConfigFields.getChestTier())))); + } + + private void groupTimerCooldownMessage(Player player, long targetTime) { + player.sendMessage(ChatColorConverter.convert(DefaultConfig.getChestCooldownMessage().replace("$time", timeConverter(targetTime - Instant.now().getEpochSecond())))); + } + + private boolean playerIsInCooldown(Player player) { + if (customTreasureChestConfigFields.isInstanced()) + return blacklistedPlayersInstance.contains(player.getUniqueId()); + if (customTreasureChestConfigFields.getRestockTimers() == null) return false; + for (String string : customTreasureChestConfigFields.getRestockTimers()) + if (string.split(":")[0].equals(player.getUniqueId().toString())) + return true; + return false; + } + + private long getPlayerCooldown(Player player) { + for (String string : customTreasureChestConfigFields.getRestockTimers()) + if (string.split(":")[0].equals(player.getUniqueId().toString())) + return Long.parseLong(string.split(":")[1]); + return 0; + } + + private String cooldownStringConstructor(Player player) { + return player.getUniqueId() + ":" + cooldownTime(); + } + + private long cooldownTime() { + return Instant.now().getEpochSecond() + 60L * this.customTreasureChestConfigFields.getRestockTimer(); + } + + private String timeConverter(long seconds) { + if (seconds < 60 * 2) + return seconds + " seconds"; + if (seconds < 60 * 60 * 2) + return Round.twoDecimalPlaces(seconds / 60D) + "minutes"; + if (seconds < 60 * 60 * 48) + return Round.twoDecimalPlaces(seconds / 60D / 60) + "hours"; + else + return Round.twoDecimalPlaces(seconds / 60D / 60 / 48) + "days"; + } + + public void removeTreasureChest() { + CustomTreasureChestsConfig.removeTreasureChestEntry(location, customTreasureChestConfigFields.getFilename()); + if (location != null && location.getWorld() != null) + location.getBlock().setBlockData(Material.AIR.createBlockData()); + treasureChestHashMap.remove(location); + } + + @Override + public void chunkLoad() { + } + + @Override + public void chunkUnload() { + } + + @Override + public void worldLoad(World world) { + this.location = ConfigurationLocation.serialize(locationString); + initializeChest(); + treasureChestHashMap.put(location, this); + } + + @Override + public void worldUnload() { + treasureChestHashMap.remove(location); + //todo stop restock timer here + } + + @Override + public Location getPersistentLocation() { + return getLocation(); + } + + @Override + public String getWorldName() { + return worldName; + } + + public enum DropStyle { + SINGLE, + GROUP + } + + public static class TreasureChestEvents implements Listener { + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + public void onPlayerInteract(PlayerInteractEvent event) { + if (event.getClickedBlock() == null) return; + TreasureChest treasureChest = getTreasureChest(event.getClickedBlock().getLocation()); + if (treasureChest == null) return; + event.setCancelled(true); + if (GuildRank.getMaxGuildRank(event.getPlayer()) < treasureChest.customTreasureChestConfigFields.getChestTier()) + treasureChest.lowRankMessage(event.getPlayer()); + else + treasureChest.doInteraction(event.getPlayer()); + } + + @EventHandler(ignoreCancelled = true) + public void onBreak(BlockBreakEvent event) { + for (TreasureChest treasureChest : treasureChestHashMap.values()) + if (treasureChest.getLocation() != null && + treasureChest.getLocation().getWorld() != null && + event.getBlock().getLocation().equals(treasureChest.location.getBlock().getLocation())) + event.setCancelled(true); + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/BookMaker.java b/src/main/java/com/magmaguy/elitemobs/utils/BookMaker.java new file mode 100644 index 000000000..e3dd9f0c7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/BookMaker.java @@ -0,0 +1,46 @@ +package com.magmaguy.elitemobs.utils; + +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.BookMeta; + +import java.util.List; + +public class BookMaker { + + private BookMaker() { + } + + public static ItemStack generateBook(Player player, List pages) { + ItemStack writtenBook = new ItemStack(Material.WRITTEN_BOOK); + BookMeta bookMeta = (BookMeta) writtenBook.getItemMeta(); + bookMeta.setTitle("EliteMobs Book"); + bookMeta.setAuthor("MagmaGuy"); + bookMeta.setPages(pages); + writtenBook.setItemMeta(bookMeta); + player.openBook(writtenBook); + return writtenBook; + } + + public static ItemStack generateBook(Player player, TextComponent[] pages) { + ItemStack writtenBook = new ItemStack(Material.WRITTEN_BOOK); + BookMeta bookMeta = (BookMeta) writtenBook.getItemMeta(); + bookMeta.setTitle("EliteMobs Book"); + bookMeta.setAuthor("MagmaGuy"); + + /* + for some reason the spigot api isn't respecting the whole 1 page per array element, so this converts it to a + format that actually works + */ + for (TextComponent textComponent : pages) { + TextComponent[] stupid = new TextComponent[1]; + stupid[0] = textComponent; + bookMeta.spigot().addPage(stupid); + } + writtenBook.setItemMeta(bookMeta); + player.openBook(writtenBook); + return writtenBook; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/BossBarUtil.java b/src/main/java/com/magmaguy/elitemobs/utils/BossBarUtil.java new file mode 100644 index 000000000..71f1f6182 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/BossBarUtil.java @@ -0,0 +1,81 @@ +package com.magmaguy.elitemobs.utils; + +import com.google.common.collect.ArrayListMultimap; +import com.magmaguy.elitemobs.playerdata.PlayerItem; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.boss.BarColor; +import org.bukkit.boss.BarStyle; +import org.bukkit.boss.BossBar; +import org.bukkit.entity.Player; + +import java.util.HashSet; +import java.util.List; + +public class BossBarUtil { + public static HashSet bossBars = new HashSet<>(); + public static ArrayListMultimap brokenPlayerItem = ArrayListMultimap.create(); + + private BossBarUtil() { + } + + public static void shutdown() { + bossBars.forEach(BossBar::removeAll); + bossBars.clear(); + } + + public static void DisplayBrokenItemBossBar(PlayerItem.EquipmentSlot equipmentSlot, Player player, String title) { + List arrayList = brokenPlayerItem.get(player); + boolean alreadyExists = false; + for (PlayerBrokenItemBar playerBrokenItemBar : arrayList) { + if (playerBrokenItemBar.getEquipmentSlot().equals(equipmentSlot)) { + alreadyExists = true; + break; + } + } + if (!alreadyExists) { + brokenPlayerItem.put(player, new PlayerBrokenItemBar(equipmentSlot, player, title, BarColor.RED, BarStyle.SOLID)); + } + } + + public static void HideBrokenItemBossBar(PlayerItem.EquipmentSlot equipmentSlot, Player player) { + List arrayList = brokenPlayerItem.get(player); + PlayerBrokenItemBar storedPlayerBrokenItemBar = null; + + for (PlayerBrokenItemBar playerBrokenItemBar : arrayList) { + if (playerBrokenItemBar.getEquipmentSlot().equals(equipmentSlot)) { + storedPlayerBrokenItemBar = playerBrokenItemBar; + DestroyBossBar(playerBrokenItemBar.bossBar); + break; + } + } + + brokenPlayerItem.remove(player, storedPlayerBrokenItemBar); + } + + private static BossBar CreateBossBar(Player player, String title, BarColor barColor, BarStyle barStyle) { + BossBar bossBar = Bukkit.createBossBar(title, barColor, barStyle); + bossBar.addPlayer(player); + bossBars.add(bossBar); + return bossBar; + } + + private static void DestroyBossBar(BossBar bossBar) { + bossBar.removeAll(); + bossBars.remove(bossBar); + } + + private static class PlayerBrokenItemBar { + @Getter + private final PlayerItem.EquipmentSlot equipmentSlot; + @Getter + private final BossBar bossBar; + + private PlayerBrokenItemBar(PlayerItem.EquipmentSlot equipmentSlot, Player player, String title, BarColor barColor, BarStyle barStyle) { + this.equipmentSlot = equipmentSlot; + bossBar = CreateBossBar(player, title, barColor, barStyle); + } + } + + +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/ChunkLocationChecker.java b/src/main/java/com/magmaguy/elitemobs/utils/ChunkLocationChecker.java new file mode 100644 index 000000000..0c76c6464 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/ChunkLocationChecker.java @@ -0,0 +1,33 @@ +package com.magmaguy.elitemobs.utils; + +import org.bukkit.Chunk; +import org.bukkit.Location; + +public class ChunkLocationChecker { + private ChunkLocationChecker() { + } + + /* + Checks if a location is in a given chunk + */ + public static boolean chunkLocationCheck(Location location, Chunk chunk) { + if (!chunk.getWorld().equals(location.getWorld())) return false; + double chunkX = chunk.getX() * 16; + double locationX = location.getX(); + double chunkZ = chunk.getZ() * 16; + double locationZ = location.getZ(); + if (!(chunkX <= locationX && chunkX + 16 >= locationX)) + return false; + + return chunkZ <= locationZ && chunkZ + 16 >= locationZ; + } + + /* + Checks if a given location is loaded + */ + public static boolean locationIsLoaded(Location location) { + return location != null && location.getWorld() != null && + location.getWorld().isChunkLoaded(location.getBlock().getX() >> 4, location.getBlock().getZ() >> 4); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/ChunkVectorizer.java b/src/main/java/com/magmaguy/elitemobs/utils/ChunkVectorizer.java new file mode 100644 index 000000000..0e8c4dc35 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/ChunkVectorizer.java @@ -0,0 +1,31 @@ +package com.magmaguy.elitemobs.utils; + +import org.bukkit.Chunk; + +import java.util.Objects; +import java.util.UUID; +import java.util.Vector; + +public class ChunkVectorizer { + + public static int hash(Chunk chunk) { + return Objects.hash(chunk.getX(), chunk.getZ(), chunk.getWorld().getUID()); + } + + //pseudo-chunks - prevent it form having to load the chunk + public static int hash(int x, int z, UUID worldUUID) { + return Objects.hash(x, z, worldUUID); + } + + public static Vector hash(double x, double z) { + Vector vector = new Vector(2); + vector.addElement(x); + vector.addElement(z); + return vector; + } + + public static boolean isSameChunk(Chunk chunk, int hashedChunk) { + return hash(chunk) == hashedChunk; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/CommandRunner.java b/src/main/java/com/magmaguy/elitemobs/utils/CommandRunner.java new file mode 100644 index 000000000..255c25d2b --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/CommandRunner.java @@ -0,0 +1,40 @@ +package com.magmaguy.elitemobs.utils; + +import com.magmaguy.elitemobs.ondeathcommands.OnDeathCommands; +import org.bukkit.Bukkit; + +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class CommandRunner { + + public static void runCommandFromList(List commands, List placeholders) { + if (commands == null || commands.isEmpty()) return; + for (String string : commands) { + if (string == null || string.isEmpty()) continue; + if (placeholders.isEmpty()) { + OnDeathCommands.RunChance runChance = new OnDeathCommands.RunChance(string); + string = runChance.getString(); + if (ThreadLocalRandom.current().nextDouble() < runChance.getChance()) + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), string); + } else { + for (ConfigPlaceholder configPlaceholder : placeholders) + string = string.replace(configPlaceholder.placeholder, configPlaceholder.value); + OnDeathCommands.RunChance runChance = new OnDeathCommands.RunChance(string); + string = runChance.getString(); + if (ThreadLocalRandom.current().nextDouble() < runChance.getChance()) + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), string); + } + } + } + + public class ConfigPlaceholder { + private final String placeholder; + private final String value; + + public ConfigPlaceholder(String placeholder, String value) { + this.placeholder = placeholder; + this.value = value; + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/ConfigurationLocation.java b/src/main/java/com/magmaguy/elitemobs/utils/ConfigurationLocation.java new file mode 100644 index 000000000..9e757f94f --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/ConfigurationLocation.java @@ -0,0 +1,136 @@ +package com.magmaguy.elitemobs.utils; + +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; + +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +public class ConfigurationLocation { + private static final Set notLoadedWorldNames = new HashSet<>(); + + private ConfigurationLocation() { + } + + /* + Location format: worldname,x,y,z,pitch,yaw + */ + public static String deserialize(String worldName, double x, double y, double z, float pitch, float yaw) { + return worldName + "," + x + "," + y + "," + z + "," + pitch + "," + yaw; + } + + public static String deserialize(Location location) { + return deserialize(Objects.requireNonNull(location.getWorld()).getName(), location.getX(), location.getY(), location.getZ(), location.getPitch(), location.getYaw()); + } + + + public static Location serialize(String locationString) { + return serialize(locationString, false); + } + + public static Location serialize(String locationString, boolean silent) { + + if (locationString == null) + return null; + + World world = null; + double x = 0; + double y = 0; + double z = 0; + float yaw = 0; + float pitch = 0; + + try { + String locationOnlyString = locationString.split(":")[0]; + String[] slicedString = locationOnlyString.split(","); + + if (slicedString.length == 6 || slicedString.length == 4) { + + world = Bukkit.getWorld(slicedString[0]); + if (world == null && + !slicedString[0].equalsIgnoreCase("same_as_boss") && + !notLoadedWorldNames.contains(slicedString[0]) && !silent) { + notLoadedWorldNames.add(slicedString[0]); + } + x = Double.parseDouble(slicedString[1]); + y = Double.parseDouble(slicedString[2]); + z = Double.parseDouble(slicedString[3]); + if (slicedString.length > 4) { + yaw = Float.parseFloat(slicedString[4]); + pitch = Float.parseFloat(slicedString[5]); + } else { + yaw = 0; + pitch = 0; + } + } else if (slicedString.length == 5) { + x = Double.parseDouble(slicedString[0]); + y = Double.parseDouble(slicedString[1]); + z = Double.parseDouble(slicedString[2]); + yaw = Float.parseFloat(slicedString[3]); + pitch = Float.parseFloat(slicedString[4]); + } else throw new Exception(); + } catch (Exception ex) { + if (locationString.equals("null")) + return null; + Logger.warn("Attempted to deserialize an invalid location!"); + Logger.warn("Expected location format: worldname,x,y,z,pitch,yaw"); + Logger.warn("Actual location format: " + locationString); + return null; + } + return new Location(world, x, y, z, yaw, pitch); + } + + public static String worldName(String locationString) { + String locationOnlyString = locationString.split(":")[0]; + String[] slicedString = locationOnlyString.split(","); + return slicedString[0]; + } + + public static Location serializeWithInstance(World instancedWorld, String locationString) { + + if (locationString == null) + return null; + + double x = 0; + double y = 0; + double z = 0; + float yaw = 0; + float pitch = 0; + + try { + String locationOnlyString = locationString.split(":")[0]; + String[] slicedString = locationOnlyString.split(","); + + if (slicedString.length == 6 || slicedString.length == 4) { + x = Double.parseDouble(slicedString[1]); + y = Double.parseDouble(slicedString[2]); + z = Double.parseDouble(slicedString[3]); + if (slicedString.length > 4) { + yaw = Float.parseFloat(slicedString[4]); + pitch = Float.parseFloat(slicedString[5]); + } else { + yaw = 0; + pitch = 0; + } + } else if (slicedString.length == 5) { + x = Double.parseDouble(slicedString[0]); + y = Double.parseDouble(slicedString[1]); + z = Double.parseDouble(slicedString[2]); + yaw = Float.parseFloat(slicedString[3]); + pitch = Float.parseFloat(slicedString[4]); + } else throw new Exception(); + } catch (Exception ex) { + if (locationString.equals("null")) + return null; + Logger.warn("Attempted to deserialize an invalid location!"); + Logger.warn("Expected location format: worldname,x,y,z,pitch,yaw"); + Logger.warn("Actual location format: " + locationString); + return null; + } + return new Location(instancedWorld, x, y, z, yaw, pitch); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/Cooldown.java b/src/main/java/com/magmaguy/elitemobs/utils/Cooldown.java deleted file mode 100644 index 38d0f121a..000000000 --- a/src/main/java/com/magmaguy/elitemobs/utils/Cooldown.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.magmaguy.elitemobs.utils; - -import com.magmaguy.elitemobs.MetadataHandler; -import org.bukkit.scheduler.BukkitRunnable; - -import java.util.ArrayList; - -public class Cooldown { - - public static void initialize(ArrayList list, Object object, int cooldownInTicks) { - - list.add(object); - - new BukkitRunnable() { - @Override - public void run() { - list.remove(object); - } - }.runTaskLater(MetadataHandler.PLUGIN, cooldownInTicks); - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/CooldownHandler.java b/src/main/java/com/magmaguy/elitemobs/utils/CooldownHandler.java new file mode 100644 index 000000000..3a89b1c06 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/CooldownHandler.java @@ -0,0 +1,24 @@ +package com.magmaguy.elitemobs.utils; + +import com.magmaguy.elitemobs.MetadataHandler; +import org.bukkit.scheduler.BukkitRunnable; + +import java.util.List; + +public class CooldownHandler { + private CooldownHandler() { + } + + public static void initialize(List list, Object object, int cooldownInTicks) { + list.add(object); + + new BukkitRunnable() { + @Override + public void run() { + list.remove(object); + } + }.runTaskLater(MetadataHandler.PLUGIN, cooldownInTicks); + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/DebugBlockLocation.java b/src/main/java/com/magmaguy/elitemobs/utils/DebugBlockLocation.java new file mode 100644 index 000000000..5af9ea6b5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/DebugBlockLocation.java @@ -0,0 +1,19 @@ +package com.magmaguy.elitemobs.utils; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Particle; + +public class DebugBlockLocation { + + public DebugBlockLocation(Location location) { + location.getWorld().spawnParticle(Particle.BLOCK_MARKER, + location.getBlock().getX() + .5, + location.getBlock().getY() + .5, + location.getBlock().getZ() + .5, + 1, + Bukkit.createBlockData(Material.BARRIER)); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/DialogArmorStand.java b/src/main/java/com/magmaguy/elitemobs/utils/DialogArmorStand.java new file mode 100644 index 000000000..a1a88c2e2 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/DialogArmorStand.java @@ -0,0 +1,71 @@ +package com.magmaguy.elitemobs.utils; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.api.internal.RemovalReason; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.TextDisplay; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +public class DialogArmorStand { + + public static TextDisplay createDialogArmorStand(Entity sourceEntity, String dialog, Vector offset) { + + offset.add(getDisplacementVector(sourceEntity).subtract(new Vector(0, 1, 0))); + Vector finalOffset = offset; + TextDisplay armorStand = VisualDisplay.generateTemporaryTextDisplay(sourceEntity.getLocation().clone().add(finalOffset), dialog); + + //This part is necessary because armorstands are visible on their first tick to players + new BukkitRunnable() { + int taskTimer = 0; + + @Override + public void run() { + taskTimer++; + + if (taskTimer > 15 || !sourceEntity.isValid()) { + EntityTracker.unregister(armorStand, RemovalReason.EFFECT_TIMEOUT); + cancel(); + return; + } + armorStand.teleport(sourceEntity.getLocation().clone().add(finalOffset).add(new Vector(0, taskTimer * 0.05, 0))); + } + + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 2); + + return armorStand; + } + + private static Vector getDisplacementVector(Entity sourceEntity) { + double height = 2.3; + if (sourceEntity instanceof LivingEntity) + height = ((LivingEntity) sourceEntity).getEyeHeight(); + return new Vector(0, height, 0); + } + + public static TextDisplay createDialogArmorStand(LivingEntity sourceEntity, String dialog) { + + if (sourceEntity == null) return null; + + TextDisplay armorStand = VisualDisplay.generateTemporaryTextDisplay(sourceEntity.getLocation().clone().add(getDisplacementVector(sourceEntity)), dialog); + //This part is necessary because armorstands are visible on their first tick to players + new BukkitRunnable() { + int taskTimer = 0; + + @Override + public void run() { + if (taskTimer > 15 || !sourceEntity.isValid()) { + EntityTracker.unregister(armorStand, RemovalReason.EFFECT_TIMEOUT); + cancel(); + return; + } + armorStand.teleport(sourceEntity.getLocation().clone().add(getDisplacementVector(sourceEntity))); + taskTimer++; + } + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 1); + return armorStand; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/DiscordLinks.java b/src/main/java/com/magmaguy/elitemobs/utils/DiscordLinks.java new file mode 100644 index 000000000..256f05425 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/DiscordLinks.java @@ -0,0 +1,7 @@ +package com.magmaguy.elitemobs.utils; + +public class DiscordLinks { + public static final String freeMinidungeons = "https://discord.gg/9f5QSka"; + public static final String premiumMinidungeons = "https://discord.gg/9f5QSka"; + public static final String mainLink = "https://discord.gg/9f5QSka"; +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/EnderDragonPhaseSimplifier.java b/src/main/java/com/magmaguy/elitemobs/utils/EnderDragonPhaseSimplifier.java new file mode 100644 index 000000000..4e74ca9a4 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/EnderDragonPhaseSimplifier.java @@ -0,0 +1,51 @@ +package com.magmaguy.elitemobs.utils; + +import org.bukkit.entity.EnderDragon; + +public class EnderDragonPhaseSimplifier { + private EnderDragonPhaseSimplifier() { + } + + /** + * Returns whether the dragon's phase has it flying. Strict considers edge behaviors as true (charging, landing and taking off) + * + * @param phase Phase to evaluate + * @param strict If true, includes all flying phases, including things such as charging players and returning to the portal + * @return Returns whether the dragon is flying + */ + public static boolean isFlying(EnderDragon.Phase phase, boolean strict) { + switch (phase) { + case HOVER: + case CIRCLING: + case STRAFING: + return true; + default: + if (strict) + return phase.equals(EnderDragon.Phase.LAND_ON_PORTAL) || + phase.equals(EnderDragon.Phase.LEAVE_PORTAL) || + phase.equals(EnderDragon.Phase.CHARGE_PLAYER); + return false; + + } + } + + /** + * Returns whether the dragon is currently in a landed phase. This means any phase where the dragon is sitting in the middle of the map. + * + * @param phase Phase to evaluate + * @return Whether the dragon sits in the middle of the map during that phase + */ + public static boolean isLanded(EnderDragon.Phase phase) { + switch (phase) { + case BREATH_ATTACK: + case SEARCH_FOR_BREATH_ATTACK_TARGET: + case ROAR_BEFORE_ATTACK: + return true; + default: + return false; + } + } + + +} + diff --git a/src/main/java/com/magmaguy/elitemobs/utils/EntityFinder.java b/src/main/java/com/magmaguy/elitemobs/utils/EntityFinder.java index 0ee31c877..e96aea4d1 100644 --- a/src/main/java/com/magmaguy/elitemobs/utils/EntityFinder.java +++ b/src/main/java/com/magmaguy/elitemobs/utils/EntityFinder.java @@ -8,16 +8,15 @@ import org.bukkit.event.entity.EntityTargetLivingEntityEvent; public class EntityFinder { + private EntityFinder() { + } public static LivingEntity filterRangedDamagers(Entity entity) { - if (entity instanceof LivingEntity) return (LivingEntity) entity; else if (entity instanceof Projectile && ((Projectile) entity).getShooter() instanceof LivingEntity) return (LivingEntity) ((Projectile) entity).getShooter(); - return null; - } public static LivingEntity getRealDamager(EntityDamageByEntityEvent event) { @@ -37,7 +36,7 @@ public static Player findPlayer(EntityDamageByEntityEvent event) { } public static Player findPlayer(EntityTargetLivingEntityEvent event) { - return playerFilter(event.getEntity()); + return playerFilter(event.getTarget()); } } diff --git a/src/main/java/com/magmaguy/elitemobs/utils/EntitySearch.java b/src/main/java/com/magmaguy/elitemobs/utils/EntitySearch.java new file mode 100644 index 000000000..5b65ccbe7 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/EntitySearch.java @@ -0,0 +1,22 @@ +package com.magmaguy.elitemobs.utils; + +import org.bukkit.GameMode; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class EntitySearch { + private EntitySearch() { + } + + public static List getNearbyCombatPlayers(Location location, double distance) { + List players = new ArrayList<>(); + location.getWorld().getPlayers().forEach(player -> { + if (player.getGameMode().equals(GameMode.SPECTATOR)) return; + if (player.getLocation().distanceSquared(location) <= Math.pow(distance, 2)) players.add(player); + }); + return players; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/EventCaller.java b/src/main/java/com/magmaguy/elitemobs/utils/EventCaller.java new file mode 100644 index 000000000..864ffb975 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/EventCaller.java @@ -0,0 +1,10 @@ +package com.magmaguy.elitemobs.utils; + +import org.bukkit.Bukkit; +import org.bukkit.event.Event; + +public class EventCaller { + public EventCaller(Event event) { + Bukkit.getPluginManager().callEvent(event); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/ItemStackSerializer.java b/src/main/java/com/magmaguy/elitemobs/utils/ItemStackSerializer.java new file mode 100644 index 000000000..f2e404f6d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/ItemStackSerializer.java @@ -0,0 +1,100 @@ +package com.magmaguy.elitemobs.utils; + +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.ItemStackGenerator; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.Material; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.inventory.meta.SkullMeta; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class ItemStackSerializer { + + public static FileConfiguration serialize(String identifier, ItemStack itemStack, FileConfiguration fileConfiguration) { + fileConfiguration.addDefault(identifier + ".material", itemStack.getType().toString()); + if (itemStack.hasItemMeta() && itemStack.getItemMeta().hasDisplayName()) + fileConfiguration.addDefault(identifier + ".name", itemStack.getItemMeta().getDisplayName()); + if (itemStack.hasItemMeta() && itemStack.getItemMeta().hasLore()) + fileConfiguration.addDefault(identifier + ".lore", itemStack.getItemMeta().getLore()); + if (itemStack.getType().equals(Material.PLAYER_HEAD)) + fileConfiguration.addDefault(identifier + ".owner", ((SkullMeta) itemStack.getItemMeta()).getOwner()); + if (itemStack.hasItemMeta() && itemStack.getItemMeta().hasCustomModelData() && itemStack.getItemMeta().getCustomModelData() != 0) + fileConfiguration.addDefault(identifier + ".customModelID", itemStack.getItemMeta().getCustomModelData()); + + return fileConfiguration; + } + + public static ItemStack deserialize(String identifier, FileConfiguration fileConfiguration) { + Material material; + identifier += "."; + try { + material = Material.valueOf(fileConfiguration.getString(identifier + "material")); + } catch (Exception ex) { + Logger.warn("Attempted to add material name " + fileConfiguration.getString("material") + " to a menu. This is not a valid material. Item will default to glass."); + material = Material.RED_STAINED_GLASS_PANE; + } + + String name = ""; + if (fileConfiguration.contains(identifier + "name")) + name = ChatColorConverter.convert(fileConfiguration.getString(identifier + "name")); + + List lore = new ArrayList<>(); + if (fileConfiguration.contains(identifier + "lore")) + lore = ChatColorConverter.convert(fileConfiguration.getStringList(identifier + "lore")); + + if (material.equals(Material.PLAYER_HEAD)) { + String owner = fileConfiguration.getString(identifier + "owner"); + return ItemStackGenerator.generateSkullItemStack(owner, name, lore); + } + + int customModelID = 0; + if (fileConfiguration.contains(identifier + "customModelID")) { + customModelID = fileConfiguration.getInt(identifier + "customModelID"); + } + + return ItemStackGenerator.generateItemStack(material, name, lore, customModelID); + } + + /** + * Used to generate itemstacks from configuration files when they contain placeholders + * + * @param itemStack + * @param placeholderReplacementPairs List of placeholders / replacements. Each placeholder is a key, each key has 1 replacement value. + * @return + */ + public static ItemStack itemStackPlaceholderReplacer(ItemStack itemStack, HashMap placeholderReplacementPairs) { + ItemStack cloneItemStack = itemStack.clone(); + ItemMeta newMeta = itemStack.getItemMeta(); + + + //Replace placeholders in name + if (newMeta.hasDisplayName()) { + String newName = newMeta.getDisplayName(); + for (String placeholder : placeholderReplacementPairs.keySet()) + if (newMeta.getDisplayName().contains(placeholder)) + newName = newName.replace(placeholder, placeholderReplacementPairs.get(placeholder)); + newMeta.setDisplayName(newName); + } + + List newLore = new ArrayList<>(); + if (newMeta.hasLore()) { + for (String loreString : newMeta.getLore()) { + String newLoreString = loreString; + for (String placeholder : placeholderReplacementPairs.keySet()) + if (loreString.contains(placeholder)) + newLoreString = newLoreString.replace(placeholder, placeholderReplacementPairs.get(placeholder)); + newLore.add(newLoreString); + } + newMeta.setLore(newLore); + } + + cloneItemStack.setItemMeta(newMeta); + return cloneItemStack; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/Lerp.java b/src/main/java/com/magmaguy/elitemobs/utils/Lerp.java new file mode 100644 index 000000000..7b9f776fe --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/Lerp.java @@ -0,0 +1,16 @@ +package com.magmaguy.elitemobs.utils; + +import org.bukkit.Location; + +public class Lerp { + public static Location lerpLocation(Location startLocation, Location endLocation, double timePercentage) { + return new Location(startLocation.getWorld(), + lerp(startLocation.getX(), endLocation.getX(), timePercentage), + lerp(startLocation.getY(), endLocation.getY(), timePercentage), + lerp(startLocation.getZ(), endLocation.getZ(), timePercentage)); + } + + public static double lerp(double start, double end, double timePercentage) { + return start * (1 - timePercentage) + end * timePercentage; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/MapListInterpreter.java b/src/main/java/com/magmaguy/elitemobs/utils/MapListInterpreter.java new file mode 100644 index 000000000..d61895213 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/MapListInterpreter.java @@ -0,0 +1,176 @@ +package com.magmaguy.elitemobs.utils; + +import com.magmaguy.elitemobs.config.LegacyValueConverter; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.Particle; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + +public class MapListInterpreter { + private static void parsingErrorMessage(String key, Object value, String scriptName) { + Logger.warn("Failed to read value " + value + " for key " + key + " in script " + scriptName); + } + + public static String parseString(String key, Object value, String scriptName) { + return ChatColorConverter.convert(value + ""); + } + + public static List parseStringList(String key, Object value, String scriptName) { + if (value == null) return new ArrayList<>(); + try { + return ChatColorConverter.convert((List) value); + } catch (Exception ex) { + Logger.warn("Failed to get string list for key " + key + " with value " + value + " in script " + scriptName); + return new ArrayList<>(); + } + } + + public static Boolean parseBoolean(String key, Object value, String scriptName) { + try { + if (value instanceof Boolean boo) + return boo; + else + return Boolean.parseBoolean((String) value); + } catch (Exception ex) { + parsingErrorMessage(key, value, scriptName); + return null; + } + } + + public static Integer parseInteger(String key, Object value, String scriptName) { + try { + if (value instanceof Integer intValue) + return intValue; + else if (value instanceof String stringValue) { + if (stringValue.contains("~")) { + String[] strings = stringValue.split("~"); + return ThreadLocalRandom.current().nextInt(Integer.parseInt(strings[0]), Integer.parseInt(strings[1]) + 1); + } + return Integer.parseInt(stringValue); + } else { + Logger.warn("Failed to get integer value from " + value + " in script " + scriptName); + return null; + } + } catch (Exception ex) { + parsingErrorMessage(key, value, scriptName); + return null; + } + } + + + public static Double parseDouble(String key, Object value, String scriptName) { + try { + if (value instanceof Integer integer) + return integer.doubleValue(); + else if (value instanceof Double dbl) + return dbl; + else if (value instanceof String string) + return Double.parseDouble(string); + } catch (Exception ex) { + parsingErrorMessage(key, value, scriptName); + return null; + } + return null; + } + + public static Float parseFloat(String key, Object value, String scriptName) { + try { + if (value instanceof Integer integer) + return integer.floatValue(); + else if (value instanceof Double dbl) + return dbl.floatValue(); + else if (value instanceof String string) + return Float.parseFloat(string); + } catch (Exception ex) { + parsingErrorMessage(key, value, scriptName); + return null; + } + return null; + } + + public static > T parseEnum(String key, Object value, Class enumClass, String scriptName) { + if (enumClass.isAssignableFrom(Particle.class)) + value = LegacyValueConverter.parseParticle((String) value); + else if (enumClass.isAssignableFrom(PotionEffectType.class)) + value = LegacyValueConverter.parsePotionEffect((String) value); + try { + return Enum.valueOf(enumClass, (String) value); + } catch (Exception ex) { + parsingErrorMessage(key, value, scriptName); + } + return null; + } + + public static > List parseEnumList(String key, Object value, Class enumClass, String scriptName) { + try { + if (value instanceof List valueList) { + List parsedList = new ArrayList<>(); + for (Object rawEnum : valueList) { + if (!(rawEnum instanceof String)) { + Logger.warn("Expected string, got something else!"); + parsingErrorMessage(key, value, scriptName); + continue; + } + parsedList.add(Enum.valueOf(enumClass, (String) rawEnum)); + } + return parsedList; + } else { + parsingErrorMessage(key, value, scriptName); + return null; + } + } catch (Exception ex) { + parsingErrorMessage(key, value, scriptName); + } + return null; + } + + + public static > List> parseEnumListList(String key, Object value, Class enumClass, String scriptName) { + List> parsedList = new ArrayList<>(); + try { + if (value instanceof List valueList) { + for (Object rawLastList : valueList) { + if (!(rawLastList instanceof List)) { + Logger.warn("Expected list of list, got something else!"); + parsingErrorMessage(key, value, scriptName); + return parsedList; + } + List lastList = new ArrayList<>(); + for (Object rawEnum : (List) rawLastList) { + if (!(rawEnum instanceof String)) { + Logger.warn("Expected string, got something else!"); + parsingErrorMessage(key, value, scriptName); + continue; + } + lastList.add(Enum.valueOf(enumClass, (String) rawEnum)); + } + parsedList.add(lastList); + } + + } else { + Logger.warn("Expected list, got something else!"); + parsingErrorMessage(key, value, scriptName); + return parsedList; + } + } catch (Exception ex) { + parsingErrorMessage(key, value, scriptName); + return parsedList; + } + return parsedList; + } + + public static Vector parseVector(String key, Object value, String scriptName) { + try { + String[] strings = ((String) value).split(","); + return new Vector(Double.parseDouble(strings[0]), Double.parseDouble(strings[1]), Double.parseDouble(strings[2])); + } catch (Exception ex) { + parsingErrorMessage(key, value, scriptName); + } + return new Vector(0, 0, 0); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/NonSolidBlockTypes.java b/src/main/java/com/magmaguy/elitemobs/utils/NonSolidBlockTypes.java new file mode 100644 index 000000000..0044aa314 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/NonSolidBlockTypes.java @@ -0,0 +1,15 @@ +package com.magmaguy.elitemobs.utils; + +import org.bukkit.Material; + +import java.util.ArrayList; + +public class NonSolidBlockTypes { + + private static final ArrayList nonSolidBlocks = new ArrayList<>(); + + public static boolean isPassthrough(Material material) { + return !material.isSolid(); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/ObfuscatedStringHandler.java b/src/main/java/com/magmaguy/elitemobs/utils/ObfuscatedStringHandler.java new file mode 100644 index 000000000..15fba2c32 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/ObfuscatedStringHandler.java @@ -0,0 +1,42 @@ +package com.magmaguy.elitemobs.utils; + +public class ObfuscatedStringHandler { + private ObfuscatedStringHandler() { + } + + public static String obfuscateString(String originalString) { + + String insert = "§"; + int period = 1; + + StringBuilder stringBuilder = new StringBuilder(originalString.length() + insert.length() * (originalString.length() / period)); + + int index = 0; + String prefix = ""; + + while (index < originalString.length()) { + + stringBuilder.append(prefix); + prefix = insert; + stringBuilder.append(originalString, index, Math.min(index + period, originalString.length())); + index += period; + + } + + String finalString = stringBuilder.toString(); + + finalString = "§" + finalString; + + return finalString; + + } + + public static boolean checkString(String obfuscatedString, String targetString) { + return deobfuscateString(obfuscatedString).contains(targetString); + } + + public static String deobfuscateString(String obfuscatedString) { + return obfuscatedString.replace("§", ""); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/ObjectSerializer.java b/src/main/java/com/magmaguy/elitemobs/utils/ObjectSerializer.java new file mode 100644 index 000000000..ffa0f816d --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/ObjectSerializer.java @@ -0,0 +1,88 @@ +package com.magmaguy.elitemobs.utils; + + +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.io.BukkitObjectInputStream; +import org.bukkit.util.io.BukkitObjectOutputStream; +import org.yaml.snakeyaml.external.biz.base64Coder.Base64Coder; + +import java.io.*; +import java.util.Base64; + +public class ObjectSerializer { + + private ObjectSerializer() { + } + + /** + * Read the object from Base64 string. + */ + public static Object fromString(String s) throws IOException, + ClassNotFoundException { + byte[] data = Base64.getDecoder().decode(s); + ObjectInputStream ois = new ObjectInputStream( + new ByteArrayInputStream(data)); + Object o = ois.readObject(); + ois.close(); + return o; + } + + /** + * Write the object to a Base64 string. + */ + public static String toString(Serializable o) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(baos); + oos.writeObject(o); + oos.close(); + return Base64.getEncoder().encodeToString(baos.toByteArray()); + } + + /** + * A method to serialize an {@link ItemStack} array to Base64 String. + *

+ *

+ * + * @param itemStack to turn into a Base64 String. + * @return Base64 string of the items. + * @throws IllegalStateException + */ + public static String itemStackArrayToBase64(ItemStack itemStack) throws IllegalStateException { + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + BukkitObjectOutputStream dataOutput = new BukkitObjectOutputStream(outputStream); + + // Write the size of the inventory + //dataOutput.writeInt(1); + dataOutput.writeObject(itemStack); + + // Serialize that array + dataOutput.close(); + return Base64Coder.encodeLines(outputStream.toByteArray()); + } catch (Exception e) { + throw new IllegalStateException("Unable to save item stacks.", e); + } + } + + /** + * Gets an array of ItemStacks from Base64 string. + *

+ *

+ * + * @param data Base64 string to convert to ItemStack array. + * @return ItemStack array created from the Base64 string. + * @throws IOException + */ + public static ItemStack itemStackArrayFromBase64(String data) throws IOException { + try { + ByteArrayInputStream inputStream = new ByteArrayInputStream(Base64Coder.decodeLines(data)); + BukkitObjectInputStream dataInput = new BukkitObjectInputStream(inputStream); + ItemStack itemStack = (ItemStack) dataInput.readObject(); + dataInput.close(); + return itemStack; + } catch (ClassNotFoundException e) { + throw new IOException("Unable to decode class type.", e); + } + } + +} \ No newline at end of file diff --git a/src/main/java/com/magmaguy/elitemobs/utils/PersistentVanillaData.java b/src/main/java/com/magmaguy/elitemobs/utils/PersistentVanillaData.java new file mode 100644 index 000000000..fbc13a7f1 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/PersistentVanillaData.java @@ -0,0 +1,44 @@ +package com.magmaguy.elitemobs.utils; + +import com.magmaguy.elitemobs.MetadataHandler; +import org.bukkit.NamespacedKey; +import org.bukkit.entity.Entity; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.persistence.PersistentDataType; + +public class PersistentVanillaData { + private PersistentVanillaData() { + } + + public static void write(Entity entity, String key, String value) { + entity.getPersistentDataContainer().set(getKey(key), PersistentDataType.STRING, value); + } + + public static void write(ItemStack itemStack, String key, double value) { + ItemMeta itemMeta = itemStack.getItemMeta(); + itemMeta.getPersistentDataContainer().set(getKey(key), PersistentDataType.DOUBLE, value); + itemStack.setItemMeta(itemMeta); + } + + public static boolean hasString(Entity entity, String key) { + return entity.getPersistentDataContainer().has(getKey(key), PersistentDataType.STRING); + } + + public static String getString(Entity entity, String key) { + return entity.getPersistentDataContainer().get(getKey(key), PersistentDataType.STRING); + } + + public static double getDouble(ItemStack itemStack, String key) { + if (itemStack == null || itemStack.getItemMeta() == null) return -1; + if (!itemStack.getItemMeta().getPersistentDataContainer().has(getKey(key), PersistentDataType.DOUBLE)) + return -1; + Double d = itemStack.getItemMeta().getPersistentDataContainer().get(getKey(key), PersistentDataType.DOUBLE); + return d == null ? -1 : d; + } + + private static NamespacedKey getKey(String key) { + return new NamespacedKey(MetadataHandler.PLUGIN, key); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/PlayerHeads.java b/src/main/java/com/magmaguy/elitemobs/utils/PlayerHeads.java new file mode 100644 index 000000000..da6657cd9 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/PlayerHeads.java @@ -0,0 +1,20 @@ +package com.magmaguy.elitemobs.utils; + +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.SkullMeta; + +public class PlayerHeads { + + public static ItemStack exclamation() { + ItemStack exclamation; + exclamation = new ItemStack(Material.PLAYER_HEAD); + SkullMeta exclamationMeta = (SkullMeta) exclamation.getItemMeta(); + exclamationMeta.setOwner("MHF_Exclamation"); + exclamation.setItemMeta(exclamationMeta); + + return exclamation; + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/PlayerScanner.java b/src/main/java/com/magmaguy/elitemobs/utils/PlayerScanner.java new file mode 100644 index 000000000..8616b26a5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/PlayerScanner.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.utils; + +import com.magmaguy.elitemobs.playerdata.ElitePlayerInventory; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class PlayerScanner { + private static final int range = Math.max(Bukkit.getServer().getViewDistance() * 16, 5 * 16); + + public static List getNearbyPlayers(Location location) { + List nearbyPlayers = new ArrayList<>(); + for (Player player : Bukkit.getOnlinePlayers()) + if (player.getWorld().equals(location.getWorld()) && + player.getLocation().distanceSquared(location) <= range * range && + ElitePlayerInventory.playerInventories.get(player.getUniqueId()) != null) + nearbyPlayers.add(player); + return nearbyPlayers; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/PotionEffectTypeUtil.java b/src/main/java/com/magmaguy/elitemobs/utils/PotionEffectTypeUtil.java new file mode 100644 index 000000000..f4f3a2185 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/PotionEffectTypeUtil.java @@ -0,0 +1,31 @@ +package com.magmaguy.elitemobs.utils; + +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.NamespacedKey; +import org.bukkit.potion.PotionEffectType; + +public class PotionEffectTypeUtil { + + public static PotionEffectType getByKey(String key) { + try { + PotionEffectType potionEffectType = PotionEffectType.getByKey(NamespacedKey.fromString(key)); + if (potionEffectType != null) + return potionEffectType; + else + return getByName(key); + } catch (NoSuchMethodError noSuchMethodError) { + //1.16 workaround + return getByName(key); + } + } + + private static PotionEffectType getByName(String name) { + PotionEffectType potionEffectType = PotionEffectType.getByName(name); + if (potionEffectType != null) + return potionEffectType; + else { + Logger.warn("Failed to get potion effect type in script for key " + name + "!"); + return null; + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/RawEnchantmentGetters.java b/src/main/java/com/magmaguy/elitemobs/utils/RawEnchantmentGetters.java new file mode 100644 index 000000000..93eb7fd3a --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/RawEnchantmentGetters.java @@ -0,0 +1,52 @@ +package com.magmaguy.elitemobs.utils; + +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; + +import java.util.HashMap; +import java.util.Map; + +public class RawEnchantmentGetters { + + /** + * Catches the obfuscated levels which are the values EliteMobs works with. Should only get called if the item + * has the signature obfuscated lore. + * + * @param itemStack ItemStack to get analysed + * @return HashMap of all obfuscated enchantments + */ + public static Map vanillaEnchantmentsList(ItemStack itemStack) { + + return vanillaEnchantmentsList(itemStack.getEnchantments(), itemStack.getItemMeta().getLore().get(0)); + + } + + public static Map vanillaEnchantmentsList(Map actualEnchantmentsList, String obfuscatedLore) { + + Map enchantmentsMap = new HashMap(); + + if (actualEnchantmentsList.isEmpty()) + return enchantmentsMap; + + for (Enchantment enchantment : actualEnchantmentsList.keySet()) + enchantmentsMap.put(enchantment, getDeobfuscatedLevel(obfuscatedLore, enchantment.getName())); + + return enchantmentsMap; + + } + + private static int getDeobfuscatedLevel(String obfuscatedLore, String enchantmentName) { + + String deobfuscatedLore = obfuscatedLore.replace("§", ""); + + for (String stringPairs : deobfuscatedLore.split(",")) { + String[] stringList = stringPairs.split(":"); + if (stringList[0].equalsIgnoreCase(enchantmentName)) + return Integer.parseInt(stringList[1]); + } + + return 0; + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/ServerTime.java b/src/main/java/com/magmaguy/elitemobs/utils/ServerTime.java new file mode 100644 index 000000000..6a9fe24d6 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/ServerTime.java @@ -0,0 +1,17 @@ +package com.magmaguy.elitemobs.utils; + +import com.magmaguy.elitemobs.MetadataHandler; +import lombok.Getter; +import org.bukkit.Bukkit; + +public class ServerTime { + @Getter + private static double time = 0; + + private ServerTime() { + } + + public static void startTickCounter() { + Bukkit.getScheduler().scheduleSyncRepeatingTask(MetadataHandler.PLUGIN, () -> time++, 0, 1); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/SimpleScoreboard.java b/src/main/java/com/magmaguy/elitemobs/utils/SimpleScoreboard.java new file mode 100644 index 000000000..e90fbc958 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/SimpleScoreboard.java @@ -0,0 +1,43 @@ +package com.magmaguy.elitemobs.utils; + +import com.magmaguy.elitemobs.MetadataHandler; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scoreboard.*; + +import java.util.List; + +public class SimpleScoreboard { + + public static Scoreboard lazyScoreboard(Player player, String displayName, List scoreboardContents) { + Scoreboard scoreboard = Bukkit.getScoreboardManager().getNewScoreboard(); + int lineCount = Math.min(scoreboardContents.size(), 15); + + Objective objective = scoreboard.registerNewObjective("test", Criteria.DUMMY, displayName); + objective.setDisplaySlot(DisplaySlot.SIDEBAR); + for (int i = 0; i < lineCount; i++) { + String scoreString = scoreboardContents.get(i); + if (scoreString.length() > 40) scoreString = scoreString.substring(0, 39); + Score score = objective.getScore(scoreString); + score.setScore(i); + } + + player.setScoreboard(scoreboard); + + return scoreboard; + } + + public static Scoreboard temporaryScoreboard(Player player, String displayName, List scoreboardContents, int ticksTimeout) { + Scoreboard scoreboard = lazyScoreboard(player, displayName, scoreboardContents); + new BukkitRunnable() { + @Override + public void run() { + if (player.getScoreboard().equals(scoreboard)) + player.setScoreboard(Bukkit.getScoreboardManager().getNewScoreboard()); + } + }.runTaskLater(MetadataHandler.PLUGIN, ticksTimeout); + + return scoreboard; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/StringColorAnimator.java b/src/main/java/com/magmaguy/elitemobs/utils/StringColorAnimator.java new file mode 100644 index 000000000..2966af660 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/StringColorAnimator.java @@ -0,0 +1,58 @@ +package com.magmaguy.elitemobs.utils; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.magmacore.util.ChatColorConverter; +import org.bukkit.ChatColor; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitRunnable; + +public class StringColorAnimator { + private StringColorAnimator() { + } + + public static void startTitleAnimation(Player player, String title, String subtitle, ChatColor primaryColor, ChatColor secondaryColor) { + + subtitle = ChatColor.stripColor(subtitle); + + String finalSubtitle = subtitle; + new BukkitRunnable() { + final int titleSize = title.length(); + final int subtitleSize = finalSubtitle.length(); + int counter = 0; + int titleIndex = 0; + int subtitleIndex = 0; + + @Override + public void run() { + + counter++; + + if (titleIndex <= titleSize) { + StringBuilder newTitle = new StringBuilder(title).insert(titleIndex, primaryColor); + if (titleIndex > 1) + newTitle.insert(titleIndex - 2, secondaryColor); + titleIndex++; + player.sendTitle(primaryColor + ChatColorConverter.convert(newTitle.toString()), + secondaryColor + ChatColorConverter.convert(finalSubtitle), 0, 5, 0); + return; + } + + if (subtitleIndex > subtitleSize) { + cancel(); + return; + } + + StringBuilder newSubtitle = new StringBuilder(finalSubtitle).insert(subtitleIndex, secondaryColor); + if (subtitleIndex > 1) + newSubtitle.insert(subtitleIndex - 2, primaryColor); + subtitleIndex++; + player.sendTitle("", + secondaryColor + ChatColorConverter.convert(newSubtitle.toString()), 0, 5, 0); + + } + + }.runTaskTimer(MetadataHandler.PLUGIN, 0, 2); + + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/VersionChecker.java b/src/main/java/com/magmaguy/elitemobs/utils/VersionChecker.java deleted file mode 100644 index 35b7d70e6..000000000 --- a/src/main/java/com/magmaguy/elitemobs/utils/VersionChecker.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.magmaguy.elitemobs.utils; - -import org.bukkit.Bukkit; - -public class VersionChecker { - - public static boolean currentVersionIsUnder(int version, int subVersion) { - - if (Bukkit.getBukkitVersion().split("[.]").length < 4) { - - try { - return Integer.parseInt(Bukkit.getBukkitVersion().split("[.]")[1].substring(0, 2)) < version; - } catch (Exception ex) { - return Integer.parseInt(Bukkit.getBukkitVersion().split("[.]")[1].substring(0, 1)) < version; - } - - } - - if (Integer.parseInt(Bukkit.getBukkitVersion().split("[.]")[1]) < version) return true; - - if (Integer.parseInt(Bukkit.getBukkitVersion().split("[.]")[1]) == version) { - try { - - byte actualSubversion = Byte.parseByte(Bukkit.getBukkitVersion().split("[.]")[2].substring(0, 1)); - return actualSubversion < subVersion; - - } catch (Exception e) { - - try { - - byte actualSubversion = Byte.parseByte(Bukkit.getBukkitVersion().split("[.]")[2].substring(0, 0)); - return actualSubversion < subVersion; - - } catch (Exception ex) { - - Bukkit.getLogger().warning("[EliteMobs] Couldn't read version properly, report this to the developer!"); - return false; - - } - } - - } - - return false; - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/VisualDisplay.java b/src/main/java/com/magmaguy/elitemobs/utils/VisualDisplay.java new file mode 100644 index 000000000..4f935b9dd --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/VisualDisplay.java @@ -0,0 +1,47 @@ +package com.magmaguy.elitemobs.utils; + +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.magmacore.util.ChatColorConverter; +import org.bukkit.Location; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Display; +import org.bukkit.entity.TextDisplay; +import org.bukkit.util.Consumer; + + +public class VisualDisplay { + + public static ArmorStand generateTemporaryArmorStand(Location location, String customName) { + ArmorStand visualArmorStand = location.getWorld().spawn(location, ArmorStand.class, new Consumer() { + @Override + public void accept(ArmorStand armorStand) { + armorStand.setVisible(false); + armorStand.setMarker(true); + armorStand.setCustomName(ChatColorConverter.convert(customName)); + armorStand.setCustomNameVisible(true); + armorStand.setGravity(false); + armorStand.setRemoveWhenFarAway(true); + armorStand.setPersistent(false); + } + }); + EntityTracker.registerVisualEffects(visualArmorStand); + return visualArmorStand; + } + + public static TextDisplay generateTemporaryTextDisplay(Location location, String customName) { + TextDisplay visualArmorStand = location.getWorld().spawn(location, TextDisplay.class, new Consumer() { + @Override + public void accept(TextDisplay textDisplay) { + textDisplay.setText(ChatColorConverter.convert(customName)); + textDisplay.setPersistent(false); + textDisplay.setInterpolationDelay(0); + textDisplay.setInterpolationDuration(0); + textDisplay.setBillboard(Display.Billboard.VERTICAL); + textDisplay.setShadowed(false); + } + }); + EntityTracker.registerVisualEffects(visualArmorStand); + return visualArmorStand; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/WeightedProbability.java b/src/main/java/com/magmaguy/elitemobs/utils/WeightedProbability.java new file mode 100644 index 000000000..a4e4e91d0 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/WeightedProbability.java @@ -0,0 +1,41 @@ +package com.magmaguy.elitemobs.utils; + +import com.magmaguy.elitemobs.items.customitems.CustomItem; + +import java.util.HashMap; + +public class WeightedProbability { + + public static String pickWeighedProbability(HashMap weighedValues) { + double totalWeight = 0; + for (String string : weighedValues.keySet()) + totalWeight += weighedValues.get(string); + String selectedString = null; + double random = Math.random() * totalWeight; + for (String string : weighedValues.keySet()) { + random -= weighedValues.get(string); + if (random <= 0) { + selectedString = string; + break; + } + } + return selectedString; + } + + public static CustomItem pickWeighedProbabilityFromCustomItems(HashMap weighedValues) { + double totalWeight = 0; + for (CustomItem customItem : weighedValues.keySet()) + totalWeight += weighedValues.get(customItem); + CustomItem selectedCustomItem = null; + double random = Math.random() * totalWeight; + for (CustomItem customItem : weighedValues.keySet()) { + random -= weighedValues.get(customItem); + if (random <= 0) { + selectedCustomItem = customItem; + break; + } + } + return selectedCustomItem; + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/WeightedProbablity.java b/src/main/java/com/magmaguy/elitemobs/utils/WeightedProbablity.java deleted file mode 100644 index c5fc32c7c..000000000 --- a/src/main/java/com/magmaguy/elitemobs/utils/WeightedProbablity.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.magmaguy.elitemobs.utils; - -import java.util.HashMap; - -public class WeightedProbablity { - - public static String pickWeighedProbability(HashMap weighedValues) { - - double totalWeight = 0; - - for (String string : weighedValues.keySet()) { - - totalWeight += weighedValues.get(string); - - } - - String selectedString = null; - double random = Math.random() * totalWeight; - - for (String string : weighedValues.keySet()) { - - random -= weighedValues.get(string); - - if (random <= 0) { - - selectedString = string; - break; - - } - - } - - return selectedString; - - } - - -} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/WorldInstantiator.java b/src/main/java/com/magmaguy/elitemobs/utils/WorldInstantiator.java new file mode 100644 index 000000000..ba4b8db91 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/WorldInstantiator.java @@ -0,0 +1,91 @@ +package com.magmaguy.elitemobs.utils; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.magmacore.util.Logger; +import org.bukkit.Bukkit; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.List; + +public class WorldInstantiator { + + public static File cloneWorld(String worldName, String targetWorldName, String dungeonConfigurationFolderName) { + File blueprintWorld = new File(MetadataHandler.PLUGIN.getDataFolder().getAbsolutePath() + File.separatorChar + + "world_blueprints" + File.separatorChar + dungeonConfigurationFolderName + File.separatorChar + worldName); + if (!blueprintWorld.exists()) { + Logger.warn("Blueprint world " + worldName + " does not exist! Path: " + blueprintWorld.getAbsolutePath()); + return null; + } + if (!blueprintWorld.isDirectory()) { + Logger.warn("Blueprint world " + worldName + " is not a directory!"); + return null; + } + + File destinationWorld = new File(Bukkit.getWorldContainer().getAbsolutePath().replace("\\.", "\\") + File.separatorChar + targetWorldName); + if (destinationWorld.exists()) + recursivelyDelete(destinationWorld); + + copyAll(blueprintWorld, destinationWorld); + + return destinationWorld; + } + + private static void copyAll(File directoryToClone, File targetDirectory) { + for (File child : directoryToClone.listFiles()) + copy(child, Paths.get(targetDirectory.getPath() + File.separatorChar + child.getName())); + } + + private static void copy(File file, Path targetPath) { + try { + if (!targetPath.getParent().toFile().exists()) targetPath.getParent().toFile().mkdirs(); + + if (file.isDirectory()) { + if (!targetPath.toFile().exists()) + targetPath.toFile().mkdirs(); + for (File child : file.listFiles()) + copy(child, Paths.get(targetPath.toString() + File.separatorChar + child.getName())); + } else + Files.copy(file.toPath(), targetPath, StandardCopyOption.REPLACE_EXISTING); + } catch (Exception ex) { + Logger.warn("Failed to copy file " + file.toString() + " to " + targetPath.toString()); + ex.printStackTrace(); + } + } + + public static void recursivelyDelete(File file) { + if (!file.exists()) { + Logger.info("Attempted to recursively file " + file.getAbsolutePath() + " which doesn't exist."); + return; + } + if (file.isDirectory()) { + for (File subFile : file.listFiles()) + recursivelyDelete(subFile); + file.delete(); + } else file.delete(); + } + + public static String getNewWorldName(String blueprintWorldName) { + List worldNames = new ArrayList<>(); + Bukkit.getWorlds().forEach(world -> worldNames.add(world.getName())); + for (File file : Bukkit.getWorldContainer().listFiles()) worldNames.add(file.getName()); + int highestNumber = 0; + + for (String worldName : worldNames) { + if (worldName.contains(blueprintWorldName)) { + try { + String[] strings = worldName.replace(blueprintWorldName, "").split("_"); + int worldNumber = Integer.parseInt(strings[strings.length - 1]); + if (worldNumber > highestNumber) highestNumber = worldNumber; + } catch (Exception exception) { + } + } + } + highestNumber++; + return blueprintWorldName + "_" + highestNumber; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/shapes/Cuboid.java b/src/main/java/com/magmaguy/elitemobs/utils/shapes/Cuboid.java new file mode 100644 index 000000000..f3a352a97 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/shapes/Cuboid.java @@ -0,0 +1,107 @@ +package com.magmaguy.elitemobs.utils.shapes; + +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.LivingEntity; +import org.bukkit.util.BoundingBox; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class Cuboid extends Shape { + private final double x; + private final double y; + private final double xBorder; + private final double yBorder; + private Location centerLocation = null; + private List locationVectors = null; + private List edgeVectors = null; + private double z; + private double zBorder; + + public Cuboid(Double x, Double y, Double z, Double xBorder, Double yBorder, Double zBorder, Location centerLocation) { + this.x = x; + this.y = y; + this.z = z; + this.xBorder = xBorder; + this.yBorder = yBorder; + this.zBorder = zBorder; + this.centerLocation = centerLocation; + if (x != 0 && z == 0) this.z = x; + if (xBorder != 0 && zBorder == 0) this.zBorder = xBorder; + } + + @Override + public boolean contains(Location position) { + Vector localVector = position.clone().subtract(centerLocation).toVector(); + if (Math.abs(localVector.getX()) > x) return false; + if (Math.abs(localVector.getY()) > y) return false; + return !(Math.abs(localVector.getZ()) > z); + } + + @Override + public boolean contains(LivingEntity livingEntity) { + BoundingBox boundingBox = new BoundingBox( + Math.floor(x / 2D + centerLocation.getBlockX()), y / 2D + centerLocation.getBlockY(), Math.floor(z / 2D + centerLocation.getBlockZ()), + Math.floor(-x / 2D + centerLocation.getBlockX()), centerLocation.getBlockY(), Math.floor(-z / 2D + centerLocation.getBlockZ())); + return livingEntity.getBoundingBox().overlaps(boundingBox); + } + + @Override + public boolean borderContains(Location position) { + Vector localVector = position.clone().subtract(centerLocation).toVector(); + if (!(Math.abs(localVector.getX()) <= x / 2D && Math.abs(localVector.getX()) >= xBorder / 2D || + Math.abs(localVector.getZ()) <= z / 2D && Math.abs(localVector.getZ()) >= zBorder / 2D)) return false; + return !(y > 0) || !(Math.abs(localVector.getY()) <= y) || !(Math.abs(localVector.getY()) >= yBorder); + } + + @Override + public void visualize(Particle particle) { + + } + + @Override + public Location getCenter() { + return centerLocation; + } + + @Override + public List getEdgeLocations() { + return convert(getEdgeVectors()); + } + + public List getEdgeVectors() { + if (edgeVectors != null) return edgeVectors; + edgeVectors = new ArrayList<>(); + for (Vector vector : getLocationVectors()) + if (vector.getY() <= yBorder && + (Math.abs(vector.getX()) >= Math.floor(xBorder / 2d) || Math.abs(vector.getZ()) >= Math.floor(zBorder / 2d))) + edgeVectors.add(vector); + return edgeVectors; + } + + private List getLocationVectors() { + if (locationVectors != null) return locationVectors; + locationVectors = new ArrayList<>(); + double xHalf = Math.floor(x / 2d); + double zHalf = Math.floor(z / 2d); + for (int localX = 0; localX < x; localX++) + for (int localZ = 0; localZ < z; localZ++) + for (int localY = 0; localY < y; localY++) + locationVectors.add(new Vector(localX - xHalf, localY, localZ - zHalf)); + + return locationVectors; + } + + @Override + public List getLocations() { + return convert(getLocationVectors()); + } + + private List convert(List vectors) { + return vectors.stream().map(edge -> centerLocation.clone().add(edge)).collect(Collectors.toList()); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/shapes/Cylinder.java b/src/main/java/com/magmaguy/elitemobs/utils/shapes/Cylinder.java new file mode 100644 index 000000000..b684dc2ba --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/shapes/Cylinder.java @@ -0,0 +1,117 @@ +package com.magmaguy.elitemobs.utils.shapes; + +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.LivingEntity; +import org.bukkit.util.BoundingBox; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class Cylinder extends Shape { + + private final Vector center; + private final double radius; + private final double height; + private final List edgeVectors = null; + private double borderRadius = 1; + private Location centerLocation = null; + private List locationVectors = null; + + public Cylinder(Location centerLocation, double radius, double height, double borderRadius) { + this.centerLocation = centerLocation.clone(); + this.center = centerLocation.toVector(); + this.radius = radius; + this.height = height; + this.borderRadius = borderRadius; + } + + public Cylinder(Vector center, double radius, double height) { + this.center = center; + this.radius = radius; + this.height = height; + } + + public boolean contains(Vector position) { + double dX = position.getX() - center.getX(); + double dZ = position.getZ() - center.getZ(); + return dX * dX + dZ * dZ < radius * radius && position.getY() < center.getY() + height && position.getY() >= center.getY(); + } + + public boolean borderContains(Location position) { + Cylinder innerCylinder = new Cylinder(centerLocation, borderRadius, height, borderRadius); + return contains(position) && !innerCylinder.contains(position); + } + + public boolean contains(Location position) { + return contains(position.toVector()); + } + + @Override + public boolean contains(LivingEntity livingEntity) { + BoundingBox boundingBox = livingEntity.getBoundingBox(); + if (centerLocation.getY() > boundingBox.getMinY() || centerLocation.getY() + height < boundingBox.getMaxY()) + return false; + + double circleDistanceX = Math.abs(centerLocation.getX() - boundingBox.getCenterX()); + double circleDistanceZ = Math.abs(centerLocation.getZ() - boundingBox.getCenterZ()); + + if (circleDistanceX > (boundingBox.getWidthX() / 2d + radius)) return false; + if (circleDistanceZ > (boundingBox.getWidthZ() / 2d + radius)) return false; + + if (circleDistanceX <= (boundingBox.getWidthX() / 2d)) return true; + if (circleDistanceZ <= (boundingBox.getWidthZ() / 2d)) return true; + + double cornerDistanceSquared = Math.pow((circleDistanceX - boundingBox.getWidthX()) / 2D, 2) + + Math.pow((circleDistanceZ - boundingBox.getWidthZ()) / 2D, 2); + + return cornerDistanceSquared <= radius * radius; + } + + public void visualize(Particle particle) { + getLocations().forEach(newLocation -> newLocation.getWorld().spawnParticle(particle, newLocation, 1, 0, 0, 0, 0)); + } + + @Override + public Location getCenter() { + return centerLocation; + } + + @Override + public List getEdgeLocations() { + if (edgeVectors != null) return convert(edgeVectors); + List edgeLocations = new ArrayList<>(); + getLocations().forEach(iteratedLocation -> { + if (borderContains(iteratedLocation)) + edgeLocations.add(iteratedLocation); + }); + return edgeLocations; + } + + private List getLocationVectors() { + if (locationVectors != null) return locationVectors; + locationVectors = new ArrayList<>(); + for (int x = (int) -radius; x < (int) radius; x++) + for (int z = (int) -radius; z < (int) radius; z++) + for (int y = 0; y < height; y++) { + Vector newVector = new Vector(x, y, z); + Location newLocation = centerLocation.clone().add(newVector); + if (contains(newLocation)) locationVectors.add(newVector); + } + return locationVectors; + } + + @Override + public List getLocations() { + if (locationVectors != null) return convert(locationVectors); + return convert(getLocationVectors()); + } + + private List convert(List vectors) { + return vectors.stream().map(edge -> centerLocation.clone().add(edge)).collect(Collectors.toList()); + } + +} + diff --git a/src/main/java/com/magmaguy/elitemobs/utils/shapes/Dome.java b/src/main/java/com/magmaguy/elitemobs/utils/shapes/Dome.java new file mode 100644 index 000000000..bb36a7a54 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/shapes/Dome.java @@ -0,0 +1,37 @@ +package com.magmaguy.elitemobs.utils.shapes; + +import org.bukkit.Location; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; + +public class Dome extends Sphere { + public Dome(double radius, Location centerLocation, double borderRadius) { + super(radius, centerLocation, borderRadius); + } + + @Override + public boolean contains(Location position) { + return super.contains(position) && position.getY() > centerLocation.getY() - 1; + } + + @Override + public boolean borderContains(Location position) { + return super.borderContains(position) && position.getY() > centerLocation.getY() - 1; + } + + @Override + protected List getLocationVectors() { + if (locationVectors != null) return locationVectors; + locationVectors = new ArrayList<>(); + for (int x = (int) -radius; x < (int) radius; x++) + for (int z = (int) -radius; z < (int) radius; z++) + for (int y = 0; y < radius; y++) { + Vector newVector = new Vector(x, y, z); + Location newLocation = centerLocation.clone().add(newVector); + if (contains(newLocation)) locationVectors.add(newVector); + } + return locationVectors; + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/shapes/Ray.java b/src/main/java/com/magmaguy/elitemobs/utils/shapes/Ray.java new file mode 100644 index 000000000..91d6d568e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/shapes/Ray.java @@ -0,0 +1,219 @@ +package com.magmaguy.elitemobs.utils.shapes; + +import lombok.Getter; +import org.apache.commons.math3.complex.Quaternion; +import org.apache.commons.math3.geometry.euclidean.threed.Rotation; +import org.apache.commons.math3.geometry.euclidean.threed.Vector3D; +import org.apache.commons.math3.util.FastMath; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.LivingEntity; +import org.bukkit.util.BoundingBox; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; + +public class Ray extends Shape { + protected final double maxDistance = 500; + protected final boolean ignoresSolidBlocks; + protected double thickness; + protected Location centerLocation; + protected Location initialTargetLocation; + protected List locations = new ArrayList<>(); + protected Location currentSource; + protected Location currentTarget; + + public Ray(boolean ignoresSolidBlocks, double pointRadius, Location centerLocation, Location initialTargetLocation) { + this.ignoresSolidBlocks = ignoresSolidBlocks; + this.thickness = pointRadius; + this.centerLocation = centerLocation; + this.initialTargetLocation = initialTargetLocation; + this.currentSource = centerLocation; + this.currentTarget = initialTargetLocation; + } + + protected List drawLine(Location location1, Location location2) { + currentSource = location1; + currentTarget = location2; + List locations = new ArrayList<>(); + Vector raySegment = location2.clone().subtract(location1).toVector().normalize().multiply(thickness); + Location currentLocation = location1.clone(); + locations.add(location1); + for (int i = 0; i < maxDistance; i++) { + if (currentLocation.distanceSquared(location2) < Math.pow(thickness, 2)) break; + currentLocation.add(raySegment); + if (!ignoresSolidBlocks && currentLocation.getBlock().getType().isSolid()) break; + locations.add(currentLocation.clone()); + //currentLocation.getWorld().spawnParticle(Particle.SOUL_FIRE_FLAME, currentLocation, 1, 0,0,0,0); + } + return locations; + } + + //Children override this + @Override + public boolean contains(Location position) { + for (Location location : locations) + if (location.distanceSquared(position) < Math.pow(thickness, 2)) return true; + return false; + } + + @Override + public boolean contains(LivingEntity livingEntity) { + RayCuboid rayCuboid = new RayCuboid(thickness, currentSource, currentTarget); + return rayCuboid.AABBCheck(livingEntity); + } + + //Children override this + @Override + public boolean borderContains(Location position) { + return false; + } + + //Children override this + @Override + public void visualize(Particle particle) { + + } + + //Children override this + @Override + public Location getCenter() { + return centerLocation; + } + + //Children override this + @Override + public List getEdgeLocations() { + return null; + } + + //Children override this + @Override + public List getLocations() { + return locations; + } + + private class RayCuboid { + @Getter + private final double width; + @Getter + private final double height; + @Getter + private final Location centerLocation; + private final double maxX; + private final double minX; + private final double maxY; + private final double minY; + private final double maxZ; + private final double minZ; + @Getter + private Quaternion rotation; + + public RayCuboid(double width, Location sourceLocation, Location destinationLocation) { + this.width = width; + this.height = sourceLocation.toVector().subtract(destinationLocation.toVector()).length(); + this.centerLocation = sourceLocation; + calculateRotation(destinationLocation); + maxX = sourceLocation.getX() + width; + minX = sourceLocation.getX() - width; + maxY = sourceLocation.getY() + height; + minY = 0; + maxZ = sourceLocation.getZ() + width; + minZ = sourceLocation.getZ() - width; + } + + public static Quaternion shortestArcQuaternion(Vector vector0, Vector vector1) { + // Based on Stan Melax's article in Game Programming Gems + Quaternion quaternion = Quaternion.ZERO; + // Copy, since cannot modify local + Vector v0Copy = vector0.clone(); + Vector v1Copy = vector1.clone(); + v0Copy.normalize(); + v1Copy.normalize(); + + double d = v0Copy.dot(v1Copy); + // If dot == 1, vectors are the same + if (d >= 1.0f) { + return Quaternion.IDENTITY; + } + if (d < (1e-6f - 1.0f)) { + // Generate an axis + Vector axis = v0Copy.getCrossProduct(new Vector(1, 0, 0)); + if (axis.length() == 0) // pick another if colinear + axis = v0Copy.getCrossProduct(new Vector(0, 1, 0)); + axis.normalize(); + + // Create a quaternion from an angle and an axis + // The angle is in radians + double angle = FastMath.PI / 4D; + // Set the quaternion using the formula + quaternion = new Quaternion(Math.cos(angle / 2D), axis.getX() * Math.sin(angle / 2D), axis.getY() * Math.sin(angle / 2D), axis.getZ() * Math.sin(angle / 2D)); + quaternion.normalize(); + } else { + double s = FastMath.sqrt((1 + d) * 2); + double invs = 1 / s; + + // Compute cross product of two vectors + Vector c = v0Copy.getCrossProduct(v1Copy); + + double x = c.getX() * invs; + double y = c.getY() * invs; + double z = c.getZ() * invs; + double w = s * 0.5f; + quaternion = new Quaternion(w, x, y, z); + quaternion.normalize(); + } + return quaternion; + } + + private void calculateRotation(Location destinationLocation) { + Location verticalEndpoint = centerLocation.clone().add(new Vector(0, height, 0)); + Vector vector1 = verticalEndpoint.clone().subtract(centerLocation).toVector(); + + Vector vector2 = destinationLocation.clone().subtract(centerLocation).toVector(); + rotation = shortestArcQuaternion(vector1, vector2); + } + + public boolean AABBCheck(LivingEntity livingEntity) { + BoundingBox boundingBox = livingEntity.getBoundingBox(); + if (!centerLocation.getWorld().equals(livingEntity.getWorld())) return false; + + List vectorList = new ArrayList<>(); + vectorList.add(rotateVectorByQuaternion(new Vector(boundingBox.getMinX(), boundingBox.getMinY(), boundingBox.getMinZ()))); + vectorList.add(rotateVectorByQuaternion(new Vector(boundingBox.getMinX(), boundingBox.getMinY(), boundingBox.getMaxZ()))); + vectorList.add(rotateVectorByQuaternion(new Vector(boundingBox.getMinX(), boundingBox.getMaxY(), boundingBox.getMinZ()))); + vectorList.add(rotateVectorByQuaternion(new Vector(boundingBox.getMinX(), boundingBox.getMaxY(), boundingBox.getMaxZ()))); + vectorList.add(rotateVectorByQuaternion(new Vector(boundingBox.getMaxX(), boundingBox.getMinY(), boundingBox.getMinZ()))); + vectorList.add(rotateVectorByQuaternion(new Vector(boundingBox.getMaxX(), boundingBox.getMinY(), boundingBox.getMaxZ()))); + vectorList.add(rotateVectorByQuaternion(new Vector(boundingBox.getMaxX(), boundingBox.getMaxY(), boundingBox.getMinZ()))); + vectorList.add(rotateVectorByQuaternion(new Vector(boundingBox.getMaxX(), boundingBox.getMaxY(), boundingBox.getMaxZ()))); + Double newPlayerMinX = null, newPlayerMaxX = null, newPlayerMinY = null, newPlayerMaxY = null, newPlayerMinZ = null, newPlayerMaxZ = null; + for (Vector vector : vectorList) { + if (newPlayerMinX == null || newPlayerMinX > vector.getX()) newPlayerMinX = vector.getX(); + if (newPlayerMaxX == null || newPlayerMaxX < vector.getX()) newPlayerMaxX = vector.getX(); + if (newPlayerMinY == null || newPlayerMinY > vector.getY()) newPlayerMinY = vector.getY(); + if (newPlayerMaxY == null || newPlayerMaxY < vector.getY()) newPlayerMaxY = vector.getY(); + if (newPlayerMinZ == null || newPlayerMinZ > vector.getZ()) newPlayerMinZ = vector.getZ(); + if (newPlayerMaxZ == null || newPlayerMaxZ < vector.getZ()) newPlayerMaxZ = vector.getZ(); + } + + return (minX <= newPlayerMinX && maxX >= newPlayerMinX || + minX <= newPlayerMaxX && maxX >= newPlayerMaxX) + && + (minY <= newPlayerMinY && maxY >= newPlayerMinY || + minY <= newPlayerMaxY && maxY >= newPlayerMaxY) + && + (minZ <= newPlayerMinZ && maxZ >= newPlayerMinZ || + minZ <= newPlayerMaxZ && maxZ >= newPlayerMaxZ); + } + + private Vector rotateVectorByQuaternion(Vector originalVector) { + Vector vector = originalVector.clone().subtract(centerLocation.toVector()); + Vector3D localVector = new Vector3D(vector.getX(), vector.getY(), vector.getZ()); + Rotation localRotation = new Rotation(rotation.getQ0(), rotation.getQ1(), rotation.getQ2(), rotation.getQ3(), false); + Vector3D result = localRotation.applyTo(localVector); + return new Vector(result.getX(), result.getY(), result.getZ()).add(centerLocation.toVector()); + } + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/shapes/RotatingRay.java b/src/main/java/com/magmaguy/elitemobs/utils/shapes/RotatingRay.java new file mode 100644 index 000000000..3a91388a5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/shapes/RotatingRay.java @@ -0,0 +1,87 @@ +package com.magmaguy.elitemobs.utils.shapes; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.utils.Lerp; +import org.bukkit.Location; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; + +public class RotatingRay extends Ray { + + + private final int animationDuration; + private final Location originalCenterLocation; + private final Location target2; + private final Vector raySegment; + private final double distanceSquared; + + public RotatingRay(boolean ignoresSolidBlocks, + double pointRadius, + Location target, + Location target2, + double pitchPreRotation, + double yawPreRotation, + double pitchRotation, + double yawRotation, + int animationDuration) { + super(ignoresSolidBlocks, pointRadius, target, target2); + this.originalCenterLocation = target.clone(); + this.target2 = target2; + this.animationDuration = animationDuration; + raySegment = target2.clone().subtract(target).toVector().normalize().multiply(pointRadius * 2); + if (yawPreRotation != 0) + raySegment.rotateAroundY(Math.toRadians(yawPreRotation)); + if (pitchPreRotation != 0) { + Vector perpendicularVector = raySegment.clone().rotateAroundY(Math.toRadians(90)); + raySegment.rotateAroundAxis(perpendicularVector, Math.toRadians(pitchPreRotation)); + } + locations = drawLine(); + distanceSquared = target.distanceSquared(target2); + if (animationDuration > 0) startRotating(animationDuration, pitchRotation, yawRotation); + } + + protected List drawLine() { + List locations = new ArrayList<>(); + Location currentLocation = originalCenterLocation.clone(); + locations.add(originalCenterLocation); + for (int i = 0; i < maxDistance; i++) { + currentLocation.add(raySegment); + if (originalCenterLocation.distanceSquared(currentLocation) > distanceSquared) break; + if (!ignoresSolidBlocks && currentLocation.getBlock().getType().isSolid()) break; + locations.add(currentLocation.clone()); + } + return locations; + } + + + private void startRotating(int totalTickDuration, double pitchRotation, double yawRotation) { + double singleTickPitchRotation = pitchRotation != 0 ? pitchRotation / totalTickDuration : 0; + double singleTickYawRotation = yawRotation != 0 ? yawRotation / totalTickDuration : 0; + Vector perpendicularVector = raySegment.clone().setY(0).normalize().rotateAroundY(Math.toRadians(90)); + new BukkitRunnable() { + private int counter = 1; + + @Override + public void run() { + if (counter > animationDuration) { + cancel(); + return; + } + counter++; + + if (target2 != null) + centerLocation = Lerp.lerpLocation(originalCenterLocation, target2, counter / (double) animationDuration); + + if (singleTickPitchRotation > 0) + raySegment.rotateAroundAxis(perpendicularVector, Math.toRadians(singleTickPitchRotation)); + if (singleTickYawRotation > 0) + raySegment.rotateAroundY(Math.toRadians(singleTickYawRotation)); + locations = drawLine(); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 1L, 1L); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/shapes/Shape.java b/src/main/java/com/magmaguy/elitemobs/utils/shapes/Shape.java new file mode 100644 index 000000000..0bc6b8d4e --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/shapes/Shape.java @@ -0,0 +1,23 @@ +package com.magmaguy.elitemobs.utils.shapes; + +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.LivingEntity; + +import java.util.List; + +public abstract class Shape { + public abstract boolean contains(Location position); + + public abstract boolean contains(LivingEntity livingEntity); + + public abstract boolean borderContains(Location position); + + public abstract void visualize(Particle particle); + + public abstract Location getCenter(); + + public abstract List getEdgeLocations(); + + public abstract List getLocations(); +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/shapes/Sphere.java b/src/main/java/com/magmaguy/elitemobs/utils/shapes/Sphere.java new file mode 100644 index 000000000..c9a3c2929 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/shapes/Sphere.java @@ -0,0 +1,88 @@ +package com.magmaguy.elitemobs.utils.shapes; + +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.entity.LivingEntity; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class Sphere extends Shape { + + protected double radius; + protected List locationVectors = null; + protected List edgeVectors = null; + protected double borderRadius = 1; + protected Location centerLocation; + + public Sphere(double radius, Location centerLocation, double borderRadius) { + this.radius = radius; + this.centerLocation = centerLocation.clone(); + this.borderRadius = borderRadius; + } + + @Override + public boolean contains(Location position) { + return centerLocation.distanceSquared(position) < Math.pow(radius, 2); + } + + @Override + public boolean contains(LivingEntity livingEntity) { + double entityRadius = (livingEntity.getEyeLocation().getY() - livingEntity.getLocation().getY()) / 2D; + Location EntityCenterLocation = livingEntity.getLocation().add(new Vector(0, entityRadius, 0)); + double radiusSum = radius + entityRadius; + return EntityCenterLocation.distanceSquared(centerLocation) <= Math.pow(radiusSum, 2); + } + + @Override + public boolean borderContains(Location position) { + Sphere innerSphere = new Sphere(borderRadius, centerLocation, borderRadius); + return contains(position) && !innerSphere.contains(position); + } + + @Override + public void visualize(Particle particle) { + getLocations().forEach(newLocation -> newLocation.getWorld().spawnParticle(particle, newLocation, 1, 0, 0, 0, 0)); + } + + @Override + public Location getCenter() { + return centerLocation; + } + + @Override + public List getEdgeLocations() { + if (edgeVectors != null) return convert(edgeVectors); + List edgeLocations = new ArrayList<>(); + getLocations().forEach(iteratedLocation -> { + if (borderContains(iteratedLocation)) + edgeLocations.add(iteratedLocation); + }); + return edgeLocations; + } + + protected List getLocationVectors() { + if (locationVectors != null) return locationVectors; + locationVectors = new ArrayList<>(); + for (int x = (int) -radius; x < (int) radius; x++) + for (int z = (int) -radius; z < (int) radius; z++) + for (int y = (int) -radius; y < radius; y++) { + Vector newVector = new Vector(x, y, z); + Location newLocation = centerLocation.clone().add(newVector); + if (contains(newLocation)) locationVectors.add(newVector); + } + return locationVectors; + } + + @Override + public List getLocations() { + if (locationVectors != null) return convert(locationVectors); + return convert(getLocationVectors()); + } + + private List convert(List vectors) { + return vectors.stream().map(edge -> centerLocation.clone().add(edge)).collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/shapes/StaticRay.java b/src/main/java/com/magmaguy/elitemobs/utils/shapes/StaticRay.java new file mode 100644 index 000000000..f8ee6d547 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/shapes/StaticRay.java @@ -0,0 +1,10 @@ +package com.magmaguy.elitemobs.utils.shapes; + +import org.bukkit.Location; + +public class StaticRay extends Ray { + public StaticRay(boolean ignoresSolidBlocks, double pointRadius, Location centerLocation, Location initialTargetLocation) { + super(ignoresSolidBlocks, pointRadius, centerLocation, initialTargetLocation); + locations = drawLine(centerLocation, initialTargetLocation); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/utils/shapes/TranslatingRay.java b/src/main/java/com/magmaguy/elitemobs/utils/shapes/TranslatingRay.java new file mode 100644 index 000000000..656c89bed --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/utils/shapes/TranslatingRay.java @@ -0,0 +1,45 @@ +package com.magmaguy.elitemobs.utils.shapes; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.utils.Lerp; +import org.bukkit.Location; +import org.bukkit.scheduler.BukkitRunnable; + +public class TranslatingRay extends Ray { + private final Location finalCenterLocation; + + public TranslatingRay(boolean ignoresSolidBlocks, + double pointRadius, + Location target, + Location finalTarget, + Location target2, + Location finalTarget2, + int animationDuration) { + super(ignoresSolidBlocks, pointRadius, target, finalTarget); + this.finalCenterLocation = finalTarget == null ? target : finalTarget; + locations = drawLine(target, target2); + startAnimation(target.clone(), finalCenterLocation.clone(), target2.clone(), finalTarget2.clone(), animationDuration); + } + + private void startAnimation(Location startLocation1, + Location endLocation1, + Location startLocation2, + Location endLocation2, + int animationDuration) { + new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + if (counter > animationDuration) { + cancel(); + return; + } + counter++; + locations = drawLine( + Lerp.lerpLocation(startLocation1, endLocation1, counter / (double) animationDuration), + Lerp.lerpLocation(startLocation2, endLocation2, counter / (double) animationDuration)); + } + }.runTaskTimer(MetadataHandler.PLUGIN, 1L, 1L); + } +} diff --git a/src/main/java/com/magmaguy/elitemobs/versionnotifier/VersionChecker.java b/src/main/java/com/magmaguy/elitemobs/versionnotifier/VersionChecker.java index d0ecc3471..01c35ca90 100644 --- a/src/main/java/com/magmaguy/elitemobs/versionnotifier/VersionChecker.java +++ b/src/main/java/com/magmaguy/elitemobs/versionnotifier/VersionChecker.java @@ -1,65 +1,197 @@ package com.magmaguy.elitemobs.versionnotifier; import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.dungeons.EMPackage; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Logger; +import com.magmaguy.magmacore.util.SpigotMessage; +import lombok.Getter; import org.bukkit.Bukkit; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.scheduler.BukkitRunnable; import java.io.IOException; import java.net.URL; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; import java.util.Scanner; public class VersionChecker { + private static final List outdatedPackages = new ArrayList<>(); + @Getter + private static final boolean SHA1Updated = false; + private static boolean pluginIsUpToDate = true; - public static boolean pluginIsUpToDate = true; + private VersionChecker() { + } - public static void updateComparer(){ + /** + * Compares a Minecraft version with the current version on the server. Returns true if the version on the server is older. + * + * @param majorVersion Target major version to compare (i.e. 1.>>>17<<<.0) + * @param minorVersion Target minor version to compare (i.e. 1.17.>>>0<<<) + * @return Whether the version is under the value to be compared + */ + public static boolean serverVersionOlderThan(int majorVersion, int minorVersion) { - String currentVersion = MetadataHandler.PLUGIN.getDescription().getVersion(); - String publicVersion = ""; + String[] splitVersion = Bukkit.getBukkitVersion().split("[.]"); - try { - Bukkit.getLogger().info("[EliteMobs] Latest public release is " + VersionChecker.readStringFromURL()); - Bukkit.getLogger().info("[EliteMobs] Your version is " + currentVersion); - publicVersion = VersionChecker.readStringFromURL(); - } catch (IOException e) { - Bukkit.getLogger().warning("[EliteMobs] Couldn't check latest version"); - return; - } + int actualMajorVersion = Integer.parseInt(splitVersion[1].split("-")[0]); - if (Double.parseDouble(currentVersion.split("\\.")[0]) < Double.parseDouble(publicVersion.split("\\.")[0])) { - outOfDateHandler(); - return; - } - if (Double.parseDouble(currentVersion.split("\\.")[1]) < Double.parseDouble(publicVersion.split("\\.")[1])){ - outOfDateHandler(); - return; - } - if (Double.parseDouble(currentVersion.split("\\.")[2]) < Double.parseDouble(publicVersion.split("\\.")[2])){ - outOfDateHandler(); - return; - } + int actualMinorVersion = 0; + if (splitVersion.length > 2) + actualMinorVersion = Integer.parseInt(splitVersion[2].split("-")[0]); + + if (actualMajorVersion < majorVersion) + return true; + + if (splitVersion.length > 2) + return actualMajorVersion == majorVersion && actualMinorVersion < minorVersion; + + return false; - Bukkit.getLogger().warning("[EliteMobs] You are running the latest version!"); + } - pluginIsUpToDate = true; + private static void checkPluginVersion() { + new BukkitRunnable() { + @Override + public void run() { + String currentVersion = MetadataHandler.PLUGIN.getDescription().getVersion(); + boolean snapshot = false; + if (currentVersion.contains("SNAPSHOT")) { + snapshot = true; + currentVersion = currentVersion.split("-")[0]; + } + String publicVersion = ""; + + try { + Logger.info("Latest public release is " + VersionChecker.readStringFromURL("https://api.spigotmc.org/legacy/update.php?resource=40090")); + Logger.info("Your version is " + MetadataHandler.PLUGIN.getDescription().getVersion()); + publicVersion = VersionChecker.readStringFromURL("https://api.spigotmc.org/legacy/update.php?resource=40090"); + } catch (IOException e) { + Logger.warn("Couldn't check latest version"); + return; + } + + if (Double.parseDouble(currentVersion.split("\\.")[0]) < Double.parseDouble(publicVersion.split("\\.")[0])) { + outOfDateHandler(); + return; + } + + if (Double.parseDouble(currentVersion.split("\\.")[0]) == Double.parseDouble(publicVersion.split("\\.")[0])) { + + if (Double.parseDouble(currentVersion.split("\\.")[1]) < Double.parseDouble(publicVersion.split("\\.")[1])) { + outOfDateHandler(); + return; + } + + if (Double.parseDouble(currentVersion.split("\\.")[1]) == Double.parseDouble(publicVersion.split("\\.")[1])) { + if (Double.parseDouble(currentVersion.split("\\.")[2]) < Double.parseDouble(publicVersion.split("\\.")[2])) { + outOfDateHandler(); + return; + } + } + } + + if (!snapshot) + Logger.info("You are running the latest version!"); + else + Logger.info("You are running a snapshot version! You can check for updates in the #releases channel on the EliteMobs Discord!"); + + pluginIsUpToDate = true; + } + }.runTaskAsynchronously(MetadataHandler.PLUGIN); + } + private static void checkDungeonVersions() { + Bukkit.getScheduler().runTaskAsynchronously(MetadataHandler.PLUGIN, () -> { + outdatedPackages.clear(); + for (EMPackage emPackage : EMPackage.getEmPackages().values()) { + if (emPackage.isInstalled()) { + if (!emPackage.getDungeonPackagerConfigFields().isDefaultDungeon()) continue; + try { + String versionString = readStringFromURL("https://www.magmaguy.com/api/" + emPackage.getDungeonPackagerConfigFields().getFilename().replace(".yml", "")); + int releaseVersion = Integer.parseInt(versionString); + if (emPackage.getDungeonPackagerConfigFields().getDungeonVersion() < releaseVersion) { + emPackage.setOutOfDate(true); + outdatedPackages.add(emPackage); + Logger.warn("Dungeon " + emPackage.getDungeonPackagerConfigFields().getName() + " is outdated! You should go download the updated version! Link: " + emPackage.getDungeonPackagerConfigFields().getDownloadLink()); + } + } catch (Exception exception) { + Logger.warn("Failed to get version for EliteMobs package " + emPackage.getDungeonPackagerConfigFields().getFilename() + "! The URL " + "https://www.magmaguy.com/api/" + emPackage.getDungeonPackagerConfigFields().getFilename().replace(".yml", "") + " could not be reached!"); + } + } + } + }); } - private static String readStringFromURL() throws IOException { + private static String readStringFromURL(String url) throws IOException { - try (Scanner scanner = new Scanner(new URL("https://api.spigotmc.org/legacy/update.php?resource=40090").openStream(), - StandardCharsets.UTF_8.toString())) { + try (Scanner scanner = new Scanner(new URL(url).openStream(), + StandardCharsets.UTF_8)) { scanner.useDelimiter("\\A"); return scanner.hasNext() ? scanner.next() : ""; } } - private static void outOfDateHandler(){ + private static void outOfDateHandler() { - Bukkit.getLogger().warning("[EliteMobs] A newer version of this plugin is available for download!"); + Logger.warn("[EliteMobs] A newer version of this plugin is available for download!"); pluginIsUpToDate = false; } + public static void check() { + checkPluginVersion(); + checkDungeonVersions(); + } + + public static class VersionCheckerEvents implements Listener { + @EventHandler + public void onPlayerLogin(PlayerJoinEvent event) { + + if (!event.getPlayer().hasPermission("elitemobs.versionnotification")) return; + + new BukkitRunnable() { + @Override + public void run() { + if (!event.getPlayer().isOnline()) return; + if (!pluginIsUpToDate) + event.getPlayer().sendMessage(ChatColorConverter.convert("&cYour version of EliteMobs is outdated." + + " &aYou can download the latest version from &3&n&ohttps://www.spigotmc.org/resources/%E2%9A%94elitemobs%E2%9A%94.40090/")); + if (!outdatedPackages.isEmpty()) { + event.getPlayer().sendMessage(ChatColorConverter.convert("&cThe following dungeons are outdated:")); + for (EMPackage emPackage : outdatedPackages) + event.getPlayer().sendMessage(ChatColorConverter.convert( + "&c- " + emPackage.getDungeonPackagerConfigFields().getName())); + event.getPlayer().spigot().sendMessage( + SpigotMessage.simpleMessage("&8[EliteMobs]&f You can download the update on "), + SpigotMessage.hoverLinkMessage( + "&9&npatreon.com/magmaguy", "Click for Patreon link", "https://www.patreon.com/magmaguy" + ), + SpigotMessage.simpleMessage(" &for "), + SpigotMessage.hoverLinkMessage("&9&nmagmaguy.itch.io", "Click for itch.io link", "https://magmaguy.itch.io/"), + SpigotMessage.simpleMessage(" !")); + event.getPlayer().spigot().sendMessage( + SpigotMessage.simpleMessage("&2Updating is quick & easy! "), + SpigotMessage.hoverLinkMessage("&9&nClick here", "Click for wiki link", "https://github.com/MagmaGuy/EliteMobs/wiki/%5BGuide%5D-Quick-Setup#updating-dungeon-content"), + SpigotMessage.simpleMessage(" &2for info on how to install updates and "), + SpigotMessage.hoverLinkMessage("&9&nhere", "Discord support link", DiscordLinks.mainLink), + SpigotMessage.simpleMessage(" &2for the support room.") + ); + } + if (SHA1Updated) { + event.getPlayer().sendMessage(ChatColorConverter.convert("&8[EliteMobs] &cThe EliteMobs resource pack has updated! This means that the current resource pack will not fully work until you restart your server. You only need to restart once!")); + } + } + }.runTaskLater(MetadataHandler.PLUGIN, 20L * 3); + + } + } + } diff --git a/src/main/java/com/magmaguy/elitemobs/versionnotifier/VersionWarner.java b/src/main/java/com/magmaguy/elitemobs/versionnotifier/VersionWarner.java deleted file mode 100644 index 84eb73a95..000000000 --- a/src/main/java/com/magmaguy/elitemobs/versionnotifier/VersionWarner.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.magmaguy.elitemobs.versionnotifier; - -import com.magmaguy.elitemobs.ChatColorConverter; -import com.magmaguy.elitemobs.MetadataHandler; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerLoginEvent; -import org.bukkit.scheduler.BukkitRunnable; - -public class VersionWarner implements Listener { - - @EventHandler - public void onPlayerLogin(PlayerLoginEvent event) { - - if (!event.getPlayer().hasPermission("elitemobs.versionnotification")) return; - - new BukkitRunnable() { - @Override - public void run() { - event.getPlayer().sendMessage(ChatColorConverter.convert("&a[EliteMobs] &cYour version of EliteMobs is outdated." + - " &aYou can download the latest version from &3&n&ohttps://www.spigotmc.org/resources/%E2%9A%94elitemobs%E2%9A%94.40090/")); - } - }.runTaskLater(MetadataHandler.PLUGIN, 20*3); - - - } - -} diff --git a/src/main/java/com/magmaguy/elitemobs/wormhole/VisualEffects.java b/src/main/java/com/magmaguy/elitemobs/wormhole/VisualEffects.java new file mode 100644 index 000000000..f26f7b6fa --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/wormhole/VisualEffects.java @@ -0,0 +1,159 @@ +package com.magmaguy.elitemobs.wormhole; + +import com.magmaguy.elitemobs.config.WormholesConfig; +import com.magmaguy.elitemobs.config.wormholes.WormholeConfigFields; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.List; + +public class VisualEffects { + private final WormholeConfigFields wormholeConfigFields; + private final List cachedLocations = new ArrayList<>(); + @Getter + private final List> cachedRotations = new ArrayList<>(); + + public VisualEffects(WormholeConfigFields wormholeConfigFields) { + this.wormholeConfigFields = wormholeConfigFields; + initializeVisualEffect(); + } + + private void initializeVisualEffect() { + switch (wormholeConfigFields.getStyle()) { + case CUBE: + generateCube(); + break; + case CRYSTAL: + generateCrystal(); + break; + case ICOSAHEDRON: + generateIcosahedron(); + break; + default: + Logger.warn("Missing com.magmaguy.elitemobs.wormhole style for " + wormholeConfigFields.getStyle()); + } + } + + private void generateCrystal() { + //top + Vector top = new Vector(0, 1, 0).multiply(wormholeConfigFields.getSizeMultiplier()); + cachedLocations.add(top); + //bottom + Vector bottom = new Vector(0, -1, 0).multiply(wormholeConfigFields.getSizeMultiplier()); + cachedLocations.add(bottom); + //front + Vector front = new Vector(.5, 0, 0).multiply(wormholeConfigFields.getSizeMultiplier()); + cachedLocations.add(front); + //side + Vector side = new Vector(0, 0, .5).multiply(wormholeConfigFields.getSizeMultiplier()); + cachedLocations.add(side); + + finishCuboidInitialization(top, bottom, front, side); + + } + + private void generateCube() { + //top + Vector top = new Vector(0, 1, 0).multiply(wormholeConfigFields.getSizeMultiplier()); + cachedLocations.add(top); + //bottom + Vector bottom = new Vector(0, -1, 0).multiply(wormholeConfigFields.getSizeMultiplier()); + cachedLocations.add(bottom); + //front + Vector front = new Vector(1, 0, 0).multiply(wormholeConfigFields.getSizeMultiplier()); + cachedLocations.add(front); + //side + Vector side = new Vector(0, 0, 1).multiply(wormholeConfigFields.getSizeMultiplier()); + cachedLocations.add(side); + + finishCuboidInitialization(top, bottom, front, side); + + } + + private void generateIcosahedron() { + Vector top = new Vector(0, 1, 0).multiply(wormholeConfigFields.getSizeMultiplier()); + cachedLocations.add(top); + Vector offsetTopPoint = new Vector(1, .5, 0).multiply(wormholeConfigFields.getSizeMultiplier()); + List topPentagon = getPentagonVectors(top, offsetTopPoint); + + Vector bottom = new Vector(0, -1, 0).multiply(wormholeConfigFields.getSizeMultiplier()); + Vector offsetBottomPoint = new Vector(1, -.5, 0).multiply(wormholeConfigFields.getSizeMultiplier()); + offsetBottomPoint.rotateAroundY(2 * Math.PI / 5D / 2D); + List bottomPentagon = getPentagonVectors(bottom, offsetBottomPoint); + + for (int i = 0; i < topPentagon.size(); i++) { + trace(topPentagon.get(i), bottomPentagon.get(i)); + if (i + 1 < topPentagon.size() - 1) + trace(topPentagon.get(i + 1), bottomPentagon.get(i)); + } + trace(topPentagon.get(0), bottomPentagon.get(4)); + cacheRotations(); + } + + private List getPentagonVectors(Vector centerPosition, Vector offsetPosition) { + List pentagonVectors = new ArrayList<>(); + for (int i = 0; i < 6; i++) { + Vector rotatedVector = offsetPosition.clone().rotateAroundY(2 * Math.PI / 5D * i).clone(); + if (i > 0) + trace(pentagonVectors.get(i - 1), rotatedVector); + trace(centerPosition, rotatedVector); + pentagonVectors.add(rotatedVector); + } + trace(pentagonVectors.get(0), pentagonVectors.get(pentagonVectors.size() - 1)); + return pentagonVectors; + } + + private void finishCuboidInitialization(Vector top, Vector bottom, Vector front, Vector side) { + trace(top, front); + trace(bottom, front); + trace(front, side); + + List otherSidesList = new ArrayList<>(); + + for (int i = 1; i < 4; i++) { + double rotation = Math.PI / 2 * i; + for (Vector vector : cachedLocations) { + Vector rotatedVector = vector.clone().rotateAroundY(rotation); + if (rotatedVector.getX() != vector.getX() || rotatedVector.getZ() != vector.getZ()) + otherSidesList.add(rotatedVector); + } + } + + cachedLocations.addAll(otherSidesList); + + cacheRotations(); + } + + private void cacheRotations() { + double rotationPointCount = 100; + for (int i = 0; i < rotationPointCount; i++) { + double rotation = (Math.PI * 2) / rotationPointCount * i; + List vectors = new ArrayList<>(); + for (Vector vector : cachedLocations) { + vectors.add(vector.clone().rotateAroundY(rotation)); + } + cachedRotations.add(vectors); + } + } + + private void trace(Vector source, Vector target) { + Vector ray = target.clone().subtract(source).normalize().multiply(.2); + Vector clonedSource = source.clone(); + int counter = 0; + while (clonedSource.distance(target) > 0.1 && counter < 20) { + if (WormholesConfig.isReducedParticlesMode()) { + if (counter % 2 == 0) { + clonedSource = clonedSource.add(ray); + cachedLocations.add(clonedSource.clone()); + } + } else { + clonedSource = clonedSource.add(ray); + cachedLocations.add(clonedSource.clone()); + } + counter++; + } + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/wormhole/Wormhole.java b/src/main/java/com/magmaguy/elitemobs/wormhole/Wormhole.java new file mode 100644 index 000000000..fb0153733 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/wormhole/Wormhole.java @@ -0,0 +1,88 @@ +package com.magmaguy.elitemobs.wormhole; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.config.wormholes.WormholeConfigFields; +import lombok.Getter; +import org.bukkit.Bukkit; +import org.bukkit.Color; +import org.bukkit.entity.Player; +import org.bukkit.util.Vector; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; + +public class Wormhole { + @Getter + private static final HashSet wormholes = new HashSet<>(); + @Getter + private static final HashSet playerCooldowns = new HashSet<>(); + @Getter + private final WormholeConfigFields wormholeConfigFields; + @Getter + private final WormholeEntry wormholeEntry1; + @Getter + private final WormholeEntry wormholeEntry2; + @Getter + private final Color particleColor; + + public static void addPlayerToCooldowns(Player player) { + playerCooldowns.add(player); + Bukkit.getScheduler().scheduleSyncDelayedTask(MetadataHandler.PLUGIN, () -> Wormhole.getPlayerCooldowns().remove(player), 20 * 5L); + } + + @Getter + private List> cachedRotations = new ArrayList<>(); + + public Wormhole(WormholeConfigFields wormholeConfigFields) { + this.wormholeConfigFields = wormholeConfigFields; + this.particleColor = Color.fromRGB(wormholeConfigFields.getParticleColor()); + if (wormholeConfigFields.getStyle() != null && !wormholeConfigFields.getStyle().equals(WormholeStyle.NONE)) { + this.cachedRotations = new ArrayList<>(new VisualEffects(wormholeConfigFields).getCachedRotations()); + } + wormholeEntry1 = new WormholeEntry(this, getWormholeConfigFields().getLocation1(), 1); + wormholeEntry2 = new WormholeEntry(this, getWormholeConfigFields().getLocation2(), 2); + wormholes.add(this); + } + + public static void shutdown() { + for (Wormhole wormhole : wormholes) + wormhole.stop(); + wormholes.clear(); + WormholeEntry.getWormholeEntries().clear(); + } + + + private void stop() { + wormholeEntry1.stop(); + wormholeEntry2.stop(); + } + + public void onDungeonInstall(String dungeonFilename) { + if (getWormholeEntry1() != null && + getWormholeEntry1().getLocationString() != null && + getWormholeEntry1().getLocationString().equals(dungeonFilename)) { + getWormholeEntry1().onDungeonInstall(); + } else if (getWormholeEntry2() != null && + getWormholeEntry2().getLocationString() != null && + getWormholeEntry2().getLocationString().equals(dungeonFilename)) { + getWormholeEntry2().onDungeonInstall(); + } + } + + public void onDungeonUninstall(String dungeonFilename) { + if (getWormholeEntry1().getWormhole() != null && getWormholeEntry1().getLocationString().equals(dungeonFilename)) { + getWormholeEntry1().onDungeonUninstall(); + } else if (getWormholeEntry2().getWormhole() != null && getWormholeEntry2().getLocationString().equals(dungeonFilename)) { + getWormholeEntry2().onDungeonUninstall(); + } + } + + public enum WormholeStyle { + NONE, + CRYSTAL, + ICOSAHEDRON, + CUBE + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/wormhole/WormholeEntry.java b/src/main/java/com/magmaguy/elitemobs/wormhole/WormholeEntry.java new file mode 100644 index 000000000..3399255e5 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/wormhole/WormholeEntry.java @@ -0,0 +1,187 @@ +package com.magmaguy.elitemobs.wormhole; + +import com.magmaguy.elitemobs.config.WormholesConfig; +import com.magmaguy.elitemobs.dungeons.EMPackage; +import com.magmaguy.elitemobs.entitytracker.EntityTracker; +import com.magmaguy.elitemobs.mobconstructor.PersistentObject; +import com.magmaguy.elitemobs.mobconstructor.PersistentObjectHandler; +import com.magmaguy.elitemobs.utils.ChunkLocationChecker; +import com.magmaguy.elitemobs.utils.ConfigurationLocation; +import com.magmaguy.elitemobs.utils.DiscordLinks; +import com.magmaguy.magmacore.util.ChatColorConverter; +import com.magmaguy.magmacore.util.Logger; +import lombok.Getter; +import lombok.Setter; +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Player; +import org.bukkit.scheduler.BukkitTask; +import org.bukkit.util.Consumer; +import org.bukkit.util.Vector; + +import java.util.HashSet; +import java.util.Set; + +public class WormholeEntry implements PersistentObject { + @Getter + private static final Set wormholeEntries = new HashSet<>(); + @Getter + private final Wormhole wormhole; + private final int wormholeNumber; + @Getter + private Location location; + @Getter + private String locationString; + @Getter + private String armorStandText; + @Getter + @Setter + private BukkitTask wormholeTask; + @Getter + @Setter + private ArmorStand text = null; + private String worldName; + @Getter + @Setter + private String portalMissingMessage = null; + @Getter + @Setter + private String opMessage = null; + private PersistentObjectHandler persistentObjectHandler = null; + + public WormholeEntry(Wormhole wormhole, String locationString, int wormholeNumber) { + this.wormhole = wormhole; + this.wormholeNumber = wormholeNumber; + this.locationString = locationString; + if (locationString == null) { + Logger.warn("Wormhole " + wormhole.getWormholeConfigFields().getFilename() + " is missing a wormhole location! Fix this!"); + return; + } + setLocationFromConfiguration(); + if (wormholeNumber == 1) this.armorStandText = wormhole.getWormholeConfigFields().getLocation1Text(); + else this.armorStandText = wormhole.getWormholeConfigFields().getLocation2Text(); + + persistentObjectHandler = new PersistentObjectHandler(this); + if (ChunkLocationChecker.locationIsLoaded(location)) chunkLoad(); + } + + private Location getDungeonLocation() { + EMPackage emPackage = EMPackage.getEmPackages().get(locationString); + if (emPackage == null) { + Logger.warn("Dungeon " + locationString + " is not a valid dungeon packager name! Wormhole " + wormhole.getWormholeConfigFields().getFilename() + " will not lead anywhere."); + setPortalMissingMessage(WormholesConfig.getDefaultPortalMissingMessage()); + return null; + } + if (!emPackage.isDownloaded() || !emPackage.isInstalled()) { + //Logger.info("Wormhole " + wormhole.getWormholeConfigFields().getFilename() + " will not lead anywhere because the dungeon " + locationString + " is not installed!"); + setPortalMissingMessage(WormholesConfig.getDungeonNotInstalledMessage().replace("$dungeonID", emPackage.getDungeonPackagerConfigFields().getName())); + + this.opMessage = ChatColorConverter.convert("&8[EliteMobs - OP-only message] &fDownload links are available on &9https://magmaguy.itch.io/ &f" + "(free and premium) and &9https://www.patreon.com/magmaguy &f(premium). You can check the difference " + "between the two and get support here: " + DiscordLinks.mainLink); + } + Location teleportLocation = emPackage.getDungeonPackagerConfigFields().getTeleportLocation(); + if (teleportLocation == null) return null; +// Vector offsetVector = teleportLocation.getDirection().clone().setY(0).normalize().multiply(1.5 * wormhole.getWormholeConfigFields().getSizeMultiplier()).setY(-1 * wormhole.getWormholeConfigFields().getSizeMultiplier()); + + worldName = emPackage.getDungeonPackagerConfigFields().getWorldName(); + +// return teleportLocation.clone().subtract(offsetVector); + return teleportLocation.clone(); + } + + private void setLocationFromConfiguration() { + if (locationString.contains(",")) { + this.worldName = ConfigurationLocation.worldName(locationString); + this.location = ConfigurationLocation.serialize(locationString); + } else { + this.location = getDungeonLocation(); + } + } + + public void onDungeonInstall() { + this.location = getDungeonLocation(); + if (persistentObjectHandler != null) persistentObjectHandler = new PersistentObjectHandler(this); + persistentObjectHandler = new PersistentObjectHandler(this); + chunkLoad(); + } + + public void onDungeonUninstall() { + stop(); + location = null; + wormholeTask = null; + } + + @Override + public void chunkLoad() { + if (text == null || !text.isValid()) initializeTextDisplay(); + if (wormholeTask != null && !wormholeTask.isCancelled()) wormholeTask.cancel(); + if (location == null) setLocationFromConfiguration(); + wormholeTask = WormholeTask.startWormholeTask(this); + } + + @Override + public void chunkUnload() { + //This is handled by the repeating task itself. Also there seems to be some bug with this unload, it seems arbitrary + } + + @Override + public void worldLoad(World world) { + getDungeonLocation(); + if (ChunkLocationChecker.locationIsLoaded(location)) chunkLoad(); + } + + @Override + public void worldUnload() { + location.setWorld(null); + stop(); + } + + @Override + public Location getPersistentLocation() { + return location; + } + + @Override + public String getWorldName() { + return worldName; + } + + public void stop() { + if (wormholeTask != null) { + wormholeTask.cancel(); + } + } + + public void updateLocation(Player player) { + if (wormholeTask != null) { + wormholeTask.cancel(); + wormholeTask = null; + } + locationString = ConfigurationLocation.deserialize(player.getLocation()); + location = player.getLocation().add(new Vector(0, 1 * wormhole.getWormholeConfigFields().getSizeMultiplier(), 0)); + wormhole.getWormholeConfigFields().setWormholeEntryLocation(location, wormholeNumber); + wormholeTask = WormholeTask.startWormholeTask(this); + if (persistentObjectHandler != null) persistentObjectHandler.remove(); + persistentObjectHandler = new PersistentObjectHandler(this); + } + + private void initializeTextDisplay() { + if (text != null && text.isValid() && !text.isEmpty()) return; + if (armorStandText == null) return; + if (location == null || location.getWorld() == null) return; + text = location.getWorld().spawn(location.clone().add(new Vector(0, 1.2, 0).multiply(wormhole.getWormholeConfigFields().getSizeMultiplier())), ArmorStand.class, new Consumer() { + @Override + public void accept(ArmorStand armorStand) { + armorStand.setCustomName(ChatColorConverter.convert(armorStandText)); + armorStand.setCustomNameVisible(true); + armorStand.setMarker(true); + armorStand.setVisible(false); + armorStand.setGravity(false); + armorStand.setPersistent(false); + armorStand.setRemoveWhenFarAway(false); + } + }); + EntityTracker.registerVisualEffects(text); + } + +} diff --git a/src/main/java/com/magmaguy/elitemobs/wormhole/WormholeTask.java b/src/main/java/com/magmaguy/elitemobs/wormhole/WormholeTask.java new file mode 100644 index 000000000..26fb6bb92 --- /dev/null +++ b/src/main/java/com/magmaguy/elitemobs/wormhole/WormholeTask.java @@ -0,0 +1,125 @@ +package com.magmaguy.elitemobs.wormhole; + +import com.magmaguy.elitemobs.MetadataHandler; +import com.magmaguy.elitemobs.adventurersguild.GuildRank; +import com.magmaguy.elitemobs.config.WormholesConfig; +import com.magmaguy.elitemobs.economy.EconomyHandler; +import com.magmaguy.elitemobs.quests.playercooldowns.PlayerQuestCooldowns; +import com.magmaguy.elitemobs.utils.ChunkLocationChecker; +import com.magmaguy.magmacore.util.ChatColorConverter; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Particle; +import org.bukkit.Sound; +import org.bukkit.entity.Player; +import org.bukkit.potion.PotionEffect; +import org.bukkit.potion.PotionEffectType; +import org.bukkit.scheduler.BukkitRunnable; +import org.bukkit.scheduler.BukkitTask; +import org.bukkit.util.Vector; + +import java.util.HashSet; +import java.util.Objects; + +public class WormholeTask { + private WormholeTask() { + } + + public static BukkitTask startWormholeTask(WormholeEntry wormholeEntry) { + HashSet teleportingPlayers = new HashSet<>(); + return new BukkitRunnable() { + int counter = 0; + + @Override + public void run() { + if (!ChunkLocationChecker.locationIsLoaded(wormholeEntry.getLocation())) { + if (wormholeEntry.getText() != null) + new BukkitRunnable() { + @Override + public void run() { + wormholeEntry.getText().remove(); + } + }.runTask(MetadataHandler.PLUGIN); + cancel(); + return; + } + + for (Player player : Bukkit.getServer().getOnlinePlayers()) + if (checkPoint(wormholeEntry, player.getLocation(), player, teleportingPlayers)) + teleportingPlayers.add(player); + else teleportingPlayers.remove(player); + + if (!WormholesConfig.isNoParticlesMode() && !wormholeEntry.getWormhole(). + getWormholeConfigFields(). + getStyle(). + equals(Wormhole.WormholeStyle.NONE)) { + if (counter >= wormholeEntry.getWormhole().getCachedRotations().size()) counter = 0; + if (WormholesConfig.isReducedParticlesMode()) { + if (counter % 2 == 0) visualEffect(counter, wormholeEntry); + } else visualEffect(counter, wormholeEntry); + if (counter + 1 >= Integer.MAX_VALUE) counter = 0; + counter++; + } + } + }.runTaskTimerAsynchronously(MetadataHandler.PLUGIN, 0, 5); + + } + + private static boolean checkPoint(WormholeEntry wormholeEntry, Location playerLocation, Player player, HashSet teleportingPlayers) { + if (wormholeEntry.getLocation() == null) return false; + if (Wormhole.getPlayerCooldowns().contains(player)) return false; + if (!PlayerQuestCooldowns.getBypassedPlayers().contains(player) && + wormholeEntry.getWormhole().getWormholeConfigFields().getPermission() != null && + !wormholeEntry.getWormhole().getWormholeConfigFields().getPermission().isEmpty() && + !player.hasPermission(wormholeEntry.getWormhole().getWormholeConfigFields().getPermission())) + return false; + if (!Objects.equals(wormholeEntry.getLocation().getWorld(), playerLocation.getWorld())) return false; + if (wormholeEntry.getLocation().distance(playerLocation) > 1.5 * wormholeEntry.getWormhole().getWormholeConfigFields().getSizeMultiplier()) + return false; + if (wormholeEntry.getWormhole().getWormholeConfigFields().getCoinCost() > 0) { + double coinCost = wormholeEntry.getWormhole().getWormholeConfigFields().getCoinCost() + wormholeEntry.getWormhole().getWormholeConfigFields().getCoinCost() * GuildRank.currencyBonusMultiplier(player.getUniqueId()); + if (EconomyHandler.checkCurrency(player.getUniqueId()) < coinCost) { + player.sendMessage(ChatColorConverter.convert(WormholesConfig.getInsufficientCurrencyForWormholeMessage()).replace("$amount", "" + coinCost)); + return false; + } else EconomyHandler.subtractCurrency(player.getUniqueId(), coinCost); + } + + teleport(wormholeEntry, player); + return true; + } + + private static void teleport(WormholeEntry wormholeEntry, Player player) { + Location destination; + if (wormholeEntry == wormholeEntry.getWormhole().getWormholeEntry1()) + destination = wormholeEntry.getWormhole().getWormholeEntry2().getLocation(); + else destination = wormholeEntry.getWormhole().getWormholeEntry1().getLocation(); + if (destination == null || destination.getWorld() == null) { + if (wormholeEntry.getPortalMissingMessage() == null) + player.sendMessage(ChatColorConverter.convert(WormholesConfig.getDefaultPortalMissingMessage())); + else { + player.sendMessage(wormholeEntry.getPortalMissingMessage()); + if (player.isOp() || player.hasPermission("elitemobs.*")) + player.sendMessage(wormholeEntry.getOpMessage()); + } + return; + } + Bukkit.getScheduler().runTask(MetadataHandler.PLUGIN, () -> { + if (wormholeEntry.getWormhole().getWormholeConfigFields().isBlindPlayer()) + player.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 20 * 2, 0)); + player.teleport(destination); + player.playSound(player.getLocation(), Sound.BLOCK_RESPAWN_ANCHOR_CHARGE, 1f, 1f); + player.setVelocity(destination.getDirection().normalize()); + player.setFlying(false); + Wormhole.getPlayerCooldowns().add(player); + Bukkit.getScheduler().scheduleSyncDelayedTask(MetadataHandler.PLUGIN, () -> Wormhole.getPlayerCooldowns().remove(player), 20 * 5L); + }); + + } + + private static void visualEffect(int counter, WormholeEntry wormholeEntry) { + for (Vector vector : wormholeEntry.getWormhole().getCachedRotations().get(counter)) { + Location particleLocation = wormholeEntry.getLocation().clone().add(vector); + wormholeEntry.getLocation().getWorld().spawnParticle(Particle.DUST, particleLocation.getX(), particleLocation.getY(), particleLocation.getZ(), 1, 0, 0, 0, 1, new Particle.DustOptions(wormholeEntry.getWormhole().getParticleColor(), 1)); + } + } +} diff --git a/src/main/resources/AdventurersGuild.yml b/src/main/resources/AdventurersGuild.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/resources/CombatTag.yml b/src/main/resources/CombatTag.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/resources/CustomEnchantments.yml b/src/main/resources/CustomEnchantments.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/resources/EconomySettings.yml b/src/main/resources/EconomySettings.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/resources/ItemsCustomLootList.yml b/src/main/resources/ItemsCustomLootList.yml deleted file mode 100644 index 59bb657b9..000000000 --- a/src/main/resources/ItemsCustomLootList.yml +++ /dev/null @@ -1,187 +0,0 @@ -Loot: - Magmaguy's Toothpick: - Item Type: WOOD_SWORD - Item Name: "&4Magmaguy&c's &aToothpick" - Item Lore: - - "&l&5Nearly mint condition!" - Enchantments: - - DAMAGE_ALL,1 - Potion Effects: - Drop Weight: dynamic - Scalability: dynamic - Rabbit Charm: - Item Type: RABBIT_FOOT - Item Name: "Rabbit Charm" - Item Lore: - - "With this charm, just about" - - "any destination is only a hop," - - "skip and a jump away!" - Enchantments: - - VANISHING_CURSE,1 - Potion Effects: - - JUMP,3,self,continuous - Drop Weight: 1 - Vampiric Charm: - Item Type: STICK - Item Name: "Vampiric Charm" - Item Lore: - - "No one can remember where this" - - "came from, and no one can" - - "forget how dangerous it is..." - Enchantments: - - VANISHING_CURSE,1 - Potion Effects: - - HEAL,1,self,onHit - - BLINDNESS,1,self,onHit - - SLOW,1,self,onHit - Drop Weight: 1 - Scorpion Charm: - Item Type: POISONOUS_POTATO - Item Name: "Scorpion Charm" - Item Lore: - - "Float like a butterfly," - - "sting like a bee," - - "poison like a potato!" - Enchantments: - - VANISHING_CURSE,1 - Potion Effects: - - POISON,1,target,onHit - Drop Weight: 1 - Chameleon Charm: - Item Type: LEATHER - Item Name: "Chameleon Charm" - Item Lore: - - "The colorful Chameleon can" - - "blend in just about anywhere, " - - "slowly creeping around..." - Enchantments: - - VANISHING_CURSE,1 - Potion Effects: - - INVISIBILITY,1,self,onHit - - SLOW,2,self,onHit - - BLINDNESS,1,self,onHit - Drop Weight: 1 - Shulker Charm: - Item Type: FEATHER - Item Name: "Shulker Charm" - Item Lore: - - "I believe I can fly" - - "I believe I can touch the sky" - - "And you're coming with me!" - Enchantments: - - VANISHING_CURSE,1 - Potion Effects: - - LEVITATION,1,self,onHit - - LEVITATION,2,target,onHit - Drop Weight: 1 - Elephant Charm: - Item Type: ANVIL - Item Name: "Elephant Charm" - Item Lore: - - "Gain the power of an elephant" - - "stampede, for the cost of the" - - "speed of an elephant stampede!" - Enchantments: - - VANISHING_CURSE,1 - Potion Effects: - - INCREASE_DAMAGE,2,self,onHit - - SLOW,4,self,onHit - Drop Weight: 1 - Cheetah Charm: - Item Type: GOLD_BOOTS - Item Name: "Cheetah Charm" - Item Lore: - - "Cheetahs can reach speeds of" - - "120 km/h... for about 60" - - "seconds. Make them count." - Enchantments: - - VANISHING_CURSE,1 - Potion Effects: - - SPEED,3,self,continuous - - HUNGER,1,self,continuous - Drop Weight: 1 - Lucky Charms: - Item Type: COOKIE - Item Name: "Lucky Charms" - Item Lore: - - "Part of a complete breakfast!" - - "Note: Absolutely not a part of" - - "a complete breakfast." - Enchantments: - - VANISHING_CURSE,1 - Potion Effects: - - LUCK,1,self,continuous - Drop Weight: 1 - Salamander Charm: - Item Type: BLAZE_POWDER - Item Name: "Salamander Charm" - Item Lore: - - "Almost as hot as MagmaGuy's" - - "new mixtape, coming out soon" - - "to an alleyway near you!" - Enchantments: - - VANISHING_CURSE,1 - Potion Effects: - - FIRE_RESISTANCE,1,self,continuous - Drop Weight: 1 - Berserker Charm: - Item Type: TOTEM - Item Name: "Berserker Charm" - Item Lore: - - "Lose yourself in the face of" - - "overwhelming adversity in more" - - "ways than one..." - Enchantments: - - VANISHING_CURSE,1 - Potion Effects: - - BLINDNESS,1,self,onHit - - FAST_DIGGING,1,self,onHit - Drop Weight: 1 - Firefly Charm: - Item Type: GLASS_BOTTLE - Item Name: "Firefly Charm" - Item Lore: - - "Light up the night!" - Enchantments: - - VANISHING_CURSE,1 - Potion Effects: - - NIGHT_VISION,1,self,continuous - - GLOWING,1,target,onHit - Drop Weight: 1 - Slowpoke Charm: - Item Type: CARROT_STICK - Item Name: "Slowpoke Charm" - Item Lore: - - "Let's just hope it doesn't hit" - - "itself in its confusion..." - Enchantments: - - VANISHING_CURSE,1 - Potion Effects: - - SLOW,1,self,onHit - - CONFUSION,1,target,onHit - Drop Weight: 1 - Fishy Charm: - Item Type: RAW_FISH - Item Name: "Fishy Charm" - Item Lore: - - "There's just something not" - - "quite right with this one..." - Enchantments: - - VANISHING_CURSE,1 - Potion Effects: - - WATER_BREATHING,1,self,continuous - Drop Weight: 1 - Owl Charm: - Item Type: ELYTRA - Item Name: "Owl Charm" - Item Lore: - - "Become the ultimate nocturnal" - - "predator!" - Enchantments: - - VANISHING_CURSE,1 - Potion Effects: - - GLOWING,1,target,onHit - - JUMP,3,self,continuous - - NIGHT_VISION,1,self,continuous - - WEAKNESS,1,self,continuous - Drop Weight: 0.1 \ No newline at end of file diff --git a/src/main/resources/ItemsCustomLootSettings.yml b/src/main/resources/ItemsCustomLootSettings.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/resources/ItemsDropSettings.yml b/src/main/resources/ItemsDropSettings.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/resources/ItemsProceduralSettings.yml b/src/main/resources/ItemsProceduralSettings.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/resources/ItemsUnique.yml b/src/main/resources/ItemsUnique.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/resources/MobCombatSettings.yml b/src/main/resources/MobCombatSettings.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/resources/MobPowers.yml b/src/main/resources/MobPowers.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/resources/README.md b/src/main/resources/README.md deleted file mode 100644 index ec9d876e1..000000000 --- a/src/main/resources/README.md +++ /dev/null @@ -1,11 +0,0 @@ -Thank you for using EliteMobs! - -This plugin is made to both work from the very start with no additional config work and to be highly customizable. - -If you want to make some deep configuration changes to the plugin, try to read the GitHub wiki I've created ahead of time or as you're making the changes so you know what the options are doing. https://github.com/MagmaGuy/EliteMobs - -If you need support with this plugin, you can reach me at my discord support channel: https://discord.gg/QSA2wgh - -For all things EliteMobs related, you can go to my website to find all resources I've made available, such as the github page, the wiki, the custom loot maker, so on. - -Hope you enjoy! If you do, leave rating on the resource page and / or buy me a coffee ! (paypal links can be found in the spigot resource page) \ No newline at end of file diff --git a/src/main/resources/ValidMobs.yml b/src/main/resources/ValidMobs.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/resources/ValidWorlds.yml b/src/main/resources/ValidWorlds.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/resources/economySettings.yml b/src/main/resources/economySettings.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/resources/events.yml b/src/main/resources/events.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/resources/mobPowers.yml b/src/main/resources/mobPowers.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/resources/playerCache.yml b/src/main/resources/playerCache.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/resources/playerGuildRank.yml b/src/main/resources/playerGuildRank.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/resources/playerMaxGuildRank.yml b/src/main/resources/playerMaxGuildRank.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/resources/playerMoneyData.yml b/src/main/resources/playerMoneyData.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 4716e9dda..0e361e346 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,161 +1,238 @@ name: EliteMobs -version: 6.6.5 +version: 9.1.8 author: MagmaGuy main: com.magmaguy.elitemobs.EliteMobs -softdepend: [Multiverse-Core] +api-version: 1.14 +softdepend: +- Multiverse-Core +- WorldGuard +- Vault +- PlaceholderAPI +- HolographicDisplays +- DiscordSRV +- LibsDisguises +- ModelEngine +- Geyser-Spigot +- MythicMobs +- LevelledMobs +- InfernalMobs +- FreeMinecraftModels commands: elitemobs: - description: Catch-all command - usage: /elitemobs - aliases: [em, adventurerguild, adventurersguild, ag] + description: Main command + aliases: + - em + adventurersguild: + description: Main command + aliases: + - ag + permissions: elitemobs.*: description: Gives access to all elitemobs commands - children: - elitemobs.stats: true - elitemobs.shop: true - elitemobs.getloot: true - elitemobs.simloot: true - elitemobs.reload.configs: true - elitemobs.reload.loot: true - elitemobs.giveloot: true - elitemobs.spawnmob: true - elitemobs.killall.aggressiveelites: true - elitemobs.killall.passiveelites: true - elitemobs.killall.specificentity: true - elitemobs.currency.user: true - elitemobs.currency.subtract: true - elitemobs.currency.set: true - elitemobs.currency.check: true - elitemobs.currency.add: true - elitemobs.currency.cointop: true - elitemobs.scoreboard: false - elitemobs.events.*: true - default: op - elitemobs.currency.user: - description: Gives access to the commands users need to use the economy features (shops, paying other players) - children: - elitemobs.shop: true - elitemobs.customshop: true - elitemobs.currency.pay: true - elitemobs.currency.wallet: true - elitemobs.currency.cointop: true - elitemobs.killall.*: - description: Allows players to run all /elitemobs kill variations - children: - elitemobs.killall.aggressiveelites: true - elitemobs.killall.passiveelites: true - elitemobs.killall.specificentity: true - elitemobs.user: - description: Gives access to all recommended user commands - children: - elitemobs.stats: true - elitemobs.events.kraken: true - elitemobs.events.balrog: true - elitemobs.events.fae: true - elitemobs.checktier: true - elitemobs.adventurersguild: true - elitemobs.currency.user: true - elitemobs.stats: - description: Allows players to run /elitemobs stats default: op - elitemobs.version: - description: Allows players to run /elitemobs version + elitemobs.adventurersguild.command: + description: Allows players to open the Adventurer's Guild menu + default: true + elitemobs.adventurersguild.teleport: + description: Allows players to teleport to the Adventurer's Guild + default: true + elitemobs.alt: + description: Allows players to switch menu styles + default: true + elitemobs.arena.start: + description: Allows players to start an arena default: true - elitemobs.getloot: - description: Allow players to run /elitemobs getloot + elitemobs.debug: + description: Gives access to the debug command default: op - elitemobs.simloot: - description: Allow players to run /elitemobs simloot + elitemobs.discord.link: + description: Gives the link to EliteMobs' discord server + default: true + elitemobs.discord.message: + description: Allows sending debug messages to discord via DiscordSRV for testing purposes default: op - elitemobs.reload: - decription: Allow players to run /elitemobs reload config + elitemobs.dismiss: + description: Allows admins to dismiss the initial setup message default: op - elitemobs.giveloot: - description: Allow players to run /elitemobs giveloot [playername] random/[loot name] + elitemobs.dungeon.tp: + description: Allows players to teleport to a dungeon + default: true + elitemobs.command: + description: Allows players to use the main command of the plugin + default: true + elitemobs.enchant.command: + description: Allows players to use the enchant command + default: true + elitemobs.event.start: + description: Allows admins to manually launch an event default: op - elitemobs.spawnmob: - description: Allow players to run /elitemobs SpawnMob [mobType] [mobLevel] [mobPower] [mobPower(just keep adding until done)] + elitemobs.fireball: + description: Allows admins to fire an elite fireball for terrain destruction testing purposes default: op - elitemobs.spawnbossmob: - description: Allows players to run /elitemobs spawnbossmob [bossmob] + elitemobs.help: + description: Allows players to run the help command + default: true + elitemobs.kill.command: + description: Allows admins to run the kill commands to kill elites default: op - elitemobs.scoreboard: - description: Shows a scoreboard with info about the elite mob a player might be standing next to - default: false - elitemobs.killall.aggressiveelites: - description: Allows players to run /elitemobs kill aggressive + elitemobs.language: + description: Allows admins to set the translation used server-wide for EliteMobs default: op - elitemobs.killall.passiveelites: - description: Allows players to run /elitemobs kill passive + elitemobs.loot.command: + description: Opens the loot menu for EliteMobs group looting + default: true + elitemobs.loot.debug: + description: Gives admins a set of gear of a specific level for testing purposes default: op - elitemobs.killall.specificentity: - description: Allows players to run /elitemobs kill [entityType] + elitemobs.loot.admin: + description: Lets admins give or obtain EliteMobs loot via command default: op - elitemobs.shop: - description: Allows players to run /elitemobs shop + elitemobs.loot.stats: + description: Gives the elite stats of gear, for debugging purposes default: op - elitemobs.customshop: - decription: Allows players to run /elitemobs customshop + elitemobs.money.admin: + description: Allows admins to manually manipulate player elite currency default: op - elitemobs.currency.pay: - description: Allows players to run /elitemobs pay [username] [amount] + elitemobs.money.check.self: + description: Allows users to check their balance + default: true + elitemobs.money.check.others: + description: Allows users to check their balance default: op - elitemobs.currency.add: - description: Allows players to run /elitemobs add [username] [amount] + elitemobs.dungeon.package: + description: Allows admins to package EliteMobs content for distribution default: op - elitemobs.currency.subtract: - description: Allows players to run /elitemobs subtract [username] [amount] + elitemobs.money.pay: + description: Allows users to check their balance + default: true + elitemobs.place.admin: + description: Allows admins to run all commands related to placing and spawning npcs, bosses, treasure chests and more default: op - elitemobs.currency.set: - description: Allows players to run /elitemobs set [username] [amount] + elitemobs.quest.accept: + description: Allows users to accept a quest + default: true + elitemobs.quest.bypass: + description: Allows users to accept a quest default: op - elitemobs.currency.check: - description: Allows players to run /elitemobs check [username] + elitemobs.quest.complete.force: + description: Allows admins to force complete all pending quests default: op - elitemobs.currency.wallet: - description: Allows players to run /elitemobs wallet + elitemobs.quest.complete: + description: Allows players to complete quests + default: true + elitemobs.quest.leave: + description: Allows users to leave a quest + default: true + elitemobs.quest.reset.all: + description: Allows admins to reset all quests for a specific player default: op - elitemobs.currency.cointop: - description: Allows players to run /elitemobs highscore + elitemobs.quest.reset: + description: Allows admins to reset a quest for a specific player default: op - elitemobs.events.*: - description: Allows players to launch all events - children: - elitemobs.events.smalltreasuregoblin: true - elitemobs.events.deadmoon: true + elitemobs.quest.track: + description: Allows players to track the objectives of a quest + default: true + elitemobs.quest.npc: + description: Allows players to talk to quest npcs + default: true + elitemobs.quit: + description: Allows players to quit instanced content + default: true + elitemobs.rank.command: + description: Allows players to join open the rank menu of EliteMobs + default: true + elitemobs.rank.set: + description: Allows admins to set a specific EliteMobs rank for a specific player default: op - elitemobs.events.smalltreasuregoblin: - description: Allows players to run /elitemobs event smalltreasuregoblin + elitemobs.reload: + description: Allows admins to reload EliteMobs default: op - elitemobs.events.deadmoon: - description: Allows players to run /elitemobs event deadmoon + elitemobs.remove: + description: Allows admins to use the remove command default: op - elitemobs.events.kraken: - description: Allows players to randomly trigger the Kraken event when fishing; - defaut: true - elitemobs.events.balrog: - description: Allows players to randomly trigger the Balrog event when mining ore veins + elitemobs.repair.command: + description: Allows users to use the repair command default: true - elitemobs.events.fae: - description: Allows players to randomly trigger the Fae event when chopping down trees + elitemobs.respawn.force: + description: Allows admins to force respawn all regional bosses + default: op + elitemobs.scrap.command: + description: Allows players to use the scrap command + default: true + elitemobs.setup: + description: Allows admins to use the setup commands + default: op + elitemobs.shareitem: + description: Allows players to use the share item command + default: true + elitemobs.shop.custom: + description: Allows players to use custom shop command + default: true + elitemobs.shop.custom.other: + description: Allows admins to open the custom shop for other people + default: op + elitemobs.shop.dynamic: + description: Allows players to use dynamic shop command default: true - elitemobs.config.setmaxtier: - description: Allows players to run /elitemobs setmaxtier [tier] + elitemobs.shop.dynamic.other: + description: Allows admins to open the dynamic shop for other people default: op - elitemobs.checktier: - description: Allows players to run /elitemobs checktier + elitemobs.shop.sell.other: + description: Allows admins to open the sell shop for other people default: op - elitemobs.checkmaxtier: - description: Allows players to run /elitemobs checkmaxtier + elitemobs.teleport.spawn: + description: Allows players to use the spawn teleport command + default: true + elitemobs.instance.start: + description: Allows players to use the start command in instances + default: true + elitemobs.stats: + description: Allows admins to get stats related to EliteMobs + default: op + elitemobs.boss.track: + description: Allows players to track trackable bosses + default: true + elitemobs.transitiveblocks: + description: Allows admins to run commands related to setting up transitive blocks default: op - elitemobs.gettier: - description: Allows players tu run /elitemobs gettier [tier] + elitemobs.unbind.command: + description: Allows players to run the unbind command (which opens the menu to unbind with a scroll) + default: true + elitemobs.unbind.force: + description: Allows admins to force unbind a held item via command default: op - elitemobs.versionnotification: - description: Allows players to get notified about plugin updates + elitemobs.version: + description: Allows admins to check the plugin version of EliteMobs default: op - elitemobs.adventurersguild: - description: Allows players to use the /ag command to set their difficulty level and get quests - default: true \ No newline at end of file + elitemobs.rank.npc: + description: Allows players to talk to the rank npc + default: true + elitemobs.shop.dynamic.npc: + description: Allows players to talk to the dynamic shop npc + default: true + elitemobs.shop.custom.npc: + description: Allows players to talk to the custom shop npc + default: true + elitemobs.shop.sell.npc: + description: Allows players to talk to the sell shop npc + default: true + elitemobs.back.npc: + description: Allows players to talk to the back teleport npc + default: true + elitemobs.scrap.npc: + description: Allows players to talk to the scrap npc + default: true + elitemobs.repair.npc: + description: Allows players to talk to the repair npc + default: true + elitemobs.unbind.npc: + description: Allows players to talk to the unbind npc + default: true + elitemobs.enchant.npc: + description: Allows players to talk to the enchant npc + default: true + elitemobs.protection.bypass: + description: Allows players to run the bypass command to toggle bypassing dungeon protections + default: op \ No newline at end of file diff --git a/src/main/resources/translation.yml b/src/main/resources/translation.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/main/resources/translations/chinese_simplified.yml b/src/main/resources/translations/chinese_simplified.yml new file mode 100644 index 000000000..1d3944fb3 --- /dev/null +++ b/src/main/resources/translations/chinese_simplified.yml @@ -0,0 +1,13249 @@ +config: + noArenaPermissionMessage: '[精英怪物] 你没有进入该竞技场的权限!' +ItemSettings: + itemLoreStructureV2: + - '&7§m§l---------§7<§l装备详情§7>§m§l---------' + - '&7物品等级:&f$itemLevel &7声望 &6$prestigeLevel' + - '$weaponOrArmorStats' + - '$soulbindInfo' + - '$itemSource' + - '$ifLore&7&m&l-----------&7< &f&l描述&7 >&m&l-----------' + - '$customLore' + - '$ifEnchantments&7&m&l--------&7<&9&l附魔&7>&m&l--------' + - '$enchantments' + - '$eliteEnchantments' + - '$ifCustomEnchantments&7&m&l------&7< &3&l自定义附魔&7 >&m&l------' + - '$customEnchantments' + - '$ifPotionEffects&7&m&l----------&7< &5&l效果&7 >&m&l----------' + - '$potionEffect' + - '&7&l&m---------------------------' + - '$loreResaleValue' + shopSourceItemLores: '&7从商店购买获得' + mobSourceItemLores: '&7从精英$mob身上掠夺而得' + loreWorths: '&7价值$worth $currencyName' + loreResaleValues: '&7出售可获得$resale $currencyName' + eliteEnchantmentLoreStrings: 精英 + noSoulbindLore: '&7未绑定灵魂!' + preventEliteItemDisenchantmentMessage: '&c[精英怪物] 无法祛除精英物品附魔!' + scrapSucceededMessageV2: '&8[精英怪物] &2成功废弃$amount次!' + scrapFailedMessageV2: '&8[精英怪物] &2废弃失败$amount次!' + lowDurabilityItemDropMessage: '&8[精英怪物] &c耐久度低,已卸下盔甲! &8请在NPC处用废品维修!' + lowWeaponItemDropMessage: '&8[精英怪物] &耐久度低,已卸下武器! &8请在NPC处用废品维修!' + simlootMessageSuccess: '&8[精英怪物] &2刷新战利品并获得$itemName&2!' + simlootMessageFailure: '&8[精英怪物] &c刷新战利品但一无所获!' + directDropCustomLootMessage: '&8[精英怪物] &2获得$itemName&2!' + directDropMinecraftLootMessage: '&8[精英怪物] &a获得$itemName&a!' + directDropCoinMessage: '&8[精英怪物] &a获得&2$amount $currencyName&a!' + directDropSpecialMessage: '&8[精英怪物] &a获得&2$amount $name&a!' + weaponEntry: '&7精英DPS输出:&2$EDPS' + armorEntry: '&7精英护甲:&2$EDEF' +ProceduralItemGenerationSettings: + materialNames: + swordName: 剑 + bowName: 弓 + pickaxe: 镐 + spade: 锹 + hoe: 锄 + axe: 斧 + helmet: 头盔 + chestplate: 胸甲 + leggings: 护腿 + boots: 靴子 + shears: 剪刀 + fishingRod: 钓鱼竿 + shield: 盾牌 + trident: 三叉戟 + crossbow: 弩 + nameFormats: + - '$adjective$noun' + - '$verb$adjective$noun' + - '$verb$adjective$itemType' + - '$noun$itemType' + - '$verb-er$itemType' + - '$verb-er' + - '$adjective$verb-er' + nouns: + - 破晓黎明 + - 晚霞 + - 天堂 + - 地狱 + - 天使 + - 大天使 + - 小天使 + - 六翼天使 + - 恶魔 + - 凝视 + - 朋友 + - 蝙蝠 + - 混沌 + - 混乱 + - 鸡 + - 牛 + - 哞菇 + - 猪 + - 兔 + - 羊 + - 墨鱼 + - 村民 + - 洞穴蜘蛛 + - 末影人 + - 北极熊 + - 蜘蛛 + - 僵尸猪人 + - 烈焰人 + - 苦力怕 + - 远古守护者 + - 末影螨 + - 唤魔者 + - 溺尸 + - 海豚 + - 河豚 + - 恶魂 + - 守护者 + - 尸壳 + - 岩浆怪 + - 潜影贝 + - 蠹虫 + - 骷髅 + - 史莱姆 + - 流浪者 + - 猪灵 + - 僵尸猪灵 + - 疣猪兽 + - 猪灵蛮兵 + - 僵尸疣猪兽 + - 幻术师 + - 恼鬼 + - 卫道士 + - 女巫 + - 凋灵骷髅 + - 僵尸 + - 驴 + - 马 + - 羊驼 + - 骡 + - 豹猫 + - 狼 + - 铁傀儡 + - 雪傀儡 + - 末影龙 + - 凋灵 + - 鹦鹉 + - 巨人 + - 杀手兔 + - 史蒂夫 + - 祸根 + - 混沌 + - 万年 + - 龙 + - 斯芬克斯 + - 牛头人 + - 冥王 + - 掠夺者 + - 劫掠兽 + - 宣告 + - 誓言 + - 破誓者 + - 被遗弃者 + - 背叛者 + - 犹大 + - 光 + - 黑暗 + - 烽烟 + - 兰芷 + - 遗忘 + - 影 + - 虚空 + - 异种 + - 狂热者 + - 天顶 + - 黄昏 + - 暮色 + - 怪物 + - 精英怪物 + - 乌利斯特 + - 侏儒 + - 精灵 + - 兽人 + - 哥布林 + - 侏儒 + - 陨落 + - 歌利亚 + - 轻雾 + - 人类 + - 半人 + - 半兽人 + - 兽人 + - 亚人 + - 牧师 + - 巫妖王 + - 克苏鲁 + - 魔人 + - 枭雄 + - 斩首者 + - 夺心魔 + - 帕拉丁 + - 九头蛇 + - 克拉肯 + - 猫娘 + - 鲨蜥兽 + - 锈蚀怪 + - 山之巨人 + - 石巨人 + - 冰霜巨人 + - 烈焰巨人 + - 云之巨人 + - 风暴巨人 + - 土地神 + - 巫妖 + - 夺心魔 + - 伏地魔 + - 心魔 + - 魅魔 + - 怯魔 + - 判魂魔 + - 弗洛魔 + - 巴尔格拉 + - 巨牛魔 + - 狂战魔 + - 魂灵 + - 六臂蛇魔 + - 蜡融妖 + - 深狱炼魔 + - 劣魔 + - 龙巫妖 + - 变形怪 + - 五色龙 + - 蛛化精灵 + - 气元素 + - 土元素 + - 水元素 + - 火元素 + - 石像鬼 + - 土巨怪 + - 碎瑛武士 + - 飓能法师 + - 铸契骑士 + - 骏鹰 + - 国家炼金术师 + - 灵体 + - 轩亲王 + - 战士 + - 男巫 + - 圣骑士 + - 牧师 + - 护林员 + - 弓箭手 + - 魔法师 + - 魔人 + - 狼人 + - 吸血鬼 + - 半人马座 + - 猫科动物 + - 半巨人 + - 食人魔 + - 流氓 + - 野蛮人 + - 吟游诗人 + - 德鲁伊 + - 和尚 + - 巫师 + - 术士 + - 恶魔猎手 + - 死亡骑士 + - 神父 + - 萨满 + - 战士 + - 蛇怪 + - 嵌合体 + - 小鬼 + - 森林女神 + - 石像鬼 + - 巨灵 + - 火巨灵 + - 幽灵 + - 九头蛇 + - 克拉肯 + - 拉米亚 + - 吐槽 + - 美杜莎 + - 洛汗人 + - 刚铎人 + - 模仿者 + - 木乃伊 + - 飞马星座 + - 大鹏 + - 萨蒂尔 + - 泰拉斯奎巨兽 + - 苍天 + - 憎恶 + - 食尸鬼 + - 树妖 + - 独角兽 + - 贵族 + - 侍僧 + - 角斗士 + - 骑士 + - 狮鹫 + - 掠夺 + - 间谍 + - 贵族 + - 守卫 + - 老兵 + - 飞龙 + - 深渊 + - 地狱 + - 元素 + - 妖精龙 + - 牛头人 + - 熊猫人 + - 野人 + - 被遗忘者 + - 雪人 + - 女鬼 + - 魔蛛 + - 不死亡灵 + - 暗黑精灵 + - 血之精灵 + - 德莱尼 + - 狼人 + - 战争领主 + - 女巫 + - 法师 + - 圣人 + - 小偷 + - 刺客 + - MagmaGuy + - qsefthuopq + - 圣殿骑士 + - 驯兽师 + - 狂战士 + - 发明家 + - 职业摔跤手 + - 海盗 + - 先锋 + - 虚空之刃 + - 魔眼 + - 农夫 + - 步兵 + - 剑士 + - 四星 + - 听者 + - 奴隶 + - 风暴之父 + - 柔刹人 + - 光之领主 + - 碧落 + - 国王 + - 皇帝 + - 碎瑛武士 + - 飓能法师 + - 铸契骑士 + - 傀儡 + - 戈尔贡 + - 巫婆 + - 鹰身女妖 + - 骏鹰 + - 小矮人 + - 国家炼金术师 + - 不死战士 + - 豺人 + - 独眼怪 + - 恶鬼 + - 罗刹 + - 归来者 + - 异教徒 + adjectives: + - 美丽之 + - 干净之 + - 文雅之 + - 幻想之 + - 腐朽之 + - 迷人之 + - 长之 + - 出色之 + - 平凡之 + - 深红之 + - 深蓝之 + - 橙之 + - 黄之 + - 绿之 + - 蓝之 + - 紫之 + - 灰之 + - 荒野之 + - 黑之 + - 不灭之 + - 鸿鹄之 + - 白之 + - 死之 + - 奇怪之 + - 强大之 + - 震耳欲聋之 + - 雷电之 + - 古代之 + - 腐烂之 + - 虚无之 + - 重之 + - 神奇之 + - 模糊之 + - 愤怒之 + - 复仇之 + - 野蛮之 + - 狂暴之 + - 最好之 + - 眩晕之 + - 暴雪之 + - 鲜血之 + - 沸腾之 + - 无穷之 + - 勇敢之 + - 易碎之 + - 颤栗之 + - 笨拙之 + - 多云之 + - 经典之 + - 深渊之 + - 普通之 + - 精致之 + - 破损之 + - 破碎之 + - 危险之 + - 黑暗之 + - 精英之 + - 奇异之 + - 真· + - 假· + - 花之 + - 游弋之 + - 狂怒之 + - 跃动之 + - 泡沫之 + - 愚昧之 + - 遗忘之 + - 幸运之 + - 脆弱之 + - 疯狂之 + - 自由之 + - 巨大之 + - 神之 + - 开心之 + - 绯红之 + - 地狱之 + - 浩大之 + - 饥饿之 + - 冰之 + - 非法之 + - 无礼之 + - 重要之 + - 博学之 + - 微小之 + - 现代之 + - 幼稚之 + - 中立之 + - 干净之 + - 灵跃之 + - 新之 + - 量产之 + - 和平之 + - 完美之 + - 粉色之 + - 塑料之 + - 笨重之 + - 珍贵之 + - 收费之 + - 私人之 + - 迅捷之 + - 稀有之 + - 一般之 + - 圆之 + - 忠诚之 + - 咸之 + - 科学之 + - 二手之 + - 秘制之 + - 短之 + - 强大之 + - 甜蜜之 + - 紧绷之 + - 可怕之 + - 狡猾之 + - 极· + - 里· + - 超级 + - 毫无防备之 + - 独一无二之 + - 未知之 + - 崭新之 + - 非同寻常之 + - 用过之 + - 有用之 + - 无用之 + - 珍贵之 + - 灵韵之 + - 暴力之 + - 绝妙之 + - 直死之 + - 无价之 + - 错误之 + - 神之 + - 险恶之 + - 切割之 + - 黑暗 + - 自信的 + - 决定性的 + - 深的 + - 战败的 + - 瑕疵之 + - 反抗之 + - 脆弱之 + - 美味的 + - 愉悦的 + - 恶魔的 + - 扰神的 + - 疯狂的 + - 描述的 + - 魔鬼的 + - 困难的 + - 勤奋的 + - 极恶的 + - 肮脏的 + - 灾难的 + - 厌恶的 + - 恶心的 + - 幻灭的 + - 独特的 + - 不安的 + - 严酷的 + - 戏剧性的 + - 沉闷的 + - 功能性的 + - 渴望的 + - 年老的 + - 电之 + - 精英的 + - 附魔的 + - 着魔的 + - 精力充沛的 + - 无数的 + - 有趣的 + - 热情的 + - 有害的 + - 不稳定的 + - 缥缈的 + - 逃避的 + - 优秀的 + - 兴奋的 + - 激动的 + - 异国的 + - 旺盛的 + - 绝妙的 + - 淡却之 + - 公平的 + - 忠诚的 + - '假的' + - 熟悉的 + - 知名的 + - 狂热的 + - 精彩的 + - 迷人的 + - 肥胖的 + - 恐惧之 + - 无畏的 + - 虚弱的 + - 喜庆的 + - 凶猛的 + - 肮脏的 + - 精细的 + - 挑剔的 + - 第一个 + - 修好的 + - 闪耀的 + - 完美无瑕的 + - 易碎的 + - 翻转的 + - 如花的 + - 软绵绵的 + - 飘动的 + - 泡沫的 + - 愚蠢的 + - 易忘的 + - 有幸的 + - 孱弱的 + - 脆弱的 + - 丧心病狂的 + - 自由的 + - 冰冷的 + - 新鲜的 + - 友好的 + - 可怕的 + - 笨手笨脚的 + - 滑稽的 + - 毛茸茸的 + - 隐秘的 + - 模糊的 + - 巨大的 + - 天资聪慧的 + - 极大的 + - 发光的 + - 壮丽的 + - 神圣的 + - 优良的 + - 愚昧的 + - 艳丽的 + - 优美的 + - 宏伟的 + - 感激不尽的 + - 滑滑的 + - 很棒的 + - 贪婪的 + - 悲痛的 + - 时髦的 + - 怪诞的 + - 污秽的 + - 血腥的 + - 暴躁的 + - 谨慎的 + - 无辜的 + - 轻信的 + - 勇敢的 + - 呜咽的 + - 神圣的 + - 悬挂的 + - 倒霉的 + - 开心的 + - 协调的 + - 可恨的 + - 健康的 + - 心碎的 + - 天国的 + - 地狱的 + - 有用的 + - 无助的 + - 犹豫的 + - 可怕的 + - 搞笑的 + - 空洞的 + - 无家可归的 + - 尊贵的 + - 恐怖的 + - 好客的 + - 巨大的 + - 笨重的 + - 诙谐的 + - 饥饿的 + - 受伤的 + - 安静的 + - 催眠的 + - 歇斯底里的 + - 恶心的 + - 冷冰冰的 + - 愚昧的 + - 患病的 + - 非法的 + - 杰出的 + - 幻想的 + - 硕大的 + - 急迫的 + - 公正的 + - 不完善的 + - 不礼貌的 + - 重要的 + - 辉耀的 + - 无能的 + - 勤奋的 + - 难以置信的 + - 便宜的 + - 臭名昭著的 + - 清白的 + - 好奇的 + - 阴险的 + - 本能的 + - 聪明的 + - 有趣的 + - 战无不胜的 + - 愤怒的 + - 发痒的 + - 厌倦的 + - 锯齿状的 + - 嫉妒的 + - 快活的 + - 欢乐的 + - 活蹦乱跳的 + - 年少的 + - 敏锐的 + - 和蔼的 + - 热心的 + - 认知的 + - 知识渊博的 + - 出名的 + - 辛勤劳动的 + - 瘸腿的 + - 庞大的 + - 最后的 + - 迟慢的 + - 可笑的 + - 懒惰的 + - 倾斜的 + - 致命的 + - 明亮的 + - 短小的 + - 活跃的 + - 孤独的 + - 响亮的 + - 迷人的 + - 幸运的 + - 品红的 + - 魔幻的 + - 雄伟的 + - 恶意的 + - 醒目的 + - 魁伟的 + - 奇妙的 + - 刻薄的 + - 医疗的 + - 融化的 + - 凌乱的 + - 强大的 + - 军事的 + - 无知的 + - 次要的 + - 迷蒙的 + - 混杂的 + - 现代的 + - 一动不动的 + - 神秘的 + - 幼稚的 + - 狭窄的 + - 自然的 + - 整洁的 + - 必要的 + - 不必要的 + - 有需要的 + - 紧张的 + - 新的 + - 好的 + - 普通的 + - 怀旧的 + - 无尽的 + - 过时的 + - 可得到的 + - 海洋的 + - 老式的 + - 全能的 + - 最佳的 + - 一般的 + - 有机的 + - 优秀的 + - 椭圆形 + - 高估的 + - 痛苦的 + - 平行的 + - 可怜的 + - 平静的 + - 忏悔的 + - 完美的 + - 定期的 + - 弱小的 + - 躯体的 + - 粉色的 + - 塑料的 + - 愉悦的 + - 无意义的 + - 有礼貌的 + - 贫困的 + - 珍稀的 + - 高级的 + - 现在的 + - 漂亮的 + - 私人的 + - 高产的 + - 保护的 + - 公共的 + - 令人费解的 + - 可疑的 + - 快速的 + - 最快的 + - 稀有的 + - 就绪的 + - 真实的 + - 叛逆的 + - 常规的 + - 卓越的 + - 负责的 + - 浪漫的 + - 圆的 + - 皇家的 + - 悲伤的 + - 安全的 + - 咸的 + - 满意的 + - 吓人的 + - 惊悚的 + - 科学的 + - 瘦小的 + - 尖叫的 + - 第二的 + - 二手的 + - 隐藏的 + - 自私的 + - 盲从的 + - 严肃的 + - 浅薄的 + - 锐利的 + - 闪亮的 + - 令人震惊的 + - 短的 + - 害羞的 + - 虚弱的 + - 沉默的 + - 丝滑的 + - 愚蠢的 + - 简单的 + - 瘦骨嶙峋的 + - 苗条的 + - 黏糊糊的 + - 滑溜的 + - 小的 + - 聪明伶俐的 + - 微笑的 + - 光滑之 + - 鬼鬼祟祟的 + - 柔软之 + - 坚硬之 + - 特别的 + - 壮观的 + - 辛辣的 + - 尖刺之 + - 灿烂的 + - 诡异的 + - 无暇之 + - 方形之 + - 冒险之 + - 站立之 + - 稳定之 + - 黏稠之 + - 奇怪之 + - 条纹的 + - 强壮的 + - 成功的 + - 超级的 + - 至高的 + - 甜的 + - 才华横溢的 + - 高的 + - 可口的 + - 短暂的 + - 僵直的 + - 糟糕的 + - 了不起的 + - 经受考验的 + - 感激的 + - 厚的 + - 薄的 + - 渴求的 + - 深思熟虑的 + - 微小的 + - 疲惫的 + - 棘手的 + - 烦恼的 + - '正确的' + - 丑陋的 + - 究极的 + - 轻率的 + - 徒手的 + - 裸露的 + - 不健康的 + - 独特的 + - 未知之 + - 反常之 + - 崭新的 + - 与众不同的 + - 用过的 + - 实用的 + - 无用的 + - 珍贵之 + - 暴力的 + - 等待的 + - 游荡之 + - 温暖之 + - 虚弱之 + - 富裕之 + - 全部的 + - 智慧之 + - 美妙之 + - 木制的 + - 忧郁之 + - 无用之 + - 错误的 + - 险恶之 + - 信任的 + - 谦逊之 + - 威胁之 + verbs: + - 尖锐之 + - 锋锐的 + - 杀戮的 + - 屠夫的 + - 毁灭的 + - 谋杀的 + - 旅行的 + - 天使的 + - 公开的 + - 蔚蓝的 + - 狂战士的 + - 炽热的 + - 北方的 + - 残酷的 + - 燃烧的 + - 船长的 + - 天体的 + - 冷静的 + - 牧师的 + - 冷凝的 + - 神圣的 + - 残酷的 + - 致命的 + - 狡猾的 + - 苛刻的 + - 龙的 + - 天堂的 + - 专家的 + - 忠实的 + - 孤独的 + - 狂热的 + - 野生的 + - 凶猛的 + - 燃烧的 + - 绿色的 + - 激烈的 + - 盖亚的 + - 闪烁的 + - 发光的 + - 虔诚的 + - 盗墓者的 + - 进击的 + - 寒冷的 + - 教皇的 + - 突袭的 + - 国王的 + - 骑士的 + - 月球的 + - 少女的 + - 大规模的 + - 机械论者的 + - 主义的 + - 无情的 + - 自然的 + - 没有感情的 + - 亡灵杀手之 + - 有害的 + - 圣骑士的 + - 致命的 + - 铂金的 + - 汹涌的 + - 破碎的 + - 圣洁的 + - 野蛮的 + - 闪烁的 + - 尖叫的 + - 蛇的 + - 溃败的 + - 令人震惊的 + - 精神的 + - 有毒的 + - 教练的 + - 神秘的 + - 通灵的 + - 暴戾的 + - 资深的 + - 恶毒的 + - 胜利的 + - 旺盛的 + - 哀号的 + - 战士的 + - 怪异的 + - 巨龙的 + - 服主的 + - 残缺的 + - 天使的 + - 恶魔的 + - 朗基努斯的 + - 炽热的 + - 永恒的 + - 不朽的 + - 传说中的 + - 虚幻的 + - 神话的 + - 神秘的 + - 德鲁伊的 + - 隔绝的 + - 专家的 + - 复仇者的 + - 破旧的 + - 我的 + - 你的 + - 冰冷的 + - Herobrine的 + - 集结的 + - 暗黑破坏神的 + - 克苏鲁的 + - 死神的 + - 非洲的 + - 欧洲的 + - 世界的 + - 王的 + - 以撒的 + - 三星的 + - 假的 + - 加了特技的 + - 不可名状的 + - 开光的 + - 忠诚的 + - 召唤者的 + - 暴怒的 + - 疯狂的 + - 死灵法师的 + - 铁匠的 + - 异次元的 + - 四次元的 + - 牛顿的 + - 远古的 + - 锋利的 + - 程序员的 + - 单身狗的 + - 感染者的 + - 中二的 + - 无政府主义者的 + - 和平主义者的 + - 宙斯的 + - 赫尔墨斯的 + - 尖叫的 + - 死而复生的 + - 正版的 + - 不存在的 + - 撒旦的 + - 平凡的 + - 剪切的 + - 分裂的 + - 轴心的 + - 斩击的 + - 弯曲的 + - 撕裂的 + - 细化的 + - 耕作的 + - 雕饰的 + - 解剖的 + - 骇入的 + - 贯穿的 + - 锯木的 + - 剔除的 + - 裁剪的 + - 采矿的 + - 钻研的 + - 挖掘的 + - 挖坑的 + - 钻头的 + - 镂空的 + - 雕凿的 + - 凿隧的 + - 入侵的 + - 寄宿的 + - 游荡的 + - 滲透的 + - 闯入的 + - 逃避的 + - 逃离的 + - 跑动的 + - 闪避的 + - 崩溃的 + - 战斗的 + - 应战的 + - 摔角的 + - 擦伤的 + - 决斗的 + - 斗殴的 + - 增殖的 + - 拳击的 + - 碰撞的 + - 战斗的 + - 钩索的 + - 报废的 + - 攻击的 + - 争执的 + - 冲突的 + - 发现的 + - 侦测的 + - 捉到的 + - 溶解的 + - 揭示的 + - 发掘的 + - 飞跃的 + - 弹性的 + - 弹跳的 + - 跃升的 + - 活跃的 + - 汹涌的 + - 凌空的 + - 启动的 + - 无头的 + - 感应的 + - 感知的 + - 虚伪的 + - 朦胧的 + - 流血的 + - 缩减的 + - 削弱的 + - 纯真的 + - 野性的 + - 锻造的 + - 释放的 + - 采集的 + - 收藏的 + - 传统的 + - 粉碎的 + - 推进的 + - 慢跑的 + - 奔跑的 + - 探索的 + - 侦察的 + - 爆炸的 + - 挖掘的 + - 颤抖的 + - 喋喋不休的 + - 分离的 + - 骇入的 + - 精神变态的 + - 雕饰的 + - 过气的 + - 减半的 + - 突发的 + - 无语的 + - 缄默的 + - 杂种的 + - 奶奶的 + - 放养的 + - 囚禁的 + - 中肯的 + - 孤立的 + - 纠缠的 + - 刻骨铭心的 + - 谁的 + - 限制的 + - 绑定的 + - 隐形的 + - 世界的 + - 冥界的 + - 笼罩的 + - 纯白的 + - 萦绕的 + - 爬行的 + - 潜行的 + - 间谍的 + - 复仇的 + - 暴风的 + verb-ers (noun): + - 世界破坏者 + - 世界切割者 + - 复仇者 + - 灰烬使者 + - 听风者 + - 亵渎者 + - 雷霆之怒 + - 切割机 + - 伐木者 + - 切割者 + - 隔离者 + - 雕刻者 + - 记者 + - 作弊者 + - 筑梦者 + - 逐梦者 + - 逐暗者 + - 裁决者 + - 刺客 + - 杀手 + - 屠戮者 + - 破坏者 + - 拥抱者 + - 观测者 + - 时间领主 + - 谋杀者 + - 冲击者 + - 旅者 + - 旅人 + - 律者 + - 搬运工 + - 瞥视者 + - 肇事者 + - 钢铁之躯 + - 召唤者 + - 需求者 + - 突袭者 + - 前锋 + - 伏兵 + - 推土机 + - 风暴召唤者 + - 轰炸机 + - 弹幕 + - 打击者 + - 霸主 + - 战士 + - 锤兵 + - 格斗者 + - 湮灭者 + - 丽影 + - 射手 + - 冒险家 + - 爆破者 + - 终结者 + - 破碎者 + - 撕裂者 + - 狙击手 + - 爆破者 + - 探索者 + - 痛 + - 分裂者 + - 筑城者 + - 召唤者 + - 呐喊者 + - 转换者 + - 变形者 + - 修改者 + - 残影 + - 传送者 + - 替代者 + - 改写者 + - 进化者 + - 猎人 + - 追踪者 + - 尾随者 + - 潜行者 + - 暗影神偷 + - 起义者 + - 隐藏者 + - 埋葬者 + - 云巅之主 + - 影舞者 + - 封印者 + - 掩饰者 + - 阐释者 + - 穿越者 + - 滑行者 + - 吼叫者 + - 斧王 + - 撕裂者 + - 裁剪者 + - 约束者 + - 雕刻者 + - 黑客 + - 穿刺者 + - 见证者 + - 剃须刀 + - 矿工 + - 钻孔者 + - 挖掘者 + - 寄生者 + - 流浪者 + - 入侵者 + - 侵略者 + - 跑者 + - 欺瞒者 + - 毁灭者 + - 战士 + - 搏斗者 + - 决斗者 + - 造梦者 + - 争吵者 + - 冲击者 + - 进攻者 + - 封建主义者 + - 揭露者 + - 飞跃者 + - 隐者 + - 吸血鬼 + - 闪耀者 + - 弱者 + - 伪造者 + - 释放者 + - 收集者 + - 施莱德 + - 推进者 + - 慢跑者 + - 速跑者 + - 童子军 + - 探险家 + - 挖掘者 + - 震颤者 + - 参与者 + - 洞穴探险者 + - 半赫者 + - 破坏者 + - 弑神者 + - 渲染者 + - 开膛手 + - 食植者 + - 垄断者 + - 针锋 + - 爱 + - 捉捕者 + - 约束者 + - 契合者 + - 狙击手 + - 攫取者 + - 鬼影 + - 劫掠者 + - 吞噬者 + - 爬行者 + - 溶解者 + - 潜行者 + - 揭示者 + - 跳跃者 + - 弹跳者 + - 牵引者 + - 歌者 + - 手术师 + - 罚球手 + - 飞踢者 + - 感知者 + - 退化者 + - 放血者 + - 舞者 + - 锻工 + - 释放者 + - 隐秘者 + - 粉碎机 + - 螺旋桨 + - 慢跑者 + - 疾跑者 + - 侦查者 + - 探索者 + - 挖掘者 + - 颤抖者 + - 合作者 + - 黑客 + - 雕刻师 + - 分割者 + - 惶恐的 + - 破坏者 + - 闪耀者 + - 撕裂者 + - 掠食者 + - 监禁者 + - 垄断者 + - 纠缠者 + - 抓捕者 + - 抑制者 + - 捆缚者 + - 修剪者 + - 抢夺者 + - 征服者 + - 盗墓者 + - 缠身者 + - 苦力怕 + - 潛行者 + - 捆缚者 + - 禁锢者 + - 诱惑者 + - 勇者 + - 爆破者 + - 食者 + - 打鼾者 + - 推进者 + - 裁决者 +absorption: + name: 伤害吸收 +blindness: + name: 失明 +conduit_power: + name: 潮涌能量 +confusion: + name: 反胃 +damage_resistance: + name: 抗性提升 +dolphins_grace: + name: 海豚的恩惠 +fast_digging: + name: 急迫 +fire_resistance: + name: 防火 +glowing: + name: 发光 +harm: + name: 瞬间伤害 +heal: + name: 瞬间治疗 +health_boost: + name: 生命提升 +hunger: + name: 饥饿 +increase_damage: + name: 力量 +invisibility: + name: 隐身 +jump: + name: 跳跃提升 +levitation: + name: 飘浮 +luck: + name: 幸运 +night_vision: + name: 夜视 +poison: + name: 中毒 +regeneration: + name: 生命恢复 +saturation: + name: 饱和 +slow: + name: 缓慢 +slow_digging: + name: 挖掘疲劳 +slow_falling: + name: 缓降 +speed: + name: 速度 +unluck: + name: 霉运 +water_breathing: + name: 水下呼吸 +weakness: + name: 虚弱 +wither: + name: 凋零 +translation: + Economy pay message v2: '&2你支付了&2$amount_sent $currency_name&2给$receiver&2,他税后获得$amount_received。' + Economy currency left message: 你现在拥有&2$amount_left $currency_name + Economy money from payment message: 你从$sender处获得了&2$amount_sent $currency_name + Economy payment insuficient currency: '&c你没有足够多的$currency_name来这么做!' + Wallet command message: 你现在拥有&2$balance $currency_name + Tax confirmation message: '&c转账将收税$percentage%。&a输入&9$command &a继续!' + shopBatchSellItem: '&a你卖出物品获得了&a $currency_amount $currency_name!' + Shop buy message: '&a你用$item_value $currency_name购买了$item_name!' + Shop current balance message: '&a你拥有$currency_amount $currency_name。' + Shop insufficient funds message: '&c你没有足够多的$currency_name!' + Shop item cost message: 那件物品需要&c$item_value $currency_name。 + Shop sell message: '&a你出售了$item_name &a,获得了$currency_amount $currency_name!' + Shop sale player items warning: '&c你无法出售未绑定灵魂的装备!这包括其它声望等级的物品。' + Shop sale instructions: '&c你只能在这里出售精英怪战利品!(精英怪掉落的盔甲或武器)' + Teleport time left: '&7[EM] 将在&a$time&7后进行传送……' + Teleport cancelled: '&7[EM] &c传送被终止!' + noPendingCommands: '&c您目前没有任何待处理的指令!' + trackMessage: 追踪$name + chestLowRankMessage: '&7[EM] &c你至少要有$rank &c公会等级 才能打开这个箱子!' + chestCooldownMessage: '&7[EM] &c你最近开过这个箱子了!请等候$time!' + insufficientCurrencyForWormholeMessage: '&8[精英怪物] &c货币不足! 你需要$amount来使用com.magmaguy.elitemobs.wormhole!' + dismissEMMessage: '&8[精英怪物] &2/elitemobs &fmenu 没用?试试&2/elitemobs alt &f查看另一个版本的菜单吧!&c不想再次看到此消息?请输入&4/em dismiss' + switchEMStyleMessage: '&8[精英怪物] &f已变更&2/elitemobs &f菜单风格!' +EconomySettings: + currencyName: 精英币 + chatCurrencyShowerMessage: '&7[EM] 你捡起了 &a$amount $currency_name!' + actionbarCurrencyShowerMessage: '&7[EM] 你捡起了 &a$amount $currency_name!' + adventurersGuildNotificationMessages: '&7[EM] 想要买买买? 输入&a/ag &7或&a/em吧' +arrow_damage: + name: 力量 +arrow_fire: + name: 火矢 +arrow_infinite: + name: 无限 +arrow_knockback: + name: 冲击 +binding_curse: + name: 绑定诅咒 +channeling: + name: 引雷 +critical_strikes: + name: 致命打击 + criticalHitPopup: '&5正中要害!' +damage_all: + name: 锋利 +damage_arthropods: + name: 节肢杀手 +damage_undead: + name: 亡灵杀手 +depth_strider: + name: 深海探索者 +dig_speed: + name: 效率 +drilling: + name: 钻孔 +durability: + name: 耐久 +earthquake: + name: 地震 + earthquakeActivationMessage: '&8[精英怪物] &a已触发地震!&c需要2分钟冷却!' + earthquakeAvailableMessage: '&8[精英怪物] &2地震冷却结束!' +fire_aspect: + name: 火焰附加 +flamethrower: + name: 喷火 +frost_walker: + name: 冰霜行者 +grappling_hook: + name: 抓钩 +hunter: + name: 狩猎 +ice_breaker: + name: 破冰 +impaling: + name: 穿刺 +knockback: + name: 击退 +lightning: + name: 雷击 +loot_bonus_blocks: + name: 时运 +loot_bonus_mobs: + name: 抢夺 +loud_strikes: + name: 响击 +loyalty: + name: 忠诚 +lure: + name: 饵钓 +mending: + name: 经验修补 +meteor_shower: + name: 星陨 +multishot: + name: 多重射击 +oxygen: + name: 水下呼吸 +piercing: + name: 穿透 +plasma_boots: + name: 等离子靴子 +protection_environmental: + name: 保护 +protection_explosions: + name: 爆炸保护 +protection_fall: + name: 摔落保护 +protection_fire: + name: 火焰保护 +protection_projectile: + name: 弹射物保护 +quick_charge: + name: 快速装填 +riptide: + name: 激流 +silk_touch: + name: 精准采集 +soulbind: + name: 灵魂绑定 + loreStrings: '&7绑定了$player&7的灵魂' + hologramString: '$player&f的' +summon_merchant: + name: 唤商 + message: Jeeves! +summon_wolf: + name: 唤狼 +sweeping_edge: + name: 横扫之刃 +thorns: + name: 荆棘 +unbind: + name: 解绑 +vanishing_curse: + name: 消失诅咒 +water_worker: + name: 水下速掘 +AntiExploit: + AntiExploit message: '&c[EM反刷怪系统] &7附近的精英怪物不会掉落特殊战利品。' +CombatTag: + Combat tag message: '&c[精英怪物] 战斗标记已激活!' +AdventurersGuild: + adventurersGuildMenuName: '&6§l冒险者大厅' + Prestige 0 rank 0: '&8凡人 - 关闭精英怪物!' + Prestige 0 rank 0 short placeholder: '&6&l✧&e0' + Prestige 0 rank 1: '&f新手' + Prestige 0 rank 1 short placeholder: '&6&l✧&eⅠ' + Prestige 0 rank 2: '&f初学者' + Prestige 0 rank 2 short placeholder: '&6&l✧&eⅠⅠ' + Prestige 0 rank 3: '&f学徒' + Prestige 0 rank 3 short placeholder: '&6&l✧&eⅠⅠⅠ' + Prestige 0 rank 4: '&2冒险家' + Prestige 0 rank 4 short placeholder: '&6&l✧&eⅠⅤ' + Prestige 0 rank 5: '&2熟练的冒险家' + Prestige 0 rank 5 short placeholder: '&6&l✧&eⅤ' + Prestige 0 rank 6: '&2专业冒险家' + Prestige 0 rank 6 short placeholder: '&6&l✧&eⅤⅠ' + Prestige 0 rank 7: '&1老冒险家' + Prestige 0 rank 7 short placeholder: '&6&l✧&eⅤⅠⅠ' + Prestige 0 rank 8: '&1精英' + Prestige 0 rank 8 short placeholder: '&6&l✧&eⅤⅠⅠⅠ' + Prestige 0 rank 9: '&l大师' + Prestige 0 rank 9 short placeholder: '&6&l✧&eⅠⅩ' + Prestige 0 rank 10: '&5英雄' + Prestige 0 rank 10 short placeholder: '&6&l✧&eⅩ' + Prestige 1 rank 0: '&e声望1 &8凡人' + Prestige 1 rank 0 short placeholder: '&e⚜Ⅰ&6&l✧&e0' + Prestige 1 rank 1: '&e声望1 &f新手' + Prestige 1 rank 1 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠ' + Prestige 1 rank 2: '&e声望1 &f初学者' + Prestige 1 rank 2 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅠ' + Prestige 1 rank 3: '&e声望1 &f学徒' + Prestige 1 rank 3 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅠⅠ' + Prestige 1 rank 4: '&e声望1 &2冒险家' + Prestige 1 rank 4 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅤ' + Prestige 1 rank 5: '&e声望1 &2熟练的冒险家' + Prestige 1 rank 5 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤ' + Prestige 1 rank 6: '&e声望1 &2专业冒险家' + Prestige 1 rank 6 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠ' + Prestige 1 rank 7: '&e声望1 &1老冒险家' + Prestige 1 rank 7 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠⅠ' + Prestige 1 rank 8: '&e声望1 &1精英' + Prestige 1 rank 8 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠⅠⅠ' + Prestige 1 rank 9: '&e声望1 &5大师' + Prestige 1 rank 9 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅩ' + Prestige 1 rank 10 short placeholder: '&e⚜Ⅰ&6&l✧&eⅩ' + Prestige 1 rank 10: '&e声望1 &5英雄' + Prestige 1 rank 11: '&a声望1 &5传说' + Prestige 1 rank 11 short placeholder: '&e⚜Ⅰ&6&l✧&eⅩⅠ' + Prestige 2 rank 0: '&2声望2 &8凡人' + Prestige 2 rank 0 short placeholder: '&2⚜ⅠⅠ&6&l✧&e0' + Prestige 2 rank 1: '&2声望2 &f新手' + Prestige 2 rank 1 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠ' + Prestige 2 rank 2: '&2声望2 &f初学者' + Prestige 2 rank 2 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅠ' + Prestige 2 rank 3: '&2声望2 &f学徒' + Prestige 2 rank 3 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 2 rank 4: '&2声望2 &2冒险家' + Prestige 2 rank 4 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅤ' + Prestige 2 rank 5: '&2声望2 &2熟练的冒险家' + Prestige 2 rank 5 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤ' + Prestige 2 rank 6: '&2声望2 &2专业冒险家' + Prestige 2 rank 6 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠ' + Prestige 2 rank 7: '&2声望2 &1老冒险家' + Prestige 2 rank 7 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 2 rank 8: '&2声望2 &1精英' + Prestige 2 rank 8 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 2 rank 9: '&2声望2 &5大师' + Prestige 2 rank 9 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅩ' + Prestige 2 rank 10 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩ' + Prestige 2 rank 10: '&2声望2 &5英雄' + Prestige 2 rank 11: '&2声望2 &5传说' + Prestige 2 rank 11 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩⅠ' + Prestige 2 rank 12: '&2声望2 &5神话' + Prestige 2 rank 12 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 3 rank 0: '&a声望3 &8凡人' + Prestige 3 rank 0 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&e0' + Prestige 3 rank 1: '&a声望3 &f新手' + Prestige 3 rank 1 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠ' + Prestige 3 rank 2: '&a声望3 &f初学者' + Prestige 3 rank 2 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠ' + Prestige 3 rank 3: '&a声望3 &f学徒' + Prestige 3 rank 3 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 3 rank 4: '&a声望3 &2冒险家' + Prestige 3 rank 4 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅤ' + Prestige 3 rank 5: '&a声望3 &2熟练的冒险家' + Prestige 3 rank 5 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤ' + Prestige 3 rank 6: '&a声望3 &2专业冒险家' + Prestige 3 rank 6 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠ' + Prestige 3 rank 7: '&a声望3 &1老冒险家' + Prestige 3 rank 7 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 3 rank 8: '&a声望3 &1精英' + Prestige 3 rank 8 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 3 rank 9: '&a声望3 &5大师' + Prestige 3 rank 9 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅩ' + Prestige 3 rank 10 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩ' + Prestige 3 rank 10: '&a声望3 &5英雄' + Prestige 3 rank 11: '&a声望3 &5传说' + Prestige 3 rank 11 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠ' + Prestige 3 rank 12: '&a声望3 &5神话' + Prestige 3 rank 12 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 3 rank 13: '&a声望3 &5不朽' + Prestige 3 rank 13 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 4 rank 0: '&3声望4 &8凡人' + Prestige 4 rank 0 short placeholder: '&3⚜ⅠⅤ&6&l✧&e0' + Prestige 4 rank 1: '&3声望4 &f新手' + Prestige 4 rank 1 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠ' + Prestige 4 rank 2: '&3声望4 &f初学者' + Prestige 4 rank 2 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅠ' + Prestige 4 rank 3: '&3声望4 &f学徒' + Prestige 4 rank 3 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅠⅠ' + Prestige 4 rank 4: '&3声望4 &2冒险家' + Prestige 4 rank 4 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅤ' + Prestige 4 rank 5: '&3声望4 &2熟练的冒险家' + Prestige 4 rank 5 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤ' + Prestige 4 rank 6: '&3声望4 &2专业冒险家' + Prestige 4 rank 6 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠ' + Prestige 4 rank 7: '&3声望4 &1老冒险家' + Prestige 4 rank 7 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠⅠ' + Prestige 4 rank 8: '&3声望4 &1精英' + Prestige 4 rank 8 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠⅠⅠ' + Prestige 4 rank 9: '&3声望4 &5大师' + Prestige 4 rank 9 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅩ' + Prestige 4 rank 10 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩ' + Prestige 4 rank 10: '&3声望4 &5英雄' + Prestige 4 rank 11: '&3声望4 &5传说' + Prestige 4 rank 11 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠ' + Prestige 4 rank 12: '&3声望4 &5神话' + Prestige 4 rank 12 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅠ' + Prestige 4 rank 13: '&3声望4 &5不朽' + Prestige 4 rank 13 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅠⅠ' + Prestige 4 rank 14: '&3声望4 &5天选之人' + Prestige 4 rank 14 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅤ' + Prestige 5 rank 0: '&b声望5 &8凡人' + Prestige 5 rank 0 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 5 rank 1: '&b声望5 &f新手' + Prestige 5 rank 1 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠ' + Prestige 5 rank 2: '&b声望5 &f初学者' + Prestige 5 rank 2 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅠ' + Prestige 5 rank 3: '&b声望5 &f学徒' + Prestige 5 rank 3 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅠⅠ' + Prestige 5 rank 4: '&b声望5 &2冒险家' + Prestige 5 rank 4 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅤ' + Prestige 5 rank 5: '&b声望5 &2熟练的冒险家' + Prestige 5 rank 5 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤ' + Prestige 5 rank 6: '&b声望5 &2专业冒险家' + Prestige 5 rank 6 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠ' + Prestige 5 rank 7: '&b声望5 &1老冒险家' + Prestige 5 rank 7 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠⅠ' + Prestige 5 rank 8: '&b声望5 &1精英' + Prestige 5 rank 8 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠⅠⅠ' + Prestige 5 rank 9: '&b声望5 &5大师' + Prestige 5 rank 9 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅩ' + Prestige 5 rank 10 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩ' + Prestige 5 rank 10: '&b声望5 &5英雄' + Prestige 5 rank 11: '&b声望5 &5传说' + Prestige 5 rank 11 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠ' + Prestige 5 rank 12: '&b声望5 &5神话' + Prestige 5 rank 12 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅠ' + Prestige 5 rank 13: '&b声望5 &5不朽' + Prestige 5 rank 13 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅠⅠ' + Prestige 5 rank 14: '&b声望5 &5天选之人' + Prestige 5 rank 14 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅤ' + Prestige 5 rank 15: '&b声望5 &5支配者' + Prestige 5 rank 15 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅤ' + Prestige 6 rank 0: '&4声望 6 &8凡人' + Prestige 6 rank 0 short placeholder: '&4⚜ⅤⅠ&6&l✧&e0' + Prestige 6 rank 1: '&4声望 6 &f新手' + Prestige 6 rank 1 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠ' + Prestige 6 rank 2: '&4声望 6 &f初学者' + Prestige 6 rank 2 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅠ' + Prestige 6 rank 3: '&4声望 6 &f学徒' + Prestige 6 rank 3 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅠⅠ' + Prestige 6 rank 4: '&4声望 6 &2冒险家' + Prestige 6 rank 4 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅤ' + Prestige 6 rank 5: '&4声望 6 &2熟练的冒险家' + Prestige 6 rank 5 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤ' + Prestige 6 rank 6: '&4声望 6 &2专业冒险家' + Prestige 6 rank 6 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠ' + Prestige 6 rank 7: '&4声望 6 &1老冒险家' + Prestige 6 rank 7 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠⅠ' + Prestige 6 rank 8: '&4声望 6 &1精英' + Prestige 6 rank 8 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 6 rank 9: '&4声望 6 &5大师' + Prestige 6 rank 9 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅩ' + Prestige 6 rank 10 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩ' + Prestige 6 rank 10: '&4声望 6 &5英雄' + Prestige 6 rank 11: '&4声望 6 &5传说' + Prestige 6 rank 11 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠ' + Prestige 6 rank 12: '&4声望 6 &5神话' + Prestige 6 rank 12 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠ' + Prestige 6 rank 13: '&4声望 6 &5不朽' + Prestige 6 rank 13 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 6 rank 14: '&4声望 6 &5天选之人' + Prestige 6 rank 14 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅤ' + Prestige 6 rank 15: '&4声望 6 &5支配者' + Prestige 6 rank 15 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤ' + Prestige 6 rank 16: '&4声望 6 &5征服者' + Prestige 6 rank 16 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤⅠ' + Prestige 7 rank 0: '&c声望 7 &8凡人' + Prestige 7 rank 0 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&e0' + Prestige 7 rank 1: '&c声望 7 &f新手' + Prestige 7 rank 1 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠ' + Prestige 7 rank 2: '&c声望 7 &f初学者' + Prestige 7 rank 2 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅠ' + Prestige 7 rank 3: '&c声望 7 &f学徒' + Prestige 7 rank 3 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 7 rank 4: '&c声望 7 &2冒险家' + Prestige 7 rank 4 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅤ' + Prestige 7 rank 5: '&c声望 7 &2熟练的冒险家' + Prestige 7 rank 5 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤ' + Prestige 7 rank 6: '&c声望 7 &2专业冒险家' + Prestige 7 rank 6 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠ' + Prestige 7 rank 7: '&c声望 7 &1老冒险家' + Prestige 7 rank 7 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 7 rank 8: '&c声望 7 &1精英' + Prestige 7 rank 8 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 7 rank 9: '&c声望 7 &5大师' + Prestige 7 rank 9 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅩ' + Prestige 7 rank 10 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩ' + Prestige 7 rank 10: '&c声望 7 &5英雄' + Prestige 7 rank 11: '&c声望 7 &5传说' + Prestige 7 rank 11 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠ' + Prestige 7 rank 12: '&c声望 7 &5神话' + Prestige 7 rank 12 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 7 rank 13: '&c声望 7 &5不朽' + Prestige 7 rank 13 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 7 rank 14: '&c声望 7 &5天选之人' + Prestige 7 rank 14 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅤ' + Prestige 7 rank 15: '&c声望 7 &5支配者' + Prestige 7 rank 15 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤ' + Prestige 7 rank 16: '&c声望 7 &5征服者' + Prestige 7 rank 16 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤⅠ' + Prestige 7 rank 17: '&c声望 7 &5半神' + Prestige 7 rank 17 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤⅠⅠ' + Prestige 8 rank 0: '&9声望8 &8凡人' + Prestige 8 rank 0 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&e0' + Prestige 8 rank 1: '&9声望8 &f新手' + Prestige 8 rank 1 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠ' + Prestige 8 rank 2: '&9声望8 &f初学者' + Prestige 8 rank 2 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅠ' + Prestige 8 rank 3: '&9声望8 &f学徒' + Prestige 8 rank 3 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 8 rank 4: '&9声望8 &2冒险家' + Prestige 8 rank 4 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅤ' + Prestige 8 rank 5: '&9声望8 &2熟练的冒险家' + Prestige 8 rank 5 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤ' + Prestige 8 rank 6: '&9声望8 &2专业冒险家' + Prestige 8 rank 6 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠ' + Prestige 8 rank 7: '&9声望8 &1老冒险家' + Prestige 8 rank 7 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 8 rank 8: '&9声望8 &1精英' + Prestige 8 rank 8 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 8 rank 9: '&9声望8 &5大师' + Prestige 8 rank 9 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅩ' + Prestige 8 rank 10 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩ' + Prestige 8 rank 10: '&9声望8 &5英雄' + Prestige 8 rank 11: '&9声望8 &5传说' + Prestige 8 rank 11 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠ' + Prestige 8 rank 12: '&9声望8 &5神话' + Prestige 8 rank 12 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 8 rank 13: '&9声望8 &5不朽' + Prestige 8 rank 13 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 8 rank 14: '&9声望8 &5天选之人' + Prestige 8 rank 14 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅤ' + Prestige 8 rank 15: '&9声望8 &5支配者' + Prestige 8 rank 15 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤ' + Prestige 8 rank 16: '&9声望8 &5征服者' + Prestige 8 rank 16 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠ' + Prestige 8 rank 17: '&9声望8 &5半神' + Prestige 8 rank 17 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠⅠ' + Prestige 8 rank 18: '&9声望8 &5神' + Prestige 8 rank 18 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 9 rank 0: '&d声望9 &8凡人' + Prestige 9 rank 0 short placeholder: '&d⚜ⅠⅩ&6&l✧&e0' + Prestige 9 rank 1: '&d声望9 &f新手' + Prestige 9 rank 1 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠ' + Prestige 9 rank 2: '&d声望9 &f初学者' + Prestige 9 rank 2 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅠ' + Prestige 9 rank 3: '&d声望9 &f学徒' + Prestige 9 rank 3 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅠⅠ' + Prestige 9 rank 4: '&d声望9 &2冒险家' + Prestige 9 rank 4 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅤ' + Prestige 9 rank 5: '&d声望9 &2熟练的冒险家' + Prestige 9 rank 5 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤ' + Prestige 9 rank 6: '&d声望9 &2专业冒险家' + Prestige 9 rank 6 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠ' + Prestige 9 rank 7: '&d声望9 &1老冒险家' + Prestige 9 rank 7 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠⅠ' + Prestige 9 rank 8: '&d声望9 &1精英' + Prestige 9 rank 8 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠⅠⅠ' + Prestige 9 rank 9: '&d声望9 &5大师' + Prestige 9 rank 9 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅩ' + Prestige 9 rank 10 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩ' + Prestige 9 rank 10: '&d声望9 &5英雄' + Prestige 9 rank 11: '&d声望9 &5传说' + Prestige 9 rank 11 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠ' + Prestige 9 rank 12: '&d声望9 &5神话' + Prestige 9 rank 12 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅠ' + Prestige 9 rank 13: '&d声望9 &5不朽' + Prestige 9 rank 13 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅠⅠ' + Prestige 9 rank 14: '&d声望9 &5天选之人' + Prestige 9 rank 14 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅤ' + Prestige 9 rank 15: '&d声望9 &5支配者' + Prestige 9 rank 15 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤ' + Prestige 9 rank 16: '&d声望9 &5征服者' + Prestige 9 rank 16 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠ' + Prestige 9 rank 17: '&d声望9 &5半神' + Prestige 9 rank 17 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠⅠ' + Prestige 9 rank 18: '&d声望9 &5神' + Prestige 9 rank 18 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 9 rank 19: '&d声望9 &5猎神者' + Prestige 9 rank 19 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅩ' + Prestige 10 rank 0: '&5声望10 &8凡人' + Prestige 10 rank 0 short placeholder: '&5⚜Ⅹ&6&l✧&e0' + Prestige 10 rank 1: '&5声望10 &f新手' + Prestige 10 rank 1 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠ' + Prestige 10 rank 2: '&5声望10 &f初学者' + Prestige 10 rank 2 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠ' + Prestige 10 rank 3: '&5声望10 &f学徒' + Prestige 10 rank 3 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠⅠ' + Prestige 10 rank 4: '&5声望10 &2冒险家' + Prestige 10 rank 4 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅤ' + Prestige 10 rank 5: '&5声望10 &2熟练的冒险家' + Prestige 10 rank 5 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤ' + Prestige 10 rank 6: '&5声望10 &2专业冒险家' + Prestige 10 rank 6 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠ' + Prestige 10 rank 7: '&5声望10 &1老冒险家' + Prestige 10 rank 7 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠ' + Prestige 10 rank 8: '&5声望10 &1精英' + Prestige 10 rank 8 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠⅠ' + Prestige 10 rank 9: '&5声望10 &5大师' + Prestige 10 rank 9 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅩ' + Prestige 10 rank 10 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩ' + Prestige 10 rank 10: '&5声望10 &5英雄' + Prestige 10 rank 11: '&5声望10 &5传说' + Prestige 10 rank 11 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠ' + Prestige 10 rank 12: '&5声望10 &5神话' + Prestige 10 rank 12 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅠ' + Prestige 10 rank 13: '&5声望10 &5不朽' + Prestige 10 rank 13 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅠⅠ' + Prestige 10 rank 14: '&5声望10 &5天选之人' + Prestige 10 rank 14 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅤ' + Prestige 10 rank 15: '&5声望10 &5支配者' + Prestige 10 rank 15 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤ' + Prestige 10 rank 16: '&5声望10 &5征服者' + Prestige 10 rank 16 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠ' + Prestige 10 rank 17: '&5声望10 &5半神' + Prestige 10 rank 17 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠⅠ' + Prestige 10 rank 18: '&5声望10 &5神' + Prestige 10 rank 18 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 10 rank 19: '&5声望10 &5猎神者' + Prestige 10 rank 19 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅩ' + Prestige 10 rank 20: '&5声望10 &5弑神者' + Prestige 10 rank 20 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅩ' + lootLimiterMessage: '&7[EM] &c你必须通过 /ag 升级冒险者公会才能获得更好的战利品!' + prestigeUnlockMessageTitle: '$player' + prestigeUnlockMessageSubtitle: '&2解锁了$tier&2!' +buy_or_sell_menu: + Shop name: '[EM] 自定义物品商店' +custom_quest_screen: + headerTextLines2: | + &a&l『&c&l$questName&a&l』 + acceptTextLines: '&a&l[接受]' + acceptHoverLines: "&a点击\n&a接受任务!" + acceptedTextLines: '&2&l已接受任务!&a找$npcName &4[放弃任务]' + acceptedHoverLines: '&a点击放弃任务!' + trackTextLines: '&2&l[追踪]' + trackHoverLines: '&a点击追踪任务!' + untrackTextLines: '&4&l[取消追踪]' + untrackHoverLines: '&c点击取消追踪任务!' + completedTextLines: '&2&l[交取]' + completedHoverLines: '&a点击交取任务!' + turnedInTextLines: '&8[完成!]' + turnedInHoverLines: '&8已交取任务!' + objectivesLine: '&c&l目标:' + killQuestDefaultSummaryLine: '&c➤击杀$name:$color$current&0/$color$target' + fetchQuestDefaultSummaryLine: '&c➤获得$name:$color&$current&0/$color$target' + dialogQuestDefaultSummaryLine: '&c➤和$location的$name对话' + rewardsLine: '&2&l奖励:' + rewardsDefaultSummaryLine: '&2➤$amountx $rewardName &8($chance%)' +custom_shop_menu: + Shop name: '[EM] 自定义商店' + Full inventory message: '[精英怪物] &4你的背包满了!你塞不下这么多东西了。' +dynamic_quest_screen: + questName: 击杀$amount $name + headerTextLines2: |- + &c&l公会请求! + &0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ + defaultLoreTextLines: '&8击杀$amount $name!' + acceptTextLines: '&a&l同意!' + acceptHoverLines: "&a点击\n&a接受任务!" + acceptedTextLines: '&2&l已接受任务!&4[放弃任务]' + acceptedHoverLines: '&a点击放弃任务' + completedTextLines: '&2&l[交取]' + completedHoverLines: '&a点击交取任务' + turnedInTextLines: '&8[完成!]' + turnedInHoverLines: '&8已交取任务!' + objectivesLine: '&c&l目标:' + killQuestDefaultSummaryLine: '&c➤杀死$name:$color$current&0/$color$target' + rewardsLine: '&2&l奖励:' + rewardsDefaultSummaryLine: '&2➤$amountx $rewardName &8($chance%)' +enhancement_menu: + shopName: '[EM] 强化菜单' +get_loot_menu: + Menu name: '[EM] 战利品商店' + tierTranslation: 等级 + itemFilterTranslation: 根据我等级过滤 +guild_rank_selector_menu: + questTierSelectorMenuTitle: '[EM] 选择公会等级' + lowTierWarning: '&c精英怪物不会掉落更好的战利品!' + normalTierWarning: '&a精英怪物会掉落更好的战利品!' + notEnoughCurrencyMessages: "&7[精英怪物] &4你的精英币不足($neededAmount $currencyName)!请出售一些精英怪物装备来换取精英币[/em\n shop]!你现在拥有$currentAmount $currencyName。" + unlockMessages: "&7[精英怪物] &a你$price $currencyName解锁了$rankName&a级公会用。\n&6狩猎愉快!" + questCompleteBroadcastMessages: '&7[精英怪物] &a$player&a达到了$rankName &a公会等级!' + failedMessages: '&7[精英怪物] &c你需要先解锁其它公会等级!' + spawnRateModifierMessages: '&f精英怪物生成率倍数:&c$modifier%' + lootModifierMessages: '&f精英怪物战利品倍数:&a$modifier%' + difficultyModifierMessages: '&f精英怪物难度倍数:&c$modifier%' + lootTierMessages: '&2精英怪物最高可掉落$tier级的战利品!' + currencyBonusMessages: '&a增加$amount%杀怪和任务获得的精英币!' + healthBonusMessages: '&c增加$amount❤血量上限' + critBonusMessages: '&e增加$amount%的暴击率' + dodgeBonusMessages: '&8增加$amount%的闪避率' +player_status_screen: + indexTexts0: '当每当每当每当每当每当时的距离为每当时距离为每当量时,则每当每当量为每当量为每当量时,每当量为每当量为每当量为每当量时,每当量为每当量为每当量时,每当量为每当量为每当量时,每当量为每当量为每当量为每当量时,每当量为每当量为每当量为每当量时,每当量为每当量时,每当量为每当量为每当量时,每当量为每当量是否为每当量是否为每当量时,每当量为每当量是否为每当量时每当量是否为每当量是否为每当量时的每当量是否为每当量是否为每当量。' + indexTexts1: '&5&l/ag &7- &6精英怪物大厅' + indexHovers1: |- + 点击使用 + 你可以在这里找到 + 可接受任务、购买 + 和出售物品的NPC! + indexTexts2: '当每当每当每当每当每当时的距离为每当时距离为每当量时,则每当每当量为每当量为每当量时,每当量为每当量为每当量为每当量时,每当量为每当量为每当量时,每当量为每当量为每当量时,每当量为每当量为每当量为每当量时,每当量为每当量为每当量为每当量时,每当量为每当量时,每当量为每当量为每当量时,每当量为每当量是否为每当量是否为每当量时,每当量为每当量是否为每当量时每当量是否为每当量是否为每当量时的每当量是否为每当量是否为每当量。' + indexTexts4: '&6&l索引' + indexTexts6: '&bp. $statsPage &8- &6数据' + indexHovers6: 点击前往 + indexTexts7: '&bp. $gearPage &8- &6装备' + indexHovers7: 点击前往 + indexTexts8: '&bp. $teleportsPage &8- &6传送' + indexHovers8: 点击前往 + indexTexts9: '&bp. $commandsPage &8- &6指令' + indexHovers9: 点击前往 + indexTexts10: '&bp. $questsPage &8- &6任务追踪' + indexHovers10: 点击前往 + indexTexts11: '&bp. $bossTrackingPage &8- &6Boss追踪' + indexHovers11: 点击前往 + statsText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + statsText1: '&5&l玩家数据:' + statsText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + statsText4: '&2金钱:&a$money' + statsHover4: |- + 击杀精英怪物 + 输入/em shop出售精英怪物掉落装备 + 或完成/em quest的任务可获得精英币 + statsText6: '&6公会等级:&3$guildtier' + statsHover6: |- + 声望等级和公会等级: + 公会等级决定你可获得的战利品品质 声望等级可以给予你额外奖励, + 比如血量上限、闪避率和暴击率,增加精英币掉落等 + 你可以输入/ag提升你的声望和公会等级 + ⚜ = 声望等级, ✧ = 公会等级 + statsText7: '&4杀死精英怪物数:&c$kills' + statsHover7: 你杀死的精英怪物数 + statsText8: '&4你所击杀的最高级精英怪物:&c$highestkill' + statsHover8: |- + 你所杀死的精英怪物的最高等级 + 精英怪物等级基于你的装备品质 + 装备品质越高 + 精英怪物的等级也越高 + 提醒:只有正常击杀的怪物才算 + statsText9: '&4精英怪物死亡数:&c$deaths' + statsHover9: 你杀死了多少只精英怪物 + statsText10: '&5任务完成数:&d$quests' + statsHover10: |- + 完成的精英怪物任务数 + 你可以输入/em quest接受任务 + statsText12: '&b得分:&3$score' + statsHover12: |- + 你的EliteMobs得分 + 得分根据 + 你击杀精英怪物数 + 和死亡数判定 + 杀死高级的精英怪得分更高 + gearText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + gearText1: '&7&l盔甲与武器:' + gearText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + gearText3: '&8&l装备等级:' + gearText4: ' ☠ - $helmettier' + gearHover4: '$helmet' + gearText5: ' ▼ - $chestplatetier' + gearHover5: '$chestplate' + gearText6: ' Π - $leggingstier' + gearHover6: '$leggings' + gearText7: ' ╯╰ - $bootstier' + gearHover7: '$boots' + gearText8: '{⚔ - $mainhandtier} {⛨ - $offhandtier}' + gearHover8: '{$mainhand}{$offhand}' + gearText10: '{攻击力:$damage} {护甲值:$armor}' + gearHover10: '{对精英怪物造成的基础伤害}{减少精英怪物对你造成的伤害}' + gearText11: '威胁度:$threat' + gearHover11: | + 这会决定 + 生成在你附近的精英怪物等级 + 威胁度根据你的 + 盔甲、武器和公会等级而定 + teleportText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + teleportText1: '&2&l传送' + teleportText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + teleportText3: 重生点 + teleportHover3: 传送到重生点 + teleportText4: '&6&l冒险者大厅' + teleportHover4: 传送到冒险者公会大厅 + onTeleportsHover: 点击传送 + commandsText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + commandsText1: '&3&l指令:' + commandsText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + commandsText4: '&5/ag' + commandsHover4: |- + 点击使用 + 你可以在这里找到 + 可接受任务、 + 购买和出售物品的NPC + commandsText6: '&5/shareitem' + commandsHover6: |- + 点击使用 + 在聊天框处 + 展示你手中的物品 + questTrackerText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + questTrackerText1: '&6&l任务:' + questTrackerHover1: 输入 /em quest 接受任务 + questTrackerText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + onQuestTrackHover: 点击放弃 + bossTrackerText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + bossTrackerText1: '&4&lBoss追踪器' + bossTrackerHover1: 这里会显示Boss位置 + bossTrackerText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + onBossTrackHover: 点击追踪/取消追踪 + teleportChestMenuName: '&2精英怪物传送' + bossTrackerChestMenuName: '&2精英怪物Boss追踪' + indexChestMenuName: '&2精英怪物索引' + gearChestMenuName: '&2精英怪物装备' + statsChestMenuName: '&2精英怪物数据' + commandsChestMenuName: '&2精英怪物指令' +procedural_shop_menu: + Shop name: '[EM] 物品商店' + Full inventory message: '&7[精英怪物] &4你的背包满了! 你塞不下这么多东西了。' +quest_menu: + menuName: '[EM] 选择任务' + cancelQuestMessage1: '&c&l&m&o---------------------------------------------&c你一次只能接受一个任务!取消当前任务将重置任务进度!' + cancelQuestMessage2: '&2[点击这里取消当前任务!]' + cancelQuestMessage3: '&7你可以输入&a/em quest 查看任务状态 状态&c&l&m&o---------------------------------------------' + questCancelMessage: '&7[精英怪物] &c已取消任务!' + questStartTitle: 你接取了一个任务! + questStartSubtitle: 杀死$objectiveAmount个$objectiveName + questCompleteTitle: 任务完成! + questCompleteSubtitle: 你杀死了$objectiveAmount个$objectiveName + bossBarObjective: 杀死$objectiveAmount个$objectiveName + questRewardMessage: '&7[EM] &a任务完成!&6你获得了&2$reward $currencyName' + questCompleteBroadcastMessage: '&7[EM] $player&2完成了$rank&2任务!' + questStartBroadcastMessage: '&7[EM] $player&2接取了$rank&2任务!' + questStatusMessage: '&7[EM] &a你杀死了 &a$currentAmount &f/ &c$objectiveAmount 个&a$objectiveName' +refiner_menu: + shopName: '[EM] 放入10件废品' +repair_menu: + shopName: '[EM] 修复菜单' +scrapper_menu: + shopName: '[EM] 废品回收' +sell_menu: + shopName: '[EM] 收购店' +smelt_menu: + shopName: '[EM] 放入25件废品' +unbind_menu: + shopName: '[EM] 解绑菜单' +taunt: + onDamaged: + - 噢! + - 嗷! + - 停下来! + - 为什么伤害我?! + - 你打起架来像个奶农! + - 你的背后就是你的弱点! + - 防御! + - 杀啊! + - 我的血量出错了, 现在我无敌了! + - 你的攻击只会让我变得更强! + - 木棍和骨头…… + - '只是皮肉之伤罢了!''' + - 帝皇之护! + - Herobrine, 救我! + - 你后面有只苦力怕! + - 我犯了一个很严重的错误。 + - 为什么我杀了我…… + - 僵尸喜欢伤痕 + - 是时候展现我真正的力量了! + - 准备接下我的最终一击! + - 我的援军到达了! + - 你将为此付出代价! + - 你身上的战痕又将多出一条! + - 以眼还眼! + - 我买了人寿保险 + - 我感觉伤之入骨 + - '只是个划痕''' + - 那是什么? 和风? + - 你永远也打不败我 + - 可怜。 + - 太弱了。 + - 你根本无法击穿我的盔甲! + - 你个弱鸡! + - 我的孙子才会感觉得到你那无力的一击 + - 你是在尝试杀死我吗? + - OP把我的血加满了 + - 我受伤了?不可能! + - 我受伤了? 你肯定开挂了! + - 我才不会被打败! + - 我要开挂了! + - 小心! Herobrine在你身后! + - 为了艾尔! + - 小心你的菊花! + - 为什么我们不能成为朋友? + - 瓦尔哈拉! + - Notch救我! + - 没有退路了! + - 用你的全力和我一战! + onDamagedByBow: + - 把我当作玩家来对战! + - 害怕靠近我? + - 我能感觉得到你的恐惧! + - 你难道忘了怎么挥剑吗? + - 懦夫! 用弓不公平! + - 弓?那是 2011年的破玩意…… + - 弓是为了弱者而存在的东西! + - 弓为意志薄弱者而装准备! + - 弓是为内心脆弱的人而准备的! + - 我认为我们不应该用弓来决斗! + - 用弓? 你会后悔的 + - 噢! + - 停下! + - 为什么?! + - 你打得就像个奶农! + - 你的背后就是你的弱点! + - 防御! + - 你这是作弊! + - 我的血量出错了,我现在无敌了! + - 你的攻击只会让我变得更强! + - 木棍和骨头…… + - 只是皮肉之伤罢了!' + - '保护国王!' + - Herobrine, 救我! + - 在你身后!苦力怕! + - 我犯了一个很严重的错误。 + - 为什么我杀了我…… + - 僵尸喜欢伤痕 + - 是时候展现我真正的力量了! + - 准备接下我的最终一击! + - 我的援军到达了! + - 你将为此付出代价! + - 你身上的战痕又将多出一条! + - 以眼还眼! + - 我买了人寿保险! + - 我感觉伤之入骨 + - 不过是个划痕罢了 + - '那是什么? 和风?' + - 你永远也打不败我 + - 可怜。 + - 太弱了。 + - 你根本无法击穿我的盔甲! + - 你个弱鸡! + - 我的孙子才会感觉得到你那无力的一击 + - 你是在尝试杀死我吗? + - OP把我的血加满了! + - 你个GB! + - 我受伤了? 你肯定开挂了! + - 我才不会被打败! + - 我要开挂了! + - 小心! Herobrine在你身后! + - 为了艾尔! + - 小心你的菊花! + - 为什么我们不能成为朋友? + - 瓦尔哈拉! + - Notch救我! + - 没有退路了! + - 用你的全力和我一战! + - 用你的全力和我一战! + onDamage: + - 强力的一击! + - 射门,进球! + - 明早你将感受到痛楚! + - 胜利终将到来! + - 胜利将属于我! + - 这只用了我一半的力量! + - 你来到了你该来的地方! + - 你遇到了你不改遇到的怪物! + - 准备好被包围吧! + - 这将是你最后一次的失误了! + - 燃烧吧! + - John Cena! + - 你怎么还没倒下? + - 你还是放弃吧! + - 放弃吧! + - 我占领高地了! + - 我将终极你的生命! + - 希望你能忍受这痛楚! + - 准备好感受痛楚吧! + - 为血之王座献上鲜血! + - 为骷髅王座献上头骨! + - 你已经死了! + - 你还不够强大! + - 赞美太阳! + - 末日降至! + - 你没有准备好。 + - 是是是,你说的对! + - 浪费我的时间! + - 对我来说这是一个挑战吗? + - '提示:不要被击中' + - 动感光波 bwooooooooo + - 为了国王! + - Herobrine将会很开心! + - 这将是你的生命的终点! + - 你仍然在尝试杀死我吗? + - 太弱了! + - 可怜。 + - 这可以让你清醒过来。 + - 才刚刚开始呢! + - 我们才刚刚开始呢! + - 这只是热身运动! + - 你配不上与我一战! + - RKO!出局! + - 我可以整晚都这么做! + - 很好的沙包! + - 我就是黑夜! + - 我要打哪呢? + - 为史蒂夫报仇! 你个怪物! + - 加入怪物阵营吧! + - 太简单了,太简单了! + - 太简单了! + - 你无法打败我! + - 皮卡丘丘丘丘丘~ + - 阿瓦达索命! + - 钻心剜骨! + - 暴击! + - 这就是我的技能! + - 9001点伤害! + - 你还活着? + - 面对你的失败把! + - 感受疼痛的滋味吧! + - 我将置你于死地! + - 受死吧! + onDeath: + - 只剩下缄默…… + - 我会回来的 + - 无法原谅 + - 我死了,我将再次重生! + - 面对我! + - 我将前往瓦尔哈拉殿堂! + - 瓦尔哈拉殿堂! + - 瓦尔哈拉殿堂! 解脱! + - 这次是你赢了 + - 你的土地即将枯竭! + - 皮肉之伤,不足挂齿! + - 你会加入我们的! + - 还没有结束呢 + - 死亡不过是一个挫折罢了 + - 结局不该是这样…… + - 我将前往宇宙 + - 我们原可以成为朋友的…… + - 你感到了罪恶爬上了你的脊背 + - 稍后见 + - 一会儿见 + - 我将等待着你 + - 我将会复仇! + - 我才不会在长夜中长眠 + - 我们是不是该先买保险…… + - 这是我生命中的最后一天了 + - 布鲁特,你也有份? + - 安息吧 + - x。x + - (x。x) + - xox + - 贫弱 + - 玩得不错 + - GG + - 打得不错 + - 你一定开挂了 + - 你开挂 + - 不公平!我卡了 + - 这次是你赢了 + - 你这个怪物…… + - 平庸…… + - 这次是你赢了 + - 你个怪物…… + - 平庸…… + onTarget: + - 哦!到这儿来! + - 我看到了什么?一个懦夫? + - 先生,准备好决一死战吧! + - 让我们像野蛮人一样解决问题吧! + - 预备! + - 小心! 你背后有只苦力怕! + - 你看起来很美味。 + - 准备好应付麻烦吧! + - 让最好的垃圾邮件发送者得到胜利吧! + - 斯巴达达达达达达达达!!! + - 我实际上是9001级 + - 我不是精英怪 + - 我只是伪装成了精英怪 + - 啊,新鲜的食物! + - 我才是猎人,而你是猎物! + - 你杀死我会崩服的! + - 我是玩家! + - 我身上没有可以给你的装备! + - 为什么我们不能成为朋友? + - Sssssss + - 这是我的最后一击了! + - 停下,你这个罪犯! + - 准备去死吧! + - 赞美太阳! + - 你太弱了 + - 没有退路了! + - 别说废话了,决斗吧! + - 为骷髅王座献上头骨! + - 为血之王座献上鲜血! + - 为了Herobrine! + - 我将刺穿天堂! + - 你以为我是谁!? + - 太弱了! + - 弱者! + - 艾克西欧! + - 决一死战吧! + - 我要和你决一死战! + - 皮卡皮卡! + - 你是不是把我视为地狱? + - 你刚才叫我生命? + - 我知道你这个怪物做了什么! + - 这将是你的生命之终结! + - 准备面对麻烦吧! + - 我早有准备! + - 我已经准备好了。 + - 可敬的对手! + - 势均力敌的对手! + - 一个萌新,我真是太走运了! + - 交出你的财产,或是你的生命! + - 抢劫! + - 是你这只怪物! + - 我渴望你的鲜血! + - 他在这儿! + - 这一定是我的幻觉 + - 你好,我是梅塞克斯先生! + - 我是梅塞克斯先生, 看着我! + - 献出你的钻石,或是你的狗命! + - 为了国王,为了国家! + - 用尽你的全力来打我被! + - 面对我! + - 见证我的鲜血! + - 我如星之闪耀! + - 我如星之闪耀! +zombie_friends: + friend1Name: '永远的挚友 #1' + friend2Name: '永远的挚友 #2' + friendDeathMessage: + - 不! + - 你终究只是个凡人! + - 撒迦利亚! + - 不得不承认,现在是你比较强! + - 复仇业火已在我心中燃烧! + - 我会报仇的! + - 难以置信。 + originalEntityDialog: + - 让我们玩ZombieCraft吧! + - 感受友谊的威力吧! + - 团结起来! + - 我要叫朋友来并肩作战! + - 无中生友! + - 我为人人,人人为我! + - 抓住他! + - 不和你玩了,我要回家了! + reinforcementDialog: + - 不要破坏我们的友谊! + - 扎克,我们会掩护你! + - 增援已至! + - 勠力同心,其利断金! + - 这太简单了! + - 放弃吧,我们已经占领了高地! + - 你想逃跑? + - 世界之星! + - 你想要对我们的朋友干什么? + - 感受友谊的威力吧! + - 友谊能量100%! + - 集合,僵尸们! + - 朋友,你有我掩护! + - 团结就是力量! + - 人越多越好! + - 家人,让我来掩护你! + - 万众一心,无坚不摧! +zombie_necronomicon: + summoningChant: 人类既非这地上最古老的主人,也非这地上最后一任主人。寻常的活物与物质亦非独行于世。 旧日支配者昔在,旧日支配者今在,旧日支配者亦将永在。不在吾等所知之空间,而在诸空间之间。 彼等平静行过,彼等于初源行过,彼等位于空间之外,而吾等不能见其踪影。 犹格·索托斯知道大门所在。犹格·索托斯即是门,犹格·索托斯即是门之匙,即是看门者。 过去在他,现在在他,未来皆在他。他知晓旧日支配者曾于何处闯入;亦知晓旧日支配者将于何处再次闯入。 他知晓彼等曾踏过地上的哪些土地,也知道彼等仍踏在哪些土地上,亦知道当彼等行过时为何无人得见彼等。 借由彼等气味,世人偶尔可知彼等近了,但无人可知晓彼等容貌,然世人可从彼等的人类子嗣身上窥见彼等的容貌;彼等子嗣亦有各样的相貌,有世人最真切的幻想,亦有如彼等一般无形无实之形体。 若在适当的时节于荒凉土地上说出某些词句,呼嚎过某些仪式,则彼等将行过并腐坏那些土地,而无人得见彼等。风会喋喋转述彼等声音,地会喃喃转述彼等意识。 彼等令森林屈服,城市粉碎,然没有森林与城市可见彼等之手。冰冷荒原之上,卡达斯知晓彼等,而谁人知晓卡达斯呢? 南方的冰雪荒漠与沉没大洋的小岛上承载着刻有彼等印记的石头,而谁人得以眼见那些封冻的城市,那些有海草藤壶的密封高塔呢? 伟大的克苏鲁亦是彼等兄弟,然其亦只可模糊感知彼等所在。呀!莎布·尼古拉丝!透过那污秽,汝可知晓彼等。 彼等之手已在汝之咽喉,而汝仍不见彼等;彼等居所在汝之门槛。犹格·索托斯即是门之匙,诸空间皆汇聚在此。 世人统治着彼等曾统治之世界;彼等亦将会统治世人所统治之世界。春夏过后就是秋冬,秋冬过后亦是春夏。 彼等耐心等候,因为彼等终将再度统治此地。 +zombie_parents: + deathMessage: + - 你个怪物! + - 我的孩子! + - 你做了什么!? + - 我会报仇的! + - 不!!! + - 你会为这付出代价! + - 嗯……他被收养了…… + - 他死了!又一次! + - 他比以前死的更彻底了…… + - 你杀了他! + bossEntityDialog: + - 你这是在难为我! + - 他在欺负我! + - 他在打我! + - 我能独自解决这件事! + - 别管我,我会搞定他的。 + - 别在我周围! + - 这太尴尬了。 + - 他拿走了我的午餐钱! + - 他欺负我! + zombieDad: + - 从我的儿子身边离开! + - 儿子,证明你自己! + - 我将会解决他。 + - 不要捉弄我的儿子。 + - 你为什么要这么做? + - 我会告诉你的父母! + - 孩子,上。 + - 告诉他谁才是熊孩子之王! + - 漂亮的一拳,孩子! + zombieMom: + - 放开我的孩子! + - 亲爱的,你受伤了吗? + - 哦亲爱的,你没受伤吧? + - 让我看看这个,亲爱的。 + - 我会和他的父母谈话的。 + - 亲爱的,你忘了穿上你的夹克! + - 摆个姿势,亲爱的。 + - 干碎他! + - 给我停下! + - 你把垃圾倒出去了吗? +elite_blaze: + name: '&f&2$level级&f精英&e烈焰人' + deathMessages: + - '$player被$entity的烈火燃成灰烬!' +elite_cave_spider: + name: '&f&2$level级&f精英&3洞穴蜘蛛' + deathMessages: + - '$player被困在了$entity的天罗地网中!' +elite_creeper: + name: '&2$level级&f精英&2苦力怕' + deathMessages: + - '$player被$entity炸飞了!' + - '$player&c:Creeper?Aw man?' +elite_drowned: + name: '&2$level级&f精英&3溺尸' + deathMessages: + - '$player被$entity扯入了万丈深渊!' + - '$player和$entity一同被水淹没!' +elite_elder_guardian: + name: '&2$level级&f精英&3远古守卫者' + deathMessages: + - '$entity&c阻止了$player&c探索深海!' +elite_guardian: + name: '&2$level级&f精英&3守卫者' + deathMessages: + - '$entity&c阻止了$player&c探索深海!' +elite_enderman: + name: '&2$level级&f精英&5末影人' + deathMessages: + - '$entity把$player送入了虚空!' + - '$player敢于直视$entity!' + - '$player&c和$entity&c成为了最好的朋友!' +elitemob_endermite: + name: '&2$level级&f精英&7末影螨' + deathMessages: + - '$entity&c之于$player&c就像是大卫之于歌利亚!' +elite_evoker: + name: '&2$level级&f精英&5唤魔者' + deathMessages: + - '$player&c被$entity&c杀死了!' +elite_husk: + name: '&2$level级&f精英&7尸壳' + deathMessages: + - '$player的身体被$entity掏空!' +elite_illusioner: + name: '&2$level级&f精英&8幻术师' + deathMessages: + - '$player&c被$entity的幻象&c迷惑了!' +elite_iron_golem: + name: '&2$level级&f精英&f铁傀儡' + deathMessages: + - '$player碰上了硬茬$entity!' + - '$player被$entity一拳拍飞了!' +elite_phantom: + name: '&2$level级&f精英&9幻翼' + deathMessages: + - '$player做了关于$entity的噩梦!' + - '$player被$entity吓死了!' + - '$entity告诉了$player睡觉的重要性!' +elite_pillager: + name: '&2$level级&f精英&8掠夺者' + deathMessages: + - '$entity&c掠夺了$player&c!' + - '$entity&c劫掠了$player&c!' +elite_polar_bear: + name: '&2$level级&f精英&f北极熊' + deathMessages: + - '$player被$entity一爪拍死了!' + - '$player被$entity撕成碎片!' +elite_ravager: + name: '&2$level级&f精英&6劫掠兽' + deathMessages: + - '$entity&c向$player&c展示了什么才是真正的力量!' +elite_silverfish: + name: '&fLvl &2$level级&f精英&7蠹虫' + deathMessages: + - '$player &cmistook $entity &cfor a stone block!' +elite_skeleton: + name: '&2$level级&f精英&f骷髅' + deathMessages: + - '$entity使$player如坐针毡' + - '$entity&c想看看$player的&c骨头!' +elite_spider: + name: '&2$level级&f精英&7蜘蛛' + deathMessages: + - '$player被$entity困在了蜘蛛网中无法动弹!' + - '$entity吞下了$player!' +elite_stray: + name: '&2$level级&f精英&b流浪者' + deathMessages: + - '$player被$entity引入歧途!' +elite_vex: + name: '&2$level级&f精英&b恼鬼' + deathMessages: + - '$player惹恼了$entity!' +elite_vindicator: + name: '&2$level级&f精英&7卫道士' + deathMessages: + - '$entity教会了$player如何战斗!' +elite_witch: + name: '&2$level级&f精英&5女巫' + deathMessages: + - '$player成为了$entity的实验对象!' + - '$player被$entity的魔法杀死了!' +elite_wither_skeleton: + name: '&2$level级&f精英&8凋灵骷髅' + deathMessages: + - '$entity使$player凋零了!' + - '$entity杀死了$player!' +elite_zombie: + name: '&2$level级&f精英&2僵尸' + deathMessages: + - '$player被$entity咬死了!' + - '$entity吃掉了$player的脑子!' +elite_ghast: + name: '&2$level级&f精英&f恶魂' + deathMessages: + - '$player&c没能躲过$entity&c&c的火球' + - '$player&c被$entity&c炸成了灰!' + - '$entity&c杀死了$player!' +elite_wolf: + name: '&2$level级&f精英&b狼' + deathMessages: + - '$entity撕碎了$player!' + - '$player被$entity撕成了碎片!' +elite_ender_dragon: + name: '&2$level级&f精英&3&5末影龙' + deathMessages: + - '$entity&c终结了$player!' +elite_shulker: + name: '&2$level&f级精英&5潜影贝' + deathMessages: + - '$entity&cs把$player&c带到了新的高度!' +super_chicken: + name: '&2超级融合鸡' +super_cow: + name: '&2超级融合牛' +super_mushroom_cow: + name: '&2超级融合哞菇' +super_pig: + name: '&d超级融合猪' +super_sheep: + name: 超级融合羊 +elite_killer_bunny: + name: '&2$level级&f精英&3&c杀手兔' + deathMessages: + - '$entity&c杀死了$player&c!' + - '$player,$entity&c可不吃胡萝卜!' +elite_llama: + name: '&2$level级&f精英&5羊驼' + deathMessages: + - '$player &c被$entity&c吐了一脸口水!' + - '$player &c惹怒了$entity&c!' +elite_warden: + name: '&2$level&f级精英&3监守者' + deathMessages: + - '$entity&c感知到了$player&c!' +elite_goat: + name: '&2$level级&f精英&5山羊' + deathMessages: + - '$player &c被$entity&c撞死了!' + - '$player &c被$entity&c创死了!' + - '$player &c被$entity&c踩死了!' + - '$player &c被$entity&c顶死了!' +elite_zombified_piglin: + name: '&2$level级&f精英&6僵尸猪灵' + deathMessages: + - '$player&c被$entity&c杀死了!' + - '$entity&c把$player烤成了肉!' +elite_zoglin: + name: '&2$level级&f精英&d僵尸疣猪兽' + deathMessages: + - '$player&c被$entity&c顶飞了!' + - '$entity&c发现$player身上带着猪肉!' +elite_piglin: + name: '&2$level级&f精英&e猪灵' + deathMessages: + - '$entity&c将$player的遗体卖出了个好价格!' + - '$entity&c让$player&c懂得了金子的价值!' +elite_hoglin: + name: '&2$level级&f精英&d疣猪兽' + deathMessages: + - '$player&c被$entity&c顶飞了!' + - '$entity&c发现$player身上带着猪肉!' +elite_piglin_brute: + name: '&2$level级&f精英&e猪灵蛮兵' + deathMessages: + - '$entity&c残忍地杀害了$player!' + - '$entity&c将$player碎尸万段!' +elite_bee: + name: '&2$level级&f精英&e蜜蜂' + deathMessages: + - '$player&c被$entity蛰死了!' +MobCombatSettings: + bossLocationMessage: '&7[EM] &2[点击追踪]' + bossKillParticipationMessage: '&e你造成的伤害:&2$playerDamage' + defaultOtherWorldBossLocationMessage: '$name:在不同的世界!' + weakText: '&9&l弱点!' + resistText: '&c&l抵抗!' + fullHealMessage: '&2完全治疗!' +check_tier: + message1: '&7[EM] 你的战斗等级为$tier' + message2: '&7[EM] 你的公会等级奖励为$tier' + message3: '&7[EM] &a你的威胁度为$tier' +check_tier_others: + message1: '&7[EM] $player的战斗等级为$tier' + message2: '&7[EM] $player的公会等级奖励为$tier' + message3: '&7[EM] &a$player的威胁度为$tier' +ScrapItemSettings: + scrapItemName: '&2$level级废品' + scrapItemLore: + - '&a收集25件同级废品' + - '&a以获得物品升级球' + - '&a你也可以用废品来修复物品' + - '&a或合成更高级的废品' + - '&2请前往冒险者公会大厅合成' + upgradeItemName: '&2$level级升级球' + upgradeItemLore: + - '&a在强化NPC处升级物品' + - '&a最高级为$orbLevel' +Quests: + questJoinMessage: '&a你接受了任务$questName &a!' + questLeaveMessage: '&c你放弃了任务$questName &c!' + questCompleteMessage: '&2你完成了任务$questName &2!' + leaveWhenNoActiveQuestsExist: '&c你没有任何任务!' + questLeaveConfirmationMessage: '&c你确认要放弃当前任务? 输入&a/em confirm &c确认!' + questStartTitle: '&a接受任务!' + questCompleteTitle: '&2任务完成!' + questLeaveTitle: '&c放弃任务!' + killQuestChatProgressionMessage: '&8[精英怪物]&c➤击杀$name:$color$current&0/$color$target' + fetchQuestChatProgressionMessage: '&8[精英怪物]&c➤获得$name:$color$current&0/$color$target' + dialogQuestChatProgressionMessage: '&8[精英怪物]&c➤对话$name:$color$current&0/$color$target' + questCapMessage: '&8[精英怪物] &c已达到任务上限 (10)!&4放弃或完成至少一个任务以获取更多任务!' + killQuestScoreboardProgressionMessage: '&c➤击杀$name:$color$current&0/$color$target' + fetchQuestScoreboardProgressionMessage: '&c➤获得$name:$color$current&0/$color$target' + dialogQuestScoreboardProgressionMessage: '&c➤对话$name:$color$current&0/$color$target' + chatTrackMessage: '&8[精英怪物]&2 点击这里追踪任务!' + chatTrackHover: '&2点击追踪!' + chatTrackingMessage: '&8[精英怪物]&9 你正在追踪任务!' + chatTrackingHover: '&2点击追踪/取消追踪!使用/em -> 任务追踪不同的任务!' + noQuestDestinationFound: '[EM] 找不到任务目的地!' + questDestinationInOtherWorld: '[EM] 前往$world世界!' + questAlreadyCompletedMessage: '&8[精英怪物] &c你已完成该任务!' + questPrerequisitesMissingMessage: '&8[精英怪物] &c无法接受该任务!' + lowRankDynamicQuestWarning: '&8[精英怪物] &c你的公会等级太低不足以接取任务!请提升你的公会等级' + questTurnInObjective: '&a2与 $npcName 对话' +Wormholes: + dungeonNotInstalledMessage: '&8[精英怪物] &c未安装$dungeonID &c地牢! 无法进行传送。' + defaultPortalMissingMessage: '&8[精英怪物] &c传送无效!' +Arenas: + notEnoughPlayersMessage: '&8[精英怪物] &c你至少要有$amount才能开始!' + startingMessage: '&2正在开始!' + startingSubtitle: '&2$count..。' + arenaFullMessage: '&4[精英怪物] &c竞技场已满!但你可以旁观!' + arenasOngoingMessage: '&4[精英怪物] &c游戏正在进行,现在无法加入竞技场,但你可以旁观。' + arenaStartHintMessage: '&2[精英怪物] &a你可以输入&2/em start开始竞技场' + arenaQuitHintMessage: '&4[精英怪物] &c你可以输入&4/em quit离开竞技场' + arenaJoinPlayerMessage: "&2[精英怪物] &a至少有&2$count名玩家后 &a你可以输入&2/em start开始竞技场\\ ! \n你可以输入&c/em quit离开竞技场" + arenaJoinSpectatorMessage: '&2[精英怪物] &a你可以随时输入&2/em quit离开竞技场' + waveTitle: '&a第&2$wave&a波' + victoryTitle: '&2胜利!' + victorySubtitle: '&a完成第&2$wave&a波!' + defeatTitle: '&4失败!' + defeatSubtitle: '&c到达第&4$wave&c波!' + victoryBroadcast: '$players征服了竞技场$arenaName!' + joinPlayerTitle: '&a输入 &2/em start &a开始!' + joinPlayerSubtitle: '&c输入&4/em quit &c离开!' + joinSpectatorTitle: '&a正在旁观!' + joinSpectatorSubtitle: '&c输入&4/em quit &c离开!' +ancient_corpse_drop_axe: + name: '&e屠夫刀' + lore: + - '&a从远古尸体的' + - '&a头骨中取出……' +animated_armor_drop_axe: + name: '&8附魔斧头' + lore: + - '&8这把斧头差点' + - '&8要了你的命。' +animated_armor_drop_boots: + name: '&8附魔靴子' + lore: + - '&8你真的找到了' + - '&8这件装备。' +animated_armor_drop_chestplate: + name: '&4附魔胸甲' + lore: + - '&8你真的找到了' + - '&8这件盔甲。' +animated_armor_drop_helmet: + name: '&8附魔头盔' + lore: + - '&8你真的找到了' + - '&8这件装备。' +animated_armor_drop_leggings: + name: '&8附魔护腿' + lore: + - '&8你真的找到了' + - '&8这件装备。' +arachnid_matriarch_drop_boots: + name: '&b丝绸挺进者' + lore: + - '&b用稀有蜘蛛丝制成。' +baba_rhoga_drop_chest: + name: '&a女巫长袍' + lore: + - '&a这上面的气味' + - '&a终究会消失的。' +baba_yaga_drop_helmet: + name: '&a女巫帽' + lore: + - '&a这上面的气味' + - '&a终究会消失的。' +balloon_rider_drop_leggings: + name: '&d宽松的护腿' + lore: + - '&d非常舒适宽松的护腿。' +banshee_drop_charm: + name: '&8悲伤之形' + lore: + - '&8愿这硬化悲伤' + - '&8保护你免受悲痛。' +beast_tamer_drop_axe: + name: '&e巨斧' + lore: + - '&e沉重至极,足以将任何野兽劈成两半。' +berserker_charm: + name: '&b狂暴护符' + lore: + - '&a面对势不可挡的逆境' + - '&a你陷入了狂暴' + - '&a失去了自我..。' +bigfoot_drop_chestplate: + name: '&e毛皮盔甲' + lore: + - '&e暖和耐用。' +big_bad_wolf_drop_chestplate: + name: '&a大坏狼皮' + lore: + - '&a吓人!' +bloated_jeffrey_drop_tear: + name: '&b甜泪' + lore: + - '&b你弄哭了杰弗里……' +bone_fiend_drop_leggings: + name: '&a骨制护腿' + lore: + - '&a这双护腿上的利骨' + - '&a嘎吱作响。' +challengers_boots: + name: '&c挑战者靴子' + lore: + - '&2给予群木联盟竞技场' + - '&2挑战者的奖励!' +challengers_chestplate: + name: '&c挑战者胸甲' + lore: + - '&2给予群木联盟竞技场' + - '&2挑战者的奖励!' +challengers_helmet: + name: '&c挑战者头盔' + lore: + - '&2给予群木联盟竞技场' + - '&2挑战者的奖励!' +challengers_leggings: + name: '&c挑战者护腿' + lore: + - '&2给予群木联盟竞技场' + - '&2挑战者的奖励!' +challengers_sword: + name: '&c挑战者之剑' + lore: + - '&2给予群木联盟竞技场' + - '&2挑战者的奖励!' +chameleon_charm: + name: '&b变色龙护符' + lore: + - '&a这个多彩的护符可以' + - '&a与任何环境相适应,' + - '&a缓缓地爬行着..。' +changeling_drop_sword: + name: '&a水晶剑' + lore: + - '&a凝视它时,你会看到刀刃闪烁着微光。' +cheetah_charm: + name: '&b猎豹护符' + lore: + - '&a猎豹的速度可以达到' + - '&a120 km/h……' + - '&a而这只需要60秒就能做到。' +circus_ringmaster_drop_charm: + name: '&d马戏团领班的鞭子' + lore: + - '&d用于执行可怕的惩罚。1' +craftenmine_terror_drop_trident: + name: '&c恶魂斩裂者1' + lore: + - '&c非常适合1' + - '&c斩杀恶魂。1' +creeperpede_drop_chestplate: + name: '&d防爆背心1' + lore: + - '&d让你感觉不到1' + - '&d爆炸的存在。' +crone_drop_axe: + name: '&f女巫讨伐者' + lore: + - '&f一把好斧头,需要好猎物。' +depths_seeker: + name: '&2深渊探索者' + lore: + - '&9来自无底深渊' + - '&9取自至恶怪物' + - '&9不知这根鱼竿' + - '&9见过何等恐怖' +divine_cinder_drop_charm: + name: '&6圣火' + lore: + - '&6火焰祝福!' +dwarven_greed: + name: '&4矮人的贪婪之镐' + lore: + - '&c贪得无厌之徒' + - '&c终会唤醒' + - '&c古老的暗影' + - '&c与火焰之魂' +elephant_charm: + name: '&b巨象护符' + lore: + - '&a获得巨象之力' + - '&a代价则是' + - '&a巨象般迟钝的移速' +enders_drop_chestplate: + name: '&d末影衬衫' + lore: + - '&d舒服耐用!' +enders_drop_helmet: + name: '&d末影帽' + lore: + - '&d结实耐用。' +enders_drop_leggings: + name: '&d末影裤子' + lore: + - '&d有点长,但能用。' +ender_lapin_drop_boots: + name: '&c暗星靴子' + lore: + - '&c给予你遭遇危险时' + - '&c奔跑的勇气。' +endless_pursuer_drop_sword: + name: '&7暗木剑' + lore: + - '&7这把剑似乎' + - '&7流着献血……' +enraged_snowman_drop_sword: + name: '&9雪人的鼻子' + lore: + - '&9不知为何' + - '&9雪人的鼻子这么尖……' +xmas_and_gold: + name: '和&6黄金!' + lore: + - '&7人人都想要白银' + - '和&7黄金!' +xmas_and_goooooold: + name: '和&6更多更多更多黄金!' + lore: + - '&7人人都想要白银' + - '和&7黄金!' +xmas_cornelius_pick: + name: '科尼利厄斯之稿' + lore: + - '&3如果你把它扔到空中' + - '&3让它掉在地上,' + - '&3你可能会找到一些' + - '&3薄荷!' +xmas_lost_present: + name: '&2丢失的礼物' + lore: + - '&2上交这个获得奖励!' +xmas_peppermint: + name: '&c薄荷' + lore: + - '&f这就是我毕生所追求的东西!' +xmas_siiiiilver: + name: '&7白白白白白银' + lore: + - '&6人人都想要白银' + - '和&6黄金!' +xmas_silver: + name: '&7白银' + lore: + - '&6人人都想要白银' + - '和&6黄金!' +xmas_substitute_elf_practice: + name: '&8替身精灵练习' + lore: + - '&f这个家伙的牙齿需要修补一下' +xmas_treat: + name: '&a点心!' + lore: + - '&e美味的点心!!' +xmas_treat_v2: + name: '&a点心!' + lore: + - '&e美味的点心!!' +evil_undead_drop_sword: + name: '&e临时用剑' + lore: + - '&e这把剑只够用' + - '&e一首歌的时间。' +fallen_knight_drop_boots: + name: '&e7古代靴子' + lore: + - '&7虽然这双靴子年代有些久远' + - '&7但它仍能够提供足够的保护。' +fallen_knight_drop_chestplate: + name: '&e7古代下界胸甲' + lore: + - '&7这件盔甲相貌平平' + - '&7但很明显' + - '&7任何妄想穿透' + - '&7这厚甲的武器' + - '&7都不自量力' +fallen_knight_drop_helmet: + name: '&e古代帽子' + lore: + - '&7这顶帽子上' + - '&7留下了很多把剑劈砍的痕迹' + - '&7但无一能够将其击溃' +fallen_knight_drop_leggings: + name: '&e古代护腿' + lore: + - '&7你对那些试图击溃这件护腿的人' + - '&7深表同情' +fine_swine_drop_sword: + name: '&6优质金剑' + lore: + - '&6一把匠心独运的优质金剑。' + - '&6剑内流淌熔化黄金' + - '&6让每一击都能' + - '&6快速修复剑身' +firefly_charm: + name: '&b萤火虫护符' + lore: + - '&a照亮黑暗!' +firestarter_drop_helmet: + name: '&e灭火头盔' + lore: + - '&e能阻隔一半的热量!' +fire_conjurer_drop_shield: + name: '&e御火盾牌' + lore: + - '&e无惧烈火。' +fishy_charm: + name: '&b疑鱼护符' + lore: + - '&a这个护符' + - '&a总觉得有点不对劲……' +fox_king_cold_drop_charm: + name: '&9神奇的雪' + lore: + - '&9你感到了雪里' + - '&9散发出不可思议的能量。' +fulgora_drop_boots: + name: '&b登山靴' + lore: + - '&b探索山脉时' + - '&b非常有用。' +goblin_ballista: + name: '&8哥布林弩' + lore: + - '&8哥布林的财宝!' +goblin_boots: + name: '&8哥布林靴子' + lore: + - '&8哥布林的财宝!' +goblin_chestplate: + name: '&8哥布林胸甲' + lore: + - '&8哥布林的财宝!' +goblin_cleaver: + name: '&8哥布林剁肉斧' + lore: + - '&8哥布林的财宝!' +goblin_helmet: + name: '&8哥布林头盔' + lore: + - '&8哥布林的财宝!' +goblin_invasion_drop_chestplate: + name: '&a小号胸甲' + lore: + - '&a好紧……' +goblin_invasion_drop_leggings: + name: '&a小号护腿' + lore: + - '&a起码这护腿' + - '&a能衬托你的腿瘦。' +goblin_leggings: + name: '&8哥布林护腿' + lore: + - '&8哥布林的财宝!' +goblin_poker: + name: '&8哥布林三叉戟' + lore: + - '&8哥布林的财宝!' +goblin_shooter: + name: '&8哥布林弓' + lore: + - '&8哥布林的财宝!' +goblin_slasher: + name: '&8哥布林剑' + lore: + - '&8哥布林的财宝!' +grappling_arrow: + name: '&6抓钩箭' + lore: + - '&e对着标靶方块发射使用抓钩!' +greedy_dwarf_drop_pickaxe: + name: '&9矮人必备镐' + lore: + - '&c贪得无厌之徒' + - '&c终会唤醒' + - '&c古老的暗影' + - '&c与火焰之魂' +grunter_drop_axe: + name: '&c大奥因克' + lore: + - '&c挥动斧头能' + - '&c听见刺耳的声音。' +grunts_boots: + name: '&f士兵靴子' + lore: + - '&2给予群木联盟竞技场' + - '&2挑战者的奖励!' +grunts_chestplate: + name: '&f士兵胸甲' + lore: + - '&2给予群木联盟竞技场' + - '&2挑战者的奖励!' +grunts_helmet: + name: '&f士兵头盔' + lore: + - '&2给予群木联盟竞技场' + - '&2挑战者的奖励!' +grunts_leggings: + name: '&f士兵护腿' + lore: + - '&2给予群木联盟竞技场' + - '&2挑战者的奖励!' +grunts_sword: + name: '&f士兵之剑' + lore: + - '&2给予群木联盟竞技场' + - '&2挑战者的奖励!' +harmless_chicken_drop_boots: + name: '&a无用之靴' + lore: + - '&a至少能防爆……' +hog_rider_drop_boots: + name: '&a3.6辐射靴子' + lore: + - '&a辐射不多,无需害怕。' +horde_champion_drop_sword: + name: '&d部落灭杀者' + lore: + - '&d处理亡灵部落时' + - '&d能用上。' +horrid_duplicator_drop_arrow: + name: '&a假箭' + lore: + - '&2看起来像真的' + - '&2感觉就像是真的……' +horrid_duplicator_drop_bow: + name: '&4炽热骨弓' + lore: + - '&4这把弓由' + - '&4一根大骨头打造而成。' +invasion_alien_treat: + name: '&6怪异的点心' + lore: + - '&6好吃到飞出地球!' +invasion_cheap_plasma_boots: + name: '&2廉价等离子团靴' + lore: + - '&a发射!' + - '&c提示:&8双击Shift激活!' +invasion_low_grade_tinfoil_bolt_caster: + name: '&7低级短杖' + lore: + - '&7理我的宝贝远点!' +invasion_low_grade_tinfoil_boots: + name: '&7低级锡箔靴' + lore: + - '&7小心地板上有辐射!' +invasion_low_grade_tinfoil_chestplate: + name: '&7低级锡箔胸甲' + lore: + - '&7防止有人利用6G黑入您的心脏起搏器!' +invasion_low_grade_tinfoil_hat: + name: '&7低级锡箔头盔' + lore: + - '&7I want to believe!' +invasion_low_grade_tinfoil_leggings: + name: '&7低级锡箔护腿' + lore: + - '&7为逃离外星人而造!' +invasion_polished_plasma_boots: + name: '&2抛光等离子团靴' + lore: + - '&a发射!' + - '&c提示: &8双击Shift激活!' +invasion_quality_bolt_caster: + name: '&7优质短杖' + lore: + - '&7理我的宝贝远点!' +invasion_quality_tinfoil_boots: + name: '&7低等锡箔靴' + lore: + - '&7小心地板上有辐射!' +invasion_quality_tinfoil_chestplate: + name: '&7优质锡箔胸甲' + lore: + - '&7防止有人利用6G黑入您的心脏起搏器!' +invasion_quality_tinfoil_hat: + name: '&7优质锡箔头盔' + lore: + - '&7从我脑袋里滚出去!' +invasion_quality_tinfoil_leggings: + name: '&7优质锡箔裤子' + lore: + - '&7为逃离外星人而造!' +invictus_boots: + name: '&4不败靴子' + lore: + - '&2给予群木联盟竞技场' + - '&2冠军的奖励!' +invictus_chestplate: + name: '&4不败胸甲' + lore: + - '&2给予群木联盟竞技场' + - '&2冠军的奖励!' +invictus_helmet: + name: '&4不败头盔' + lore: + - '&2给予群木联盟竞技场' + - '&2冠军的奖励!' +invictus_leggings: + name: '&4不败护腿' + lore: + - '&2给予群木联盟竞技场' + - '&2冠军的奖励!' +invictus_pickaxe: + name: '&4不败之镐' + lore: + - '&2给予群木联盟竞技场' + - '&2冠军的奖励!' +invictus_shovel: + name: '&4不败之铲' + lore: + - '&2给予群木联盟竞技场' + - '&2冠军的奖励!' +invictus_sword: + name: '&4不败之剑' + lore: + - '&2给予群木联盟竞技场' + - '&2冠军的奖励!' +krampus_drop_boots: + name: '&1雪靴' + lore: + - '&1用真的雪制成。' +large_hopper_drop_axe: + name: '&a重斧' + lore: + - '&a十分适合斩首。' +living_shadow_drop_boots: + name: '&5暗影靴子' + lore: + - '&5减轻摔落伤害。' +lucky_charms: + name: '&b幸运护符' + lore: + - '&a这可是丰盛早餐的一部分!' + - '&c注意:只吃这个' + - '&c可不是一顿丰盛的早餐。' +magmaguys_toothpick: + name: '&4Magmaguy&c的&2牙签' + lore: + - '&a崭新出厂的牙签!' +merman_drop_trident: + name: '&1人鱼三叉戟' + lore: + - '&a人鱼的至爱武器。' +meteor_shower_scroll: + name: '&7星陨卷轴' + lore: + - '&4召唤陨星进行毁灭性打击。' + - '&4一次性消耗品。' +monster_of_the_deep_drop_trident: + name: '&3骨三叉戟' + lore: + - '&3用深海怪物的' + - '&3骨头制成。' +moon_spider_drop_sword: + name: '&f盘丝剑' + lore: + - '&f锋利丝绸' + - '&f环绕钢铁剑芯。' + - '&f现在你是' + - '&f这把剑的主人了……' +necromancer_drop_helmet: + name: '&c黑暗之兆头盔' + lore: + - '&c这个头盔' + - '&c感觉有点不对劲。' +netherite_golem_drop_helmet: + name: '&8古代头盔' + lore: + - '&8你不确定' + - '&8是该穿戴头盔' + - '&8还是送给博物馆。' +nether_escapee_drop_charm: + name: '&6火焰护符' + lore: + - '&6愿烈火勿燃尔身。' +nether_hag_drop_sword: + name: '&7迷魂之剑' + lore: + - '&7这把剑流淌着' + - '&7各种诅咒' + - '&7和附魔。' +nightwing_drop_crossbow: + name: '&a星空守望者' + lore: + - '&a时刻保持着天空的安全。' +night_crawler_drop_shield: + name: '&8暗夜护盾' + lore: + - '&8固若金汤。' +night_crawler_drop_sword: + name: '&8暗夜之刃' + lore: + - '&e面对暗夜威胁的' + - '&8唯一答复。' +novices_boots: + name: '&8菜鸟靴子' + lore: + - '&2给予群木联盟竞技场' + - '&2挑战者的奖励!' +novices_chestplate: + name: '&8菜鸟胸甲' + lore: + - '&2给予群木联盟竞技场' + - '&2挑战者的奖励!' +novices_helmet: + name: '&8菜鸟头盔' + lore: + - '&2给予群木联盟竞技场' + - '&2挑战者的奖励!' +novices_leggings: + name: '&8菜鸟护腿' + lore: + - '&2给予群木联盟竞技场' + - '&2挑战者的奖励!' +novices_sword: + name: '&8菜鸟之剑' + lore: + - '&2给予群木联盟竞技场' + - '&2挑战者的奖励!' +oasis_beacons_brigandine: + name: '&8引路者的布面甲' + lore: + - '&f坚甲利兵' + - '&f结实耐用' +oasis_chief_cultists_bow: + name: '&5邪教教主之弓' + lore: + - '&d邪教教主的' + - '&d亡灵战弓' +oasis_earthquake_boots_10: + name: '&2地震靴' + lore: + - '&a猛击地面和怪物!' + - '&c提示: &8双击Shift激活!' +oasis_earthquake_boots_20: + name: '&2地震靴' + lore: + - '&a猛击地面和怪物!' + - '&c提示: &8双击Shift激活!' +oasis_earthquake_boots_30: + name: '&2地震靴' + lore: + - '&a猛击地面和怪物!' + - '&c提示: &8双击Shift激活!' +oasis_earthquake_boots_40: + name: '&2地震靴' + lore: + - '&a猛击地面和怪物!' + - '&c提示: &8双击Shift激活!' +oasis_earthquake_boots_50: + name: '&2地震靴' + lore: + - '&a猛击地面和怪物!' + - '&c提示: &8双击Shift激活!' +oasis_earthquake_chestplate_10: + name: '&2地震胸甲' + lore: + - '&a猛击地面和怪物!' + - '&c提示: &8双击Shift激活!' +oasis_earthquake_chestplate_20: + name: '&2地震胸甲' + lore: + - '&a猛击地面和怪物!' + - '&c提示: &8双击Shift激活!' +oasis_earthquake_chestplate_30: + name: '&2地震胸甲' + lore: + - '&a猛击地面和怪物!' + - '&c提示: &8双击Shift激活!' +oasis_earthquake_chestplate_40: + name: '&2地震胸甲' + lore: + - '&a猛击地面和怪物!' + - '&c提示: &8双击Shift激活!' +oasis_earthquake_chestplate_50: + name: '&2地震胸甲' + lore: + - '&a猛击地面和怪物!' + - '&c提示: &8双击Shift激活!' +oasis_earthquake_helmet_10: + name: '&2地震头盔' + lore: + - '&a猛击地面和怪物!' + - '&c提示: &8双击Shift激活!' +oasis_earthquake_helmet_20: + name: '&2地震头盔' + lore: + - '&a猛击地面和怪物!' + - '&c提示: &8双击Shift激活!' +oasis_earthquake_helmet_30: + name: '&2地震头盔' + lore: + - '&a猛击地面和怪物!' + - '&c提示:&8双击Shift激活!' +oasis_earthquake_helmet_40: + name: '&2地震头盔' + lore: + - '&a猛击地面和怪物!' + - '&c提示:&8双击Shift激活!' +oasis_earthquake_helmet_50: + name: '&2地震头盔' + lore: + - '&a猛击地面和怪物!' + - '&c提示:&8双击Shift激活!' +oasis_earthquake_leggings_10: + name: '&2地震护腿' + lore: + - '&a猛击地面和怪物!' + - '&c提示: &8双击Shift激活!' +oasis_earthquake_leggings_20: + name: '&2地震护腿' + lore: + - '&a猛击地面和怪物!' + - '&c提示: &8双击Shift激活!' +oasis_earthquake_leggings_30: + name: '&2地震护腿' + lore: + - '&a猛击地面和怪物!' + - '&c提示: &8双击Shift激活!' +oasis_earthquake_leggings_40: + name: '&2地震护腿' + lore: + - '&a猛击地面和怪物!' + - '&c提示: &8双击Shift激活!' +oasis_earthquake_leggings_50: + name: '&2地震护腿' + lore: + - '&a猛击地面和怪物!' + - '&c提示: &8双击Shift激活!' +oasis_foundrys_flaming_hammer: + name: '&6工坊的烈焰锤' + lore: + - '&e锻造工坊所使用的锤子' +oasis_foundrys_flux: + name: '&6工坊的助焊剂' + lore: + - '&e每件锻造武器中都' + - '&e注入了助焊剂!' +oasis_mask_of_the_warlock: + name: '&4术士面罩' + lore: + - '&7内置蓝宝石晶体光学器件!' + - '&7集成的UV-C灯提供杀菌保护作用!' +oasis_monumental_lance: + name: '&3纪念长矛' + lore: + - '&b叉鱼是我的爱好。' +oasis_oracles_shroud: + name: '&3神使的护罩' + lore: + - '&1你的武器幻影!' +oasis_page_of_darkness_I: + name: '&0黑暗书页 I' + lore: + - '&829 北' + - '&811 西' + - '&816 北' + - '&86 东' +oasis_page_of_darkness_II: + name: '&0黑暗书页 II' + lore: + - '&87 南' + - '&86 东' + - '&833 北' + - '&812 西' +oasis_page_of_darkness_III: + name: '&0黑暗书页 III' + lore: + - '&86 北' + - '&83 西' + - '&830 北' + - '&89 东' +oasis_page_of_darkness_index: + name: '&0黑暗书页索引' + lore: + - '&8在黑暗中请小心' + - '&8它们知道你来了' + - '&8小心前方道路' + - '&8火球陷阱遍布' +oasis_page_of_darkness_IV: + name: '&0黑暗书页 IV' + lore: + - '&824 南' + - '&89 东' + - '&836 北' + - '&83 西' +oasis_page_of_darkness_V: + name: '&0黑暗书页 V' + lore: + - '&89 北' + - '&812 东' + - '&86 南' + - '&86 东' +oasis_page_of_darkness_VI: + name: '&0黑暗书页 VI' + lore: + - '&86 南' + - '&86 东' + - '&812 北' + - '&83 东' +oasis_page_of_darkness_VII: + name: '&0黑暗书页 VII' + lore: + - '&83 北' + - '&86 东' + - '&88 南' +oasis_page_of_darkness_VIII: + name: '&0黑暗书页 VIII' + lore: + - '&8阴影里射出一道光芒' + - '&8历战的长袍显得灰暗' + - '&8冰与雪,火与热' + - '&8斧虽折,剑已败' +oasis_page_of_libraris_I: + name: '&7图书馆书页 I' + lore: + - '&f在没有倒影' + - '&f的书架之下' + - '&f潜藏着指引' + - '&f方向的秘密' +oasis_page_of_libraris_II: + name: '&7图书馆书页 II' + lore: + - '&f书架的倒影' + - '&f有更多知识' + - '&f有4个书架上方' + - '&f装了更多的书!' +oasis_page_of_libraris_III: + name: '&7图书馆书页 III' + lore: + - '&f西边书架' + - '&f是最好的' + - '&f蕴含最多知识' + - '&f是读者的最爱' +oasis_page_of_libraris_index: + name: '&7图书馆书页索引' + lore: + - '&f找5张书页' + - '&f开3个开关' + - '&f将打开一扇门' + - '&f让你在知识之海里徜徉' +oasis_page_of_libraris_IV: + name: '&7图书馆书页 IV' + lore: + - '&f知识的神谕' + - '&f带来巨大的惊喜' + - '&f绝望的深渊' + - '&f响起万钧雷霆' +oasis_page_of_libraris_V: + name: '&7图书馆书页 V' + lore: + - '&f他尽力隐藏' + - '&f最后的秘密' + - '&f操控阴影与傀儡' + - '&f阻碍你一往无前' +oasis_page_of_plundering_I: + name: '&6掠夺书页 I' + lore: + - '&e城里人将其秘密' + - '&e藏在上面而非下面' + - '&e只要能上去' + - '&e你就能掠夺他们的财宝' +oasis_page_of_sentris: + name: '&1哨卫书页' + lore: + - '&b哨卫的盔甲太垃圾了' + - '&b穿上后你根本挥不动剑' +oasis_page_of_the_pharaoh_I: + name: '&0法老书页 I' + lore: + - '&6祭坛需要祭品' + - '&6但你该献祭什么?' + - '&线索就在红砂岩里' + - '&r红砂岩里。' +oasis_page_of_the_pharaoh_II: + name: '&0法老书页 II' + lore: + - '&6法老的宫殿是用' + - '&6最上等的金子砌成的' + - '&6你对黄金的掠夺' + - '&6将是对他的毁灭' +oasis_page_of_the_pharaoh_III: + name: '&0法老书页 III' + lore: + - '&6法老藏了很多' + - '&6陷阱和珍宝' + - '&6西南角有蓝窗户的房间里' + - '&6潜藏着不祥财宝' +oasis_page_of_the_pharaoh_index: + name: '&0法老书页索引' + lore: + - '&6法老长眠在' + - '&6其坟墓里' + - '&6他静静地等着' + - '&6触发陷阱的人成为他的陪葬品' + - '&63张书页有助于你的冒险' + - '&6你的冒险。' +oasis_page_of_the_sewer_I: + name: '&0下水道书页 I' + lore: + - '&3这里有非同寻常的寄生虫' + - '&3它在徘徊寻找猎物' + - '&3到处都有财宝' + - '&3你只需要四处游走' +oasis_page_of_the_sewer_II: + name: '&0下水道书页 II' + lore: + - '&3一个接一个地打开大门' + - '&3可让水流出' + - '&3往上游后' + - '&3走右侧的隧道' +oasis_page_of_the_sewer_index: + name: '&0下水道书页索引' + lore: + - '&3下水道潜藏着怪物' + - '&3请多加小心,它们会吃了你的脑子!' + - '&3你必须打开3扇' + - '&3有红砂岩的大门' + - '&32张书页将引导你' +oasis_page_of_vampiris_I: + name: '&4吸血鬼书页 I' + lore: + - '&c这个野兽身经百战' + - '&c它对石头、黄金和钻石无所畏惧' + - '&c它唯一害怕的是木头' + - '&c是木头。' +oasis_page_of_vampiris_II: + name: '&4吸血鬼书页 II' + lore: + - '&c别小瞧术士' + - '&c准备好开始一场苦战吧' + - '&c二楼将考验你的力量' + - '&c征服它是仪式的第一步。' +oasis_page_of_vampiris_III: + name: '&4吸血鬼书页 III' + lore: + - '&c走下螺旋楼梯' + - '&c进入洞穴' + - '&c小心从坟墓里' + - '&c爬出来的死者' +oasis_page_of_vampiris_index: + name: '&4吸血鬼书页索引' + lore: + - '&c在天文台里' + - '&c潜伏着一个生物' + - '&c它从未见过阳光' + - '&c找到4张书页' + - '&c有助你逃出生天' +oasis_page_of_vampiris_IV: + name: '&4吸血鬼书页 IV' + lore: + - '&c掠夺两个箱子' + - '&c不要惊醒死者' + - '&c一个在楼梯下,' + - '&c另一个在读书的地方' +oasis_pharaohs_feast: + name: '&6法老盛宴' + lore: + - '&e黄金城曾被沙子掩埋' + - '&e这座曾经的黄金城' + - '&e已被岁月侵蚀。' +oasis_pharaohs_flail: + name: '&0法老的连枷' + lore: + - '&4来世的连枷。' +oasis_pick_of_darkness: + name: '&1黑暗之镐' + lore: + - '&b在暗影中' + - '&b闪闪发光' +oasis_sunkiller: + name: '&6太阳杀手' + lore: + - '&e那里的大岩石' + - '&e是不是能' + - '&e躲在它后面?' +oasis_tohth: + name: '&8晏哥与邦哥兄弟大冒险' + lore: + - '&f我的预感绝对没错!' + - '&f这就是天命!' +okami_drop_leggings: + name: '&c狼神之赐' + lore: + - '&c其疾如狼。' + - '&c狼神赐予火焰保护。' +owl_charm: + name: '&b夜鹰护符' + lore: + - '&a遁入黑暗' + - '&a化身食物链顶端的夜间捕食者' +primis_artifexs_shield: + name: '&6称手的盾牌' + lore: + - '&e危险时期的' + - '&e古旧遗物。' + - '&e它的往日光彩再度得以闪耀!' +primis_caeruleaums_hope: + name: '&9蔚兰的希望' + lore: + - '&8过去时代的遗物,仍然锐利,' + - '&8但其生锈程度' + - '&8足以送到博物馆!' +primis_catacomb_drop_boots: + name: '&7暗骨鞋' + lore: + - '&7不自然的黑骨' + - '&7cover these靴子。' +primis_catacomb_drop_boots_2: + name: '&7暗骨鞋' + lore: + - '&7不自然的暗骨' + - '&7覆盖着这双鞋。' +primis_catacomb_drop_chestplate: + name: '&7暗骨盔甲' + lore: + - '&7暗如深渊之骨' + - '&7装饰在这件盔甲上。' + - '&7射到这些骨头的箭反弹时' + - '&7会发出相当大的声音。' +primis_catacomb_drop_chestplate_2: + name: '&7暗骨盔甲' + lore: + - '&7暗如深渊之骨' + - '&7装饰在这件盔甲上。' + - '&7射到这些骨头的箭反弹时' + - '&7会发出相当大的声音。' +primis_catacomb_drop_leggings: + name: '&7暗骨护腿' + lore: + - '&7护腿上的暗骨' + - '&7能减缓' + - '&7危险的摔落伤害。' +primis_catacomb_drop_leggings_2: + name: '&7暗骨护腿' + lore: + - '&7护腿上的暗骨' + - '&7能减缓' + - '&7危险的摔落伤害。' +primis_catacomb_necromancer_drop_helmet: + name: '&5暗骨帽' + lore: + - '&5它提供不了什么保护,' + - '&5它只寻求鲜血和死亡。' +primis_catacomb_necromancer_drop_helmet_2: + name: '&5暗骨帽' + lore: + - '&5它提供不了什么保护,' + - '&5它只寻求鲜血和死亡。' +primis_catacomb_necromancer_drop_sword: + name: '&5暗骨剑' + lore: + - '&5不自然的暗骨剑' + - '&5在光线下闪闪发光' + - '&5它随时准备好斩断任何' + - '&5阻挡之物。' +primis_catacomb_necromancer_drop_sword_2: + name: '&5暗骨剑' + lore: + - '&5这把剑每一击都会' + - '&5发出怒号' + - '&5让空气' + - '&5涌入其空洞内核。' +primis_cooked_rabbit: + name: '&c烤熟的兔子' + lore: + - 哈,这兔子是不是红温了? +primis_diving_helmet: + name: '&1潜水头盔' + lore: + - 一件老旧的潜水头盔。 + - 仍然能正常使用。 +primis_fish_bait: + name: '&2鱼饵' + lore: + - '&a看来你能用这东西钓大鱼。' +primis_gladius_important_documents: + name: '&2重要文件' + lore: + - '&a这些文件是密封的。' +primis_gladius_lord_promise: + name: '&5援助协议' + lore: + - '... 因此,对于在这些最艰难时期所提供的帮助,' + - 千桥承诺将在格拉迪厄斯的至暗时刻' + - 以实物形式回报。 +primis_gladius_supplies: + name: '&2补给品' + lore: + - '&a适合在战时为士兵提供营养的食物。' +primis_gladius_sword: + name: '&5格拉迪厄斯短剑' + lore: + - '&8格拉迪厄斯堡垒的象征。' +primis_gladius_the_good_stuff: + name: '&2好东西' + lore: + - '&a气味很浓厚……' +primis_heirloom: + name: '&2丢失的传家宝' + lore: + - '&a看起来十分古老。' +primis_ice_village_alanus_dagger: + name: '&e阿兰努斯的匕首' + lore: + - '&e把柄上刻有符文的' + - '&e简易匕首。' +primis_ice_village_chains_shipment: + name: '&a锁链' + lore: + - '&a很多条锁链。' +primis_ice_village_escaped_prisoner_body: + name: '&c失去意识的身体' + lore: + - '&c很重。' +primis_ice_village_foot_of_mountain_chest_axe: + name: '&1Dull Frost斧' + lore: + - '&1触感冰凉' +primis_ice_village_island_chest_trident: + name: '&3岩浆怪之悦' + lore: + - '&3寻找之人,必能找到。' +primis_ice_village_living_nightmares_reward_chest: + name: '&3毛皮大衣' + lore: + - '&3用附近' + - '&3最硬的毛皮制成。' +primis_ice_village_magical_ice_crystals: + name: '&1毛皮冰晶' + lore: + - 靠近雪 + - 会引起反应 +primis_ice_village_make_them_go_ouch_reward_leggings: + name: '&dViolet''s Spare护腿' + lore: + - '&d让你想大摇大摆地走在路上,' + - '&d为所欲为。' +primis_ice_village_salmon: + name: '&2新鲜的鲑鱼' + lore: + - 你这辈子都没见过 + - 这么大的鲑鱼。 +primis_ice_village_silence_reward_helmet: + name: '&aBoomers头盔' + lore: + - '&a应该可以抵御一两次爆炸。' +primis_ice_village_taking_the_bait_reward: + name: '&b北方钓鱼竿' + lore: + - '&b一支制作精良的钓竿。' +primis_ice_village_violet_boots: + name: '&d维奥莱特的皮革靴子' + lore: + - '&d尖脚跟的' + - '&d花哨皮革靴子。' +primis_ice_village_violet_leggings: + name: '&d维奥莱特的花哨护腿' + lore: + - '&d带有轻盈而略微透明的' + - '&d美丽花纹图案。' +primis_ice_village_violet_whip: + name: '&d维奥莱特的鞭子' + lore: + - '&d提供精致的惩罚。' +primis_ice_village_wanna_build_a_snowman_reward_boots: + name: '&3冰霜靴子' + lore: + - '&3这是冰霜靴子。' +primis_invaders_assassins_bow: + name: '&8刺客之弓' + lore: + - '&a让他们自食其果' + - '&a的完美武器。' +primis_invaders_boots: + name: '&4入侵者靴子' + lore: + - '&a这东西很难闻。' +primis_invaders_bow: + name: '&8入侵者弓' + lore: + - '&a这把弓曾经遮蔽了太阳。' +primis_invaders_captains_sword: + name: '&4入侵者队长之剑' + lore: + - '&a弯曲且丑陋的剑' +primis_invaders_chestplate: + name: '&4入侵者胸甲' + lore: + - '&a生锈、丑陋且难闻。但很可爱!' +primis_invaders_helmet: + name: '&4入侵者头盔' + lore: + - '&a能阻挡强大的冲击!' +primis_invaders_leggings: + name: '&4入侵者护腿' + lore: + - '&a可以用些油。' +primis_invaders_sword: + name: '&4入侵者剑' + lore: + - '&a上面有可疑的血迹。' +primis_lucky_pickaxe: + name: '&6幸运镐' + lore: + - '&e即使在地下也能发光。' + - '&e把柄上刻着LL' +primis_monster_slaying_spear: + name: '&8杀戮怪物之矛' + lore: + - 将海怪变成烤肉。 +primis_ogre_boots: + name: '&c兽人靴子' + lore: + - '&7让你保持' + - '&7舒适和温暖。' +primis_ogre_chestplate: + name: '&c兽人胸甲' + lore: + - '&7炙热的触感' +primis_ogre_helmet: + name: '&c兽人头盔' + lore: + - '&7穿上你会汗流浃背。' +primis_ogre_leggings: + name: '&c兽人护腿' + lore: + - '&7阴郁的松弛护腿' +primis_ogre_mines_lucky_pickaxe: + name: '&e幸运稿' + lore: + - '&a幸运一无是处。' +primis_ogre_mines_waterworks_chest_shield: + name: '&a坚固的门' + lore: + - '&a就是一扇门。' +primis_old_shield: + name: '&8旧盾牌' + lore: + - '&7危险时期的' + - '&7古旧遗物' + - '&7也许能修好它……' +primis_pirate_boots: + name: '&4海盗靴子' + lore: + - '&a这双靴子破洞太多 ' + - '&a没有什么用。' +primis_pirate_bow: + name: '&8海盗弓' + lore: + - '&a不完全是燧发枪,' + - '&a但也能射出弓箭!' +primis_pirate_chestplate: + name: '&4海盗胸甲' + lore: + - '&a就是件T恤' +primis_pirate_helmet: + name: '&4海盗头盔' + lore: + - '&a缺少一个眼罩。' +primis_pirate_leggings: + name: '&4海盗护腿' + lore: + - '&a有点晕船!' +primis_pirate_sword: + name: '&4海盗剑' + lore: + - '&a弯曲且丑陋。' +primis_pointis_groves_heirloom: + name: '&2珍贵的传家宝' + lore: + - '&a这是你获得的第二个传家宝。' +primis_pointis_mille_chest_dirty_note: + name: 肮脏的笔记 + lore: + - '&fThere was a really cool剑' + - '&f里面写下的文字已经消失。' +primis_pontis_beast_horn: + name: '&2染血号角' + lore: + - '&f仔细观察会发现' + - '&f这个号角并未染血' + - '&f而是用血制成的。' + - '&f结晶的血液无比锋利。' +primis_pontis_beast_scale: + name: '&2剧毒鱼鳞' + lore: + - '&f鳞片外部坚如磐石。' + - '&f内部覆盖着' + - '&f有毒和酸性的渗出物。' +primis_pontis_beast_silk: + name: '&2浸润阳光的丝绸' + lore: + - '&f这件丝绸散发着光芒和温暖。' +primis_pontis_elf_drop_boots: + name: '&7精灵靴子' + lore: + - '&f你感觉到这件盔甲' + - '&f涌出的奇怪能量。' +primis_pontis_elf_drop_chestplate: + name: '&f精灵胸甲' + lore: + - '&f你感觉到这件盔甲' + - '&f涌出的奇怪能量。' +primis_pontis_elf_drop_crossbow: + name: '&7精灵暗弓' + lore: + - '&7这把弓使用的特殊弹射物' + - '&7既锋利又钝。' +primis_pontis_elf_drop_helmet: + name: '&7精灵头盔' + lore: + - '&f你感觉到这件盔甲' + - '&f涌出的奇怪能量。' +primis_pontis_elf_drop_leggings: + name: '&7精灵护腿' + lore: + - '&f你感觉到这件盔甲' + - '&f涌出的奇怪能量。' +primis_pontis_fields_berry_charm: + name: '&d大浆果' + lore: + - '&d这种浆果散发的' + - '&d新鲜气味万里飘香' + - '&d它的气味似乎能' + - '&d让怪物冷静下来。' + - '&d能让怪物的攻击不那么凶猛。' +primis_pontis_groves_brood_moher_drop_charm: + name: '&a爬虫之殇' + lore: + - '&a这件丝绸散发出奇怪的能量。' +primis_pontis_groves_nest_crawler_drop_shield: + name: '&7岩浆怪的诱饵' + lore: + - '&7举盾时' + - '&7引诱怪物攻击你。' +primis_pontis_groves_spider_boots_reward: + name: '&1蜘蛛腿靴子' + lore: + - '&1用蜘蛛腿和皮革制成的靴子。' +primis_pontis_groves_tree_climbing_elf_bandits_reward_leggings: + name: '&a精灵珍珠护腿' + lore: + - '&a能保护你' + - '&a的护腿。' +primis_pontis_mille_arena_knowledge: + name: '&2知识' + lore: + - '&f重要的知识。' +primis_pontis_mille_arena_reward_1: + name: '&4摘星盾牌' + lore: + - '&7带有宇宙图案的华丽盾牌' +primis_pontis_mille_arena_reward_2: + name: '&4Star Touched胸甲' + lore: + - '&7A thousand tiny spiky stars stretch across the胸甲。' +primis_pontis_mille_arena_reward_3: + name: '&4Star Touched护腿' + lore: + - '&7The护腿 sparkle like the stars in the sky。' +primis_pontis_mille_cat_quest_reward_charm: + name: '&9猫之祝福' + lore: + - '&9如果你把它一直' + - '&9举到耳边,' + - '&9你可以听到轻微的呼噜声' +primis_pontis_mille_counselor_sword: + name: '&e远言之石' + lore: + - '&a你能感觉到石头里有东西。' +primis_pontis_mille_fields_beasts_reward_chest: + name: '&e猎人的荣耀' + lore: + - '&e猎人无法成为猎物。' +primis_pontis_mille_fields_contest_berry: + name: '&d精品浆果' + lore: + - '&d漂亮的大浆果。' + - '&d这一品种万里挑一。' +primis_pontis_mille_fields_do_it_yourself_reward_bow: + name: '&c猎人之弓' + lore: + - '&c精心制作的弓。' + - '&c用这把弓射出的箭' + - '&c能对任何野兽造成伤害。' +primis_pontis_mille_fields_first_aid: + name: '&2急救设备' + lore: + - '&f人手必备" - "&f用于治疗严重损伤。' +primis_pontis_mille_fields_rat_drop_helmet: + name: '&f羽毛鼠帽' + lore: + - '&f你把你的猎物' + - '&f做成了帽子。' + - '&f在提取了猎物' + - '&f的致盲部分后,' + - '&f你将其功能化为己用。' +primis_pontis_mille_fields_rat_meat: + name: '&c生肉' + lore: + - 生的老鼠肉,不需要烹饪。 +primis_pontis_mille_fields_stolen_berries: + name: '&4失窃的浆果' + lore: + - '&4被偷走的浆果' +primis_pontis_mille_fish_nets: + name: '&2渔网' + lore: + - '&a让捕鱼变得更容易!' +primis_pontis_mille_fresh_rat: + name: '&f活老鼠' + lore: + - 猫咪喜欢这个。 +primis_pontis_mille_mines_goblined_up_in_the_maze_reward_axe: + name: '&a符文哥布林斧' + lore: + - '&a斧柄上刻有符文。' + - '&a但它们现在已经完全褪色了。' + - '&a似乎这把斧头曾受到过诅咒……' +primis_pontis_mille_mines_goblin_head: + name: '&2哥布林羽毛' + lore: + - '&a十分柔软而带刺。' +primis_pontis_mille_parkour_reward_boots: + name: '&4钻石树靴子' + lore: + - '&7用特殊的软树皮制成的靴子。' + - '&7装饰有宝石。' +primis_pontis_mille_reward_boots: + name: '&4千桥靴子' + lore: + - '&7传统的千桥靴子' +primis_pontis_mille_reward_chest: + name: '&4千桥胸甲' + lore: + - '&7传统的千桥胸甲' +primis_pontis_mille_reward_helmet: + name: '&4千桥头盔' + lore: + - '&7传统的千桥头盔' +primis_pontis_mille_reward_leggings: + name: '&4千桥护腿' + lore: + - '&7传统的千桥护腿' +primis_pontis_mille_reward_shield: + name: '&4千桥盾牌' + lore: + - '&7传统的千桥盾牌' +primis_pontis_mille_reward_sword: + name: '&4千桥武士刀' + lore: + - '&7无比锋利' +primis_pontis_mille_serious_sewage_reward_helmet: + name: '&2海龟壳头盔' + lore: + - '&2让你想吃些披萨。' +primis_pontis_mille_sewage_keys: + name: '&2下水道钥匙串' + lore: + - '&a串着很多把钥匙的钥匙串。' +primis_pontis_mille_sewers_ninja_drop_chestplate: + name: '&7忍者胸甲' + lore: + - 现在你是忍者了 +primis_pontis_mille_sewers_ninja_drop_leggings: + name: '&7忍者护腿' + lore: + - 现在你是忍者了 +primis_pontis_mille_sewers_shredder_drop: + name: '&4施莱德头盔' + lore: + - 表面布满了 + - 刀片一样的尖状物 +primis_pontis_mille_slums_chest_sword: + name: '&4千桥钝武士刀' + lore: + - '&7无比锋利' +primis_pontis_mille_to_lycan_or_not_to_lycan_reward: + name: '&a毛皮护腿' + lore: + - '&a坚韧而轻便' + - '&a用毛皮和兽皮制成。' +primis_pontis_mines_goblin_drop_boots: + name: '&7哥布林靴子' + lore: + - '&7看来有人用铁锭' + - '&7把它敲成了正确的形状。' +primis_pontis_mines_goblin_drop_chestplate: + name: '&7哥布林胸甲' + lore: + - '&7看来有人用铁锭' + - '&7把它敲成了正确的形状。' +primis_pontis_mines_goblin_drop_helmet: + name: '&7哥布林头盔' + lore: + - '&7看来有人用铁锭' + - '&7把它敲成了正确的形状。' +primis_pontis_mines_goblin_drop_leggings: + name: '&7哥布林护腿' + lore: + - '&7看来有人用铁锭' + - '&7把它敲成了正确的形状。' +primis_pontis_mines_goblin_drop_spear: + name: '&7哥布林矛' + lore: + - '&7尖端是一块漂亮而锋利的石头。' +primis_pontis_mines_goblin_drop_sword: + name: '&7哥布林剑' + lore: + - '&7这就是装了剑柄的石棍。' +primis_pontis_redwoods_nasty_little_bandits_reward_boots: + name: '&2森林靴子' + lore: + - '&2The靴子 seem to be made' + - '&2用软树皮、树叶' + - '&2和树液结晶制成的。' +primis_pontis_redwoods_spider_legs: + name: '&2蜘蛛腿' + lore: + - '&a这就是蜘蛛腿……' +primis_pontis_redwoods_tobacco: + name: '&2优质烟草' + lore: + - '&a纯正的烟草味……' +primis_pontis_redwoods_watch: + name: '&2坚固的怀表' + lore: + - '&a出乎意料的轻巧和坚固。' +primis_pontis_redwoods_werewolf_drop_chestplate: + name: '&7毛皮胸甲' + lore: + - '&7用坚韧的毛皮和皮革制成。' + - '&7很轻,但非常坚韧。' +primis_roughspun_boots: + name: '&5Roughspun靴子' + lore: + - '&d磨损风化,' + - '&d但总比不穿盔甲好!' +primis_roughspun_chestplate: + name: '&5Roughspun胸甲' + lore: + - '&d磨损风化,' + - '&d但总比不穿盔甲好!' +primis_roughspun_helmet: + name: '&5Roughspun头盔' + lore: + - '&d磨损风化,' + - '&d但总比不穿盔甲好!' +primis_roughspun_leggings: + name: '&5Roughspun护腿' + lore: + - '&d磨损风化,' + - '&d但总比不穿盔甲好!' +primis_ruins_bow: + name: '&8毁坏的弓' + lore: + - 一把老旧的弓。也许曾经还很好用。 +primis_ruins_diary_entry: + name: 日记书页 + lore: + - '... 我现在后悔在这些废墟中追寻宝藏了。' + - 现在我摔断了腿, + - 看来我注定要死于寻宝之路。 + - 要是我在跑酷课上认真听讲,我现在也不会这么惨! +primis_ruin_relic_boots: + name: '&b墟遗靴子' + lore: + - '&6与废墟一同埋葬。' + - '&6充满着古老的力量。' +primis_ruin_relic_chestplate: + name: '&b墟遗胸甲' + lore: + - '&6与废墟一同埋葬。' + - '&6充满着古老的力量。' +primis_ruin_relic_helmet: + name: '&b墟遗头盔' + lore: + - '&6与废墟一同埋葬。' + - '&6充满着古老的力量。' +primis_ruin_relic_leggings: + name: '&b墟遗护腿' + lore: + - '&6与废墟一同埋葬。' + - '&6充满着古老的力量。' +primis_rusty_mail_boots: + name: '&3Rusty Mail靴子' + lore: + - '&99锈迹斑斑,但经久耐用。' + - '&9比皮革好用!' +primis_rusty_mail_chestplate: + name: '&3Rusty Mail胸甲' + lore: + - '&99锈迹斑斑,但经久耐用。' + - '&9比皮革好用!' +primis_rusty_mail_helmet: + name: '&3Rough Mail头盔' + lore: + - '&9锈迹斑斑,但经久耐用。' + - '&9比皮革好用!' +primis_rusty_mail_leggings: + name: '&3Rough Mail护腿' + lore: + - '&99锈迹斑斑,但经久耐用。' + - '&9比皮革好用!' +primis_starter_boots: + name: '&4船wreck''s靴子' + lore: + - '&a这些皮革碎片几乎不能算作盔甲。' +primis_starter_chestplate: + name: '&4船wreck''s胸甲' + lore: + - '&a这些皮革碎片几乎不能算作盔甲。' +primis_starter_helmet: + name: '&4船wreck''s头盔' + lore: + - '&a这些皮革碎片几乎不能算作盔甲。' +primis_starter_leggings: + name: '&4船wreck''s护腿' + lore: + - '&a这些皮革碎片几乎不能算作盔甲。' +primis_starter_sword: + name: '&4船wreck''s剑' + lore: + - '&a可能是由沉船舶残骸临时拼凑而成的!' +primis_storm_temple_drop_axe: + name: '&b风暴斧' + lore: + - '&b狂风将吹散强敌。' +primis_storm_temple_drop_boots: + name: '&b风暴靴子' + lore: + - '&bThe 风暴神殿' + - '&b穷工极巧。' +primis_storm_temple_drop_charm: + name: '&b风暴 Necklace' + lore: + - '&b风暴的力量。' +primis_storm_temple_drop_chestplate: + name: '&b风暴 Chest-plate' + lore: + - '&bThe 风暴神殿' + - '&b穷工极巧。' +primis_storm_temple_drop_helmet: + name: '&b风暴头盔' + lore: + - '&bThe 风暴神殿' + - '&b穷工极巧。' +primis_storm_temple_drop_leggings: + name: '&b风暴护腿' + lore: + - '&bThe 风暴神殿' + - '&b穷工极巧。' +primis_terravilla_big_trouble_in_little_pub_reward_leggings: + name: '&e地之祝福' + lore: + - '&e看起来很重' + - '&e但它却出奇地轻。' + - '&e显然这双护腿' + - '&e至少是' + - '&e几个世纪前的。' +primis_terravilla_drowning_terror_reward_charm: + name: '&a鱼护符' + lore: + - '&a看起来像鱼。' +primis_terravilla_hog_on_my_porch_reward_helmet: + name: '&6疣猪头盔' + lore: + - '&6使用尖背野猪皮革制成。' +primis_terravilla_perfect_sample: + name: '&e完美样本' + lore: + - '&e它看起来像鱼……' + - '&e但显然它不是……' +primis_terravilla_strike_the_earth_reward_sword: + name: '&5裂地者' + lore: + - '&5从地元素的尸体中' + - '&5取出的剑。' + - '&5与它的孪生兄弟不同,' + - '&5这把刀处于原始状态。' +primis_terravilla_taking_out_the_trash_reward_sword: + name: '&9裂地者' + lore: + - '&9看起来古老而钝。' +primis_terravilla_two_legged_terror_growth: + name: '&e双足恐怖生物成熟体' + lore: + - '&e大型成熟体。' +primis_terravilla_two_legged_terror_sample: + name: '&e双足恐怖生物样本' + lore: + - '&e简单的样本。' +primis_wolf_hide_boots: + name: '&5狼皮拖鞋' + lore: + - '&d磨损风化,' + - '&d但总比不穿盔甲好!' +primis_wolf_hide_chestplate: + name: '&5狼皮软铠甲' + lore: + - '&d磨损风化,' + - '&d但总比不穿盔甲好!' +primis_wolf_hide_helmet: + name: '&5Wolf Hide头盔' + lore: + - '&d磨损风化,' + - '&d但总比不穿盔甲好!' +primis_wolf_hide_leggings: + name: '&5狼皮裤子' + lore: + - '&d磨损风化,' + - '&d但总比不穿盔甲好!' +pufferfish_drop_helmet: + name: '&b河豚头盔' + lore: + - '&b曾是条鱼,现为头盔。' +rabbit_charm: + name: '&b跃兔护符' + lore: + - '&a持有该护符' + - '&a你可以飞跃障碍' + - '&a到达任何你想去的地方' +rabbit_wolf_drop_chestplate: + name: '&6电能胸甲' + lore: + - '&6只要你不介意' + - '&6偶尔漏电就行。' +rabbit_wolf_drop_leggings: + name: '&6火焰护腿' + lore: + - '&6略微烧焦。' +regular_hoglin_drop_boots: + name: '&e疣猪靴子' + lore: + - '&e用耐用而' + - '&e会说话的疣猪皮革制成。' +regular_hoglin_drop_chestplate: + name: '&e疣猪胸甲' + lore: + - '&e用耐用而' + - '&e会说话的疣猪皮革制成。' +regular_hoglin_drop_helmet: + name: '&e疣猪兜帽' + lore: + - '&e用耐用而' + - '&e会说话的疣猪皮革制成。' +regular_hoglin_drop_leggings: + name: '&e疣猪护腿' + lore: + - '&e用耐用而' + - '&e会说话的疣猪皮革制成。' +rod_of_the_depths: + name: '&3深海钓鱼竿' + lore: + - '&3你想知道我是' + - '&3怎么得到这个的?' + - '&3坐好了,我要讲故事了……' +rotting_diver_drop_hoe: + name: '&b深耕锄头' + lore: + - '&b在腐烂潜者尸体里找到。' +salamander_charm: + name: '&b沙罗曼蛇护符' + lore: + - '&a和插件作者' + - '&a新的混音带一样火热!' +salty_corpse_drop_helmet: + name: '&a恶臭头盔' + lore: + - '&a不知为何你' + - '&a决定穿上这个' + - '&a从尸体里掏出来的东西。' +scorpion_charm: + name: '&b毒蝎护符' + lore: + - '&a飞若浮蝶' + - '&a痛如蜂刺' + - '&a毒如土豆' +shulker_charm: + name: '&b潜影护符' + lore: + - '&a♪ I believe I can fly ♪' + - '&a♪ I believe I can touch the sky ♪' + - '&a和我一起上天吧!' +skeleton_knight_drop_helmet: + name: '&f骑士的荣耀' + lore: + - '&f一个骑士头盔。经久耐用。' +sky_archer_drop_bow: + name: '&a天空之弓' + lore: + - '&a十分适合阻拦幻翼。' +slowpoke_charm: + name: '&b迟钝护符' + lore: + - '&a希望你不要被' + - '&a这个护符所迷惑……' +spider_knight_drop_helmet: + name: '&a小号头盔' + lore: + - '&a合身的头盔。也许有点紧。' +stacked_bones_drop_helmet: + name: '&6头骨' + lore: + - '&6这个头盔够大' + - '&6你不用担心穿不上' +summon_merchant_scroll: + name: '&6唤商卷轴' + lore: + - '&a你想出售物品吗?' + - '&a右击激活吧' + - '&a或者喊出&9Jeeves/吉夫斯&a的名字!' +summon_wolf_scroll: + name: '&6唤狼卷轴' + lore: + - '&a召唤一只帮助你' + - '&a对抗精英怪物的好朋友!' + - '&a摸摸可爱的它吧!' +super_mite_drop_charm: + name: '&d螨珍珠' + lore: + - '&d这值得吗……' +air_ship_air_buccaneer_boots: + name: '&5天空皇家海盗靴子' + lore: + - '&d非常适合空袭!' +air_ship_air_buccaneer_chestplate: + name: '&5天空皇家海盗胸甲' + lore: + - '&d非常适合空袭!' +air_ship_air_buccaneer_helmet: + name: '&5天空皇家海盗头盔' + lore: + - '&d非常适合空袭!' +air_ship_air_buccaneer_leggings: + name: '&5天空皇家海盗护腿' + lore: + - '&d非常适合空袭!' +air_ship_air_pirates_boots: + name: '&5天空海盗靴子' + lore: + - '&d非常适合空袭!' +air_ship_air_pirates_chestplate: + name: '&5天空海盗胸甲' + lore: + - '&d非常适合空袭!' +air_ship_air_pirates_helmet: + name: '&5天空海盗头盔' + lore: + - '&d非常适合空袭!' +air_ship_air_pirates_leggings: + name: '&5天空海盗护腿' + lore: + - '&d非常适合空袭!' +air_ship_bowsmans_bow: + name: '&2弓箭手之弓' + lore: + - '&a飞船弓箭手' + - '&a掉落的弓!' +air_ship_cannon_powder: + name: '&c加农炮弹' + lore: + - '&8你该怎么' + - '&8点燃引线?' +air_ship_daveys_digger: + name: '&4戴维之锹' + lore: + - '&c戴维可不想让' + - '&c让傻瓜炫耀他的锹' +air_ship_quartermasters_whip: + name: '&f军需官的鞭子' + lore: + - '&7军需官' + - '&7有要遵守的日程' +air_ship_wayfinders_windlass: + name: '&3探路者的绞盘' + lore: + - '&b指引飞船' + - '&b航向星辰' +pirate_ship_sea_feast: + name: '&6海洋盛宴' + lore: + - '&6视觉和健康' + - '&6兼备的盛宴!' +pirate_ship_sea_ration: + name: '&e海洋口粮' + lore: + - '&e一天一苹果' + - '&e坏血远离我' + - '&c提醒:并不会' +catacombs_tier_10_miniboss_boots: + name: '&9蛛丝靴子' + lore: + - '&5如同空气般轻盈!' +catacombs_tier_10_miniboss_spider_eye: + name: '&7地下蜘蛛之眼' + lore: + - '&7当你拿着这个的时候' + - '&7你听到了不知从何处传来的低语……' +catacombs_tier_15_boss_bone: + name: 挑剔骨刺 + lore: + - '&f你有麻烦了!' +catacombs_tier_15_boss_bow: + name: '&6撼骨弓' + lore: + - '&f它们能从骨子里' + - '&f感到恐惧!' +catacombs_tier_15_boss_shovel: + name: '&8掘墓者' + lore: + - '&f他们会从骨子里' + - '&f感到震撼!' +catacombs_tier_15_mimic_boss_shield: + name: '&3失落圣殿骑士之盾' + lore: + - 在古代墓穴的隐藏房间内 + - 找到的神秘宝物…… +colosseum_pit_breaker: + name: '&4深坑破碎者' + lore: + - '&4我来' +colosseum_pit_filler: + name: '&4&l深坑填补者' + lore: + - '&4我征服' +colosseum_pit_maker: + name: '&4&l深坑制造者' + lore: + - '&4我见' +dark_cathedral_tier_75_sword: + name: '&0诅咒之剑' + lore: + - '&0&k克苏鲁是唯一真神。' + - '&0&k这个世界只是只' + - '&0&k待宰的羔羊' +darkspire_arzags_boots: + name: '&8Arzag''s War靴子' + lore: + - '&7强大的阿尔扎格穿过的靴子!' +darkspire_arzags_chestplate: + name: '&8阿尔扎格的战甲' + lore: + - '&7强大的阿尔扎格穿过的胸甲!' +darkspire_arzags_helmet: + name: '&8阿尔扎格的战盔' + lore: + - '&7强大的阿尔扎格穿过的头盔!' +darkspire_arzags_leggings: + name: '&8阿扎格的战争护腿' + lore: + - '&7强大的阿尔扎格穿过的护腿!' +darkspire_arzags_slicer: + name: '&8阿尔扎格的切割斧' + lore: + - '&7强大的阿尔扎格用过的斧头' +darkspire_crypt_keepers_boots: + name: '&4墓穴守卫的靴子' + lore: + - '&c墓穴守卫' + - '&c穿过的靴子!' +darkspire_hellraisers_battle_armor: + name: '&4堕落者的战甲' + lore: + - '&c堕落者埃比克斯' + - '&c用过的战甲' + - '&c堕落者埃比克斯!' +darkspire_maalkvs_bow: + name: '&4马尔克夫之弓' + lore: + - '&c马尔克夫' + - '&c所使用的弓' +darkspire_netherite_axe: + name: '&8虚空切割者' + lore: + - '&8这把斧头' + - '&8由虚空碎片' + - '&8制作而成' +darkspire_nicolas_ribcages_helmet: + name: '&4尼古拉·里卡格的头盔' + lore: + - '&c尼古拉·里卡格' + - '&c所使用的头盔' +darkspire_oroxaks_sword: + name: '&4奥罗萨克之剑' + lore: + - '&c奥罗萨克' + - '&c所使用的剑' +darkspire_zalmurs_leggings: + name: '&4扎默尔的护腿' + lore: + - '&cFormerly the护腿 of' + - '&c热情的扎穆尔' + - '&c小鬼杀手!' +the_feller: + name: '&2伐木斧' + lore: + - '&a即使你在梦里' + - '&a你也能感受到' + - '&a这把斧头对树木的杀戮之欲' +the_great_weaver_drop_charm: + name: '&c编织者丝绸' + lore: + - '&c这个丝绸注入了强大的力量。' +hallosseum_amazing_treat: + name: '&a美味佳肴!' + lore: + - '&e美味的点心!' +hallosseum_axe_of_beheadings: + name: '&c斩首斧' + lore: + - '&4用于给' + - '&4一些无头骑士斩首的武器!' +hallosseum_incredible_treat: + name: '&a美味佳肴!' + lore: + - '&e十分美味的点心!' +hallosseum_treat: + name: '&a点心!' + lore: + - '&e美味的点心!' +hallosseum_treat_v2: + name: '&a点心!' + lore: + - '&e美味的点心!' +the_hunter_drop_crossbow: + name: '&a猎人之友' + lore: + - '&a开始猎杀吧。' +northpole_amazing_treat: + name: '&a佳肴!' + lore: + - '&e美味的点心!' +northpole_coalbringer: + name: '&8煤块' + lore: + - '&c我碰到的东西' + - '&c都会融化。' + - '&c我太惨了!' +northpole_frostcaster: + name: '&b冰霜之弩' + lore: + - '&7我碰到的东西' + - '&7都会变成雪!' + - '&7我太惨了!' +northpole_incredible_treat: + name: '&a美味佳肴!' + lore: + - '&e十分美味的点心!' +northpole_naughty_lister: + name: '&4淘气名单记录者' + lore: + - '&c别再问我了!我只接受名字。' + - '&c今年你淘气过吗?' +northpole_treat: + name: '&a点心!' + lore: + - '&e美味的点心!' +northpole_treat_v2: + name: '&a点心!' + lore: + - '&e美味的点心!!' +the_phantom_drop_chestplate: + name: '&d幻翼胸甲' + lore: + - '&d你狂怒认为它是由柔软舒适的纤维布制成的' + - '&d但击中布料的剑' + - '&d不会反冲。' +pirate_ship_tier_15_boots: + name: 海盗拖鞋 + lore: + - 让你想去 + - 逛沙滩 +pirate_ship_tier_15_bow: + name: 海盗短弓 + lore: + - 非常适合登船小队! +pirate_ship_tier_15_chestplate: + name: 海盗衬衫 + lore: + - 不穿鞋,不穿衣 + - 没问题! +pirate_ship_tier_15_helmet: + name: 海盗头巾 + lore: + - 不穿鞋,不穿衣 + - 没问题! +pirate_ship_tier_15_leggings: + name: 海盗护腿 + lore: + - 这些装备可以洗一洗! +pirate_ship_tier_15_sword: + name: 海盗刀 + lore: + - 引人注目而致命! +pirate_ship_tier_20_miniboss_axe: + name: '&5厨师的嫩肉粉' + lore: + - '&明天你将感受到痛楚!' +pirate_ship_tier_20_miniboss_chestplate: + name: '&5厨师围裙' + lore: + - '&5今非昔比' +pirate_ship_tier_25_boots: + name: '&a海盗胸甲' + lore: + - '&a十分适合偷窃!' +pirate_ship_tier_25_bow: + name: '&a海盗弓' + lore: + - '&a小心使用' +pirate_ship_tier_25_chestplate: + name: '&a海盗背心' + lore: + - '&a很可能是非法获得的!' +pirate_ship_tier_25_helmet: + name: '&a海盗耳环' + lore: + - '&a足够支付' + - '&a葬礼费用!' +pirate_ship_tier_25_leggings: + name: '&a海盗裤子' + lore: + - '&a兜里装满了金币!' +pirate_ship_tier_25_miniboss_helmet: + name: '&5舵手的眼罩' + lore: + - '&5你是' + - '&5怎么看见东西的?' +pirate_ship_tier_25_miniboss_trident: + name: '&5舵手的三叉戟' + lore: + - '&5尖头一侧向敌!' +pirate_ship_tier_25_sword: + name: '&a海盗弯刀' + lore: + - '&a真正的海盗使用的武器!' +pirate_ship_tier_30_miniboss_axe: + name: '&5粉碎者之斧' + lore: + - '&5退后!' +pirate_ship_tier_30_miniboss_shield: + name: '&5粉碎者之斧头' + lore: + - '&5永远不会跳过练肩日!' +pirate_ship_tier_35_boots: + name: '&9海盗靴子' + lore: + - '&a十分适合虚张声势!' +pirate_ship_tier_35_bow: + name: '&9海盗手炮' + lore: + - '&9把他们炸飞!' +pirate_ship_tier_35_chestplate: + name: '&9海盗肩带' + lore: + - '&9掠夺的不二之选!' +pirate_ship_tier_35_helmet: + name: '&9海盗眼罩' + lore: + - '&9看不见了!' +pirate_ship_tier_35_leggings: + name: '&9海盗护腿' + lore: + - '&9掠夺的不二之选!' +pirate_ship_tier_35_miniboss_boots: + name: '&9近卫靴子' + lore: + - '&5护身的不二之选!' +pirate_ship_tier_35_miniboss_chestplate: + name: '&5近卫肩带' + lore: + - '&5护身的不二之选!' +pirate_ship_tier_35_miniboss_crossbow: + name: '&5近卫手炮' + lore: + - '&5护身的不二之选!' +pirate_ship_tier_35_miniboss_helmet: + name: '&5近卫眼罩' + lore: + - '&5护身的不二之选!' +pirate_ship_tier_35_miniboss_leggings: + name: '&5近卫护腿' + lore: + - '&9护身的不二之选!' +pirate_ship_tier_35_miniboss_sword: + name: '&5近卫弯刀' + lore: + - '&5护身的不二之选!' +pirate_ship_tier_35_sword: + name: '&9海盗弯刀' + lore: + - '&9真正的海盗使用的武器!' +pirate_ship_tier_40_miniboss_crossbow: + name: '&5老式短枪' + lore: + - '&5无情扫射!' +pirate_ship_tier_40_miniboss_leggings: + name: '&5迂回者' + lore: + - '&5出其不意' + - '&5克敌制胜!' +pirate_ship_tier_45_boss_helmet: + name: '&5船长的眼罩' + lore: + - '&5我没看到有什么问题!' +pirate_ship_tier_45_boss_sword: + name: '&5船长的弯刀' + lore: + - '&5鼠辈,看剑!' +the_ruins_boss_loot: + name: '&6雷神之斧' + lore: + - 只有内心纯洁之人 + - 才能使用这把斧头 +sewer_drowned_kings_boots: + name: '&4溺尸王靴子' + lore: + - '&c凶恶溺尸王' + - '&c用过的靴子' +sewer_drowned_kings_chestplate: + name: '&4溺尸王胸甲' + lore: + - '&c凶恶溺尸王' + - '&c用过的胸甲' +sewer_drowned_kings_crown: + name: '&4溺尸王冠' + lore: + - '&c凶恶溺尸王' + - '&c用过的王冠' +sewer_drowned_kings_leggings: + name: '&4溺尸王护腿' + lore: + - '&c凶恶溺尸王' + - '&c用过的护腿' +sewer_drowned_kings_trident: + name: '&4溺尸王三叉戟' + lore: + - '&c凶恶溺尸王' + - '&c用过的三叉戟' +sewer_spelunkers_boots: + name: '&2下水道探险者靴子' + lore: + - '&a进入下水道的' + - '&a探险者必备护腿!' +sewer_spelunkers_chestplate: + name: '&2下水道探险者胸甲' + lore: + - '&a进入下水道的' + - '&a探险者必备胸甲!' +sewer_spelunkers_helmet: + name: '&2下水道探险者头盔' + lore: + - '&a进入下水道的' + - '&a探险者必备头盔!' +sewer_spelunkers_leggings: + name: '&2下水道探险者护腿' + lore: + - '&a进入下水道的' + - '&a探险者必备护腿!' +sewer_spelunkers_sword: + name: '&2下水道探险者之剑' + lore: + - '&a进入下水道的' + - '&a探险者必备剑!' +the_stinger: + name: '&e螫针' + lore: + - '&a飞如浮碟' + - '&a痛如蜂刺' +tree_defender_drop_shield: + name: '&7灵木盾' + lore: + - '&7这副盾牌能' + - '&7缓慢自我修复。' +unbind_scroll: + name: '&5解绑卷轴' + lore: + - '&5可用铁砧解绑' + - '&5灵魂绑定装备' + - '&5请谨慎使用!' +undead_farmer_drop_shovel: + name: '&8堆肥大师' + lore: + - '&8非常适合铲猪粪。' +unwanted_visitor_drop_bow: + name: '&1冰霜之弓' + lore: + - '&9让你冷静头脑' + - '&9并在远处狙击。' +vampire_manor_gargoyle_granulator: + name: '&8滴水兽制造者' + lore: + - '&c撒上了少许大蒜。' +vampire_manor_stake_your_claim: + name: '&4声明主权' + lore: + - '&c撒上了少许大蒜。' +vampiric_charm: + name: '&b吸血鬼护符' + lore: + - '&a没有人知道' + - '&a这个护符来自哪' + - '&a也没人会忘记它有多危险……' +veterans_boots: + name: '&6老手靴子' + lore: + - '&2给予群木联盟竞技场' + - '&2挑战者的奖励!' +veterans_chestplate: + name: '&6老手胸甲' + lore: + - '&2给予群木联盟竞技场' + - '&2挑战者的奖励!' +veterans_helmet: + name: '&6老手头盔' + lore: + - '&2给予群木联盟竞技场' + - '&2挑战者的奖励!' +veterans_leggings: + name: '&6老手护腿' + lore: + - '&2给予群木联盟竞技场' + - '&2挑战者的奖励!' +veterans_sword: + name: '&6老手之剑' + lore: + - '&2给予群木联盟竞技场' + - '&2挑战者的奖励!' +vex_top_drop_boots: + name: '&b咒缚靴子' + lore: + - '&b得此强靴' + - '&b就获得了强大的力量。' +warlock_drop_chestplate: + name: '&d术士法袍' + lore: + - '&d提供良好的法术保护。' +warlock_drop_helmet: + name: '&d术士兜帽' + lore: + - '&d提供良好的法术保护。' +water_pest_drop_shield: + name: '&b进水盾牌' + lore: + - '&b十分坚固耐用。' +wendigo_drop_sword: + name: '&8饥饿之剑' + lore: + - '&8这把剑一直' + - '&8渴求更多鲜血。' +werehare_drop_charm: + name: '&e兔人战利品' + lore: + - '&e给予携带者' + - '&e幸运与健康。' +werewolf_bone: + name: '&6狼人的骨头' + lore: + - '&a杀死了狼人后' + - '&a你暂时就是' + - '&a狼群的首领了' +wolfsbane: + name: '&7狼殇' + lore: + - '&a用觉醒狼人' + - '&a做成的剑' + - '&a狼群为之悲恸' +yeti_drop_leggings: + name: '&a毛皮护腿' + lore: + - '&e暖和耐用。' +yezhi_baba_drop_boots: + name: '&a女巫长袍' + lore: + - '&a这上面的气味' + - '&a终究会消失的。' +zombie_kings_axe: + name: '&4尸王之斧' + lore: + - 僵尸王 + - 所用过的斧头 + - 这上面沾满了杀戮之血 +airship_minidungeon: + name: '&6飞船' + customInfo: + - '&f一艘满载着亡灵海盗的凶恶飞船!' + - '&6制作者:MagmaGuy、69OzCanOfBepis' + - '&6和Realm of Lotheridon' + playerInfo: |- + 难度: &6普通 + $bossCount个boss,等级范围为$lowestTier-$highestTier + &6适合身经百战的老玩家 + &6前往挑战的亡灵海盗飞船 + regionEnterMessage: '&8[EM] &c进入敌对空域!' + regionLeaveMessage: '&8[EM] &c离开敌对空域' +binder_of_worlds_lair: + name: '&5次元枢纽' + customInfo: + - '&5准备好面临终极挑战吧!' + - '&6制作者:MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + 难度:&6噩梦 + $bossCount个$highestTier级的最终Boss! + &5最强的精英怪物! + regionEnterMessage: '&8[EM] &5你附近的现实支离破碎,你需要面对这场最终挑战。 &4你这是自寻死路!' + regionLeaveMessage: '&8[EM] &5你离开了次元枢纽。你找到想要的东西了吗?' +catacombs_lair: + name: '&8地下墓穴' + customInfo: + - '&f入门级地牢!' + - '&6制作者:Realm of Lotheridon' + playerInfo: |- + 难度:&a困难 + $bossCount个boss,等级范围为$lowestTier - $highestTier + &2适合新手组队攻打的小地牢! + regionEnterMessage: '&8[EM] &8正在进入墓穴。请小心脚下。' + regionLeaveMessage: '&8[EM] &8你离开了墓穴。但这趟旅途值得吗?' +colosseum_lair: + name: '&6角斗场' + customInfo: + - '&f包含第一个真正意义上的世界boss' + - '&f有多阶段战斗的骑乘型boss和第一个伪装型boss' + - '&f一场史诗级战斗将在这里打响!' + - '&6制作者:MagmaGuy & Maldini' + playerInfo: |- + 难度:&4非常困难 + $bossCount个boss,等级范围为$lowestTier - $highestTier + &c适用于多名组队玩家的史诗级战斗 + regionEnterMessage: '&8[EM] &6捍卫者和挑战者们请准备!&e对抗强敌,证明你们的价值吧!' + regionLeaveMessage: '&8[EM] &6再见,旅行者!&e尽快回来,再展雄风!' +dark_cathedral_lair: + name: '&8暗黑教堂' + customInfo: + - '&f第一个发布的地牢!' + - '&f服务器必备经典' + - '&6制作者:MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + 难度:&c困难 + $bossCount个$highestTier级Boss + &c最初的小地牢 + &c是入门玩家梦开始的地方 + regionEnterMessage: '&8[EM] &8欢迎来到暗黑教堂。&4死亡在里面等待着你..。' + regionLeaveMessage: '&8[EM] &8你离开了暗黑教堂。&4它等待着你再次来临..。' +dark_spire_minidungeon: + name: '&8黑暗尖塔' + customInfo: + - '&f等级最高的地牢!' + - '&f为真正的挑战者准备!' + - '&6制作者:69OzCanOfBepis' + playerInfo: |- + 难度:&c普通 + $bossCount个boss,等级范围为$lowestTier - $highestTier + &c向高级玩家发起的巨大挑战! + regionEnterMessage: '&8[EM] &1侵略正在进行中。&9请抵御入侵!' + regionLeaveMessage: '&8[EM] &1你安全了,&9暂时的..。' +fireworks_lair: + name: '&a烟火盛宴' + customInfo: + - '&f2021年7月4日更新的新地图!' + - '&6制作者:MagmaGuy' + playerInfo: |- + 难度:&6困难 + $bossCount个$lowestTier级大Boss待你挑战! + &6享受璀璨烟火吧! + regionEnterMessage: '&8[EM] &e欢迎来到烟火盛宴!' + regionLeaveMessage: '&8[EM] &e你离开了派对!' +frost_palace_sanctum: + name: 寒冰宫殿 + customInfo: + - '&f与冰雪女王' + - 决一死战! + - '&6制作者:MagmaGuy和Delio' + playerInfo: '难度:&45人组队都困难!' + regionEnterMessage: '&b你正踏入寒冰宫殿!小心冻伤!' + regionLeaveMessage: '&b你离开了寒冰宫殿' +hallosseum_lair: + name: '&c万圣殿' + customInfo: + - '&f2020年万圣节特供地牢!' + - '&6制作者:MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + 难度:&6困难 + $bossCount个$lowestTier级的Boss等待着你去挑战! + &6一场有趣的万圣节挑战! + regionEnterMessage: '&8[EM] &4不给糖就捣蛋! &8你的灵魂将归我所有!' + regionLeaveMessage: '&8[EM] &4你的灵魂完好无损,你成功逃脱了。' +invasion_minidungeon: + name: '&2入侵' + customInfo: + - '&f万圣节特供小地牢!' + - '&6制作者:MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + 难度: &6普通 + $bossCount个外星人,等级范围为$lowestTier-$highestTier + &6别被绑走了! + regionEnterMessage: '&8[EM] &7外星人入侵,快保护母舰!' + regionLeaveMessage: '&8[EM] &7你阻止了外星人入侵,但谁会信呢?' +north_pole_minidungeon: + name: '北极' + customInfo: + - '&f圣诞节特供地牢!' + - '&6制作者:MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + 难度:&6普通 + $bossCount个boss,等级范围为$lowestTier - $highestTier + &6在雪球里过圣诞节吧! + regionEnterMessage: '&8[EM] &7你到了北极!&f今年你调皮了吗?' + regionLeaveMessage: '&8[EM] &7下次再来参观吧,这里有很多糖果和点心!' +oasis_adventure: + name: '&6绿洲' + customInfo: + - '&f初学者的大型冒险!' + - '&6制作者:69OzCanOfBepis' + playerInfo: |- + 难度:&6单人也能过 + $bossCount个boss,等级范围为$lowestTier - $highestTier + &6初学者的大型冒险! + regionEnterMessage: '&8[EM] &6你抵达了绿洲!' + regionLeaveMessage: '&8[EM] &6你离开了绿洲!' +pirate_ship_minidungeon: + name: '&6海盗船' + customInfo: + - '&f有趣且富有挑战性的小地牢' + - '&f适合渐入佳境的玩家' + - '&f掠夺精英怪物的丰富资源' + - '&6制作者:MagmaGuy & Realm of Lotheridon' + playerInfo: |- + 难度:&6普通 + $bossCount个boss,等级范围为$lowestTier - $highestTier + &6对于&6雄心勃勃的冒险家来说,这是最好的狩猎场之一! + regionEnterMessage: '&8[EM] &3登上海盗船吧!&b尽情劫掠吧!' + regionLeaveMessage: '&8[EM] &3玩家已下船!&b等你赚够了船费再来吧!' +primis_adventure: + name: '&7普里米斯' + customInfo: + - '&f给新手的冒险教程!' + - '&6制作者:69OzCanOfBepis, MagmaGuy' + playerInfo: |- + 难度:&2简单 + $bossCount个Boss,等级范围为$lowestTier-$highestTier + &6给新手的冒险教程! + regionEnterMessage: '&8[EM] &6普里米斯等待着你横空出世!' + regionLeaveMessage: '&8[EM] &6你离开了普里米斯!' +sewers_minidungeon: + name: '&8下水道' + customInfo: + - '&f迄今为止最大的小地牢!' + - '&6制作者:MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + 难度:&6普通 + $bossCount个boss,等级范围为$lowestTier - $highestTier + &6充满挑战的复杂地牢迷宫! + regionEnterMessage: '&8[EM] &5这个地方看起来荒废已久……&d但这些下水道里却潜藏着一些宝贝!' + regionLeaveMessage: '&8[EM] &5你成功地回到了地面。&d也许下次再来的话你会被淹死。' +the_ruins: + name: '&6废墟' + customInfo: + - '&f对抗北欧神话的生物' + - '&f准备好决一死战吧!' + - '&6制作者:69OzCanOfBepis, MagmaGuy' + playerInfo: |- + 难度:&c困难 + $bossCount个$lowestTier级大Boss! + &c与北欧之神决一死战! + regionEnterMessage: '&8[EM] &3敢于挑战神之威严者,做好溃败的准备吧!' + regionLeaveMessage: '&8[EM] &3你现在知道了要怎样才能成为一个传奇人物!' +vampire_manor: + name: '&c吸血鬼庄园' + customInfo: + - '&f准备好血流成河吧!' + - '&6制作者:MagmaGuy, 69OzCanOfBepis' + playerInfo: |- + 难度:&6普通 + $bossCount个boss,等级范围为$lowestTier-$highestTier + &6充满嗜血生物的致命庄园! + &6准备好面对让黑暗躁动之物! + regionEnterMessage: '&8[EM] &c正在闯入危险地区!!' + regionLeaveMessage: '&8[EM] &c正在离开闹鬼之地!' +alpha_werewolf_p1: + name: '$eventBossLevel &7愤怒卫道士' + deathMessages: + - '&e&l---------------------------------------------' + - '&4狼人被干掉了!' + - '&c&l 输出第一名: $damager1name&c造成了$damager1damage点伤害!' + - '&6&l 输出第二名: $damager2name&6造成了$damager2damage点伤害!' + - '&e&l 输出第三名: $damager3name&e造成了$damager3damage点伤害!' + - '&a终结者: $players' + - '&e&l---------------------------------------------' + locationMessage: '&7愤怒卫道士: $distance格之外' + spawnMessage: '&c狼人觉醒了!' + deathMessage: '&a狼人被$players杀死了!' + escapeMessage: '&4黎明破晓,觉醒狼人消失了!' +alpha_werewolf_p2: + name: '$eventBossLevel &7觉醒狼人' + deathMessages: + - '&e&l---------------------------------------------' + - '&4觉醒狼人被干掉了!' + - '&c&l 输出第一名: $damager1name&c造成了$damager1damage点伤害!' + - '&6&l 输出第二名: $damager2name&6造成了$damager2damage点伤害!' + - '&e&l 输出第三名: $damager3name&e造成了$damager3damage点伤害!' + - '&a终结者:$players' + - '&e&l---------------------------------------------' + locationMessage: '&7觉醒狼人:$distance格之外' + spawnMessage: '&c觉醒狼人在嚎叫!' + deathMessage: '&a觉醒狼人被$players干掉了!' + escapeMessage: '&4黎明破晓,觉醒狼人消失了!' +ancient_corpse: + name: '$eventBossLevel &e古代尸体' +animated_armor: + name: '$eventBossLevel &8活化盔甲' + locationMessage: '&c活化盔甲:$distance格!' + spawnMessage: '&c哦不!活化盔甲逃离了盔甲架!' + deathMessage: '&a$players阻止了活化盔甲!' + escapeMessage: '&4活化盔甲消失了!' +arachnid_matriarch: + name: '$eventBossLevel &c蜘蛛之母' + locationMessage: '&c蜘蛛之母:$distance格!' + spawnMessage: '&c蜘蛛之母在大地上散播虫卵!' + deathMessage: '&a$players阻止了蜘蛛之母!' + escapeMessage: '&4蜘蛛之母离开了!' +arachnid_matriarch_summon: + name: '$eventBossLevel &4小蜘蛛' +armor_goblin: + name: '$eventBossLevel &3盔甲哥布林' + deathMessages: + - '&e&l---------------------------------------------' + - '&e盔甲哥布林被掠夺了!' + - '&c&l 输出第一名: $damager1name&c造成了$damager1damage点伤害!' + - '&6&l 输出第二名: $damager2name&6造成了$damager2damage点伤害!' + - '&e&l 输出第三名: $damager3name&e造成了$damager3damage点伤害!' + - '&a终结者:$players' + - '&e&l---------------------------------------------' + locationMessage: '&c盔甲哥布林: $distance格之外' + spawnMessage: '&c盔甲哥布林出现了!' + deathMessage: '&a盔甲哥布林被$players杀死了!' + escapeMessage: '&4盔甲哥布林逃脱了!' +baba_rhoga: + name: '$eventBossLevel &c芭芭罗加' + locationMessage: '&c芭芭罗加:$distance blocks格!' + spawnMessage: '&c邪恶巫婆出现了!' + deathMessage: '&a$players暂时让巫婆安息了。' + escapeMessage: '&4巫婆离开了!' +baba_rhoga_summon: + name: '$reinforcementLevel &c芭芭罗加' +baba_yaga: + name: '$eventBossLevel &c芭芭雅加' + locationMessage: '&c芭芭雅加:$distance blocks格!' + spawnMessage: '&c邪恶巫婆出现了!' + deathMessage: '&a$players暂时让巫婆安息了。' + escapeMessage: '&4巫婆离开了!' +baba_yaga_summon: + name: '$reinforcementLevel &c芭芭雅加' +balloon_rider: + name: '$eventBossLevel &d气球骑手' + locationMessage: '&c气球骑手:$distance格!' + spawnMessage: '&c一位勇敢的气球骑手来到了下界!' + deathMessage: '&a$players让气球骑手坐上了最后一程!' + escapeMessage: '&4气球骑手飘走了!' +balloon_rider_mount: + name: '$eventBossLevel &5恐怖的气球' +balrog: + name: '$eventBossLevel&4炎魔' +banshee: + name: '$eventBossLevel &c女妖' + locationMessage: '&c女妖:$distance blocks格!' + spawnMessage: '&c女妖发出了哀嚎!' + deathMessage: '&a$players让女妖闭嘴了!' + escapeMessage: '&4女妖离开了!' +banshee_summon: + name: '$eventBossLevel &c悲痛' +beast_master: + name: '$eventBossLevel &6野兽驯服者' + deathMessages: + - '&e&l---------------------------------------------' + - '&e野兽驯服者被残害了!' + - '&c&l 输出第一名: $damager1name&c造成了$damager1damage点伤害!' + - '&6&l 输出第二名: $damager2name&6造成了$damager2damage点伤害!' + - '&e&l 输出第三名: $damager3name&e造成了$damager3damage点伤害!' + - '&4终结者: $players' + - '&e&l---------------------------------------------' + locationMessage: '&c野兽驯服者: $distance格之外' + spawnMessage: '&c野兽驯服者出现了!' + deathMessage: '&a野兽驯服者被$players杀死了!' + escapeMessage: '&4野兽驯服者返回了荒野!' +beast_tamer: + name: '$eventBossLevel &e驯兽师' + locationMessage: '&c驯兽师:$distance格!' + spawnMessage: '&c一位驯兽师在漫游!' + deathMessage: '&a$players终结了驯兽师!' + escapeMessage: '&4驯兽师离开了!' +beast_tamer_summon: + name: '$eventBossLevel &6大型野兽' +beast_tamer_summon_1: + name: '$eventBossLevel &6野兽' +beta_wolf: + name: '$reinforcementLevel &7β' +bigfoot: + name: '$eventBossLevel &f大脚怪' + locationMessage: '&c大脚怪:$distance格!' + spawnMessage: '&c一个强大的野兽出现了!' + deathMessage: '&a$players杀死了野兽!' + escapeMessage: '&4野兽逃跑了!' +big_bad_wolf: + name: '$eventBossLevel &f大坏狼' + locationMessage: '&c大坏狼:$distance格!' + spawnMessage: '&c它在怒吼!' + deathMessage: '&a$players给三只小猪带来了安全!' + escapeMessage: '&4大坏狼离开了!' +binder_of_worlds_phase_1_endermite_reinforcement: + name: '$reinforcementLevel &5现实腐蚀者' +binder_of_worlds_phase_3_enderman_reinforcement: + name: '$reinforcementLevel &5现实杀手' +binder_of_worlds_phase_3_ghast_reinforcement: + name: '$reinforcementLevel &5现实粉碎者' +blayyze: + name: '$eventBossLevel&6烈焰之布莱泽' + deathMessages: + - '&e&l---------------------------------------------' + - '&4烈焰之布莱泽已被击退!' + - '&c&l 输出第一名: $damager1name&c造成了$damager1damage点伤害!' + - '&6&l 输出第二名: $damager2name&6造成了$damager2damage点伤害!' + - '&e&l 输出第三名: $damager3name&e造成了$damager3damage点伤害!' + - '&4终结者: $players' + - '&e&l---------------------------------------------' + locationMessage: '&6????: $distance格外' + spawnMessage: '&c有东西从陨石坑里涌出……' + deathMessage: '&6$players献上了第一滴血。' + escapeMessage: '&6外星人飞回了51区!' +bloated_jeffrey: + name: '$eventBossLevel &d膨胀的杰弗里' + locationMessage: '&c膨胀的杰弗里:$distance格!' + spawnMessage: '&c杰弗里在下界!带上弓箭!' + deathMessage: '&a$players杀死了膨胀的杰弗里!' + escapeMessage: '&4杰弗里和他的朋友感到无聊离开了!' +bloated_jeffrey_summon: + name: '$eventBossLevel &d杰弗里的朋友' +bone_fiend: + name: '$eventBossLevel &7骸骨朋友' + locationMessage: '&c骸骨恶魔:$distance blocks格!' + spawnMessage: '&c一个由骨头组成的生物出现了!' + deathMessage: '&a$players杀死了骸骨恶魔!' + escapeMessage: '&4骸骨恶魔找不到骨头离开了!' +bone_fiend_mount: + name: '$eventBossLevel &8骸骨运输者' +changeling: + name: '$eventBossLevel &4调换儿' + locationMessage: '&c调换儿:$distance blocks格!' + spawnMessage: '&c一个变形怪物进入了这个世界。' + deathMessage: '&a$players阻止了调换儿!' + escapeMessage: '&4调换儿逃跑了!' +changeling_p2: + name: '$eventBossLevel &4调换儿' +changeling_p3: + name: '$eventBossLevel &4调换儿' +changeling_p4: + name: '$eventBossLevel &4调换儿' +changeling_p5: + name: '$eventBossLevel &4调换儿' +changeling_p6: + name: '$eventBossLevel &4调换儿' +changeling_p7: + name: '$eventBossLevel &4调换儿' +charms_goblin: + name: '$eventBossLevel &2护符哥布林' + deathMessages: + - '&e&l---------------------------------------------' + - '&e护符哥布林被掠夺了!' + - '&c&l 输出第一名: $damager1name&c造成了$damager1damage点伤害!' + - '&6&l 输出第二名: $damager2name&6造成了$damager2damage点伤害!' + - '&e&l 输出第三名: $damager3name&e造成了$damager3damage点伤害!' + - '&a终结者:$players' + - '&e&l---------------------------------------------' + locationMessage: '&c护符哥布林:$distance格之外' + spawnMessage: '&c护符哥布林出现了!' + deathMessage: '&a护符哥布林被$players杀死了!' + escapeMessage: '&4护符哥布林逃脱了!' +circus_ringmaster: + name: '$eventBossLevel &4马戏团领班' + locationMessage: '&c马戏团领班:$distance格!' + spawnMessage: '&c镇里出现了可怕的马戏团!' + deathMessage: '&a$players阻止了马戏团领班滥用权力!' + escapeMessage: '&4马戏团离开了城镇!' +circus_ringmaster_summon: + name: '$eventBossLevel &8被虐待的动物' +circus_ringmaster_summon_1: + name: '$eventBossLevel &5被虐待的小丑' +circus_ringmaster_summon_2: + name: '$eventBossLevel &5被虐待的气球' +coins_goblin: + name: '$eventBossLevel &e金币哥布林' + deathMessages: + - '&e&l---------------------------------------------' + - '&e金币哥布林被杀死了!' + - '&c&l 输出第一名: $damager1name&c造成了$damager1damage点伤害!' + - '&6&l 输出第二名: $damager2name&6造成了$damager2damage点伤害!' + - '&e&l 输出第三名: $damager3name&e造成了$damager3damage点伤害!' + - '&4终结者: $players' + - '&e&l---------------------------------------------' + locationMessage: '&c金币哥布林: $distance格之外' + spawnMessage: '&c金币哥布林出现了!' + deathMessage: '&a金币哥布林被$players杀死了!' + escapeMessage: '&4金币哥布林逃脱了!' +craftenmine_stacked_bones: + name: '$eventBossLevel &8武装头骨' + locationMessage: '&c卡夫特麦博士的骨堆:$distance格!' + spawnMessage: '&c卡夫特麦博士的恐怖造物出现在荒野!' + deathMessage: '&a$players杀死了恐怖的骨堆造物!' + escapeMessage: '&4卡夫特麦博士的恐怖造物已逃脱!' +craftenmine_stacked_bones_ankle: + name: '$eventBossLevel &8武装脚踝' +craftenmine_stacked_bones_backbone: + name: '$eventBossLevel &8武装脊骨' +craftenmine_stacked_bones_femur: + name: '$eventBossLevel &8武装股骨' +craftenmine_stacked_bones_spine: + name: '$eventBossLevel &8武装脊柱' +craftenmine_terror: + name: '$eventBossLevel &c无脑恶魂' + locationMessage: '&c卡夫特麦博士的恐怖造物:$distance格!' + spawnMessage: '&c卡夫特麦博士的造物在游荡!' + deathMessage: '&a$players杀死了无脑恶魂!' + escapeMessage: '&4无脑恶魂离开了!' +craftenmine_terror_mount: + name: '$eventBossLevel &8恶魂运输者' +creeperpede_1: + name: '$eventBossLevel &5嵌合苦力怕观察者' + locationMessage: '&c嵌合苦力怕: $distance格!' + spawnMessage: '&c卡夫特麦博士的实验体在游荡!' + deathMessage: '&a嵌合苦力怕被$players杀死了' + escapeMessage: '&c卡夫特麦博士的实验体逃脱了!' +creeperpede_2: + name: '$eventBossLevel &5嵌合苦力怕骑士' +creeperpede_3: + name: '$eventBossLevel &5嵌合苦力怕骑士' +creeperpede_4: + name: '$eventBossLevel &5嵌合苦力怕骑士' +creeperpede_5: + name: '$eventBossLevel &5嵌合苦力怕运输者' +crone: + name: '$eventBossLevel &a老太婆' + locationMessage: '&c老太婆: $distance格!' + spawnMessage: '&c老太婆踏入了这个世界!' + deathMessage: '&a$players赶走了老太婆!' + escapeMessage: '&4老太婆骑上她的扫帚飞走了!' +crone_summon: + name: '$eventBossLevel &f宠物蜘蛛' +divine_cinder: + name: '$eventBossLevel &c神圣灰烬' + locationMessage: '&c神圣灰烬: $distance格!' + spawnMessage: '&c神圣灰烬出现了!' + deathMessage: '&a神圣灰烬被$players击败了!' + escapeMessage: '&4神圣灰烬消散了!' +ember: + name: '$reinforcementLevel &c余烬' +enders_1: + name: '$eventBossLevel &d末影人' + locationMessage: '&c末影军团:$distance格!' + spawnMessage: '&c末影军团出现了!' + deathMessage: '&a$players阻止了末影军团!' + escapeMessage: '&4末影军团离开了!' +enders_2: + name: '$eventBossLevel &d末影人' + locationMessage: '&c军团成员:$distance格!' +enders_3: + name: '$eventBossLevel &d末影人' + locationMessage: '&c军团成员:$distance格!' +ender_lapin: + name: '$eventBossLevel &a末影兔' +endless_pursuer: + name: '$eventBossLevel &d无尽追逐者' + locationMessage: '&c无尽追逐者:$distance格!' + spawnMessage: '&c它永远不会停下追逐……' + deathMessage: '&a$players停止了它的追逐!' + escapeMessage: '&4追逐者消失了!' +enraged_snowman: + name: '$eventBossLevel &1愤怒雪人' + locationMessage: '&7愤怒雪人:$distance格!' + spawnMessage: '&c愤怒的雪人出现了!' + deathMessage: '&a$players抑制了雪人的怒火!' + escapeMessage: '&4愤怒雪人消失了!' +evil_undead: + name: '$eventBossLevel &c邪恶亡灵' + locationMessage: '&c邪恶亡灵:$distance格!' + spawnMessage: '&c邪恶亡灵出现了!' + deathMessage: '&a$players终结了邪恶亡灵!' + escapeMessage: '&4邪恶亡灵逃跑了!' +evil_undead_p2: + name: '$eventBossLevel &c邪恶亡灵' + locationMessage: '&c邪恶亡灵:$distance格!' + spawnMessage: '&c邪恶亡灵出现了!' + deathMessage: '&a$players终结了邪恶亡灵!' + escapeMessage: '&4邪恶亡灵逃离了!' +fallen_knight: + name: '$eventBossLevel &7堕落骑士' + locationMessage: '&c堕落骑士: $distance格!' + spawnMessage: '&c堕落骑士从坟墓中爬起!' + deathMessage: '&a堕落骑士折服于$players!' + escapeMessage: '&4堕落骑士归于长眠!' +fine_swine: + name: '$eventBossLevel &e精美的猪' +fine_swine_summon: + name: '$eventBossLevel &e强大的守护者' +firestarter: + name: '$eventBossLevel &6纵火者' + locationMessage: '&c纵火者: $distance格!' + spawnMessage: '&c邪恶的纵火者出现了!' + deathMessage: '&a纵火者被$players杀死了!' + escapeMessage: '&4纵火者离开了!' +firestarter_mount: + name: '$eventBossLevel &6火花' +fire_conjurer: + name: '$eventBossLevel &e火术师' + locationMessage: '&c火术师: $distance格!' + spawnMessage: '&c火术师踏入了这个世界!' + deathMessage: '&a火术师被$players熄灭了!' + escapeMessage: '&4火术师消失了!' +fire_conjurer_summon: + name: '$eventBossLevel &6火焰召唤物' +fire_fae: + name: '$eventBossLevel &c烈焰恼鬼' +foreign_visitor: + name: '$eventBossLevel &5外来访客' + locationMessage: '&c外来访客:$distance格!' + spawnMessage: '&c一名来自其他维度的访客到临了!' + deathMessage: '&a$players让访客知道了这里不欢迎他们。' + escapeMessage: '&4访客回家了!' +fox_king_cold: + name: '$eventBossLevel &1寒冷狐王' + locationMessage: '&c寒冷狐王:$distance格!' + spawnMessage: '&c一个魔法生物出现在这个世界。' + deathMessage: '&a寒冷狐王被$players击败了!' + escapeMessage: '&4寒冷狐王离开了这个世界。' +frost_palace_frost_queen_p0: + name: '$bossLevel &8冰雪女王' + locationMessage: '&9冰雪女王' + spawnMessage: '&9狂风怒吼,冰雪女王应对你的挑战。' + deathMessage: '&a$players杀死了冰雪女王!' +frost_palace_frost_queen_p1: + name: '$bossLevel &8冰雪女王阶段1' + locationMessage: '&9冰雪女王阶段1' +frost_palace_frost_queen_p2: + name: '$bossLevel &8冰雪女王阶段2' + locationMessage: '&9冰雪女王阶段2' +frost_palace_frost_queen_p3: + name: '$bossLevel &8冰雪女王阶段3' + locationMessage: '&9冰雪女王阶段3' +frost_palace_frost_queen_p4: + name: '$bossLevel &8冰雪女王阶段4' + locationMessage: '&9冰雪女王阶段4' +frost_palace_frost_queen_p5: + name: '$bossLevel &8冰雪女王阶段5' + locationMessage: '&9冰雪女王阶段5' +frost_palace_frost_queen_p6: + name: '$bossLevel &8冰雪女王阶段6' + locationMessage: '&9冰雪女王阶段6' +frost_palace_frost_queen_p7: + name: '$bossLevel &8冰雪女王阶段7' + deathMessages: + - '&e&l---------------------------------------------' + - '&e冰雪女王融化了!' + - '&c&l 输出第一名:$damager1name&c造成了$damager1damage点伤害!' + - '&6&l 输出第二名:$damager2name&6造成了$damager2damage点伤害' + - '&e&l 输出第三名:$damager3name &e造成了$damager3damage点伤害 !' + - '&a终结者:$players' + - '&e&l---------------------------------------------' + locationMessage: '&9冰雪女王阶段7' +frost_palace_reinforcement_1: + name: '$reinforcementLevel 冬之魂' +frost_palace_reinforcement_2: + name: '$reinforcementLevel 春之魂' +frost_palace_reinforcement_3: + name: '$reinforcementLevel 夏之魂' +fulgora: + name: '$eventBossLevel &3雷电女神' + locationMessage: '&c雷电女神:$distance格!' + spawnMessage: '&c强大的雷神出现了!' + deathMessage: '&a雷电女神被$players阻止了!' + escapeMessage: '&4雷电女神离开了!' +gamma_werewolf: + name: '$reinforcementLevel &7γ' +goblin_invader: + name: '$eventBossLevel &2哥布林队长' + locationMessage: '&c哥布林军团:$distance格!' + spawnMessage: '&c哥布林军团入侵了!' + deathMessage: '&a哥布林军团被$players消灭了!' + escapeMessage: '&4哥布林军团离开了!' +goblin_invader_summon_1: + name: '&2哥布林战士' +goblin_invader_summon_2: + name: '&2哥布林斗士' +goblin_invader_summon_3: + name: '&2哥布林骑兵' +goblin_invader_summon_4: + name: '&2哥布林援军' +greedy_dwarf: + name: '$eventBossLevel &9贪婪的矮人' + locationMessage: '&c贪婪的矮人: $distance格!' + spawnMessage: '&c你能找到在地下挖掘的贪婪矮人吗?!' + deathMessage: '&a$players解除了贪婪矮人的诅咒!' + escapeMessage: '&4贪婪的矮人找到了财宝离开了!' +gremlin_1: + name: '$eventBossLevel &e小鬼' + locationMessage: '&c小鬼: $distance格!' + spawnMessage: '&c小鬼入侵了这个世界!' + escapeMessage: '&4小鬼消失了!' +gremlin_10: + name: '$eventBossLevel &e小鬼' + locationMessage: '&c小鬼: $distance格!' + escapeMessage: '&4小鬼消失了!' +gremlin_2: + name: '$eventBossLevel &e小鬼' + locationMessage: '&c小鬼: $distance格!' + escapeMessage: '&4小鬼消失了!' +gremlin_3: + name: '$eventBossLevel &e小鬼' + locationMessage: '&c小鬼: $distance格!' + escapeMessage: '&4小鬼消失了!' +gremlin_4: + name: '$eventBossLevel &e小鬼' + locationMessage: '&c小鬼: $distance格!' + escapeMessage: '&4小鬼消失了!' +gremlin_5: + name: '$eventBossLevel &e小鬼' + locationMessage: '&c小鬼: $distance格!' + escapeMessage: '&4小鬼消失了!' +gremlin_6: + name: '$eventBossLevel &e小鬼' + locationMessage: '&c小鬼: $distance格!' + escapeMessage: '&4小鬼消失了!' +gremlin_7: + name: '$eventBossLevel &e小鬼' + locationMessage: '&c小鬼: $distance格!' + escapeMessage: '&4小鬼消失了!' +gremlin_8: + name: '$eventBossLevel &e小鬼' + locationMessage: '&c小鬼: $distance格!' + escapeMessage: '&4小鬼消失了!' +gremlin_9: + name: '$eventBossLevel &e小鬼' + locationMessage: '&c小鬼: $distance格!' + escapeMessage: '&4小鬼消失了!' +grunter: + name: '$eventBossLevel &a猪哼者' + locationMessage: '&c猪哼者: $distance格!' + spawnMessage: '&c一头强大的野猪在地上游荡。' + deathMessage: '&a猪哼者被$players阻止了!' + escapeMessage: '&4猪哼者逃离了!' +harmless_chicken: + name: '$eventBossLevel &f无害的小鸡' + locationMessage: '&c无害的小鸡: $distance格!' + spawnMessage: '&c喔喔喔!!咯咯咯!' + deathMessage: '&a咯咯咯!$players!' + escapeMessage: '&4无害的小鸡离开了。' +harmless_chicken_summon: + name: '$eventBossLevel &f侦察鸡' +hog_rider: + name: '$eventBossLevel &6野猪骑士' + locationMessage: '&c野猪骑士: $distance格!' + spawnMessage: '&c强大的野猪骑士出现了!' + deathMessage: '&a野猪骑士及其野猪被$players消灭了!' + escapeMessage: '&4野猪骑士消失了。' +hog_rider_mount: + name: '$eventBossLevel &e皇家野猪' +hog_rider_p2: + name: '$eventBossLevel &6野猪骑士' + locationMessage: '&c野猪骑士: $distance格!' + deathMessage: '&a野猪骑士及其野猪被$players消灭了!' + escapeMessage: '&4野猪骑士消失了。' +hog_rider_summon: + name: '$eventBossLevel &e皇家野猪' +horde_champion: + name: '$eventBossLevel &c部队冠军' + locationMessage: '&c亡灵部队冠军: $distance格!' + spawnMessage: '&c亡灵军团接近了!' + deathMessage: '&ahorde has been stopped by $players!.' + escapeMessage: '&4Aundead horde离开了!' +horrid_duplicator: + name: '$eventBossLevel &d恐怖复制者' + locationMessage: '&cHorrid Duplicator: $distance格!' + spawnMessage: '&cAn endless foe出现了!' + deathMessage: '&aHorrid Duplicator被$players杀死了!' + escapeMessage: '&4Horrid Duplicator离开了!' +horrid_duplicator_summon: + name: '$eventBossLevel &d恐怖复制者' +horrid_duplicator_summon_1: + name: '$eventBossLevel &d恐怖复制者' +ice_fae: + name: '$eventBossLevel &b寒冰恼鬼' +imperial_bee_guard: + name: '$reinforcementLevel &e帝国蜜蜂兵' +invasion_abducted_hoglin_leader: + name: '$normalLevel &8被绑架的疣猪兽队长' +invasion_abducted_pillager_leader: + name: '$normalLevel &8被绑架的掠夺者队长' +invasion_abducted_silverfish: + name: '$normalLevel &8被绑架的蠹虫' +invasion_abducted_silverfish_leader: + name: '$normalLevel &8被绑架的蠹虫' +invasion_abducted_zombie: + name: '$normalLevel &8被绑架的僵尸' +invasion_abducted_zombie_leader: + name: '$normalLevel &8被绑架的僵尸' +invasion_abductor: + name: '$normalLevel &6绑架者' +invasion_abudcted_pillager: + name: '$normalLevel &8被绑架的掠夺者' +invasion_analytic_thin_man_1: + name: '$normalLevel &8善于分析的瘦外星人' +invasion_analytic_thin_man_2: + name: '$normalLevel &8善于分析的瘦外星人' +invasion_analytic_thin_man_3: + name: '$normalLevel &8善于分析的瘦外星人' +invasion_analytic_thin_man_4: + name: '$normalLevel &8善于分析的瘦外星人' +invasion_ballistic_construct: + name: '$minibossLevel &f防弹构造物' +invasion_convert: + name: '$normalLevel &6转换' +invasion_energy_construct: + name: '$minibossLevel &f能量构造物' +invasion_fire_construct: + name: '$minibossLevel &f火焰构造物' +invasion_genetically_modified_cow_phase_1: + name: '$minibossLevel &f转基因牛' +invasion_genetically_modified_cow_phase_2: + name: '$minibossLevel &f转基因牛' +invasion_gray_man_courthouse_phase_1: + name: '$minibossLevel &7灰外星人' +invasion_gray_man_courthouse_phase_2: + name: '$minibossLevel &7灰外星人' +invasion_green_man_hotel_phase_1: + name: '$bossLevel &2绿外星人' +invasion_green_man_hotel_phase_2: + name: '$bossLevel &2绿外星人' +invasion_green_man_hotel_phase_3: + name: '$bossLevel &2绿外星人' + deathMessage: '&4&2绿外星人 &4被$players歼灭了!该版本到此结束,欲探索UFO内部,请购买完整版!' +invasion_green_man_spaceship_phase_1: + name: '$bossLevel &2绿外星人' +invasion_green_man_spaceship_phase_2: + name: '$bossLevel &2绿外星人' +invasion_green_man_spaceship_phase_3: + name: '$bossLevel &2绿外星人' +invasion_green_man_spaceship_phase_4: + name: '$bossLevel &2绿外星人' + deathMessages: + - '&e&l---------------------------------------------' + - '&2外星人的威胁已不复存在!' + - '&c&l 输出第一名: $damager1name&c造成了$damager1damage点伤害!' + - '&6&l 输出第二名: $damager2name&6造成了$damager2damage点伤害!' + - '&e&l 输出第三名: $damager3name&e造成了$damager3damage点伤害!' + - '&a终结者: $players' + - '&e&l---------------------------------------------' +invasion_ice_construct: + name: '$minibossLevel &f寒冰构造物' +invasion_merman: + name: '$normalLevel &6人鱼' +invasion_merman_leader: + name: '$normalLevel &6人鱼队长' +invasion_otherwordly_ember: + name: '$normalLevel &6O异界余烬' +invasion_psychic_apparition: + name: '$normalLevel &5通灵幻象' +invasion_psychic_clone: + name: '$reinforcementLevel &6通灵克隆体' +invasion_psychic_explosion: + name: '$reinforcementLevel &5通灵爆炸物' +invasion_psychic_summon_gold_boots: + name: '$reinforcementLevel &5通灵幻象' +invasion_psychic_summon_gold_pants: + name: '$reinforcementLevel &5通灵幻象' +invasion_psychic_summon_leather_hat: + name: '$reinforcementLevel &5通灵幻象' +invasion_shrieking_shulker: + name: '$normalLevel &8尖叫潜影贝' +invasion_thin_man: + name: '$normalLevel &8瘦外星人' +killer_rabbit_of_caerbannog: + name: '$eventBossLevel &cCaerbannog的杀手兔' +kraken: + name: '$eventBossLevel &3「深海巨妖」克拉肯' +krampus: + name: '$eventBossLevel &1坎普斯' + locationMessage: '&c坎普斯: $distance格!' + spawnMessage: '&c坎普斯前来惩罚淘气鬼!' + deathMessage: '&a坎普斯被$players送回了自己的领域!' + escapeMessage: '&4没人受到惩罚!' +large_hopper: + name: '$eventBossLevel &d大型跳跃者' + locationMessage: '&c大型跳跃者: $distance格!' + spawnMessage: '&c一只大型野兽在附近蹦跳!' + deathMessage: '&a$players终结了大型跳跃者!' + escapeMessage: '&4大型跳跃者跳出了这个世界!' +large_hopper_mount: + name: '$eventBossLevel &a跳跃者' +lightning_fae: + name: '$eventBossLevel &e雷霆恼鬼' +living_shadow: + name: '$eventBossLevel &7暗影' + locationMessage: '&c暗影: $distance格!' + spawnMessage: '&c暗影出现了!不要直视它!' + deathMessage: '&a$players让暗影归于死寂!' + escapeMessage: '&4暗影离开了!' +meme_boss: + name: '&2大师' +meme_boss_reinforcement: + name: '&c追随者' +merman: + name: '$eventBossLevel &1人鱼' + locationMessage: '&c人鱼: $distance格!' + spawnMessage: '&c人鱼在海洋里遨游!' + deathMessage: '&a$players杀死了人鱼!' + escapeMessage: '&4人鱼离开了。' +monster_of_the_deep: + name: '$eventBossLevel &b深海怪物' + locationMessage: '&c深海怪物: $distance格!' + spawnMessage: '&c恐怖的生物在海洋里遨游!' + deathMessage: '&a深海怪物被$players杀死了!' + escapeMessage: '&4海洋再次归于平静!' +moon_spider: + name: '$eventBossLevel &f月球蜘蛛' + locationMessage: '&c月球蜘蛛: $distance格!' + spawnMessage: '&c强大的蜘蛛出现了!' + deathMessage: '&a月球蜘蛛被$players杀死了!' + escapeMessage: '&4月球蜘蛛离开了。' +moon_spider_summon: + name: '&f织丝者' +necromancer: + name: '$eventBossLevel &7死灵法师' + locationMessage: '&c死灵法师: $distance格!' + spawnMessage: '&c强大的邪恶死灵法师进入了这个世界!' + deathMessage: '&a$players解决了死灵法师!' + escapeMessage: '&4死灵法师消失了。' +necromancer_summon_1: + name: '$eventBossLevel &f烈焰骷髅' +necromancer_summon_2: + name: '$eventBossLevel &b冰冻骷髅' +necromancer_summon_3: + name: '$eventBossLevel &8烧焦骷髅' +necronomicon_skeleton: + name: '$reinforcementLevel &7唤灵骷髅' +necronomicon_zombie: + name: '$reinforcementLevel &7唤灵僵尸' +netherite_golem: + name: '$eventBossLevel &8下界合金傀儡' + locationMessage: '&c下界合金傀儡: $distance格!' + spawnMessage: '&c古代傀儡进入了这个世界!' + deathMessage: '&a下界合金傀儡被$players杀死了!' + escapeMessage: '&4下界合金傀儡离开了这个世界!' +nether_escapee: + name: '$eventBossLevel &6下界逃犯' + locationMessage: '&c下界逃犯: $distance格!' + spawnMessage: '&c可怕的强敌逃离了下界!' + deathMessage: '&a下界逃犯被$players送回了下界!' + escapeMessage: '&4下界逃犯离开了这片地方!' +nether_hag: + name: '$eventBossLevel &4下界巫婆' + locationMessage: '&c下界巫婆: $distance格!' + spawnMessage: '&c邪恶的巫婆步入了下界!' + deathMessage: '&a下界巫婆被被$players杀死了!' + escapeMessage: '&4下界巫婆消失了!' +nether_wasp: + name: '$eventBossLevel &6下界黄蜂' + locationMessage: '&c下界黄蜂: $distance格!' + spawnMessage: '&c黄蜂在下界漫游,小心蜇伤!' + deathMessage: '&a下界黄蜂被$players杀死了!' + escapeMessage: '&4下界黄蜂飞走了!' +nether_wasp_summon_1: + name: '$eventBossLevel &c蜂巢召唤者' +nether_wasp_summon_2: + name: '$eventBossLevel &c蜂巢黄蜂' +nightwing: + name: '$eventBossLevel &c夜翼' + locationMessage: '&c夜翼: $distance格!' + spawnMessage: '&c黑夜之鸟出现了!' + deathMessage: '&a夜翼被$players杀死了!' + escapeMessage: '&4夜翼飞回家了。' +nightwing_summon: + name: '$eventBossLevel &c智能炸弹' +nightwing_summon_1: + name: '$eventBossLevel &c誓言守护者' +night_crawler: + name: '$eventBossLevel &4黑夜爬虫' + locationMessage: '&c黑夜爬虫: $distance格!' + spawnMessage: '&c有个可怕的东西在到处爬动!' + deathMessage: '&a黑夜爬虫被$players杀死了!' + escapeMessage: '&4黑夜爬虫离开了!' +night_horder: + name: '$eventBossLevel &a夜间藏宝者' + locationMessage: '&c夜间藏宝者: $distance格!' + spawnMessage: '&c夜间藏宝者出现了!去掠夺它的战利品吧!' + deathMessage: '&a夜间藏宝者被$players掠夺了!' + escapeMessage: '&4夜间藏宝者逃脱了!' +oasis_10_old_bones: + name: '$normalLevel &f老骨头' +oasis_10_surreptitious_scribe: + name: '$minibossLevel &7诡秘女巫' +oasis_12_entombed_tenant: + name: '$normalLevel &7被埋葬的居民' +oasis_12_entombed_tenant_p2: + name: '$normalLevel &7被埋葬的居民' +oasis_12_sinister_siren: + name: '$minibossLevel &5邪恶海妖' +oasis_14_gnarly_grimace: + name: '$normalLevel &8扭曲面容' +oasis_14_undead_drifter: + name: '$normalLevel &1亡灵漂流者' +oasis_16_lesser_sentinel: + name: '$normalLevel &9小哨卫' +oasis_16_magical_magus: + name: '$normalLevel &3魔法术士' +oasis_16_rancid_roamer: + name: '$normalLevel &8腐臭漫游者' +oasis_18_sly_sharpshooter: + name: '$normalLevel &e狡猾的神射手' +oasis_18_stout_thaumaturge: + name: '$normalLevel &5顽强的奇术师' +oasis_18_tricky_treasure_hoarder: + name: '$normalLevel &d狡猾的藏宝者' +oasis_20_scheming_scribe: + name: '$minibossLevel &7阴险女巫' +oasis_20_septic_scribe: + name: '$minibossLevel &7腐烂女巫' +oasis_20_vampiric_sorcerer: + name: '$bossLevel &c吸血术士' +oasis_20_wrapped_wraith: + name: '$normalLevel &8缠绕巫师' +oasis_20_wrapped_wraith_p2: + name: '$normalLevel &8缠绕巫师' +oasis_25_vampiric_warlock: + name: '$bossLevel &4吸血巫师' +oasis_25_warlocks_spirit_summon: + name: '$reinforcementLevel &c巫师之魂' +oasis_26_adept_sentinel: + name: '$normalLevel &1熟练的哨卫' +oasis_26_grim_grovetender: + name: '$normalLevel &a森林守护者' +oasis_26_precarious_sniper: + name: '$normalLevel &3危险的狙击手' +oasis_26_superior_sharpshooter: + name: '$normalLevel &3高级神射手' +oasis_28_perilous_prophet: + name: '$normalLevel &3危险的先知' +oasis_28_treacherous_treasure_hoarder: + name: '$normalLevel &d奸诈的藏宝者' +oasis_2_haunted_hauler: + name: '$normalLevel &9困扰的搬运工' +oasis_30_forsaken_soul: + name: '$reinforcementLevel &0遗弃之魂' +oasis_30_lost_soul: + name: '$normalLevel 失落之魂' +oasis_30_parlous_preist: + name: '$minibossLevel &b危险的牧师' +oasis_30_seeker_of_the_staid: + name: '$normalLevel &c沉稳的探索者' +oasis_30_wimpy_louse: + name: '$reinforcementLevel &8恶心的寄生虫' +oasis_32_loathing_louse: + name: '$normalLevel &8恶心的寄生虫' +oasis_32_skeletal_sniper: + name: '$normalLevel &9骷髅狙击手' +oasis_34_grizly_grimace: + name: '$normalLevel &8狰狞的面孔' +oasis_34_gruesome_grimace: + name: '$normalLevel &8可怕面容' +oasis_35_ice_eidolon: + name: '$reinforcementLevel &9寒冰幻象' +oasis_35_light_of_darkness: + name: '$bossLevel &9黑暗之光' +oasis_36_cruel_cultist: + name: '$normalLevel &3残忍的邪教徒' +oasis_36_cultists_cretins: + name: '$reinforcementLevel &3残忍的邪教徒' +oasis_36_cultists_cretins_drowned: + name: '$reinforcementLevel &3残忍的邪教徒' +oasis_36_dexterous_sentinel: + name: '$normalLevel &9敏捷的哨卫' +oasis_36_grudging_grovetender: + name: '$normalLevel &a吝啬的树妖' +oasis_36_parlous_sniper: + name: '$normalLevel &3狡诈的狙击手' +oasis_36_rueful_roamer: + name: '$normalLevel &8悲伤的漫游者' +oasis_36_spectral_magus: + name: '$normalLevel &3幽灵术士' +oasis_38_poisonous_perch: + name: '$normalLevel &3毒鱼' +oasis_38_traitorous_treasure_hoarder: + name: '$normalLevel &d叛逆的藏宝者' +oasis_40_chief_cultist: + name: '$minibossLevel &5邪教教主' +oasis_40_louse_lord: + name: '$minibossLevel &8寄生虫之主' +oasis_40_pharaohs_scribe: + name: '$minibossLevel &7法老的文士' +oasis_40_skeletal_stiff: + name: '$normalLevel &9僵硬骷髅' +oasis_40_soaked_sacrifice: + name: '$reinforcementLevel &1浸泡的祭品' +oasis_40_solar_flare: + name: '$reinforcementLevel &e耀斑' +oasis_42_hexed_hauler: + name: '$normalLevel &9邪咒术士' +oasis_42_skeletal_sharpshooter: + name: '$normalLevel &9骷髅神射手' +oasis_42_tyranical_treasure_hoarder: + name: '$normalLevel &d残暴藏宝者' +oasis_42_tyranical_treasure_hoarder_phase_2: + name: '$normalLevel &d残暴藏宝者' +oasis_45_golden_cast_autonomation: + name: '$reinforcementLevel &6金铸自动怪' +oasis_45_monumental_monstrosity: + name: '$bossLevel &b巨型畸胎' +oasis_45_monumental_monstrosity_phase_2: + name: '$bossLevel &b巨型畸胎' +oasis_45_monumental_monstrosity_phase_3: + name: '$bossLevel &6巨型畸胎' +oasis_45_monumental_monstrosity_phase_4: + name: '$bossLevel &b巨型畸胎' +oasis_45_oracle_of_knowledge: + name: '$bossLevel &0知识神使' +oasis_45_shadow_of_knowledge_summon: + name: '$reinforcementLevel &8知识阴影' +oasis_45_the_beacon: + name: '$minibossLevel &6引路者' +oasis_45_the_beacon_phase_2: + name: '$minibossLevel &6引路者' +oasis_45_the_beacon_phase_3: + name: '$minibossLevel &6引路者' +oasis_45_the_beacon_phase_4: + name: '$minibossLevel &6引路者' +oasis_46_pharaohs_sentinel: + name: '$normalLevel &9法老哨卫' +oasis_4_cursed_desert_dweller: + name: '$normalLevel &e诅咒沙漠居民' +oasis_4_grotesque_grimace: + name: '$normalLevel &8丑陋面容' +oasis_4_swamp_rat: + name: '$normalLevel &6沼泽老鼠' +oasis_50_moneychanger_arrow: + name: '$minibossLevel &6货币兑换商' +oasis_50_moneychanger_arrow_phase_2: + name: '$minibossLevel &6货币兑换商' +oasis_50_moneychanger_blindness: + name: '$minibossLevel &6货币兑换商' +oasis_50_moneychanger_blindness_phase_2: + name: '$minibossLevel &6货币兑换商' +oasis_50_moneychanger_fire: + name: '$minibossLevel &6货币兑换商' +oasis_50_moneychanger_fire_phase_2: + name: '$minibossLevel &6货币兑换商' +oasis_50_moneychanger_freeze: + name: '$minibossLevel &6货币兑换商' +oasis_50_moneychanger_freeze_phase_2: + name: '$minibossLevel &6货币兑换商' +oasis_50_moneychanger_knockback: + name: '$minibossLevel &6货币兑换商' +oasis_50_moneychanger_knockback_phase_2: + name: '$minibossLevel &6货币兑换商' +oasis_50_moneychanger_poison: + name: '$minibossLevel &6货币兑换商' +oasis_50_moneychanger_poison_phase_2: + name: '$minibossLevel &6货币兑换商' +oasis_50_moneychanger_wither: + name: '$minibossLevel &6货币兑换商' +oasis_50_moneychanger_wither_phase_2: + name: '$minibossLevel &6货币兑换商' +oasis_50_pharaohs_royal_guard: + name: '$reinforcementLevel &8法老近卫' +oasis_50_the_foundry: + name: '$bossLevel &6铸造者' +oasis_50_the_foundry_phase_2: + name: '$bossLevel &6铸造者' +oasis_55_pharaoh_of_pestilence: + name: '$bossLevel &0瘟疫法老' +oasis_6_dry_bones: + name: '$normalLevel &f干骨头' +oasis_6_rotten_roamer: + name: '$normalLevel &8腐烂漫游者' +oasis_8_mythical_magus: + name: '$normalLevel &3神秘术士' +oasis_8_tough_thaumaturge: + name: '$normalLevel &5难缠的奇术师' +oasis_8_troublesome_treasure_hoarder: + name: '$normalLevel &d恼人的藏宝者' +okami: + name: '$eventBossLevel &c狼神' + locationMessage: '&c狼神: $distance格!' + spawnMessage: '&c狼神觉醒了!' + deathMessage: '&a$players战胜了狼神!' + escapeMessage: '&4狼神离开了!' +okami_p2: + name: '$eventBossLevel &c狼神' +okami_p3: + name: '$eventBossLevel &c狼神' +omega_wolf: + name: '$reinforcementLevel &7终焉之狼' +pillager_caravan_beast: + name: '$reinforcementLevel &c巡逻队野兽' +pillager_caravan_guard: + name: '$reinforcementLevel &c巡逻队守卫' +pillager_caravan_leader: + name: '$eventBossLevel &c巡逻队掠夺队长' + locationMessage: '&c掠夺者巡逻队:$distance格之外' + spawnMessage: '&c掠夺者巡逻队出现了!' +primis_acolyte_brute: + name: '$normalLevel &b侍从蛮兵' +primis_acolyte_forest_brute: + name: '$normalLevel &b精灵强盗蛮兵' +primis_acolyte_forest_brute_with_watch: + name: '$normalLevel &b精灵强盗蛮兵' +primis_acolyte_forest_sharpshooter: + name: '$normalLevel &b精灵强盗弓弩手' +primis_acolyte_forest_summoner: + name: '$normalLevel &b精灵强盗召唤师' +primis_acolyte_forest_summoner_heirloom_guardian: + name: '$normalLevel &b精灵强盗法师' +primis_acolyte_guard_1: + name: '$normalLevel &b侍从守卫' + onDamagedMessages: + - 你无法进入! + - 法师阻止你这么做! + - 离开这! + - 法师保护了这片地方! + - 愚蠢! + - 走开! + deathMessage: '[侍从守卫] 你对真理视而不见,高塔法师洞察了这一切!' +primis_acolyte_guard_2: + name: '$normalLevel &b侍从守卫' + onDamagedMessages: + - 你无法进入! + - 法师阻止你这么做! + - 离开这! + - 法师保护了这片地方! + - 愚蠢! + - 走开! + deathMessage: '[侍从守卫] 你不能通过,高塔法师不会让你进去的!' +primis_acolyte_sharpshooter: + name: '$normalLevel &b侍从弓弩手' +primis_aggressive_llama: + name: '$normalLevel &6凶猛的羊驼' +primis_angry_goat: + name: '$normalLevel &6愤怒的山羊' +primis_beta_feral_wolf: + name: '$reinforcementLevel &8β野狼' +primis_blood_temple_blood_golem: + name: '$normalLevel &c血傀儡' +primis_blood_temple_charred_construct: + name: '$normalLevel &3烧焦的构造体' +primis_blood_temple_conjured_flame: + name: '$normalLevel &c魔焰' +primis_blood_temple_eradicator: + name: '$normalLevel &6灭除者' +primis_blood_temple_fire_conjurer: + name: '$normalLevel &c火术师' +primis_blood_temple_flame_elemental: + name: '$normalLevel &c火元素' +primis_catacomb_nemus_to_redwood_archer: + name: '$normalLevel &8墓穴弓箭手' +primis_catacomb_nemus_to_redwood_golem: + name: '$normalLevel &7墓穴傀儡' +primis_catacomb_nemus_to_redwood_necromancer: + name: '$bossLevel &4墓穴死灵法师' +primis_catacomb_nemus_to_redwood_necromancer_p1: + name: '$bossLevel &4墓穴死灵法师' +primis_catacomb_nemus_to_redwood_necromancer_p2: + name: '$bossLevel &4墓穴死灵法师' +primis_catacomb_nemus_to_redwood_soul_reinforcement: + name: '$reinforcementLevel &8墓穴之魂' +primis_catacomb_nemus_to_redwood_swordsman: + name: '$normalLevel &8墓穴剑士' +primis_catacomb_pontis_to_ice_archer: + name: '$normalLevel &8墓穴弓箭手' +primis_catacomb_pontis_to_ice_golem: + name: '$normalLevel &7墓穴傀儡' +primis_catacomb_pontis_to_ice_necromancer_p1: + name: '$bossLevel &4墓穴死灵法师' +primis_catacomb_pontis_to_ice_necromancer_p2: + name: '$bossLevel &4墓穴死灵法师' +primis_catacomb_pontis_to_ice_swordsman: + name: '$normalLevel &8墓穴剑士' +primis_catacomb_trio_archer: + name: '$normalLevel &8墓穴弓箭手' +primis_catacomb_trio_golem: + name: '$normalLevel &b墓穴傀儡' +primis_catacomb_trio_necromancer_p1: + name: '$bossLevel &4Catacomb 死灵法师' +primis_catacomb_trio_necromancer_p2: + name: '$bossLevel &4Catacomb 死灵法师' +primis_catacomb_trio_necromancer_summon: + name: '$bossLevel &4Catacomb 死灵法师' +primis_catacomb_trio_swordsman: + name: '$normalLevel &8墓穴剑士' +primis_crazed_rabbit: + name: '$normalLevel &c疯兔' +primis_crystaline_summoner_p1: + name: '&3水晶召唤师' +primis_crystaline_summoner_p2: + name: '&3水晶召唤师' +primis_earth_temple_golem: + name: '$normalLevel &b墓穴傀儡' +primis_emerald_eater: + name: '&a绿宝石吞噬者' +primis_farmstead_lighthouse_keeper: + name: '$bossLevel &6灯塔看守者' + questLore: + - 我的丈夫出了很大的问题。 + - 他曾经是一个充满爱与关怀的丈夫和父亲, + - 但最近他一直专注于他在地下室发现的文件。 + - 他说这些东西能改变世界。 + - 当我看到他如此痴迷时,我应该让他停下研究。 + - 他对灯塔……做了一些事……——而我 + - 我担心灯塔也对他做了一些事情。 + - 灯塔让他变成了某种怪物。他不再认得我们了, + - 我们尝试靠近他时,他甚至攻击我们。 + - '&d灯塔地下室&f传来的哀嚎' + - 让我们夜不能寐。 + - 他在承受痛苦,而我们无能为力。 + - 我知道这要求很高,但你能帮助我们吗? + questAcceptDialog: + - '&a[雅玛维特]&f 非常感谢你接受我们的请求。我衷心希望你能成功。' + - '&7&o我应该前往&d灯塔地下室&7&o并解决&c灯塔看守人&7&o的痛苦。' + questCompleteMessage: + - '&a[雅玛维特]&f 我听到了,完成了吗?他仍然——算了,我不想知道。' + - '&f在你解决问题时,灯塔似乎发出了诡异的光……我们需要确保这没有问题。' + - '&7&o似乎&a雅玛维特&7&o还有任务。我应该和她对话。' +primis_feral_alpha_wolf: + name: '$normalLevel &8α野狼' +primis_feral_wolf: + name: '$normalLevel &8野狼' +primis_feral_wolf_scout: + name: '$normalLevel &8侦查野狼' +primis_gladius_admiral: + name: '$normalLevel &f入侵大将' +primis_gladius_assassin: + name: '$normalLevel &f入侵刺客' +primis_gladius_barkeep_p1: + name: '$minibossLevel &6酒保' +primis_gladius_barkeep_p2: + name: '$minibossLevel &6酒保' +primis_gladius_captain: + name: '$normalLevel &f入侵队长' +primis_gladius_champion_p1: + name: '$bossLevel &6陨落冠军纳图斯' +primis_gladius_champion_p2: + name: '$bossLevel &6陨落冠军纳图斯' +primis_gladius_gatekeeper_p1: + name: '$minibossLevel &5守门人' +primis_gladius_gatekeeper_p2: + name: '$minibossLevel &5守门人' +primis_gladius_gatekeeper_pontis_p1: + name: '$minibossLevel &5守门人' +primis_gladius_gatekeeper_pontis_p2: + name: '$minibossLevel &5守门人' +primis_gladius_longbowman: + name: '$normalLevel &f入侵长弓手' +primis_gladius_mariner: + name: '$normalLevel &f入侵水手' +primis_gladius_mariner_quest: + name: '$normalLevel &f入侵水手' +primis_gladius_monk_p1: + name: '$minibossLevel &6僧侣' +primis_gladius_monk_p2: + name: '$minibossLevel &6僧侣' +primis_gladius_raider: + name: '$normalLevel &f入侵突袭者' +primis_gladius_swordsman: + name: '$normalLevel &f入侵剑士' +primis_gladius_undead_buccaneer: + name: '$normalLevel &f亡灵海盗' +primis_gladius_undead_captain: + name: '$minibossLevel &f亡灵船长' +primis_gladius_undead_swashbuckler: + name: '$normalLevel &f亡灵游荡者' +primis_gladius_underlord: + name: '$minibossLevel &0亡灵霸主' +primis_gladius_villager: + name: '$normalLevel &1亡灵村民' +primis_goblin_fowl_warrior: + name: '&6诅咒哥布林' +primis_goblin_grunt: + name: '&6咕哝哥布林' +primis_goblin_king: + name: '&2哥布林国王' +primis_goblin_piranah: + name: '&9哥布林食人鱼' +primis_goblin_spearman: + name: '&6哥布林枪兵' +primis_goblin_warrior: + name: '&6哥布林战士' +primis_ice_mage: + name: '$minibossLevel &9寒冰法师' +primis_ice_mage_p2: + name: '$minibossLevel &9寒冰法师' + deathMessage: '&8&o你听到了附近冰墙破裂的声音……' +primis_ice_village_annoyed_goat: + name: '&6恼怒的山羊' +primis_ice_village_bell_banger: + name: '&6亡灵' + questLore: + - 你看到了吗?看那里 + - 村庄的钟。 + - 你也看到了,对吧?那儿有人 + - 在用头敲钟。 + - 我非常确定这是怎么回事, + - 除非我视力有问题。 + - 你能调查看是怎么回事吗 + - 回来告诉我详情。 + questAcceptDialog: + - '&3[厄琉斯·费斯图斯]&f 发生啥事……' + - '&7&o我应该去看看&d&o寒冰村庄钟楼&7&o发生了什么事。' + questCompleteMessage: + - '&3[厄琉斯·费斯图斯]&f 你发现了有个亡灵在用头敲钟……' + - 好吧,现在我都听到了…… +primis_ice_village_escaped_prisoner: + name: '$normalLevel &b逃犯' +primis_ice_village_fallen_trial_warrior_summon: + name: '&7奴役之魂' +primis_ice_village_frost_fur_ursus: + name: '$normalLevel &9冰霜毛熊' +primis_ice_village_frost_simulacrum: + name: '$normalLevel &3冰霜幻影' +primis_ice_village_ice_simulacrum: + name: '$reinforcementLevel &3寒冰幻影' +primis_ice_village_manifested_nightmare: + name: '&b显形梦魇' +primis_ice_village_meek_customer: + name: '$normalLevel &c温顺的顾客' +primis_ice_village_naughty_customer: + name: '$normalLevel &c淘气的顾客' +primis_ice_village_screecher_bomb_summon: + name: '&d天鸣者丢弃物' +primis_ice_village_sky_screecher: + name: '&b天鸣者' +primis_ice_village_the_ice_aspect: + name: '$minibossLevel &9寒冰幻象' +primis_ice_village_the_ice_elemental: + name: '$bossLevel &9极恶冰元素' +primis_ice_village_the_ice_elemental_p2: + name: '$bossLevel &9冰元素' +primis_ice_village_the_ice_elemental_p3: + name: '$bossLevel &9冰元素' +primis_ice_village_trial_of_ice_minor_ice_elemental: + name: '&b小冰元素' +primis_ice_village_wolf_summon: + name: '&c驯服的狼' +primis_minor_ice_elemental: + name: '$bossLevel &1小冰元素' +primis_minor_ice_elemental_p2: + name: '$bossLevel &1小冰元素' +primis_mountain_pass_guardian_p1: + name: '$bossLevel &6守护者' +primis_mountain_pass_guardian_p2: + name: '$bossLevel &6守护者' +primis_mountain_pass_healer: + name: '$reinforcementLevel &f修复者' +primis_nasty_worm: + name: '$normalLevel &f讨厌的蠕虫' +primis_ogre_mines_mite: + name: '$normalLevel &f矿螨' +primis_ogre_mines_ogre_archer: + name: '$minibossLevel &f兽人弓箭手' +primis_ogre_mines_ogre_magi: + name: '$minibossLevel &f兽人法师' +primis_ogre_mines_ogre_warrior: + name: '$minibossLevel &f兽人战士' +primis_ogre_mines_undead_archer: + name: '$normalLevel &1亡灵弓箭手' +primis_ogre_mines_undead_swordsman: + name: '$normalLevel &f亡灵剑士' +primis_pontis_beast_cod: + name: '$normalLevel &d狂暴鳕鱼兽' +primis_pontis_beast_crawler: + name: '$normalLevel &d爬行兽梅格登' +primis_pontis_beast_impaler: + name: '$normalLevel &d穿刺兽乌拉齐米尔' +primis_pontis_counselor_guard_left_1: + name: '$normalLevel &4腐化顾问守卫' +primis_pontis_counselor_guard_left_2: + name: '$normalLevel &4扭曲顾问守卫' + deathMessage: '&5[马基雅维利顾问]&f 那个傻瓜一定是终于想通了……' +primis_pontis_counselor_guard_left_3: + name: '$normalLevel &4升起的实验品' + deathMessage: '&5[马基雅维利顾问]&f 我小瞧你了。' +primis_pontis_counselor_guard_left_4: + name: '$normalLevel &4憎恶' + deathMessage: '&5[马基雅维利顾问]&f 我的灵魂魔法会保护我!!!' +primis_pontis_counselor_guard_mid: + name: '$normalLevel &4腐化顾问守卫' + deathMessage: '&8[马基雅维利顾问]&f 有客人来了……' +primis_pontis_counselor_guard_right_1: + name: '$normalLevel &4腐化顾问守卫' +primis_pontis_counselor_guard_right_2: + name: '$normalLevel &4扭曲顾问守卫' +primis_pontis_counselor_guard_right_3: + name: '$normalLevel &4升起的实验品' +primis_pontis_counselor_guard_right_4: + name: '$normalLevel &4憎恶' +primis_pontis_counselor_twisted_copy: + name: '$normalLevel &f扭曲复制品' +primis_pontis_mille_arena_air_elemental: + name: '&f气元素' +primis_pontis_mille_arena_human_wave_4: + name: '&6人类战士' +primis_pontis_mille_arena_human_wave_6: + name: '&6人类战士' +primis_pontis_mille_arena_human_wave_7: + name: '&6人类战士' +primis_pontis_mille_arena_human_wave_8: + name: '&4被支配的人类战士' +primis_pontis_mille_arena_human_worshiper: + name: '&4元素崇拜者' +primis_pontis_mille_arena_minor_air_elemental: + name: '&b小气元素' +primis_pontis_mille_arena_minor_earth_elemental: + name: '&b小地元素' +primis_pontis_mille_arena_minor_fire_elemental: + name: '&b小火元素' +primis_pontis_mille_arena_minor_fire_elemental_prime: + name: '&b小火元素' +primis_pontis_mille_arena_minor_water_elemental: + name: '&b小水元素' +primis_pontis_mille_arena_primal_air_wisp: + name: '&f原初气灵' +primis_pontis_mille_arena_primal_air_wisp_2: + name: '&f原初气灵' +primis_pontis_mille_arena_primal_earth_wisp: + name: '&7原初地灵' +primis_pontis_mille_arena_primal_earth_wisp_2: + name: '&7原初地灵' +primis_pontis_mille_arena_primal_fire_wisp: + name: '&e原初火灵' +primis_pontis_mille_arena_primal_fire_wisp_2: + name: '&e原初火灵' +primis_pontis_mille_arena_primal_fire_wisp_3: + name: '&e原初火灵' +primis_pontis_mille_arena_primal_water_wisp: + name: '&e原初水灵' +primis_pontis_mille_arena_primal_water_wisp_2: + name: '&b原初水灵' +primis_pontis_mille_arena_primal_water_wisp_3: + name: '&b原初水灵' +primis_pontis_mille_arena_primal_wisp: + name: '&5原初精灵' +primis_pontis_mille_arena_water_elemental: + name: '&1水元素' +primis_pontis_mille_counselor_p1: + name: '$minibossLevel &f马基雅维利顾问' +primis_pontis_mille_counselor_p2: + name: '$minibossLevel &f马基雅维利顾问' +primis_pontis_mille_counselor_p3: + name: '$minibossLevel &f马基雅维利顾问' +primis_pontis_mille_fields_babe_razorback: + name: '&2尖背野猪幼崽' +primis_pontis_mille_fields_bird: + name: '&f有羽毛的田鼠' +primis_pontis_mille_fields_bird_nightmare: + name: '$normalLevel &d有羽毛的梦魇鼠' +primis_pontis_mille_fields_bubba: + name: '$normalLevel &c大个头' +primis_pontis_mille_fields_field_rat: + name: '&f田鼠' +primis_pontis_mille_fields_juvenile_razorback: + name: '$normalLevel &2幼年尖背野猪' +primis_pontis_mille_fields_longhorn: + name: '&4田野长角牛' +primis_pontis_mille_fields_mature_razorback: + name: '$normalLevel &2成熟尖背野猪' +primis_pontis_mille_fields_shorthorn: + name: '&6田野短角牛' +primis_pontis_mille_fields_two_legged_terror: + name: '$normalLevel &2双足恐怖生物' +primis_pontis_mille_fields_well_fed_rat: + name: '$normalLevel &f饱食的老鼠' +primis_pontis_mille_rat: + name: '&fR老鼠' +primis_quartz_elemental: + name: '$bossLevel &d石英元素' +primis_quartz_elemental_p2: + name: '$bossLevel &d石英元素' +primis_redwood_barracuda: + name: '&3红木梭鱼' +primis_redwood_fruity_hound: + name: '$normalLevel &2食果猎犬' +primis_redwood_rockhound: + name: '&7红木岩石猎犬' +primis_redwood_werewolf_grunt: + name: '&c红木狼人士兵' +primis_redwood_werewolf_packleader: + name: '&4红木狼人领袖' +primis_river_guardian: + name: '$normalLevel &5河流守护者' +primis_roofed_forest_cave_spider: + name: '&6巢穴爬虫' +primis_roofed_forest_cave_spider_boss: + name: '&e育雏蜘蛛母' +primis_roofed_forest_spider: + name: '&6森林爬虫' +primis_roofed_forest_spider_reinforcement: + name: '&6巢穴雏蛛' +primis_sea_monster: + name: '$bossLevel &d海怪' +primis_sewer_noxious_ninja: + name: '$normalLevel &2剧毒忍者' +primis_sewer_spore_spreader: + name: '$normalLevel &4孢子散播者' +primis_sewer_the_shredder_p1: + name: '&5施莱德' +primis_sewer_the_shredder_p2: + name: '&5施莱德' +primis_storm_temple_axeman: + name: '&d风暴神殿斧手' +primis_storm_temple_bowman: + name: '&d风暴神殿弓箭手' +primis_storm_temple_kuzco: + name: '&6库斯德' +primis_storm_temple_minor_storm_elemental: + name: '&5Minor 风暴元素' +primis_storm_temple_storm_elemental: + name: '$bossLevel &1风暴元素' +primis_storm_temple_storm_elemental_p2: + name: '$bossLevel &1风暴元素' +primis_storm_temple_storm_elemental_p3: + name: '$bossLevel &1风暴元素' +primis_storm_temple_summoner: + name: '&5风暴神殿召唤师' +primis_terravilla_alpha_razorback: + name: '$minibossLevel &2尖背野猪王' +primis_terravilla_alpha_razorback_p2: + name: '$minibossLevel &2尖背野猪王' +primis_terravilla_bar_brawler: + name: '$normalLevel &6酒吧斗殴者' + onDamagedMessages: + - 你就这点能耐? + - 你太弱了! + - 你……为什么? + - 给你点颜色瞧瞧! + - 你谁啊! + - 尝尝这个! +primis_terravilla_earth_elemental: + name: '$bossLevel &f地元素' +primis_terravilla_earth_elemental_p2: + name: '$bossLevel &f地元素' +primis_terravilla_earth_elemental_p3: + name: '$bossLevel &f地元素' +primis_terravilla_regular_fish: + name: '$normalLevel &b普通的鱼' +primis_terravilla_robber_gladiator: + name: '$normalLevel &b强盗角斗士' +primis_terravilla_robber_slugger: + name: '$normalLevel &b走私者' +primis_undead_archer: + name: '$normalLevel &f亡灵弓箭手' +primis_undead_climber: + name: '$normalLevel &0亡灵攀爬者' +primis_undead_grappler: + name: '$normalLevel &3亡灵抓钩手' +primis_undead_guardian: + name: '$normalLevel &b亡灵守护者' +primis_undead_swordsman: + name: '$normalLevel &0亡灵剑士' +pufferfish: + name: '$eventBossLevel &3河豚' + locationMessage: '&c河豚: $distance格!' + spawnMessage: '&c一只河豚在海洋里游动!' + deathMessage: '&a$players终结了河豚!' + escapeMessage: '&4河豚游走了!' +pufferfish_summon_1: + name: '$eventBossLevel &b河豚' +pufferfish_summon_2: + name: '$eventBossLevel &b河豚' +pufferfish_summon_3: + name: '$eventBossLevel &b河豚' +pufferfish_summon_4: + name: '$eventBossLevel &b河豚' +queen_bee: + name: '$eventBossLevel &6蜂后' +rabbit_wolf_1: + name: '$eventBossLevel &c炎狼' + locationMessage: '&c炎狼:$distance格!' + spawnMessage: '&c一对强大的生物降临这个世界!' + deathMessage: '&a$players阻止了狼与兔!' + escapeMessage: '&4狼与兔离开了!' +rabbit_wolf_2: + name: '$eventBossLevel &c雷兔' + locationMessage: '&c雷兔:$distance格!' + deathMessage: '&a$players阻止了狼与兔!' + escapeMessage: '&4狼与兔离开了!' +raug: + name: '$reinforcementLevel &4劳格' +regular_hoglin: + name: '$eventBossLevel &4普通的疣猪兽' + locationMessage: '&c普通的疣猪兽: $distance格!' + spawnMessage: '&c一只普通的疣猪兽出现了!它没什么特别的!' + deathMessage: '&a普通的疣猪兽被$players杀死了!' + escapeMessage: '&4普通的疣猪兽离开了!' +rotting_diver: + name: '$eventBossLevel &b腐烂潜者' + locationMessage: '&c腐烂潜者:$distance格!' + spawnMessage: '&c水中浮现出恶臭的尸体!' + deathMessage: '&a腐烂潜者被$players送入了深渊!' + escapeMessage: '&4腐烂潜者逃跑了!' +salty_corpse: + name: '$eventBossLevel &b盐浸尸体' + locationMessage: '&c盐浸尸体: $distance格!' + spawnMessage: '&c一些可泡生物浮现出水面!' + deathMessage: '&a盐浸尸体被$players扔入了深渊!' + escapeMessage: '&4盐浸尸体离开了!' +skeleton_knight: + name: '$eventBossLevel &f骷髅骑士' + locationMessage: '&c骷髅骑士: $distance格!' + spawnMessage: '&c骷髅骑士生于黑夜!' + deathMessage: '&a骷髅骑士被$players杀死了!' + escapeMessage: '&4骷髅骑士撤退了!' +sky_archer: + name: '$eventBossLevel &a天空弓箭手' + locationMessage: '&c天空弓箭手: $distance格!' + spawnMessage: '&c天空弓箭手进入了这个世界!带上你的弓!' + deathMessage: '&a天空弓箭手被$players射死了!' + escapeMessage: '&4天空弓箭手飞走了!' +sky_archer_mount: + name: '$eventBossLevel &a天马' +smallstack: + name: '$eventBossLevel &b小型堆叠体顶部' + locationMessage: '&c小型堆叠体: $distance格!' + spawnMessage: '&c一个小型堆叠体在荒野游荡!' + deathMessage: '&a小型堆叠体被$players拆散了!' + escapeMessage: '&4小型堆叠体离开了!' +smallstack_1: + name: '$eventBossLevel &b小型堆叠体中部' +smallstack_2: + name: '$eventBossLevel &b小型堆叠体中部' +smallstack_3: + name: '$eventBossLevel &b小型堆叠体中部' +smallstack_4: + name: '$eventBossLevel &b小型堆叠体底部' +smallstack_5: + name: '$eventBossLevel &b小型堆叠体底部' +smallstack_6: + name: '$eventBossLevel &b小型堆叠体运输者' +snoopy: + name: '&6{&4☠&6} &f史努比' + onDamageMessages: + - 汪! + onDamagedMessages: + - 汪! + spawnMessage: '&a非常罕见的史努比出现了!' +sorcerer_supreme: + name: '$eventBossLevel &5至尊法师' + locationMessage: '&c至尊法师: $distance格!' + spawnMessage: '&c一位强大的法师传送到了这个世界!' + deathMessage: '&a至尊法师被$players击败了!' + escapeMessage: '&4至尊法师离开了这个时节!' +sorcerer_supreme_summon: + name: '$eventBossLevel &5永恒仆从' +spider_knight: + name: '$eventBossLevel &a矮人骑士' + locationMessage: '&c矮人骑士: $distance格!' + spawnMessage: '&c一位骑士前来挑战这片地方的英雄!' + deathMessage: '&a骑士被$players击败了!' + escapeMessage: '&4骑士离开了!' +spider_knight_mount: + name: '$eventBossLevel &a忠马' +summonable_wolf: + name: '$normalLevel 恶狼' + onDamageMessages: + - 汪! + onDamagedMessages: + - 汪! +super_mite: + name: '$eventBossLevel &d超级螨虫' + locationMessage: '&c超级螨虫: $distance格!' + spawnMessage: '&c一个麻烦的生物出现了!' + deathMessage: '&a在$players面前不堪一击!' + escapeMessage: '&4超级螨虫离开了!' +super_mite_summon: + name: '$eventBossLevel &d螨虫朋友' +suspicious_phantom: + name: '$eventBossLevel &e可疑的幻翼' + locationMessage: '&c可疑的幻翼: $distance格!' + spawnMessage: '&c天空中出现了可疑的幻翼!' + deathMessage: '&a$players让幻翼安眠了!' + escapeMessage: '&4可疑的幻翼离开了!' +suspicious_phantom_summon: + name: '$eventBossLevel &c火焰幻翼' +suspicious_phantom_summon_1: + name: '$eventBossLevel &c火球幻翼' +test_boss: + name: '$eventBossLevel &e试验品' + deathMessages: + - '&e&l---------------------------------------------' + - '&4试验品已被击退!' + - '&c&l 输出第一名: $damager1name&c造成了$damager1damage点伤害!' + - '&6&l 输出第二名: $damager2name&6造成了$damager2damage点伤害!' + - '&e&l 输出第三名: $damager3name&e造成了$damager3damage点伤害!' + - '&4终结者: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - 我击中你了! + onDamagedMessages: + - 我受伤了! + locationMessage: '试验品:$distance' + spawnMessage: 试验品boss已生成! + deathMessage: 试验品boss被$players杀死了! + escapeMessage: 试验品逃离了! +airship_tier_45_knockback: + name: '$normalLevel &2弓箭手' +airship_tier_45_witherblind: + name: '$normalLevel &a剧毒弓箭手' +airship_tier_50_powder_monkeys: + name: '$normalLevel &7火药搬运工' +airship_tier_50_scourge: + name: '$normalLevel &8游荡之灾' +airship_tier_60_mess_hall_mate: + name: '$normalLevel &b食堂大副' +airship_tier_65_boatswain_boss: + name: '$normalLevel &c水手长' +airship_tier_65_bodyguard: + name: '$normalLevel &e海盗保镖' +airship_tier_65_silverfish: + name: '$normalLevel &8飞船老鼠' +airship_tier_65_silverfish_reinforcement: + name: '$reinforcementLevel &8飞船老鼠' +airship_tier_70_miniboss: + name: '$minibossLevel 军需官' +airship_tier_70_miniboss_2: + name: '$minibossLevel &6炙热锅炉' +airship_tier_70_miniboss_wayfinder: + name: '$minibossLevel &3码头探路者' +airship_tier_75_boss: + name: '$bossLevel &4戴维船长' + deathMessages: + - '&e&l---------------------------------------------' + - '&9戴维船长又一次丧命了!' + - '&c&l 输出第一名: $damager1name&c造成了$damager1damage点伤害!' + - '&6&l 输出第二名: $damager2name&6造成了$damager2damage点伤害!' + - '&e&l 输出第三名: $damager3name&e造成了$damager3damage点伤害!' + - '&a终结者: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4戴维船长:$distance' + spawnMessage: '&4戴维船长再度萦绕在天空!' + deathMessage: '$players&a让&4戴维船长&a远离了尘世的烦恼!' + escapeMessage: '&6戴维船长有朝一日定会卷土重来!' +binder_of_worlds_phase_1: + name: '$eventBossLevel &e灭世魔龙' + spawnMessage: '&5灭世魔龙出现了!' +binder_of_worlds_phase_1_melee_miniboss: + name: '$reinforcementLevel &9现实拔除者' +binder_of_worlds_phase_1_melee_reinforcement: + name: '$reinforcementLevel &8现实荒废者' +binder_of_worlds_phase_1_parkour_reinforcement: + name: '$reinforcementLevel &2现实先驱者' +binder_of_worlds_phase_1_ranged_miniboss: + name: '$reinforcementLevel &3现实遗墟者' +binder_of_worlds_phase_1_ranged_reinforcement: + name: '$reinforcementLevel &6现实遗墟者' +binder_of_worlds_phase_1_status_miniboss: + name: '$reinforcementLevel &1现实歪曲者' +binder_of_worlds_phase_1_status_reinforcement: + name: '$reinforcementLevel &7现实粉碎者' +binder_of_worlds_phase_2: + name: '$eventBossLevel &e灭世魔龙' +binder_of_worlds_phase_3: + name: '$eventBossLevel &e灭世魔龙' +binder_of_worlds_phase_3_shulker_reinforcement: + name: '$reinforcementLevel &5现实撕裂者' +binder_of_worlds_phase_4: + name: '$eventBossLevel &e灭世魔龙' + deathMessages: + - '&e&l---------------------------------------------' + - '&9次元绑定者将不再与这个位面绑定!' + - '&c&l 输出第一名: $damager1name&c造成了$damager1damage点伤害!' + - '&6&l 输出第二名: $damager2name&6造成了$damager2damage点伤害!' + - '&e&l 输出第三名: $damager3name&e造成了$damager3damage点伤害!' + - '&a终结者: $players' + - '&e&l---------------------------------------------' +catacombs_tier_10_miniboss: + name: '$minibossLevel &7地下蜘蛛' +catacombs_tier_15_boss: + name: '$bossLevel &6响骨' + deathMessages: + - '&e&l---------------------------------------------' + - '&9响骨咯吱作响!' + - '&c&l 输出第一名: $damager1name&c造成了$damager1damage点伤害!' + - '&6&l 输出第二名: $damager2name&6造成了$damager2damage点伤害!' + - '&e&l 输出第三名: $damager3name&e造成了$damager3damage点伤害!' + - '&a终结者: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - 你感到害怕吗? + - 展现你的骨气! + - 你骨质疏松! + - 你缺钙! + onDamagedMessages: + - 我从骨子里感到疼痛! + - 我对你很有意见! + - 嘟 嘟 骷髅先生 + - 我要补钙! + locationMessage: '响骨:$distance blocks away!' + spawnMessage: '&6响骨出现了!' + deathMessage: '&a响骨被$players杀死了!' +catacombs_tier_15_mimic_boss: + name: '$bossLevel &6被遗忘者' +catacombs_tier_15_reinforcement: + name: '$reinforcementLevel &e未转变者' +catacombs_tier_5_evoker_guard_2: + name: '$normalLevel &7墓穴守卫' + onDamageMessages: + - 禁止入内! + - 禁止进入! +catacombs_tier_5_illusioner_guard_1: + name: '$normalLevel &7墓穴守卫' + onDamageMessages: + - 禁止入内! + - 禁止进入! +colosseum_tier_70_boss_mount: + name: '$bossLevel &4深坑领主' + deathMessages: + - '&e&l---------------------------------------------' + - '&4深坑领主已不复存在!' + - '&c&l 输出第一名:$damager1name&c造成了$damager1damage点伤害!' + - '&6&l 输出第二名:$damager2name&6造成了$damager2damage点伤害!' + - '&e&l 输出第三名:$damager3name&e造成了$damager3damage点伤害!' + - '&4终结者:$players' + - '&e&l---------------------------------------------' + deathMessage: '&2深坑领主被$players征服了!' +colosseum_tier_70_boss_p1: + name: '$bossLevel &c深坑大师' + deathMessages: + - '&e&l---------------------------------------------' + - '&4深坑大师倒下了!' + - '&c&l 输出第一名:$damager1name&c造成了$damager1damage点伤害!' + - '&6&l 输出第二名:$damager2name&6造成了$damager2damage点伤害!' + - '&e&l 输出第三名:$damager3name&e造成了$damager3damage点伤害!' + - '&4终结者:$players' + - '&e&l---------------------------------------------' + locationMessage: '&4深坑大师:$distance格' + spawnMessage: '&4深坑大师再次冲入了战场!' + deathMessage: '&2深坑大师被$players杀死了!' +colosseum_tier_70_boss_p2: + name: '$bossLevel &c深坑大师' + deathMessages: + - '&e&l---------------------------------------------' + - '&4深坑大师倒下了!' + - '&c&l 输出第一名:$damager1name&c造成了$damager1damage点伤害!' + - '&6&l 输出第二名:$damager2name&6造成了$damager2damage点伤害!' + - '&e&l 输出第三名:$damager3name&e造成了$damager3damage点伤害!' + - '&4终结者:$players' + - '&e&l---------------------------------------------' + locationMessage: '&4深坑大师:$distance格' + deathMessage: '&2深坑大师被$players杀死了!' +colosseum_tier_70_boss_reinforcements_p1: + name: '$reinforcementLevel &6角斗士' +colosseum_tier_70_boss_reinforcements_p2: + name: '$reinforcementLevel &6角斗士' +colosseum_tier_70_gladiator: + name: '$normalLevel &6角斗士' +colosseum_tier_70_mount_reinforcements: + name: '$reinforcementLevel &c深坑野兽' +dark_cathedral_tier_75_boss: + name: '$bossLevel &4克苏鲁教徒' + deathMessages: + - '&e&l---------------------------------------------' + - '&4已打断召唤!' + - '&c&l 输出第一名: $damager1name&c造成了$damager1damage点伤害!' + - '&6&l 输出第二名: $damager2name&6造成了$damager2damage点伤害!' + - '&e&l 输出第三名: $damager3name&e造成了$damager3damage点伤害!' + - '&4终结者: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - 蠢货! + - 克苏鲁拉莱耶! + - 没有人能打败克苏鲁! + - 凝视深渊…… + locationMessage: '克苏鲁教徒:$distance格' + spawnMessage: '&c一个黑暗教徒正在召唤克苏鲁!' + deathMessage: '&2$players打断了召唤仪式!' + escapeMessage: '&2教徒完成了召唤!' +dark_cathedral_tier_75_reinforcement: + name: '$reinforcementLevel 克苏鲁追随者' + onDamageMessages: + - 克苏鲁拉莱耶 + onDamagedMessages: + - 克苏鲁拉莱耶 +darkspire_level_100_berserker_brute: + name: '$normalLevel &7下界狂战士' +darkspire_level_100_berserker_reanimated: + name: '$normalLevel &f复活的下界狂战士' +darkspire_level_100_blacksmith_brute: + name: '$normalLevel &e阴燃金匠' +darkspire_level_100_endermite: + name: '$normalLevel &5虚空爬虫' +darkspire_level_100_marksman_piglin: + name: '$normalLevel &9愚蠢神射手' +darkspire_level_100_sentry_brute: + name: '$normalLevel &3黑暗哨卫' +darkspire_level_100_summon_blaze: + name: '$reinforcementLevel &c地狱炎魂' +darkspire_level_100_summon_evoker: + name: '$reinforcementLevel &c虚假魔魂' +darkspire_level_100_summon_ghast: + name: '$reinforcementLevel &7马克瓦尔' +darkspire_level_100_summon_husk: + name: '$reinforcementLevel &c奥罗萨克的腐尸' +darkspire_level_100_summon_ravager: + name: '$reinforcementLevel &c堕落者埃比克斯' +darkspire_level_100_summon_skeleton: + name: '$reinforcementLevel &c肋骨' +darkspire_level_110_berserker_reanimated: + name: '$normalLevel &7复活的下界狂战士' +darkspire_level_110_marksman_reanimated: + name: '$normalLevel &9复活的愚蠢神射手' +darkspire_level_110_necromancer_evoker: + name: '$normalLevel &8黑心法师' +darkspire_level_110_sentry_reanimated: + name: '$normalLevel &3复活的黑暗哨卫' +darkspire_level_110_stationary_stray: + name: '$normalLevel &6守望者' +darkspire_level_120_miniboss_evoker: + name: '$minibossLevel &4魔魂' +darkspire_level_120_miniboss_illusioner: + name: '$minibossLevel &4马尔克夫' +darkspire_level_120_miniboss_skeleton: + name: '$minibossLevel &4墓穴守卫' +darkspire_level_120_miniboss_stray: + name: '$minibossLevel &4尼古拉·里卡格' +darkspire_level_120_miniboss_vindicator: + name: '$minibossLevel &4弑君者扎默尔' +darkspire_level_120_miniboss_wither_skeleton: + name: '$minibossLevel &4奥罗萨克' +darkspire_level_120_summon_zoglin: + name: '$reinforcementLevel &c阿尔扎格部队' +darkspire_level_130_miniboss_phase_brute: + name: '$bossLevel &4野兽阿尔扎格' + deathMessages: + - '&e&l---------------------------------------------' + - '&4野兽阿尔扎格的入侵结束了!' + - '&c&l 输出第一名:$damager1name&c造成了$damager1damage点伤害!' + - '&6&l 输出第二名:$damager2name&6造成了$damager2damage点伤害!' + - '&e&l 输出第三名:$damager3name&e造成了$damager3damage点伤害!' + - '&4终结者:$players' + - '&e&l---------------------------------------------' +darkspire_level_130_miniboss_zoglin: + name: '$bossLevel &4野兽阿尔扎格' + deathMessages: + - '&e&l---------------------------------------------' + - '&4野兽阿尔扎格的入侵结束了!' + - '&c&l 输出第一名:$damager1name&c造成了$damager1damage点伤害!' + - '&6&l 输出第二名:$damager2name&6造成了$damager2damage点伤害!' + - '&e&l 输出第三名:$damager3name&e造成了$damager3damage点伤害!' + - '&4终结者:$players' + - '&e&l---------------------------------------------' + locationMessage: '&4野兽阿尔扎格:$distance格' + spawnMessage: '&4野兽阿尔扎格即将开始入侵!' + escapeMessage: '&c野兽阿尔扎格结束了掠夺!' +darkspire_level_80_summon_blaze: + name: '$reinforcementLevel &d虚假炎魂' +fireworks_level_50_boss_phase_1: + name: '$eventBossLevel &c火花' + spawnMessage: '&e火花漫天飞舞!' +fireworks_level_50_boss_phase_2: + name: '$eventBossLevel &c火花' +fireworks_level_50_boss_phase_3: + name: '$eventBossLevel &c火花' + deathMessages: + - '&e&l---------------------------------------------' + - '&e火花消散,派对结束!' + - '&c&l 输出第一名: $damager1name&c造成了$damager1damage点伤害!' + - '&6&l 输出第二名: $damager2name&6造成了$damager2damage点伤害!' + - '&e&l 输出第三名: $damager3name&e造成了$damager3damage点伤害!' + - '&a终结者: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&6火花回来庆贺!' +fireworks_phase_2_reinforcement: + name: '$eventBossLevel &c轰鸣' +fireworks_phase_3_reinforcement: + name: '$eventBossLevel &c派对客' +the_great_weaver: + name: '$eventBossLevel &c巨型编织者' + locationMessage: '&c巨型编织者: $distance格!' + spawnMessage: '&c可怕的生物出现了!' + deathMessage: '&a巨型编织者被$players杀死了!' + escapeMessage: '&4巨型编织者消失了!' +the_great_weaver_summon: + name: '$eventBossLevel &4育母蜘蛛' +the_great_weaver_summon_1: + name: '$eventBossLevel &6小蜘蛛' +halloween_event_boss_mount: + name: 莽鬼 +halloween_event_boss_p1: + name: 杜拉汉 + locationMessage: '&4杜拉汉:在$distance格外!' + spawnMessage: '&4小心掉头,无头骑士复活了!' + deathMessage: '&4无头骑士被$players终结了!' + escapeMessage: '&4无头骑士遁入了某人的梦境中!' +halloween_event_boss_p2: + name: 杜拉汉 + deathMessages: + - '&e&l---------------------------------------------' + - '&4无头骑士被击败了!' + - '&c&l 造成最多伤害:$damager1name&c造成了$damager1damage点伤害!' + - '&6&l 造成第二多伤害:$damager2name&6造成了$damager2damage点伤害!' + - '&e&l 造成第三多伤害:$damager3name&e造成了$damager3damage点伤害!' + - '&4杀戮者:$players' + - '&e&l---------------------------------------------' + locationMessage: '&4杜拉汉:在$distance格外!' + deathMessage: '&4无头骑士被$players击败了!' + escapeMessage: '&4无头骑士遁入了某人的梦境中!' +halloween_event_boss_reinforcement: + name: '$normalLevel 惊悚骷髅' +the_hunter: + name: '$eventBossLevel &4Hunter' + locationMessage: '&cHunter: $distance格!' + spawnMessage: '&c一个猎人在觅食!' + deathMessage: '&aHunter was hunted to extinction by $players!' + escapeMessage: '&4Hunter declares the hunt now over!' +the_hunter_mount: + name: '$eventBossLevel &f驯服的野兽' +the_living_dead: + name: '$reinforcementLevel &6活死人' +northpole_elf: + name: '&f[&2$level&f]&2工坊精灵' +northpole_elf_summon: + name: '&f[&a$level&f] &a圣诞精灵' +northpole_jack_frost: + name: '&f[&b$level&f] &b冰霜杰克' +northpole_krampus: + name: '&f[&5$level&f] &5坎普斯' +northpole_mrs_claus: + name: '&f[&c$level&f] &c圣诞夫人' +northpole_santa_claus: + name: '&f[&4$level&f] &4圣诞老人' + deathMessages: + - '&e&l---------------------------------------------' + - '&7&o有人偷走了圣诞老人的所有礼物!' + - '&c&l 输出第一名: $damager1name&c造成了$damager1damage点伤害!' + - '&6&l 输出第二名: $damager2name&6造成了$damager2damage点伤害!' + - '&e&l 输出第三名: $damager3name&e造成了$damager3damage点伤害!' + - '&4终结者: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4圣诞老人:$distance格' + spawnMessage: '&4圣诞老人正在筹划圣诞节!!' + escapeMessage: '&c圣诞老人乘坐雪橇溜走了!' +northpole_skeleton_summon: + name: '&f[&d$level&f]&d淘气之魂' +northpole_snowy_wraith: + name: '&f[&1$level&f]&1冰雪幽灵' +the_phantom: + name: '$eventBossLevel &7幻翼' + locationMessage: '&c幻翼: $distance格!' + spawnMessage: '&c幻翼在黑暗中游荡!' + deathMessage: '&a$players消灭了幻翼的邪恶军团!' + escapeMessage: '&4幻翼离开了!' +the_phantom_summon_1: + name: '&f洞穴蜘蛛' +the_phantom_summon_2: + name: '&f女巫' +the_phantom_summon_3: + name: '&f僵尸' +the_phantom_summon_4: + name: '&f尸壳' +the_phantom_summon_5: + name: '&f溺尸' +the_phantom_summon_6: + name: '&f骷髅' +the_phantom_summon_7: + name: '&f流浪者' +the_phantom_summon_8: + name: '&f末影人' +pirate_ship_tier_10: + name: '$normalLevel &c乘务员' + onDamageMessages: + - 呀! + - 哈! + - 停下,你个菜鸟! + - 全员集结! + - 绞死他! + - 小心身后! + - 吓我一跳! +pirate_ship_tier_15: + name: '$normalLevel &c甲板水手' + onDamageMessages: + - 呀! + - 哈! + - 停下,你个菜鸟! + - 全员集结! + - 绞死他! + - 小心背后! + - 吓我一跳! +pirate_ship_tier_20_melee_1: + name: '$normalLevel &c船员' + onDamageMessages: + - 呀! + - 哈! + - 停下,你个菜鸟! + - 全员集结! + - 绞死他! + - 小心背后! + - 吓我一跳! +pirate_ship_tier_20_melee_2: + name: '$normalLevel &e醉汉' + onDamageMessages: + - 呀! + - 哈! + - 停下,你个菜鸟! + - 全员集结! + - 绞死他! + - 小心背后! + - 吓我一跳! +pirate_ship_tier_20_miniboss: + name: '$minibossLevel &d厨师' + onDamageMessages: + - 你在我的厨房里干什么! + - 让我来伺候你 + - 滚出我的厨房! + - 滚出我的厨房! + deathMessage: '&2厨师被$players干碎了!' +pirate_ship_tier_20_ranged: + name: '$normalLevel &c船员' + onDamageMessages: + - 呀! + - 哈! + - 停下,你个菜鸟! + - 全员集结! + - 绞死他! + - 小心身后! + - 吓我一跳! +pirate_ship_tier_25_miniboss_1: + name: '$miniboss &c舵手卡戎' + onDamageMessages: + - 愚蠢! + - 真是劲敌! + deathMessage: '&2舵手卡戎被$players带走了!' +pirate_ship_tier_30_melee: + name: '$normalLevel &c海盗' + onDamageMessages: + - 呀! + - 哈! + - 停下,你个菜鸟! + - 全员集结! + - 绞死他! + - 小心身后! + - 吓我一跳! +pirate_ship_tier_30_miniboss_1: + name: '$minibossLevel &7粉碎者' + onDamageMessages: + - 呀! + - 哈! + - 停下,你个菜鸟! + - 全员集结! + - 绞死他! + - 小心身后! + - 吓我一跳! + deathMessage: '&7粉碎者被$players粉碎了!' +pirate_ship_tier_30_ranged: + name: '$normalLevel &c海盗' + onDamageMessages: + - 呀! + - 哈! + - 停下,你个菜鸟! + - 全员集结! + - 绞死他! + - 小心身后! + - 吓我一跳! +pirate_ship_tier_35: + name: '$normalLevel &4海盗领航员' + onDamageMessages: + - 呀! + - 哈! + - 停下,你个菜鸟! + - 全员集结! + - 绞死他! + - 小心身后! + - 吓我一跳! +pirate_ship_tier_35_miniboss_1: + name: '$minibossLevel &c二副' + onDamageMessages: + - 这不是你能来的地方! + - 这里是船长室,退后! +pirate_ship_tier_35_miniboss_2: + name: '$minibossLevel &c二副' + onDamageMessages: + - 这不是你能来的地方! + - 这里是船长室,退后! +pirate_ship_tier_40_miniboss_1: + name: '$minibossLevel &4大副' + onDamageMessages: + - 呀! + - 哈! + - 停下,你个菜鸟! + - 全员集结! + - 绞死他! + - 小心身后! + - 吓我一跳! + deathMessage: '&6海盗船的大副被$players杀死了!' +pirate_ship_tier_45_boss: + name: '$bossLevel &4黑胡子船长' + onDamageMessages: + - 滚出我的船! + - 旱鸭子! + spawnMessage: '&4黑胡子船长正驾驶着海盗船袭来!' + deathMessage: '&2黑胡子的胡子被$players割了下来!' + escapeMessage: '&2黑胡子船长溜走了!' +the_returned: + name: '$reinforcementLevel &6尸魂归来' +ruins_boss_p1: + name: '$eventBossLevel &9托尔' + spawnMessage: '&6雷电从天而降!' +ruins_boss_p2: + name: '$eventBossLevel &9托尔' + deathMessages: + - '&e&l---------------------------------------------' + - '&4托尔回到了阿斯加德!' + - '&c&l 输出第一名: $damager1name&c造成了$damager1damage点伤害!' + - '&6&l 输出第二名: $damager2name&6造成了$damager2damage点伤害!' + - '&e&l 输出第三名: $damager3name&e造成了$damager3damage点伤害!' + - '&a终结者: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&6雷电从天而降!' +ruins_boss_reinforcement: + name: '$eventBossLevel &7芬里厄' +sewer_tier_10: + name: '&f潜伏者' +sewer_tier_15: + name: '&2爬行者' +sewer_tier_20_dry: + name: '&1失落流魂' +sewer_tier_20_gravity_boss: + name: '&1斯帕克' +sewer_tier_20_water: + name: '&1走私者' + onDamageMessages: + - 你不应该来这里! + onDamagedMessages: + - 没人能够阻拦我们! +sewer_tier_20_water_boss: + name: '&1被人遗忘的英雄' +sewer_tier_20_wither_boss: + name: '&2凋零腐尸' +sewer_tier_30_ice_boss: + name: '&2寒冰幽魂' +sewer_tier_30_invisibility_boss: + name: '&2暗影弓箭手' +sewer_tier_30_melee: + name: '&5下水道里的猛兽' +sewer_tier_30_ranged: + name: '&5灵魂低语者' + onDamageMessages: + - 诅咒你! + - 诅咒你全家! + - 感受灵魂的愤怒吧! + onDamagedMessages: + - 你竟敢诅咒我! + - 灵魂们,保护我! +sewer_tier_40: + name: '&6幻象' + onDamageMessages: + - 你赢了,才怪 + - 你的存活率,渺茫 + - 你的生命,归我 + onDamagedMessages: + - 疼痛,只是幻象 + - 流血,只是幻觉 + - 虚弱,只是谎言 +sewer_tier_40_darkness_boss: + name: '&2暗影领主' +sewer_tier_40_darkness_boss_reinforcement: + name: '&2暗影' +sewer_tier_40_fire_boss: + name: '&2火焰领主' +sewer_tier_40_fire_boss_reinforcement: + name: '&2火焰' +sewer_tier_40_poison_boss: + name: '&2剧毒园艺家' + onDamageMessages: + - 感受自然的愤怒吧! + onDamagedMessages: + - 爪牙们,为我而战! +sewer_tier_40_poison_boss_reinforcement: + name: '&2堕落的园艺家' +sewer_tier_5: + name: '&7下水道工人' + onDamageMessages: + - 这里禁止进入! + - 别进去,这里很危险! + - | + 你不应该在这里| + onDamagedMessages: + - 你知道你在做什么吗!? + - 真是愚蠢! + - 你敢打我! +sewer_tier_50: + name: '&3下水道食人鱼' +sewer_tier_50_lightning_boss: + name: '&2雷神之锤-「妙尔尼尔」' +sewer_tier_50_ravager_boss: + name: '&2下水道怪物' +sewer_tier_50_spider_boss: + name: '&2远古爬虫' +sewer_tier_50_spider_boss_reinforcement: + name: '&2小蜘蛛' +sewer_tier_50_water_boss: + name: '&2食人鱼王' +sewer_tier_50_water_boss_reinforcement: + name: '&2食人鱼王子' +sewer_tier_60: + name: '&4溺尸' +sewer_tier_70_boss: + name: '&4溺尸之王' + deathMessages: + - '&e&l---------------------------------------------' + - '&4溺尸之王已被杀死!' + - '&c&l 输出第一名: $damager1name&c造成了$damager1damage点伤害!' + - '&6&l 输出第二名: $damager2name&6造成了$damager2damage点伤害!' + - '&e&l 输出第三名: $damager3name&e造成了$damager3damage点伤害!' + - '&4终结者: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&c下水道里回荡着一位归来的国王的叫声..。' + deathMessage: '&2溺尸之王已被杀死!' + escapeMessage: '&2回荡在下水道的声音消失了..。' +sewer_tier_70_boss_reinforcement: + name: '&4溺尸' +totem_zombie_1: + name: '$eventBossLevel 僵尸首领' + deathMessages: + - '&e&l---------------------------------------------' + - '&4僵尸图腾已被杀死!' + - '&c&l 输出第一名: $damager1name&c造成了$damager1damage点伤害!' + - '&6&l 输出第二名: $damager2name&6造成了$damager2damage点伤害!' + - '&e&l 输出第三名: $damager3name&e造成了$damager3damage点伤害!' + - '&4终结者: $players' + - '&e&l---------------------------------------------' + locationMessage: '&c僵尸图腾:$distance格之外' + spawnMessage: '&cCraftenmine博士的憎恶之物已出现!' + deathMessage: '&aCraftenmine博士的憎恶之物被$players杀死了!' + escapeMessage: '&4Craftenmine博士的憎恶之物已逃脱!' +totem_zombie_2: + name: '$eventBossLevel 图腾僵尸' +totem_zombie_3: + name: '$eventBossLevel 图腾僵尸' +totem_zombie_4: + name: '$eventBossLevel 图腾僵尸' +totem_zombie_5: + name: '$eventBossLevel 图腾僵尸' +totem_zombie_6: + name: '$eventBossLevel 图腾僵尸' +treasure_goblin: + name: '$eventBossLevel &e宝藏哥布林' + deathMessages: + - '&e&l---------------------------------------------' + - '&e宝藏哥布林被劫掠了!' + - '&c&l 输出第一名: $damager1name&c造成了$damager1damage点伤害!' + - '&6&l 输出第二名: $damager2name&6造成了$damager2damage点伤害!' + - '&e&l 输出第三名: $damager3name&e造成了$damager3damage点伤害!' + - '&a终结者: $players' + - '&e&l---------------------------------------------' + locationMessage: '&c宝藏哥布林:$location' + spawnMessage: '&c宝藏哥布林出现了!' + deathMessage: '&a宝藏哥布林被$players杀死了!' + escapeMessage: '&4宝藏哥布林已逃脱!' +tree_defender: + name: '$eventBossLevel &2树木保卫者' +undead_farmer: + name: '$eventBossLevel &a亡灵农民' + locationMessage: '&c亡灵农民: $distance格!' + spawnMessage: '&c亡灵农民出现了!' + deathMessage: '&a亡灵农民被$players终结了!' + escapeMessage: '&4亡灵农民安息了!' +undead_farmer_summon: + name: '$eventBossLevel &2农民的骄傲' +undead_farmer_summon_1: + name: '$eventBossLevel &2失败的猪' +undead_horde_summon_1: + name: '$reinforcementLevel &a亡灵部队' +undead_horde_summon_2: + name: '$reinforcementLevel &d亡灵部队' +undead_horde_summon_3: + name: '$reinforcementLevel &e亡灵部队' +unwanted_visitor: + name: '$eventBossLevel &9不速之客' + locationMessage: '&cUnwanted Visitor: $distance格!' + spawnMessage: '&c一位不速之客来到了下界热身!' + deathMessage: '&aVisitor被$players杀死了!' + escapeMessage: '&4Visitor has gone back to his chilly domain!' +unwanted_visitor_summon: + name: '$eventBossLevel &b寒冰克隆体' +vampire_boneman: + name: '$reinforcementLevel &7吸血鬼之子' +vampire_brute: + name: '$normalLevel &1吸血鬼蛮兵' +vampire_brute_coffin_breaker: + name: '$normalLevel &1吸血鬼蛮兵' +vampire_brute_gargoyle_rush_left: + name: '$normalLevel &3吸血鬼蛮兵' +vampire_brute_gargoyle_rush_left_phase_2: + name: '$normalLevel &3吸血鬼蛮兵' +vampire_brute_gargoyle_rush_right: + name: '$normalLevel &3吸血鬼蛮兵' +vampire_brute_gargoyle_rush_right_phase_2: + name: '$normalLevel &3吸血鬼蛮兵' +vampire_fledgling: + name: '$normalLevel &9吸血鬼雏兵' +vampire_fledgling_coffin_breaker: + name: '$normalLevel &9吸血鬼雏兵' +vampire_fledgling_gargoyle_overlord: + name: '$normalLevel &9吸血鬼雏兵' +vampire_gargoyle: + name: '$normalLevel &6吸血鬼的石像鬼' +vampire_grunt: + name: '$normalLevel &1吸血鬼士兵' +vampire_grunt_coffin_breaker: + name: '$normalLevel &1吸血鬼士兵' +vampire_grunt_gargoyle_rush_left: + name: '$normalLevel &1吸血鬼士兵' +vampire_grunt_gargoyle_rush_left_phase_2: + name: '$normalLevel &1吸血鬼士兵' +vampire_grunt_gargoyle_rush_right: + name: '$normalLevel &1吸血鬼士兵' +vampire_grunt_gargoyle_rush_right_phase_2: + name: '$normalLevel &1吸血鬼士兵' +vampire_hound: + name: '$reinforcementLevel &b吸血鬼猎犬' +vampire_king: + name: '$bossLevel &4吸血鬼国王' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The 吸血鬼国王 has been slain!' + - '&c&l 输出第一名: $damager1name&c造成了$damager1damage点伤害!' + - '&6&l 输出第二名: $damager2name&6造成了$damager2damage点伤害!' + - '&e&l 输出第三名: $damager3name&e造成了$damager3damage点伤害!' + - '&4终结者: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4吸血鬼国王: $distance格。' + spawnMessage: '&c吸血鬼国王登上了它的王座……' + deathMessage: '&2The 吸血鬼国王 has been smitten!' + escapeMessage: '&2黑暗消散,黎明将至……' +vampire_king_phase_2: + name: '$bossLevel &4吸血鬼国王' +vampire_king_phase_3: + name: '$bossLevel &4吸血鬼国王' +vampire_king_phase_4: + name: '$bossLevel &4吸血鬼国王' +vampire_king_phase_5: + name: '$bossLevel &4吸血鬼国王' +vampire_king_phase_6: + name: '$bossLevel &4吸血鬼国王' +vampire_level_120_miniboss_evoker: + name: '$minibossLevel &4魔魂之魂' +vampire_level_120_miniboss_skeleton: + name: '$minibossLevel &4守墓者之魂' +vampire_level_120_miniboss_stray: + name: '$minibossLevel &4尼古拉斯·里伯茨之魂' +vampire_level_120_miniboss_wither_skeleton: + name: '$minibossLevel &4奥罗萨克之魂' +vampire_necromancer: + name: '$normalLevel &5吸血鬼死灵法师' +vampire_necromancer_dining_hall: + name: '$normalLevel &5吸血鬼死灵法师' +vampire_necromancer_entrance: + name: '$normalLevel &5吸血鬼死灵法师' +vampire_necromancer_foresight_pool: + name: '$normalLevel &5吸血鬼死灵法师' +vampire_necromancer_gargoyle_rush: + name: '$normalLevel &5吸血鬼死灵法师' +vampire_necromancer_gargoyle_rush_phase_2: + name: '$normalLevel &5吸血鬼死灵法师' +vampire_necromancer_left_bedroom: + name: '$normalLevel &5吸血鬼死灵法师' +vampire_necromancer_right_bedroom: + name: '$normalLevel &5吸血鬼死灵法师' +vampire_necromancer_supply_room: + name: '$normalLevel &5吸血鬼死灵法师' +vampire_necromancer_supreme_coffin_breaker: + name: '$minibossLevel &5吸血鬼死灵大法师' +vampire_necromancer_supreme_coffin_breaker_phase_2: + name: '$minibossLevel &5吸血鬼死灵大法师' +vampire_necromancer_supreme_coffin_breaker_phase_3: + name: '$minibossLevel &5吸血鬼死灵大法师' +vampire_necromancer_supreme_coffin_breaker_phase_4: + name: '$minibossLevel &5吸血鬼死灵大法师' +vampire_necromancer_supreme_coffin_breaker_phase_5: + name: '$minibossLevel &5吸血鬼死灵大法师' +vampire_necromancer_supreme_gargoyle_overlord: + name: '$minibossLevel &5吸血鬼死灵大法师' +vampire_necromancer_supreme_gargoyle_overlord_phase_2: + name: '$minibossLevel &5吸血鬼死灵大法师' +vampire_necromancer_supreme_gargoyle_overlord_phase_3: + name: '$minibossLevel &2石像鬼霸主' +vampire_sentinel: + name: '$minibossLevel &e吸血鬼哨兵' +vampire_thrall: + name: '$reinforcementLevel &d吸血鬼奴隶' +vampire_wraith: + name: '$minibossLevel &8干枯者' +vampire_wraith_phase_2: + name: '$minibossLevel &8干枯者' +vampire_zombie: + name: '$normalLevel &a干枯者尸壳' +vex_top: + name: '$eventBossLevel &e自私的恼鬼顶部' + locationMessage: '&cVex Troublemakers: $distance格!' + spawnMessage: '&c一群制造麻烦的恼鬼出现了!' + deathMessage: '&aVex Troublemakers were slain by $players!' + escapeMessage: '&4Vex Troublemakers have decided to leave.' +vex_top_mount_1: + name: '$eventBossLevel &6Vex底部' +vex_top_mount_2: + name: '$eventBossLevel &6Vex底部' +vex_top_mount_3: + name: '$eventBossLevel &6Vex底部' +warlock: + name: '$eventBossLevel &d术士' + locationMessage: '&cWarlock: $distance格!' + spawnMessage: '&cA demon riding Warlock出现了!' + deathMessage: '&aWarlock被$players杀死了!' + escapeMessage: '&4Warlock ran away on his demon!' +warlock_mount: + name: '$eventBossLevel &d恶魔' +wasp_queen: + name: '$eventBossLevel &a黄蜂 Queen' + locationMessage: '&c黄蜂 Queen: $distance格!' + spawnMessage: '&c黄蜂群飞过!' + deathMessage: '&awasp swarm was eliminated by $players!' + escapeMessage: '&4wasp swarm has flown away.' +wasp_queen_summon: + name: '$eventBossLevel &a黄蜂' +water_pest: + name: '$eventBossLevel &3水生害虫' + locationMessage: '&cWater Pest: $distance格!' + spawnMessage: '&c麻烦的敌人在水里游动!' + deathMessage: '&aWater Pest被$players杀死了!' + escapeMessage: '&4waters are clear of all Pests' +weapons_goblin: + name: '$eventBossLevel &c武器哥布林' + deathMessages: + - '&e&l---------------------------------------------' + - '&e武器哥布林被掠夺了!' + - '&c&l 输出第一名: $damager1name&c造成了$damager1damage点伤害!' + - '&6&l 输出第二名: $damager2name&6造成了$damager2damage点伤害!' + - '&e&l 输出第三名: $damager3name&e造成了$damager3damage点伤害!' + - '&4终结者: $players' + - '&e&l---------------------------------------------' + locationMessage: '&c武器哥布林:$distance格之外' + spawnMessage: '&c武器哥布林出现了!' + deathMessage: '&a武器哥布林被$players杀死了!' + escapeMessage: '&4武器哥布林逃脱了!' +wendigo: + name: '$eventBossLevel &7温迪戈' + locationMessage: '&cWendigo: $distance格!' + spawnMessage: '&cSomething awful出现了!' + deathMessage: '&aWendigo has been slain $players!.' + escapeMessage: '&4Wendigo has disappeared!' +wendigo_summon: + name: '$reinforcementLevel &a温迪哥' +werehare: + name: '$eventBossLevel &5爱丽丝' + locationMessage: '&c兔人:$distance格!' + spawnMessage: '&c怪物发出了血腥的咆哮声!兔人出现了!' + deathMessage: '&a$players结束了兔人的主宰!' + escapeMessage: '&4兔人逃跑了!' +werehare_p2: + name: '$eventBossLevel &d兔人' +wild_wolf: + name: '$reinforcementLevel &7野狼' +wood_league_wave_10_boss: + name: '$bossLevel &4恶犬' +wood_league_wave_10_reinforcement: + name: '$reinforcementLevel &c恶犬随从' +wood_league_wave_11_melee: + name: '$normalLevel &4竞技场僵尸' +wood_league_wave_11_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_12_melee: + name: '$normalLevel &4竞技场僵尸' +wood_league_wave_12_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_13_melee: + name: '$normalLevel &4竞技场僵尸' +wood_league_wave_13_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_14_melee: + name: '$normalLevel &4竞技场僵尸' +wood_league_wave_14_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_15_miniboss: + name: '$bossLevel &4Oinkers先生' + onDamagedMessages: + - 哼!? +wood_league_wave_16_melee: + name: '$normalLevel Oinkers先生的粉丝' +wood_league_wave_16_ranged: + name: '$normalLevel Oinkers先生的粉丝' +wood_league_wave_17_melee: + name: '$normalLevel &4竞技场僵尸' +wood_league_wave_17_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_18_melee: + name: '$normalLevel &4击剑俱乐部爱好者' +wood_league_wave_19_ranged: + name: '$normalLevel 射箭俱乐部爱好者' +wood_league_wave_1_melee: + name: '$normalLevel 竞技场僵尸' +wood_league_wave_1_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_20_boss: + name: '$bossLevel &2佐尔坦' +wood_league_wave_21_melee: + name: '$normalLevel &4竞技场僵尸' +wood_league_wave_21_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_22_melee: + name: '$normalLevel &4竞技场僵尸' +wood_league_wave_22_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_23_melee: + name: '$normalLevel &4竞技场僵尸' +wood_league_wave_23_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_24_melee: + name: '$normalLevel &4竞技场僵尸' +wood_league_wave_24_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_25_miniboss: + name: '$minibossLevel &bAgdluak' +wood_league_wave_26_melee: + name: '$normalLevel &4竞技场僵尸' +wood_league_wave_26_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_27_melee: + name: '$normalLevel &4竞技场僵尸' +wood_league_wave_27_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_28_melee: + name: '$normalLevel &4竞技场僵尸' +wood_league_wave_29_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_2_melee: + name: '$normalLevel 竞技场僵尸' +wood_league_wave_2_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_30_boss: + name: '$bossLevel &2南方毒蛇' +wood_league_wave_31_melee: + name: '$normalLevel &4竞技场僵尸' +wood_league_wave_31_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_32_melee: + name: '$normalLevel &4竞技场僵尸' +wood_league_wave_32_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_33_melee: + name: '$normalLevel &4竞技场僵尸' +wood_league_wave_33_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_34_melee: + name: '$normalLevel &4竞技场僵尸' +wood_league_wave_34_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_35_miniboss: + name: '$minibossLevel &6小丑' +wood_league_wave_36_melee: + name: '$normalLevel &4竞技场僵尸' +wood_league_wave_36_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_37_melee: + name: '$normalLevel &4竞技场僵尸' +wood_league_wave_37_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_38_melee: + name: '$normalLevel &4竞技场剑士' +wood_league_wave_39_ranged: + name: '$normalLevel 竞技场弓箭手' +wood_league_wave_3_melee: + name: '$normalLevel 竞技场僵尸' +wood_league_wave_3_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_40_boss: + name: '$bossLevel &c「诅咒背负者」克鲁西奥' +wood_league_wave_41_melee: + name: '$normalLevel &4竞技场僵尸' +wood_league_wave_41_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_42_healer: + name: '$normalLevel 竞技场医师' +wood_league_wave_42_melee: + name: '$normalLevel &4竞技场僵尸' +wood_league_wave_42_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_43_healer: + name: '$normalLevel 竞技场医师' +wood_league_wave_43_melee: + name: '$normalLevel &4竞技场僵尸' +wood_league_wave_43_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_44_healer: + name: '$normalLevel 竞技场医师' +wood_league_wave_44_melee: + name: '$normalLevel &4竞技场僵尸' +wood_league_wave_44_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_45_miniboss: + name: '$minibossLevel &6千刃' +wood_league_wave_46_healer: + name: '$normalLevel 竞技场医师' +wood_league_wave_46_melee: + name: '$normalLevel &4竞技场僵尸' +wood_league_wave_46_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_47_healer: + name: '$normalLevel 竞技场医师' +wood_league_wave_47_melee: + name: '$normalLevel &4竞技场僵尸' +wood_league_wave_47_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_48_healer: + name: '$normalLevel 竞技场医师' +wood_league_wave_48_melee: + name: '$normalLevel &4竞技场僵尸' +wood_league_wave_49_healer: + name: '$normalLevel 竞技场医师' +wood_league_wave_49_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_4_melee: + name: '$normalLevel 竞技场僵尸' +wood_league_wave_4_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_50_boss: + name: '$bossLevel &6冠军乌瑟尔' +wood_league_wave_50_boss_p2: + name: '$bossLevel &6冠军乌瑟尔' +wood_league_wave_50_boss_p3: + name: '$bossLevel &6冠军乌瑟尔' +wood_league_wave_50_reinforcement: + name: '$reinforcementLevel &6乌瑟尔援军' +wood_league_wave_5_miniboss: + name: '$minibossLevel &c怪牛' + onDamagedMessages: + - 汪! +wood_league_wave_6_melee: + name: '$normalLevel 竞技场僵尸' +wood_league_wave_6_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_7_melee: + name: '$normalLevel 竞技场僵尸' +wood_league_wave_7_ranged: + name: '$normalLevel 竞技场弩手' +wood_league_wave_8_melee: + name: '$normalLevel 竞技场僵尸' +wood_league_wave_9_ranged: + name: '$normalLevel 竞技场弩手' +yeti: + name: '$eventBossLevel &b雪人' + locationMessage: '&cYeti: $distance格!' + spawnMessage: '&c强大的beast出现了!' + deathMessage: '&abeast is no more thanks to $players!.' + escapeMessage: '&4beast has escaped!' +yezhi_baba: + name: '$eventBossLevel &c叶芝芭芭' + locationMessage: '&c叶芝芭芭:$distance格!' + spawnMessage: '&c肮脏巫婆出现了!' + deathMessage: '&a$players暂时让巫婆安息了。' + escapeMessage: '&4巫婆离开了!' +yezhi_baba_summon: + name: '$reinforcementLevel &4叶芝芭芭' +zombie_friends_friend: + name: '$reinforcementLevel &7僵尸朋友' +zombie_king: + name: '$eventBossLevel &4僵尸王' + locationMessage: '&c僵尸王位置:$location格之外' + spawnMessage: '&c僵尸王出现了!' + deathMessage: '&a僵尸王被$players杀死了!' + escapeMessage: '&4僵尸王已逃跑!' +zombie_parents_dad: + name: '$reinforcementLevel &7僵尸爸爸' +zombie_parents_mom: + name: '$reinforcementLevel &7僵尸妈妈' +back_teleporter: + name: 赫尔墨斯 + role: <神使|传送者> + greetings: + - 欢迎来到\n冒险者公会大厅! + dialog: + - 想要回去? + farewell: + - 一路顺风。 + noPreviousLocationMessage: '&8[精英怪物] &c无法传送到上一个位置 - 找不到上一个位置!' +barkeep: + name: 巴特利 + role: <酒保> + greetings: + - 想要喝点什么吗? + - 来喝点什么吧 + - 你口渴了? + - 哥们,你好. + dialog: + - 来尝尝我们的酒吧. + - 在其他地方你可找不到这么好的酒. + - 感情深\n一口闷. + farewell: + - 记得常来! + - 喝一口吧! + - Kampai! + - Salut! + - Brosd! + - Salud! + - À la vôtre ! + - Prost! + - Santi! + - Salute! + - Saúde! + - Cheers! + - 乾杯! +blacksmith: + name: 格雷格 + role: <铁匠> + greetings: + - 欢迎来到我的商店! + - 来这里出售你的好东西! + - 新鲜出炉的装备,绝对有一款适合你! + - 你想卖点什么? + - 想要买些好装备吗? + - 瞧瞧新出炉的装备! + dialog: + - 高级的精英怪\n会掉落更有价值的物品! + - 拥有更多附魔的装备\n更值钱! + - 高级精英怪\n会掉落更好的物品! + - 高级精英怪\n有更高的几率掉落战利品! + - + - + - 一些物品\n拥有特殊的药水效果! + - 还有一些物品\n拥有特殊的效果! + - 狩猎附魔\n会吸引你附近的精英怪! + - 你可以找我出售精英怪掉落的特殊武器和装备! + - 更高的公会等级\n会增加精英怪掉落的物品质量! + farewell: + - 谢谢惠顾! + - 记得常来! + - 随时奉陪! + - 向你的朋友推荐我的商店吧! +combat_instructor: + name: 查尔斯 + role: <战斗导师> + greetings: + - 想学习战斗知识吗? + - 要不要上战斗课? + - 想知道更多关于战斗的知识吗? + - 准备好与精英怪物战斗了吗? + dialog: + - 精英怪物身上的环绕物\n显示的是其拥有的能力。 + - 精英怪物等级越高\n其拥有的能力也越多 + - 精英怪物等级越高\n其掉落战利品也越好 + - 高级的精英怪物\n有更高的几率\n掉落特殊物品 + - 环绕物为\n箭:\n向附近的玩家发射箭 + - 环绕物为\n末影之眼:\n击中玩家时使其致盲 + - 环绕物为\n魔法粒子:\n击中玩家时使其反胃 + - 环绕物为\n岩浆桶:\n击中玩家时使其燃烧 + - |- + 环绕物为\n火焰弹:\n发射火球 + - 环绕物为\n浮冰:冻结玩家 + - 环绕物为\n鞘翅:使玩家飘浮 + - 环绕物为\n绿宝石:中毒 + - 环绕物为\n活塞:推开玩家 + - 环绕物为\n不死图腾:虚弱玩家 + - 环绕物为\n蜘蛛网:结网 + - 环绕物为\n头颅:凋零 + - 环绕物为\n箱子:掉落特殊战利品 + - 环绕物为\n金鞋:增加移速 + - 环绕物为\n唱片机:嘲讽 + - 环绕物为\n玻璃板:隐身 + - 环绕物为\n光灵箭:免疫弓箭伤害 + - 环绕物为\n羽毛:免疫摔落伤害 + - 环绕物为\n烈焰粉:免疫火焰伤害 + - 环绕物为\n铁砧:更重 + - 环绕物为\n骨块:死亡时留下骨块 + - 环绕物为\n史莱姆块:跳得更高 + - 环绕物为\n粘液球:死亡时创造真空 + - 环绕物为\n拴绳:拉住你 + - 环绕物为\n骨头:创建骨柱 + - 环绕物为\n药箭:发射追踪箭 + - 环绕物为\n蘑菇:变大 + - 环绕物为\n头颅:召唤援军 + - 环绕物为\n书本:杀死召唤者时召唤援军 + - 环绕物为\n鸡蛋:召唤援军 + - 环绕物为\n烟花火箭:召唤火箭队 +enhancer_config: + name: 提姆 + role: <强化商人> + greetings: + - 想要升级装备吗? + - 有升级球吗? + - 来我这儿升级装备吧! + - 嗨! + - 你有废品吗? + dialog: + - 你的装备很一般,\n来我这升级吧! + - 来我这儿升级装备吧! + - 有升级球吗? + - 你的武器太菜了,\n来我这升级吧! + - 你需要升级装备吗? + farewell: + - 别让你自己难堪! + - 有更多升级球了再来找我! + - 去找更多升级球吧! +frost_queen_teleporter: + name: 霜冻之伊沙德 + role: <冰雪宫殿传送点> + greetings: + - '' +guide_0: + name: 达克斯 + role: <向导> + greetings: + - 冒险者公会怎么样? + - 你去过冒险者公会吗? + - 你听说过冒险者公会吗? + - 你知道冒险者公会吗? + dialog: + - 冒险者公会怎么样? + - 你去过冒险者公会吗? + - 你听说过冒险者公会吗? + - 你知道冒险者公会吗? + farewell: + - 随时回来 + - 一路顺风! + - 稍后见! + - 我会在这里等你! +guide_1: + name: 卡萨斯 + role: <向导> + greetings: + - 你需要帮助吗? + - 需要指导吗? + - 你迷路了吗? + - 需要帮助? + dialog: + - 我对这片地方了如指掌! + - 想要见见冒险者公会的其他成员吗? + - 需要认识这片地方吗? + farewell: + - 随时回来 + - 一路顺风! + - 稍后见! + - 我会在这里等你! +guild_attendant: + name: 吉莉安 + role: <公会向导> + greetings: + - 欢迎来到\n冒险者公会! + - 热烈欢迎! + dialog: + - 去任务版看看\n有没有可接受的任务! + - 你可以和我谈话来\n更改你的公会等级! + - 你可以出售物品\n给铁匠来获取精英币! + - 你可以和\n竞技场王者谈话来进入精英怪竞技场! + - 你可以从铁匠处购买装备! + - 你可以和战争领主谈话\n来查看你的战斗等级! + - 解锁新的公会等级\n并增加你的生命值上限! + farewell: + - 一会儿见! + - 感谢你的驻足! + - 继续狩猎精英怪吧! +primis_69ozcanofbepis: + name: '&a69OzCanOfBepis' + role: '&2地图制作者' + dialog: + - 希望你喜欢这张地图! + farewell: + - 玩的开心! +primis_caeruleaum_fisherman: + name: '&3皮西斯·涅墨西斯' + role: '&b<渔夫>' + greetings: + - 你好啊! + dialog: + - 哇喔! 差点从船上掉下来。 + - 该死的海怪! + - 需要更多诱饵 + farewell: + - 稍后! + - 祝你好运! +primis_caeruleaum_fletcher: + name: '&6文特斯·阿迪菲克斯' + role: '&e<老造箭者>' + greetings: + - 你好。 + dialog: + - 我曾经也像你一样是个冒险家。 + - 欢迎,外来者 + - 你想要点什么? + - |- + 你不是来自本地的,对吗? + farewell: + - 一会儿见! + - 记得常来! +primis_caeruleaum_forager: + name: '&5维纳托·巴布拉图斯' + role: '&d<受伤的觅食者>' + greetings: + - 你好,陌生人 + dialog: + - 我曾经也像你一样是个冒险家。 + - 欢迎,外来者 + - 你想要点什么? + - |- + 你不是来自本地的,对吗? + farewell: + - 一会儿见! + - 记得常来! +primis_caeruleaum_hint_giver: + name: '&f维尔·洛奎克斯' + role: '&f智者' + greetings: + - 你好! + - 您好! + - 很高兴能见到你! + - 你好! + dialog: + - + - + - + - + - 西南方的废墟十分恐怖!\n没人会去片鬼地方…… + - + - + - 听说狼窝里住进了\n一只邪恶的狼! + farewell: + - 再见! + - 我将等待着你! + - 有空再来找我吧! + - 再见! +primis_caeruleaum_injured_fisherman: + name: '&3聪明的渔夫' + role: '&b<受伤的渔夫>' + greetings: + - 你好啊,漫游者。 + dialog: + - 最近有钓到什么好鱼吗? + - 欢迎,外来者 + - 你想要点什么? + - |- + 你不是我们这儿的本地人, + 对吧? + farewell: + - 一会儿见! + - 记得常来! +primis_caeruleaum_jeeves: + name: 吉夫斯 + role: <旅行商人> + greetings: + - 旅行找我就对了! + dialog: + - 在这里把东西卖给店家! + - 我正在忙着谈生意! + - 我现在没空,等会再来吧! + farewell: + - 忙着呢!让开! +primis_caeruleaum_leader: + name: '&4双鱼村长' + role: '&c<村长>' + greetings: + - 欢迎来到村庄! + dialog: + - |- + 不要问这个村庄能为你做什么, + 问问你能为这个村庄做些什么! + - 欢迎,外来者 + - 你想要点什么? + - |- + 你不是来自本地的,对吗? + farewell: + - 走吧! + - 记得常来! +primis_caeruleaum_merchant: + name: 安普特 + role: <商人> + greetings: + - 想卖点东西吗 + dialog: + - 强盗偷了我的东西! + - 恐怕我没有可卖的东西了。 + - 我会买下你所有的东西! + farewell: + - 一路顺风! +primis_captain: + name: '&4角鲨船长' + role: '&c<探险队长>' + greetings: + - 你终于醒啦! + - 那真是一次狂野之旅! + - 还活着吗? + - 别再那么做了! + dialog: + - 我有个任务要交给你! + - 我需要你的帮助! + - |- + 还好有你在, + 我们需要一些帮助! + farewell: + - 走吧! + - 别忘了我! + - 记得常来! +primis_deli'o: + name: '&e德里奥' + role: '&6地图制作者(游戏爱好者)' + dialog: + - 希望你喜欢这张地图! + farewell: + - 玩的开心! +primis_farmstead_son: + name: '&4菲留斯' + role: '&c<灯塔看守人之子>' + greetings: + - 你从哪来的? + - 你似乎远道而来。 + dialog: + - 我们生活在危险的时期。 + - 你见过我的父亲吗? + - 灯塔黯淡无光,船只何以远航? + farewell: + - 小心你的背后。 + - 轻轻踩踏 +primis_farmstead_wife: + name: '&4雅玛维特' + role: '&c<灯塔守护者的妻子>' + greetings: + - 我以前没见过你! + - 是否有庞蒂斯·米勒的消息? + dialog: + - 你见过我的丈夫吗? + - 我需要你的帮助! + - 我们生活在多么危险的时代。 + - 有点不对劲! + farewell: + - 一路顺风! + - 非常感谢! +primis_first_mate: + name: '&c伊拉昆迪' + role: '&c<大副>' + greetings: + - 你终于醒啦! + - 那真是一次疯狂的旅行! + - 还活着吗? + - 别再那么做了。 + dialog: + - 我有个任务要交给你! + - 我需要你的帮助! + - |- + 还好有你在, + 我们需要一些帮助! + farewell: + - 走吧! + - 别忘了我! + - 记得常来! +primis_frostcone: + name: '&bFrostCone' + role: '&9地图制作者(游戏玩家)' + dialog: + - 希望你喜欢这张地图! + - 这是一个被雪覆盖的松树林。 + - 普里米斯出了吗? + farewell: + - 玩的开心! +primis_gladius_guard_1: + name: '&2警卫' + role: '&a<格拉迪厄斯警卫>' + greetings: + - 小心点! + - 增援吗? + - 该死的入侵者! + - 小心背后。 + - 小心。 +primis_gladius_guard_2: + name: '&2警卫' + role: '&a<格拉迪厄斯警卫>' + greetings: + - 小心点! + - 增援吗? + - 该死的入侵者! + - 小心背后。 + - 小心。 +primis_gladius_guard_3: + name: '&2警卫' + role: '&a<格拉迪厄斯警卫>' + greetings: + - 小心点! + - 增援吗? + - 该死的入侵者! + - 小心背后。 + - 小心。 +primis_gladius_guard_4: + name: '&2警卫' + role: '&a<格拉迪厄斯警卫>' + greetings: + - 小心点! + - 增援吗? + - 该死的入侵者! + - 小心背后。 + - 小心。 +primis_gladius_lord: + name: '&4哈斯塔将军' + role: '&c<格拉迪厄斯领主>' + greetings: + - 你是来帮忙的吗? + - 外面是战区! + dialog: + - 他们晚上来的! + - 我们没看到他们进来! + - 我们的增援在哪里? + farewell: + - 小心背后。 + - 小心点! +primis_gladius_quartermaster: + name: '&6西巴斯' + role: '&c<军需官>' + greetings: + - 你是来帮忙的吗? + - 外面是战区! + dialog: + - 他们晚上来的! + - 我们没看到他们进来! + - 我们的增援在哪里? + farewell: + - 小心背后。 + - 小心点! +primis_gladius_strategist: + name: '&6贝利' + role: '&c<战略家>' + greetings: + - 你是来帮忙的吗? + - 外面是战区! + dialog: + - 他们晚上来的! + - 我们没看到他们进来! + - 我们的增援在哪里? + farewell: + - 小心背后。 + - 小心点! +primis_groves_nemus_leader: + name: '&3国王尼米安' + role: '&c<镇长>' + dialog: + - 是什么把你带到山下的? + - 你从哪里来? + - |- + 你尝过我们的 + 美味的发光浆果吗? + farewell: + - 下次再见 +primis_ice_village_fisherman_boat: + name: '&3欧普若皮迪·尼禄' + role: '&3<渔夫>' + greetings: + - 钓鱼的好日子! + dialog: + - 今天不适合钓鱼。 + - 还没有鱼咬钩。 + - 保持耐心。 + farewell: + - 小心不要\n掉进水里! +primis_ice_village_friendly_villager: + name: '&3卢苏里亚·普拉西杜斯' + role: '&3<友善的村民>' + greetings: + - 你好! + dialog: + - 老当益壮! + - 保持好心情\n是很重要的。 + - 希望能\n下一点雪。 + farewell: + - 再见了! +primis_ice_village_generic_npc_1: + name: '&3阿尔贝图斯·维塔利斯' + role: '&3<村民>' + greetings: + - 你心情如何? + dialog: + - 没有什么比得上好啤酒! + farewell: + - 再见。 +primis_ice_village_generic_npc_10: + name: '&3特雷巴蒂亚·科尼克斯' + role: '&3<村民>' + greetings: + - 好的。 + dialog: + - 嗯,知道了。 + - 我懂了…… + - 噢! + farewell: + - 下次有机会的话\n我会试试。 +primis_ice_village_generic_npc_11: + name: '&3阿尔巴提亚·拉特兰纳' + role: '&3<村民>' + greetings: + - 你要找维奥莱特? + dialog: + - 不要惹麻烦。 + farewell: + - 再见陌生人。 +primis_ice_village_generic_npc_12: + name: '&3霍斯蒂利亚·卡兰图斯' + role: '&3<村民>' + greetings: + - 你好 + dialog: + - 我正要\n离开。 + farewell: + - 再见。 +primis_ice_village_generic_npc_13: + name: '&3瓦根尼亚·塞亚努斯' + role: '&3<村民>' + greetings: + - 你好啊! + dialog: + - 是什么让你\n来到码头的? + farewell: + - 拜拜! +primis_ice_village_generic_npc_14: + name: '&3迪尼亚·维托纽斯' + role: '&3<囚犯>' + greetings: + - 嗨! + dialog: + - 改日再见…… + farewell: + - '..。' +primis_ice_village_generic_npc_15: + name: '&3塞莱德鲁斯·马卡拉斯' + role: '&3<囚犯>' + greetings: + - 嗨! + dialog: + - 改日再见…… + farewell: + - '..。' +primis_ice_village_generic_npc_16: + name: '&3弗里德里库斯·卡斯蒂纳斯' + role: '&3<囚犯>' + greetings: + - 嗨! + dialog: + - 改日再见…… + farewell: + - '..。' +primis_ice_village_generic_npc_17: + name: '&3卡里奥 菲布里亚' + role: '&3<囚犯>' + greetings: + - 嗨! + dialog: + - 改日再见…… + farewell: + - '..。' +primis_ice_village_generic_npc_18: + name: '&3皮斯卡托雷斯·拉维努斯' + role: '&3<囚犯>' + greetings: + - 嗨! + dialog: + - 改日再见…… + farewell: + - '..。' +primis_ice_village_generic_npc_19: + name: '&3蒙克里乌斯·维塔利斯' + role: '&3<村民>' + greetings: + - 去打猎了吗? + dialog: + - 打猎的时候到了。 + farewell: + - 再见了. +primis_ice_village_generic_npc_2: + name: '&3卢苏里亚·泰伦努斯' + role: '&3<村民>' + greetings: + - 你过得怎么样? + dialog: + - 再下一步 + farewell: + - 再见。 +primis_ice_village_generic_npc_3: + name: '&3奥雷里奥·尼吉迪乌斯' + role: '&3<村民>' + greetings: + - 你好啊。 + dialog: + - 真有眼光! + farewell: + - 再会! +primis_ice_village_generic_npc_4: + name: '&3莱西达莫斯·帕拉图斯' + role: '&3<村民>' + greetings: + - 出去散个步? + dialog: + - 我简直无法想象\n没有雪\n怎么生活。 + - 开始变冷了。 + farewell: + - 稍后见。 +primis_ice_village_generic_npc_5: + name: '&3西莫·普罗修斯' + role: '&3<村民>' + greetings: + - 多棒的风景! + dialog: + - 我喜欢登山。 + - 看那些鱼! + farewell: + - 对。 +primis_ice_village_generic_npc_6: + name: '&3多达罗斯·马鲁利努斯' + role: '&3<村民>' + greetings: + - 欢迎来到酒吧! + dialog: + - 是时候让我的\n手指暖起来了。 + - 好暖和。 + farewell: + - 别让寒冷\n影响你。 +primis_ice_village_generic_npc_7: + name: '&3特拉尼奥·西尔瓦努斯' + role: '&3<村民>' + greetings: + - 这是哪里…… + dialog: + - 这是在哪。 + farewell: + - 我确定\n我离开了这里的。 +primis_ice_village_generic_npc_8: + name: '&3米洛尼亚·特雷贝利乌斯' + role: '&3<村民>' + greetings: + - 欢迎来到\n村庄! + dialog: + - 我很饿。 + - 可以去吃\n些鲑鱼。 + farewell: + - 再见了. +primis_ice_village_generic_npc_9: + name: '&3巴里亚·布罗库斯' + role: '&3<村民>' + greetings: + - 你听到了吗... + dialog: + - Keep that in mind\nnext time you swing\nyour剑. + - 盾牌可以做到的\n不止是防御。 + farewell: + - 明白了吗? +primis_ice_village_hunter: + name: '&3阿兰努斯·伊萨蒂斯' + role: '&3<野猪猎人>' + greetings: + - 嘿! + dialog: + - 希望明天\n是个好日子。 + - 这季节肯定\n有很多野猪。 + farewell: + - 回见。 +primis_ice_village_imprisoned_husband: + name: '&3厄琉斯·卡莱纳斯' + role: '&3<被囚禁的丈夫>' + greetings: + - '....。' + dialog: + - 在一个笼子里的改日再见…… + farewell: + - '....。' +primis_ice_village_jail_caretaker: + name: '&3菲洛拉切斯·特里非奥斯' + role: '&3<监狱看守>' + greetings: + - 你好啊。 + dialog: + - 还有什么需要\n修复。 + - 我应该检查\n一下笼子。 + farewell: + - 稍后。 +primis_ice_village_jail_guard: + name: '&3厄琉斯·费斯图斯' + role: '&3<狱警>' + greetings: + - 爬上高塔。 + dialog: + - 一切似乎还不错。 + - 几乎一切... + farewell: + - 保重。 +primis_ice_village_jail_master: + name: '&3罗曼努斯·素帕巴斯' + role: '&3<监狱长>' + greetings: + - 幸会。 + dialog: + - 如果你做不到,\n就不要犯罪。 + - 罪有应得。 + farewell: + - 稍后见。 +primis_ice_village_leader: + name: '&3格拉西斯·普林塞普斯' + role: '&3<村长>' + greetings: + - 嘿。 + dialog: + - 该死的冰元素! + - 太多麻烦了... + - 我们现在应该\n如何完成试炼呢。 + farewell: + - 再见。 +primis_ice_village_lighthouse_keeper: + name: '&3塞维利努斯·马提乌斯' + role: '&3<灯塔看守人>' + greetings: + - 你好,陌生人。 + dialog: + - 今天是个平静的日子。 + - 小心毛熊! + farewell: + - 放轻松。 +primis_ice_village_missing_daughter: + name: '&3科妮莉亚·恩诺迪乌斯' + role: '&3<迷失的女孩>' + greetings: + - 帮帮我…… + dialog: + - 走开,走开,\n走开! + - 那些不是\n真的... + - 不要看他们\n科妮莉亚。 + farewell: + - 再见。 +primis_ice_village_prisoner: + name: '&阿德里乌斯·卡本尼乌斯' + role: '&3<囚犯>' + greetings: + - 我是无辜的! + dialog: + - 这不是我该待的地方! + farewell: + - 带我离开这里! +primis_ice_village_pubkeeper: + name: '&3格拉尼娅·塞西利乌斯' + role: '&3<酒吧老板>' + greetings: + - 欢迎! + dialog: + - 马上到! + - 试试我们的黑啤酒吧! + - 要来一杯吗? + farewell: + - 再来一杯! +primis_ice_village_tower_squatter: + name: '&3莫德斯特·尤洛吉乌斯' + role: '&3<村民>' + greetings: + - 不要发出噪音! + dialog: + - 太多叫喊声了! + - 尽量平静\n下来! + farewell: + - 再见。 +primis_ice_village_violet: + name: '&5多米娜·维奥莱特' + role: '&d<盾女>' + greetings: + - 我有问你的\n意见了? + dialog: + - 出来感觉\n好多了。 + - 他们付钱,\n我来收钱。 + farewell: + - 不出我所料! +primis_ice_village_worried_father: + name: '&3斯帕拉克斯·恩诺迪厄斯' + role: '&3<忧心忡忡的父亲>' + greetings: + - 希望她还好... + dialog: + - 请保证我们\n女儿的安全。 + farewell: + - 再见。 +primis_ice_village_worried_mother: + name: '&3塞斯提亚·恩诺迪厄斯' + role: '&3<忧心忡忡的母亲>' + greetings: + - 她去哪里了呢? + dialog: + - 嗯,她失去了踪迹。 + farewell: + - 再见。 +primis_ice_village_worried_wife: + name: '&3提提亚·卡里努斯' + role: '&3<忧心忡忡的妻子>' + greetings: + - 你好啊! + dialog: + - 床铺干净漂亮。 + - 我错过了什么吗? + - 又整理好了一个箱子。 + farewell: + - 再见! +primis_magmaguy: + name: '&4Magmaguy' + role: '&c主开发者' + dialog: + - 希望你喜欢这个地图! + farewell: + - 玩的愉快! +primis_mountain_guide: + name: '&4佩特拉' + role: '&c<登山向导>' + greetings: + - 欢迎来到村庄! + dialog: + - |- + 不要问这个村庄能为你做什么, + 问问你能为这个村庄做些什么! + - 欢迎,外来者 + - 你想要点什么? + - |- + 你不是来自本地的,对吗? + farewell: + - 你可以走了! + - 记得常来! +primis_mountain_guide_2: + name: '&4佩特拉' + role: '&c<登山向导>' + greetings: + - 欢迎来到村庄! + dialog: + - |- + 不要问这个村庄能为你做什么, + 问问你能为这个村庄做些什么! + - 欢迎,外来者 + - 你想要点什么? + - |- + 你不是来自本地的,对吗? + farewell: + - 走吧! + - 记得常来! +primis_nemus_leader: + name: '&3国王尼米安' + role: '&c<镇长>' + dialog: + - 是什么把你带到山下的? + - 你从哪里来? + - |- + 你尝过我们的 + 美味的发光浆果吗? + farewell: + - 下次再见 +primis_ogre_mines_escaped_miner: + name: '&c福吉特·福索斯' + role: '&c<逃脱的矿工>' + greetings: + - 真不敢相信我做到了! + - 他们无处不在! + - 能帮把手吗? + dialog: + - 我有个任务要交给你! + - 我需要你的帮助! + farewell: + - 走吧! + - 在这得小心点! + - 注意安全! +primis_ogre_mines_lone_miner: + name: '&c富提斯·福索斯' + role: '&c<孤单的矿工>' + greetings: + - 终于有人能帮我了! + - 别被他们发现! + - 帮帮我! + dialog: + - 我有个任务要交给你! + - 我需要你的帮助! + farewell: + - 走吧! + - 给我回来挖矿! + - 注意安全! +primis_ogre_mines_old_miner: + name: '&c维特斯·福索斯' + role: '&c<老矿工>' + greetings: + - 你好,小伙子! + - 你看起来有点迷茫! + - 是什么把你带到这来的? + dialog: + - 我有个任务要交给你! + - 我需要你的帮助! + farewell: + - 走吧! + - 别被矿螨咬了! + - 注意安全! +primis_ogre_mines_panicked_miner: + name: '&c梅图斯' + role: '&c<惊慌的矿工>' + greetings: + - 矿井被占领了! + dialog: + - 到处都是兽人! + - 你能帮我们吗? + farewell: + - 小心! +primis_pontis_citizen_1: + name: '&7阿革塔斯托扣斯·戈尔戈纽斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗?你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_10: + name: '&7帕达利斯卡 索尼乌斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_11: + name: '&7索贝塞德斯·科利亚斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_12: + name: '&7萨托里奥·卡埃皮奥' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_13: + name: '&7C克里萨卢斯·特雷博尼乌斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_14: + name: '&7托克西鲁斯·麦克隆' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_15: + name: '&7弗洛西恩·维罗迪奥' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_16: + name: '&7奥雷里奥·佐伊卢斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_17: + name: '&7迪尼亚克斯·内利乌斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_18: + name: '&7克莱斯特拉塔`塞诺皮乌斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_19: + name: '&7乔治斯·索里奥' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_2: + name: '&7弗朗西斯库斯·克里斯皮恩' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_20: + name: '&7艾匹迪卡斯·西尔瓦努斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_21: + name: '&7普鲁西科·马尔切利努斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_22: + name: '&7普莱西迪普斯·涅尔瓦' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_23: + name: '&7普莱西迪普斯·梅杰卢斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_24: + name: '&7弗雷德里库斯·阿查科斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_25: + name: '&7科库利奥·佐西穆斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_26: + name: '&7德米弗·西尔维乌斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_27: + name: '&7派尼克斯·内梅修斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_28: + name: '&7廷达鲁斯·福斯蒂纽斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_29: + name: '&7苏尔皮西奥·潘瑟拉' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_3: + name: '&7蒂科·塞利克' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_30: + name: '&7梅莱尼斯·格拉修斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_31: + name: '&7廷达鲁斯·哥伦巴努斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪里来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_32: + name: '&7安塔蒙尼德斯·瑟林斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_33: + name: '&7莱斯博尼库斯·莫姆斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_34: + name: '&7弗里德里克斯·萨洛尼努斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_35: + name: '&7安泰斯蒂利斯·法布里修斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_36: + name: '&7廷达鲁斯·奥古斯塔斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_37: + name: '&7莫德斯特·阿佩尔' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_38: + name: '&7亨利库斯·克拉苏斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_39: + name: '&7弗朗西斯库斯·坦西努斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_4: + name: '&7艾德瓦科提·麦克恩' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_40: + name: '&7菲利亚·奥勒留斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_5: + name: '&7艾德瓦科提·麦克恩' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_6: + name: '&7梅塞尼奥·雷克图斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_7: + name: '&7哈德里乌斯·多尼库斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_8: + name: '&7苏尔皮西奥·塞亚努斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_citizen_9: + name: '&7斯塔西姆斯·穆蒂鲁斯' + role: '&8千桥居民' + dialog: + - 你去过天文台吗? + - 你从哪来的? + - 你看起来不像这里附近的人... + - 今天是个好日子。 + farewell: + - 回头见! + - 再见了! +primis_pontis_dockworker_1: + name: '&3千桥船工' + role: '&8码头工人' + dialog: + - 大量的物资需要搬运! + - 小心 ! + - 借过借过。 + farewell: + - 我将等待着你! +primis_pontis_dockworker_10: + name: '&3千桥船工' + role: '&8码头工人' + dialog: + - 大量的物资需要搬运! + - 小心 ! + - 借过借过。 + farewell: + - 我将等待着你! +primis_pontis_dockworker_2: + name: '&3千桥船工' + role: '&8码头工人' + dialog: + - 大量的物资需要搬运! + - 小心 ! + - 借过借过。 + farewell: + - 我将等待着你! +primis_pontis_dockworker_3: + name: '&3千桥船工' + role: '&8码头工人' + dialog: + - 大量的物资需要搬运! + - 小心 ! + - 借过借过。 + farewell: + - 我将等待着你! +primis_pontis_dockworker_4: + name: '&3千桥船工' + role: '&8码头工人' + dialog: + - 大量的物资需要搬运! + - 小心 ! + - 借过借过。 + farewell: + - 我将等待着你! +primis_pontis_dockworker_5: + name: '&3千桥船工' + role: '&8码头工人' + dialog: + - 大量的物资需要搬运! + - 注意! + - 借过借过。 + farewell: + - 我将等待着你! +primis_pontis_dockworker_6: + name: '&3千桥船工' + role: '&8码头工人' + dialog: + - 大量的物资需要搬运! + - 注意! + - 借过借过。 + farewell: + - 我将等待着你! +primis_pontis_dockworker_7: + name: '&3千桥船工' + role: '&8码头工人' + dialog: + - 大量的物资需要搬运! + - 小心 ! + - 借过借过。 + farewell: + - 我将等待着你! +primis_pontis_dockworker_8: + name: '&3千桥船工' + role: '&8码头工人' + dialog: + - 大量的物资需要搬运! + - 小心 ! + - 借过借过。 + farewell: + - 我将等待着你! +primis_pontis_dockworker_9: + name: '&3千桥船工' + role: '&8码头工人' + dialog: + - 大量的物资需要搬运! + - 小心 ! + - 借过借过。 + farewell: + - 我将等待着你! +primis_pontis_enhancer: + name: '&7梅丽恩' + role: '&8<强化商人>' + greetings: + - 需要升级吗? + - 你有垃圾装备吗? + - 让我们升级吧! + dialog: + - 我会升级废品! + - 给我带废品来! + - 升级你的废品装备! +primis_pontis_gardener_1: + name: '&e戈尔金斯·阿西纳' + role: '&8园艺家' + dialog: + - 这些花很美吧? + - 小心,别碰到我的杰作! + - 花儿在绽放。 + farewell: + - 请勿践踏美丽的花朵。 + - 随时保持警惕! +primis_pontis_gardener_2: + name: '&e皮斯卡托雷斯·奥里苏斯' + role: '&8园艺家' + dialog: + - 难道这些花不漂亮吗? + - 看,我的杰作! + - 花儿在绽放。 + farewell: + - 请勿践踏美丽的花朵。 + - 保重了! +primis_pontis_gardener_3: + name: '&e阿尔塞姆斯·阿比托' + role: '&8园艺家' + dialog: + - 这些花很美吧? + - 小心,别碰到我的杰作! + - 花儿在绽放。 + farewell: + - 请勿践踏美丽的花朵。 + - 保重了! +primis_pontis_gardener_4: + name: '&e佩格波尼斯·柏蓓娜' + role: '&8园艺家' + dialog: + - 这些花很美吧? + - 小心,别碰到我的杰作! + - 花儿在绽放。 + farewell: + - 请勿践踏美丽的花朵。 + - 保重了! +primis_pontis_gardener_5: + name: '&e莱姆尼塞莱尼斯·格拉西斯' + role: '&8园艺家' + dialog: + - 这些花很美吧? + - 小心,别碰到我的杰作! + - 花儿在绽放。 + farewell: + - 请勿践踏美丽的花朵。 + - 保重了! +primis_pontis_gardener_6: + name: '&e利西马库斯·苏利努斯' + role: '&8园艺家' + dialog: + - 这些花很美吧? + - 小心,别碰到我的杰作! + - 花儿在绽放。 + farewell: + - 请勿践踏美丽的花朵。 + - 保重了! +primis_pontis_gardener_7: + name: '&e斯特罗伯斯·发拉斯' + role: '&8园艺家' + dialog: + - 这些花很美吧? + - 小心,别碰到我的杰作! + - 花儿在绽放。 + farewell: + - 请勿践踏美丽的花朵。 + - 保重了! +primis_pontis_groves_catacombs_npc: + name: '&7失格者海依纳' + role: '&7<可疑的男人>' + greetings: + - 嘘! + dialog: + - 我听说那里有\n大量宝藏! + - 进去吧\n里面有好东西等着你! + - 你应该进来\n探险…… + - 为什么不进来呢? + - 进来吧…… + - 别担心,\n这里十分安全。 + - 我保证这里没有危险! + - 进来瞧瞧吧。 + - 你应该看看\n这里面! + - 嘿嘿嘿…… + - 也许里面有人\n需要你的帮助。 + - 进来吧! + - 你好奇吗? + - 你应该进来\n看一眼。 + farewell: + - 哈哈哈,稍后见! +primis_pontis_groves_generic_npc_1: + name: '&2西科芬达·穆修斯' + role: '&2<树林居民>' + greetings: + - 我很好! + dialog: + - 别担心我 + - 我的兄弟会来救我的。 + - 它们不会吃我。 + - 我没问题。 + farewell: + - 稍后见! +primis_pontis_groves_generic_npc_10: + name: '&2霍斯特利亚·梅图努斯' + role: '&2<树林居民>' + greetings: + - 你好。 + dialog: + - 你也很无聊吗? + - 呃,总有事情能做吧。 + - 也许我应该酿造更多饮品。 + farewell: + - 再见! +primis_pontis_groves_generic_npc_11: + name: '&2托蒂利亚·格塔' + role: '&2<树林居民>' + greetings: + - 你好。 + dialog: + - 我丈夫做的蛋糕最好。 + - 想要来一片吗? + - 美味无比! + farewell: + - 再见! +primis_pontis_groves_generic_npc_12: + name: '&2康森蒂亚·阿佩里努斯' + role: '&2<树林居民>' + greetings: + - 噢,你好。 + dialog: + - 看起来像是新的一样! + - 必须确保光照能让他们远离。 + - 又一个灯笼修好了…… + farewell: + - 别被蜘蛛咬了! +primis_pontis_groves_generic_npc_13: + name: '&2诺维亚·塞内西乌斯' + role: '&2<树林居民>' + greetings: + - 嗨! + dialog: + - 噢,没想到这地方会有人。 + - 只要速度够快,他们就抓不到你。 + - 蜘蛛阻挡不了我。 + - 这是我最喜欢的休息地点。 + farewell: + - 保重。 +primis_pontis_groves_generic_npc_14: + name: '&2马克西米亚·普利斯库斯' + role: '&2<鬼鬼祟祟的潜行者>' + greetings: + - 嘘…… + dialog: + - 别以为你可以从\n我的精灵那里偷东西…… + - 我要在他们入睡时\n夺回我的东西。 + - 我绕道而行才来到这里。 + - 他们没看到我。 + farewell: + - 小声点。 +primis_pontis_groves_generic_npc_15: + name: '&2赫伦尼亚·埃克苏普利斯' + role: '&2<树林居民>' + greetings: + - 你好啊。 + dialog: + - 刚刚醒。 + - 我能感觉到,这\n将是美好的一天。 + farewell: + - 再见。 +primis_pontis_groves_generic_npc_16: + name: '&2安翠亚毛苏斯' + role: '&2<树林居民>' + greetings: + - 你好。 + dialog: + - 不知道国王\n希望我怎么做…… + - 好多工作啊…… + - 忙,忙,忙。 + - 文书工作\n不会自动完成。 + farewell: + - 再见。 +primis_pontis_groves_generic_npc_17: + name: '&2裴斯泰洛齐·埃瑟普斯' + role: '&2<树林居民>' + greetings: + - 你好! + dialog: + - 如果你需要什么\n问国王要就行了。 + - 抱歉,我很忙。 + - 抱歉,\n我没时间闲聊。 + farewell: + - 再见。 +primis_pontis_groves_generic_npc_2: + name: '&2斯凯勒德鲁斯·弗雷迪休斯' + role: '&2<树林渔夫>' + greetings: + - 嘿! + dialog: + - 我其实是想钓虫子。 + - 树上掉下来了大石英虫。 + - 我用树液作为诱饵。 + - 石英虫绝对会上钩! + - 它们是两栖动物。 + - 得在它们爬上树前抓住它们。 + - 把它们烤熟十分美味。 + - 希望能有好的收获! + farewell: + - 稍后见。 +primis_pontis_groves_generic_npc_3: + name: '&2费利克斯·苏里斯' + role: '&2<树林居民>' + greetings: + - 你好! + dialog: + - 大海真美。 + - 我可以在这里站上好几天。 + - 蜘蛛确实很讨厌。 + farewell: + - 再见。 +primis_pontis_groves_generic_npc_4: + name: '&2佩里普拉克门斯·伯卡尼乌斯' + role: '&2<树林农民>' + greetings: + - 欢迎! + dialog: + - 还有很多发光浆果。 + - 希望你喜欢我的小农场。 + - 有这么多的葡萄藤需要处理。 + farewell: + - 稍后见。 +primis_pontis_groves_generic_npc_5: + name: '&2斯蒂芬努斯·马格努斯' + role: '&2<树林居民>' + greetings: + - 你好啊! + dialog: + - 你看了我们的浆果农场了吗? + - 正是散步的好时候。 + - 不能一直待在里面。 + farewell: + - 祝你好运。 +primis_pontis_groves_generic_npc_6: + name: '&2阿本丹修斯·罗加图斯' + role: '&2<树林居民>' + greetings: + - 你好啊! + dialog: + - 是什么带你来到我们的洞? + - 请随意驻足。 + farewell: + - 再见。 +primis_pontis_groves_generic_npc_7: + name: '&2阿尔巴努斯·伊夫马鲁斯' + role: '&2<树林居民>' + greetings: + - 放轻松…… + dialog: + - 什么?没错,我很好。 + - 不,我没有很多那个。 + - 再来一个…… + - 再来一品脱…… + farewell: + - 再见了. +primis_pontis_groves_generic_npc_8: + name: '&2巴克斯·阿文特努斯' + role: '&2<树林居民>' + greetings: + - 日安或夜安…… + dialog: + - 我现在很惬意。 + - 我们曾经更经常地去外面玩。 + - 最近外面太危险了。 + farewell: + - 祝福你。 +primis_pontis_groves_generic_npc_9: + name: '&2帕西科姆萨·格塔' + role: '&2<树林居民>' + greetings: + - 请进,请进! + dialog: + - 欢迎来到树林里最好的洞! + - 这个洞是我徒手建造的! + - 希望你喜欢! + farewell: + - 尽快回来! +primis_pontis_groves_hole_luxuria: + name: '&c卢苏里亚·戈尔戈纽斯' + role: '&c<洞穴居民>' + greetings: + - 你好! + - 你好呀! + dialog: + - 生活就是要放松。 + - 为什么要有压力。 + farewell: + - 有空再来找我! +primis_pontis_groves_hole_phygia: + name: '&c菲吉娅·戈尔戈尼' + role: '&c<洞穴居民>' + greetings: + - 欢迎来我家! + - 你好呀! + dialog: + - 我们得采取行动! + - 我们树林里精灵太多了! + farewell: + - 有空再来找我! +primis_pontis_groves_lighthouse_generic_npc_1: + name: '&3埃利乌斯·马提乌斯' + role: '&3<灯塔管理人>' + greetings: + - 你为何而来? + dialog: + - 我要确保\n灯塔能正常工作。 + - 很高兴能\n看到有人来。 + farewell: + - 再见。 +primis_pontis_groves_lighthouse_generic_npc_2: + name: '&3西莉亚·佐露丝' + role: '&3<灯塔管理人>' + greetings: + - 嘿。 + dialog: + - 我希望他能平安。 + - 今天是我守夜。 + - 我们快没有食物了。 + farewell: + - 再见。 +primis_pontis_groves_lighthouse_sick_man: + name: '&3阿兰努斯·赛康达斯' + role: '&c<病夫>' + dialog: + - 我感觉不太好。 + - 希望我能尽快痊愈。 + - 我感觉好点了。 + - 我们需要更多食物。 + farewell: + - 再见了. +primis_pontis_groves_parkour_npc_1: + name: '&3波苏尔·霍米尼恩' + role: '&c<无聊的居民>' + dialog: + - 你准备好迎接挑战了吗? + - 你觉得你有能力吗? + - 想去荡秋千吗? + - 你是个疯子吗? + - 禁止作弊! + farewell: + - 稍后见。 +primis_pontis_groves_parkour_npc_2: + name: '&c艾东塔特恩·霍米尼恩' + role: '&3<无聊的居民>' + dialog: + - 精彩! + - 尝试打破我1分47秒的纪录吧。 + - 禁止作弊! + farewell: + - 稍后见。 +primis_pontis_guard: + name: '&c千桥守卫' + role: '&8<守卫>' + greetings: + - 想要升级装备吗? + dialog: + - 迷路了?跟着桥的颜色走。 + - 每座桥都有至少一种颜色! + - 别惹事! + - 别搞事情! + - 千桥的建筑像个迷宫,用于防御。 + - 桥上有路径的颜色! +primis_pontis_guard_1: + name: '&c千桥守卫' + role: '&8<守卫>' + greetings: + - 想要升级装备吗? + dialog: + - 迷路了?跟着桥的颜色走。 + - 每座桥都有至少一种颜色! + - 别惹事! + - 别搞事情! + - 千桥的建筑像个迷宫,用于防御。 + - 桥上有路径的颜色! +primis_pontis_guard_2: + name: '&c千桥守卫' + role: '&8<守卫>' + greetings: + - 您好! + dialog: + - 这条路通往将军府! +primis_pontis_guard_rat: + name: '&c千桥精英守卫' + role: '&8<精英守卫>' + greetings: + - 该死的老鼠! + dialog: + - 臭老鼠!!! + - 别动,该死的! + - 别躲我的攻击! + - 我就要逮到你了! + - 你就快死了! + - 你为什么就是死不了!!! + - 你无法一直躲下去! + - 接下我这一击! + - 你死定了! + - 你竟敢躲过我的攻击! + - 差点! +primis_pontis_guard_rat_at_wormhole: + name: '&c千桥精英守卫' + role: '&8<精英守卫>' + greetings: + - 为什么花了这么长时间。 + dialog: + - 我们已经控制住局面了。 + - 别担心,\n精英守卫\n能搞定! +primis_pontis_guard_shogun_1: + name: '&4皇家守卫' + role: '&8<守卫>' + dialog: + - 不要惹上麻烦。 + - 别管我,只是维护和平。 + - 这里没有什么好玩的。 + - 我盯着你呢,冒险者。 + - 没有问题,就没人会受伤! + - 没时间瞎折腾了。 + farewell: + - 一路平安,冒险者。 +primis_pontis_guard_shogun_1_cat_quest: + name: '&4皇家守卫' + role: '&8<守卫>' + dialog: + - 不要惹上麻烦。 + - 别管我,只是维护和平。 + - 这里没有什么好玩的。 + - 我盯着你呢,冒险者。 + - 没有问题,就没人会受伤! + - 没时间瞎折腾了。 + farewell: + - 一路平安,冒险者。 +primis_pontis_mille_arena_master_observatory: + name: 斯黛拉·霍米尼斯 + role: <观星者> + greetings: + - 你好呀! + dialog: + - 我希望能看到很多星星。 + - 好多天体! + - 宇宙在召唤我。 + - 无尽的可能性。 + - 远古的知识…… + - 我有故事要讲。 + - 如果你知道…… + farewell: + - 愿星辰保佑你。 +primis_pontis_mille_concerned_shipmate: + name: '&3德尔菲姆·卡尔普尼乌斯' + role: '&8<担忧的船民>' + dialog: + - 哎。 + - 还有好多货要搬…… + farewell: + - 一路顺风! +primis_pontis_mille_fields_camp_generic_npc_1: + name: '&c斯克雷波尼亚·英格维纳斯' + role: '&c<猎人>' + dialog: + - 最危险的\n武器在\nb你的双耳之间。 + - 我只需要\n三根箭。 + farewell: + - Catch ya 稍后见! +primis_pontis_mille_fields_camp_generic_npc_2: + name: '&c瓦拉多·卢穆斯' + role: '&c<猎人>' + dialog: + - 我在很多地方\n狩猎过。 + - 你也经常旅行吗? + farewell: + - 愿你的刀锋迅捷无比。 +primis_pontis_mille_fields_camp_generic_npc_3: + name: '&c菲吉娅·阿哈拉' + role: '&c<猎人>' + dialog: + - 没有什么比狩猎\n更有意义的了! + farewell: + - 注意安全。 +primis_pontis_mille_fields_camp_generic_npc_4: + name: '&cA阿德瑞斯·帕特库鲁斯' + role: '&c<猎人>' + dialog: + - 狩猎的呼唤! + farewell: + - 一击毙命。 +primis_pontis_mille_fields_camp_generic_npc_5: + name: '&c卡帕多克斯·加勒鲁斯' + role: '&c<猎人>' + dialog: + - 加入我们吧,陌生人! + farewell: + - 稍后见。 +primis_pontis_mille_fields_camp_generic_npc_6: + name: '&c苏尔皮西奥·鲁蒂利乌斯' + role: '&c<猎人>' + dialog: + - 希望我们的营地\n能给你提供\n在荒野喘息的机会。 + farewell: + - 再见。 +primis_pontis_mille_fields_camp_generic_npc_7: + name: '&c阿库瑞斯马努斯' + role: '&c<猎人>' + dialog: + - 别介意我只是\n取些水。 + - 今天的水清澈湛蓝。 + farewell: + - 再见。 +primis_pontis_mille_fields_camp_magmus: + name: '&c玛格姆斯`海普诺斯' + role: '&4<疲惫的猎人>' + dialog: + - 沃鲁尼亚在哪…… + - 我希望她\n没事。 + - 我需要休息。 + - 要是一天里有\n更多小时就好了。 + - 如果你找到了沃鲁尼亚,\n请告诉我。 + - 工作太多,\n时间太少。 + - 又是只有17小时的一天。 + - 我太过焦虑了。 + farewell: + - 时间总是不够…… +primis_pontis_mille_fields_farm_berry_npc: + name: '&9多达卢斯·纳斯卡' + role: '&e<农民>' + dialog: + - 好好吃的浆果! + - 你应该\n多吃点浆果! + - 他们为什么\n偷我的浆果…… + farewell: + - 稍后见。 +primis_pontis_mille_fields_farm_boy_npc: + name: '&9普雷西恩·维特里奇斯' + role: '&e<农民>' + dialog: + - 老鼠好多…… + - 哎呦,就快完成了。 + - 这东西最好拿着。 + - 再拿东西\n我就要累坏了。 + - 从这里看\n真漂亮。 + - 好了,继续工作吧! + farewell: + - 试试我们的浆果吧! +primis_pontis_mille_fields_farm_npc: + name: '&9米洛尼亚·马朱斯' + role: '&e<农民>' + dialog: + - 臭老鼠,滚远点! + - 别再吃我的作物了! + - 唉…… + farewell: + - 稍后见。 +primis_pontis_mille_fields_farm_well_npc: + name: '&e沃鲁尼亚·佐伊鲁斯' + role: '&c<冒险家>' + dialog: + - 小心它的口水! + - 它的唾液有毒。 + - 请帮帮我! + - 希望没人\n听到这个…… + - 很高兴见到你! + farewell: + - 我怎么能让这种事发生。 +primis_pontis_mille_fields_windmill_npc_1: + name: '&e迪尼亚·尼拉米乌斯' + role: '&d<风车磨坊主>' + dialog: + - 有好多小麦要加工! + - 没有面粉就没有面包。 + - 你也喜欢面包吗? + farewell: + - 再见。 +primis_pontis_mille_fields_windmill_npc_2: + name: '&e迪莫尼斯·玛丽提拉斯' + role: '&d<风车磨坊主>' + dialog: + - 这里太棒了! + - 你喜欢我的磨坊吗? + - 我在这里休息。 + farewell: + - 再见。 +primis_pontis_mille_fields_windmill_npc_3: + name: '&e阿杜尔森·卢皮斯' + role: '&d<风车磨坊主>' + dialog: + - 希望吹多点风! + - 需要面粉吗? + - 这是附近最好的风车磨坊! + farewell: + - 祝福你。 +primis_pontis_mille_general_bromia: + name: '&6布罗米亚·邱里奥' + role: '&6将军' + greetings: + - 嗨! + dialog: + - 战争时间到了! + farewell: + - 再见! +primis_pontis_mille_general_cylindrus: + name: '&e西林卓斯·塞拉特斯' + role: '&e将军' + greetings: + - 嗨! + dialog: + - 时间不够! + farewell: + - 再见! +primis_pontis_mille_general_godefridus: + name: '&c戈德夫里达斯·诺维申' + role: '&c<将军>' + greetings: + - 你好! + - 嗨! + dialog: + - 需要有人丢掉\n这些文档。 + - 这么多蜡烛…… + farewell: + - 再见 +primis_pontis_mille_general_rogerius: + name: '&e罗杰里乌斯·奥伦纽斯' + role: '&e将军' + greetings: + - 嗨! + dialog: + - 还有好多事要做! + - 希望这4个没问题…… + farewell: + - 再见! +primis_pontis_mille_lighthouse_man: + name: '&3禾吉奥·雷姆斯' + role: '&c<灯塔看守人>' + dialog: + - 这上面太美了。 + - 最美之景…… + farewell: + - 再见了. + - 太阳下山了! +primis_pontis_mille_major: + name: '&c福特斯·贝拉特' + role: '&c<大将军>' + greetings: + - 你好旅行者! + - 嗨! + dialog: + - 这些该死的哥布林! + farewell: + - 再见了! +primis_pontis_mille_mew_meowzer: + name: '&a喵喵' + role: '&d<猫科动物>' + dialog: + - 喵! + - 喵喵…… + - 喵………… + - 喵喵喵。 + - 喵! + farewell: + - 喵! +primis_pontis_mille_observatory_arena_turn_in: + name: 维尔戈·德西普斯 + role: <观星者> + greetings: + - 嗨! + dialog: + - 斯黛拉知道很多东西。 + - 星星有很多故事。 + - 星光告诉我们一切。 + farewell: + - 愿月光照亮你的前路。 +primis_pontis_mille_royal_guard_centurion: + name: '&4皇家守卫百夫长' + role: '&8<守卫>' + dialog: + - 不要磨蹭! + - 安营扎寨! + - 我们的援军呢? + - 有多少人倒下了? + - 我们需要重整旗鼓! + farewell: + - Tread lightly and carry a big剑. +primis_pontis_mille_scout_1: + name: '&c茜拉·乌尔萨基斯' + role: '&c受伤的侦察兵' + greetings: + - 嗨! + dialog: + - 我快坚持不住了…… + farewell: + - 再见! +primis_pontis_mille_scout_2: + name: '&c斯帕拉克斯·奥西利厄斯' + role: '&c受伤的侦察兵' + greetings: + - 嗨! + dialog: + - 好痛…… + farewell: + - 再见! +primis_pontis_mille_scout_leader: + name: '&c布莱法罗·奥克塔维乌斯' + role: '&c侦察兵队长' + greetings: + - 嗨! + dialog: + - 敌军太多了…… + farewell: + - 再见! +primis_pontis_mille_shogun: + name: '&6内维塔' + role: '&c' + greetings: + - 有事吗? + dialog: + - 我能帮你吗? + farewell: + - 携带巨兵,步履轻盈。 +primis_pontis_mille_slums_generic_npc_1: + name: '&7盖里西斯·雷克斯' + role: '&7<贫民窟居民>' + dialog: + - 这里不大,\n但这是我们小镇的一小部分 + farewell: + - 稍后见。 +primis_pontis_mille_slums_generic_npc_2: + name: '&7盖里西斯·凯利斯提斯' + role: '&7<贫民窟居民>' + dialog: + - 日复一日…… + farewell: + - '..。' +primis_pontis_mille_slums_generic_npc_3: + name: '&7尼科德摩斯·方提努斯' + role: '&7<贫民窟居民>' + dialog: + - 为家庭提供\n的淡水。 + farewell: + - 这口井养活了我们。 +primis_pontis_mille_slums_generic_npc_4: + name: '&7库克斯·卢西奥' + role: '&7<贫民窟居民>' + dialog: + - 希望你今天\n过得愉快。 + farewell: + - 驻足愉快。 +primis_pontis_mille_slums_generic_npc_5: + name: '&7科内利亚·弗洛里斯' + role: '&7<贫民窟居民>' + dialog: + - 我要哪一个呢…… + farewell: + - 好多\n漂亮的花。 +primis_pontis_mille_slums_generic_npc_6: + name: '&7鲁蒂利亚·普拉西德' + role: '&7<贫民窟居民>' + dialog: + - 我喜欢这里。 + - 干草的气味\n让我感到愉悦。 + - 这是我最喜欢的\n放松之地。 + farewell: + - 稍后见再! +primis_pontis_mille_slums_npc_1: + name: '&7列那·卢坎' + role: '&7<贫民窟居民>' + dialog: + - 只是一块面包…… + farewell: + - 明天会有什么呢。 +primis_pontis_mille_slums_npc_2: + name: '&7特拉尼奥·弗洛伦斯' + role: '&7<贫民窟居民>' + dialog: + - 今天勉强能过。 + farewell: + - 安全的一夜。 +primis_pontis_mille_slums_npc_3: + name: '&7露菲亚·特图鲁斯' + role: '&7<贫民窟居民>' + dialog: + - 至少对孩子们有好处。 + - 集市里没什么东西…… + - 我买不起。 + farewell: + - 稍后见。 +primis_pontis_mille_slums_npc_4: + name: '&7法比亚·普雷塔斯' + role: '&7<贫民窟居民>' + dialog: + - 我闭上了眼睛。 + - 想象我在\n更好的地方。 + farewell: + - 再见。 +primis_pontis_mille_slums_npc_5: + name: '&7奥古斯缇娜·维鲁克斯' + role: '&7<贫民窟居民>' + dialog: + - 还要养这么多口人。 + - 也许能有水果给小孩吃。 + farewell: + - 再见。 +primis_pontis_mines_guard_1: + name: '&c千桥守卫' + role: '&c<受伤的守卫>' + greetings: + - 救命!!! + dialog: + - 请杀死他们! + - 我很害怕。 +primis_pontis_mines_guard_2: + name: '&c千桥守卫' + role: '&c<受伤的守卫>' + greetings: + - 有人吗!!! + dialog: + - 我不想死! + - 我快撑不住了。 +primis_pontis_mines_guard_3: + name: '&c千桥守卫' + role: '&c<受伤的守卫>' + greetings: + - 救我! + dialog: + - 他们走了吗? + - 让我出去! +primis_pontis_outpost_officer: + name: '&4无名' + role: '&8<前哨职员>' + dialog: + - 我还有工作要做! + - 这里应该有座前哨。 + farewell: + - 拜! +primis_pontis_redwoods_injured_lumberjack: + name: '&6莱科·卢皮奇努斯' + role: '&6<受伤的伐木工>' + greetings: + - 嘿! + dialog: + - 该死的锯子! + - 又伤到了我…… + farewell: + - 稍后见。 +primis_pontis_redwoods_lumberjack: + name: '&6利格纳·克里斯皮安' + role: '&6<伐木工>' + greetings: + - 你好! + dialog: + - 我喜欢健康树木的外观。 + - 棕色的树真的很香。 + - |- + 我肯定我看到了一只两条腿的狼 + 在这附近的夜里悄悄地游荡。 + farewell: + - 下次见。 +primis_pontis_redwoods_lumberjack_generic_1: + name: '&6姆利尔·普罗库斯' + role: '&6<伐木工>' + greetings: + - 嘿哟! + dialog: + - 我希望他们能放过我们。 + - 伐木的好日子。 + farewell: + - Pinecone ya 稍后见! +primis_pontis_redwoods_lumberjack_generic_10: + name: '&6皮斯卡托雷斯·特雷尼科' + role: '&6<伐木工>' + greetings: + - 很高兴见到你! + dialog: + - 滚开,狼群! + - 滚开,该死的! + - 哈! 试着上我这儿来! + farewell: + - 拜拜! +primis_pontis_redwoods_lumberjack_generic_2: + name: '&6阿兰努斯·赫米纳' + role: '&6<伐木工>' + greetings: + - 嗨…… + dialog: + - 别那么大声,小声点。 + - 我在摸鱼呢。 + - 别告诉他们我在这。 + - 伐木是份艰苦的工作…… + farewell: + - 稍后见。 +primis_pontis_redwoods_lumberjack_generic_3: + name: '&6莉娜·特里乌斯' + role: '&6<伐木工>' + greetings: + - 什么事! + dialog: + - 我就站在这里工作! + - 操作锯子还真有点意思。 + - 得确保你不会受伤。 + farewell: + - 稍后见! +primis_pontis_redwoods_lumberjack_generic_4: + name: '&6阿奎拉·伊萨提斯' + role: '&6<伐木工>' + greetings: + - 你怎么样? + dialog: + - 该死的木头! + - 不,不是那样的! + - 能飘浮更好!!! + - 是的,那就行了。 + farewell: + - 再见! +primis_pontis_redwoods_lumberjack_generic_5: + name: '&6苏尔皮西奥·西多尼乌斯' + role: '&6<伐木工>' + greetings: + - 嗨! + dialog: + - 没有什么比漂亮的火堆更重要了! + - 诚实地工作了一天后放松一下。 + - 加入我们吧! + farewell: + - 再见,朋友! +primis_pontis_redwoods_lumberjack_generic_6: + name: '&6斯特罗比卢斯·克莱门斯' + role: '&6<伐木工>' + greetings: + - 向您致敬! + dialog: + - 像海狸一样伐木! + - 西部最快斧。 + - 没有树是我的对手! + farewell: + - Smell ya 稍后见! +primis_pontis_redwoods_lumberjack_generic_7: + name: '&6坎迪达斯·奈杰卢斯' + role: '&6<伐木工>' + greetings: + - 你好! + dialog: + - 我的屁股就是最快的斧头! + - 别把他的胡言乱语当真。 + - 大人物先生肯定有很多话要说。 + farewell: + - 再见! +primis_pontis_redwoods_lumberjack_generic_8: + name: '&6斯特罗比卢斯·克莱门斯' + role: '&6<伐木工>' + greetings: + - 我有点忙! + dialog: + - 我们需要提高产量…… + - 如果我们涨价的话…… + - 需要买些斧头了。 + farewell: + - 呃…… +primis_pontis_redwoods_lumberjack_generic_9: + name: '&6马丁内斯·莱庞图斯' + role: '&6<伐木工>' + greetings: + - 喔,你好! + dialog: + - 你来了! + - 我要向你展示! + - 我的斧头应该能斩断你的树皮。 + - 要好好砍树。 + farewell: + - 吓到我了…… +primis_pontis_redwoods_lumberlord: + name: '&6马格努斯·卡斯托拉' + role: '&6<伐木工头>' + greetings: + - 你好! + dialog: + - 没有什么比健康的木材更重要。 + - |- + 我们每砍一棵树, + 就种一颗新树。 + - 棕色的大圆木,很好。 + farewell: + - 再见! +primis_pontis_redwoods_reyn: + name: '&6雷努斯·波特里斯' + role: '&6<伐木工>' + greetings: + - 我正热情高涨! + - 嗨! + dialog: + - 你对圆木感兴趣吗? + - 我喜欢木材的味道! + farewell: + - 稍后见。 + - 再见! +primis_pontis_scrapper: + name: '&7弗拉格门特恩' + role: '&8<废品商>' + greetings: + - 有什么废品要回收吗? + - 有垃圾? + - 需要回收吗? + dialog: + - 我会尽可能回收你带来的任何东西! + - 需要废品吗? + - 想要废品吗? +primis_pontis_smelter: + name: '&7奥比斯' + role: '&8<熔炼工>' + greetings: + - 想要升级装备吗? + dialog: + - 需要升级球吗? + - 我会为废品制作升级球! + - 给我带废品来! +primis_sewer_donatello: + name: '&5多纳泰罗' + role: '&d下水道守卫者' + dialog: + - 什么事? + - 你这么下来找到我们的? + - 小心施莱德! + farewell: + - 稍后见! +primis_sewer_leonardo: + name: '&1李奥纳多' + role: '&9下水道守卫者' + dialog: + - 什么事? + - 你这么下来找到我们的? + - 小心施莱德! + farewell: + - 稍后见! +primis_sewer_michelangelo: + name: '&6米开朗基罗' + role: '&e下水道守卫者' + dialog: + - 什么事? + - 你这么下来找到我们的? + - 小心施莱德! + farewell: + - 稍后见! +primis_sewer_raphael: + name: '&4拉斐尔' + role: '&c下水道守卫者' + dialog: + - 什么事? + - 你这么下来找到我们的? + - 小心施莱德! + farewell: + - 稍后见! +primis_spa_attendee_1: + name: '&f夏美' + role: '&7<按摩参与者>' + dialog: + - 你喜欢温泉吗? + - 坐下放松就好了! + - Nya! + - uwu... + - OwO + farewell: + - 玩的愉快! +primis_spa_attendee_2: + name: '&5花子' + role: '&7<按摩参与者>' + dialog: + - 你喜欢温泉吗? + - 坐下放松就好了! + - Nya! + - uwu... + - OwO + farewell: + - 玩的愉快! +primis_spa_attendee_3: + name: '&3塔米卡' + role: '&7<按摩参与者>' + dialog: + - 你喜欢温泉吗? + - 坐下放松就好了! + - Nya! + - uwu... + - OwO + farewell: + - 玩的愉快! +primis_spa_attendee_4: + name: '&9泽弗拉' + role: '&7<按摩参与者>' + dialog: + - 你喜欢温泉吗? + - 坐下放松就好了! + - Nya! + - uwu... + - OwO + farewell: + - 玩的愉快! +primis_spa_attendee_5: + name: '&4奇' + role: '&7<按摩参与者>' + dialog: + - 你喜欢温泉吗? + - 坐下放松就好了! + - Nya! + - uwu... + - OwO + farewell: + - 玩的愉快! +primis_spa_attendee_6: + name: '&f卡塔希' + role: '&7<按摩参与者>' + dialog: + - 你喜欢温泉吗? + - 坐下放松就好了! + - Nya! + - uwu... + - OwO + farewell: + - 玩的愉快! +primis_spa_attendee_7: + name: '&d明子' + role: '&7<按摩参与者>' + dialog: + - 你喜欢温泉吗? + - 坐下放松就好了! + - Nya! + - uwu... + - OwO + farewell: + - 玩的愉快! +primis_spa_attendee_8: + name: '&6薛兰妮' + role: '&7<按摩参与者>' + dialog: + - 你喜欢温泉吗? + - 坐下放松就好了! + - Nya! + - Rawr... + - OwO + farewell: + - 玩的愉快! +primis_spa_staff: + name: '&c青空' + role: '&7<按摩参与者>' + dialog: + - 你喜欢温泉吗? + - Nya! + - uwu... + - OwO + farewell: + - 玩的愉快! +primis_spa_staff_2: + name: '&6丽' + role: '&7<按摩参与者>' + dialog: + - 你喜欢温泉吗? + - Nya! + - uwu... + - OwO + farewell: + - 玩的愉快! +primis_terravilla_annoyed_explorer: + name: '&6多里帕·萨里玛库斯' + role: '&6<困扰的探索者>' + greetings: + - 最近怎样。 + dialog: + - 不会吧。 + - 又卡住了。 + farewell: + - 下次见。 +primis_terravilla_explorer: + name: '&6泰利斯特·塞纳' + role: '&6<探索者>' + greetings: + - 你还好吗? + dialog: + - 我一直很忙。 + - 你需要袋子吗? + farewell: + - 拜拜。 +primis_terravilla_generic_npc_1: + name: '&6斯蒂文尼亚' + role: '&6<居民>' + greetings: + - 欢迎来到特拉维亚! + dialog: + - 小心两腿恐怖生物! + - 你是来查看废墟的? + farewell: + - 拜拜。 +primis_terravilla_generic_npc_10: + name: '&6马利亚·加尔维斯' + role: '&6<居民>' + greetings: + - 嘿哟! + dialog: + - 我宁愿在废墟里呆着…… + - 我在看猪打发时间。 + farewell: + - 回见。 +primis_terravilla_generic_npc_11: + name: '&6帕皮利亚·维尔吉尼斯' + role: '&6<居民>' + greetings: + - 好吧…… + dialog: + - 用力打他! + - 哇!很好! + - 没错!干掉他! + farewell: + - 嗯…… +primis_terravilla_generic_npc_12: + name: '&6翁布里亚·马卡洛斯' + role: '&6<居民>' + greetings: + - 什么! + dialog: + - 女孩就不可以上屋顶吗? + - 试着把我弄下来! + farewell: + - 是的,不管怎样…… +primis_terravilla_generic_npc_2: + name: '&6德尔菲姆·阿萨尼乌斯' + role: '&6<居民>' + greetings: + - 别打扰我! + dialog: + - 你在看什么? + farewell: + - 走开! +primis_terravilla_generic_npc_3: + name: '&6斯蒂芬尼姆·沃比斯库斯' + role: '&6<居民>' + greetings: + - 别打扰我! + dialog: + - 你在看什么? + farewell: + - 走开! +primis_terravilla_generic_npc_4: + name: '&6西莫·克莱里库斯' + role: '&6<居民>' + greetings: + - 嘿! + dialog: + - 听说那头猪又在升降机上了。 + farewell: + - 拜拜。 +primis_terravilla_generic_npc_5: + name: '&6哈帕克斯·科利亚斯' + role: '&6<居民>' + greetings: + - 您好。 + dialog: + - bo...I mean the\nOverseer is upstairs. + farewell: + - 回见。 +primis_terravilla_generic_npc_6: + name: '&6苏尔皮西奥·埃波洛尼乌斯' + role: '&6<居民>' + greetings: + - 你好。 + dialog: + - 希望废墟能再次开放。 + - 我想念搜寻遗物的日子。 + farewell: + - 再见。 +primis_terravilla_generic_npc_7: + name: '&6巴比亚·卢坎' + role: '&6<居民>' + greetings: + - '...' + dialog: + - 害怕…… + farewell: + - '...' +primis_terravilla_generic_npc_8: + name: '&6诺维娅·朗基努斯' + role: '&6<居民>' + greetings: + - '...' + dialog: + - 你一直喜欢盯着人看吗? + - 给点个人隐私行吗? + farewell: + - '...' +primis_terravilla_generic_npc_9: + name: '&6塞蒂米亚·巴罗' + role: '&6<居民>' + greetings: + - 哦,你好。 + dialog: + - 如果废墟能再次开放,\n我一定要找更多遗物。 + - 这个头骨是…… + farewell: + - '...' +primis_terravilla_overseer: + name: '&6卢登·普林塞普斯' + role: '&6<工头>' + greetings: + - 嗯? + dialog: + - 现在怎么了 + - 我需要监督他们。 + - 至少我不无聊。 + farewell: + - 祝您好运。 +primis_terravilla_researcher: + name: '&6普拉蒂亚·苏里乌斯' + role: '&6<研究员>' + greetings: + - 嗯…… + dialog: + - 也许如果…… + - 那不对 + - 不确定…… + farewell: + - 稍后见…… +primis_traveler_1: + name: '&6莱西达姆斯·诺尔斯' + role: '&6<旅行者>' + greetings: + - 你好,陌生人! + dialog: + - 我在回村里的路上。 + - 你要去村庄吗? + - 祝你一路顺风。 + farewell: + - 一路顺风。 +primis_traveler_2: + name: '&6西特罗·盖拉' + role: '&6<旅行者>' + greetings: + - 嗨! + dialog: + - 我在回村里的路上。 + - 你从千桥来的还是? + - 祝你好运! + farewell: + - 一路顺风。 +primis_traveler_3: + name: '&6布罗米亚·卡勒鲁斯' + role: '&6<旅行者>' + greetings: + - 你好! + dialog: + - 你要去村庄吗? + - 我听说村庄\n十分寒冷。 + - 就快到了!\n我得继续前进。 + farewell: + - 一路顺风。 +primis_traveler_4: + name: '&6迪门斯·诺尔斯' + role: '&6<旅行者>' + greetings: + - 你好,陌生人! + dialog: + - 很高兴\n看到有人。 + - 村庄就快到了。 + - 吁! + farewell: + - 一路顺风。 +primis_traveler_5: + name: '&6卡利波·卡利奇斯' + role: '&6<旅行者>' + greetings: + - 你好呀! + dialog: + - 我需要更好的鞋子。 + - 我很快就到家了。 + - 很开心能再次看到田野! + farewell: + - 一路顺风! +primis_traveler_6: + name: '&6罗德努斯·帕利斯' + role: '&6<旅行者>' + greetings: + - 你好! + dialog: + - 我在从村里\n回来的路上。 + - 很高兴再次\n看到千桥。 + - 我的兄弟又迷路了吗…… + - 他在哪? + farewell: + - 稍后见 +primis_traveler_7: + name: '&6戈雷诺斯·帕利斯' + role: '&6<旅行者>' + greetings: + - 嘿…… + dialog: + - 我又迷路了吗? + - 这里不是千桥。 + - 我在哪? + - 呃,这条路好像不太对…… + farewell: + - 再见。 +quest_giver: + name: 基尔·图扎德 + role: <任务发布者> + greetings: + - 你好,冒险家!\n想要接受任务吗? + - 嘿,就是你! 我这有个任务! + - 想来场冒险吗? + dialog: + - 完成公会任务\n可获得丰厚的奖励! + - 等级越高的任务\n奖励越丰厚! + - 等级越高的任务\n会让你狩猎更高级的精英怪物! + - 想要更难的挑战吗?\n升级你的公会吧! + - 请做好万全的准备\n迎接任务吧! + farewell: + - 祝你旅途愉快. + - 狩猎愉悦! + - 祝你长命百岁! + - 带着荣耀归来吧. + - 希望有生之年还能见到你! + - 祝你成为强者! + - 祝你一帆风顺! +refiner_config: + name: 拉尔夫 + role: <精炼工> + greetings: + - 想要升级你的废品吗? + - 你有废品吗? + - 回收低级废品! + - 你好,你有废品吗? + - 回收废品! + dialog: + - 想要升级你的废品吗? + - 来我这这儿升级废品! + - 10件废品升一级! + - 让你的废品更有用! + - 回收低级废品! + farewell: + - 随时找我\n回收废品 + - 我能变废为宝! + - 去找点废品吧! +repairman_config: + name: 雷吉 + role: <修理工> + greetings: + - 我能修好你的物品! + - 给我废品就能修复装备! + - 变废为宝,增加耐久! + - 需要修东西吗? + - 你有东西坏了吗? + dialog: + - 我是全镇最好的修理工! + - 我能修复装备! + - 你要修东西吗? + - 我能修好你的装备! + - 需要修复精英装备吗? + farewell: + - 别忘了保养好你的装备! + - 我随时在这! + - 有事随时联系我 +santa: + name: '&4圣尼克' + role: '&c<圣诞老人!@>' + greetings: + - 嚯嚯嚯! + dialog: + - 我有一些礼物不见了,\n你能帮我吗? + - 亲爱的旅行者,\n我有任务要给你! + - 你能帮帮我\n这个老头吗? + farewell: + - 嚯嚯嚯! +scrapper_config: + name: 凯莉 + role: <废品商> + greetings: + - 有不要的东西吗? + - 想回收物品吗? + - 你有废品要卖吗? + - 收废品了! + - 回收旧装备! + dialog: + - 回收废品! + - 拿废品给我吧! + - 这件废品有50%的几率还能用! + - 拒绝退款。 + - 物尽其用,变废为宝! + farewell: + - 有废品了再找我吧 + - 别忘了\n变废为宝! + - 找点废品给我吧 +smelter: + name: 山姆 + role: <冶炼工> + greetings: + - 你有废品吗? + - 回收废品! + - 我闻到了你身上的废品气息! + - 我需要废品! + - 给点废品吧 + dialog: + - 我能变废为宝! + - 给我废品\n我就给你升级球! + - 废品没用,给我吧! + farewell: + - 找到废品了就来找我! + - 准备去升级装备吧! +special_blacksmith: + name: 格洛格 + role: <铸匠大师> + greetings: + - 你想要点什么? + - 你想卖点什么? + - 除了最好的装备外我们一无所有。 + - 你有想卖的装备吗? + - 我们只收购精英装备。 + dialog: + - 我们收购低级装备出售高级装备。 + - 拒绝退款。 + - 你不能退款。 + - 退款?别想了。 + - 我们不收回扣。 + - 买点东西吧。 + farewell: + - 如果你有更多好东西记得再来! + - 小心别被怪物杀死了,\n我们需要你带来更多的好东西。 + - 下次记得带点更好的东西回来。 + - 别忘了,你无法退款退货。 +test_npc: + name: 测试NPC + role: 测试中! + greetings: + - 问候测试! + dialog: + - 对话框测试! + farewell: + - 告别测试! +travelling_merchant: + name: 吉夫斯 + role: <旅行商人> + greetings: + - 想卖点东西吗 + - 是你在召唤我? + - 哈? + dialog: + - 我就便宜点买了吧! + - 你有东西要卖吗? + - 时间就是金钱! + farewell: + - 我随时都在! + - 你就卖这些东西吗? + - 一路顺风! + - 活久点! + - 狩猎愉快! +unbinder: + name: 乌尔菲克 + role: <解绑者> + greetings: + - 你好。 + - 你好,我的朋友。 + - 有什么事吗? + - 我能帮你吗? + - 有什么能帮你的? + dialog: + - 我能用解绑卷轴\n帮你解绑物品。 + - 只有我会解绑这门手艺。 + - 你有解绑卷轴吗? + farewell: + - '记住:明智地使用解绑卷轴。' + - 一路顺风。 +wood_league_arena_master: + name: 格拉迪厄斯 + role: <竞技场大师> + greetings: + - 欢迎来到竞技场! + dialog: + - 准备好开战了吗? + farewell: + - 带上盾牌,不然你死定了! +wood_league: + arenaName: 木头联赛 + arenaMessages: + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - wave=8:message=&8[格拉迪厄斯] &f不错,如果每个敌人都是&c近战&f的如何? + - wave=9:message=&8[格拉迪厄斯] &f很好,如果都是&c远程&f怪物呢? + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - wave=44:message=&8[格拉迪厄斯] &f这显然行不通,让我想想办法…… + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +ag_welcome_quest_0: + customObjectives: + Objective1: + dialog: + - '&8[&a卡萨斯&8]&f 欢迎来到冒险者公会,这里有精英怪物的一切!' + - 你可以随时输入&2/ag&f回到这里! + - 再次和我对话领取任务! + name: '&2到达冒险者公会大厅!' + questLore: + - + - + questAcceptDialog: + - '&8[Odigos]&f 好的,请输入 &2/ag &f 或 &2/adventurersguild&f 前往冒险者公会大厅!' + - 请和卡萨斯聊聊! +ag_welcome_quest_1: + customObjectives: + Objective3: + dialog: + - '&8[&a格雷格&8]&f 想要买卖东西?找我就对了!' + Objective4: + dialog: + - '&8[&a查尔斯&8]&f 想了解如何对抗精英怪物?和我对话吧!' + Objective1: + dialog: + - '&8[&a赫尔墨斯&8]&f 我能把你带回之前所在的地方!和我对话就行了!' + Objective2: + dialog: + - '&8[&a巴特利&8]&f 要来一杯烈酒吗? 我的酒味道浓厚!' + Objective7: + dialog: + - '&8[&a基尔·图扎德&8]&f 这些精英怪是从哪里来的?' + - + - + - 和我对话接取任务吧! + Objective12: + dialog: + - '&8[&a格洛格&8]&f 想要特殊物品?找我就对了!' + Objective8: + dialog: + - '&8[&a拉尔夫&8]&f 找我可以升级废品!' + Objective13: + dialog: + - '&8[&a乌尔菲克&8]&f 如果你能带给我非常特殊稀有的物品,我可以为你的精英装备解绑。' + - + - + Objective5: + dialog: + - '&8[&a提姆&8]&f 想要升级你的精英物品?从萨姆哪里获得升级球吧!' + Objective10: + dialog: + - '&8[&a凯莉&8]&f 有多余的精英装备?不知道要怎么处理?给我吧,我能将它们分解为废品!' + - + - + Objective6: + dialog: + - '&8[&a吉莉安&8]&f 你渴望力量吗?和我对话解锁新的公会等级吧!' + Objective11: + dialog: + - '&8[&a山姆&8]&f 有多余的废品吗?我能把废品精炼成升级球,你可以用升级球来升级精英装备!' + Objective9: + dialog: + - '&8[&a雷吉&8]&f 需要修复精英装备?给我废品,我能让你的装备焕然一新!' + - + - + name: '&2欢迎来到冒险者公会!' + questLore: + - '&a拜访冒险者公会的NPC' +primis_caeruleaum_a_can_of_worms: + customObjectives: + Objective1: + dialog: + - '&a[双鱼村长] &fPlease tell me you''re the one bringing the bait.' + name: '&2大麻烦' + questLore: + - 拿上诱饵走吧。 + - 请赶快! + questAcceptDialog: + - '&a[卡里德斯·皮斯卡图斯]&f 我的朋友在码头附近的一艘船上!' + - '&7&o我得赶到码头。' + questCompleteMessage: + - '&a[皮西斯·涅墨西斯]&f 你带来了诱饵?很好!' + - 诱饵一个能引诱它出来! + - '&7&o我应该和涅墨西斯对话。' +primis_caeruleaum_fishing: + name: '&2鱼饵' + questLore: + - 我们有大麻烦了! + - + - + - + - + - 但没有诱饵他什么也做不了! + - 我会告诉你去哪里获得&e鱼饵&f,请帮帮我的朋友! + - 我承诺会给你奖励! + questAcceptDialog: + - '&a[卡里德斯·皮斯卡图斯]&f 时间至关重要!你离开村庄后右边有很多&c大虫子&f!' + - 请带回5条虫子给我。 + - '&7&o我应该去获取一些鱼饵。' + questCompleteMessage: + - '&a[卡里德斯·皮斯卡图斯]&f 你带来了诱饵?很好!' + - 我马上准备! + - '&7&o我应该和&a皮斯卡图斯&7&o再次对话并获得诱饵。' +primis_caeruleaum_fishing_2: + name: '&2怪物诱饵' + questLore: + - 这很有效!跳进虫洞,我来开船! + - 让这个怪物见识一下渔夫的愤怒! + questAcceptDialog: + - '&a[皮西斯·涅墨西斯]&f 上船吧,我来开船!' + - Don't forget to put on that &eDiving头盔&f! + - '&7&o我应该进入虫洞打败海怪。' + questCompleteMessage: + - '&a[皮西斯·涅墨西斯]&f 哈哈!真是一处好戏!' + - '&f当然,在整个过程中,我都控制住了局面,但你确实帮了点忙!' + - '&f拿着,这东西给你了!' + - '&7&o怪物已死,海岸也安全了。干得不错。' +primis_caeruleaum_fletching: + name: '&2弓箭猎人' + questLore: + - 有空帮忙吗? + - 通过最近受到的袭击,我们研究出了&e抓钩箭s&f! + - 通常我的工作是去获取抓钩箭, + - 但现在太危险了,我无法深入地牢。 + - 如果你能给我带一些&e抓钩箭s&f, + - 我能教你如何使用抓钩箭! + questAcceptDialog: + - '&a[文特斯·阿迪菲克斯]&f 请从村庄下面的废墟里找到10枝&e抓钩箭&f。' + - '&c亡灵骷髅&f和&溺尸&f通常会掉落这玩意。 - ''&7&o我应该在村庄附近的废墟击杀&cS骷髅&7&o和&c溺尸&7&o以获取&e抓钩箭s&7&o。' + - '&7&o我应该在村庄附近的废墟击杀&c骷髅&7&o和&c溺尸&7&o以获取&e抓钩箭s&7&o。' + questCompleteMessage: + - '&a[文特斯·阿迪菲克斯]&f 干得漂亮!' + - '&e抓钩箭&f可以对准&c标靶方块&f使用,快速移动到难以到达的地方。' + - 这是有雄心壮志的古代废墟研究者的必备之物。 + - 这是你的奖励! + - 测试一下你的知识如何? + - '&7&o似乎&a文特斯·阿迪菲克斯&7&o有挑战给我。' +primis_caeruleaum_fletching_2: + name: '&2盾牌猎人' + questLore: + - 你有弓箭了吗?很好! + - 用弓射出这些弓箭爬上高塔吧! + questAcceptDialog: + - '&a[文特斯·阿迪菲克斯]&f 用你刚获得的箭前往废墟并射击标靶!' + - + - + - + - + - '&7&o我应该去废墟里面拿&e盾牌&7&o,用&e抓钩箭s&7&o射击建筑里面的标靶。' + questCompleteMessage: + - '&a[文特斯·阿迪菲克斯]&f 非常好!' + - 你是一名真正的废墟探索者了! + - 这是你的奖励! + - '&7&o看来抓钩箭在未来会很有用。' +primis_caeruleaum_foraging: + name: '&2狼诱饵' + questLore: + - 我听说你想在这里帮忙。 + - 附近有&d狼穴&f + - 它妨碍了我在村庄觅食! + questAcceptDialog: + - '&a[维纳托·巴布拉图斯]&f 如果你能除掉这些&c狼&f,我会好好报答你的!' + - 我太老了,不适合和这片土地上的野生动物打交道…… + - '&7&o我应该击杀村庄东南面的&c狼&7&o。' + questCompleteMessage: + - '&a[维纳托·巴布拉图斯]&f 我就知道你可靠无比!' + - 感谢你的帮助! + - 这是我承诺的奖励。 +primis_farmstead_lighthouse_keeper_2: + customObjectives: + Objective1: + dialog: + - "&a[吉夫斯]&f &2雅玛维特&f派你来的?这是关于灯塔的什么?天大的发现啊!\n&f这将彻底改变我旅行商人的工作!给你,拿着这些&e卷轴&f——我随叫随到!\n&7&o似乎&a吉夫斯&7&o有东西给我。我应该和他谈谈。" + name: '&2神秘之光' + questLore: + - + - + - 我的父亲&a吉夫斯&f到顶上检查问题,但他还没回来。 + - + - + questAcceptDialog: + - '&a[雅玛维特]&f 再次感谢你们,祝你们好运。希望没事。' + - '&7&o我应该前往&d灯塔顶部&f,调查问题并去找&a雅玛维特&f的父亲&&a吉夫斯&f。' + questCompleteMessage: + - '&7&o这些卷轴似乎很有用!我应该使用&d灯塔&7&o传送回&d农场&7&o。' +primis_gladius_assassins: + name: '&5谁来干掉狙击手?' + questLore: + - '&d格拉迪厄斯&f的屋顶都是&c刺客&f!' + - 冒险上街就是自寻死路。我们需要干掉这些狙击手! + - + - + questAcceptDialog: + - '&a[贝利] 干掉那些&c刺客&f!记得使用&e抓钩箭s&f!' + - '&7&o我应该杀死那些&c刺客&7&o。' + questCompleteMessage: + - '&a[贝利]&f 你干掉那些&c刺客&f了?很好!你解决了我们的心头之患。' +primis_gladius_clear: + name: '&5夺回街道' + questLore: + - 我不需要告诉你这个镇子遭受了入侵,对吧? + - 我们愿为干掉&c入侵者&f提供报酬。 + - 你准备好了吗? + questAcceptDialog: + - '&a[贝利] &f过去削减他们的人数!' + - '&7&o我出去扫清&d格拉迪厄斯&7&o的街道。' + questCompleteMessage: + - '&a[贝利]&f 看啊,诸神在我们需要的时候赐予了一位真正的勇士!我有一份工作适合你。' + - '&7&o似乎&a贝利&7&o有话要和我说。我应该去找她……' +primis_gladius_prayer: + name: '&5信仰之跃' + questLore: + - 我不打算掩盖事实,情况十分严峻! + - 城墙倒塌了,街道上都是&c亡灵 + - 我的饮料也快喝完了。 + - 这种时候,人们希望 + - 上天能够救他们。 + - 有一条&d路&f上点着蜡烛,这条路通往 + - '&d山中避难所&f。' + - 通过这条路并击败&c僧侣&f + - 获得战神的祝福吧。 + - 这也许只是迷信,但试试无妨 + - 也许就能给人们带来希望。 + - 你能来到这里就足以说明你的强大 + - 前往山上击败&c僧侣&f吧。 + - 这能够激励所有的战士。 + questAcceptDialog: + - '&a[贝利] &f&d上楼&f并跟着蜡烛!小心别掉下去了,这条路很危险!' + - '&7&o我应该跟着&d蜡烛路&7&o并击败&c僧侣&7&o。' + questCompleteMessage: + - '&a[贝利]&f 你完成了祈祷》谢谢你,士兵们会为之振奋的。' +primis_gladius_ships: + name: '&5不详的预感' + questLore: + - 你看到他们了吗?&d格拉迪厄斯&f外面 + - 停了很多艘船。他们肯定是为了这件事而来。 + - 我们从未想过&d鲜血神殿&f会有人入侵, + - 跟不用说他们还装备了攻城武器! + - 我们得应战。 + - 杀死&c大将&f和他的一些部将无法弥补我们的损失, + - 但能让我们感觉好些。 + questAcceptDialog: + - '&a[贝利] &f杀死&c大将&f及其手下。小心他们的水路优势!我建议你使用&e抓钩箭s&f快速移动。' + - '&7&o我应该杀死&d格拉迪厄斯外的&7&o&c大将&7&o及其手下。' + questCompleteMessage: + - '&a[贝利]&f 干掉大将了?我感觉好点了!' +primis_gladius_sunken_ship: + name: '&5沉船' + questLore: + - 既然你已经搞定了&c水手&f + - 我有另一项任务要给你。 + - 现在应该可以进&d沉船&f了。 + - 你知道,前段时间我们的一艘船沉没了, + - 不幸的是里面有&e重要文件&f。 + - 我需要你前往&d沉船&f并扫除威胁 + - 取回&e重要文件&f。 + - 完成任务后回来找我。 + questAcceptDialog: + - '&a[贝利] &f你能在西南部找到船。让他们下地狱吧!' + - '&7&o我应该去收集&e文件&7&o并杀死船附近的&c水手s&7&o。' + questCompleteMessage: + - '&a[贝利]&f 回来了?很好!我们十分需要这些&e文件&f。' +primis_gladius_supplies_1: + name: '&c补给问题' + questLore: + - 我们的&e补给品&f快用完了 + - '&d格拉迪厄斯&f是一座能经受长期围攻的堡垒' + - 没有问题的话,我们应该能 + - 前往&d仓库&f! + - 不幸的是&d仓库&f是第一个沦陷的地方, + - 现在我们兵粮寸断! + - 如果你能扫清前往&d仓库&f的道路并获得一些&e补给品&f + - 我军士气必将大增! + questAcceptDialog: + - '&a[西巴斯]&f &d仓库&f不容忽略!它是一座巨大的仓库,位于倒塌的城墙附近。获取一些&e补给品&f带回给我!' + - '&7&o我应该前往&d仓库&7&o并带回&e补给品&7&o。' + questCompleteMessage: + - '&a[西巴斯]&f 你带回了&e补给品&f?太好了!我想出了一个关于饮料的完美主意——这肯定能振奋士兵们!” - ''&7&o似乎&a西巴斯&7&o有个好点子,我应该和他对话。' + - '&7&o似乎&a西巴斯&7&o有个好点子,我应该和他对话。' +primis_gladius_supplies_2: + name: '&c更多补给问题' + questLore: + - 食物有了,但饮品呢? + - 有人说在战争时喝醉很蠢, + - 我认为现在才是喝酒的好时候! + - '&c酒保&f的&d地下室&f里有' + - 好东西。 + - 你知道我要什么吧。 + - 前往酒馆&d地下室&f + - 获得&e好东西&f。如果你找到了&c酒保&f, + - 把他从不死诅咒中解脱的话,我会欠你一个人情。 + - 我们确信入侵时 + - 他还在&d地下室&f里。 + - 不过他很可能不再是他自己了。 + - 小心! + questAcceptDialog: + - '&a[西巴斯]&f &d酒馆&f就在街道对面!前往&d地下室&f寻找&e好东西&f吧!' + - '&7&o我应该前往酒馆的&d地下室&7&o并获得“&e好东西&7&o”。' + questCompleteMessage: + - '&a[西巴斯]&f 你打败了&c酒保&f?感谢你让我的老人解脱。来,我和你喝第一杯。 ' +primis_ice_village_all_out_of_chains: + customObjectives: + Objective1: + dialog: + - '&a[奥比斯]&f 哦,寒冰村庄的锁链货物。嗯,就在那边的箱子里。' + - 我们很忙,很抱歉没空送货。 + - 这些货都付过钱了,随便拿吧。 + name: '&2挣脱锁链束缚' + questLore: + - 嘿,你从&d千桥&f来的,对吧? + - 你愿意帮忙吗? + - 监狱里有 + - 很多锁链…… + - 尤其是支撑囚笼的锁链。 + - 它们锈迹斑斑,随时可能会断裂。 + - 一名囚犯也因此逃脱。 + - 锁链断裂,囚笼掉落,囚犯逃脱。 + - 我们订购了 + - '&e新锁链&f,' + - 但还没到货。如果你能 + - '&f前往&d千桥&f取回' + - '&e我们的锁链&f' + - 我们不胜感激! + questAcceptDialog: + - '&a[菲洛拉切斯·特里非奥斯]&f 找奥比斯。他负责制造锁链。' + - '&7&o我应该找&a&o奥比斯&7&o并带回&e&o锁链货物&7&o。' + questCompleteMessage: + - '&a[菲洛拉切斯·特里非奥斯]&f 锁链!感谢你,我们十分需要这些锁链。' +primis_ice_village_catch_me_if_you_can: + name: '&2来抓我呀' + questLore: + - 你来得正是时候!我正要找人捉住 + - '&c逃犯&f。' + - + - + - + - + - + - + questAcceptDialog: + - '&a[罗曼努斯·素帕巴斯]&f 他肯定在山里。' + - '&7&o我需要找到&c&o逃犯&7&o并把他带回监狱。' + questCompleteMessage: + - '&a[罗曼努斯·素帕巴斯]&f 哎呦,这不是我们的睡美人逃犯嘛。' + - 干得好。这是你的报酬。 + - '&a罗曼努斯&7给了你一袋沉重的金币。' +primis_ice_village_get_them_off_my_back: + name: '&2Get them off my back!' + questLore: + - 我很高兴你能帮忙,哈哈。 + - 我们的任务是猎捕&c尖背野猪&f,控制其种群数量。 + - 这也不只是控制数量的问题。 + - 它们也能给我们带来珍贵的皮革、獠牙和鱼肉。 + - 不知道没有它们还会不会有这座村庄。 + - + - + - + - + - + - + - 我们只需要捕杀&c幼崽&f和&c幼年尖背野猪&f. + - + - + - + - + - 如果你能找到我将不胜感激。 + questAcceptDialog: + - '&a[阿兰努斯·伊萨蒂斯]&f 你肯定在路上看到了&c尖背野猪&f,所以你应该知道它们在那里。' + - '&7&o我需要控制&c&o尖背野猪&7&o的种群数量并取回&e&o阿兰努斯的匕首&7&o。' + questCompleteMessage: + - '&a[阿兰努斯·伊萨蒂斯]&f 干得好,我的朋友!非常感谢你。' + - + - + - 这个匕首很普通,但它是我已故父亲手工制造给我的礼物。 + - 下次你口渴的话我请你一杯! +primis_ice_village_gotta_keep_warm: + customObjectives: + Objective1: + dialog: + - '&a[塞维利努斯·马提乌斯]&f 哈哈!这能让我暖和好几个星期!' + - 嘿朋友,你要去&d凯鲁利姆村&f吗? + name: '&2得保持暖和' + questLore: + - 我们每周都会给&a灯塔看守人&f一些 + - 好东西。 + - 这些饮品能让人保持暖和。 + - 这是对他辛勤工作的小小感谢。 + - 你能帮帮忙, + - 把下一批货带过来吗? + questAcceptDialog: + - '&a[格拉尼娅·塞西利乌斯]&f 灯塔在西边。谢谢!' + - '&7&o我应该前往&d&o灯塔&7&o并送货给&a&o灯塔看守人&7&o。' + questCompleteMessage: + - '&a[塞维利努斯·马提乌斯]&f 如果你要去那的话,请帮我把一些货物带给我的好友&a吉夫斯&f,我会十分感激的。' + - '&7&o看起来&a&o灯塔看守人&7&o有任务要给我。' +primis_ice_village_gotta_see_jeeves: + customObjectives: + Objective1: + dialog: + - '&a[吉夫斯]&f 哦!我朋友送给我的礼物。' + - 谢谢你带过来。很高兴再次见到你! + name: '&2拜访吉夫斯' + questLore: + - 这么多好东西 + - 我可不能独享! + - 请帮我 + - 把这些好东西送 + - 给我在&d凯鲁利姆村&f的朋友&a吉夫斯&f。 + - 使用&9灯塔传送门&f, + - '你可以很快到达那里。' + questAcceptDialog: + - '&a[塞维利努斯·马提乌斯]&f 传送门就在顶部。' + - '&7&o我应该前往&d&o凯鲁利姆村&7&o并把东西交给&a&o吉夫斯&7&o。' + questCompleteMessage: + - '&a[塞维利努斯·马提乌斯]&f 感谢你帮我把货物送给吉夫斯。我知道他喜欢各地的优质饮品!' +primis_ice_village_living_nightmares: + customObjectives: + Objective1: + dialog: + - '&a[科妮莉亚·恩诺迪乌斯]&f 他们走了吗?我好好怕。是我父母派你来的吗?真谢谢你。' + - + - + - 我无法逃脱。我……我很好,只是需要稍微歇会儿…… + name: '&2现世的噩梦' + questLore: + - 我一直跟她到这里。 + - 不知道她会从这里走到哪里。 + - 恐怕不好的事情发生了。 + - 我们的&a女儿&f学会了我的特殊能力。 + - 但她的能力更为强大。 + - 她能让强大的情感显现在现实世界。 + - 我们时间不多了,需要尽快找到她。 + questAcceptDialog: + - '&a[塞斯提亚·恩诺迪厄斯]&f 线索到这里就断了,她不可能离那么远……' + - '&7&o我需要尽快找到&a&o失踪的女儿&7&o。' + questCompleteMessage: + - '&a[塞斯提亚·恩诺迪厄斯]&f 你找到了她!快,她在哪?' + - 谢谢你陌生人,我马上去找她! +primis_ice_village_make_them_go_ouch: + name: '&2给他们点教训' + questLore: + - 我有一些调皮的'&c客户&f' + - 他们几天前来过。 + - 他们偷走了我 + - 最珍贵的&e财产&f。 + - 你需要找到他们 + - 并给他们点教训。 + - 让他们知道 + - '&a维奥莱特&f可不是好惹的。' + questAcceptDialog: + - '&a[多米娜·维奥莱特]&f 他们往西走过了&9树林&f。' + - '&7&o我要让&c&o客户&7&o不敢惹&a&o维奥莱特&7&o。我还需要取回&e&o维奥莱特的财产&7&o。' + questCompleteMessage: + - '&a[多米娜·维奥莱特]&f 我希望你让他们感受到了痛苦。' + - + - +primis_ice_village_objection!: + customObjectives: + Objective3: + dialog: + - '&a[格拉西斯·普林塞普斯]&f 什么,当然不行。我不知道他是怎么说服你来这请求我释放他的。' + - + - + - 他不可能出狱。明白了吗。 + Objective1: + dialog: + - '&a[罗曼努斯·素帕巴斯]&f 放了他?无罪?你疯了吗?你该庆幸我没因为你说这些胡话就把你关进牢笼。' + Objective2: + dialog: + - '&a[卢苏里亚·普拉西达斯]&f 谁?我没听说过。' + name: '&2异议!' + questLore: + - 我不是这儿的人!你看得出来吧? + - 我没有错!陌生人,你愿意听我的恳求吗? + - 你愿意帮助我这个 + - 困在破笼子里的可怜人吗? + - 你得和 + - '&a监狱长&f或' + - '&a村长&f谈谈。' + - 或者任何 + - '&a友善的村民&f' + - 谁愿意 + - 为我争取 + - 自由! + questAcceptDialog: + - '&a[阿德里乌斯·卡本尼乌斯]&f 找到他们!放我出来!' + - '&7&o我要和这些人谈谈。' + questCompleteMessage: + - '&a[阿德里乌斯·卡本尼乌斯]&f 什么?!他们在说谎!!!我从未对我的家人做过这么可怕的事……' + - + - + - '&7看来这个可怜的家伙已经失去了残存的理智……' +primis_ice_village_run_away_daughter: + customObjectives: + Objective1: + dialog: + - '&a[塞斯提亚·恩诺迪厄斯]&f我能感知到你的到来。' + name: '&2出走的女儿' + questLore: + - 陌生人!你能帮帮我的家庭吗? + - 我们的&a女儿&f失踪了。 + - 她和她&a母亲&f一样 + - 有特殊能力 + - 恐怕昨晚发生了 + - 可怕的事情 + - 使得她在半夜 + - 离家出走 + questAcceptDialog: + - '&a[斯帕拉克斯·恩诺迪厄斯]&f 我的&a妻子&f 已经去找她了。' + - 她肯定在村庄外某处。去找她吧。 + - '&7&o我应该去找&a&o忧心忡忡的母亲&7&o。' + questCompleteMessage: + - '&a[塞斯提亚·恩诺迪厄斯]&f 我&a丈夫&f派你来帮助搜寻的?' + - '&7&o我应该去找&a&o忧心忡忡的母亲&7&o。' +primis_ice_village_silence: + name: '&2给他们点教训' + questLore: + - 嘘!你听到了吗? + - 那恼人的尖叫。 + - 啊,我受不了了! + - 听着,如果你能找到 + - 噪音的来源 + - 并让它停下 + - 我就给你钱。 + questAcceptDialog: + - '&a[莫德斯特·尤洛吉乌斯]&f 它听起来像是从我身后的山上传来的。' + - '&7&o我应该找到并抹除噪音来源。' + questCompleteMessage: + - '&a[莫德斯特·尤洛吉乌斯]&f 我和我的耳朵都感谢你!' +primis_ice_village_taking_the_bait: + name: '&2上钩' + questLore: + - 这些&c鱼&f有什么毛病! + - 我已经在这里钓了好几天鱼了! + - 它们一口都不咬。要是我还年轻的话我就要让它们知道我的厉害! + - + - + - 如果我们什么都抓不到,麻烦就很大了。 + - 你得下去揍它们。 + questAcceptDialog: + - '&a[欧普若皮迪·尼禄]&f 你帮忙的机会来了!' + - '&7&o我得跳进湖里杀死7只&c&o鲑鱼&7&o并收集它们的尸体。' + questCompleteMessage: + - '&a[欧普若皮迪·尼禄]&f 哦!看看它们!好大!' + - + - +primis_ice_village_treats_for_the_punished: + customObjectives: + Objective1: + dialog: + - '&a[厄琉斯·卡莱纳斯]&f 我妻子派你来的?哦,这些是点心吗?还是我最喜欢的!她真贴心。' + - + - + - '请你去告诉她我很好,我非常爱她。' + name: '&2给受刑者的点心' + questLore: + - 如果你不介意的话,我能请你帮我做件事吗? + - 我亲爱的&a丈夫&f遭受了监禁,我知道他在牢笼里度日如年。 + - 所以我给他准备了一些点心。 + - + - + questAcceptDialog: + - '&a[提提亚·卡里努斯]&f 他在中间的牢笼里。' + - 别忘了告诉他我爱他。 + - '&7&o我应该吧这些点心交给&a&o丈夫&7&o。' + questCompleteMessage: + - '&a[提提亚·卡里努斯]&f 这么快回来了!噢,他真的这么说?他真可爱!' +primis_ice_village_wanna_make_a_snowman: + name: '&2想造个雪人' + questLore: + - 村里的孩子们最近都很无聊 + - 所以最近我在想 + - '这些树林里的&c魔法生物&f' + - 它们的毛皮能制造&e魔法冰晶&e。 + - 当你在雪中注入这些&e水晶s&f时, + - 它会让雪四处移动,膨胀和收缩。 + - 如果你用注入水晶的雪堆雪人 + - 它就能让雪人栩栩如生。 + - 孩子们会很喜欢的!所以, + - 能帮我这个老头哄孩子吗? + questAcceptDialog: + - '&a[斯帕拉克斯·恩诺迪厄斯]&f 你能在村庄附近的树林里找到这些&c生物&f。' + - + - + - '&7&o我需要击杀&c&o冰霜毛熊&7&o获得15个&e&o寒冰水晶&7&o。' + questCompleteMessage: + - '&a[塞斯提亚·恩诺迪厄斯]&f 你收集到足够的水晶了?很好!' + - 我可以开始造雪人了,我迫不及待让孩子们看到雪人了! +primis_main_quest_: + name: '&2哥布林在矿井里!' + questLore: + - 今天真是越来越糟了。首先,我们受到了哥布林伏击。 + - 我们撤退了,却发现我们的军队四分五裂。一些人死亡,很多人失踪。 + - 最糟糕的是,我们恐怕唤醒了哥布林国王。 + - 希望一些人能挺过来。我们现在得搭帐篷整军待战。 + - 如果你敢勇敢地进入矿井,你就得靠自己了。 + - 我们试图从他们身边溜过去,但损失惨重。 + - 你只能够杀出一条血路。 + questAcceptDialog: + - '&8[百夫长]&f你敢进入哥布林矿井吗?小心哥布林国王!' + - '&8[百夫长]&f希望我们的侦察队绕过了它。如果可以的话,去和他们会面吧。' + - '&8&o我应该冒险穿过矿井并击败哥布林国王。' + questCompleteMessage: + - '&8[侦察部队]&f你过来了?我真希望你没来。你不会相信前方会发生什么。' + - '&8&o看来侦察部队有坏消息给我。' +primis_main_quest_1: + customObjectives: + Objective1: + dialog: + - '&a[双鱼村长] &fOh so you were in the ship that beached a few hours ago?' + - + - + - + - + - + - + - '&7&o我应该向&a大副&7&o汇报,看看我能否帮助那些人!' + name: '&2海难!' + questLore: + - 你终于醒了?很好!我们需要你的帮助。 + - 船在昨晚的暴风雨中搁浅了。 + - 我们看见了远处的一座&灯塔&f,那么附近肯定有村庄! + - 找&a村长&f看看他们能不能帮我们! + - '&a大副&f先行一步了,但他还没回来。' + - 如果你看到他了,跟随他的指示! + questAcceptDialog: + - '&a[角鲨船长]&f 去附近的村子看看他们能否帮我们!' + - 去的路上小心点,我们不知道这附近有什么! + - '&7&o我应该调查附近的村庄并和村长谈谈。' + questCompleteMessage: + - '&a[大副伊拉昆迪]&f 该死!我们今天没空休息了!显然独自行动十分危险,拿上这个!' + - '&7&o似乎大副伊拉昆迪有求于我……' +primis_main_quest_10: + customObjectives: + Objective2: + dialog: + - "&a[内维塔将军] &f&d格拉迪厄斯&f calls for our aid?\n&7&oSeems like I should talk to the &aShogun&7&o." + name: '&5缩小差距' + questLore: + - 是时候寻求&d千桥&f的帮助了。 + - 让他们知道这里发生的事情,告诉他们我们需要援助。 + - + - + questAcceptDialog: + - '&a[将军哈斯塔] &f一路平安,朋友。记住:杀死&c守门人&f并把我们的请求传达给&a将军内维塔&f。' + - '&7&o我应该杀死&d桥&7&o上的&c守门人&7&o并找到&d千桥&7&o的&a将军内维塔&7&o。' + questCompleteMessage: + - '&a[将军内维塔]&f 你带给我的消息确实令人不安,但恐怕我们怀疑已经有一些不自然的事情发生。' + - '&7&o似乎&a将军内维塔&7&o想要和我谈谈。' +primis_main_quest_11: + customObjectives: + Objective1: + dialog: + - '&a[福特斯·贝拉特少校]&f 有什么事吗,旅行者?' + name: '&2传递消息!' + questLore: + - 你的旅行故事真让人惊讶。 + - 你能活到这里简直就是奇迹。 + - 入侵&d格拉迪厄斯&f的敌人难以战胜。 + - '&d格拉迪厄斯&f难以抵抗他们的进攻……' + - 援助?……啊面对了。去找&a福特斯·贝拉特少校&fb吧。 + - 它能够协助你们。 + questAcceptDialog: + - '&a[内维塔]&f 爬上前面的楼梯你就能找到&a少校&f!' + - '&7&我应该找&a少校&f,看看他能否提供帮助。' + questCompleteMessage: + - '&a[福特斯·贝拉特少校]&f &a将军&f想要援助&d格拉迪厄斯&f?我以为他永远都不会求援呢!但首先我们需要做好准备。' + - '&7&o似乎&a福特斯·贝拉特&7&o有活要给我。' +primis_main_quest_12: + customObjectives: + Objective1: + dialog: + - '&a[百夫长]&f 我们的援军呢?' + name: '&2矿井之路' + questLore: + - 我不敢相信&d格拉迪厄斯&f发生的事情。 + - 他们速战速决,直击要害。 + - 帮助我们的盟友是我们宣誓过的职责。 + - 但我们辜负了盟友。 + - '&c顾问&f在入侵前' + - 在多片地区动员军队。 + - 你看,最近在在&d风暴神殿&f + - 我们发现了一场不寻常的毁灭性风暴。 + - 皇家守卫奉命平息这场风暴, + - 但&a将军&f拒绝执行命令。 + - 我们的守卫在别处,恐怕我们需要 + - 付出惨痛代价才能夺回&d格拉迪厄斯&f。 + - 前往&d风暴神殿&f的道路艰险无比, + - 你需要穿过&d哥布林矿井&f。 + - 帮我们的守卫清除矿井,开辟一条通往&d风暴神殿&f的道路! + questAcceptDialog: + - '&a[福特斯·贝拉特]&f小心前进,&d哥布林矿井&f可是危险之地。也许你应该在援助&a皇家守卫&f先援助普通守卫。' + - '&d矿井&f在城市北面。入口处有楼梯。' + - '&7&o我应该看看如何帮助&a福特斯·贝拉特&7&o,或者前往&d哥布林矿井&7&o的入口处。' + questCompleteMessage: + - '&a[百夫长]&f能看到人真好!是&d千桥&f的人派你来的吗?' + - '&7&o我该听听&a百夫长&7&o有什么话要说' +primis_main_quest_13: + name: '&2哥布林在矿井里!' + questLore: + - 今天真是越来越糟了。首先,我们受到了哥布林伏击。 + - 我们撤退了,却发现我们的军队四分五裂。一些人死亡,很多人失踪。 + - 最糟糕的是,我们恐怕唤醒了哥布林国王。 + - 希望一些人能挺过来。我们现在得搭帐篷整军待战。 + - 如果你敢勇敢地进入矿井,你就得靠自己了。 + - 我们试图从他们身边溜过去,但损失惨重。 + - 你只能够杀出一条血路。 + questAcceptDialog: + - '&a[百夫长]&f 你敢进入哥布林矿井吗?小心哥布林国王!' + - 希望我们的侦察队绕过了它。如果可以的话,去和他们会面吧。 + - '&7&o我应该冒险穿过矿井并击败哥布林国王。' + questCompleteMessage: + - '&a[侦察部队]&f你过来了?我真希望你没来。你不会相信前方会发生什么。' + - '&7&o看来侦察部队有坏消息给我。' +primis_main_quest_14: + name: '&2风暴平息' + questLore: + - 真不敢相信你能通过 + - '&d哥布林矿井&f。' + - 也许有此等毅力,你能面对前方的挑战。 + - 我们尝试袭击&d风暴神殿&f, + - 并付出惨痛代价到达最深处。 + - 我们在那里的发现……难以理解。 + - 这可能很难相信,但风暴本身 + - 变成了我们的对手。 + - 我们甚至都不知道能否战胜风暴。恐怕我们是自寻死路。 + - + - + questAcceptDialog: + - '&a[布莱法罗]&f 我们削弱了他们的力量,但这仍然不是一件容易的事。' + - 风暴可不是一般的敌人。别小瞧了它。 + - '&7&o我应该进入&d风暴神殿&f并杀死&c风暴&f。' + questCompleteMessage: + - '&a[将军内维塔]&f 什么,你' + - 击败了&c风暴&f? 有人告诉我那不可能!我的意思是…… + - '……现在逃避也没用了。我知道&c风暴&f。我知道&d格拉迪厄斯&f的入侵——我甚至促成了这次入侵。我这么做是为了我的人民——为了&d千桥&f。' + - '&c马基雅维利顾问&f说服了我&c风暴&f无法阻挡,&d格拉迪厄斯&f和&d千桥&f终将陨落,我们只能牺牲自我来延缓毁灭。' + - + - + - '&8&o似乎&a将军内维塔&7&o有问题要解决。' +primis_main_quest_15: + name: '&2遣散费偿还!' + questLore: + - + - + - + - + - + - + - + - + - + - 我为我们争取到了时间。 + - + - + - + - + - 他引导我们走向厄运,如果不是你出现,他就得逞了。 + - 现在我们有了希望。 + - 请帮我们除掉这个奸诈的&c顾问&f。 + - + - + - + - + - + - + - 我希望通过他们来传递最后一条信息。 + questAcceptDialog: + - '&a[将军内维塔]&f &c马基雅维利顾问&f退回了他在低城旁边的住处了。小心点,他积累了一批忠实的追随者,他不会不战而降。' + - '&7&o是时候让&c马基雅维利顾问&f接受正义的审判了。' + questCompleteMessage: + - '&a[将军内维塔]&f 完成了。' + - '&d千桥&f欠你一个天大的人情,漫游者。.我们完成军队动员后将准备好纠正过错,向&d格拉迪厄斯&f进军援助。' + - '&7<将军内维塔专注于远言之石>&a[将军内维塔]&2 我们惧怕你。我们献上了盟友。我们的军队四分五裂。现在不再是了。' + - '&d千桥&2向战争进军,而我们不会孤军奋战!你将后悔遇到我们。' + - '&7<&a将军内维塔&7将远言之石砸在地上时,里面传出不祥的笑声。>' + - '&7&o似乎&a将军&7&o有个点子。我应该和他谈谈。' +primis_main_quest_16: + customObjectives: + Objective3: + dialog: + - '&a[&6迪门斯·诺尔斯]&f 前往村庄只需要往东沿着路走,很快就到了!' + Objective4: + dialog: + - '&a[卡利波·卡利奇斯]&f 不知道方向?只需沿着这条道路走就能到墓地。' + Objective1: + dialog: + - '&a[格拉西斯]&f 欢迎来到我们的村庄,旅行者!请告诉我是什么风把你吹到这的。' + Objective2: + dialog: + - '&a[布罗米亚·卡勒鲁斯]&f 通往村庄的路?没错,走这条通往山脉的道路就对了。' + - 乐意帮助! + name: '&2寒冰村庄在等待' + questLore: + - 我们必须尽快援助&d格拉迪厄斯&f。 + - 冠军,在遥远的南方有一个骁勇善战的村庄。 + - 你应该去那里告诉他们&d千桥&f + - 需要他们击退&d鲜血神殿&f的入侵者。 + - 找到&a格拉西斯·普林塞普斯&f并告诉他是我让你找他的。 + - 路上有很多旅行者,你应该停下来找他们问路。 + questAcceptDialog: + - '&a[将军内维塔]&f 这将是一个漫长的旅程。请一定要做好准备。沿着通往南方的路走。' + - '&7&o我必须找到南部的&d&o寒冰村庄&7&o。' + questCompleteMessage: + - '&a[格拉西斯·普林塞普斯]&f 将军派你来的,我明白了,很高兴听到&a内维塔&f做回曾经的自己。' + - + - + - 让我告诉你…… + - '&7&o我应该和&a&o格拉西斯·普林塞普斯&7&o对话。' +primis_main_quest_17: + customObjectives: + Objective3: + dialog: + - '&a[欧普若皮迪·尼禄]&f 帮助?很好!' + Objective1: + dialog: + - '&a[阿兰努斯·伊萨蒂斯]&f 你是来帮我们解决&c尖背野猪&f的?' + Objective2: + dialog: + - '&a[多米娜·维奥莱特]&f 希望你是来帮忙的!' + name: '&2帮助北方居民' + questLore: + - 在我们进一步讨论 + - '&d鲜血神殿&f前,' + - + - + - 如果这些问题得不到解决,那么作为村长的我就失职了。 + - 我不可能无视自己的人民请求,把其他事情放在第一位。 + - + - + - + - + - + - + - + - + - 他们能更详细地告诉你需要做什么。 + questAcceptDialog: + - '&a[格拉西斯·普林塞普斯]&f 你帮助完他们后再回来找我谈谈。' + - '&7&o我应该去和名单上的村民谈谈,帮助他们解决可能遇到的任何问题。' + questCompleteMessage: + - '&a[罗曼努斯·素帕巴斯]&f &2格拉西斯&f派你来的?真不是时候!我们有个囚犯越狱了!' + - '&7&o我应该和&a&o罗曼努斯·素帕巴斯&7&o谈谈。' +primis_main_quest_18: + name: '&2寒冰试炼' + questLore: + - 你确实给我和村里大多数人留下了深刻印象。 + - + - + - 都在汲取&c冰元素s&f的力量。 + - + - + - + - + - '&c小冰元素s&f。' + - + - + - 如果你失败了……你的能量将归于&c冰元素s&f。 + - + - + - 自从 + - + - + - 一些人受到腐蚀,为了我们的安全,我们不得不监禁他们。 + - + - + - + - + - 成为了 + - '&c冰元素s&f的奴隶。' + - 显然我们的传统已不复存在。 + - 得干掉&c冰元素s&f…… + - 我请请你 + - 完成&9寒冰试炼&f。爬上山巅并面对 + - '&c小冰元素s&f,解救试炼失败的灵魂。' + questAcceptDialog: + - '&a[格拉西斯·普林塞普斯]&f你可以在&a维奥莱特&f的家里找到通往试炼之路。' + - 跟随&9紫晶&f块,它们会引导你到达山巅。 + - '&7&o我应该跟随&9&o紫晶块&7&o到山巅并杀死&c&o小冰元素s&7&o。' + questCompleteMessage: + - '&a[格拉西斯·普林塞普斯]&f 你做到了?愿他们的灵魂得以安息。' + - 让我们再谈谈吧,朋友。还有更多事情要做。 + - '&7&o我应该和&a&o格拉西斯·普林塞普斯&7&o谈谈。' +primis_main_quest_19: + name: '&2冷静' + questLore: + - 是时候解除这个诅咒了。 + - 我们不应该依赖于&c元素s&f之力。 + - 我们将在此时此刻纠正这一错误。 + - 你所杀的只是 + - '&c小冰元素s&f,' + - '&c极恶冰元素&f在我们村子对面的一座神殿里。' + - 它才是我们力量……和愚蠢的主要来源。 + - 去杀死&c极恶冰元素&f吧。 + questAcceptDialog: + - '&a[格拉西斯·普林塞普斯]&f 有一条通往神殿的路。' + - '&7&o我应该前往神殿并杀死&c&o极恶冰元素&7&o。' + questCompleteMessage: + - '&a[格拉西斯·普林塞普斯]&f 我能感觉到能量从这里一路流淌出来。' + - + - + - 还有一个定居点可能需要你的援助。 + - '&a&o格拉西斯·普林塞普斯&7&o有话要说。' +primis_main_quest_2: + customObjectives: + Objective1: + dialog: + - '&a[双鱼村长]&f你能帮我们?感谢大海!' + name: '&2S需要帮助的陌生人……' + questLore: + - 所以他们不仅不能帮忙,而且还想要我们帮忙?哈! + - 好吧,我们现在没有什么选择了,对吧? + - 去帮助他们吧,然后让他们帮助我们! + questAcceptDialog: + - '&a[大副伊拉昆迪]&f 好吧,去帮助当地人,看看你能收集到什么信息,让他们反过来帮助我们。我将在这里谈判一些事情。' + - 有消息马上回来! + - '&7&o我应该和&a村长&f谈谈如何帮助当地人。' + questCompleteMessage: + - '&a[双鱼村长]&f 村里人人都有难言之隐,我也不例外。 我的要求颇具挑战性,所以也许你需要先热热身,从其他村民那里了解他们的问题。' + - + - + - '&7&o我应该和当地人谈谈,看看谁需要帮助,等我觉得准备就绪时再找村长。' +primis_main_quest_20: + customObjectives: + Objective1: + dialog: + - '&a[卢登·普林塞普斯]&f 最好是重要的事。' + name: '&2泰拉维拉' + questLore: + - 前段时间,我们收到一份来自 + - 附近定居点的援助请求。几年前有一群 + - 探险者定居在这座古代废墟上。 + - 他们的定居点应该 + - 叫做&d泰拉维拉&f。如果你不惧危险, + - 那里有很多宝藏等待你去探索。 + - 但我听说那里出了些事,因此他们 + - 才寻求我们的援助。 + - 说实话,你是我见过最强的战士。 + - 你就是我们能派出的最佳援兵。 + - 希望你能前去援助。 + questAcceptDialog: + - '&a[格拉西斯·普林塞普斯]&f &a泰拉维拉&f就在西边。' + - + - + - 哦,我差点忘了。你要和&a卢登工头&f谈谈。 + - '&7&o我应该前往&d&o泰拉维拉&7&o并与&a&o卢登工头&7&o对话。' + questCompleteMessage: + - '&a[卢登·普林塞普斯]&f 从&d寒冰村庄&f远道而来,嗯。很高兴看到有人来帮忙。 - 我发出援助请求时,我不确定我们是否能得到援助。我听说那边的情况也没好到哪里去。 - 我们在这里陷入了困境。如果你愿意,我们有很多工作给你。 - ''&7&o我应该和&a&o卢登&7&对话。' + - + - + - + - + - '&7&o我应该和&a&o卢登&7&对话。' +primis_main_quest_21: + name: '&2倒垃圾' + questLore: + - 许多年前,一些探险家发现了这片废墟 + - 当他们深入调查时,他们发现了一个 + - 大型地下迷宫状结构。里面有 + - 很多古代文物和珍宝, + - 但也潜藏着很多危险。危险并不能阻止人们趋之若鹜。 + - 随着消息的传播,越来越多的人 + - 来这里发财致富。 + - 那里形成了一个小定居点。 + - 一切都很好,直到最近发生了可怕的事情。 + - 在我告诉你更多信息之前,我们应该从 + - 先处理个小问题。 + - '一小群&c强盗&f在周围的山上驻足' + - '那里是&d泰拉维拉&f。你需要驱逐他们。' + - 你也可以帮助那里的村民。 + questAcceptDialog: + - '&a[卢登·普林塞普斯]&f 我不确定&c强盗&f的具体位置。我只知道人们看见他们从山里出来。' + - '&7&o我应该解决&c&o强盗&7&o并帮助村民。' + questCompleteMessage: + - '&a[卢登·普林塞普斯]&f 看来问题解决了。让我们谈谈下一个问题!' + - 在此之前,我有把剑要给你。 + - + - + - '&7&o我应该继续和&a&o卢登&7&o谈谈。' +primis_main_quest_22: + name: '&2小酒吧里大麻烦' + questLore: + - 在我们谈论地下的大问题之前, + - 我希望你能帮我解决镇里最后一件事。 + - 我们的小酒吧里有大麻烦了。 + - 镇里一些家伙在酒吧里制造骚动。 + - 我听说他们所有人都会在同一时间聚集在酒吧。 + - 当然,现在那里正在发生一场巨大的争吵。 + - 这是个能逮捕他们所有人的好机会。 + - 去酒吧打倒他们吧。 + - 剩下的事情由我们处理。 + questAcceptDialog: + - '&a[卢登·普林塞普斯]&f 酒吧在一楼,正对面。去浇灭他们的气焰。' + - 完事后我有丰厚的奖励给你。 + - '&7&o我需要前往酒吧并解决&c&o酒吧斗殴者&7&o。' + questCompleteMessage: + - '&a[卢登·普林塞普斯]&f 我听说酒吧再次和平了。现在让我们谈谈真正的问题吧。' + - '&7&o我应该和&a&o卢登&7&o谈谈。' +primis_main_quest_23: + name: '&2撼击大地' + questLore: + - 我们请求帮助的真正原因是在废墟发生的事情。 + - 下面总是有危险的东西。 + - 但没有什么是经验丰富的冒险者或探险者不能处理的。 + - 但后来一些东西觉醒了,这些古老的建筑开始从地面和墙壁中升起。 + - 然后引发了地震。 + - 因为只有在废墟中才能感觉到, + - 所以我们关闭入口,不再允许任何人进入废墟。 + - 几天前,我召集了一些最好的朋友,让他们去寻找 + - 这一切的源头。他们差点没能回来。他们发现柱子上有个&c地元素&f + - 它一定是一直处于休眠状态。 + - 不知道为什么它现在醒来了。 + - 你的任务是到下面去,穿过迷宫, + - '让&c地元素&f陷入永远不会醒来的沉睡。' + questAcceptDialog: + - '&a[卢登·普林塞普斯]&f 沿着废墟中间的螺旋楼梯走下去,你就能到达迷宫。' + - + - + - '&7&o我应该进入&d&o废墟迷宫&7&o并杀死&c&o地元素&7&o。' + questCompleteMessage: + - '&a[卢登·普林塞普斯]&f 难以置信你安然无恙地回来了!' + - + - + - + - '&7&o我要和&a&o卢登&7&o谈谈&d&o鲜血神殿&7&o的事。' +primis_main_quest_24: + customObjectives: + Objective1: + dialog: + - '&a[内维塔]&f 你回来了!希望你有好消息。' + name: '&2再度归来' + questLore: + - 我们不知道发生了什么事…… + - '&d泰拉维拉&f承诺会给你' + - 提供力量。我不知道 + - '&c地元素&f的觉醒是否' + - 和&d鲜血神殿&f有关。 + - 但我们会为 + - '&d千桥&f提供援助。' + questAcceptDialog: + - '&a[卢登·普林塞普斯]&f 你要前往&d千桥&f了吗,别忘了告诉&a将军&f&d泰拉维拉&f准备好提供援助了。' + - '&7&o我应该前往&d&o千桥&7&o并和&a&o内维塔将军&7&o谈谈。' + questCompleteMessage: + - '&a[内维塔]&f 很好,&d寒冰村庄&f决定帮助我们!但我没料到你能说服&d泰拉维拉&f也帮助我们。' +primis_main_quest_25: + customObjectives: + Objective1: + dialog: + - '&a[前哨职员职员]&fFILLER TEXT!' + name: '&2前往前哨' + questLore: + - 很高兴再次见到你,朋友! + - 你离开时,我们整军待战。 + - 我们在&d鲜血神殿&f和&d千桥&f之间 + - 建立了一座&d前哨&f。 + - 你应该去那里和 + - '&a前哨职员&f汇报。他们会告诉你' + - 我们准备好了突击 + - '&d鲜血神殿&f。' + questAcceptDialog: + - '&a[内维塔]&f 前哨在城市南边。&d泰拉维拉&f和d寒冰村庄&f的援军很快就会到了。' + - '&7&o我应该前往&d&o前哨&7&o和&a&o前哨职员&7&o谈话。' + questCompleteMessage: + - '&a[前哨职员]&f 我不知道该说什么' +primis_main_quest_3: + name: '&c强盗营地!' + questLore: + - 最近附近出现了&d强盗营地&f + - 他们想掠夺我们! + - 他们不断抢劫我们的物资,绑架我们的村民! + - 他们甚至拿走了我&e祖父的传家宝&f! + - 我们不知道他们想要什么,但我们只想要他们离开! + - 弄清楚他们在做什么,解决他们并 + - 带回我&e祖父的传家宝&f! + questAcceptDialog: + - '&a[双鱼村长]&f 如果你跟着道路走的话,&d强盗营地&f离这儿并不远!' + - + - + - 噢,别忘了带回&e祖父的传家宝&f! + - '&7&o我应该去扫除附近的&d强盗营地&7&o。' + questCompleteMessage: + - '&a[双鱼村长]&f 你回来了!你带来了好消息吗?' + - '&7&o你告诉了&a双鱼村长&7&o营地的事并交给了他&e传家宝&7&o。' + - + - + - + - + - '&7&o看来&a双鱼村长&f准备好告诉我如何离开这里。' +primis_main_quest_4: + customObjectives: + Objective1: + dialog: + - '&a[佩特拉]&f &2双鱼村长&f派你来的》可惜这条路封锁了,因为&c元素&f拦住了这条路……' + name: '&9蓝色花径!' + questLore: + - 我们必须报告给&d格拉迪厄斯&f + - '&d强盗营地&f的存在!' + - 这山口由一座古老 + - 强大的&c傀儡&f把守!得避开它! + - 一路跟随&e蓝花&f + - 它们会引导你到 + - 一条秘密通道。 + - 登山导游会在 + - '&9蓝色花径&f的尽头等着你!' + questAcceptDialog: + - '&a[双鱼村长]&f 山口有一个极其危险的&c傀儡&f在把守,你现在可能打不过它! - 我们知道山里有一条秘密通道。跟随&9蓝色花径&f并和&a登山导游&f对话到达桥港! - ''&7&o我应该跟随&9&o蓝色花径&7&o找到&a登山导游&7&o!' + - + - + - '&7&o提示:追踪任务以便更容易找到目的地!' + - '&7&o我要确保在走之前把剩下的事情都做完。' + - '&7&o提示:追踪任务以便更容易找到目的地!' + questCompleteMessage: + - '&a[佩特拉]&f 你确定要冒这个险吗?我可以帮你……' + - '&7&o似乎&a佩特拉&f有任务要给我。' +primis_main_quest_5: + name: '&5水晶元素' + questLore: + - 你要通过?那你来的正不是时候了,我的朋友。 + - '&c水晶元素 &f' + - 挡住了去路。 + - 如果你真的要去格拉迪厄斯, + - 你得先击败&c元素&f! + questAcceptDialog: + - '&a[佩特拉]&f 你击败了&c水晶元素&f?我只能祝你好运了!' + - + - + - '&7&o似乎我得击败&c水晶元素&7&o。' + questCompleteMessage: + - '&a[佩特拉]&f 太棒了!我看到你击败了&c水晶元素&f,你前途无量啊!' + - 我们到了另一侧了,让我们告诉你前往&d格拉迪厄斯&f的路吧! +primis_main_quest_6: + customObjectives: + Objective1: + dialog: + - '&a[菲留斯] &f你成功翻越了这座山!这可不容易啊。' + - + - + - '&7&oSeem like &a菲留斯&7&o can help me find the way to &d格拉迪厄斯&7&o。' + name: '&5农场' + questLore: + - 去&d格拉迪厄斯&f很简单, + - 但我们一路上遇到了很多干扰 + - 恐怕也没有那么简单。 + - 我是这条路上&a农场主&f的好朋友。 + - 如果你告诉他们是我派你来的, + - 我肯定他们会告诉你如何安全地抵达&d格拉迪厄斯&f并 + - 给予你附近地区的消息。 + - 祝你一路顺风! + questAcceptDialog: + - '&a[佩特拉]&f 告诉&a农场主&f是我派你来的,不过我听说很久都没人看见他。' + - + - + - 一路顺风! + - '&7&o我应该跟随这条路到达&d农场&7&o并和&a农场主&7&o对话。' + questCompleteMessage: + - '&a[佩特拉]&f 很好!我看到你击败了&c水晶元素&f,你前途无量啊!' + - 我们到了另一侧了,让告诉你前往&d格拉迪厄斯&f的路吧! + - '&7&o我应该和&a菲留斯&7&o对话了解前往&d格拉迪厄斯&7&o的路,并和他的&a母亲&7&o对话,看看我能否帮她。' +primis_main_quest_7: + customObjectives: + Objective4: + dialog: + - '&a[将军哈斯塔] &f你尽然能穿过敌军来到这里。' + - 你正是我们现在需要的援军! + - '&7&o我应该和&a将军哈斯塔&7&o谈谈。' + name: '&5格拉迪厄斯之路' + questLore: + - 最近&d格拉迪厄斯&f堡垒硝烟四起。 + - 我们无法去哪里看发生了什么事 + - 因为有艘&d船&f阻挡了去路。 + - 当我们靠近&d船&f时我们受到了一群亡灵生物的攻击。 + - 所以我们逃跑了。 + - 恐怕你得强行通过 + - '那艘&d船&f才能到达&d格拉迪厄斯&f。如果你能削减&c亡灵食物&f的数量,' + - 我肯定它们会给予你奖励,! + questAcceptDialog: + - '&a[菲留斯] 路上小心,&d格拉迪厄斯&f肯定出事了。' + - + - + - '&7&o我应该前往&d格拉迪厄斯&7&o并清除路上的&c亡灵水手&7&o。' + questCompleteMessage: + - '&a[哈斯塔领主]&f 你就是千桥派来的救兵?其他人呢?你是信使吗?' + - '&7&o我应该和&a哈斯塔领主&7&o谈谈。' +primis_main_quest_8: + name: '&5重燃希望' + questLore: + - 我们从未料到会有入侵。 + - 他们在夜深人静时对我们进行了猛烈而快速的打击。 + - 在我们知道这个消息前,城市已沦陷过半。 + - 士气低迷,大家都失去了某人。 + - 为缓解悲痛, + - 我们的亲人在街上游行。 + - 我们需要团结起来,增强士气。 + - 不然我们就看不到明天的黎明了! + - 回到我的&d宅邸&f,在我的宝库里有一份 + - 至关重要的&e文件&f。 + - 这是与&d千桥&f的创始人之一的书面承诺,在紧急时刻为我们提供援助。 + - 而现在正是时候。 + - 把&e文件&f带给我 + - 我保证你会受到&d千桥&f的热烈欢迎。 + - 有了这份希望, + - 士兵们就能重振旗鼓。 + questAcceptDialog: + - '&a[将军哈斯塔] 说明纸条在我的&d宅邸&f中。请务必把它带回来。我的人在这里也有其他请求,如果可以的话,你可以帮忙。 - ''&7&o我应该看看其他士兵有什么需求,前往城镇出口处的&d宅邸&7&o。' + - '&7&o我应该看看其他士兵有什么需求,前往城镇出口处的&d宅邸&7&o。' + questCompleteMessage: + - '&a[哈斯塔领主]&f 很好!能取得这样重要的&e文件&f,再有10这样的你我们就不愁此战不胜了!' + - 在你走之前,你能不能帮我一个小忙? + - '&7&o似乎&a哈斯塔领主&7&o想要和我谈谈。' +primis_main_quest_9: + name: '&5格拉迪厄斯的冠军' + questLore: + - 在前往&d千桥&f前, + - 我要请你帮我一个小忙。 + - 我们的&c冠军&f + - 在&d雕像&f附近战斗。 + - 自从入侵开始后他就没了消息。 + - 我们担心这是最坏的情况。 + - 请去看看他有没有事。如果你找到他了 + - 但他变成了亡灵的话……请让他解脱。 + questAcceptDialog: + - '&a[将军哈斯塔] &f前往&d雕像&f那里。我们的&c冠军&f应该很好找。' + - '&7&o我应该去&d雕像&7&o那里调查&c格拉迪厄斯的冠军&7&o发生了什么事。' + questCompleteMessage: + - '&a[将军哈斯塔]&f 那么……最坏的情况已经发生了。这些野兽将为杀死我儿子付出代价。' + - 7&o似乎&a将军哈斯塔&7&o有话要说。 +primis_ogre_mines_clear: + name: '&2兽人横行' + questLore: + - 我们的矿区营地被占领了! + - 我们需要帮助! + - 我不知道发生了什么,但我们需要 + - 清除营地并和&a老维特斯&f! + questAcceptDialog: + - '&a[梅图斯]&f 你是来帮忙的?请赶快,营地就在上面!' + - '&7&o我应该清除营地并和&a老维特斯&7&o对话。' + questCompleteMessage: + - '&a[维特斯·福索斯]&f 你是来帮忙的?太好了,我们现在急需帮助!' + - 这是你帮忙清除营地的礼物! +primis_ogre_mines_lost_bretheren: + customObjectives: + Objective1: + dialog: + - '&a[富提斯·福索斯] &f你想要什么?什么,&a福吉特&f派你来的?矿井被占领了?我居然没注意到!' + - + - + - + name: '&5迷失的兄弟' + questLore: + - '&c兽人&7&o占领了矿井!' + - 在混乱中我和&d矿井&f里的&a兄弟&f分散了, + - 我担心他的安危! + - 我这个有点怪,十分专注于采矿。 + - 看到他你就知道是他了! + - 请把他带到我这儿,或者至少告诉我他还活着。 + - 我不会让你白跑一趟的! + questAcceptDialog: + - '&a[福吉特] &f请找到我的&a兄弟&f,确认他没事!' + - '&7&o我应该在&c兽人&7&o占领的&d矿井&7&o找到&a福吉特的兄弟&7&o。' + questCompleteMessage: + - '&a[福吉特·福索斯]&f 我的&a兄弟&f说了啥?啊,他就是这样,太过专注于工作,连附近被占领了都不知道!' + - 下次见到他我得和他好好谈谈! + - + - +primis_ogre_mines_old_miner_quest: + name: '&2幸运镐' + questLore: + - 我们现在有麻烦了! + - 我们采矿时遇到了一个神秘的洞穴,里面全是怪物! + - 我丢下了我的&e镐子e&f逃跑了,我你需要帮忙找回我的镐子! + - 我确认&c兽人法师&f捡走了。 + - 干掉它取回我的&e幸运镐&f! + - 回来后我能给你一些小玩意儿。 + questAcceptDialog: + - '&a[维特斯·福索斯]&f &c兽人&f应该不远!你可以在右边的洞穴里找到它。' + - 它应该有那把&e镐子&f,&c兽人s&f喜欢发光的东西! + - '&7&o我应该击败&c兽人首领&f。' + questCompleteMessage: + - '&aa[维特斯·福索斯]&f 你找到我的幸运镐了?太好了!' + - 这是你的奖励! +primis_pontis_groves_acrobatics: + customObjectives: + Objective1: + dialog: + - '&a[艾东塔特恩·霍米尼恩]&f 恭喜!' + name: '&2杂技' + questLore: + - 所以你认为你有这个能力。 + - 你是否足够健康、敏捷、强壮? + - 平台、藤蔓和危险的高度应有尽有! + - 最终挑战就在前方! + - 好吧,我和我的&a兄弟&f是有点无聊 + - 造了这片杂技场地。 + - 你的目标是使用&9藤蔓&f和&9杂技&f在平台间穿梭并 + - '并到达终点。' + - + - + - 你能获得非常好的&e物品&f! + questAcceptDialog: + - '&a[波苏尔·霍米尼恩]&f 你可以在&d隧道出口&f找到起点。' + - + - + - 别忘了在最后和我的&a兄弟&f对话领取奖励! + - '&7&o我应该前往起点。' + questCompleteMessage: + - '&a[艾东塔特恩·霍米尼恩]&f 实至名归!希望你没有作弊!如果可以的话,试着打破我的记录吧。' +primis_pontis_groves_caught in the web: + name: '&2陷入网中' + questLore: + - 它们在&d树林&f里某处筑造了&d巢穴&f。 + - 所以它们才会这么快繁衍。 + - + - + - 如果你能找到并清除&d巢穴&f,那就太好了。 + - 我们能给你&e蜘蛛腿靴子&f作为奖励! + questAcceptDialog: + - '&a[国王尼米安]&f &d巢穴&f附近&9缠绕着蜘蛛网&f。' + - '&7&o我应该找到并清除&d蜘蛛巢穴&7&o。' + questCompleteMessage: + - '&a[国王尼米安]&f 哈!就知道你可靠!' + - 这是你的靴子! +primis_pontis_groves_elf_stole_from_my_shelf: + name: '&2精灵偷走了重要的东西' + questLore: + - 灾难悄然而至。 + - 不久前我们家受到了&c精灵强盗&f的光顾。 + - 还好当时没人在家,所以没人受伤。 + - 我们设法更换了大部分的财产。 + - 但它们偷走了书架上的&e传家宝&f。 + - 如果你能好心帮我把它找回来,我非常感激。 + - 我做的炖菜最好吃,我很乐意和你分享一些作为奖励。 + questAcceptDialog: + - '&a[卢苏里亚·戈尔戈纽斯]&f &e传家宝&f无比珍贵,我会放在&9最安全的地方&f。' + - '&7&o我需要取回&e传家宝&7&o。' + questCompleteMessage: + - '&a[卢苏里亚·戈尔戈纽斯]&f 天哪!你找到了!' + - 对于你刚刚为我所做的一切,我十分感谢。 + - '&7&o这炖菜应该能饱腹一段时间。' +primis_pontis_groves_into_the_next_hole: + customObjectives: + Objective1: + dialog: + - '&a[菲吉娅·戈尔戈尼]&f 是时候让那些&cE精灵&f滚蛋了!' + name: '&2钻入下一个洞里' + questLore: + - 如果你有空,这里还有很多工作要做。 + - 我们有些严重的&c精灵&f问题, + - 但我派了&a菲吉娅&f去处理这些问题。 + - 在这个旁边的洞里找&a菲吉娅·戈尔戈尼&f。 + - 他们会告诉你更多的信息以及需要做什么。 + questAcceptDialog: + - '&a[国王尼米安]&f 就在这个旁边的洞里,不会错过的!' + - '&7&o我应该和&a菲吉娅·戈尔戈尼&7&o谈谈。' + questCompleteMessage: + - '&a[菲吉娅·戈尔戈尼]&f 让我们聊聊吧。' + - '&7&o我应该听听&a菲吉娅·戈尔戈尼&7&o要说什么。' +primis_pontis_groves_lighthouse_1: + customObjectives: + Objective1: + dialog: + - '&a[阿兰努斯·赛康达斯] &d树林&f派你来的?' + name: '&2运输食物' + questLore: + - 漫游者,我们请你帮个小忙吗? + - + - + - 但自从麻烦开始后,我们就无法离开&d树林&f。 + - 麻烦你把他们家最新一批食物带来。 + - 如果你能快点就太好了,距离上次发货已经过很久了。 + questAcceptDialog: + - '&a[国王尼米安]&f &d灯塔&f就在你出洞后前面左侧。' + - '&7&o我应该前往&d灯塔&7&o。' + questCompleteMessage: + - '&a[阿兰努斯·赛康达斯]&f 非常感谢!我们正缺食物。' + - 你忙吗? + - '&7&o似乎&a阿兰努斯&7&o想要和我谈谈。' +primis_pontis_groves_lighthouse_2: + customObjectives: + Objective1: + dialog: + - "&8[吉夫斯]&f 哦,我们又见面了!\n" + - '&8[吉夫斯]&f They do not need the food anymore? I was just about to go shopping.' + - '&8[吉夫斯]&f So kind of you to come here and let me know.' + name: '&2别问吉夫斯' + questLore: + - 呃,在你来之前,旅行商人吉夫斯来过。 + - 我们问他能否施舍给我们一些食物。 + - + - + - + - + questAcceptDialog: + - '&8[阿兰努斯·赛康达斯]&f 离开后灯塔就在你出洞后前面左侧。' + - '&8&o我应该前往灯塔。' + questCompleteMessage: + - '&8[阿兰努斯]&f 你告诉了他?好!' + - '&8&o似乎阿兰努斯很满意。' +primis_pontis_groves_population_control: + name: '&2种群数量控制!' + questLore: + - 哦,我真高兴终于有人来帮我们了。 + - 我们的小树林里有个大蜘蛛。 + - 它生了太多蜘蛛, + - 你甚至无法在愉快地在晚上散步。 + - 它们会从阴影中跳出来。 + - 很明显,它们的数量太多了。 + - 请给我带回一些保存完好的蜘蛛腿。 + - 我们用它们来制造小型起重机和抓斗。 + questAcceptDialog: + - '&8[国王尼米安]&f 你会发现他们潜伏在树荫下。' + - '&8&o我要找到森林爬虫,杀了他们。' + questCompleteMessage: + - '&8[国王尼米安]&f很高兴看到你回来,而且还带来了不少蜘蛛腿!' + - '&8[国王尼米安]&f你觉得它们的巢穴可能在附近吗?让我们多谈谈' +primis_pontis_groves_tree_climbing_elf_bandits: + name: '&2爬树的精灵强盗!' + questLore: + - + - + - 和&c蜘蛛&f不一样, + - 现在这些喜欢阴影的疯子决定住在我们的树上! + - + - + - + - + - 所以它们大量闯入。 + - 好吧,他们得到了一些东西, + - 看你一眼我就知道你能对付两个石头巨人! + - 我相信一些精灵对你来说不是什么大问题。 + - + - + questAcceptDialog: + - '&a[菲吉娅·戈尔戈尼]&f 我相信,如果你找到一些有树荫的地方,抬头看看,你会发现很多精灵,这样很难错过它们的树屋。' + - '&7&o我应该在&a菲吉娅&7&o抑制不住怒火前干掉&c精灵&7&o。' + questCompleteMessage: + - '&a[菲吉娅·戈尔戈尼]&f 我的朋友!哈哈!很高兴再次见到你!' + - + - + - '&7&o精灵再也不会打扰&a菲吉娅&7&o了。' +primis_pontis_mille_fields_berry_crazed_wolf: + name: '&2渴望浆果的狼群' + questLore: + - 天哪,我不知道这些&c岩石猎犬&f有什么毛病。 + - 它们在我离开或睡觉时涌入&d浆果农场&f。 + - 你以为它们是来吃浆果的?不! + - 它们把浆果塞在嘴里, + - 然后把带到森林深处。 + - 它们是&c猎犬&f!为什么它们会偷浆果呢。 + - 好吧,我想这没关系,我想请你帮个忙。 + - 请帮我清除 + - '&9浆果农场&f后面的区域' + - 并找回&e失窃的浆果&f。 + - 而它们偷揍的浆果已经成熟,是我做馅饼的原料。 + questAcceptDialog: + - '&a[多达卢斯·纳斯卡]&f 我只看到了&c岩石猎犬&f偷走浆果。' + - '&7&o我应该击杀&c&o红木岩石猎犬&7&o并收集它们掉落的&e&o失窃的浆果&7&o。' + questCompleteMessage: + - '&a[多达卢斯·纳斯卡]&f你做到了。我们再拜托你一件事吗。' + - '&7&o 似乎&d&o米洛尼亚&7&o还有件事。' +primis_pontis_mille_fields_camping_hunters: + customObjectives: + Objective1: + dialog: + - '&a[斯克雷波尼亚·英格维纳斯]&f 有事吗?' + name: '&2野营猎人' + questLore: + - 我希望没有打扰到你。你看起来像个会听从恳求的人。 + - 我们在&d贫民窟&f没有什么事儿干, + - 大多数人喜欢在&d田野&f漫步。 + - 可惜在&c怪物&f涌入&d田野&f后 + - 这成为了不可能。 + - 我们听说一些猎人在&d田野&f附近建造了&d营地&f。 + - 如果你能去那里和他们谈谈,让他们处理这些&c怪物&f…… + questAcceptDialog: + - '&a[奥古斯缇娜·维鲁克斯]&f 他们的&d营地&f应该就在西北部某处。' + - '&7&o我需要你前往&d&o猎人营地&7&o。' + questCompleteMessage: + - '&a[斯克雷波尼亚·英格维纳斯]&f 帮助&d贫民窟&f解决&c怪物&f问题?' + - 让我们多谈谈。 + - '&7&o我应该和to &a&o斯克雷波尼亚&7&o谈谈。' +primis_pontis_mille_fields_camp_hunter_three_times_hunter: + name: '&2三重猎杀' + questLore: + - 你找到了&a沃鲁尼亚&f。还好她没事。 + - 你帮助了&a沃鲁尼亚&f并证明了你的善良。 + - 来一场友好的挑战吧。 + - 如果你面对挑战并凯旋,我愿意为你提供一些质量上乘的盔甲。 + - 挑战包括猎捕 + - '分散在千桥的&c三只巨兽s&f。' + - '&c狂暴鳕鱼兽&f在两座山之间的桥梁下游动。' + - '&c爬行兽梅格登&f沉睡在阳光下的小树林上。' + - 在两座西部山峰之间跳舞,你会找到 + - '&c穿刺兽乌拉齐米尔' + - + - + questAcceptDialog: + - '&a[米洛尼亚·马朱斯]&f 拿上这个设备,它将大致引导你到它们的位置。' + - '&7&o我应该前往挑战&c&o三只巨兽&7&o。' + questCompleteMessage: + - '&a[米洛尼亚·马朱斯]&f 你回来了。你还带来了我要求的三件证明物品。' + - + - + - 好了,关于我的事情就到此为止,这是我承诺的奖励! + - '&7你交回了野兽追踪装置。' + - '&a[米洛尼亚·马朱斯]&f我几乎忘了这东西,谢谢你!' + - 有缘再会,冒险家! +primis_pontis_mille_fields_do_it_yourself: + name: '&2自己动手' + questLore: + - 解决&c怪物&f? 我可以告诉你,我们已经在这么做了。 + - 怪物太多了,而我们人数不足。 + - 我们在建造&d营地&f时就开始了猎杀怪物。 + - 但它们的数量似乎仍未减少。 + - 这还不是最糟糕的。 + - 我们还发现了一个&c野兽&f的巢穴! + - 既然你能平安无恙地到达我们的&d营地&f, + - 那么你一定身手不凡。 + - 加入猎杀如何? + questAcceptDialog: + - '&a[斯克雷波尼亚·英格维纳斯]&f 我就知道你会答应的!我看到你已经全副武装了。' + - 好了,这就是我要你做的事。 + - + - + - 其次你需要杀死5只&c长角牛&f和6只&c短角牛&f。 + - 明白了吗?很好,完事后再来找我。 + - '&7&o我应该杀死&c&o大个头&7&o、5只&c&o长角牛&7&o和6只&c&o短角牛&7&o。' + questCompleteMessage: + - '&a[斯克雷波尼亚·英格维纳斯]&f 你给我留下了深刻的印象。' + - 很明显,你不仅仅是“有能力”。 + - 感谢你的帮助,我们将处理剩下的。 + - 再见,伟大的猎人。 +primis_pontis_mille_fields_feeding_the_hungry: + customObjectives: + Objective3: + dialog: + - '&7你给出了面包和面粉。' + - '&a[露菲亚·特图鲁斯]&f 我不知道该说什么好。我的孩子会很开心的!' + - '&7女人向你深深地鞠躬。' + Objective4: + dialog: + - '&a[法比亚·普雷塔斯]&f 梦想有时会成真。我非常感谢你。' + Objective1: + dialog: + - '&a[列那·卢坎]&f 新鲜的面包!真是谢谢啊!' + Objective2: + dialog: + - '&a[特拉尼奥·弗洛伦斯]&f 哇哦!我的日子好起来了!' + - 非常谢谢你。 + name: '&2为饥饿的人提供食物' + questLore: + - 我能感觉到你的心脏怦怦跳动。 + - 不是每个人都像你和我一样幸运。 + - 有一些可怜的家伙住在&d千桥贫民窟&f。 + - 一段时间以来,我一直在加班 + - 生产更多的面包和面粉。 + - 你能拿上这几袋小麦和这堆面包, + - 把它们带到&d贫民窟&f并交给有需要的人? + - 我这样做了一段时间了,但是我的左脚受伤了, + - 所以我现在不能走远路。 + questAcceptDialog: + - '&a[迪莫尼斯·玛丽提拉斯]&f 我希望世界上有更多像你这样的人。' + - '&d贫民窟&f在正北面,你可以看到远处的建筑。' + - '&7&o我应该前往&d贫民窟&7&o并给有需要的人提供食物。' + questCompleteMessage: + - '&a[奥古斯缇娜·维鲁克斯]&f &2迪莫尼斯&f让你来的对吧。' + - + - + - 谢谢你陌生人,我的家人不会忘记你的。 +primis_pontis_mille_fields_fruity_hound: + name: '&2食果猎犬' + questLore: + - 由于你是我的头号浆果防窃特工, + - 所以我还有项任务要给你。 + - 正如你所看到的,我们在这小小的&d浆果农场&f里 + - 种植了一些非常大的浆果 + - 这些&c浆果 + - '是我用来参赛的' + - 当我走入&d浆果农场&f时 + - '我看到了&c食果岩石猎犬&f带着' + - 我的浆果跳到灌木丛里。 + - 它嘴里夹着浆果的根茎 + - 所以我希望浆果应该还是完整的。 + - 如果你杀死野兽并带回 + - 我亲爱的&e精品浆果&f + - 丰富的奖励等着你。 + questAcceptDialog: + - '&a[多达卢斯·纳斯卡]&f 我看到&c猎犬&f钻进了农场西北边的&d红木森林&f。' + - '&7&o我应该去杀死&c&o食果猎犬&7&o并查看&e&o精品浆果&7&o是否完整。' + questCompleteMessage: + - '&a[多达卢斯·纳斯卡]&f 是的!这是我的宝贝!很好,很完整,上面甚至没有任何唾液!' + - + - + - + - +primis_pontis_mille_fields_not_on_my_farm: + name: '&2别进我农场里!' + questLore: + - 最近这些&c老鼠&f快把我逼疯了。 + - 他们不断进入我们的小农场,吃掉我们所有的作物! + - 你能稍微减一点它们的数量吗? + - 小心,它们数量众多。 + - 噢,我差点忘了告诉你。 + - 如果你看到了一只&c饱食的大老鼠&f,可别去惹它。 + - 它太肥大了,你要花好几天才能把它干掉。 + questAcceptDialog: + - '&a[米洛尼亚·马朱斯]&f 我相信你已经注意到,他们喜欢在路径区域蠕动。。' + - '&7&o我应该杀死通往&d千桥&7&o路上的&c老鼠&7&o。' + questCompleteMessage: + - '&a[米洛尼亚·马朱斯]&f 非常感谢!我们可以回去制作美食了。' +primis_pontis_mille_fields_surprise_me_with_flour: + customObjectives: + Objective3: + dialog: + - '&a[阿杜尔森·卢皮斯]&f 我听说农场里有&c老鼠&f。三袋面粉就快好了,没问题!' + Objective1: + dialog: + - '&a[迪尼亚·尼拉米乌斯]&f 面粉?没问题,一袋面粉就快好了!' + Objective2: + dialog: + - '&a[迪莫尼斯·玛丽提拉斯]&f 农场需要更多面粉?这两袋拿去吧!' + name: '&2面粉惊喜' + questLore: + - 哇,你的手艺真不错。但我还有一项任务。 + - '&c老鼠&f彻底毁坏了我们储存的面粉。' + - 所以我们需要全新的面粉。 + - '&d风车磨坊&f应该有很多面粉。' + - 去帮我收集一些面粉吧。 + - 我会让你不虚此行的。 + questAcceptDialog: + - '&a[米洛尼亚·马朱斯]&f 你需要收集所有三个&d风车磨坊&f的面粉。' + - '&7&o我要去三个&d风车磨坊&7&o收集他们生产的面粉。' + questCompleteMessage: + - '&a[米洛尼亚·马朱斯]&f 这够我们用一阵子了!' + - 希望我们的面粉账单不会太贵,哈哈。 +primis_pontis_mille_fields_wellness: + name: '&2健康' + questLore: + - 很高兴见到你! + - 该死的&c梦魇鼠&f在我爬下水井时埋伏了我。 + - 我摔伤了胳膊和腿。 + - 啊,我左眼里还残留有它吐出的毒液。 + - 还好我在它杀死我之前 + - 爬了出来。 + - 真尴尬,不知道现在哪个更疼,是我的身体还是我的自尊。 + - 我有一些 + - '&e急救设备&f' + - 在&d猎人营地&f的箱子里。 + - 你能帮我拿过来吗? + - 哦,别告诉其他人这件事。 + - '……差点死在井里……这是我生命中需要抹去的一章……' + questAcceptDialog: + - '&a[沃鲁尼亚·佐伊鲁斯]&f &d猎人营地&f在正南方,别走错了。找找他们的帐篷。' + - '&7&o我需要为&a&o沃鲁尼亚&7&o收集位于&d&o猎人营地&7&o的&e&o急救设备&7&o。' + questCompleteMessage: + - '&a[沃鲁尼亚·佐伊鲁斯]&f 回来了?把设备给我吧。' + - 别担心我,我马上就给自己包扎伤口。 + - 谢谢你!你拯救了我! +primis_pontis_mille_field_check: + customObjectives: + Objective1: + dialog: + - '&a[奥古斯缇娜·维鲁克斯]&f 哦,这非常重要!我会告知居民的。' + - 感谢你带来这些重要文件。 + name: '&2检查田野' + questLore: + - 能麻烦你帮个忙吗? + - 我有一些需要送到&d贫民窟&f和&d田野农场&f + - '的重要文件。' + - 应该来取件的士兵还没到。 + - 这十分紧急,我们不能再等了。 + - 不幸的是,我有严格的命令不能离开岗位 + - 如果你能帮我做这件事,对我们会有很大帮助。 + questAcceptDialog: + - '&a[戈德夫里达斯·诺维申]&f 你能够帮忙?太好了!' + - 你可以揍&9黄色路径&f到贫民窟。 + - '&d田野农场&f在贫民窟右侧,跟着路走就对了。' + - 哦!小心田野里的老鼠! + - '&7&o我应该前往&d&o贫民窟&7&o和&d&o田野农场&7&o。' + questCompleteMessage: + - '&a[米洛尼亚·马朱斯]&f 文件?让我看看。嗯,看起来很正式。' + - 谢谢你大老远跑来送文件。 + - '&7&o似乎&a&o米洛尼亚&7&o可以帮助我对付老鼠……' +primis_pontis_mille_fresh_rats_coming_up: + customObjectives: + Objective1: + dialog: + - '&a[精英守卫]&f 里面有很多老鼠。' + name: '&2新鲜的老鼠' + questLore: + - 没有猫粮,但我想我能帮你 + - 找到更好的…… + - 我停手一些 + - '&a守卫s&f在处理' + - 城市低地的鼠患。 + - 下去你也许能找到一些 + - '&c老鼠&f喂给你的猫朋友。' + questAcceptDialog: + - '&7&o我应该去城市低地寻找&a&o精英守卫s&7&o。' + questCompleteMessage: + - '&a[喵喵]&f 喵。喵呜!' + - '&7&o我应该让猫安静地享用它的食物。' + - '&7&o好像掉了什么东西……' +primis_pontis_mille_hungry_friend: + customObjectives: + Objective3: + dialog: + - '&a[梅莱尼斯·格拉修斯]&f 猫粮?你是怎么在这里找到猫的?' + - 我不知道哪里能获取猫粮。 + Objective4: + dialog: + - '&a[苏尔皮西奥·潘瑟拉]&f 真希望我能帮上忙,抱歉。' + Objective1: + dialog: + - '&a[皇家守卫]&f 我看起来像是能找猫粮的人吗?' + Objective2: + dialog: + - '&a[廷达鲁斯·福斯蒂纽斯]&f 抱歉,我不知道。' + Objective5: + dialog: + - '&a[廷达鲁斯·哥伦巴努斯]&f 附近曾经有猫粮,但现在鬼才知道猫粮在哪……' + name: '&2饥饿的朋友' + questLore: + - '&7&o小家伙,怎么了。' + - '&a[喵喵]&f 喵!' + - '&7&o 你饿了吗?' + - '&7&o小家伙想要吃的吗?' + - '&a[喵喵]&f 喵!!!' + - '&7&o让我们看看' + - '&7&o能不能给你弄到食物。' + questAcceptDialog: + - '&7&o我应该去看看城里有没有人知道哪里有猫粮。' + questCompleteMessage: + - '&a[莫德斯特·阿佩尔]&f 猫粮,我不知道。但是……' + - '&7&o似乎&a&o莫德斯特&7&o知道什么……' +primis_pontis_mille_late_delivery: + name: '&2延迟送货' + questLore: + - 我订购了一些&d格拉迪厄斯&f的&e渔网&f, + - '但到现在都还没送到。' + - 是不是送货出了什么问题。 + - 如果你愿意的话, + - 我愿意付钱给你 + - 调查货物状况 + - '把&e渔网&f带给我。' + questAcceptDialog: + - '&a[德尔菲姆·卡尔普尼乌斯]&f 我的&e渔网&f应该在&d格拉迪厄斯&f。' + - '&7&o我需要前往&d&o格拉迪厄斯&7&o找到&a&o德尔菲姆&7&o订购的&e&o渔网&7&o。' + questCompleteMessage: + - '&a[德尔菲姆·卡尔普尼乌斯]&f 我的&e渔网&f!非常感谢!' + - '&a[德尔菲姆·卡尔普尼乌斯]&f 我花了一大笔订购!要是没你我,我都不知道该怎么办。' +primis_pontis_mille_let_them_know: + customObjectives: + Objective3: + dialog: + - 福特斯派你来的?我明白了。 + - 帮助我,我的援兵即刻就到。 + Objective1: + dialog: + - 福特斯决定采取行动了。 + - 帮我完成任务,我的援兵准备就绪。 + Objective2: + dialog: + - 福特斯决定行动了。 + - 如果你能帮我完成任务,我的援兵即刻就绪。 + name: '&2Let them know!' + questLore: + - 抱歉我无法立刻支援格拉迪厄斯。 + - 自从新谋士来了,我们的统治者就变了样。 + - 如果你能去找城市里的将军们 + - 让他们知道格拉迪厄斯需要帮助,也许我们就能做点什么。 + - 但我们必须先解决现存的问题。 + - + - + - 找他们然后告诉我他们收到了消息。 + - 我会给你奖励。 + questAcceptDialog: + - '&8[福特斯]&f沿着主房间的橙色路径找到将军布罗米亚。' + - '&8[福特斯]&f黄色路径能找到将军罗杰里乌斯。' + - '&8[福特斯]&f最短的紫色路径能找到将军西林卓斯。' + - '&8&o我需要和三位将军对话。' + questCompleteMessage: + - '&8[福特斯]&f你联系到他们了?很好!' + - '&8[福特斯]&f这是你的奖励。别一次用完了。' +primis_pontis_mille_lighthouse_1: + customObjectives: + Objective1: + dialog: + - '&8[禾吉奥·雷姆斯]&f 又一封信?谢谢你把它带给我。' + name: '&2快速交付' + questLore: + - 在你离开前,你能帮我把这封信寄出去吗? + - 你可以在灯塔顶部找到那位绅士。 + - 别担心,灯塔就在那扇门后。 + questAcceptDialog: + - '&8[福特斯]&f 谢谢你。' + - '&8&o我应该和千桥灯塔看守人对话。' + questCompleteMessage: + - '&8[禾吉奥·雷姆斯]&f 嘿,你有空吗?' + - '&8&o似乎禾吉奥·雷姆斯有话要说。' +primis_pontis_mille_lighthouse_2: + customObjectives: + Objective1: + dialog: + - '&a[吉夫斯]&f Oh, we meet again. It''s good to see you.' + - "你有东西要给我?哦,哇……这是购物清单。\n" + - 我会尽快把物品带给&a禾吉奥&f。 + - 谢谢你过来。希望我们能再见面。 + - "&7&o我应该告诉&a禾吉奥&7&o我完成了任务。\n" + name: '&2询问吉夫斯' + questLore: + - 你能拿着传送门给我的好朋友&a吉夫斯&f送张便条吗? + questAcceptDialog: + - '&a[禾吉奥]&f 非常感谢,我的朋友。' + - '&7&o我应该和&d蔚兰村庄&7&o的&a吉夫斯&f对话。' + questCompleteMessage: + - '&a[禾吉奥]&f 你送到了?很好!' + - 来,你可以吃点我放在口袋里的&e兔肉煲&f。 +primis_pontis_mille_mines_goblined_up_in_the_maze: + customObjectives: + Objective3: + dialog: + - '&a[受伤的守卫]&f 很高兴见到你!' + Objective1: + dialog: + - '&a[受伤的守卫]&f 感谢上天!' + Objective2: + dialog: + - '&a[受伤的守卫]&f 援兵终于来了!' + name: '&2迷宫里的哥布林' + questLore: + - 能麻烦你一下吗。 + - 既然你要下&d矿井&f, + - 能顺便帮我们解决一些问题吗? + - 我们派了三个&a守卫s&f + - 到到矿井里猎捕&c诅咒哥布林&f。 + - 我担心他们出了什么事。 + - 这个&c诅咒哥布林&f应该 + - 躲在&d矿井&f&9迷宫&f某处。 + - 你能找到&a失踪的守卫s&f并 + - 带回&c哥布林s&f的死亡证据吗? + questAcceptDialog: + - '&a[百夫长]&f别在&9迷宫&f里迷路了。' + - 愿好运与你同在! + - '&7&o我应该穿过&d&o矿井&7&o并找到&9&o迷宫&7&o。' + questCompleteMessage: + - '&a[百夫长]&f 他们还活着,太好了,我们会派一些士兵尽快把他们救出来。' + - 我看到你带来了&c哥布林s&f死亡的证明,很好。 + - '&7&o希望未来人们能远离&9迷宫&7&o。' +primis_pontis_mille_serious_sewage: + customObjectives: + Objective3: + dialog: + - '&a[米开朗基罗]&f 告诉那老头,一切井然有序!' + Objective4: + dialog: + - '&a[拉斐尔]&f 告诉罗杰里乌斯我活得很好!' + Objective1: + dialog: + - '&a[多纳泰罗]&f 你可以和将军说我很好!' + Objective2: + dialog: + - '&a[李奥纳多]&f 让将军别担心我,我很好!' + name: '&2排污严重' + questLore: + - 如果你能胜任这项工作,我需要你的帮助。 + - + - + - + - + - 他们有领袖,我认为他应该叫做&c施莱德&f什么的。 + - 除掉他,无首群龙无首则乱。 + - 如果你能去那里减少生物和麻烦制造者的数量 + - 我就可以把我的部队分配到更重要的任务上去…… + - 我们派了一些&a4特工&f下去,但还没有他们的消息。 + - + - + - 我好像还拿错了我私人的&e下水道钥匙&f。 + - 如果你能找回来就再好不过了。 + questAcceptDialog: + - '&a[罗杰里乌斯]&f你可以游下喷泉进入&d下水道&f,然后往东南方向走。' + - + - + - '&7&o我需要找到&d下水道&7&o并完成任务。' + questCompleteMessage: + - '&a[罗杰里乌斯]&f 你完成了我要求的所有任务?要是再有10个这样的你就好了……' +primis_pontis_mille_star_gazing: + customObjectives: + Objective1: + dialog: + - '&a[维尔戈·德西普斯]&f 有什么事吗?' + name: '&2观星' + questLore: + - 你为这座城市和它的人民做了那么多。 + - 协助三位&a将军s&f和&d千桥&f附近的居民。 + - 解放了我们大量的兵力和资源。 + - 我们可以派军队去支援&d格拉迪厄斯&f了。 + - 但在我们采取行动之前,我想让你做最后一件事。 + - 你应该和&a观星者&f谈谈。 + - 这与我们丢失的历史和&c元素s&f有关。 + - '&a观星者&f会告诉你更多信息。 - 拿着这封便条给他们看看。 questAcceptDialog: - ''&7[福特斯·贝拉特]&f 你可以在&d天文台&f找到&a观星者&f。' + - '&d天文台&f位于&d灯塔&f后。这是一座很大的塔,你很难错过。' + questAcceptDialog: + - '&7[福特斯·贝拉特]&f 你可以在&d天文台&f找到&a观星者&f。' + - + - + - '&7&o我应该和&d天文台&7&o的&a观星者&7&o谈谈。' + questCompleteMessage: + - '&a[维尔戈·德西普斯]&f &a少校&f派你来的? 那么肯定是很重要的事情。' + - '&7&o我应该和&a维尔戈&7&o对话。' +primis_pontis_mille_stay_a_while_and_listen: + name: '&2驻足倾听' + questLore: + - 把边条给我。让我看看…… + - 允许我们与你 + - 分享有关我们过去的重要信息。 + - 你一定做了什么重要的事, + - 这些信息通常只与高层分享。 + - '&a斯黛拉&f会和你分享我们的发现。' + questAcceptDialog: + - '&a[维尔戈·德西普斯]&f 和&a斯黛拉&f谈谈并&9点击剑&f开始倾听。' + - '&7&o我应该和&a斯黛拉&7&o对话并开始&9竞技场挑战&7&o。' + questCompleteMessage: + - '&a[维尔戈·德西普斯]&f 不要告诉其他人。' + - '&7&o那是一个相当不错的故事。' +primis_pontis_mille_the_groves_call: + customObjectives: + Objective1: + dialog: + - '&a[国王尼米安]&f &2布罗米亚将军&a派你来的?' + - 很好,我就知道他靠得住。 + name: '&2树林召唤!' + questLore: + - 保护&d树林s&f是我们的使命。 + - '&d树林s&f的&a国王尼米安&f发出了支援请求。' + - 可恶的小动物来到了&d树林s&f而 + - 其他入侵者正在占领树木。 + - 如果你能过去解决这些问题 + - 我的军队就可以自由前往援助&d格拉迪厄斯&f了 + questAcceptDialog: + - '&a[布罗米亚]&f &d树林s&f在城市北面。' + - 在矿井下面有一条穿过山的小路。 + - '&7&o我应该和&a国王尼米安&7&o谈谈。' + questCompleteMessage: + - '&a[国王尼米安]&f 你来的正是时候!' +primis_pontis_mille_to_lycan_or_not_to_lycan: + name: '&2变人还是变狼' + questLore: + - 不知道一个人如何能完成 + - 整个营都无法完成的任务。 + - 但如果是&a将军&f派你来的,那我没什么可抱怨的了。 + - 我们定位到了它们的&d巢穴&f,但它们仍然负隅顽抗。 + - 根本没办法进去。 + - 但如果你能杀入并扫清&d巢穴&f + - '&d红木&f就能重归安宁。至少更加安全……' + - 它们的&d巢穴&f位于&9腐化红木树下&f。 + - 应该很容易发现,它在一群健康的树中很显眼。 + questAcceptDialog: + - '&a[西林卓斯]&f 小心……' + - '&7&o我需要扫清&d狼人巢穴&7&o。' + questCompleteMessage: + - '&a[马格努斯]&f 你做到了!!!' + - 请随意在我们的营地休息,我们随时欢迎你来这里。 +primis_pontis_mille_where_is_he_now: + customObjectives: + Objective1: + dialog: + - '&a[戈雷诺斯·帕利斯]&f 我兄弟让你来找我的?' + - 哦,我又搞砸了……这次是真的迷路了。 + - 希望他不是很生气。 + - 回去后告诉他我很安全。 + name: '&2饥饿的朋友' + questLore: + - 我和我的&a兄弟&f在 + - 回村庄的路上。 + - 我不得不绕道而行,所以我们走散了。 + - 我们应该在这里会面的 + - 但已经有一段时间没有他的踪迹了。 + - 他很容易迷路……也许他真的迷路了。 + - 我现在很担心他。 + - 我愿出高价 + - 给能找到它的人 + questAcceptDialog: + - '&a[罗德努斯·帕利斯]&f 非常感谢你提供帮助。' + - 如果你找到他,请马上告诉我他在哪里。 + - '&7&o我需要找到&a&o罗德努斯的&7&o兄弟。' + questCompleteMessage: + - '&a[罗德努斯·帕利斯]&f 什么!他怎么会走到那里!' + - 唉,我现在得去找他了…… + - 谢谢你的帮助,这是应有的奖励。 +primis_pontis_redwoods_big_brown_logs: + customObjectives: + Objective1: + dialog: + - '&a[马格努斯]&f 你是谁?哦,你来自&d千桥&f。' + name: '&2棕色大原木' + questLore: + - 如果你能提供帮助,我愿协助&d格拉迪厄斯 + - 请帮我们解决&d红木&f的&c狼人&f危机。 + - 我军一直在抵抗&c狼人&f的攻击。 + - 如果你能协助我们就太好了。 + - 前往&d红木&f并和&a马格努斯·卡斯托拉&f谈谈。 + - 他们会让你知道结束这场危机需要做些什么。 + questAcceptDialog: + - '&a[西林卓斯]&f &d红木&f就在北方。' + - 往北走到&d火车站&f,然后往西。 + - '&7&o我应该前往&d红木&7&o并和&a马格努斯&7&o对话。' + questCompleteMessage: + - '&a[马格努斯]&f 将军派你来帮忙的?' + - 嗯……希望你可靠。 +primis_pontis_redwoods_its_reyn_time: + name: '&2雷努斯的请求' + questLore: + - 在我砍树时,我的&e怀表&f掉到了溪流里。 + - 这是一块特别的表。充满空气,非常结实。 + - 沉重的原木也砸不烂它。 + - 我看到有个&c强盗&f捡走了。 + - 他们应该&9拿着斧头&f。 + - + - + - 当你回来后,我也会给你很好的奖励! + questAcceptDialog: + - '&8[雷努斯]&f 你可以在河流右侧找到&c强盗&f。' + - '&7&o我需要杀死&c强盗&7&o并找回&e怀表&7&o。' + questCompleteMessage: + - '&a[雷努斯]&f我保证不会再弄丢它!' + - 这是你的奖励! +primis_pontis_redwoods_nasty_little_bandits: + name: '&2讨厌的小强盗!' + questLore: + - 自从这些该死的&c强盗&f定居在河流对岸,我们就失去了安宁。 + - 他们一直在毁坏树木,昨天我发现其中一人 + - 想要点燃一棵大树! + - 不久之前,我被一个拿着斧头的疯子追赶, + - 我确认他就是&c强盗&f。 + - 更不用说他们一直试图抢劫 + - 任何与我们&d锯木厂&f有生意往来的人。 + - 我愿意花大价钱结束他们的疯狂。 + questAcceptDialog: + - '&a[利格纳·克里斯皮安]&f 你能在河对岸找到他们。' + - '&8&o我应该前往扫清&d强盗营地&f。' + questCompleteMessage: + - '&a[利格纳·克里斯皮安]&f 和平终于到来了!谢谢你!' +primis_pontis_redwoods_need_a_smoke: + name: '&2来根烟' + questLore: + - 我听说你帮助了&a雷努斯&f。 + - 你也看到了,我的腿又被锯伤了。 + - 哦,别担心我。我的腿很快就会好的。 + - 问题在于在痊愈前我无事可做。 + - 这让我有心情去享受一些海鹦。 + - 我带了一些&e优质烟草&f, + - 但我得藏起来,以防被&c强盗&f抢走。 + - 问题是我完全忘了我藏在了哪里! + - 我只记得是在&9一棵树附近&f。 + - 是哪一棵树呢?鬼才知道! + - 听着,我给你一个很好的交易。找到我的烟草,你就可以拥有 + - 我所有的&e金苹果&f。 + questAcceptDialog: + - '&a[莱科]&f 希望你能尽快找到。' + - '&7&o我应该寻找&e烟草&7&o。' + questCompleteMessage: + - '&a[莱科]&f 你找到了!哈哈!我就知道你靠得住!' +primis_terravilla_bipedal_examination: + name: '&2双足威胁' + questLore: + - 我在研究&d泰拉维拉&f附近的&c双足恐怖生物s&f。 + - 几年前它们的种群数量比现在多得多。 + - 其实这就是首批定居者决定 + - 在废墟上建造 + - '&d泰拉维拉&f的原因。' + - 出于一些原因,它们的数量减少了。 + - 我打算收集一些&e样本&f, + - 但我没能力杀死它们。你看起来像是能 + - 处理这些&c双足恐怖生物&f的人。 + - 能帮帮我吗? + questAcceptDialog: + - '&a[普拉蒂亚·苏里乌斯]&f 6份&e样本&f应该够了。收集完&e样本&f后再来找我。' + - '&7&o我需要杀死3只&c&o双足恐怖生物s&7&o并收集其&e&o样本&7&o。' + questCompleteMessage: + - '&a[普拉蒂亚·苏里乌斯]&f 很好!让我研究一下。' + - '&7&o我得瞧瞧&a&o普拉蒂亚·苏里乌斯&7&o有什么发现。' +primis_terravilla_drowning_terror: + name: '&2恐怖溺尸' + questLore: + - 我的理论是正确的。我解剖了成熟体并发现了里面有个生物。 + - 经过仔细的检查后, + - 我发现里面是水生生物。 + - 不仅如此,它们还能操控宿主的大脑。 + - 准备好产卵后,它们会让宿主前往 + - 附近的水源溺死宿主。 + - 它们就能自由产卵和游走了。 + - 感染&c双足恐怖生物&f的生物肯定生活在附近的溪流 + - 你应该前往收集 + - '导致感染的&e完美样本&f。' + - 我不知道这会不会感染人类 + - 但以防万一,你应该 + - 杀死它们。 + questAcceptDialog: + - '&a[普拉蒂亚·苏里乌斯]&f 收集&e完美样本&f后回来找我。' + - '&7&o我需要前往附近的河流收集&e&o完美样本&7&o。' + questCompleteMessage: + - '&a[普拉蒂亚·苏里乌斯]&f 它看起来像条鱼,但其器官可不一样。' + - 它肯定是通过释放这些像肉粒一样的小虫子来感染其他生物的…… + - 让我看看你。嗯,你没有感染的迹象…… + - + - + - + - + - + - '&7&o我应该远离河流……' +primis_terravilla_hog_on_my_porch: + name: '&2野猪当道' + questLore: + - 它又坐在那该死的升降机上了! + - 难以置信!那边那个,就是你! + - 你看起来能处理大型野兽。 + - 如果你能除掉升降机上的&c大型野猪&f + - 我会给予你丰厚的报酬 + - 我们得用升降机 + - 搬运货物。 + questAcceptDialog: + - '&a[多里帕·萨里玛库斯]&f 除掉那里的野猪了吗?' + - '&7&o我需要杀死&c&o尖背野猪王&7&o。' + questCompleteMessage: + - '&a[多里帕·萨里玛库斯]&f 我终于能正常工作了!谢谢!' +primis_terravilla_razorbag: + name: '&2猎杀野猪' + questLore: + - 如果你要找工作,我这儿有。 + - 我设计和制作重型包装袋, + - 在我的小店里出售。所以我需要皮革。 + - 还好附近有很多 + - '&c尖背野猪&f。如果你感兴趣的话,' + - 我希望你能猎杀一些野猪获得皮革。 + - 我需要很多皮革。 + - 所以这份工作可不轻松。 + questAcceptDialog: + - '&a[泰利斯特·塞纳]&f 他们就在附近。' + - '&7&o我得猎杀&c&o成熟尖背野猪&7&o。' + questCompleteMessage: + - '&a[泰利斯特·塞纳]&f 够了。这些皮革完好无损!这是你的奖励。' +primis_terravilla_terrifying: + name: '&2恐怖寄生虫' + questLore: + - 这很令人担忧。你带来的样本显示, + - 它们的营养正在慢慢流失。 + - 我认为它们里面长了寄生虫。 + - 你应该再去那里 + - 看看能否在它们身体里找到任何大型 + - '&e成熟体&f' + - 并将成熟体待会给我。 + questAcceptDialog: + - '&a[普拉蒂亚·苏里乌斯]&f 我需要两个&e成熟体&f。' + - '&7&o我需要杀死&c&o双足恐怖生物s&7&o并收集两个&e&o成熟体&7&o。' + questCompleteMessage: + - '&a[普拉蒂亚·苏里乌斯]&f 很好。' + - '&7&o我应该听听&a&o普拉蒂亚·苏里乌斯&7&o有何发现。' +test_quest: + name: 击杀测试Boss + questLore: + - '&c结束测试boss的恐怖统治!' +xmas_quest_0: + name: '&2找到丢失的礼物' + questLore: + - + - + - 作为回报,我能给你一件圣诞礼物! + questAcceptDialog: + - '&8[&c圣尼克&8]&f 谢谢你!我会在这里等你!' + questCompleteMessage: + - '&8[&c圣尼克&8]&f 感谢你的帮助!还有一些礼物没找到,如果你还想帮助我,再次和我对话吧!' diff --git a/src/main/resources/translations/chinese_traditional.yml b/src/main/resources/translations/chinese_traditional.yml new file mode 100644 index 000000000..087bb3146 --- /dev/null +++ b/src/main/resources/translations/chinese_traditional.yml @@ -0,0 +1,13237 @@ +config: + noArenaPermissionMessage: '[EliteMobs] 你沒有進入這個競技場的權限!' +ItemSettings: + itemLoreStructureV2: + - '&7&m&l---------&7<&l裝備資訊&7>&m&l---------' + - '&7裝備等級 §f$itemLevel §7聲望階級 §6$prestigeLevel' + - '$weaponOrArmorStats' + - '$soulbindInfo' + - '$itemSource' + - '$ifLore&7&m&l-----------&7<&f&l描述&7>&m&l-----------' + - '$customLore' + - '$ifEnchantments&7&m&l--------&7<&9&l附魔&7>&m&l--------' + - '$enchantments' + - '$eliteEnchantments' + - '$ifCustomEnchantments&7&m&l------§7<&3&l特殊附魔&7>&m&l------' + - '$customEnchantments' + - '$ifPotionEffects&7&m&l----------&7<&5&l效果&7>&m&l----------' + - '$potionEffect' + - '&7&l&m-----------------------------' + - '$loreResaleValue' + shopSourceItemLores: '&7從商店、任務獲取' + mobSourceItemLores: '&7從 $mob 掉落' + loreWorths: '&7價格 $worth $currencyName' + loreResaleValues: '&7售出價格 $resale $currencyName' + eliteEnchantmentLoreStrings: 精英的 + noSoulbindLore: '&7無綁定!' + preventEliteItemDisenchantmentMessage: '&c[EliteMobs] 無法分解精英物品!' + scrapSucceededMessageV2: '&8[EliteMobs] &2回收成功 $amount 次!' + scrapFailedMessageV2: '&8[EliteMobs] &c回收失敗 $amount 次!' + lowDurabilityItemDropMessage: '&8[EliteMobs] &c盔甲因耐久度不足,無法使用!&8請前往精英大廳找NPC,使用廢料修復!' + lowWeaponItemDropMessage: '&8[EliteMobs] &c武器因耐久度不足,無法使用!&8請前往精英大廳找NPC,使用廢料修復!' + simlootMessageSuccess: '&8[EliteMobs] &2戰利品抽獎,獲得 $itemName &2!' + simlootMessageFailure: '&8[EliteMobs] &c戰利品抽獎,一無所獲!' + directDropCustomLootMessage: '&8[EliteMobs] &2獲得 $itemName &2!' + directDropMinecraftLootMessage: '&8[EliteMobs] &a獲得 $itemName &a!' + directDropCoinMessage: '&8[EliteMobs] &a獲得 &2$amount $currencyName &a!' + directDropSpecialMessage: '&8[EliteMobs] &a獲得 &2$amount $name &a!' + weaponEntry: '&7每秒精英傷害 &2$EDPS' + armorEntry: '&7精英護甲 &2$EDEF' +ProceduralItemGenerationSettings: + materialNames: + swordName: 劍 + bowName: 弓 + pickaxe: 鎬 + spade: 鏟 + hoe: 鋤 + axe: 斧 + helmet: 頭盔 + chestplate: 胸甲 + leggings: 護腿 + boots: 靴子 + shears: 剪刀 + fishingRod: 釣竿 + shield: 盾牌 + trident: 三叉戟 + crossbow: 弩 + nameFormats: + - '$adjective $noun 的 $verb $itemType' + - '$adjective $noun 的 $itemType ' + - '$noun 的 $adjective $verb $itemType' + - '$verb $itemType' + - '$adjective $verb $itemType' + - '$verb' + - '$adjective $verb' + nouns: + - MagmaGuy + - 黎明 + - 日落 + - 天堂 + - 地獄 + - 天使 + - 大天使 + - 智天使 + - 熾天使 + - 惡魔 + - 魔鬼 + - 蝙蝠 + - 雞 + - 牛 + - 哞菇 + - 豬 + - 兔子 + - 绵羊 + - 魷魚 + - 村民 + - 洞穴蜘蛛 + - 終界使者 + - 北極熊 + - 蜘蛛 + - 殭屍豬人 + - 烈焰使者 + - 苦力怕 + - 遠古深海守衛 + - 終界蟎 + - 喚魔者 + - 地獄幽靈 + - 深海守衛 + - 屍殼 + - 岩漿立方怪 + - 界伏蚌 + - 蠹魚 + - 骷髏 + - 史萊姆 + - 流髑 + - 惱鬼 + - 衛道士 + - 女巫 + - 凋零骷髏 + - 殭屍 + - 驢子 + - 馬 + - 駱馬 + - 騾子 + - 山貓 + - 狼 + - 鐵魔像 + - 雪人 + - 終界龍 + - 凋零怪 + - 幻術師 + - 鸚鵡 + - 特大的 + - 殺手兔 + - 史提夫 + - 狼毒 + - 混沌 + - 萬古 + - 龍 + - 斯芬克斯 + - 米諾陶洛斯 + - 黑帝斯 + - 誓言 + - 破誓者 + - 背棄者 + - 背叛者 + - 翠玉 + - 光明的 + - 黑暗 + - 忘卻 + - 陰影 + - 虛空 + - 異種 + - 狂熱者 + - 天頂 + - 暮色 + - 黃昏 + - 怪物 + - 精英怪物 + - 烏里斯特 + - 矮人 + - 精靈 + - 歐克蠻人 + - 哥布林 + - 地精 + - 歌利亞 + - 卓爾 + - 人類 + - 半身人 + - 半獸人 + - 監視者 + - 心靈劫掠者 + - 鴞熊 + - 鯊蜥獸 + - 鏽蝕怪 + - 山丘巨人 + - 山嶺巨人 + - 冰霜巨人 + - 火燄巨人 + - 雲霧巨人 + - 風暴巨人 + - 狗頭人 + - 巫妖 + - 歐克蠻人 + - 土巨怪 + - 鬥士 + - 巫師 + - 聖武士 + - 教士 + - 遊俠 + - 弓手 + - 法師 + - 魔人 + - 狼人 + - 吸血鬼 + - 半人馬 + - 細腰貓 + - 半巨人 + - 食人巨魔 + - 食人妖 + - 羅格 + - 野蠻人 + - 詩人 + - 德魯伊 + - 武僧 + - 魔術士 + - 術士 + - 惡魔獵人 + - 死亡騎士 + - 祭司 + - 薩滿 + - 戰士 + - 巴西利斯克 + - 奇美拉 + - 小鬼 + - 林精 + - 石像鬼 + - 鎮尼 + - 火巨靈 + - 幽靈 + - 哈柏哥布林 + - 九頭蛇 + - 克拉肯 + - 拉米亞 + - 美杜莎 + - 擬態怪 + - 木乃伊 + - 飛馬 + - 大鵬 + - 薩特 + - 泰拉斯奎 + - 憎惡 + - 食屍鬼 + - 樹精 + - 獨角獸 + - 死靈 + - 侍僧 + - 角鬥士 + - 騎士 + - 獅鷲獸 + - 掠奪者 + - 斥候 + - 間諜 + - 三諧波 + - 高貴 + - 守衛 + - 老手 + - 雙足翼龍 + - 深淵 + - 煉獄 + - 元素 + - 牛頭人 + - 熊貓人 + - 薩斯夸奇 + - 被遺忘者 + - 雪怪 + - 報喪女妖 + - 蛛形綱 + - 不死生物 + - 夜精靈 + - 血精靈 + - 德萊尼 + - 沃根 + - 督軍 + - 女巫 + - 賢士 + - 賢者 + - 竊賊 + - 刺客 + - 聖殿騎士 + - 馴獸師 + - 狂戰士 + - 發明者 + - 摔角手 + - 海盜 + - 領航者 + - 虛空之刃 + - 黃蜂 + - 農民 + - 步兵 + - 劍士 + - 薩爾 + - 地獄獵犬 + - 女獵手 + - 獵人 + - 阿拉科克拉 + - 底棲魔魚 + - 提婆 + - 異界神侍 + - 太陽 + - 掘地蟲 + - 阿澤爾 + - 貝希爾 + - 亡眼暴君 + - 枯萎病 + - 令人討厭 + - 熊抱 + - 狂蛙人 + - 混魔胎兒 + - 甲伏怪 + - 巫妖王 + - 蛇雞獸 + - 羽蛇獸 + - 獨眼巨人 + - 泰坦 + - 暗幕魔 + - 古一大師 + - 半巫妖 + - 巴洛魔 + - 巴古拉魔 + - 深淵魔 + - 業怯魔 + - 迷誘魔 + - 角魔 + - 狂戰魔 + - 陰魂 + - 六臂蛇魔 + - 判魂魔 + - 夸塞魔 + - 弗洛魔 + - 蠟融妖 + - 深獄煉魔 + - 劣魔狐猴 + - 龍巫妖 + - 生靈體 + - 斑斕龍 + - 蛛化精 + - 風元素 + - 地元素 + - 火元素 + - 水元素 + - 洛汗人 + - 剛鐸人 + - 九重天 + - 仙女龍 + - 食人魔 + - 伏路魔 + - 佛摩爾巨人 + - 達歐 + - 豺狼人 + - 僕族賢者 + - 聆誓者 + - 史普倫 + - 颶風之父 + - 羅薩里恩 + - 光明領主 + - 軒親王 + - 國王 + - 帝王 + - 碎瑛武士 + - 拉格納羅斯 + - 奴隸 + - 魔像 + - 蛇髮女妖 + - 巫師 + - 鷹身女妖 + - 駿鹰 + - 矮人 + - 國家煉金術士 + - 亡靈戰士 + - 豺狼衆 + - 諾斯克 + - 鬼 + - 羅剎 + - 甦生者 + - 邪教徒 + adjectives: + - 討喜的 + - 美妙的 + - 潔淨的 + - 優雅的 + - 華麗的 + - 奪人目光的 + - 英俊的 + - 冗長的 + - 壯麗的 + - 樸素的 + - 古雅的 + - 閃亮的 + - 骯髒的 + - 紅的 + - 橘的 + - 黃的 + - 綠的 + - 藍的 + - 紫的 + - 灰的 + - 黑的 + - 白的 + - 消逝的 + - 奇葩的 + - 強力的 + - 富裕的 + - 寬廣的 + - 熱忱的 + - 震耳欲聾的 + - 朦朧的 + - 悅耳的 + - 靜謐的 + - 雷暴的 + - 耳語的 + - 嘶嘶声的 + - 遠古的 + - 疾迅的 + - 破舊的 + - 急遽的 + - 緩慢的 + - 腐敗的 + - 悚然的 + - 扭曲的 + - 空無的 + - 沉重的 + - 可惡的 + - 不尋常的 + - 荒謬的 + - 差強人意的 + - 意外的 + - 堅決的 + - 啓程的 + - 折磨的 + - 警示的 + - 煩擾的 + - 惱人的 + - 焦慮的 + - 香氣四溢的 + - 好鬥的 + - 漠然的 + - 驚人的 + - 混淆的 + - 野心的 + - 愉悅的 + - 震怒的 + - 傲慢的 + - 羞愧的 + - 意欲的 + - 精彩的 + - 吉祥的 + - 均分的 + - 極好的 + - 劣質的 + - 惡劣的 + - 野蠻的 + - 羞怯的 + - 適當的 + - 好戰的 + - 有益的 + - 狂怒的 + - 優秀的 + - 狼狽的 + - 巨大的 + - 苦的 + - 奇異的 + - 嗜血的 + - 沸騰的 + - 無盡的 + - 無禮的 + - 勇敢的 + - 堅強的 + - 易碎的 + - 簡短的 + - 明亮的 + - 損壞的 + - 忙碌的 + - 慎重的 + - 冷酷的 + - 平靜的 + - 變化無常的 + - 謹慎的 + - 草率的 + - 關愛的 + - 謹慎的 + - 無止盡的 + - 可靠的 + - 迷人的 + - 廉價的 + - 首領的 + - 寒冷的 + - 騎士的 + - 厚實的 + - 分明的 + - 聰慧的 + - 隱居的 + - 笨拙的 + - 陰鬱的 + - 時髦的 + - 龐大的 + - 好戰的 + - 尋常的 + - 困惑的 + - 譴責的 + - 沉著的 + - 大膽的 + - 怯懦的 + - 瘋狂的 + - 膽小的 + - 殘酷的 + - 毛茸的 + - 疑問的 + - 可愛的 + - 損壞的 + - 破壞的 + - 危險的 + - 黑暗的 + - 氣派的 + - 果斷的 + - 深沉的 + - 落敗的 + - 不完美的 + - 挑釁的 + - 精緻的 + - 珍味的 + - 愉悅的 + - 邪惡的 + - 錯亂的 + - 混亂的 + - 描繪的 + - 異常的 + - 艱困的 + - 勤勉的 + - 悲慘的 + - 骯髒的 + - 不幸的 + - 噁心的 + - 反感的 + - 幻滅的 + - 獨特的 + - 妨礙的 + - 苛刻的 + - 驟然的 + - 淒涼的 + - 不全的 + - 渴望的 + - 年長的 + - 電擊的 + - 精英的 + - 附魔的 + - 魅惑的 + - 雀躍的 + - 龐然的 + - 愉快的 + - 熱情的 + - 傾慕的 + - 不穩定的 + - 縹緲的 + - 逃避的 + - 精良的 + - 激動的 + - 振奮的 + - 奇異的 + - 熱情洋溢的 + - 優秀的 + - 褪色的 + - 一般的 + - 耿直的 + - '僞造的' + - 熟練的 + - 著名的 + - 狂熱的 + - 幻想的 + - 紙醉金迷的 + - 厚大的 + - 害怕的 + - 無畏的 + - 虛弱的 + - 歡樂的 + - 兇狠的 + - 污穢的 + - 優質的 + - 講究的 + - 首要的 + - 固定的 + - 俗豔的 + - 完美的 + - 脆弱的 + - 輕浮的 + - 花哨的 + - 蓬鬆的 + - 顫抖的 + - 泡沫的 + - 笨拙的 + - 疏忽的 + - 幸運的 + - 脆弱的 + - 易碎的 + - 喪心病狂的 + - 自由的 + - 冷凍的 + - 新的 + - 友善的 + - 恐懼的 + - 笨拙的 + - 滑稽的 + - 野獸的 + - 鬼祟的 + - 模糊的 + - 特大的 + - 天賜的 + - 極巨的 + - 發亮的 + - 榮耀的 + - 神聖的 + - 良好的 + - 愚鈍的 + - 絢爛的 + - 優美的 + - 宏偉的 + - 感恩的 + - 滑溜的 + - 好評的 + - 貪婪的 + - 喪慟的 + - 時髦的 + - 怪誕的 + - 邋遢的 + - 陰森的 + - 乖戾的 + - 近衛的 + - 無罪的 + - 輕信的 + - 膽大的 + - 粗獷的 + - 神聖的 + - 吊掛的 + - 不幸的 + - 愉快的 + - 協調的 + - 可憎的 + - 健全的 + - 心碎的 + - 天堂的 + - 地獄的 + - 優越的 + - 無奈的 + - 遲疑的 + - 猙獰的 + - 可笑的 + - 空洞的 + - 流浪的 + - 尊貴的 + - 極糟的 + - 周到的 + - 特大的 + - 笨重的 + - 詼諧的 + - 飢渴的 + - 傷痛的 + - 寂靜的 + - 催眠的 + - 歇斯底里的 + - 不耐看的 + - 冰冷的 + - 無知的 + - 患病的 + - 非法的 + - 輝煌的 + - 假想的 + - 極廣的 + - 逼近的 + - 公正的 + - 殘缺的 + - 失禮的 + - 重要的 + - 白熾的 + - 無能的 + - 刻苦的 + - 不可思議的 + - 低廉的 + - 聲名狼藉的 + - 無辜的 + - 審訊的 + - 陰險的 + - 天性的 + - 智慧的 + - 與眾不同的 + - 戰無不勝的 + - 激怒的 + - 渴望的 + - 厭倦的 + - 鉤狀的 + - 嫉妒的 + - 快活的 + - 歡喜的 + - 躍動的 + - 不成熟的 + - 靈敏的 + - 仁慈的 + - 善良的 + - 會意的 + - 學識淵博的 + - 已知的 + - 勞動的 + - 跛足的 + - 較大的 + - 最後的 + - 遲來的 + - 可笑的 + - 怠惰的 + - 細小的 + - 致命的 + - 光明的 + - 小的 + - 現存的 + - 孤獨的 + - 嘈雜的 + - 迷人的 + - 好運的 + - 洋紅的 + - 魔幻的 + - 威嚴的 + - 蓄意的 + - 被標記的 + - 大規模的 + - 奇妙的 + - 中庸的 + - 醫療的 + - 熔鍊的 + - 淩亂的 + - 強大的 + - 軍用的 + - 盲目的 + - 輕微的 + - 薄霧的 + - 混合的 + - 現代的 + - 靜止的 + - 神秘的 + - 天真的 + - 狹窄的 + - 自然的 + - 俐落的 + - 必要的 + - 多餘的 + - 貧乏的 + - 緊張的 + - 嶄新的 + - 很好的 + - 一般的 + - 懷舊的 + - 無盡的 + - 過時的 + - 到手的 + - 海洋的 + - 過氣的 + - 全知的 + - 理想的 + - 尋常的 + - 天然的 + - 優秀的 + - 橢圓形 + - 被高估的 + - 痛苦的 + - 平行的 + - 可悲的 + - 平靜的 + - 懺悔的 + - 完美的 + - 定期的 + - 小巧的 + - 物理的 + - 粉紅的 + - 塑料的 + - 愉快的 + - 無意義的 + - 有禮的 + - 貧困的 + - 珍貴的 + - 優質的 + - 目前的 + - 漂亮的 + - 私人的 + - 生產的 + - 保護的 + - 公眾的 + - 困惑的 + - 疑問的 + - 快速的 + - 迅速的 + - 稀有的 + - 準備的 + - 真實的 + - 反抗者 + - 常規的 + - 顯著的 + - 負責的 + - 浪漫的 + - 圓形的 + - 皇家的 + - 悲傷的 + - 安全的 + - 鹹的 + - 滿意的 + - 驚慌的 + - 可怕的 + - 科學的 + - 瘦小的 + - 尖叫的 + - 秒 + - 二手的 + - 機密的 + - 自私的 + - 貪婪的 + - 認真的 + - 淺層的 + - 銳利的 + - 閃亮的 + - 衝擊的 + - 短的 + - 害羞的 + - 生病的 + - 沉默的 + - 絲綢的 + - 愚蠢的 + - 簡單的 + - 消瘦的 + - 纖細的 + - 瘦弱的 + - 滑溜的 + - 小型的 + - 聰明的 + - 微笑的 + - 平滑的 + - 鬼祟的 + - 柔軟的 + - 固體的 + - 特別的 + - 壯觀的 + - 辛辣的 + - 尖刺的 + - 燦爛的 + - 詭異的 + - 無暇的 + - 方形的 + - 質押的 + - 站立的 + - 穩定的 + - 黏稠的 + - 奇怪的 + - 條紋的 + - 強壯的 + - 成功的 + - 超級的 + - 最高的 + - 甜的 + - 天份的 + - 高大的 + - 美味的 + - 暫時的 + - 緊張的 + - 恐怖的 + - 非常好的 + - 已測試的 + - 感激的 + - 厚實的 + - 薄的 + - 口渴的 + - 週到的 + - 細小的 + - 疲憊的 + - 狡猾的 + - 困擾的 + - '正確的' + - 醜陋的 + - 極限的 + - 不建議的 + - 未武裝的 + - 未發現的 + - 不健康的 + - 獨特的 + - 未知的 + - 非自然的 + - 未使用的 + - 異常的 + - 已使用的 + - 有用的 + - 沒用的 + - 值錢的 + - 暴力的 + - 等待的 + - 遊蕩的 + - 溫暖的 + - 虛弱的 + - 富裕的 + - 整個的 + - 睿智的 + - 精彩的 + - 木製的 + - 擔憂的 + - 不值的 + - 錯誤的 + - 威脅的 + - 信任的 + - 謙遜的 + - 受威脅的 + verbs: + - 斬擊的 + - 切斷的 + - 刺的 + - 抓撓的 + - 殺害的 + - 殺戮的 + - 屠宰的 + - 摧毀的 + - 搔癢的 + - 擁抱的 + - 謀殺的 + - 拍打的 + - 嘶嘶声的 + - 旅行的 + - 傳送的 + - 閃爍的 + - 摧毀的 + - 毀壞的 + - 閃光的 + - 物化的 + - 生成的 + - 質問的 + - 詢問的 + - 懇求的 + - 高要求的 + - 審訊的 + - 查詢的 + - 突擊的 + - 驚人的 + - 埋伏的 + - 襲擊的 + - 猛攻的 + - 暴風的 + - 轟擊的 + - 炮擊的 + - 打擊的 + - 充電的 + - 搶奪的 + - 戰鬥的 + - 毆打的 + - 錘擊的 + - 打擊的 + - 戰鬥中的 + - 壓倒性的 + - 襲擊的 + - 攻堅的 + - 射擊的 + - 冒險的 + - 裂解的 + - 斷裂的 + - 粉碎的 + - 碎裂的 + - 壓裂的 + - 碎裂的 + - 碾碎的 + - 撕裂的 + - 彎曲的 + - 捕捉的 + - 爆裂的 + - 爆炸的 + - 破壞的 + - 破片的 + - 分裂的 + - 鞏固的 + - 促成的 + - 敲打的 + - 爭吵的 + - 衝擊者 + - 對打的 + - 作響的 + - 驚人的 + - 捶打的 + - 抨擊的 + - 召喚師 + - 尖叫的 + - 吼叫的 + - 怒吼的 + - 轉移的 + - 轉換的 + - 修改的 + - 扭曲的 + - 突變的 + - 歪曲的 + - 模糊的 + - 調整的 + - 翹曲的 + - 改動的 + - 適應的 + - 進化的 + - 不同的 + - 狩獵的 + - 蔓生的 + - 跟随的 + - 盯梢的 + - 陰影的 + - 追捕的 + - 外殼的 + - 掛載的 + - 升序的 + - 上升的 + - 揮舞的 + - 泉源的 + - 山頂的 + - 採集的 + - 籠罩的 + - 屯積的 + - 收割的 + - 收穫的 + - 保存的 + - 庇護的 + - 隱身的 + - 遮蔽的 + - 圍繞的 + - 掩飾的 + - 隱藏的 + - 偽裝的 + - 屏蔽的 + - 埋葬的 + - 窒息的 + - 雲集的 + - 護盾的 + - 陰影的 + - 密封的 + - 包圍的 + - 拍賣的 + - 遮蔽的 + - 穿越的 + - 涉水的 + - 滑翔的 + - 咆哮的 + - 嗚咽的 + - 尖叫的 + - 嘶吼的 + - 尖叫的 + - 怒吼的 + - 尖嘯的 + - 大哭的 + - 尖叫的 + - 劈開的 + - 砍伐的 + - 剝落的 + - 割斷的 + - 切片的 + - 剪切的 + - 分裂的 + - 軸心的 + - 斬擊的 + - 彎曲的 + - 撕裂的 + - 細化的 + - 耕作的 + - 雕飾的 + - 解剖的 + - 駭入的 + - 貫穿的 + - 鋸木的 + - 撕裂的 + - 裁剪的 + - 採礦的 + - 鑽研的 + - 挖掘的 + - 掘進的 + - 鑽頭的 + - 鏤空的 + - 挖角的 + - 開鑿隧道的 + - 入侵的 + - 寄宿的 + - 遊蕩的 + - 滲透的 + - 闖入的 + - 逃避的 + - 逃離的 + - 跑步的 + - 閃避的 + - 崩潰的 + - 戰鬥的 + - 蒂斯靈的 + - 摔角的 + - 擦傷的 + - 決鬥的 + - 鬥毆的 + - 比武的 + - 博擊的 + - 碰撞的 + - 戰鬥的 + - 鈎索的 + - 報廢的 + - 攻擊的 + - 仇人的 + - 衝突的 + - 發現的 + - 偵測的 + - 抓住的 + - 解決的 + - 揭示的 + - 揭示的 + - 彈跳的 + - 彈性的 + - 泉源的 + - 穹頂的 + - 蹦跳的 + - 涌動的 + - 罰球的 + - 啟動的 + - 落地踢 + - 感應的 + - 感知的 + - 偵測的 + - 淡出的 + - 流血的 + - 縮減的 + - 削弱的 + - 緩解的 + - 遞減的 + - 鍛造的 + - 釋放的 + - 採集的 + - 收藏的 + - 宰殺的 + - 碾碎的 + - 推進的 + - 緩步的 + - 奔跑的 + - 探尋的 + - 偵查的 + - 探索的 + - 挖掘的 + - 顫抖的 + - 敲擊聲的 + - 分離的 + - 駭入的 + - 斷裂的 + - 雕飾的 + - 分割的 + - 半數的 + - 突發性的 + - 消滅的 + - 區隔的 + - 彎曲的 + - 撕開的 + - 放養的 + - 囚禁者 + - 抓補的 + - 拐角的 + - 糾結的 + - 釘住的 + - 抓住的 + - 限制的 + - 綁定的 + - 鉤住的 + - 抓取的 + - 強奪的 + - 籠罩的 + - 捕捉的 + - 縈繞心頭 + - 爬行的 + - 潜行的 + - 間諜的 + - 復仇的 + - 暴風的 + verb-ers (noun): + - 世界破壞者 + - 世界粉碎者 + - 復仇者 + - 灰燼持有者 + - 尋風者 + - 污染者 + - 雷霆之怒 + - 切片者 + - 砍伐者 + - 切割者 + - 刺殺者 + - 雕刻者 + - 殺手 + - 獵手 + - 毀滅者 + - 擁抱者 + - 謀殺者 + - 拍打者 + - 旅行者 + - 傳送者 + - 閃現者 + - 肇事者 + - 材料者 + - 生怪者 + - 妖術師 + - 突擊者 + - 打擊者 + - 伏擊者 + - 衝鋒者 + - 風暴者 + - 炸彈手 + - 巴杰榴彈槍 + - 猛打者 + - 衝鋒手 + - 搏擊者 + - 大鎚手 + - 打擊者 + - 戰鬥者 + - 壓勝者 + - 掠奪者 + - 攻堅者 + - 射擊手 + - 冒險者 + - 裂縫者 + - 打擊者 + - 粉碎的 + - 破碎的 + - 碎裂的 + - 粉碎機 + - 撕紙器 + - 渲染者 + - 鯛魚 + - 爆破者 + - 爆炸 + - 傷害者 + - 破碎者 + - 分離器 + - 築城者 + - 推桿器 + - 輕敲者 + - 錘兵 + - 黄油的 + - 打擊的 + - 打擊者 + - 捶打的 + - 摔角手 + - 召喚師 + - 吶喊者 + - 轉換者 + - 變形者 + - 修訂者 + - 龍捲風 + - 幻像 + - 整經機 + - 替代品 + - 適格者 + - 進化者 + - 獵人 + - 追跡者 + - 追隨者 + - 尾隨者 + - 潛行者 + - 獵犬 + - 勇者 + - 騎兵 + - 飛昇者 + - 起義者 + - 跑者 + - 收藏家 + - 死神 + - 收割者 + - 救世者 + - 庇護者 + - 隱藏者 + - 掩蔽者 + - 封印者 + - 隱士 + - 闡釋者 + - 埋葬者 + - 粉飾者 + - 影者 + - 核示者 + - 信使 + - 薄紗麗影 + - 穿梭者 + - 秩序的 + - 滑翔 + - 尖嘯者 + - 嗚咽者 + - 吶喊者 + - 尖叫者 + - 大叫者 + - 尖叫者 + - 伐木機 + - 切片者 + - 狙擊手 + - 分離器 + - 斧手 + - 砍伐者 + - 渲染者 + - 撕紙器 + - 稀釋劑 + - 農作物 + - 雕刻師 + - 黑客 + - 穿刺者 + - 鋸工 + - 剃毛刀 + - 剪毛者 + - 礦工 + - 挖掘者 + - 埋葬者 + - 探鑽者 + - 隧道工 + - 入侵者 + - 滑板者 + - 遊蕩者 + - 侵入者 + - 逃避者 + - 奔跑者 + - 道奇 + - 暴沖者 + - 搏擊者 + - 摔角手 + - 擦鞋匠 + - 決鬥者 + - 搏擊手 + - 撞擊者 + - 擒拿者 + - 拆解手 + - 進攻者 + - 不合者 + - 捕手 + - 解算器 + - 揭示者 + - 跳躍者 + - 彈跳者 + - 牽引者 + - 漏斗 + - 手術師 + - 罰球手 + - 落地踢 + - 感知者 + - 退化者 + - 放血者 + - 虛弱 + - 鍛工 + - 釋放者 + - 收集者 + - 粉碎機 + - 螺旋槳 + - 慢跑者 + - 疾跑者 + - 偵查者 + - 探索者 + - 挖掘者 + - 旋木嘲鶇 + - 夥伴 + - 黑客 + - 雕刻師 + - 分割者 + - 減半 + - 破壞者 + - 渲染者 + - 撕裂者 + - 掠食者 + - 監禁者 + - 角落 + - 固定器 + - 捕手 + - 抑制器 + - 粘合 + - 斯納格 + - 搶奪者 + - 卡格 + - 捕抓者 + - 纏身者 + - 苦力怕 + - 潛行者 + - 粘合 + - 禁錮者 + - 誘惑者 + - 舞者 + - 褻瀆者 + - 食者 + - 打鼾者 + - 推進器 + - 拍打者 +absorption: + name: 傷害吸收 +blindness: + name: 失明 +conduit_power: + name: 海靈祝福 +confusion: + name: 噁心 +damage_resistance: + name: 抗性提升 +dolphins_grace: + name: 海豚悠游 +fast_digging: + name: 挖掘加速 +fire_resistance: + name: 抗火 +glowing: + name: 發光 +harm: + name: 瞬間傷害 +heal: + name: 瞬間治療 +health_boost: + name: 生命提升 +hunger: + name: 飢餓 +increase_damage: + name: 力量 +invisibility: + name: 隱形 +jump: + name: 跳躍提升 +levitation: + name: 漂浮 +luck: + name: 海洋的祝福 +night_vision: + name: 夜視 +poison: + name: 中毒 +regeneration: + name: 生命回復 +saturation: + name: 飽食度 +slow: + name: 緩速 +slow_digging: + name: 挖掘疲勞 +slow_falling: + name: 緩降 +speed: + name: 速度 +unluck: + name: 霉運 +water_breathing: + name: 水下呼吸 +weakness: + name: 虛弱 +wither: + name: 凋零怪 +translation: + Economy pay message v2: '&2轉帳 &2$amount_sent $currency_name &2給 $receiver&2,扣除手續費,對方將獲得 $amount_received &2!' + Economy currency left message: 你現在持有 &2$amount_left $currency_name。 + Economy money from payment message: 你從 &f$sender &2收到 $amount_received $currency_name。 + Economy payment insuficient currency: '&c你沒有足夠的 $currency_name!' + Wallet command message: 你有 &2$balance $currency_name。 + Tax confirmation message: '&c轉帳將收取 $percentage% 手續費,&a輸入 &9$command &a同意此次交易!' + shopBatchSellItem: '&a因售出物品而獲得 &a$currency_amount $currency_name!' + Shop buy message: '&a花費 $item_value $currency_name 購買 $item_name!' + Shop current balance message: '&a你現在持有 $currency_amount $currency_name。' + Shop insufficient funds message: '&c你沒有足夠的 $currency_name!' + Shop item cost message: 這個物品需要花費 &c$item_value $currency_name。 + Shop sell message: '&a因售出 $item_name 而獲得&a $currency_amount $currency_name!' + Shop sale player items warning: '&c不能賣出非自身靈魂綁定的任何裝備。' + Shop sale instructions: '&c你只能在這裡售出精英裝備! (只接受精英怪物所掉落的道具)' + Teleport time left: '&7[EM] 傳送將在 &a$time &7秒後執行...' + Teleport cancelled: '&7[EM] &c 傳送被中止!' + noPendingCommands: '&c你沒有任何待處理的指令。' + trackMessage: 追蹤 $name。 + chestLowRankMessage: '&7[EM] &c你的公會階級至少需要 $rank &cin 才能開啟此箱子!' + chestCooldownMessage: '&7[EM] &c你近期已開啟過此箱子,請等待 $time!' + insufficientCurrencyForWormholeMessage: '&8[EliteMobs] &c餘額不足!您需要 $amount 才能使用 com.magmaguy.elitemobs.wormhole!' + dismissEMMessage: '&8[EliteMobs] 可嘗試使用 /elitemobs alt &f切換新版選單,&c若不想再看到這條消息,請輸入 &4/em dismiss' + switchEMStyleMessage: '&8[EliteMobs] &2/elitemobs &fEM選單已更換,可輸入指令查看!' +EconomySettings: + currencyName: 精英幣 + chatCurrencyShowerMessage: '&7[EM] 獲得 &a$amount $currency_name!' + actionbarCurrencyShowerMessage: '&7[EM] 獲得 &a$amount $currency_name!' + adventurersGuildNotificationMessages: '&7[EM] 想賺更多的精英幣? 試試 &a/em !' +arrow_damage: + name: 強力 +arrow_fire: + name: 火燄 +arrow_infinite: + name: 無限 +arrow_knockback: + name: 衝擊 +binding_curse: + name: 綁定詛咒 +channeling: + name: 喚雷 +critical_strikes: + name: 暴擊 + criticalHitPopup: '&5暴擊!' +damage_all: + name: 鋒利 +damage_arthropods: + name: 節肢剋星 +damage_undead: + name: 不死剋星 +depth_strider: + name: 深海漫遊 +dig_speed: + name: 效率 +drilling: + name: 鑽頭的 +durability: + name: 耐久 +earthquake: + name: 地震 + earthquakeActivationMessage: '&8[EliteMobs] &a地震已觸發! &c需等待2分鐘的冷卻時間!' + earthquakeAvailableMessage: '&8[EliteMobs] &2地震的冷卻結束!' +fire_aspect: + name: 燃燒 +flamethrower: + name: 火燄噴射 +frost_walker: + name: 冰霜行者 +grappling_hook: + name: 抓鉤 +hunter: + name: 獵人 +ice_breaker: + name: 破冰者 +impaling: + name: 魚叉 +knockback: + name: 擊退 +lightning: + name: 閃電 +loot_bonus_blocks: + name: 幸運 +loot_bonus_mobs: + name: 掠奪 +loud_strikes: + name: 大聲罷工 +loyalty: + name: 忠誠 +lure: + name: 魚餌 +mending: + name: 修補 +meteor_shower: + name: 流星雨 +multishot: + name: 分裂箭矢 +oxygen: + name: 水中呼吸 +piercing: + name: 貫穿的 +plasma_boots: + name: 等離子靴 +protection_environmental: + name: 保護 +protection_explosions: + name: 爆炸保護 +protection_fall: + name: 輕盈 +protection_fire: + name: 火燄保護 +protection_projectile: + name: 投射物保護 +quick_charge: + name: 快速上弦 +riptide: + name: 波濤 +silk_touch: + name: 絲綢之觸 +soulbind: + name: 靈魂綁定 + loreStrings: '&7靈魂綁定 &f$player' + hologramString: '$player&f 的' +summon_merchant: + name: 召喚商人 + message: Jeeves! +summon_wolf: + name: 召喚狼 +sweeping_edge: + name: 橫掃之刃 +thorns: + name: 尖刺 +unbind: + name: 取消綁定 +vanishing_curse: + name: 消失詛咒 +water_worker: + name: 水下挖掘 +AntiExploit: + AntiExploit message: '&c[EM 偵測] &7附近的精英怪物將不會掉落戰利品。' +CombatTag: + Combat tag message: '&c[EliteMobs] 進入戰鬥狀態!' +AdventurersGuild: + adventurersGuildMenuName: '&6&l冒險者大廳' + Prestige 0 rank 0: '&8Commoner - 禁用精英!' + Prestige 0 rank 0 short placeholder: '&6&l✧&e0' + Prestige 0 rank 1: '&f冒險者菜鳥' + Prestige 0 rank 1 short placeholder: '&6&l✧&eⅠ' + Prestige 0 rank 2: '&f冒險者新人' + Prestige 0 rank 2 short placeholder: '&6&l✧&eⅠⅠ' + Prestige 0 rank 3: '&f見習冒險者' + Prestige 0 rank 3 short placeholder: '&6&l✧&eⅠⅠⅠ' + Prestige 0 rank 4: '&2冒險者' + Prestige 0 rank 4 short placeholder: '&6&l✧&eⅠⅤ' + Prestige 0 rank 5: '&2有經驗的冒險者' + Prestige 0 rank 5 short placeholder: '&6&l✧&eⅤ' + Prestige 0 rank 6: '&2熟練冒險者' + Prestige 0 rank 6 short placeholder: '&6&l✧&eⅤⅠ' + Prestige 0 rank 7: '&1老鳥冒險者' + Prestige 0 rank 7 short placeholder: '&6&l✧&eⅤⅠⅠ' + Prestige 0 rank 8: '&1精英冒險者' + Prestige 0 rank 8 short placeholder: '&6&l✧&eⅤⅠⅠⅠ' + Prestige 0 rank 9: '&l老練冒險者' + Prestige 0 rank 9 short placeholder: '&6&l✧&eⅠⅩ' + Prestige 0 rank 10: '&5歷戰冒險者' + Prestige 0 rank 10 short placeholder: '&6&l✧&eⅩ' + Prestige 1 rank 0: '&e聲望 I &8平民' + Prestige 1 rank 0 short placeholder: '&e⚜Ⅰ&6&l✧&e0' + Prestige 1 rank 1: '&e聲望 I &f冒險者菜鳥' + Prestige 1 rank 1 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠ' + Prestige 1 rank 2: '&e聲望 I &f冒險者新人' + Prestige 1 rank 2 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅠ' + Prestige 1 rank 3: '&e聲望 I &f見習冒險者' + Prestige 1 rank 3 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅠⅠ' + Prestige 1 rank 4: '&e聲望 I &2冒險者' + Prestige 1 rank 4 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅤ' + Prestige 1 rank 5: '&e聲望 I &2有經驗冒險者' + Prestige 1 rank 5 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤ' + Prestige 1 rank 6: '&e聲望 I &2熟練冒險者' + Prestige 1 rank 6 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠ' + Prestige 1 rank 7: '&e聲望 I &1老鳥冒險者' + Prestige 1 rank 7 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠⅠ' + Prestige 1 rank 8: '&e聲望 I &1精英冒險者' + Prestige 1 rank 8 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠⅠⅠ' + Prestige 1 rank 9: '&e聲望 I &5老練冒險者' + Prestige 1 rank 9 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅩ' + Prestige 1 rank 10 short placeholder: '&e⚜Ⅰ&6&l✧&eⅩ' + Prestige 1 rank 10: '&e聲望 I &5歷戰冒險者' + Prestige 1 rank 11: '&e聲望 I &5傳奇冒險者' + Prestige 1 rank 11 short placeholder: '&e⚜Ⅰ&6&l✧&eⅩⅠ' + Prestige 2 rank 0: '&2聲望 II &8平民' + Prestige 2 rank 0 short placeholder: '&2⚜ⅠⅠ&6&l✧&e0' + Prestige 2 rank 1: '&2聲望 II &f冒險者菜鳥' + Prestige 2 rank 1 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠ' + Prestige 2 rank 2: '&2聲望 II &f冒險者新人' + Prestige 2 rank 2 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅠ' + Prestige 2 rank 3: '&2聲望 II &f見習冒險者' + Prestige 2 rank 3 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 2 rank 4: '&2聲望 II &2冒險者' + Prestige 2 rank 4 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅤ' + Prestige 2 rank 5: '&2聲望 II &2有經驗冒險者' + Prestige 2 rank 5 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤ' + Prestige 2 rank 6: '&2聲望 II &2熟練冒險者' + Prestige 2 rank 6 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠ' + Prestige 2 rank 7: '&2聲望 II &1老鳥冒險者' + Prestige 2 rank 7 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 2 rank 8: '&2聲望 II &1精英冒險者' + Prestige 2 rank 8 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 2 rank 9: '&2聲望 II &5老練冒險者' + Prestige 2 rank 9 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅩ' + Prestige 2 rank 10 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩ' + Prestige 2 rank 10: '&2聲望 II &5歷戰冒險者' + Prestige 2 rank 11: '&2聲望 II &5傳奇冒險者' + Prestige 2 rank 11 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩⅠ' + Prestige 2 rank 12: '&2聲望 II &5神話級冒險者' + Prestige 2 rank 12 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 3 rank 0: '&a聲望 III &8平民' + Prestige 3 rank 0 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&e0' + Prestige 3 rank 1: '&a聲望 III &f冒險者菜鳥' + Prestige 3 rank 1 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠ' + Prestige 3 rank 2: '&a聲望 III &f冒險者新人' + Prestige 3 rank 2 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠ' + Prestige 3 rank 3: '&a聲望 III &f見習冒險者' + Prestige 3 rank 3 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 3 rank 4: '&a聲望 III &2冒險者' + Prestige 3 rank 4 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅤ' + Prestige 3 rank 5: '&a聲望 III &2有經驗冒險者' + Prestige 3 rank 5 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤ' + Prestige 3 rank 6: '&a聲望 III &2熟練冒險者' + Prestige 3 rank 6 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠ' + Prestige 3 rank 7: '&a聲望 III &1老鳥冒險者' + Prestige 3 rank 7 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 3 rank 8: '&a聲望 III &1精英冒險者' + Prestige 3 rank 8 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 3 rank 9: '&a聲望 III &5老練冒險者' + Prestige 3 rank 9 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅩ' + Prestige 3 rank 10 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩ' + Prestige 3 rank 10: '&a聲望 III &5歷戰冒險者' + Prestige 3 rank 11: '&a聲望 III &5傳奇冒險者' + Prestige 3 rank 11 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠ' + Prestige 3 rank 12: '&a聲望 III &5神話級冒險者' + Prestige 3 rank 12 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 3 rank 13: '&a聲望 III &5不朽者' + Prestige 3 rank 13 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 4 rank 0: '&3聲望 IV &8平民' + Prestige 4 rank 0 short placeholder: '&3⚜ⅠⅤ&6&l✧&e0' + Prestige 4 rank 1: '&3聲望 IV &f冒險者菜鳥' + Prestige 4 rank 1 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠ' + Prestige 4 rank 2: '&3聲望 IV &f冒險者新人' + Prestige 4 rank 2 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅠ' + Prestige 4 rank 3: '&3聲望 IV &f見習冒險者' + Prestige 4 rank 3 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅠⅠ' + Prestige 4 rank 4: '&3聲望 IV &2冒險者' + Prestige 4 rank 4 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅤ' + Prestige 4 rank 5: '&3聲望 IV &2有經驗冒險者' + Prestige 4 rank 5 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤ' + Prestige 4 rank 6: '&3聲望 IV &2熟練冒險者' + Prestige 4 rank 6 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠ' + Prestige 4 rank 7: '&3聲望 IV &1老鳥冒險者' + Prestige 4 rank 7 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠⅠ' + Prestige 4 rank 8: '&3聲望 IV &1精英冒險者' + Prestige 4 rank 8 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠⅠⅠ' + Prestige 4 rank 9: '&3聲望 IV &5老練冒險者' + Prestige 4 rank 9 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅩ' + Prestige 4 rank 10 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩ' + Prestige 4 rank 10: '&3聲望 IV &5歷戰冒險者' + Prestige 4 rank 11: '&3聲望 IV &5傳奇冒險者' + Prestige 4 rank 11 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠ' + Prestige 4 rank 12: '&3聲望 IV &5神話級冒險者' + Prestige 4 rank 12 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅠ' + Prestige 4 rank 13: '&3聲望 IV &5 不朽者' + Prestige 4 rank 13 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅠⅠ' + Prestige 4 rank 14: '&3聲望 IV &5天選者' + Prestige 4 rank 14 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅤ' + Prestige 5 rank 0: '&b聲望 V &8平民' + Prestige 5 rank 0 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 5 rank 1: '&b聲望 V &f冒險者菜鳥' + Prestige 5 rank 1 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠ' + Prestige 5 rank 2: '&b聲望 V &f冒險者新人' + Prestige 5 rank 2 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅠ' + Prestige 5 rank 3: '&b聲望 V &f見習冒險者' + Prestige 5 rank 3 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅠⅠ' + Prestige 5 rank 4: '&b聲望 V &2冒險者' + Prestige 5 rank 4 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅤ' + Prestige 5 rank 5: '&b聲望 V &2有經驗冒險者' + Prestige 5 rank 5 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤ' + Prestige 5 rank 6: '&b聲望 V &2熟練冒險者' + Prestige 5 rank 6 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠ' + Prestige 5 rank 7: '&b聲望 V &1老鳥冒險者' + Prestige 5 rank 7 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠⅠ' + Prestige 5 rank 8: '&b聲望 V &1精英冒險者' + Prestige 5 rank 8 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠⅠⅠ' + Prestige 5 rank 9: '&b聲望 V &5老練冒險者' + Prestige 5 rank 9 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅩ' + Prestige 5 rank 10 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩ' + Prestige 5 rank 10: '&b聲望 V &5歷戰冒險者' + Prestige 5 rank 11: '&b聲望 V &5傳奇冒險者' + Prestige 5 rank 11 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠ' + Prestige 5 rank 12: '&b聲望 V &5神話級冒險者' + Prestige 5 rank 12 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅠ' + Prestige 5 rank 13: '&b聲望 V &5 不朽者' + Prestige 5 rank 13 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅠⅠ' + Prestige 5 rank 14: '&b聲望 V &5天選者' + Prestige 5 rank 14 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅤ' + Prestige 5 rank 15: '&b聲望 V &5晉升者' + Prestige 5 rank 15 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅤ' + Prestige 6 rank 0: '&4聲望 VI &8平民' + Prestige 6 rank 0 short placeholder: '&4⚜ⅤⅠ&6&l✧&e0' + Prestige 6 rank 1: '&4聲望 VI &f冒險者菜鳥' + Prestige 6 rank 1 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠ' + Prestige 6 rank 2: '&4聲望 VI &f冒險者新人' + Prestige 6 rank 2 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅠ' + Prestige 6 rank 3: '&4聲望 VI &f見習冒險者' + Prestige 6 rank 3 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅠⅠ' + Prestige 6 rank 4: '&4聲望 VI &2冒險者' + Prestige 6 rank 4 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅤ' + Prestige 6 rank 5: '&4聲望 VI &2有經驗冒險者' + Prestige 6 rank 5 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤ' + Prestige 6 rank 6: '&4聲望 VI &2熟練冒險者' + Prestige 6 rank 6 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠ' + Prestige 6 rank 7: '&4聲望 VI &1老鳥冒險者' + Prestige 6 rank 7 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠⅠ' + Prestige 6 rank 8: '&4聲望 VI &1精英冒險者' + Prestige 6 rank 8 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 6 rank 9: '&4聲望 VI &5老練冒險者' + Prestige 6 rank 9 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅩ' + Prestige 6 rank 10 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩ' + Prestige 6 rank 10: '&4聲望 VI &5歷戰冒險者' + Prestige 6 rank 11: '&4聲望 VI &5傳奇冒險者' + Prestige 6 rank 11 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠ' + Prestige 6 rank 12: '&4聲望 VI &5神話級冒險者' + Prestige 6 rank 12 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠ' + Prestige 6 rank 13: '&4聲望 VI &5不朽者' + Prestige 6 rank 13 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 6 rank 14: '&4聲望 VI &5天選者' + Prestige 6 rank 14 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅤ' + Prestige 6 rank 15: '&4聲望 VI &5晉升者' + Prestige 6 rank 15 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤ' + Prestige 6 rank 16: '&4聲望 VI &5泰坦' + Prestige 6 rank 16 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤⅠ' + Prestige 7 rank 0: '&c聲望 VII &8平民' + Prestige 7 rank 0 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&e0' + Prestige 7 rank 1: '&c聲望 VII &f冒險者菜鳥' + Prestige 7 rank 1 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠ' + Prestige 7 rank 2: '&c聲望 VII &f冒險者新人' + Prestige 7 rank 2 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅠ' + Prestige 7 rank 3: '&c聲望 VII &f見習冒險者' + Prestige 7 rank 3 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 7 rank 4: '&c聲望 VII &2冒險者' + Prestige 7 rank 4 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅤ' + Prestige 7 rank 5: '&c聲望 VII &2有經驗冒險者' + Prestige 7 rank 5 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤ' + Prestige 7 rank 6: '&c聲望 VII &2熟練冒險者' + Prestige 7 rank 6 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠ' + Prestige 7 rank 7: '&c聲望 VII &1老鳥冒險者' + Prestige 7 rank 7 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 7 rank 8: '&c聲望 VII &1精英冒險者' + Prestige 7 rank 8 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 7 rank 9: '&c聲望 VII &5老練冒險者' + Prestige 7 rank 9 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅩ' + Prestige 7 rank 10 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩ' + Prestige 7 rank 10: '&c聲望 VII &5歷戰冒險者' + Prestige 7 rank 11: '&c聲望 VII &5傳奇冒險者' + Prestige 7 rank 11 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠ' + Prestige 7 rank 12: '&c聲望 VII &5神話級冒險者' + Prestige 7 rank 12 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 7 rank 13: '&c聲望 VII &5不朽者' + Prestige 7 rank 13 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 7 rank 14: '&c聲望 VII &5天選者' + Prestige 7 rank 14 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅤ' + Prestige 7 rank 15: '&c聲望 VII &5晉升者' + Prestige 7 rank 15 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤ' + Prestige 7 rank 16: '&c聲望 VII &5泰坦' + Prestige 7 rank 16 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤⅠ' + Prestige 7 rank 17: '&c聲望 VII &5半神' + Prestige 7 rank 17 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤⅠⅠ' + Prestige 8 rank 0: '&9聲望 VIII &8平民' + Prestige 8 rank 0 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&e0' + Prestige 8 rank 1: '&9聲望 VIII &f冒險者菜鳥' + Prestige 8 rank 1 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠ' + Prestige 8 rank 2: '&9聲望 VIII &f冒險者新人' + Prestige 8 rank 2 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅠ' + Prestige 8 rank 3: '&9聲望 VIII &f見習冒險者' + Prestige 8 rank 3 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 8 rank 4: '&9聲望 VIII &2冒險者' + Prestige 8 rank 4 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅤ' + Prestige 8 rank 5: '&9聲望 VIII &2有經驗冒險者' + Prestige 8 rank 5 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤ' + Prestige 8 rank 6: '&9聲望 VIII &2熟練冒險者' + Prestige 8 rank 6 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠ' + Prestige 8 rank 7: '&9聲望 VIII &1老鳥冒險者' + Prestige 8 rank 7 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 8 rank 8: '&9聲望 VIII &1精英冒險者' + Prestige 8 rank 8 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 8 rank 9: '&9聲望 VIII &5老練冒險者' + Prestige 8 rank 9 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅩ' + Prestige 8 rank 10 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩ' + Prestige 8 rank 10: '&9聲望 VIII &5歷戰冒險者' + Prestige 8 rank 11: '&9聲望 VIII &5傳奇冒險者' + Prestige 8 rank 11 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠ' + Prestige 8 rank 12: '&9聲望 VIII &5神話級冒險者' + Prestige 8 rank 12 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 8 rank 13: '&9聲望 VIII &5不朽者' + Prestige 8 rank 13 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 8 rank 14: '&9聲望 VIII &5天選者' + Prestige 8 rank 14 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅤ' + Prestige 8 rank 15: '&9聲望 VIII &5晉升者' + Prestige 8 rank 15 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤ' + Prestige 8 rank 16: '&9聲望 VIII &5泰坦' + Prestige 8 rank 16 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠ' + Prestige 8 rank 17: '&9聲望 VIII &5半神' + Prestige 8 rank 17 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠⅠ' + Prestige 8 rank 18: '&9聲望 VIII &5神' + Prestige 8 rank 18 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 9 rank 0: '&d聲望 IX &8平民' + Prestige 9 rank 0 short placeholder: '&d⚜ⅠⅩ&6&l✧&e0' + Prestige 9 rank 1: '&d聲望 IX &f冒險者菜鳥' + Prestige 9 rank 1 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠ' + Prestige 9 rank 2: '&d聲望 IX &f冒險者新人' + Prestige 9 rank 2 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅠ' + Prestige 9 rank 3: '&d聲望 IX &f見習冒險者' + Prestige 9 rank 3 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅠⅠ' + Prestige 9 rank 4: '&d聲望 IX &2冒險者' + Prestige 9 rank 4 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅤ' + Prestige 9 rank 5: '&d聲望 IX &2有經驗冒險者' + Prestige 9 rank 5 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤ' + Prestige 9 rank 6: '&d聲望 IX &2熟練冒險者' + Prestige 9 rank 6 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠ' + Prestige 9 rank 7: '&d聲望 IX &1老鳥冒險者' + Prestige 9 rank 7 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠⅠ' + Prestige 9 rank 8: '&d聲望 IX &1精英冒險者' + Prestige 9 rank 8 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠⅠⅠ' + Prestige 9 rank 9: '&d聲望 IX &5老練冒險者' + Prestige 9 rank 9 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅩ' + Prestige 9 rank 10 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩ' + Prestige 9 rank 10: '&d聲望 IX &5歷戰冒險者' + Prestige 9 rank 11: '&d聲望 IX &5傳奇冒險者' + Prestige 9 rank 11 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠ' + Prestige 9 rank 12: '&d聲望 IX &5神話級冒險者' + Prestige 9 rank 12 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅠ' + Prestige 9 rank 13: '&d聲望 IX &5不朽者' + Prestige 9 rank 13 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅠⅠ' + Prestige 9 rank 14: '&d聲望 IX &5天選者' + Prestige 9 rank 14 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅤ' + Prestige 9 rank 15: '&d聲望 IX &5晉升者' + Prestige 9 rank 15 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤ' + Prestige 9 rank 16: '&d聲望 IX &5泰坦' + Prestige 9 rank 16 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠ' + Prestige 9 rank 17: '&d聲望 IX &5半神' + Prestige 9 rank 17 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠⅠ' + Prestige 9 rank 18: '&d聲望 IX &5神' + Prestige 9 rank 18 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 9 rank 19: '&d聲望 IX &5獵神者' + Prestige 9 rank 19 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅩ' + Prestige 10 rank 0: '&5聲望 X &8平民' + Prestige 10 rank 0 short placeholder: '&5⚜Ⅹ&6&l✧&e0' + Prestige 10 rank 1: '&5聲望 X &f冒險者菜鳥' + Prestige 10 rank 1 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠ' + Prestige 10 rank 2: '&5聲望 X &f冒險者新人' + Prestige 10 rank 2 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠ' + Prestige 10 rank 3: '&5聲望 X &f見習冒險者' + Prestige 10 rank 3 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠⅠ' + Prestige 10 rank 4: '&5聲望 X &2冒險者' + Prestige 10 rank 4 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅤ' + Prestige 10 rank 5: '&5聲望 X &2有經驗冒險者' + Prestige 10 rank 5 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤ' + Prestige 10 rank 6: '&5聲望 X &2熟練冒險者' + Prestige 10 rank 6 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠ' + Prestige 10 rank 7: '&5聲望 X &1老鳥冒險者' + Prestige 10 rank 7 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠ' + Prestige 10 rank 8: '&5聲望 X &1精英冒險者' + Prestige 10 rank 8 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠⅠ' + Prestige 10 rank 9: '&5聲望 X &5老練冒險者' + Prestige 10 rank 9 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅩ' + Prestige 10 rank 10 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩ' + Prestige 10 rank 10: '&5聲望 X &5歷戰冒險者' + Prestige 10 rank 11: '&5聲望 X &5傳奇冒險者' + Prestige 10 rank 11 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠ' + Prestige 10 rank 12: '&5聲望 X &5神話級冒險者' + Prestige 10 rank 12 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅠ' + Prestige 10 rank 13: '&5聲望 X &5不朽者' + Prestige 10 rank 13 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅠⅠ' + Prestige 10 rank 14: '&5聲望 X &5天選者' + Prestige 10 rank 14 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅤ' + Prestige 10 rank 15: '&5聲望 X &5晉升者' + Prestige 10 rank 15 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤ' + Prestige 10 rank 16: '&5聲望 X &5泰坦' + Prestige 10 rank 16 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠ' + Prestige 10 rank 17: '&5聲望 X &5半神' + Prestige 10 rank 17 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠⅠ' + Prestige 10 rank 18: '&5聲望 X &5神' + Prestige 10 rank 18 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 10 rank 19: '&5聲望 X &5獵神者' + Prestige 10 rank 19 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅩ' + Prestige 10 rank 20: '&5聲望 X &5弒神者' + Prestige 10 rank 20 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅩ' + lootLimiterMessage: '&7[EM] &c你需要回去冒險者大廳,來解開下一階公會階級,即可獲得更好的戰利品!' + prestigeUnlockMessageTitle: '$player' + prestigeUnlockMessageSubtitle: '&2已解鎖 $tier&2 !' +buy_or_sell_menu: + Shop name: '[EM] 購買 或 賣出' +custom_quest_screen: + headerTextLines2: | + &a&l『&c&l$questName&a&l』 + acceptTextLines: '&a&l[接受!]' + acceptHoverLines: "&a點擊 \n&a接受任務!" + acceptedTextLines: '&c&l[放棄!] &a如要繳交此任務請找 $npcName ' + acceptedHoverLines: '&a點擊放棄任務!' + trackTextLines: '&2&l[追蹤]' + trackHoverLines: '&a點擊追蹤任務!' + untrackTextLines: '&4&l[取消追蹤]' + untrackHoverLines: '&c點擊取消追蹤任務!' + completedTextLines: '&2&l[回報!]' + completedHoverLines: '&a點擊繳交任務!' + turnedInTextLines: '&8[完成!]' + turnedInHoverLines: '&8已經回報完成!' + objectivesLine: '&c&l目標:' + killQuestDefaultSummaryLine: '&c➤擊殺 $name:$color$current&0/$color$target' + fetchQuestDefaultSummaryLine: '&c➤得到 $name:$color&$current&0/$color$target' + dialogQuestDefaultSummaryLine: '&c➤與目標談話 $name $location' + rewardsLine: '&2&l獎勵:' + rewardsDefaultSummaryLine: '&2➤$amountx $rewardName &8($chance%)' +custom_shop_menu: + Shop name: '[EM] 自訂商店' + Full inventory message: '[EliteMobs] &4背包已滿! 無法購買物品,請整理背包。' +dynamic_quest_screen: + questName: 殺死 $amount $name + headerTextLines2: |- + &c&l公會要求 + &0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ + defaultLoreTextLines: '&8擊殺 $amount $name!' + acceptTextLines: '&a&l接受!' + acceptHoverLines: "&a點擊 \n&a接受任務!" + acceptedTextLines: '&c&l放棄!' + acceptedHoverLines: '&a點擊放棄任務!' + completedTextLines: '&2&l[回報!]' + completedHoverLines: '&a點擊繳交任務!' + turnedInTextLines: '&8[完成!]' + turnedInHoverLines: '&8已經繳交了!' + objectivesLine: '&c&l目標:' + killQuestDefaultSummaryLine: '&c➤擊殺 $name:$color$current&0/$color$target' + rewardsLine: '&2&l獎勵:' + rewardsDefaultSummaryLine: '&2➤$amountx $rewardName &8($chance%)' +enhancement_menu: + shopName: '[EM] 強化選單!' +get_loot_menu: + Menu name: '[EM] 戰利品清單' + tierTranslation: 等級 + itemFilterTranslation: 依據等級過濾物品 +guild_rank_selector_menu: + questTierSelectorMenuTitle: '[EM] 選擇公會階級' + lowTierWarning: '&c精英不會掉落更好的戰利品!' + normalTierWarning: '&a精英會掉落更好的戰利品!' + notEnoughCurrencyMessages: '&7[EliteMobs] &4你沒有足夠的精英幣 ($neededAmount $currencyName)! 目前餘額 $currentAmount $currencyName。' + unlockMessages: "&7[EliteMobs] &a你解鎖了 $rankName &a階級於 $price $currencyName,&6祝你狩獵愉快!" + questCompleteBroadcastMessages: '&7[EliteMobs] &a$player &a升級到 &a 公會階級 - $rankName!' + failedMessages: '&7[EliteMobs] &c你必需先解鎖其他公會階級!' + spawnRateModifierMessages: '&f精英怪物生成率修正: &c$modifier%' + lootModifierMessages: '&f精英怪物戰利品修正: &a$modifier%' + difficultyModifierMessages: '&f精英怪物難度修正: &c$modifier%' + lootTierMessages: '&2精英可以掉落層級為 $tier 的戰利品!' + currencyBonusMessages: '&a增加$amountx 從掉落或任務取得的精英幣!' + healthBonusMessages: '&c增加 $amount ❤ 最大生命值' + critBonusMessages: '&e增加 $amount% 暴擊率' + dodgeBonusMessages: '&8增加 $amount% 閃避率' +player_status_screen: + indexTexts0: '&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + indexTexts1: '&5&l/ag &7- &6冒險者大廳' + indexHovers1: |- + 點此使用 + 你可以在這裡找到 + 給予任務, 購買 + 和賣出物品的NPC + indexTexts2: '&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + indexTexts4: '&6&l索引' + indexTexts6: '&bp. $statsPage &8- &6屬性' + indexHovers6: 點此前往! + indexTexts7: '&bp. $gearPage &8- &6裝備' + indexHovers7: 點此前往! + indexTexts8: '&bp. $teleportsPage &8- &6傳送' + indexHovers8: 點此前往! + indexTexts9: '&bp. $commandsPage &8- &6指令' + indexHovers9: 點此前往! + indexTexts10: '&bp. $questsPage &8- &6任務追蹤' + indexHovers10: 點此前往! + indexTexts11: '&bp. $bossTrackingPage &8- &6首領追蹤' + indexHovers11: 點此前往! + statsText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + statsText1: '&5&l玩家屬性:' + statsText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + statsText4: '&2精英幣: &a$money' + statsHover4: |- + 擊殺精英怪可以獲得精英幣 + 或在 /em shop 中賣出它們的戰利品 + 也可以在 /em quest 選擇完成任務! + statsText6: '&6公會階級: &3$guildtier' + statsHover6: |- + 聲望階級 與 公會階級: + 公會階級決定你可以獲得的戰利品等級, 聲望階級可以給你額外獎勵, + 例如血量上限、暴擊率和閃避率、以及增加額外精英幣掉落等 + 你可以輸入/ag升級你的聲望和公會階級 + ⚜ = 聲望階級, ✧ = 公會階級 + statsText7: '&4精英怪擊殺: &c$kills' + statsHover7: 殺死精英怪的數量. + statsText8: '&4最高殺死過的等級: &c$highestkill' + statsHover8: |- + 在所有擊殺的精英怪中,等級最高的, + 而精英怪生成等級取決於威脅等級, + 威脅等級越高,就會生成對應等級的精英怪! + 註記: 僅列入非爆炸性殺死的數量! + statsText9: '&4精英怪死亡: &c$deaths' + statsHover9: 計算殺死的精英怪數量。 + statsText10: '&5任務完成數量: &d$quests' + statsHover10: |- + 已完成的 EliteMobs 任務數量。 + 您可以通過與 NPC 交談來接受任務! + statsText12: '&b分數: &3$score' + statsHover12: |- + 你的 EM 分數。 + 根據你擊殺精英怪數量, + 以及死於精英怪的次數來判斷, + 更高等級的精英怪可獲得更多分數。 + gearText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + gearText1: '&7&l護甲 & 武器:' + gearText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + gearText3: '&8&l裝備等級:' + gearText4: ' ☠ - $helmettier' + gearHover4: '$helmet' + gearText5: ' ▼ - $chestplatetier' + gearHover5: '$chestplate' + gearText6: ' Π - $leggingstier' + gearHover6: '$leggings' + gearText7: ' ╯╰ - $bootstier' + gearHover7: '$boots' + gearText8: '{⚔ - $mainhandtier} {⛨ - $offhandtier}' + gearHover8: '{$mainhand}{$offhand}' + gearText10: '{dmg : $damage} {armr: $armor}' + gearHover10: '{Base damage dealt to Elite Mobs}{Damage reduction from Elite Mobs}' + gearText11: '威脅等級: $threat' + gearHover11: | + 威脅等級越高, + 在周圍生成的精英怪等級越高。 + 裝備、公會、聲望皆會影響 + teleportText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + teleportText1: '&2&l傳送點' + teleportText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + teleportText3: 重生點 + teleportHover3: 傳送至重生點! + teleportText4: '&6&l冒險者大廳' + teleportHover4: 傳送至冒險者公會大廳 + onTeleportsHover: 點此傳送! + commandsText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + commandsText1: '&3&l指令:' + commandsText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + commandsText4: '&5/ag' + commandsHover4: |- + 點此使用 + 可以從這到達其他世界 + 也可在此接取任務、強化、買賣 + 甚至與他人在競技場對戰 + commandsText6: '&5/shareitem' + commandsHover6: |- + 點此使用 + 將你手上的物品 + 展示於聊天欄中 + questTrackerText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + questTrackerText1: '&6&l任務:' + questTrackerHover1: 與 NPC 交談接受任務! + questTrackerText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + onQuestTrackHover: 點此放棄! + bossTrackerText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + bossTrackerText1: '&4&lBoss追蹤器:' + bossTrackerHover1: Boss級怪物都會顯示在此! + bossTrackerText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + onBossTrackHover: 點此進行追蹤/取消追蹤! + teleportChestMenuName: '&2EliteMobs 傳送' + bossTrackerChestMenuName: '&2EliteMobs Boss追蹤' + indexChestMenuName: '&2EliteMobs 屬性' + gearChestMenuName: '&2EliteMobs 裝備' + statsChestMenuName: '&2EliteMobs 統計數據' + commandsChestMenuName: '&2EliteMobs 命令列表' +procedural_shop_menu: + Shop name: '[EM] 程序生成物品商店' + Full inventory message: '&7[EliteMobs] &4你物品欄已滿! 你無法購買任何物品,請先清出空間.' +quest_menu: + menuName: '[EM] 任務選擇' + cancelQuestMessage1: '&c&l&m&o---------------------------------------------&c你一次只能進行一個任務! 取消進行中的任務會使任務進度重置!' + cancelQuestMessage2: '&2[點此來取消目前的任務!]' + cancelQuestMessage3: '&7你可以使用指令來看你任務的狀態&a/em quest status&c&l&m&o---------------------------------------------' + questCancelMessage: '&7[EliteMobs] &c已取消你進行中的任務!' + questStartTitle: 你成功接受了一個任務! + questStartSubtitle: 殺死 $objectiveAmount $objectiveName + questCompleteTitle: 任務完成! + questCompleteSubtitle: 你已經殺死 $objectiveAmount $objectiveName + bossBarObjective: 殺死 $objectiveAmount $objectiveName + questRewardMessage: '&7[EM] &a任務完成! &6你的獎勵是 &2$reward $currencyName' + questCompleteBroadcastMessage: '&7[EM] $player &2已經完成一個 $rank &2任務!' + questStartBroadcastMessage: '&7[EM] $player &2已接受了一個 $rank &2任務!' + questStatusMessage: '&7[EM] &a你已經擊殺 &a$currentAmount &f/ &c$objectiveAmount &a$objectiveName' +refiner_menu: + shopName: '[EM] 放置 10 廢料!' +repair_menu: + shopName: '[EM] 維修選單!' +scrapper_menu: + shopName: '[EM] 資訊欄位' +sell_menu: + shopName: '[EM] 售出商店' +smelt_menu: + shopName: '[EM] 放置 25 廢料!' +unbind_menu: + shopName: '[EM] 解綁選單!' +taunt: + onDamaged: + - 噢! + - 噢! + - 住手! + - 為什麼?! + - 像鬥牛場的鬥牛士般戰鬥著! + - 你真的很煩! + - 預備! 開始! + - 作弊了吧! + - 你傷害不了我的! + - 你的攻擊只會讓我變得更強! + - 棍棒和石頭... + - '只是小傷口而已!' + - 護駕!護駕! + - Herobrine, 救我! + - 你後面! 苦力怕! + - 我做了一個糟糕的錯誤 + - 什麼都無法對我產生傷害... + - 殭屍的陰影 + - 讓你看看我真正的力量! + - 準備面對我的必殺技! + - 我的援兵到了! + - 你會為此付出代價的! + - 這將會留下傷疤! + - 以牙還牙! + - 健保會幫我付的 + - 我的直覺是對的 + - '小傷而已' + - 那是什麼? 抓癢? + - 你永遠都不可能打敗我 + - 可悲 + - 脆弱 + - 這甚至無法使我的鎧甲凹陷! + - 輕輕鬆鬆 + - 我的孫子們會覺得.... + - 你是在抓癢嗎? + - 管理員幫我治療了 + - 駭客! + - 我?受害?***! + - 我是無法被打倒的! + - 好傢伙,我正在使用外掛! + - 小心! Herobrine 在你後面! + - 我為艾爾而生! + - 你的家正在被破壞! + - 為甚麼我們不能當朋友? + - 英靈殿 + - Notch 救我! + - 不能撤退! + - 讓我看看你最厲害的攻擊吧! + onDamagedByBow: + - 跟我戰鬥! 像個玩家! + - 擔心太靠近我嗎? + - 我從這裏可以聞到你的恐懼! + - 你是不是忘記了你的劍? + - 懦夫! 用弓不公平! + - 弓? 那是2011的事了... + - 弓是為弱者準備的! + - 弓是給軟弱靈魂使用的! + - 弓是內心脆弱的人用的! + - 我認為我們應該同意不用弓! + - 弓? 你會後悔的 + - 噢! + - 噢! + - 住手! + - 為什麼?! + - 像鬥牛場的鬥牛士般戰鬥著! + - 你真的很煩! + - 預備! 開始! + - 作弊了吧! + - 你傷害不了我的! + - 你的攻擊只會讓我變得更強! + - 棍棒和石頭... + - '只是小傷口而已!' + - 護駕!護駕! + - Herobrine, 救我! + - 你後面! 苦力怕! + - 我做了一個糟糕的錯誤 + - 什麼都無法對我產生傷害... + - 殭屍的陰影 + - 讓你看看我真正的力量! + - 準備面對我的必殺技! + - 我的援兵到了! + - 你會為此付出代價的! + - 這將會留下傷疤! + - 以牙還牙! + - 健保會幫我付的 + - 我的直覺是對的 + - '小傷而已' + - 那是什麼? 抓癢? + - 你永遠都不可能打敗我 + - 可悲 + - 脆弱 + - 這甚至無法使我的鎧甲凹陷! + - 輕輕鬆鬆 + - 我的孫子們會覺得.... + - 你是在抓癢嗎? + - 管理員幫我治療了 + - 駭客! + - 我?受害?***! + - 我是無法被打倒的! + - 好傢伙,我正在使用外掛! + - 小心! Herobrine 在你後面! + - 我為艾爾而生! + - 你的家正在被破壞! + - 為甚麼我們不能當朋友? + - 英靈殿 + - Notch 救我! + - 不能撤退! + - 讓我看看你最厲害的攻擊吧! + onDamage: + - 致命一擊! + - 他射門,和他得分! + - 早上你會感覺到的! + - 快勝利了! + - 勝利將屬於我的! + - 我還沒出全力呢! + - 你惹錯人了! + - 你惹到了一個怪物! + - 準備被圍毆吧! + - 惹到我是嚴重的錯誤,也是你人生最後一個錯誤! + - 再努力點! + - John Cena + - 你怎麼還有辦法站著? + - 早點放棄吧! + - 放棄! + - 我在高處屹立不搖! + - 我會終結你! + - 希望你已經準備好迎接痛苦! + - 獵人變成了獵物! + - 血之寶座之血! + - 骷髏王座的骷髏! + - 一個好玩家是一個死去的玩家! + - 混帳! + - 讚美太陽! + - 末日近在咫尺! + - 你還沒準備好. + - Zug zug! 工作! 工作! + - 幾乎不值得我花時間! + - 我以為這是一個挑戰? + - '專業提示:不要被擊中' + - Ima firin mah lazer bwooooooooo + - 為了國王! + - Herobrine 會很高興的! + - 這就是你的結局! + - 你是在抓癢嗎? + - 弱小的人類! + - 可悲 + - 也許這會使你清醒。 + - 這只是開始! + - 戰鬥才剛剛開始! + - 只不過在熱身罷了! + - 你完全不是我的對手! + - 摔角選手RKO突然出現! + - 我可以整個晚上都保持這樣的水平! + - 是個很棒的出氣筒! + - 我是黑暗! + - 我想知道什麼會先壞 + - 為史蒂夫報仇! 你這怪物! + - 加入幫派! + - 太簡單了,太簡單了! + - 太簡單了! + - 你不可能戰勝我的! + - 皮卡chuuuuuu + - Avada kedavra! (不赦咒) + - Crucio! (咒咒虐!) + - Jierda! + - 擊中要害! + - 這就是技能的樣子! + - 9001傷害! + - 還站著? + - 直面恐懼 + - 痛苦的滋味來了! + - 我會讓你處於危險之中! + onDeath: + - 唉,可憐的約瑞科! + - 剩下的就是沉默 + - 我應該回來 + - 無法原諒! + - 我活下來了, 又死了, 我又活下來了! + - 見證我 + - 我騎車去valhalla! + - VALHALLA! + - VALHALLA! DELIVERANCE + - 這次你贏了 + - 你的土地正面臨一場災難! + - 你身上長了痘痘! + - 你很快就會加入我的行列! + - 這還沒有結束 + - 死亡只是挫折 + - 不是這樣的... + - 我只是想去太空 + - 我們本來可以成為朋友 + - 你的罪孽爬附到了身後 + - 再聯絡。 + - 回頭見。 + - 我會在這裡等你的。 + - 我會報仇的! + - 我不會溫柔地走進黑夜 + - 應該買壽險 + - 這是我工作的最後一天 + - 這是我在這裡的最後一天 + - 還有你嗎,布魯圖? + - RIP + - x.x + - (x.x) + - xox + - 暈倒 + - GG, WP + - GG + - WP + - GG no RE + - HAX + - 黑客 + - 不公平,我落後了 + - 這次你贏了 + - 你這隻怪物…… + - 庸才... + onTarget: + - 給我過來! + - 我看到了什麼? 懦夫? + - 先生,準備好你的拳頭! + - 讓我們像原始人一樣解決問題! + - 衛兵! + - 小心,你背後有苦力怕! + - 你這個醜陋的傢伙! + - 你看起來很美味。 + - 以備不時之需! + - 讓一個靠刷流量的人獲勝! + - SPARTAAAAAA + - 我的等級其實有9001等! + - 不是精英怪物 + - 偽裝很糟的精英怪物 + - 啊,新鮮的獵物! + - 獵人變成了獵物! + - 殺死我會讓伺服器崩潰! + - 我其實是一個偽裝的玩家! + - 我不會掉落任何戰利品! + - 為甚麼我們不能當朋友? + - Sssssss + - 這是我工作的最後一天! + - 他們看上去像是石像一般! + - 準備死亡! + - 讚美太陽! + - 混帳 + - 骰子已被擲下! + - 坐而言不如起而行! + - 骷髏王座的骷髏! + - 血之寶座之血! + - 為Herobrine獻祭! + - 我的鑽頭…是突破天際的鑽頭啊! + - 你以為我是誰!? + - 弱小的人類! 他是我的。 + - 這弱者的性命我要了! + - 召喚選手! + - 決一死戰! + - 我像你提出挑戰! + - 皮卡 皮卡! + - 你剛是叫我地獄火嗎? + - 你剛才叫我什麼? + - 我知道你做了什麼,你這個怪物! + - 你的故事就這樣結束了! + - 以備不時之需! + - 我一直在為此做準備! + - 我準備好了。 你呢? + - 一個當之無愧的敵人! + - 一個當之無愧的對手! + - 一個新手! 今天真幸運! + - 你的東西或你的生活! + - 這是搶劫! + - 是你! 你這怪物! + - 好餓,把你的肉給我! + - 他在那! + - 這肯定只是個夢 + - 嗨,我是 Meeseeks 先生! + - 我是 Meeseeks 先生,看著我! + - 你的鑽石或你的生活! + - 為了國王和國家! + - 讓我看看你最厲害的攻擊吧! + - 見證我! + - 見證我! 血袋! + - 我將前往閃亮的鉻路! +zombie_friends: + friend1Name: 'BFF #1' + friend2Name: 'BFF #2' + friendDeathMessage: + - 不~ + - 庸才! + - Zacharias! + - 他死的更透徹了! + - 復仇! + - 報仇! + - 難以相信你這麼幹了! + originalEntityDialog: + - 讓我們開始 殭屍世界吧! + - 感受友誼的力量吧! + - 同伴們, 團結起來! + - 我要呼喚我的朋友們! + - BFF power! + - 我為人人! + - 逮住他! + - 去你們的, 我要回家! + reinforcementDialog: + - 別壞了我們的友誼! + - 我們會幫助你, 扎克! + - 增援到來! + - 我為人人, 人人為我! + - 這也太簡單了! + - 放棄吧, 我們有高地優勢! + - 你想走哪, 老兄? + - 世界之星! + - 你想對我們的朋友做什麼 + - 感受友誼的力量吧! + - 友情力量 100%! + - 集合吧, 殭屍們! + - 我們會掩護你, 同伴! + - 團結就是力量! + - 多多益善! + - 我來支援你, 家人! + - 人人為我! +zombie_necronomicon: + summoningChant: 也不是可以想像的...人要麼是地球上最年長或最後的主人,要麼是普通的大部分生命和物質獨自行走。舊者曾經是,舊者是,舊者應該是。不是在我們所知道的空間里,而是在他們之間,他們走得平靜而原始,沒有維度,對我們來說是看不見的。Yog-Sothoth知道大門。Yog-Sothoth(克蘇魯神話)是門。Yog Sothoth是大門的鑰匙和守護者。過去,現在,未來,在Yog-Sothoth都是一體的。他知道舊者在哪裡突破了舊,他們又要在哪裡突破。他知道他們踩在地上,他們仍然踩在地上,為什麼沒有人能看到他們踩在地上。通過他們的氣味,人有時可以知道他們近在咫尺,但是他們的表像卻沒有人知道,只拯救他們生在人類身上的那些特徵。其中有很多種,從人類最真實的eidolon到沒有視覺或物質的形狀,它們的相似性不同。他們在寂寞的地方行走,看不見,犯規,在那裡,話語已經說出來,儀式在他們的季節裡嚎叫。風用他們的聲音咆哮,大地用他們的意識喃喃自語。他們彎曲森林,壓垮城市,但森林或城市可能看不到那隻手。寒冷的廢墟中的卡達斯認識他們,又有誰認識卡達斯呢?南方的冰漠和沉沒的海洋小島擁有石頭,他們的印章是雕刻師,但誰見過深凍的城市或長長的海藻和藤壺花環的密封塔?偉大的克蘇魯是他們的表弟,但他只能模糊地監視他們。哎呀!Shub-Niggurath!你們必認識他們,如同污穢。他們的手在你們的喉嚨上,你們卻看不見他們。他們的居住地甚至與你守衛的門檻有關。Yog-Sothoth是大門的鑰匙,球體在這裡相遇。人現在統治他們曾經統治過的地方;他們很快就會統治人現在統治的地方。夏天之後是冬天,冬天之後是夏天。他們耐心而有力地等待著,因為他們將在這裡再次作王。 +zombie_parents: + deathMessage: + - 你這個禽獸! + - 我的寶貝! + - 你都幹了些什麼!? + - 報仇! + - 不!!!! + - 你會為此付出代價的! + - 呃,其實他只不過是我領養來的 + - 他又再次死了! + - 他死的更透徹了! + - 你傷到他了! + bossEntityDialog: + - 你居然羞辱我! + - 他在霸凌我! + - 他就是那個找我麻煩的傢伙! + - 我自己就可以搞定! + - 滾開,我自己能搞定! + - 別再追著我! + - 老天,這實在太過屈辱了! + - 他搶走了我的生活費! + - 他在霸凌我! + zombieDad: + - 走開,別靠近我的孩子! + - 證明自己吧,孩子! + - 我可以獨自搞定他! + - 別來找我孩子的麻煩! + - 爲什麼你要這麼做!? + - 我絕對會向你父母告狀! + - 你走吧孩子! + - 讓他知道誰才是這裏的老大! + - 打得好,孩子! + zombieMom: + - 放開我的孩子! + - 親愛的,你傷著了嗎? + - 親愛的,他傷到你了嗎? + - 親愛的,我來看看你的傷... + - 我絕對會向你父母告狀! + - 親愛的,你忘了帶上你的外套了! + - 擺個姿勢吧,親愛的! + - 粉碎它! + - 停下! + - 你把垃圾拿去丟了嗎? +elite_blaze: + name: '&fLvl &2$level &f精英 &e烈燄神' + deathMessages: + - '$player 被&c $entity 燒成灰燼!' +elite_cave_spider: + name: '&fLvl &2$level &f精英 &3洞穴蜘蛛' + deathMessages: + - '$player &c掉落在$entity 的 &c網子裡被享用掉了!' +elite_creeper: + name: '&fLvl &2$level &f精英 &2苦力怕' + deathMessages: + - '$player &c被 $entity 給炸飛了!' + - '$entity &c發出一道強烈的光芒中將 $player&c炸死!' +elite_drowned: + name: '&fLvl &2$level &f精英 &3沉屍' + deathMessages: + - '$player &c慘被y $entity 給打包帶進深淵了!' + - '$player &c被 $entity 給淹死了!' +elite_elder_guardian: + name: '&fLvl &2$level &f精英 &3遠古深海守衛' + deathMessages: + - '$entity &c阻止了 $player &c繼續探索深海!' +elite_guardian: + name: '&fLvl &2$level &f精英 &3深海守衛' + deathMessages: + - '$entity &c阻止了 $player &c繼續探索深海!' +elite_enderman: + name: '&fLvl &2$level &f精英 &5終界使者' + deathMessages: + - '$entity &c把 $player &c送進虛空裡!' + - '$player &勇於直視 $entity &c而被拍死!' + - '$player &c和 $entity &c成為了最好的朋友!' +elitemob_endermite: + name: '&fLvl &2$level &f精英 &7終界蟎' + deathMessages: + - '$entity &c對著 $player &c進行一場如歌利亞史詩般的戰鬥!' +elite_evoker: + name: '&fLvl &2$level &f精英 &5喚魔者' + deathMessages: + - '$player &c被 $entity&c魔法殺死!' +elite_husk: + name: '&fLvl &2$level &f精英 &7屍殼' + deathMessages: + - '$player &c被 $entity&c掏空身體!' +elite_illusioner: + name: '&fLvl &2$level &f精英 &8幻術師' + deathMessages: + - '$player&c 掉入了 $entity &c的幻覺中!' +elite_iron_golem: + name: '&fLvl &2$level &f精英 &f鐵魔像' + deathMessages: + - '$player &c惹到 $entity&c而被拍成肉泥!' + - '$player &c被 $entity&c以拳相交!' +elite_phantom: + name: '&fLvl &2$level &f精英 &9夜魅' + deathMessages: + - '$player &c因為 $entity&c而睡不好床!' + - '$player &c將因為 $entity&c而做個夢魘!' + - '$entity &c教導了 $player &c睡眠的重要性!' +elite_pillager: + name: '&fLvl &2$level &f精英 &8掠奪者' + deathMessages: + - '$entity &c掠劫了 $player&c!' + - '$entity &c掠奪了 $player&c!' +elite_polar_bear: + name: '&fLvl &2$level &f精英 &f北極熊' + deathMessages: + - '$player &c慘死在 $entity&c的熊爪下!' + - '$player &c的身軀被 $entity&c抓成殘缺不全!' +elite_ravager: + name: '&fLvl &2$level &f精英 &6劫毀獸' + deathMessages: + - '$entity &cs展現了 $player &c在被衝撞的下場!' +elite_silverfish: + name: '&fLvl &2$level &f精英 &7蠹魚' + deathMessages: + - '$player &c錯認 $entity &c為石頭方塊!' +elite_skeleton: + name: '&fLvl &2$level &f精英 &f骷髏' + deathMessages: + - '$player &c被 $entity''s &c射成刺蝟!' + - '$entity &c想要看見 $player的 &c骨頭!' +elite_spider: + name: '&fLvl &2$level &f精英 &7蜘蛛' + deathMessages: + - '$player &c掉落在$entity 的 &c網子裡被享用掉了!' + - '$entity &c把 $player&c吞下肚!' +elite_stray: + name: '&fLvl &2$level &f精英 &b流髑' + deathMessages: + - '$player &c被 $entity&c 引到迷途川上!' +elite_vex: + name: '&fLvl &2$level &f精英 &b惱鬼' + deathMessages: + - '$entity &c讓 $player&c 陷入煩惱而死!' +elite_vindicator: + name: '&fLvl &2$level &f精英 &8衛道士' + deathMessages: + - '$entity &c向 $player&c證明了自己的武道!' +elite_witch: + name: '&fLvl &2$level &f精英 &5女巫' + deathMessages: + - '$player &c成為了 $entity''s &c實驗對象!' + - '$player &c被 $entity&c 給魅惑了!' +elite_wither_skeleton: + name: '&fLvl &2$level &f精英 &8凋零骷髏' + deathMessages: + - '$entity&c 讓 $player&c 凋零了!' + - '$entity &c使 $player &c變得迅速腐敗!' +elite_zombie: + name: '&fLvl &2$level &f精英 &2殭屍' + deathMessages: + - '$player &c慘被 $entity&c 掏空內臟!' + - '$entity &c將 $player 的 &c腦子給拿走了!' +elite_ghast: + name: '&fLvl &2$level &f精英 &f地獄幽靈' + deathMessages: + - '$player &c無法閃避 $entity&c &c的火球!' + - '$player &c被 $entity&c炸死化成位元!' + - '$entity &c得到了 $player的s &c培根!' +elite_wolf: + name: '[$level] 精英 狼' + deathMessages: + - '$entity 把 $player 撕碎了!' + - '$player 葬生在 $entity 利牙下!' +elite_ender_dragon: + name: '&fLvl &2$level &f精英 &5終界龍' + deathMessages: + - '$entity &c終結了 $player!' +elite_shulker: + name: '&fLvl &2$level &f精英 &5界伏蚌' + deathMessages: + - '$entity &c幫助 $player &c飛高高!' +super_chicken: + name: '&2超級 雞' +super_cow: + name: '&2超級 牛' +super_mushroom_cow: + name: '&2超級 哞菇' +super_pig: + name: '&d超級 豬' +super_sheep: + name: 超級 綿羊 +elite_killer_bunny: + name: '&fLvl &2$level &f精英 &c殺手兔' + deathMessages: + - '$entity &c將 $player &c丟至冰天雪地中!' + - '$entity &c使用木棍而不是胡蘿蔔,教育了 $player!' +elite_llama: + name: '&fLvl &2$level &f精英 &5駱駝' + deathMessages: + - '$player &c 被 $entity&c吐了滿身都是!' + - '$player &c做了讓 $entity&c 生氣的事情!' +elite_warden: + name: '&f等級 &2$level &f精英 &3伏守者' + deathMessages: + - '$entity &c感應到 $player &c在附近!' +elite_goat: + name: '&fLvl &2$level &f精英 &5山羊' + deathMessages: + - '$player &c被 $entity&c快速衝撞!' + - '$player &c被 $entity&c泰山壓頂!' + - '$player &c被 $entity&c 踩踏!' + - '$player &c得到 $entity&c 號角!' +elite_zombified_piglin: + name: '&fLvl &2$level &f精英 &6殭屍化豬布林' + deathMessages: + - '$player &c慘被 $entity&c 圍攻至死!' + - '$entity &c得到了 $player的s &c培根!' +elite_zoglin: + name: '&fLvl &2$level &f精英 &d豬屍獸' + deathMessages: + - '$player &c被 $entity &c一陣衝撞掛在角上死去!' + - '$entity &c得到了 $player的s &c培根!' +elite_piglin: + name: '&fLvl &2$level &f精英 &e豬布林' + deathMessages: + - '$entity &c將 $player 的遺體拿去賣了個好價錢!' + - '$entity &c教懂 $player &c黃金的價值!' +elite_hoglin: + name: '&fLvl &2$level &f精英 &d豬布獸' + deathMessages: + - '$player &c被 $entity &c一陣衝撞掛在角上死去!' + - '$entity &c得到了 $player的s &c培根!' +elite_piglin_brute: + name: '&fLvl &2$level &f精英 &c豬布林蠻兵' + deathMessages: + - '$entity &c嫩化了 $player!' + - '$entity &c殘害了 $player!' +elite_bee: + name: '&fLvl &2$level &f精英 &e蜜蜂' + deathMessages: + - '$player&c被$entity螫死了!' +MobCombatSettings: + bossLocationMessage: '&7[EM] &2[點此進行追蹤!]' + bossKillParticipationMessage: '&e你的總傷害: &2$playerDamage' + defaultOtherWorldBossLocationMessage: '$name: 在不同的世界!' + weakText: '&9&l虛弱!' + resistText: '&c&免疫!' + fullHealMessage: '&2滿血!' +check_tier: + message1: '&7[EM] 你的聲望階級為 $tier' + message2: '&7[EM] 你的公會階級獎勵是 $tier' + message3: '&7[EM] &a你的總威脅等級是 $tier' +check_tier_others: + message1: '&7[EM] $player 的聲望階級為 $tier' + message2: '&7[EM] $player 的公會階級獎勵為 $tier' + message3: '&7[EM] &a$player 的總威脅層級為 $tier' +ScrapItemSettings: + scrapItemName: '&2等級 $level 廢料' + scrapItemLore: + - '&a收集 25 塊相同等級的廢料' + - '&a可以交換 1 個升級寶珠!' + - '&a你也可以使用廢料來修復' + - '&a物品或用來合成更高等級廢料!' + - '&2可以在冒險者公會大廳來進行!' + upgradeItemName: '&2等級 $level 升級寶珠' + upgradeItemLore: + - '&a在強化師NPC那使用進行升級' + - '&a物品等級可升為 $orbLevel!' +Quests: + questJoinMessage: '&a你已經接受了任務 $questName &a!' + questLeaveMessage: '&c你已經放棄了任務 $questName &c!' + questCompleteMessage: '&2你已完成任務 $questName &2!' + leaveWhenNoActiveQuestsExist: '&c您目前沒有任務!' + questLeaveConfirmationMessage: '&c你確定要放棄你現在的任務嗎?輸入 &a/em confirm &c 確認!' + questStartTitle: '&a接受任務!' + questCompleteTitle: '&2任務完成!' + questLeaveTitle: '&c放棄任務!' + killQuestChatProgressionMessage: '&8[EliteMobs]&c➤擊殺 $name:$color$current&0/$color$target' + fetchQuestChatProgressionMessage: '&8[EliteMobs]&c➤得到 $name:$color$current&0/$color$target' + dialogQuestChatProgressionMessage: '&8[EliteMobs]&c➤與目標交談 $name:$color$current&0/$color$target' + questCapMessage: '&8[EliteMobs] &c您已達到最大任務數(10)! &4如果您想獲得更多任務,請放棄或完成至少一個任務!' + killQuestScoreboardProgressionMessage: '&c➤擊殺 $name:$color$current&0/$color$target' + fetchQuestScoreboardProgressionMessage: '&c➤得到 $name:$color$current&0/$color$target' + dialogQuestScoreboardProgressionMessage: '&c➤與目標交談 $name:$color$current&0/$color$target' + chatTrackMessage: '&8[EliteMobs]&2 點擊這裡追蹤你的任務!' + chatTrackHover: '&2點此進行追蹤!' + chatTrackingMessage: '&8[EliteMobs]&9 你正在追蹤一個任務!' + chatTrackingHover: '&2點擊取消追蹤/track! 輸入/em -> 追蹤不同任務的任務!' + noQuestDestinationFound: '[EM] 沒有找到任務目的地!' + questDestinationInOtherWorld: '[EM] 前往 $world!' + questAlreadyCompletedMessage: '&8[EliteMobs] &c你已經完成了這個任務!' + questPrerequisitesMissingMessage: '&8[EliteMobs] &c還無法接取這個任務!' + lowRankDynamicQuestWarning: '&8[EliteMobs] &c你現在的公會階級不能接這些任務!提高您的公會階級以接受這些任務。' + questTurnInObjective: '&a2與 $npcName 交談' +Wormholes: + dungeonNotInstalledMessage: '&8[EliteMobs] &c地牢 $dungeonID &c沒有安裝!傳送不起作用。' + defaultPortalMissingMessage: '&8[EliteMobs] &c這個傳送們似乎沒有用處!' +Arenas: + notEnoughPlayersMessage: '&8[EliteMobs] &c您至少需要 $amount 才能開始比賽!' + startingMessage: '&2開始!' + startingSubtitle: '&2在 $count...' + arenaFullMessage: '&4[EliteMobs] &c競技場人數已達上限!' + arenasOngoingMessage: '&4[EliteMobs] &c競技場正在進行戰鬥,無法中途加入,請耐心等待。' + arenaStartHintMessage: '&2[EliteMobs] &a你可以輸入 &2/em start 開始' + arenaQuitHintMessage: '&4[EliteMobs] &c你可以輸入 &4/em quit 離開' + arenaJoinPlayerMessage: "&2[EliteMobs] &a可輸入 &2/em start &2開始,場內目前有 &2$count &a玩家!\n在開始前可輸入 &c/em quit &2離開" + arenaJoinSpectatorMessage: '&2[EliteMobs] &a您可以隨時使用 &2/em quit 離開' + waveTitle: '&aWave &2$wave' + victoryTitle: '&2勝利!' + victorySubtitle: '&a完成 &2$wave &awaves!' + defeatTitle: '&4戰敗!' + defeatSubtitle: '&cReached wave &4$wave&c!' + victoryBroadcast: 競技場 $arenaName 被征服 $players 征服! + joinPlayerTitle: '&a輸入 &2/em start &a 開始!' + joinPlayerSubtitle: '&c輸入 &4/em quit &c 離開!' + joinSpectatorTitle: '&a正在觀察模式' + joinSpectatorSubtitle: '&c輸入 &4/em quit &c 離開!' +ancient_corpse_drop_axe: + name: '&e屠夫切肉刀' + lore: + - '&a取自' + - '&a古老的屍頭骨...' +animated_armor_drop_axe: + name: '&8附魔斧' + lore: + - '&8這把斧頭幾乎是' + - '&8你結束了。' +animated_armor_drop_boots: + name: '&8附魔靴子' + lore: + - '&8你從字面上找到了這個' + - '&8一件盔甲。' +animated_armor_drop_chestplate: + name: '&8附魔胸甲' + lore: + - '&8你從字面上找到了這個' + - '&8一件盔甲。' +animated_armor_drop_helmet: + name: '&8附魔頭盔' + lore: + - '&8你從字面上找到了這個' + - '&8一件盔甲。' +animated_armor_drop_leggings: + name: '&8附魔護腿' + lore: + - '&8你從字面上找到了這個' + - '&8一件盔甲。' +arachnid_matriarch_drop_boots: + name: '&8絲綢漫步者' + lore: + - '&b由稀有的蜘蛛絲製成。' +baba_rhoga_drop_chest: + name: '&a女巫長袍' + lore: + - '&a氣味應該消失' + - '&a最終離開。' +baba_yaga_drop_helmet: + name: '&a女巫帽' + lore: + - '&a氣味應該消失' + - '&a最終離開。' +balloon_rider_drop_leggings: + name: '&d寬鬆緊身褲' + lore: + - '&d非常舒適寬敞的緊身褲。' +banshee_drop_charm: + name: '&8悲傷面具' + lore: + - '&8願這刻骨銘心的悲傷' + - '&8保護你免於悲傷。' +beast_tamer_drop_axe: + name: '&e巨斧' + lore: + - '&e重量足以將任何野獸劈成兩半。' +berserker_charm: + name: '&b狂暴者飾品' + lore: + - '&a面對無可抵擋的困境' + - '&a你陷入狂暴之中' + - '&a同時也開始失去自我...' +bigfoot_drop_chestplate: + name: '&e毛皮盔甲' + lore: + - '&e暖融融。' +big_bad_wolf_drop_chestplate: + name: '&a大灰狼皮毛' + lore: + - '&a害怕!' +bloated_jeffrey_drop_tear: + name: '&bSweet Tear' + lore: + - '&b你害Jeffrey哭了...' +bone_fiend_drop_leggings: + name: '骨制護腿' + lore: + - '&a尖銳的骨頭安裝在這' + - '&a綁腿真的很會嘎嘎作響' +challengers_boots: + name: '&c挑戰者之靴' + lore: + - '&2獎勵給挑戰者' + - '&2木階聯盟競技場' +challengers_chestplate: + name: '&c挑戰者胸甲' + lore: + - '&2獎勵給挑戰者' + - '&2木階聯盟競技場' +challengers_helmet: + name: '&c挑戰者頭盔' + lore: + - '&2獎勵給挑戰者' + - '&2木階聯盟競技場' +challengers_leggings: + name: '&c挑戰者護腿' + lore: + - '&2獎勵給挑戰者' + - '&2木階聯盟競技場' +challengers_sword: + name: '&c挑戰者之劍' + lore: + - '&2獎勵給挑戰者' + - '&2木階聯盟競技場' +chameleon_charm: + name: '&b變色龍飾品' + lore: + - '&a這個多彩的飾品' + - '&a可以融入環境之中,' + - '&a並緩慢地移動...' +changeling_drop_sword: + name: '&a結晶劍' + lore: + - '&a眼看劍光閃爍' +cheetah_charm: + name: '&b獵豹飾品' + lore: + - '&a獵豹的奔跑可達' + - '&a每小時120公里... 但這個' + - '&a可以1分鐘就達成這個速度' +circus_ringmaster_drop_charm: + name: '&d指揮官的鞭子' + lore: + - '&d這是酷刑用具' +craftenmine_terror_drop_trident: + name: '&c惡靈前額葉切除器' + lore: + - '&c確保' + - '&c惡靈待在地上' +creeperpede_drop_chestplate: + name: '&dExplosion Proof Vest' + lore: + - '&dMake ''BOOM!'' feel' + - '&dmore like ''boom''.' +crone_drop_axe: + name: '&fWitch Feller' + lore: + - '&fA fine axe that demands a fine hunt.' +depths_seeker: + name: '&2深淵探尋者' + lore: + - '&9來自無盡的深淵' + - '&9從那些可怕怪物中掉落而來' + - '&9無人會知道這根魚竿' + - '&9見過多少驚懼的事物.' +divine_cinder_drop_charm: + name: '&6Divine Fire' + lore: + - '&6Blessed be the fire!' +dwarven_greed: + name: '&4矮人的貪婪' + lore: + - '&c那些貪婪的矮人' + - '&c追求過度的財富' + - '&c他們不知道挖得太深' + - '&c而喚醒了沉睡的黑暗之火.' +elephant_charm: + name: '&b大象飾品' + lore: + - '&a獲得如象般的力量' + - '&a但同時也會有所代價' + - '&a移動變如象一般緩慢!' +enders_drop_chestplate: + name: '&dEnder Shirt' + lore: + - '&dProtective and comfy!' +enders_drop_helmet: + name: '&dEnder Cap' + lore: + - '&dComfy but also quite sturdy.' +enders_drop_leggings: + name: '&dEnder Pants' + lore: + - '&dA bit too long but it will do.' +ender_lapin_drop_boots: + name: '&cDark Star Boots' + lore: + - '&cGives you the courage' + - '&cof running when in danger.' +endless_pursuer_drop_sword: + name: '&7Dark Blood Sword' + lore: + - '&7The sword seems to' + - '&7be weeping blood...' +enraged_snowman_drop_sword: + name: '&9Snowman''s Nose' + lore: + - '&9No wonder that the Snowman''s' + - '&9nose was so pointy...' +xmas_and_gold: + name: '&6黃金!' + lore: + - '&7人人都想獲得白銀' + - '&7和黃金!' +xmas_and_goooooold: + name: '&6更多更多黃金!' + lore: + - '&7人人都想獲得白銀' + - '&7和黃金!' +xmas_cornelius_pick: + name: '&b科尼利厄斯的十字鎬' + lore: + - '&3如果你把它扔到空中' + - '&3讓它落地,' + - '&3你可能會發現一些' + - '&3薄荷!' +xmas_lost_present: + name: '&2丟失的禮物' + lore: + - '&2繳交以獲得獎勵!' +xmas_peppermint: + name: '&c薄荷' + lore: + - '&f這是我一生都在尋找的東西!' +xmas_siiiiilver: + name: '&7白白白白白銀' + lore: + - '&6人人都想獲得白銀!' + - '&6和黃金!' +xmas_silver: + name: '&7白銀' + lore: + - '&6人人都想獲得白銀!' + - '&6和黃金!' +xmas_substitute_elf_practice: + name: '&8替身精靈' + lore: + - '&f這個娃娃需要補牙' +xmas_treat: + name: '&a口糧!' + lore: + - '&e美味的小吃!' +xmas_treat_v2: + name: '&a口糧!' + lore: + - '&e美味的小吃!' +evil_undead_drop_sword: + name: '&eTransient Blade' + lore: + - '&eIt will only serve' + - '&eyou for song long.' +fallen_knight_drop_boots: + name: '&e7Ancient Boots' + lore: + - '&7Even though the boots are old they' + - '&7still provide plenty of protection.' +fallen_knight_drop_chestplate: + name: '&e7Ancient Nether-Plate' + lore: + - '&7This armor might look plain to' + - '&7the untrained eye but is clear' + - '%7that anything wishing to penetrate' + - '&7it''s thick plate will need to be' + - '&7swung with considerable force.' +fallen_knight_drop_helmet: + name: '&e7Ancient Headgear' + lore: + - '&7Many swords have left their mark' + - '&7aon this helm but none have' + - '&7managed to break its defense.' +fallen_knight_drop_leggings: + name: '&e7Ancient Leggings' + lore: + - '&7You feel sorry for anyone that tries' + - '&7to strike these leggings.' +fine_swine_drop_sword: + name: '&6Fine Golden Sword' + lore: + - '&6A fine master-crafted golden sword.' + - '&6The molten gold flowing inside' + - '&6the sword makes sure that any damage' + - '&6to the blade is repaired swiftly.' +firefly_charm: + name: '&b火螢飾品' + lore: + - '&a點亮黑夜!' +firestarter_drop_helmet: + name: '&eFire Stopper' + lore: + - '&eOnly half the heat!' +fire_conjurer_drop_shield: + name: '&eFlame Touched Shield' + lore: + - '&eProtects against fire and flame.' +fishy_charm: + name: '&b漁飾品' + lore: + - '&a這個似乎感覺' + - '&a不太對勁...' +fox_king_cold_drop_charm: + name: '&9Magical Snow' + lore: + - '&9You sense impossible energies' + - '&9coming from this snow.' +fulgora_drop_boots: + name: '&bMountain Boots' + lore: + - '&bShould be useful when' + - '&bexploring the mountains.' +goblin_ballista: + name: '&8哥布林弩炮' + lore: + - '&8哥布林的寶藏!' +goblin_boots: + name: '&8哥布林靴' + lore: + - '&8哥布林的寶藏!' +goblin_chestplate: + name: '&8哥布林胸甲' + lore: + - '&8哥布林的寶藏!' +goblin_cleaver: + name: '&8哥布林彎刀' + lore: + - '&8哥布林的寶藏!' +goblin_helmet: + name: '&8哥布林頭盔' + lore: + - '&8哥布林的寶藏!' +goblin_invasion_drop_chestplate: + name: '&aSmall Chestplate' + lore: + - '&aReally tight...' +goblin_invasion_drop_leggings: + name: '&aSmall Leggings' + lore: + - '&aWell, at least it really' + - '&ashows off your legs.' +goblin_leggings: + name: '&8哥布林護腿' + lore: + - '&8哥布林的寶藏!' +goblin_poker: + name: '&8哥布林撲克牌' + lore: + - '&8哥布林的寶藏!' +goblin_shooter: + name: '&8哥布林射手' + lore: + - '&8哥布林的寶藏!' +goblin_slasher: + name: '&8哥布林戰士' + lore: + - '&8哥布林的寶藏!' +grappling_arrow: + name: '位移箭' + lore: + - '&e向目標移動' +greedy_dwarf_drop_pickaxe: + name: '&9Dwarven Need' + lore: + - '&cThose who delve too greedily' + - '&cand too deep may wake ancient' + - '&chorrors of shadow and flame' + - '&cbest left undisturbed.' +grunter_drop_axe: + name: '&cBig Oink' + lore: + - '&cThe axe has a tendency' + - '&cto squeal when swung.' +grunts_boots: + name: '&fGrunt''s 靴子' + lore: + - '&2獎勵給挑戰者' + - '&2木階聯盟競技場' +grunts_chestplate: + name: '&fGrunt''s 胸甲' + lore: + - '&2獎勵給挑戰者' + - '&2木階聯盟競技場' +grunts_helmet: + name: '&fGrunt''s 頭盔' + lore: + - '&2獎勵給挑戰者' + - '&2木階聯盟競技場' +grunts_leggings: + name: '&fGrunt''s 護腿' + lore: + - '&2獎勵給挑戰者' + - '&2木階聯盟競技場' +grunts_sword: + name: '&fGrunt''s 之劍' + lore: + - '&2獎勵給挑戰者' + - '&2木階聯盟競技場' +harmless_chicken_drop_boots: + name: '&aUseless Boots' + lore: + - '&aAt least they''re explosion proof...' +hog_rider_drop_boots: + name: '&a3.6 Radioactive Boots' + lore: + - '&aNot great, not terrible.' +horde_champion_drop_sword: + name: '&dHorde Eviscerator' + lore: + - '&dWhen you need to take' + - '&dcare of an undead horde.' +horrid_duplicator_drop_arrow: + name: '&aDuped Arrow' + lore: + - '&2Looks and feels' + - '&2like the real thing...' +horrid_duplicator_drop_bow: + name: '&4Fiery Bone Bow' + lore: + - '&4This bow is made out of' + - '&4a single large bone.' +invasion_alien_treat: + name: '&6外星人的食物' + lore: + - '&6好吃到飛出地球!' +invasion_cheap_plasma_boots: + name: '&2便宜的等離子靴' + lore: + - '&a發射!' + - '&c注意: &8點兩下Shift啟動!' +invasion_low_grade_tinfoil_bolt_caster: + name: '&7劣質刀刃' + lore: + - '&7不準碰我的寶物!' +invasion_low_grade_tinfoil_boots: + name: '&7劣質錫箔靴' + lore: + - '&7避免地板輻射!' +invasion_low_grade_tinfoil_chestplate: + name: '&7劣質錫箔胸甲' + lore: + - '&7防止心臟停止,類似心律調節器!' +invasion_low_grade_tinfoil_hat: + name: '&7劣質錫箔帽' + lore: + - '&7我願意相信!' +invasion_low_grade_tinfoil_leggings: + name: '&7劣質錫箔褲' + lore: + - '&7為逃離外星人而生!' +invasion_polished_plasma_boots: + name: '&2 拋光等離子靴' + lore: + - '&a發射!' + - '&c注意: &8點兩下Shift啟動!' +invasion_quality_bolt_caster: + name: '&7有質量的刀刃' + lore: + - '&7不準碰我的寶物!' +invasion_quality_tinfoil_boots: + name: '&7劣質錫箔靴' + lore: + - '&7避免地板輻射!' +invasion_quality_tinfoil_chestplate: + name: '&7錫箔胸甲' + lore: + - '&7防止心臟停止,類似心律調節器!' +invasion_quality_tinfoil_hat: + name: '&7錫箔帽' + lore: + - '&7從我的腦海裡出來!' +invasion_quality_tinfoil_leggings: + name: '&7錫箔褲' + lore: + - '&7為逃離外星人而生!' +invictus_boots: + name: '&4冠軍靴' + lore: + - '&2授予冠軍' + - '&2木階聯盟競技場' +invictus_chestplate: + name: '&4冠軍胸甲' + lore: + - '&2授予冠軍' + - '&2木階聯盟競技場' +invictus_helmet: + name: '&4冠軍頭盔' + lore: + - '&2授予冠軍' + - '&2木階聯盟競技場' +invictus_leggings: + name: '&4冠軍護腿' + lore: + - '&2授予冠軍' + - '&2木階聯盟競技場' +invictus_pickaxe: + name: '&4冠軍之鎬' + lore: + - '&2授予冠軍' + - '&2木階聯盟競技場' +invictus_shovel: + name: '&4冠軍之鏟' + lore: + - '&2授予冠軍' + - '&2木階聯盟競技場' +invictus_sword: + name: '&4冠軍之劍' + lore: + - '&2授予冠軍' + - '&2木階聯盟競技場' +krampus_drop_boots: + name: '&1Snow Boots' + lore: + - '&1Made out of actual snow.' +large_hopper_drop_axe: + name: '&aHeavy Axe' + lore: + - '&aPerfect for chopping off heads.' +living_shadow_drop_boots: + name: '&5Shadow Boots' + lore: + - '&5Falling doesn''t hurt as much.' +lucky_charms: + name: '&b幸運飾品' + lore: + - '&a完美早餐的一部份!' + - '&c註記: 顯然不是完美早餐' + - '&c的其中一部份.' +magmaguys_toothpick: + name: '&4Magmaguy&c的 &2牙簽' + lore: + - '&a近乎全新的狀態!' +merman_drop_trident: + name: '&1Merman Trident' + lore: + - '&1A Merman''s favorite weapon.' +meteor_shower_scroll: + name: '&7流星雨捲軸' + lore: + - '&4毀滅的召喚.' + - '&4一次性使用.' +monster_of_the_deep_drop_trident: + name: '&3Bone Trident' + lore: + - '&3Made out of the bones' + - '&3of the Monster of the Deep.' +moon_spider_drop_sword: + name: '&fSilk Spun Sword' + lore: + - '&fRazor sharp silk surrounds' + - '&fthe iron core of this blade.' + - '&fThe blade will serve you,' + - '&ffor now...' +necromancer_drop_helmet: + name: '&cDark Omen Helm' + lore: + - '&cThere is something off' + - '&cabout this helmet.' +netherite_golem_drop_helmet: + name: '&8Ancient Helmet' + lore: + - '&8You''re not sure if you' + - '&8should put this on your' + - '&8head or send it to a museum.' +nether_escapee_drop_charm: + name: '&6Fire Amulet' + lore: + - '&6May the flames not harm you.' +nether_hag_drop_sword: + name: '&7Bewitched Sword' + lore: + - '&7All kinds of curses and' + - '&7enchantments flow through' + - '&7this sword.' +nightwing_drop_crossbow: + name: '&aSky Watcher' + lore: + - '&aKeeping the skies safe.' +night_crawler_drop_shield: + name: '&8Night Shield' + lore: + - '&8Almost unbreakable.' +night_crawler_drop_sword: + name: '&8Night Blade' + lore: + - '&e8The only answer to the' + - '&8threats of the night.' +novices_boots: + name: '&8新手靴' + lore: + - '&2獎勵給挑戰者' + - '&2木階聯盟競技場' +novices_chestplate: + name: '&4新手胸甲' + lore: + - '&2獎勵給挑戰者' + - '&2木階聯盟競技場' +novices_helmet: + name: '&4新手頭盔' + lore: + - '&2獎勵給挑戰者' + - '&2木階聯盟競技場' +novices_leggings: + name: '&4新手護腿' + lore: + - '&2獎勵給挑戰者' + - '&2木階聯盟競技場' +novices_sword: + name: '&8新手之劍' + lore: + - '&2獎勵給挑戰者' + - '&2木階聯盟競技場' +oasis_beacons_brigandine: + name: '&8燈塔的強盜' + lore: + - '&f鋼鐵意志' + - '&f最大化攻擊' +oasis_chief_cultists_bow: + name: '&5邪教教主之弓' + lore: + - '&d死靈戰弓' + - '&d邪教領袖' +oasis_earthquake_boots_10: + name: '&2地震靴' + lore: + - '&a猛擊地面' + - '&c注意: &8點兩下Shift啟動!' +oasis_earthquake_boots_20: + name: '&2地震靴' + lore: + - '&a猛擊地面' + - '&c注意: &8點兩下Shift啟動!' +oasis_earthquake_boots_30: + name: '&2地震靴' + lore: + - '&a猛擊地面' + - '&c注意: &8點兩下Shift啟動!' +oasis_earthquake_boots_40: + name: '&2地震靴' + lore: + - '&a猛擊地面' + - '&c注意: &8點兩下Shift啟動!' +oasis_earthquake_boots_50: + name: '&2地震靴' + lore: + - '&a猛擊地面' + - '&c注意: &8點兩下Shift啟動!' +oasis_earthquake_chestplate_10: + name: '&2地震胸甲' + lore: + - '&a猛擊地面' + - '&c注意: &8點兩下Shift啟動!' +oasis_earthquake_chestplate_20: + name: '&2地震胸甲' + lore: + - '&a猛擊地面' + - '&c注意: &8點兩下Shift啟動!' +oasis_earthquake_chestplate_30: + name: '&2地震胸甲' + lore: + - '&a猛擊地面' + - '&c注意: &8點兩下Shift啟動!' +oasis_earthquake_chestplate_40: + name: '&2地震胸甲' + lore: + - '&a猛擊地面' + - '&c注意: &8點兩下Shift啟動!' +oasis_earthquake_chestplate_50: + name: '&2地震胸甲' + lore: + - '&a猛擊地面' + - '&c注意: &8點兩下Shift啟動!' +oasis_earthquake_helmet_10: + name: '&2地震頭盔' + lore: + - '&a猛擊地面' + - '&c注意: &8點兩下Shift啟動!' +oasis_earthquake_helmet_20: + name: '&2地震頭盔' + lore: + - '&a猛擊地面' + - '&c注意: &8點兩下Shift啟動!' +oasis_earthquake_helmet_30: + name: '&2地震頭盔' + lore: + - '&a猛擊地面' + - '&c注意: &8點兩下Shift啟動!' +oasis_earthquake_helmet_40: + name: '&2地震頭盔' + lore: + - '&a猛擊地面' + - '&c注意: &8點兩下Shift啟動!' +oasis_earthquake_helmet_50: + name: '&2地震頭盔' + lore: + - '&a猛擊地面' + - '&c注意: &8點兩下Shift啟動!' +oasis_earthquake_leggings_10: + name: '&2地震護腿' + lore: + - '&a猛擊地面' + - '&c注意: &8點兩下Shift啟動!' +oasis_earthquake_leggings_20: + name: '&2地震護腿' + lore: + - '&a猛擊地面' + - '&c注意: &8點兩下Shift啟動!' +oasis_earthquake_leggings_30: + name: '&2地震護腿' + lore: + - '&a猛擊地面' + - '&c注意: &8點兩下Shift啟動!' +oasis_earthquake_leggings_40: + name: '&2地震護腿' + lore: + - '&a猛擊地面' + - '&c注意: &8點兩下Shift啟動!' +oasis_earthquake_leggings_50: + name: '&2地震護腿' + lore: + - '&a猛擊地面' + - '&c注意: &8點兩下Shift啟動!' +oasis_foundrys_flaming_hammer: + name: '&6鑄造廠的火焰錘' + lore: + - '&e鑄造之鎚!' +oasis_foundrys_flux: + name: '&6鑄造廠的助焊劑' + lore: + - '&e注入的助焊劑' + - '&e鍛造武器的必備品' +oasis_mask_of_the_warlock: + name: '&4術士面具' + lore: + - '&7石頭在他的面具裡!' + - '&7紫外線燈會幫助他!' +oasis_monumental_lance: + name: '&3紀念長矛' + lore: + - '&b魚叉捕魚是我的愛好。' +oasis_oracles_shroud: + name: '&3甲骨文的裹屍布' + lore: + - '&1幻覺是你的武器!' +oasis_page_of_darkness_I: + name: '&0暗黑之章 I' + lore: + - '&8往北29步' + - '&8往西11步' + - '&8往北16步' + - '&8往東6步' +oasis_page_of_darkness_II: + name: '&0暗黑之章 II' + lore: + - '&8往南7步' + - '&8往東6步' + - '&8往北33步' + - '&8往西12步' +oasis_page_of_darkness_III: + name: '&0暗黑之章 III' + lore: + - '&8往北6步' + - '&8往西3步' + - '&8往北30步' + - '&8往東9步' +oasis_page_of_darkness_index: + name: '&0暗黑之章' + lore: + - '&8在黑暗中小心行走' + - '&8他們知道你來了。' + - '&8對前方的道路感到疲倦' + - '&8火鼓正發出悲鳴。' +oasis_page_of_darkness_IV: + name: '&0暗黑之章 IV' + lore: + - '&8往南24步' + - '&8往東9步' + - '&8往北36步' + - '&8往西3步' +oasis_page_of_darkness_V: + name: '&0暗黑之章 V' + lore: + - '&8往北9步' + - '&8往東12步' + - '&8往南6步' + - '&8往東6步' +oasis_page_of_darkness_VI: + name: '&0暗黑之章 VI' + lore: + - '&8往南6步' + - '&8往東6步' + - '&8往北12步' + - '&8往東3步' +oasis_page_of_darkness_VII: + name: '&0暗黑之章 VII' + lore: + - '&8往北3步' + - '&8往東6步' + - '&8往南8步' +oasis_page_of_darkness_VIII: + name: '&0暗黑之章 VIII' + lore: + - '&8從陰影中出來一盞燈' + - '&8他們的長袍是暗淡的灰色,因戰鬥有所受損。' + - '&8冰與雪,火與熱。' + - '&8大斧偏斜,劍客已敗。' +oasis_page_of_libraris_I: + name: '&7第一章' + lore: + - '&f在書架下' + - '&f沒有反射' + - '&f會出現在你面前' + - '&f通道和方向' +oasis_page_of_libraris_II: + name: '&7第二章' + lore: + - '&f書架的倒影' + - '&f擁有更多知識' + - '&f書架上裝滿了更多書籍' + - '&f透露出他的形象' +oasis_page_of_libraris_III: + name: '&7第三章' + lore: + - '&f稍微向西方前進' + - '&f那裏存留很多書籍。' + - '&f它保留的知識最多。' + - '&f那些是知識家的最愛。' +oasis_page_of_libraris_index: + name: '&7首章' + lore: + - '&f尋找第五章,' + - '&f有個地方有3個開關,' + - '&f有一扇要打開的門' + - '&f你們必在其中迎接挑戰。' +oasis_page_of_libraris_IV: + name: '&7第四章' + lore: + - '&f知識的神諭' + - '&f令人震撼的驚喜' + - '&f從絕望的深處' + - '&f是否會出現!' +oasis_page_of_libraris_V: + name: '&7第五章' + lore: + - '&f最後的秘密' + - '&f會試圖隱藏' + - '&f使用影子和木偶' + - '&f在你前進時阻止你。' +oasis_page_of_plundering_I: + name: '&6掠奪之章I' + lore: + - '&e整個小鎮的房子' + - '&e隱藏而不是隱藏他們的秘密。' + - '&e鉤爪或飛行' + - '&e可以幫助你的困境。' +oasis_page_of_sentris: + name: '&1Sentris 頁面' + lore: + - '&b哨兵的盔甲太硬了' + - '&b揮舞著劍,你的戰鬥將是艱難的。' +oasis_page_of_the_pharaoh_I: + name: '&0法老之章 I' + lore: + - '&6祭壇上的祭品' + - '&6必須追究。' + - '&6但是你們要獻上什麼呢?' + - '&r答案就在沙漠中。' +oasis_page_of_the_pharaoh_II: + name: '&0法老之章 II' + lore: + - '&6金字塔林立' + - '&6在最好的土地上。' + - '&6這將是他的毀滅' + - '&6因為從金子中,你的損失將大大增加。' +oasis_page_of_the_pharaoh_III: + name: '&0法老之章 III' + lore: + - '&6法老的牆壁被填滿' + - '&6帶著危險和寶貴的財富。' + - '&6從帶有藍色窗戶的房間的西南角' + - '&6流淌著非常不祥的壓力。' +oasis_page_of_the_pharaoh_index: + name: '&0法老之章' + lore: + - '&6法老被封印' + - '&6在他的墳墓裡' + - '&6他靜靜地等待著;' + - '&6他的陷阱將是你的厄運。' + - '&63 頁將幫助您的冒險' + - '&6從而被遏制。' +oasis_page_of_the_sewer_I: + name: '&0下水道之章 I' + lore: + - '&3有一個大小不尋常的蝨子。' + - '&3它在徘徊,看它的獎品。' + - '&3大量寶藏等你發現' + - '&3你所要做的就是四處遊蕩。' +oasis_page_of_the_sewer_II: + name: '&0下水道之章 II' + lore: + - '&3一一激活門' + - '&3將允許水流動。' + - '&3水一流就往上游' + - '&3然後你必須沿著正確的隧道走。' +oasis_page_of_the_sewer_index: + name: '&0下水道之章' + lore: + - '&3邪惡潛伏在水流乾的地方' + - '&3時刻保持警惕,他們會吃掉你的大腦!' + - '&3你必須打開由生物守衛的 3 扇門' + - '&3內襯有紅砂岩。' + - '&3第一章將引導你,不要緊張。' +oasis_page_of_vampiris_I: + name: '&4吸血鬼之章 I' + lore: + - '&c數十種武器擊中了野獸' + - '&c它承受了每一次打擊。' + - '&c它一點也不怕石製、金製或鑽製武器' + - '&c但它懼怕著木製的東西。' +oasis_page_of_vampiris_II: + name: '&4吸血鬼之章 II' + lore: + - '&c如果你尋求輕視的術士,' + - '&c準備好打一場硬仗!' + - '&c前往二樓考驗你的實力,' + - '&c首先征服它是一種方法。' +oasis_page_of_vampiris_III: + name: '&4吸血鬼之章 III' + lore: + - '&c沿著尖頂進入洞穴' + - '&c是勇者之路。' + - '&c當心那些從墳墓裡回來的人,' + - '&c殺死渴望血的主人。' +oasis_page_of_vampiris_index: + name: '&4吸血鬼之章' + lore: + - '&c天文台內' + - '&c潛伏著一個生物' + - '&c誰從未見過太陽。' + - '&c找到 4 額外4個章節來幫助你' + - '&c活著逃走' +oasis_page_of_vampiris_IV: + name: '&4吸血鬼之章 IV' + lore: + - '&c兩箱戰利品,' + - '&c不要喚醒死者!' + - '&c一個在樓梯下,' + - '&c另一個可以看書的地方!' +oasis_pharaohs_feast: + name: '&6法老盛宴' + lore: + - '&e有個金色的標記' + - '&e曾經的黃金之城' + - '&e被歲月侵蝕。' +oasis_pharaohs_flail: + name: '&0法老的連枷' + lore: + - '&4來世的連枷。' +oasis_pick_of_darkness: + name: '&1黑暗的選擇' + lore: + - '&b透著光亮' + - '&b和陰影' +oasis_sunkiller: + name: '&6防止陽光照耀' + lore: + - '&e那邊有塊石頭' + - '&e對某人來說足夠遮蔽光線' + - '&e躲在後面?' +oasis_tohth: + name: '&8Oingo Boingo 兄弟冒險' + lore: + - '&f我的預感是絕對的!' + - '&f這是命運!' +okami_drop_leggings: + name: '&cOkami''s Blessing' + lore: + - '&cSpeed of the wolf.' + - '&cFire protection of a god.' +owl_charm: + name: '&b貓頭鷹飾品' + lore: + - '&a成為終極的' + - '&a黑夜裡的掠食者!' +primis_artifexs_shield: + name: '&6Artifex的盾牌' + lore: + - '&e一個更古老的遺物' + - '&e一段危險的時期' + - '&e使它恢復了它的輝煌!' +primis_caeruleaums_hope: + name: '&9無限的希望' + lore: + - '&8舊時代的遺物,依然鋒利' + - '&8雖然已生鏽但已足夠' + - '&8這是屬於博物館的!' +primis_catacomb_drop_boots: + name: '&7暗骨鞋具' + lore: + - '&7不自然的黑骨頭,' + - '&7讓人不寒而慄。' +primis_catacomb_drop_boots_2: + name: '&7Dark Bone Footgear' + lore: + - '&7Unnaturally dark bones' + - '&7cover these boots.' +primis_catacomb_drop_chestplate: + name: '&7暗骨盔甲' + lore: + - '&7像深淵一樣黑暗的骨頭' + - '&7讓人感到顫慄' + - '&7The arrows will make quite a' + - '&7發出清脆的聲響。' +primis_catacomb_drop_chestplate_2: + name: '&7Dark Bone Armor' + lore: + - '&7Bones as dark as the abyss' + - '&7adorn this armor.' + - '&7The arrows will make quite a' + - '&7noise as they bounce off the bones.' +primis_catacomb_drop_leggings: + name: '&7黑骨護腿' + lore: + - '&7The dark bones covering the' + - '&7護腿會變得危險' + - '&7跌倒更能生存' +primis_catacomb_drop_leggings_2: + name: '&7Dark Bone Leggings' + lore: + - '&7The dark bones covering the' + - '&7leggings will make dangerous' + - '&7falls more survivable.' +primis_catacomb_necromancer_drop_helmet: + name: '&5黑骨兜帽' + lore: + - '&5整流罩提供的保護很少,' + - '&5它只尋求鮮血和死亡。' +primis_catacomb_necromancer_drop_helmet_2: + name: '&5Dark Bone Cowl' + lore: + - '&5The cowl offers little protection,' + - '&5it only seeks blood and death.' +primis_catacomb_necromancer_drop_sword: + name: '&5黑骨烙印' + lore: + - '&5不自然的黑骨牌' + - '&5在燈光下閃閃發光' + - '&5準備好分手' + - '&5這擋住了它的路。' +primis_catacomb_necromancer_drop_sword_2: + name: '&5Dark Bone Brand' + lore: + - '&5The dark bone-brand howls' + - '&5viciously with every swing' + - '&5as the air rushes through' + - '&5it''s hollow cavity.' +primis_cooked_rabbit: + name: '&c烤兔肉' + lore: + - 咦,這隻兔子熟了嗎? +primis_diving_helmet: + name: '&1潛水頭盔' + lore: + - 一個舊的潛水頭盔。仍堪用。 + - 仍然工作得很好 +primis_fish_bait: + name: '&2魚餌' + lore: + - '&a看起來你可以用這來釣魚。' +primis_gladius_important_documents: + name: '&2重要文件' + lore: + - '&a文件是密封的。' +primis_gladius_lord_promise: + name: '&5援助協議' + lore: + - '在這些最艱難的時期提供的幫助' + - Pontis Mille 承諾會幫助 Gladius + - 度過任何最黑暗的時刻. +primis_gladius_supplies: + name: '&2補給品' + lore: + - '&a適合在戰爭期間給士兵餵食。' +primis_gladius_sword: + name: '&5Gladius短劍' + lore: + - '&8Gladius的象徵。' +primis_gladius_the_good_stuff: + name: '&2好東西' + lore: + - '&a聞起來……很濃。' +primis_heirloom: + name: '&2失傳的傳家寶' + lore: + - '&a看起來很古老,歷史十分悠久。' +primis_ice_village_alanus_dagger: + name: '&eAlanus 匕首' + lore: + - '&e一個簡單的匕首' + - '&e把手上刻有符文。' +primis_ice_village_chains_shipment: + name: '&a鏈條裝運' + lore: + - '&a很多鍊子。' +primis_ice_village_escaped_prisoner_body: + name: '&c無意識的身體' + lore: + - '&c重的' +primis_ice_village_foot_of_mountain_chest_axe: + name: '&1鈍霜斧' + lore: + - '&1冰冷的觸感' +primis_ice_village_island_chest_trident: + name: '&3岩漿的喜悅' + lore: + - '&3看的人,就會發現。' +primis_ice_village_living_nightmares_reward_chest: + name: '&3毛皮大衣' + lore: + - '&3由' + - '&3周圍最堅硬的毛皮' +primis_ice_village_magical_ice_crystals: + name: '&1毛皮冰晶' + lore: + - 靠近水晶 + - 它會對雪做出反應。 +primis_ice_village_make_them_go_ouch_reward_leggings: + name: '&d紫羅蘭的備用護腿' + lore: + - '&d讓你想昂首闊步' + - '&d道路並做一些懲罰。' +primis_ice_village_salmon: + name: '&2新鮮三文魚' + lore: + - 你以為你沒有看到 + - 在你的生活中有魚。 +primis_ice_village_silence_reward_helmet: + name: '&a衝擊頭盔' + lore: + - '&a應該處理一兩次爆炸。' +primis_ice_village_taking_the_bait_reward: + name: '&b北極棒' + lore: + - '&b這是一根製作精良的魚竿。' +primis_ice_village_violet_boots: + name: '&d紫羅蘭的皮靴' + lore: + - '&d花式皮靴搭配' + - '&d凸起的尖頭鞋跟。' +primis_ice_village_violet_leggings: + name: '&d紫羅蘭的花式護腿' + lore: + - '&d緊密且略微透明' + - '&d與美麗的花朵動機。' +primis_ice_village_violet_whip: + name: '&d紫羅蘭之鞭' + lore: + - '&d提供精美的懲罰' +primis_ice_village_wanna_build_a_snowman_reward_boots: + name: '&3冰霜之靴' + lore: + - '&3這只是冰霜靴子。' +primis_invaders_assassins_bow: + name: '&8刺客之弓' + lore: + - '&a給他們的完美方式' + - '&a嚐嚐自己的藥。' +primis_invaders_boots: + name: '&4入侵者的靴子' + lore: + - '&a這些味道不太好。' +primis_invaders_bow: + name: '&8入侵者之弓' + lore: + - '&a一旦遮蔽了太陽。' +primis_invaders_captains_sword: + name: '&4入侵者的船長劍' + lore: + - '&a彎曲和卑鄙的樣子。' +primis_invaders_chestplate: + name: '&4入侵者的胸甲' + lore: + - '&a生鏽,醜陋和臭。迷人的!' +primis_invaders_helmet: + name: '&4入侵者頭盔' + lore: + - '&a克服腦震盪!' +primis_invaders_leggings: + name: '&4入侵者的護腿' + lore: + - '&a可以用點油。' +primis_invaders_sword: + name: '&4入侵者之劍' + lore: + - '&a可疑的血跡' +primis_lucky_pickaxe: + name: '&6幸運鏟' + lore: + - '&e即使在地下也閃耀著光芒。' + - '&e你看 LL 刻在手柄上' +primis_monster_slaying_spear: + name: '&8怪物殺戮矛' + lore: + - 將海怪變成燒烤。 +primis_ogre_boots: + name: '&c食人魔的靴子' + lore: + - '&7他們會讓你很好' + - '&7和他敬酒' +primis_ogre_chestplate: + name: '&c食人魔的胸甲' + lore: + - '&7炙手可熱……' +primis_ogre_helmet: + name: '&c食人魔的頭盔' + lore: + - '&7你會汗流浹背的。' +primis_ogre_leggings: + name: '&c食人魔的護腿' + lore: + - '&7悶燒的褲子' +primis_ogre_mines_lucky_pickaxe: + name: '&e幸運鎬' + lore: + - '&a幸運,但沒用。' +primis_ogre_mines_waterworks_chest_shield: + name: '&a堅固的門' + lore: + - '&a這只是一扇門。' +primis_old_shield: + name: '&8老盾' + lore: + - '&7一個更古老的遺物' + - '&7有可能有危險。' + - '&7可以修補,雖然...' +primis_pirate_boots: + name: '&4海盜靴' + lore: + - '&a這些有太多' + - '&a有用的孔。' +primis_pirate_bow: + name: '&8海盜弓' + lore: + - '&a不完全是燧發槍,' + - '&a但它會做!' +primis_pirate_chestplate: + name: '&4海盜的胸甲' + lore: + - '&a基本上是一件T卹。' +primis_pirate_helmet: + name: '&4海盜頭盔' + lore: + - '&a缺少眼罩' +primis_pirate_leggings: + name: '&4海盜的護腿' + lore: + - '&a感覺像海豹!' +primis_pirate_sword: + name: '&4海盜的劍' + lore: + - '&a彎曲和卑鄙的樣子。' +primis_pointis_groves_heirloom: + name: '&2珍貴的傳家寶' + lore: + - '&a這是您檢索到的第二個。' +primis_pointis_mille_chest_dirty_note: + name: 骯髒的筆記 + lore: + - '&f有一把非常酷的劍' + - '&f在這裡,但現在不見了。' +primis_pontis_beast_horn: + name: '&2血淋淋的號角' + lore: + - '&f整個物品充滿血' + - '&f仔細看,發現是個號角' + - '&f且是由血液製成。' + - '&f結晶的血液異常鋒利。' +primis_pontis_beast_scale: + name: '&2毒魚鱗' + lore: + - '&f規模在外面是堅硬的。' + - '&f裡面覆蓋著' + - '&f有毒和酸性軟泥。' +primis_pontis_beast_silk: + name: '&2日曬絲綢' + lore: + - '&f絲綢散發著光和溫暖。' +primis_pontis_elf_drop_boots: + name: '&7精靈靴' + lore: + - '&7似乎有種能量,' + - '&7無形中附著於盔甲上。' +primis_pontis_elf_drop_chestplate: + name: '&7精靈胸甲' + lore: + - '&7似乎有種能量,' + - '&7無形中附著於盔甲上。' +primis_pontis_elf_drop_crossbow: + name: '&7精靈暗箭' + lore: + - '&7弓的特殊彈丸' + - '&7用途既尖銳又鈍。' +primis_pontis_elf_drop_helmet: + name: '&7精靈頭盔' + lore: + - '&7似乎有種能量,' + - '&7無形中附著於盔甲上。' +primis_pontis_elf_drop_leggings: + name: '&7精靈護腿' + lore: + - '&7似乎有種能量,' + - '&7無形中附著於盔甲上。' +primis_pontis_fields_berry_charm: + name: '&d大漿果' + lore: + - '&d這種漿果散發出的清新氣味' + - '&d千里之外都能聞到。' + - '&d氣味似乎有一種鎮靜' + - '&d對怪物和野獸似乎有些影響。' + - '&d這使得他們的攻擊不那麼兇猛。' +primis_pontis_groves_brood_moher_drop_charm: + name: '&a爬行者折磨' + lore: + - '&a絲綢散發出強大的能量。' +primis_pontis_groves_nest_crawler_drop_shield: + name: '&7岩漿的誘惑' + lore: + - '&7當盾牌被舉起' + - '&7它引誘怪物攻擊它。' +primis_pontis_groves_spider_boots_reward: + name: '&1蜘蛛腿靴' + lore: + - '&1由蜘蛛腿和皮革製成的靴子。' +primis_pontis_groves_tree_climbing_elf_bandits_reward_leggings: + name: '&a精靈珍珠護腿' + lore: + - '&a用珍珠裝飾的,' + - '&a中看不中用的護腿。' +primis_pontis_mille_arena_knowledge: + name: '&2知識' + lore: + - '&a重要知識' +primis_pontis_mille_arena_reward_1: + name: '&4星觸盾' + lore: + - '&7帶有宇宙動機的華麗盾牌。' +primis_pontis_mille_arena_reward_2: + name: '&4星觸胸甲' + lore: + - '&7一千顆尖尖的小星星橫跨胸甲。' +primis_pontis_mille_arena_reward_3: + name: '&4星觸護腿' + lore: + - '&7護腿像天上的星星一樣閃閃發光。' +primis_pontis_mille_cat_quest_reward_charm: + name: '&9貓的祝福' + lore: + - '&9如果你拿起它' + - '&9並放到耳朵旁,你可以' + - '&9聽到輕微的咕嚕聲。' +primis_pontis_mille_counselor_sword: + name: '&e遠語之石' + lore: + - '&a你可以感覺到來自石頭的存在。' +primis_pontis_mille_fields_beasts_reward_chest: + name: '&e獵人的驕傲' + lore: + - '&e打獵的人不能成為獵物。' +primis_pontis_mille_fields_contest_berry: + name: '&d最好的漿果' + lore: + - '&d一個美麗而非常大的漿果。' + - '&d真的是百萬分之一的標本。' +primis_pontis_mille_fields_do_it_yourself_reward_bow: + name: '&c獵人弓' + lore: + - '&c製作精良的弓。' + - '&c從這裡射出的箭' + - '&c弓會傷害任何野獸。' +primis_pontis_mille_fields_first_aid: + name: '&2急救設備' + lore: + - '&f每個人都需要準備" - "&f受傷治療。' +primis_pontis_mille_fields_rat_drop_helmet: + name: '&f帶羽毛的老鼠帽' + lore: + - '&f你設法做了一個' + - '&f蓋住你的獵物。' + - '&f提取了獵物' + - '&f令人眼花繚亂的屬性,你已經做了' + - '&f它對你有利。' +primis_pontis_mille_fields_rat_meat: + name: '&c老鼠肉' + lore: + - 生老鼠肉,不需要做飯。 +primis_pontis_mille_fields_stolen_berries: + name: '&4偷來的漿果' + lore: + - '&f這是偷來的漿果' +primis_pontis_mille_fish_nets: + name: '&2Fish Nets' + lore: + - '&aCatching fish made easy!' +primis_pontis_mille_fresh_rat: + name: '&f鮮鼠' + lore: + - 貓會喜歡這個的。 +primis_pontis_mille_mines_goblined_up_in_the_maze_reward_axe: + name: '&a符文哥布林斧頭' + lore: + - '&a斧柄上刻有符文。' + - '&a他們現在已經完全褪色了。' + - '&a好像這把斧頭曾經被詛咒過……' +primis_pontis_mille_mines_goblin_head: + name: '&2禽妖精羽毛' + lore: + - '&a如此柔軟和多刺。' +primis_pontis_mille_parkour_reward_boots: + name: '&4鑽石樹靴' + lore: + - '&7用特殊的軟樹皮製成的靴子。' + - '&7用寶石裝飾' +primis_pontis_mille_reward_boots: + name: '&4Pontis Mille 靴子' + lore: + - '&7傳統 Pontis Mille 靴子' +primis_pontis_mille_reward_chest: + name: '&4Pontis Mille 胸甲' + lore: + - '&7傳統的 Pontis Mille 胸甲' +primis_pontis_mille_reward_helmet: + name: '&4Pontis Mille 頭盔' + lore: + - '&7傳統的 Pontis Mille 頭盔' +primis_pontis_mille_reward_leggings: + name: '&4Pontis Mille 護腿' + lore: + - '&7傳統 Pontis Mille 護腿' +primis_pontis_mille_reward_shield: + name: '&4Pontis Mille 盾' + lore: + - '&7傳統的 Pontis Mille 盾牌' +primis_pontis_mille_reward_sword: + name: '&4Pontis Mille 武士刀' + lore: + - '&7令人難以置信的鋒利' +primis_pontis_mille_serious_sewage_reward_helmet: + name: '&2龜殼頭盔' + lore: + - '&2讓你想吃披薩。' +primis_pontis_mille_sewage_keys: + name: '&2下水道鑰匙' + lore: + - '&a一個鑰匙圈,上面有很多鑰匙。' +primis_pontis_mille_sewers_ninja_drop_chestplate: + name: '&7Ninja Garb Chest-plate' + lore: + - Now you too are a Ninja +primis_pontis_mille_sewers_ninja_drop_leggings: + name: '&7Ninja Garb 護腿' + lore: + - 現在你也是忍者 +primis_pontis_mille_sewers_shredder_drop: + name: '&4撕碎頭盔' + lore: + - 裝滿了小小的剃須刀片 + - 像外部的點。 +primis_pontis_mille_slums_chest_sword: + name: '&4Pontis Mille 已鈍化的武士刀' + lore: + - '&7令人難以置信的鋒利' +primis_pontis_mille_to_lycan_or_not_to_lycan_reward: + name: '&a毛皮護腿' + lore: + - '&a堅韌而輕盈' + - '&a由毛皮和皮革製成。' +primis_pontis_mines_goblin_drop_boots: + name: '&7哥布林靴子' + lore: + - '&7好像有人拿了鐵錠' + - '&7並把它敲成正確的形狀。' +primis_pontis_mines_goblin_drop_chestplate: + name: '&7哥布林胸甲' + lore: + - '&7好像有人拿了鐵錠' + - '&7並把它敲成正確的形狀。' +primis_pontis_mines_goblin_drop_helmet: + name: '&7鐵製頭盔' + lore: + - '&7好像有人拿了鐵錠' + - '&7並把它敲成正確的形狀。' +primis_pontis_mines_goblin_drop_leggings: + name: '&7鐵製護腿' + lore: + - '&7好像有人拿了鐵錠' + - '&7並把它敲成正確的形狀。' +primis_pontis_mines_goblin_drop_spear: + name: '&7哥布林長矛' + lore: + - '&7最後是一塊漂亮而鋒利的石頭。' +primis_pontis_mines_goblin_drop_sword: + name: '&7哥布林劍' + lore: + - '&7它只是一個帶把手的石棒。' +primis_pontis_redwoods_nasty_little_bandits_reward_boots: + name: '&2森林靴' + lore: + - '&2靴子好像是使用,' + - '&2柔軟的樹皮、葉子' + - '&2和結晶的樹液製成的。' +primis_pontis_redwoods_spider_legs: + name: '&2蜘蛛腿' + lore: + - '&a簡直就是蜘蛛腿……' +primis_pontis_redwoods_tobacco: + name: '&2優質煙草' + lore: + - '&a聞起來很香' +primis_pontis_redwoods_watch: + name: '&2堅固的懷錶' + lore: + - '&a出奇的輕巧堅固。' +primis_pontis_redwoods_werewolf_drop_chestplate: + name: '&7毛皮胸甲' + lore: + - '&7由堅韌的毛皮和獸皮製成,' + - '&7很輕,但是很硬。' +primis_roughspun_boots: + name: '&5粗布靴' + lore: + - '&d磨損和風化' + - '&d根本沒有盔甲!' +primis_roughspun_chestplate: + name: '&5粗布胸甲' + lore: + - '&d磨損和風化' + - '&d根本沒有盔甲!' +primis_roughspun_helmet: + name: '&5粗布頭' + lore: + - '&d磨損和風化' + - '&d根本沒有盔甲!' +primis_roughspun_leggings: + name: '&5粗布護腿' + lore: + - '&d磨損和風化' + - '&d根本沒有盔甲!' +primis_ruins_bow: + name: '&8破弓' + lore: + - 一把舊弓。可能在某個時候很好。 +primis_ruins_diary_entry: + name: 日記殘片 + lore: + - '我現在後悔在這些廢墟中追逐寶藏。' + - 現在我摔斷了腿 + - 彷彿我注定要死在我所尋找的寶藏之下。 + - 要是我在跑酷上多加注意就好了! +primis_ruin_relic_boots: + name: '&bRuin Relic Boots' + lore: + - '&6與廢墟一起埋葬。' + - '&6蘊含著古老的力量。' +primis_ruin_relic_chestplate: + name: '&b遺跡遺物胸甲' + lore: + - '&6與廢墟一起埋葬。' + - '&6蘊含著古老的力量。' +primis_ruin_relic_helmet: + name: '&b廢墟遺物頭盔' + lore: + - '&6與廢墟一起埋葬。' + - '&6蘊含著古老的力量。' +primis_ruin_relic_leggings: + name: '&b遺跡遺物護腿' + lore: + - '&6與廢墟一起埋葬。' + - '&6蘊含著古老的力量。' +primis_rusty_mail_boots: + name: '&3生鏽的鎖甲靴' + lore: + - '&9生鏽但耐用' + - '&9比皮革好用!' +primis_rusty_mail_chestplate: + name: '&3生鏽的鎖甲胸甲' + lore: + - '&9生鏽但耐用' + - '&9比皮革好用!' +primis_rusty_mail_helmet: + name: '&3生鏽的頭盔' + lore: + - '&9生鏽但耐用' + - '&9比皮革好用!' +primis_rusty_mail_leggings: + name: '&3生鏽的護腿' + lore: + - '&9生鏽但耐用' + - '&9比皮革好用!' +primis_starter_boots: + name: '&4Shipwreck''s Boots' + lore: + - '&a這些皮革碎片幾乎不能算作盔甲。' +primis_starter_chestplate: + name: '&4Shipwreck''s Chestplate' + lore: + - '&a這些皮革碎片幾乎不能算作盔甲。' +primis_starter_helmet: + name: '&4Shipwreck''s Helmet' + lore: + - '&a這些皮革碎片幾乎不能算作盔甲。' +primis_starter_leggings: + name: '&4Shipwreck''s Leggings' + lore: + - '&a這些皮革碎片幾乎不能算作盔甲。' +primis_starter_sword: + name: '&4Shipwreck''s Sword' + lore: + - '&a可能是從一艘船的擱淺殘骸中即興創作的!' +primis_storm_temple_drop_axe: + name: '&b風暴斧' + lore: + - '&b風會擊退他們。' +primis_storm_temple_drop_boots: + name: '&b風暴靴' + lore: + - '&b風暴神殿' + - '&b不惜一切代價' +primis_storm_temple_drop_charm: + name: '&b風暴項鍊' + lore: + - '&b風暴的力量。' +primis_storm_temple_drop_chestplate: + name: '&b風暴胸甲' + lore: + - '&b風暴神殿' + - '&b不惜一切代價' +primis_storm_temple_drop_helmet: + name: '&b風暴頭盔' + lore: + - '&b風暴神殿' + - '&b不惜一切代價' +primis_storm_temple_drop_leggings: + name: '&b風暴護腿' + lore: + - '&b風暴神殿' + - '&b不惜一切代價' +primis_terravilla_big_trouble_in_little_pub_reward_leggings: + name: '&eEarth''s Blessing' + lore: + - '&eLooks heavy but it is' + - '&esurprisingly light.' + - '&eIt is clear that these' + - '&eleggings are at least a' + - '&efew centuries old.' +primis_terravilla_drowning_terror_reward_charm: + name: '&aFish Charm' + lore: + - '&aFishy.' +primis_terravilla_hog_on_my_porch_reward_helmet: + name: '&6Hog Helmet' + lore: + - '&6Made out of tough Razorback leather.' +primis_terravilla_perfect_sample: + name: '&ePerfect Sample' + lore: + - '&eIt looks like a fish...' + - '&eBut it sure isn''t...' +primis_terravilla_strike_the_earth_reward_sword: + name: '&5Earth Splitter' + lore: + - '&5You pulled this blade out of' + - '&5the Earth Elementals corpse.' + - '&5Unlike it''s dull twin, this' + - '&5blade is in pristine condition.' +primis_terravilla_taking_out_the_trash_reward_sword: + name: '&9Earth Splitter' + lore: + - '&9Looks ancient and dull.' +primis_terravilla_two_legged_terror_growth: + name: '&eTwo Legged Terror Growth' + lore: + - '&eLarge fleshy growth.' +primis_terravilla_two_legged_terror_sample: + name: '&eTwo Legged Terror Sample' + lore: + - '&eIt''s a simple sample.' +primis_wolf_hide_boots: + name: '&5狼皮之靴' + lore: + - '&d磨損和風化' + - '&d根本沒有盔甲!' +primis_wolf_hide_chestplate: + name: '&5狼皮軟甲' + lore: + - '&d磨損和風化' + - '&d根本沒有盔甲!' +primis_wolf_hide_helmet: + name: '&5狼皮頭盔' + lore: + - '&d磨損和風化' + - '&d根本沒有盔甲!' +primis_wolf_hide_leggings: + name: '&5狼皮褲' + lore: + - '&d磨損和風化' + - '&d根本沒有盔甲!' +pufferfish_drop_helmet: + name: '&bPuffer Helm' + lore: + - '&bOnce a fish, now a helmet.' +rabbit_charm: + name: '&b兔子飾品' + lore: + - '&a拿著這個飾品' + - '&a你可以躍過障礙' + - '&a從而跳往任何地方!' +rabbit_wolf_drop_chestplate: + name: '&6Electrically Charged Chestplate' + lore: + - '&6As long as you don''t mind a' + - '&6casual zap here and there.' +rabbit_wolf_drop_leggings: + name: '&6Flame Licked Leggings' + lore: + - '&6Just lightly scorched.' +regular_hoglin_drop_boots: + name: '&eHog Boots' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_chestplate: + name: '&eHog Armor' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_helmet: + name: '&eHog Hood' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_leggings: + name: '&eHog Leggings' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +rod_of_the_depths: + name: '&3深淵之杖' + lore: + - '&3你想知道在哪裡' + - '&3我從哪裡得到這個?聽我娓娓道來,' + - '&3我有一個故事給你...' +rotting_diver_drop_hoe: + name: '&bDivers Hoe' + lore: + - '&bFound on the Rotting Divers corpse.' +salamander_charm: + name: '&b火蠑飾品' + lore: + - '&a幾乎和MagmaGuy的' + - '&a新混音帶一樣熱!' +salty_corpse_drop_helmet: + name: '&aStinky Helm' + lore: + - '&aYou''re not sure why' + - '&ayou decided to pull' + - '&athis off of the corpse.' +scorpion_charm: + name: '&b毒蝎飾品' + lore: + - '&a飛浮如蝶' + - '&a針螫如蜂' + - '&a毒如洋芋' +shulker_charm: + name: '&b界伏飾品' + lore: + - '&a我相信我能飛' + - '&a我相信我能觸到天空' + - '&a而你將跟我一起去!' +skeleton_knight_drop_helmet: + name: '&fKnights Honor' + lore: + - '&fA knights helmet. Made to last.' +sky_archer_drop_bow: + name: '&aSky Bow' + lore: + - '&aGood for keeping phantoms at bay.' +slowpoke_charm: + name: '&b遲緩飾品' + lore: + - '&a希望它不要在' + - '&a混亂之中打中自己...' +spider_knight_drop_helmet: + name: '&aSmall Helmet' + lore: + - '&aA decent helmet. Maybe, a bit tight.' +stacked_bones_drop_helmet: + name: '&6Skull' + lore: + - '&6Large enough to fit your' + - '&6head inside, so why not.' +summon_merchant_scroll: + name: '&6招喚商人捲軸' + lore: + - '&a想賣點東西?' + - '右鍵啟用' + - '&a來呼叫 &9Jeeves!' +summon_wolf_scroll: + name: '&6召喚狼捲軸' + lore: + - '&a招喚一隻友善的狼' + - '&a來幫助你對抗精英!' + - '&a保證你會摸摸牠!' +super_mite_drop_charm: + name: '&dMite Pearl' + lore: + - '&dWas it worth it...' +air_ship_air_buccaneer_boots: + name: '&5Air Bucanneer 的靴子' + lore: + - '&d非常適合空降!' +air_ship_air_buccaneer_chestplate: + name: '&5Air Bucanneer 的胸甲' + lore: + - '&d非常適合空降!' +air_ship_air_buccaneer_helmet: + name: '&5Air Bucanneer 的頭盔' + lore: + - '&d非常適合空降!' +air_ship_air_buccaneer_leggings: + name: '&5Air Bucanneer 的護腿' + lore: + - '&d非常適合空降!' +air_ship_air_pirates_boots: + name: '&5空中海盜的靴子' + lore: + - '&d非常適合空降!' +air_ship_air_pirates_chestplate: + name: '&5空中海盜的胸甲' + lore: + - '&d非常適合空降!' +air_ship_air_pirates_helmet: + name: '&5空中海盜的頭盔' + lore: + - '&d非常適合空降!' +air_ship_air_pirates_leggings: + name: '&5空中海盜的護腿' + lore: + - '&d非常適合空降!' +air_ship_bowsmans_bow: + name: '&2弓箭手的弓' + lore: + - '&a是飛艇上用的弓' + - '&a成為飛艇弓手!' +air_ship_cannon_powder: + name: '&c砲彈' + lore: + - '&8你還怎麼想' + - '&8點燃保險絲?' +air_ship_daveys_digger: + name: '&4戴維的挖掘機' + lore: + - '&c戴維不想被壓迫' + - '&c笨蛋展示他的挖掘機。' +air_ship_quartermasters_whip: + name: '&f軍需官的鞭子' + lore: + - '&7合格的軍需官 ' + - '&7需要用他督促軍中生活' +air_ship_wayfinders_windlass: + name: '&3Wayfinder 的羅盤' + lore: + - '&b用於引導船隻' + - '&b除了星星什麼都沒有!' +pirate_ship_sea_feast: + name: '&6海宴' + lore: + - '&6眼睛的盛宴' + - '&6和健康欄!' +pirate_ship_sea_ration: + name: '&e海口糧' + lore: + - '&e一天一個蘋果' + - '&e壞血病遠離我' + - '&c注意:它不是蘋果' +catacombs_tier_10_miniboss_boots: + name: '&9蜘蛛紋靴子' + lore: + - '&5輕如空氣!' +catacombs_tier_10_miniboss_spider_eye: + name: '&7泰拉戈的眼睛' + lore: + - '&7不知從何處傳來的竊竊私語' + - '&7拿著這個的時候你的耳朵...' +catacombs_tier_15_boss_bone: + name: 骨之鑰 + lore: + - '&f你有骨頭要挑!' +catacombs_tier_15_boss_bow: + name: '&6骨之弓' + lore: + - '&f他們會覺得這個' + - '&f很像他們的骨頭' +catacombs_tier_15_boss_shovel: + name: '&8骨之鏟' + lore: + - '&f他們會覺得這個' + - '&f很像他們的骨頭!' +catacombs_tier_15_mimic_boss_shield: + name: '&3失落的聖堂武士之盾' + lore: + - 在一個神秘的箱子裡發現 + - 古代地下墓穴的密室…… +colosseum_pit_breaker: + name: '&4王者之鎬' + lore: + - '&4我來' +colosseum_pit_filler: + name: '&4&l王者之劍' + lore: + - '&4我征服' +colosseum_pit_maker: + name: '&4&l王者之鏟' + lore: + - '&4我見' +dark_cathedral_tier_75_sword: + name: '&0詛咒之劍' + lore: + - '&0&kChtulhu是唯一的真神。' + - '&0&k這個世界不過是一隻羔羊' + - '&0&k是他的屠宰場' +darkspire_arzags_boots: + name: '&8Arzag''s War的戰靴' + lore: + - '&7曾被強大的戰神穿戴過!' +darkspire_arzags_chestplate: + name: '&8Arzag''s War的胸甲' + lore: + - '&7曾被強大的戰神穿戴過!' +darkspire_arzags_helmet: + name: '&8Arzag''s War的頭盔' + lore: + - '&7曾被強大的戰神穿戴過!' +darkspire_arzags_leggings: + name: '&8Arzag''s War的護腿' + lore: + - '&7曾被強大的戰神穿戴過!' +darkspire_arzags_slicer: + name: '&8Arzag''s 短刀' + lore: + - '&7曾被強大的戰神穿戴過!' +darkspire_crypt_keepers_boots: + name: '&4地穴守護者的靴子' + lore: + - '&c以前的靴子' + - '&c腐敗的地穴守護者' +darkspire_hellraisers_battle_armor: + name: '&4埃爾比克斯的戰甲' + lore: + - '&c以前的裝備' + - '&c駭人的盔甲' + - '&c墮落者埃爾比克斯' +darkspire_maalkvs_bow: + name: '&4Maalkv''s之弓' + lore: + - '&c以前的弓' + - '&c淘氣的Maalkv!' +darkspire_netherite_axe: + name: '&8虛空剔骨者' + lore: + - '&8虛空碎片本身是' + - '&8收集形成劈裂' + - '&8這件遠古兵器的首領。' +darkspire_nicolas_ribcages_helmet: + name: '&4Nicolas Ribcage 的頭盔' + lore: + - '&c以前的頭盔' + - '&c邪惡的尼古拉斯肋骨' +darkspire_oroxaks_sword: + name: '&4歐洛克之劍' + lore: + - '&c以前的劍' + - '&c可惡的歐洛克' +darkspire_zalmurs_leggings: + name: '&4扎爾穆爾的護腿' + lore: + - '&c以前的護腿' + - '&c熱心的紮爾穆爾' + - '&c狂戰士' +the_feller: + name: '&2伐木者' + lore: + - '&a即使你睡著了,' + - '&a你仍可以感受到這斧' + - '&a對著樹蠢蠢欲望.' +the_great_weaver_drop_charm: + name: '&cWeavers Silk' + lore: + - '&cGreat power is imbued into this silk.' +hallosseum_amazing_treat: + name: '&a驚人的餅乾!' + lore: + - '&e很棒的小吃!' +hallosseum_axe_of_beheadings: + name: '&c斬首之斧' + lore: + - '&4著名地用來斬首' + - '&4某些無頭騎士' +hallosseum_incredible_treat: + name: '&a驚人的餅乾!' + lore: + - '&e令人難以置信的小吃!' +hallosseum_treat: + name: '&a對待!' + lore: + - '&e美味的小吃!' +hallosseum_treat_v2: + name: '&a對待!' + lore: + - '&e美味的小吃!' +the_hunter_drop_crossbow: + name: '&aHunter''s Friend' + lore: + - '&aLet the hunt begin.' +northpole_amazing_treat: + name: '&a驚人的餅乾!' + lore: + - '&e很棒的小吃!' +northpole_coalbringer: + name: '&8煤炭使者' + lore: + - '&c無論我碰什麼' + - '&c都會變成火!' + - '&c我太難了!' +northpole_frostcaster: + name: '&b冰霜施法者' + lore: + - '&7無論我碰什麼' + - '&7都會變成雪!' + - '&7我太難了!' +northpole_incredible_treat: + name: '&a驚人的餅乾!' + lore: + - '&e令人難以置信的小吃!' +northpole_naughty_lister: + name: '&4頑皮的李斯特' + lore: + - '&c取名字。不問兩次!' + - '&c今年你調皮了嗎?' +northpole_treat: + name: '&a對待!' + lore: + - '&e美味的小吃!' +northpole_treat_v2: + name: '&a對待!' + lore: + - '&e美味的小吃!' +the_phantom_drop_chestplate: + name: '&dPhantom Gambison' + lore: + - '&dYou would say it is made out of soft' + - '&dand comfy fibrous cloth, but a blade' + - '&dwould not recoil from striking cloth.' +pirate_ship_tier_15_boots: + name: 海盜涼鞋 + lore: + - 讓你想 + - 去海邊! +pirate_ship_tier_15_bow: + name: 海盜短弓 + lore: + - 非常適合派對! +pirate_ship_tier_15_chestplate: + name: 海盜襯衫 + lore: + - 沒有鞋子,沒有襯衫 + - 嗯?不是出現了? +pirate_ship_tier_15_helmet: + name: 海盜頭巾 + lore: + - 沒有鞋子,沒有襯衫 + - 這就是海盜! +pirate_ship_tier_15_leggings: + name: 海盜腰帶 + lore: + - These could use a wash! +pirate_ship_tier_15_sword: + name: 海盜馬林斯派克 + lore: + - 響亮而致命! +pirate_ship_tier_20_miniboss_axe: + name: '&5甜點廚師的碎肉錘' + lore: + - '&5明天你就會感覺到!' +pirate_ship_tier_20_miniboss_chestplate: + name: '&5甜點廚師的圍裙' + lore: + - '&5見過更好的日子!' +pirate_ship_tier_25_boots: + name: '&a海盜鞋' + lore: + - '&a非常適合小偷!' +pirate_ship_tier_25_bow: + name: '&a海盜火槍' + lore: + - '&a小心你指向它的地方!' +pirate_ship_tier_25_chestplate: + name: '&a海盜背心' + lore: + - '&a很可能是非法獲得的!' +pirate_ship_tier_25_helmet: + name: '&a海盜耳環' + lore: + - '&a值得支付' + - '&a一個葬禮!' +pirate_ship_tier_25_leggings: + name: '&a海盜褲' + lore: + - '&a滿滿的金幣!' +pirate_ship_tier_25_miniboss_helmet: + name: '&5舵手的眼罩' + lore: + - '&5怎樣才能看得更清楚' + - '&5帶著它!?' +pirate_ship_tier_25_miniboss_trident: + name: '&5舵手的三叉戟' + lore: + - '&5指向敵人的尖端!' +pirate_ship_tier_25_sword: + name: '&a海盜彎刀' + lore: + - '&a恭喜成為真正的海盜!' +pirate_ship_tier_30_miniboss_axe: + name: '&5粉碎的刀刃' + lore: + - '&5退後!' +pirate_ship_tier_30_miniboss_shield: + name: '&5粉碎的肩膀' + lore: + - '&5從來沒有跳過肩日!' +pirate_ship_tier_35_boots: + name: '&9海盜靴' + lore: + - '&9非常適合揮霍' +pirate_ship_tier_35_bow: + name: '&9海盜手炮' + lore: + - '&9炸開他們' +pirate_ship_tier_35_chestplate: + name: '&9海盜頭帶' + lore: + - '&9非常適合搶劫' +pirate_ship_tier_35_helmet: + name: '&9海盜眼罩' + lore: + - '&9不適合看!' +pirate_ship_tier_35_leggings: + name: '&9海盜護脛' + lore: + - '&9非常適合搶劫' +pirate_ship_tier_35_miniboss_boots: + name: '&9保鏢的靴子' + lore: + - '&5對於那些有東西要捍衛的人!' +pirate_ship_tier_35_miniboss_chestplate: + name: '&5保鏢的肩帶' + lore: + - '&5對於那些有東西要捍衛的人!' +pirate_ship_tier_35_miniboss_crossbow: + name: '&5保鏢手炮' + lore: + - '&5對於那些有東西要捍衛的人!' +pirate_ship_tier_35_miniboss_helmet: + name: '&5保鏢的眼罩' + lore: + - '&5對於那些有東西要捍衛的人!' +pirate_ship_tier_35_miniboss_leggings: + name: '&5保鏢的護脛' + lore: + - '&9對於那些有東西要捍衛的人!' +pirate_ship_tier_35_miniboss_sword: + name: '&5保鏢的彎刀' + lore: + - '&5對於那些有東西要捍衛的人!' +pirate_ship_tier_35_sword: + name: '&9海盜彎刀' + lore: + - '&9真正的海盜!' +pirate_ship_tier_40_miniboss_crossbow: + name: '&5雷筒' + lore: + - '&5噴灑與祈禱!' +pirate_ship_tier_40_miniboss_leggings: + name: '&5廉價錶' + lore: + - '&5當他們認為你要去的時候!' + - '&5他們不停的工作!' +pirate_ship_tier_45_boss_helmet: + name: '&5船長的眼罩' + lore: + - '&5我看不出有什麼問題!' +pirate_ship_tier_45_boss_sword: + name: '&5船長的彎刀' + lore: + - '&5擔心老鼠的黑死病!' +the_ruins_boss_loot: + name: '&6雷神之斧' + lore: + - 只有純潔的心 + - 才可揮舞這把斧頭。 +sewer_drowned_kings_boots: + name: '&4下水道之王的長靴' + lore: + - '&c以前的靴子' + - '&c邪惡的下水道之王!' +sewer_drowned_kings_chestplate: + name: '&4下水道之王的胸甲' + lore: + - '&c以前的胸甲' + - '&c邪惡的下水道之王!' +sewer_drowned_kings_crown: + name: '&4下水道之王的王冠' + lore: + - '&c以前的王冠' + - '&c邪惡的下水道之王!' +sewer_drowned_kings_leggings: + name: '&4下水道之王的護腿' + lore: + - '&c以前的護腿' + - '&c邪惡的下水道之王!' +sewer_drowned_kings_trident: + name: '&4下水道之王的三叉戟' + lore: + - '&c以前的三叉戟' + - '&c邪惡的下水道之王!' +sewer_spelunkers_boots: + name: '&2下水道探險者的靴子' + lore: + - '&a很適合在下水道探險' + - '&a探險家必備靴子!' +sewer_spelunkers_chestplate: + name: '&2下水道探險者的胸甲' + lore: + - '&a很適合在下水道探險' + - '&a探險家的必備胸甲!' +sewer_spelunkers_helmet: + name: '&2下水道探險者的頭盔' + lore: + - '&a很適合在下水道探險' + - '&a探險家必備頭盔!' +sewer_spelunkers_leggings: + name: '&2下水道探險者護腿' + lore: + - '&a很適合在下水道探險' + - '&a探險家必備護腿!' +sewer_spelunkers_sword: + name: '&2下水道探險者的劍' + lore: + - '&a很適合在下水道探險' + - '&a探險家必備之劍!' +the_stinger: + name: '&e毒刺' + lore: + - '&a飛浮如蝶' + - '&a像蜜蜂一樣刺痛!' +tree_defender_drop_shield: + name: '&7Living Wood Shield' + lore: + - '&7This shield will' + - '&7slowly repair itself.' +unbind_scroll: + name: '&5解綁卷軸' + lore: + - '&5允許使用者解除綁定物品' + - '&5在鐵砧上靈魂綁定物品!' + - '&5明智地使用!' +undead_farmer_drop_shovel: + name: '&8Manure Master' + lore: + - '&8Perfect for shoveling pig manure.' +unwanted_visitor_drop_bow: + name: '&1Frost Bow' + lore: + - '&9Makes you wanna chill' + - '&9and snipe from afar.' +vampire_manor_gargoyle_granulator: + name: '&8石像鬼製造機' + lore: + - '&c輕輕撒上大蒜。' +vampire_manor_stake_your_claim: + name: '&4賭上你的主張' + lore: + - '&c輕輕撒上大蒜。' +vampiric_charm: + name: '&b吸血鬼飾品' + lore: + - '&a沒人會記得它' + - '&a從哪裡來,也沒人可以' + - '&a它有多危險...' +veterans_boots: + name: '&6老兵長靴' + lore: + - '&2獎勵給挑戰者' + - '&2木階聯盟競技場!' +veterans_chestplate: + name: '&6老兵的胸甲' + lore: + - '&2獎勵給挑戰者' + - '&2木階聯盟競技場!' +veterans_helmet: + name: '&6老兵頭盔' + lore: + - '&2獎勵給挑戰者' + - '&2木階聯盟競技場!' +veterans_leggings: + name: '&6老兵護腿' + lore: + - '&2獎勵給挑戰者' + - '&2木階聯盟競技場!' +veterans_sword: + name: '&6老兵之劍' + lore: + - '&2獎勵給挑戰者' + - '&2木階聯盟競技場!' +vex_top_drop_boots: + name: '&bVexed Boots' + lore: + - '&bWith mighty boots' + - '&bcomes mighty strength.' +warlock_drop_chestplate: + name: '&dWarlock Robes' + lore: + - '&dOffers good protection from spells.' +warlock_drop_helmet: + name: '&dWarlock Hood' + lore: + - '&dOffers good protection from spells.' +water_pest_drop_shield: + name: '&bWater Logged Shield' + lore: + - '&bIt''s pretty sturdy actually.' +wendigo_drop_sword: + name: '&8Blade of Starving' + lore: + - '&8This blade will always' + - '&8hunger for more blood.' +werehare_drop_charm: + name: '&eWerehare Trophy' + lore: + - '&eLuck and health to' + - 'ðose who carry it.' +werewolf_bone: + name: '&6狼人骨頭' + lore: + - '&a殺死了 alpha 後,' + - '&a這暫時讓你成為!' + - '&a狼隊的新領袖' +wolfsbane: + name: '&7狼毒' + lore: + - '&a由殘骸製成' + - '&a和 alpha wolf' + - '&a狼看到它就畏縮了。' +yeti_drop_leggings: + name: '&eFur Leggings' + lore: + - '&eNice and warm.' +yezhi_baba_drop_boots: + name: '&aWitches Robes' + lore: + - '&aThe smell should go' + - '&aaway eventually.' +zombie_kings_axe: + name: '&4殭屍王之斧' + lore: + - 這屬於一個獨特殭屍的斧頭 + - 稱為它們的王. + - 上面沾滿著鮮血. +airship_minidungeon: + name: '&6飛空艇' + customInfo: + - '&f1艘很厲害的飛空艇上充滿著亡者海盜!' + - '&6製作: MagmaGuy, 69OzCanOfBepis' + - '&6和 Realm of Lotheridon' + playerInfo: |- + 難度: &6普通 + $bossCount個首領,等級範圍: $lowestTier-$highestTier + &6適合已身經百戰的冒險者家 + &6來挑戰這艘充滿亡者海盜的飛空挺 + regionEnterMessage: '&8[EM] &c進入敵意空域!' + regionLeaveMessage: '&8[EM] &c離開敵意空域!' +binder_of_worlds_lair: + name: '&5世界間隙' + customInfo: + - '&5做好準備. 這是終極挑戰!' + - '&6製作: MagmaGuy, 69OzCanOfBepis' + playerInfo: |- + 難度: &6夢魘 + $bossCount 等級 $highestTier 最終頭目! + &5在精英怪物中這是一場艱困戰鬥! + regionEnterMessage: '&8[EM] &5現實正面臨解體. 你將面對最終挑戰. &4你還沒準備好!' + regionLeaveMessage: '&8[EM] &5你將離開這個鬼地方. 你是否找到你想要的? 它是否值得?' +catacombs_lair: + name: '&8墓穴' + customInfo: + - '&f最佳的入門級地下城!' + - '&6製作: Realm of Lotheridon' + playerInfo: |- + 難度:&c困難 + $bossCount 個Boss,等級範圍:$lowestTier - $highestTier + &2適合初學者的最佳巢穴! + regionEnterMessage: '&8[EM] &8你正踏入墓穴。請小心你的腳步...' + regionLeaveMessage: '&8[EM] &8你離開了墓穴。這個旅途有值得嗎?' +colosseum_lair: + name: '&6鬥獸場' + customInfo: + - '&f包含真正意義上第一個世界首領,' + - '&f面對多段戰鬥和第一個騎著座騎的首領.' + - '&f以及第一個偽裝型首領,一個史詩級戰鬥!' + - '&6製作: MagmaGuy & Maldini' + playerInfo: |- + 難度:&c困難 + $bossCount 個Boss,等級範圍$lowestTier - $highestTier + &c對大部分玩家來說,是一個大挑戰! + regionEnterMessage: '&8[EM] &6勇士們和挑戰者們請準備好!&e對抗強敵來證明你的價值!' + regionLeaveMessage: '&8[EM] &6再會,旅行者!&e下次再來展現你的力量!' +dark_cathedral_lair: + name: '黑暗大教堂' + customInfo: + - '&f這是第一個精英怪物上的地城!' + - '&f伺服器必備的經典!' + - '&6製作: MagmaGuy, 69OzCanOfBepis' + playerInfo: |- + 難度:&c困難 + $bossCount 個 $highestTier 等級的大Boss! + &c原始的迷你副本,歡迎單獨挑戰! + regionEnterMessage: '&8[EM] &8歡迎來到黑暗大教堂。 &4死亡在裡面等待...' + regionLeaveMessage: '&8[EM] &8現在離開黑暗大教堂。 &4它等待你的歸來...' +dark_spire_minidungeon: + name: '&8黑暗尖塔' + customInfo: + - '&f是為第一個高等級的地城!' + - '&f專為那些需要真正挑戰的冒險者準備!' + - '&6製作: 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6中等 + $bossCount 個Boss,等級範圍$lowestTier - $highestTier + &c高級玩家的巨大挑戰! + regionEnterMessage: '&8[EM] &1入侵進行中. &9阻止那些侵略者!' + regionLeaveMessage: '&8[EM] &1你成功地拖住它們了. &9暫時的...' +fireworks_lair: + name: '&a活潑的煙火' + customInfo: + - '&f2021 年 7 月 4 日的地圖!' + - '&6致謝:MagmaGuy' + playerInfo: |- + 難度:&c困難 + $bossCount 個 $lowestTier 等級的大Boss! + &6一場充滿爆炸的邂逅! + regionEnterMessage: '&8[EM] &e歡迎來到煙花秀現場!' + regionLeaveMessage: '&8[EM] &e你離開了派對!' +frost_palace_sanctum: + name: Frost Palace + customInfo: + - '&fA 7 phase fight against' + - the queen of ice! + - '&6Credits: MagmaGuy, Delio' + playerInfo: 'Difficulty: &45-man hard content!' + regionEnterMessage: '&bYou are stepping into the Frost Palace! Stay frosty!' + regionLeaveMessage: '&bYou have left the Frost Palace!' +hallosseum_lair: + name: '&c哈洛瑟姆殿' + customInfo: + - '&f 2020年萬聖節特別內容!' + - '&6製作: MagmaGuy, 69OzCanOfBepis' + playerInfo: |- + 難度:&c困難 + $bossCount 個 $lowestTier 等級的大Boss! + &6一個有趣的萬聖節挑戰! + regionEnterMessage: '&8[EM] &4不給糖就搗蛋 &8你的靈魂是我的!' + regionLeaveMessage: '&8[EM] &4在沒有被奪走靈魂下, 你成功逃脫了.' +invasion_minidungeon: + name: '&2入侵' + customInfo: + - '&f萬聖節迷你地牢' + - '&6製作: MagmaGuy, 69OzCanOfBepis' + playerInfo: |- + 難度:&6中等 + $bossCount 個Boss,等級範圍:$lowestTier - $highestTier + &6不要被綁架! + regionEnterMessage: '&8[EM] &7外星人入侵進行中!打敗母艦!' + regionLeaveMessage: '&8[EM] &7你已經逃脫了外星人的綁架!沒有人會相信你。' +north_pole_minidungeon: + name: '&9北極' + customInfo: + - '&f聖誕節的地城!' + - '&6製作: MagmaGuy, 69OzCanOfBepis' + playerInfo: |- + 難度:&6中等 + $bossCount 個Boss,等級範圍: $lowestTier - $highestTier + &6在雪球中渡過聖誕節! + regionEnterMessage: '&8[EM] &7你來到了北極! &f今年有不乖嗎?' + regionLeaveMessage: '&8[EM] &7下次再來拜訪吧. &f這裡還有很多糖果和點心!' +oasis_adventure: + name: '&6綠洲' + customInfo: + - '&f為初學者提供的大型冒險!' + - '&6製作: 69OzCanOfBepis' + playerInfo: |- + 難度:&2超級簡單 + $bossCount 個Boss,等級範圍:$lowestTier - $highestTier + &6對於新手來說,這是一次大冒險! + regionEnterMessage: '&8[EM] &6你抵達了綠洲!' + regionLeaveMessage: '&8[EM] &6你離開了綠洲!' +pirate_ship_minidungeon: + name: '&6海盜船' + customInfo: + - '&f有趣, 且具有挑戰性的迷你地城' + - '&f適合結束初學者的玩家們,' + - '&來開始農物品!' + - '&6製作: MagmaGuy & Realm of Lotheridon' + playerInfo: |- + 難度:&6中等 + $bossCount 個Boss,等級範圍: $lowestTier - $highestTier + &6對於&6開始晉昇的的冒險者們來說,這是最佳的獵場之一! + regionEnterMessage: '&8[EM] &3現在登上海盜船的甲板! &b盡情地掠奪跟劫掠吧!' + regionLeaveMessage: '&8[EM] &3玩家已下船! &b當你又想賺的時候再回來吧, 你們這些陸地人!' +primis_adventure: + name: '&7普里米斯' + customInfo: + - '&f新玩家的大冒險!' + - '&6致謝:69OzCanOfBepis,MagmaGuy' + playerInfo: |- + 難度:&2簡單 + $bossCount 個Boss,等級範圍:$lowestTier - $highestTier + &6新玩家的大冒險! + regionEnterMessage: '&8[EM] &6普里米斯星球將撞擊地球!' + regionLeaveMessage: '&8[EM] &6你離開了普里米斯!' +sewers_minidungeon: + name: '&8下水道' + customInfo: + - '&f在迷你地城中最大的!' + - '&6製作: MagmaGuy, 69OzCanOfBepis' + playerInfo: |- + 難度:&6中等 + $bossCount 個Boss,等級範圍: $lowestTier - $highestTier + &6充滿挑戰區塊且完整的地城! + regionEnterMessage: '&8[EM] &5這地方看起來棄用很久... &d然而仍有一些寶貝藏在下水道裡!' + regionLeaveMessage: '&8[EM] &5你這次成功保持在水面上. &d但下一次也許就會沉入.' +the_ruins: + name: '&6廢墟' + customInfo: + - '&f與神話的鬥爭' + - '&f北歐神話,準備好迎接挑戰吧!' + - '&6致謝:69OzCanOfBepis,MagmaGuy' + playerInfo: |- + 難度:&c困難 + $bossCount 個 $lowestTier 等級範圍的Boss + &c與北歐神進行一場艱苦的戰鬥! + regionEnterMessage: '&8[EM] &3那些挑戰神話的人必須為他們的後悔做好準備!' + regionLeaveMessage: '&8[EM] &3您現在知道創造傳奇需要什麼!' +vampire_manor: + name: '&c吸血鬼莊園' + customInfo: + - '&f準備流血!' + - '&6製作: MagmaGuy, 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6中等 + $bossCount 個Boss,等級範圍:$lowestTier - $highestTier + &6一個充滿嗜血生物的致命莊園! + &6你準備好面對恐怖的夜晚了嗎? + regionEnterMessage: '&8[EM] &c擅闖危險地帶!!' + regionLeaveMessage: '&8[EM] &c離開這恐怖的地方!' +alpha_werewolf_p1: + name: '$eventBossLevel &7憤怒的衛道士' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Alpha Wolf 即將出沒!' + - '&c&l 1st 輸出者: $damager1name &c造成 $damager1damage 點傷害!' + - '&6&l 2nd 輸出者: $damager2name &6造成 $damager2damage 點傷害!' + - '&e&l 3rd 輸出者: $damager3name &e造成 $damager3damage 點傷害!' + - '&a擊殺者: $players' + - '&e&l---------------------------------------------' + locationMessage: '&7憤怒的衛道士距離:$distance 格' + spawnMessage: '&cAlpha Wolf的嚎叫聲響起!' + deathMessage: '&aAlpha wolf 已被 $players 擊敗!' + escapeMessage: '&4黎明破曉,Alpha Wolf消失得無影無踪!' +alpha_werewolf_p2: + name: '$eventBossLevel &7Alpha wolf' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Alpha Wolf 即將出沒!' + - '&c&l 1st 輸出者: $damager1name &c造成 $damager1damage 點傷害!' + - '&6&l 2nd 輸出者: $damager2name &6造成 $damager2damage 點傷害!' + - '&e&l 3rd 輸出者: $damager3name &e造成 $damager3damage 點傷害!' + - '&a擊殺者: $players' + - '&e&l---------------------------------------------' + locationMessage: '&7Alpha Wolf距離:$distance 格!' + spawnMessage: '&cAlpha Wolf的嚎叫聲響起!' + deathMessage: '&aAlpha wolf 已被 $players 擊敗!' + escapeMessage: '&4黎明破曉,Alpha Wolf消失得無影無踪!' +ancient_corpse: + name: '$eventBossLevel &eAncient Corpse' +animated_armor: + name: '$eventBossLevel &8Animated Armor' + locationMessage: '&cAnimated Armor: $distance blocks away!' + spawnMessage: '&cOh no! An Animated Armor has escape from it''s armor stand!' + deathMessage: '&aThe Animated Armor was stopped by $players!' + escapeMessage: '&4The Animated Armor is gone!' +arachnid_matriarch: + name: '$eventBossLevel &cArachnid Matriarch' + locationMessage: '&cArachnid Matriarch: $distance blocks away!' + spawnMessage: '&cA Matriarch has come to spread her brood across the land!' + deathMessage: '&aThe Matriarch and her brood were stopped by $players!' + escapeMessage: '&4The Matriarch has left!' +arachnid_matriarch_summon: + name: '$eventBossLevel &4Broodling' +armor_goblin: + name: '$eventBossLevel &3裝甲哥布林' + deathMessages: + - '&e&l---------------------------------------------' + - '&e裝甲哥布林被掠奪了!' + - '&c&l 1st 輸出者: $damager1name &c造成 $damager1damage 點傷害!' + - '&6&l 2nd 輸出者: $damager2name &6造成 $damager2damage 點傷害!' + - '&e&l 3rd 輸出者: $damager3name &e造成 $damager3damage 點傷害!' + - '&a擊殺者: $players' + - '&e&l---------------------------------------------' + locationMessage: '&c裝甲哥布林距離:$distance 格!' + spawnMessage: '&c裝甲哥布林被發現了!' + deathMessage: '&a裝甲哥布林已被 $players 擊殺!' + escapeMessage: '&4裝甲哥布林逃走了!' +baba_rhoga: + name: '$eventBossLevel &cBaba Rhoga' + locationMessage: '&cBaba Rhoga: $distance blocks away!' + spawnMessage: '&cA wicked hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +baba_rhoga_summon: + name: '$reinforcementLevel &4Baba Rhoga' +baba_yaga: + name: '$eventBossLevel &cBaba Yaga' + locationMessage: '&cBaba Yaga: $distance blocks away!' + spawnMessage: '&cA wicked hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +baba_yaga_summon: + name: '$reinforcementLevel &4Baba Yaga' +balloon_rider: + name: '$eventBossLevel &dBalloon Rider' + locationMessage: '&cBalloon Rider: $distance blocks away!' + spawnMessage: '&cA brave Balloon Rider has come to the Nether!' + deathMessage: '&aThe Balloon Rider has taken his last ride thanks to $players!' + escapeMessage: '&4The Balloon Rider has floated away!' +balloon_rider_mount: + name: '$eventBossLevel &5Ghastly Balloon' +balrog: + name: '$eventBossLevel &4被縮水的炎魔' +banshee: + name: '$eventBossLevel &cBanshee' + locationMessage: '&cBanshee: $distance blocks away!' + spawnMessage: '&cA Banshee''s wail can be heard!' + deathMessage: '&aThe Banshee was silenced by $players!' + escapeMessage: '&4The Banshee has left!' +banshee_summon: + name: '$eventBossLevel &cGrief' +beast_master: + name: '$eventBossLevel &6獸王' + deathMessages: + - '&e&l---------------------------------------------' + - '&e獸王被虐了!' + - '&c&l 1st 輸出者: $damager1name &c造成 $damager1damage 點傷害!' + - '&6&l 2nd 輸出者: $damager2name &6造成 $damager2damage 點傷害!' + - '&e&l 3rd 輸出者: $damager3name &e造成 $damager3damage 點傷害!' + - '&a擊殺者: $players' + - '&e&l---------------------------------------------' + locationMessage: '&c獸王距離:$distance 格!' + spawnMessage: '&c獸王被看見了!' + deathMessage: '&a獸王被$players擊殺!' + escapeMessage: '&4獸王重歸荒野!' +beast_tamer: + name: '$eventBossLevel &eBeast Tamer' + locationMessage: '&cBeast Tamer: $distance blocks away!' + spawnMessage: '&cA master of beasts roams the world!' + deathMessage: '&aThe Beast Tamer was stopped by $players!' + escapeMessage: '&4The Beast Tamer has left!' +beast_tamer_summon: + name: '$eventBossLevel &6Large Beast' +beast_tamer_summon_1: + name: '$eventBossLevel &6Beast' +beta_wolf: + name: '$reinforcementLevel &7貝塔狼' +bigfoot: + name: '$eventBossLevel &fBigfoot' + locationMessage: '&cBigfoot: $distance blocks away!' + spawnMessage: '&cA mighty beast has appeared!' + deathMessage: '&aThe beast is no more thanks to $players!.' + escapeMessage: '&4The beast has escaped!' +big_bad_wolf: + name: '$eventBossLevel &fBig Bad Wolf' + locationMessage: '&cBig Bad Wolf: $distance blocks away!' + spawnMessage: '&cAnd he huffed and he puffed!' + deathMessage: '&aThe little piggies are now safe thanks to $players!' + escapeMessage: '&4The Big Bad Wolf has left!' +binder_of_worlds_phase_1_endermite_reinforcement: + name: '$reinforcementLevel &5現實腐化者' +binder_of_worlds_phase_3_enderman_reinforcement: + name: '$reinforcementLevel &5R現實屠殺者' +binder_of_worlds_phase_3_ghast_reinforcement: + name: '$reinforcementLevel &5現實粉碎者' +blayyze: + name: '$eventBossLevel &6布雷茲' + deathMessages: + - '&e&l---------------------------------------------' + - '6布雷茲的火燄就此殞滅!' + - '&c&l 1st 輸出者: $damager1name &c造成 $damager1damage 點傷害!' + - '&6&l 2nd 輸出者: $damager2name &6造成 $damager2damage 點傷害!' + - '&e&l 3rd 輸出者: $damager3name &e造成 $damager3damage 點傷害!' + - '&a擊殺者: $players' + - '&e&l---------------------------------------------' + locationMessage: '&6????距離: $distance 格' + spawnMessage: '&c有什麼東西從隕石坑中出現了...' + deathMessage: '&6$players 完成了第一類接觸.' + escapeMessage: '&6布雷茲逃回51特區了!' +bloated_jeffrey: + name: '$eventBossLevel &dBloated Jeffrey' + locationMessage: '&cBloated Jeffrey: $distance blocks away!' + spawnMessage: '&cIt''s Jeffrey! They are in the nether! Bring a bow!' + deathMessage: '&aBloated Jeffrey has been slain by $players!' + escapeMessage: '&4Jeffrey and his friends grew bored and they left!' +bloated_jeffrey_summon: + name: '$eventBossLevel &dJeffrey''s Friend' +bone_fiend: + name: '$eventBossLevel &7Bone Fiend' + locationMessage: '&cBone Fiend: $distance blocks away!' + spawnMessage: '&cA creature of bone and bone has appeared!' + deathMessage: '&aThe Bone Fiend was defeated by $players!' + escapeMessage: '&4The Bone Fiend found no bone and left!' +bone_fiend_mount: + name: '$eventBossLevel &8Bone Carrier' +changeling: + name: '$eventBossLevel &4Changeling' + locationMessage: '&cChangeling: $distance blocks away!' + spawnMessage: '&cA shape-shifter has entered this world.' + deathMessage: '&aThe Changeling was stopped by $players!' + escapeMessage: '&4The Changeling has escaped!' +changeling_p2: + name: '$eventBossLevel &4Changeling' +changeling_p3: + name: '$eventBossLevel &4Changeling' +changeling_p4: + name: '$eventBossLevel &4Changeling' +changeling_p5: + name: '$eventBossLevel &4Changeling' +changeling_p6: + name: '$eventBossLevel &4Changeling' +changeling_p7: + name: '$eventBossLevel &4Changeling' +charms_goblin: + name: '$eventBossLevel &2魅惑哥布林' + deathMessages: + - '&e&l---------------------------------------------' + - '&e魅惑哥布林被掠奪了!' + - '&c&l 1st 輸出者: $damager1name &c造成 $damager1damage 點傷害!' + - '&6&l 2nd 輸出者: $damager2name &6造成 $damager2damage 點傷害!' + - '&e&l 3rd 輸出者: $damager3name &e造成 $damager3damage 點傷害!' + - '&a擊殺者: $players' + - '&e&l---------------------------------------------' + locationMessage: '&c魅惑哥布林距離:$distance 格!' + spawnMessage: '&c魅惑哥布林被發現了!' + deathMessage: '&a魅惑哥布林已被 $players 擊殺!' + escapeMessage: '&4魅惑哥布林逃脫了!' +circus_ringmaster: + name: '$eventBossLevel &dRingmaster' + locationMessage: '&cCircus Ringmaster: $distance blocks away!' + spawnMessage: '&cA terrible circus is in town!' + deathMessage: '&a$players has stopped the RIngmasters reign of abuse!' + escapeMessage: '&4The circus has left town!' +circus_ringmaster_summon: + name: '$eventBossLevel &5Tortured Animal' +circus_ringmaster_summon_1: + name: '$eventBossLevel &5Abused Clown' +circus_ringmaster_summon_2: + name: '$eventBossLevel &5Mistreated Balloon' +coins_goblin: + name: '$eventBossLevel &e精英幣哥布林' + deathMessages: + - '&e&l---------------------------------------------' + - '&e精英幣哥布林被掠奪了!' + - '&c&l 1st 輸出者: $damager1name &c造成 $damager1damage 點傷害!' + - '&6&l 2nd 輸出者: $damager2name &6造成 $damager2damage 點傷害!' + - '&e&l 3rd 輸出者: $damager3name &e造成 $damager3damage 點傷害!' + - '&a擊殺者: $players' + - '&e&l---------------------------------------------' + locationMessage: '&c精英幣哥布林距離:$distance 外!' + spawnMessage: '&c精英幣哥布林被發現了!' + deathMessage: '&a精英幣哥布林被$玩家殺死!' + escapeMessage: '&4精英幣哥布林逃脫了!' +craftenmine_stacked_bones: + name: '$eventBossLevel &eArmed Skull' + locationMessage: '&cDr. Craftenmine''s Stacked Bones: $distance blocks away!' + spawnMessage: '&cA horrible Dr. Craftenmine creation is out in the wild!' + deathMessage: '&aThe horrible Stacked-Bones creation was slain by $players!' + escapeMessage: '&4Dr. Craftenmines horrible creation has escaped!' +craftenmine_stacked_bones_ankle: + name: '$eventBossLevel &6Armed Ankle' +craftenmine_stacked_bones_backbone: + name: '$eventBossLevel &6Armed Backbone' +craftenmine_stacked_bones_femur: + name: '$eventBossLevel &6Armed Femur' +craftenmine_stacked_bones_spine: + name: '$eventBossLevel &6Armed Spine' +craftenmine_terror: + name: '$eventBossLevel &cLobotimized Ghast' + locationMessage: '&cDr. Craftenmine''s Terror: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine creation is on the loose!' + deathMessage: '&aThe Lobotimized Ghast was slain by $players!' + escapeMessage: '&4The Lobotimized Ghast has left!' +craftenmine_terror_mount: + name: '$eventBossLevel &dGhast Carrier' +creeperpede_1: + name: '$eventBossLevel &5Creeperpede Observer' + locationMessage: '&cCreeperpede: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine experiment is on the loose!' + deathMessage: '&aThe Creeperpede was stopped in its tracks by $players!.' + escapeMessage: '&4AThe Dr. Craftenmine experiment has managed to escape!' +creeperpede_2: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_3: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_4: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_5: + name: '$eventBossLevel &5Creeperpede Carrier' +crone: + name: '$eventBossLevel &aOld Crone' + locationMessage: '&cOld Crone: $distance blocks away!' + spawnMessage: '&cAn Old Crone has wandered into this world!' + deathMessage: '&aThe Crone was vanquished by $players!.' + escapeMessage: '&4The Old Crone has left this world on her broom!' +crone_summon: + name: '$eventBossLevel &fPet Spider' +divine_cinder: + name: '$eventBossLevel &cDivine Cinder' + locationMessage: '&cDivine Cinder: $distance blocks away!' + spawnMessage: '&cA divine blaze has appeared!' + deathMessage: '&aThe Divine Cinder was defeated by $players!' + escapeMessage: '&4The Divine Cinder has smoked away!' +ember: + name: '$reinforcementLevel &c餘燼' +enders_1: + name: '$eventBossLevel &dEnderlad' + locationMessage: '&cEnder Clique: $distance blocks away!' + spawnMessage: '&cA group of ender troublemakers have appeared.' + deathMessage: '&aThe Ender Clique was stopped by $players!' + escapeMessage: '&4The Ender Clique have left!' +enders_2: + name: '$eventBossLevel &dEnderchap' + locationMessage: '&cClique Member: $distance blocks away!' +enders_3: + name: '$eventBossLevel &dEnderdude' + locationMessage: '&cClique Member: $distance blocks away!' +ender_lapin: + name: '$eventBossLevel &aEnder Lapin' +endless_pursuer: + name: '$eventBossLevel &dEndless Pursuer' + locationMessage: '&cEndless Pursuer: $distance blocks away!' + spawnMessage: '&cIt will not stop chasing...' + deathMessage: '&aThe chase has stopped thanks to $players!' + escapeMessage: '&4The Pursuer has vanished!' +enraged_snowman: + name: '$eventBossLevel &1Enraged Snowman' + locationMessage: '&cEnraged Snowman: $distance blocks away!' + spawnMessage: '&cAn angry Snowman was sighted!' + deathMessage: '&aThe Enraged Snowman was put to rest by $players!' + escapeMessage: '&4The Enraged Snowman has vanished!' +evil_undead: + name: '$eventBossLevel &cEvil Undead' + locationMessage: '&cEvil Undead: $distance blocks away!' + spawnMessage: '&cAn Evil Undead has appeared!' + deathMessage: '&aThe Evil Undead was put to rest by $players!' + escapeMessage: '&4The Evil Undead has escaped!' +evil_undead_p2: + name: '$eventBossLevel &cEvil Undead' + locationMessage: '&cEvil Undead: $distance blocks away!' + spawnMessage: '&cAn Evil Undead has appeared!' + deathMessage: '&aThe Evil Undead was put to rest by $players!' + escapeMessage: '&4The Evil Undead has escaped!' +fallen_knight: + name: '$eventBossLevel &7Fallen Knight' + locationMessage: '&cFallen Knight: $distance blocks away!' + spawnMessage: '&cA Fallen Knight rises from their grave!' + deathMessage: '&aA Fallen Knight has fallen to $players!.' + escapeMessage: '&4The Fallen Knight goes back to slumber!' +fine_swine: + name: '$eventBossLevel &eFine Swine' +fine_swine_summon: + name: '$eventBossLevel &eMighty Protector' +firestarter: + name: '$eventBossLevel &6Firestarter' + locationMessage: '&cFirestarter: $distance blocks away!' + spawnMessage: '&cA wicked Firestarter has appeared!' + deathMessage: '&aThe Firestarter was slain by $players!' + escapeMessage: '&4The Firestarter has left!' +firestarter_mount: + name: '$eventBossLevel &6Spark' +fire_conjurer: + name: '$eventBossLevel &eFire Conjurer' + locationMessage: '&cFire Conjurer: $distance blocks away!' + spawnMessage: '&cA master of fire and flame walks this world!' + deathMessage: '&aThe Fire Conjurer was extinguished by $players!' + escapeMessage: '&4The Fire Conjurer has vanished!' +fire_conjurer_summon: + name: '$eventBossLevel &6Summoned Flame' +fire_fae: + name: '$eventBossLevel &c火燄妖靈' +foreign_visitor: + name: '$eventBossLevel &5Foreign Visitor' + locationMessage: '&cForeign Visitor: $distance blocks away!' + spawnMessage: '&cA visitor from a another dimension has arrived!' + deathMessage: '&a$players has made sure to let the visitor know that they are not welcome here.' + escapeMessage: '&4The visitor has gone back home!' +fox_king_cold: + name: '$eventBossLevel &1Fox King Cold' + locationMessage: '&cFox King Cold: $distance blocks away!' + spawnMessage: '&cA magical creature roams the world.' + deathMessage: '&aFox King Cold was defeated by $players!' + escapeMessage: '&4Fox King Cold has left this world.' +frost_palace_frost_queen_p0: + name: '$bossLevel &8Frost Queen' + locationMessage: '&9Frost Queen' + spawnMessage: '&9The wind howls. The Frost Queen rises up to the challenge.' + deathMessage: '&aThe Frost queen is no more, slain by $players!' +frost_palace_frost_queen_p1: + name: '$bossLevel &8Frost Queen phase 1' + locationMessage: '&9Frost Queen phase 1' +frost_palace_frost_queen_p2: + name: '$bossLevel &8Frost Queen phase 2' + locationMessage: '&9Frost Queen phase 2' +frost_palace_frost_queen_p3: + name: '$bossLevel &8Frost Queen phase 3' + locationMessage: '&9Frost Queen phase 3' +frost_palace_frost_queen_p4: + name: '$bossLevel &8Frost Queen phase 4' + locationMessage: '&9Frost Queen phase 4' +frost_palace_frost_queen_p5: + name: '$bossLevel &8Frost Queen phase 5' + locationMessage: '&9Frost Queen phase 5' +frost_palace_frost_queen_p6: + name: '$bossLevel &8Frost Queen phase 6' + locationMessage: '&9Frost Queen phase 6' +frost_palace_frost_queen_p7: + name: '$bossLevel &8Frost Queen phase 7' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Frost Queen was thawed!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&9Frost Queen phase 7' +frost_palace_reinforcement_1: + name: '$reinforcementLevel Spirit of Winter' +frost_palace_reinforcement_2: + name: '$reinforcementLevel Spirit of Spring' +frost_palace_reinforcement_3: + name: '$reinforcementLevel Spirit of Summer' +fulgora: + name: '$eventBossLevel &3Fulgora' + locationMessage: '&cFulgora: $distance blocks away!' + spawnMessage: '&cA mighty thunder goat has come!' + deathMessage: '&aFulgora was stopped by $players!' + escapeMessage: '&4Fulgora has left this place!' +gamma_werewolf: + name: '$reinforcementLevel &7伽瑪狼人' +goblin_invader: + name: '$eventBossLevel &2Goblin Leader' + locationMessage: '&cGoblin Army: $distance blocks away!' + spawnMessage: '&cA Goblin Army has invaded this realm!' + deathMessage: '&aThe Goblin Army has been vanquished by $players!' + escapeMessage: '&4The Goblin Army is done with this realm!' +goblin_invader_summon_1: + name: '&2Goblin Warrior' +goblin_invader_summon_2: + name: '&2Goblin Fighter' +goblin_invader_summon_3: + name: '&2Goblin Trooper' +goblin_invader_summon_4: + name: '&2Goblin Reinforcements' +greedy_dwarf: + name: '$eventBossLevel &9Greedy Dwarf' + locationMessage: '&cGreedy Dwarf: $distance blocks away!' + spawnMessage: '&cCan you find the Greedy Dwarf digging somewhere underground?!' + deathMessage: '&aThe Greedy Dwarf was released of their curse by $players!' + escapeMessage: '&4The Greedy Dwarf had found their treasure and they left!' +gremlin_1: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + spawnMessage: '&cA Gremlin hoard has invaded this world!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_10: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_2: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_3: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_4: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_5: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_6: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_7: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_8: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_9: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +grunter: + name: '$eventBossLevel &aGrunter' + locationMessage: '&cGrunter: $distance blocks away!' + spawnMessage: '&cA mighty hog roams the lands.' + deathMessage: '&aGrunter was stopped by $players!' + escapeMessage: '&4Grunter has escaped!' +harmless_chicken: + name: '$eventBossLevel &fHarmless Chick' + locationMessage: '&cHarmless Chick: $distance blocks away!' + spawnMessage: '&cBwok!!! Cluck, Cluck! Bawk!' + deathMessage: '&aBaaaawk! Cluck...$players!' + escapeMessage: '&4Harmless Chicken has baaaaaawked away.' +harmless_chicken_summon: + name: '$eventBossLevel &fClucktector' +hog_rider: + name: '$eventBossLevel &6Hog Rider' + locationMessage: '&cHog Rider: $distance blocks away!' + spawnMessage: '&cA mighty Hog Rider has appeared!' + deathMessage: '&aThe Hog Rider and their Hog were vanquished by $players!' + escapeMessage: '&4The Hog Rider has vanished.' +hog_rider_mount: + name: '$eventBossLevel &eLoyal Hog' +hog_rider_p2: + name: '$eventBossLevel &6Hog Rider' + locationMessage: '&cHog Rider: $distance blocks away!' + deathMessage: '&aThe Hog Rider and their Hog were vanquished by $players!' + escapeMessage: '&4The Hog Rider has vanished.' +hog_rider_summon: + name: '$eventBossLevel &eLoyal Zob-Hog' +horde_champion: + name: '$eventBossLevel &cHorde Champion' + locationMessage: '&cUndead Horde Champion: $distance blocks away!' + spawnMessage: '&cAn undead horde approaches!' + deathMessage: '&aThe horde has been stopped by $players!.' + escapeMessage: '&4AThe undead horde has left!' +horrid_duplicator: + name: '$eventBossLevel &dHorrid Duplicator' + locationMessage: '&cHorrid Duplicator: $distance blocks away!' + spawnMessage: '&cAn endless foe has appeared!' + deathMessage: '&aThe Horrid Duplicator was slain by $players!' + escapeMessage: '&4The Horrid Duplicator has left!' +horrid_duplicator_summon: + name: '$eventBossLevel &dHorrid Duplicator' +horrid_duplicator_summon_1: + name: '$eventBossLevel &dHorrid Duplicator' +ice_fae: + name: '$eventBossLevel &b冰凍妖靈' +imperial_bee_guard: + name: '$reinforcementLevel &e帝國蜂兵' +invasion_abducted_hoglin_leader: + name: '$normalLevel &8被綁架的霍格林領袖' +invasion_abducted_pillager_leader: + name: '$normalLevel &8被綁架的掠奪者領袖' +invasion_abducted_silverfish: + name: '$normalLevel &8被綁架的銀魚' +invasion_abducted_silverfish_leader: + name: '$normalLevel &8被綁架的銀魚' +invasion_abducted_zombie: + name: '$normalLevel &8被綁架的殭屍' +invasion_abducted_zombie_leader: + name: '$normalLevel &8被綁架的殭屍' +invasion_abductor: + name: '$normalLevel &6綁架者' +invasion_abudcted_pillager: + name: '$normalLevel &8被綁架的掠奪者' +invasion_analytic_thin_man_1: + name: '$normalLevel &8分析員' +invasion_analytic_thin_man_2: + name: '$normalLevel &8分析員' +invasion_analytic_thin_man_3: + name: '$normalLevel &8分析員' +invasion_analytic_thin_man_4: + name: '$normalLevel &8分析員' +invasion_ballistic_construct: + name: '$minibossLevel &f彈道負責人' +invasion_convert: + name: '$normalLevel &6迷信者' +invasion_energy_construct: + name: '$minibossLevel &f建築師' +invasion_fire_construct: + name: '$minibossLevel &f火星人造人' +invasion_genetically_modified_cow_phase_1: + name: '$minibossLevel &f基因改造牛' +invasion_genetically_modified_cow_phase_2: + name: '$minibossLevel &f基因改造牛' +invasion_gray_man_courthouse_phase_1: + name: '$minibossLevel &7灰星人' +invasion_gray_man_courthouse_phase_2: + name: '$minibossLevel &7灰星人' +invasion_green_man_hotel_phase_1: + name: '$bossLevel &2綠星人' +invasion_green_man_hotel_phase_2: + name: '$bossLevel &2綠星人' +invasion_green_man_hotel_phase_3: + name: '$bossLevel &2綠星人' + deathMessage: '&2綠外星人&4被 $players 打敗了!本版地圖到此結束,UFO內部為完整版!' +invasion_green_man_spaceship_phase_1: + name: '$bossLevel &2綠星人' +invasion_green_man_spaceship_phase_2: + name: '$bossLevel &2綠星人' +invasion_green_man_spaceship_phase_3: + name: '$bossLevel &2綠星人' +invasion_green_man_spaceship_phase_4: + name: '$bossLevel &2綠星人' + deathMessages: + - '&e&l---------------------------------------------' + - '&2外星人的威脅已不復存在!' + - '&c&l 1st 輸出者: $damager1name &c造成 $damager1damage 點傷害!' + - '&6&l 2nd 輸出者: $damager2name &6造成 $damager2damage 點傷害!' + - '&e&l 3rd 輸出者: $damager3name &e造成 $damager3damage 點傷害!' + - '&a擊殺者: $players' + - '&e&l---------------------------------------------' +invasion_ice_construct: + name: '$minibossLevel &f冰之精靈' +invasion_merman: + name: '$normalLevel &6人魚' +invasion_merman_leader: + name: '$normalLevel &6人魚領袖' +invasion_otherwordly_ember: + name: '$normalLevel &6超凡脫俗的餘燼' +invasion_psychic_apparition: + name: '$normalLevel &5心靈幻影' +invasion_psychic_clone: + name: '$reinforcementLevel &6心靈克隆' +invasion_psychic_explosion: + name: '$reinforcementLevel &5心靈爆炸' +invasion_psychic_summon_gold_boots: + name: '$reinforcementLevel &5心靈幻影' +invasion_psychic_summon_gold_pants: + name: '$reinforcementLevel &5心靈幻影' +invasion_psychic_summon_leather_hat: + name: '$reinforcementLevel &5心靈幻影' +invasion_shrieking_shulker: + name: '$normalLevel &8尖叫界伏蚌' +invasion_thin_man: + name: '$normalLevel &8瘦人' +killer_rabbit_of_caerbannog: + name: '$eventBossLevel &c卡班諾克殺手兔' +kraken: + name: '$eventBossLevel &3海妖' +krampus: + name: '$eventBossLevel &1Krampus' + locationMessage: '&cKrampus: $distance blocks away!' + spawnMessage: '&cKrampus has come to punish the naughty!' + deathMessage: '&aKrampus has been sent back to his realm to by $players!.' + escapeMessage: '&4There was nobody to punish!' +large_hopper: + name: '$eventBossLevel &dLarge Hopper' + locationMessage: '&cLarge Hopper: $distance blocks away!' + spawnMessage: '&cA large beast is hopping around!' + deathMessage: '&aThe Large Hopper was stopped by $players!' + escapeMessage: '&4The Large Hopper has jumped out of this world!' +large_hopper_mount: + name: '$eventBossLevel &aHopper' +lightning_fae: + name: '$eventBossLevel &e閃電妖靈' +living_shadow: + name: '$eventBossLevel &7Living Shadow' + locationMessage: '&cLiving Shadow: $distance blocks away!' + spawnMessage: '&cLiving Shadow has appeared! Do not look it in the yes!' + deathMessage: '&aLiving Shadow has been turned into Dead Shadow by $players!.' + escapeMessage: '&4The Living Shadow saw nothing so it left!' +meme_boss: + name: '&2The Maestro' +meme_boss_reinforcement: + name: '&cFan' +merman: + name: '$eventBossLevel &1Merman' + locationMessage: '&cMerman: $distance blocks away!' + spawnMessage: '&cA Merman swims the oceans!' + deathMessage: '&aThe Merman was slain by $players!' + escapeMessage: '&4The Merman has retreated.' +monster_of_the_deep: + name: '$eventBossLevel &bMonster of the Deep' + locationMessage: '&cMonster of the Deep: $distance blocks away!' + spawnMessage: '&cSomething terrible swims the oceans!' + deathMessage: '&aMonster of the Deep has been slain by $players!' + escapeMessage: '&4The oceans are once again safe!' +moon_spider: + name: '$eventBossLevel &fMoon Spider' + locationMessage: '&cMoon Spider: $distance blocks away!' + spawnMessage: '&cA powerful arachnid has been spotted!' + deathMessage: '&aThe Moon Spider was slain by $players!' + escapeMessage: '&4The Moon Spider has left!' +moon_spider_summon: + name: '&fSilk Mender' +necromancer: + name: '$eventBossLevel &7Necromancer' + locationMessage: '&cNecromancer: $distance blocks away!' + spawnMessage: '&cA powerful evil Necromancer has entered this world!' + deathMessage: '&aThe Necromancer is no more thanks to $players!' + escapeMessage: '&4The Necromancer has disappeared.' +necromancer_summon_1: + name: '$eventBossLevel &fFiery Bones' +necromancer_summon_2: + name: '$eventBossLevel &bChilled Bones' +necromancer_summon_3: + name: '$eventBossLevel &8Charred Bones' +necronomicon_skeleton: + name: '$reinforcementLevel &7被招喚的骷髏' +necronomicon_zombie: + name: '$reinforcementLevel &7被招喚的殭屍' +netherite_golem: + name: '$eventBossLevel &8Netherite Golem' + locationMessage: '&cNetherite Golem: $distance blocks away!' + spawnMessage: '&cAn ancient golem has entered this world!' + deathMessage: '&aThe Netherite Golem was slain by $players!' + escapeMessage: '&4The Netherite Golem has left this world!' +nether_escapee: + name: '$eventBossLevel &6Nether Escapee' + locationMessage: '&cNether Escapee: $distance blocks away!' + spawnMessage: '&cA terrible foe has escaped the nether!' + deathMessage: '&aThe Nether Escapee was sent back to the nether by $players!' + escapeMessage: '&4The Nether Escapee has left this place!' +nether_hag: + name: '$eventBossLevel &4Nether Hag' + locationMessage: '&cNether Hag: $distance blocks away!' + spawnMessage: '&cAn evil hag walks the nether!' + deathMessage: '&aThe Nether Hag was slain by $players!' + escapeMessage: '&4The Nether Hag has vanished!' +nether_wasp: + name: '$eventBossLevel &6Nether Wasp' + locationMessage: '&cNether Wasp: $distance blocks away!' + spawnMessage: '&cTry not to get stung, a wasp roams the nether!' + deathMessage: '&aThe Nether Wasp was slain by $players!' + escapeMessage: '&4The Nether Wasp has decided to buzz off!' +nether_wasp_summon_1: + name: '$eventBossLevel &cHive Summoner' +nether_wasp_summon_2: + name: '$eventBossLevel &cHive Wasp' +nightwing: + name: '$eventBossLevel &cNightwing' + locationMessage: '&cNightwing: $distance blocks away!' + spawnMessage: '&cA bird of the night has appeared!' + deathMessage: '&aNightwing was stopped by $players!' + escapeMessage: '&4Nightwing has flown home.' +nightwing_summon: + name: '$eventBossLevel &cSmart Bomb' +nightwing_summon_1: + name: '$eventBossLevel &cSworn Protector' +night_crawler: + name: '$eventBossLevel &4Night Crawler' + locationMessage: '&cNight Crawler: $distance blocks away!' + spawnMessage: '&cSomething awful is crawling about!' + deathMessage: '&aThe Night Crawler has been slain by $players!' + escapeMessage: '&4The Night Crawler Undead has left!' +night_horder: + name: '$eventBossLevel &aNight Horder' + locationMessage: '&cNight Horder: $distance blocks away!' + spawnMessage: '&cA Night Horder has appeared! Slay him to loot his booty!' + deathMessage: '&aThe Night Horder has been plundered by $players!' + escapeMessage: '&4The Night Horder has escaped!' +oasis_10_old_bones: + name: '$normalLevel &f老骨頭' +oasis_10_surreptitious_scribe: + name: '$minibossLevel &7秘密抄寫員' +oasis_12_entombed_tenant: + name: '$normalLevel &7被埋葬的租戶' +oasis_12_entombed_tenant_p2: + name: '$normalLevel &7被埋葬的租戶' +oasis_12_sinister_siren: + name: '$minibossLevel &5險惡的海妖' +oasis_14_gnarly_grimace: + name: '$normalLevel &8粗糙的鬼臉' +oasis_14_undead_drifter: + name: '$normalLevel &1亡靈漂泊者' +oasis_16_lesser_sentinel: + name: '$normalLevel &9小哨兵' +oasis_16_magical_magus: + name: '$normalLevel &3魔法魔法師' +oasis_16_rancid_roamer: + name: '$normalLevel &8腐臭的流浪者' +oasis_18_sly_sharpshooter: + name: '$normalLevel &e狡猾的神槍手' +oasis_18_stout_thaumaturge: + name: '$normalLevel &5粗壯的奇術師' +oasis_18_tricky_treasure_hoarder: + name: '$normalLevel &d狡猾的寶藏囤積者' +oasis_20_scheming_scribe: + name: '$minibossLevel &7心機抄寫員' +oasis_20_septic_scribe: + name: '$minibossLevel &7化糞池抄寫員' +oasis_20_vampiric_sorcerer: + name: '$bossLevel &c吸血鬼巫師' +oasis_20_wrapped_wraith: + name: '$normalLevel &8木乃伊' +oasis_20_wrapped_wraith_p2: + name: '$normalLevel &8木乃伊' +oasis_25_vampiric_warlock: + name: '$bossLevel &4吸血鬼術士' +oasis_25_warlocks_spirit_summon: + name: '$reinforcementLevel &c術士精神' +oasis_26_adept_sentinel: + name: '$normalLevel &1熟練的哨兵' +oasis_26_grim_grovetender: + name: '$normalLevel &a冷酷的小樹林' +oasis_26_precarious_sniper: + name: '$normalLevel &3岌岌可危的狙擊手' +oasis_26_superior_sharpshooter: + name: '$normalLevel &3高級神槍手' +oasis_28_perilous_prophet: + name: '$normalLevel &3危險的先知' +oasis_28_treacherous_treasure_hoarder: + name: '$normalLevel &d奸詐的寶藏囤積者' +oasis_2_haunted_hauler: + name: '$normalLevel &9鬧鬼的搬運工' +oasis_30_forsaken_soul: + name: '$reinforcementLevel &0被遺忘的靈魂' +oasis_30_lost_soul: + name: '$normalLevel 失落的靈魂' +oasis_30_parlous_preist: + name: '$minibossLevel &b帕盧斯·普里斯特' +oasis_30_seeker_of_the_staid: + name: '$normalLevel &c穩重的探索者' +oasis_30_wimpy_louse: + name: '$reinforcementLevel &8討厭的蝨子' +oasis_32_loathing_louse: + name: '$normalLevel &8討厭的蝨子' +oasis_32_skeletal_sniper: + name: '$normalLevel &9骷髏狙擊手' +oasis_34_grizly_grimace: + name: '$normalLevel &8粗糙的鬼臉' +oasis_34_gruesome_grimace: + name: '$normalLevel &8可怕的鬼臉' +oasis_35_ice_eidolon: + name: '$reinforcementLevel &9冰幻靈' +oasis_35_light_of_darkness: + name: '$minibossLevel &9黑暗之光' +oasis_36_cruel_cultist: + name: '$normalLevel &3殘忍的邪教徒' +oasis_36_cultists_cretins: + name: '$reinforcementLevel &3殘忍的邪教徒' +oasis_36_cultists_cretins_drowned: + name: '$reinforcementLevel &3殘忍的邪教徒' +oasis_36_dexterous_sentinel: + name: '$normalLevel &9靈巧哨兵' +oasis_36_grudging_grovetender: + name: '$normalLevel &a不情願的林農' +oasis_36_parlous_sniper: + name: '$normalLevel &3陰森森的狙擊手' +oasis_36_rueful_roamer: + name: '$normalLevel &8悔恨的漫遊者' +oasis_36_spectral_magus: + name: '$normalLevel &3光譜法師' +oasis_38_poisonous_perch: + name: '$normalLevel &3毒鱸' +oasis_38_traitorous_treasure_hoarder: + name: '$normalLevel &d背叛的寶藏囤積者' +oasis_40_chief_cultist: + name: '$minibossLevel &5首席邪教徒' +oasis_40_louse_lord: + name: '$minibossLevel &8蝨王' +oasis_40_pharaohs_scribe: + name: '$minibossLevel &7法老的抄寫員' +oasis_40_skeletal_stiff: + name: '$normalLevel &9骨骼僵硬' +oasis_40_soaked_sacrifice: + name: '$reinforcementLevel &1浸泡的犧牲' +oasis_40_solar_flare: + name: '$reinforcementLevel &e耀斑' +oasis_42_hexed_hauler: + name: '$normalLevel &9妖術搬運工' +oasis_42_skeletal_sharpshooter: + name: '$normalLevel &9骷髏神槍手' +oasis_42_tyranical_treasure_hoarder: + name: '$normalLevel &d暴虐的寶藏囤積者' +oasis_42_tyranical_treasure_hoarder_phase_2: + name: '$normalLevel &d暴虐的寶藏囤積者' +oasis_45_golden_cast_autonomation: + name: '$reinforcementLevel &6金鑄自動化' +oasis_45_monumental_monstrosity: + name: '$bossLevel &b巨大的怪物' +oasis_45_monumental_monstrosity_phase_2: + name: '$bossLevel &b巨大的怪物' +oasis_45_monumental_monstrosity_phase_3: + name: '$bossLevel &6巨大的怪物' +oasis_45_monumental_monstrosity_phase_4: + name: '$bossLevel &b巨大的怪物' +oasis_45_oracle_of_knowledge: + name: '$minibossLevel &0知識神諭' +oasis_45_shadow_of_knowledge_summon: + name: '$reinforcementLevel &8知識之影' +oasis_45_the_beacon: + name: '$minibossLevel &6燈塔' +oasis_45_the_beacon_phase_2: + name: '$minibossLevel &6燈塔' +oasis_45_the_beacon_phase_3: + name: '$minibossLevel &6燈塔' +oasis_45_the_beacon_phase_4: + name: '$minibossLevel &6燈塔' +oasis_46_pharaohs_sentinel: + name: '$normalLevel &9法老的哨兵' +oasis_4_cursed_desert_dweller: + name: '$normalLevel &e被詛咒的沙漠居民' +oasis_4_grotesque_grimace: + name: '$normalLevel &8怪誕鬼臉' +oasis_4_swamp_rat: + name: '$normalLevel &6沼澤鼠' +oasis_50_moneychanger_arrow: + name: '$minibossLevel &6金融家' +oasis_50_moneychanger_arrow_phase_2: + name: '$minibossLevel &6金融家' +oasis_50_moneychanger_blindness: + name: '$minibossLevel &6金融家' +oasis_50_moneychanger_blindness_phase_2: + name: '$minibossLevel &6金融家' +oasis_50_moneychanger_fire: + name: '$minibossLevel &6金融家' +oasis_50_moneychanger_fire_phase_2: + name: '$minibossLevel &6金融家' +oasis_50_moneychanger_freeze: + name: '$minibossLevel &6金融家' +oasis_50_moneychanger_freeze_phase_2: + name: '$minibossLevel &6金融家' +oasis_50_moneychanger_knockback: + name: '$minibossLevel &6金融家' +oasis_50_moneychanger_knockback_phase_2: + name: '$minibossLevel &6金融家' +oasis_50_moneychanger_poison: + name: '$minibossLevel &6金融家' +oasis_50_moneychanger_poison_phase_2: + name: '$minibossLevel &6金融家' +oasis_50_moneychanger_wither: + name: '$minibossLevel &6金融家' +oasis_50_moneychanger_wither_phase_2: + name: '$minibossLevel &6金融家' +oasis_50_pharaohs_royal_guard: + name: '$reinforcementLevel &8法老的皇家衛隊' +oasis_50_the_foundry: + name: '$bossLevel &4鑄造工人' +oasis_50_the_foundry_phase_2: + name: '$bossLevel &4鑄造工人' +oasis_55_pharaoh_of_pestilence: + name: '$bossLevel &0瘟疫法老' +oasis_6_dry_bones: + name: '$normalLevel &f乾枯的骨頭' +oasis_6_rotten_roamer: + name: '$normalLevel &8腐爛的狂屍鬼' +oasis_8_mythical_magus: + name: '$normalLevel &3神話魔法師' +oasis_8_tough_thaumaturge: + name: '$normalLevel &5堅韌的奇術師' +oasis_8_troublesome_treasure_hoarder: + name: '$normalLevel &d麻煩的寶藏獵人' +okami: + name: '$eventBossLevel &cOkami' + locationMessage: '&cOkami: $distance blocks away!' + spawnMessage: '&cA god has awakened!' + deathMessage: '&a$players has fought with a god and won!.' + escapeMessage: '&4Okami has left!' +okami_p2: + name: '$eventBossLevel &cOkami' +okami_p3: + name: '$eventBossLevel &cOkami' +omega_wolf: + name: '$reinforcementLevel &7Omega Wolf' +pillager_caravan_beast: + name: '$reinforcementLevel &c商隊野獸' +pillager_caravan_guard: + name: '$reinforcementLevel &c商隊衛隊' +pillager_caravan_leader: + name: '$eventBossLevel &c掠奪者商隊領袖' + locationMessage: '&c掠奪者商隊距離:$distance 格!' + spawnMessage: '&c一個掠奪者商隊被發現了!' +primis_acolyte_brute: + name: '$normalLevel &b侍僧蠻兵' +primis_acolyte_forest_brute: + name: '$normalLevel &b侍僧蠻兵' +primis_acolyte_forest_brute_with_watch: + name: '$normalLevel &b侍僧蠻兵' +primis_acolyte_forest_sharpshooter: + name: '$normalLevel &b侍僧遊俠' +primis_acolyte_forest_summoner: + name: '$normalLevel &b侍僧召喚師' +primis_acolyte_forest_summoner_heirloom_guardian: + name: '$normalLevel &b精靈強盜法師' +primis_acolyte_guard_1: + name: '$normalLevel &b侍僧守衛' + onDamagedMessages: + - 你不能進入! + - 法師不會允許的! + - 離開這個地方! + - 法師保護這裡! + - 愚蠢! + - 走吧! + deathMessage: '[Acolyte Guard] 你對真相視而不見,塔的法師看到了一切!' +primis_acolyte_guard_2: + name: '$normalLevel &b侍僧守衛' + onDamagedMessages: + - 你不能進入! + - 法師不會允許的! + - 離開這個地方!法師不會允許的! + - 法師保護這裡! + - 愚蠢! + - 走吧! + deathMessage: '[Acolyte Guard] 你不能過去,塔裡的法師不允許!' +primis_acolyte_sharpshooter: + name: '$normalLevel &b侍僧遊俠' +primis_aggressive_llama: + name: '$normalLevel &6好鬥的駱駝' +primis_angry_goat: + name: '$normalLevel &6憤怒的山羊' +primis_beta_feral_wolf: + name: '$reinforcementLevel &8Beta野狼' +primis_blood_temple_blood_golem: + name: '$normalLevel &cBlood Golem' +primis_blood_temple_charred_construct: + name: '$normalLevel &cCharred Construct' +primis_blood_temple_conjured_flame: + name: '$normalLevel &cConjured Flame' +primis_blood_temple_eradicator: + name: '$normalLevel &cEradicator' +primis_blood_temple_fire_conjurer: + name: '$normalLevel &cFire Conjurer' +primis_blood_temple_flame_elemental: + name: '$normalLevel &cFlame Elemental' +primis_catacomb_nemus_to_redwood_archer: + name: '$normalLevel &8地下墓穴射手' +primis_catacomb_nemus_to_redwood_golem: + name: '$normalLevel &b地下墓穴魔像' +primis_catacomb_nemus_to_redwood_necromancer: + name: '$bossLevel &4地下墓穴死靈法師' +primis_catacomb_nemus_to_redwood_necromancer_p1: + name: '$bossLevel &4地下墓穴死靈法師' +primis_catacomb_nemus_to_redwood_necromancer_p2: + name: '$bossLevel &4C死靈法師' +primis_catacomb_nemus_to_redwood_soul_reinforcement: + name: '$reinforcementLevel &8地下墓穴之魂' +primis_catacomb_nemus_to_redwood_swordsman: + name: '$normalLevel &8地窟劍客' +primis_catacomb_pontis_to_ice_archer: + name: '$normalLevel &8地下墓穴射手' +primis_catacomb_pontis_to_ice_golem: + name: '$normalLevel &b地下墓穴魔像' +primis_catacomb_pontis_to_ice_necromancer_p1: + name: '$bossLevel &4地下墓穴死靈法師' +primis_catacomb_pontis_to_ice_necromancer_p2: + name: '$bossLevel &4地下墓穴死靈法師' +primis_catacomb_pontis_to_ice_swordsman: + name: '$normalLevel &8地窟劍客' +primis_catacomb_trio_archer: + name: '$normalLevel &8Catacomb Archer' +primis_catacomb_trio_golem: + name: '$normalLevel &bCatacomb Golem' +primis_catacomb_trio_necromancer_p1: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_necromancer_p2: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_necromancer_summon: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_swordsman: + name: '$normalLevel &8Catacomb Swordsman' +primis_crazed_rabbit: + name: '$normalLevel &c瘋狂的兔子' +primis_crystaline_summoner_p1: + name: '$normalLevel &3Crystaline Summoner' +primis_crystaline_summoner_p2: + name: '&3水晶召喚師' +primis_earth_temple_golem: + name: '$normalLevel &fAnimated Clay' +primis_emerald_eater: + name: '$normalLevel &aEmerald Eater' +primis_farmstead_lighthouse_keeper: + name: '&2燈塔守護者' + questLore: + - 我丈夫有嚴重的問題。 + - 他曾經是一個充滿愛心和關懷的丈夫和父親,但最近他一直專注於他在地下室找到的文件。 + - 他說這是一個重要的研究,可以改變世界。 + - 當我看到他變得多麼痴迷時,我應該告訴他停止。 + - 他……對燈塔做了什麼……我擔心燈塔也對他做了什麼。 + - 這讓他變成了某種怪物。他不再認出我們,甚至在我們試圖接近他時攻擊我們。 + - 晚上,由於燈塔地下室傳來的哀號聲,我們無法入睡。 + - 他在受苦,我們無力幫助他。 + - 我知道這要求很多,但你認為你能幫助我們嗎? + - 晚上,我們因哭聲而無法入睡 + - 來自&d燈塔&f的地下室。 + - 他在受苦,我們無力幫助他。 + - 我知道這要求很多,但你認為你能幫助我們嗎? + questAcceptDialog: + - '&8[Amavit]&f 非常感謝您接受我們的請求。我全心全意地希望你成功。' + - '&8&o我應該去燈塔的地下室,把看守人從痛苦中解救出來。' + questCompleteMessage: + - '&8[Amavit]&f我聽到了——這樣就完成了?他受夠了——不,算了吧,我不想知道。' + - '&f當你……處理這個問題時,燈塔似乎開始發出奇怪的光。我們需要確保這不是問題。' + - '&8&o似乎 Amavit 對我有另一項任務。我應該和她談談。' +primis_feral_alpha_wolf: + name: '$normalLevel &8野性Alpha Wolf' +primis_feral_wolf: + name: '$normalLevel &8野狼' +primis_feral_wolf_scout: + name: '$normalLevel &8野狼偵察兵' +primis_gladius_admiral: + name: '$normalLevel &f入侵海軍上將' +primis_gladius_assassin: + name: '$normalLevel &f入侵刺客' +primis_gladius_barkeep_p1: + name: '$minibossLevel &6酒保' +primis_gladius_barkeep_p2: + name: '$minibossLevel &6酒保' +primis_gladius_captain: + name: '$normalLevel &f入侵船長' +primis_gladius_champion_p1: + name: '$bossLevel &6墮落冠軍Natus' +primis_gladius_champion_p2: + name: '$bossLevel &6墮落冠軍Natus' +primis_gladius_gatekeeper_p1: + name: '$minibossLevel &5看門人' +primis_gladius_gatekeeper_p2: + name: '$minibossLevel &5看門人' +primis_gladius_gatekeeper_pontis_p1: + name: '$minibossLevel &5看門人' +primis_gladius_gatekeeper_pontis_p2: + name: '$minibossLevel &5看門人' +primis_gladius_longbowman: + name: '$normalLevel &f入侵長弓手' +primis_gladius_mariner: + name: '$normalLevel &f入侵水手' +primis_gladius_mariner_quest: + name: '$normalLevel &f入侵水手' +primis_gladius_monk_p1: + name: '$minibossLevel &6和尚' +primis_gladius_monk_p2: + name: '$minibossLevel &6和尚' +primis_gladius_raider: + name: '$normalLevel &f入侵襲擊者' +primis_gladius_swordsman: + name: '$normalLevel &f入侵劍客' +primis_gladius_undead_buccaneer: + name: '$normalLevel &f亡靈海盜' +primis_gladius_undead_captain: + name: '$minibossLevel &f亡靈隊長' +primis_gladius_undead_swashbuckler: + name: '$normalLevel &f亡靈遊蕩者' +primis_gladius_underlord: + name: '$minibossLevel &0亡靈之主' +primis_gladius_villager: + name: '$normalLevel &f亡靈村民' +primis_goblin_fowl_warrior: + name: '$minibossLevel &6Cursed Fowl Goblin' +primis_goblin_grunt: + name: '$normalLevel &6Goblin Grunt' +primis_goblin_king: + name: '$bossLevel &2Goblin King' +primis_goblin_piranah: + name: '$normalLevel &9Goblin Piranah' +primis_goblin_spearman: + name: '$normalLevel &6Goblin Spearman' +primis_goblin_warrior: + name: '$normalLevel &6Goblin Warrior' +primis_ice_mage: + name: '$minibossLevel &9冰法師' +primis_ice_mage_p2: + name: '$minibossLevel &b冰法師' + deathMessage: '&8&o你聽到附近的冰牆開裂和破碎的聲音......' +primis_ice_village_annoyed_goat: + name: '$normalLevel &bAnnoyed Goat' +primis_ice_village_bell_banger: + name: '$minibossLevel &6Undead' + questLore: + - 你看到了嗎?那裡,看那個鈴鐺 + - 村子裡的塔。 + - 你也看到了吧?那裡的傢伙 + - 正在用頭撞鈴。 + - 我很確定這是怎麼回事 + - 除非我的視力有問題。 + - 你能去調查並回來 + - 對我來說你發現了什麼。 + questAcceptDialog: + - '&a[Eleusium Festus]&f 到底是怎麼回事...' + - '&7&o我應該去看看&d&o冰村鐘樓&7&o的情況。' + questCompleteMessage: + - '&a[Eleusium Festus]&f 你發現一個不死生物正在敲響鈴鐺……' + - 好吧,現在我都聽到了…… +primis_ice_village_escaped_prisoner: + name: '$normalLevel &b逃犯' +primis_ice_village_fallen_trial_warrior_summon: + name: '$reinforcementLevel &7Enslaved Soul' +primis_ice_village_frost_fur_ursus: + name: '$normalLevel &9霜毛熊' +primis_ice_village_frost_simulacrum: + name: '$normalLevel &3Frost Simulacrum' +primis_ice_village_ice_simulacrum: + name: '$reinforcementLevel &3Ice Simulacrum' +primis_ice_village_manifested_nightmare: + name: '$normalLevel &bManifested Nightmare' +primis_ice_village_meek_customer: + name: '$normalLevel &c溫順的顧客' +primis_ice_village_naughty_customer: + name: '$normalLevel &c淘氣的顧客' +primis_ice_village_screecher_bomb_summon: + name: '$reinforcementLevel &dScreecher Droppings' +primis_ice_village_sky_screecher: + name: '$normalLevel &bSky Screecher' +primis_ice_village_the_ice_aspect: + name: '$minibossLevel &9Ice Aspect' +primis_ice_village_the_ice_elemental: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_the_ice_elemental_p2: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_the_ice_elemental_p3: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_trial_of_ice_minor_ice_elemental: + name: '$minibossLevel &bMinor Ice Elemental' +primis_ice_village_wolf_summon: + name: '$reinforcementLevel &cTamed Wolf' +primis_minor_ice_elemental: + name: '$bossLevel &1小冰元素' +primis_minor_ice_elemental_p2: + name: '$bossLevel &1小冰元素' +primis_mountain_pass_guardian_p1: + name: '$bossLevel &6守護者' +primis_mountain_pass_guardian_p2: + name: '$bossLevel &6守護者' +primis_mountain_pass_healer: + name: '$reinforcementLevel &f維修加速器' +primis_nasty_worm: + name: '$normalLevel &f討厭的蠕蟲' +primis_ogre_mines_mite: + name: '$normalLevel &f礦蟎' +primis_ogre_mines_ogre_archer: + name: '$minibossLevel &f食人魔弓箭手' +primis_ogre_mines_ogre_magi: + name: '$minibossLevel &f食人魔魔法師' +primis_ogre_mines_ogre_warrior: + name: '$minibossLevel &f食人魔戰士' +primis_ogre_mines_undead_archer: + name: '$normalLevel &f亡靈弓箭手' +primis_ogre_mines_undead_swordsman: + name: '$normalLevel &f亡靈劍士' +primis_pontis_beast_cod: + name: '$minibossLevel &dBeast Cod Furiosa' +primis_pontis_beast_crawler: + name: '$minibossLevel &dCrawler Beast Megdun' +primis_pontis_beast_impaler: + name: '$minibossLevel &dImpaler Beast Uladzimir' +primis_pontis_counselor_guard_left_1: + name: '$normalLevel &4腐敗的顧問警衛' +primis_pontis_counselor_guard_left_2: + name: '$normalLevel &4腐敗的顧問警衛' + deathMessage: '&5[Machiavelli 顧問]&f 那個傻子一定是想通了……' +primis_pontis_counselor_guard_left_3: + name: '$normalLevel &4腐敗的顧問警衛' + deathMessage: '&5[Machiavelli 顧問]&f 你比我想像的要堅強。' +primis_pontis_counselor_guard_left_4: + name: '$normalLevel &4腐敗的顧問警衛' + deathMessage: '&5[Machiavelli 顧問]&f 我的靈魂魔法會保護我!!!' +primis_pontis_counselor_guard_mid: + name: '$normalLevel &4腐敗的顧問警衛' + deathMessage: '&8[Machiavelli 顧問]&f 我看到我們有客人!...' +primis_pontis_counselor_guard_right_1: + name: '$normalLevel &4腐敗的顧問警衛' +primis_pontis_counselor_guard_right_2: + name: '$normalLevel &4腐敗的顧問警衛' +primis_pontis_counselor_guard_right_3: + name: '$normalLevel &4腐敗的顧問警衛' +primis_pontis_counselor_guard_right_4: + name: '$normalLevel &4腐敗的顧問警衛' +primis_pontis_counselor_twisted_copy: + name: '$reinforcementLevel &4Twisted Copy' +primis_pontis_mille_arena_air_elemental: + name: '$minibossLevel &fAir Elemental' +primis_pontis_mille_arena_human_wave_4: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_6: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_7: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_8: + name: '$normalLevel &4Dominated Human Warrior' +primis_pontis_mille_arena_human_worshiper: + name: '$normalLevel &4Elemental Worshiper' +primis_pontis_mille_arena_minor_air_elemental: + name: '$normalLevel &fMinor Air Elemental' +primis_pontis_mille_arena_minor_earth_elemental: + name: '$normalLevel &7Minor Earth Elemental' +primis_pontis_mille_arena_minor_fire_elemental: + name: '$normalLevel &eMinor Fire Elemental' +primis_pontis_mille_arena_minor_fire_elemental_prime: + name: '$normalLevel &eMinor Fire Elemental' +primis_pontis_mille_arena_minor_water_elemental: + name: '$normalLevel &bMinor Water Elemental' +primis_pontis_mille_arena_primal_air_wisp: + name: '$normalLevel &fPrimal Air Wisp' +primis_pontis_mille_arena_primal_air_wisp_2: + name: '$normalLevel &fPrimal Air Wisp' +primis_pontis_mille_arena_primal_earth_wisp: + name: '$normalLevel &7Primal Earth Wisp' +primis_pontis_mille_arena_primal_earth_wisp_2: + name: '$normalLevel &7Primal Earth Wisp' +primis_pontis_mille_arena_primal_fire_wisp: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_fire_wisp_2: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_fire_wisp_3: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_water_wisp: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_water_wisp_2: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_water_wisp_3: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_wisp: + name: '$normalLevel &5Primal Wisp' +primis_pontis_mille_arena_water_elemental: + name: '$minibossLevel &1Water Elemental' +primis_pontis_mille_counselor_p1: + name: '$minibossLevel &f馬基雅維利顧問' +primis_pontis_mille_counselor_p2: + name: '$minibossLevel &f馬基雅維利顧問' +primis_pontis_mille_counselor_p3: + name: '$minibossLevel &f馬基雅維利顧問' +primis_pontis_mille_fields_babe_razorback: + name: '$normalLevel &2Babe Razorback' +primis_pontis_mille_fields_bird: + name: '$normalLevel &fFeathered Field Rat' +primis_pontis_mille_fields_bird_nightmare: + name: '$normalLevel &d有羽毛的夢魘鼠' +primis_pontis_mille_fields_bubba: + name: '$minibossLevel &cBig ol'' Bubba' +primis_pontis_mille_fields_field_rat: + name: '$normalLevel &fField Rat' +primis_pontis_mille_fields_juvenile_razorback: + name: '$normalLevel &2野豬' +primis_pontis_mille_fields_longhorn: + name: '$normalLevel &4Fields Longhorn' +primis_pontis_mille_fields_mature_razorback: + name: '$normalLevel &2成熟的野豬' +primis_pontis_mille_fields_shorthorn: + name: '$normalLevel &6Fields Shorthorn' +primis_pontis_mille_fields_two_legged_terror: + name: '$normalLevel &2兩條腿的恐怖' +primis_pontis_mille_fields_well_fed_rat: + name: '$normalLevel &f吃飽的老鼠' +primis_pontis_mille_rat: + name: '$normalLevel &fRat' +primis_quartz_elemental: + name: '$bossLevel &d石英元素' +primis_quartz_elemental_p2: + name: '$bossLevel &d石英元素' +primis_redwood_barracuda: + name: '$normalLevel &3Redwood Barracuda' +primis_redwood_fruity_hound: + name: '$normalLevel &2果味獵犬' +primis_redwood_rockhound: + name: '$normalLevel &7Redwood Rockhound' +primis_redwood_werewolf_grunt: + name: '$normalLevel &cRedwood Werewolf Grunt' +primis_redwood_werewolf_packleader: + name: '$normalLevel &4Redwood Werewolf Packleader' +primis_river_guardian: + name: '$normalLevel &5河流守護者' +primis_roofed_forest_cave_spider: + name: '$normalLevel &6Nest Crawler' +primis_roofed_forest_cave_spider_boss: + name: '$bossLevel &eBrood Mother' +primis_roofed_forest_spider: + name: '$normalLevel &6Forest Crawler' +primis_roofed_forest_spider_reinforcement: + name: '$reinforcementLevel &6Nest Brood' +primis_sea_monster: + name: '$bossLevel &d海怪' +primis_sewer_noxious_ninja: + name: '&2劇毒忍者' +primis_sewer_spore_spreader: + name: '&4孢子散佈器' +primis_sewer_the_shredder_p1: + name: '$bossLevel &5The Shredder' +primis_sewer_the_shredder_p2: + name: '$bossLevel &5The Shredder' +primis_storm_temple_axeman: + name: '$normalLevel &dStorm Temple Axeman' +primis_storm_temple_bowman: + name: '$normalLevel &dStorm Temple Bowman' +primis_storm_temple_kuzco: + name: '$normalLevel &6Kuzco' +primis_storm_temple_minor_storm_elemental: + name: '$normalLevel &5Minor Storm Elemental' +primis_storm_temple_storm_elemental: + name: '$bossLevel &1風暴元素' +primis_storm_temple_storm_elemental_p2: + name: '$bossLevel &1風暴元素' +primis_storm_temple_storm_elemental_p3: + name: '$bossLevel &1風暴元素' +primis_storm_temple_summoner: + name: '$normalLevel &5Storm Temple Summoner' +primis_terravilla_alpha_razorback: + name: '$minibossLevel &2Alpha Razorback' +primis_terravilla_alpha_razorback_p2: + name: '$minibossLevel &2Alpha Razorback' +primis_terravilla_bar_brawler: + name: '$normalLevel &6Bar Brawler' + onDamagedMessages: + - That all ya got! + - I did not even feel that! + - Why...you! + - I will show you! + - Who the heck are you! + - TAKE THAT! +primis_terravilla_earth_elemental: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_earth_elemental_p2: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_earth_elemental_p3: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_regular_fish: + name: '$normalLevel &bRegular Fish' +primis_terravilla_robber_gladiator: + name: '$normalLevel &bRobber Gladiator' +primis_terravilla_robber_slugger: + name: '$normalLevel &bSlugger' +primis_undead_archer: + name: '$normalLevel &f亡靈弓箭手' +primis_undead_climber: + name: '$normalLevel &0亡靈攀登者' +primis_undead_grappler: + name: '$normalLevel &3亡靈鬥士' +primis_undead_guardian: + name: '$normalLevel &b亡靈守衛' +primis_undead_swordsman: + name: '$normalLevel &0亡靈劍士' +pufferfish: + name: '$eventBossLevel &3Pufferfish' + locationMessage: '&cPufferfish: $distance blocks away!' + spawnMessage: '&cA puffed fish is swimming in the oceans!' + deathMessage: '&aThe Pufferfish reign has been ended by $players!' + escapeMessage: '&4The Pufferfish has swam away!' +pufferfish_summon_1: + name: '$eventBossLevel &bPooferfish' +pufferfish_summon_2: + name: '$eventBossLevel &bPooperfish' +pufferfish_summon_3: + name: '$eventBossLevel &bPooderfish' +pufferfish_summon_4: + name: '$eventBossLevel &bPudderfish' +queen_bee: + name: '$eventBossLevel &6女王蜂' +rabbit_wolf_1: + name: '$eventBossLevel &cFlame Wolf' + locationMessage: '&cFlame: $distance blocks away!' + spawnMessage: '&cA powerful duo has come to this world!' + deathMessage: '&aThe Wolf and the Rabbit were stopped by $players!' + escapeMessage: '&4The Wolf and the Rabbit have left this place!' +rabbit_wolf_2: + name: '$eventBossLevel &cLightning Rabbit' + locationMessage: '&cLightning: $distance blocks away!' + deathMessage: '&aThe Wolf and the Rabbit were stopped by $players!' + escapeMessage: '&4The Wolf and the Rabbit have left this place!' +raug: + name: '$reinforcementLevel &4被縮水的炎魔僕從' +regular_hoglin: + name: '$eventBossLevel &4Regular Hoglin' + locationMessage: '&cRegular Hoglin: $distance blocks away!' + spawnMessage: '&cA Regular Hoglin has arrived! Nothing special about this Hoglin!' + deathMessage: '&aRegular Hoglin was slain by $players!.' + escapeMessage: '&4The Regular Hoglin has left!' +rotting_diver: + name: '$eventBossLevel &bRotting Diver' + locationMessage: '&cRotting Diver: $distance blocks away!' + spawnMessage: '&cA foul corpse floats in the waters!' + deathMessage: '&aThe Rotting Diver was sent to the depths by $players!' + escapeMessage: '&4The Rotting Diver floated away!' +salty_corpse: + name: '$eventBossLevel &bSalty Corpse' + locationMessage: '&cSalty Corpse: $distance blocks away!' + spawnMessage: '&cSomething awful has floated up to the surface!' + deathMessage: '&aThe Salty Corpse was sent back to the depths by $players!' + escapeMessage: '&4The Salty Corpse has left!' +skeleton_knight: + name: '$eventBossLevel &fSkeleton Knight' + locationMessage: '&cSkeleton Knight: $distance blocks away!' + spawnMessage: '&cThe undead have sent a Skeleton Knight into the night!' + deathMessage: '&aThe Skeleton Knight was slain by $players!' + escapeMessage: '&4The Skeleton Knight had to retreat!' +sky_archer: + name: '$eventBossLevel &aSky Archer' + locationMessage: '&cSky Archer: $distance blocks away!' + spawnMessage: '&cA Sky Archer has entered this world! Bring your bow!' + deathMessage: '&aThe Sky Archer got sniped by $players!' + escapeMessage: '&4The Sky Archer has flown away!' +sky_archer_mount: + name: '$eventBossLevel &aSky Steed' +smallstack: + name: '$eventBossLevel &bSmallstack Top' + locationMessage: '&cSmallstack: $distance blocks away!' + spawnMessage: '&cA Smallstack is roaming the wilds!' + deathMessage: '&aThe Smallstack was unstacked by $players!' + escapeMessage: '&4The Smallstack has left!' +smallstack_1: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_2: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_3: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_4: + name: '$eventBossLevel &bSmallstack Bottom' +smallstack_5: + name: '$eventBossLevel &bSmallstack Bottom' +smallstack_6: + name: '$eventBossLevel &bSmallstack Carrier' +snoopy: + name: '&6{&4☠&6} &f史努比' + onDamageMessages: + - 汪汪! + onDamagedMessages: + - 汪汪! + spawnMessage: '&a發現一隻極其罕見的史努比蹤跡!' +sorcerer_supreme: + name: '$eventBossLevel &5Sorcerer Supreme' + locationMessage: '&cSorcerer Supreme: $distance blocks away!' + spawnMessage: '&cAn almighty Sorcerer has phased into this world!' + deathMessage: '&aThe Sorcerer Supreme was defeated by $players!' + escapeMessage: '&4The Sorcerer Supreme has left this world!' +sorcerer_supreme_summon: + name: '$eventBossLevel &5Eternal Servant' +spider_knight: + name: '$eventBossLevel &aDwarven Knight' + locationMessage: '&cDwarven Knight: $distance blocks away!' + spawnMessage: '&cA Knight has come to challenge the heroes of this place!' + deathMessage: '&aThe Knight was defeated by $players!' + escapeMessage: '&4The Knight has left this place!' +spider_knight_mount: + name: '$eventBossLevel &aFaithful Steed' +summonable_wolf: + name: '$normalLevel 兇狼' + onDamageMessages: + - 汪汪! + onDamagedMessages: + - 汪汪! +super_mite: + name: '$eventBossLevel &dSuper Mite' + locationMessage: '&cSuper Mite: $distance blocks away!' + spawnMessage: '&cA trouble maker appears!' + deathMessage: '&aThe mite could not handle a fight with $players!.' + escapeMessage: '&4The Super Mite left out of boredom!' +super_mite_summon: + name: '$eventBossLevel &dFriendmite' +suspicious_phantom: + name: '$eventBossLevel &eSuspicious Phantom' + locationMessage: '&cSuspicious Phantom: $distance blocks away!' + spawnMessage: '&cA Suspicious Phantom was sighted in the skies!' + deathMessage: '&aThe Phantom was put to bed by $players!' + escapeMessage: '&4The Suspicious Phantom has left!' +suspicious_phantom_summon: + name: '$eventBossLevel &cFlamer' +suspicious_phantom_summon_1: + name: '$eventBossLevel &cFireballer' +test_boss: + name: '$eventBossLevel &6測試Boss' + deathMessages: + - '&e&l---------------------------------------------' + - '&e測試用頭目已經被除錯了!' + - '&c&l 1st 輸出者: $damager1name &c造成 $damager1damage 點傷害!' + - '&6&l 2nd 輸出者: $damager2name &6造成 $damager2damage 點傷害!' + - '&e&l 3rd 輸出者: $damager3name &e造成 $damager3damage 點傷害!' + - '&a擊殺者: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - 我打中你了! + onDamagedMessages: + - 我被擊中了! + locationMessage: '測試生物: $distance' + spawnMessage: 1個測試用頭目已經生成! + deathMessage: '$players 擊殺了測試用頭目!' + escapeMessage: 測試用頭目逃走了! +airship_tier_45_knockback: + name: '$normalLevel &2弓箭手' +airship_tier_45_witherblind: + name: '$normalLevel &a劇毒弓箭手' +airship_tier_50_powder_monkeys: + name: '$normalLevel &7粉猴' +airship_tier_50_scourge: + name: '$normalLevel &8威風凜凜的災難者' +airship_tier_60_mess_hall_mate: + name: '$normalLevel &b食堂夥伴' +airship_tier_65_boatswain_boss: + name: '$normalLevel &c水手長老大' +airship_tier_65_bodyguard: + name: '$normalLevel &e海盜保鏢' +airship_tier_65_silverfish: + name: '$normalLevel &8船鼠' +airship_tier_65_silverfish_reinforcement: + name: '$reinforcementLevel &8船舶老鼠' +airship_tier_70_miniboss: + name: '$minibossLevel 軍需官夸克 ' +airship_tier_70_miniboss_2: + name: '$minibossLevel &6生活鍋爐' +airship_tier_70_miniboss_wayfinder: + name: '$minibossLevel &3航海士' +airship_tier_75_boss: + name: '$bossLevel &4戴維船長' + deathMessages: + - '&e&l---------------------------------------------' + - '&9戴維船長的船被掠奪了。' + - '&c&l 1st 輸出者: $damager1name &c造成 $damager1damage 點傷害!' + - '&6&l 2nd 輸出者: $damager2name &6造成 $damager2damage 點傷害!' + - '&e&l 3rd 輸出者: $damager3name &e造成 $damager3damage 點傷害!' + - '&a擊殺者: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4戴維船長距離:$distance 格!' + spawnMessage: '&4戴維船長再次出沒於天空!' + deathMessage: '$players &a取得了 &4戴維船長 &a船上的寶藏!' + escapeMessage: '&6戴維船長改天會再來了!' +binder_of_worlds_phase_1: + name: '$eventBossLevel &e世界粘合劑' + spawnMessage: '&5世界粘合劑接近了!' +binder_of_worlds_phase_1_melee_miniboss: + name: '$reinforcementLevel &9現實連根拔起者' +binder_of_worlds_phase_1_melee_reinforcement: + name: '$reinforcementLevel &8現實浪費者' +binder_of_worlds_phase_1_parkour_reinforcement: + name: '$reinforcementLevel &2現實先驅者' +binder_of_worlds_phase_1_ranged_miniboss: + name: '$reinforcementLevel &3現實毀滅者' +binder_of_worlds_phase_1_ranged_reinforcement: + name: '$reinforcementLevel &6現實毀滅者' +binder_of_worlds_phase_1_status_miniboss: + name: '$reinforcementLevel &1現實扳手' +binder_of_worlds_phase_1_status_reinforcement: + name: '$reinforcementLevel &7現實破壞者' +binder_of_worlds_phase_2: + name: '$eventBossLevel &e世界粘合劑' +binder_of_worlds_phase_3: + name: '$eventBossLevel &e世界粘合劑' +binder_of_worlds_phase_3_shulker_reinforcement: + name: '$reinforcementLevel &5現實裂谷' +binder_of_worlds_phase_4: + name: '$eventBossLevel &e世界粘合劑' + deathMessages: + - '&e&l---------------------------------------------' + - '&9黏合器不再與這個凡人位面黏合!' + - '&c&l 1st 輸出者: $damager1name &c造成 $damager1damage 點傷害!' + - '&6&l 2nd 輸出者: $damager2name &6造成 $damager2damage 點傷害!' + - '&e&l 3rd 輸出者: $damager3name &e造成 $damager3damage 點傷害!' + - '&a擊殺者: $players' + - '&e&l---------------------------------------------' +catacombs_tier_10_miniboss: + name: '$minibossLevel &7泰拉格' +catacombs_tier_15_boss: + name: '$bossLevel &6骨王' + deathMessages: + - '&e&l---------------------------------------------' + - '&9骨王嘎嘎作響!' + - '&c&l 1st 輸出者: $damager1name &c造成 $damager1damage 點傷害!' + - '&6&l 2nd 輸出者: $damager2name &6造成 $damager2damage 點傷害!' + - '&e&l 3rd 輸出者: $damager3name &e造成 $damager3damage 點傷害!' + - '&a擊殺者: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - 感覺..嘎嘎作響? + - 給我看看你的骨架! + - 你骨瘦如柴! + - 你的鈣質太弱了! + onDamagedMessages: + - 我從骨子裡感覺到了! + - 我有一塊骨頭要跟你單挑! + - Doot doot mr skeltal + - 我需要鈣! + locationMessage: '骨王距離:$distance 格!' + spawnMessage: '&6千萬骨頭聚合,新的骨王誕生了!' + deathMessage: '&a骨王被 $players 擊敗!' +catacombs_tier_15_mimic_boss: + name: '$bossLevel &6被遺忘者' +catacombs_tier_15_reinforcement: + name: '$reinforcementLevel &e亡靈' +catacombs_tier_5_evoker_guard_2: + name: '$normalLevel &7地下墓穴守衛' + onDamageMessages: + - 禁止入內! + - 禁止進入! +catacombs_tier_5_illusioner_guard_1: + name: '$normalLevel &7地下墓穴守衛' + onDamageMessages: + - 禁止入內! + - 禁止進入! +colosseum_tier_70_boss_mount: + name: '$bossLevel &4競技場王者' + deathMessages: + - '&e&l---------------------------------------------' + - '&4競技場王者被擊敗了!' + - '&c&l 1st 輸出者: $damager1name &c造成 $damager1damage 點傷害!' + - '&6&l 2nd 輸出者: $damager2name &6造成 $damager2damage 點傷害!' + - '&e&l 3rd 輸出者: $damager3name &e造成 $damager3damage 點傷害!' + - '&4擊殺者:$players' + - '&e&l---------------------------------------------' + deathMessage: '&2競技場王者已被 $players 擊殺!' +colosseum_tier_70_boss_p1: + name: '$bossLevel &c競技場王者' + deathMessages: + - '&e&l---------------------------------------------' + - '&4競技場王者被擊敗了!' + - '&c&l 1st 輸出者: $damager1name &c造成 $damager1damage 點傷害!' + - '&6&l 2nd 輸出者: $damager2name &6造成 $damager2damage 點傷害!' + - '&e&l 3rd 輸出者: $damager3name &e造成 $damager3damage 點傷害!' + - '&4擊殺者: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4競技場王者距離:$distance 格!' + spawnMessage: '&4競技場王者再次沖鋒陷陣!' + deathMessage: '&2競技場王者被$players擊殺!' +colosseum_tier_70_boss_p2: + name: '$bossLevel &c競技場王者' + deathMessages: + - '&e&l---------------------------------------------' + - '&4競技場王者被擊敗了!' + - '&c&l 1st 輸出者: $damager1name &c造成 $damager1damage 點傷害!' + - '&6&l 2nd 輸出者: $damager2name &6造成 $damager2damage 點傷害!' + - '&e&l 3rd 輸出者: $damager3name &e造成 $damager3damage 點傷害!' + - '&4擊殺者: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4競技場王者距離:$distance 格!' + deathMessage: '&2競技場王者被$players擊殺!' +colosseum_tier_70_boss_reinforcements_p1: + name: '$reinforcementLevel &6角斗士' +colosseum_tier_70_boss_reinforcements_p2: + name: '$reinforcementLevel &6角斗士' +colosseum_tier_70_gladiator: + name: '$normalLevel &6角斗士' +colosseum_tier_70_mount_reinforcements: + name: '$reinforcementLevel &c鬥牛' +dark_cathedral_tier_75_boss: + name: '$bossLevel &4克蘇魯教徒' + deathMessages: + - '&e&l---------------------------------------------' + - '&4召喚被打斷了!' + - '&c&l 1st 輸出者: $damager1name &c造成 $damager1damage 點傷害!' + - '&6&l 2nd 輸出者: $damager2name &6造成 $damager2damage 點傷害!' + - '&e&l 3rd 輸出者: $damager3name &e造成 $damager3damage 點傷害!' + - '&4擊殺者:$players' + - '&e&l---------------------------------------------' + onDamageMessages: + - 傻瓜! + - Chtulhu 萬歲! + - 沒有人能打敗Chtulhu! + - 凝視深淵…… + locationMessage: '克蘇魯教主距離:$distance 格!' + spawnMessage: '&c一個黑暗教徒正在召喚克蘇魯!' + deathMessage: '&2召喚已被 $players 阻止!' + escapeMessage: '&2邪教徒已完成召喚!' +dark_cathedral_tier_75_reinforcement: + name: '$reinforcementLevel 克蘇魯的追隨者' + onDamageMessages: + - 克蘇魯萊耶 + onDamagedMessages: + - 克蘇魯萊耶 +darkspire_level_100_berserker_brute: + name: '$normalLevel &7冥界狂戰士' +darkspire_level_100_berserker_reanimated: + name: '$normalLevel &f復活的冥界狂戰士' +darkspire_level_100_blacksmith_brute: + name: '$normalLevel &e悶燒的金匠' +darkspire_level_100_endermite: + name: '$normalLevel &5虛空爬行者' +darkspire_level_100_marksman_piglin: + name: '$normalLevel &9愚蠢的射手' +darkspire_level_100_sentry_brute: + name: '$normalLevel &3暗衛哨兵' +darkspire_level_100_summon_blaze: + name: '$reinforcementLevel &c地獄後裔' +darkspire_level_100_summon_evoker: + name: '$reinforcementLevel &c虛假的地獄使者' +darkspire_level_100_summon_ghast: + name: '$reinforcementLevel &7馬爾克瓦爾' +darkspire_level_100_summon_husk: + name: '$reinforcementLevel &c歐洛克的墮落' +darkspire_level_100_summon_ravager: + name: '$reinforcementLevel &c墮落者埃爾比克斯' +darkspire_level_100_summon_skeleton: + name: '$reinforcementLevel &c羅紋' +darkspire_level_110_berserker_reanimated: + name: '$normalLevel &7復活的冥界狂戰士' +darkspire_level_110_marksman_reanimated: + name: '$normalLevel &9復活的愚蠢射手' +darkspire_level_110_necromancer_evoker: + name: '$normalLevel &8黑心魔法師' +darkspire_level_110_sentry_reanimated: + name: '$normalLevel &3復活的暗衛哨兵' +darkspire_level_110_stationary_stray: + name: '$normalLevel &6赫恩守望者' +darkspire_level_120_miniboss_evoker: + name: '$minibossLevel &4地獄使者' +darkspire_level_120_miniboss_illusioner: + name: '$minibossLevel &4馬爾科夫' +darkspire_level_120_miniboss_skeleton: + name: '$minibossLevel &4地穴守護者' +darkspire_level_120_miniboss_stray: + name: '$minibossLevel &4尼古拉斯胸腔' +darkspire_level_120_miniboss_vindicator: + name: '$minibossLevel &4殺戮者扎爾穆爾' +darkspire_level_120_miniboss_wither_skeleton: + name: '$minibossLevel &4奧羅沙克' +darkspire_level_120_summon_zoglin: + name: '$reinforcementLevel &c阿爾扎格部落長' +darkspire_level_130_miniboss_phase_brute: + name: '$bossLevel &4野獸阿扎格' + deathMessages: + - '&e&l---------------------------------------------' + - '&4野獸阿爾扎格的入侵被阻止了!' + - '&c&l 1st 輸出者: $damager1name &c造成 $damager1damage 點傷害!' + - '&6&l 2nd 輸出者: $damager2name &6造成 $damager2damage 點傷害!' + - '&e&l 3rd 輸出者: $damager3name &e造成 $damager3damage 點傷害!' + - '&4擊殺者: $players' + - '&e&l---------------------------------------------' +darkspire_level_130_miniboss_zoglin: + name: '$bossLevel &4野獸阿扎格' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Arzag the Beast''s invasion has been stopped!' + - '&c&l 1st 輸出者: $damager1name &c造成 $damager1damage 點傷害!' + - '&6&l 2nd 輸出者: $damager2name &6造成 $damager2damage 點傷害!' + - '&e&l 3rd 輸出者: $damager3name &e造成 $damager3damage 點傷害!' + - '&4擊殺者: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4野獸阿扎格距離:$distance 格!' + spawnMessage: '&4野獸阿爾扎格準備入侵!' + escapeMessage: '&c野獸阿爾扎格完成掠奪!' +darkspire_level_80_summon_blaze: + name: '$reinforcementLevel &d虛假的地獄後裔' +fireworks_level_50_boss_phase_1: + name: '$eventBossLevel &c活潑的煙火' + spawnMessage: '&e火花充滿天空!' +fireworks_level_50_boss_phase_2: + name: '$eventBossLevel &c活潑的煙火' +fireworks_level_50_boss_phase_3: + name: '$eventBossLevel &c活潑的煙火' + deathMessages: + - '&e&l---------------------------------------------' + - '&e派對結束了!' + - '&c&l 1st 輸出者: $damager1name &c造成 $damager1damage 點傷害!' + - '&6&l 2nd 輸出者: $damager2name &6造成 $damager2damage 點傷害!' + - '&e&l 3rd 輸出者: $damager3name &e造成 $damager3damage 點傷害!' + - '&a擊殺者: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&6活潑的煙火回歸派對!' +fireworks_phase_2_reinforcement: + name: '$eventBossLevel &c布米' +fireworks_phase_3_reinforcement: + name: '$eventBossLevel &c參加派對的人' +the_great_weaver: + name: '$eventBossLevel &cThe Great Weaver' + locationMessage: '&cThe Great Weaver: $distance blocks away!' + spawnMessage: '&cAwful creatures have appeared!' + deathMessage: '&aThe Great Weaver and it''s brood have been stopped by $players!' + escapeMessage: '&4The Great Weaver and it''s brood have vanished!' +the_great_weaver_summon: + name: '$eventBossLevel &4Brood Mother' +the_great_weaver_summon_1: + name: '$eventBossLevel &6Brood' +halloween_event_boss_mount: + name: '$minibossLevel 夜魔俠' +halloween_event_boss_p1: + name: '$bossLevel 杜拉漢' + locationMessage: '&4杜拉漢距離:$distance 格!' + spawnMessage: '&4現在別丟了腦袋,無頭騎士再一次踏上地球!' + deathMessage: '&4無頭騎士被 $players 打敗了!' + escapeMessage: '&4無頭騎士已經離開,困擾著某人的夢想!' +halloween_event_boss_p2: + name: '$bossLevel 杜拉漢' + deathMessages: + - '&e&l---------------------------------------------' + - '&4無頭騎士被打敗了!' + - '&c&l 1st 輸出者: $damager1name &c造成 $damager1damage 點傷害!' + - '&6&l 2nd 輸出者: $damager2name &6造成 $damager2damage 點傷害!' + - '&e&l 3rd 輸出者: $damager3name &e造成 $damager3damage 點傷害!' + - '&4擊殺者: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4杜拉漢距離:$distance 格!' + deathMessage: '&4無頭騎士被 $players 打敗了!' + escapeMessage: '&4無頭騎士已經離開,困擾著某人的夢想!' +halloween_event_boss_reinforcement: + name: '$normalLevel 幽靈骷髏' +the_hunter: + name: '$eventBossLevel &4The Hunter' + locationMessage: '&cThe Hunter: $distance blocks away!' + spawnMessage: '&cA Hunter is on the prowl!' + deathMessage: '&aThe Hunter was hunted to extinction by $players!' + escapeMessage: '&4The Hunter declares the hunt now over!' +the_hunter_mount: + name: '$eventBossLevel &fTamed Beast' +the_living_dead: + name: '$reinforcementLevel &6活死人' +northpole_elf: + name: '$normalLevel &2工坊精靈' +northpole_elf_summon: + name: '$reinforcementLevel &a聖誕老人的精靈' +northpole_jack_frost: + name: '$bossLevel &b傑克弗羅斯特' +northpole_krampus: + name: '$bossLevel &5坎普斯' +northpole_mrs_claus: + name: '$bossLevel &c克勞斯夫人' +northpole_santa_claus: + name: '$bossLevel &4聖誕老人' + deathMessages: + - '&e&l---------------------------------------------' + - '&4有人偷走了聖誕老人的所有禮物!' + - '&c&l 1st 輸出者: $damager1name &c造成 $damager1damage 點傷害!' + - '&6&l 2nd 輸出者: $damager2name &6造成 $damager2damage 點傷害!' + - '&e&l 3rd 輸出者: $damager3name &e造成 $damager3damage 點傷害!' + - '&4擊殺者: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4聖誕老人距離:$distance 格!' + spawnMessage: '&4聖誕老人正在為聖誕節做準備!!' + escapeMessage: '&c聖誕老人騎著他的雪橇出發了!' +northpole_skeleton_summon: + name: '$reinforcementLevel &d頑皮之魂' +northpole_snowy_wraith: + name: '$reinforcementLevel &1白雪皚皚的幽靈' +the_phantom: + name: '$eventBossLevel &7The Phantom' + locationMessage: '&cThe Phantom: $distance blocks away!' + spawnMessage: '&cA Phantom roams in the dark!' + deathMessage: '&aThe Phantom and his evil troupe have been stopped by $players!' + escapeMessage: '&4The Phantom has left!' +the_phantom_summon_1: + name: '&fCave Spider' +the_phantom_summon_2: + name: '&fWItch' +the_phantom_summon_3: + name: '&fZombie' +the_phantom_summon_4: + name: '&fHusk' +the_phantom_summon_5: + name: '&fDrowned' +the_phantom_summon_6: + name: '&fSkeleton' +the_phantom_summon_7: + name: '&fStray' +the_phantom_summon_8: + name: '&fEnderman' +pirate_ship_tier_10: + name: '$normalLevel &c船員' + onDamageMessages: + - 耶! + - 哈! + - 停下,小子! + - 哈囉! + - 想跳大麻吉格舞嗎?! + - 注意後面! + - 嚇我一跳! +pirate_ship_tier_15: + name: '$normalLevel &c水手' + onDamageMessages: + - 耶! + - 哈! + - 停下,小子! + - 哈囉! + - 想跳大麻吉格舞嗎?! + - 注意後面! + - 嚇我一跳! +pirate_ship_tier_20_melee_1: + name: '$normalLevel &c船友' + onDamageMessages: + - 耶! + - 哈! + - 停下,小子! + - 哈囉! + - 想跳大麻吉格舞嗎?! + - 注意後面! + - 嚇我一跳! +pirate_ship_tier_20_melee_2: + name: '$normalLevel &e酒鬼' + onDamageMessages: + - 耶! + - 哈! + - 停下,小子! + - 哈囉! + - 想跳大麻吉格舞嗎?! + - 注意後面! + - 嚇我一跳! +pirate_ship_tier_20_miniboss: + name: '$minibossLevel &d甜點廚師' + onDamageMessages: + - 你在我的廚房裡做什麼! + - I've got layers! + - 你被抓到了! + - 滾出我廚房! + deathMessage: '&2甜點廚師已被 $players 擊敗!' +pirate_ship_tier_20_ranged: + name: '$normalLevel &c船友' + onDamageMessages: + - 耶! + - 哈! + - 停下,小子! + - 哈囉! + - 想跳大麻吉格舞嗎?! + - 注意後面! + - 嚇我一跳! +pirate_ship_tier_25_miniboss_1: + name: '$miniboss &c舵手卡戎' + onDamageMessages: + - 傻瓜啊! + - 當之無愧的對手! + deathMessage: '&2舵手卡戎被 $players 擊敗了!' +pirate_ship_tier_30_melee: + name: '$normalLevel &c海盜' + onDamageMessages: + - 耶! + - 哈! + - 停下,小子! + - 哈囉! + - 想跳大麻吉格舞嗎?! + - 注意後面! + - 嚇我一跳! +pirate_ship_tier_30_miniboss_1: + name: '$minibossLevel &7粉碎機' + onDamageMessages: + - 耶! + - 哈! + - 停下,小子! + - 哈囉! + - 想跳大麻吉格舞嗎?! + - 注意後面! + - 嚇我一跳! + deathMessage: '&7粉碎機已經被 $players 擊敗!' +pirate_ship_tier_30_ranged: + name: '$normalLevel &c海盜' + onDamageMessages: + - 耶! + - 哈! + - 停下,小子! + - 哈囉! + - 想跳大麻吉格舞嗎?! + - 注意後面! + - 嚇我一跳! +pirate_ship_tier_35: + name: '$normalLevel &4航海士官' + onDamageMessages: + - 耶! + - 哈! + - 停下,小子! + - 哈囉! + - 想跳大麻吉格舞嗎?! + - 注意後面! + - 嚇我一跳! +pirate_ship_tier_35_miniboss_1: + name: '$minibossLevel &c副手' + onDamageMessages: + - 你不行在這裡! + - 這裡是船長宿舍,退後! +pirate_ship_tier_35_miniboss_2: + name: '$minibossLevel &c副手' + onDamageMessages: + - 你不行在這裡! + - 這裡是船長宿舍,退後! +pirate_ship_tier_40_miniboss_1: + name: '$minibossLevel &4情報員' + onDamageMessages: + - 耶! + - 哈! + - 停下,小子! + - 哈囉! + - 想跳大麻吉格舞嗎?! + - 注意後面! + - 嚇我一跳! + deathMessage: '&6海盜船的情報員已被 $players 擊敗!' +pirate_ship_tier_45_boss: + name: '$bossLevel &4黑鬍子船長' + onDamageMessages: + - 滾下我的船! + - 你這旱鴨子! + spawnMessage: '&4黑鬍子船長正在帶領海盜船!' + deathMessage: '&2黑鬍子船長被 $players 擊敗!' + escapeMessage: '&2黑鬍子船長帶著戰利品逃跑了!' +the_returned: + name: '$reinforcementLevel &6復蘇的亡者' +ruins_boss_p1: + name: '$eventBossLevel &9雷神' + spawnMessage: '&6閃電從天而降!' +ruins_boss_p2: + name: '$eventBossLevel &9雷神' + deathMessages: + - '&e&l---------------------------------------------' + - '&4托爾被送回了阿斯加德!' + - '&c&l 1st 輸出者: $damager1name &c造成 $damager1damage 點傷害!' + - '&6&l 2nd 輸出者: $damager2name &6造成 $damager2damage 點傷害!' + - '&e&l 3rd 輸出者: $damager3name &e造成 $damager3damage 點傷害!' + - '&a擊殺者: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&6閃電從天而降!' +ruins_boss_reinforcement: + name: '$eventBossLevel &7芬里爾' +sewer_tier_10: + name: '$normalLevel &f潛伏者' +sewer_tier_15: + name: '$normalLevel &2履帶式' +sewer_tier_20_dry: + name: '$normalLevel &1失落的流浪者' +sewer_tier_20_gravity_boss: + name: '$minibossLevel &1火花' +sewer_tier_20_water: + name: '$normalLevel &1走私者' + onDamageMessages: + - 你沒有權限! + onDamagedMessages: + - 沒有人能擋住我們的路! +sewer_tier_20_water_boss: + name: '$minibossLevel &1被遺忘的英雄' +sewer_tier_20_wither_boss: + name: '$minibossLevel &2枯萎的屍體' +sewer_tier_30_ice_boss: + name: '$minibossLevel &2冰之幽靈' +sewer_tier_30_invisibility_boss: + name: '$minibossLevel &2幻影射手' +sewer_tier_30_melee: + name: '$normalLevel &5下水道野獸' +sewer_tier_30_ranged: + name: '$normalLevel &5靈語者' + onDamageMessages: + - 詛咒你! + - 祝你滿臉長痘痘! + - 感受精神的憤怒! + onDamagedMessages: + - 你他媽別煩我! + - 精靈,保護我! +sewer_tier_40: + name: '$normalLevel &6海市蜃樓' + onDamageMessages: + - 你的勝利,一個謊言 + - 你的賠率,嚴峻 + - 你的生活,我的 + onDamagedMessages: + - 這種痛苦,一種幻覺 + - 這血,海市蜃樓 + - 這個弱點,一個謊言 +sewer_tier_40_darkness_boss: + name: '$minibossLevel &2暗影大師' +sewer_tier_40_darkness_boss_reinforcement: + name: '$reinforcementLevel &2陰影' +sewer_tier_40_fire_boss: + name: '$minibossLevel &2燒烤大師' +sewer_tier_40_fire_boss_reinforcement: + name: '$reinforcementLevel &2火焰' +sewer_tier_40_poison_boss: + name: '$minibossLevel &2毒園丁' + onDamageMessages: + - 感受大自然的憤怒! + onDamagedMessages: + - 對我來說,你就是我的奴才! +sewer_tier_40_poison_boss_reinforcement: + name: '$reinforcementLevel &2墮落的園丁' +sewer_tier_5: + name: '$normalLevel &7下水道工人' + onDamageMessages: + - 這個區域被限制了! + - 不要跳進來! + - | + 你不應該在這裡| + onDamagedMessages: + - 你知道你在做什麼嗎!! + - 愚蠢! + - 你敢不敢! +sewer_tier_50: + name: '$normalLevel &3下水道食人魚' +sewer_tier_50_lightning_boss: + name: '$minibossLevel &2雷神之鎚' +sewer_tier_50_ravager_boss: + name: '$minibossLevel &2下水道怪物' +sewer_tier_50_spider_boss: + name: '$minibossLevel &2遠古爬行者' +sewer_tier_50_spider_boss_reinforcement: + name: '$reinforcementLevel &2小蜘蛛' +sewer_tier_50_water_boss: + name: '$minibossLevel &2食人魚王' +sewer_tier_50_water_boss_reinforcement: + name: '$reinforcementLevel &2食人魚王子' +sewer_tier_60: + name: '$normalLevel &4溺水的靈魂' +sewer_tier_70_boss: + name: '$bossLevel &4下水道之王' + deathMessages: + - '&e&l---------------------------------------------' + - '&4下水道之王被殺了!' + - '&c&l 1st 輸出者: $damager1name &c造成 $damager1damage 點傷害!' + - '&6&l 2nd 輸出者: $damager2name &6造成 $damager2damage 點傷害!' + - '&e&l 3rd 輸出者: $damager3name &e造成 $damager3damage 點傷害!' + - '&4擊殺者: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&c下水道迴盪著王者歸來的喧囂……' + deathMessage: '&2下水道之王被殺了!' + escapeMessage: '&2下水道變得安靜了……' +sewer_tier_70_boss_reinforcement: + name: '$reinforcementLevel &4溺水的靈魂' +totem_zombie_1: + name: '$eventBossLevel 頭顱殭屍' + deathMessages: + - '&e&l---------------------------------------------' + - '&4殭屍圖騰被殺了!' + - '&c&l 1st 輸出者: $damager1name &c造成 $damager1damage 點傷害!' + - '&6&l 2nd 輸出者: $damager2name &6造成 $damager2damage 點傷害!' + - '&e&l 3rd 輸出者: $damager3name &e造成 $damager3damage 點傷害!' + - '&a擊殺者: $players' + - '&e&l---------------------------------------------' + locationMessage: '&c殭屍圖騰距離:$distance 格!' + spawnMessage: '&c一個 Dr. Craftenmine 憎惡被發現了!' + deathMessage: '&a殭屍圖騰已被 $players 擊殺!' + escapeMessage: '&4Craftenmine 博士的殭屍圖騰逃脫了!' +totem_zombie_2: + name: '$eventBossLevel 圖騰殭屍' +totem_zombie_3: + name: '$eventBossLevel 圖騰殭屍' +totem_zombie_4: + name: '$eventBossLevel 圖騰殭屍' +totem_zombie_5: + name: '$eventBossLevel 圖騰殭屍' +totem_zombie_6: + name: '$eventBossLevel 圖騰殭屍' +treasure_goblin: + name: '$eventBossLevel &e藏寶哥布林' + deathMessages: + - '&e&l---------------------------------------------' + - '&e 藏寶哥布林被貪婪的冒險者掠奪了!' + - '&c&l 1st 輸出者: $damager1name &c造成 $damager1damage 點傷害!' + - '&6&l 2nd 輸出者: $damager2name &6造成 $damager2damage 點傷害!' + - '&e&l 3rd 輸出者: $damager3name &e造成 $damager3damage 點傷害!' + - '&a擊殺者: $players' + - '&e&l---------------------------------------------' + locationMessage: '&c藏寶哥布林距離: $distance 格!' + spawnMessage: '&c發現藏寶哥布林的蹤跡!' + deathMessage: '&a藏寶哥布林被 $players 擊殺!' + escapeMessage: '&4藏寶哥布林逃走了!' +tree_defender: + name: '$eventBossLevel &2Tree Defender' +undead_farmer: + name: '$eventBossLevel &aUndead Farmer' + locationMessage: '&cUndead Farmer: $distance blocks away!' + spawnMessage: '&cAn Undead Farmer walks the earth!' + deathMessage: '&aThe Undead Farmer''s career was ended by $players!' + escapeMessage: '&4The Undead Farmer has gone back to rest!' +undead_farmer_summon: + name: '$eventBossLevel &2Farmers Pride' +undead_farmer_summon_1: + name: '$eventBossLevel &2Failed Hog' +undead_horde_summon_1: + name: '$reinforcementLevel &aUndead Horde' +undead_horde_summon_2: + name: '$reinforcementLevel &dUndead Horde' +undead_horde_summon_3: + name: '$reinforcementLevel &eUndead Horde' +unwanted_visitor: + name: '$eventBossLevel &9Unwanted Visitor' + locationMessage: '&cUnwanted Visitor: $distance blocks away!' + spawnMessage: '&cAn Unwanted Visitor has come to the nether to warm up!' + deathMessage: '&aThe Visitor was slain by $players!' + escapeMessage: '&4The Visitor has gone back to his chilly domain!' +unwanted_visitor_summon: + name: '$eventBossLevel &bIce Clone' +vampire_boneman: + name: '$reinforcementLevel &7排水管' +vampire_brute: + name: '$normalLevel &1吸血鬼蠻獸' +vampire_brute_coffin_breaker: + name: '$normalLevel &1吸血鬼蠻獸' +vampire_brute_gargoyle_rush_left: + name: '$normalLevel &3吸血鬼蠻獸' +vampire_brute_gargoyle_rush_left_phase_2: + name: '$normalLevel &3吸血鬼蠻獸' +vampire_brute_gargoyle_rush_right: + name: '$normalLevel &3吸血鬼蠻獸' +vampire_brute_gargoyle_rush_right_phase_2: + name: '$normalLevel &3吸血鬼蠻獸' +vampire_fledgling: + name: '$normalLevel &9劣等吸血鬼' +vampire_fledgling_coffin_breaker: + name: '$normalLevel &9劣等吸血鬼' +vampire_fledgling_gargoyle_overlord: + name: '$normalLevel &9劣等吸血鬼' +vampire_gargoyle: + name: '$normalLevel &6吸血石像鬼' +vampire_grunt: + name: '$normalLevel &1吸血鬼咕嚕' +vampire_grunt_coffin_breaker: + name: '$normalLevel &1吸血鬼咕嚕' +vampire_grunt_gargoyle_rush_left: + name: '$normalLevel &1吸血鬼咕嚕' +vampire_grunt_gargoyle_rush_left_phase_2: + name: '$normalLevel &1吸血鬼咕嚕' +vampire_grunt_gargoyle_rush_right: + name: '$normalLevel &1吸血鬼咕嚕' +vampire_grunt_gargoyle_rush_right_phase_2: + name: '$normalLevel &1吸血鬼咕嚕' +vampire_hound: + name: '$reinforcementLevel &b吸血鬼獵犬' +vampire_king: + name: '$bossLevel &4吸血鬼王' + deathMessages: + - '&e&l---------------------------------------------' + - '&4吸血鬼王被殺了!' + - '&c&l 1st 輸出者: $damager1name &c造成 $damager1damage 點傷害!' + - '&6&l 2nd 輸出者: $damager2name &6造成 $damager2damage 點傷害!' + - '&e&l 3rd 輸出者: $damager3name &e造成 $damager3damage 點傷害!' + - '&4擊殺者: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4吸血鬼王距離:$distance 格!' + spawnMessage: '&c吸血鬼王爬回他的王座……' + deathMessage: '&2吸血鬼王被擊中了!' + escapeMessage: '&2安全的夜晚降臨,但能維持多久....' +vampire_king_phase_2: + name: '$bossLevel &4吸血鬼王' +vampire_king_phase_3: + name: '$bossLevel &4吸血鬼王' +vampire_king_phase_4: + name: '$bossLevel &4吸血鬼王' +vampire_king_phase_5: + name: '$bossLevel &4吸血鬼王' +vampire_king_phase_6: + name: '$bossLevel &4吸血鬼王' +vampire_level_120_miniboss_evoker: + name: '$minibossLevel &4地獄之魂' +vampire_level_120_miniboss_skeleton: + name: '$minibossLevel &4地穴守護者之魂' +vampire_level_120_miniboss_stray: + name: '$minibossLevel &4Nicolas Ribcage 的靈魂' +vampire_level_120_miniboss_wither_skeleton: + name: '$minibossLevel &4歐洛克之魂' +vampire_necromancer: + name: '$normalLevel &5吸血死靈法師' +vampire_necromancer_dining_hall: + name: '$normalLevel &5吸血死靈法師' +vampire_necromancer_entrance: + name: '$normalLevel &5吸血死靈法師' +vampire_necromancer_foresight_pool: + name: '$normalLevel &5吸血死靈法師' +vampire_necromancer_gargoyle_rush: + name: '$normalLevel &5吸血死靈法師' +vampire_necromancer_gargoyle_rush_phase_2: + name: '$normalLevel &5吸血死靈法師' +vampire_necromancer_left_bedroom: + name: '$normalLevel &5吸血死靈法師' +vampire_necromancer_right_bedroom: + name: '$normalLevel &5吸血死靈法師' +vampire_necromancer_supply_room: + name: '$normalLevel &5吸血死靈法師' +vampire_necromancer_supreme_coffin_breaker: + name: '$minibossLevel &5吸血死靈法師長' +vampire_necromancer_supreme_coffin_breaker_phase_2: + name: '$minibossLevel &5吸血死靈法師長' +vampire_necromancer_supreme_coffin_breaker_phase_3: + name: '$minibossLevel &5吸血死靈法師長' +vampire_necromancer_supreme_coffin_breaker_phase_4: + name: '$minibossLevel &5吸血死靈法師長' +vampire_necromancer_supreme_coffin_breaker_phase_5: + name: '$minibossLevel &5吸血死靈法師長' +vampire_necromancer_supreme_gargoyle_overlord: + name: '$minibossLevel &5吸血死靈法師長' +vampire_necromancer_supreme_gargoyle_overlord_phase_2: + name: '$minibossLevel &5吸血死靈法師長' +vampire_necromancer_supreme_gargoyle_overlord_phase_3: + name: '$minibossLevel &2石像鬼霸王' +vampire_sentinel: + name: '$minibossLevel &e吸血鬼哨兵' +vampire_thrall: + name: '$reinforcementLevel &d吸血鬼的奴僕' +vampire_wraith: + name: '$minibossLevel &8血鬼' +vampire_wraith_phase_2: + name: '$minibossLevel &8溺水的靈魂' +vampire_zombie: + name: '$normalLevel &a乾枯的外殼' +vex_top: + name: '$eventBossLevel &eVex Selfish Top' + locationMessage: '&cVex Troublemakers: $distance blocks away!' + spawnMessage: '&cA gang of Vex Troublemakers have appeared!' + deathMessage: '&aThe Vex Troublemakers were slain by $players!' + escapeMessage: '&4The Vex Troublemakers have decided to leave.' +vex_top_mount_1: + name: '$eventBossLevel &6Vex Bottom' +vex_top_mount_2: + name: '$eventBossLevel &6Vex Bottom' +vex_top_mount_3: + name: '$eventBossLevel &6Vex Bottom' +warlock: + name: '$eventBossLevel &dWarlock' + locationMessage: '&cWarlock: $distance blocks away!' + spawnMessage: '&cA demon riding Warlock has appeared!' + deathMessage: '&aThe Warlock was slain by $players!' + escapeMessage: '&4The Warlock ran away on his demon!' +warlock_mount: + name: '$eventBossLevel &dDemon' +wasp_queen: + name: '$eventBossLevel &aWasp Queen' + locationMessage: '&cWasp Queen: $distance blocks away!' + spawnMessage: '&cA wasp swarm has been sighted!' + deathMessage: '&aThe wasp swarm was eliminated by $players!' + escapeMessage: '&4The wasp swarm has flown away.' +wasp_queen_summon: + name: '$eventBossLevel &aWasp' +water_pest: + name: '$eventBossLevel &3Water Pest' + locationMessage: '&cWater Pest: $distance blocks away!' + spawnMessage: '&cAn annoying foe swims the waters!' + deathMessage: '&aThe Water Pest was slain by $players!' + escapeMessage: '&4The waters are clear of all Pests' +weapons_goblin: + name: '$eventBossLevel &c武器哥布林' + deathMessages: + - '&e&l---------------------------------------------' + - '&e武器哥布林被掠奪了!' + - '&c&l 1st 輸出者: $damager1name &c造成 $damager1damage 點傷害!' + - '&6&l 2nd 輸出者: $damager2name &6造成 $damager2damage 點傷害!' + - '&e&l 3rd 輸出者: $damager3name &e造成 $damager3damage 點傷害!' + - '&a擊殺者: $players' + - '&e&l---------------------------------------------' + locationMessage: '&c武器哥布林距離:$distance 格!' + spawnMessage: '&c武器哥布林被發現了!' + deathMessage: '&a武器哥布林被 $players 殺死了!' + escapeMessage: '&4武器哥布林逃脫了!' +wendigo: + name: '$eventBossLevel &7Wendigo' + locationMessage: '&cWendigo: $distance blocks away!' + spawnMessage: '&cSomething awful has appeared!' + deathMessage: '&aThe Wendigo has been slain $players!.' + escapeMessage: '&4The Wendigo has disappeared!' +wendigo_summon: + name: '$reinforcementLevel &aWindigo' +werehare: + name: '$eventBossLevel &5Alice' + locationMessage: '&cWerehare: $distance blocks away!' + spawnMessage: '&cA bloody roar can be heard! A werehare approaches!' + deathMessage: '&a$players! made sure to end the werehare''s reign!' + escapeMessage: '&4The werehare escaped!' +werehare_p2: + name: '$eventBossLevel &dWerehare' +wild_wolf: + name: '$reinforcementLevel &7野狼' +wood_league_wave_10_boss: + name: '$bossLevel &4壞狗狗' +wood_league_wave_10_reinforcement: + name: '$reinforcementLevel &c壞小狗' +wood_league_wave_11_melee: + name: '$normalLevel &4競技場殭屍' +wood_league_wave_11_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_12_melee: + name: '$normalLevel &4競技場殭屍' +wood_league_wave_12_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_13_melee: + name: '$normalLevel &4競技場殭屍' +wood_league_wave_13_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_14_melee: + name: '$normalLevel &4競技場殭屍' +wood_league_wave_14_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_15_miniboss: + name: '$bossLevel &4奧克斯先生' + onDamagedMessages: + - '(豬叫)哼!' +wood_league_wave_16_melee: + name: '$normalLevel 奧克斯·范先生' +wood_league_wave_16_ranged: + name: '$normalLevel 奧克斯·范先生' +wood_league_wave_17_melee: + name: '$normalLevel &4競技場殭屍' +wood_league_wave_17_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_18_melee: + name: '$normalLevel &4擊劍俱樂部愛好者' +wood_league_wave_19_ranged: + name: '$normalLevel 射箭俱樂部愛好者' +wood_league_wave_1_melee: + name: '$normalLevel 競技場殭屍' +wood_league_wave_1_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_20_boss: + name: '$bossLevel &2佐爾坦' +wood_league_wave_21_melee: + name: '$normalLevel &4競技場殭屍' +wood_league_wave_21_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_22_melee: + name: '$normalLevel &4競技場殭屍' +wood_league_wave_22_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_23_melee: + name: '$normalLevel &4競技場殭屍' +wood_league_wave_23_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_24_melee: + name: '$normalLevel &4競技場殭屍' +wood_league_wave_24_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_25_miniboss: + name: '$minibossLevel &b阿格魯克' +wood_league_wave_26_melee: + name: '$normalLevel &4競技場殭屍' +wood_league_wave_26_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_27_melee: + name: '$normalLevel &4競技場殭屍' +wood_league_wave_27_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_28_melee: + name: '$normalLevel &4競技場殭屍' +wood_league_wave_29_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_2_melee: + name: '$normalLevel 競技場殭屍' +wood_league_wave_2_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_30_boss: + name: '$bossLevel &2南方毒蛇' +wood_league_wave_31_melee: + name: '$normalLevel &4競技場殭屍' +wood_league_wave_31_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_32_melee: + name: '$normalLevel &4競技場殭屍' +wood_league_wave_32_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_33_melee: + name: '$normalLevel &4競技場殭屍' +wood_league_wave_33_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_34_melee: + name: '$normalLevel &4競技場殭屍' +wood_league_wave_34_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_35_miniboss: + name: '$minibossLevel &6小丑' +wood_league_wave_36_melee: + name: '$normalLevel &4競技場殭屍' +wood_league_wave_36_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_37_melee: + name: '$normalLevel &4競技場殭屍' +wood_league_wave_37_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_38_melee: + name: '$normalLevel &4競技場劍客' +wood_league_wave_39_ranged: + name: '$normalLevel 競技場弓箭手' +wood_league_wave_3_melee: + name: '$normalLevel 競技場殭屍' +wood_league_wave_3_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_40_boss: + name: '$bossLevel &c詛咒者克魯西奧' +wood_league_wave_41_melee: + name: '$normalLevel &4競技場殭屍' +wood_league_wave_41_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_42_healer: + name: '$normalLevel 競技場治療師' +wood_league_wave_42_melee: + name: '$normalLevel &4競技場殭屍' +wood_league_wave_42_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_43_healer: + name: '$normalLevel 競技場治療師' +wood_league_wave_43_melee: + name: '$normalLevel &4競技場殭屍' +wood_league_wave_43_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_44_healer: + name: '$normalLevel 競技場治療師' +wood_league_wave_44_melee: + name: '$normalLevel &4競技場殭屍' +wood_league_wave_44_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_45_miniboss: + name: '$minibossLevel &6千刃' +wood_league_wave_46_healer: + name: '$normalLevel 競技場治療師' +wood_league_wave_46_melee: + name: '$normalLevel &4競技場殭屍' +wood_league_wave_46_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_47_healer: + name: '$normalLevel 競技場治療師' +wood_league_wave_47_melee: + name: '$normalLevel &4競技場殭屍' +wood_league_wave_47_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_48_healer: + name: '$normalLevel 競技場治療師' +wood_league_wave_48_melee: + name: '$normalLevel &4競技場殭屍' +wood_league_wave_49_healer: + name: '$normalLevel 競技場治療師' +wood_league_wave_49_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_4_melee: + name: '$normalLevel 競技場殭屍' +wood_league_wave_4_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_50_boss: + name: '$bossLevel &6冠軍烏瑟爾' +wood_league_wave_50_boss_p2: + name: '$bossLevel &6冠軍烏瑟爾' +wood_league_wave_50_boss_p3: + name: '$bossLevel &6冠軍烏瑟爾' +wood_league_wave_50_reinforcement: + name: '$reinforcementLevel &6烏瑟·斯坦' +wood_league_wave_5_miniboss: + name: '$minibossLevel &c戰牛' + onDamagedMessages: + - 汪汪! +wood_league_wave_6_melee: + name: '$normalLevel 競技場殭屍' +wood_league_wave_6_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_7_melee: + name: '$normalLevel 競技場殭屍' +wood_league_wave_7_ranged: + name: '$normalLevel 競技場弩手' +wood_league_wave_8_melee: + name: '$normalLevel 競技場殭屍' +wood_league_wave_9_ranged: + name: '$normalLevel 競技場弩手' +yeti: + name: '$eventBossLevel &bYeti' + locationMessage: '&cYeti: $distance blocks away!' + spawnMessage: '&cA mighty beast has appeared!' + deathMessage: '&aThe beast is no more thanks to $players!.' + escapeMessage: '&4The beast has escaped!' +yezhi_baba: + name: '$eventBossLevel &cYezhi Baba' + locationMessage: '&cYezhi Baba: $distance blocks away!' + spawnMessage: '&cA foul hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +yezhi_baba_summon: + name: '$reinforcementLevel &4Yezhi Baba' +zombie_friends_friend: + name: '$reinforcementLevel &7殭屍友人' +zombie_king: + name: '$eventBossLevel &4殭屍王' + locationMessage: '&c殭屍王距離: $distance 格!' + spawnMessage: '&c殭屍王被發現蹤跡!' + deathMessage: '&a殭屍王被 $players! 擊殺' + escapeMessage: '&4殭屍王逃跑了!' +zombie_parents_dad: + name: '$reinforcementLevel &7殭屍爸爸' +zombie_parents_mom: + name: '$reinforcementLevel &7殭屍媽媽' +back_teleporter: + name: 荷米斯 + role: <傳送者> + greetings: + - 歡迎 來到\n冒險者公會大廳! + dialog: + - 需要返回嗎? + farewell: + - 旅途平安, 朋友. + noPreviousLocationMessage: '&8[EliteMobs] &c無法送你回上一個位置 - 無法找到位置!' +barkeep: + name: 巴特利 + role: <酒保> + greetings: + - 喝點什麼? + - 來點什麼 + - 口渴? + - 你好, 夥計. + dialog: + - 來嚐嚐我們的特調. + - 只有這裡才喝得到的. + - 嘗試過保證欲罷不能. + farewell: + - 歡迎隨時回來 + - 來乾! + - 乾杯啦! + - 讚啦! + - 喝了! + - 乾! + - 催下去! + - 乾了啦! + - 讚的啦! + - 乾了! + - 我敬你! + - 讚啦! + - 乾杯! +blacksmith: + name: 格雷克 + role: <鐵匠> + greetings: + - 歡迎來到我的商店! + - 這裡會賣你好康的! + - 全新好物,只有你才有! + - 想賣點東西嗎? + - 想買點好東西嗎? + - 隨時都會有新商品! + dialog: + - 越高等級怪物掉落越好的裝備! + - 物品會帶有許多附魔而更有價值! + - 越高等級的怪物掉落越好的物品! + - 高等級怪物越有高機會掉戰利品! + - + - + - 有些裝備會有特殊效果! + - 有些裝備會有獨特效果! + - 帶有獵人的附魔會使\n精英怪發現機率上升! + - 精英怪物掉落的特殊武器和護甲都可以拿來這賣掉! + - 越高的公會階級會增加精英怪物掉落戰利品的品質! + farewell: + - 感謝你的購買! + - 歡迎再度蒞臨! + - 歡迎隨時回來! + - 請多多推薦你的朋友來光臨! +combat_instructor: + name: 查爾斯 + role: <戰鬥教官> + greetings: + - 想學些關於戰鬥技術? + - 需要來點戰鬥教程? + - 想進一步更了解戰鬥? + - 準備好與精英怪戰鬥? + dialog: + - 精英怪身上還繞的物品\n通常顯示其擁有的能力 + - 越高等級的精英怪\n通常會擁有\n更多的特殊力量 + - 越高等的精英怪f\nt也意味著\n有著更好的戰利品 + - 高等級精英怪\n有著較高機率\n掉落特殊的物品 + - 精英怪環繞著箭矢\n會對鄰近目標們發射箭矢 + - 精英怪環繞著終界之眼\n當它擊中你時\n會產生致盲 + - 精英怪環繞著魔法粒子\n當它擊中你時會產生噁心 + - 精英怪環繞著岩漿桶\n當它擊中你時會使你燃燒 + - |- + 帶有浮動\n火球的精英生物,向附近玩家發射火球。 + - 精英怪環繞著冰\n當它擊中你時會造成冰凍 + - 精英怪環繞著鞘翅\n當它擊中你會造成飄浮 + - 精英怪環繞著綠寶石\n當它擊中你會造成中毒 + - 精英怪環繞著活塞\n當它擊中你時會推開你 + - 精英怪環繞著圖騰\n當它擊中你會造成削弱 + - 精英怪環繞著蜘蛛網\n當它擊中你會被網住 + - 精英怪環繞著骷髏頭\n當它擊中你會造成凋零 + - 精英怪環繞著箱子\n擊殺後會掉落更多物品 + - 精英怪環繞著金靴\n它會跑得更快 + - 精英怪環繞著音樂箱\n擊中它會嘲諷你 + - 精英怪環繞著玻璃片\n它會變得隱形 + - 精英怪環繞著追跡之箭\n會使它箭矢無效化 + - 精英怪環繞著羽毛\n使它不受摔落傷害 + - 精英怪環繞著烈燄粉\n使它免疫火傷 + - 精英怪環繞著鐵砧\n使它變得更沉重 + - 精英怪環繞著骨塊\n死亡時會留下骨塊 + - 精英怪環繞著史萊姆方塊\n會跳得更高 + - 精英怪環繞著史萊姆球\n死亡時會產生真空 + - 精英怪環繞著栓繩\n擊中玩家將其拉向自己 + - 精英怪環繞著骨頭\n戰鬥時會使用骨柱 + - 精英怪環繞著藥水箭\n會發射追蹤箭 + - 精英怪環繞著磨菇\n被擊中會變大 + - 精英怪環繞著頭顱\n被擊中會招喚援軍 + - 精英怪環繞著書本\n擊殺後會招喚援軍 + - 精英怪環繞著蛋\n被擊中就會招喚援軍 + - 精英怪環繞著煙火\n被擊中會招喚火箭小隊 +enhancer_config: + name: 提姆 + role: <強化師> + greetings: + - 想升級物品? + - 有升級球嗎? + - 來這升級物品吧! + - Ahoy! + - 你有廢料嗎? + dialog: + - 你的物品頗糟糕,\n 來升點級吧! + - 這邊可以升級你的物品! + - 你有取得升級寶珠? + - 這把劍看起來糟透,\n來這邊升級它! + - 需要點升級嗎? + farewell: + - 別在外面丟人現眼了! + - 當你有更多寶珠時歡迎回來! + - 去取得更多寶珠! +frost_queen_teleporter: + name: Ishard the Frostbitten + role: + greetings: + - '' +guide_0: + name: 突擊隊 + role: <指南> + greetings: + - 聽說過AG嗎? + - 去過AG嗎? + - 聽說過冒險者公會嗎? + - 知道冒險者公會嗎? + dialog: + - 聽說過AG嗎? + - 去過AG嗎? + - 聽說過冒險者公會嗎? + - 知道冒險者公會嗎? + farewell: + - 歡迎隨時回來 + - 如果你需要,我會在這! + - I'll be around! + - 晚點見! +guide_1: + name: 切夙斯 + role: <指南> + greetings: + - 需要嚮導? + - 需要提示 + - 你迷路了嗎? + - 需要協助嗎? + dialog: + - 我知道一切\n關於這個地方! + - 想認識其他\n冒險者公會的成員嗎? + - 想用自己的方式來 \n了解這個地方? + farewell: + - 歡迎隨時回來 + - 如果你需要,我會在這! + - 我會在身邊! + - 晚點見! +guild_attendant: + name: 吉莉安 + role: <公會嚮導> + greetings: + - 歡迎來到\n冒險者公會! + - 歡迎! + dialog: + - 請閱覽任務榜單\n看有沒有可使用任務! + - 你可以選擇與我交談\n來變更你的公會階級! + - 你可以找鐵匠賣出物品\n來賺取一些精英幣! + - 你可以跟競技場大師交談\n來前往競技場! + - 你可以跟鐵匠購買\n一些精英裝備! + - 你可以跟戰鬥大師交談\n以方便查詢自己的戰鬥等級! + - 解鎖新的公會層級\n可以增加自己的最大生命值! + farewell: + - 下次見! + - 感謝你留駐於此! + - 狩獵愉快! +primis_69ozcanofbepis: + name: '&a69OzCanOfBepis' + role: '&2(遊戲玩家)地圖製作者(uuuuge遊戲玩家)' + dialog: + - 希望你喜歡地圖! + farewell: + - 玩得開心! +primis_caeruleaum_fisherman: + name: '&3普修斯‧耐西斯' + role: '&b<漁夫>' + greetings: + - 你好,流浪者。 + dialog: + - 最近釣到什麼好魚? + - 歡迎,外鄉人 + - 要點什麼? + farewell: + - 附近見! + - 歡迎再度蒞臨! +primis_caeruleaum_fletcher: + name: '&6菲杜斯·阿爾提菲斯' + role: '&e<老道經驗的冒險家>' + greetings: + - 你好. + dialog: + - 我曾經和你一樣是個冒險者。 + - 歡迎,外鄉人 + - 要點什麼? + - |- + 你不是本地人,對嗎? + farewell: + - 附近見! + - 歡迎再度蒞臨! +primis_caeruleaum_forager: + name: '&5菲杜菈·帕普拉杜斯' + role: '&d<受傷的覓食者>' + greetings: + - 你好,陌生人。 + dialog: + - 我曾經和你一樣是個冒險者。 + - 歡迎,外鄉人 + - 要點什麼? + - |- + 你不是本地人,對嗎? + farewell: + - 附近見! + - 歡迎再度蒞臨! +primis_caeruleaum_hint_giver: + name: '&f菲爾拉古烏斯' + role: '&f聰明人' + greetings: + - 您好! + - 哈囉! + - 真高興見到你! + - 你好! + dialog: + - + - + - + - + - 西南的廢墟真是個可怕的地方!\n 誰會去那裡... + - + - + - 我聽說這是一種討厭的地方\n狼已經在狼窩裡安頓下來了! + farewell: + - 再見。 + - 晚點見! + - 再來找我! + - 再見了! +primis_caeruleaum_injured_fisherman: + name: '&3卡里都斯·皮斯卡都斯' + role: '&b<受傷的漁夫>' + greetings: + - 你好,流浪者。 + dialog: + - 最近釣到什麼好魚? + - 歡迎,外鄉人 + - 要點什麼? + - |- + 你不是本地人,對嗎? + farewell: + - 附近見! + - 歡迎再度蒞臨! +primis_caeruleaum_jeeves: + name: Jeeves + role: <旅行商人> + greetings: + - 只是旅遊! + dialog: + - Just here to sell\nto the shop-keep. + - I'm busy negotiating\nhere. + - Not right now,\ncome back later. + farewell: + - Uhuh... +primis_caeruleaum_leader: + name: '&4曲斯·皮契斯' + role: '&c<村長>' + greetings: + - 歡迎來到我們村! + dialog: + - |- + 不要問這個村莊能為你做什麼,要問你能為這個村莊做什麼! + - 歡迎,外鄉人 + - 要點什麼? + - |- + 你不是本地人,對嗎? + farewell: + - 走吧! + - 歡迎再度蒞臨! +primis_caeruleaum_merchant: + name: 安普特爾 + role: <商人> + greetings: + - 想賣點東西嗎? + dialog: + - 土匪偷了我的東西! + - 恐怕沒有什麼可賣的了。 + - 你有什麼我都買! + farewell: + - 旅途平安! +primis_captain: + name: '斯瓦拉斯' + role: '&c<探險隊隊長>' + greetings: + - 你終於醒了! + - 那是一次瘋狂的旅行! + - 還活著? + - 我們不要再那樣做了! + dialog: + - 我有一個任務給你! + - 我需要你的幫助! + - |- + 幸好你來了,我們需要幫助! + farewell: + - 走吧! + - 別忘了我! + - 歡迎再度蒞臨! +primis_deli'o: + name: '&eDéli''O' + role: '&6地圖製作者(遊戲玩家)' + dialog: + - 希望你喜歡這張地圖! + farewell: + - 玩得開心 +primis_farmstead_son: + name: '&4菲留斯' + role: '&c<燈塔守護者的兒子>' + greetings: + - 你從哪來旅行? + - 你好像從很遠的地方來到這裡。 + dialog: + - 我們生活的危險時期。 + - 你見過我父親嗎? + - 沒有燈塔,船隻將如何航行? + farewell: + - 小心你的背後。 + - 輕裝上陣! +primis_farmstead_wife: + name: '&4阿馬維特' + role: '&c<燈塔看守人的妻子>' + greetings: + - 我以前沒見過你! + - 有 Pontis Mille 的消息嗎? + dialog: + - 你見過我丈夫嗎? + - 我需要你的幫助! + - 我們生活在多麼危險的時代。 + - 有什麼不對勁! + farewell: + - 旅途平安! + - 謝謝你! +primis_first_mate: + name: '&c伊拉昆迪' + role: '&c<大副>' + greetings: + - 你終於醒了! + - 那是一次瘋狂的旅行! + - 還活著? + - 我們不要再那樣做了! + dialog: + - 我有一個任務給你! + - 我需要你的幫助! + - |- + 幸好你來了,我們需要幫助! + farewell: + - 走吧! + - 別忘了我! + - 歡迎再度蒞臨! +primis_frostcone: + name: '&bFrostCone' + role: '&9地圖製作者(遊戲玩家)' + dialog: + - 希望你喜歡地圖! + - 這是一個被雪覆蓋的松果。 + - Primis出來了嗎? + farewell: + - 玩得開心! +primis_gladius_guard_1: + name: '&2守衛隊' + role: '&a' + greetings: + - 輕裝上陣! + - 來幫忙的? + - 該死的入侵者! + - 小心你的背後。 + - 請務必小心。 +primis_gladius_guard_2: + name: '&2守衛隊' + role: '&a' + greetings: + - 輕裝上陣! + - 來幫忙的? + - 該死的入侵者! + - 小心你的背後。 + - 一定要注意安全! +primis_gladius_guard_3: + name: '&2守衛隊' + role: '&a' + greetings: + - 輕裝上陣! + - 來幫忙的? + - 該死的入侵者! + - 小心你的背後。 + - 一定要注意安全! +primis_gladius_guard_4: + name: '&2守衛隊' + role: '&a' + greetings: + - 輕裝上陣! + - 來幫忙的? + - 該死的入侵者! + - 小心你的背後。 + - 一定要注意安全! +primis_gladius_lord: + name: '&4哈斯塔將軍' + role: '&c' + greetings: + - 你是來幫忙的嗎? + - 外面是戰區! + dialog: + - 他們是某個夜晚來的! + - 我們以前從沒看過他們! + - 我們的援軍在哪裡? + farewell: + - 小心你的背後。 + - 輕裝上陣! +primis_gladius_quartermaster: + name: '&6契普斯' + role: '&c<軍需官>' + greetings: + - 你是來幫忙的嗎? + - 外面是戰區! + dialog: + - 他們是某個夜晚來的! + - 我們以前從沒看過他們! + - 我們的援軍在哪裡? + farewell: + - 小心你的背後。 + - 輕裝上陣! +primis_gladius_strategist: + name: '&6貝利爾' + role: '&c<戰略家>' + greetings: + - 你是來幫忙的嗎? + - 外面是戰區! + dialog: + - 他們是某個夜晚來的! + - 我們以前從沒看過他們! + - 我們的援軍在哪裡? + farewell: + - 小心你的背後。 + - 輕裝上陣! +primis_groves_nemus_leader: + name: '&3King Nemian' + role: '&c<鎮長>' + dialog: + - 是什麼把你帶到山下? + - 你從哪來? + - |- + 你試過我們的 + 美味的發光漿果? + farewell: + - 直到下一次 +primis_ice_village_fisherman_boat: + name: '&3Theopropides Nero' + role: '&3<漁夫>' + greetings: + - 釣魚的好天氣! + dialog: + - 寒冷的一天釣魚。 + - 他們就不會咬人。 + - 只需要耐心等待。 + farewell: + - 不要掉進\n水裡! +primis_ice_village_friendly_villager: + name: '&3Luxuria Placidus' + role: '&3<友善的村民>' + greetings: + - 你好! + dialog: + - 年紀的衰老\n不會讓我遲鈍! + - 保持好心情\n很重要。 + - 希望\n快點下雪。 + farewell: + - 再見! +primis_ice_village_generic_npc_1: + name: '&3Albertus Vitalis' + role: '&3<村民>' + greetings: + - 進展如何。 + dialog: + - 沒有什麼比得上啤酒了! + farewell: + - 掰。 +primis_ice_village_generic_npc_10: + name: '&3Trebatia Cornix' + role: '&3<村民>' + greetings: + - 好。 + dialog: + - 是的,明白了。 + - 我看看... + - 哦! + farewell: + - 下次\n我會試試的。 +primis_ice_village_generic_npc_11: + name: '&3Albatia Lateranus' + role: '&3<村民>' + greetings: + - 拜訪紫羅蘭? + dialog: + - 不要造成任何麻煩! + farewell: + - 回頭見,陌生人。 +primis_ice_village_generic_npc_12: + name: '&3Hostilia Carantus' + role: '&3<村民>' + greetings: + - 你好. + dialog: + - 我正要\n離開。 + farewell: + - 掰。 +primis_ice_village_generic_npc_13: + name: '&3Vagennia Sejanus' + role: '&3<村民>' + greetings: + - 你好。 + dialog: + - 是什麼讓你\n來到碼頭? + farewell: + - 再見。 +primis_ice_village_generic_npc_14: + name: '&3Dinia Vettonius' + role: '&3<囚犯>' + greetings: + - 你好.. + dialog: + - 又是漫長的一天... + farewell: + - '...' +primis_ice_village_generic_npc_15: + name: '&3Sceledrus Marcallas' + role: '&3<囚犯>' + greetings: + - 你好.. + dialog: + - 又是漫長的一天... + farewell: + - '...' +primis_ice_village_generic_npc_16: + name: '&3Fridericus Castinus' + role: '&3<囚犯>' + greetings: + - 你好.. + dialog: + - 又是漫長的一天... + farewell: + - '...' +primis_ice_village_generic_npc_17: + name: '&3Cario Fimbria' + role: '&3<囚犯>' + greetings: + - 你好.. + dialog: + - 又是漫長的一天... + farewell: + - '...' +primis_ice_village_generic_npc_18: + name: '&3Piscatores Laevinus' + role: '&3<囚犯>' + greetings: + - 你好.. + dialog: + - 又是漫長的一天... + farewell: + - '...' +primis_ice_village_generic_npc_19: + name: '&3Monkerius Vitalis' + role: '&3<村民>' + greetings: + - 在打獵? + dialog: + - 是時候去打獵了。 + farewell: + - 掰掰。 +primis_ice_village_generic_npc_2: + name: '&3Luxuria Tyranus' + role: '&3<村民>' + greetings: + - 進展如何。 + dialog: + - 再一次! + farewell: + - 掰。 +primis_ice_village_generic_npc_3: + name: '&3Aurelio Nigidius' + role: '&3<村民>' + greetings: + - 嘿,這。 + dialog: + - 什麼景象! + farewell: + - 再見。 +primis_ice_village_generic_npc_4: + name: '&3Lysidamus Paratus' + role: '&3<村民>' + greetings: + - 出去散步? + dialog: + - 我無法想像\n住在\n沒有雪的地方。 + - 開始變冷了。 + farewell: + - 到後來。 +primis_ice_village_generic_npc_5: + name: '&3Simo Proceus' + role: '&3<村民>' + greetings: + - 多棒的風景! + dialog: + - 我喜歡爬山。 + - 看看所有的魚! + farewell: + - 是啊。 +primis_ice_village_generic_npc_6: + name: '&3Dordalus Marullinus' + role: '&3<村民>' + greetings: + - 歡迎來到酒吧! + dialog: + - 是時候讓我的手指\n暖起來了。 + - 暖融融。 + farewell: + - 別讓自己\n著涼了。 +primis_ice_village_generic_npc_7: + name: '&3Tranio Silvanus' + role: '&3<村民>' + greetings: + - 這裡某處... + dialog: + - 它在哪裡。 + farewell: + - 我確定我把它\n放0在這裡。 +primis_ice_village_generic_npc_8: + name: '&3Milonia Trebellius' + role: '&3<村民>' + greetings: + - 歡迎來到\n我們的村莊! + dialog: + - 我現在好餓。 + - 想去吃\n鮭魚。 + farewell: + - 掰掰。 +primis_ice_village_generic_npc_9: + name: '&3Barria Brocchus' + role: '&3<村民>' + greetings: + - 你聽到了嗎... + dialog: + - 下次\n揮劍時\n請注意點。 + - 盾牌可以\n多用於防禦。 + farewell: + - 知道了? +primis_ice_village_hunter: + name: '&3Alanus Isatis' + role: '&3<野豬獵人>' + greetings: + - 嘿! + dialog: + - 希望明天\n有個好日子。 + - 這次\n肯定能好好處理這些野豬。 + farewell: + - 與你相見。 +primis_ice_village_imprisoned_husband: + name: '&3Eleusium Calenus' + role: '&3<被囚禁的丈夫>' + greetings: + - '.....' + dialog: + - 又是在籠子裡的一天…… + farewell: + - '.....' +primis_ice_village_jail_caretaker: + name: '&3Philolaches Triferus' + role: '&3<監獄看守>' + greetings: + - 嘿,這。 + dialog: + - 還有什麼\n需要修復的。 + - 我應該\n檢查一下籠子。 + farewell: + - 回頭見。 +primis_ice_village_jail_guard: + name: '&3Eleusium Festus' + role: '&3<獄警>' + greetings: + - 爬了\n塔。 + dialog: + - 一切似乎都井然有序。 + - 幾乎所有的... + farewell: + - 小心。 +primis_ice_village_jail_master: + name: '&3Romanus Superbus' + role: '&3<監獄長>' + greetings: + - 幸會。 + dialog: + - 如果你不想惹麻煩\n就不要犯罪。 + - 犯罪不付錢。 + farewell: + - 到後來。 +primis_ice_village_leader: + name: '&4Glacies Princeps' + role: '&c<村長>' + greetings: + - 感覺要結束了。 + dialog: + - Darn Ice Elemental! + - 太多的問題... + - 我們現在應該\n如何完成試煉。 + farewell: + - 再見 +primis_ice_village_lighthouse_keeper: + name: '&3Severinus Martius' + role: '&3' + greetings: + - Well met stranger. + dialog: + - Calm day today. + - Watch out for\nthe Ursus! + farewell: + - Take it easy. +primis_ice_village_missing_daughter: + name: '&3Cornelia Ennodius' + role: '&3<失踪的女兒>' + greetings: + - 幫幫忙... + dialog: + - 走開\n走開,走開! + - 他們不是\n真的…… + - 只是不要\n看他們Cornelia。 + farewell: + - 掰。 +primis_ice_village_prisoner: + name: '&3Adrius Calpornius' + role: '&3<囚犯>' + greetings: + - 我是無辜的! + dialog: + - 我不應該\n在這裡!!! + farewell: + - 帶我離開這裡 +primis_ice_village_pubkeeper: + name: '&3Grania Cecilius' + role: '&3' + greetings: + - Welcome! + dialog: + - Coming right up! + - Try our black ale! + - Need a drink? + farewell: + - One coming up! +primis_ice_village_tower_squatter: + name: '&3Modestus Eulogius' + role: '&3<村民>' + greetings: + - 噪音! + dialog: + - 這麼多尖叫! + - 只是想\n享受寧靜。 + farewell: + - 掰。 +primis_ice_village_violet: + name: '&5Domina Violet' + role: '&d<盾女>' + greetings: + - 我有問過\n你的意見嗎? + dialog: + - 拿出來的感覺\n真好。 + - 他們會在我收錢的時候\n付錢。 + farewell: + - 不,我就是這麼想的。 +primis_ice_village_worried_father: + name: '&3Sparax Ennodius' + role: '&3<擔心的父親>' + greetings: + - 我希望她沒事... + dialog: + - 請讓我們的\n女孩安全。 + farewell: + - 掰。 +primis_ice_village_worried_mother: + name: '&3Sestia Ennodius' + role: '&3<擔心的母親>' + greetings: + - 她去哪兒了。 + dialog: + - 嗯,迷路了。 + farewell: + - 掰。 +primis_ice_village_worried_wife: + name: '&3Titia Calenus' + role: '&3<擔心的妻子>' + greetings: + - 你好! + dialog: + - 漂亮乾淨的床。 + - 我錯過了什麼? + - 另一個箱子分類。 + farewell: + - 掰掰! +primis_magmaguy: + name: '&4Magmaguy' + role: '&c首席開發人員(非遊戲玩家)' + dialog: + - 希望你喜歡地圖! + farewell: + - 玩得開心! +primis_mountain_guide: + name: '&4彼特' + role: '&c<登山嚮導>' + greetings: + - 歡迎來到我們村! + dialog: + - |- + 不要問這個村莊能為你做什麼,要問你能為這個村莊做什麼! + - 歡迎,外鄉人 + - 要點什麼? + - |- + 你不是本地人,對嗎? + farewell: + - 走吧! + - 歡迎再度蒞臨! +primis_mountain_guide_2: + name: '&4彼特' + role: '&c<登山嚮導>' + greetings: + - 歡迎來到我們村! + dialog: + - |- + 不要問這個村莊能為你做什麼,要問你能為這個村莊做什麼! + - 歡迎,外鄉人 + - 要點什麼? + - |- + 你不是本地人,對嗎? + farewell: + - 走吧! + - 歡迎再度蒞臨! +primis_nemus_leader: + name: '&3尼米安國王' + role: '&c<鎮長>' + dialog: + - 是什麼把你帶到山下? + - 您來自哪裡? + - |- + 你嚐過我們美味的發光漿果嗎? + farewell: + - 會有機會的 +primis_ogre_mines_escaped_miner: + name: '&c福吉特福索斯' + role: '&c<逃跑的礦工>' + greetings: + - 我不敢相信我成功了! + - 他們無處不在! + - 你能幫忙嗎? + dialog: + - 我有一個任務給你! + - 我需要你的幫助! + farewell: + - 走吧! + - 路上小心點! + - 保持安全! +primis_ogre_mines_lone_miner: + name: '&c富通·佛索瑞斯' + role: '&c<孤獨的礦工>' + greetings: + - 最後,給你一些建議! + - 不要讓他們看到你! + - 幫我! + dialog: + - 我有一個任務給你! + - 我需要你的幫助! + farewell: + - 走吧! + - 回來為我挖礦! + - 保持安全! +primis_ogre_mines_old_miner: + name: '&c維特斯佛索雷斯' + role: '&c<老礦工>' + greetings: + - 嘿,先生! + - 你看起來有點迷茫! + - 是什麼把你帶到這裡來的? + dialog: + - 我有一個任務給你! + - 我需要你的幫助! + farewell: + - 走吧! + - 不要被地雷蟎咬! + - 保持安全! +primis_ogre_mines_panicked_miner: + name: '&c梅圖斯' + role: '&c<驚慌失措的礦工>' + greetings: + - 礦井超支了! + dialog: + - 到處都是食人魔! + - 你能幫助我們嗎? + farewell: + - 小心! +primis_pontis_citizen_1: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見了! +primis_pontis_citizen_10: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見了! +primis_pontis_citizen_11: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見了! +primis_pontis_citizen_12: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見了! +primis_pontis_citizen_13: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見了! +primis_pontis_citizen_14: + name: '&7帕洛提爾德·米菲' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見了! +primis_pontis_citizen_15: + name: '&7普羅米菲斯·魯修爾' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見了! +primis_pontis_citizen_16: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見了! +primis_pontis_citizen_17: + name: '&7米拉朵·阿爾德' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見了! +primis_pontis_citizen_18: + name: '&7斯瓦德·克拉特' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見了! +primis_pontis_citizen_19: + name: '&7盧修斯·葛利特' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_2: + name: '&7謬特‧薩司' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_20: + name: '&7彼特·拉摩爾' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_21: + name: '&7米陶德·科瓦' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_22: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_23: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_24: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_25: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_26: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_27: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_28: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_29: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_3: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_30: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_31: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_32: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_33: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_34: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_35: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_36: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_37: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_38: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_39: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - ' 今天是個好日子.' + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_4: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - ' 今天是個好日子.' + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_40: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - ' 今天是個好日子.' + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_5: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - ' 今天是個好日子.' + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_6: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - ' 今天是個好日子.' + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_7: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - ' 今天是個好日子.' + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_8: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - ' 今天是個好日子.' + farewell: + - 回頭見! + - 再見! +primis_pontis_citizen_9: + name: '&7finsertnamehere' + role: '&8Pontis 居民' + dialog: + - 你去過天文台嗎? + - 你是從哪裡來的? + - 你看起來不像是這裡的人... + - 今天是個好日子。 + farewell: + - 回頭見! + - 再見! +primis_pontis_dockworker_1: + name: '&3Pontis 船工' + role: '&8碼頭工人' + dialog: + - 大量物資需要搬運! + - 小心! + - 直搗黃龍! + farewell: + - 晚點見! +primis_pontis_dockworker_10: + name: '&3Pontis 船工' + role: '&8碼頭工人' + dialog: + - 大量物資需要搬運! + - 小心! + - 直搗黃龍! + farewell: + - 晚點見! +primis_pontis_dockworker_2: + name: '&3Pontis 船工' + role: '&8碼頭工人' + dialog: + - 大量物資需要搬運! + - 小心! + - 直搗黃龍! + farewell: + - 晚點見! +primis_pontis_dockworker_3: + name: '&3Pontis 船工' + role: '&8碼頭工人' + dialog: + - 大量物資需要搬運! + - 小心! + - 直搗黃龍! + farewell: + - 晚點見! +primis_pontis_dockworker_4: + name: '&3Pontis 船工' + role: '&8碼頭工人' + dialog: + - 大量物資需要搬運! + - 小心! + - 直搗黃龍! + farewell: + - 晚點見! +primis_pontis_dockworker_5: + name: '&3Pontis 船工' + role: '&8碼頭工人' + dialog: + - 大量物資需要搬運! + - 小心! + - 直搗黃龍! + farewell: + - 晚點見! +primis_pontis_dockworker_6: + name: '&3Pontis 船工' + role: '&8碼頭工人' + dialog: + - 大量物資需要搬運! + - 小心! + - 直搗黃龍! + farewell: + - 晚點見! +primis_pontis_dockworker_7: + name: '&3Pontis 船工' + role: '&8碼頭工人' + dialog: + - 大量物資需要搬運! + - 小心! + - 直搗黃龍! + farewell: + - 晚點見! +primis_pontis_dockworker_8: + name: '&3Pontis 船工' + role: '&8碼頭工人' + dialog: + - 大量物資需要搬運! + - 小心! + - 直搗黃龍! + farewell: + - 晚點見! +primis_pontis_dockworker_9: + name: '&3Pontis 船工' + role: '&8碼頭工人' + dialog: + - 大量物資需要搬運! + - 小心! + - 直搗黃龍! + farewell: + - 晚點見! +primis_pontis_enhancer: + name: '&7美利歐勒' + role: '&8<強化師>' + greetings: + - 需要升級? + - 有廢料? + - 讓我們升級吧! + dialog: + - 我會升級廢料! + - 給我帶來廢料! + - 升級你的廢料裝備! +primis_pontis_gardener_1: + name: '&einsertnamehere' + role: '&8園丁' + dialog: + - 這裡的花很漂亮對吧? + - 看,我的傑作! + - 鮮花盛開。 + farewell: + - 請不要踩踏美麗的花朵。 + - 隨時保持警惕! +primis_pontis_gardener_2: + name: '&einsertnamehere' + role: '&8園丁' + dialog: + - 這裡的花很漂亮對吧? + - 看,我的傑作! + - 鮮花盛開。 + farewell: + - 請不要踩踏美麗的花朵。 + - 隨時保持警惕! +primis_pontis_gardener_3: + name: '&einsertnamehere' + role: '&8園丁' + dialog: + - 這裡的花很漂亮對吧? + - 看,我的傑作! + - 鮮花盛開。 + farewell: + - 請不要踩踏美麗的花朵。 + - 隨時保持警惕! +primis_pontis_gardener_4: + name: '&einsertnamehere' + role: '&8園丁' + dialog: + - 這裡的花很漂亮對吧? + - 看,我的傑作! + - 鮮花盛開。 + farewell: + - Please, don't tread on the beautiful flowers. + - 隨時保持警惕! +primis_pontis_gardener_5: + name: '&einsertnamehere' + role: '&8園丁' + dialog: + - 這裡的花很漂亮對吧? + - 看,我的傑作! + - 鮮花盛開。 + farewell: + - 請不要踩踏美麗的花朵。 + - 隨時保持警惕! +primis_pontis_gardener_6: + name: '&einsertnamehere' + role: '&8園丁' + dialog: + - 這裡的花很漂亮對吧? + - 看,我的傑作! + - 鮮花盛開。 + farewell: + - 請不要踩踏美麗的花朵。 + - 隨時保持警惕! +primis_pontis_gardener_7: + name: '&einsertnamehere' + role: '&8園丁' + dialog: + - 這裡的花很漂亮對吧? + - 看,我的傑作! + - 鮮花盛開。 + farewell: + - 請不要踩踏美麗的花朵。 + - 隨時保持警惕! +primis_pontis_groves_catacombs_npc: + name: '&7Inaequaliter Hyaena' + role: '&7<可疑的人>' + greetings: + - 呸呸呸 + dialog: + - 聽說有大寶藏! + - 如果您進入,那麼美妙的東西等著您! + - 你應該冒險到這個地方... + - 為什麼不進去? + - 你應該進去... + - 不用擔心,它是完全安全的。 + - 沒有危險。我發誓! + - 看看裡面。 + - 你應該看看\n這個地方! + - 哈哈哈哈哈... + - 如果裡面有人\n需要幫助怎麼辦。 + - 進去,進去! + - 你不好奇嗎? + - 當然,\n你應該看看。 + farewell: + - 嘻嘻嘻,以後再見! +primis_pontis_groves_generic_npc_1: + name: '&2Sycophanta Mucius' + role: '&2' + greetings: + - 我很好! + dialog: + - 不用擔心我。 + - 哥哥會來救我的。 + - 他們不會吃我的。 + - 我向你保證我會沒事的。 + farewell: + - 稍後再見面! +primis_pontis_groves_generic_npc_10: + name: '&2Hostilia Metunus' + role: '&2<格羅夫斯居民>' + greetings: + - 你好~ + dialog: + - 你也無聊嗎? + - 嗯,一定有事可做。 + - 也許我應該多煮些飲料。 + farewell: + - 再見! +primis_pontis_groves_generic_npc_11: + name: '&2Tortilia Getha' + role: '&2<格羅夫斯居民>' + greetings: + - 你好呀! + dialog: + - 我丈夫做的蛋糕最好吃。 + - 想要一片 + - 如此美味! + farewell: + - 再見! +primis_pontis_groves_generic_npc_12: + name: '&2Consentia Apellinus' + role: '&2' + greetings: + - 哦你好。 + dialog: + - 在那裡,和新的一樣! + - 必須確保光線使它們遠離。 + - 另一個燈籠固定 + farewell: + - 不要讓蜘蛛咬人! +primis_pontis_groves_generic_npc_13: + name: '&2新娘塞內修斯' + role: '&2<格羅夫斯居民>' + greetings: + - 你好! + dialog: + - 哦,沒想到在這裡見到人。 + - 只是得快點,他們抓不到你。 + - 蜘蛛不會阻止我。 + - 這是我最喜歡的休息點。 + farewell: + - 注意安全。 +primis_pontis_groves_generic_npc_14: + name: '&2馬克西姆斯·普里斯庫斯' + role: '&2<偷偷摸摸的滲透者>' + greetings: + - 噓.... + dialog: + - 以為你可以從我這裡偷走精靈…… + - 當他們睡覺時,我就會拿回我的財產。 + - 到處走走就到了這裡。 + - 他們從未見過我來。 + farewell: + - 保持安靜 +primis_pontis_groves_generic_npc_15: + name: '&2Herennia Exsupereus' + role: '&2<格羅夫斯居民>' + greetings: + - 嘿 + dialog: + - 剛醒來 + - 這將是美好的一天,我能感覺到。 + farewell: + - 掰掰! +primis_pontis_groves_generic_npc_16: + name: '&2Atria Maursus' + role: '&2<格羅夫斯居民>' + greetings: + - 你好! + dialog: + - 不知道國王希望我怎麼做…… + - 這麼多工作 + - 忙,忙,忙。 + - 這份文書工作不會自行完成。 + farewell: + - 再見。 +primis_pontis_groves_generic_npc_17: + name: '&2費利修斯·埃蘇珀斯' + role: '&2<格羅夫斯居民>' + greetings: + - 你好! + dialog: + - 如果您需要任何東西,請與國王交談。 + - 對不起我很忙。 + - 沒時間閒聊,我很抱歉。 + farewell: + - 再見 +primis_pontis_groves_generic_npc_2: + name: '&2塞萊德魯斯·弗雷迪修斯' + role: '&2<格羅夫斯漁夫>' + greetings: + - 你好 + dialog: + - 我實際上是在釣魚。 + - 大水蟲從樹上掉下來。 + - 我用樹液做誘餌。 + - 水蟲無法抗拒誘餌! + - 它們實際上是兩棲的。 + - 在他們走向樹林之前必須抓住他們。 + - 如果你烤它們,它們會很好吃。 + - 希望能有個好收穫! + farewell: + - 掰掰~ +primis_pontis_groves_generic_npc_3: + name: '&2費利修斯·蘇里烏斯' + role: '&2<格羅夫斯居民>' + greetings: + - 你好呀~ + dialog: + - 海洋是如此美麗。 + - 我可以在這裡站上幾天。 + - 蜘蛛肯定很煩人。 + farewell: + - 掰。 +primis_pontis_groves_generic_npc_4: + name: '&2Periplectomenus Burcanius' + role: '&2<格羅夫斯農夫>' + greetings: + - 歡迎! + dialog: + - 剩下大量的發光漿果。 + - 希望你喜歡我的小農場。 + - 有這麼多的葡萄酒要參加。 + farewell: + - 回頭見! +primis_pontis_groves_generic_npc_5: + name: '&2Stephanus Magnus' + role: '&2<格羅夫斯居民>' + greetings: + - 嘿! + dialog: + - 你去過漿果農場嗎? + - 散步的好時光。 + - 不能一直在裡面。 + farewell: + - 祝你有個好的一天。 +primis_pontis_groves_generic_npc_6: + name: '&2Abundantius Rogatus' + role: '&2<格羅夫斯居民>' + greetings: + - 太奇怪了 + dialog: + - 什麼事,居然讓你進入這裡? + - 隨意停留一段時間。 + farewell: + - 掰! +primis_pontis_groves_generic_npc_7: + name: '&2阿爾巴努斯·伊夫馬魯斯' + role: '&2<格羅夫斯居民>' + greetings: + - 現在不容易 + dialog: + - 什麼?是的,我過得很好。 + - 我沒有太多,不。 + - 還有一個 + - 再來一品脫 + farewell: + - 掰掰。 +primis_pontis_groves_generic_npc_8: + name: '&2Bacchis Aventinus' + role: '&2<格羅夫斯居民>' + greetings: + - 早安!晚安... + dialog: + - 我現在很舒服。 + - 我們過去經常外出。 + - 這幾天外面的危險太多了。 + farewell: + - 祝福你。 +primis_pontis_groves_generic_npc_9: + name: '&2Pasicompsa Getha' + role: '&2<格羅夫斯居民>' + greetings: + - 進來,進來! + dialog: + - 歡迎來到樹林中最好的洞! + - 這個洞是我親手建的! + - 希望您住得愉快! + farewell: + - 快快回來! +primis_pontis_groves_hole_luxuria: + name: '&cLuxuria Gorgonius' + role: '&c<洞居民>' + greetings: + - 你好呀~ + - 你好! + dialog: + - 生活就是要放輕鬆, + - 別給自己太多壓力。 + farewell: + - 歡迎再次訪問我們! +primis_pontis_groves_hole_phygia: + name: '&cPhygia Gorgonius' + role: '&c<洞居民>' + greetings: + - 歡迎來到我家! + - 你好! + dialog: + - 我們必須採取行動! + - 我們的小樹林裡的精靈太多了。 + farewell: + - 歡迎再次訪問我們 +primis_pontis_groves_lighthouse_generic_npc_1: + name: '&3厄琉西斯' + role: '&3<燈塔保管人>' + greetings: + - 什麼風把你吹來? + dialog: + - 必須確保燈塔正常工作。 + - 很高興看到有人來訪問。 + farewell: + - 再見 +primis_pontis_groves_lighthouse_generic_npc_2: + name: '&3Caelia Zoilus' + role: '&3<燈塔保管人>' + greetings: + - 嘿 + dialog: + - 我希望他會沒事的。 + - 輪到我看守了。 + - 有一次我們幾乎沒有食物。 + farewell: + - 掰。 +primis_pontis_groves_lighthouse_sick_man: + name: '&3Alanus Secundas' + role: '&c<病夫>' + dialog: + - 我很餓。 + - 有什麼食物? + - 嗯,我感覺好多了。 + - 我們需要更多的食物。 + farewell: + - 告別 +primis_pontis_groves_parkour_npc_1: + name: '&3Posuere Hominem' + role: '&c<無聊的公民>' + dialog: + - 迎接挑戰? + - 你認為你得到了它需要什麼? + - 想去盪鞦韆 + - 你是個瘋子? + - 別作弊 + farewell: + - 回頭見! +primis_pontis_groves_parkour_npc_2: + name: '&cIdoneitatem Hominem' + role: '&3<無聊的公民>' + dialog: + - 這令人印象深刻 + - 嘗試打破我的 1m 47s 記錄。 + - 別作弊! + farewell: + - 回頭見! +primis_pontis_guard: + name: '&cPontis 衛隊' + role: '&8<衛隊隊員>' + greetings: + - 想要升級裝備? + dialog: + - 迷路了?按照橋的顏色走就行了。 + - 每條橋都有一種顏色! + - 別惹麻煩! + - 不要造成任何麻煩! + - Pontis就像一座迷宮,用於抵禦敵人。 + - 橋會顯示出那條小路的顏色! +primis_pontis_guard_1: + name: '&cPontis 衛隊' + role: '&8<衛隊隊員>' + greetings: + - 想要升級裝備? + dialog: + - 迷路了?按照橋的顏色走就行了。 + - 每條橋路至少有一種顏色! + - 別惹麻煩! + - 不要造成任何麻煩! + - Pontis就像一座迷宮,用於抵禦敵人。 + - 橋會顯示出那條小路的顏色! +primis_pontis_guard_2: + name: '&cPontis 衛隊' + role: '&8<衛隊隊員>' + greetings: + - 哈囉! + dialog: + - 將軍官邸,請往這邊走! +primis_pontis_guard_rat: + name: '&cPontis 精英衛隊' + role: '&8<精英衛隊隊員>' + greetings: + - 該死的老鼠! + dialog: + - 骯髒的老鼠!!! + - Hold still,\ndarn you! + - Stop dodging\nmy attacks! + - 差一點就抓到了! + - 去死吧! + - 為什麼不死!!! + - You can't dodge\nforever! + - 看我的! + - 你死定了! + - How dare you\ndodge! + - 好險! +primis_pontis_guard_rat_at_wormhole: + name: '&cPontis 精英衛隊' + role: '&8<精英衛隊隊員>' + greetings: + - 為什麼要花\n這麼長時間。 + dialog: + - 我們已\n控制住了一切。 + - 別擔心\n精英衛隊\n在此! +primis_pontis_guard_shogun_1: + name: '&4皇家衛隊' + role: '&8<衛隊隊員>' + dialog: + - 不要惹麻煩。 + - 別管我,別惹麻煩。 + - 這裡沒有有趣的事情。 + - 我盯上了你,冒險家。 + - 沒有問題,就沒有人受傷! + - 沒時間胡鬧。 + farewell: + - 注意安全,冒險家。 +primis_pontis_guard_shogun_1_cat_quest: + name: '&4皇家衛隊' + role: '&8<衛隊隊員>' + dialog: + - 不要惹麻煩。 + - 別管我,別惹麻煩。 + - 這裡沒有有趣的事情。 + - 我盯上了你,冒險家。 + - 沒有問題,就沒有人受傷! + - 沒時間胡鬧。 + farewell: + - 注意安全,冒險家。 +primis_pontis_mille_arena_master_observatory: + name: Stella Hominis + role: <觀星者> + greetings: + - 你好! + dialog: + - 我有個夢想, + - 如果你想聽... + - 我希望能看到很多星星, + - 這樣的天體和宇宙, + - 在呼喚著我。 + - 宇宙間有無限的可能 + - 和許多古老的知識 + farewell: + - 願星星保佑你。 +primis_pontis_mille_concerned_shipmate: + name: '&3Delphium Calpurnius' + role: '&8' + dialog: + - Sigh. + - So much for my\nshipments... + farewell: + - Safe travels! +primis_pontis_mille_fields_camp_generic_npc_1: + name: '&cScribonia Ingenvinus' + role: '&c<獵人>' + dialog: + - 最危險的武器\n就是\n專注力。 + - 我只需要\n三個箭頭。 + farewell: + - 希望以後能再見到你。 +primis_pontis_mille_fields_camp_generic_npc_2: + name: '&cValador Lumus' + role: '&c<獵人>' + dialog: + - 我在\n很多地方打獵。 + - 你也經常\n旅行嗎? + farewell: + - 願你的刀鋒迅速。 +primis_pontis_mille_fields_camp_generic_npc_3: + name: '&cPhygia Ahala' + role: '&c<獵人>' + dialog: + - 沒有什麼比得上\n一次好的狩獵了! + farewell: + - 注意安全。 +primis_pontis_mille_fields_camp_generic_npc_4: + name: '&cAdrius Paterculus' + role: '&c<獵人>' + dialog: + - 狩獵召喚! + farewell: + - 迅速死亡。 +primis_pontis_mille_fields_camp_generic_npc_5: + name: '&cCappadox Galerus' + role: '&c<獵人>' + dialog: + - 加入我們吧,陌生人! + farewell: + - 回頭見。 +primis_pontis_mille_fields_camp_generic_npc_6: + name: '&cSulpicio Rutilius' + role: '&c<獵人>' + dialog: + - 希望我們的營地\n能讓您在野外\n得到喘息的機會。 + farewell: + - 掰! +primis_pontis_mille_fields_camp_generic_npc_7: + name: '&cAquarius Manus' + role: '&c<獵人>' + dialog: + - 別介意\n我只是打水。 + - 今天清澈湛藍的海水。 + farewell: + - 掰。 +primis_pontis_mille_fields_camp_magmus: + name: '&cMagmus Hypnos' + role: '&4<疲憊的獵人>' + dialog: + - Volumnia在哪裡... + - 我希望她\n不會再有麻煩了。 + - 我需要好好休息。 + - 如果一天中\n有更多的時間。 + - 找到Volumnia後\n跟我說話。 + - 這麼多的工作,\n這麼少的時間。 + - 還有17個小時的一天。 + - 我太擔心了。 + farewell: + - 時間永遠不夠... +primis_pontis_mille_fields_farm_berry_npc: + name: '&9Dordalus Nasica' + role: '&e<農民>' + dialog: + - 漿果太好吃了! + - 你應該多吃漿果! + - 他們為什麼要\n偷我的漿果... + farewell: + - 以後再見。 +primis_pontis_mille_fields_farm_boy_npc: + name: '&9Planesium Victricius' + role: '&e<農民>' + dialog: + - 這麼多老鼠... + - 到這裡\n就差不多完成了。 + - 這東西最好拿著。 + - 再工作,\n我就要崩潰了。 + - 這裡的景色\n真的很好。 + - 好的,回去工作! + farewell: + - 嚐嚐我們的漿果! +primis_pontis_mille_fields_farm_npc: + name: '&9Milonia Majus' + role: '&e<農民>' + dialog: + - 滾開,該死的老鼠! + - 別吃我的東西了! + - 唉... + farewell: + - 回頭見。 +primis_pontis_mille_fields_farm_well_npc: + name: '&eVolumnia Zoilus' + role: '&c<冒險家>' + dialog: + - 小心它的口水! + - 它的唾液有毒。 + - 請幫助我! + - 我希望沒有人\n聽到這件事... + - 我很高興見到你! + farewell: + - 我怎麼能讓這種事發生。 +primis_pontis_mille_fields_windmill_npc_1: + name: '&eDinia Niraemius' + role: '&d<磨坊主>' + dialog: + - 加工大量小麥中! + - 沒有麵粉就沒有麵包。 + - 你也喜歡麵包嗎? + farewell: + - 掰掰。 +primis_pontis_mille_fields_windmill_npc_2: + name: '&eDaemones Maritialis' + role: '&d<磨坊主>' + dialog: + - 這裡真好! + - 你喜歡我的風車嗎? + - 剛出來休息。 + farewell: + - 掰掰。 +primis_pontis_mille_fields_windmill_npc_3: + name: '&eAdulescens Lupis' + role: '&d<磨坊主>' + dialog: + - 希望有個好風! + - 需要一些麵粉? + - 這是最好的風車! + farewell: + - 祝福你。 +primis_pontis_mille_general_bromia: + name: '&6布羅米亞將軍' + role: '&6一般的' + greetings: + - 你好! + dialog: + - 是時候開戰了! + farewell: + - 再見! +primis_pontis_mille_general_cylindrus: + name: '&eCylindrus Celatus' + role: '&e一般的' + greetings: + - 你好! + dialog: + - 時間不夠! + farewell: + - 再見! +primis_pontis_mille_general_godefridus: + name: '&cGodefridus Novation' + role: '&c<一般的>' + greetings: + - 你好! + - 你好! + dialog: + - 有人需要\n放下這些文件。 + - 那麼多蠟燭... + farewell: + - 再見。 +primis_pontis_mille_general_rogerius: + name: '&eRogerius Olennius' + role: '&e一般的' + greetings: + - 你好! + dialog: + - 需要做的事情還很多! + - 希望這4個沒事 + farewell: + - 再見! +primis_pontis_mille_lighthouse_man: + name: '&3黑吉奧斯·萊姆斯' + role: '&c<燈塔守護者>' + dialog: + - 這裡太美了。 + - 最佳視野.... + farewell: + - 再見。 + - 掰掰! +primis_pontis_mille_major: + name: '&cFortes Bellator' + role: '&c大將軍' + greetings: + - 你好旅行者! + - 你好! + dialog: + - 那些該死的哥布林 + farewell: + - 告別 +primis_pontis_mille_mew_meowzer: + name: '&aMew Meowzer' + role: '&d<貓科動物>' + dialog: + - 喵! + - 喵… + - 喵傲烏.... + - 喵。 + - 喵? + farewell: + - 喵啊! +primis_pontis_mille_observatory_arena_turn_in: + name: Virgo Dexippus + role: <觀星者> + greetings: + - 你好 + dialog: + - 斯特拉知道很多。 + - 星星有很多話要說。 + - 發光說明了一切。 + farewell: + - 願月光照亮你的路。 +primis_pontis_mille_royal_guard_centurion: + name: '&4皇家衛隊百夫長' + role: '&8<衛隊隊員>' + dialog: + - 不要在那邊發呆! + - 設置營地! + - 我們的援軍在哪裡? + - 倒了多少? + - 我們需要重新集合! + farewell: + - 輕裝上陣,隨身攜帶大劍。 +primis_pontis_mille_scout_1: + name: '&c酸性熊' + role: '&c受傷的偵察兵' + greetings: + - 你好! + dialog: + - 我快撐不住了... + farewell: + - 再見! +primis_pontis_mille_scout_2: + name: '&c斯帕克斯助手' + role: '&c受傷的偵察兵' + greetings: + - 你好! + dialog: + - 疼痛.... + farewell: + - 再見! +primis_pontis_mille_scout_leader: + name: '&cBlepharo Octavius' + role: '&c童軍領袖' + greetings: + - 你好! + dialog: + - 太多了…… + farewell: + - 再見! +primis_pontis_mille_shogun: + name: '&6納維達' + role: '&c' + greetings: + - Yes? + dialog: + - 我可以幫您什麼嗎? + farewell: + - 輕輕地走,帶著一把大槍。 +primis_pontis_mille_slums_generic_npc_1: + name: '&7Gallicles Rex' + role: '&7<貧民窟居民>' + dialog: + - 它並不多,\n但它是我們鎮上的一小部分 + farewell: + - 回頭見。 +primis_pontis_mille_slums_generic_npc_2: + name: '&7Gallicles Caelistis' + role: '&7<貧民窟居民>' + dialog: + - 日復一日... + farewell: + - '...' +primis_pontis_mille_slums_generic_npc_3: + name: '&7Nicodemus Frontinus' + role: '&7<貧民窟居民>' + dialog: + - 為家庭提供\n乾淨的水。 + farewell: + - 井很好地\n為我們服務 +primis_pontis_mille_slums_generic_npc_4: + name: '&7Cocus Lucio' + role: '&7<貧民窟居民>' + dialog: + - 希望你\n今天過得愉快。 + farewell: + - 入住愉快。 +primis_pontis_mille_slums_generic_npc_5: + name: '&7Cornelia Florius' + role: '&7<貧民窟居民>' + dialog: + - 我應該\n買哪一個... + farewell: + - 這麼多\n漂亮的花。 +primis_pontis_mille_slums_generic_npc_6: + name: '&7Rutilia Placidus' + role: '&7<貧民窟居民>' + dialog: + - 我喜歡這裡。 + - 乾草的氣味\n使我快樂。 + - 我喜歡辛苦一天後\n在這放鬆。 + farewell: + - 以後再見! +primis_pontis_mille_slums_npc_1: + name: '&7Lena Lucan' + role: '&7<貧民窟居民>' + dialog: + - 就一個麵包... + farewell: + - 想知道明天會帶來什麼。 +primis_pontis_mille_slums_npc_2: + name: '&7Tranio Florens' + role: '&7<貧民窟居民>' + dialog: + - 今天其實\n還行。 + farewell: + - Night save ya. +primis_pontis_mille_slums_npc_3: + name: '&7Rufia Tertulus' + role: '&7<貧民窟居民>' + dialog: + - 至少\n對孩子\n有好處。 + - 市面上\n沒多少... + - 我\n負擔不起。 + farewell: + - 回頭見。 +primis_pontis_mille_slums_npc_4: + name: '&7Fabia Praetextus' + role: '&7<貧民窟居民>' + dialog: + - 閉上眼睛\n一秒鐘。 + - 必須想像\n我在一個更好的地方。 + farewell: + - 再見。 +primis_pontis_mille_slums_npc_5: + name: '&7Augustina Verrucosis' + role: '&7<貧民窟居民>' + dialog: + - 這麼多嘴\n要餵。 + - 也許\n可給小孩子\n一些水果。 + farewell: + - 掰。 +primis_pontis_mines_guard_1: + name: '&cPontis 衛隊' + role: '&c<重傷的衛隊隊員>' + greetings: + - 救命! + dialog: + - 請殺了他們, + - 我很害怕。 +primis_pontis_mines_guard_2: + name: '&cPontis 衛隊' + role: '&c<輕傷的衛隊隊員>' + greetings: + - 有人嗎?! + dialog: + - 我不想死! + - 無法再堅持下去了。 +primis_pontis_mines_guard_3: + name: '&cPontis 衛隊' + role: '&c<受傷的衛隊隊員>' + greetings: + - 救救我! + dialog: + - 他們走了嗎? + - 讓我出去! +primis_pontis_outpost_officer: + name: '&4NAME ME' + role: '&8' + dialog: + - I am unfinished! + - There is supposed\nto be an outpost\nhere. + farewell: + - Bye! +primis_pontis_redwoods_injured_lumberjack: + name: '&6Lyco Lupicinus' + role: '&6<受傷的伐木工>' + greetings: + - 這裡! + dialog: + - 該死的鋸 + - 又來找我了 + farewell: + - 回頭見 +primis_pontis_redwoods_lumberjack: + name: '&6Ligna Crispian' + role: '&6<伐木工>' + greetings: + - 問候! + dialog: + - 我喜歡一棵健康的樹的樣子。 + - 棕色的樹真的很香。 + - |- + 很確定我看到一隻兩條腿的狼晚上在這裡爬行。 + farewell: + - 直到下一次. +primis_pontis_redwoods_lumberjack_generic_1: + name: '&6Mulier Proculus' + role: '&6<伐木工>' + greetings: + - 嘿我! + dialog: + - 我希望他們能放過我們。 + - 完美的一天記錄。 + farewell: + - 後來的松果 +primis_pontis_redwoods_lumberjack_generic_10: + name: '&6Piscatores Trenico' + role: '&6<伐木工>' + greetings: + - 好巧,遇見你 + dialog: + - 走開狼 + - 別管我了,該死的毛球! + - 哈!試著在這裡聯系我! + farewell: + - 再見! +primis_pontis_redwoods_lumberjack_generic_2: + name: '&6阿蘭努斯·赫米娜' + role: '&6<伐木工>' + greetings: + - 你好... + dialog: + - 聲音不大,小聲點。 + - 我要休息一下。 + - 不要告訴他們我在這裡. + - 記錄是一項艱鉅的工作... + farewell: + - 之後再見 +primis_pontis_redwoods_lumberjack_generic_3: + name: '&6Lena Triarius' + role: '&6<伐木工>' + greetings: + - 這是怎麼回事! + dialog: + - 只是站在這裡嗡嗡作響! + - 操作鋸子很有趣。 + - 一定要確保你不會受傷。 + farewell: + - 希望以後能再見到你。 +primis_pontis_redwoods_lumberjack_generic_4: + name: '&6Aquila Isatis' + role: '&6<伐木工>' + greetings: + - 怎麼樣了! + dialog: + - 該死的日誌 + - 不,不是那樣的! + - 更好地漂浮 + - 是的,那會做到的。 + farewell: + - 再見! +primis_pontis_redwoods_lumberjack_generic_5: + name: '&6蘇爾皮修斯·西多紐斯' + role: '&6<伐木工>' + greetings: + - 你好! + dialog: + - 沒有什麼比得上漂亮的火了! + - 努力工作之後來放鬆一下。 + - 歡迎加入我們 + farewell: + - 再見朋友! +primis_pontis_redwoods_lumberjack_generic_6: + name: '&6克萊門特的球果' + role: '&6<伐木工>' + greetings: + - 嗨~ + dialog: + - 像海狸一樣劈砍! + - 西部最快的斧頭。 + - 沒有一棵樹是我的對手! + farewell: + - 歡迎再來 +primis_pontis_redwoods_lumberjack_generic_7: + name: '&6Candidus Nigellus' + role: '&6<伐木工>' + greetings: + - 你好! + dialog: + - 最快的斧頭……我的天! + - 不要把他的胡言亂語當回事。 + - 大人物先生肯定有很多話要說。 + farewell: + - 掰掰! +primis_pontis_redwoods_lumberjack_generic_8: + name: '&6克萊門特的球果' + role: '&6<伐木工>' + greetings: + - 我有點忙! + dialog: + - 我們需要增加產量... + - 如果我們提高成本... + - 需要訂購更多軸。 + farewell: + - 呃... +primis_pontis_redwoods_lumberjack_generic_9: + name: '&6馬蒂努斯·勒龐圖斯' + role: '&6<伐木工>' + greetings: + - 哇,你好! + dialog: + - 你要降大了! + - 我給你看! + - 我的斧頭,你的樹皮,它們應該相遇。 + - 從一個好的印章開始。 + farewell: + - 嚇死我了 +primis_pontis_redwoods_lumberlord: + name: '&6Magnus Castorea' + role: '&6<伐木領主>' + greetings: + - HELLO! + dialog: + - 沒有什麼比得上健康的木材了。 + - |- + 對於我們砍伐的每一棵樹, + 我們種了一個新的! + - 大棕色原木。 + farewell: + - BYE! +primis_pontis_redwoods_reyn: + name: '&6Reynus Protectoris' + role: '&6<伐木工>' + greetings: + - 我正在開火! + - 你太無恥了! + dialog: + - 你喜歡日誌嗎? + - 我喜歡木材的味道! + farewell: + - 回頭見。 + - 再見! +primis_pontis_scrapper: + name: '&7菲拉米都' + role: '&8<廢料師>' + greetings: + - 有什麼要回收的嗎? + - 有垃圾? + - 需要回收嗎? + dialog: + - 我會嘗試回收你帶來的任何東西! + - 需要廢料? + - 想要廢料? +primis_pontis_smelter: + name: '&7奧比斯' + role: '&8<冶煉師>' + greetings: + - 想要升級裝備? + dialog: + - 需要升級寶珠? + - 我會為廢料製作升級球! + - 給我帶來廢料! +primis_sewer_donatello: + name: '&5多納泰羅' + role: '&d下水道衛士' + dialog: + - 發生什麼事? + - 你是怎麼在下面找到我們的? + - 小心碎紙機! + farewell: + - 待會見! +primis_sewer_leonardo: + name: '&1萊昂納多' + role: '&9下水道衛士' + dialog: + - 發生什麼事? + - 你是怎麼在下面找到我們的? + - 小心碎紙機! + farewell: + - 待會見! +primis_sewer_michelangelo: + name: '&6米開朗基羅' + role: '&e下水道衛士' + dialog: + - 發生什麼事? + - 你是怎麼在下面找到我們的? + - 小心碎紙機! + farewell: + - 待會見! +primis_sewer_raphael: + name: '&4拉斐爾' + role: '&c下水道衛士' + dialog: + - 發生什麼事? + - 你是怎麼在下面找到我們的? + - 小心碎紙機! + farewell: + - 待會見! +primis_spa_attendee_1: + name: '&fNatsumi' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_2: + name: '&5Hanako' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_3: + name: '&3Tamika' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_4: + name: '&9Zaphra' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_5: + name: '&4Chie' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_6: + name: '&fKatashi' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_7: + name: '&dAkihiko' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_8: + name: '&6Sheranee' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - Rawr... + - OwO + farewell: + - Have fun! +primis_spa_staff: + name: '&cAozora' + role: '&7' + dialog: + - Enjoy the hot spring! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_staff_2: + name: '&6Rei' + role: '&7' + dialog: + - Enjoy the hot spring! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_terravilla_annoyed_explorer: + name: '&6Dorippa Sarimarcus' + role: '&6' + greetings: + - How's it going. + dialog: + - Not again. + - Stuck once more. + farewell: + - Be seeing you. +primis_terravilla_explorer: + name: '&6Telestis Senna' + role: '&6' + greetings: + - How goes it. + dialog: + - Always so\nbusy. + - Need a bag? + farewell: + - Bye. +primis_terravilla_generic_npc_1: + name: '&6Stephanium Major' + role: '&6' + greetings: + - Welcome to Terravilla! + dialog: + - Watch out for the\nTwo Legged Terrors! + - Here to check out the ruins? + farewell: + - Bye. +primis_terravilla_generic_npc_10: + name: '&6Mallia Galvisius' + role: '&6' + greetings: + - Heyo! + dialog: + - I would rather be in\ndown in the ruins... + - Hog watching to\npass the time. + farewell: + - Laters. +primis_terravilla_generic_npc_11: + name: '&6Papiria Virginius' + role: '&6' + greetings: + - Ok then... + dialog: + - Hit him harder! + - Woah! Good one! + - Yeah! Mess him up! + farewell: + - Yep... +primis_terravilla_generic_npc_12: + name: '&6Umbria Maccalus' + role: '&6' + greetings: + - What! + dialog: + - Is a girl not\nallowed to be\non a rooftop. + - Just try and\nget me down! + farewell: + - Yeah, whatever... +primis_terravilla_generic_npc_2: + name: '&6Delphium Assanius' + role: '&6' + greetings: + - Leave me alone! + dialog: + - What are you\nlooking at. + farewell: + - Scram! +primis_terravilla_generic_npc_3: + name: '&6Stephanium Vopiscus' + role: '&6' + greetings: + - Leave me alone! + dialog: + - What are you\nlooking at. + farewell: + - Scram! +primis_terravilla_generic_npc_4: + name: '&6Simo Clericus' + role: '&6' + greetings: + - Hey! + dialog: + - Heard the hog is on\nthe lift again. + farewell: + - Bye. +primis_terravilla_generic_npc_5: + name: '&6Harpax Colias' + role: '&6' + greetings: + - Ello. + dialog: + - The bo...I mean the\nOverseer is upstairs. + farewell: + - Laters. +primis_terravilla_generic_npc_6: + name: '&6Sulpicio Epolonius' + role: '&6' + greetings: + - Hi there. + dialog: + - I hope the ruins\nopen up again soon. + - I miss artifact\nhunting. + farewell: + - Goodbye. +primis_terravilla_generic_npc_7: + name: '&6Baebia Lucan' + role: '&6' + greetings: + - '...' + dialog: + - Cringe... + farewell: + - '...' +primis_terravilla_generic_npc_8: + name: '&6Novia Longinus' + role: '&6' + greetings: + - '...' + dialog: + - Are you always\nstaring at people? + - How about some\nprivacy? + farewell: + - '...' +primis_terravilla_generic_npc_9: + name: '&6Septimia Baro' + role: '&6' + greetings: + - Oh, hey. + dialog: + - If it opens up again\nthen I gotta go\nget more of these. + - What is this skull\nnfrom hmm... + farewell: + - '...' +primis_terravilla_overseer: + name: '&6Lutum Princeps' + role: '&6' + greetings: + - Yes? + dialog: + - What is it\nnow... + - I need to check\nup on them. + - At least I\nam not bored. + farewell: + - Good luck. +primis_terravilla_researcher: + name: '&6Plautia Suilius' + role: '&6' + greetings: + - Hmm... + dialog: + - Maybe if... + - That can't be right + - Not sure... + farewell: + - Later... +primis_traveler_1: + name: '&6Lysidamus Nolus' + role: '&6<遊客>' + greetings: + - 你好,陌生人 + dialog: + - 很高興看到有人在路上。 + - 去村裡? + - 祝您旅途愉快。 + farewell: + - 祝福你旅途平安。 +primis_traveler_2: + name: '&6Citro Gala' + role: '&6<遊客>' + greetings: + - 你好 + dialog: + - 從村子回來的路上。 + - 來自 Pontis Mille 還是? + - 祝你好運 + farewell: + - 祝福你旅途平安。 +primis_traveler_3: + name: '&6溴藻' + role: '&6<遊客>' + greetings: + - 你好 + dialog: + - 你也要去村裡嗎? + - 我聽說村裡那裡很冷。 + - 快到了!我要繼續前進。 + farewell: + - 祝福你旅途平安。 +primis_traveler_4: + name: '&6德梅尼斯·諾魯斯' + role: '&6<遊客>' + greetings: + - 你好,陌生人 + dialog: + - 很高興看到有人在路上。 + - 去村裡? + - 祝您旅途愉快。 + farewell: + - 祝福你旅途平安。。 +primis_traveler_5: + name: '&6Callipho Classicius' + role: '&6<遊客>' + greetings: + - 你好! + dialog: + - 我需要更好的鞋子。 + - 很快\n我就會回家了。 + - 很高興再次\n看到這個城市! + farewell: + - 旅途平安! +primis_traveler_6: + name: '&6Rodenus Palis' + role: '&6<遊客>' + greetings: + - 嘿,你好! + dialog: + - 我正在從村子\n回來的路上。 + - 很高興再次來到\n Pontis Mille。 + - 難道我哥又迷路了…… + - 他在哪? + farewell: + - 回頭見! +primis_traveler_7: + name: '&6Gorenus Palis' + role: '&6<遊客>' + greetings: + - 嘿… + dialog: + - 我又迷路了嗎? + - 這不是Pontis Mille。 + - 我在哪 ? + - 呃,這似乎\n不是正確的\n方法...... + farewell: + - 掰。 +quest_giver: + name: 夸爾·蘇薩德 + role: <任務給予者> + greetings: + - 你好,冒險者!\n找任務? + - 嘿,那邊的你!我這有份任務! + - 想要來點冒險? + dialog: + - 完成公會任務\n來賺取些獎勵! + - 高等級的任務\n有更好的獎勵! + - 高等級的任務\n讓你獵殺更高等的怪物! + - 想要更困難挑戰?\n提升你的公會層級! + - 確保你有更好的裝備\n來完成這些任務! + farewell: + - 旅途平安, 朋友. + - 狩獵愉快! + - 生生不息,繁榮昌盛! + - 平安回來或是送回來. + - 活著回來! + - 用力量超越虛弱! + - 一路順風! +refiner_config: + name: 拉爾夫 + role: <精煉師> + greetings: + - 想升級你的廢料嗎? + - 有廢料? + - 徵求低等級廢料! + - 你好, 有廢料嗎? + - 我會回收你的廢料! + dialog: + - 需要升級你的廢料? + - 在此處升級您的廢料! + - 10塊 廢料 升級成更高等級! + - 讓你的廢料變得更有用! + - 有低等級廢料? + farewell: + - 如果你有更多低等廢料\n歡迎隨時回來 + - 別忘了讓廢料\n變得更有用! + - 去尋找更多廢料! +repairman_config: + name: 雷吉 + role: <修理師> + greetings: + - 可以修好你的物品! + - 使用廢料來修理! + - 廢料可以弄成更耐用的物品! + - 需要修理? + - 有損壞的物品? + dialog: + - 鎮裡最棒的修理師! + - 我能修好你要的! + - 需要修理? + - 我會修好你的物品! + - 精英物品想修理嗎? + farewell: + - 別忘記幫物品進行維護! + - 如果你需要,我會在這! + - 你需要我可以呼叫我,\n如果你真的需要我時! +santa: + name: '&4聖尼克' + role: '&c' + greetings: + - Ho ho ho! + dialog: + - 我丟了一些禮物,\n你能幫幫我嗎? + - 親愛的旅行者,我有\na 請求! + - 你能在老人需要的時候\n幫助他嗎? + farewell: + - Ho ho ho! +scrapper_config: + name: 凱利 + role: <廢料師> + greetings: + - 你要丟些不要的物品? + - 需要回收物品? + - 尋找廢料? + - 廢料時間! + - 廢料時刻! + dialog: + - 來交易些廢料! + - 來這取得些廢料! + - 75% 成功率! + - 不接受退款. + - 回收, 再利用, 減量! + farewell: + - 當你有更多廢料時\n歡迎再回來我這 + - 別忘了讓廢料\n變得更有用! + - 祝你搜括廢料愉快! +smelter: + name: 山姆 + role: <冶煉師> + greetings: + - 有廢料? + - 有更多廢料? + - 我聞到你身上有些廢料!? + - 拜託我需要廢料! + - 請我一些廢料! + dialog: + - 我會讓你的廢料變成有用的! + - 給我一些廢料\n我就會給你一些升級寶珠! + - 廢料很沒用, 把它們都給我! + farewell: + - 當你有更多廢料時\n歡迎再回來我這 + - 拿去用在升級上吧! +special_blacksmith: + name: 格羅格 + role: <特殊鐵匠> + greetings: + - 要點什麼? + - 想賣點什麼? + - 我們只有最好的 + - 有什麼值得賣的嗎? + - 我這只收購精英裝備. + dialog: + - 我這低買高賣. + - 拒絕退款. + - 很顯然的拒絕退款. + - 不接受退款. + - 沒有退貨這回事. + - 賣出不受理退款. + farewell: + - 當你想花錢\n歡迎再回來 + - 別早早就死了\n我指望你來買多一點裝備 + - 下次多買點貴的商品吧 + - 別忘了,沒有退款. +test_npc: + name: 測試NPC + role: Testing! + greetings: + - Test Greeting! + dialog: + - Test Dialog! + farewell: + - Test 再見! +travelling_merchant: + name: Jeeves + role: <旅行商人> + greetings: + - 想賣點東西嗎? + - 你叫我? + - 嗯? + dialog: + - 我可以便宜收購它! + - 想賣點東西嗎? + - 時間是金錢! + farewell: + - 隨時歡迎再次呼叫我! + - 這就是全部嗎? + - 旅途平安! + - 別讓自己被殺了! + - 狩獵愉快! +unbinder: + name: 奧弗利克 + role: <解綁者> + greetings: + - 你好. + - 幸會. + - 你好, 朋友. + - 確定? + - 需要我什麼幫忙? + dialog: + - 我能解除綁定你的物品\n但需要給我解绑捲軸. + - 我是唯一有能力\n幫你解除綁定. + - 有解綁捲軸? + farewell: + - "記住: 請明智地\n使用解綁捲軸." + - 旅途平安, 朋友. +wood_league_arena_master: + name: Gladius + role: <競技場大師> + greetings: + - 歡迎來到\n競技場! + dialog: + - 準備好面對競技場了嗎? + farewell: + - 帶著你的盾牌回來,或往上! +wood_league: + arenaName: 木製聯賽 + arenaMessages: + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - wave=8:message=&8[Gladius] &f不錯,但如果每個敵人都是&c近戰&f武器呢? + - wave=9:message=&8[Gladius] &f很好,很好,但如果他們都是&c遠程&f的話? + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - wave=44:message=&8[Gladius] &f這顯然行不通,讓我想想…… + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +ag_welcome_quest_0: + customObjectives: + Objective1: + dialog: + - '&8[&aCasus&8]&f Welcome to the Adventurer''s Guild Hub, the hub for all things EliteMobs!' + - You can always get back here using &2/ag&f! + - Talk to me again for a quest! + name: '&2到達冒險者大廳!' + questLore: + - + - + questAcceptDialog: + - '&8[Odigos]&f 請輸入 &2/ag &f 前往冒險者大廳!' + - 當你在到達時,請務必與 Casus 交談! +ag_welcome_quest_1: + customObjectives: + Objective3: + dialog: + - '&8[&aGreg&8]&f Want to buy or sell something? I''ve got a little of everything!' + Objective4: + dialog: + - '&8[&aCharles&8]&f Want to learn about fighting elites? Just talk to me!' + Objective1: + dialog: + - '&8[&aHermes&8]&f I take you back to where you were before! Just talk to me again!' + Objective2: + dialog: + - '&8[&aBartley&8]&f Need a stiff drink? My drinks pack an extra punch!' + Objective7: + dialog: + - '&8[&aQel''Thuzad&8]&f These Elite monsters, where do they keep coming from?' + - + - + - Just talk to me to get one! + Objective12: + dialog: + - '&8[&aGrog&8]&f Want to buy special items? I''ve got just the thing!' + Objective8: + dialog: + - '&8[&aRalph&8]&f Get more out of your scrap by upgrading it! Just talk to me at any time.' + Objective13: + dialog: + - '&8[&aUlfric&8]&f If you bring me a very special and rare item, I can unbind your Elite items.' + - + - + Objective5: + dialog: + - '&8[&aTim&8]&f Want to upgrade your Elite Items? Just get an upgrade orb from Sam over there!' + Objective10: + dialog: + - '&8[&aKelly&8]&f Got extra Elite items? Don''t know what to do with them? Give them to me, and I''ll turn them into scrap!' + - + - + Objective6: + dialog: + - '&8[&aGillian&8]&f Do you seek power? Do you desire to reach new heights? Talk to me to unlock new guild ranks, and reach levels of power you never thought to be possible!' + Objective11: + dialog: + - '&8[&aSam&8]&f Got extra scrap? I can refine that into Upgrade Orbs, which you can give to Tim to upgrade your Elite items with!' + Objective9: + dialog: + - '&8[&aReggie&8]&f Need your Elite items repaired? Just bring me some scrap, and I''ll make them as good as new!' + - + - + name: '&2歡迎來到冒險者大廳!' + questLore: + - '&a見見冒險者大廳的 NPC!' +primis_caeruleaum_a_can_of_worms: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis] &fPlease tell me you''re the one bringing the bait.' + name: '&2一罐蠕蟲' + questLore: + - 來,戴上魚餌,出發。 + - 快點! + questAcceptDialog: + - '&8[Callidus Piscatus]&f 我的朋友在碼頭附近的船上!' + - '&8&o我應該快點上船。' + questCompleteMessage: + - '&8[Piscis Nemesis]&f 你帶了誘餌?太棒了!' + - '&8[Piscis Nemesis]&f 誘餌應該把它引出來!' + - '&8&o我應該和復仇女神談談。' +primis_caeruleaum_fishing: + name: '&2魚餌' + questLore: + - 我有個大煩惱! + - + - + - + - + - 我會告訴你去哪裡找 &6魚餌 &0,拜託請你幫助我的朋友! + - 我會告訴你去哪裡得到&e魚餌&f,請去幫助我的朋友! + - 我保證我會支付酬勞給你! + questAcceptDialog: + - '&8[Callidus Piscatus]&f 時間至關重要!出村後向右有一堆 &6蚯蚓&f !' + - 拿 10 條去碼頭和我的朋友談談吧! + - '&8&o我應該去拿 10 條蚯蚓充當魚餌使用。' + questCompleteMessage: + - '&8[Piscis Nemesis]&f 你帶了魚餌?太棒了!' + - '&f 來的是時候,我們來釣看看是什麼生物!' + - '&8&o似乎他需要我的幫助...' +primis_caeruleaum_fishing_2: + name: '&2怪物魚餌' + questLore: + - 成功了!跳進傳送門,我會抓住船! + - 讓我們向這個怪物展示漁夫的憤怒! + questAcceptDialog: + - '&8[Piscis Nemesis]&f 上來,我來撐船!' + - 別忘了那個頭盔! + - '&8&o我應該進入,打敗海怪。' + questCompleteMessage: + - '&8[Piscis Nemesis]&f 哈哈!什麼情況!' + - '&f當然,一切都在我的掌控之中,但你確實幫了大忙!' + - '&f感謝你,這個物品送給你!' + - '&8&o怪物死了,岸邊安全了。' +primis_caeruleaum_fletching: + name: '&2遊俠' + questLore: + - 有時間來幫忙嗎? + - 最近,我不小心把自己的&6&e位移箭&f弄丟了! + - 到遺跡冒險通常是我的工作,但沒有位移箭對我來說太危險了。 + - 如果你能得到一些 &6位移箭&0 給我,我會教你如何使用它們! + - 如果你能給我弄到這些&e位移箭&f, + - 我會教你如何使用它們! + questAcceptDialog: + - '&8[Ventus Artifex]&f 請給我10根&e位移箭&f,可從村外的廢墟中獲得。' + - 亡靈骷髏和遠古亡靈身上都可獲得。 + - '&7&o我應該去村莊附近的&c廢墟&7&o殺死&c亡靈&7&o,獲取他們身上的&e位移箭&7&o。' + questCompleteMessage: + - '&8[Ventus Artifex]&f 做得好!' + - '&e位移箭&f可以向&c標靶&f發射,以便到達難以到達的地方。' + - 對於有抱負的古代遺跡挖掘者來說,它們是必不可少的。 + - 這是你的獎勵! + - 把新學到的知識實際使用看看如何? + - '&8&o似乎 Ventus Artifex 對我有挑戰。' +primis_caeruleaum_fletching_2: + name: '&2盾牌獵人' + questLore: + - 你拿到箭了嗎? + - 用那些弓箭來爬塔! + questAcceptDialog: + - '&8[Ventus Artifex]&f 用你剛剛收到的箭去廢墟和他們一起射擊!' + - + - + - + - + - '&8&o我應該前往&e廢墟&7&o內部獲得盾牌,對建築物內的鏢靶射出&e位移箭&7&o。' + questCompleteMessage: + - '&8[Ventus Artifex]&f 做得好!' + - 你是一個真正的廢墟挖掘者! + - 這是你的獎勵! + - '&7&o似乎位移箭將來會很有用。' +primis_caeruleaum_foraging: + name: '&2狼的巢穴' + questLore: + - 我聽說你想在這裡幫忙。 + - 最近附近有個狼窩,讓我不敢去採集! + - 真的妨礙我尋找食物! + questAcceptDialog: + - '&8[Venator Pabulatus]&f 如果你能擺脫那些討厭的狼,我會獎勵你的!' + - 我太老了,已經無法處理這些野生動物...... + - '&8&o我應該去村子東南邊的巢穴裡狩獵。' + questCompleteMessage: + - '&8[Venator Pabulatus]&f 我知道我可以依靠你!' + - 謝謝你的幫助! + - 這是我承諾該給你的獎勵。 +primis_farmstead_lighthouse_keeper_2: + customObjectives: + Objective1: + dialog: + - "&a[Jeeves]&f &2Amavit&f sent you? What's this about a lighthouse? My, what a discovery!\n&fThis will revolutionize my job as a traveling merchant! Here, have these &eScrolls&f - just call me and I'll be there in a jiffy!\n&7&oSeems like &aJeeves&7&o has something for me. I should talk to him." + name: '&2神秘之光' + questLore: + - + - + - 我父親 Jeeves 去山頂查看,但他還沒有回來。 + - + - + questAcceptDialog: + - '&8[Amavit]&f 再次感謝您,祝您好運,希望沒發生什麼...' + - '&8&o我應該去燈塔的頂部,調查一下問題,然後向第一村的阿馬維特的父親報告。' + questCompleteMessage: + - '&8&o這些捲軸看起來很有用!我應該用燈塔回到農莊繼續前進。' +primis_gladius_assassins: + name: '&5誰才是刺客?' + questLore: + - Gladius 的屋頂上佈滿了刺客! + - 冒險上街很危險,我們需要對付這些刺客! + - + - + questAcceptDialog: + - '&8[Belli] 對付那些刺客!使用&e位移箭&f可能會輕鬆些!' + - '&8&o我應該擊殺那些刺客。' + questCompleteMessage: + - '&8[Belli]&f 你將那些刺客打倒了?好!看來令人頭疼的問題以解決!' +primis_gladius_clear: + name: '&5奪回主控權' + questLore: + - 看來我不需要告訴你城鎮正在被入侵,對嗎? + - 我們正在為那些協助者提供獎勵。 + - 你準備好了嗎? + questAcceptDialog: + - '&8[Belli] &f只是去那裡減少他們的人數!' + - '&8&o出去清理 Gladius 的街道。' + questCompleteMessage: + - '&8[Belli]&f 看,神在我們需要的時候你就出現了!現在我有個工作需要你幫忙。' + - '&8&o看來 Belli 有個計劃。我應該和她談談。' +primis_gladius_prayer: + name: '&5信仰之躍' + questLore: + - 我不打算隱藏,事情看起來非常嚴重! + - 牆壁倒塌,街道到處都是亡靈,而我的酒水已經喝光, + - 這種時候,人們都會將希望轉向某種神聖的信仰! + - 有一條小路,點著蠟燭,可以通向山中的避難所, + - 武士走上這條路,擊敗守衛聖域的僧侶,以便在戰鬥中得到戰神的加持, + - 這可能只是一種迷信,但我們需要給人們希望, + - '你來到這裡的事實表明你的實力比其他人還要強大——上山打敗和尚。' + - 如果成功了,士兵們都會很放心的。 + - 聖域為​​了在戰鬥中得到戰神加持。 + - 雖然可能只是一種迷信 + - 但或許能給人們希望? + - 你來到這裡代表你的實力是很強大的 + - 其餘的 - 上山並擊敗&c僧侶&f。 + - 如果成功了,士兵們都會很放心的。 + questAcceptDialog: + - '&8[Belli] &f跟著燭火!小心別跌倒,那條路十分險惡!' + - '&8&o我應該順著燭路,打敗和尚。' + questCompleteMessage: + - '&8[Belli]&f 你完成了禱告?謝謝,士兵們聽了會放心的。' +primis_gladius_ships: + name: '&5下沉的感覺' + questLore: + - 你見過他們嗎?Gladius 外面的幾十艘船?他們應該為這一切負責。 + - 我們萬萬沒想到會從血神殿入侵,更不用說裝在船上的攻城武器了! + - 我們必須為此做點什麼。殺死海軍上將和他們部隊不會讓我們找回已失去的事物,但它肯定會讓我們感覺更好。 + - 更不用說安裝在船上的攻城武器了! + - 我們必須為此做點什麼。殺死&c海軍上將&f + - 有些勢力不會把我們失去的東西還給我們, + - 但它肯定會讓我們感覺更好。 + questAcceptDialog: + - '&a[Belli] &f殺死&c海軍上將&f和船上的部隊,小心,他們在水中有優勢!建議使用&e位移箭&f在船隻周圍移動。' + - '&8&o我應該去 Gladius 外的船上殺死海軍上將和他的部隊。' + questCompleteMessage: + - '&8[Belli]&f少將不在了?謝謝你幫我報仇,我感覺好多了!' +primis_gladius_sunken_ship: + name: '&5沉船' + questLore: + - 既然你已經照顧了水手部隊,我還有另一項任務要交給你。 + - 沉船現在應該可以到達了。 + - 你看到前一段時間有一艘船沉沒了,不幸的是它載有重要文件。 + - 我需要你到達沉船並殺死周圍的任何威脅並取回文件。 + - 完成任務後回來找我。 + - 我需要你到達&d沉船&f並殺死任何威脅 + - 周圍&e檢索文檔&f. + - 完成任務後回來找我。 + questAcceptDialog: + - '&8[Belli] &f你會在西南的水域找到這艘船。給他們下地獄!' + - '&8&o我應該去收集文件並殺死船附近的任何水手。' + questCompleteMessage: + - '&8[Belli]&f 已經回來了?優秀作品!我們真的需要這些文件。' +primis_gladius_supplies_1: + name: '&c供應問題' + questLore: + - 我們的食物快用完了! + - 'Gladius 雖然是座難攻易守的要塞,但前提是我們的物資要夠!' + - 大部分的物資都在倉庫中,不幸的是倉庫在被攻破的倒塌城牆附近, + - 如果你能清理出通往倉庫的道路,並獲得一些對戰爭有很大幫助的補給品! + - 不幸的是,&d倉庫&f是最先倒下的地方之一, + - 現在我們正在慢慢地餓死! + - 如果你能清理通往&d倉庫&f的道路並獲得一些&e補給品&f + - 這將極大地幫助戰爭努力! + questAcceptDialog: + - '&8[Cibus]&f 倉庫是很重要的戰略地點!它位於牆壁倒塌的那片區域,有個超大建築!拿點物資回來吧!' + - '&8&o我應該去倉庫帶回物資。' + questCompleteMessage: + - '&8[Cibus]&f 你把物資帶回來了?太棒了!在你前往倉庫時,我想到一個好點子,它應該能讓士兵們精神振奮起來!' + - '&8&o看來 Cibus 有一個計劃,我應該和他談談。' +primis_gladius_supplies_2: + name: '&c吃的沒問題,喝的呢?' + questLore: + - 食物不缺了,但喝的呢? + - 有人會說在戰爭中不宜喝醉,但現在不喝,未來還有機會喝嗎? + - 街的對面有個小酒館,酒保把所有好東西都放在地下室裡。 + - 我想你知道我要去哪裡! + - 到地下室拿點好東西,如果你看到了酒保,可以幫他從不死的詛咒中解救出來,我認為這對他來說是個救贖。 + - 我們很確定入侵發生時他在地下室,所以他很可能還在那裡,儘管他可能已經不是他自己了。 + - 去街對面酒館的&d地下室&f,可以得到 + - '&e好東西&f,如果你找到 Barkeep' + - 請幫他從這不死詛咒中解救出來,也算是做件善事。 + - 我們很確定他在&d地下室&f的時候 + - 入侵發生了,所以他很可能還在那裡, + - 雖然可能不再是他自己。 + - 小心! + questAcceptDialog: + - '&8[Cibus]&f 小酒館就在街對面,拜託你了!' + - '&8&o我應該去小酒館的地下室拿些“好東西”。' + questCompleteMessage: + - '&8[Cibus]&f 你解放了酒保?感謝你幫他從這該死的詛咒中解救出來,來,這杯我敬你。' +primis_ice_village_all_out_of_chains: + customObjectives: + Objective1: + dialog: + - '&a[Orbis]&f Oh, the Ice Village chain shipment. Yes, it is right in that chest over there.' + - Sorry for not sending it over, but we were quite busy and had no time. + - It's all paid for so feel free to just grab it. + name: '&2All out of chains' + questLore: + - 嘿,你來自 Pontis Mille 對吧? + - 你想如何幫助我們。 + - 在監獄裡,我們往往會經歷一個 + - 很多鏈條... + - 尤其是支撐籠子的鍊子。 + - 它們生鏽,然後破裂。 + - 其中一名囚犯是這樣逃脫的 + - 鍊子斷了,籠子掉了下來,他跑了。 + - 我們叫了 + - '新的鏈條,但它...' + - 還沒到。如果你能去 + - '&dPontis Mille&f 取得' + - '裝有&e鏈條的貨物&f' + - 那就太好了! + questAcceptDialog: + - '&a[Philolaches Triferus]&f 去和Orbis談談。他是製造鏈條的人。' + - '&7&o我應該去和&a&oOrbis&7&o談談,把裝有&e&o鏈條的貨物&7&o帶回來。' + questCompleteMessage: + - '&a[Philolaches Triferus]&f 那些是鎖鏈!謝謝你得到這些,我們真的需要它們。' +primis_ice_village_catch_me_if_you_can: + name: '&2如果可以的話,抓住我' + questLore: + - 快!我想找人去捕捉 + - '&c逃犯&f.' + - + - + - + - + - + - + questAcceptDialog: + - '&a[Romanus Superbus]&f他一定在山區的某個地方。' + - '&7&o我需要找到&c&o逃犯&7&o並將他帶回監獄。' + questCompleteMessage: + - '&a[Romanus Superbus]&f 哦,這不是我們逃脫的睡美人嗎。' + - 幹得好。做得好的工作應該得到豐厚的報酬,來吧。 + - '&aRomanus&7 遞給你一袋沉重的硬幣。' +primis_ice_village_get_them_off_my_back: + name: '&2把它們從我的背上拿下來!' + questLore: + - 讓我告訴你,我很高興你能來幫忙,哈哈。 + - 我們在這裡的任務是獵殺 &c野豬&f 並控制他們的數量。 + - 這也不全是關於數量控制。 + - 它們為我們提供珍貴的皮革、象牙和肉。 + - 如果沒有他們,村莊不會發展得起來。 + - + - + - + - + - + - + - 我們只需要你消滅&c貝貝&f和&c幼年的野豬&f。 + - + - + - + - + - 如果你能找回它,對我來說意義重大。 + questAcceptDialog: + - '&a[Alanus Isatis]&f 你在來這裡的路上應該看到了&c野豬&f,你知道在哪裡可以找到它們。' + - '&7&o我需要補獵一些&c&o野豬&7&o,並順便取回 &e&oAlanus 匕首&7&o.。' + questCompleteMessage: + - '&a[Alanus Isatis]&f 幹得好朋友!這應該有很大幫助。' + - + - + - 這把匕首沒什麼特別的,但它是我已故父親的手工禮物。 + - 下次你渴了,就讓我請你一杯! +primis_ice_village_gotta_keep_warm: + customObjectives: + Objective1: + dialog: + - '&a[Severinus Martius]&f Ha ha! That should keep me warm for another couple of weeks!' + - Hey friend, you heading for &dCaerullium Village&f by any chance? + name: '&2Gotta keep warm' + questLore: + - We deliver the &aLighthouse Keeper&f some + - of our strong stuff every couple of weeks. + - It keeps him warm during the colder days. + - It's a small gesture of thanks for all his + - hard work. Any chance you could help out + - and bring over the next batch? + questAcceptDialog: + - '&a[Grania Cecilius]&f You can find the lighthouse to the East. Thanks!' + - '&7&oI should go to the &d&oLighthouse&7&o and deliver these to the &a&oLighthouse Keeper&7&o.' + questCompleteMessage: + - '&a[Severinus Martius]&f If you''re heading over there then I would appreciate if you could deliver some of these to my good friend &aJeeves&f.' + - '&7&oSeems like the &a&oLighthouse Keeper&7&o has a quest for me.' +primis_ice_village_gotta_see_jeeves: + customObjectives: + Objective1: + dialog: + - '&a[Jeeves]&f Oh! A gift from my friend Severinus you say.' + - Well, thank you for bringing it over. Was nice seeing you again! + name: '&2Gotta see Jeeves' + questLore: + - Now, now it would be really rude of me to keep + - all of the good stuff to myself! + - If you would bother helping me out friend and + - delivering some of the good stuff + - to my friend &aJeeves&f at &dCaerullium Village&f. + - You can get there quickly by taking the + - '&9lighthouse portal&f.' + questAcceptDialog: + - '&a[Severinus Martius]&f The portal is all the way at the top.' + - '&7&oI should go to &d&oCaerullium Village&7&o and deliver some of the good stuff to &a&oJeeves&7&o.' + questCompleteMessage: + - '&a[Severinus Martius]&f Thank you for delivering some of the strong stuff to Jeeves. I know he likes a good drink here and there ha ha!' +primis_ice_village_living_nightmares: + customObjectives: + Objective1: + dialog: + - '&a[Cornelia Ennodius]&f Are they gone? I was so scared. My parents sent you? Thank goodness.' + - + - + - I couldn't escape. I, I...will be fine, I just need a minute... + name: '&2做噩夢' + questLore: + - 我跟著她的踪跡到達這裡。 + - 不知道她會從這裡去哪裡。 + - 我擔心可能發生了不好的事情。 + - 我們的&a女孩&f很喜歡我和我的特殊能力。 + - 除了她的強大,她也有能力 + - 在現實世界中表現出強烈的情感。 + - 我們的時間不多了,我們需要盡快找到她。 + questAcceptDialog: + - '&a[Sestia Ennodius]&f 這裡的小路很冷,她不可能離得那麼遠……' + - '&7&o我需要在她出事之前找到&a&o失踪的女兒&7&o。' + questCompleteMessage: + - '&a[Sestia Ennodius]&f 你找到她了!快點,她在哪裡?' + - 謝謝陌生人,我馬上去找她! +primis_ice_village_make_them_go_ouch: + name: '&2Make them go ouch' + questLore: + - 我有一些'&c淘氣的顧客&f' + - 幾天前來參觀。 + - 他們偷走了最有價值的東西 + - '&e我的財產&f。' + - 您需要找到它們並確保 + - 給他們一個教訓。 + - 確保他們知道 + - '&aViolet&f 不忘收藏。' + questAcceptDialog: + - '&a[Domina Violet]&f 他們向東經過樹林。' + - '&7&o我需要確保&c&o客戶&7&o知道不要惹 &a&oViolet&7&o 。我還需要檢索&e&oViolet的財產&7&o。' + questCompleteMessage: + - '&a[Domina Violet]&f我希望你教會了他們痛苦的價值。' + - + - +primis_ice_village_objection!: + customObjectives: + Objective3: + dialog: + - '&a[Glacies Princeps]&f What, absolutely not. I don''t know how he convinced you to come here and beg for his release.' + - + - + - He will never be released. Is that understood. + Objective1: + dialog: + - '&a[Romanus Superbus]&f Release him? Not guilty? Are you mad? You''re lucky I don''t throw you in a cage too for suggesting such nonsense.' + Objective2: + dialog: + - '&a[Luxuria Placidus]&f Who? Never heard of him.' + name: '&2異議!' + questLore: + - 我不屬於這裡!你一定能看到嗎? + - 我沒有做錯!陌生人你會聽到我的請求嗎? + - 你能幫助這個被困的可憐的靈魂嗎 + - 關在這個沒有他自己過錯的可怕牢籠裡? + - 你必須去找人談談 + - '&a監獄長&f 或者 ' + - '&a村長&f。' + - 或任何其他 + - '&a友善的村民&f' + - 誰會 + - 願意幫 + - 我釋放! + questAcceptDialog: + - '&a[Adrius Calpornius]&f 去和他們談談!讓我出去!' + - '&7&o我應該去和我名單上的人談談。' + questCompleteMessage: + - '&a[Adrius Calpornius]&f 什麼?!謊言!!!我永遠不會對我的家人做出如此可怕的事情......' + - + - + - '&7不管這個可憐的人還剩下什麼理智,現在都沒有了……' +primis_ice_village_run_away_daughter: + customObjectives: + Objective1: + dialog: + - '&a[Sestia Ennodius]&f I could sense you coming.' + name: '&2逃跑的女兒' + questLore: + - 陌生人!你會幫助我們的家人嗎? + - 我們的女兒失踪了。 + - 她被賦予了特殊的天賦 + - 和她&a媽媽&f一樣的力量 + - 我害怕昨晚的事 + - 可怕的事情一直在發生 + - 讓她在趁機逃跑 + - 在這個夜晚。 + questAcceptDialog: + - '&a[Sparax Ennodius]&f 我的&a妻子&f已經去找她了。' + - 她一定在村外的某個地方,去找她,和她談談。 + - '&7&o我應該去找&a&o擔心的母親&7&o.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f 你是我&a丈夫&f請來幫忙找我女兒的?' + - '&7&o我應該聽聽&a&o擔心的母親&7&o要說什麼。' +primis_ice_village_silence: + name: '&2Make them go ouch' + questLore: + - 噓!你聽到了嗎? + - 煩人的尖叫, + - 唉,我受不了了! + - 聽著,我會付你錢 + - 如果你能找到源頭 + - 請將那惱人的尖叫聲 + - 停止。 + questAcceptDialog: + - '&a[Modestus Eulogius]&f聽起來好像是從我身後的山丘上傳來的。' + - '&7&o我應該找到所有噪音的來源並將問題解決。' + questCompleteMessage: + - '&a[Modestus Eulogius]&f 我和我的耳朵都清靜了,謝謝你!' +primis_ice_village_taking_the_bait: + name: '&2上鉤' + questLore: + - 這些&c魚&f,他們怎麼了! + - 我已經在這裡釣魚好幾天了! + - 連一條魚都沒有,想當年,我可是很勇的! + - + - + - 如果我們抓不到任何一條魚,就會發生食物危機。 + - 你需要去幫助我捕撈。 + questAcceptDialog: + - '&a[Theopropides Nero]&f 你想幫忙,所以這是你的機會!' + - '&7&o我必須跳入湖中,捕撈 7 條&c&o寒冷鮭魚&7&o。' + questCompleteMessage: + - '&a[Theopropides Nero]&f 哦!看他們!真大!' + - + - +primis_ice_village_treats_for_the_punished: + customObjectives: + Objective1: + dialog: + - '&a[Eleusium Calenus]&f My wife sent you? Oh, are those treats? My favorite too! She''s such a darling.' + - + - + - 'You tell her I am doing just fine and that I love her very much. ' + name: '&2受罰者的款待' + questLore: + - 如果你不介意,我可以請你為我做點什麼嗎? + - 我親愛的丈夫已經入獄,我知道整天住在籠子裡很艱難。 + - 所以我準備了一些我要送給他的零食。 + - + - + questAcceptDialog: + - '&a[Titia Calenus]&f 他將被關在中間的一個籠子裡。' + - 別忘了告訴他我愛他。 + - '&7&o我應該把這些零食送給她的&a&丈夫&7&o.' + questCompleteMessage: + - '&a[Titia Calenus]&f 回來這麼快!哦,他真的這麼說嗎?他真是個甜心。' +primis_ice_village_wanna_make_a_snowman: + name: '&2想堆雪人' + questLore: + - 村裡的孩子們最近很無聊 + - 我一直在想,有這些 + - '&c神奇動物&f 棲息在這附近的樹林裡' + - 村莊。生物的皮毛會長出&e神奇的冰晶&e。 + - 當您將這些&e水晶&f注入雪中時,它會使 + - 雪在周圍環繞,膨脹和收縮。 + - 如果你用這注入的雪堆起一個雪人 + - 它使它看起來好像雪人還活著。 + - 孩子們會喜歡的!所以,想幫忙 + - 這個老人讓孩子們高興起來? + questAcceptDialog: + - '&a[Sparax Ennodius]&f 你會在村莊附近的任何樹林中找到這些&c生物&f。' + - + - + - '&7&o我應該去殺死足夠的 &c&o霜毛熊&7&o來收集 15 個&e&冰水晶&7&o。' + questCompleteMessage: + - '&a[Sestia Ennodius]&f 你收集了足夠多的水晶?精彩的!' + - 我現在可以開始堆雪人了,我等不及孩子們看到了! +primis_main_quest_: + name: '&2礦坑裡的哥布林!' + questLore: + - 這一天只會越來越糟。首先,我們被哥布林伏擊了。 + - 我們撤退,卻發現我軍四分五裂。有些人死了,許多人失踪了。 + - 最糟糕的是,我們擔心我們可能會吵醒哥布林王。 + - 一些,希望,通過它。我們現在必須建立營地並恢復。 + - 如果你敢於勇敢進入礦井,那你就靠自己了。 + - 我們試圖偷偷溜過他們,但並不順利。 + - 唯一的選擇就是殺出一條血路。 + questAcceptDialog: + - '&8[Centurion]&f你想過去嗎?當心哥布林王!' + - '&8[Centurion]&f我們希望我們的童子軍能夠不會碰到他。如果可以的話,跟童子軍見面。' + - '&8&o我應該冒險穿過礦坑並打敗哥布林王。' + questCompleteMessage: + - '&8[Scouting party]&f你熬過去了?我幾乎希望你沒有。你不會相信未來會發生什麼。' + - '&8&o聽起來偵察隊對我來說是個壞消息。' +primis_main_quest_1: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis] &fOh so you were in the ship that beached a few hours ago?' + - + - + - + - + - + - + - '&7&oI should report to the &aFirst Mate &7&oto see if I should help these people!' + name: '&2船難!' + questLore: + - 你終於醒了?太好了!我需要你的幫助。 + - 船在昨晚的風暴中擱淺,我們看到遠處有一座燈塔,那附近肯定有個村莊! + - 去和那裡的村長談談看,請他們提供協助! + - 大副在你之前已經過去了,現在還沒回來,如果你看到他,請按照他的指示行動! + - '&a大副&f走在你前面,但還沒有回來。' + - 如果你看到他,請按照他的指示! + questAcceptDialog: + - '&8[Captain Squalus]&f 去附近的村莊看看他們是否會幫助我們!' + - 去那裡的路上要小心,這片土地對我們來說相當陌生! + - '&8&o我應該調查附近的村莊並與他們的村長交談。' + questCompleteMessage: + - '&8[Iracundi大副]&f 該死!船難後連休息都沒有!來,這些裝備給你防身用!' + - '&8&o好像 Iracundi大副 對我有要求……' +primis_main_quest_10: + customObjectives: + Objective2: + dialog: + - "&a[Shogun Navita] &f&dGladius&f calls for our aid?\n&7&oSeems like I should talk to the &aShogun&7&o." + name: '&5縮小差距' + questLore: + - 是時候向 Pontis Mille 尋求幫助, + - 讓他們知道這裡發生了什麼,並讓他們兌現承諾, + - + - + questAcceptDialog: + - '&8[General Hasta] &f安全旅行,朋友,記住:打敗守門人,確保我們的請求能傳到 Navita將軍 的耳朵裡。' + - '&8&o我應該在橋上打敗守門人,然後前往 Pontis Mille 找 Navita將軍。' + questCompleteMessage: + - '&8[Navita將軍]&f 你帶給我的消息確實令人不安,恐怕已經有什麼……不自然的事情……正在發生。' + - '&8&o看來我已經到了本章內容的結尾。我應該等待下一章發布,也可以在 patreon.com/magmaguy 上支持 MagmaGuy,我聽說他是一個非常酷的人。' +primis_main_quest_11: + customObjectives: + Objective1: + dialog: + - '&a[Major Fortes Bellator]&f Yes, traveler?' + name: '&2發送消息' + questLore: + - 你旅行的故事是最令人驚訝的。 + - 你能活到這裡簡直就是一個奇蹟。 + - 入侵Gladius的力量是不可逾越的。 Gladius最終會在他們的力量下崩潰…… + - '援助?... 啊,是的,去見少校 Fortes Bellator,他可以幫助您。' + - 援助?... 啊,好,先找&aFortes Bellator少校&f。 + - 他能夠幫助您。 + questAcceptDialog: + - '&8[Navita]&f 你可以在前面那些樓梯的頂部找到少校!' + - '&8&o我應該去和少校談談,看看他能不能幫忙。' + questCompleteMessage: + - '&8[Major Fortes Bellator]&f &a將軍官邸&f的將軍決定幫助&dGladius&f?我以為他不想要!但,我們必須先做好準備。' + - '&8&o似乎 Fortes Bellator 對我有用。' +primis_main_quest_12: + customObjectives: + Objective1: + dialog: + - '&a[Centurion]&f Where are our reinforcements?' + name: '&2礦山路徑' + questLore: + - 我無法相信 Gladius 會發生這種事情,他們攻擊又快又猛烈,而且打在最關鍵的地方。 + - 幫助我們的盟友是我們的誓言。我們沒有履行職責,我們也辜負了我們的盟友。 + - 參贊命令我們在入侵前在幾個地區動員我們的部隊。 + - 你看,最近在風暴神殿發現了不尋常的毀滅性風暴。 + - 皇家衛隊奉命平息風暴,而將軍官邸的將軍拒絕遵守這一命令。 + - 我們自己的警衛在其他地方,我擔心我們將需要我們所擁有的一切來帶回 Gladius。 + - 通往風暴神殿的道路很危險,因為它需要穿過哥布林礦井。 + - 幫助守衛清除障礙,開闢通往風暴神殿的道路! + - 皇家衛隊奉命平息風暴,將軍官邸&a將軍&f + - 拒絕遵守該命令。 + - 我們自己的警衛在其他地方,我擔心我們會需要所有人 + - 我們必須把 Gladius 奪回來。 + - 通往&d風暴神殿&f的道路很危險,因為它需要 + - 通過&d哥布林礦坑&f。 + - 幫助我們的守衛清除礦坑,開闢通往&d風暴神殿&f的道路! + questAcceptDialog: + - '&8[Fortes]&f小心行事,哥布林礦井是一個危險的地方。或許你應該在協助皇家衛隊之前先協助普通衛隊。' + - '&8[Fortes]&f礦井位於城市的北部。有通往它的入口的樓梯。' + - '&8&o我應該看看還有什麼可以幫助 Fortes Bellator 的,或者我可以前往哥布林礦井的入口。' + questCompleteMessage: + - '&8[Scouting party]&f見到一個人真是太好了! Pontis Mille 派你來了嗎?' + - '&8&o我應該聽聽童子軍領袖怎麼說' +primis_main_quest_13: + name: '&2礦井裡的哥布林!' + questLore: + - 這一天只會越來越糟。首先,我們被哥布林伏擊了。 + - 我們撤退,卻發現我軍四分五裂。有些人死了,許多人失踪了。 + - 最糟糕的是,我們擔心我們可能會吵醒哥布林王。 + - 一些,希望,通過它。我們現在必須建立營地並恢復。 + - 如果你敢於勇敢進入礦井,那你就靠自己了。 + - 我們試圖偷偷溜過他們,但並不順利。 + - 唯一的出路是流血。 + questAcceptDialog: + - '&8[Centurion]&f你在冒著哥布林礦嗎?當心哥布林王!' + - '&8[Centurion]&f我們希望我們的童子軍能夠超越他。如果可以的話,與他們見面。' + - '&8&o我應該冒險穿過地雷打敗哥布林王。' + questCompleteMessage: + - '&8[Scouting party]&f你熬過去了?我幾乎希望你沒有。你不會相信未來會發生什麼。' + - '&8&o聽起來偵察隊對我來說是個壞消息。' +primis_main_quest_14: + name: '&2風暴的終結' + questLore: + - 很難相信你是一個人闖過哥布林礦區。 + - '也許以你的毅力,你將能夠面對前方的挑戰。' + - 我們試圖襲擊風暴神殿,並以巨大的代價到達了它的最深處。 + - 我們在那裡發現的……它無法理解。 + - 可能很難相信,但聽起來風暴本身已經成為我們的對手。 + - 我們甚至不知道它是否可以被擊敗。我們擔心我們會被送去死。 + - 如果你真的打敗了哥布林王,那麼或許你會想辦法斬殺這場風暴。 + - 本身已經物化為我們的對手。 + - 我們甚至不知道它是否可以被擊敗。我們擔心我們會被送去死。 + - + - + questAcceptDialog: + - '&8[Blepharo]&f我們稍微削弱了他們的力量,但這也不是一件容易的事。' + - '&8[Blepharo]&f風暴不是普通的對手。不要低估它。' + - '&8&o我應該去風暴神殿殺死風暴。' + questCompleteMessage: + - '&8[Shogun Navita]&f什麼!?' + - '&8[Shogun Navita]&f打敗風暴?有人告訴我這是不可能的!我是說...' + - '&8[Shogun Navita]... 不用隱藏,我知道風暴的存在,也知道 &dGladius&f 的被入侵——都是我計劃的。這樣做是為了我的人民——為了 &dPontis Mille&f。' + - '&8[Shogun Navita] Machiavelli顧問說服我,風暴與自然本身一樣不可阻擋,&dGladius&f和&dPontis Mille&f的隕落是不可避免的,我們只能通過犧牲來拖延。' + - + - + - '&8&o似乎 Shogun Navita 有一個他想讓我處理的問題。' +primis_main_quest_15: + name: '&2遣散費回報!' + questLore: + - + - + - + - + - + - + - + - + - + - 我為我們爭取了時間。 + - + - + - + - + - 他把我們引向了我們的厄運,如果你沒有出現,他就會僥倖逃脫。 + - 現在,有希望了。 + - 我問你,請擺脫我們這個奸詐的顧問。 + - + - + - + - + - + - + - 我希望通過他們傳遞最後一條信息。 + questAcceptDialog: + - '&8[Shogun Navita]&f馬基雅維利顧問已經撤退到他在下城市場附近的住處。要小心,在他的時代已經積累了一批忠實的追隨者,並且不會不戰而敗。' + - '&8&o現在是馬基雅維利顧問面對正義報應的時候了。' + questCompleteMessage: + - '&8[Shogun Navita]&f這樣就完成了。' + - '&8[Shogun Navita]&f&dPontis Mille&f欠你很大的人情,一旦我們召集完軍隊,就前往&dGladius&f支援。' + - '&8&8[Shogun Navita]&6我們害怕你。我們向你投降了我們的盟友。我們分散了我們的軍隊。不再.' + - '&8[Shogun Navita] Pontis Mille 向戰爭進軍,我們不會孤軍奮戰!你會後悔你穿過我們的道路的那一天。' + - '&8<當 Shogun Navita 將其砸在地上時,遠處的演講石可以聽到不祥的笑聲>' + - '&8&o看來將軍是有計劃的。我應該和他談談。' +primis_main_quest_16: + customObjectives: + Objective3: + dialog: + - '&a[Demenis Nolus]&f Heading to the village, eh. Just keep going East, follow the road and you should be there in no time!' + Objective4: + dialog: + - '&a[Callipho Classicius]&f Directions? Just head down this road that leads to the graveyards.' + Objective1: + dialog: + - '&a[Glacies]&f Welcome to our village traveler! Please tell me, what brings you here friend.' + Objective2: + dialog: + - '&a[Bromia Culleolus]&f Oh, the way to the village. Yes, just take this road that leads to the mountain.' + - Happy to help! + name: '&2冰村等著你' + questLore: + - 我們必須盡快向&dGladius&f提供援助。 + - 冠軍,在遙遠的南方有一個強大的戰士村。 + - 你應該去那裡告訴他們 Pontis Mille + - 會尋求他們的幫助,將入侵者從血神殿中擊退。 + - 找到 Glacies Princeps 並告訴他們是我派你來的。 + - 路上有很多行人,你應該停下來問他們方向。 + questAcceptDialog: + - '&8[Shogun Navita]&f這將是一段漫長的旅程。確保你做好準備。沿著通往南方的道路行駛。' + - '&8&o我必須去最南邊找到冰村。' + questCompleteMessage: + - '&8[Glacies Princeps]&f好吧,這就是現在的主要任務。我希望你玩得開心。' + - + - + - '&8&o我應該等待更多內容髮布,然後繼續我的旅程。' + - '&7&o我應該和 &a&oGlacies&7&o 談談。' +primis_main_quest_17: + customObjectives: + Objective3: + dialog: + - '&a[Theopropides Nero]&f Help? Yes, please!' + Objective1: + dialog: + - '&a[Alanus Isatis]&f Here to help with the &cRazorbacks&f?' + Objective2: + dialog: + - '&a[Domina Violet]&f I hope you are here to help!' + name: '&2幫助北方' + questLore: + - 在我們進一步討論任何關於 + - 這 &d血神殿&f. + - + - + - 如果這些問題不解決,我就不能履行村長的職責。 + - 我無法無視自己同胞的懇求而將他人放在首位。 + - + - + - + - + - + - + - + - + - 他們將能夠更詳細地告訴您需要做什麼。 + questAcceptDialog: + - '&a[Glacies Princeps]&f 一旦你完成,可回到我這,這時我們就可以談談你的問題。' + - '&7&o我應該去和我名單上的村民談談,幫助他們解決他們可能遇到的任何問題。' + questCompleteMessage: + - '&a[Romanus Superbus]&f &2Glacies&f派你來的?時間緊迫!我們有一個逍遙法外的囚犯!' + - '&7&o我應該和&a&oRomanus Superbus&7&o談談。' +primis_main_quest_18: + name: '&2冰的試煉' + questLore: + - 嗯,你肯定給我和村裡的大部分人留下了深刻的印象。 + - + - + - '&c冰元素&f.' + - + - + - + - + - '與&c小冰元素&f戰鬥,' + - + - + - 如果你失敗了......那麼......你的一切將被&c冰元素&f吸收。 + - + - + - 之後 + - + - + - 有幾個人受到影響,為了我們自己的安全,不得不把他們關進監獄。 + - + - + - + - + - 奴隸 + - '&c冰元素&f.' + - 很明顯,我們的舊傳統已不復存在。 + - 必須對付&c冰元素&f…… + - 我希望你能成為最後一個 + - 進行冰之試煉,爬上山頂的人 + - '&c小冰元素&f,並釋放試煉失敗者的靈魂。' + questAcceptDialog: + - '&a[Glacies Princeps]&f 你可以在&aViolet''s&f 家中找到通往審判之路的起點。' + - 按照&9紫水晶塊&f,他們會引導你到頂峰。 + - '&7&o我應該跟著&9&o紫水晶塊&7&o到山頂然後殺死&c&o小冰元素&7&o。' + questCompleteMessage: + - '&a[Glacies Princeps]&f 你做到了嗎?願他們的靈魂現在安息。' + - 讓我們再談談朋友。還有更多工作要做。 + - '&7&o我應該和 &a&oGlacies&7&o 談談。' +primis_main_quest_19: + name: '&2冷靜下來' + questLore: + - 是時候讓我們自己擺脫這個詛咒了。 + - 我們不應該讓自己依賴&c元素&f的力量。 + - 我們將在此時此地糾正這個錯誤。 + - 你所殺的只是 + - '&c小冰元素&f' + - '&cIce Elemental&f rests in a temple right across from our village.' + - 這是我們力量的主要來源……也是愚蠢的。 + - Go forth now and slay the &cIce Elemental&f. + questAcceptDialog: + - '&a[Glacies Princeps]&f You will find a path that leads into the temple at the summit of the village.' + - '&7&oI should go into the temple and slay the &c&oIce Elemental&7&o.' + questCompleteMessage: + - '&a[Glacies Princeps]&f I could feel the energies flowing out, all the way from here.' + - + - + - There is another settlement that might need your help, let's speak. + - '&7&o我應該聽聽&a&oGlacies&7&o要說什麼。' +primis_main_quest_2: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis]&fYou''ll help us? Thank the seas! This was starting to feel like a sinking ship!' + name: '&2有需要的陌生人....' + questLore: + - 所以他們不僅不能幫忙,而且還需要我們的幫助?呸! + - 好吧,我們現在別無選擇,不是嗎? + - 去,幫助他們,然後讓他們幫助我們! + questAcceptDialog: + - '&8[Iracundi大副]&f 好吧,你去幫助當地人,看看能收集到什麼資訊,並讓他們反過來幫助我們,我會在這裡繼續跟村長談判,有消息就回來跟我說! - &8&o我應該和村長談談幫助當地人的事情。' + - 有消息就回來跟我說! + - '&7&o我應該和&a村長&f談談幫助當地人的事情。' + questCompleteMessage: + - '&8[Piscis村長]&f 村裡的每個人都有需要處理的問題,我也不例外。我的要求很有挑戰性,也許你應該先解決其他村民的問題。' + - + - + - '&8&o我應該和當地人談談,看看誰需要幫助,之後再回到村長那裡。' +primis_main_quest_20: + customObjectives: + Objective1: + dialog: + - '&a[Lutum Princeps]&f This better be important.' + name: '&2Terravilla' + questLore: + - Some time ago we received a request for aid from a + - a nearby settlement. Years ago a bunch + - of explorers settled on top of this ancient ruin. + - I think they call their little + - settlement &dTerravilla&f. Apparently there is a lot + - of treasure to be had there if you don't mind the risk. + - But I hear that stuff has gone wrong there and they asked + - us if we could spare any help to send their way. To be + - honest, you are the strongest warrior I have ever seen. + - You are the best help we could send. If you would like + - to go of course. + questAcceptDialog: + - '&a[Glacies Princeps]&f You will find &aTerravilla&f straight West of here.' + - + - + - Oh, I almost forgot. The person you want to talk to is &aOverseer Lutum&f. + - '&7&oI should go to &d&oTerravilla&7&o and talk to &a&oOverseer Lutum&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f Came all the way from the &dIce Village&f, eh. Good to see some help arrive.' + - + - + - + - + - '&7&oI should talk to &a&oLutum&7&o.' +primis_main_quest_21: + name: '&2Taking out the trash' + questLore: + - Many years ago some explorers came across this ruin and + - as they investigated it more closely they discovered a + - large underground maze-like structure. In this structure + - there were a lot of ancient artifacts and treasures. But + - also a lot of danger. Not like that stopped anyone from + - going down there. And as the word spread, more and more + - people came here to make their fortunes. Before you + - know it, it turned into a small settlement. Until lately + - everything was fine, but then awful things started + - happening. Before I tell you more, we should start by + - dealing with the simple problems first. A small band of + - '&cRobbers&f has found a foothold in the hills surrounding' + - '&dTerravilla&f. We need them gone. Also, feel free to assist' + - any villagers in &aTerravilla&f that might need help. + questAcceptDialog: + - '&a[Lutum Princeps]&f I am not sure where the &cRobbers&f are exactly. I just know that people have reported seeing them coming from the hills.' + - '&7&oI should deal with the &c&oRobbers&7&o and help any villagers in need if I have the time.' + questCompleteMessage: + - '&a[Lutum Princeps]&f Well that is one issue resolved. Onto the next!' + - Before we move on, I want you to have this blade. + - + - + - '&7&oI should hear out what &a&oLutum&7&o has planned next.' +primis_main_quest_22: + name: '&2Big trouble in little pub' + questLore: + - Before we get to the big problem underground, I would + - like you to do one last thing here in town. There has + - been huge trouble in our little pub. There are certain + - characters in town who keep going to the pub and causing + - a ruckus. Well I heard that this time all of them managed + - to gather at the pub at the same time. And of course now + - there is a huge brawl happening over there. This is a great + - opportunity for us to arrest all of them at once. Go to the + - pub and knock them all out. We will handle the rest. + questAcceptDialog: + - '&a[Lutum Princeps]&f The pub is at the ground level, right across. Don''t let them overwhelm you.' + - I will have a nice reward waiting here for you when you're back. + - '&7&oI need to go to the pub and deal with the &c&oBar Brawlers&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f I hear that the pub is a peaceful place again. Let''s discuss the real issue now.' + - '&7&oI need to talk to &a&oLutum&7&o.' +primis_main_quest_23: + name: '&2Strike the earth' + questLore: + - You see the real reason we asked for help is because of what happened + - at the ruins. There were always dangerous things down there, + - but nothing a seasoned adventurer or explorer could not handle. But then + - something awakened, these ancient constructs started rising out of the + - ground and the walls. Then these quakes started happening, it was weird, + - because you could only feel them if you were down in the ruins. So we shut + - everything down, nobody was allowed access to the ruins anymore. A few days + - ago I gathered some of my best men and sent them down there to find the source + - of it all. They barely made it back. They found an &cEarth Elemental&f high + - above the pillars, on top some sort of platform. It must have been there + - dormant all this time. No clue why it decided to wake up now... + - Your job would be to go down there, navigate through the maze and put the + - '&cEarth Elemental&f into a slumber it will never wake up from.' + questAcceptDialog: + - '&a[Lutum Princeps]&f You can get to the maze by walking down the spiral staircase in the middle of the ruins.' + - + - + - '&7&oI should enter the &d&oRuins Maze&7&o and slay the &c&oEarth Elemental&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f I cannot believe it, you''re back. In one piece too!' + - + - + - + - '&7&oI need to tell &a&oLutum&7&o about my quest and the &d&oBlood Temple&7&o.' +primis_main_quest_24: + customObjectives: + Objective1: + dialog: + - '&a[Navita]&f You have returned! I hope you have good tidings.' + name: '&2There and back again' + questLore: + - We had no idea what was going on... Yes, + - '&dTerravilla&f will be able to pledge some' + - of our forces to your cause. I wonder if the + - '&cEarth Elemental&f awakening had anything' + - to do with the &dBlood Temple&f. We will + - prepare our forces and wait for word from + - '&dPontis Mille&f.' + questAcceptDialog: + - '&a[Lutum Princeps]&f So you are heading off to &dPontis Mille&f, make sure to tell the &aShogun&f that &dTerravilla&f will be ready to assist.' + - '&7&oI should head to &d&oPontis Mille&7&o and speak with &a&oShogun Navita&7&o.' + questCompleteMessage: + - '&a[Navita]&f It is good to hear that the &dIce Village&f has decided to join our cause! But I did not expect that you would manage to convince &dTerravilla&f to pledge to our cause as well.' +primis_main_quest_25: + customObjectives: + Objective1: + dialog: + - '&a[Outpost Officer]&fFILLER TEXT!' + name: '&2To the outpost' + questLore: + - It is so good to see you again friend! + - While you were gone we were preparing our + - forces. We have made an &dOutpost&f + - between the &dBlood Temple&f and &dPontis Mille&f. + - You should go there and report to the + - '&aOutpost Officer&f. They will let you know' + - how we shall proceed with the assault on the + - '&dBlood Temple&f.' + questAcceptDialog: + - '&a[Navita]&f The outpost is to the South of the city. Not too long now, before the additional forces from &dTerravilla&f and the &dIce Village&f arrive.' + - '&7&oI should head to the &d&oOutpost&7&o and speak with the &a&oOutpost Officer&7&o.' + questCompleteMessage: + - '&a[Outpost Officer]&f I GOT NO IDEA WHAT TO SAY CAUSE I AM NOT DONE' +primis_main_quest_3: + name: '&c強盜營地!' + questLore: + - 最近在附近的強盜營地,不停清擾著我們, + - 他們不斷地掠奪我們的物資,綁架村民!甚至拿走我祖父給我的傳家寶! + - 不知道他們到底想要什麼,但我要他們離開! + - 弄清楚他們想做什麼,並將他們解決,順便把我祖父給我的傳家寶帶回來! + - 我們不知道他們想要什麼,但我們需要他們離開! + - 弄清楚他們在做什麼,處理他們並帶來 + - 我&e祖父的傳家寶&f!! + questAcceptDialog: + - '&8[Piscis村長]&f 跟著路走,就會到達強盜營地!' + - + - + - 一定要把我祖父給我的傳家寶帶回來!拜託! + - '&8&o我應該去附近的強盜營地清除他們。' + questCompleteMessage: + - '&8[Piscis村長]&f 我看到你回來了!你帶來好消息了嗎?' + - '&8&o你把營地的事告訴 Piscis 酋長,然後交出傳家寶。' + - + - + - + - + - '&8&o看來酋長已經準備好告訴我如何離開這裡了。' +primis_main_quest_4: + customObjectives: + Objective1: + dialog: + - '&a[Petrae]&f &2Chief Piscis&f sent you? Unfortunately the passage is closed, and the &cElemental&f guards it...' + name: '&9藍色花道!' + questLore: + - 我們必須將強盜營地的調查結果報告給Pontis Mille! + - '但目前山口被一個古老且強大的魔像守護著,必須不惜一切代價避開!' + - 跟著 &9藍色的花朵 &0沿著小路,會到達山間的秘密通道! + - 登山嚮導將在 &9藍色的花間 &0小路等你! + - 沿著小路的&e藍色的花朵&f, + - 他們會帶你到一個秘密通道 + - 穿過群山! + - 登山嚮導會在最後等你 + - 跟著&9藍色花朵&f走! + questAcceptDialog: + - '&8[Piscis村長]&f 山口被一個極其危險的傀儡守護著,你現在可能無法擊敗它!' + - + - + - '&8&o我應該遵循 &9&o藍色的花 &8&o尋找 登山嚮導!' + - '&8&o提示:跟蹤任務,將幫助您更輕鬆地找到您的目的地!' + - '&7&o提示:跟蹤任務,將幫助您更輕鬆地找到您的目的地!' + questCompleteMessage: + - '&8[Petrae]&f 你確定要冒險嗎?我可以幫你...' + - '&8&o看來 Petrae 對我有要求。' +primis_main_quest_5: + name: '&5水晶魔像' + questLore: + - 需要通過嗎?你錯過了,我的朋友, + - 一個 &5水晶魔像 &0侵入了我們的通道並將其關閉, + - 如果你真的要去布里奇波特,你必須先打敗他! + - 如果你真的必須去Gladius, + - 你必須先打敗這個&c元素&f! + questAcceptDialog: + - '&8[Petrae]&f 你想試圖打敗 &5水晶魔像? &f祝你好運!' + - + - + - '&8&o看來我必須打敗 &5水晶魔像&8&o。' + questCompleteMessage: + - '&8[Petrae]&f 了不起!我看到你打敗了 &5水晶魔像&8&o,顯然你很有前途' + - 既然結束了,那就讓我告訴你通往&dGladius&f的道路! +primis_main_quest_6: + customObjectives: + Objective1: + dialog: + - '&a[Filius] &fYou made it through the mountain! You don''t see that every day.' + - + - + - '&7&oSeem like &aFilius&7&o can help me find the way to &dGladius&7&o.' + name: '&5農莊' + questLore: + - 通往 Pontis Mille 的道路很容易找到,但周圍危機四伏。 + - 我和這附近的農莊主是好朋友。如果你告訴他是我派你來的,我相信他們會願意指引你前往 Pontis Mille ,並告訴周圍地區的資訊。 + - 祝您旅途愉快,注意安全! + - 我和&a農場主&f是好朋友 + - 在路上。如果你告訴他們是我派你來的,我敢肯定 + - 他們會告訴你如何安全到達 &dGladius&f 和 + - 給你有關周邊地區的消息。 + - 祝您旅途愉快,注意安全! + questAcceptDialog: + - '&8[Petrae]&f 告訴農莊主是我派你來的,雖然我有一段時間沒見到農莊主了。' + - + - + - 旅途平安! + - '&8&o我應該沿著通往農莊的路去和它的主人談談。' + questCompleteMessage: + - '&8[Petrae]&f 了不起!我看到你打敗了 &5水晶魔像&8&o,顯然你很有前途' + - 既然結束了,那就讓我告訴你通往 Pontis Mille 的道路! + - '&7&o我應該和&aFilius&7&o談談,了解如何去&dGladius&7&o,也需和他的&a母親&7&o談談,看看我能提供什麼幫助。' +primis_main_quest_7: + customObjectives: + Objective4: + dialog: + - '&a[General Hasta] &fI can''t believe you made it past the enemies.' + - You are exactly the kind of help we need right now! + - '&7&oSeems like I should talk to &aGeneral Hasta&7&o.' + name: '&5通往Gladius的道路' + questLore: + - 最近,&dGladius&f上空被煙霧壟罩著。 + - 我無法知道發生了什麼,因為一艘船擋住了去路,當我們接近船時,會被一群看起來像亡靈的生物襲擊,所以我們逃跑了。 + - 恐怕你必須強行穿過這艘船才能到達 Gladius。如果你幫助減少那艘船上的亡靈數量,我相信他們會獎勵你的! + - 我們被一群看起來像不死生物的生物襲擊了 + - 當我們接近&d船&f時,我們就逃跑了。 + - 恐怕您將不得不強行通過 + - '&d船&f以到達 &dGladius&f 。我相信他們會' + - 如果你幫助減少那艘船上的&c亡靈&f數量,就獎勵你! + questAcceptDialog: + - '&8[Filius] 路上要小心,顯然 &dGladius&f 那發生了什麼事情。' + - + - + - '&7&o我應該沿著前往 &dGladius&7&o 的小路走,並在路上順便清除一些亡靈水手。' + questCompleteMessage: + - '&8[Hasta將軍]&f 你是從 Pontis Mille 派來的增援部隊嗎?其他人在哪裡?你是信使嗎?' + - '既然結束了,那就讓我告訴你通往 Pontis Mille 的道路!' +primis_main_quest_8: + name: '&5恢復希望' + questLore: + - 我們從未預見到這次入侵的到來。 + - 他們在夜深人靜的時候來了,又猛又快地襲擊了我們。不知不覺,半個城市都被佔領了。 + - 士氣低落,這裡的每個人都經歷了失去的痛苦,我們自己的親人在街上遊蕩,儘管心痛,但我們仍需振作起來,鼓舞士氣,否則我們將無法繼續向前! + - 在我的豪宅的金庫裡,有一份極其重要的文件。這是與 Pontis Mille 創始人的書面承諾,將在我們急需幫助時為我們提供幫助, + - 取回文件,事成後,Pontis Mille 會張開雙臂歡迎你,只要有小小的希望,士兵們就會戰鬥到最後一刻。 + - 穿過街道,生活已回不去。 + - 我們需要振作起來,鼓舞士氣, + - 否則我們將看不到另一個黎明! + - 回到我的&d豪宅&f,在我的金庫裡,有一份&e文件&f + - 最重要的。這是一個書面承諾 + - '&dPontis Mille&f 的創始人之一 曾答應我們' + - 在迫切需要的時候提供援助,現在正是需要他們的幫助。 + - 取回&e文件&f,把它帶給我,然後 + - 我保證你會在 &dPontis Mille&f 受到歡迎 + - 我們的士兵將戰鬥到最後一刻 + - 這份文件,將變成士兵們堅持下去的理由。 + questAcceptDialog: + - '&8[Hasta將軍] 文件在我的豪宅裡,一定要把它帶回來,如果有時間,也可幫助在城裡的其餘人。' + - '&8&o我應該詢問其他人是否需要幫忙,然後前往的豪宅。' + questCompleteMessage: + - '&8[Hasta將軍]&f 你成功了!如果我們有很多像你一樣的人才,那麼這座城市一開始就不會被佔領!' + - 在你走之前,你能幫我一個小小的忙嗎? + - '&8&oHasta將軍似乎想和我談談。' +primis_main_quest_9: + name: '&5Gladius的冠軍' + questLore: + - 在前往 Pontis Mille 之前,需要你幫忙尋找個人, + - 我們的英雄最後一次出現在雕像附近擊退了一大群敵人, + - 自入侵開始以來,就再也沒收到他任何消息,現在我們擔心他已遭遇不測, + - 請去看看他,如果你找到他時他已受到詛咒的話……請幫助他解脫。 + - 自從入侵事件後,我們再也沒收到他的消息 + - 於是我們開始做最壞的打算, + - 請去附近找他。如果你找到他並且... + - 他已變成了這些亡靈之一……請讓他擺脫詛咒。 + questAcceptDialog: + - '&8[Hasta將軍] &f前往雕像,我相信我們的英雄很容易被找到。' + - '&7&o我應該去&d雕像&7&o那裡調查一下&cGladius英雄&7&o的下落。' + questCompleteMessage: + - '&8[Hasta將軍]&f......最糟糕的事情已經過去了,我會讓這些傢伙為殺死我兒子的事情付出代價。' + - '&8&o似乎哈斯塔將軍對我有一些離別之詞。' +primis_ogre_mines_clear: + name: '&2食人魔與礦工' + questLore: + - 我們的採礦營地被佔領了! + - 我們需要幫助! + - 我真的不知道發生了什麼,但我們需要清理營地並與老維圖斯交談! + - 前往營地並與&aOld Vetus&f交談! + questAcceptDialog: + - '&8[Metus]&f 你要幫忙嗎?請快點,營地就在這邊!' + - '&8&o我應該清理營地並與老維圖斯交談。' + questCompleteMessage: + - '&8[Vetus Fossores]&f 你是來幫忙的?太棒了,我們現在絕對需要幫助!' + - '&f這裡有一些東西可以幫助你清理營地!' +primis_ogre_mines_lost_bretheren: + customObjectives: + Objective1: + dialog: + - '&a[Fortis Fossores] &fWhat do you want? What, &aFugit&f sent you? What for? The mines were overrun? Hah, I didn''t even notice!' + - + - + - + name: '&5失落的弟兄' + questLore: + - 礦井被食人魔佔領了! + - 在一片混亂中,我和我弟弟在礦井裡走散了,我擔心他的安全! + - 他是一個有點古怪的人,非常專注於採礦。你見過他就知道了! + - 請把他帶回這裡,或者至少告訴我他是否安全。我會給你一些報酬! + - 你見過他就知道了! + - 請把他帶回這裡,或者至少告訴我他是否安全。 + - 我會讓你感覺這些回報是值得的! + questAcceptDialog: + - '&8[Fugit] &f請找到我的兄弟,並確保他沒事!' + - '&8&o我在被食人魔佔領的礦井裡找到了弗吉特的兄弟。' + questCompleteMessage: + - '&8[Fugit Fossores]&f 我哥說什麼?啊,他就是這樣,太專注於他的工作,沒有注意到整個地方都被佔領了!' + - 下次見到他我會和他好好談談的! + - + - +primis_ogre_mines_old_miner_quest: + name: '&2幸運鎬' + questLore: + - 在我們採礦的時候,我們遇到了一個充滿怪物的神秘洞穴! + - 我跑的時候掉了我最喜歡的鎬,我需要你的幫助去拿! + - 我確定 &4食人魔魔法師 &0 撿了我的 &6幸運鎬 &0,幫我把他搶回來! + - 你回來的時候我給你準備了一些小飾品。 + - 把我的幸運鎬從那個畜生手裡拿回來! + - 你回來的時候我給你準備了一些小飾品。 + questAcceptDialog: + - '&8[Vetus Fossores]&f 那個食人魔應該不遠!你可以在右邊的洞穴中找到他,在坍塌區域之前。' + - 他應該有鎬,畢竟食人魔喜歡閃亮的東西! + - '&8&o我應該打敗 &4食人魔酋長&8&o.' + questCompleteMessage: + - '&8[Vetus Fossores]&f 你得到了我的幸運鎬? 真棒!' + - '&f這是你的獎勵!' +primis_pontis_groves_acrobatics: + customObjectives: + Objective1: + dialog: + - '&a[Idoneitatem Hominem]&f Congratulations!' + name: '&2雜技' + questLore: + - 所以你認為你有你所需要的。 + - 你足夠健康,你足夠快,你足夠強壯嗎? + - 平台、葡萄酒、危險的高度。所有你想要的! + - 終極挑戰就在眼前! + - 好的好的。我和我弟弟可能有點無聊,上了一整門雜技課。 + - 目標是使用葡萄酒和雜技從一個平台到另一個平台,並完成課程。 + - 如果您完成課程並到達終點。 (順便說一下,這是一個球體。) + - '您將獲得一件非常漂亮的物品!' + - + - + - 您將獲得一個非常好的&e物品&f作為獎勵! + questAcceptDialog: + - '&8[Posuere Hominem]&f 您可以在該隧道的盡頭找到課程的起點。' + - + - + - '&8[Posuere Hominem]&f 不要忘記在課程結束時與我的兄弟交談以獲得獎勵!' + - '&8&o我應該去課程的開始。' + questCompleteMessage: + - '&8[Idoneitatem Hominem]&f 應得的!希望你沒有作弊!如果可以的話,試著打破我的記錄。' +primis_pontis_groves_caught in the web: + name: '&2被網絡捕獲' + questLore: + - 所以他們在格羅夫的某個地方有一個巢穴。 + - 這可以解釋為什麼他們的人口猛增。 + - + - + - 如果您能找到巢穴並將其清除,那就太好了。 + - 我們將為您製作一些精美的蜘蛛腿靴作為獎勵! + questAcceptDialog: + - '&8[King Nemian]&f如果有一個巢穴,我相信它會被蜘蛛網包圍。 - '&8&o我應該找到蜘蛛巢並將其清除。' + - '&7&o我應該找到&d蜘蛛巢&7&o並將其清除。' + questCompleteMessage: + - '&8[King Nemian]&f哈!我知道我們可以指望你!' + - '&8[King Nemian]&f這是你的好靴子,當之無愧!' +primis_pontis_groves_elf_stole_from_my_shelf: + name: '&2小精靈從我的架子上偷了重要的東西' + questLore: + - 災難襲擊了我們的小洞。 + - 不久前,我們可愛的家被精靈強盜襲擊了。 + - 幸好當時我們不在家,所以沒有人受傷。 + - 我們設法更換了大部分財產。 + - 但他們拿走了我放在架子上的傳家寶。 + - 如果您願意嘗試為我取回它,我將不勝感激。 + - 我做了最好的燉菜,我很樂意與你分享一些作為獎勵。 + questAcceptDialog: + - '&8[Luxuria Gorgonius]&f 傳家寶非常有價值,我相信他們會把它放在更安全的地方。' + - '&8&o我要去取回傳家寶。' + questCompleteMessage: + - '&8[Luxuria Gorgonius]&f 天啊!你找到了!' + - '&8[Luxuria Gorgonius]&f 對於你剛剛為我所做的一切,世界上沒有足夠的感謝。' + - '&8&o這道燉菜應該讓你吃一段時間。' +primis_pontis_groves_into_the_next_hole: + customObjectives: + Objective1: + dialog: + - '&a[Phygia Gorgonius]&f Time to kick those &cElves&f out for good!' + name: '&2進入下一個洞...' + questLore: + - 如果你有空,這裡還有很多工作要做。 + - 我們有一些嚴重的精靈問題, + - 但我已指定 Phygia 來處理這些問題。 + - 去這個旁邊的洞和 Phygia Gorgonius 談談。 + - 他將能夠告訴您更多信息以及需要做什麼。 + questAcceptDialog: + - '&8[King Nemian]&f 就在這個旁邊的洞,不能錯過! - '&8&o我應該去和Phygia Gorgonius談談.' + - '&7&o我應該去和&aPhygia Gorgonius&7&o談談。' + questCompleteMessage: + - '&8[Phygia Gorgonius]&f 讓我們談談...' + - '&8&o我應該聽聽 Phygia Gorgonius 的意見。' +primis_pontis_groves_lighthouse_1: + customObjectives: + Objective1: + dialog: + - '&a[Alanus Secundas] &fHas the &dGrove&f sent you?' + name: '&2餵病人' + questLore: + - 流浪者,我能幫你一個簡單的忙嗎? + - + - + - 但是自從麻煩開始以來,我們就不能離開我們的小樹林。 + - 你能不能給家人帶來他們最新一批的食物。 + - 如果你能快點就好了,距離上次交貨已經有一段時間了。 + questAcceptDialog: + - '&8[King Nemian]&f 當你離開住宅時,燈塔是筆直的,向左一點。' + - '&8&o我應該去燈塔。' + questCompleteMessage: + - '&8[Alanus Secundas]&f 我很感激!我們剛開始沒有食物。' + - '&8[Alanus Secundas]&f 你忙嗎?' + - '&8&oAlanus 似乎想和我說話。' +primis_pontis_groves_lighthouse_2: + customObjectives: + Objective1: + dialog: + - '&8[Jeeves]&fOh, hello there again!' + - '&8[Jeeves]&f They do not need the food anymore? I was just about to go shopping.' + - '&8[Jeeves]&f So kind of you to come here and let me know.' + name: '&2Jeeves!' + questLore: + - 嗯,在你來之前。旅商吉維斯路過。 + - 我們問他能不能去給我們弄點吃的。 + - + - + - + - + questAcceptDialog: + - '&8[Alanus Secundas]&f 當你離開住宅時,燈塔是筆直的,向左一點。' + - '&8&o我應該去燈塔。' + questCompleteMessage: + - '&8[Jeeves]&f 他們不再需要食物了嗎?我正要去購物。' + - '&8[Jeeves]&f 真好,你來這裡告訴我。' +primis_pontis_groves_population_control: + name: '&2人口控制!' + questLore: + - 哦,我很高興終於有人來幫助我們了。 + - 我們的小樹林裡有一個大的蛛形綱動物問題。 + - 這些天有這麼多的蛛形綱動物,你甚至不能 + - 在沒有討厭的蟲子的情況下進行愉快的晚上散步 + - 從陰影中向你跳來跳去。 + - 很明顯,他們的人口數量需要認真剔除。 + - 哦!請把任何還處於良好狀態的蛛形綱動物的腿帶給我。 + - 我們用它們來製造小型起重機和抓取器。 + questAcceptDialog: + - '&8[King Nemian]&f 你會發現它們潛伏在樹蔭下。' + - '&8&o我需要找到森林爬行者並殺死它們。' + questCompleteMessage: + - '&8[King Nemian]&f很高興看到你回來了,而且還有很多腿!' + - '&8[King Nemian]&f你認為他們的巢穴可能就在附近?讓我們多談談這個' +primis_pontis_groves_tree_climbing_elf_bandits: + name: '&2爬樹精靈土匪!' + questLore: + - + - + - 蜘蛛還不夠, + - 現在這些喜歡陰影的便便堅果決定在我們的樹上定居! + - + - + - + - + - 以優越的人數強行進入。 + - 好吧,他們得到了一些好的結果, + - 一看你,我就知道你可以對付幾個石巨人! + - 我相信一些精靈對你來說不是什麼大問題。 + - + - + questAcceptDialog: + - '&8[Phygia Gorgonius]&f 我敢肯定,如果你找到一個有陰涼的地方,然後抬頭看,很難錯過他們的樹屋,你會發現很多。' + - '&8&o我應該在菲吉亞大發雷霆之前去照顧這些精靈。' + questCompleteMessage: + - '&8[Phygia Gorgonius]&f 我的朋友!哈哈!很高興再次見到你!' + - + - + - '&8&o精靈們再也不會打擾菲吉亞了。' +primis_pontis_mille_fields_berry_crazed_wolf: + name: '&2漿果瘋狂的狼' + questLore: + - 哦,天哪,我不知道這些 &c紅木石獵犬&f 出了什麼問題。 + - 當我不在或睡覺時,他們不斷進入&d漿果農場&f, + - 你會認為他們來這裡吃漿果,但不是! + - 他們用嘴裝載並攜帶它們 + - 在森林深處的某個地方。 + - 我的意思是他們是&c獵犬&f!他們為什麼還要偷漿果。 + - 好吧,我想這沒關係,我有一個問題要問。 + - 你能去清除 + - '&9漿果農場後面的區域&f,' + - 並帶回&e偷來的漿果&f。 + - 我有很多餡餅要做,他們偷來的漿果已經熟透了。 + questAcceptDialog: + - '&a[Dordalus Nasica]&f我只看到 &c紅木石獵犬&f 偷了漿果。' + - '&7&o我應該去殺死&c&o紅木石獵犬&7&o並收集他們掉落的&e&o偷來的漿果&7&o。' + questCompleteMessage: + - '&a[Dordalus Nasica]&f 哦,太棒了,你做到了,你能再幫我一個小忙嗎?' + - '&7&o 似乎 &d&oMilonia&7&o 還有工作要委託我。' +primis_pontis_mille_fields_camping_hunters: + customObjectives: + Objective1: + dialog: + - '&a[Scribonia Ingenvinus]&f Yes?' + name: '&2野營獵人' + questLore: + - 希望我沒有打擾到你。你看起來像一個冒險家。 + - 我們在&d貧民窟&f沒什麼可做的, + - 大多數人都喜歡在&d田野&f裡閒逛,打發時間。 + - 不幸的是 + - '&c怪物&f開始在&d田野&f周圍遊蕩。' + - 我們聽說有些獵人在&d田野&f附近建立&d營地&f。 + - 如果你能去那和他們談談,請他們協助對付這些&c怪物&f... + questAcceptDialog: + - '&a[Augustina Verrucosis]&f 他們的&d營地&f 應該在這兒西北的某個地方。' + - '&7&o我需要前往&d&o獵人營地&7&o.' + questCompleteMessage: + - '&a[Scribonia Ingenvinus]&f 幫助&d貧民窟&f解決他們的&c怪物&f問題?' + - 讓我們多談談。 + - '&7&o我應該和&a&oScribonia&7&o談談,聽聽她要說什麼。' +primis_pontis_mille_fields_camp_hunter_three_times_hunter: + name: '&2Hunter three times hunter' + questLore: + - 所以你找到了&aVolumnia&f。感謝偉大的獵人,她沒事。 + - 既然你幫助了 &aVolumnia &f並證明了自己是一個善良的靈魂。 + - 友好的挑戰怎麼樣。我願意為你提供一些不錯的 + - 如果您面對挑戰並取得勝利,優質盔甲。 + - 挑戰涉及狩獵 + - '&c三隻巨獸&f散落在 Pontis 各處。' + - 在兩座山聳立的橋下游泳的&c野獸鱈魚Furiosa&f。 + - '&c野獸爬行者 Megdun&f 在陽光普照的小樹林上沉睡。' + - 在兩個西部山峰之間跳舞,你會發現 + - '&c野獸穿刺者 Uladzimir' + - + - + questAcceptDialog: + - '&a[Milonia Majus]&f 拿著這個設備,它會粗略地引導你到他們的位置。' + - '&7&o我該去挑戰&c&o三大巨獸&7&o了。' + questCompleteMessage: + - '&a[Milonia Majus]&f 你已經回來了。而且你帶來了我要求的所有三樣東西作為證據。' + - + - + - 好了,關於我,這是你承諾的獎勵! + - '&7你交還野獸追踪器。' + - '&a[Milonia Majus]&f我差點忘了那件事,謝謝!' + - 直到我們再次遇見冒險者! +primis_pontis_mille_fields_do_it_yourself: + name: '&2自己試試' + questLore: + - 對付&c怪物&f?好吧,我可以告訴你,我們已經這樣做了。 + - 他們太多了,我們還不夠。 + - 我們一在這裡&d扎營&f就開始獵殺牠們。 + - 但他們的數量似乎並沒有下降。 + - 這還不是最糟糕的。 + - 我們發現了一個巢穴和一頭巨大的&c古老野獸&f ! + - 好吧,既然你已經一件件地到達了我們的&d營地&, + - 我假設你自己很有能力。 + - 加入狩獵怎麼樣?如何? + questAcceptDialog: + - '&a[Scribonia Ingenvinus]&f 我就知道你會說是的!我看你已經裝備精良了。' + - 好的,這就是我要你做的。 + - + - + - 其次,我需要你殺死 5 隻&c長角牛&f和 6 隻&c短角牛&f。 + - 明白了嗎?好的。完成後向我報告。 + - '&7&o我應該殺死 &c&o巨大野獸&7&o 並殺死 5 隻 &c&o長角牛&7&o和 6 隻 &c&o短角牛&7&o。' + questCompleteMessage: + - '&a[Scribonia Ingenvinus]&f我必須說我印象深刻。' + - 顯然,您不僅僅是“有能力”。 + - 感謝您的幫助,剩下的我們可以自行處理。 + - 之後再見,偉大的獵人。 +primis_pontis_mille_fields_feeding_the_hungry: + customObjectives: + Objective3: + dialog: + - '&7You hand the over the bread and the flour.' + - '&a[Rufia Tertulus]&f I don''t know what to say. My children will be so happy!' + - '&7The woman bows to you in deep appreciation.' + Objective4: + dialog: + - '&a[Fabia Praetextus]&f I guess fantasies do come true sometimes. I am eternally grateful to you kind sir.' + Objective1: + dialog: + - '&a[Lena Lucan]&f Fresh bread! I cannot thank you enough!' + Objective2: + dialog: + - '&a[Tranio Florens]&f Wow! The day just keeps getting better!' + - Thank you for the flour kind soul. + name: '&2餵飽飢餓的人' + questLore: + - 我能感覺到你的胸膛裡有一顆很好的心臟在跳動。 + - 不是每個人都像你我一樣幸運。 + - 有一些可憐的靈魂生活在 &dPontis Mille 貧民窟&f. + - 一段時間以來,我一直在努力 + - 是時候生產剩餘的麵包和麵粉了。 + - 你介意拿這些袋子小麥和這些麵包堆嗎? + - 然後和他們一起去 &d貧民窟&f 將它們分發給有需要的人? + - 我已經這樣做了一段時間,但我的左腳受傷了, + - 所以我現在不能走太多路。 + questAcceptDialog: + - '&a[Daemones Maritialis]&f 我希望世界上有更多像你這樣的人。' + - '&d貧民窟&f 就在這裡的正北,你可以看到遠處的建築物。' + - '&7&o我應該去 &d貧民窟&7&o 並將食物分發給有需要的人。' + questCompleteMessage: + - '&a[Augustina Verrucosis]&f &2Daemones&f 是他請你送東西到這裡來的。' + - + - + - 謝謝陌生人,我的家人不會忘記的。 +primis_pontis_mille_fields_fruity_hound: + name: '&2果味獵犬' + questLore: + - 既然你是我的 NUMBER ONE 漿果回收代理者, + - 我還有一個任務要交給你。 + - 正如你所看到的,我們在我們的土地上種植了一些非常大的漿果 + - 小&d漿果農場&f這裡。 + - 有一個 + - '我正在為一場比賽種植&e特殊漿果&f。' + - 但是當我走到&d漿果農場&f時,我看到了一個 + - '&c果味的紅木石獵犬&f拿著我珍貴的漿果跳向灌木叢。' + - 他把它折斷,帶走了。 + - 它的下顎抓住了漿果的莖,所以 + - 我希望它仍然應該是一體的。 + - 如果你去殺死野獸並帶回我的 + - '&e特殊漿果&f,我會很感謝你' + - 等你回來。 + questAcceptDialog: + - '&a[Dordalus Nasica]&f 我想我看到&c獵犬&f進入了農場西北部的&d紅杉林&f。' + - '&7&o我應該去殺死&c&o果味獵犬&7&o,看看&e&o特殊漿果&7&o是否被破壞。' + questCompleteMessage: + - '&a[Dordalus Nasica]&f 是的!那是我的寶貝!很好,很完整,連口水都沒有!' + - + - + - + - +primis_pontis_mille_fields_not_on_my_farm: + name: '&2不在我的農場!' + questLore: + - 最近&c老鼠&f問題,讓我快發瘋了。 + - 他們不斷進入我們的小農場,吃掉我們所有的商品! + - 你有沒有機會去降低他們的人數? + - 小心,有很多。 + - 哦,我差點忘了告訴你。 + - 如果你看到一隻吃得很好的&c大老鼠&f,不要理會它。 + - 它長得又大又肥,你需要幾天才能殺死它。 + questAcceptDialog: + - '&a[Milonia Majus]&f 我相信您已經注意到他們喜歡在路徑區域周圍活動。' + - '&7&o我應該去殺死那些在通往&dPontis Mille&7&o的小路上徘徊的&c老鼠&7&o。' + questCompleteMessage: + - '&a[Milonia Majus]&f 太感謝了!我們現在可以回去製作美味的商品了。' +primis_pontis_mille_fields_surprise_me_with_flour: + customObjectives: + Objective3: + dialog: + - '&a[Adulescens Lupis]&f I heard the farm was having &cRat&f problems. Three sacks of flour coming up, no problem!' + Objective1: + dialog: + - '&a[Dinia Niraemius]&f Flour? Sure, one sack of flour coming up!' + Objective2: + dialog: + - '&a[Daemones Maritialis]&f The farm needs more flour eh? Here ya go, two sacks!' + name: '&2用麵粉給我驚喜' + questLore: + - 哇,你真得心應手,你是否願意幫助我個小忙。 + - 因為&c老鼠&f,使我們的麵粉庫存完全不夠。 + - 所以我們需要全新的一批麵粉。 + - 風車應該有很多。 + - 去收集麵粉,和我一起把它放回這裡。 + - 我會支付給你高額的報酬! + questAcceptDialog: + - '&a[Milonia Majus]&f 您需要從所有三個&d風車&f中收集麵粉。' + - '&7&o我需要照訪三個&d風車&7&o並收集它們生產的麵粉。' + questCompleteMessage: + - '&a[Milonia Majus]&f 這應該會持續很長時間!' + - 希望我們的麵粉訂單不會變得太大,哈哈。 +primis_pontis_mille_fields_wellness: + name: '&2健康' + questLore: + - 很高興見到你! + - 我爬下井時,&c夢魘鼠&f突然衝出來攻擊我。 + - 在跌倒時弄傷了胳膊和腿。 + - 啊,我的眼睛裡還殘留著一些有毒的唾液。 + - 謝天謝地,我設法爬上了這個小 + - 窗台,才勉強將它解決。 + - 好尷尬,不知道現在哪個更痛,是我的身體還是我的自尊。 + - 我有一些 + - '&e急救設備&f' + - 我放在&d獵人營地&f中的箱子裡。 + - 你可以幫忙拿一下嗎?還有,請別告訴任何人 + - 這裡曾發生什麼事情。 + - '差點死在井裡......這是我一生的汙點,需要抹去......' + questAcceptDialog: + - '&a[Volumnia Zoilus]&f 獵人營地在正南方,尋找有帳篷的地方。' + - '&7&o我需要去&d&o獵人營地&7&o幫 &a&oVolumnia&7&o 拿他的&e&o急救設備&7&o.' + questCompleteMessage: + - '&a[Volumnia Zoilus]&f 回來了?把東西給我。' + - 不用擔心我,我很快就會把自己治療好。 + - 謝謝你為我做的一切!你救了我的一條命! +primis_pontis_mille_field_check: + customObjectives: + Objective1: + dialog: + - '&a[Augustina Verrucosis]&f Oh, this is quite important! I will let the residents know.' + - Thank you for delivering these important documents. + name: '&2現場檢查' + questLore: + - 如果我能麻煩您處理一些交付任務。 + - 我這裡有一些重要的文件需要送到 + - '&d貧民窟&f和&d田野農場&f,' + - 應該來接他們的士兵還沒有到。 + - 這是緊急事件,我們不能再等了。 + - 不幸的是,我身上有重要的任務,使我無法離開崗位。 + - 如果你能幫我,對我們會有很大的幫助。 + questAcceptDialog: + - '&a[Godefridus Novation]&f你會協助嗎?太棒了!' + - 您可以沿著&9黃色小路&f前往貧民窟。 + - '&d田野農場&f就在貧民窟的外面,沿著小路走。' + - 對了!請小心在田間的那些老鼠! + - '&7&o我應該去&d&o貧民窟&7&o,再去&d&o田野農場&7&o。' + questCompleteMessage: + - '&a[Milonia Majus]&f 文件?讓我看看他們。嗯,看起來很正式。' + - 感謝您將這些文件送過來。 + - '&7&o看來 &a&oMilonia&7&o 可以請我協助來解決老鼠問題……' +primis_pontis_mille_fresh_rats_coming_up: + customObjectives: + Objective1: + dialog: + - '&a[Elite Guard]&f Plenty of rats inside.' + name: '&2新鮮的老鼠來了' + questLore: + - 沒有貓糧,但我想我可以幫助你 + - 找到更好的東西... + - 我聽到了幾個 + - '&a衛隊&f隊員們一直在處理' + - 城市暗處的鼠患。 + - 在那,或許你能得到一些 + - '&c老鼠&f 給你的貓朋友。' + questAcceptDialog: + - '&7&o我應該去城市下方看看能不能找到&a&o精英衛隊&。' + questCompleteMessage: + - '&a[Mew Meowzer]&f 喵。喵!敖~嗚。' + - '&7&o我應該讓貓安靜地享用它的飯菜。' + - '&7&o好像掉了什麼東西,嗯……' +primis_pontis_mille_hungry_friend: + customObjectives: + Objective3: + dialog: + - '&a[Melaenis Gelasius]&f Cat food? Where the heck did you manage to find a cat here...' + - No, I don't know where to get any cat food. + Objective4: + dialog: + - '&a[Sulpicio Panthera]&f I wish I could help, sorry.' + Objective1: + dialog: + - '&a[Royal Guard]&f Do I look like someone who keeps track of cat food?...' + Objective2: + dialog: + - '&a[Tyndarus Faustinius]&f Sorry, I have no idea.' + Objective5: + dialog: + - '&a[Tyndarus Columbanus]&f We used to have cat food around here somewhere, but heck knows what happened to it...' + name: '&2飢餓的朋友' + questLore: + - '&7&o怎麼了,小傢伙。' + - '&a[Mew Meowzer]&f 喵!' + - '&7&o 你餓了嗎?' + - '&7&o小傢伙想吃點東西嗎?' + - '&a[Mew Meowzer]&f 喵!!!' + - '&7&o我找找有沒有可以' + - '&7&o給你吃的東西。' + questAcceptDialog: + - '&7&o我應該詢問城裡有沒有人知道在哪可獲取些貓糧。' + questCompleteMessage: + - '&a[Modestus Aper]&f 貓糧?我不知道那件事。但...' + - '&7&o看來&a&oModestus&7&o可能知道些什麼……' +primis_pontis_mille_late_delivery: + name: '&2Late delivery' + questLore: + - I ordered some &eFishing Nets&f from + - '&dGladius&f that haven''t arrived yet. I wonder' + - if something might have happened to the + - shipment. If you are willing, I would pay you + - a small fee if you could go see what + - happened to the shipment and get the + - '&eFishing Nets&f for me.' + questAcceptDialog: + - '&a[Delphium Calpurnius]&f Last I heard my shipment of &eFishing Nets&f was supposed to be heading for &dGladius&f.' + - '&7&oI need to go look around &d&oGladius&7&o for &a&oDelphium''s&7&o shipment of &e&oFishing Nets&7&o.' + questCompleteMessage: + - '&a[Delphium Calpurnius]&f Those are the &eFishing Nets&f! Thank you so much!' + - '&a[Delphium Calpurnius]&f I invested a lot of my savings into these! Not sure what I would have done if you hadn''t found them.' +primis_pontis_mille_let_them_know: + customObjectives: + Objective3: + dialog: + - So Fortes sent you? I see. + - Your help would be much appreciated, aid me and my forces will be ready. + Objective1: + dialog: + - So Fortes has decided to take action. + - Help me finish my task, and my forces will be ready. + Objective2: + dialog: + - So Fortes has decided to act. + - If you could assist me with this task, then my forces will be ready. + name: '&2讓他們知道' + questLore: + - I am sorry that we cannot send aid to &dGladius&f right away. + - Ever since that new &cCounselor&f came, our ruler has not been himself. + - If you could reach out to the &aGenerals&f in the city and let them know + - that &dGladius&f needs help we might be able to to do something about it. + - 但不是在我們首先處理現有問題之前。 + - + - + - 去和他們談談,然後回來告訴我他們收到了消息。 + - 我會獎勵你的時間。 + questAcceptDialog: + - '&a[Fortes]&f Follow the &9orange path&f from the main room to find &aGeneral Bromia&f.' + - '&a[Fortes]&f At the end of the &9yellow path&f you will find the &aGeneral Rogerius&f.' + - '&a[Fortes]&f At the end of the &9shorter purple&f path you will find the &aGeneral Cylindrus&f.' + - '&7&oI need to talk to the three &a&oGenerals&7&o.' + questCompleteMessage: + - '&a[Fortes]&f You managed to contact them? Excellent!' + - '&a[Fortes]&f Here is your reward. Don''t spend it all in one place.' +primis_pontis_mille_lighthouse_1: + customObjectives: + Objective1: + dialog: + - '&8[Hegio Remus]&f Another letter? Thank you for bringing it to me.' + name: '&2快速交貨' + questLore: + - 在你去任何地方之前,你能把這封信給我嗎? + - 您可以在燈塔頂部找到它所需的。 + - 別擔心,燈塔就在我身後,穿過那扇門。 + questAcceptDialog: + - '&8[Fortes]&f 謝謝。' + - '&8&o我應該去和Pontis Mille的燈塔管理員談談。' + questCompleteMessage: + - '&8[Hegio Remus]&f 嘿,你有時間嗎?' + - '&8&o似乎Hegio Remus需要我和他談談。' +primis_pontis_mille_lighthouse_2: + customObjectives: + Objective1: + dialog: + - '&a[Jeeves]&f Oh, we meet again. It''s good to see you.' + - You have something for me? Oh, wow...that is quite the shopping list. + - I will have the items sent back to &aHegio&f as soon as possible. + - Thank you for stopping by. Hope we meet again. + - '&7&oI should let &aHegio&7&o know I delivered the note.' + name: '&2問 Jeeves' + questLore: + - 你介意打開傳送門給我的好朋友 Jeeves 發個便條嗎? + questAcceptDialog: + - '&8[Hegio]&f 非常感謝的朋友' + - '&8&o我應該去 Caeruleaum 村和 Jeeves 談談。' + questCompleteMessage: + - '&8[Hegio]&f 你送了紙條?感謝你!' + - '&8[Hegio]&f 你可以在我的後口袋裡拿一些燉兔肉。' +primis_pontis_mille_mines_goblined_up_in_the_maze: + customObjectives: + Objective3: + dialog: + - '&a[Hurt Guard]&f Am so I happy to see you!' + Objective1: + dialog: + - '&a[Injured Guard]&f Thank the skies!' + Objective2: + dialog: + - '&a[Wounded Guard]&f Finally, the rescue is here!' + name: '&2在迷宮中的哥布林' + questLore: + - 如果我能打擾你一秒鐘。 + - 既然你已經進入礦井了 + - 如果您能幫助我們解決一些問題,那就太好了。 + - 我們少了三名已派出的&a衛隊隊員&f + - 進入礦井追捕被詛咒的哥布林。 + - 我擔心他們可能發生了什麼事。 + - 這個被詛咒的哥布林應該是 + - 躲在礦井裡的某種迷宮裡。 + - 你能找到失踪的&a衛隊隊員&f嗎? + - 給我帶來哥布林死亡的證據。 + questAcceptDialog: + - '&8[Centurion]&f盡量不要迷失在迷宮中。' + - '&8[Centurion]&f願好運在你身邊,戰士!' + - '&8&o我應該冒險穿過礦井找到迷宮。' + questCompleteMessage: + - '&8[Centurion]&f他們還活著,很好,我們會派一些士兵盡快把他們救出來。' + - '&8[Centurion]&f我看到你也帶了頭,幹得好。' + - '&8&o希望人們在未來遠離迷宮。' +primis_pontis_mille_serious_sewage: + customObjectives: + Objective3: + dialog: + - '&a[Michelangelo]&f Tell that old man everything is in order!' + Objective4: + dialog: + - '&a[Raphael]&f Tell Rogerius I am alive and doing fine!' + Objective1: + dialog: + - '&a[Donatello]&f You can tell the General I am doing just fine!' + Objective2: + dialog: + - '&a[Leonardo]&f The General should not worry, I am ok!' + name: '&2嚴重的污水' + questLore: + - 如果您能勝任這項任務,那麼我可以使用您的幫助。 + - + - + - + - + - 他們有一個領導,我想他稱自己為 Shripper 什麼的。 + - 確保擺脫他,沒有頭的蛇不是威脅。 + - 如果你能去那裡減少小動物和麻煩製造者的數量 + - 那麼這將使我能夠將我的部隊分配給更重要的任務...... + - 我們之前也派了4個代理,我還沒有收到他們的消息。 + - + - + - 我似乎也放錯了我的個人下水道鑰匙 + - 如果你也能找回那些,那就太好了。 + questAcceptDialog: + - '&8[Rogerius]&f你可以通過 X 到達下水道' + - + - + - '&8&o我需要找到進入下水道的路並完成任務。' + questCompleteMessage: + - '&8[Rogerius]&f你完成任務了嗎?要是我還有十個像你這樣的男人就好了……' +primis_pontis_mille_star_gazing: + customObjectives: + Objective1: + dialog: + - '&a[Virgo Dexippus]&f Yes, what is it?' + name: '&2S凝視焦油' + questLore: + - 你為這座城市和它的人民做了這麼多。 + - 曾協助三名將軍,幫助過&dPontis Mille&f周邊地區 + - 解放了我們大量的力量和資源。 + - 我們現在可以派我們的部隊去幫助&dGladius&f了。 + - 但在我們採取行動之前,我希望你做的最後一件事。 + - 你應該去和觀星者談談。這是關於我們失去的歷史和元素的。 + - 一旦您與他們交談,他們將能夠告訴您更多信息。 + - 拿這張密封的紙條給他們看。 + - 拿這張密封的紙條給他們看。 + questAcceptDialog: + - '&8[Fortes Bellator]&f 您可以在天文台找到觀星者。' + - + - + - '&8&o我應該和天文台的觀星者談談。' + questCompleteMessage: + - '&8[Virgo Dexippus]&f 少校派你來的?那麼它一定很重要。' + - '&8&o我應該和處女座談談。' +primis_pontis_mille_stay_a_while_and_listen: + name: '&2稍等片刻,聽聽' + questLore: + - 把紙條遞給我,讓我看看。 + - 我們已獲准分享重要信息 + - 與您有關我們過去的信息。 + - 你一定做了一件很重要的事, + - 這些信息通常只與高層共享。 + - 'Stella 將與您分享我們的發現。' + questAcceptDialog: + - '&8[Virgo Dexippus]&f 與 Stella 交談並點擊劍開始聆聽。' + - '&8&o我應該和 Stella 談談並開始競技場挑戰。' + questCompleteMessage: + - '&8[Virgo Dexippus]&f 不要與任何人共享此信息。' + - '&8&o那真是一個故事。' +primis_pontis_mille_the_groves_call: + customObjectives: + Objective1: + dialog: + - '&a[King Nemian]&f &2General Bromia&a sent you?' + - Excellent, I knew we could count on him. + name: '&2小樹林呼喚' + questLore: + - 我們有責任保護 Groves 免受任何威脅。 + - 'Groves 國王尼米安已發出援助請求。' + - 討厭的小動物來到了小樹林和其他地方 + - 入侵者正在佔領樹木。 + - 如果你能去那裡解決這些問題 + - 那麼我的部隊就可以自由地來幫助 &dGladius&f + questAcceptDialog: + - '&8[Bromia]&f Groves 位於城市的北部。' + - '&8[Bromia]&f有一條小路穿過山。在地雷下方。' + - '&8&o我應該和尼米安國王談談。' + questCompleteMessage: + - '&8[King Nemian]&f你來得正是時候!' +primis_pontis_mille_to_lycan_or_not_to_lycan: + name: '&2去狼人還是不去狼人' + questLore: + - 如果你能幫忙,我可以獻出我的力量來幫助 Gladius + - 我們處理紅杉中的狼人危機。 + - 我們的部隊已經阻止狼人幾個星期了。 + - 我們只是無處可去,我們無法到達他們的巢穴。 + - 如果你能到達他們的巢穴並把它清理乾淨 + - 那麼紅杉可能會再次安全。至少更安全... + - 他們的巢穴位於損壞的紅木樹下。 + - 他們的&d巢穴&f位於&9被腐蝕的紅木樹下&f。 + - 應該很容易發現它,因為它周圍都是正常的樹,就它最特別。 + questAcceptDialog: + - '&8[Cylindrus]&f紅杉可以通過向北到達。' + - '&8[Cylindrus]&f向北行駛直到您到達火車站,然後向西行駛。' + questCompleteMessage: + - '&8[Cylindrus]&f狼人被淘汰了?很好!' + - 隨時在我們的營地休息,這裡隨時歡迎您。 +primis_pontis_mille_where_is_he_now: + customObjectives: + Objective1: + dialog: + - '&a[Gorenus Palis]&f My brother sent you looking for me?' + - Oh, I messed up again...I got real lost this time. + - I hope he isn't too mad. + - When you go back, please tell him I'm safe. + name: '&2飢餓的朋友' + questLore: + - 我和我的&a兄弟&f在路上 + - 從村裡回來。 + - 在我們的旅行中,我不得不繞道而行,所以我們分開了。 + - 我們應該在這裡見面的。 + - 但我已經等了很長一段時間。 + - 他是個路癡……也許他真的迷路了。 + - 我很擔心他。 + - 我願意付出高昂的報酬 + - 如果有人能找到他。 + questAcceptDialog: + - '&a[Rodenus Palis]&f 你真好,謝謝你提供幫助。' + - 如果你找到他,請馬上告訴我他在哪裡。 + - '&7&o我得去找&a&oRodenus&7&o的兄弟。' + questCompleteMessage: + - '&a[Rodenus Palis]&f 什麼!他到底是怎麼走到那的!' + - 唉,我現在就出發…… + - 謝謝你的幫助。這是承諾的精英幣。 +primis_pontis_redwoods_big_brown_logs: + customObjectives: + Objective1: + dialog: + - '&a[Magnus]&f Who are you? Oh, you came from &dPontis Mille&f.' + name: '&2大棕色原木' + questLore: + - 如果你能幫忙,我可以獻出我的力量來幫助 Gladius + - 我們處理紅杉中的狼人危機。 + - 我們的部隊已經阻止狼人幾個星期了。 + - 如果您能幫助我們,那就太好了。 + - 前往紅杉並與馬格努斯·卡斯托雷亞交談。 + - 他們會告訴你需要做些什麼來結束這一切。 + questAcceptDialog: + - '&8[Cylindrus]&f紅杉可以通過向北到達。' + - '&8[Cylindrus]&f向北行駛直到您到達火車站,然後向西行駛。' + - '&8&o我需要前往紅杉並與馬格努斯交談。' + questCompleteMessage: + - '&8[Magnus]&f 將軍派你來幫忙?' + - '&8[Magnus]&f 嗯……你最好乖一點。' +primis_pontis_redwoods_its_reyn_time: + name: '&2現在是雷恩時間!' + questLore: + - 我砍樹的時候,懷錶掉進了河裡。 + - 這是您看到的特殊手錶。充滿空氣,非常堅固。 + - 完全可以承受掉在上面的沉重原木,是的。 + - 我看到一個討厭的土匪把它舀起來放在口袋裡。 + - 我很確定我看到他拿著斧頭。 + - + - + - 也給你一個不錯的金錢獎勵! + questAcceptDialog: + - '&8[Reynus]&f 你可以在河對面找到土匪。' + - '&8&o我需要去殺死正確的強盜並收集手錶。' + questCompleteMessage: + - '&8[Reynus]&f 我會確保不再丟失它!' + - '&f你的獎勵我的好先生!' +primis_pontis_redwoods_nasty_little_bandits: + name: '&2討厭的小土匪' + questLore: + - 自從這些該死的土匪在河對岸定居以來,就一直沒有和平。 + - 他們一直在毀壞樹木,昨天我抓到了其中一棵 + - 試圖點燃這些巨樹中的一棵! + - 不久前,我被一個拿著斧頭的瘋子追趕, + - 我很確定那是土匪之一。 + - 更不用說他們一直試圖搶劫任何人 + - 在鋸木廠和我們這裡的好人有生意。 + - 適可而止。我願意付出好幣來結束這種瘋狂。 + questAcceptDialog: + - '&8[Ligna Crispian]&f 你會在河對岸找到它們。' + - '&8&o我應該去土匪營地把它清理乾淨。' + questCompleteMessage: + - '&8[Ligna Crispian]&f最後!稍安勿躁,謝謝!' +primis_pontis_redwoods_need_a_smoke: + name: '&2需要一根煙' + questLore: + - 我聽說你在那裡幫助了好老 Reynus。 + - 正如你所看到的,我再次用那把該死的鋸子割斷了我的腿。 + - 哦,別擔心我。我的腿很快就會再次痊癒。 + - 你看,問題是,當我等待我的腿痊癒時,我沒什麼可做的。 + - 這讓我有心情吃一些好的海雀。 + - 我為我的煙斗帶來了一些優質煙草, + - 但我不得不把它藏起來,以防那些土匪得到它。 + - 問題是,我完全忘記了我把它藏在哪裡! + - 我只記得把它埋在一棵樹附近。 + - 哪棵樹?誰知道! + - 聽著,我在這裡給你帶來了一筆不錯的交易。找到我的煙草,你就可以擁有 + - 我所有的金蘋果。 + questAcceptDialog: + - '&8[Lyco]&f 希望你盡快找到它。' + - '&8&o我應該去找煙草。' + questCompleteMessage: + - '&8[Lyco]&f 你找到了!哈哈!知道我可以依靠你!' +primis_terravilla_bipedal_examination: + name: '&2Bipedal examination' + questLore: + - I have been studying the &cTwo Legged Terrors&f that roam + - around &dTerravilla&f. Did you know that their population + - used to be much larger just some years ago. In fact it was + - the reason why the first settlers decided to build + - '&dTerravilla&f on top of the ruins and not down on the ground.' + - For some reason their numbers have really decreased. I was + - trying to get some &eSamples&f but trying to kill any of them is + - far beyond my skill. But you look like the sort of type who + - can handle a &cTwo Legged Terror&f or two. Interested in + - helping me out? + questAcceptDialog: + - '&a[Plautia Suilius]&f Six &eSamples&f should do it. Return to me once you have collected the &eSamples&f.' + - '&7&oI need to slay 3 &c&oTwo Legged Terrors&7&o and collect their &e&oSamples&7&o.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Great! Let''s have a look.' + - '&7&oI should hear what &a&oPlautia Suilius&7&o has discovered.' +primis_terravilla_drowning_terror: + name: '&2Drowning terror' + questLore: + - My theory was correct. I dissected the growth and found + - an organism inside. After careful examination I have + - determined that the organism is of aquatic origin. And + - not only that, they are capable of hijacking the host's + - brain. Once ready to hatch they make the host go to the + - nearest water source and drown themselves. The organism + - can then freely hatch and swim away. Whatever is + - infecting the &cTwo Legged Terrors&f must be living in + - a nearby river. You should go there and collect a + - '&ePerfect Sample&f of whatever organism is causing this.' + - I do not know if this is something that can affect humans + - but just in case you should kill a few of the organisms + - to make sure. + questAcceptDialog: + - '&a[Plautia Suilius]&f Come back here once you have collected a &ePerfect Sample&f.' + - '&7&oI need to go to the nearby river and collect a &e&oPerfect Sample&7&o of whatever is causing the infections.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Wow it looks like a fish, but it''s internal organs are different.' + - It must infect other creatures by releasing these tiny worm like meat particles... + - Let me have a look at you. Hmm, you seem fine, no traces... + - + - + - + - + - + - '&7&oI should make sure to stay away from the river...' +primis_terravilla_hog_on_my_porch: + name: '&2Bipedal examination' + questLore: + - He is sitting on the darn lift again! + - I cannot believe it! You there! + - You look like you can handle a large beast. + - I will pay you good money if you can get rid + - of that &cAnnoying Large Hog&f that keeps sitting + - on the lift. How are we supposed to get goods + - up and down this way. + questAcceptDialog: + - '&a[Dorippa Sarimarcus]&f Get rid of that hog right down there, see it?' + - '&7&oI need to slay the &c&oAlpha Razorback&7&o.' + questCompleteMessage: + - '&a[Dorippa Sarimarcus]&f Finally! I can move on with my life now! Thank you!' +primis_terravilla_razorbag: + name: '&2Razorbag' + questLore: + - If you are looking for work I got some for ya. + - I design and make heavy duty bags that I sell + - here at my little shop. So I am in need of + - leather. Thankfully there are plenty of + - '&cRazorbacks&f around these parts. If you are' + - interested I would like to hire you to go hunt + - them for their leather. I would need a considerable + - amount of leather. So this won't be a quick job. + questAcceptDialog: + - '&a[Telestis Senna]&f You will mostly find them roaming around here and towards the fields area.' + - '&7&oI need to go hunt the &c&oMature Razorback&7&o.' + questCompleteMessage: + - '&a[Telestis Senna]&f Yep, that will do it. In pristine condition too! Here is your coin, as promised.' +primis_terravilla_terrifying: + name: '&2Terrifying' + questLore: + - Well that is concerning. The sample you brought shows + - that they are slowly being drained of their nutrients. + - My hypothesis is that there is most likely a parasite + - attached to them that is causing this. You should go + - out there again and see if you can find any large + - '&eGrowths&f on their bodies, and then cut them off' + - and bring them back here. + questAcceptDialog: + - '&a[Plautia Suilius]&f I would only need two &eGrowths&f no more than that.' + - '&7&oI need to slay &c&oTwo Legged Terrors&7&o and collect two &e&oGrowths&7&o.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Excellent, these should do it.' + - '&7&oI should hear what &a&oPlautia Suilius&7&o has managed to find.' +test_quest: + name: 殺死測試Boss + questLore: + - '&c結束測試Boss的恐怖統治!' +xmas_quest_0: + name: '&2尋找丟失的禮物!' + questLore: + - + - + - 作為回報,我會讓你打開其中一個! + questAcceptDialog: + - '&8[&cSaint Nick&8]&f 謝謝!我會在這裡等你!' + questCompleteMessage: + - '&8[&cSaint Nick&8]&f 謝謝您的幫助!那裡還有一些丟失的禮物,如果您想提供更多幫助,請再次與我聯繫!' diff --git a/src/main/resources/translations/czech.yml b/src/main/resources/translations/czech.yml new file mode 100644 index 000000000..46bb1d48f --- /dev/null +++ b/src/main/resources/translations/czech.yml @@ -0,0 +1,13253 @@ +config: + noArenaPermissionMessage: '[EliteMobs] Nemáte oprávnění pro vstup do této arény!' +ItemSettings: + itemLoreStructureV2: + - '&7&m&l---------&7<&lEquip Info&7>&m&l---------' + - '&7Úroveň předmětu: §f$itemLevel §7Prestiž §6$prestigeLevel' + - '$weaponOrArmorStats' + - '$soulbindInfo' + - '$itemSource' + - '$ifLore&7&m&l-----------&7< &f&lLore&7 >&m&l-----------' + - '$customLore' + - '$ifEnchantments&7&m&l--------&7<&9&lEnchantments&7>&m&l--------' + - '$enchantments' + - '$eliteEnchantments' + - '$ifCustomEnchantments&7&m&l------&7< &3&lCustom Enchants&7 >&m&l------' + - '$customEnchantments' + - '$ifPotionEffects&7&m&l----------&7< &5&lEfekty&7 >&m&l----------' + - '$potionEffect' + - '&7&l&m-----------------------------' + - '$loreResaleValue' + shopSourceItemLores: '&7Zakoupeno z obchodu' + mobSourceItemLores: '&7Ukradeno od $mob' + loreWorths: '&7Hodnota $worth $currencyName' + loreResaleValues: '&7Prodává se za $resale $currencyName' + eliteEnchantmentLoreStrings: Elite + noSoulbindLore: '&7Nepoutáno k duši!' + preventEliteItemDisenchantmentMessage: '&c[EliteMobs] Can''t disenchant Elite Items!' + scrapSucceededMessageV2: '&8[EliteMobs] &2Scrapping succeeded $amount times!' + scrapFailedMessageV2: '&8[EliteMobs] &cVyřazení selhalo $amount!' + lowDurabilityItemDropMessage: '&8[EliteMobs] &cPadlé brnění kvůli nízké odolnosti! &8Opravte jej u NPC, abyste jej mohli používat!' + lowWeaponItemDropMessage: '&8[EliteMobs] &cDropped weapon due to low durability! &8Repair it at the NPC with scrap to use it!' + simlootMessageSuccess: '&8[EliteMobs] &2Rolled for loot and got $itemName &2!' + simlootMessageFailure: '&8[EliteMobs] &cRolled for loot and got nothing!' + directDropCustomLootMessage: '&8[EliteMobs] &2Obtained $itemName &2!' + directDropMinecraftLootMessage: '&8[EliteMobs] &aObtained $itemName &a!' + directDropCoinMessage: '&8[EliteMobs] &aObtained &2$amount $currencyName &a!' + directDropSpecialMessage: '&8[EliteMobs] &aObtained &2$amount $name &a!' + weaponEntry: '&7Elite DPS: &2$EDPS' + armorEntry: '&7Elitní zbroj &2$EDEF' +ProceduralItemGenerationSettings: + materialNames: + swordName: Meč + bowName: Luk + pickaxe: Krumpáč + spade: Lopata + hoe: Motyka + axe: Sekera + helmet: Helma + chestplate: Hrudní brnění + leggings: Kalhoty + boots: Boty + shears: Nůžky + fishingRod: Rybářský prut + shield: Štít + trident: Trojzubec + crossbow: Kuše + nameFormats: + - '$verb $itemType z $adjective $noun' + - '$itemType z $adjective $noun' + - '$noun $adjective $verb $itemType' + - '$verb $itemType' + - '$adjective $verb $itemType' + - '$verb' + - '$adjective $verb' + nouns: + - MagmaGuy + - Úsvit + - Západ slunce + - Nebe + - Peklo + - Anděl + - Archanděl + - Cherubín + - Seraf + - Démon + - Běs + - Netopýr + - Slepice + - Kráva + - Krávomůrka + - Prase + - Králík + - Ovce + - Chobotnice + - Vesničan + - Jeskynní pavouk + - Enderman + - Polární medvěd + - Pavouk + - Zombie Pigman + - Ohnivák + - Creeper + - Prastrážce + - Endermite + - Evoker + - Ďas + - Ochránce + - Husk + - Magmaslizoun + - Shulker + - Rybenka + - Skeleton + - Sliz + - Bludný kostlivec + - Vex + - Vindikátor + - Čarodějnice + - Wither Kostlivec + - Zombie + - Oslík + - Kůň + - Lama + - Mula + - Ocelot + - Wolf + - Železný golem + - Sněhulák + - Drak z Endu + - Wither + - Illusionér + - Papoušek + - Obří + - Zabijáček Zajíček + - Steve + - Wolfbane + - Chaos + - Aeon + - Drak + - Sphynx + - Mínotaurus + - Hádes + - Přísaha + - Oathbreaker + - Dezertér + - Betrayer + - Nefrit + - Světlo + - Temnota + - Oblivion + - Stín + - Prázdno + - Xeno + - Fanatik + - Vrchol + - Soumrak + - Soumrak + - Monstrum + - Elite Mob + - Urist + - Trpaslík + - Elf + - Ork + - Skřet + - Trpaslík + - Goliáš + - Drow + - Člověk + - Halfling + - Half-Orc + - Beholder + - Mind Flayer + - Owlbear + - Bulette + - Rust Monster + - Hill Giant + - Stone Giant + - Frost Giant + - Ohnivý obr + - Oblačný obr + - Storm Giant + - Kobold + - Lich + - Ork + - Umber Hulk + - Fighter + - Čaroděj + - Paladin + - Klerik + - Hraničář + - Lučištník + - Mág + - Tiefling + - Vlkodlak + - Upír + - Kentaur + - Catfolk + - Half-Giant + - Ogr + - Troll + - Rogue + - Barbarian + - Bard + - Druid + - Mnich + - Sorcerer + - Warlock + - Demon Hunter + - Death Knight + - Priest + - Shaman + - Warrior + - Basilisk + - Chimera + - Imp + - Dryad + - Gargoyle + - Djinni + - Efreeti + - Duch + - Hobgoblin + - Hydra + - Kraken + - Lamia + - Medúza + - Mimik + - Mumie + - Pegas + - Roc + - Satyr + - Tarrasština + - Abominace + - Ghúl + - Treant + - Jednorožec + - Přízrak + - Acolyt + - Gladiátor + - Rytíř + - Gryphon + - Raider + - Scout + - Špeh + - Thg + - Noble + - Guard + - Veteran + - Wyvern + - Abyssal + - Infernal + - Elemental + - Tauren + - Pandaren + - Sasquatch + - Forsaken + - Yeti + - Banshee + - Arachnid + - Undead + - Night Elf + - Blood Elf + - Draenei + - Worgen + - Warlord + - Čarodějnice + - Magi + - Sage + - Zloděj + - Assassin + - Templar + - Pán šelem + - Berserker + - Inventor + - Luchador + - Pirate + - Vanguard + - Voidblade + - Wisp + - Peasant + - Footman + - Swordsman + - Thrall + - Felhound + - Huntress + - Lovec + - Aarakorcra + - Aboleth + - Deva + - Planetar + - Solar + - Ankheg + - Azer + - Behir + - Death Tyrant + - Blight + - Bugbear + - Hugbear + - Bullywug + - Cambion + - Chuul + - Lich King + - Cockatrice + - Couatl + - Cyclops + - Titan + - Darkmantle + - Ancient One + - Demilich + - Balor + - Barlgura + - Chasme + - Dretch + - Glabrezu + - Goristro + - Hezrou + - Manes + - Marilith + - Nalfeshnee + - Quasit + - Vrock + - Yochlol + - Pit Fiend + - Lemure + - Dracolich + - Doppleganger + - Chromatic Dragon + - Drider + - Air Elemental + - Earth Elemental + - Fire Elemental + - Water Elemental + - Rohirrim + - Gondorian + - Empyrean + - Faerie Dragon + - Ettin + - Flumph + - Fomorian + - Dao + - Gnoll + - Parshendi + - Listener + - Spren + - Stormfather + - Rosharian + - Brightlord + - Highprince + - King + - Emperor + - Shardbearer + - Surgebinder + - Bondsmith + - Golem + - Gorgon + - Hag + - Harpy + - Hippogriff + - Homunculus + - State Alchemist + - Undying Soldier + - Jackalwere + - Nothic + - Oni + - Rakshasa + - Revenant + - Cultist + adjectives: + - Adorable + - Beautiful + - Clean + - Elegant + - Fancy + - Glamorous + - Handsome + - Long + - Magnificent + - Plain + - Quaint + - Sparkling + - Ugliest + - Red + - Orange + - Yellow + - Green + - Blue + - Purple + - Gray + - Black + - White + - Dead + - Odd + - Powerful + - Rich + - Vast + - Zealous + - Deafening + - Faint + - Melodic + - Quiet + - Thundering + - Whispering + - Hissing + - Ancient + - Fast + - Old + - Rapid + - Slow + - Rotten + - Creepy + - Crooked + - Empty + - Heavy + - Abhorrent + - Abnormal + - Absurd + - Acceptable + - Accidental + - Adamant + - Adventurous + - Agonizing + - Alert + - Annoyed + - Annoying + - Anxious + - Aromatic + - Aggressive + - Aloof + - Amazing + - Ambiguous + - Ambitious + - Amused + - Angry + - Arrogant + - Ashamed + - Aspiring + - Astonishing + - Auspicious + - Average + - Awesome + - Awful + - Bad + - Barbarous + - Bashful + - Beffiting + - Belligerent + - Beneficial + - Berserk + - Best + - Bewildered + - Big + - Bitter + - Bizarre + - Bloody + - Boiling + - Boundless + - Brash + - Brave + - Brawny + - Breakable + - Brief + - Bright + - Broken + - Busy + - Calculating + - Callous + - Calm + - Capricious + - Careful + - Careless + - Caring + - Cautious + - Ceaseless + - Certain + - Charming + - Cheap + - Chief + - Chilly + - Chivalrous + - Chunky + - Clear + - Clever + - Cloistered + - Clumsy + - Cloudy + - Classy + - Colossal + - Combative + - Common + - Confused + - Condemned + - Cool + - Courageous + - Cowardly + - Crazy + - Craven + - Cruel + - Cuddly + - Curious + - Cute + - Damaged + - Damaging + - Dangerous + - Dark + - Dashing + - Decisive + - Deep + - Defeated + - Defective + - Defiant + - Delicate + - Delicious + - Delightful + - Demonic + - Delirious + - Deranged + - Descriptive + - Devilish + - Difficult + - Diligent + - Direful + - Dirty + - Disastrous + - Disgusted + - Disgusting + - Disillusioned + - Distinct + - Disturbed + - Draconian + - Dramatic + - Dreary + - Dysfunctional + - Eager + - Elderly + - Electric + - Elite + - Enchanted + - Enchanting + - Energetic + - Enormous + - Entertaining + - Enthusiastic + - Envious + - Erratic + - Ethereal + - Evasive + - Vynikající + - Excited + - Exciting + - Exotic + - Exuberant + - Fabulous + - Faded + - Fair + - Faithful + - 'False' + - Familiar + - Famous + - Fanatical + - Fantastic + - Fascinated + - Fat + - Fearful + - Fearless + - Feeble + - Festive + - Fierce + - Filthy + - Fine + - Finicky + - First + - Fixed + - Flashy + - Flawless + - Flimsy + - Flippant + - Flowery + - Fluffy + - Fluttering + - Foamy + - Foolish + - Forgetful + - Fortunate + - Frail + - Fragile + - Frantic + - Free + - Freezing + - Fresh + - Friendly + - Frightening + - Fumbling + - Funny + - Furry + - Furtive + - Fuzzy + - Obří + - Gifted + - Gigantic + - Glistening + - Glorious + - Godly + - Good + - Goofy + - Gorgeous + - Graceful + - Grandiose + - Grateful + - Greasy + - Great + - Greedy + - Grieving + - Groovy + - Grotesque + - Grubby + - Gruesome + - Grumpy + - Guarded + - Guiltless + - Gullible + - Gutsy + - Guttural + - Hallowed + - Hanging + - Hapless + - Happy + - Harmonious + - Hateful + - Healthy + - Heartbreaking + - Heavenly + - Hellish + - Helpful + - Helpless + - Hesitant + - Hideous + - Hilarious + - Hollow + - Homeless + - Honorable + - Horrible + - Hospitable + - Huge + - Hulking + - Humorous + - Hungry + - Hurt + - Hushed + - Hypnotic + - Hysterical + - Icky + - Icy + - Ignorant + - Ill + - Illegal + - Illustrious + - Imaginary + - Immense + - Imminent + - Impartial + - Imperfect + - Impolite + - Important + - Incandescent + - Incompetent + - Industrious + - Incredible + - Inexpensive + - Infamous + - Innocent + - Inquisitive + - Insidious + - Instinctive + - Intelligent + - Interesting + - Invincible + - Irate + - Itchy + - Jaded + - Jagged + - Jealous + - Jolly + - Joyous + - Jumpy + - Juvenile + - Keen + - Kind + - Kindhearted + - Knowing + - Knowledgeable + - Known + - Labored + - Lame + - Large + - Last + - Late + - Laughable + - Lazy + - Lean + - Lethal + - Světlo + - Little + - Living + - Lonely + - Loud + - Lovely + - Lucky + - Magenta + - Magical + - Majestic + - Malicious + - Marked + - Massive + - Marvelous + - Mean + - Medical + - Melted + - Messy + - Mighty + - Military + - Mindless + - Minor + - Misty + - Mixed + - Modern + - Motionless + - Mysterious + - Naive + - Narrow + - Natural + - Neat + - Necessary + - Needless + - Needy + - Nervous + - New + - Nice + - Normal + - Nostalgic + - Numberless + - Obsolete + - Obtainable + - Oceanic + - Old-fashioned + - Omniscient + - Optimal + - Ordinary + - Organic + - Outstanding + - Oval + - Overrated + - Painful + - Parallel + - Pathetic + - Peaceful + - Penitent + - Perfect + - Periodic + - Petite + - Physical + - Pink + - Plastic + - Pleasant + - Pointless + - Polite + - Poor + - Precious + - Premium + - Present + - Pretty + - Private + - Productive + - Protective + - Public + - Puzzling + - Questionable + - Quick + - Quickest + - Rare + - Ready + - Real + - Rebel + - Regular + - Remarkable + - Responsible + - Romantic + - Round + - Royal + - Sad + - Safe + - Salty + - Satisfying + - Scared + - Scary + - Scientific + - Scrawny + - Screeching + - Second + - Second-hand + - Secret + - Selfish + - Sequacious + - Serious + - Shallow + - Sharp + - Shiny + - Shocking + - Short + - Shy + - Sick + - Silent + - Silky + - Silly + - Simple + - Skinny + - Slim + - Slimy + - Slippery + - Small + - Smart + - Smiling + - Smooth + - Sneaky + - Soft + - Solid + - Special + - Spectacular + - Spicy + - Spiky + - Splendid + - Spooky + - Spotless + - Square + - Staking + - Standing + - Steady + - Sticky + - Strange + - Striped + - Strong + - Successful + - Super + - Supreme + - Sweet + - Talented + - Tall + - Tasty + - Temporary + - Tense + - Terrible + - Terrific + - Tested + - Thankful + - Thick + - Thin + - Žíznivý + - Thoughtful + - Tiny + - Tired + - Tricky + - Troubled + - 'True' + - Ugly + - Ultra + - Unadvised + - Unarmed + - Uncovered + - Unhealthy + - Unique + - Unknown + - Unnatural + - Unused + - Unusual + - Used + - Useful + - Useless + - Valuable + - Violent + - Waiting + - Wandering + - Warm + - Weak + - Wealthy + - Whole + - Wise + - Wonderful + - Wooden + - Worried + - Worthless + - Wrong + - Menacing + - Trusting + - Unassuming + - Threatening + verbs: + - Slashing + - Cutting + - Stabbing + - Scratching + - Killing + - Slaying + - Butchering + - Destroying + - Tickling + - Hugging + - Murdering + - Slapping + - Hissing + - Traveling + - Teleporting + - Blinking + - Destroying + - Wrecking + - Flashing + - Materializing + - Spawning + - Questioning + - Inquiring + - Pleading + - Demanding + - Interrogating + - Querying + - Assaulting + - Striking + - Ambushing + - Assailing + - Rushing + - Storming + - Bombarding + - Barraging + - Smiting + - Charging + - Clobbering + - Battling + - Battering + - Hammering + - Beating + - Combating + - Overwhelming + - Raiding + - Tackling + - Shooting + - Venturing + - Cracking + - Rupturing + - Smashing + - Shattering + - Fracturing + - Splintering + - Pulverizing + - Tearing + - Rending + - Snapping + - Bursting + - Exploding + - Damaging + - Fragmenting + - Splitting + - Fortifying + - Nudging + - Tapping + - Jostling + - Thumping + - Butting + - Clattering + - Striking + - Whacking + - Slamming + - Summoning + - Screaming + - Bellowing + - Roaring + - Shifting + - Transforming + - Modifying + - Twisting + - Mutating + - Distorting + - Blurring + - Adjusting + - Warping + - Altering + - Adapting + - Evolving + - Varying + - Hunting + - Trailing + - Following + - Stalking + - Shadowing + - Hounding + - Casing + - Mounting + - Ascending + - Rising + - Heaving + - Springing + - Cresting + - Gathering + - Corralling + - Hoarding + - Reaping + - Harvesting + - Saving + - Sheltering + - Cloaking + - Shrouding + - Enclosing + - Concealing + - Hiding + - Disguising + - Masking + - Burying + - Smothering + - Clouding + - Shielding + - Shading + - Sealing + - Enveloping + - Veiling + - Obscuring + - Traversing + - Fording + - Gliding + - Howling + - Whimpering + - Screaming + - Shrieking + - Squealing + - Roaring + - Wailing + - Bawling + - Screeching + - Cleaving + - Chopping + - Chipping + - Severing + - Slicing + - Snipping + - Splitting + - Axing + - Slashing + - Rending + - Tearing + - Thinning + - Cropping + - Carving + - Dissecting + - Hacking + - Průraznost + - Sawing + - Shaving + - Shearing + - Mining + - Delving + - Excavating + - Burrowing + - Vrtání + - Hollowing + - Gouging + - Tunneling + - Invading + - Boarding + - Wandering + - Infiltrating + - Intruding + - Evading + - Fleeing + - Running + - Dodging + - Crashing + - Battling + - Tussling + - Wrestling + - Scuffling + - Dueling + - Brawling + - Jousting + - Sparring + - Clashing + - Warring + - Grappling + - Scrapping + - Attacking + - Feuding + - Skirmishing + - Discovering + - Detecting + - Catching + - Solving + - Revealing + - Unearthing + - Leaping + - Bouncing + - Springing + - Vaulting + - Hopping + - Surging + - Punting + - Booting + - Dropkicking + - Sensing + - Perceiving + - Detecting + - Fading + - Bleeding + - Shrinking + - Oslabení + - Abating + - Diminishing + - Forging + - Releasing + - Gathering + - Collecting + - Culling + - Crushing + - Propelling + - Jogging + - Sprinting + - Questing + - Scouting + - Exploring + - Digging + - Trembling + - Rattling + - Parting + - Hacking + - Rupturing + - Carving + - Dividing + - Halving + - Breaking + - Sundering + - Separating + - Rending + - Ripping + - Grazing + - Imprisoning + - Snaring + - Cornering + - Entangling + - Pinning + - Catching + - Restraining + - Binding + - Hooking + - Snagging + - Snatching + - Caging + - Capturing + - Haunting + - Creeping + - Sneaking + - Spying + - Avenging + - Storming + verb-ers (noun): + - World Breaker + - World Shatterer + - Avenger + - Ashbringer + - Windseeker + - Defiler + - Thunderfury + - Slicer + - Slasher + - Cutter + - Stabber + - Scratcher + - Killer + - Slayer + - Destroyer + - Hugger + - Murderer + - Slapper + - Traveller + - Teleporter + - Blinker + - Wrecker + - Materializer + - Spawner + - Demander + - Assaulter + - Striker + - Ambusher + - Rusher + - Stormer + - Bombarder + - Barrager + - Smiter + - Charger + - Battler + - Hammerer + - Beater + - Combater + - Overwhelmer + - Raider + - Tackler + - Shooter + - Venturer + - Cracker + - Smasher + - Shatterer + - Fracturer + - Splinterer + - Pulverizer + - Tearer + - Renderer + - Snapper + - Burster + - Exploder + - Damager + - Fragmenter + - Splitter + - Fortifier + - Nudger + - Tapper + - Thumper + - Butter + - Clatterer + - Striker + - Whacker + - Slammer + - Summoner + - Screamer + - Shifter + - Transformer + - Modifyer + - Twister + - Blurrer + - Warper + - Alterer + - Adapter + - Evolver + - HunterEnchantment + - Trailer + - Follower + - Stalker + - Shadower + - Hounder + - Caser + - Mounter + - Ascender + - Riser + - Springer + - Hoarder + - Reaper + - Harvester + - Saver + - Shelterer + - Cloaker + - Shrouder + - Encloser + - Hider + - Masker + - Buryer + - Clouder + - Shader + - Sealer + - Enveloper + - Veiler + - Traverser + - Forder + - Glider + - Howler + - Whimperer + - Screamer + - Squealer + - Bawler + - Screecher + - Chopper + - Chipper + - Snipper + - Splitter + - Axer + - Slasher + - Renderer + - Tearer + - Thinner + - Cropper + - Carver + - Hacker + - Piercer + - Sawer + - Shaver + - Shearer + - Miner + - Excavater + - Burrower + - Driller + - Tunneler + - Invader + - Boarder + - Wanderer + - Intruder + - Evader + - Runner + - Dodger + - Crasher + - Battler + - Wrestler + - Scuffler + - Dueler + - Brawler + - Clasher + - Grappler + - Scrapper + - Attacker + - Feuder + - Catcher + - Solver + - Revealer + - Leaper + - Bouncer + - Vaulter + - Hopper + - Surger + - Punter + - Dropkicker + - Perceiver + - Fader + - Bleeder + - Weakener + - Forger + - Releaser + - Gatherer + - Crusher + - Propeller + - Jogger + - Sprinter + - Scouter + - Explorer + - Digger + - Trembler + - Parter + - Hacker + - Carver + - Divider + - Halver + - Breaker + - Renderer + - Ripper + - Grazer + - Imprisoner + - Cornerer + - Pinner + - Catcher + - Restrainer + - Binder + - Snagger + - Snatcher + - Cager + - Capturer + - Haunter + - Creeper + - Sneaker + - Binder + - Jailer + - Seducer + - Dancer + - Blasphemer + - Eater + - Snorer + - Thruster + - Slapper +absorption: + name: Absorption +blindness: + name: Slepota +conduit_power: + name: Síla ozáření +confusion: + name: Nevolnost +damage_resistance: + name: Odolnost +dolphins_grace: + name: Delfíní milost +fast_digging: + name: Spěch +fire_resistance: + name: Ohnivzdornost +glowing: + name: Svítění +harm: + name: Okamžité poškození +heal: + name: Okamžité uzdravení +health_boost: + name: Zvýšení života +hunger: + name: Hlad +increase_damage: + name: Síla +invisibility: + name: Neviditelnost +jump: + name: Vyšší skoky +levitation: + name: Levitace +luck: + name: Luck +night_vision: + name: Noční vidění +poison: + name: Otrávení +regeneration: + name: Regenerace +saturation: + name: Sytost +slow: + name: Zpomalení +slow_digging: + name: Únava při těžbě +slow_falling: + name: Pomalý pád +speed: + name: Rychlost +unluck: + name: Smůla +water_breathing: + name: Dýchání pod vodou +weakness: + name: Slabost +wither: + name: Wither +translation: + Economy pay message v2: '&2Zaplatili jste &2$amount_sent $currency_name &2hráči $receiver&2, který získal $amount_received po zdanění!' + Economy currency left message: Nyní máte &2$amount_left $currency_name + Economy money from payment message: Obdrželi jste &2$amount_received $currency_name &fod $sender + Economy payment insuficient currency: '&cK tomu nemáte dostatek $currency_name!' + Wallet command message: Máš &2$balance $currency_name + Tax confirmation message: '&cOdesílání platby bude stát $percentage% (daně). &aPoužij &9$command &apro pokračování!' + shopBatchSellItem: '&aYou have sold your items &afor $currency_amount $currency_name!' + Shop buy message: '&aKoupili jste $item_name &aza $item_value $currency_name!' + Shop current balance message: '&Máš &$currency_amount $currency_name.' + Shop insufficient funds message: '&cK tomu nemáte dostatek $currency_name!' + Shop item cost message: Tato položka stojí &c$item_value $currency_name. + Shop sell message: '&aProdal jsi $item_name &aza $currency_amount $currency_name!' + Shop sale player items warning: '&cNemůžeš prodávat předměty, které ti nejsou v současné době svázány! To zahrnuje předměty z jiných prestižních vrstev!' + Shop sale instructions: '&cZde můžete pouze prodat EliteMob kořist! (Zbroj / zbraně vypuštěné z elit zobrazující hodnotu v jejich hřišti)' + Teleport time left: '&7[EM] Teleportování za &a$time &7vteřin...' + Teleport cancelled: '&7[EM] &cTeleport přerušen!' + noPendingCommands: '&cMomentálně nemáte žádné čekající příkazy!' + trackMessage: Track the $name + chestLowRankMessage: '&7[EM] &cYour guild rank needs to be at least $rank &cin order to open this chest!' + chestCooldownMessage: '&7[EM] &cYou''ve already opened this chest recently! Wait $time!' + insufficientCurrencyForWormholeMessage: '&8[EliteMobs] &cInsufficient currency! You need $amount to use this com.magmaguy.elitemobs.wormhole!' + dismissEMMessage: '&8[EliteMobs] &2/elitemobs &fmenu not working for you? Try &2/elitemobs alt &fto see an alternative version of the menu! &cDon''t want to see this message again? &4/em dismiss' + switchEMStyleMessage: '&8[EliteMobs] &2/elitemobs &fmenu style changed! Check it out!' +EconomySettings: + currencyName: Elite Mince + chatCurrencyShowerMessage: '&7[EM] Zvedl jsi &a$amount $currency_name!' + actionbarCurrencyShowerMessage: '&7[EM] Zvedl jsi &a$amount $currency_name!' + adventurersGuildNotificationMessages: '&7[EM] Chceš si zautrácet extra peníze? Zkus &a/em !' +arrow_damage: + name: Síla +arrow_fire: + name: Plamen +arrow_infinite: + name: Bezedný toulec +arrow_knockback: + name: Úder +binding_curse: + name: Kletba spoustání +channeling: + name: Výboj +critical_strikes: + name: Kritické rány + criticalHitPopup: '&5Kritická rána!' +damage_all: + name: Ostrost +damage_arthropods: + name: Hmyzákova záhuba +damage_undead: + name: Rána nemrtvým +depth_strider: + name: Rychloplavec +dig_speed: + name: Účinnost +drilling: + name: Vrtání +durability: + name: Nerozbitnost +earthquake: + name: Earthquake + earthquakeActivationMessage: '&8[EliteMobs] &aEarthquake triggered! &c2 min cooldown!' + earthquakeAvailableMessage: '&8[EliteMobs] &2Earthquake cooldown over!' +fire_aspect: + name: Síla ohně +flamethrower: + name: Plamenomet +frost_walker: + name: Mrazík +grappling_hook: + name: Grappling Hook +hunter: + name: Lovec +ice_breaker: + name: Rozbíječ ledů +impaling: + name: Probodnutí +knockback: + name: Odhození +lightning: + name: Lightning +loot_bonus_blocks: + name: Štěstí +loot_bonus_mobs: + name: Kořist +loud_strikes: + name: Loud Strikes +loyalty: + name: Věrnost +lure: + name: Návnada +mending: + name: Oprava +meteor_shower: + name: Roj meteorů +multishot: + name: Štěpení šípů +oxygen: + name: Dýchání +piercing: + name: Průraznost +plasma_boots: + name: Plasma Boots +protection_environmental: + name: Ochrana +protection_explosions: + name: Ochrana proti výbuchu +protection_fall: + name: Lehkost pírka +protection_fire: + name: Ochrana proti ohni +protection_projectile: + name: Ochrana proti střelám +quick_charge: + name: Rychlé nabíjení +riptide: + name: Mocný záběr +silk_touch: + name: Hedvábný dotek +soulbind: + name: Duševní pouto + loreStrings: '&7Duševní pouto k &f$player' + hologramString: '$player&f' +summon_merchant: + name: Vyvolat obchodníka + message: Jeeves! +summon_wolf: + name: Vyvolat vlka +sweeping_edge: + name: Svištivé ostří +thorns: + name: Trny +unbind: + name: Odpárovat +vanishing_curse: + name: Kletba zmizení +water_worker: + name: Jako ryba ve vodě +AntiExploit: + AntiExploit message: '&c[EM AntiExploit] &7V blízkosti elit nebude uvolněna speciální kořist.' +CombatTag: + Combat tag message: '&c[EliteMobs] Status boje aktivován!' +AdventurersGuild: + adventurersGuildMenuName: '&6§lMístečko Dobrodružníka' + Prestige 0 rank 0: '&8Commoner - disables elites!' + Prestige 0 rank 0 short placeholder: '&6&l✧&e0' + Prestige 0 rank 1: '&fBažant' + Prestige 0 rank 1 short placeholder: '&6&l✧&eⅠ' + Prestige 0 rank 2: '&fNováček' + Prestige 0 rank 2 short placeholder: '&6&l✧&eⅠⅠ' + Prestige 0 rank 3: '&fUčeň' + Prestige 0 rank 3 short placeholder: '&6&l✧&eⅠⅠⅠ' + Prestige 0 rank 4: '&2Dobrodruh' + Prestige 0 rank 4 short placeholder: '&6&l✧&eⅠⅤ' + Prestige 0 rank 5: '&2Cestovatel' + Prestige 0 rank 5 short placeholder: '&6&l✧&eⅤ' + Prestige 0 rank 6: '&2Adept' + Prestige 0 rank 6 short placeholder: '&6&l✧&eⅤⅠ' + Prestige 0 rank 7: '&1Veterán' + Prestige 0 rank 7 short placeholder: '&6&l✧&eⅤⅠⅠ' + Prestige 0 rank 8: '&1Elita' + Prestige 0 rank 8 short placeholder: '&6&l✧&eⅤⅠⅠⅠ' + Prestige 0 rank 9: '&lMástr' + Prestige 0 rank 9 short placeholder: '&6&l✧&eⅠⅩ' + Prestige 0 rank 10: '&5Hrdina' + Prestige 0 rank 10 short placeholder: '&6&l✧&eⅩ' + Prestige 1 rank 0: '&ePrestiž 1 &8Prostý občan' + Prestige 1 rank 0 short placeholder: '&e⚜Ⅰ&6&l✧&e0' + Prestige 1 rank 1: '&ePrestiž 1 &fBažant' + Prestige 1 rank 1 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠ' + Prestige 1 rank 2: '&ePrestiž 1 &fNováček' + Prestige 1 rank 2 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅠ' + Prestige 1 rank 3: '&ePrestiž 1 &fUčeň' + Prestige 1 rank 3 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅠⅠ' + Prestige 1 rank 4: '&ePrestiž 1 &2Dobrodruh' + Prestige 1 rank 4 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅤ' + Prestige 1 rank 5: '&ePrestiž 1 &2Cestovatel' + Prestige 1 rank 5 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤ' + Prestige 1 rank 6: '&ePrestiž 1 &2Adept' + Prestige 1 rank 6 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠ' + Prestige 1 rank 7: '&ePrestiž 1 &1Veterán' + Prestige 1 rank 7 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠⅠ' + Prestige 1 rank 8: '&ePrestiž 1 &1Elita' + Prestige 1 rank 8 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠⅠⅠ' + Prestige 1 rank 9: '&ePrestiž 1 &5Mástr' + Prestige 1 rank 9 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅩ' + Prestige 1 rank 10 short placeholder: '&e⚜Ⅰ&6&l✧&eⅩ' + Prestige 1 rank 10: '&ePrestiž 1 &5Hrdina' + Prestige 1 rank 11: '&ePrestiž 1 &5Legenda' + Prestige 1 rank 11 short placeholder: '&e⚜Ⅰ&6&l✧&eⅩⅠ' + Prestige 2 rank 0: '&2Prestige 2 &8Commoner' + Prestige 2 rank 0 short placeholder: '&2⚜ⅠⅠ&6&l✧&e0' + Prestige 2 rank 1: '&2Prestige 2 &fRookie' + Prestige 2 rank 1 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠ' + Prestige 2 rank 2: '&2Prestige 2 &fNovice' + Prestige 2 rank 2 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅠ' + Prestige 2 rank 3: '&2Prestige 2 &fApprentice' + Prestige 2 rank 3 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 2 rank 4: '&2Prestige 2 &2Adventurer' + Prestige 2 rank 4 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅤ' + Prestige 2 rank 5: '&2Prestige 2 &2Journeyman' + Prestige 2 rank 5 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤ' + Prestige 2 rank 6: '&2Prestige 2 &2Adept' + Prestige 2 rank 6 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠ' + Prestige 2 rank 7: '&2Prestige 2 &1Veteran' + Prestige 2 rank 7 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 2 rank 8: '&2Prestige 2 &1Elite' + Prestige 2 rank 8 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 2 rank 9: '&2Prestige 2 &5Master' + Prestige 2 rank 9 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅩ' + Prestige 2 rank 10 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩ' + Prestige 2 rank 10: '&2Prestige 2 &5Hero' + Prestige 2 rank 11: '&2Prestige 2 &5Legend' + Prestige 2 rank 11 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩⅠ' + Prestige 2 rank 12: '&2Prestige 2 &5Myth' + Prestige 2 rank 12 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 3 rank 0: '&aPrestige 3 &8Commoner' + Prestige 3 rank 0 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&e0' + Prestige 3 rank 1: '&aPrestige 3 &fRookie' + Prestige 3 rank 1 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠ' + Prestige 3 rank 2: '&aPrestige 3 &fNovice' + Prestige 3 rank 2 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠ' + Prestige 3 rank 3: '&aPrestige 3 &fApprentice' + Prestige 3 rank 3 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 3 rank 4: '&aPrestige 3 &2Adventurer' + Prestige 3 rank 4 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅤ' + Prestige 3 rank 5: '&aPrestige 3 &2Journeyman' + Prestige 3 rank 5 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤ' + Prestige 3 rank 6: '&aPrestige 3 &2Adept' + Prestige 3 rank 6 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠ' + Prestige 3 rank 7: '&aPrestige 3 &1Veteran' + Prestige 3 rank 7 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 3 rank 8: '&aPrestige 3 &1Elite' + Prestige 3 rank 8 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 3 rank 9: '&aPrestige 3 &5Master' + Prestige 3 rank 9 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅩ' + Prestige 3 rank 10 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩ' + Prestige 3 rank 10: '&aPrestige 3 &5Hero' + Prestige 3 rank 11: '&aPrestige 3 &5Legend' + Prestige 3 rank 11 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠ' + Prestige 3 rank 12: '&aPrestige 3 &5Myth' + Prestige 3 rank 12 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 3 rank 13: '&aPrestige 3 &5Immortal' + Prestige 3 rank 13 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 4 rank 0: '&3Prestige 4 &8Commoner' + Prestige 4 rank 0 short placeholder: '&3⚜ⅠⅤ&6&l✧&e0' + Prestige 4 rank 1: '&3Prestige 4 &fRookie' + Prestige 4 rank 1 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠ' + Prestige 4 rank 2: '&3Prestige 4 &fNovice' + Prestige 4 rank 2 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅠ' + Prestige 4 rank 3: '&3Prestige 4 &fApprentice' + Prestige 4 rank 3 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅠⅠ' + Prestige 4 rank 4: '&3Prestige 4 &2Adventurer' + Prestige 4 rank 4 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅤ' + Prestige 4 rank 5: '&3Prestige 4 &2Journeyman' + Prestige 4 rank 5 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤ' + Prestige 4 rank 6: '&3Prestige 4 &2Adept' + Prestige 4 rank 6 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠ' + Prestige 4 rank 7: '&3Prestige 4 &1Veteran' + Prestige 4 rank 7 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠⅠ' + Prestige 4 rank 8: '&3Prestige 4 &1Elite' + Prestige 4 rank 8 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠⅠⅠ' + Prestige 4 rank 9: '&3Prestige 4 &5Master' + Prestige 4 rank 9 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅩ' + Prestige 4 rank 10 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩ' + Prestige 4 rank 10: '&3Prestige 4 &5Hero' + Prestige 4 rank 11: '&3Prestige 4 &5Legend' + Prestige 4 rank 11 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠ' + Prestige 4 rank 12: '&3Prestige 4 &5Myth' + Prestige 4 rank 12 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅠ' + Prestige 4 rank 13: '&3Prestige 4 &5Immortal' + Prestige 4 rank 13 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅠⅠ' + Prestige 4 rank 14: '&3Prestige 4 &5Chosen' + Prestige 4 rank 14 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅤ' + Prestige 5 rank 0: '&bPrestige 5 &8Commoner' + Prestige 5 rank 0 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 5 rank 1: '&bPrestige 5 &fRookie' + Prestige 5 rank 1 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠ' + Prestige 5 rank 2: '&bPrestige 5 &fNovice' + Prestige 5 rank 2 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅠ' + Prestige 5 rank 3: '&bPrestige 5 &fApprentice' + Prestige 5 rank 3 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅠⅠ' + Prestige 5 rank 4: '&bPrestige 5 &2Adventurer' + Prestige 5 rank 4 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅤ' + Prestige 5 rank 5: '&bPrestige 5 &2Journeyman' + Prestige 5 rank 5 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤ' + Prestige 5 rank 6: '&bPrestige 5 &2Adept' + Prestige 5 rank 6 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠ' + Prestige 5 rank 7: '&bPrestige 5 &1Veteran' + Prestige 5 rank 7 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠⅠ' + Prestige 5 rank 8: '&bPrestige 5 &1Elite' + Prestige 5 rank 8 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠⅠⅠ' + Prestige 5 rank 9: '&bPrestige 5 &5Master' + Prestige 5 rank 9 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅩ' + Prestige 5 rank 10 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩ' + Prestige 5 rank 10: '&bPrestige 5 &5Hero' + Prestige 5 rank 11: '&bPrestige 5 &5Legend' + Prestige 5 rank 11 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠ' + Prestige 5 rank 12: '&bPrestige 5 &5Myth' + Prestige 5 rank 12 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅠ' + Prestige 5 rank 13: '&bPrestige 5 &5Immortal' + Prestige 5 rank 13 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅠⅠ' + Prestige 5 rank 14: '&bPrestige 5 &5Chosen' + Prestige 5 rank 14 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅤ' + Prestige 5 rank 15: '&bPrestige 5 &5Ascendant' + Prestige 5 rank 15 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅤ' + Prestige 6 rank 0: '&4Prestige 6 &8Commoner' + Prestige 6 rank 0 short placeholder: '&4⚜ⅤⅠ&6&l✧&e0' + Prestige 6 rank 1: '&4Prestige 6 &fRookie' + Prestige 6 rank 1 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠ' + Prestige 6 rank 2: '&4Prestige 6 &fNovice' + Prestige 6 rank 2 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅠ' + Prestige 6 rank 3: '&4Prestige 6 &fApprentice' + Prestige 6 rank 3 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅠⅠ' + Prestige 6 rank 4: '&4Prestige 6 &2Adventurer' + Prestige 6 rank 4 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅤ' + Prestige 6 rank 5: '&4Prestige 6 &2Journeyman' + Prestige 6 rank 5 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤ' + Prestige 6 rank 6: '&4Prestige 6 &2Adept' + Prestige 6 rank 6 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠ' + Prestige 6 rank 7: '&4Prestige 6 &1Veteran' + Prestige 6 rank 7 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠⅠ' + Prestige 6 rank 8: '&4Prestige 6 &1Elite' + Prestige 6 rank 8 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 6 rank 9: '&4Prestige 6 &5Master' + Prestige 6 rank 9 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅩ' + Prestige 6 rank 10 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩ' + Prestige 6 rank 10: '&4Prestige 6 &5Hero' + Prestige 6 rank 11: '&4Prestige 6 &5Legend' + Prestige 6 rank 11 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠ' + Prestige 6 rank 12: '&4Prestige 6 &5Myth' + Prestige 6 rank 12 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠ' + Prestige 6 rank 13: '&4Prestige 6 &5Immortal' + Prestige 6 rank 13 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 6 rank 14: '&4Prestige 6 &5Chosen' + Prestige 6 rank 14 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅤ' + Prestige 6 rank 15: '&4Prestige 6 &5Ascendant' + Prestige 6 rank 15 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤ' + Prestige 6 rank 16: '&4Prestige 6 &5Titan' + Prestige 6 rank 16 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤⅠ' + Prestige 7 rank 0: '&cPrestige 7 &8Commoner' + Prestige 7 rank 0 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&e0' + Prestige 7 rank 1: '&cPrestige 7 &fRookie' + Prestige 7 rank 1 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠ' + Prestige 7 rank 2: '&cPrestige 7 &fNovice' + Prestige 7 rank 2 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅠ' + Prestige 7 rank 3: '&cPrestige 7 &fApprentice' + Prestige 7 rank 3 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 7 rank 4: '&cPrestige 7 &2Adventurer' + Prestige 7 rank 4 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅤ' + Prestige 7 rank 5: '&cPrestige 7 &2Journeyman' + Prestige 7 rank 5 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤ' + Prestige 7 rank 6: '&cPrestige 7 &2Adept' + Prestige 7 rank 6 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠ' + Prestige 7 rank 7: '&cPrestige 7 &1Veteran' + Prestige 7 rank 7 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 7 rank 8: '&cPrestige 7 &1Elite' + Prestige 7 rank 8 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 7 rank 9: '&cPrestige 7 &5Master' + Prestige 7 rank 9 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅩ' + Prestige 7 rank 10 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩ' + Prestige 7 rank 10: '&cPrestige 7 &5Hero' + Prestige 7 rank 11: '&cPrestige 7 &5Legend' + Prestige 7 rank 11 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠ' + Prestige 7 rank 12: '&cPrestige 7 &5Myth' + Prestige 7 rank 12 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 7 rank 13: '&cPrestige 7 &5Immortal' + Prestige 7 rank 13 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 7 rank 14: '&cPrestige 7 &5Chosen' + Prestige 7 rank 14 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅤ' + Prestige 7 rank 15: '&cPrestige 7 &5Ascendant' + Prestige 7 rank 15 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤ' + Prestige 7 rank 16: '&cPrestige 7 &5Titan' + Prestige 7 rank 16 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤⅠ' + Prestige 7 rank 17: '&cPrestige 7 &5Demigod' + Prestige 7 rank 17 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤⅠⅠ' + Prestige 8 rank 0: '&9Prestige 8 &8Commoner' + Prestige 8 rank 0 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&e0' + Prestige 8 rank 1: '&9Prestige 8 &fRookie' + Prestige 8 rank 1 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠ' + Prestige 8 rank 2: '&9Prestige 8 &fNovice' + Prestige 8 rank 2 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅠ' + Prestige 8 rank 3: '&9Prestige 8 &fApprentice' + Prestige 8 rank 3 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 8 rank 4: '&9Prestige 8 &2Adventurer' + Prestige 8 rank 4 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅤ' + Prestige 8 rank 5: '&9Prestige 8 &2Journeyman' + Prestige 8 rank 5 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤ' + Prestige 8 rank 6: '&9Prestige 8 &2Adept' + Prestige 8 rank 6 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠ' + Prestige 8 rank 7: '&9Prestige 8 &1Veteran' + Prestige 8 rank 7 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 8 rank 8: '&9Prestige 8 &1Elite' + Prestige 8 rank 8 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 8 rank 9: '&9Prestige 8 &5Master' + Prestige 8 rank 9 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅩ' + Prestige 8 rank 10 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩ' + Prestige 8 rank 10: '&9Prestige 8 &5Hero' + Prestige 8 rank 11: '&9Prestige 8 &5Legend' + Prestige 8 rank 11 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠ' + Prestige 8 rank 12: '&9Prestige 8 &5Myth' + Prestige 8 rank 12 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 8 rank 13: '&9Prestige 8 &5Immortal' + Prestige 8 rank 13 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 8 rank 14: '&9Prestige 8 &5Chosen' + Prestige 8 rank 14 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅤ' + Prestige 8 rank 15: '&9Prestige 8 &5Ascendant' + Prestige 8 rank 15 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤ' + Prestige 8 rank 16: '&9Prestige 8 &5Titan' + Prestige 8 rank 16 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠ' + Prestige 8 rank 17: '&9Prestige 8 &5Demigod' + Prestige 8 rank 17 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠⅠ' + Prestige 8 rank 18: '&9Prestige 8 &5Deity' + Prestige 8 rank 18 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 9 rank 0: '&dPrestige 9 &8Commoner' + Prestige 9 rank 0 short placeholder: '&d⚜ⅠⅩ&6&l✧&e0' + Prestige 9 rank 1: '&dPrestige 9 &fRookie' + Prestige 9 rank 1 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠ' + Prestige 9 rank 2: '&dPrestige 9 &fNovice' + Prestige 9 rank 2 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅠ' + Prestige 9 rank 3: '&dPrestige 9 &fApprentice' + Prestige 9 rank 3 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅠⅠ' + Prestige 9 rank 4: '&dPrestige 9 &2Adventurer' + Prestige 9 rank 4 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅤ' + Prestige 9 rank 5: '&dPrestige 9 &2Journeyman' + Prestige 9 rank 5 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤ' + Prestige 9 rank 6: '&dPrestige 9 &2Adept' + Prestige 9 rank 6 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠ' + Prestige 9 rank 7: '&dPrestige 9 &1Veteran' + Prestige 9 rank 7 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠⅠ' + Prestige 9 rank 8: '&dPrestige 9 &1Elite' + Prestige 9 rank 8 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠⅠⅠ' + Prestige 9 rank 9: '&dPrestige 9 &5Master' + Prestige 9 rank 9 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅩ' + Prestige 9 rank 10 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩ' + Prestige 9 rank 10: '&dPrestige 9 &5Hero' + Prestige 9 rank 11: '&dPrestige 9 &5Legend' + Prestige 9 rank 11 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠ' + Prestige 9 rank 12: '&dPrestige 9 &5Myth' + Prestige 9 rank 12 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅠ' + Prestige 9 rank 13: '&dPrestige 9 &5Immortal' + Prestige 9 rank 13 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅠⅠ' + Prestige 9 rank 14: '&dPrestige 9 &5Chosen' + Prestige 9 rank 14 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅤ' + Prestige 9 rank 15: '&dPrestige 9 &5Ascendant' + Prestige 9 rank 15 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤ' + Prestige 9 rank 16: '&dPrestige 9 &5Titan' + Prestige 9 rank 16 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠ' + Prestige 9 rank 17: '&dPrestige 9 &5Demigod' + Prestige 9 rank 17 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠⅠ' + Prestige 9 rank 18: '&dPrestige 9 &5Deity' + Prestige 9 rank 18 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 9 rank 19: '&dPrestige 9 &5Godhunter' + Prestige 9 rank 19 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅩ' + Prestige 10 rank 0: '&5Prestige 10 &8Commoner' + Prestige 10 rank 0 short placeholder: '&5⚜Ⅹ&6&l✧&e0' + Prestige 10 rank 1: '&5Prestige 10 &fRookie' + Prestige 10 rank 1 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠ' + Prestige 10 rank 2: '&5Prestige 10 &fNovice' + Prestige 10 rank 2 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠ' + Prestige 10 rank 3: '&5Prestige 10 &fApprentice' + Prestige 10 rank 3 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠⅠ' + Prestige 10 rank 4: '&5Prestige 10 &2Adventurer' + Prestige 10 rank 4 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅤ' + Prestige 10 rank 5: '&5Prestige 10 &2Journeyman' + Prestige 10 rank 5 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤ' + Prestige 10 rank 6: '&5Prestige 10 &2Adept' + Prestige 10 rank 6 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠ' + Prestige 10 rank 7: '&5Prestige 10 &1Veteran' + Prestige 10 rank 7 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠ' + Prestige 10 rank 8: '&5Prestige 10 &1Elite' + Prestige 10 rank 8 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠⅠ' + Prestige 10 rank 9: '&5Prestige 10 &5Master' + Prestige 10 rank 9 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅩ' + Prestige 10 rank 10 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩ' + Prestige 10 rank 10: '&5Prestige 10 &5Hero' + Prestige 10 rank 11: '&5Prestige 10 &5Legend' + Prestige 10 rank 11 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠ' + Prestige 10 rank 12: '&5Prestige 10 &5Myth' + Prestige 10 rank 12 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅠ' + Prestige 10 rank 13: '&5Prestige 10 &5Immortal' + Prestige 10 rank 13 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅠⅠ' + Prestige 10 rank 14: '&5Prestige 10 &5Chosen' + Prestige 10 rank 14 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅤ' + Prestige 10 rank 15: '&5Prestige 10 &5Ascendant' + Prestige 10 rank 15 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤ' + Prestige 10 rank 16: '&5Prestige 10 &5Titan' + Prestige 10 rank 16 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠ' + Prestige 10 rank 17: '&5Prestige 10 &5Demigod' + Prestige 10 rank 17 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠⅠ' + Prestige 10 rank 18: '&5Prestige 10 &5Deity' + Prestige 10 rank 18 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 10 rank 19: '&5Prestige 10 &5Godhunter' + Prestige 10 rank 19 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅩ' + Prestige 10 rank 20: '&5Prestige 10 &5Godslayer' + Prestige 10 rank 20 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅩ' + lootLimiterMessage: '&7[EM] &cYou must unlock the next guild rank through /ag to loot better items!' + prestigeUnlockMessageTitle: '$player' + prestigeUnlockMessageSubtitle: '&2has unlocked $tier&2!' +buy_or_sell_menu: + Shop name: '[EM] Koupit nebo prodat' +custom_quest_screen: + headerTextLines2: | + &a&l『&c&l$questName&a&l』 + acceptTextLines: '&a&l[Přijmout!]' + acceptHoverLines: "&aClick to \n&aaccept quest!" + acceptedTextLines: '&2&lAccepted! &aTurn in with $npcName &4[Abandon]' + acceptedHoverLines: '&aClick to abandon quest!' + trackTextLines: '&2&l[Track]' + trackHoverLines: '&aClick to track quest!' + untrackTextLines: '&4&l[Untrack]' + untrackHoverLines: '&cClick to untrack quest!' + completedTextLines: '&2&l[Turn in!]' + completedHoverLines: '&aClick to turn quest in!' + turnedInTextLines: '&8[Completed!]' + turnedInHoverLines: '&8Already turned in!' + objectivesLine: '&c&lCíle:' + killQuestDefaultSummaryLine: '&c➤Kill $name:$color$current&0/$color$target' + fetchQuestDefaultSummaryLine: '&c➤Get $name:$color&$current&0/$color$target' + dialogQuestDefaultSummaryLine: '&c➤Jdi promluvit s $name $location' + rewardsLine: '&2&lOdměny:' + rewardsDefaultSummaryLine: '&2➤$amountx $rewardName &8($chance%)' +custom_shop_menu: + Shop name: '[EM] Custom Shop' + Full inventory message: '[EliteMobs] &4Váš inventář je plný! Nemůžete si koupit předměty, dokud nezískáte nějaké volné místo.' +dynamic_quest_screen: + questName: Zabij $amount $name + headerTextLines2: |- + &c&lGuild request! + &0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ + defaultLoreTextLines: '&8Slay $amount $name!' + acceptTextLines: '&a&lPřijmout!' + acceptHoverLines: "&aClick to \n&aaccept quest!" + acceptedTextLines: '&2&lAccepted! &4[Abandon]' + acceptedHoverLines: '&aClick to abandon quest!' + completedTextLines: '&2&l[Turn in!]' + completedHoverLines: '&aClick to turn quest in!' + turnedInTextLines: '&8[Completed!]' + turnedInHoverLines: '&8Already turned in!' + objectivesLine: '&c&lCíle:' + killQuestDefaultSummaryLine: '&c➤Kill $name:$color$current&0/$color$target' + rewardsLine: '&2&lOdměny:' + rewardsDefaultSummaryLine: '&2➤$amountx $rewardName &8($chance%)' +enhancement_menu: + shopName: '[EM] Menu očarování!' +get_loot_menu: + Menu name: '[EM] Menu kořisti' + tierTranslation: Level + itemFilterTranslation: Filter by items of this level. +guild_rank_selector_menu: + questTierSelectorMenuTitle: '[EM] Výběr hodnosti klanu' + lowTierWarning: '&cElity nemohou vyhodit lepší kořist!' + normalTierWarning: '&cElita nemůže vyhodit lepší kořist!' + notEnoughCurrencyMessages: '&7[EliteMobs] &4Nemáte dostatek Elitních mincí ($neededAmount $currencyName)! Prodejte nějaké elitní kořisti do [/em shop]! Máte $currentAmount $currencyName.' + unlockMessages: "&7[EliteMobs] &aOdemkli jste $rankName &arank za $price\\ \\ $currencyName. \n&6Šťastný lov!" + questCompleteBroadcastMessages: '&7[EliteMobs] &a$player &adosáhl/a $rankName &aguild hodnosti!' + failedMessages: '&7[EliteMobs] &cMusíš nejprve odemknout ostatní hodnosti!' + spawnRateModifierMessages: '&fElitní stvoření spawn rychlost modifikátor: &c$modifier%' + lootModifierMessages: '&fElitní stvoření kořist modifikátor: &a$modifier%' + difficultyModifierMessages: '&fElitní stvoření obtížnost modifikátor: &c$modifier%' + lootTierMessages: '&2Elity mohou dropnout až na $tier kořist!' + currencyBonusMessages: '&a$amountx coins from drops and quests!' + healthBonusMessages: '&cPřidá $amount ❤ z max. zdraví' + critBonusMessages: '&ePřidá $amount% šanci na kritik' + dodgeBonusMessages: '&ePřidá $amount% šanci na vyhnutí' +player_status_screen: + indexTexts0: '&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + indexTexts1: '&5&l/ag &7- &6EliteMobs Hub' + indexHovers1: |- + KLIKNI PRO POUŽITÍ + Místo, kde můžete najít + NPC které dávají úkoly, nakupují a + prodávají předměty, dávají rady a další! + indexTexts2: '&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + indexTexts4: '&6&lIndex' + indexTexts6: '&bp. $statsPage &8- &6Statistiky' + indexHovers6: Kliknutím přejdete! + indexTexts7: '&bp. $gearPage &8- &6Výbava' + indexHovers7: Kliknutím přejdete! + indexTexts8: '&bp. $teleportsPage &8- &6Teleporty' + indexHovers8: Kliknutím přejdete! + indexTexts9: '&bp. $commandsPage &8- &6Příkazy' + indexHovers9: Kliknutím přejdete! + indexTexts10: '&bp. $questsPage &8- &6Sledování úkolu' + indexHovers10: Kliknutím přejdete! + indexTexts11: '&bp. $bossTrackingPage &8- &6Sledování bosse' + indexHovers11: Kliknutím přejdete! + statsText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + statsText1: '&5&lHráčské statistiky:' + statsText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + statsText4: '&2Peníze: &a$money' + statsHover4: |- + Kill Elite Mobs to loot currency or + sell their drops in /em shop or + complete quests! + statsText6: '&6Cechovní úroveň: &3$guildtier' + statsHover6: |- + Úroveň proslulosti a cechu: + Cechovní úroveň určuje jak dobrou kořist můžete mít, nastavte váš bonus proslulosti v ostatních věcech. Úroveň proslulosti otvírá velice velké a silné odměny, jako například zvýšení životů, šance na vyhnutí/kritik, větší ukořistění měny a více! Můžete otevřít cechovní úrovně a úrovně proslulosti v /ag! + ⚜ = úroveň proslulosti, ✧ = cechovní úroveň! + statsText7: '&4Elitní zabití: &c$kills' + statsHover7: Množství zabitých elitních stvoření. + statsText8: '&4Max Lvl zabit: &c$highestkill' + statsHover8: |- + Úroveň nejnáročnějšího zabitého Elite Moba. + Úroveň Elite Mobů jsou zakládány na úrovni + vylepšení tvého vybavení! Vyšší úroveň vylepšení, + vyšší úrovně Elitních Mobů! + Poznámka: Počítá se pouze zabití bez jakéhokoliv zneužití! + statsText9: '&4Elite Smrti: &c$deaths' + statsHover9: Jsi byl zabit Elite Mobama. + statsText10: '&5Úkoly dokončeny: &d$quests' + statsHover10: |- + Amount of EliteMobs quests completed. + You can accept quests by talking to NPCs! + statsText12: '&bSkóre: &3$score' + statsHover12: |- + Vaše EliteMobs skóre roste + když zabíjíte elite moby, + a klesne když zemřete + na elite moby. Vyšší úrovně + mobů dávají více skóre. + gearText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + gearText1: '&7&lBrnění & Zbraně:' + gearText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + gearText3: '&8&lÚrovně Vybavení:' + gearText4: ' ☠ - $helmettier' + gearHover4: '$helmet' + gearText5: ' ▼ - $chestplatetier' + gearHover5: '$chestplate' + gearText6: ' Π - $leggingstier' + gearHover6: '$leggings' + gearText7: ' ╯╰ - $bootstier' + gearHover7: '$boots' + gearText8: '{⚔ - $mainhandtier} {⛨ - $offhandtier}' + gearHover8: '{$mainhand}{$offhand}' + gearText10: '{dmg : $damage} {armr: $armor}' + gearHover10: '{Base damage dealt to Elite Mobs} {Damage reduction from Elite Mobs}' + gearText11: 'Úroveň hrozby: $threat' + gearHover11: | + Toto záleží na úrovni + EliteMoba, který se stvoří blízko Vás. + Vezme zbroj, zbraň v ruce, úroveň + guildy účtu. + teleportText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + teleportText1: '&2Teleporty' + teleportText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + teleportText3: Spawn + teleportHover3: Teleportování na spawn! + teleportText4: '&6§lMístečko Dobrodružníka' + teleportHover4: Teleportujte se do Dobrodružníkovo Guild Místečka! + onTeleportsHover: Klikněte pro teleportování! + commandsText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + commandsText1: '&3&lPříkazy:' + commandsText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + commandsText4: '&5/Ag' + commandsHover4: |- + KLIKNI PRO POUŽITÍ + Místo, kde můžete najít + NPC které dávají úkoly, nakupují a + prodávají předměty, dávají rady a další! + commandsText6: '&5/shareitem' + commandsHover6: |- + KLIKNI PRO POUŽITÍ + Sdílí položku, kterou držíte, + do chatu! + questTrackerText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + questTrackerText1: '&6&lÚkoly:' + questTrackerHover1: Talk to NPCs to accept quests! + questTrackerText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + onQuestTrackHover: Klikněte pro opuštění! + bossTrackerText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + bossTrackerText1: '&4&lStopování Bosse:' + bossTrackerHover1: Velcí bossové se zde zobrazí! + bossTrackerText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + onBossTrackHover: Klikněte pro sledování / zrušení sledování! + teleportChestMenuName: '&2EliteMobs Teleports' + bossTrackerChestMenuName: '&2EliteMobs Boss Tracking' + indexChestMenuName: '&2EliteMobs Index' + gearChestMenuName: '&2EliteMobs Gear' + statsChestMenuName: '&2EliteMobs Stats' + commandsChestMenuName: '&2EliteMobs Commands' +procedural_shop_menu: + Shop name: '[EM] Obchod s procedurálními položkami' + Full inventory message: '&[EliteMobs] &4Váš inventář je plný! Nemůžete si koupit předměty, dokud nezískáte nějaké volné místo.' +quest_menu: + menuName: '[EM] Výběr úkolu' + cancelQuestMessage1: '&c&l&m&o---------------------------------------------&cMůžete mít pouze jednu zakázku najednou! Zrušením probíhající zakázky se obnoví průběh!' + cancelQuestMessage2: '&2[Klikněte zde pro zrušení aktuálního úkolu!]' + cancelQuestMessage3: '&7Stav úkolu můžete vidět pomocí příkazu &a/em quest status&c&l&m&o-----------------------------------------------------' + questCancelMessage: '&7[EliteMobs] &cVáš probíhající úkol byl zrušen!' + questStartTitle: Přijali jste úkol! + questStartSubtitle: Zabij $objectiveAmount $objectiveName + questCompleteTitle: Úkol dokončen! + questCompleteSubtitle: Zabil jsi $objectiveAmount $objectiveName + bossBarObjective: Zabij $objectiveAmount $objectiveName + questRewardMessage: '&7[EM] &aÚkol dokončen! &6Tvá odměna je &2$reward $currencyName' + questCompleteBroadcastMessage: '&7[EM] $player &2dokončil $rank &2úkol!' + questStartBroadcastMessage: '&7[EM] $player &2příjmul $rank &2úkol!' + questStatusMessage: '&7[EM] &aZabil jsi &a$currentAmount &f/ &c$objectiveAmount &a$objectiveName' +refiner_menu: + shopName: '[EM] Place 10 scrap!' +repair_menu: + shopName: '[EM] Repair menu!' +scrapper_menu: + shopName: '[EM] Scrapper' +sell_menu: + shopName: '[EM] Prodejný Obchod' +smelt_menu: + shopName: '[EM] Place 25 scrap!' +unbind_menu: + shopName: '[EM] Unbind menu!' +taunt: + onDamaged: + - Ow! + - Oi! + - Stop that! + - Why?! + - You fight like a Dairy Farmer! + - You are a pain in the backside! + - En garde! Touche! + - Hacks! + - My health is bugged, unkillable! + - Your hits only make me stronger! + - Sticks and stones... + - '''tis but a flesh wound!' + - Emperor protects! + - Herobrine, aid me! + - Behind you! A creeper! + - I have made a terrible mistake. + - What doesn't kill me... + - Zombies dig scars + - I shall show you my true power! + - Prepare for my ultimate attack! + - My reinforcements are arriving! + - You're going to pay for that! + - That's going to leave a mark! + - An eye for an eye! + - Health insurance will cover that + - I felt that one in my bones + - '''tis but a scratch' + - What was that? A soft breeze? + - You'll never defeat me like that + - Pathetic. + - Weak. + - That didn't even dent my armor! + - This is going to be an easy one + - My grandchildren will feel that + - Are you even trying? + - An admin just fully healed me + - Haxxor! + - Me? Damaged? Hacks! + - I can't be defeated! + - Good thing I'm using hacks! + - Watch out! Herobrine behind you! + - My life for Aiur! + - Your home is getting griefed! + - Why can't we be friends? + - Valhalla! + - Notch save me! + - No retreat! + - Hit me with your best shot! + onDamagedByBow: + - Fight me like a Player! + - Afraid to come up-close? + - I can smell your fear from here! + - Did you forget your sword? + - Coward! Bow are no fair! + - Bows? That's so 2011... + - Bows are for the weak of mind! + - Bows are for the weak of spirit! + - Bows are for the weak of heart! + - I thought we agreed no bows! + - Bows? You'll regret that + - Ow! + - Oi! + - Stop that! + - Why?! + - You fight like a Dairy Farmer! + - You are a pain in the backside! + - En garde! Touche! + - Hacks! + - My health is bugged, unkillable! + - Your hits only make me stronger! + - Sticks and stones... + - '''tis but a flesh wound!' + - Emperor protects! + - Herobrine, aid me! + - Behind you! A creeper! + - I have made a terrible mistake. + - What doesn't kill me... + - Zombies dig scars + - I shall show you my true power! + - Prepare for my ultimate attack! + - My reinforcements are arriving! + - You're going to pay for that! + - That's going to leave a mark! + - An eye for an eye! + - Health insurance will cover that + - I felt that one in my bones + - '''tis but a scratch' + - What was that? A soft breeze? + - You'll never defeat me like that + - Pathetic. + - Weak. + - That didn't even dent my armor! + - This is going to be an easy one + - My grandchildren will feel that + - Are you even trying? + - An admin just fully healed me + - Haxxor! + - Me? Damaged? Hacks! + - I can't be defeated! + - Good thing I'm using hacks! + - Watch out! Herobrine behind you! + - My life for Aiur! + - Your home is getting griefed! + - Why can't we be friends? + - Valhalla! + - Notch save me! + - No retreat! + - Hit me with your best shot! + onDamage: + - A solid hit! + - He shoots, and he scores! + - You'll feel that in the morning! + - Victory approaches! + - Victory shall be mine! + - That was only half of my power! + - You came to the wrong hood! + - You messed with the wrong mob! + - Get ready to get mobbed on! + - This was your last mistake! + - Feel the burn! + - John Cena + - How are you still standing? + - Just give up already! + - Give up! + - I have the high ground! + - I will end you! + - Hope you came prepared for pain! + - The hunter becomes the hunted! + - Blood for the blood throne! + - Skulls for the skull throne! + - A good player is a dead player! + - Git gud! + - Praise the Sun! + - The end draws near! + - You are not prepared. + - Zug zug! + - Hardly worth my time! + - I thought this was a challenge? + - 'Pro tip: don''t get hit' + - Ima firin mah lazer bwooooooooo + - For the Emperor! + - Herobrine shall be pleased! + - This is the end for you! + - Are you even trying? + - Weakling! + - Pathetic. + - Maybe this will wake you up. + - This is just the beggining! + - We're just getting started! + - That was just a warm-up! + - You are no match for me! + - RKO out of nowhere! + - I can do this all night long! + - A fine punching bag! + - I am the night! + - I wonder what will break first + - Revenge for Steve! You monster! + - Join the mob side! + - Too easy, too easy! + - Too easy! + - You can't defeat me! + - Pikachuuuuuu + - Avada kedavra! + - Crucio! + - Jierda! + - A critical hit! + - This is what skills looks like! + - 9001 damage! + - Still standing? + - Face your defeat! + - A taste of pain to come! + - I'll make you endangered! + onDeath: + - Alas, poor Yorick! + - The rest is silence + - I shall return + - Unforgivable + - I live, I die, I live again! + - WITNESS ME + - I ride to valhalla! + - VALHALLA! + - VALHALLA! DELIVERANCE + - You win, this time + - A blight upon your land! + - A pox upon thee! + - You'll join me soon enough! + - This is not over + - Death is but a setback + - Not like this... + - I just wanted to go into space + - We could've been friends + - Your sins crawling on your back + - See you in a bit + - See you later + - I'll be waiting for you + - I will be avenged! + - I won't go gently into the night + - Should've gotten life insurance + - It was my last day on the job + - It was my last day here + - Et tu, Brute? + - RIP + - x.x + - (x.x) + - xox + - Fainted + - GG, WP + - GG + - WP + - GG no RE + - HAX + - Hacker + - Not fair I was lagging + - You win, this time + - You monster... + - Mediocre... + onTarget: + - OI! Get over here! + - What's that I see? A coward? + - Sir, prepare your fisticuffs! + - Let's settle this like cavemen! + - En garde! + - Look out! A creeper, behind you! + - Aren't you a right ugly mug! + - You look delicious. + - Prepare for trouble! + - Let the best click spammer win! + - SPARTAAAAAA + - I am actually level 9001 + - Not an Elite Mob + - Poorly disguised Elite Mob + - Ah, fresh prey! + - The hunter becomes the hunted! + - Killing me crashes the server + - I'm actually a disguised player! + - I'm not going to drop any loot! + - Why can't we be friends? + - Sssssss + - This is my last day on the job! + - Stop right there criminal scum! + - Prepare to die! + - Praise the Sun! + - Git gud + - Alea jacta est! + - Facta, non verba! + - Skulls for the skull throne! + - Blood for the blood throne! + - A sacrifice for Herobrine! + - I shall pierce the heavens! + - Just who do you think I am!? + - A weakling! He's mine. + - Dibs on the weakling! + - Accio player! + - A duel to the death! + - I challenge you to a duel! + - Pika pika! + - Did you just call me an infernal + - What did you just call me? + - I know what you did you monster! + - This is how your story ends! + - Prepare for trouble! + - I've been preparing for this! + - I am prepared. Are you? + - A worthy foe! + - A worthy opponent! + - A newbie! It's my lucky day! + - Your stuff or your life! + - This is a robbery! + - It's you! You monster! + - So hungry, give me your flesh! + - There he is! + - Must've been my imagination + - Hi I'm Mr Meeseeks! + - I'm Mr Meeseeks, look at me! + - Your diamonds or your life! + - For king and country! + - Hit me with your best shot! + - Witness me! + - Witness me blood bag! + - I go all shiny and chrome! +zombie_friends: + friend1Name: 'BFF #1' + friend2Name: 'BFF #2' + friendDeathMessage: + - Neeee! + - Mediocre! + - Zacharias! + - Je mrtvější než předtím! + - Vengeance! + - Pomsta! + - Nemohu věřit, že jste to udělali. + originalEntityDialog: + - Pojďme hrát ZombieCraft později! + - Pociťte sílu přátelství! + - El pueblo, unido! + - Zavolal jsem své přátele! + - BFF power! + - Jeden za všechny! + - Dostaň ho! + - Kašlu na vás kluci, jdu domu! + reinforcementDialog: + - Nezkoušejte to na naše kamarády! + - Kryjeme ti záda Zachu! + - Posila je tady! + - Jeden za všechny, jeden za všechny! + - To bude snadné! + - Vzdej se, jsme výš jak ty! + - Chceš jít brácho? + - Worldstaaaaaaaaar! + - Co děláte našemu příteli + - Pociťte sílu přátelství! + - Síla přátelství na 100%! + - Zombie, sestavit! + - Držíme ti záda kámo! + - Společně jsme lepší! + - Čím více je to veselé! + - Mám tě kámo! + - Všichni za jednoho! +zombie_necronomicon: + summoningChant: A není třeba se o tom uvažovat... Čepice je buď nejstarší, nebo posledním pánem Země, nebo že se obyčejná většina života a podstaty pohybuje sama. Staré Ony byly, staří Ony a staré Ony jsou. Ne v prostorech, které víme, ale mezi nimi, chodí poklidně a primálně, nerozeznatelně a k nám. Yog-Sothoth ví bránu. Jog-Sothoth je brána. Jog-Sothoth je klíčem a strážcem brány. Východ, přítomná, budoucnost, všichni jsou v Yog-Sothoth. On ví, kde staré Ony prolomily staré, a kde se znovu prolomí. On ví, kde měli zkažená zemská pole a kde je stále skákají, a proč se nikdo nemůže chovat Them jako oni běhoun. Podle jejich vůně mohou muži někdy vědět Them blízko, ale jejich zdání nemůže nikdo vědět, spoření pouze ve vlastnostech těch, kteří začali na lidstvu, a z nich existuje mnoho druhů a liší se od pravého eidolonu člověka až po tvar bez zraku nebo látky, což je Them. Mají neviditelné a pomíjejí se na osamělých místech, kde se hovořilo Slovo a Rites prošli ve svých sezonách. Větrné gibbery se svými hlasy a zemské mutace se svým vědomím. Ohýbali les a rozdrtili město, ale nemuselo by se lesy nebo město strkat ruku, která voní. Kadath v chladném odpadu pod známým Them, a co muž ví Kadath? Ledová poušť na jihu a potopená jezera oceánských kamenů, kde je jejich tuleně těžší, ale kdo viděl hluboko zamrzlé město nebo zapečetěnou věž dlouhou garážovanou mořskými řasami a holými? Velký Cthulhu je jejich bratranec, přesto může špehovat Them jen slabě. Jí! Šub-Niggurá! Jako lhostejnost budeš znát téma. Jejich ruka je u tvého krku, ale nevidíš Them; a jejich obydlení je dokonce s vaším střeženým prahem. Yog-Sothoth je klíčem k bráně, kde se kuličky setkávají. Mužská pravidla, kde jednou vládnou; brzy rozhodnou, kde teď člověk vládne. Po létě je zima, po zimě v létě. Čekají na pacienta a mocné, na tu zase vládnou. +zombie_parents: + deathMessage: + - Ty zrůdo! + - Moje dítě! + - Co jsi to udělal!? + - Pomsta! + - Neeee! + - Za to zaplatíte! + - Eh, byl adoptován + - Je mrtvý! Zase! + - Je mrtvější než předtím! + - You broke him! + bossEntityDialog: + - You're embarrassing me! + - He's bullying me! + - He's the one picking on me! + - I can deal with this alone! + - Leave me alone, I got this! + - Stop following me around! + - God this is so embarrassing! + - He took my lunch money! + - He's bullying me! + zombieDad: + - Get away from my son! + - Stand up for yourself son! + - I'll deal with him! + - Stop picking on my son! + - Why are you doing this? + - I'll talk to your parents! + - You go kiddo! + - Show him who's boss kiddo! + - Nice punch kiddo! + zombieMom: + - Hands off my child! + - Are you hurt sweetie? + - Did he hurt you sweetie? + - Let me see that booboo sweetie + - I'll talk to his parents! + - You forgot your jacket sweetie! + - Posture, sweetheart + - Break it up! + - Stop this! + - Did you take out the garbage? +elite_blaze: + name: '&fLvl &2$level &fElitní &eBlaze' + deathMessages: + - '$player &cbyl zapálen v plamenem od $entity!' +elite_cave_spider: + name: '&fLvl &2$level &fElitní &3Jeskynní Pavouk' + deathMessages: + - '$player &cse zapletl do $entity &cpavučiny!' +elite_creeper: + name: '&fLvl &2$level &fElitní &eCreeper' + deathMessages: + - '$player &cbyl odstřelen od $entity!' + - '$entity &cpostě odprásknul $player&c!' +elite_drowned: + name: '&fLvl &2$level &fElitní &eUtopenec' + deathMessages: + - '$player &cbyl svržen do hlubin od $entity!' + - '$player &cbyl utopen od $entity!' +elite_elder_guardian: + name: '&fLvl &2$level &fElitní &3Starší Strážce' + deathMessages: + - '$entity &czabránil $player &cprůzkumu hlubin!' +elite_guardian: + name: '&fLvl &2$level &fElitní &3Strážce' + deathMessages: + - '$entity &czabránil $player &cprůzkumu hlubin!' +elite_enderman: + name: '&fLvl &2$level &fElitní &3Enderman' + deathMessages: + - '$entity &cposlal $player &cdo voidu!' + - '$player &cse špatně podíval na $entity &c!' + - '$player &ca $entity &cse stali nejlepšími kamarádi!' +elitemob_endermite: + name: '&fLvl &2$level &fElitní &7Endermite' + deathMessages: + - '$entity &cje pro $player &cčím je David pro Goliáše!' +elite_evoker: + name: '&fLvl &2$level &fElitní &3Evoker' + deathMessages: + - '$player &cbyl očarován od $entity&c!' +elite_husk: + name: '&fLvl &2$level &fElitní &eHusk' + deathMessages: + - '$player &cbyl vyhlouben od $entity&c!' +elite_illusioner: + name: '&fLvl &2$level &fElitní &3Illusioner' + deathMessages: + - '$player&c propadl $entity''s &ciluzím!' +elite_iron_golem: + name: '&fLvl &2$level &fElitní &fIron Golem' + deathMessages: + - '$player &csi zahrával se špatným $entity&c!' + - '$player &cbyl naučen způsobu pěsti od $entity&c!' +elite_phantom: + name: '&fLvl &2$level &fElitní &ePhantom' + deathMessages: + - '$player &cměl jen špatnou noční můru o $entity&c!' + - '$player &cbude mít noční můry o $entity&c!' + - '$entity &cnaučil $player &chodnotu spánku!' +elite_pillager: + name: '&fLvl &2$level &fElitní &8Pillager' + deathMessages: + - '$entity &cvyplenil $player&c!' + - '$entity &czdrancoval $player&c!' +elite_polar_bear: + name: '&fLvl &2$level &fElitní &fPolar Bear' + deathMessages: + - '$player &cbyl utržen k smrti od $entity&c!' + - '$player &cbyl umučen k smrti od $entity&c!' +elite_ravager: + name: '&fLvl &2$level &fElitní &6Ravager' + deathMessages: + - '$entity &cukázal $player &ckdo to tu má na starost!' +elite_silverfish: + name: '&fLvl &2$level &fElitní &7Silverfish' + deathMessages: + - '$player &csi spletl $entity &cs kamenym blockem!' +elite_skeleton: + name: '&fLvl &2$level &fElitní &fSkeleton' + deathMessages: + - '$player &cse stal $entity &cšpendlíkovým polštářem!' + - '$entity &cchtěl vidět $player &ckosti!' +elite_spider: + name: '&fLvl &2$level &fElitní &7Spider' + deathMessages: + - '$player &cse zapletl do $entity &cpavučiny!' + - '$entity &cpohltil $player&c!' +elite_stray: + name: '&fLvl &2$level &fElitní &bStray' + deathMessages: + - '$player &cbyl vyveden z omylu od $entity&c!' +elite_vex: + name: '&fLvl &2$level &fElitní &bVex' + deathMessages: + - '$entity &cnaštval $player&c!' +elite_vindicator: + name: '&fLvl &2$level &fElitní &8Vindicator' + deathMessages: + - '$entity &cpotvrdil své bojové schopnosti $player&c!' +elite_witch: + name: '&fLvl &2$level &fElitní &5Witch' + deathMessages: + - '$player &cse stal $entity &ctestovacím subjektem!' + - '$player &cbyl očarován od $entity&c!' +elite_wither_skeleton: + name: '&fLvl &2$level &fElitní &8Wither Skeleton' + deathMessages: + - '$entity &cbrutalně zničil $player&c!' + - '$entity''s &cwitheroval $player &cpryč!' +elite_zombie: + name: '&fLvl &2$level &fElitní &2Zombie' + deathMessages: + - '$player &cbyl pohlcen od $entity&c!' + - '$entity &cse dostal k $player &cmozku!' +elite_ghast: + name: '&fLvl &2$level &fElitní &eGhast' + deathMessages: + - '$player &cse nedokázal vyhnout $entity&c &cohnivým koulím!' + - '$player &cbyl rozbit na kousky od $entity&c!' + - '$entity &cdostal slaninku hráče $player &c!' +elite_wolf: + name: '[$level] Elitní Wolf' + deathMessages: + - '$entity roztrhal $player na kousíčky!' + - '$player byl roztrhán na kusy od $entity!' +elite_ender_dragon: + name: '&fLvl &2$level &fElitní &3Ender Dragon' + deathMessages: + - '$entity &ctotálně zrušil $player!' +elite_shulker: + name: '&fLvl &2$level &fElite &5Shulker' + deathMessages: + - '$entity &cshowed $player &cnew heights!' +super_chicken: + name: '&2Super Slepice' +super_cow: + name: '&2Super Kráva' +super_mushroom_cow: + name: '&2Super Houbičková Kráva' +super_pig: + name: '&dSuper Prase' +super_sheep: + name: Super Ovce +elite_killer_bunny: + name: '&fLvl &2$level &fElite &cKiller Rabbit' + deathMessages: + - '$entity &cmade $player &cgo live in a farm upstate!' + - '$entity &ceducated $player using a stick and not a carrot!' +elite_llama: + name: '&fLvl &2$level &fElite &5Llama' + deathMessages: + - '$player &cwas spit on by $entity&c!' + - '$player &cwas made $entity&c angry!' +elite_warden: + name: '&fLvl &2$level &fElite &3Warden' + deathMessages: + - '$entity &csensed $player &cwas nearby!' +elite_goat: + name: '&fLvl &2$level &fElite &5Goat' + deathMessages: + - '$player &cwas rammed by $entity&c!' + - '$player &cwas run over by $entity&c!' + - '$player &cwas trampled by $entity&c!' + - '$player &cgot $entity&c horns!' +elite_zombified_piglin: + name: '&fLvl &2$level &fElitní &6Zombified Piglin' + deathMessages: + - '$player &cbyl ubit k smrti $entity&c!' + - '$entity &cdostal slaninku hráče $player &c!' +elite_zoglin: + name: '&fLvl &2$level &fElitní &dZoglin' + deathMessages: + - '$player &cměl problém s $entity &ca dostal přes rohy!' + - '$entity &cdostal slaninku hráče $player &c!' +elite_piglin: + name: '&fLvl &2$level &fElitní &ePiglin' + deathMessages: + - '$entity &cnačetl dobrou cenu pro $player!' + - '$entity &cnaučil $player &chodnotu spánku!' +elite_hoglin: + name: '&fLvl &2$level &fElitní &3Hoglin' + deathMessages: + - '$player &cměl problém s $entity &ca dostal přes rohy!' + - '$entity &cdostal slaninku hráče $player &c!' +elite_piglin_brute: + name: '&fLvl &2$level &fElitní &cPiglin Brute' + deathMessages: + - '$entity &cnaklepal $player!' + - '$entity &cbrutalizoval $player!' +elite_bee: + name: '&fLvl &2$level &fElitní &eVčela' + deathMessages: + - '$player &cbyl bodnut od $entity!' +MobCombatSettings: + bossLocationMessage: '&7[EM] &2[Klikni pro stopování!]' + bossKillParticipationMessage: '&eTvé poškození: &2$playerDamage' + defaultOtherWorldBossLocationMessage: '$name: V jiném světě!' + weakText: '&9&lWeak!' + resistText: '&c&lResist!' + fullHealMessage: '&2FULL HEAL!' +check_tier: + message1: '&7[EM] Tvoje bojová úroveň je $tier' + message2: '&7[EM] Tvůj bonus klanové úrovně je $tier' + message3: '&7[EM] &aVaše celková úroveň ohrožení je $tier' +check_tier_others: + message1: '&7[EM] Bojová úroveň $player je $tier' + message2: '&7[EM] Bonus klanu $player je $tier' + message3: '&7[EM] Celková úroveň ohrožení &a$player je $tier' +ScrapItemSettings: + scrapItemName: '&2Úroveň $level odpad' + scrapItemLore: + - '&aSeberte 25 šrotu stejné úrovně pro' + - '&avytvoření předmětu - vylepšení orbu!' + - '&aMůžeš také použít šrot k opravě' + - '&apředmětů a vyrábět vyšší úroveň šrotu!' + - '&2To můžeš v Dobrodružníkovo Guild Místečku!' + upgradeItemName: '&2Úroveň $level Vylepšení Orbu' + upgradeItemLore: + - '&aPoužij to u NPC Enhancera pro vylepšení' + - '&apředmětů až na úroveň$orbLevel!' +Quests: + questJoinMessage: '&aYou have accepted the quest $questName &a!' + questLeaveMessage: '&cYou have abandoned the quest $questName &c!' + questCompleteMessage: '&2You completed the quest $questName &2!' + leaveWhenNoActiveQuestsExist: '&cYou don''t currently have an active quest!' + questLeaveConfirmationMessage: '&cAre you sure you want to abandon your current quest? Do &a/em confirm &c to confirm your choice!' + questStartTitle: '&aQuest Accepted!' + questCompleteTitle: '&2Quest Completed!' + questLeaveTitle: '&cQuest Abandoned!' + killQuestChatProgressionMessage: '&8[EliteMobs]&c➤Kill $name:$color$current&0/$color$target' + fetchQuestChatProgressionMessage: '&8[EliteMobs]&c➤Get $name:$color$current&0/$color$target' + dialogQuestChatProgressionMessage: '&8[EliteMobs]&c➤Talk to $name:$color$current&0/$color$target' + questCapMessage: '&8[EliteMobs] &cYou have reached the maximum amount of active quests (10)! &4Abandon or complete at least one active quest if you want to get more quests!' + killQuestScoreboardProgressionMessage: '&c➤Kill $name:$color$current&0/$color$target' + fetchQuestScoreboardProgressionMessage: '&c➤Get $name:$color$current&0/$color$target' + dialogQuestScoreboardProgressionMessage: '&c➤Talk to $name:$color$current&0/$color$target' + chatTrackMessage: '&8[EliteMobs]&2 Click here to track your quest!' + chatTrackHover: '&2Click to track!' + chatTrackingMessage: '&8[EliteMobs]&9 You are now tracking a quest!' + chatTrackingHover: '&2Click to untrack/track! /em -> Quests to track a different quest!' + noQuestDestinationFound: '[EM] No quest destination found!' + questDestinationInOtherWorld: '[EM] Go to world $world!' + questAlreadyCompletedMessage: '&8[EliteMobs] &cYou already completed this quest!' + questPrerequisitesMissingMessage: '&8[EliteMobs] &cCan''t accept this quest yet!' + lowRankDynamicQuestWarning: '&8[EliteMobs] &cYou can''t take these quests with your current guild rank! Increase your guild rank to accept these quests.' + questTurnInObjective: '&a2Talk to $npcName' +Wormholes: + dungeonNotInstalledMessage: '&8[EliteMobs] &cDungeon $dungeonID &cis not installed! This teleport will not work.' + defaultPortalMissingMessage: '&8[EliteMobs] &cThis portal doesn''t seem to lead anywhere!' +Arenas: + notEnoughPlayersMessage: '&8[EliteMobs] &cYou need at least $amount to start the match!' + startingMessage: '&2Starting!' + startingSubtitle: '&2in $count...' + arenaFullMessage: '&4[EliteMobs] &cArena is full! You can spectate instead while you wait for it to finish!' + arenasOngoingMessage: '&4[EliteMobs] &cCan''t join the arena now - a match is currently happening! You can spectate instead while you wait for it to finish!' + arenaStartHintMessage: '&2[EliteMobs] &aYou can start the arena by doing &2/em start' + arenaQuitHintMessage: '&4[EliteMobs] &cYou can leave the arena by doing &4/em quit' + arenaJoinPlayerMessage: "&2[EliteMobs] &aYou can start the arena by doing &2/em\\ \\ start &aif there are at least &2$count &aplayers in it! \nYou can leave the\\ \\ arena by doing &c/em quit" + arenaJoinSpectatorMessage: '&2[EliteMobs] &aYou can leave the arena at any time using &2/em quit' + waveTitle: '&aWave &2$wave' + victoryTitle: '&2Victory!' + victorySubtitle: '&aCompleted &2$wave &awaves!' + defeatTitle: '&4Defeat!' + defeatSubtitle: '&cReached wave &4$wave&c!' + victoryBroadcast: Arena $arenaName was conquered by $players! + joinPlayerTitle: '&aStart with &2/em start &a!' + joinPlayerSubtitle: '&cLeave with &4/em quit &c!' + joinSpectatorTitle: '&aNow spectating!' + joinSpectatorSubtitle: '&cLeave with &4/em quit &c!' +ancient_corpse_drop_axe: + name: '&eButchers Cleaver' + lore: + - '&aRetrived from the' + - '&aAncient Corpse''s skull...' +animated_armor_drop_axe: + name: '&8Enchanted Axe' + lore: + - '&8This axe was almost the' + - '&8end of you.' +animated_armor_drop_boots: + name: '&8Enchanted Boots' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +animated_armor_drop_chestplate: + name: '&8Enchanted Chestplate' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +animated_armor_drop_helmet: + name: '&8Enchanted Helmet' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +animated_armor_drop_leggings: + name: '&8Enchanted Leggings' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +arachnid_matriarch_drop_boots: + name: '&bSilk Striders' + lore: + - '&bMade out of rare spider silk.' +baba_rhoga_drop_chest: + name: '&aWitches Robes' + lore: + - '&aThe smell should go' + - '&aaway eventually.' +baba_yaga_drop_helmet: + name: '&aWitches Hat' + lore: + - '&aThe smell should go' + - '&aaway eventually.' +balloon_rider_drop_leggings: + name: '&dRoomy Leggings' + lore: + - '&dVery comfortable and spacious leggings.' +banshee_drop_charm: + name: '&8Manifested Sorrow' + lore: + - '&8May this hardened sorrow protect' + - '&8you from grief.' +beast_tamer_drop_axe: + name: '&eGreat Axe' + lore: + - '&eHeavy enough to cleave any beast in two.' +berserker_charm: + name: '&bBerserkerův šarm' + lore: + - '&aZtratit se ve tváři' + - '&adrtivá nepřízeň ve více' + - '&dál než jedna...' +bigfoot_drop_chestplate: + name: '&eFur Armor' + lore: + - '&eNice and warm.' +big_bad_wolf_drop_chestplate: + name: '&aBig Bad Wolf Fur' + lore: + - '&aScary!' +bloated_jeffrey_drop_tear: + name: '&bSweet Tear' + lore: + - '&bYou made Jeffrey cry...' +bone_fiend_drop_leggings: + name: '&aBoney Leggings' + lore: + - '&aThe sharp bones attached to these' + - '&aleggings sure do rattle a lot.' +challengers_boots: + name: '&cChallenger''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_chestplate: + name: '&cChallenger''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_helmet: + name: '&cChallenger''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_leggings: + name: '&cChallenger''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_sword: + name: '&cChallenger''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +chameleon_charm: + name: '&bChameleoní šarm' + lore: + - '&aBarevný Chameleon může' + - '&aSplynout téměř kdekoli' + - '&apomalu se plíží kolem...' +changeling_drop_sword: + name: '&aCrystalline Sword' + lore: + - '&aThe blade shimmers as you gaze upon it.' +cheetah_charm: + name: '&bGepardův šarm' + lore: + - '&aGepard může dosáhnout rychlosti' + - '&a120 km/h... asi za 60' + - '&asekund. Nechat je počítat!' +circus_ringmaster_drop_charm: + name: '&dRingmasters Whip' + lore: + - '&dThis was used for terrible punishment.' +craftenmine_terror_drop_trident: + name: '&cGhast Lobotomizer' + lore: + - '&cPerfect for making sure that' + - '&cthe Ghasts stay grounded.' +creeperpede_drop_chestplate: + name: '&dExplosion Proof Vest' + lore: + - '&dMake ''BOOM!'' feel' + - '&dmore like ''boom''.' +crone_drop_axe: + name: '&fWitch Feller' + lore: + - '&fA fine axe that demands a fine hunt.' +depths_seeker: + name: '&2Hledač hloubek' + lore: + - '&9Vyjdi z hlubin neměřitelného' + - '&9a vyplenili z nejošklivější příšery' + - '&9Neexistuje žádná zpráva o hrůzách' + - '&9Tento rybářský prut byl viděn.' +divine_cinder_drop_charm: + name: '&6Divine Fire' + lore: + - '&6Blessed be the fire!' +dwarven_greed: + name: '&4Chamtivý trpaslík' + lore: + - '&cTi, kdo jsou příliš chamtiví' + - '&ca příliš hluboko může probudit starověký' + - '&cZtráty stínu a plamene' + - '&cNejlepší odešel nenarušený.' +elephant_charm: + name: '&bSloní šarm' + lore: + - '&aZískej sílu slona' + - '&auniknout, za cenu' + - '&arychlost sloního úniku!' +enders_drop_chestplate: + name: '&dEnder Shirt' + lore: + - '&dProtective and comfy!' +enders_drop_helmet: + name: '&dEnder Cap' + lore: + - '&dComfy but also quite sturdy.' +enders_drop_leggings: + name: '&dEnder Pants' + lore: + - '&dA bit too long but it will do.' +ender_lapin_drop_boots: + name: '&cDark Star Boots' + lore: + - '&cGives you the courage' + - '&cof running when in danger.' +endless_pursuer_drop_sword: + name: '&7Dark Blood Sword' + lore: + - '&7The sword seems to' + - '&7be weeping blood...' +enraged_snowman_drop_sword: + name: '&9Snowman''s Nose' + lore: + - '&9No wonder that the Snowman''s' + - '&9nose was so pointy...' +xmas_and_gold: + name: '&6and gold!' + lore: + - '&7Everyone wishes for silver' + - '&7and gold!' +xmas_and_goooooold: + name: '&6and goooooold!' + lore: + - '&7Everyone wishes for silver' + - '&7and gold!' +xmas_cornelius_pick: + name: '&bCornelius'' Pick' + lore: + - '&3If you throw it in the air' + - '&3and let it hit the ground,' + - '&3you may just find some' + - '&3peppermint!' +xmas_lost_present: + name: '&2Lost Present' + lore: + - '&2Turn this in for a reward!' +xmas_peppermint: + name: '&cPeppermint' + lore: + - '&fWhat I''ve been searching for all my life!' +xmas_siiiiilver: + name: '&7Siiiiilver' + lore: + - '&6Everyone wishes for silver' + - '&6and gold!' +xmas_silver: + name: '&7Silver' + lore: + - '&6Everyone wishes for silver' + - '&6and gold!' +xmas_substitute_elf_practice: + name: '&8Substitue Elf Practice' + lore: + - '&fThis doll needs its teeth fixed' +xmas_treat: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +xmas_treat_v2: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +evil_undead_drop_sword: + name: '&eTransient Blade' + lore: + - '&eIt will only serve' + - '&eyou for song long.' +fallen_knight_drop_boots: + name: '&e7Ancient Boots' + lore: + - '&7Even though the boots are old they' + - '&7still provide plenty of protection.' +fallen_knight_drop_chestplate: + name: '&e7Ancient Nether-Plate' + lore: + - '&7This armor might look plain to' + - '&7the untrained eye but is clear' + - '%7that anything wishing to penetrate' + - '&7it''s thick plate will need to be' + - '&7swung with considerable force.' +fallen_knight_drop_helmet: + name: '&e7Ancient Headgear' + lore: + - '&7Many swords have left their mark' + - '&7aon this helm but none have' + - '&7managed to break its defense.' +fallen_knight_drop_leggings: + name: '&e7Ancient Leggings' + lore: + - '&7You feel sorry for anyone that tries' + - '&7to strike these leggings.' +fine_swine_drop_sword: + name: '&6Fine Golden Sword' + lore: + - '&6A fine master-crafted golden sword.' + - '&6The molten gold flowing inside' + - '&6the sword makes sure that any damage' + - '&6to the blade is repaired swiftly.' +firefly_charm: + name: '&bSvětlušky šarm' + lore: + - '&aRozsvítit noc!' +firestarter_drop_helmet: + name: '&eFire Stopper' + lore: + - '&eOnly half the heat!' +fire_conjurer_drop_shield: + name: '&eFlame Touched Shield' + lore: + - '&eProtects against fire and flame.' +fishy_charm: + name: '&bRybí šarm' + lore: + - '&aProstě něco není' + - '&av pořádku s tímhle...' +fox_king_cold_drop_charm: + name: '&9Magical Snow' + lore: + - '&9You sense impossible energies' + - '&9coming from this snow.' +fulgora_drop_boots: + name: '&bMountain Boots' + lore: + - '&bShould be useful when' + - '&bexploring the mountains.' +goblin_ballista: + name: '&8Goblin Ballista' + lore: + - '&8A treasure among goblins!' +goblin_boots: + name: '&8Goblin Boots' + lore: + - '&8A treasure among goblins!' +goblin_chestplate: + name: '&8Goblin Chestplate' + lore: + - '&8A treasure among goblins!' +goblin_cleaver: + name: '&8Goblin Cleaver' + lore: + - '&8A treasure among goblins!' +goblin_helmet: + name: '&8Goblin Helmet' + lore: + - '&8A treasure among goblins!' +goblin_invasion_drop_chestplate: + name: '&aSmall Chestplate' + lore: + - '&aReally tight...' +goblin_invasion_drop_leggings: + name: '&aSmall Leggings' + lore: + - '&aWell, at least it really' + - '&ashows off your legs.' +goblin_leggings: + name: '&8Goblin Leggings' + lore: + - '&8A treasure among goblins!' +goblin_poker: + name: '&8Goblin Poker' + lore: + - '&8A treasure among goblins!' +goblin_shooter: + name: '&8Goblin Shooter' + lore: + - '&8A treasure among goblins!' +goblin_slasher: + name: '&8Goblin Slasher' + lore: + - '&8A treasure among goblins!' +grappling_arrow: + name: '&6Grappling Arrow' + lore: + - '&eFire at a TARGET BLOCK to grapple!' +greedy_dwarf_drop_pickaxe: + name: '&9Dwarven Need' + lore: + - '&cThose who delve too greedily' + - '&cand too deep may wake ancient' + - '&chorrors of shadow and flame' + - '&cbest left undisturbed.' +grunter_drop_axe: + name: '&cBig Oink' + lore: + - '&cThe axe has a tendency' + - '&cto squeal when swung.' +grunts_boots: + name: '&fGrunt''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_chestplate: + name: '&fGrunt''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_helmet: + name: '&fGrunt''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_leggings: + name: '&fGrunt''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_sword: + name: '&fGrunt''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +harmless_chicken_drop_boots: + name: '&aUseless Boots' + lore: + - '&aAt least they''re explosion proof...' +hog_rider_drop_boots: + name: '&a3.6 Radioactive Boots' + lore: + - '&aNot great, not terrible.' +horde_champion_drop_sword: + name: '&dHorde Eviscerator' + lore: + - '&dWhen you need to take' + - '&dcare of an undead horde.' +horrid_duplicator_drop_arrow: + name: '&aDuped Arrow' + lore: + - '&2Looks and feels' + - '&2like the real thing...' +horrid_duplicator_drop_bow: + name: '&4Fiery Bone Bow' + lore: + - '&4This bow is made out of' + - '&4a single large bone.' +invasion_alien_treat: + name: '&6Alien treats' + lore: + - '&6The taste is out of this planet!' +invasion_cheap_plasma_boots: + name: '&2Cheap Plasma Boots' + lore: + - '&aBlast off!' + - '&cNote: &8Double shift to activate!' +invasion_low_grade_tinfoil_bolt_caster: + name: '&7Low Grade Bolt Caster' + lore: + - '&7Get off my property!' +invasion_low_grade_tinfoil_boots: + name: '&7Low Grade Tinfoil Shoes' + lore: + - '&7Avoids floor radiation!' +invasion_low_grade_tinfoil_chestplate: + name: '&7Low Grade Tinfoil Chestpiece' + lore: + - '&7Prevents 6G from spying on your pacemaker!' +invasion_low_grade_tinfoil_hat: + name: '&7Low Grade Tinfoil Hat' + lore: + - '&7I want to believe!' +invasion_low_grade_tinfoil_leggings: + name: '&7Low Grade Tinfoil Pants' + lore: + - '&7Made for running from aliens!' +invasion_polished_plasma_boots: + name: '&2Polished Plasma Boots' + lore: + - '&aBlast off!' + - '&cNote: &8Double shift to activate!' +invasion_quality_bolt_caster: + name: '&7Quality Bolt Caster' + lore: + - '&7Get off my property!' +invasion_quality_tinfoil_boots: + name: '&7Low Grade Tinfoil Shoes' + lore: + - '&7Avoids floor radiation!' +invasion_quality_tinfoil_chestplate: + name: '&7Quality Tinfoil Chestpiece' + lore: + - '&7Prevents 6G from spying on your pacemaker!' +invasion_quality_tinfoil_hat: + name: '&7Quality Tinfoil Hat' + lore: + - '&7Stay out of my head!' +invasion_quality_tinfoil_leggings: + name: '&7Quality Tinfoil Pants' + lore: + - '&7Made for running from aliens!' +invictus_boots: + name: '&4Invictus Boots' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_chestplate: + name: '&4Invictus Chestplate' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_helmet: + name: '&4Invictus Helmet' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_leggings: + name: '&4Invictus Leggings' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_pickaxe: + name: '&4Invictus Pickaxe' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_shovel: + name: '&4Invictus Shovel' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_sword: + name: '&4Invictus Sword' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +krampus_drop_boots: + name: '&1Snow Boots' + lore: + - '&1Made out of actual snow.' +large_hopper_drop_axe: + name: '&aHeavy Axe' + lore: + - '&aPerfect for chopping off heads.' +living_shadow_drop_boots: + name: '&5Shadow Boots' + lore: + - '&5Falling doesn''t hurt as much.' +lucky_charms: + name: '&bŠarm štěstí' + lore: + - '&aSoučástí kompletní snídaně!' + - '&cPoznámka: Naprosto není součástí' + - '&ckompletní snídaně.' +magmaguys_toothpick: + name: '&4Magmaguy &2Párátko' + lore: + - '&aZa téměř minové podmínky!' +merman_drop_trident: + name: '&1Merman Trident' + lore: + - '&1A Merman''s favorite weapon.' +meteor_shower_scroll: + name: '&7Meteorický svitek' + lore: + - '&4Zavolejte k ničení.' + - '&4Jedno použití.' +monster_of_the_deep_drop_trident: + name: '&3Bone Trident' + lore: + - '&3Made out of the bones' + - '&3of the Monster of the Deep.' +moon_spider_drop_sword: + name: '&fSilk Spun Sword' + lore: + - '&fRazor sharp silk surrounds' + - '&fthe iron core of this blade.' + - '&fThe blade will serve you,' + - '&ffor now...' +necromancer_drop_helmet: + name: '&cDark Omen Helm' + lore: + - '&cThere is something off' + - '&cabout this helmet.' +netherite_golem_drop_helmet: + name: '&8Ancient Helmet' + lore: + - '&8You''re not sure if you' + - '&8should put this on your' + - '&8head or send it to a museum.' +nether_escapee_drop_charm: + name: '&6Fire Amulet' + lore: + - '&6May the flames not harm you.' +nether_hag_drop_sword: + name: '&7Bewitched Sword' + lore: + - '&7All kinds of curses and' + - '&7enchantments flow through' + - '&7this sword.' +nightwing_drop_crossbow: + name: '&aSky Watcher' + lore: + - '&aKeeping the skies safe.' +night_crawler_drop_shield: + name: '&8Night Shield' + lore: + - '&8Almost unbreakable.' +night_crawler_drop_sword: + name: '&8Night Blade' + lore: + - '&e8The only answer to the' + - '&8threats of the night.' +novices_boots: + name: '&8Novice''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_chestplate: + name: '&8Novice''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_helmet: + name: '&8Novice''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_leggings: + name: '&8Novice''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_sword: + name: '&8Novice''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +oasis_beacons_brigandine: + name: '&8Beacon''s Brigandine' + lore: + - '&fSolid steel can repel' + - '&fmost attacks.' +oasis_chief_cultists_bow: + name: '&5Chief Cultist''s Bow' + lore: + - '&dThe necrotic war bow' + - '&dof the cultist chief.' +oasis_earthquake_boots_10: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_20: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_30: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_40: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_50: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_10: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_20: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_30: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_40: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_50: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_10: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_20: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_30: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_40: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_50: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_10: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_20: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_30: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_40: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_50: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_foundrys_flaming_hammer: + name: '&6Foundry''s Flaming Hammer' + lore: + - '&eThe Hammer of the foundry!' +oasis_foundrys_flux: + name: '&6Foundry''s Flux' + lore: + - '&eThe flux that''s infused in' + - '&eevery forged weapon!' +oasis_mask_of_the_warlock: + name: '&4Mask of the Warlock' + lore: + - '&7The stone is in his mask!' + - '&7The UV light will help him!' +oasis_monumental_lance: + name: '&3Monumental Lance' + lore: + - '&bSpearfishing is my hobby.' +oasis_oracles_shroud: + name: '&3Oracle''s Shroud' + lore: + - '&1Illusion is your weapon!' +oasis_page_of_darkness_I: + name: '&0Page of Darkness I' + lore: + - '&829 paces North' + - '&811 paces West' + - '&816 paces North' + - '&86 paces East' +oasis_page_of_darkness_II: + name: '&0Page of Darkness II' + lore: + - '&87 paces South' + - '&86 paces East' + - '&833 paces North' + - '&812 paces West' +oasis_page_of_darkness_III: + name: '&0Page of Darkness III' + lore: + - '&86 paces North' + - '&83 paces West' + - '&830 paces North' + - '&89 paces East' +oasis_page_of_darkness_index: + name: '&0Page of Darkness Index' + lore: + - '&8Tread carefully in darkness' + - '&8they know youve come.' + - '&8Be weary on the path ahead' + - '&8for balls of fire drum.' +oasis_page_of_darkness_IV: + name: '&0Page of Darkness IV' + lore: + - '&824 paces South' + - '&89 paces East' + - '&836 paces North' + - '&83 paces West' +oasis_page_of_darkness_V: + name: '&0Page of Darkness V' + lore: + - '&89 paces North' + - '&812 paces East' + - '&86 paces South' + - '&86 paces East' +oasis_page_of_darkness_VI: + name: '&0Page of Darkness VI' + lore: + - '&86 paces South' + - '&86 paces East' + - '&812 paces North' + - '&83 paces East' +oasis_page_of_darkness_VII: + name: '&0Page of Darkness VII' + lore: + - '&83 paces North' + - '&86 paces East' + - '&88 paces South' +oasis_page_of_darkness_VIII: + name: '&0Page of Darkness VIII' + lore: + - '&8Out of the shadow comes a light' + - '&8whose robes are dull gray, marred by fight.' + - '&8Of ice and snow, of fire and heat.' + - '&8Axes deflect, but swords defeat.' +oasis_page_of_libraris_I: + name: '&7Page of Libraris I' + lore: + - '&fUnder the bookshelf' + - '&fthat has no reflection' + - '&fwill appear unto you' + - '&fpassage and direction.' +oasis_page_of_libraris_II: + name: '&7Page of Libraris II' + lore: + - '&fThe bookshelf''s reflection' + - '&fholds more knowledge' + - '&f4 shelves more full of books' + - '&fthan its upward image!' +oasis_page_of_libraris_III: + name: '&7Page of Libraris III' + lore: + - '&fBearing slightly west' + - '&fof the bookshelf that holds the best.' + - '&fThe most knowledge does it keep.' + - '&fA favorite for those who reap.' +oasis_page_of_libraris_index: + name: '&7Page of Libraris Index' + lore: + - '&f5 papers to find,' + - '&f3 switches to flip,' + - '&fa door to be opened' + - '&fand in it shall ye slip.' +oasis_page_of_libraris_IV: + name: '&7Page of Libraris IV' + lore: + - '&fThe oracle of knowledge' + - '&fyeilds shocking surprise' + - '&ffrom depths of despair' + - '&fshall lightning bolts arise.' +oasis_page_of_libraris_V: + name: '&7Page of Libraris V' + lore: + - '&fHis last secret' + - '&fhe will try to hide' + - '&fthough use of shadow and puppets' + - '&fto strike you as you stride.' +oasis_page_of_plundering_I: + name: '&6Page of Plundering I' + lore: + - '&eHouses throughout the town' + - '&ehide their secrets up rather than down.' + - '&eGrapple or flight' + - '&ecan aid your plight.' +oasis_page_of_sentris: + name: '&1Page of Sentris' + lore: + - '&bA sentry''s armor is too tough' + - '&bwielding a sword, your fight will be rough.' +oasis_page_of_the_pharaoh_I: + name: '&0Page of the Pharaoh I' + lore: + - '&6A sacrifice on the altar' + - '&6must be made to pursue.' + - '&6But what shall ye offer?' + - '&red sandstone holds this clue.' +oasis_page_of_the_pharaoh_II: + name: '&0Page of the Pharaoh II' + lore: + - '&6The pharaohs halls are lined' + - '&6in the finest gold around.' + - '&6It shall be his undoing' + - '&6for from gold your damage shall abound.' +oasis_page_of_the_pharaoh_III: + name: '&0Page of the Pharaoh III' + lore: + - '&6The pharaohs walls are filled' + - '&6with perils and precious treasures.' + - '&6From the southwest corner of the room with blue windows' + - '&6streams very ominous pressures.' +oasis_page_of_the_pharaoh_index: + name: '&0Page of the Pharaoh Index' + lore: + - '&6The pharaoh is sealed' + - '&6within his tomb.' + - '&6He lies in wait, undisturbed;' + - '&6his traps will be your doom.' + - '&63 pages will help your adventure' + - '&6from being curbed.' +oasis_page_of_the_sewer_I: + name: '&0Page of the Sewer I' + lore: + - '&3There is a louse of unusual size.' + - '&3Its on the prowl, behold its prize.' + - '&3Plenty of treasure to be found' + - '&3all you have to do is swim around.' +oasis_page_of_the_sewer_II: + name: '&0Page of the Sewer II' + lore: + - '&3Activating the gates one by one' + - '&3will allow the water to flow.' + - '&3Swim up once it pours out' + - '&3then down the right tunnel you must go.' +oasis_page_of_the_sewer_index: + name: '&0Page of the Sewer Index' + lore: + - '&3Evil lurks where waters drain' + - '&3Be ever watchful, they''ll eat your brain!' + - '&3You must open 3 gates guarded by creatures' + - '&3lined with red sandstone features.' + - '&32 pages will guide you, do not strain.' +oasis_page_of_vampiris_I: + name: '&4Page of Vampiris I' + lore: + - '&cDozens of weapons have struck the beast' + - '&cand every blow it''s withstood.' + - '&cIt fears not the bite of stone, gold or diamonds in the least' + - '&cbut it trembles before wood.' +oasis_page_of_vampiris_II: + name: '&4Page of Vampiris II' + lore: + - '&cIf the warlock you seek to slight,' + - '&cbe prepared for a tough fight!' + - '&cThe second floor shall test your might,' + - '&cconquering it first is a rite.' +oasis_page_of_vampiris_III: + name: '&4Page of Vampiris III' + lore: + - '&cDown the spire and into the cave' + - '&cis the path of the brave.' + - '&cBeware of those returned from the grave,' + - '&cslay master for what you crave.' +oasis_page_of_vampiris_index: + name: '&4Page of Vampiris Index' + lore: + - '&cWithin the observatory' + - '&cthere lurks a creature' + - '&cwho has never seen the sun.' + - '&cFind 4 pages to help you' + - '&cescape alive!' +oasis_page_of_vampiris_IV: + name: '&4Page of Vampiris IV' + lore: + - '&cTwo chests of loot,' + - '&cDon''t wake the dead!' + - '&cOne under the stair,' + - '&cthe other where books can be read!' +oasis_pharaohs_feast: + name: '&6Pharaohs Feast' + lore: + - '&eA golden reminder' + - '&eof the once golden city' + - '&ecorrupted by the sands of time.' +oasis_pharaohs_flail: + name: '&0Pharaoh''s Flail' + lore: + - '&4The flail of the afterlife.' +oasis_pick_of_darkness: + name: '&1Pick of Darkness' + lore: + - '&bShining bright through' + - '&bthe shadows.' +oasis_sunkiller: + name: '&6Sunkiller' + lore: + - '&eIsnt that rock over there' + - '&ejust big enough for someone' + - '&eto hide behind?' +oasis_tohth: + name: '&8Oingo Boingo Brothers Adventure' + lore: + - '&fMy preminitions are absolute!' + - '&fIt is fate!' +okami_drop_leggings: + name: '&cOkami''s Blessing' + lore: + - '&cSpeed of the wolf.' + - '&cFire protection of a god.' +owl_charm: + name: '&bSový šarm' + lore: + - '&aStaňte se dokonalým nočním tvorem' + - '&apredátor!' +primis_artifexs_shield: + name: '&6Artifex''s Shield' + lore: + - '&eAn old relic from a more' + - '&edangerous time. It has been' + - '&erestored to its glory!' +primis_caeruleaums_hope: + name: '&9Caeruleaum''s Hope' + lore: + - '&8A relic of a bygone era, still sharp' + - '&8enough to hurt but rusty enough to' + - '&8belong in a museum!' +primis_catacomb_drop_boots: + name: '&7Dark Bone Footgear' + lore: + - '&7Unnaturally dark bones' + - '&7cover these boots.' +primis_catacomb_drop_boots_2: + name: '&7Dark Bone Footgear' + lore: + - '&7Unnaturally dark bones' + - '&7cover these boots.' +primis_catacomb_drop_chestplate: + name: '&7Dark Bone Armor' + lore: + - '&7Bones as dark as the abyss' + - '&7adorn this armor.' + - '&7The arrows will make quite a' + - '&7noise as they bounce off the bones.' +primis_catacomb_drop_chestplate_2: + name: '&7Dark Bone Armor' + lore: + - '&7Bones as dark as the abyss' + - '&7adorn this armor.' + - '&7The arrows will make quite a' + - '&7noise as they bounce off the bones.' +primis_catacomb_drop_leggings: + name: '&7Dark Bone Leggings' + lore: + - '&7The dark bones covering the' + - '&7leggings will make dangerous' + - '&7falls more survivable.' +primis_catacomb_drop_leggings_2: + name: '&7Dark Bone Leggings' + lore: + - '&7The dark bones covering the' + - '&7leggings will make dangerous' + - '&7falls more survivable.' +primis_catacomb_necromancer_drop_helmet: + name: '&5Dark Bone Cowl' + lore: + - '&5The cowl offers little protection,' + - '&5it only seeks blood and death.' +primis_catacomb_necromancer_drop_helmet_2: + name: '&5Dark Bone Cowl' + lore: + - '&5The cowl offers little protection,' + - '&5it only seeks blood and death.' +primis_catacomb_necromancer_drop_sword: + name: '&5Dark Bone Brand' + lore: + - '&5The unnaturally dark bone-brand' + - '&5glistens in the light' + - '&5ready to part anything' + - '&5that stands in it''s way.' +primis_catacomb_necromancer_drop_sword_2: + name: '&5Dark Bone Brand' + lore: + - '&5The dark bone-brand howls' + - '&5viciously with every swing' + - '&5as the air rushes through' + - '&5it''s hollow cavity.' +primis_cooked_rabbit: + name: '&cCooked Rabbit' + lore: + - Huh, did this rabbit overheat? +primis_diving_helmet: + name: '&1Diving Helmet' + lore: + - An old Diving Helmet. + - Still works just fine. +primis_fish_bait: + name: '&2Fish Bait' + lore: + - '&aLooks like you could reel big fish with these.' +primis_gladius_important_documents: + name: '&2Important Documents' + lore: + - '&aThe documents are sealed.' +primis_gladius_lord_promise: + name: '&5Assistance Agreement' + lore: + - '... hence, for the help lended during these most trying' + - times, Pontis Mille promises to return in kind at Gladius' + - darkest hour. +primis_gladius_supplies: + name: '&2Supplies' + lore: + - '&aFit to keep a soldier fed during a war.' +primis_gladius_sword: + name: '&5Gladius' + lore: + - '&8The very symbol of the Gladius Fortress.' +primis_gladius_the_good_stuff: + name: '&2The Good Stuff' + lore: + - '&aSmells... strong.' +primis_heirloom: + name: '&2Lost Heirloom' + lore: + - '&aSeems old, ancient even.' +primis_ice_village_alanus_dagger: + name: '&eAlanus'' Dagger' + lore: + - '&eA simple dagger with' + - '&erunes covering the handle.' +primis_ice_village_chains_shipment: + name: '&aShipment of Chains' + lore: + - '&aA lot of chains.' +primis_ice_village_escaped_prisoner_body: + name: '&cUnconcious Body' + lore: + - '&cHeavy.' +primis_ice_village_foot_of_mountain_chest_axe: + name: '&1Dull Frost Axe' + lore: + - '&1Freezing to the touch' +primis_ice_village_island_chest_trident: + name: '&3Magma''s Delight' + lore: + - '&3Those who look, shall find.' +primis_ice_village_living_nightmares_reward_chest: + name: '&3Fur Coat' + lore: + - '&3Made out of the' + - '&3toughest fur around.' +primis_ice_village_magical_ice_crystals: + name: '&1Fur Ice Crystal' + lore: + - Having the crystal near + - snow makes it react. +primis_ice_village_make_them_go_ouch_reward_leggings: + name: '&dViolet''s Spare Leggings' + lore: + - '&dMakes you wanna strut down the' + - '&droad and do some punishment.' +primis_ice_village_salmon: + name: '&2Fresh Salmon' + lore: + - You don't think you saw + - larger salmon in your life. +primis_ice_village_silence_reward_helmet: + name: '&aBoomers Helm' + lore: + - '&aShould handle an explosion or two.' +primis_ice_village_taking_the_bait_reward: + name: '&bNorthern Rod' + lore: + - '&bIt''s a well made fishing rod.' +primis_ice_village_violet_boots: + name: '&dViolet''s Leather Boots' + lore: + - '&dFancy leather boots with' + - '&da raised pointy heel.' +primis_ice_village_violet_leggings: + name: '&dViolet''s Fancy Leggings' + lore: + - '&dTight and slightly see-through' + - '&dwith beautiful flower motives.' +primis_ice_village_violet_whip: + name: '&dViolet''s Whip' + lore: + - '&dDelivers exquisite punishment.' +primis_ice_village_wanna_build_a_snowman_reward_boots: + name: '&3Frost Boots' + lore: + - '&3It''s just frost boots.' +primis_invaders_assassins_bow: + name: '&8Assassin''s Bow' + lore: + - '&aThe perfect way to give them' + - '&aa taste of their own medicine.' +primis_invaders_boots: + name: '&4Invader''s boots' + lore: + - '&aThese don''t smell so good.' +primis_invaders_bow: + name: '&8Invader''s Bow' + lore: + - '&aOnce blotted out the Sun.' +primis_invaders_captains_sword: + name: '&4Invader''s Captain Sword' + lore: + - '&aCurved and mean-looking.' +primis_invaders_chestplate: + name: '&4Invader''s chestplate' + lore: + - '&aRusty, ugly and smelly. Lovely!' +primis_invaders_helmet: + name: '&4Invader''s helmet' + lore: + - '&aBeats a concussion!' +primis_invaders_leggings: + name: '&4Invader''s leggings' + lore: + - '&aCould use some oil.' +primis_invaders_sword: + name: '&4Invader''s sword' + lore: + - '&aSuspiciously bloodstained.' +primis_lucky_pickaxe: + name: '&6Lucky Lickaxe' + lore: + - '&eShines bright, even underground.' + - '&eYou see LL engraved in the handle' +primis_monster_slaying_spear: + name: '&8Monster Slaying Spear' + lore: + - Turns Sea Monsters into barbecue. +primis_ogre_boots: + name: '&cOgre''s boots' + lore: + - '&7They''ll keep you nice' + - '&7and toasty.' +primis_ogre_chestplate: + name: '&cOgre''s chestplate' + lore: + - '&7Hot to the touch' +primis_ogre_helmet: + name: '&cOgre''s helmet' + lore: + - '&7You''ll be sweating bullets.' +primis_ogre_leggings: + name: '&cOgre''s leggings' + lore: + - '&7Smoldering slacks.' +primis_ogre_mines_lucky_pickaxe: + name: '&eLucky Pickaxe' + lore: + - '&aLucky, but useless.' +primis_ogre_mines_waterworks_chest_shield: + name: '&aSturdy Door' + lore: + - '&aIt''s just a door.' +primis_old_shield: + name: '&8Old Shield' + lore: + - '&7An old relic from a more' + - '&7dangerous time. It might be' + - '&7able to be mended, though...' +primis_pirate_boots: + name: '&4Pirate''s boots' + lore: + - '&aThese have a few too many' + - '&aholes to be useful.' +primis_pirate_bow: + name: '&8Pirate''s Bow' + lore: + - '&aNot quite a flintlock,' + - '&abut it will do!' +primis_pirate_chestplate: + name: '&4Pirate''s Chestplate' + lore: + - '&aBasically a t-shirt.' +primis_pirate_helmet: + name: '&4Pirate''s Helmet' + lore: + - '&aMissing an eye-patch.' +primis_pirate_leggings: + name: '&4Pirate''s leggings' + lore: + - '&aFeels like sea legs!' +primis_pirate_sword: + name: '&4Pirate''s sword' + lore: + - '&aCurved and mean-looking.' +primis_pointis_groves_heirloom: + name: '&2Valuable Heirloom' + lore: + - '&aThis is the second one of these that you retrieved.' +primis_pointis_mille_chest_dirty_note: + name: Dirty Note + lore: + - '&fThere was a really cool sword' + - '&fin here but it''s gone now.' +primis_pontis_beast_horn: + name: '&2Blood Drenched Horn' + lore: + - '&fOn closer inspection the horn isn''t' + - '&fcovered in blood but seems to' + - '&fbe made out of it.' + - '&fThe crystallized blood is incredibly sharp.' +primis_pontis_beast_scale: + name: '&2Toxic Fish Scale' + lore: + - '&fThe scale is rock hard on the outside.' + - '&fThe inside is covered in' + - '&ftoxic and acidic ooze.' +primis_pontis_beast_silk: + name: '&2Sun Soaked Silk' + lore: + - '&fThe silk is radiating light and warmth.' +primis_pontis_elf_drop_boots: + name: '&7Elf Boots' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_elf_drop_chestplate: + name: '&7Elf Chest-plate' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_elf_drop_crossbow: + name: '&7Elf Dark-bow' + lore: + - '&7The special projectiles that the bow' + - '&7uses are both sharp and blunt.' +primis_pontis_elf_drop_helmet: + name: '&7Elf Helmet' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_elf_drop_leggings: + name: '&7Elf Leggings' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_fields_berry_charm: + name: '&dLarge Berry' + lore: + - '&dThe fresh odor this berry emits' + - '&dcan be smelled from miles away.' + - '&dThe odor seems to have a calming' + - '&deffect on monsters and beasts.' + - '&dIt makes their attacks less vicious.' +primis_pontis_groves_brood_moher_drop_charm: + name: '&aCrawlers Torment' + lore: + - '&aThe silk radiates strong energy.' +primis_pontis_groves_nest_crawler_drop_shield: + name: '&7Magma''s Lure' + lore: + - '&7When the shield is held up' + - '&7it lures monsters into striking it.' +primis_pontis_groves_spider_boots_reward: + name: '&1Spider-legs Boots' + lore: + - '&1Boots made from spider legs and leather.' +primis_pontis_groves_tree_climbing_elf_bandits_reward_leggings: + name: '&aElf Pearl Leggings' + lore: + - '&aProtective leggings' + - '&aadorned with pearls.' +primis_pontis_mille_arena_knowledge: + name: '&2Knowledge' + lore: + - '&aImportant Knowledge.' +primis_pontis_mille_arena_reward_1: + name: '&4Star Touched Shield' + lore: + - '&7An ornate shield with a cosmos motive.' +primis_pontis_mille_arena_reward_2: + name: '&4Star Touched Chestplate' + lore: + - '&7A thousand tiny spiky stars stretch across the Chestplate.' +primis_pontis_mille_arena_reward_3: + name: '&4Star Touched Leggings' + lore: + - '&7The leggings sparkle like the stars in the sky.' +primis_pontis_mille_cat_quest_reward_charm: + name: '&9Cat''s Blessing' + lore: + - '&9If you hold it up all the' + - '&9way to your ear you can' + - '&9hear a slight purr.' +primis_pontis_mille_counselor_sword: + name: '&eStone of Far-speech' + lore: + - '&aYou can sense a presence coming from the stone.' +primis_pontis_mille_fields_beasts_reward_chest: + name: '&eHunters Pride' + lore: + - '&eThose who hunt cannot be the prey.' +primis_pontis_mille_fields_contest_berry: + name: '&dContest Berry' + lore: + - '&dA beautiful and very large berry.' + - '&dTruly a one in a million specimen.' +primis_pontis_mille_fields_do_it_yourself_reward_bow: + name: '&cHunters Bow' + lore: + - '&cA finely crafted bow.' + - '&cArrows fired from this' + - '&cbow will hurt any beast.' +primis_pontis_mille_fields_first_aid: + name: '&2First Aid Equipment' + lore: + - '&fEverything one would need" - "&fto treat serious injuries.' +primis_pontis_mille_fields_rat_drop_helmet: + name: '&fFeathered Rat Cap' + lore: + - '&fYou managed to make a' + - '&fcap out of your prey.' + - '&fHaving extracted the preys' + - '&fblinding properties, you have made' + - '&fit work in your favor.' +primis_pontis_mille_fields_rat_meat: + name: '&cRat Meat' + lore: + - Raw rat meat. No need to cook. +primis_pontis_mille_fields_stolen_berries: + name: '&4Stolen Berries' + lore: + - '&fIt''s the stolen berries' +primis_pontis_mille_fish_nets: + name: '&2Fish Nets' + lore: + - '&aCatching fish made easy!' +primis_pontis_mille_fresh_rat: + name: '&fFresh Rat' + lore: + - The cat will love this. +primis_pontis_mille_mines_goblined_up_in_the_maze_reward_axe: + name: '&aRuned Goblin Axe' + lore: + - '&aThere are runes etched into the axe handle.' + - '&aThey are quite faded by now.' + - '&aSeems like this axe was cursed at one point...' +primis_pontis_mille_mines_goblin_head: + name: '&2Fowl Goblin Feathers' + lore: + - '&aSo soft and prickly.' +primis_pontis_mille_parkour_reward_boots: + name: '&4Diamond Tree Boots' + lore: + - '&7Boots made out of special soft bark.' + - '&7Decorated with gems.' +primis_pontis_mille_reward_boots: + name: '&4Pontis Mille Boots' + lore: + - '&7Traditional Pontis Mille Boots' +primis_pontis_mille_reward_chest: + name: '&4Pontis Mille Chestplate' + lore: + - '&7A traditional Pontis Mille Chestplate' +primis_pontis_mille_reward_helmet: + name: '&4Pontis Mille Helm' + lore: + - '&7A traditional Pontis Mille Helm' +primis_pontis_mille_reward_leggings: + name: '&4Pontis Mille Leggings' + lore: + - '&7Traditional Pontis Mille Leggings' +primis_pontis_mille_reward_shield: + name: '&4Pontis Mille Shield' + lore: + - '&7A traditional Pontis Mille Shield' +primis_pontis_mille_reward_sword: + name: '&4Pontis Mille Katana' + lore: + - '&7Incredibly sharp' +primis_pontis_mille_serious_sewage_reward_helmet: + name: '&2Turtle Shell Helm' + lore: + - '&2Makes you wanna eat some pizza.' +primis_pontis_mille_sewage_keys: + name: '&2Sewage Keys' + lore: + - '&aA key ring with a lot of keys on it.' +primis_pontis_mille_sewers_ninja_drop_chestplate: + name: '&7Ninja Garb Chest-plate' + lore: + - Now you too are a Ninja +primis_pontis_mille_sewers_ninja_drop_leggings: + name: '&7Ninja Garb Leggings' + lore: + - Now you too are a Ninja +primis_pontis_mille_sewers_shredder_drop: + name: '&4Shredding Helmet' + lore: + - Full of small tiny razor blade + - like points on the exterior. +primis_pontis_mille_slums_chest_sword: + name: '&4Dull Pontis Mille Katana' + lore: + - '&7Incredibly sharp' +primis_pontis_mille_to_lycan_or_not_to_lycan_reward: + name: '&aFur Leggings' + lore: + - '&aTough and light' + - '&aMade out of fur and hide.' +primis_pontis_mines_goblin_drop_boots: + name: '&7Goblin Boots' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_chestplate: + name: '&7Goblin Chest-Plate' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_helmet: + name: '&7Goblin Helmet' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_leggings: + name: '&7Goblin Leggings' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_spear: + name: '&7Goblin Spear' + lore: + - '&7A nice and sharp stone at the end.' +primis_pontis_mines_goblin_drop_sword: + name: '&7Goblin Sword' + lore: + - '&7It''''s just a stone club with a handle.' +primis_pontis_redwoods_nasty_little_bandits_reward_boots: + name: '&2Forest Boots' + lore: + - '&2The boots seem to be made' + - '&2out of soft bark, leaves' + - '&2and crystallized tree sap.' +primis_pontis_redwoods_spider_legs: + name: '&2Spider Legs' + lore: + - '&aIt is just spider legs...' +primis_pontis_redwoods_tobacco: + name: '&2Premium Tobacco' + lore: + - '&aSmells amazing...' +primis_pontis_redwoods_watch: + name: '&2Sturdy Pocket Watch' + lore: + - '&aSuprisingly light and sturdy.' +primis_pontis_redwoods_werewolf_drop_chestplate: + name: '&7Fur Chest-Plate' + lore: + - '&7Made out of tough fur and hide.' + - '&7Light, but very tough.' +primis_roughspun_boots: + name: '&5Roughspun Boots' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_roughspun_chestplate: + name: '&5Roughspun Chestplate' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_roughspun_helmet: + name: '&5Roughspun Helmet' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_roughspun_leggings: + name: '&5Roughspun Leggings' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_ruins_bow: + name: '&8Ruined Bow' + lore: + - An old bow. Might've been good at some point. +primis_ruins_diary_entry: + name: Diary page + lore: + - '... I now regret chasing after the treasure in these ruins.' + - Now that I have fallen and broken my legs, it would seem + - as though I am fated to die under the treasure I sought. + - If only I had paid more attention during parkour class! +primis_ruin_relic_boots: + name: '&bRuin Relic Boots' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_ruin_relic_chestplate: + name: '&bRuin Relic Chestplate' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_ruin_relic_helmet: + name: '&bRuin Relic Helmet' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_ruin_relic_leggings: + name: '&bRuin Relic Leggings' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_rusty_mail_boots: + name: '&3Rusty Mail Boots' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_rusty_mail_chestplate: + name: '&3Rusty Mail Chestplate' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_rusty_mail_helmet: + name: '&3Rough Mail Helmet' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_rusty_mail_leggings: + name: '&3Rough Mail Leggings' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_starter_boots: + name: '&4Shipwreck''s Boots' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_chestplate: + name: '&4Shipwreck''s Chestplate' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_helmet: + name: '&4Shipwreck''s Helmet' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_leggings: + name: '&4Shipwreck''s Leggings' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_sword: + name: '&4Shipwreck''s Sword' + lore: + - '&aPossibly improvised from the beached remains of a ship!' +primis_storm_temple_drop_axe: + name: '&bStorm Axe' + lore: + - '&bThe wind shall repel them.' +primis_storm_temple_drop_boots: + name: '&bStorm Boots' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_storm_temple_drop_charm: + name: '&bStorm Necklace' + lore: + - '&bThe power of the storm.' +primis_storm_temple_drop_chestplate: + name: '&bStorm Chest-plate' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_storm_temple_drop_helmet: + name: '&bStorm Helmet' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_storm_temple_drop_leggings: + name: '&bStorm Leggings' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_terravilla_big_trouble_in_little_pub_reward_leggings: + name: '&eEarth''s Blessing' + lore: + - '&eLooks heavy but it is' + - '&esurprisingly light.' + - '&eIt is clear that these' + - '&eleggings are at least a' + - '&efew centuries old.' +primis_terravilla_drowning_terror_reward_charm: + name: '&aFish Charm' + lore: + - '&aFishy.' +primis_terravilla_hog_on_my_porch_reward_helmet: + name: '&6Hog Helmet' + lore: + - '&6Made out of tough Razorback leather.' +primis_terravilla_perfect_sample: + name: '&ePerfect Sample' + lore: + - '&eIt looks like a fish...' + - '&eBut it sure isn''t...' +primis_terravilla_strike_the_earth_reward_sword: + name: '&5Earth Splitter' + lore: + - '&5You pulled this blade out of' + - '&5the Earth Elementals corpse.' + - '&5Unlike it''s dull twin, this' + - '&5blade is in pristine condition.' +primis_terravilla_taking_out_the_trash_reward_sword: + name: '&9Earth Splitter' + lore: + - '&9Looks ancient and dull.' +primis_terravilla_two_legged_terror_growth: + name: '&eTwo Legged Terror Growth' + lore: + - '&eLarge fleshy growth.' +primis_terravilla_two_legged_terror_sample: + name: '&eTwo Legged Terror Sample' + lore: + - '&eIt''s a simple sample.' +primis_wolf_hide_boots: + name: '&5Wolf Hide Slippers' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_wolf_hide_chestplate: + name: '&5Wolf Hide Gambeson' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_wolf_hide_helmet: + name: '&5Wolf Hide Helmet' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_wolf_hide_leggings: + name: '&5Wolf Hide Pants' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +pufferfish_drop_helmet: + name: '&bPuffer Helm' + lore: + - '&bOnce a fish, now a helmet.' +rabbit_charm: + name: '&bZaječí šarm' + lore: + - '&aS tímto šarmem je' + - '&ajakýkoliv cíl je jen na skok,' + - '&apřeskoč a skoč pryč!' +rabbit_wolf_drop_chestplate: + name: '&6Electrically Charged Chestplate' + lore: + - '&6As long as you don''t mind a' + - '&6casual zap here and there.' +rabbit_wolf_drop_leggings: + name: '&6Flame Licked Leggings' + lore: + - '&6Just lightly scorched.' +regular_hoglin_drop_boots: + name: '&eHog Boots' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_chestplate: + name: '&eHog Armor' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_helmet: + name: '&eHog Hood' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_leggings: + name: '&eHog Leggings' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +rod_of_the_depths: + name: '&3Rod of the Depths' + lore: + - '&3You want to hear about where' + - '&3I got this from? Sit down lad,' + - '&3I''ve got a tale for ye...' +rotting_diver_drop_hoe: + name: '&bDivers Hoe' + lore: + - '&bFound on the Rotting Divers corpse.' +salamander_charm: + name: '&bSalamanderův šarm' + lore: + - '&aTéměř horký jako MagmaGuy' + - '&anový záznam!' +salty_corpse_drop_helmet: + name: '&aStinky Helm' + lore: + - '&aYou''re not sure why' + - '&ayou decided to pull' + - '&athis off of the corpse.' +scorpion_charm: + name: '&bŠkorpióní šarm' + lore: + - '&aLétat jako motýl,' + - '&abodat jako včela,' + - '&botrávit jako brambor!' +shulker_charm: + name: '&bShulker šarm' + lore: + - 'Já věřím že poletím' + - '&aJsem přesvědčen, že se mohu dotknout nebe' + - '&a a ty jdeš se mnou!' +skeleton_knight_drop_helmet: + name: '&fKnights Honor' + lore: + - '&fA knights helmet. Made to last.' +sky_archer_drop_bow: + name: '&aSky Bow' + lore: + - '&aGood for keeping phantoms at bay.' +slowpoke_charm: + name: '&bSlowpoke šarm' + lore: + - '&aDoufejme, že se to nedotkne' + - '&asám se ve svém zmatku...' +spider_knight_drop_helmet: + name: '&aSmall Helmet' + lore: + - '&aA decent helmet. Maybe, a bit tight.' +stacked_bones_drop_helmet: + name: '&6Skull' + lore: + - '&6Large enough to fit your' + - '&6head inside, so why not.' +summon_merchant_scroll: + name: '&6Přivolávací svitek obchodníka' + lore: + - '&aPotřebujete prodat předmět?' + - '&aKlikněte pravým tlačítkem myši pro aktivaci' + - '&aor yell &9Jeeves!' +summon_wolf_scroll: + name: '&6Přivolávací svitek vlka' + lore: + - '&aPřivolat hodného kluka' + - '&Pomůžeme ti s kousáním nepřátel!' + - '&aUjistěte se, že jste ho pohladili!' +super_mite_drop_charm: + name: '&dMite Pearl' + lore: + - '&dWas it worth it...' +air_ship_air_buccaneer_boots: + name: '&5Air Bucanneer''s Boots' + lore: + - '&dPerfect for air raids!' +air_ship_air_buccaneer_chestplate: + name: '&5Air Bucanneer''s Chestplate' + lore: + - '&dPerfect for air raids!' +air_ship_air_buccaneer_helmet: + name: '&5Air Bucanneer''s Helmet' + lore: + - '&dPerfect for air raids!' +air_ship_air_buccaneer_leggings: + name: '&5Air Bucanneer''s Leggings' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_boots: + name: '&5Air Pirate''s Boots' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_chestplate: + name: '&5Air Pirate''s Chestplate' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_helmet: + name: '&5Air Pirate''s Helmet' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_leggings: + name: '&5Air Pirate''s Leggings' + lore: + - '&dPerfect for air raids!' +air_ship_bowsmans_bow: + name: '&2Bowsman''s Bow' + lore: + - '&aDropped by the late' + - '&aairship bowsman!' +air_ship_cannon_powder: + name: '&cCannon Powder' + lore: + - '&8How else are you supposed' + - '&8to light the fuse?' +air_ship_daveys_digger: + name: '&4Davey''s Digger' + lore: + - '&cDavey doesn''t desire downtrodden' + - '&cdunderheads displaying his digger.' +air_ship_quartermasters_whip: + name: '&fQuartermaster''s Whip' + lore: + - '&7The quartermaster has a ' + - '&7schedule to keep.' +air_ship_wayfinders_windlass: + name: '&3Wayfinder''s Windlass' + lore: + - '&bUsed to guide ships' + - '&bwith nothing but the stars!' +pirate_ship_sea_feast: + name: '&6Sea feast' + lore: + - '&6A feast for the eyes' + - '&6and the health bar!' +pirate_ship_sea_ration: + name: '&eSea ration' + lore: + - '&eAn apple a day' + - '&ekeep the scurvy away' + - '&cNote: it does not' +catacombs_tier_10_miniboss_boots: + name: '&9Spiderweave boots' + lore: + - '&5As light as air!' +catacombs_tier_10_miniboss_spider_eye: + name: '&7Terragog''s eye' + lore: + - '&7Whispers from nowhere reach' + - '&7your ears while holding this...' +catacombs_tier_15_boss_bone: + name: The Picker + lore: + - '&fYou''ve got a bone to pick!' +catacombs_tier_15_boss_bow: + name: '&6The Bone Shaker' + lore: + - '&fThey''ll feel this one down to' + - '&ftheir bones!' +catacombs_tier_15_boss_shovel: + name: '&8Gravedigger' + lore: + - '&fThey''ll feel this one down to' + - '&ftheir bones!' +catacombs_tier_15_mimic_boss_shield: + name: '&3Shield of the lost Templar' + lore: + - Found in a mysterious chest in a + - secret room of ancient catacombs... +colosseum_pit_breaker: + name: '&4Pit Shatterer' + lore: + - '&4Veni' +colosseum_pit_filler: + name: '&4&lPit Filler' + lore: + - '&4Vici' +colosseum_pit_maker: + name: '&4&lPit Maker' + lore: + - '&4Vidi' +dark_cathedral_tier_75_sword: + name: '&0Cursed Sword' + lore: + - '&0&kChtulhu is the one true God.' + - '&0&kThis world is but a lamb' + - '&0&kto the slaughter' +darkspire_arzags_boots: + name: '&8Arzag''s War Boots' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_chestplate: + name: '&8Arzag''s War Chestplate' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_helmet: + name: '&8Arzag''s War Helmet' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_leggings: + name: '&8Arzag''s War Leggings' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_slicer: + name: '&8Arzag''s Slicer' + lore: + - '&7Once used by the might Arzag!' +darkspire_crypt_keepers_boots: + name: '&4Crypt Keeper''s Boots' + lore: + - '&cFormerly the boots of the' + - '&ccorrupt Crypt Keeper!' +darkspire_hellraisers_battle_armor: + name: '&4Eerbix''s Battle Armor' + lore: + - '&cFormerly the battle' + - '&carmor of the egregious' + - '&cEerbix the Fallen!' +darkspire_maalkvs_bow: + name: '&4Maalkv''s Bow' + lore: + - '&cFormerly the bow of the' + - '&cmischievous Maalkv!' +darkspire_netherite_axe: + name: '&8Void Eviscerator' + lore: + - '&8Shards of the void itself were' + - '&8collected to form the cleaving' + - '&8head of this ancient weapon.' +darkspire_nicolas_ribcages_helmet: + name: '&4Nicolas Ribcage''s Helmet' + lore: + - '&cFormerly the helmet of the' + - '&cnefarious Nicolas Ribcage!' +darkspire_oroxaks_sword: + name: '&4Oroxak''s Sword' + lore: + - '&cFormerly the sword of the' + - '&codious Oroxak!' +darkspire_zalmurs_leggings: + name: '&4Zalmur''s Leggings' + lore: + - '&cFormerly the leggings of' + - '&cthe zealous Zalmur' + - '&cthe Impslayer!' +the_feller: + name: '&2Feller' + lore: + - '&aDokonce ve vašem spánku,' + - '&aMůžete cítit tuto sekeru' + - '&a ničitele snů' +the_great_weaver_drop_charm: + name: '&cWeavers Silk' + lore: + - '&cGreat power is imbued into this silk.' +hallosseum_amazing_treat: + name: '&aAmazing Treat!' + lore: + - '&eAn amazing snack!' +hallosseum_axe_of_beheadings: + name: '&cAxe of Beheadings' + lore: + - '&4Famously used to decapitate a' + - '&4certain headless horseman!' +hallosseum_incredible_treat: + name: '&aIncredible Treat!' + lore: + - '&eAn incredible snack!' +hallosseum_treat: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +hallosseum_treat_v2: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +the_hunter_drop_crossbow: + name: '&aHunter''s Friend' + lore: + - '&aLet the hunt begin.' +northpole_amazing_treat: + name: '&aAmazing Treat!' + lore: + - '&eAn amazing snack!' +northpole_coalbringer: + name: '&8Coalbringer' + lore: + - '&cWhatever I touch' + - '&cStarts to melt in my clutch.' + - '&cI''m too much!' +northpole_frostcaster: + name: '&bFrostcaster' + lore: + - '&7Whatever I touch' + - '&7Turns to snow in my clutch!' + - '&7I''m too much' +northpole_incredible_treat: + name: '&aIncredible Treat!' + lore: + - '&eAn incredible snack!' +northpole_naughty_lister: + name: '&4The Naughty Lister' + lore: + - '&cTakes names. Doesn''t ask twice!' + - '&cHave you been naughty this year?' +northpole_treat: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +northpole_treat_v2: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +the_phantom_drop_chestplate: + name: '&dPhantom Gambison' + lore: + - '&dYou would say it is made out of soft' + - '&dand comfy fibrous cloth, but a blade' + - '&dwould not recoil from striking cloth.' +pirate_ship_tier_15_boots: + name: Pirate Sandals + lore: + - Make you want to + - go to the beach! +pirate_ship_tier_15_bow: + name: Pirate shortbow + lore: + - Perfect for boarding parties! +pirate_ship_tier_15_chestplate: + name: Pirate Shirt + lore: + - No shoes, no shirt + - no problem! +pirate_ship_tier_15_helmet: + name: Pirate Bandana + lore: + - No shoes, no shirt + - no problem! +pirate_ship_tier_15_leggings: + name: Pirate Sash + lore: + - These could use a wash! +pirate_ship_tier_15_sword: + name: Pirate marlinspike + lore: + - Loud and deadly! +pirate_ship_tier_20_miniboss_axe: + name: '&5Cookie''s Tenderizer' + lore: + - '&5You''ll feel that tomorrow!' +pirate_ship_tier_20_miniboss_chestplate: + name: '&5Cookie''s apron' + lore: + - '&5Has seen better days!' +pirate_ship_tier_25_boots: + name: '&aPirate shoes' + lore: + - '&aPerfect for thieving!' +pirate_ship_tier_25_bow: + name: '&aPirate musket' + lore: + - '&aCareful where you point it!' +pirate_ship_tier_25_chestplate: + name: '&aPirate vest' + lore: + - '&aProbably illegally obtained!' +pirate_ship_tier_25_helmet: + name: '&aPirate earrings' + lore: + - '&aWorth enough to pay for' + - '&aa funeral!' +pirate_ship_tier_25_leggings: + name: '&aPirate trousers' + lore: + - '&aFull of gold coins!' +pirate_ship_tier_25_miniboss_helmet: + name: '&5Helmsman''s Eyepatch' + lore: + - '&5How can you see better' + - '&5with it on!?' +pirate_ship_tier_25_miniboss_trident: + name: '&5Helmsman''s Trident' + lore: + - '&5Pointy end towards the enemy!' +pirate_ship_tier_25_sword: + name: '&aPirate cutlass' + lore: + - '&aTruly piratey!' +pirate_ship_tier_30_miniboss_axe: + name: '&5Crushy''s Chopper' + lore: + - '&5Step back!' +pirate_ship_tier_30_miniboss_shield: + name: '&5Crushy''s Shoulder' + lore: + - '&5Never skipped shoulder day!' +pirate_ship_tier_35_boots: + name: '&9Pirate boots' + lore: + - '&9Perfect for swashbuckling!' +pirate_ship_tier_35_bow: + name: '&9Pirate handcannon' + lore: + - '&9Blast em away!' +pirate_ship_tier_35_chestplate: + name: '&9Pirate straps' + lore: + - '&9Perfect for looting!' +pirate_ship_tier_35_helmet: + name: '&9Pirate eyepatch' + lore: + - '&9Not perfect for seeing!' +pirate_ship_tier_35_leggings: + name: '&9Pirate greaves' + lore: + - '&9Perfect for looting!' +pirate_ship_tier_35_miniboss_boots: + name: '&9Bodyguard''s boots' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_chestplate: + name: '&5Bodyguard''s straps' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_crossbow: + name: '&5Bodyguard''s handcannon' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_helmet: + name: '&5Bodyguard''s eyepatch' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_leggings: + name: '&5Bodyguard''s greaves' + lore: + - '&9For those with something to defend!' +pirate_ship_tier_35_miniboss_sword: + name: '&5Bodyguard''s cutlass' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_sword: + name: '&9Pirate cutlass' + lore: + - '&9Truly piratey!' +pirate_ship_tier_40_miniboss_crossbow: + name: '&5The Blunderbuss' + lore: + - '&5Spray ''n pray!' +pirate_ship_tier_40_miniboss_leggings: + name: '&5The Zaggers' + lore: + - '&5When they think you''re going!' + - '&5to zig, zag on them!' +pirate_ship_tier_45_boss_helmet: + name: '&5Captain''s eyepatch' + lore: + - '&5I don''t see any issues!' +pirate_ship_tier_45_boss_sword: + name: '&5Captain''s scimitar' + lore: + - '&5En garde, ye scurvy rats!' +the_ruins_boss_loot: + name: '&6Thor''s Axe' + lore: + - Only the pure of heart + - can wield this axe. +sewer_drowned_kings_boots: + name: '&4Drowned King''s Boots' + lore: + - '&cFormerly the boots of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_chestplate: + name: '&4Drowned King''s Chestplate' + lore: + - '&cFormerly the chestplate of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_crown: + name: '&4Drowned King''s Crown' + lore: + - '&cFormerly the crown of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_leggings: + name: '&4Drowned King''s Leggings' + lore: + - '&cFormerly the leggings of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_trident: + name: '&4Drowned King''s Trident' + lore: + - '&cFormerly the trident of the' + - '&cdevilish Drowned King!' +sewer_spelunkers_boots: + name: '&2Sewer Spelunker''s Boots' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential leggings!' +sewer_spelunkers_chestplate: + name: '&2Sewer Spelunker''s Chestplate' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential chestplate!' +sewer_spelunkers_helmet: + name: '&2Sewer Spelunker''s Helmet' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential helmet!' +sewer_spelunkers_leggings: + name: '&2Sewer Spelunker''s Leggings' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential leggings!' +sewer_spelunkers_sword: + name: '&2Sewer Spelunker''s Sword' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential sword!' +the_stinger: + name: '&eThe Stinger' + lore: + - '&aLétat jako motýl,' + - '&abodat jako včela!' +tree_defender_drop_shield: + name: '&7Living Wood Shield' + lore: + - '&7This shield will' + - '&7slowly repair itself.' +unbind_scroll: + name: '&5Svitek odčarování' + lore: + - '&5Umožňuje uživatelům zrušit prokletí' + - '&5předmět vázaný na duši na kovadlině!' + - '&5Používejte moudře!' +undead_farmer_drop_shovel: + name: '&8Manure Master' + lore: + - '&8Perfect for shoveling pig manure.' +unwanted_visitor_drop_bow: + name: '&1Frost Bow' + lore: + - '&9Makes you wanna chill' + - '&9and snipe from afar.' +vampire_manor_gargoyle_granulator: + name: '&8Gargoyle Granulator' + lore: + - '&cLightly dusted in garlic.' +vampire_manor_stake_your_claim: + name: '&4Stake your Claim' + lore: + - '&cLightly dusted in garlic.' +vampiric_charm: + name: '&bUpíří šarm' + lore: + - '&aNikdo si nemůže pamatovat, od kud' + - '&a to přišlo, a nikdo nemůže,' + - '&azapomenout jak nebezpečné to je...' +veterans_boots: + name: '&6Veteran''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_chestplate: + name: '&6Veteran''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_helmet: + name: '&6Veteran''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_leggings: + name: '&6Veteran''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_sword: + name: '&6Veteran''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +vex_top_drop_boots: + name: '&bVexed Boots' + lore: + - '&bWith mighty boots' + - '&bcomes mighty strength.' +warlock_drop_chestplate: + name: '&dWarlock Robes' + lore: + - '&dOffers good protection from spells.' +warlock_drop_helmet: + name: '&dWarlock Hood' + lore: + - '&dOffers good protection from spells.' +water_pest_drop_shield: + name: '&bWater Logged Shield' + lore: + - '&bIt''s pretty sturdy actually.' +wendigo_drop_sword: + name: '&8Blade of Starving' + lore: + - '&8This blade will always' + - '&8hunger for more blood.' +werehare_drop_charm: + name: '&eWerehare Trophy' + lore: + - '&eLuck and health to' + - 'ðose who carry it.' +werewolf_bone: + name: '&6Werewolf Bone' + lore: + - '&aHaving killed the alpha,' + - '&athis temporarily makes you!' + - '&athe wolves'' new leader' +wolfsbane: + name: '&7Wolfsbane' + lore: + - '&aMade from the remains of' + - '&aan alpha werewolf, all' + - '&awolves cower at the sight of it.' +yeti_drop_leggings: + name: '&eFur Leggings' + lore: + - '&eNice and warm.' +yezhi_baba_drop_boots: + name: '&aWitches Robes' + lore: + - '&aThe smell should go' + - '&aaway eventually.' +zombie_kings_axe: + name: '&4Zombie královská sekera' + lore: + - Sekera jedné zombie + - zavolat jejich krále. + - Krveprolití je hmatatelné. +airship_minidungeon: + name: '&6Vzducholoď' + customInfo: + - '&fÚžasná vzducholoď plná nemrtvých pirátů!' + - '&6Credits: MagmaGuy, 69OzCanOfBepis' + - '&6a říše Lotheridonu' + playerInfo: |- + Obtížnost: &6Střední + $bossCount bossů, od úrovně $lowestTier do $highestTier + &6Úžasná vzducholoď plná nemrtvých pirátů + &6pro zkušené hráče! + regionEnterMessage: '&8[EM] &cVstupování do nepřátelské letecké zóny!' + regionLeaveMessage: '&8[EM] Opouštění nepřátelské letecké zóny!' +binder_of_worlds_lair: + name: '&5Binder Of Worlds' + customInfo: + - '&5Největší výzva. Buďte připraveni!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Obtížnost: &6Noční můra + $bossCount úroveň $highestTier finální boss! + &5Nejtěžší boj v EliteMobs! + regionEnterMessage: '&8[EM] Realita se rozpadá kolem tebe. Tvá poslední výzva. &4Nejste připraveni!' + regionLeaveMessage: '&8[EM] &5Odešeli jste rozuzlení. Našli jste to, co jste hledali? Stojí to za to?' +catacombs_lair: + name: '&8The Catacombs' + customInfo: + - '&fNejlepší dungeon pro začátek!' + - '&6Credits: říše Lotheridonu' + playerInfo: |- + Difficulty: &cHard + $bossCount bosses, from tier $lowestTier to $highestTier + &2The best Lair challenge for groups of beginners! + regionEnterMessage: '&8[EM] &8Nyní vstupujete do Katakomb. Buďte opatrní s tím, co se tu objevý...' + regionLeaveMessage: '&8[EM] &8Opustili jste Katakomby. Stálo to za to?' +colosseum_lair: + name: '&6Koloseum' + customInfo: + - '&fPředstavujeme prvního skutečného světového bosse,' + - '&fvícefázová bitva, první jízdný boss,' + - '&fprvní maskovaný boss... opravdu epický boj!' + - '&6Credits: MagmaGuy & Maldini' + playerInfo: |- + Difficulty: &cHard + $bossCount bosses, from level $lowestTier to $highestTier + &cA true challenge for big groups of players! + regionEnterMessage: '&8[EM] &6Šampióni a vyzývatelé připravte se! &eDokažte svou sílu proti těm nejmocnějším nepřátelům!' + regionLeaveMessage: '&8[EM] &6Sbohem cestovateli! Vrať se brzy, abys ještě jednou ukázal svou sílu!' +dark_cathedral_lair: + name: '&8Temná katedrála' + customInfo: + - '&fPrvní EliteMobs doupě!' + - '&f klasický, který všechny servery potřebují!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &cHard + $bossCount level $highestTier Big Boss! + &cThe original minidungeon, a challenge for + &ca group of players or for veterans! + regionEnterMessage: '&8[EM] &8Vítej v temné katedrále. &4Smrt čeká uvnitř...' + regionLeaveMessage: '&8[EM] &8Nyní opouštíte temnou katedrálu. &4Čeká na váš návrat...' +dark_spire_minidungeon: + name: '&8Temná špičatá věž' + customInfo: + - '&fPrvní obsah s vysokou úrovní!' + - '&fVytvořeno pro ty, kteří chtějí skutečnou výzvu!' + - '&6Credits: 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &cA vast challenge for advanced players! + regionEnterMessage: '&8[EM] &1Probíhá invaze. &9Zastavte povstání!' + regionLeaveMessage: '&8[EM] &1Podařilo se vám je udržet zpět. &9Pro teď...' +fireworks_lair: + name: '&aFireworks' + customInfo: + - '&fThe 2021 4th of July map!' + - '&6Credits: MagmaGuy' + playerInfo: |- + Difficulty: &cHard + $bossCount level $lowestTier Big Boss! + &6An encounter full of explosions! + regionEnterMessage: '&8[EM] &eWelcome to the fireworks show!' + regionLeaveMessage: '&8[EM] &eYou''ve left the party!' +frost_palace_sanctum: + name: Frost Palace + customInfo: + - '&fA 7 phase fight against' + - the queen of ice! + - '&6Credits: MagmaGuy, Delio' + playerInfo: 'Difficulty: &45-man hard content!' + regionEnterMessage: '&bYou are stepping into the Frost Palace! Stay frosty!' + regionLeaveMessage: '&bYou have left the Frost Palace!' +hallosseum_lair: + name: '&cHallosseum' + customInfo: + - '&f2020 strašidelné halloweenské setkání!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &chard + $bossCount level $lowestTier Big Boss! + &6A fun Halloween challenge! + regionEnterMessage: '&8[EM] &4Koleda! &8Tvoje duše je moje!' + regionLeaveMessage: '&8[EM] &4Utekl jste s nedotčenou duší.' +invasion_minidungeon: + name: '&2The Invasion' + customInfo: + - '&fThe Halloween Minidungeon!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount aliens, from level $lowestTier to $highestTier + &6Don't get abducted! + regionEnterMessage: '&8[EM] &7Alien invasion in progress! Defeat the Mothership!' + regionLeaveMessage: '&8[EM] &7You have escaped the alien abductions! No one will ever believe you.' +north_pole_minidungeon: + name: '&9The North Pole' + customInfo: + - '&fVánoční minidungeon!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Obtížnost: &4Velmi těžké + $bossCount bossů, od úrovně $lowestTier do $highestTier + &cVánoce ve sněhové kouli! + regionEnterMessage: '&8[EM] &7Dostal jste se na severní pól! &fByl jste letos zlobivý?' + regionLeaveMessage: '&8[EM] &7Vraťte se zpět a navštivte. &fPříště tu bude spousta sladkostí!' +oasis_adventure: + name: 'Oáza' + customInfo: + - '&fObrovské dobrodružství pro začátečníky!' + - '&6Credits: 69OzCanOfBepis' + playerInfo: |- + Difficulty: &2Solo-able + $bossCount bosses, from level $lowestTier to $highestTier + &6A big adventure for people who know the ropes! + regionEnterMessage: '&8[EM] &6Dostali jste se do Oázi!' + regionLeaveMessage: '&8[EM] &6Odešli jste z Oázi!' +pirate_ship_minidungeon: + name: '&6Pirátská loď' + customInfo: + - '&fZábavný, náročný minidungeon plný' + - '&fbossů pro hráče, kteří se zdokonalují,' + - '&fpři EliteMobs!' + - '&6Credits: MagmaGuy & říše Lotheridonu' + playerInfo: |- + Obtížnost: &6Střední + $bossCount bossů, od úrovně $lowestTier do $highestTier + &6Jedno z nejlepších loveckých území pro&6anáročné dobrodruhy! + regionEnterMessage: '&8[EM] &3Nyní nastupuje na loď! &bZabíjejte a drancujte dle libosti!' + regionLeaveMessage: '&8[EM] &3Player přes palubu! &bVraťte se, až získáte mořského koníka vy nezkušený námořníku!' +primis_adventure: + name: '&7Primis' + customInfo: + - '&fA tutorial adventure for new players!' + - '&6Credits: 69OzCanOfBepis, MagmaGuy' + playerInfo: |- + Difficulty: &2Easy + $bossCount bosses, from level $lowestTier to $highestTier + &6A tutorial adventure for new players! + regionEnterMessage: '&8[EM] &6Primis awaits, strike the earth!' + regionLeaveMessage: '&8[EM] &6You have left Primis!' +sewers_minidungeon: + name: '&8Kanalizace' + customInfo: + - '&fNejvětší minidungeon který mohl kdy být!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Obtížnost: &6Střední + $bossCount bossů, od úrovně $lowestTier do $highestTier + &6Složité bludiště, s náročnými části! + regionEnterMessage: '&8[EM] &5Toto místo vypadá opuštěno... &dNěco se pohnulo v těchto kanalizacích!' + regionLeaveMessage: '&8[EM] &5Podařilo se ti zůstat nad vodou. &dMožná příště se utopíš.' +the_ruins: + name: '&6The Ruins' + customInfo: + - '&fA fight against a myth from' + - '&fNorse mythology, be prepared for a smiting!' + - '&6Credits: 69OzCanOfBepis, MagmaGuy' + playerInfo: |- + Difficulty: &cHard + $bossCount level $lowestTier Big Boss! + &cA tough fight against a Norse god! + regionEnterMessage: '&8[EM] &3Those who challenge the myths must be prepared for their downfall!' + regionLeaveMessage: '&8[EM] &3You now know what it takes to make a legend!' +vampire_manor: + name: '&cThe Vampire Manor' + customInfo: + - '&fPrepare to spill blood!' + - '&6Credits: MagmaGuy, 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &6A deadly manor full of blood thristy creatures! + &6Are you ready to face that which haunts the night? + regionEnterMessage: '&8[EM] &cTrespassing on dangerous grounds!!' + regionLeaveMessage: '&8[EM] &cNow leaving haunted land!' +alpha_werewolf_p1: + name: '$eventBossLevel &7Enraged Vindicator' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Alpha Wolf has been put down!' + - '&c&l 1. Útočník: $damager1name &cs $damager1damage poškozením!' + - '&6&l 2. Útočník: $damager2name &6s $damager2damage poškozením!' + - '&e&l 3. Útočník: $damager3name &es $damager3damage poškozením!' + - '&aZabijáci: $players' + - '&e&l---------------------------------------------' + locationMessage: '&7Enraged Vindicator: $distance blocks away!' + spawnMessage: '&cThe howls of an Alpha Werewolf are heard!' + deathMessage: '&aThe Alpha Werewolf has been stopped by $players!' + escapeMessage: '&4Dawn breaks, the Alpha Wolf vanishes without a trace!' +alpha_werewolf_p2: + name: '$eventBossLevel &7Alpha Werewolf' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Alpha Wolf has been put down!' + - '&c&l 1. Útočník: $damager1name &cs $damager1damage poškozením!' + - '&6&l 2. Útočník: $damager2name &6s $damager2damage poškozením!' + - '&e&l 3. Útočník: $damager3name &es $damager3damage poškozením!' + - '&aZabijáci: $players' + - '&e&l---------------------------------------------' + locationMessage: '&7Alpha Wolf: $distance blocks away!' + spawnMessage: '&cThe howls of an Alpha Werewolf are heard!' + deathMessage: '&aThe Alpha Werewolf has been stopped by $players!' + escapeMessage: '&4Dawn breaks, the Alpha Wolf vanishes without a trace!' +ancient_corpse: + name: '$eventBossLevel &eAncient Corpse' +animated_armor: + name: '$eventBossLevel &8Animated Armor' + locationMessage: '&cAnimated Armor: $distance blocks away!' + spawnMessage: '&cOh no! An Animated Armor has escape from it''s armor stand!' + deathMessage: '&aThe Animated Armor was stopped by $players!' + escapeMessage: '&4The Animated Armor is gone!' +arachnid_matriarch: + name: '$eventBossLevel &cArachnid Matriarch' + locationMessage: '&cArachnid Matriarch: $distance blocks away!' + spawnMessage: '&cA Matriarch has come to spread her brood across the land!' + deathMessage: '&aThe Matriarch and her brood were stopped by $players!' + escapeMessage: '&4The Matriarch has left!' +arachnid_matriarch_summon: + name: '$eventBossLevel &4Broodling' +armor_goblin: + name: '$eventBossLevel &3Armor Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Armor Goblin has been pillaged!' + - '&c&l 1. Útočník: $damager1name &cs $damager1damage poškozením!' + - '&6&l 2. Útočník: $damager2name &6s $damager2damage poškozením!' + - '&e&l 3. Útočník: $damager3name &es $damager3damage poškozením!' + - '&aZabijáci: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cArmor Goblin: $distance blocks away!' + spawnMessage: '&cAn Armor Goblin has been sighted!' + deathMessage: '&aAn Armor Goblin has been slain by $players!' + escapeMessage: '&4An Armor Goblin has escaped!' +baba_rhoga: + name: '$eventBossLevel &cBaba Rhoga' + locationMessage: '&cBaba Rhoga: $distance blocks away!' + spawnMessage: '&cA wicked hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +baba_rhoga_summon: + name: '$reinforcementLevel &4Baba Rhoga' +baba_yaga: + name: '$eventBossLevel &cBaba Yaga' + locationMessage: '&cBaba Yaga: $distance blocks away!' + spawnMessage: '&cA wicked hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +baba_yaga_summon: + name: '$reinforcementLevel &4Baba Yaga' +balloon_rider: + name: '$eventBossLevel &dBalloon Rider' + locationMessage: '&cBalloon Rider: $distance blocks away!' + spawnMessage: '&cA brave Balloon Rider has come to the Nether!' + deathMessage: '&aThe Balloon Rider has taken his last ride thanks to $players!' + escapeMessage: '&4The Balloon Rider has floated away!' +balloon_rider_mount: + name: '$eventBossLevel &5Ghastly Balloon' +balrog: + name: '$eventBossLevel &4Balrog' +banshee: + name: '$eventBossLevel &cBanshee' + locationMessage: '&cBanshee: $distance blocks away!' + spawnMessage: '&cA Banshee''s wail can be heard!' + deathMessage: '&aThe Banshee was silenced by $players!' + escapeMessage: '&4The Banshee has left!' +banshee_summon: + name: '$eventBossLevel &cGrief' +beast_master: + name: '$eventBossLevel &6Beast Master' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Beast Master has been savaged!' + - '&c&l 1. Útočník: $damager1name &cs $damager1damage poškozením!' + - '&6&l 2. Útočník: $damager2name &6s $damager2damage poškozením!' + - '&e&l 3. Útočník: $damager3name &es $damager3damage poškozením!' + - '&aZabijáci: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cBeast Master: $distance blocks away!' + spawnMessage: '&cThe Beast Master has been sighted!' + deathMessage: '&aThe Best Master has been slain by $players!' + escapeMessage: '&4The Beast Master has returned to the wilds!' +beast_tamer: + name: '$eventBossLevel &eBeast Tamer' + locationMessage: '&cBeast Tamer: $distance blocks away!' + spawnMessage: '&cA master of beasts roams the world!' + deathMessage: '&aThe Beast Tamer was stopped by $players!' + escapeMessage: '&4The Beast Tamer has left!' +beast_tamer_summon: + name: '$eventBossLevel &6Large Beast' +beast_tamer_summon_1: + name: '$eventBossLevel &6Beast' +beta_wolf: + name: '$reinforcementLevel &7Beta Wolf' +bigfoot: + name: '$eventBossLevel &fBigfoot' + locationMessage: '&cBigfoot: $distance blocks away!' + spawnMessage: '&cA mighty beast has appeared!' + deathMessage: '&aThe beast is no more thanks to $players!.' + escapeMessage: '&4The beast has escaped!' +big_bad_wolf: + name: '$eventBossLevel &fBig Bad Wolf' + locationMessage: '&cBig Bad Wolf: $distance blocks away!' + spawnMessage: '&cAnd he huffed and he puffed!' + deathMessage: '&aThe little piggies are now safe thanks to $players!' + escapeMessage: '&4The Big Bad Wolf has left!' +binder_of_worlds_phase_1_endermite_reinforcement: + name: '$reinforcementLevel &5Reality korumpór' +binder_of_worlds_phase_3_enderman_reinforcement: + name: '$reinforcementLevel &5Vrah skutečnosti' +binder_of_worlds_phase_3_ghast_reinforcement: + name: '$reinforcementLevel &5Skartovačka skutečnosti' +blayyze: + name: '$eventBossLevel &6Ohniváček' + deathMessages: + - '&e&l---------------------------------------------' + - '&6Ohniváček byl odpuzen!' + - '&c&l 1. Útočník: $damager1name &cs $damager1damage poškozením!' + - '&6&l 2. Útočník: $damager2name &6s $damager2damage poškozením!' + - '&e&l 3. Útočník: $damager3name &es $damager3damage poškozením!' + - '&aZabijáci: $players' + - '&e&l---------------------------------------------' + locationMessage: '&6????: $distance bloků pryč' + spawnMessage: '&cNěco přišlo z kráteru od meteoritu...' + deathMessage: '&6$players dokončil první kontakt.' + escapeMessage: '&6Mimozemšťané byly přesunuty do oblasti 51!' +bloated_jeffrey: + name: '$eventBossLevel &dBloated Jeffrey' + locationMessage: '&cBloated Jeffrey: $distance blocks away!' + spawnMessage: '&cIt''s Jeffrey! They are in the nether! Bring a bow!' + deathMessage: '&aBloated Jeffrey has been slain by $players!' + escapeMessage: '&4Jeffrey and his friends grew bored and they left!' +bloated_jeffrey_summon: + name: '$eventBossLevel &dJeffrey''s Friend' +bone_fiend: + name: '$eventBossLevel &7Bone Fiend' + locationMessage: '&cBone Fiend: $distance blocks away!' + spawnMessage: '&cA creature of bone and bone has appeared!' + deathMessage: '&aThe Bone Fiend was defeated by $players!' + escapeMessage: '&4The Bone Fiend found no bone and left!' +bone_fiend_mount: + name: '$eventBossLevel &8Bone Carrier' +changeling: + name: '$eventBossLevel &4Changeling' + locationMessage: '&cChangeling: $distance blocks away!' + spawnMessage: '&cA shape-shifter has entered this world.' + deathMessage: '&aThe Changeling was stopped by $players!' + escapeMessage: '&4The Changeling has escaped!' +changeling_p2: + name: '$eventBossLevel &4Changeling' +changeling_p3: + name: '$eventBossLevel &4Changeling' +changeling_p4: + name: '$eventBossLevel &4Changeling' +changeling_p5: + name: '$eventBossLevel &4Changeling' +changeling_p6: + name: '$eventBossLevel &4Changeling' +changeling_p7: + name: '$eventBossLevel &4Changeling' +charms_goblin: + name: '$eventBossLevel &2Charms Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Charms Goblin has been pillaged!' + - '&c&l 1. Útočník: $damager1name &cs $damager1damage poškozením!' + - '&6&l 2. Útočník: $damager2name &6s $damager2damage poškozením!' + - '&e&l 3. Útočník: $damager3name &es $damager3damage poškozením!' + - '&aZabijáci: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cCharms Goblin: $distance blocks away!' + spawnMessage: '&cA Charms Goblin has been sighted!' + deathMessage: '&aA Charms Goblin has been slain by $players!' + escapeMessage: '&4A Charms Goblin has escaped!' +circus_ringmaster: + name: '$eventBossLevel &dRingmaster' + locationMessage: '&cCircus Ringmaster: $distance blocks away!' + spawnMessage: '&cA terrible circus is in town!' + deathMessage: '&a$players has stopped the RIngmasters reign of abuse!' + escapeMessage: '&4The circus has left town!' +circus_ringmaster_summon: + name: '$eventBossLevel &5Tortured Animal' +circus_ringmaster_summon_1: + name: '$eventBossLevel &5Abused Clown' +circus_ringmaster_summon_2: + name: '$eventBossLevel &5Mistreated Balloon' +coins_goblin: + name: '$eventBossLevel &eCoins Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Coins Goblin has been pillaged!' + - '&c&l 1. Útočník: $damager1name &cs $damager1damage poškozením!' + - '&6&l 2. Útočník: $damager2name &6s $damager2damage poškozením!' + - '&e&l 3. Útočník: $damager3name &es $damager3damage poškozením!' + - '&aZabijáci: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cCoins Goblin: $distance blocks away!' + spawnMessage: '&cA Coins Goblin has been sighted!' + deathMessage: '&aA Coins Goblin has been slain by $players!' + escapeMessage: '&4A Coins Goblin has escaped!' +craftenmine_stacked_bones: + name: '$eventBossLevel &eArmed Skull' + locationMessage: '&cDr. Craftenmine''s Stacked Bones: $distance blocks away!' + spawnMessage: '&cA horrible Dr. Craftenmine creation is out in the wild!' + deathMessage: '&aThe horrible Stacked-Bones creation was slain by $players!' + escapeMessage: '&4Dr. Craftenmines horrible creation has escaped!' +craftenmine_stacked_bones_ankle: + name: '$eventBossLevel &6Armed Ankle' +craftenmine_stacked_bones_backbone: + name: '$eventBossLevel &6Armed Backbone' +craftenmine_stacked_bones_femur: + name: '$eventBossLevel &6Armed Femur' +craftenmine_stacked_bones_spine: + name: '$eventBossLevel &6Armed Spine' +craftenmine_terror: + name: '$eventBossLevel &cLobotimized Ghast' + locationMessage: '&cDr. Craftenmine''s Terror: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine creation is on the loose!' + deathMessage: '&aThe Lobotimized Ghast was slain by $players!' + escapeMessage: '&4The Lobotimized Ghast has left!' +craftenmine_terror_mount: + name: '$eventBossLevel &dGhast Carrier' +creeperpede_1: + name: '$eventBossLevel &5Creeperpede Observer' + locationMessage: '&cCreeperpede: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine experiment is on the loose!' + deathMessage: '&aThe Creeperpede was stopped in its tracks by $players!.' + escapeMessage: '&4AThe Dr. Craftenmine experiment has managed to escape!' +creeperpede_2: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_3: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_4: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_5: + name: '$eventBossLevel &5Creeperpede Carrier' +crone: + name: '$eventBossLevel &aOld Crone' + locationMessage: '&cOld Crone: $distance blocks away!' + spawnMessage: '&cAn Old Crone has wandered into this world!' + deathMessage: '&aThe Crone was vanquished by $players!.' + escapeMessage: '&4The Old Crone has left this world on her broom!' +crone_summon: + name: '$eventBossLevel &fPet Spider' +divine_cinder: + name: '$eventBossLevel &cDivine Cinder' + locationMessage: '&cDivine Cinder: $distance blocks away!' + spawnMessage: '&cA divine blaze has appeared!' + deathMessage: '&aThe Divine Cinder was defeated by $players!' + escapeMessage: '&4The Divine Cinder has smoked away!' +ember: + name: '$reinforcementLevel &cUhlíku' +enders_1: + name: '$eventBossLevel &dEnderlad' + locationMessage: '&cEnder Clique: $distance blocks away!' + spawnMessage: '&cA group of ender troublemakers have appeared.' + deathMessage: '&aThe Ender Clique was stopped by $players!' + escapeMessage: '&4The Ender Clique have left!' +enders_2: + name: '$eventBossLevel &dEnderchap' + locationMessage: '&cClique Member: $distance blocks away!' +enders_3: + name: '$eventBossLevel &dEnderdude' + locationMessage: '&cClique Member: $distance blocks away!' +ender_lapin: + name: '$eventBossLevel &aEnder Lapin' +endless_pursuer: + name: '$eventBossLevel &dEndless Pursuer' + locationMessage: '&cEndless Pursuer: $distance blocks away!' + spawnMessage: '&cIt will not stop chasing...' + deathMessage: '&aThe chase has stopped thanks to $players!' + escapeMessage: '&4The Pursuer has vanished!' +enraged_snowman: + name: '$eventBossLevel &1Enraged Snowman' + locationMessage: '&cEnraged Snowman: $distance blocks away!' + spawnMessage: '&cAn angry Snowman was sighted!' + deathMessage: '&aThe Enraged Snowman was put to rest by $players!' + escapeMessage: '&4The Enraged Snowman has vanished!' +evil_undead: + name: '$eventBossLevel &cEvil Undead' + locationMessage: '&cEvil Undead: $distance blocks away!' + spawnMessage: '&cAn Evil Undead has appeared!' + deathMessage: '&aThe Evil Undead was put to rest by $players!' + escapeMessage: '&4The Evil Undead has escaped!' +evil_undead_p2: + name: '$eventBossLevel &cEvil Undead' + locationMessage: '&cEvil Undead: $distance blocks away!' + spawnMessage: '&cAn Evil Undead has appeared!' + deathMessage: '&aThe Evil Undead was put to rest by $players!' + escapeMessage: '&4The Evil Undead has escaped!' +fallen_knight: + name: '$eventBossLevel &7Fallen Knight' + locationMessage: '&cFallen Knight: $distance blocks away!' + spawnMessage: '&cA Fallen Knight rises from their grave!' + deathMessage: '&aA Fallen Knight has fallen to $players!.' + escapeMessage: '&4The Fallen Knight goes back to slumber!' +fine_swine: + name: '$eventBossLevel &eFine Swine' +fine_swine_summon: + name: '$eventBossLevel &eMighty Protector' +firestarter: + name: '$eventBossLevel &6Firestarter' + locationMessage: '&cFirestarter: $distance blocks away!' + spawnMessage: '&cA wicked Firestarter has appeared!' + deathMessage: '&aThe Firestarter was slain by $players!' + escapeMessage: '&4The Firestarter has left!' +firestarter_mount: + name: '$eventBossLevel &6Spark' +fire_conjurer: + name: '$eventBossLevel &eFire Conjurer' + locationMessage: '&cFire Conjurer: $distance blocks away!' + spawnMessage: '&cA master of fire and flame walks this world!' + deathMessage: '&aThe Fire Conjurer was extinguished by $players!' + escapeMessage: '&4The Fire Conjurer has vanished!' +fire_conjurer_summon: + name: '$eventBossLevel &6Summoned Flame' +fire_fae: + name: '$eventBossLevel &cOhnivá víla' +foreign_visitor: + name: '$eventBossLevel &5Foreign Visitor' + locationMessage: '&cForeign Visitor: $distance blocks away!' + spawnMessage: '&cA visitor from a another dimension has arrived!' + deathMessage: '&a$players has made sure to let the visitor know that they are not welcome here.' + escapeMessage: '&4The visitor has gone back home!' +fox_king_cold: + name: '$eventBossLevel &1Fox King Cold' + locationMessage: '&cFox King Cold: $distance blocks away!' + spawnMessage: '&cA magical creature roams the world.' + deathMessage: '&aFox King Cold was defeated by $players!' + escapeMessage: '&4Fox King Cold has left this world.' +frost_palace_frost_queen_p0: + name: '$bossLevel &8Frost Queen' + locationMessage: '&9Frost Queen' + spawnMessage: '&9The wind howls. The Frost Queen rises up to the challenge.' + deathMessage: '&aThe Frost queen is no more, slain by $players!' +frost_palace_frost_queen_p1: + name: '$bossLevel &8Frost Queen phase 1' + locationMessage: '&9Frost Queen phase 1' +frost_palace_frost_queen_p2: + name: '$bossLevel &8Frost Queen phase 2' + locationMessage: '&9Frost Queen phase 2' +frost_palace_frost_queen_p3: + name: '$bossLevel &8Frost Queen phase 3' + locationMessage: '&9Frost Queen phase 3' +frost_palace_frost_queen_p4: + name: '$bossLevel &8Frost Queen phase 4' + locationMessage: '&9Frost Queen phase 4' +frost_palace_frost_queen_p5: + name: '$bossLevel &8Frost Queen phase 5' + locationMessage: '&9Frost Queen phase 5' +frost_palace_frost_queen_p6: + name: '$bossLevel &8Frost Queen phase 6' + locationMessage: '&9Frost Queen phase 6' +frost_palace_frost_queen_p7: + name: '$bossLevel &8Frost Queen phase 7' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Frost Queen was thawed!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&9Frost Queen phase 7' +frost_palace_reinforcement_1: + name: '$reinforcementLevel Spirit of Winter' +frost_palace_reinforcement_2: + name: '$reinforcementLevel Spirit of Spring' +frost_palace_reinforcement_3: + name: '$reinforcementLevel Spirit of Summer' +fulgora: + name: '$eventBossLevel &3Fulgora' + locationMessage: '&cFulgora: $distance blocks away!' + spawnMessage: '&cA mighty thunder goat has come!' + deathMessage: '&aFulgora was stopped by $players!' + escapeMessage: '&4Fulgora has left this place!' +gamma_werewolf: + name: '$reinforcementLevel &7Gamma Werewolf' +goblin_invader: + name: '$eventBossLevel &2Goblin Leader' + locationMessage: '&cGoblin Army: $distance blocks away!' + spawnMessage: '&cA Goblin Army has invaded this realm!' + deathMessage: '&aThe Goblin Army has been vanquished by $players!' + escapeMessage: '&4The Goblin Army is done with this realm!' +goblin_invader_summon_1: + name: '&2Goblin Warrior' +goblin_invader_summon_2: + name: '&2Goblin Fighter' +goblin_invader_summon_3: + name: '&2Goblin Trooper' +goblin_invader_summon_4: + name: '&2Goblin Reinforcements' +greedy_dwarf: + name: '$eventBossLevel &9Greedy Dwarf' + locationMessage: '&cGreedy Dwarf: $distance blocks away!' + spawnMessage: '&cCan you find the Greedy Dwarf digging somewhere underground?!' + deathMessage: '&aThe Greedy Dwarf was released of their curse by $players!' + escapeMessage: '&4The Greedy Dwarf had found their treasure and they left!' +gremlin_1: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + spawnMessage: '&cA Gremlin hoard has invaded this world!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_10: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_2: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_3: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_4: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_5: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_6: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_7: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_8: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_9: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +grunter: + name: '$eventBossLevel &aGrunter' + locationMessage: '&cGrunter: $distance blocks away!' + spawnMessage: '&cA mighty hog roams the lands.' + deathMessage: '&aGrunter was stopped by $players!' + escapeMessage: '&4Grunter has escaped!' +harmless_chicken: + name: '$eventBossLevel &fHarmless Chick' + locationMessage: '&cHarmless Chick: $distance blocks away!' + spawnMessage: '&cBwok!!! Cluck, Cluck! Bawk!' + deathMessage: '&aBaaaawk! Cluck...$players!' + escapeMessage: '&4Harmless Chicken has baaaaaawked away.' +harmless_chicken_summon: + name: '$eventBossLevel &fClucktector' +hog_rider: + name: '$eventBossLevel &6Hog Rider' + locationMessage: '&cHog Rider: $distance blocks away!' + spawnMessage: '&cA mighty Hog Rider has appeared!' + deathMessage: '&aThe Hog Rider and their Hog were vanquished by $players!' + escapeMessage: '&4The Hog Rider has vanished.' +hog_rider_mount: + name: '$eventBossLevel &eLoyal Hog' +hog_rider_p2: + name: '$eventBossLevel &6Hog Rider' + locationMessage: '&cHog Rider: $distance blocks away!' + deathMessage: '&aThe Hog Rider and their Hog were vanquished by $players!' + escapeMessage: '&4The Hog Rider has vanished.' +hog_rider_summon: + name: '$eventBossLevel &eLoyal Zob-Hog' +horde_champion: + name: '$eventBossLevel &cHorde Champion' + locationMessage: '&cUndead Horde Champion: $distance blocks away!' + spawnMessage: '&cAn undead horde approaches!' + deathMessage: '&aThe horde has been stopped by $players!.' + escapeMessage: '&4AThe undead horde has left!' +horrid_duplicator: + name: '$eventBossLevel &dHorrid Duplicator' + locationMessage: '&cHorrid Duplicator: $distance blocks away!' + spawnMessage: '&cAn endless foe has appeared!' + deathMessage: '&aThe Horrid Duplicator was slain by $players!' + escapeMessage: '&4The Horrid Duplicator has left!' +horrid_duplicator_summon: + name: '$eventBossLevel &dHorrid Duplicator' +horrid_duplicator_summon_1: + name: '$eventBossLevel &dHorrid Duplicator' +ice_fae: + name: '$eventBossLevel &bLedová víla' +imperial_bee_guard: + name: '$reinforcementLevel &eImperial Bee Soldier' +invasion_abducted_hoglin_leader: + name: '$normalLevel &8Abducted Hoglin Leader' +invasion_abducted_pillager_leader: + name: '$normalLevel &8Abducted Pillager Leader' +invasion_abducted_silverfish: + name: '$normalLevel &8Abducted Silverfish' +invasion_abducted_silverfish_leader: + name: '$normalLevel &8Abducted Silverfish' +invasion_abducted_zombie: + name: '$normalLevel &8Abducted Zombie' +invasion_abducted_zombie_leader: + name: '$normalLevel &8Abducted Zombie' +invasion_abductor: + name: '$normalLevel &6Abductor' +invasion_abudcted_pillager: + name: '$normalLevel &8Abducted Pillager' +invasion_analytic_thin_man_1: + name: '$normalLevel &8Analytic Thin Man' +invasion_analytic_thin_man_2: + name: '$normalLevel &8Analytic Thin Man' +invasion_analytic_thin_man_3: + name: '$normalLevel &8Analytic Thin Man' +invasion_analytic_thin_man_4: + name: '$normalLevel &8Analytic Thin Man' +invasion_ballistic_construct: + name: '$minibossLevel &fBallistic Construct' +invasion_convert: + name: '$normalLevel &6Convert' +invasion_energy_construct: + name: '$minibossLevel &fEnergy Construct' +invasion_fire_construct: + name: '$minibossLevel &fFire Construct' +invasion_genetically_modified_cow_phase_1: + name: '$minibossLevel &fGenetically Modified Cow' +invasion_genetically_modified_cow_phase_2: + name: '$minibossLevel &fGenetically Modified Cow' +invasion_gray_man_courthouse_phase_1: + name: '$minibossLevel &7Gray Man' +invasion_gray_man_courthouse_phase_2: + name: '$minibossLevel &7Gray Man' +invasion_green_man_hotel_phase_1: + name: '$bossLevel &2Green Man' +invasion_green_man_hotel_phase_2: + name: '$bossLevel &2Green Man' +invasion_green_man_hotel_phase_3: + name: '$bossLevel &2Green Man' + deathMessage: '&4The &2Green Man &4was vanquished by $players! That''s the end for this version of the map, the inside of the UFO is in the full version!' +invasion_green_man_spaceship_phase_1: + name: '$bossLevel &2Green Man' +invasion_green_man_spaceship_phase_2: + name: '$bossLevel &2Green Man' +invasion_green_man_spaceship_phase_3: + name: '$bossLevel &2Green Man' +invasion_green_man_spaceship_phase_4: + name: '$bossLevel &2Green Man' + deathMessages: + - '&e&l---------------------------------------------' + - '&2The Alien menace is no more!' + - '&c&l 1. Útočník: $damager1name &cs $damager1damage poškozením!' + - '&6&l 2. Útočník: $damager2name &6s $damager2damage poškozením!' + - '&e&l 3. Útočník: $damager3name &es $damager3damage poškozením!' + - '&aZabijáci: $players' + - '&e&l---------------------------------------------' +invasion_ice_construct: + name: '$minibossLevel &fIce Construct' +invasion_merman: + name: '$normalLevel &6Merman' +invasion_merman_leader: + name: '$normalLevel &6Merman Leader' +invasion_otherwordly_ember: + name: '$normalLevel &6Otherworldly Ember' +invasion_psychic_apparition: + name: '$normalLevel &5Psychic Apparition' +invasion_psychic_clone: + name: '$reinforcementLevel &6Psychic Clone' +invasion_psychic_explosion: + name: '$reinforcementLevel &5Psychic Explosion' +invasion_psychic_summon_gold_boots: + name: '$reinforcementLevel &5Psychic Apparition' +invasion_psychic_summon_gold_pants: + name: '$reinforcementLevel &5Psychic Apparition' +invasion_psychic_summon_leather_hat: + name: '$reinforcementLevel &5Psychic Apparition' +invasion_shrieking_shulker: + name: '$normalLevel &8Shrieking Shulker' +invasion_thin_man: + name: '$normalLevel &8Thin Man' +killer_rabbit_of_caerbannog: + name: '$eventBossLevel &cKiller Rabbit of Caerbannog' +kraken: + name: '$eventBossLevel &3Kraken' +krampus: + name: '$eventBossLevel &1Krampus' + locationMessage: '&cKrampus: $distance blocks away!' + spawnMessage: '&cKrampus has come to punish the naughty!' + deathMessage: '&aKrampus has been sent back to his realm to by $players!.' + escapeMessage: '&4There was nobody to punish!' +large_hopper: + name: '$eventBossLevel &dLarge Hopper' + locationMessage: '&cLarge Hopper: $distance blocks away!' + spawnMessage: '&cA large beast is hopping around!' + deathMessage: '&aThe Large Hopper was stopped by $players!' + escapeMessage: '&4The Large Hopper has jumped out of this world!' +large_hopper_mount: + name: '$eventBossLevel &aHopper' +lightning_fae: + name: '$eventBossLevel &eBlesková víla' +living_shadow: + name: '$eventBossLevel &7Living Shadow' + locationMessage: '&cLiving Shadow: $distance blocks away!' + spawnMessage: '&cLiving Shadow has appeared! Do not look it in the yes!' + deathMessage: '&aLiving Shadow has been turned into Dead Shadow by $players!.' + escapeMessage: '&4The Living Shadow saw nothing so it left!' +meme_boss: + name: '&2The Maestro' +meme_boss_reinforcement: + name: '&cFan' +merman: + name: '$eventBossLevel &1Merman' + locationMessage: '&cMerman: $distance blocks away!' + spawnMessage: '&cA Merman swims the oceans!' + deathMessage: '&aThe Merman was slain by $players!' + escapeMessage: '&4The Merman has retreated.' +monster_of_the_deep: + name: '$eventBossLevel &bMonster of the Deep' + locationMessage: '&cMonster of the Deep: $distance blocks away!' + spawnMessage: '&cSomething terrible swims the oceans!' + deathMessage: '&aMonster of the Deep has been slain by $players!' + escapeMessage: '&4The oceans are once again safe!' +moon_spider: + name: '$eventBossLevel &fMoon Spider' + locationMessage: '&cMoon Spider: $distance blocks away!' + spawnMessage: '&cA powerful arachnid has been spotted!' + deathMessage: '&aThe Moon Spider was slain by $players!' + escapeMessage: '&4The Moon Spider has left!' +moon_spider_summon: + name: '&fSilk Mender' +necromancer: + name: '$eventBossLevel &7Necromancer' + locationMessage: '&cNecromancer: $distance blocks away!' + spawnMessage: '&cA powerful evil Necromancer has entered this world!' + deathMessage: '&aThe Necromancer is no more thanks to $players!' + escapeMessage: '&4The Necromancer has disappeared.' +necromancer_summon_1: + name: '$eventBossLevel &fFiery Bones' +necromancer_summon_2: + name: '$eventBossLevel &bChilled Bones' +necromancer_summon_3: + name: '$eventBossLevel &8Charred Bones' +necronomicon_skeleton: + name: '$reinforcementLevel &7Vyvolaný kostlivec' +necronomicon_zombie: + name: '$reinforcementLevel &7Vyvolaná zombie' +netherite_golem: + name: '$eventBossLevel &8Netherite Golem' + locationMessage: '&cNetherite Golem: $distance blocks away!' + spawnMessage: '&cAn ancient golem has entered this world!' + deathMessage: '&aThe Netherite Golem was slain by $players!' + escapeMessage: '&4The Netherite Golem has left this world!' +nether_escapee: + name: '$eventBossLevel &6Nether Escapee' + locationMessage: '&cNether Escapee: $distance blocks away!' + spawnMessage: '&cA terrible foe has escaped the nether!' + deathMessage: '&aThe Nether Escapee was sent back to the nether by $players!' + escapeMessage: '&4The Nether Escapee has left this place!' +nether_hag: + name: '$eventBossLevel &4Nether Hag' + locationMessage: '&cNether Hag: $distance blocks away!' + spawnMessage: '&cAn evil hag walks the nether!' + deathMessage: '&aThe Nether Hag was slain by $players!' + escapeMessage: '&4The Nether Hag has vanished!' +nether_wasp: + name: '$eventBossLevel &6Nether Wasp' + locationMessage: '&cNether Wasp: $distance blocks away!' + spawnMessage: '&cTry not to get stung, a wasp roams the nether!' + deathMessage: '&aThe Nether Wasp was slain by $players!' + escapeMessage: '&4The Nether Wasp has decided to buzz off!' +nether_wasp_summon_1: + name: '$eventBossLevel &cHive Summoner' +nether_wasp_summon_2: + name: '$eventBossLevel &cHive Wasp' +nightwing: + name: '$eventBossLevel &cNightwing' + locationMessage: '&cNightwing: $distance blocks away!' + spawnMessage: '&cA bird of the night has appeared!' + deathMessage: '&aNightwing was stopped by $players!' + escapeMessage: '&4Nightwing has flown home.' +nightwing_summon: + name: '$eventBossLevel &cSmart Bomb' +nightwing_summon_1: + name: '$eventBossLevel &cSworn Protector' +night_crawler: + name: '$eventBossLevel &4Night Crawler' + locationMessage: '&cNight Crawler: $distance blocks away!' + spawnMessage: '&cSomething awful is crawling about!' + deathMessage: '&aThe Night Crawler has been slain by $players!' + escapeMessage: '&4The Night Crawler Undead has left!' +night_horder: + name: '$eventBossLevel &aNight Horder' + locationMessage: '&cNight Horder: $distance blocks away!' + spawnMessage: '&cA Night Horder has appeared! Slay him to loot his booty!' + deathMessage: '&aThe Night Horder has been plundered by $players!' + escapeMessage: '&4The Night Horder has escaped!' +oasis_10_old_bones: + name: '$normalLevel &fOld Bones' +oasis_10_surreptitious_scribe: + name: '$minibossLevel &7Surreptitious Scribe' +oasis_12_entombed_tenant: + name: '$normalLevel &7Entombed Tenant' +oasis_12_entombed_tenant_p2: + name: '$normalLevel &7Entombed Tenant' +oasis_12_sinister_siren: + name: '$minibossLevel &5Sinister Siren' +oasis_14_gnarly_grimace: + name: '$normalLevel &8Gnarly Grimace' +oasis_14_undead_drifter: + name: '$normalLevel &1Undead Drifter' +oasis_16_lesser_sentinel: + name: '$normalLevel &9Lesser Sentinel' +oasis_16_magical_magus: + name: '$normalLevel &3Magical Magus' +oasis_16_rancid_roamer: + name: '$normalLevel &8Rancid Roamer' +oasis_18_sly_sharpshooter: + name: '$normalLevel &eSly Sharpshooter' +oasis_18_stout_thaumaturge: + name: '$normalLevel &5Stout Thaumaturge' +oasis_18_tricky_treasure_hoarder: + name: '$normalLevel &dTricky Treasure Hoarder' +oasis_20_scheming_scribe: + name: '$minibossLevel &7Scheming Scribe' +oasis_20_septic_scribe: + name: '$minibossLevel &7Septic Scribe' +oasis_20_vampiric_sorcerer: + name: '$bossLevel &cVampiric Sorcerer' +oasis_20_wrapped_wraith: + name: '$normalLevel &8Wrapped Wraith' +oasis_20_wrapped_wraith_p2: + name: '$normalLevel &8Wrapped Wraith' +oasis_25_vampiric_warlock: + name: '$bossLevel &4Vampiric Warlock' +oasis_25_warlocks_spirit_summon: + name: '$reinforcementLevel &cWarlocks Spirit' +oasis_26_adept_sentinel: + name: '$normalLevel &1Adept Sentinel' +oasis_26_grim_grovetender: + name: '$normalLevel &aGrim Grovetender' +oasis_26_precarious_sniper: + name: '$normalLevel &3Precarious Sniper' +oasis_26_superior_sharpshooter: + name: '$normalLevel &3Superior Sharpshooter' +oasis_28_perilous_prophet: + name: '$normalLevel &3Perlious Prophet' +oasis_28_treacherous_treasure_hoarder: + name: '$normalLevel &dTreacherous Treasure Hoarder' +oasis_2_haunted_hauler: + name: '$normalLevel &9Haunted Hauler' +oasis_30_forsaken_soul: + name: '$reinforcementLevel &0Forsaken Soul' +oasis_30_lost_soul: + name: '$normalLevel Lost Soul' +oasis_30_parlous_preist: + name: '$minibossLevel &bParlous Preist' +oasis_30_seeker_of_the_staid: + name: '$normalLevel &cSeeker of the Staid' +oasis_30_wimpy_louse: + name: '$reinforcementLevel &8Loathing Louse' +oasis_32_loathing_louse: + name: '$normalLevel &8Loathing Louse' +oasis_32_skeletal_sniper: + name: '$normalLevel &9Skeletal Sniper' +oasis_34_grizly_grimace: + name: '$normalLevel &8Gnarly Grimace' +oasis_34_gruesome_grimace: + name: '$normalLevel &8Gruesome Grimace' +oasis_35_ice_eidolon: + name: '$reinforcementLevel &9Ice Eidolon' +oasis_35_light_of_darkness: + name: '$minibossLevel &9Light of Darkness' +oasis_36_cruel_cultist: + name: '$normalLevel &3Cruel Cultist' +oasis_36_cultists_cretins: + name: '$reinforcementLevel &3Cruel Cultist' +oasis_36_cultists_cretins_drowned: + name: '$reinforcementLevel &3Cruel Cultist' +oasis_36_dexterous_sentinel: + name: '$normalLevel &9Dexterous Sentinel' +oasis_36_grudging_grovetender: + name: '$normalLevel &aGrudging Grovetender' +oasis_36_parlous_sniper: + name: '$normalLevel &3Parlous Sniper' +oasis_36_rueful_roamer: + name: '$normalLevel &8Rueful Roamer' +oasis_36_spectral_magus: + name: '$normalLevel &3Spectral Magus' +oasis_38_poisonous_perch: + name: '$normalLevel &3Poisonous Perch' +oasis_38_traitorous_treasure_hoarder: + name: '$normalLevel &dTraitorous Treasure Hoarder' +oasis_40_chief_cultist: + name: '$minibossLevel &5Chief Cultist' +oasis_40_louse_lord: + name: '$minibossLevel &8Louse Lord' +oasis_40_pharaohs_scribe: + name: '$minibossLevel &7Pharaoh''s Scribe' +oasis_40_skeletal_stiff: + name: '$normalLevel &9Skeletal Stiff' +oasis_40_soaked_sacrifice: + name: '$reinforcementLevel &1Soaked Sacrifice' +oasis_40_solar_flare: + name: '$reinforcementLevel &eSolar Flare' +oasis_42_hexed_hauler: + name: '$normalLevel &9Hexed Hauler' +oasis_42_skeletal_sharpshooter: + name: '$normalLevel &9Skeletal Sharpshooter' +oasis_42_tyranical_treasure_hoarder: + name: '$normalLevel &dTyranical Treasure Hoarder' +oasis_42_tyranical_treasure_hoarder_phase_2: + name: '$normalLevel &dTyranical Treasure Hoarder' +oasis_45_golden_cast_autonomation: + name: '$reinforcementLevel &6Golden Cast Autonomation' +oasis_45_monumental_monstrosity: + name: '$bossLevel &bMonumental Monstrosity' +oasis_45_monumental_monstrosity_phase_2: + name: '$bossLevel &bMonumental Monstrosity' +oasis_45_monumental_monstrosity_phase_3: + name: '$bossLevel &6Monumental Monstrosity' +oasis_45_monumental_monstrosity_phase_4: + name: '$bossLevel &bMonumental Monstrosity' +oasis_45_oracle_of_knowledge: + name: '$minibossLevel &0Oracle of Knowledge' +oasis_45_shadow_of_knowledge_summon: + name: '$reinforcementLevel &8Shadow of Knowledge' +oasis_45_the_beacon: + name: '$minibossLevel &6The Beacon' +oasis_45_the_beacon_phase_2: + name: '$minibossLevel &6The Beacon' +oasis_45_the_beacon_phase_3: + name: '$minibossLevel &6The Beacon' +oasis_45_the_beacon_phase_4: + name: '$minibossLevel &6The Beacon' +oasis_46_pharaohs_sentinel: + name: '$normalLevel &9Pharaoh''s Sentinel' +oasis_4_cursed_desert_dweller: + name: '$normalLevel &eCursed Desert Dweller' +oasis_4_grotesque_grimace: + name: '$normalLevel &8Grotesque Grimace' +oasis_4_swamp_rat: + name: '$normalLevel &6Swamp Rat' +oasis_50_moneychanger_arrow: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_arrow_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_blindness: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_blindness_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_fire: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_fire_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_freeze: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_freeze_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_knockback: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_knockback_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_poison: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_poison_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_wither: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_wither_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_pharaohs_royal_guard: + name: '$reinforcementLevel &8Pharaoh''s Royal Guard' +oasis_50_the_foundry: + name: '$bossLevel &4The Foundry' +oasis_50_the_foundry_phase_2: + name: '$bossLevel &4The Foundry' +oasis_55_pharaoh_of_pestilence: + name: '$bossLevel &0Pharaoh of Pestilence' +oasis_6_dry_bones: + name: '$normalLevel &fDry Bones' +oasis_6_rotten_roamer: + name: '$normalLevel &8Rotten Roamer' +oasis_8_mythical_magus: + name: '$normalLevel &3Mythical Magus' +oasis_8_tough_thaumaturge: + name: '$normalLevel &5Tough Thaumaturge' +oasis_8_troublesome_treasure_hoarder: + name: '$normalLevel &dTroublesome Treasure Hoarder' +okami: + name: '$eventBossLevel &cOkami' + locationMessage: '&cOkami: $distance blocks away!' + spawnMessage: '&cA god has awakened!' + deathMessage: '&a$players has fought with a god and won!.' + escapeMessage: '&4Okami has left!' +okami_p2: + name: '$eventBossLevel &cOkami' +okami_p3: + name: '$eventBossLevel &cOkami' +omega_wolf: + name: '$reinforcementLevel &7Omega Wolf' +pillager_caravan_beast: + name: '$reinforcementLevel &cCaravan Beast' +pillager_caravan_guard: + name: '$reinforcementLevel &cCaravan Guard' +pillager_caravan_leader: + name: '$eventBossLevel &cPillager Caravan Leader' + locationMessage: '&cPillager Caravan: $distance blocks away!' + spawnMessage: '&cA pillager caravan has been sighted!' +primis_acolyte_brute: + name: '$normalLevel &bAcolyte Brute' +primis_acolyte_forest_brute: + name: '$normalLevel &bElf Bandit Brute' +primis_acolyte_forest_brute_with_watch: + name: '$normalLevel &bElf Bandit Brute' +primis_acolyte_forest_sharpshooter: + name: '$normalLevel &bElf Bandit Ranger' +primis_acolyte_forest_summoner: + name: '$normalLevel &bElf Bandit Summoner' +primis_acolyte_forest_summoner_heirloom_guardian: + name: '$normalLevel &bElf Bandit Mage' +primis_acolyte_guard_1: + name: '$normalLevel &bAcolyte Guard' + onDamagedMessages: + - You can't enter! + - The mage won't allow this! + - Leave this place! + - The mage protects this place! + - Foolishness! + - Begone! + deathMessage: '[Acolyte Guard] You are blind to the truth, the tower''s mage sees all!' +primis_acolyte_guard_2: + name: '$normalLevel &bAcolyte Guard' + onDamagedMessages: + - You can't enter! + - The mage won't allow this! + - Leave this place! + - The mage protects this place! + - Foolishness! + - Begone! + deathMessage: '[Acolyte Guard] You shall not pass, the mage in the tower will not allow it!' +primis_acolyte_sharpshooter: + name: '$normalLevel &bAcolyte Ranger' +primis_aggressive_llama: + name: '$normalLevel &6Aggressive LLama' +primis_angry_goat: + name: '$normalLevel &6Angry Goat' +primis_beta_feral_wolf: + name: '$reinforcementLevel &8Beta Feral Wolf' +primis_blood_temple_blood_golem: + name: '$normalLevel &cBlood Golem' +primis_blood_temple_charred_construct: + name: '$normalLevel &cCharred Construct' +primis_blood_temple_conjured_flame: + name: '$normalLevel &cConjured Flame' +primis_blood_temple_eradicator: + name: '$normalLevel &cEradicator' +primis_blood_temple_fire_conjurer: + name: '$normalLevel &cFire Conjurer' +primis_blood_temple_flame_elemental: + name: '$normalLevel &cFlame Elemental' +primis_catacomb_nemus_to_redwood_archer: + name: '$normalLevel &8Catacomb Archer' +primis_catacomb_nemus_to_redwood_golem: + name: '$normalLevel &bCatacomb Golem' +primis_catacomb_nemus_to_redwood_necromancer: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_nemus_to_redwood_necromancer_p1: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_nemus_to_redwood_necromancer_p2: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_nemus_to_redwood_soul_reinforcement: + name: '$reinforcementLevel &8Catacomb Soul' +primis_catacomb_nemus_to_redwood_swordsman: + name: '$normalLevel &8Catacomb Swordsman' +primis_catacomb_pontis_to_ice_archer: + name: '$normalLevel &8Catacomb Archer' +primis_catacomb_pontis_to_ice_golem: + name: '$normalLevel &bCatacomb Golem' +primis_catacomb_pontis_to_ice_necromancer_p1: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_pontis_to_ice_necromancer_p2: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_pontis_to_ice_swordsman: + name: '$normalLevel &8Catacomb Swordsman' +primis_catacomb_trio_archer: + name: '$normalLevel &8Catacomb Archer' +primis_catacomb_trio_golem: + name: '$normalLevel &bCatacomb Golem' +primis_catacomb_trio_necromancer_p1: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_necromancer_p2: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_necromancer_summon: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_swordsman: + name: '$normalLevel &8Catacomb Swordsman' +primis_crazed_rabbit: + name: '$normalLevel &cCrazed Rabbit' +primis_crystaline_summoner_p1: + name: '$normalLevel &3Crystaline Summoner' +primis_crystaline_summoner_p2: + name: '&3Crystaline Summoner' +primis_earth_temple_golem: + name: '$normalLevel &fAnimated Clay' +primis_emerald_eater: + name: '$normalLevel &aEmerald Eater' +primis_farmstead_lighthouse_keeper: + name: '$bossLevel &6The Lighthouse Keeper' + questLore: + - Something is deeply wrong with my husband. + - He used to be a loving and caring husband and father, + - but in recent times he has been focusing on documents he found in the basement. + - He said it was for important research, something that could change the world. + - I should've told him to stop when I saw how obsessed he was becoming. + - He did... something... to the lighthouse - and + - I fear the lighthouse has done something to him, too. + - It morphed him into some kind of monster. He no longer recognizes us, + - and has even attacked us when we tried to approach him. + - At night, we can't sleep due to the wailing sounds + - coming from the &dLighthouse's Basement&f. + - He is suffering, and we are powerless to help him. + - I know it's asking a lot, but do you think you could help us? + questAcceptDialog: + - '&a[Amavit]&f Thank you so much for accepting our request. I hope with all my heart you succeed.' + - '&7&oI should go to the &dBasement of the Lighthouse&7&o and put the &cLighthouse Keeper&7&o out of his misery.' + questCompleteMessage: + - '&a[Amavit]&f I heard it - so it is done? Did he suff- no, forget it, I don''t want to know.' + - '&fIt seems like the lighthouse started emitting an odd light when you... dealt with the issue. We need to make sure it is not an issue.' + - '&7&oSeems like &aAmavit&7&o has another task for me. I should talk to her.' +primis_feral_alpha_wolf: + name: '$normalLevel &8Feral Alpha Wolf' +primis_feral_wolf: + name: '$normalLevel &8Feral Wolf' +primis_feral_wolf_scout: + name: '$normalLevel &8Feral Wolf Scout' +primis_gladius_admiral: + name: '$normalLevel &fInvading Admiral' +primis_gladius_assassin: + name: '$normalLevel &fInvading Assassin' +primis_gladius_barkeep_p1: + name: '$minibossLevel &6The Barkeep' +primis_gladius_barkeep_p2: + name: '$minibossLevel &6The Barkeep' +primis_gladius_captain: + name: '$normalLevel &fInvading Captain' +primis_gladius_champion_p1: + name: '$bossLevel &6Fallen Champion Natus' +primis_gladius_champion_p2: + name: '$bossLevel &6Fallen Champion Natus' +primis_gladius_gatekeeper_p1: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_gatekeeper_p2: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_gatekeeper_pontis_p1: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_gatekeeper_pontis_p2: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_longbowman: + name: '$normalLevel &fInvading Longbowman' +primis_gladius_mariner: + name: '$normalLevel &fInvading Mariner' +primis_gladius_mariner_quest: + name: '$normalLevel &fInvading Mariner' +primis_gladius_monk_p1: + name: '$minibossLevel &6The Monk' +primis_gladius_monk_p2: + name: '$minibossLevel &6The Monk' +primis_gladius_raider: + name: '$normalLevel &fInvading Raider' +primis_gladius_swordsman: + name: '$normalLevel &fInvading Swordsman' +primis_gladius_undead_buccaneer: + name: '$normalLevel &fUndead Buccaneer' +primis_gladius_undead_captain: + name: '$minibossLevel &fUndead Captain' +primis_gladius_undead_swashbuckler: + name: '$normalLevel &fUndead Swashbuckler' +primis_gladius_underlord: + name: '$minibossLevel &0Underlord' +primis_gladius_villager: + name: '$normalLevel &fUndead Villager' +primis_goblin_fowl_warrior: + name: '$minibossLevel &6Cursed Fowl Goblin' +primis_goblin_grunt: + name: '$normalLevel &6Goblin Grunt' +primis_goblin_king: + name: '$bossLevel &2Goblin King' +primis_goblin_piranah: + name: '$normalLevel &9Goblin Piranah' +primis_goblin_spearman: + name: '$normalLevel &6Goblin Spearman' +primis_goblin_warrior: + name: '$normalLevel &6Goblin Warrior' +primis_ice_mage: + name: '$minibossLevel &9Ice Mage' +primis_ice_mage_p2: + name: '$minibossLevel &bIce Mage' + deathMessage: '&8&oYou hear the sound of a nearby ice wall cracking and breaking...' +primis_ice_village_annoyed_goat: + name: '$normalLevel &bAnnoyed Goat' +primis_ice_village_bell_banger: + name: '$minibossLevel &6Undead' + questLore: + - Do you see that? There, look at that bell + - tower in the village. + - You see it too, right? The feller there + - banging his head on the bell. + - I am pretty sure that's what's going on, + - unless my vision is failing me. + - Could you go investigate and report back + - to me what you found. + questAcceptDialog: + - '&a[Eleusium Festus]&f What is going on...' + - '&7&oI should go see what is happening at the &d&oIce Village Bell Tower&7&o.' + questCompleteMessage: + - '&a[Eleusium Festus]&f You found an undead banging their head on the bell...' + - Well now I have heard it all... +primis_ice_village_escaped_prisoner: + name: '$normalLevel &bEscaped Prisoner' +primis_ice_village_fallen_trial_warrior_summon: + name: '$reinforcementLevel &7Enslaved Soul' +primis_ice_village_frost_fur_ursus: + name: '$normalLevel &9Frost Fur Ursus' +primis_ice_village_frost_simulacrum: + name: '$normalLevel &3Frost Simulacrum' +primis_ice_village_ice_simulacrum: + name: '$reinforcementLevel &3Ice Simulacrum' +primis_ice_village_manifested_nightmare: + name: '$normalLevel &bManifested Nightmare' +primis_ice_village_meek_customer: + name: '$normalLevel &cMeek Customer' +primis_ice_village_naughty_customer: + name: '$normalLevel &cNaughty Customer' +primis_ice_village_screecher_bomb_summon: + name: '$reinforcementLevel &dScreecher Droppings' +primis_ice_village_sky_screecher: + name: '$normalLevel &bSky Screecher' +primis_ice_village_the_ice_aspect: + name: '$minibossLevel &9Ice Aspect' +primis_ice_village_the_ice_elemental: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_the_ice_elemental_p2: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_the_ice_elemental_p3: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_trial_of_ice_minor_ice_elemental: + name: '$minibossLevel &bMinor Ice Elemental' +primis_ice_village_wolf_summon: + name: '$reinforcementLevel &cTamed Wolf' +primis_minor_ice_elemental: + name: '$bossLevel &1Minor Ice Elemental' +primis_minor_ice_elemental_p2: + name: '$bossLevel &1Minor Ice Elemental' +primis_mountain_pass_guardian_p1: + name: '$bossLevel &6The Guardian' +primis_mountain_pass_guardian_p2: + name: '$bossLevel &6The Guardian' +primis_mountain_pass_healer: + name: '$reinforcementLevel &fRepairtron' +primis_nasty_worm: + name: '$normalLevel &fNasty Worm' +primis_ogre_mines_mite: + name: '$normalLevel &fMine Mite' +primis_ogre_mines_ogre_archer: + name: '$minibossLevel &fOgre Archer' +primis_ogre_mines_ogre_magi: + name: '$minibossLevel &fOgre Magi' +primis_ogre_mines_ogre_warrior: + name: '$minibossLevel &fOgre Warrior' +primis_ogre_mines_undead_archer: + name: '$normalLevel &fUndead Archer' +primis_ogre_mines_undead_swordsman: + name: '$normalLevel &fUndead Swordsman' +primis_pontis_beast_cod: + name: '$minibossLevel &dBeast Cod Furiosa' +primis_pontis_beast_crawler: + name: '$minibossLevel &dCrawler Beast Megdun' +primis_pontis_beast_impaler: + name: '$minibossLevel &dImpaler Beast Uladzimir' +primis_pontis_counselor_guard_left_1: + name: '$normalLevel &4Corrupt Counselor Guard' +primis_pontis_counselor_guard_left_2: + name: '$normalLevel &4Warped Counselor Guard' + deathMessage: '&5[Counselor Machiavelli]&f So that fool must have finally figured it out...' +primis_pontis_counselor_guard_left_3: + name: '$normalLevel &4Uplifted Experiment' + deathMessage: '&5[Counselor Machiavelli]&f You''re stronger than I thought.' +primis_pontis_counselor_guard_left_4: + name: '$normalLevel &4Abomination' + deathMessage: '&5[Counselor Machiavelli]&f My soul magic will protect me!!!' +primis_pontis_counselor_guard_mid: + name: '$normalLevel &4Corrupt Counselor Guard' + deathMessage: '&8[Counselor Machiavelli]&f I see that we have guests!...' +primis_pontis_counselor_guard_right_1: + name: '$normalLevel &4Corrupt Counselor Guard' +primis_pontis_counselor_guard_right_2: + name: '$normalLevel &4Warped Counselor Guard' +primis_pontis_counselor_guard_right_3: + name: '$normalLevel &4Uplifted Experiment' +primis_pontis_counselor_guard_right_4: + name: '$normalLevel &4Abomination' +primis_pontis_counselor_twisted_copy: + name: '$reinforcementLevel &4Twisted Copy' +primis_pontis_mille_arena_air_elemental: + name: '$minibossLevel &fAir Elemental' +primis_pontis_mille_arena_human_wave_4: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_6: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_7: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_8: + name: '$normalLevel &4Dominated Human Warrior' +primis_pontis_mille_arena_human_worshiper: + name: '$normalLevel &4Elemental Worshiper' +primis_pontis_mille_arena_minor_air_elemental: + name: '$normalLevel &fMinor Air Elemental' +primis_pontis_mille_arena_minor_earth_elemental: + name: '$normalLevel &7Minor Earth Elemental' +primis_pontis_mille_arena_minor_fire_elemental: + name: '$normalLevel &eMinor Fire Elemental' +primis_pontis_mille_arena_minor_fire_elemental_prime: + name: '$normalLevel &eMinor Fire Elemental' +primis_pontis_mille_arena_minor_water_elemental: + name: '$normalLevel &bMinor Water Elemental' +primis_pontis_mille_arena_primal_air_wisp: + name: '$normalLevel &fPrimal Air Wisp' +primis_pontis_mille_arena_primal_air_wisp_2: + name: '$normalLevel &fPrimal Air Wisp' +primis_pontis_mille_arena_primal_earth_wisp: + name: '$normalLevel &7Primal Earth Wisp' +primis_pontis_mille_arena_primal_earth_wisp_2: + name: '$normalLevel &7Primal Earth Wisp' +primis_pontis_mille_arena_primal_fire_wisp: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_fire_wisp_2: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_fire_wisp_3: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_water_wisp: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_water_wisp_2: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_water_wisp_3: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_wisp: + name: '$normalLevel &5Primal Wisp' +primis_pontis_mille_arena_water_elemental: + name: '$minibossLevel &1Water Elemental' +primis_pontis_mille_counselor_p1: + name: '$minibossLevel &fCounselor Machiavelli' +primis_pontis_mille_counselor_p2: + name: '$minibossLevel &fCounselor Machiavelli' +primis_pontis_mille_counselor_p3: + name: '$minibossLevel &fCounselor Machiavelli' +primis_pontis_mille_fields_babe_razorback: + name: '$normalLevel &2Babe Razorback' +primis_pontis_mille_fields_bird: + name: '$normalLevel &fFeathered Field Rat' +primis_pontis_mille_fields_bird_nightmare: + name: '$normalLevel &dFeathered Nightmare Rat' +primis_pontis_mille_fields_bubba: + name: '$minibossLevel &cBig ol'' Bubba' +primis_pontis_mille_fields_field_rat: + name: '$normalLevel &fField Rat' +primis_pontis_mille_fields_juvenile_razorback: + name: '$normalLevel &2Juvenile Razorback' +primis_pontis_mille_fields_longhorn: + name: '$normalLevel &4Fields Longhorn' +primis_pontis_mille_fields_mature_razorback: + name: '$normalLevel &2Mature Razorback' +primis_pontis_mille_fields_shorthorn: + name: '$normalLevel &6Fields Shorthorn' +primis_pontis_mille_fields_two_legged_terror: + name: '$normalLevel &2Two Legged Terror' +primis_pontis_mille_fields_well_fed_rat: + name: '$normalLevel &fWell Fed Rat' +primis_pontis_mille_rat: + name: '$normalLevel &fRat' +primis_quartz_elemental: + name: '$bossLevel &dQuartz Elemental' +primis_quartz_elemental_p2: + name: '$bossLevel &dQuartz Elemental' +primis_redwood_barracuda: + name: '$normalLevel &3Redwood Barracuda' +primis_redwood_fruity_hound: + name: '$normalLevel &2Fruity Hound' +primis_redwood_rockhound: + name: '$normalLevel &7Redwood Rockhound' +primis_redwood_werewolf_grunt: + name: '$normalLevel &cRedwood Werewolf Grunt' +primis_redwood_werewolf_packleader: + name: '$normalLevel &4Redwood Werewolf Packleader' +primis_river_guardian: + name: '$normalLevel &5River Guardian' +primis_roofed_forest_cave_spider: + name: '$normalLevel &6Nest Crawler' +primis_roofed_forest_cave_spider_boss: + name: '$bossLevel &eBrood Mother' +primis_roofed_forest_spider: + name: '$normalLevel &6Forest Crawler' +primis_roofed_forest_spider_reinforcement: + name: '$reinforcementLevel &6Nest Brood' +primis_sea_monster: + name: '$bossLevel &dSea Monster' +primis_sewer_noxious_ninja: + name: '$normalLevel &2Noxious Ninja' +primis_sewer_spore_spreader: + name: '$normalLevel &4Spore Spreader' +primis_sewer_the_shredder_p1: + name: '$bossLevel &5The Shredder' +primis_sewer_the_shredder_p2: + name: '$bossLevel &5The Shredder' +primis_storm_temple_axeman: + name: '$normalLevel &dStorm Temple Axeman' +primis_storm_temple_bowman: + name: '$normalLevel &dStorm Temple Bowman' +primis_storm_temple_kuzco: + name: '$normalLevel &6Kuzco' +primis_storm_temple_minor_storm_elemental: + name: '$normalLevel &5Minor Storm Elemental' +primis_storm_temple_storm_elemental: + name: '$bossLevel &1Storm Elemental' +primis_storm_temple_storm_elemental_p2: + name: '$bossLevel &1Storm Elemental' +primis_storm_temple_storm_elemental_p3: + name: '$bossLevel &1Storm Elemental' +primis_storm_temple_summoner: + name: '$normalLevel &5Storm Temple Summoner' +primis_terravilla_alpha_razorback: + name: '$minibossLevel &2Alpha Razorback' +primis_terravilla_alpha_razorback_p2: + name: '$minibossLevel &2Alpha Razorback' +primis_terravilla_bar_brawler: + name: '$normalLevel &6Bar Brawler' + onDamagedMessages: + - That all ya got! + - I did not even feel that! + - Why...you! + - I will show you! + - Who the heck are you! + - TAKE THAT! +primis_terravilla_earth_elemental: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_earth_elemental_p2: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_earth_elemental_p3: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_regular_fish: + name: '$normalLevel &bRegular Fish' +primis_terravilla_robber_gladiator: + name: '$normalLevel &bRobber Gladiator' +primis_terravilla_robber_slugger: + name: '$normalLevel &bSlugger' +primis_undead_archer: + name: '$normalLevel &fUndead Archer' +primis_undead_climber: + name: '$normalLevel &0Undead Climber' +primis_undead_grappler: + name: '$normalLevel &3Undead Grappler' +primis_undead_guardian: + name: '$normalLevel &bUndead Guardian' +primis_undead_swordsman: + name: '$normalLevel &0Undead Swordsman' +pufferfish: + name: '$eventBossLevel &3Pufferfish' + locationMessage: '&cPufferfish: $distance blocks away!' + spawnMessage: '&cA puffed fish is swimming in the oceans!' + deathMessage: '&aThe Pufferfish reign has been ended by $players!' + escapeMessage: '&4The Pufferfish has swam away!' +pufferfish_summon_1: + name: '$eventBossLevel &bPooferfish' +pufferfish_summon_2: + name: '$eventBossLevel &bPooperfish' +pufferfish_summon_3: + name: '$eventBossLevel &bPooderfish' +pufferfish_summon_4: + name: '$eventBossLevel &bPudderfish' +queen_bee: + name: '$eventBossLevel &6Queen Bee' +rabbit_wolf_1: + name: '$eventBossLevel &cFlame Wolf' + locationMessage: '&cFlame: $distance blocks away!' + spawnMessage: '&cA powerful duo has come to this world!' + deathMessage: '&aThe Wolf and the Rabbit were stopped by $players!' + escapeMessage: '&4The Wolf and the Rabbit have left this place!' +rabbit_wolf_2: + name: '$eventBossLevel &cLightning Rabbit' + locationMessage: '&cLightning: $distance blocks away!' + deathMessage: '&aThe Wolf and the Rabbit were stopped by $players!' + escapeMessage: '&4The Wolf and the Rabbit have left this place!' +raug: + name: '$reinforcementLevel &4Raug' +regular_hoglin: + name: '$eventBossLevel &4Regular Hoglin' + locationMessage: '&cRegular Hoglin: $distance blocks away!' + spawnMessage: '&cA Regular Hoglin has arrived! Nothing special about this Hoglin!' + deathMessage: '&aRegular Hoglin was slain by $players!.' + escapeMessage: '&4The Regular Hoglin has left!' +rotting_diver: + name: '$eventBossLevel &bRotting Diver' + locationMessage: '&cRotting Diver: $distance blocks away!' + spawnMessage: '&cA foul corpse floats in the waters!' + deathMessage: '&aThe Rotting Diver was sent to the depths by $players!' + escapeMessage: '&4The Rotting Diver floated away!' +salty_corpse: + name: '$eventBossLevel &bSalty Corpse' + locationMessage: '&cSalty Corpse: $distance blocks away!' + spawnMessage: '&cSomething awful has floated up to the surface!' + deathMessage: '&aThe Salty Corpse was sent back to the depths by $players!' + escapeMessage: '&4The Salty Corpse has left!' +skeleton_knight: + name: '$eventBossLevel &fSkeleton Knight' + locationMessage: '&cSkeleton Knight: $distance blocks away!' + spawnMessage: '&cThe undead have sent a Skeleton Knight into the night!' + deathMessage: '&aThe Skeleton Knight was slain by $players!' + escapeMessage: '&4The Skeleton Knight had to retreat!' +sky_archer: + name: '$eventBossLevel &aSky Archer' + locationMessage: '&cSky Archer: $distance blocks away!' + spawnMessage: '&cA Sky Archer has entered this world! Bring your bow!' + deathMessage: '&aThe Sky Archer got sniped by $players!' + escapeMessage: '&4The Sky Archer has flown away!' +sky_archer_mount: + name: '$eventBossLevel &aSky Steed' +smallstack: + name: '$eventBossLevel &bSmallstack Top' + locationMessage: '&cSmallstack: $distance blocks away!' + spawnMessage: '&cA Smallstack is roaming the wilds!' + deathMessage: '&aThe Smallstack was unstacked by $players!' + escapeMessage: '&4The Smallstack has left!' +smallstack_1: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_2: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_3: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_4: + name: '$eventBossLevel &bSmallstack Bottom' +smallstack_5: + name: '$eventBossLevel &bSmallstack Bottom' +smallstack_6: + name: '$eventBossLevel &bSmallstack Carrier' +snoopy: + name: '&6{&4☠&6} &fSnoopy' + onDamageMessages: + - Haf! + onDamagedMessages: + - Haf! + spawnMessage: '&aVelmi vzácný Snoopy byl zpozorován!' +sorcerer_supreme: + name: '$eventBossLevel &5Sorcerer Supreme' + locationMessage: '&cSorcerer Supreme: $distance blocks away!' + spawnMessage: '&cAn almighty Sorcerer has phased into this world!' + deathMessage: '&aThe Sorcerer Supreme was defeated by $players!' + escapeMessage: '&4The Sorcerer Supreme has left this world!' +sorcerer_supreme_summon: + name: '$eventBossLevel &5Eternal Servant' +spider_knight: + name: '$eventBossLevel &aDwarven Knight' + locationMessage: '&cDwarven Knight: $distance blocks away!' + spawnMessage: '&cA Knight has come to challenge the heroes of this place!' + deathMessage: '&aThe Knight was defeated by $players!' + escapeMessage: '&4The Knight has left this place!' +spider_knight_mount: + name: '$eventBossLevel &aFaithful Steed' +summonable_wolf: + name: '$normalLevel vlčí' + onDamageMessages: + - Haf! + onDamagedMessages: + - Haf! +super_mite: + name: '$eventBossLevel &dSuper Mite' + locationMessage: '&cSuper Mite: $distance blocks away!' + spawnMessage: '&cA trouble maker appears!' + deathMessage: '&aThe mite could not handle a fight with $players!.' + escapeMessage: '&4The Super Mite left out of boredom!' +super_mite_summon: + name: '$eventBossLevel &dFriendmite' +suspicious_phantom: + name: '$eventBossLevel &eSuspicious Phantom' + locationMessage: '&cSuspicious Phantom: $distance blocks away!' + spawnMessage: '&cA Suspicious Phantom was sighted in the skies!' + deathMessage: '&aThe Phantom was put to bed by $players!' + escapeMessage: '&4The Suspicious Phantom has left!' +suspicious_phantom_summon: + name: '$eventBossLevel &cFlamer' +suspicious_phantom_summon_1: + name: '$eventBossLevel &cFireballer' +test_boss: + name: '$eventBossLevel &6Test boss' + deathMessages: + - '&e&l---------------------------------------------' + - '&eTestovací šéf byl laděn!' + - '&c&l 1. Útočník: $damager1name &cs $damager1damage poškozením!' + - '&6&l 2. Útočník: $damager2name &6s $damager2damage poškozením!' + - '&e&l 3. Útočník: $damager3name &es $damager3damage poškozením!' + - '&aZabijáci: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Udeřil jsem tě! + onDamagedMessages: + - Byl jsem udeřen! + locationMessage: 'Testovací entita: $distance' + spawnMessage: Byl vypuštěn zkušební šéf! + deathMessage: Testovací šéf byl zabit $players! + escapeMessage: Testovací boss utekl! +airship_tier_45_knockback: + name: '$normalLevel &2Bow Bowsman' +airship_tier_45_witherblind: + name: '$normalLevel &aNoxious Bowsman' +airship_tier_50_powder_monkeys: + name: '$normalLevel &7Powder Monkey' +airship_tier_50_scourge: + name: '$normalLevel &8Swashbuckling Scourge' +airship_tier_60_mess_hall_mate: + name: '$normalLevel &bMess Hall Mate' +airship_tier_65_boatswain_boss: + name: '$normalLevel &cBoatswain Boss' +airship_tier_65_bodyguard: + name: '$normalLevel &eBuccaneer Bodyguard' +airship_tier_65_silverfish: + name: '$normalLevel &8Ship Rat' +airship_tier_65_silverfish_reinforcement: + name: '$reinforcementLevel &8Ship Mouse' +airship_tier_70_miniboss: + name: '$minibossLevel Quark the Quartermaster ' +airship_tier_70_miniboss_2: + name: '$minibossLevel &6Living Boiler' +airship_tier_70_miniboss_wayfinder: + name: '$minibossLevel &3Wharf Wayfinder' +airship_tier_75_boss: + name: '$bossLevel &4Captain Davey' + deathMessages: + - '&e&l---------------------------------------------' + - '&9Captain Davey was put to rest! ... again.' + - '&c&l 1. Útočník: $damager1name &cs $damager1damage poškozením!' + - '&6&l 2. Útočník: $damager2name &6s $damager2damage poškozením!' + - '&e&l 3. Útočník: $damager3name &es $damager3damage poškozením!' + - '&aZabijáci: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Captain Davey: $distance' + spawnMessage: '&4Captain Davey haunts the skies once more!' + deathMessage: '$players &ahave made &4Captain Davey &ashuffle off his mortal coil!' + escapeMessage: '&6Captain Davey has moved on the haunt another day!' +binder_of_worlds_phase_1: + name: '$eventBossLevel &eBinder of Worlds' + spawnMessage: '&5The binder of worlds approaches!' +binder_of_worlds_phase_1_melee_miniboss: + name: '$reinforcementLevel &9Reality Uprooter' +binder_of_worlds_phase_1_melee_reinforcement: + name: '$reinforcementLevel &8Reality Waster' +binder_of_worlds_phase_1_parkour_reinforcement: + name: '$reinforcementLevel &2Reality Harbinger' +binder_of_worlds_phase_1_ranged_miniboss: + name: '$reinforcementLevel &3Reality Ruiner' +binder_of_worlds_phase_1_ranged_reinforcement: + name: '$reinforcementLevel &6Reality Ruiner' +binder_of_worlds_phase_1_status_miniboss: + name: '$reinforcementLevel &1Reality Wrencher' +binder_of_worlds_phase_1_status_reinforcement: + name: '$reinforcementLevel &7Reality Rupturer' +binder_of_worlds_phase_2: + name: '$eventBossLevel &eBinder of Worlds' +binder_of_worlds_phase_3: + name: '$eventBossLevel &eBinder of Worlds' +binder_of_worlds_phase_3_shulker_reinforcement: + name: '$reinforcementLevel &5Reality Riftrender' +binder_of_worlds_phase_4: + name: '$eventBossLevel &eBinder of Worlds' + deathMessages: + - '&e&l---------------------------------------------' + - '&9The binder is bound to this mortal plane no more!' + - '&c&l 1. Útočník: $damager1name &cs $damager1damage poškozením!' + - '&6&l 2. Útočník: $damager2name &6s $damager2damage poškozením!' + - '&e&l 3. Útočník: $damager3name &es $damager3damage poškozením!' + - '&aZabijáci: $players' + - '&e&l---------------------------------------------' +catacombs_tier_10_miniboss: + name: '$minibossLevel &7Terragog' +catacombs_tier_15_boss: + name: '$bossLevel &6The Rattler' + deathMessages: + - '&e&l---------------------------------------------' + - '&9The Rattler rattled away!' + - '&c&l 1. Útočník: $damager1name &cs $damager1damage poškozením!' + - '&6&l 2. Útočník: $damager2name &6s $damager2damage poškozením!' + - '&e&l 3. Útočník: $damager3name &es $damager3damage poškozením!' + - '&aZabijáci: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Feeling.. rattled? + - Show me your skeleton! + - You're boned! + - Your calcium is weak! + onDamagedMessages: + - I felt that in my bones! + - I've got a bone to pick with you! + - Doot doot mr skeltal + - I need calcium! + locationMessage: 'The Rattler: $distance blocks away!' + spawnMessage: '&6The Rattler rises!' + deathMessage: '&aThe Rattler has been defeated by $players!' +catacombs_tier_15_mimic_boss: + name: '$bossLevel &6The Forgotten' +catacombs_tier_15_reinforcement: + name: '$reinforcementLevel &eUnturned' +catacombs_tier_5_evoker_guard_2: + name: '$normalLevel &7Catacomb Guard' + onDamageMessages: + - No entry! + - Entry is forbidden! +catacombs_tier_5_illusioner_guard_1: + name: '$normalLevel &7Catacomb Guard' + onDamageMessages: + - No entry! + - Entry is forbidden! +colosseum_tier_70_boss_mount: + name: '$bossLevel &4Pit Lord' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Pit Lord is no more!' + - '&c&l 1. Útočník: $damager1name &cs $damager1damage poškozením!' + - '&6&l 2. Útočník: $damager2name &6s $damager2damage poškozením!' + - '&e&l 3. Útočník: $damager3name &es $damager3damage poškozením!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + deathMessage: '&2The Pit Lord has been vanquished by $players!' +colosseum_tier_70_boss_p1: + name: '$bossLevel &cPit Master' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Pit Master has fallen!' + - '&c&l 1. Útočník: $damager1name &cs $damager1damage poškozením!' + - '&6&l 2. Útočník: $damager2name &6s $damager2damage poškozením!' + - '&e&l 3. Útočník: $damager3name &es $damager3damage poškozením!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Pit Master: $distance blocks away!' + spawnMessage: '&4The Pit Master charges into battle once more!' + deathMessage: '&2The Pit Master has been slain by $players!' +colosseum_tier_70_boss_p2: + name: '$bossLevel &cPit Master' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Pit Master has fallen!' + - '&c&l 1. Útočník: $damager1name &cs $damager1damage poškozením!' + - '&6&l 2. Útočník: $damager2name &6s $damager2damage poškozením!' + - '&e&l 3. Útočník: $damager3name &es $damager3damage poškozením!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Pit Master: $distance blocks away!' + deathMessage: '&2The Pit Master has been slain by $players!' +colosseum_tier_70_boss_reinforcements_p1: + name: '$reinforcementLevel &6Gladiator' +colosseum_tier_70_boss_reinforcements_p2: + name: '$reinforcementLevel &6Gladiator' +colosseum_tier_70_gladiator: + name: '$normalLevel &6Gladiator' +colosseum_tier_70_mount_reinforcements: + name: '$reinforcementLevel &cPit Beast' +dark_cathedral_tier_75_boss: + name: '$bossLevel &4Cultist of Cthulhu' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The summoning has been interrupted!' + - '&c&l 1. Útočník: $damager1name &cs $damager1damage poškozením!' + - '&6&l 2. Útočník: $damager2name &6s $damager2damage poškozením!' + - '&e&l 3. Útočník: $damager3name &es $damager3damage poškozením!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Fools! + - Chtulhu R'lyeh! + - None can defeat Chtulhu! + - Stare into the abyss... + locationMessage: 'Cultist of Cthulhu: $distance blocks away' + spawnMessage: '&cA dark cultist is summoning Cthulhu!' + deathMessage: '&2The summoning has been thwarted $players!' + escapeMessage: '&2The cultist has completed the summoning!' +dark_cathedral_tier_75_reinforcement: + name: '$reinforcementLevel Follower of Cthulhu' + onDamageMessages: + - Cthulhu R'lyeh + onDamagedMessages: + - Cthulhu R'lyeh +darkspire_level_100_berserker_brute: + name: '$normalLevel &7Underworld Berserker' +darkspire_level_100_berserker_reanimated: + name: '$normalLevel &fReanimated Underworld Berserker' +darkspire_level_100_blacksmith_brute: + name: '$normalLevel &eSmoldering Goldsmith' +darkspire_level_100_endermite: + name: '$normalLevel &5Voidcrawler' +darkspire_level_100_marksman_piglin: + name: '$normalLevel &9Foolish Marksman' +darkspire_level_100_sentry_brute: + name: '$normalLevel &3Darkguard Sentry' +darkspire_level_100_summon_blaze: + name: '$reinforcementLevel &cHellspawn' +darkspire_level_100_summon_evoker: + name: '$reinforcementLevel &cFalse Hellraiser' +darkspire_level_100_summon_ghast: + name: '$reinforcementLevel &7Maalkvvhar' +darkspire_level_100_summon_husk: + name: '$reinforcementLevel &cOroxak''s Corrupted' +darkspire_level_100_summon_ravager: + name: '$reinforcementLevel &cEerbix the Fallen' +darkspire_level_100_summon_skeleton: + name: '$reinforcementLevel &cRibling' +darkspire_level_110_berserker_reanimated: + name: '$normalLevel &7Reanimated Underworld Berserker' +darkspire_level_110_marksman_reanimated: + name: '$normalLevel &9Reanimated Foolish Marksman' +darkspire_level_110_necromancer_evoker: + name: '$normalLevel &8Black-Hearted Enchanter' +darkspire_level_110_sentry_reanimated: + name: '$normalLevel &3Reanimated Darkguard Sentry' +darkspire_level_110_stationary_stray: + name: '$normalLevel &6Hewn Watchman' +darkspire_level_120_miniboss_evoker: + name: '$minibossLevel &4Hellraiser' +darkspire_level_120_miniboss_illusioner: + name: '$minibossLevel &4Maalkv' +darkspire_level_120_miniboss_skeleton: + name: '$minibossLevel &4Crypt Keeper' +darkspire_level_120_miniboss_stray: + name: '$minibossLevel &4Nicolas Ribcage' +darkspire_level_120_miniboss_vindicator: + name: '$minibossLevel &4Zalmur the Impslayer' +darkspire_level_120_miniboss_wither_skeleton: + name: '$minibossLevel &4Oroxak' +darkspire_level_120_summon_zoglin: + name: '$reinforcementLevel &cArzags Horde' +darkspire_level_130_miniboss_phase_brute: + name: '$bossLevel &4Arzag the Beast' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Arzag the Beast''s invasion has been stopped!' + - '&c&l 1. Útočník: $damager1name &cs $damager1damage poškozením!' + - '&6&l 2. Útočník: $damager2name &6s $damager2damage poškozením!' + - '&e&l 3. Útočník: $damager3name &es $damager3damage poškozením!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' +darkspire_level_130_miniboss_zoglin: + name: '$bossLevel &4Arzag the Beast' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Arzag the Beast''s invasion has been stopped!' + - '&c&l 1. Útočník: $damager1name &cs $damager1damage poškozením!' + - '&6&l 2. Útočník: $damager2name &6s $damager2damage poškozením!' + - '&e&l 3. Útočník: $damager3name &es $damager3damage poškozením!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Arzag the Beast: $distance blocks away' + spawnMessage: '&4Arzag the Beast prepares for the invasion!' + escapeMessage: '&cArzag the Beast is done plundering!' +darkspire_level_80_summon_blaze: + name: '$reinforcementLevel &dFalse Hellspawn' +fireworks_level_50_boss_phase_1: + name: '$eventBossLevel &cSparky' + spawnMessage: '&eSparks fill the sky!' +fireworks_level_50_boss_phase_2: + name: '$eventBossLevel &cSparky' +fireworks_level_50_boss_phase_3: + name: '$eventBossLevel &cSparky' + deathMessages: + - '&e&l---------------------------------------------' + - '&eSparky''s out, party''s over!' + - '&c&l 1. Útočník: $damager1name &cs $damager1damage poškozením!' + - '&6&l 2. Útočník: $damager2name &6s $damager2damage poškozením!' + - '&e&l 3. Útočník: $damager3name &es $damager3damage poškozením!' + - '&aZabijáci: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&6Sparky returns to celebrate!' +fireworks_phase_2_reinforcement: + name: '$eventBossLevel &cBoomi' +fireworks_phase_3_reinforcement: + name: '$eventBossLevel &cPartygoer' +the_great_weaver: + name: '$eventBossLevel &cThe Great Weaver' + locationMessage: '&cThe Great Weaver: $distance blocks away!' + spawnMessage: '&cAwful creatures have appeared!' + deathMessage: '&aThe Great Weaver and it''s brood have been stopped by $players!' + escapeMessage: '&4The Great Weaver and it''s brood have vanished!' +the_great_weaver_summon: + name: '$eventBossLevel &4Brood Mother' +the_great_weaver_summon_1: + name: '$eventBossLevel &6Brood' +halloween_event_boss_mount: + name: '$minibossLevel Daredevil' +halloween_event_boss_p1: + name: '$bossLevel Dullahan' + locationMessage: '&4Dullahan: $distance blocks away!' + spawnMessage: '&4Don''t lose your head now, the headless horseman walks the earth once again!' + deathMessage: '&4The headless horseman was vanquished by $players!' + escapeMessage: '&4The headless horseman has left to haunt someone''s dreams!' +halloween_event_boss_p2: + name: '$bossLevel Dullahan' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Headless Horseman was vanquished!' + - '&c&l 1. Útočník: $damager1name &cs $damager1damage poškozením!' + - '&6&l 2. Útočník: $damager2name &6s $damager2damage poškozením!' + - '&e&l 3. Útočník: $damager3name &es $damager3damage poškozením!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Dullahan: $distance blocks away!' + deathMessage: '&4The headless horseman was vanquished by $players!' + escapeMessage: '&4The headless horseman has left to haunt someone''s dreams!' +halloween_event_boss_reinforcement: + name: '$normalLevel Spooky Skeleton' +the_hunter: + name: '$eventBossLevel &4The Hunter' + locationMessage: '&cThe Hunter: $distance blocks away!' + spawnMessage: '&cA Hunter is on the prowl!' + deathMessage: '&aThe Hunter was hunted to extinction by $players!' + escapeMessage: '&4The Hunter declares the hunt now over!' +the_hunter_mount: + name: '$eventBossLevel &fTamed Beast' +the_living_dead: + name: '$reinforcementLevel &6The Living Dead' +northpole_elf: + name: '$normalLevel &2Workshop Elf' +northpole_elf_summon: + name: '$reinforcementLevel &aSanta''s Elf' +northpole_jack_frost: + name: '$bossLevel &bJack Frost' +northpole_krampus: + name: '$bossLevel &5Krampus' +northpole_mrs_claus: + name: '$bossLevel &cMrs. Claus' +northpole_santa_claus: + name: '$bossLevel &4Santa Claus' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Someone stole all of Santa''s presents!' + - '&c&l 1. Útočník: $damager1name &cs $damager1damage poškozením!' + - '&6&l 2. Útočník: $damager2name &6s $damager2damage poškozením!' + - '&e&l 3. Útočník: $damager3name &es $damager3damage poškozením!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Santa Claus: $distance blocks away' + spawnMessage: '&4Santa Claus is getting ready for Christmas!!' + escapeMessage: '&cSanta set off on his sleigh!' +northpole_skeleton_summon: + name: '$reinforcementLevel &dSoul of the Naughty List' +northpole_snowy_wraith: + name: '$reinforcementLevel &1Snowy Wraith' +the_phantom: + name: '$eventBossLevel &7The Phantom' + locationMessage: '&cThe Phantom: $distance blocks away!' + spawnMessage: '&cA Phantom roams in the dark!' + deathMessage: '&aThe Phantom and his evil troupe have been stopped by $players!' + escapeMessage: '&4The Phantom has left!' +the_phantom_summon_1: + name: '&fCave Spider' +the_phantom_summon_2: + name: '&fWItch' +the_phantom_summon_3: + name: '&fZombie' +the_phantom_summon_4: + name: '&fHusk' +the_phantom_summon_5: + name: '&fDrowned' +the_phantom_summon_6: + name: '&fSkeleton' +the_phantom_summon_7: + name: '&fStray' +the_phantom_summon_8: + name: '&fEnderman' +pirate_ship_tier_10: + name: '$normalLevel &cCrewman' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_15: + name: '$normalLevel &cDeckhand' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_20_melee_1: + name: '$normalLevel &cShipmate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_20_melee_2: + name: '$normalLevel &eDrunken lout' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_20_miniboss: + name: '$minibossLevel &dCookie the Cook' + onDamageMessages: + - Wat're u doin n my kitchen! + - I've got layers! + - You've been served! + - Out me kitchen! + deathMessage: '&2Cookie the Cook''s been sliced and diced by $players!' +pirate_ship_tier_20_ranged: + name: '$normalLevel &cShipmate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_25_miniboss_1: + name: '$miniboss &cCharon the Helmsman' + onDamageMessages: + - Fools ahoy! + - Worthy opponent at prow! + deathMessage: '&2Charon the Helmsman''s been led astray by $players!' +pirate_ship_tier_30_melee: + name: '$normalLevel &cPirate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_30_miniboss_1: + name: '$minibossLevel &7Crushy the Crusher' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! + deathMessage: '&7Crushy the Crusher has been crushed by $players!' +pirate_ship_tier_30_ranged: + name: '$normalLevel &cPirate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_35: + name: '$normalLevel &4Pirate Navigator' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_35_miniboss_1: + name: '$minibossLevel &cSecond Mate' + onDamageMessages: + - You're not allowed here! + - Captain's quarters, back off! +pirate_ship_tier_35_miniboss_2: + name: '$minibossLevel &cSecond Mate' + onDamageMessages: + - You're not allowed here! + - Captain's quarters, back off! +pirate_ship_tier_40_miniboss_1: + name: '$minibossLevel &4First Hand' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! + deathMessage: '&6The Pirate Ship''s First Hand has been demoted by $players!' +pirate_ship_tier_45_boss: + name: '$bossLevel &4Captain Blackbeard' + onDamageMessages: + - Get off me ship! + - Arr, landlubers! + spawnMessage: '&4Captain Blackbeard is leading the Pirate Ship!' + deathMessage: '&2Captain Blackbeard''s beard''s been shaved by $players!' + escapeMessage: '&2Captain Blackbeard has run away with the plunder!' +the_returned: + name: '$reinforcementLevel &6Navrácený' +ruins_boss_p1: + name: '$eventBossLevel &9Thor' + spawnMessage: '&6Lightning descends down from the sky!' +ruins_boss_p2: + name: '$eventBossLevel &9Thor' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Thor was sent back to Asgard!' + - '&c&l 1. Útočník: $damager1name &cs $damager1damage poškozením!' + - '&6&l 2. Útočník: $damager2name &6s $damager2damage poškozením!' + - '&e&l 3. Útočník: $damager3name &es $damager3damage poškozením!' + - '&aZabijáci: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&6Lightning descends down from the sky!' +ruins_boss_reinforcement: + name: '$eventBossLevel &7Fenrir' +sewer_tier_10: + name: '$normalLevel &fLurker' +sewer_tier_15: + name: '$normalLevel &2Crawler' +sewer_tier_20_dry: + name: '$normalLevel &1Lost Wanderer' +sewer_tier_20_gravity_boss: + name: '$minibossLevel &1Spark' +sewer_tier_20_water: + name: '$normalLevel &1Smuggler' + onDamageMessages: + - You shouldn't be here! + onDamagedMessages: + - None shall stand in our way! +sewer_tier_20_water_boss: + name: '$minibossLevel &1Forgotten Hero' +sewer_tier_20_wither_boss: + name: '$minibossLevel &2Withered Corpse' +sewer_tier_30_ice_boss: + name: '$minibossLevel &2Ice Wraith' +sewer_tier_30_invisibility_boss: + name: '$minibossLevel &2Shadow Archer' +sewer_tier_30_melee: + name: '$normalLevel &5Sewer Beast' +sewer_tier_30_ranged: + name: '$normalLevel &5Spirit Whisperer' + onDamageMessages: + - A curse upon you! + - A pox upon your family! + - Feel the wrath of the spirits! + onDamagedMessages: + - You vex me so! + - Spirits, protect me! +sewer_tier_40: + name: '$normalLevel &6Mirage' + onDamageMessages: + - You victory, a lie + - Your odds, grim + - Your life, mine + onDamagedMessages: + - This pain, an illusion + - This blood, a mirage + - This weakness, a lie +sewer_tier_40_darkness_boss: + name: '$minibossLevel &2The Shadowmaster' +sewer_tier_40_darkness_boss_reinforcement: + name: '$reinforcementLevel &2Shadow' +sewer_tier_40_fire_boss: + name: '$minibossLevel &2The Grill Master' +sewer_tier_40_fire_boss_reinforcement: + name: '$reinforcementLevel &2Flame' +sewer_tier_40_poison_boss: + name: '$minibossLevel &2Toxic Gardener' + onDamageMessages: + - Feel nature's wrath! + onDamagedMessages: + - To me, minions! +sewer_tier_40_poison_boss_reinforcement: + name: '$reinforcementLevel &2Fallen Gardener' +sewer_tier_5: + name: '$normalLevel &7Sewer worker' + onDamageMessages: + - This area is restricted! + - Don't jump into the vats! + - | + You're not supposed to be here| + onDamagedMessages: + - Do you know what you're doing!? + - Foolishness! + - Don't you dare! +sewer_tier_50: + name: '$normalLevel &3Sewer Piranha' +sewer_tier_50_lightning_boss: + name: '$minibossLevel &2Mjolnir' +sewer_tier_50_ravager_boss: + name: '$minibossLevel &2Sewer Monstrosity' +sewer_tier_50_spider_boss: + name: '$minibossLevel &2Ancient Crawler' +sewer_tier_50_spider_boss_reinforcement: + name: '$reinforcementLevel &2Spiderling' +sewer_tier_50_water_boss: + name: '$minibossLevel &2Piranha King' +sewer_tier_50_water_boss_reinforcement: + name: '$reinforcementLevel &2Piranha Prince' +sewer_tier_60: + name: '$normalLevel &4Drowned One' +sewer_tier_70_boss: + name: '$bossLevel &4Drowned King' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Drowned King has been slain!' + - '&c&l 1. Útočník: $damager1name &cs $damager1damage poškozením!' + - '&6&l 2. Útočník: $damager2name &6s $damager2damage poškozením!' + - '&e&l 3. Útočník: $damager3name &es $damager3damage poškozením!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&cThe sewers echo with the clamor of a returned king...' + deathMessage: '&2The Drowned King has been slain!' + escapeMessage: '&2The sewers grow quiet, for now...' +sewer_tier_70_boss_reinforcement: + name: '$reinforcementLevel &4Drowned One' +totem_zombie_1: + name: '$eventBossLevel Head Zombie' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Zombie Totem been slain!' + - '&c&l 1. Útočník: $damager1name &cs $damager1damage poškozením!' + - '&6&l 2. Útočník: $damager2name &6s $damager2damage poškozením!' + - '&e&l 3. Útočník: $damager3name &es $damager3damage poškozením!' + - '&aZabijáci: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cZombie Totem: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine abomination has been sighted!' + deathMessage: '&aDr. Craftenmine''s abomination been terminated by $players!' + escapeMessage: '&4Dr. Craftenmine''s creation has escaped!' +totem_zombie_2: + name: '$eventBossLevel Totem Zombie' +totem_zombie_3: + name: '$eventBossLevel Totem Zombie' +totem_zombie_4: + name: '$eventBossLevel Totem Zombie' +totem_zombie_5: + name: '$eventBossLevel Totem Zombie' +totem_zombie_6: + name: '$eventBossLevel Totem Zombie' +treasure_goblin: + name: '$eventBossLevel &eGoblin s pokladem' + deathMessages: + - '&e&l---------------------------------------------' + - '&eGoblin s pokladem byl vydrancován!' + - '&c&l 1. Útočník: $damager1name &cs $damager1damage poškozením!' + - '&6&l 2. Útočník: $damager2name &6s $damager2damage poškozením!' + - '&e&l 3. Útočník: $damager3name &es $damager3damage poškozením!' + - '&aZabijáci: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cGoblin s pokladem: je daleko $distance!' + spawnMessage: '&cGoblin s pokladem byl zpozorován!' + deathMessage: '&aGoblin s pokladem byl zabit $players!' + escapeMessage: '&4Goblin s pokladem utekl!' +tree_defender: + name: '$eventBossLevel &2Tree Defender' +undead_farmer: + name: '$eventBossLevel &aUndead Farmer' + locationMessage: '&cUndead Farmer: $distance blocks away!' + spawnMessage: '&cAn Undead Farmer walks the earth!' + deathMessage: '&aThe Undead Farmer''s career was ended by $players!' + escapeMessage: '&4The Undead Farmer has gone back to rest!' +undead_farmer_summon: + name: '$eventBossLevel &2Farmers Pride' +undead_farmer_summon_1: + name: '$eventBossLevel &2Failed Hog' +undead_horde_summon_1: + name: '$reinforcementLevel &aUndead Horde' +undead_horde_summon_2: + name: '$reinforcementLevel &dUndead Horde' +undead_horde_summon_3: + name: '$reinforcementLevel &eUndead Horde' +unwanted_visitor: + name: '$eventBossLevel &9Unwanted Visitor' + locationMessage: '&cUnwanted Visitor: $distance blocks away!' + spawnMessage: '&cAn Unwanted Visitor has come to the nether to warm up!' + deathMessage: '&aThe Visitor was slain by $players!' + escapeMessage: '&4The Visitor has gone back to his chilly domain!' +unwanted_visitor_summon: + name: '$eventBossLevel &bIce Clone' +vampire_boneman: + name: '$reinforcementLevel &7Drainlings' +vampire_brute: + name: '$normalLevel &1Vampire Brute' +vampire_brute_coffin_breaker: + name: '$normalLevel &1Vampire Brute' +vampire_brute_gargoyle_rush_left: + name: '$normalLevel &3Vampire Brute' +vampire_brute_gargoyle_rush_left_phase_2: + name: '$normalLevel &3Vampire Brute' +vampire_brute_gargoyle_rush_right: + name: '$normalLevel &3Vampire Brute' +vampire_brute_gargoyle_rush_right_phase_2: + name: '$normalLevel &3Vampire Brute' +vampire_fledgling: + name: '$normalLevel &9Vampire Fledgling' +vampire_fledgling_coffin_breaker: + name: '$normalLevel &9Vampire Fledgling' +vampire_fledgling_gargoyle_overlord: + name: '$normalLevel &9Vampire Fledgling' +vampire_gargoyle: + name: '$normalLevel &6Vampire''s Gargoyle' +vampire_grunt: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_coffin_breaker: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_left: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_left_phase_2: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_right: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_right_phase_2: + name: '$normalLevel &1Vampire Grunt' +vampire_hound: + name: '$reinforcementLevel &bVampire Hound' +vampire_king: + name: '$bossLevel &4Vampire King' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Vampire King has been slain!' + - '&c&l 1. Útočník: $damager1name &cs $damager1damage poškozením!' + - '&6&l 2. Útočník: $damager2name &6s $damager2damage poškozením!' + - '&e&l 3. Útočník: $damager3name &es $damager3damage poškozením!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Vampire King: $distance blocks away.' + spawnMessage: '&cThe Vampire King crawls back to his throne...' + deathMessage: '&2The Vampire King has been smitten!' + escapeMessage: '&2Darkness flees, but for how long...' +vampire_king_phase_2: + name: '$bossLevel &4Vampire King' +vampire_king_phase_3: + name: '$bossLevel &4Vampire King' +vampire_king_phase_4: + name: '$bossLevel &4Vampire King' +vampire_king_phase_5: + name: '$bossLevel &4Vampire King' +vampire_king_phase_6: + name: '$bossLevel &4Vampire King' +vampire_level_120_miniboss_evoker: + name: '$minibossLevel &4Hellraiser''s Spirit' +vampire_level_120_miniboss_skeleton: + name: '$minibossLevel &4Crypt Keeper''s Spirit' +vampire_level_120_miniboss_stray: + name: '$minibossLevel &4Nicolas Ribcage''s Spirit' +vampire_level_120_miniboss_wither_skeleton: + name: '$minibossLevel &4Oroxak''s Spirit' +vampire_necromancer: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_dining_hall: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_entrance: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_foresight_pool: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_gargoyle_rush: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_gargoyle_rush_phase_2: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_left_bedroom: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_right_bedroom: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_supply_room: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_supreme_coffin_breaker: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_2: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_3: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_4: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_5: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_gargoyle_overlord: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_gargoyle_overlord_phase_2: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_gargoyle_overlord_phase_3: + name: '$minibossLevel &2Gargoyle Overlord' +vampire_sentinel: + name: '$minibossLevel &eVampire''s Sentinel' +vampire_thrall: + name: '$reinforcementLevel &dVampire''s Thrall' +vampire_wraith: + name: '$minibossLevel &8Drained One' +vampire_wraith_phase_2: + name: '$minibossLevel &8Drowned One' +vampire_zombie: + name: '$normalLevel &aDrained Husk' +vex_top: + name: '$eventBossLevel &eVex Selfish Top' + locationMessage: '&cVex Troublemakers: $distance blocks away!' + spawnMessage: '&cA gang of Vex Troublemakers have appeared!' + deathMessage: '&aThe Vex Troublemakers were slain by $players!' + escapeMessage: '&4The Vex Troublemakers have decided to leave.' +vex_top_mount_1: + name: '$eventBossLevel &6Vex Bottom' +vex_top_mount_2: + name: '$eventBossLevel &6Vex Bottom' +vex_top_mount_3: + name: '$eventBossLevel &6Vex Bottom' +warlock: + name: '$eventBossLevel &dWarlock' + locationMessage: '&cWarlock: $distance blocks away!' + spawnMessage: '&cA demon riding Warlock has appeared!' + deathMessage: '&aThe Warlock was slain by $players!' + escapeMessage: '&4The Warlock ran away on his demon!' +warlock_mount: + name: '$eventBossLevel &dDemon' +wasp_queen: + name: '$eventBossLevel &aWasp Queen' + locationMessage: '&cWasp Queen: $distance blocks away!' + spawnMessage: '&cA wasp swarm has been sighted!' + deathMessage: '&aThe wasp swarm was eliminated by $players!' + escapeMessage: '&4The wasp swarm has flown away.' +wasp_queen_summon: + name: '$eventBossLevel &aWasp' +water_pest: + name: '$eventBossLevel &3Water Pest' + locationMessage: '&cWater Pest: $distance blocks away!' + spawnMessage: '&cAn annoying foe swims the waters!' + deathMessage: '&aThe Water Pest was slain by $players!' + escapeMessage: '&4The waters are clear of all Pests' +weapons_goblin: + name: '$eventBossLevel &cWeapons Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Weapons Goblin has been pillaged!' + - '&c&l 1. Útočník: $damager1name &cs $damager1damage poškozením!' + - '&6&l 2. Útočník: $damager2name &6s $damager2damage poškozením!' + - '&e&l 3. Útočník: $damager3name &es $damager3damage poškozením!' + - '&aZabijáci: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cWeapons Goblin: $distance blocks away!' + spawnMessage: '&cA Weapons Goblin has been sighted!' + deathMessage: '&aA Weapons Goblin has been slain by $players!' + escapeMessage: '&4A Weapons Goblin has escaped!' +wendigo: + name: '$eventBossLevel &7Wendigo' + locationMessage: '&cWendigo: $distance blocks away!' + spawnMessage: '&cSomething awful has appeared!' + deathMessage: '&aThe Wendigo has been slain $players!.' + escapeMessage: '&4The Wendigo has disappeared!' +wendigo_summon: + name: '$reinforcementLevel &aWindigo' +werehare: + name: '$eventBossLevel &5Alice' + locationMessage: '&cWerehare: $distance blocks away!' + spawnMessage: '&cA bloody roar can be heard! A werehare approaches!' + deathMessage: '&a$players! made sure to end the werehare''s reign!' + escapeMessage: '&4The werehare escaped!' +werehare_p2: + name: '$eventBossLevel &dWerehare' +wild_wolf: + name: '$reinforcementLevel &7Wild Wolf' +wood_league_wave_10_boss: + name: '$bossLevel &4Bad Doggo' +wood_league_wave_10_reinforcement: + name: '$reinforcementLevel &cBad Pupper' +wood_league_wave_11_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_11_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_12_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_12_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_13_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_13_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_14_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_14_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_15_miniboss: + name: '$bossLevel &4Mr. Oinkers' + onDamagedMessages: + - Oink!? +wood_league_wave_16_melee: + name: '$normalLevel Mr. Oinkers Fan' +wood_league_wave_16_ranged: + name: '$normalLevel Mr. Oinkers Fan' +wood_league_wave_17_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_17_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_18_melee: + name: '$normalLevel &4Fencing Club Enthusiast' +wood_league_wave_19_ranged: + name: '$normalLevel Archery Club Enthusiast' +wood_league_wave_1_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_1_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_20_boss: + name: '$bossLevel &2Zoltan' +wood_league_wave_21_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_21_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_22_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_22_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_23_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_23_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_24_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_24_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_25_miniboss: + name: '$minibossLevel &bAgdluak' +wood_league_wave_26_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_26_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_27_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_27_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_28_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_29_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_2_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_2_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_30_boss: + name: '$bossLevel &2The Southern Viper' +wood_league_wave_31_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_31_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_32_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_32_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_33_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_33_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_34_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_34_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_35_miniboss: + name: '$minibossLevel &6The Jester' +wood_league_wave_36_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_36_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_37_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_37_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_38_melee: + name: '$normalLevel &4Arena Swordsman' +wood_league_wave_39_ranged: + name: '$normalLevel Arena Archer' +wood_league_wave_3_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_3_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_40_boss: + name: '$bossLevel &cCrucio the Bearer of Curses' +wood_league_wave_41_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_41_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_42_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_42_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_42_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_43_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_43_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_43_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_44_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_44_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_44_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_45_miniboss: + name: '$minibossLevel &6Thousand Blades' +wood_league_wave_46_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_46_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_46_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_47_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_47_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_47_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_48_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_48_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_49_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_49_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_4_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_4_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_50_boss: + name: '$bossLevel &6Uther the Champion' +wood_league_wave_50_boss_p2: + name: '$bossLevel &6Uther the Champion' +wood_league_wave_50_boss_p3: + name: '$bossLevel &6Uther the Champion' +wood_league_wave_50_reinforcement: + name: '$reinforcementLevel &6Uther Stan' +wood_league_wave_5_miniboss: + name: '$minibossLevel &cWeird Cow' + onDamagedMessages: + - Haf! +wood_league_wave_6_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_6_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_7_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_7_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_8_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_9_ranged: + name: '$normalLevel Arena Crossbowman' +yeti: + name: '$eventBossLevel &bYeti' + locationMessage: '&cYeti: $distance blocks away!' + spawnMessage: '&cA mighty beast has appeared!' + deathMessage: '&aThe beast is no more thanks to $players!.' + escapeMessage: '&4The beast has escaped!' +yezhi_baba: + name: '$eventBossLevel &cYezhi Baba' + locationMessage: '&cYezhi Baba: $distance blocks away!' + spawnMessage: '&cA foul hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +yezhi_baba_summon: + name: '$reinforcementLevel &4Yezhi Baba' +zombie_friends_friend: + name: '$reinforcementLevel &7Zombie přítel' +zombie_king: + name: '$eventBossLevel &4Zombie král' + locationMessage: '&cKrál zombie: je daleko $distance!' + spawnMessage: '&cZombie král byl zpozorován!' + deathMessage: '&aKrál zombie byl zabit $players!' + escapeMessage: '&aKrál zombie utekl!' +zombie_parents_dad: + name: '$reinforcementLevel &7Zombie otec' +zombie_parents_mom: + name: '$reinforcementLevel &7Zombie matka' +back_teleporter: + name: Hermes + role: + greetings: + - Vítej v \nDobrodružníkovo Guild Místečku! + dialog: + - Potřebuješ se vrátit? + farewell: + - Bezpečné cesty, příteli. + noPreviousLocationMessage: '&8[EliteMobs] &cNelze tě poslat zpět na tvojí předchozí polohu - žádná předchozí poloha nenalezena!' +barkeep: + name: Bartley + role: + greetings: + - Potřebuješ pit? + - Chceš nápoj + - Žíznivý? + - Dobrý den, partnere. + dialog: + - Užijte si jednu z našich domácích specialit. + - Speciální nápoje, který nenajdeš\nnikde jinde. + - Jednou ochutnáš\na budeš se vracet pro další. + farewell: + - Vraťte se kdykoliv + - Zdola-nahoru! + - Kampai! + - Salut! + - Brosd! + - Salud! + - À la vôtre ! + - Prost! + - Santi! + - Salute! + - Saúde! + - Cheers! + - 乾杯! +blacksmith: + name: Greg + role: + greetings: + - Welcome to our shop! + - Sell your goods here! + - Fresh goods, just for you! + - Got something to sell? + - Want to buy something good? + - Fresh goods every time! + dialog: + - Higher level mobs drop\nhigher value items! + - Items with lots of \nenchantments are worth more! + - Higher level mobs drop\nbetter items! + - Higher level mobs have\na higher chance of dropping loot! + - + - + - Some items have special\npotion effects! + - Some items have unique\neffects! + - The hunter enchantment\nattracts elite mobs to your\nlocation! + - Special weapons and armor\ndropped by elite mobs can\nbe sold here! + - Higher guild ranks will\nincrease the quality of the\nloot from elite mobs! + farewell: + - Thank you for your business! + - Come back soon! + - Come back any time! + - Recommend this shop to your\nfriends! +combat_instructor: + name: Charles + role: + greetings: + - Want to learn about combat? + - Need a combat lesson? + - Want to know more about combat? + - Ready to fight Elite Mobs? + dialog: + - The items around Elite Mobs\nshow what powers they have. + - The higher the level of\nthe Elite Mob, the\nmore powers they can have + - The higher the level of\nthe Elite Mob, the\nbetter the loot they can drop + - Higher level Elite Mobs\nhave higher chances\nof dropping special items + - Elite Mobs with floating\narrows fire arrows at\nnearby players + - Elite Mobs with floating\nender eyes blind you\nwhen they hit you + - Elite Mobs with floating\nspell particles confuse you\nwhen they hit you + - Elite Mobs with floating\nlava buckets set you on fire\nwhen they hit you + - |- + Elite Mobs with floating\nfireballs fire fireballs + at nearby players + - Elite Mobs with floating\npacked ice freeze you\nwhen they hit you + - Elite Mobs with floating\nelytras make you float\nwhen they hit you + - Elite Mobs with floating\nemeralds poison you\nwhen they hit you + - Elite Mobs with floating\npistons push you\nwhen they hit you + - Elite Mobs with floating\ntotems weaken you\nwhen they hit you + - Elite Mobs with floating\nwebs web you\nwhen they hit you + - Elite Mobs with floating\nskulls wither you\nwhen they hit you + - Elite Mobs with floating\nchests drop bonus loot\nwhen you kill them + - Elite Mobs with floating\ngold boots are faster + - Elite Mobs with floating\njukeboxes taunt you\nduring combat + - Elite Mobs with floating\nglass panes are invisible + - Elite Mobs with floating\nspectral arrows are immune\nto arrows + - Elite Mobs with floating\nfeathers are immune\nto fall damage + - Elite Mobs with floating\nflames are immune\nto fire + - Elite Mobs with floating\nanvils are heavier\nthan usual + - Elite Mobs with floating\nbone blocks leave their\ncorpses behind when killed + - Elite Mobs with floating\nslime blocks jump higher\nthan usual + - Elite Mobs with floating\nslime balls create a vaccum\nupon death + - Elite Mobs with floating\nleads pull you\nwhen they hit you + - Elite Mobs with floating\nbones create bone pillars\nduring combat + - Elite Mobs with floating\ntipped arrows fire tracking\narrows during combat + - Elite Mobs with floating\nmushrooms bloat up to become giants\nwhen hit + - Elite Mobs with floating\nskulls summon reinforcements\nwhen hit + - Elite Mobs with floating\nbooks summon reinforcements\nuntil you kill the summoner + - Elite Mobs with floating\neggs summon reinforcements\nwhen hit + - Elite Mobs with floating\nfireworks summon Team Rocket\nwhen hit +enhancer_config: + name: Tim + role: + greetings: + - Chceš opravit speciální Itemy? + - Got upgrade orbs? + - Get yer items upgraded here! + - "Ahoj!\n" + - Ye got scrap son? + dialog: + - Yer items are lousy,\n get an upgrade here! + - Upgrade yer items here! + - Ye got an upgrade orb? + - That sword looks awful,\nget it upgraded here! + - Need an upgrade? + farewell: + - Don't embarrass yourself out there! + - Come back when you have more orbs! + - Go get more orbs! +frost_queen_teleporter: + name: Ishard the Frostbitten + role: + greetings: + - '' +guide_0: + name: Dux + role: + greetings: + - Heard about the AG? + - Been to the AG? + - Heard of the Adventurer's Guild? + - Know about the Adventurer's Guild? + dialog: + - Heard about the AG? + - Been to the AG? + - Heard of the Adventurer's Guild? + - Know about the Adventurer's Guild? + farewell: + - Vraťte se kdykoliv + - I'll be here if you need me! + - I'll be around! + - See you later! +guide_1: + name: Casus + role: + greetings: + - Need guidance? + - Need a hint + - Are you lost? + - Need help? + dialog: + - Vím všechno \n o tomto místě! + - Want to meet the other members\nof the Adventurer's Guild? + - Potřebuješ se zde\nzorientovat? + farewell: + - Vraťte se kdykoliv + - I'll be here if you need me! + - I'll be around! + - See you later! +guild_attendant: + name: Gillian + role: + greetings: + - Welcome to the\nAdventurer's Guild! + - Welcome! + dialog: + - Check the questboard to\nsee active quests! + - You can talk to me to\nchange your guild rank! + - You can sell items to the\nblacksmith for coins! + - You can talk to the arena\nmaster to take the arena on! + - You can buy equipment from\nthe blacksmith! + - You can talk to the combat\nmaster to check your combat level! + - Unlocking new guid tiers\nincreases your maximum health! + farewell: + - See you soon! + - Thanks for stopping by! + - Happy hunting! +primis_69ozcanofbepis: + name: '&a69OzCanOfBepis' + role: '&2Map Maker (Uuuuge gamer)' + dialog: + - Hope you are enjoying the map! + farewell: + - Have fun! +primis_caeruleaum_fisherman: + name: '&3Piscis Nemesis' + role: '&b' + greetings: + - Hiya!. + dialog: + - Woah! Almost fell off the boat. + - Darn sea monster! + - Need more bait. + farewell: + - Later! + - Good luck! +primis_caeruleaum_fletcher: + name: '&6Ventus Artifex' + role: '&e' + greetings: + - Greetings. + dialog: + - I used to be an adventurer like you. + - Welcome, outsider + - Need something? + - |- + You're not from around these parts, + are you? + farewell: + - See you 'round! + - Come back soon! +primis_caeruleaum_forager: + name: '&5Venator Pabulatus' + role: '&d' + greetings: + - Hello, stranger. + dialog: + - I used to be an adventurer like you. + - Welcome, outsider + - Need something? + - |- + You're not from around these parts, + are you? + farewell: + - See you 'round! + - Come back soon! +primis_caeruleaum_hint_giver: + name: '&fVir Loquax' + role: '&fWise Man' + greetings: + - Hi there! + - Hello! + - It is good to see you! + - Greetings! + dialog: + - + - + - + - + - The ruins in the southwest are such a horrible place!\n Who would ever go there... + - + - + - I heard that a nasty type of\nwolf has settled in the wolf den! + farewell: + - Goodbye! + - See you later! + - Come visit me again! + - Farewell! +primis_caeruleaum_injured_fisherman: + name: '&3Callidus Piscatus' + role: '&b' + greetings: + - Hello, wanderer. + dialog: + - Caught any good fish lately? + - Welcome, outsider + - Need something? + - |- + You're not from around these parts, + are you? + farewell: + - See you 'round! + - Come back soon! +primis_caeruleaum_jeeves: + name: Jeeves + role: + greetings: + - Just traveling! + dialog: + - Just here to sell\nto the shop-keep. + - I'm busy negotiating\nhere. + - Not right now,\ncome back later. + farewell: + - Uhuh... +primis_caeruleaum_leader: + name: '&4Chief Piscis' + role: '&c' + greetings: + - Welcome to our village! + dialog: + - |- + Ask not what this village can do for you, + ask what you can do for this village! + - Welcome, outsider + - Need something? + - |- + You're not from around these parts, + are you? + farewell: + - Off you go! + - Come back soon! +primis_caeruleaum_merchant: + name: Emptor + role: + greetings: + - Got something to sell? + dialog: + - Bandits stole my wares! + - Got nothing to sell, I'm afraid. + - I'll buy anything you have! + farewell: + - Safe travels! +primis_captain: + name: '&4Captain Squalus' + role: '&c' + greetings: + - Tak ses konečně probudil! + - That was a wild ride! + - Still alive? + - Let's not do that again! + dialog: + - I've got a task for you! + - Potřebuji tvoui pomoc! + - |- + Good thing you're here, + we need some help! + farewell: + - Off you go! + - Don't forget about me! + - Come back soon! +primis_deli'o: + name: '&eDéli''O' + role: '&6Map Maker (Gamer)' + dialog: + - Hope you are enjoying the map! + farewell: + - Have fun! +primis_farmstead_son: + name: '&4Filius' + role: '&c' + greetings: + - Where do you fare from? + - You seem like you came a long way from here. + dialog: + - Dangerous times we live in. + - Have you seen my father? + - Without a lighthouse, how will boats navigate? + farewell: + - Watch your back! + - Tread lightly! +primis_farmstead_wife: + name: '&4Amavit' + role: '&c' + greetings: + - I haven't seen you before! + - Any news from Pontis Mille? + dialog: + - Have you seen my husband? + - Potřebuji tvoui pomoc! + - What dangerous times we live in. + - Something is amiss! + farewell: + - Safe travels! + - Thank you! +primis_first_mate: + name: '&cIracundi' + role: '&c' + greetings: + - Tak ses konečně probudil! + - That was a wild ride! + - Still alive? + - Let's not do that again! + dialog: + - I've got a task for you! + - Potřebuji tvoui pomoc! + - |- + Good thing you're here, + we need some help! + farewell: + - Off you go! + - Don't forget about me! + - Come back soon! +primis_frostcone: + name: '&bFrostCone' + role: '&9Map Maker (Gamer)' + dialog: + - Hope you are enjoying the map! + - It's a pine-cone covered in snow. + - Is Primis out yet? + farewell: + - Have fun! +primis_gladius_guard_1: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_guard_2: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_guard_3: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_guard_4: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_lord: + name: '&4General Hasta' + role: '&c' + greetings: + - Are you here to help? + - It's a war zone out there! + dialog: + - They came in the night! + - We never saw them coming! + - Where are our reinforcements? + farewell: + - Watch your back! + - Tread lightly! +primis_gladius_quartermaster: + name: '&6Cibus' + role: '&c' + greetings: + - Are you here to help? + - It's a war zone out there! + dialog: + - They came in the night! + - We never saw them coming! + - Where are our reinforcements? + farewell: + - Watch your back! + - Tread lightly! +primis_gladius_strategist: + name: '&6Belli' + role: '&c' + greetings: + - Are you here to help? + - It's a war zone out there! + dialog: + - They came in the night! + - We never saw them coming! + - Where are our reinforcements? + farewell: + - Watch your back! + - Tread lightly! +primis_groves_nemus_leader: + name: '&3King Nemian' + role: '&c' + dialog: + - What brings you under the hill? + - Where are you from? + - |- + Have you tried our + delicious glow berries? + farewell: + - Until next time. +primis_ice_village_fisherman_boat: + name: '&3Theopropides Nero' + role: '&3' + greetings: + - Fishy day! + dialog: + - A chilly day for fishing. + - They aren't biting. + - Just gotta be patient. + farewell: + - Don't fall into\nthe water! +primis_ice_village_friendly_villager: + name: '&3Luxuria Placidus' + role: '&3' + greetings: + - Hellos! + dialog: + - Old age will not\nslow me down! + - Being in a good\nmood is important. + - Hoping for some\nsnow soon. + farewell: + - Farewell! +primis_ice_village_generic_npc_1: + name: '&3Albertus Vitalis' + role: '&3' + greetings: + - How goes it. + dialog: + - Nothing like good ale! + farewell: + - Bye. +primis_ice_village_generic_npc_10: + name: '&3Trebatia Cornix' + role: '&3' + greetings: + - OK. + dialog: + - Yep, got it. + - I see... + - Oh! + farewell: + - I will try that\nnext time. +primis_ice_village_generic_npc_11: + name: '&3Albatia Lateranus' + role: '&3' + greetings: + - Visiting Violet? + dialog: + - Don't cause trouble. + farewell: + - Later stranger. +primis_ice_village_generic_npc_12: + name: '&3Hostilia Carantus' + role: '&3' + greetings: + - Hi. + dialog: + - I was just\nleaving. + farewell: + - Bye. +primis_ice_village_generic_npc_13: + name: '&3Vagennia Sejanus' + role: '&3' + greetings: + - Hiya. + dialog: + - What brings you\nto the docks? + farewell: + - See ya. +primis_ice_village_generic_npc_14: + name: '&3Dinia Vettonius' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_15: + name: '&3Sceledrus Marcallas' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_16: + name: '&3Fridericus Castinus' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_17: + name: '&3Cario Fimbria' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_18: + name: '&3Piscatores Laevinus' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_19: + name: '&3Monkerius Vitalis' + role: '&3' + greetings: + - Been hunting? + dialog: + - Time to go hunting. + farewell: + - Farewell. +primis_ice_village_generic_npc_2: + name: '&3Luxuria Tyranus' + role: '&3' + greetings: + - How goes it. + dialog: + - One more! + farewell: + - Bye. +primis_ice_village_generic_npc_3: + name: '&3Aurelio Nigidius' + role: '&3' + greetings: + - Hey there. + dialog: + - What a sight! + farewell: + - Goodbye. +primis_ice_village_generic_npc_4: + name: '&3Lysidamus Paratus' + role: '&3' + greetings: + - Out for a walk? + dialog: + - I couldn't imagine\nliving somewhere\nwithout snow. + - Starting to get chilly. + farewell: + - Until later. +primis_ice_village_generic_npc_5: + name: '&3Simo Proceus' + role: '&3' + greetings: + - What a view! + dialog: + - I love climbing. + - Look at all the fish! + farewell: + - Yep. +primis_ice_village_generic_npc_6: + name: '&3Dordalus Marullinus' + role: '&3' + greetings: + - Welcome to the pub! + dialog: + - Time to warm up\nmy fingers. + - Nice and warm. + farewell: + - Don't let the\ncold get ya. +primis_ice_village_generic_npc_7: + name: '&3Tranio Silvanus' + role: '&3' + greetings: + - Here somewhere.. + dialog: + - Where is it. + farewell: + - I was sure I\nleft it here. +primis_ice_village_generic_npc_8: + name: '&3Milonia Trebellius' + role: '&3' + greetings: + - Welcome to our\nvillage! + dialog: + - I sure am hungry. + - Could go for\nsome salmon. + farewell: + - Farewell. +primis_ice_village_generic_npc_9: + name: '&3Barria Brocchus' + role: '&3' + greetings: + - Did you hear... + dialog: + - Keep that in mind\nnext time you swing\nyour sword. + - The shield can be\nmore than defense. + farewell: + - Got it? +primis_ice_village_hunter: + name: '&3Alanus Isatis' + role: '&3' + greetings: + - Hey! + dialog: + - Hoping for a good\nday tomorrow. + - Sure are many Razorbacks\nout this season. + farewell: + - Be seeing you. +primis_ice_village_imprisoned_husband: + name: '&3Eleusium Calenus' + role: '&3' + greetings: + - '.....' + dialog: + - Another day in a cage... + farewell: + - '.....' +primis_ice_village_jail_caretaker: + name: '&3Philolaches Triferus' + role: '&3' + greetings: + - Hey there. + dialog: + - What else needs\nfixing. + - I should check up\non the cages. + farewell: + - Later. +primis_ice_village_jail_guard: + name: '&3Eleusium Festus' + role: '&3' + greetings: + - Climbed the\ntower eh. + dialog: + - Everything seems in order. + - Almost everything... + farewell: + - Take care. +primis_ice_village_jail_master: + name: '&3Romanus Superbus' + role: '&3' + greetings: + - Well met. + dialog: + - Don't do the crime if\nyou can't do the time. + - Crime doesn't pay. + farewell: + - Until later. +primis_ice_village_leader: + name: '&3Glacies Princeps' + role: '&3' + greetings: + - Hey. + dialog: + - Darn Ice Elemental! + - Too many problems... + - How are we supposed to\ncomplete the trials now. + farewell: + - Goodbye. +primis_ice_village_lighthouse_keeper: + name: '&3Severinus Martius' + role: '&3' + greetings: + - Well met stranger. + dialog: + - Calm day today. + - Watch out for\nthe Ursus! + farewell: + - Take it easy. +primis_ice_village_missing_daughter: + name: '&3Cornelia Ennodius' + role: '&3' + greetings: + - Help... + dialog: + - Go away, go away,\nGO AWAY! + - They are not\nreal... + - Just don't look\nat them Cornelia. + farewell: + - Bye. +primis_ice_village_prisoner: + name: '&3Adrius Calpornius' + role: '&3' + greetings: + - I am innocent! + dialog: + - This is not where\nI belong!!! + farewell: + - Get me out of here! +primis_ice_village_pubkeeper: + name: '&3Grania Cecilius' + role: '&3' + greetings: + - Welcome! + dialog: + - Coming right up! + - Try our black ale! + - Need a drink? + farewell: + - One coming up! +primis_ice_village_tower_squatter: + name: '&3Modestus Eulogius' + role: '&3' + greetings: + - The noise! + dialog: + - So much screeching! + - Just trying to\nenjoy the peace. + farewell: + - Bye. +primis_ice_village_violet: + name: '&5Domina Violet' + role: '&d' + greetings: + - Did I ask\nyour opinion? + dialog: + - Feels good to\nget it out. + - They're gonna pay\nwhile I collect. + farewell: + - No, that's what I thought. +primis_ice_village_worried_father: + name: '&3Sparax Ennodius' + role: '&3' + greetings: + - I hope she is OK... + dialog: + - Let our girl be\nsafe, please. + farewell: + - Bye. +primis_ice_village_worried_mother: + name: '&3Sestia Ennodius' + role: '&3' + greetings: + - Where did she go. + dialog: + - Hmm, lost the trail. + farewell: + - Bye. +primis_ice_village_worried_wife: + name: '&3Titia Calenus' + role: '&3' + greetings: + - Hiya! + dialog: + - Nice and clean beds. + - Did I miss something? + - Another chest sorted. + farewell: + - Bye! +primis_magmaguy: + name: '&4Magmaguy' + role: '&cLead Developer (Non-gamer)' + dialog: + - Hope you are enjoying the map! + farewell: + - Have fun! +primis_mountain_guide: + name: '&4Petrae' + role: '&c' + greetings: + - Welcome to our village! + dialog: + - |- + Ask not what this village can do for you, + ask what you can do for this village! + - Welcome, outsider + - Need something? + - |- + You're not from around these parts, + are you? + farewell: + - Off you go! + - Come back soon! +primis_mountain_guide_2: + name: '&4Petrae' + role: '&c' + greetings: + - Welcome to our village! + dialog: + - |- + Ask not what this village can do for you, + ask what you can do for this village! + - Welcome, outsider + - Need something? + - |- + You're not from around these parts, + are you? + farewell: + - Off you go! + - Come back soon! +primis_nemus_leader: + name: '&3King Nemian' + role: '&c' + dialog: + - What brings you under the hill? + - Where are you from? + - |- + Have you tried our + delicious glow berries? + farewell: + - Until next time. +primis_ogre_mines_escaped_miner: + name: '&cFugit Fossores' + role: '&c' + greetings: + - I can't believe I made it! + - They're everywhere! + - Could you lend a hand? + dialog: + - I've got a task for you! + - Potřebuji tvoui pomoc! + farewell: + - Off you go! + - Be careful in there! + - Stay safe! +primis_ogre_mines_lone_miner: + name: '&cFortis Fossores' + role: '&c' + greetings: + - Finally, some help! + - Don't let them see you! + - Help me! + dialog: + - I've got a task for you! + - Potřebuji tvoui pomoc! + farewell: + - Off you go! + - Back to mining for me! + - Stay safe! +primis_ogre_mines_old_miner: + name: '&cVetus Fossores' + role: '&c' + greetings: + - Hey there sonny! + - You're lookin' a little lost! + - What brings you over here? + dialog: + - I've got a task for you! + - Potřebuji tvoui pomoc! + farewell: + - Off you go! + - Don't let the mine mites bite! + - Stay safe! +primis_ogre_mines_panicked_miner: + name: '&cMetus' + role: '&c' + greetings: + - The mine is overrun! + dialog: + - There's ogres everywhere! + - Can you help us? + farewell: + - Be careful! +primis_pontis_citizen_1: + name: '&7Agorastocles Gorgonius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_10: + name: '&7Pardalisca Saunio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_11: + name: '&7Sobersides Colias' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_12: + name: '&7Saturio Caepio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_13: + name: '&7Chrysalus Trebonius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_14: + name: '&7Toxilus Micon' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_15: + name: '&7Phronesium Viridio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_16: + name: '&7Aurelio Zoilus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_17: + name: '&7Diniarchus Nelius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_18: + name: '&7Cleostrata Senopius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_19: + name: '&7Georgius Sorio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_2: + name: '&7Franciscus Crispian' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_20: + name: '&7Epidicus Silvanus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_21: + name: '&7Pleusicles Marcellinus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_22: + name: '&7Plesidippus Nerva' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_23: + name: '&7Plesidippus Megellus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_24: + name: '&7Fridericus Achaicus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_25: + name: '&7Curculio Zosimus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_26: + name: '&7Demipho Sylvius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_27: + name: '&7Peniculus Nemesius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_28: + name: '&7Tyndarus Faustinius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_29: + name: '&7Sulpicio Panthera' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_3: + name: '&7Tycho Sellic' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_30: + name: '&7Melaenis Gelasius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_31: + name: '&7Tyndarus Columbanus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_32: + name: '&7Antamonides Cerinthus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_33: + name: '&7Lesbonicus Momus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_34: + name: '&7Fridericus Saloninus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_35: + name: '&7Anterastilis Fabricius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_36: + name: '&7Tyndarus Augustalis' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_37: + name: '&7Modestus Aper' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_38: + name: '&7Henricus Crassus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_39: + name: '&7Franciscus Tancinus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_4: + name: '&7Advocati Micon' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_40: + name: '&7Phygia Aurelius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_5: + name: '&7Advocati Micon' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_6: + name: '&7Messenio Rectus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_7: + name: '&7Hadrius Donicus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_8: + name: '&7Sulpicio Sejanus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_9: + name: '&7Stasimus Mutilus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_dockworker_1: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_10: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_2: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_3: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_4: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_5: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_6: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_7: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_8: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_9: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_enhancer: + name: '&7Meliorem' + role: '&8' + greetings: + - Need to upgrade? + - Got scrap? + - Let's upgrade! + dialog: + - I'll upgrade for scrap! + - Bring me scrap! + - Upgrade your gear for scrap! +primis_pontis_gardener_1: + name: '&eGorgines Asina' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_2: + name: '&ePiscatores Orissus' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_3: + name: '&eAlcesimus Abito' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_4: + name: '&ePyrgopolynices Perpenna' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_5: + name: '&eLemniselenis Gelasius' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_6: + name: '&eLysimachus Sulinus' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_7: + name: '&eStrobilus Farus' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_groves_catacombs_npc: + name: '&7Inaequaliter Hyaena' + role: '&7' + greetings: + - Psssst! + dialog: + - I heard there is great\ntreasure to be had! + - Something wonderful awaits\nyou if you enter! + - You should adventure\ninto this place... + - Why not go in? + - You should go inside... + - Don't worry, it's\ncompletely safe. + - No danger. I swear! + - Take a look inside. + - You should check\nout this place! + - He he he he he... + - What if somebody\ninside needs help. + - Go in, go in! + - Aren't you curious? + - Surely you should\ntake a peek. + farewell: + - He he he, later! +primis_pontis_groves_generic_npc_1: + name: '&2Sycophanta Mucius' + role: '&2' + greetings: + - I'm fine! + dialog: + - Do not worry about me. + - My brother will come rescue me. + - They won't eat me. + - I assure you I will be just fine. + farewell: + - Web ya later! +primis_pontis_groves_generic_npc_10: + name: '&2Hostilia Metunus' + role: '&2' + greetings: + - Hellos. + dialog: + - Are you bored too? + - Ugh, there must be something to do. + - Maybe I should brew more drinks. + farewell: + - See ya! +primis_pontis_groves_generic_npc_11: + name: '&2Tortilia Getha' + role: '&2' + greetings: + - Hi there. + dialog: + - My husband makes the best cakes. + - Want a slice? + - So delicious and moist! + farewell: + - Bye! +primis_pontis_groves_generic_npc_12: + name: '&2Consentia Apellinus' + role: '&2' + greetings: + - Oh, hello. + dialog: + - There, as good as new! + - Have to make sure the light keeps them away. + - Another lantern fixed... + farewell: + - Don't let the spiders bite! +primis_pontis_groves_generic_npc_13: + name: '&2Novia Senecius' + role: '&2' + greetings: + - Hi! + dialog: + - Oh, did not expect to see anyone here. + - Just gotta be quick and they can't get ya. + - The spiders don't stop me. + - This is my favorite resting spot. + farewell: + - Stay safe. +primis_pontis_groves_generic_npc_14: + name: '&2Maximia Priscus' + role: '&2' + greetings: + - Shhhh... + dialog: + - Thought you could\nsteal from me elves... + - Gonna get back my\npossessions when\nthey go sleep. + - Made it here by\ngoing around. + - They never saw\nme coming. + farewell: + - Keep it down. +primis_pontis_groves_generic_npc_15: + name: '&2Herennia Exsupereus' + role: '&2' + greetings: + - Hey there. + dialog: + - Just woke up. + - It's gonna be a good\nday I can feel it. + farewell: + - Bye bye. +primis_pontis_groves_generic_npc_16: + name: '&2Atria Maursus' + role: '&2' + greetings: + - Greetings. + dialog: + - Not sure how the king\nexpects me to do\nall of this... + - So much work.. + - Busy, busy, busy. + - This paperwork\nwon't do itself. + farewell: + - Bye bye. +primis_pontis_groves_generic_npc_17: + name: '&2Felicius Esurpus' + role: '&2' + greetings: + - Greetings! + dialog: + - If you need anything\nspeak to the king. + - Sorry, I am busy. + - No time for chit-chat,\nmy apologies. + farewell: + - Goodbye. +primis_pontis_groves_generic_npc_2: + name: '&2Sceledrus Fredisius' + role: '&2' + greetings: + - Heya! + dialog: + - I am actually fishing for bugs. + - Large aqua-bugs fall from the trees. + - I use tree sap as bait. + - The aqua-bugs cannot resist the bait! + - They are actually amphibious. + - Gotta catch'em before they head for the trees. + - They are quite tasty if you roast them. + - Hoping for a good catch! + farewell: + - Later. +primis_pontis_groves_generic_npc_3: + name: '&2Felicius Surius' + role: '&2' + greetings: + - Hi there! + dialog: + - The ocean is so pretty. + - I could stand here for days. + - The spiders sure are annoying. + farewell: + - Bye. +primis_pontis_groves_generic_npc_4: + name: '&2Periplectomenus Burcanius' + role: '&2' + greetings: + - Welcome! + dialog: + - Plenty of glow berries left. + - Hope you like my little farm. + - So many wines to attend to. + farewell: + - See you later. +primis_pontis_groves_generic_npc_5: + name: '&2Stephanus Magnus' + role: '&2' + greetings: + - Hey there! + dialog: + - Did you check out the berry farm? + - Lovely time for a walk. + - Can't be inside all the time. + farewell: + - Have a good one. +primis_pontis_groves_generic_npc_6: + name: '&2Abundantius Rogatus' + role: '&2' + greetings: + - Hiya! + dialog: + - What brings you into our lovely hole? + - Feel free to stay a while. + farewell: + - Bye. +primis_pontis_groves_generic_npc_7: + name: '&2Albanus Ivmarus' + role: '&2' + greetings: + - Easy there... + dialog: + - What? Yes, I'm doing just fine. + - I did not have too many, nope. + - Just one more... + - One more pint... + farewell: + - Farewell. +primis_pontis_groves_generic_npc_8: + name: '&2Bacchis Aventinus' + role: '&2' + greetings: + - Good day or evening... + dialog: + - I am so cozy right now. + - We used to go outside more often. + - Too many dangers outside these days. + farewell: + - Bless ya. +primis_pontis_groves_generic_npc_9: + name: '&2Pasicompsa Getha' + role: '&2' + greetings: + - Come in, come in! + dialog: + - Welcome to the best hole in the grove! + - Built this hole with my own hands! + - Hope you enjoy your stay! + farewell: + - Come back soon! +primis_pontis_groves_hole_luxuria: + name: '&cLuxuria Gorgonius' + role: '&c' + greetings: + - Hi there! + - Hellos! + dialog: + - Life is all about taking it easy. + - Why stress. + farewell: + - Visit us again! +primis_pontis_groves_hole_phygia: + name: '&cPhygia Gorgonius' + role: '&c' + greetings: + - Welcome to my home! + - Hellos! + dialog: + - We have to take action! + - Too many elves in our grove. + farewell: + - Visit us again! +primis_pontis_groves_lighthouse_generic_npc_1: + name: '&3Eleusium Martius' + role: '&3' + greetings: + - What brings you here? + dialog: + - Gotta make sure the\nlighthouse is working. + - Nice to see someone\ncome visit. + farewell: + - Goodbye. +primis_pontis_groves_lighthouse_generic_npc_2: + name: '&3Caelia Zoilus' + role: '&3' + greetings: + - Hey. + dialog: + - I hope he will\nbe alright. + - My turn to watch\nover the light. + - We almost ran\nout of food. + farewell: + - Bye. +primis_pontis_groves_lighthouse_sick_man: + name: '&3Alanus Secundas' + role: '&c' + dialog: + - I don't feel so good + - Hopefully I recover soon. + - Well, I am feeling a bit better. + - We need more food. + farewell: + - Farewell. +primis_pontis_groves_parkour_npc_1: + name: '&3Posuere Hominem' + role: '&c' + dialog: + - Up for a challenge? + - You think you got what it takes? + - Wanna go swinging? + - You a mad lad? + - No cheating! + farewell: + - See you later. +primis_pontis_groves_parkour_npc_2: + name: '&cIdoneitatem Hominem' + role: '&3' + dialog: + - That was impressive! + - Try and beat my record of 1m 47s. + - No cheating! + farewell: + - See you later. +primis_pontis_guard: + name: '&cPontis Guard' + role: '&8' + greetings: + - Want to upgrade gear? + dialog: + - Lost? Follow the bridge colors. + - Every bridge path has at least one color! + - Stay out of trouble! + - Don't cause any trouble! + - Pontis was built like a maze for defense. + - The bridge ceilings show that path's color! +primis_pontis_guard_1: + name: '&cPontis Guard' + role: '&8' + greetings: + - Want to upgrade gear? + dialog: + - Lost? Follow the bridge colors. + - Every bridge path has at least one color! + - Stay out of trouble! + - Don't cause any trouble! + - Pontis was built like a maze for defense. + - The bridge ceilings show that path's color! +primis_pontis_guard_2: + name: '&cPontis Guard' + role: '&8' + greetings: + - Hello! + dialog: + - This way to the shogun! +primis_pontis_guard_rat: + name: '&cPontis Elite Guard' + role: '&8' + greetings: + - Darn rats! + dialog: + - Filthy rats!!! + - Hold still,\ndarn you! + - Stop dodging\nmy attacks! + - Almost got one! + - Just die! + - Why wont you die!!! + - You can't dodge\nforever! + - Next strike! + - You're dead! + - How dare you\ndodge! + - Almost! +primis_pontis_guard_rat_at_wormhole: + name: '&cPontis Elite Guard' + role: '&8' + greetings: + - What's taking\nso long. + dialog: + - We got this\nunder control. + - Do not worry,\nthe elite guard\nis on the case! +primis_pontis_guard_shogun_1: + name: '&4Royal Guard' + role: '&8' + dialog: + - Don't go getting into trouble. + - Don't mind me, just keeping the peace. + - No funny business here. + - I've got my eye on you, adventurer. + - No questions, and no one gets hurt! + - Ain't got no time for messing around. + farewell: + - Safe travels, adventurer. +primis_pontis_guard_shogun_1_cat_quest: + name: '&4Royal Guard' + role: '&8' + dialog: + - Don't go getting into trouble. + - Don't mind me, just keeping the peace. + - No funny business here. + - I've got my eye on you, adventurer. + - No questions, and no one gets hurt! + - Ain't got no time for messing around. + farewell: + - Safe travels, adventurer. +primis_pontis_mille_arena_master_observatory: + name: Stella Hominis + role: + greetings: + - Hellos! + dialog: + - I hope to see many stars. + - Such heavenly bodies! + - The cosmos calls to me. + - Infinite possibilities. + - The ancient knowledge... + - I have tales to tell. + - If only you knew... + farewell: + - May the stars bless you. +primis_pontis_mille_concerned_shipmate: + name: '&3Delphium Calpurnius' + role: '&8' + dialog: + - Sigh. + - So much for my\nshipments... + farewell: + - Safe travels! +primis_pontis_mille_fields_camp_generic_npc_1: + name: '&cScribonia Ingenvinus' + role: '&c' + dialog: + - The most dangerous\nweapon is the one\nbetween your ears. + - Three arrows\nis all I need. + farewell: + - Catch ya later! +primis_pontis_mille_fields_camp_generic_npc_2: + name: '&cValador Lumus' + role: '&c' + dialog: + - I have hunted in\nmany places. + - Do you travel\na lot too? + farewell: + - May your blade be swift. +primis_pontis_mille_fields_camp_generic_npc_3: + name: '&cPhygia Ahala' + role: '&c' + dialog: + - Nothing like a\ngood hunt! + farewell: + - Stay safe. +primis_pontis_mille_fields_camp_generic_npc_4: + name: '&cAdrius Paterculus' + role: '&c' + dialog: + - The hunt calls! + farewell: + - Swift death. +primis_pontis_mille_fields_camp_generic_npc_5: + name: '&cCappadox Galerus' + role: '&c' + dialog: + - Join us, stranger! + farewell: + - Later. +primis_pontis_mille_fields_camp_generic_npc_6: + name: '&cSulpicio Rutilius' + role: '&c' + dialog: + - Hope our camp\nprovides you respite\nfrom the wild. + farewell: + - Bye. +primis_pontis_mille_fields_camp_generic_npc_7: + name: '&cAquarius Manus' + role: '&c' + dialog: + - Don't mind me just\nfetching some water. + - Clear blue water today. + farewell: + - Bye. +primis_pontis_mille_fields_camp_magmus: + name: '&cMagmus Hypnos' + role: '&4' + dialog: + - Where is Volumnia... + - I hope she isn't in\ntrouble again. + - I need a good rest. + - If only there were more\nhours in the day. + - Speak to me when you\nhave found Volumnia. + - So much work,\nso little time. + - Yet another 17 hour day. + - I worry too much. + farewell: + - Never enough time... +primis_pontis_mille_fields_farm_berry_npc: + name: '&9Dordalus Nasica' + role: '&e' + dialog: + - Berries are so tasty! + - You should eat\nmore berries! + - Why would they\nsteal my berries... + farewell: + - See'd ya later. +primis_pontis_mille_fields_farm_boy_npc: + name: '&9Planesium Victricius' + role: '&e' + dialog: + - So many rats... + - Phew almost\ndone here. + - This thing better hold. + - Any more lifting and\nI'm gonna break. + - The view from here\nis really nice. + - OK, back to work! + farewell: + - Try some our berries! +primis_pontis_mille_fields_farm_npc: + name: '&9Milonia Majus' + role: '&e' + dialog: + - Get away, darn rats! + - Stop eating my goods! + - Sigh... + farewell: + - Later. +primis_pontis_mille_fields_farm_well_npc: + name: '&eVolumnia Zoilus' + role: '&c' + dialog: + - Watch out for its spit! + - Its saliva is toxic. + - Please help! + - I hope nobody hears\nabout this... + - Am I glad to see you! + farewell: + - How could I let this happen. +primis_pontis_mille_fields_windmill_npc_1: + name: '&eDinia Niraemius' + role: '&d' + dialog: + - Plenty of wheat to process! + - No flour no bread. + - Do you like bread too? + farewell: + - See you. +primis_pontis_mille_fields_windmill_npc_2: + name: '&eDaemones Maritialis' + role: '&d' + dialog: + - It's so nice out here! + - Do you like my windmill? + - Just out here on break. + farewell: + - See you. +primis_pontis_mille_fields_windmill_npc_3: + name: '&eAdulescens Lupis' + role: '&d' + dialog: + - Hoping for some good wind! + - Need some flour? + - This one is the best Windmill around! + farewell: + - Bless ya. +primis_pontis_mille_general_bromia: + name: '&6Bromia Curio' + role: '&6General' + greetings: + - Hail! + dialog: + - It's time for war! + farewell: + - Goodbye! +primis_pontis_mille_general_cylindrus: + name: '&eCylindrus Celatus' + role: '&eGeneral' + greetings: + - Hail! + dialog: + - There is not enough time! + farewell: + - Goodbye! +primis_pontis_mille_general_godefridus: + name: '&cGodefridus Novation' + role: '&c' + greetings: + - Greetings! + - Hail! + dialog: + - Someone needs to drop\noff these documents. + - So many candles... + farewell: + - See you +primis_pontis_mille_general_rogerius: + name: '&eRogerius Olennius' + role: '&eGeneral' + greetings: + - Hail! + dialog: + - So much to do! + - I hope those 4 are ok... + farewell: + - Bye! +primis_pontis_mille_lighthouse_man: + name: '&3Hegio Remus' + role: '&c' + dialog: + - It is so beautiful up here. + - The best view... + farewell: + - Farewell. + - The sun sets! +primis_pontis_mille_major: + name: '&cFortes Bellator' + role: '&c' + greetings: + - Hello traveler! + - Hail! + dialog: + - Those darn goblins! + farewell: + - Farewell! +primis_pontis_mille_mew_meowzer: + name: '&aMew Meowzer' + role: '&d' + dialog: + - Meooooww! + - Meow... + - Mreeeooooowww... + - Meowww. + - MEOW! + farewell: + - Prrrr meow! +primis_pontis_mille_observatory_arena_turn_in: + name: Virgo Dexippus + role: + greetings: + - Hi! + dialog: + - Stella knows a lot. + - Stars have so much to tell. + - The light tells all. + farewell: + - May the moon light your way. +primis_pontis_mille_royal_guard_centurion: + name: '&4Royal Guard Centurion' + role: '&8' + dialog: + - No dallying! + - Set up camp! + - Where are our reinforcements? + - How many have fallen? + - We need to reorganize! + farewell: + - Tread lightly and carry a big sword. +primis_pontis_mille_scout_1: + name: '&cSyra Ursacius' + role: '&cWounded Scout' + greetings: + - Hail! + dialog: + - I can barely hold on... + farewell: + - Bye! +primis_pontis_mille_scout_2: + name: '&cSparax Auxilius' + role: '&cWounded Scout' + greetings: + - Hail! + dialog: + - The pain... + farewell: + - Bye! +primis_pontis_mille_scout_leader: + name: '&cBlepharo Octavius' + role: '&cScout Leader' + greetings: + - Hail! + dialog: + - It was too much... + farewell: + - Bye! +primis_pontis_mille_shogun: + name: '&6Navita' + role: '&c' + greetings: + - Yes? + dialog: + - Can I help you? + farewell: + - Walk softly, and carry a big gun. +primis_pontis_mille_slums_generic_npc_1: + name: '&7Gallicles Rex' + role: '&7' + dialog: + - It's not much but its our\nlittle part of town + farewell: + - Later. +primis_pontis_mille_slums_generic_npc_2: + name: '&7Gallicles Caelistis' + role: '&7' + dialog: + - Day by day... + farewell: + - '...' +primis_pontis_mille_slums_generic_npc_3: + name: '&7Nicodemus Frontinus' + role: '&7' + dialog: + - Fresh water for\nthe home. + farewell: + - The well serves\nus well +primis_pontis_mille_slums_generic_npc_4: + name: '&7Cocus Lucio' + role: '&7' + dialog: + - Hope you're having\na great day. + farewell: + - Enjoy your stay. +primis_pontis_mille_slums_generic_npc_5: + name: '&7Cornelia Florius' + role: '&7' + dialog: + - Which one should\nI get... + farewell: + - So many pretty\nflowers. +primis_pontis_mille_slums_generic_npc_6: + name: '&7Rutilia Placidus' + role: '&7' + dialog: + - I love it here. + - The smell of hay\nmakes me happy. + - My favorite place to\nrelax after a hard day. + farewell: + - Hay ya later! +primis_pontis_mille_slums_npc_1: + name: '&7Lena Lucan' + role: '&7' + dialog: + - Just one loaf of bread... + farewell: + - Wonder what tomorrow brings. +primis_pontis_mille_slums_npc_2: + name: '&7Tranio Florens' + role: '&7' + dialog: + - Doing OK today\nactually. + farewell: + - Night save ya. +primis_pontis_mille_slums_npc_3: + name: '&7Rufia Tertulus' + role: '&7' + dialog: + - At least something\ngood for\nthe kids. + - Not much at\nthe market... + - I cannot\nafford that. + farewell: + - Later. +primis_pontis_mille_slums_npc_4: + name: '&7Fabia Praetextus' + role: '&7' + dialog: + - Just close my eyes\nfor a second. + - Gotta imagine I am\nat a better place. + farewell: + - Goodbye. +primis_pontis_mille_slums_npc_5: + name: '&7Augustina Verrucosis' + role: '&7' + dialog: + - So many mouths\nto feed. + - Maybe some fruit\nfor the little\nones. + farewell: + - Bye. +primis_pontis_mines_guard_1: + name: '&cPontis Guard' + role: '&c' + greetings: + - HELP!!! + dialog: + - Please kill them! + - I am so scared. +primis_pontis_mines_guard_2: + name: '&cPontis Guard' + role: '&c' + greetings: + - SOMEONE PLEASE!!! + dialog: + - I don't wanna die! + - Can't hold out any more. +primis_pontis_mines_guard_3: + name: '&cPontis Guard' + role: '&c' + greetings: + - SAVE ME!!! + dialog: + - Are they gone? + - GET ME OUT! +primis_pontis_outpost_officer: + name: '&4NAME ME' + role: '&8' + dialog: + - I am unfinished! + - There is supposed\nto be an outpost\nhere. + farewell: + - Bye! +primis_pontis_redwoods_injured_lumberjack: + name: '&6Lyco Lupicinus' + role: '&6' + greetings: + - Heyo! + dialog: + - Darn saw! + - Got me again... + farewell: + - See you later. +primis_pontis_redwoods_lumberjack: + name: '&6Ligna Crispian' + role: '&6' + greetings: + - Greetings! + dialog: + - I love the look of a healthy tree. + - The brown tree really smells. + - |- + Pretty sure I saw a wolf on two legs + creeping around at night around here. + farewell: + - Until next time. +primis_pontis_redwoods_lumberjack_generic_1: + name: '&6Mulier Proculus' + role: '&6' + greetings: + - Hey-yo! + dialog: + - I wish they would leave us alone. + - Perfect day for logging. + farewell: + - Pinecone ya later! +primis_pontis_redwoods_lumberjack_generic_10: + name: '&6Piscatores Trenico' + role: '&6' + greetings: + - Well met! + dialog: + - Go away wolves! + - Leave me alone, darn fur-balls! + - Hah! Try and reach me up here! + farewell: + - Bye, Bye! +primis_pontis_redwoods_lumberjack_generic_2: + name: '&6Alanus Hermina' + role: '&6' + greetings: + - Hi... + dialog: + - Not so loud, keep it down. + - I am catching an extra break. + - Don't tell em I am here. + - Logging is tough work... + farewell: + - Later +primis_pontis_redwoods_lumberjack_generic_3: + name: '&6Lena Triarius' + role: '&6' + greetings: + - What's up! + dialog: + - Just standing here buzzin! + - Operating the saw is kinda fun. + - Gotta make sure you don't get hurt. + farewell: + - Catch you later! +primis_pontis_redwoods_lumberjack_generic_4: + name: '&6Aquila Isatis' + role: '&6' + greetings: + - How's it going! + dialog: + - Darn logs! + - No, not that way! + - Float better!!! + - Yep, that will do it. + farewell: + - See ya! +primis_pontis_redwoods_lumberjack_generic_5: + name: '&6Sulpicio Sidonius' + role: '&6' + greetings: + - Hi! + dialog: + - Nothing like a nice fire! + - Just relaxing after an honest day of work. + - Join us! + farewell: + - Bye, friend! +primis_pontis_redwoods_lumberjack_generic_6: + name: '&6Strobilus Clemens' + role: '&6' + greetings: + - Salutations! + dialog: + - Chopping like a beaver! + - The fastest axe in the west. + - No tree is a match for me! + farewell: + - Smell ya later! +primis_pontis_redwoods_lumberjack_generic_7: + name: '&6Candidus Nigellus' + role: '&6' + greetings: + - Greetings! + dialog: + - Fastest axe...my bottom! + - Don't take his ramblings seriously. + - Mr. big-shot sure has a lot to say. + farewell: + - Goodbye! +primis_pontis_redwoods_lumberjack_generic_8: + name: '&6Strobilus Clemens' + role: '&6' + greetings: + - I'm a bit busy! + dialog: + - We need to increase production... + - If we raise the cost... + - Need to order more axes. + farewell: + - Uh... +primis_pontis_redwoods_lumberjack_generic_9: + name: '&6Martinus Lepontus' + role: '&6' + greetings: + - Woah, hello! + dialog: + - You're coming down big one! + - I will show you! + - My axe, your bark, they should meet. + - Start off with a good chop. + farewell: + - Scared me... +primis_pontis_redwoods_lumberlord: + name: '&6Magnus Castorea' + role: '&6' + greetings: + - HELLO! + dialog: + - Nothing like healthy wood. + - |- + For every tree we cut, + we plant a new one! + - Big brown logs, yep. + farewell: + - BYE! +primis_pontis_redwoods_reyn: + name: '&6Reynus Protectoris' + role: '&6' + greetings: + - I am turning up the heat! + - Hiya! + dialog: + - Are you into logs? + - I love the smell of lumber! + farewell: + - See you later. + - Bye bye! +primis_pontis_scrapper: + name: '&7Fragmentum' + role: '&8' + greetings: + - Got something to scrap? + - Got trash? + - Need scrappin'? + dialog: + - I'll scrap anything you bring! + - Need scrap? + - Want scrap? +primis_pontis_smelter: + name: '&7Orbis' + role: '&8' + greetings: + - Want to upgrade gear? + dialog: + - Need upgrade orbs? + - I'll make upgrade orbs for scrap! + - Bring me scrap! +primis_sewer_donatello: + name: '&5Donatello' + role: '&dSewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_sewer_leonardo: + name: '&1Leonardo' + role: '&9Sewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_sewer_michelangelo: + name: '&6Michelangelo' + role: '&eSewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_sewer_raphael: + name: '&4Raphael' + role: '&cSewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_spa_attendee_1: + name: '&fNatsumi' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_2: + name: '&5Hanako' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_3: + name: '&3Tamika' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_4: + name: '&9Zaphra' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_5: + name: '&4Chie' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_6: + name: '&fKatashi' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_7: + name: '&dAkihiko' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_8: + name: '&6Sheranee' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - Rawr... + - OwO + farewell: + - Have fun! +primis_spa_staff: + name: '&cAozora' + role: '&7' + dialog: + - Enjoy the hot spring! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_staff_2: + name: '&6Rei' + role: '&7' + dialog: + - Enjoy the hot spring! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_terravilla_annoyed_explorer: + name: '&6Dorippa Sarimarcus' + role: '&6' + greetings: + - How's it going. + dialog: + - Not again. + - Stuck once more. + farewell: + - Be seeing you. +primis_terravilla_explorer: + name: '&6Telestis Senna' + role: '&6' + greetings: + - How goes it. + dialog: + - Always so\nbusy. + - Need a bag? + farewell: + - Bye. +primis_terravilla_generic_npc_1: + name: '&6Stephanium Major' + role: '&6' + greetings: + - Welcome to Terravilla! + dialog: + - Watch out for the\nTwo Legged Terrors! + - Here to check out the ruins? + farewell: + - Bye. +primis_terravilla_generic_npc_10: + name: '&6Mallia Galvisius' + role: '&6' + greetings: + - Heyo! + dialog: + - I would rather be in\ndown in the ruins... + - Hog watching to\npass the time. + farewell: + - Laters. +primis_terravilla_generic_npc_11: + name: '&6Papiria Virginius' + role: '&6' + greetings: + - Ok then... + dialog: + - Hit him harder! + - Woah! Good one! + - Yeah! Mess him up! + farewell: + - Yep... +primis_terravilla_generic_npc_12: + name: '&6Umbria Maccalus' + role: '&6' + greetings: + - What! + dialog: + - Is a girl not\nallowed to be\non a rooftop. + - Just try and\nget me down! + farewell: + - Yeah, whatever... +primis_terravilla_generic_npc_2: + name: '&6Delphium Assanius' + role: '&6' + greetings: + - Leave me alone! + dialog: + - What are you\nlooking at. + farewell: + - Scram! +primis_terravilla_generic_npc_3: + name: '&6Stephanium Vopiscus' + role: '&6' + greetings: + - Leave me alone! + dialog: + - What are you\nlooking at. + farewell: + - Scram! +primis_terravilla_generic_npc_4: + name: '&6Simo Clericus' + role: '&6' + greetings: + - Hey! + dialog: + - Heard the hog is on\nthe lift again. + farewell: + - Bye. +primis_terravilla_generic_npc_5: + name: '&6Harpax Colias' + role: '&6' + greetings: + - Ello. + dialog: + - The bo...I mean the\nOverseer is upstairs. + farewell: + - Laters. +primis_terravilla_generic_npc_6: + name: '&6Sulpicio Epolonius' + role: '&6' + greetings: + - Hi there. + dialog: + - I hope the ruins\nopen up again soon. + - I miss artifact\nhunting. + farewell: + - Goodbye. +primis_terravilla_generic_npc_7: + name: '&6Baebia Lucan' + role: '&6' + greetings: + - '...' + dialog: + - Cringe... + farewell: + - '...' +primis_terravilla_generic_npc_8: + name: '&6Novia Longinus' + role: '&6' + greetings: + - '...' + dialog: + - Are you always\nstaring at people? + - How about some\nprivacy? + farewell: + - '...' +primis_terravilla_generic_npc_9: + name: '&6Septimia Baro' + role: '&6' + greetings: + - Oh, hey. + dialog: + - If it opens up again\nthen I gotta go\nget more of these. + - What is this skull\nnfrom hmm... + farewell: + - '...' +primis_terravilla_overseer: + name: '&6Lutum Princeps' + role: '&6' + greetings: + - Yes? + dialog: + - What is it\nnow... + - I need to check\nup on them. + - At least I\nam not bored. + farewell: + - Good luck. +primis_terravilla_researcher: + name: '&6Plautia Suilius' + role: '&6' + greetings: + - Hmm... + dialog: + - Maybe if... + - That can't be right + - Not sure... + farewell: + - Later... +primis_traveler_1: + name: '&6Lysidamus Nolus' + role: '&6' + greetings: + - Hello stranger! + dialog: + - On my way back from the village. + - Heading to the village? + - Good luck on\nyour travels. + farewell: + - Roads bless you. +primis_traveler_2: + name: '&6Citro Gala' + role: '&6' + greetings: + - Hi! + dialog: + - On my way back\nfrom the village. + - Coming from Pontis Mille or? + - Good luck! + farewell: + - Roads bless you. +primis_traveler_3: + name: '&6Bromia Culleolus' + role: '&6' + greetings: + - Hello! + dialog: + - Are you too going\nto the village? + - I heard it's pretty\ncold there at\nthe village. + - Phew! Almost there!\nI gotta keep going. + farewell: + - Roads bless you. +primis_traveler_4: + name: '&6Demenis Nolus' + role: '&6' + greetings: + - Hello stranger! + dialog: + - Good to see someone\nelse on the road. + - Almost reached the village. + - Phew! + farewell: + - Roads bless you. +primis_traveler_5: + name: '&6Callipho Classicius' + role: '&6' + greetings: + - Heya! + dialog: + - I need better shoes. + - Soon I will\nbe home. + - Good to see the\nfields again! + farewell: + - Safe travels! +primis_traveler_6: + name: '&6Rodenus Palis' + role: '&6' + greetings: + - Hi there! + dialog: + - I am on my way back\nfrom the village. + - Good to see\nPontis Mille again. + - Is my brother lost again... + - Where is he? + farewell: + - Later! +primis_traveler_7: + name: '&6Gorenus Palis' + role: '&6' + greetings: + - Hey... + dialog: + - Am I lost again? + - This isn't Pontis Mille. + - Where am I? + - Uhh, this doesn't\nseem like the\nright way... + farewell: + - Bye. +quest_giver: + name: Qel'Thuzad + role: + greetings: + - Greetings, adventurer!\nFancy a quest? + - You! I've got a quest! + - Feeling... adventurous? + dialog: + - Dokončete úkoly klanu\nza skvělé odměny! + - Úkoly vyššího stupně mají\nlepší odměny! + - Higher tier quests make\nyou hunt higher level mobs! + - Want a harder challenge?\nIncrease your guild rank! + - Make sure you're well equipped\nfor these quests! + farewell: + - Bezpečné cesty, příteli. + - Happy hunting! + - Live long and prosper! + - Come back with your shield,\n or on it. + - Life before death! + - Strength before weakness! + - Journey before destination! +refiner_config: + name: Ralph + role: + greetings: + - Want to uprade your scrap? + - Got scrap? + - Looking for low level scrap! + - Greetings, got scrap? + - I'll recycle your scrap! + dialog: + - Need your scrap upgraded? + - Upgrade your scrap here! + - Upgrade 10 scrap to a higher level! + - Make your scrap more useful! + - Got low level scrap? + farewell: + - Come back when you have\nmore to low level scrap + - Don't forget to make that\nscrap useful! + - Go get into a scrap! +repairman_config: + name: Reggie + role: + greetings: + - Get your items repaired! + - Repairing items for scrap! + - Turn that scrap into durability! + - Need a repair? + - Got damaged items? + dialog: + - Best repairs in town! + - I got your fix! + - Need a fix? + - I'll repair your items! + - Need elite items repaired? + farewell: + - Don't forget to do maintenance! + - I'll be here if you need me! + - Call me beep me if you wanna reach me,\nif you wanna page me that's ok +santa: + name: '&4Saint Nick' + role: '&c' + greetings: + - Ho ho ho! + dialog: + - I have lost some presents, \ncan you help me? + - Dear traveller, I have\na request for you! + - Can you help an old man\nin his time of need? + farewell: + - Ho ho ho! +scrapper_config: + name: Kelly + role: + greetings: + - Want to get rid of items? + - Need to recycle items? + - Looking to scrap? + - It's scrap 'o clock! + - Scrap time! + dialog: + - Scrappy deals! + - Get your scrap here! + - 75% chance to work! + - There are no refunds. + - Recycle, reuse, reduce! + farewell: + - Come back when you have\nmore to scrap + - Don't forget to make that\nscrap useful! + - Happy scrapping! +smelter: + name: Sam + role: + greetings: + - Got scrap? + - Got extra scrap? + - I smell scrap on you!? + - Please I need scrap! + - Feed me scrap! + dialog: + - I'll make your scrap useful! + - Give me scrap and I'll\ngive you upgrade orbs! + - Scrap is useless, give it to me! + farewell: + - Come back when you have\nmore scrap + - Off to the upgrader you go! +special_blacksmith: + name: Grog + role: + greetings: + - Need something? + - Got anything good? + - We have nothing but the best + - Got anything worth selling? + - We only buy elite mob gear. + dialog: + - We buy low and sell high. + - No refunds. + - Absolutely no refunds. + - There are no refunds. + - No taksies backsies. + - Shop purchases are final. + farewell: + - Come back when you have\nmore to spend + - Don't get yourself killed,\nwe want you to bring us\nmore gear. + - Next time buy something \nmore expensive. + - Don't forget, no refunds. +test_npc: + name: Test NPC + role: Testing! + greetings: + - Test Greeting! + dialog: + - Test Dialog! + farewell: + - Test Farewell! +travelling_merchant: + name: Jeeves + role: + greetings: + - Got something to sell? + - You called? + - Huh? + dialog: + - I'll buy it on the cheap! + - Got something for me? + - Time is money! + farewell: + - Call me again anytime! + - Was that all? + - Safe travels! + - Don't get yourself killed! + - Good hunting! +unbinder: + name: Ulfric + role: + greetings: + - Greetings. + - Well met. + - Hail, friend. + - Yes? + - May I help you? + dialog: + - I will unbind your items\nfor an extremely rare unbind scroll. + - I am the only one qualified\nto unbind your goods. + - Have an unbind scroll? + farewell: + - "Remember: Use unbind\nscrolls wisely." + - Bezpečné cesty, příteli. +wood_league_arena_master: + name: Gladius + role: + greetings: + - Welcome to the\nArena! + dialog: + - Prepared to face the arena? + farewell: + - Return with your shield, or on it! +wood_league: + arenaName: Wood League + arenaMessages: + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - wave=8:message=&8[Gladius] &fNot bad, but what if every enemy is a &cmelee &fenemy? + - wave=9:message=&8[Gladius] &fNice, nice, but what if they're all &cranged &finstead? + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - wave=44:message=&8[Gladius] &fThis is clearly not working, let me think of something... + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +ag_welcome_quest_0: + customObjectives: + Objective1: + dialog: + - '&8[&aCasus&8]&f Welcome to the Adventurer''s Guild Hub, the hub for all things EliteMobs!' + - You can always get back here using &2/ag&f! + - Talk to me again for a quest! + name: '&2Finding the AG!' + questLore: + - + - + questAcceptDialog: + - '&8[Odigos]&f Alright, make sure you use &2/ag &f or &2/adventurersguild&f to head off to the Adventurer''s Guild Hub!' + - Make sure you talk to Casus when you're there! +ag_welcome_quest_1: + customObjectives: + Objective3: + dialog: + - '&8[&aGreg&8]&f Want to buy or sell something? I''ve got a little of everything!' + Objective4: + dialog: + - '&8[&aCharles&8]&f Want to learn about fighting elites? Just talk to me!' + Objective1: + dialog: + - '&8[&aHermes&8]&f I take you back to where you were before! Just talk to me again!' + Objective2: + dialog: + - '&8[&aBartley&8]&f Need a stiff drink? My drinks pack an extra punch!' + Objective7: + dialog: + - '&8[&aQel''Thuzad&8]&f These Elite monsters, where do they keep coming from?' + - + - + - Just talk to me to get one! + Objective12: + dialog: + - '&8[&aGrog&8]&f Want to buy special items? I''ve got just the thing!' + Objective8: + dialog: + - '&8[&aRalph&8]&f Get more out of your scrap by upgrading it! Just talk to me at any time.' + Objective13: + dialog: + - '&8[&aUlfric&8]&f If you bring me a very special and rare item, I can unbind your Elite items.' + - + - + Objective5: + dialog: + - '&8[&aTim&8]&f Want to upgrade your Elite Items? Just get an upgrade orb from Sam over there!' + Objective10: + dialog: + - '&8[&aKelly&8]&f Got extra Elite items? Don''t know what to do with them? Give them to me, and I''ll turn them into scrap!' + - + - + Objective6: + dialog: + - '&8[&aGillian&8]&f Do you seek power? Do you desire to reach new heights? Talk to me to unlock new guild ranks, and reach levels of power you never thought to be possible!' + Objective11: + dialog: + - '&8[&aSam&8]&f Got extra scrap? I can refine that into Upgrade Orbs, which you can give to Tim to upgrade your Elite items with!' + Objective9: + dialog: + - '&8[&aReggie&8]&f Need your Elite items repaired? Just bring me some scrap, and I''ll make them as good as new!' + - + - + name: '&2Welcome to the AG!' + questLore: + - '&aMeet the Adventurer''s Guild NPCs!' +primis_caeruleaum_a_can_of_worms: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis] &fPlease tell me you''re the one bringing the bait.' + name: '&2A can of worms' + questLore: + - Here, take the bait and go. + - Please hurry! + questAcceptDialog: + - '&a[Callidus Piscatus]&f My friend is in a boat near the docks!' + - '&7&oI should hurry to the boat.' + questCompleteMessage: + - '&a[Piscis Nemesis]&f You brought bait? Perfect!' + - The bait should lure it out! + - '&7&oI should talk with Nemesis.' +primis_caeruleaum_fishing: + name: '&2Fish Bait' + questLore: + - We have a big problem! + - + - + - + - + - but he can't do anything without the right bait! + - I'll tell you where to go get &eFish Bait &f, please go help my friend! + - I promise I'll reward you! + questAcceptDialog: + - '&a[Callidus Piscatus]&f Time is of the essence! There are a bunch of &cBig Worms&f to the right when you leave the village!' + - Get 5 and come back here and I will prepare them for use. + - '&7&oI should go get some Fish Bait.' + questCompleteMessage: + - '&a[Callidus Piscatus]&f You brought bait? Perfect!' + - I'll prepare it right away! + - '&7&oI should talk to &aCallidus &7&oagain and collect the prepared bait.' +primis_caeruleaum_fishing_2: + name: '&2Monster Bait' + questLore: + - That did the trick! Hop into the wormhole, I'll hold the boat! + - Let's show this monster the wrath of a fisherman! + questAcceptDialog: + - '&a[Piscis Nemesis]&f Hop in, I''ll hold the boat!' + - Don't forget to put on that &eDiving Helmet&f! + - '&7&oI should enter the wormhole and defeat the Sea Monster.' + questCompleteMessage: + - '&a[Piscis Nemesis]&f Haha! What a show!' + - '&fOf course, I had the situation under control this entire time, but you sure helped a bit!' + - '&fHere, you can have this!' + - '&7&oThe monster is dead and the shore is safe. Seems like a job well done.' +primis_caeruleaum_fletching: + name: '&2Arrow Hunter' + questLore: + - Got a few minutes to help out? + - With all the recent raids, we have found ourselves out of &eGrappling Arrows&f! + - It is usually my job to get them, but things are just a + - bit too dangerous right now for me to go dungeon delving. + - If you could get these &eGrappling Arrows&f for me, + - I will teach you how to use them! + questAcceptDialog: + - '&a[Ventus Artifex]&f Please bring me 10 &eGrappling Arrows &ffrom the ruins just beyond the village.' + - The &cUndead Skeletons&f and &cDrowned&f from of old usually carry these. + - '&7&oI should go kill &cSkeletons&7&o and &cDrowned&7&o at the ruins near the village for their &eGrappling Arrows&7&o.' + questCompleteMessage: + - '&a[Ventus Artifex]&f Great work!' + - '&eGrappling Arrows &fcan be used on &cTarget Blocks &fto get to hard to reach places.' + - They are a must have for the aspiring ancient ruin delver. + - Here is your reward! + - How about putting your knowledge to the test? + - '&7&oSeems like &aVentus Artifex&7&o has a challenge for me.' +primis_caeruleaum_fletching_2: + name: '&2Shield Hunter' + questLore: + - You got the arrows? Great! + - Use those arrows with a bow to climb the tower! + questAcceptDialog: + - '&a[Ventus Artifex]&f Use the arrows you just received to go to the ruins and shoot the targets with them!' + - + - + - + - + - '&7&oI should go get the &eShield&7&o inside of the ruins, using the &eGrappling Arrows&7&o in order to shoot the targets inside of the building.' + questCompleteMessage: + - '&a[Ventus Artifex]&f Outstanding!' + - Truly you are a real ruins delver! + - Here is your reward! + - '&7&oSeems like Grappling Arrows will be useful in the future.' +primis_caeruleaum_foraging: + name: '&2Wolf Bait' + questLore: + - I heard you were looking to help out around here. + - There is a &dDen of Wolves&f nearby that is + - really impeding my foraging for the village! + questAcceptDialog: + - '&a[Venator Pabulatus]&f If you can get rid of those pesky &cWolves&f, I will reward you handsomely!' + - I am getting too old to be dealing with the wild things of these lands... + - '&7&oI should go kill the &cWolves&7&o in the den to the Southeast of the village.' + questCompleteMessage: + - '&a[Venator Pabulatus]&f I knew I could count on you!' + - Thank you for all of your help! + - Here is your reward as promised. +primis_farmstead_lighthouse_keeper_2: + customObjectives: + Objective1: + dialog: + - "&a[Jeeves]&f &2Amavit&f sent you? What's this about a lighthouse? My, what a discovery!\n&fThis will revolutionize my job as a traveling merchant! Here, have these &eScrolls&f - just call me and I'll be there in a jiffy!\n&7&oSeems like &aJeeves&7&o has something for me. I should talk to him." + name: '&2The Mysterious Lights' + questLore: + - + - + - My father &aJeeves&f went to the top to check but he has not returned yet. + - + - + questAcceptDialog: + - '&a[Amavit]&f Thank you once again, and good luck. Hopefully it''s nothing.' + - '&7&oI should go to the &dTop of the Lighthouse&f, investigate the issue and then report back to &aAmavit''s&f father &aJeeves&f in the village.' + questCompleteMessage: + - '&7&oThese scrolls seem mighty useful! I should use the &dLighthouse&7&o to get back to the &dFarmstead&7&o and keep moving.' +primis_gladius_assassins: + name: '&5Who snipes the snipers?' + questLore: + - The roofs of &dGladius&f are covered in &cAssassins&f! + - Venturing out to the streets is a death sentence. We need to deal with these snipers! + - + - + questAcceptDialog: + - '&a[Belli] Deal with those &cAssassins&f! Remember to use the &eGrappling Arrows&f!.' + - '&7&oI should kill those &cAssassins&7&o.' + questCompleteMessage: + - '&a[Belli]&f You dealt with those &cAssassins&f? Good! That''s one headache dealt with!' +primis_gladius_clear: + name: '&5Taking back the streets' + questLore: + - I don't need to tell you that the town is being invaded, do I? + - We are offering a reward to those willing to put a dent in the amount of &cInvaders&f. + - Are you up for it? + questAcceptDialog: + - '&a[Belli] &fJust go out there and thin their numbers!' + - '&7&oI go out and clear the streets of &dGladius&7&o.' + questCompleteMessage: + - '&a[Belli]&f Look at that, the Gods have provided with a true warrior in our time of need! I have a job for a person like you.' + - '&7&oSeems like &aBelli&7&o has a plan for me. I should talk to her..' +primis_gladius_prayer: + name: '&5Leap of faith' + questLore: + - I am not going to sugarcoat it, things look downright grim! + - The walls have fallen, the streets are teeming + - with the &cUndead&f and I just ran out of drinks. + - At times like these, people turn their hope to + - some kind of divine intervention! + - There is a &dPath&f, lit by candles, that leads to a + - '&dSanctuary in the Mountains&f.' + - Warriors go up this path and defeat the &cMonk&f which guards + - the sanctuary in order to be blessed by the war god in combat. + - It may just be a superstition, but would it hurt + - to give people hope? + - The fact you made your way here shows you are a cut above + - the rest - go up the mountain and defeat the &cMonk&f. + - All warriors will feel better knowing they are being watched over. + questAcceptDialog: + - '&a[Belli] &fGo &dUpstairs&f and follow the candles! Careful not to fall, the path is treacherous!' + - '&7&oI should follow the &dandle Path&7&o and defeat the &cMonk&7&o.' + questCompleteMessage: + - '&a[Belli]&f You completed the prayer? Thank you, the soldiers will feel relieved to hear it.' +primis_gladius_ships: + name: '&5A sinking feeling' + questLore: + - Have you seen them? The dozens of ships just outside + - of &dGladius&f? They are to blame for all of this. + - We never expected an invasion from the &dBlood Temple&f, + - much less one done by siege weapons mounted on boats! + - We must do something about it. Killing the &cAdmiral&f + - and some of the forces won't give us back what we lost, + - but it will sure make us feel better. + questAcceptDialog: + - '&a[Belli] &fKill the &cAdmiral&f and some of the troops on the boats. Be careful about their water superiority! I recommend using &eGrappling Arrows&f to move around the ships.' + - '&7&oI should go slay the &cAdmiral&7&o and some of its troops on the boats just &dOutside of Gladius&7&o.' + questCompleteMessage: + - '&a[Belli]&f The admiral is no more? Why, I feel better already!' +primis_gladius_sunken_ship: + name: '&5Sunken ship' + questLore: + - Now that you took care of the &cMariner Forces&f I got + - another task for you. + - The &dSunken Ship&f should be reachable now. + - You see some time ago one of our ships got sunk, + - unfortunately it was carrying &eImportant DDocuments&f. + - I need you to reach the &dSunken Ship&f and kill any threats + - around and retrieve the &eDocuments&f. + - Come back to me after you have completed the task. + questAcceptDialog: + - '&a[Belli] &fYou will find the ship in the waters to the south-west. Give them hell!' + - '&7&oI should go collect the &eDocuments&7&o and slay any &cMariners&7&o near the ship.' + questCompleteMessage: + - '&a[Belli]&f Back already? Excellent work! We really needed these &eDocuments&f.' +primis_gladius_supplies_1: + name: '&cSupplying problems' + questLore: + - We are running out of &eSupplies&f! + - '&dGladius&f is a fortress equipped to last a long siege' + - without any issues, but that's assuming we have + - access to the &dWarehouse&f! + - Unfortunately the &dWarehouse&f was one of the first places to fall, + - and now we are slowly starving to death! + - If you can clear a path to the &dWarehouse&f and get some &eSupplies&f + - that would greatly aid in the war effort! + questAcceptDialog: + - '&a[Cibus]&f The &dWarehouse&f is hard to miss! It''s the extra large warehouse-looking building near the part where the wall fell! Grab some &eSupplies&f and get them back here!' + - '&7&oI should go to the &dWarehouse&7&o and bring back &eSupplies&7&o.' + questCompleteMessage: + - '&a[Cibus]&f You brought the &eSupplies&f back? Fantastic! Meanwhile I came up with the perfect idea for the drinks - and it should be something that will lift the spirits of the soldiers!' + - '&7&oSeems like the &aCibus&7&o has a plan, I should talk to them.' +primis_gladius_supplies_2: + name: '&cSupplying more problems' + questLore: + - We have food, but what about drinks? + - Some would say it's foolish to get drunk in the middle + - of a war, but if now then when? + - The &cBarkeep&f across the street kept all of the good + - stuff in the &dBasement&f. + - I think you know where I'm going with this! + - Go to the &dBasement&f of the tavern across the street and get + - the &eGood Stuff&f. If you find the &cBarkeep&f, I'd consider it a + - personal favor if you free him from this curse of undeath. + - We are pretty sure that he was in the &dBasement&f when the + - invasion happened so odds are he is still there, + - though probably no longer himself. + - Be careful! + questAcceptDialog: + - '&a[Cibus]&f The &dTavern&f is right across the street, hard to miss! Just head to the &dBasement&f and get the &eGood Stuff&f!' + - '&7&oI should go to the &dBasement&7&o of the tavern and get "the &eGood Stuff&7&o".' + questCompleteMessage: + - '&a[Cibus]&f You defeated the &cBarkeep&f? I thank you for freeing my old man from this accursed undeath. Here, I''ll have the first drink with you.' +primis_ice_village_all_out_of_chains: + customObjectives: + Objective1: + dialog: + - '&a[Orbis]&f Oh, the Ice Village chain shipment. Yes, it is right in that chest over there.' + - Sorry for not sending it over, but we were quite busy and had no time. + - It's all paid for so feel free to just grab it. + name: '&2All out of chains' + questLore: + - Hey, you came from &dPontis Mille&f right? + - How would you like to help us out. + - Here at the jail we tend to go through a + - lot of chains... + - Especially the chains holding up the cages. + - They rust a lot and then they break. That's + - how one of the prisoners escaped. The rusty + - chain snapped, the cage fell and he ran. + - We paid for a + - '&eShipment of new chains&f, but it' + - did not arrive yet. If you could go to + - '&dPontis Mille&f and fetch our' + - '&eShipment of Chains&f' + - then that would be great! + questAcceptDialog: + - '&a[Philolaches Triferus]&f Go talk to Orbis. They are the ones that make the chains.' + - '&7&oI should go talk to &a&oOrbis&7&o and bring back the &e&oShipment of Chains&7&o.' + questCompleteMessage: + - '&a[Philolaches Triferus]&f Those are the chains! Thank you for getting these, we really needed them.' +primis_ice_village_catch_me_if_you_can: + name: '&2Catch me if you can' + questLore: + - What timing! I was just looking for someone to go capture our + - '&cEscaped Prisoner&f.' + - + - + - + - + - + - + questAcceptDialog: + - '&a[Romanus Superbus]&f He must be somewhere in the mountains.' + - '&7&oI need to find the &c&oEscaped Prisoner&7&o and bring him back to the prison.' + questCompleteMessage: + - '&a[Romanus Superbus]&f Well, well, well. If it isn''t our escaped sleeping beauty.' + - Good work. A job well done deserves a good payment, here ya go. + - '&aRomanus&7 hands you a heavy bag of coin.' +primis_ice_village_get_them_off_my_back: + name: '&2Get them off my back!' + questLore: + - Let me tell ya, I sure am glad you are here to help, ha ha. + - Our mission here is to hunt &cRazorbacks&f and keep their numbers in check. + - It's not all about population control either. + - They provide us with valuable leather, tusks and meat. + - Not sure this village would be around without them. + - + - + - + - + - + - + - We only need you to cull the &cBabe&f and the &cJuvenile Razorbacks&f. + - + - + - + - + - Would mean a lot to me if you could retrieve it. + questAcceptDialog: + - '&a[Alanus Isatis]&f You must have seen the &cRazorbacks&f on your way here so I assume you know where to find them.' + - '&7&oI need to cull the &c&oRazorback&7&o population and retrieve &e&oAlanus'' Dagger&7&o.' + questCompleteMessage: + - '&a[Alanus Isatis]&f Well done friend! That should help a lot.' + - + - + - The dagger is nothing special, but it was a handmade gift from my late father. + - Next time you're thirsty, the drinks are on me! +primis_ice_village_gotta_keep_warm: + customObjectives: + Objective1: + dialog: + - '&a[Severinus Martius]&f Ha ha! That should keep me warm for another couple of weeks!' + - Hey friend, you heading for &dCaerullium Village&f by any chance? + name: '&2Gotta keep warm' + questLore: + - We deliver the &aLighthouse Keeper&f some + - of our strong stuff every couple of weeks. + - It keeps him warm during the colder days. + - It's a small gesture of thanks for all his + - hard work. Any chance you could help out + - and bring over the next batch? + questAcceptDialog: + - '&a[Grania Cecilius]&f You can find the lighthouse to the East. Thanks!' + - '&7&oI should go to the &d&oLighthouse&7&o and deliver these to the &a&oLighthouse Keeper&7&o.' + questCompleteMessage: + - '&a[Severinus Martius]&f If you''re heading over there then I would appreciate if you could deliver some of these to my good friend &aJeeves&f.' + - '&7&oSeems like the &a&oLighthouse Keeper&7&o has a quest for me.' +primis_ice_village_gotta_see_jeeves: + customObjectives: + Objective1: + dialog: + - '&a[Jeeves]&f Oh! A gift from my friend Severinus you say.' + - Well, thank you for bringing it over. Was nice seeing you again! + name: '&2Gotta see Jeeves' + questLore: + - Now, now it would be really rude of me to keep + - all of the good stuff to myself! + - If you would bother helping me out friend and + - delivering some of the good stuff + - to my friend &aJeeves&f at &dCaerullium Village&f. + - You can get there quickly by taking the + - '&9lighthouse portal&f.' + questAcceptDialog: + - '&a[Severinus Martius]&f The portal is all the way at the top.' + - '&7&oI should go to &d&oCaerullium Village&7&o and deliver some of the good stuff to &a&oJeeves&7&o.' + questCompleteMessage: + - '&a[Severinus Martius]&f Thank you for delivering some of the strong stuff to Jeeves. I know he likes a good drink here and there ha ha!' +primis_ice_village_living_nightmares: + customObjectives: + Objective1: + dialog: + - '&a[Cornelia Ennodius]&f Are they gone? I was so scared. My parents sent you? Thank goodness.' + - + - + - I couldn't escape. I, I...will be fine, I just need a minute... + name: '&2Living nightmares' + questLore: + - I was following her trail, this is where it ends. + - Not sure where she would have gone from here. + - I fear that something bad might have happened. + - Our &aGirl&f takes a lot after me and my special powers. + - Except that hers are a lot more potent, she is capable + - of making powerful emotions manifest in the real world. + - We are running out of time, we need to find her soon. + questAcceptDialog: + - '&a[Sestia Ennodius]&f The trail went cold here, she cannot be that far away...' + - '&7&oI need to find the &a&oMissing Daughter&7&o before something happens to her.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f You found her! Quickly, where is she?' + - Thank you stranger, I will go to her at once! +primis_ice_village_make_them_go_ouch: + name: '&2Make them go ouch' + questLore: + - I had some naughty '&cCustomers&f' + - come visit some days ago. + - They stole the most valuable + - of my &ePossessions&f. + - You need to find them and make sure + - to teach them a lesson. + - Make sure they know that + - '&aViolet&f does not forget to collect.' + questAcceptDialog: + - '&a[Domina Violet]&f They went East past the &9Trees&f.' + - '&7&oI need to make sure that the &c&oCustomers&7&o know not to mess with &a&oViolet&7&o. I also need to retrieve &e&oViolet''s Property&7&o.' + questCompleteMessage: + - '&a[Domina Violet]&f I hope you taught them the value of pain.' + - + - +primis_ice_village_objection!: + customObjectives: + Objective3: + dialog: + - '&a[Glacies Princeps]&f What, absolutely not. I don''t know how he convinced you to come here and beg for his release.' + - + - + - He will never be released. Is that understood. + Objective1: + dialog: + - '&a[Romanus Superbus]&f Release him? Not guilty? Are you mad? You''re lucky I don''t throw you in a cage too for suggesting such nonsense.' + Objective2: + dialog: + - '&a[Luxuria Placidus]&f Who? Never heard of him.' + name: '&2Objection!' + questLore: + - I do not belong here! Surely you can see that? + - I have done no wrong! Stranger will you hear my plea. + - Would you help this poor soul who has been trapped + - here in this awful cage of no fault of his own? + - You must go talk to the + - '&aJail Master&f or the ' + - '&aVillage Leader&f.' + - Or any other + - '&aFriendly Villager&f' + - who would be + - willing to argue for + - my release! + questAcceptDialog: + - '&a[Adrius Calpornius]&f Go talk to them! Get me out!' + - '&7&oI should go talk to the people on my list.' + questCompleteMessage: + - '&a[Adrius Calpornius]&f WHAT?! LIES!!! I never would do such a horrible thing to my family...' + - + - + - '&7Whatever sanity this poor man still had left, is gone now...' +primis_ice_village_run_away_daughter: + customObjectives: + Objective1: + dialog: + - '&a[Sestia Ennodius]&f I could sense you coming.' + name: '&2Run away daughter' + questLore: + - Stranger! Would you help our family? + - Our &aDaughter&f has gone missing. + - She has been gifted with special + - powers just like her &aMother&f + - I fear that last night something + - terrible must have happened to + - make her run away in the middle of + - the night. + questAcceptDialog: + - '&a[Sparax Ennodius]&f My &aWife&f has already gone looking for her.' + - I am sure she is somewhere outside the village. Go find her and talk to her. + - '&7&oI should go look for the &a&oWorried Mother&7&o.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f You were sent by my &aHusband&f to help with the search?' + - '&7&oI should hear out the &a&oWorried Mother&7&o.' +primis_ice_village_silence: + name: '&2Make them go ouch' + questLore: + - Shhh! Do you hear it? + - The annoying screeching. + - Ugh, I cannot take it anymore! + - Listen, I will pay good coin + - if you can find the source + - of that annoying screeching + - and make it stop. + questAcceptDialog: + - '&a[Modestus Eulogius]&f It sounds like it coming somewhere from the hills behind me.' + - '&7&oI should find the source of all the noise and make it stop.' + questCompleteMessage: + - '&a[Modestus Eulogius]&f Both me and my ears thank you!' +primis_ice_village_taking_the_bait: + name: '&2Taking the bait' + questLore: + - These &cFish&f, what is wrong with them! + - I have been out here fishing for days now! + - Not even a single bite. If only I was younger I would show them! + - + - + - And if we cannot catch any, well that is a big problem. + - You will need to go down there and beat them senseless. + questAcceptDialog: + - '&a[Theopropides Nero]&f You wanted to help so here is your chance!' + - '&7&oI must jump into the lake and kill 7 &c&oChilly Salmon&7&o and collect their bodies.' + questCompleteMessage: + - '&a[Theopropides Nero]&f Oh! Look at them! Such big ones!.' + - + - +primis_ice_village_treats_for_the_punished: + customObjectives: + Objective1: + dialog: + - '&a[Eleusium Calenus]&f My wife sent you? Oh, are those treats? My favorite too! She''s such a darling.' + - + - + - 'You tell her I am doing just fine and that I love her very much. ' + name: '&2Treats for the punished' + questLore: + - If you don't mind, could I ask you to do something for me? + - My dear &aHusband&f has been jailed and I know it's tough living a cage all day. + - So I prepared some treats that I was gonna deliver to him. + - + - + questAcceptDialog: + - '&a[Titia Calenus]&f He will be in one of the middle cages.' + - Do not forget to tell him I love him. + - '&7&oI should deliver these treats to the &a&oHusband&7&o.' + questCompleteMessage: + - '&a[Titia Calenus]&f Back so quick! Oh, did he really say that? He is such a sweetie.' +primis_ice_village_wanna_make_a_snowman: + name: '&2Wanna build a snowman' + questLore: + - The kids around the village have been pretty bored lately + - and I've been thinking. There are these + - '&cMagical Creatures&f that inhabit the woods around this' + - village. The creatures fur grows &eMagical Ice Crystals&e. + - When you infuse snow with these &eCrystals&f it makes the + - snow shuffle around and expand and contract. + - And if you build a snowman out of this infused snow + - it makes it look as if the snowman is alive. + - The kids would love it! So, want to help + - this old man cheer up some kids? + questAcceptDialog: + - '&a[Sparax Ennodius]&f You will find the &cCreatures&f in any woods near the village.' + - + - + - '&7&oI should go slay enough &c&oFrost Fur Ursus&7&o to gather 15 &e&oIce Crystals&7&o.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f You gathered enough crystals? Wonderful!' + - I can start making the snowman now, I cannot wait for the kids to see it! +primis_main_quest_: + name: '&2Goblins in the mines!' + questLore: + - This day just keeps getting worse. First, we get ambushed by goblins. + - The we retreat, only to find our army split. Some are dead, many are missing. + - Worst of all, we fear we might've woken the Goblin King. + - Some, hopefully, made it through. We have to set up camp and recover for now. + - If you dare brave into the mines, you are on your own. + - We tried to sneak past them, and it did not go well. + - The only way forward is through bloodshed. + questAcceptDialog: + - '&8[Centurion]&fAre you braving the Goblin Mines? Beware the Goblin King!' + - '&8[Centurion]&fWe hope our scouting party made it past him. Meet up with them if you can.' + - '&8&oI should venture through the mines and defeat the Goblin King.' + questCompleteMessage: + - '&8[Scouting party]&fYou made it through? I almost wish you hadn''t. You won''t believe what lies ahead.' + - '&8&oSounds like the scouting party has bad news for me.' +primis_main_quest_1: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis] &fOh so you were in the ship that beached a few hours ago?' + - + - + - + - + - + - + - '&7&oI should report to the &aFirst Mate &7&oto see if I should help these people!' + name: '&2Shipwrecked!' + questLore: + - Takže ses konečně probudil? Dobře! Potřebujeme tvou pomoc. + - The ship beached during last night's storm. + - We see a &dLighthouse &fin the distance, so there must be a village there! + - Go talk to the &aVillage Leader &fand see if they can lend use some help! + - The &aFirst Mate &fwent ahead of you, but hasn't returned yet. + - Follow his instructions if you see him! + questAcceptDialog: + - '&a[Captain Squalus]&f Go to the nearby village and see if they will help us!' + - Be careful on your way there, we don't know what lurks around these parts! + - '&7&oI should investigate the nearby village and talk to their leader.' + questCompleteMessage: + - '&a[First Mate Iracundi]&f Darnation! We just can''t catch a break today! Here, it''s clearly dangerous to go alone, take this!' + - '&7&oSeems like First Mate Iracundi has a request for me...' +primis_main_quest_10: + customObjectives: + Objective2: + dialog: + - "&a[Shogun Navita] &f&dGladius&f calls for our aid?\n&7&oSeems like I should talk to the &aShogun&7&o." + name: '&5Bridging the gap' + questLore: + - It is time to call &dPontis Mille&f for aid. + - Let them know of what happened here and tell them we are cashing in our favor. + - + - + questAcceptDialog: + - '&a[General Hasta] &fSafe travels, friend. Remember: Kill the &cGate Keeper&f and make sure our plea reaches &aShogun Navita''s&f ears..' + - '&7&oI should slay the &cGate Keeper&7&o at the &dBridge&7&o and make my way to &aShogun Navita&7&o in &dPontis Mille&7&o.' + questCompleteMessage: + - '&a[Shogun Navita]&f Truly the news you bring me are most disturbing, but I am afraid we already suspected something... unnatural... was going on.' + - '&7&oSeems like &aShogun Navita&7&o wants to talk to me.' +primis_main_quest_11: + customObjectives: + Objective1: + dialog: + - '&a[Major Fortes Bellator]&f Yes, traveler?' + name: '&2Sending a message!' + questLore: + - The tales of your travel are most surprising. + - That you made it alive to here is nothing short of a miracle. + - The forces invading &dGladius&f are insurmountable. + - '&dGladius&f will eventually crumble under their might...' + - Aid?... Ah, yes. Go see &aMajor Fortes Bellator&f. + - He will be able to assist you. + questAcceptDialog: + - '&a[Navita]&f You can find the &aMajor&f on top of those stairs right ahead!' + - '&7&oI should go talk to the &aMajor&f and see if he can help.' + questCompleteMessage: + - '&a[Major Fortes Bellator]&f The &aShogun&f seeks to aid &dGladius&f? I thought he would never ask! But first, we must prepare.' + - '&7&oSeems like &aFortes Bellator&7&o has work for me.' +primis_main_quest_12: + customObjectives: + Objective1: + dialog: + - '&a[Centurion]&f Where are our reinforcements?' + name: '&2Mine path' + questLore: + - I cannot believe what befell &dGladius&f. They hit it fast, + - and they hit it where it hurts most. + - It is our sworn duty to aid our allies. We have failed our + - duty, and we have failed our allies. + - The &cCounselor's&f ordered us to mobilize our troops in several + - zones before the invasion. + - You see, recently and unusual and devastating storm was spotted + - at the &dStorm Temple&f. + - The Royal Guard was ordered to quiet the storm, and the &aShogun&f + - refuses to belay that order. + - Our own guards are in other places, and I fear we will need all + - that we have to take &dGladius&f back. + - The path to the &dStorm Temple&f is treacherous, as it requires going + - through the &dGoblin Mines&f. + - Help our guard clear the mines and make a path to the &dStorm Temple&f! + questAcceptDialog: + - '&a[Fortes Bellator]&fTread lightly, the &dGoblin Mines&f are a dangerous place. Perhaps you should aid the normal guard before assisting the &aRoyal Guard&f.' + - The &dMines&f are north of the city. There are stairs leading to its entrance. + - '&7&oI should see what else I can aid &aFortes Bellator&7&o with, or I can head to the &dGoblin Mines''&7&o entrance.' + questCompleteMessage: + - '&a[Centurion]&fIt is so good to see someone! Has &dPontis Mille&f sent you?' + - '&7&oI should hear what the &aCenturion&7&o has to say' +primis_main_quest_13: + name: '&2Goblins in the mines!' + questLore: + - This day just keeps getting worse. First, we get ambushed by goblins. + - Then we retreat, only to find our army split. Some are dead, many are missing. + - Worst of all, we fear we might've woken the &cGoblin King&f. + - Some, hopefully, made it through. We have to set up camp and recover for now. + - If you dare brave into the mines, you are on your own. + - We tried to sneak past them, and it did not go well. + - The only way forward is through bloodshed. + questAcceptDialog: + - '&a[Centurion]&f Are you braving the &dGoblin Mines&f? Beware the &cGoblin King&f!' + - We hope our &aScouting Party&f made it past him. Meet up with them if you can. + - '&7&oI should venture through the &dMines&7&o and defeat the &cGoblin King&7&o.' + questCompleteMessage: + - '&a[Scouting Party]&f You made it through? I almost wish you hadn''t. You won''t believe what lies ahead.' + - '&7&oSounds like the scouting party has bad news for me.' +primis_main_quest_14: + name: '&2Storm''s end' + questLore: + - It is hard to believe that you pushed through the + - '&dGoblin Mines&f on your own.' + - Perhaps with your fortitude you will be able to face the challenge ahead. + - We attempted to assault the &dStorm Temple&f, and reached its deepest + - confines at a great cost. + - What we found there... It defies understanding. + - It may be hard to believe, but it sounds like the very storm + - itself has materialized as our opponent. + - We do not even know if it can be defeated. We feared we were sent to our deaths. + - + - + questAcceptDialog: + - '&a[Blepharo]&f We have weakened their forces a little, but still, this is no easy task.' + - The Storm is no ordinary opponent. Do not underestimate it. + - '&7&oI should go into the &dStorm Temple&f and slay the &cStorm&f.' + questCompleteMessage: + - '&a[Shogun Navita]&f You WHAT!?' + - Defeated the &cStorm&f? I was told that was impossible! I mean... + - '... it is no use hiding it now. I knew about the &cStorm&f. I knew about the &dGladius&f invasion - I even facilitated it. I did it for my people - for &dPontis Mille&f.' + - '&cCounselor Machiavelli&f convinced me that the &cStorm&f was as unstoppable as Nature itself, and that the fall of &dGladius&f and &dPontis Mille&f was an inevitability that we could but delay through sacrifice.' + - + - + - '&8&oSeems like &aShogun Navita&7&o has a problem he wants me to deal with.' +primis_main_quest_15: + name: '&2Severance payback!' + questLore: + - + - + - + - + - + - + - + - + - + - I bought us time. + - + - + - + - + - He guided us to our doom, and would've gotten away with it had you not appeared. + - Now, there is hope. + - I ask you, please rid us of the treacherous &cCounselor&f. + - + - + - + - + - + - + - I wish to deliver one last message through them. + questAcceptDialog: + - '&a[Shogun Navita]&f &cCounselor Machiavelli&f has retreated to his quarters in the lower city by the market. Be careful, has has amassed a devoted following in his time, and will not go down without a fight.' + - '&7&oIt is time for &cCounselor Machiavelli&f to face righteous retribution.' + questCompleteMessage: + - '&a[Shogun Navita]&f So it is done.' + - '&dPontis Mille&f owes you a great debt, wanderer. Once we finish mobilizing the army we will be ready to right our wrongs and march to &dGladius''&f aid.' + - '&7&a[Shogun Navita]&2 We feared you. We surrendered our allies to you. We dispersed our armies. No more.' + - '&dPontis Mille&2 marches to war, and we shall not walk alone! You shall rue the day you crossed our path.' + - '&7' + - '&7&oSeems like the &aShogun&7&o has a plan. I should talk to him.' +primis_main_quest_16: + customObjectives: + Objective3: + dialog: + - '&a[Demenis Nolus]&f Heading to the village, eh. Just keep going East, follow the road and you should be there in no time!' + Objective4: + dialog: + - '&a[Callipho Classicius]&f Directions? Just head down this road that leads to the graveyards.' + Objective1: + dialog: + - '&a[Glacies]&f Welcome to our village traveler! Please tell me, what brings you here friend.' + Objective2: + dialog: + - '&a[Bromia Culleolus]&f Oh, the way to the village. Yes, just take this road that leads to the mountain.' + - Happy to help! + name: '&2The ice village awaits' + questLore: + - We must send aid to &dGladius&f as soon as possible. + - Champion, there is a village of mighty warriors to the far south. + - You should travel there and inform them that &dPontis Mille&f + - would seek their aid in pushing back the invaders from the &dBlood Temple&f. + - Find &aGlacies Princeps&f and tell them I sent you. + - There many travelers on the roads, you should stop and ask them for direction. + questAcceptDialog: + - '&a[Shogun Navita]&f It will be a long journey. Make sure you prepare. Follow the roads that lead south.' + - '&7&oI must go and locate the &d&oIce Village&7&o to the far south.' + questCompleteMessage: + - '&a[Glacies Princeps]&f The Shogun sent you, I see, it is good to hear that &aNavita&f is back to his old self.' + - + - + - Let me tell you more... + - '&7&oI should speak to &a&oGlacies&7&o.' +primis_main_quest_17: + customObjectives: + Objective3: + dialog: + - '&a[Theopropides Nero]&f Help? Yes, please!' + Objective1: + dialog: + - '&a[Alanus Isatis]&f Here to help with the &cRazorbacks&f?' + Objective2: + dialog: + - '&a[Domina Violet]&f I hope you are here to help!' + name: '&2Helping the north' + questLore: + - Before we further discuss anything about + - the &dBlood Temple&f. + - + - + - If these issues are not resolved then I would fail in my duties as a village leader. + - There is no way for me to ignore the plea of my own people and put others first. + - + - + - + - + - + - + - + - + - They will be able to tell you in more detail what needs to be done. + questAcceptDialog: + - '&a[Glacies Princeps]&f Once you are done helping them. Come back to me and we can talk.' + - '&7&oI should go talk to the villagers on my list and help them out with any issues they might have.' + questCompleteMessage: + - '&a[Romanus Superbus]&f &2Glacies&f sent you, about darn time! We have a prisoner on the loose!' + - '&7&oI should speak to &a&oRomanus Superbus&7&o.' +primis_main_quest_18: + name: '&2The trial of ice' + questLore: + - Well you have certainly impressed me and most of the village. + - + - + - the &cIce Elementals&f. + - + - + - + - + - '&cMinor Ice Elementals&f in combat.' + - + - + - If you failed...then...your energy and your being belonged to the &cIce Elementals&f. + - + - + - Ever since then + - + - + - Several of our people got corrupted and we had to jail them for our own safety. + - + - + - + - + - Slaves to the + - '&cIce Elementals&f.' + - It is clear that our old traditions are no longer. + - The &cIce Elementals&f must be dealt with... + - I would ask you to be the last one to + - undertake &9The Trial of Ice&f. Climb to the peak and face the + - '&cMinor Ice Elementals&f and release the souls of those who failed the trial.' + questAcceptDialog: + - '&a[Glacies Princeps]&f You can find the start of the path to the trial at &aViolet''s&f house.' + - Follow the &9Amethyst&f blocks, they will guide you to the peak. + - '&7&oI should follow the &9&oAmethyst Blocks&7&o to the peak of the mountain and then slay the &c&oMinor Ice Elementals&7&o.' + questCompleteMessage: + - '&a[Glacies Princeps]&f You have done it? May their souls rest in peace now.' + - Let's speak again friend. There is more to be done. + - '&7&oI should speak to &a&oGlacies&7&o.' +primis_main_quest_19: + name: '&2Chill out' + questLore: + - It is time to free ourselves from this curse. + - We should have never made ourselves dependent on an &cElementals&f power. + - We shall correct that mistake here and now. + - What you have slain were just + - '&cMinor Ice Elementals&f, the' + - '&cIce Elemental&f rests in a temple right across from our village.' + - It was the main source of our power...and foolishness. + - Go forth now and slay the &cIce Elemental&f. + questAcceptDialog: + - '&a[Glacies Princeps]&f You will find a path that leads into the temple at the summit of the village.' + - '&7&oI should go into the temple and slay the &c&oIce Elemental&7&o.' + questCompleteMessage: + - '&a[Glacies Princeps]&f I could feel the energies flowing out, all the way from here.' + - + - + - There is another settlement that might need your help, let's speak. + - '&7&oI should hear what &a&oGlacies&7&o has to say.' +primis_main_quest_2: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis]&fYou''ll help us? Thank the seas! This was starting to feel like a sinking ship!' + name: '&2Strangers in need...' + questLore: + - So not only can they not help, but they want our help? Bah! + - Well, we don't have much choice now, do we? + - Go, help them, then make them help us! + questAcceptDialog: + - '&a[First Mate Iracundi]&f Fine, go help the locals, see what info you can gather and see if you can get them to help us in turn. I will be here, negotiating things.' + - Come back as soon as you have something! + - '&7&oI should talk to the &aVillage Leader&f to see about helping the locals.' + questCompleteMessage: + - '&a[Chief Piscis]&f Everyone in the village has an issue that needs dealing with, and I am no exception. My request is quite challenging, so maybe you want to get warmed up and get the lay of the land with some of the issues from the other villagers.' + - + - + - '&7&oI should talk to the locals and see who needs help, and come back to the leader when I feel ready to continue.' +primis_main_quest_20: + customObjectives: + Objective1: + dialog: + - '&a[Lutum Princeps]&f This better be important.' + name: '&2Terravilla' + questLore: + - Some time ago we received a request for aid from a + - a nearby settlement. Years ago a bunch + - of explorers settled on top of this ancient ruin. + - I think they call their little + - settlement &dTerravilla&f. Apparently there is a lot + - of treasure to be had there if you don't mind the risk. + - But I hear that stuff has gone wrong there and they asked + - us if we could spare any help to send their way. To be + - honest, you are the strongest warrior I have ever seen. + - You are the best help we could send. If you would like + - to go of course. + questAcceptDialog: + - '&a[Glacies Princeps]&f You will find &aTerravilla&f straight West of here.' + - + - + - Oh, I almost forgot. The person you want to talk to is &aOverseer Lutum&f. + - '&7&oI should go to &d&oTerravilla&7&o and talk to &a&oOverseer Lutum&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f Came all the way from the &dIce Village&f, eh. Good to see some help arrive.' + - + - + - + - + - '&7&oI should talk to &a&oLutum&7&o.' +primis_main_quest_21: + name: '&2Taking out the trash' + questLore: + - Many years ago some explorers came across this ruin and + - as they investigated it more closely they discovered a + - large underground maze-like structure. In this structure + - there were a lot of ancient artifacts and treasures. But + - also a lot of danger. Not like that stopped anyone from + - going down there. And as the word spread, more and more + - people came here to make their fortunes. Before you + - know it, it turned into a small settlement. Until lately + - everything was fine, but then awful things started + - happening. Before I tell you more, we should start by + - dealing with the simple problems first. A small band of + - '&cRobbers&f has found a foothold in the hills surrounding' + - '&dTerravilla&f. We need them gone. Also, feel free to assist' + - any villagers in &aTerravilla&f that might need help. + questAcceptDialog: + - '&a[Lutum Princeps]&f I am not sure where the &cRobbers&f are exactly. I just know that people have reported seeing them coming from the hills.' + - '&7&oI should deal with the &c&oRobbers&7&o and help any villagers in need if I have the time.' + questCompleteMessage: + - '&a[Lutum Princeps]&f Well that is one issue resolved. Onto the next!' + - Before we move on, I want you to have this blade. + - + - + - '&7&oI should hear out what &a&oLutum&7&o has planned next.' +primis_main_quest_22: + name: '&2Big trouble in little pub' + questLore: + - Before we get to the big problem underground, I would + - like you to do one last thing here in town. There has + - been huge trouble in our little pub. There are certain + - characters in town who keep going to the pub and causing + - a ruckus. Well I heard that this time all of them managed + - to gather at the pub at the same time. And of course now + - there is a huge brawl happening over there. This is a great + - opportunity for us to arrest all of them at once. Go to the + - pub and knock them all out. We will handle the rest. + questAcceptDialog: + - '&a[Lutum Princeps]&f The pub is at the ground level, right across. Don''t let them overwhelm you.' + - I will have a nice reward waiting here for you when you're back. + - '&7&oI need to go to the pub and deal with the &c&oBar Brawlers&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f I hear that the pub is a peaceful place again. Let''s discuss the real issue now.' + - '&7&oI need to talk to &a&oLutum&7&o.' +primis_main_quest_23: + name: '&2Strike the earth' + questLore: + - You see the real reason we asked for help is because of what happened + - at the ruins. There were always dangerous things down there, + - but nothing a seasoned adventurer or explorer could not handle. But then + - something awakened, these ancient constructs started rising out of the + - ground and the walls. Then these quakes started happening, it was weird, + - because you could only feel them if you were down in the ruins. So we shut + - everything down, nobody was allowed access to the ruins anymore. A few days + - ago I gathered some of my best men and sent them down there to find the source + - of it all. They barely made it back. They found an &cEarth Elemental&f high + - above the pillars, on top some sort of platform. It must have been there + - dormant all this time. No clue why it decided to wake up now... + - Your job would be to go down there, navigate through the maze and put the + - '&cEarth Elemental&f into a slumber it will never wake up from.' + questAcceptDialog: + - '&a[Lutum Princeps]&f You can get to the maze by walking down the spiral staircase in the middle of the ruins.' + - + - + - '&7&oI should enter the &d&oRuins Maze&7&o and slay the &c&oEarth Elemental&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f I cannot believe it, you''re back. In one piece too!' + - + - + - + - '&7&oI need to tell &a&oLutum&7&o about my quest and the &d&oBlood Temple&7&o.' +primis_main_quest_24: + customObjectives: + Objective1: + dialog: + - '&a[Navita]&f You have returned! I hope you have good tidings.' + name: '&2There and back again' + questLore: + - We had no idea what was going on... Yes, + - '&dTerravilla&f will be able to pledge some' + - of our forces to your cause. I wonder if the + - '&cEarth Elemental&f awakening had anything' + - to do with the &dBlood Temple&f. We will + - prepare our forces and wait for word from + - '&dPontis Mille&f.' + questAcceptDialog: + - '&a[Lutum Princeps]&f So you are heading off to &dPontis Mille&f, make sure to tell the &aShogun&f that &dTerravilla&f will be ready to assist.' + - '&7&oI should head to &d&oPontis Mille&7&o and speak with &a&oShogun Navita&7&o.' + questCompleteMessage: + - '&a[Navita]&f It is good to hear that the &dIce Village&f has decided to join our cause! But I did not expect that you would manage to convince &dTerravilla&f to pledge to our cause as well.' +primis_main_quest_25: + customObjectives: + Objective1: + dialog: + - '&a[Outpost Officer]&fFILLER TEXT!' + name: '&2To the outpost' + questLore: + - It is so good to see you again friend! + - While you were gone we were preparing our + - forces. We have made an &dOutpost&f + - between the &dBlood Temple&f and &dPontis Mille&f. + - You should go there and report to the + - '&aOutpost Officer&f. They will let you know' + - how we shall proceed with the assault on the + - '&dBlood Temple&f.' + questAcceptDialog: + - '&a[Navita]&f The outpost is to the South of the city. Not too long now, before the additional forces from &dTerravilla&f and the &dIce Village&f arrive.' + - '&7&oI should head to the &d&oOutpost&7&o and speak with the &a&oOutpost Officer&7&o.' + questCompleteMessage: + - '&a[Outpost Officer]&f I GOT NO IDEA WHAT TO SAY CAUSE I AM NOT DONE' +primis_main_quest_3: + name: '&cTábor banditů!' + questLore: + - A nearby &dBandit Camp&f has recently been sighted + - and is trying to take us under! + - They keep raiding our supplies and kidnapping our villagers! + - They even took my &eGrandfather's Heirloom&f! + - We don't know what they want, but we need them gone! + - Figure out what they are doing, deal with them and bring + - me back my &eGrandfather's Heirloom&f! + questAcceptDialog: + - '&a[Chief Piscis]&f The &dBandit Camp&f isn''t too far away if you follow the road!' + - + - + - Oh, and make sure you bring back my &eGrandfather's Heirloom&f! + - '&7&oI should go to the nearby &dBandit Camp&7&o and clear it out.' + questCompleteMessage: + - '&a[Chief Piscis]&f I see you''re back! Do you bring good news?' + - '&7&oYou tell &aChief Piscis&7&o about the camp and turn the &eHeirloom&7&o in.' + - + - + - + - + - '&7&oSeems like the &aChief Piscis&f is ready to tell me how to get out of here.' +primis_main_quest_4: + customObjectives: + Objective1: + dialog: + - '&a[Petrae]&f &2Chief Piscis&f sent you? Unfortunately the passage is closed, and the &cElemental&f guards it...' + name: '&9Blue flower path!' + questLore: + - We must report our findings about the + - '&dBandit Camp&f to &dGladius&f!' + - The mountain pass is guarded by an ancient, + - powerful &cGolem&f which must be avoided at all costs! + - Follow the &eBlue Flowers&f along the path, + - they will lead you to a secret passage + - through the mountains! + - A mountain guide will be waiting for you at the end + - of the &9Blue Flower &fpath! + questAcceptDialog: + - '&a[Chief Piscis]&f The mountain pass is guarded by an extremely dangerous &cGolem&f, which you are probably not able to defeat right now!' + - + - + - '&7&oI should follow the &9&oBlue Flower &7&opath to the &aMountain Guide&7&o!' + - '&7&oI should make sure to finish any business I got left before I leave.' + - '&7&oHint: Make sure you track the quest to make finding your destination easier!' + questCompleteMessage: + - '&a[Petrae]&f Are you sure you want to risk it? I can help you...' + - '&7&oSeems like &aPetrae&f has a request for me.' +primis_main_quest_5: + name: '&5The Crystal Elemental' + questLore: + - You need to pass through? Ill timing, my friend. + - A &cCrystal Elemental &fhas invaded our passage + - and shut it down. + - If you really must make your way to Gladius, + - you will have to defeat this &cElemental&f first! + questAcceptDialog: + - '&a[Petrae]&f You seek to defeat the &cCrystal Elemental&f? I can but wish you luck in your endeavor!' + - + - + - '&7&oSeems like I must defeat the &cCrystal Elemental&7&o.' + questCompleteMessage: + - '&a[Petrae]&f Outstanding! I saw you defeat the &cCrystal Elemental&f, clearly there''s greatness in your future!' + - Now that we are on the other side, let me tell you the path to &dGladius&f! +primis_main_quest_6: + customObjectives: + Objective1: + dialog: + - '&a[Filius] &fYou made it through the mountain! You don''t see that every day.' + - + - + - '&7&oSeem like &aFilius&7&o can help me find the way to &dGladius&7&o.' + name: '&5The Farmstead' + questLore: + - The path to &dGladius&f should be easy, but with + - all the disturbances we've been seeing I suspect + - it might not be that simple. + - I am good friends with the &aProprietor of the Farmstead&f + - down the road. If you tell them I sent you, I am sure + - they will tell you how to safely reach &dGladius&f and + - give you news about the surrounding area. + - Good luck in your travels and stay safe! + questAcceptDialog: + - '&a[Petrae]&f Just tell the &aProprietor of the Farmstead&f that I sent you, though I have heard that the &aProprietor&f hasn''t been seen in a while.' + - + - + - Safe travels! + - '&7&oI should follow the path to the &dFarmstead&7&o and talk to its &aProprietor&7&o.' + questCompleteMessage: + - '&a[Petrae]&f Outstanding! I saw you defeat the &cCrystal Elemental&f, clearly there''s greatness in your future!' + - Now that we are on the other side, let me tell you the path to &dGladius&f! + - '&7&oI should talk to &aFilius&7&o to learn the way to &dGladius&7&o, and possibly talk to his &aMother&7&o to see how I can help.' +primis_main_quest_7: + customObjectives: + Objective4: + dialog: + - '&a[General Hasta] &fI can''t believe you made it past the enemies.' + - You are exactly the kind of help we need right now! + - '&7&oSeems like I should talk to &aGeneral Hasta&7&o.' + name: '&5The path to Gladius' + questLore: + - Recently smoke was sighted over the fortress of &dGladius&f. + - We were unable to go there and see what's happening + - because a &dShip&f is currently blocking the path. + - We got attacked by a bunch of undead-looking creatures + - when we approached the &dShip&f, so we ran away. + - I am afraid you will have to force your way through this + - '&dShip&f in order to reach &dGladius&f. I''m sure that they will' + - reward you if you help thin the number of &cUndead&f on that ship! + questAcceptDialog: + - '&a[Filius] Be careful on the road, clearly something has gone wrong in &dGladius&f.' + - + - + - '&7&oI should go down the path to &dGladius&7&o and clear out some &cUndead Sailors&7&o on the way there.' + questCompleteMessage: + - '&a[Lord Hasta]&f Were you sent as reinforcements from Pontis Mille? Where are the others? Are you a messenger?' + - '&7&oI should talk to &aLord Hasta&7&o.' +primis_main_quest_8: + name: '&5Recovering Hope' + questLore: + - We never saw this invasion coming. + - They came in the dead of night, hit us hard and fast. + - Before we knew it, half the city was overrun. + - Morale is low. Everyone here has lost someone. + - To spite our heartache, our own loved ones parade + - through the streets in a mockery of life itself. + - We need to rally and bolster morale, + - or we won't see another dawn! + - Back in my &dMansion&f, in my treasury, lies a &eDocument&f + - of the utmost importance. It is a written promise with + - one of the founders of &dPontis Mille&f to provide us with + - assistance in a time of dire need. This is the time. + - Retrieve the &eDocument&f, bring it back to me and + - I promise you will be welcomed in &dPontis Mille&f with + - open arms. Soldiers will fight to their last + - if given this small hope. + questAcceptDialog: + - '&a[General Hasta] The note is in my &dMansion&f. Be sure to bring it back. My men here also have other requests around town you can help with, if able.' + - '&7&oI should check what the other soldiers need and head to the &dMansion&7&o at the town exit.' + questCompleteMessage: + - '&a[Lord Hasta]&f Outstanding! Recovering this &eDocument&f in the middle of a war? If we had 10 more of you, the city would never have been taken in the first place!' + - Before you go, do you think you could do me a small personal favor? + - '&7&oSeems like &aLord Hasta&7&o wants to talk to me.' +primis_main_quest_9: + name: '&5Gladius'' Champion' + questLore: + - Before heading to &dPontis Mille&f, I have a + - personal favor to ask. + - Our &cChampion&f was last seen fighting off a horde of + - enemies near the &dStatue&f. + - We have not heard from him since the start of the + - invasion and at this stage we fear the worst. + - Please go check on him. If you find him and he has + - turned into one of these undead... please free him of his curse. + questAcceptDialog: + - '&a[General Hasta] &fMake your way to the &dStatue&f. I am sure our &cChampion&f will be easy to find.' + - '&7&oI should go to the &dStatue&7&o and investigate what happened to the &cChampion of Gladius&7&o.' + questCompleteMessage: + - '&a[General Hasta]&f So... The worst has come to pass. I will make sure these beasts shall pay for slaying my son.' + - 7&oSeems like &aGeneral Hasta&7&o has some parting words for me. +primis_ogre_mines_clear: + name: '&2Ogre-sized problems' + questLore: + - Our mining encampment was overrun! + - We need help! + - I don't really know what happened, but we need to clear + - the encampment and talk to &aOld Vetus&f! + questAcceptDialog: + - '&a[Metus]&f You''re going to help? Please hurry, the encampment is just beyond here!' + - '&7&oI should clear the encampment and talk to &aOld Vetus&7&o.' + questCompleteMessage: + - '&a[Vetus Fossores]&f You came to help? Fantastic, we absolutely need help right now!' + - Here's a little something for your help clearing the encampment! +primis_ogre_mines_lost_bretheren: + customObjectives: + Objective1: + dialog: + - '&a[Fortis Fossores] &fWhat do you want? What, &aFugit&f sent you? What for? The mines were overrun? Hah, I didn''t even notice!' + - + - + - + name: '&5Lost Bretheren' + questLore: + - The mine was overrun by &cOgres&7&o! + - In the confusion I got separated from my &aBrother&f in the &dMines&f, + - and I fear for his safety! + - He's a bit of an eccentric man, very dedicated to mining. + - You'll know if you've seen him! + - Please bring him back up here, or at the very least tell me if he is safe. + - I'll make it worth your trouble! + questAcceptDialog: + - '&a[Fugit] &fPlease find my &aBrother&f and make sure he''s OK!' + - '&7&oI find &aFugit''s Brother&7&o in the &dMines&7&o overrun by &cOgres&7&o.' + questCompleteMessage: + - '&a[Fugit Fossores]&f My &aBrother&f said what? Ah, typical of him, too focused on his work to notice the entire place was taken over!' + - I'll have a serious conversation with him next time I see him! + - + - +primis_ogre_mines_old_miner_quest: + name: '&2Lucky Pickaxe' + questLore: + - We have ourselves a bit of a pickle! + - As we were mining, we came across a mysterious cave full of monsters! + - I dropped my favorite &ePick-axe&f as I ran, I need your help to go get it! + - I'm sure the &cOgre Magi&f picked it up for himself. + - Get my &eLucky Pickaxe&f back from that brute! + - I've got some trinkets for you when you return. + questAcceptDialog: + - '&a[Vetus Fossores]&f That &cOgre&f shouldn''t be far! You can find him in the cave to the right, before the collapsed area.' + - He should have the &ePickaxe&f, &cOgres&f love shiny things after all! + - '&7&oI should defeat the &cOgre Chief&f.' + questCompleteMessage: + - '&aa[Vetus Fossores]&f You got my lucky pick? Excellent!' + - Heres your reward! +primis_pontis_groves_acrobatics: + customObjectives: + Objective1: + dialog: + - '&a[Idoneitatem Hominem]&f Congratulations!' + name: '&2Acrobatics' + questLore: + - So you think you have you what it takes. + - Are you fit enough, are you quick enough, are you strong enough? + - Platforms, wines, dangerous heights. All you could ever want! + - The ultimate challenge lies ahead! + - OK, OK. Me and my &aBrother&f might have been bored a bit and + - made an entire acrobatics course. + - The goal is to to get from platform to platform using &9Wines&f and + - '&9Acrobatics&f and reach the end of the course.' + - + - + - You will be rewarded with a very nice &eItem&f! + questAcceptDialog: + - '&a[Posuere Hominem]&f You can find the start of the course at the &dEnd of that Tunnel&f.' + - + - + - Don't forget to speak to my &aBrother&f at the end of the course for the reward! + - '&7&oI should head to the start of the course.' + questCompleteMessage: + - '&a[Idoneitatem Hominem]&f Well deserved! I hope you did not cheat! Try and beat my record if you can.' +primis_pontis_groves_caught in the web: + name: '&2Caught in the web' + questLore: + - So they have a &dNest&f somewhere in the &dGrove&f. + - That would explain why their population has skyrocketed. + - + - + - It would be great if you could locate the &dNest&f and clear it out. + - We will make you some fine &eSpider Leg Boots&f as a reward! + questAcceptDialog: + - '&a[King Nemian]&f If there is a &dNest&f I am sure it would be &9Surrounded by Cobwebs&f.' + - '&7&oI should find the &dSpiders Nest&7&o and clear it out.' + questCompleteMessage: + - '&a[King Nemian]&f Hah! I knew we could count on you!' + - Here are your fine boots, well deserved! +primis_pontis_groves_elf_stole_from_my_shelf: + name: '&2Elf stole from my shelf' + questLore: + - Disaster has struck our little hole. + - Not too long ago our lovely home got raided by &cElf Bandits&f. + - Thankfully we weren't home at the time so nobody got hurt. + - We managed to replace most of our possessions. + - But they took my &eFamily Heirloom&f that was sitting on the shelf. + - If you would be so kind to go try and get it back for me, I would be most thankful. + - I make the best stews, I would be glad to share some with you as a reward. + questAcceptDialog: + - '&a[Luxuria Gorgonius]&f The &eHeirloom&f is quite valuable I am sure they would keep it &9Somewhere Extra Safe&f.' + - '&7&oI need to go retrieve the &eHeirloom&7&o.' + questCompleteMessage: + - '&a[Luxuria Gorgonius]&f Oh my gosh! You found it!' + - There are not enough thanks in the world for what you just did for me. + - '&7&oThis stew should keep med fed for a while.' +primis_pontis_groves_into_the_next_hole: + customObjectives: + Objective1: + dialog: + - '&a[Phygia Gorgonius]&f Time to kick those &cElves&f out for good!' + name: '&2Into the next hole...' + questLore: + - If you are available there is plenty more work to do around here. + - We have some serious &cElf&f problems, + - but I have assigned &aPhygia&f to handle those issues. + - Go talk to &aPhygia Gorgonius&f in the hole next to this one. + - They will be able to tell you more and what needs to be done. + questAcceptDialog: + - '&a[King Nemian]&f The hole right next to this one one, can''t miss it!' + - '&7&oI should go talk to &aPhygia Gorgonius&7&o.' + questCompleteMessage: + - '&a[Phygia Gorgonius]&f Let''s talk...' + - '&7&oI should hear out &aPhygia Gorgonius&7&o.' +primis_pontis_groves_lighthouse_1: + customObjectives: + Objective1: + dialog: + - '&a[Alanus Secundas] &fHas the &dGrove&f sent you?' + name: '&2Feeding the sick' + questLore: + - Wanderer, could I ask a simple favor of you? + - + - + - But ever since the troubles began we could not leave our &dGrove&f. + - Would you be so kind to bring the family their latest batch of food. + - It would be great if you could hurry, it has been a while since the last delivery. + questAcceptDialog: + - '&a[King Nemian]&f When you exit the hole the &dLighthouse&f is straight forward and a bit to the left.' + - '&7&oI should go to the &dLighthouse&7&o.' + questCompleteMessage: + - '&a[Alanus Secundas]&f I am so thankful! We were just starting to run out of food.' + - Are you busy? + - '&7&oSeems like &aAlanus&7&o wants to talk to me.' +primis_pontis_groves_lighthouse_2: + customObjectives: + Objective1: + dialog: + - '&8[Jeeves]&fOh, hello there again!' + - '&8[Jeeves]&f They do not need the food anymore? I was just about to go shopping.' + - '&8[Jeeves]&f So kind of you to come here and let me know.' + name: '&2Do not ask Jeeves' + questLore: + - Uh, before you came. Jeeves the Travelling Merchant stopped by. + - We asked him if he could go get some food for us. + - + - + - + - + questAcceptDialog: + - '&8[Alanus Secundas]&f When you exit the dwelling the Lighthouse is straight forward and a bit to the left.' + - '&8&oI should go to the Lighthouse.' + questCompleteMessage: + - '&8[Alanus]&f You let him know? Good, good!' + - '&8&oSeems like Alanus is quite fed.' +primis_pontis_groves_population_control: + name: '&2Population control!' + questLore: + - Oh I am so happy that finally someone has arrived to help us out. + - We have a big arachnid problem going on in our little grove. + - There are so many arachnids around these days that you cannot even + - take a nice evening walk without one of the nasty buggers + - jumping at you from the shadows. + - It is clear that their population numbers need a serious culling. + - Oh! Please bring to me any arachnid legs that are still in good contidion. + - We use them to make small cranes and grabbers. + questAcceptDialog: + - '&8[King Nemian]&f You will find them lurking beneath the shadows of the trees.' + - '&8&oI need to find Forest Crawlers and kill them.' + questCompleteMessage: + - '&8[King Nemian]&fGood to see you return, and with plenty of legs too!' + - '&8[King Nemian]&fYou think that their nest might be near? Let''s talk more about this' +primis_pontis_groves_tree_climbing_elf_bandits: + name: '&2Tree climbing elf bandits!' + questLore: + - + - + - Not like the &cSpiders&f were enough, + - now these shadow loving poop nuts have decided to settle in our trees! + - + - + - + - + - Forced their way in with their superior numbers. + - Well they got something coming alright, + - one look at you and I can tell you can handle a couple of stone giants! + - I am sure some elves won't be much of an issue for you. + - + - + questAcceptDialog: + - '&a[Phygia Gorgonius]&f I am sure you will find plenty of them if you find some place with shade and just look up, hard to miss their tree houses.' + - '&7&oI should go take care of these &cElves&7&o before &aPhygia&7&o catches on fire from rage.' + questCompleteMessage: + - '&a[Phygia Gorgonius]&f My friend! HAHA! So good to see you again!' + - + - + - '&7&oThe elves wont be bothering &aPhygia&7&o ever again.' +primis_pontis_mille_fields_berry_crazed_wolf: + name: '&2Berry crazed wolves' + questLore: + - Oh gosh, I have no idea what is wrong with these &cRockhounds&f. + - They keep coming into the &dBerry Farm&f while I am away or sleeping. + - You would think they come here and eat the berries, but no! + - They load their mouths with them and carry them + - off somewhere deep into the forest. + - I mean they are &cHounds&f! Why are they even stealing berries. + - Well I guess it doesn''t matter, I have a favor to ask. + - Could you go clear the + - '&9Area Behind the Berry Farm&f,' + - and bring back my &eStolen Berries&f. + - I have a lot of pies to make and the berries they stole were ripe and ready. + questAcceptDialog: + - '&a[Dordalus Nasica]&f I only saw the &cRockhounds&f steal the berries.' + - '&7&oI should go kill the &c&oRedwood Rockhounds&7&o and collect any &e&oStolen Berries&7&o they drop.' + questCompleteMessage: + - '&a[Dordalus Nasica]&f Oh my, you did it. Could I bother you with one more tiny favor.' + - '&7&o Seems like &d&oMilonia&7&o has more work for me.' +primis_pontis_mille_fields_camping_hunters: + customObjectives: + Objective1: + dialog: + - '&a[Scribonia Ingenvinus]&f Yes?' + name: '&2Camping hunters' + questLore: + - I hope I am not bothering you. You look like a person that would listen to a plea. + - We do not have much to do here in the &dSlums&f, + - most of us like to wander the &dFields&f to pass the time. + - Unfortunately that has come to a stop after a bunch + - of &cMonsters&f started roaming around the &dFields&f. + - We heard that some hunters have made &dCamp&f near the &dFields&f. + - If you could go there and talk to them and ask them to deal with these &cMonsters&f... + questAcceptDialog: + - '&a[Augustina Verrucosis]&f Their &dCamp&f should be somewhere North-West of here.' + - '&7&oI need to head for the &d&oHunters Camp&7&o.' + questCompleteMessage: + - '&a[Scribonia Ingenvinus]&f Help the &dSlums&f with their &cMonster&f issue?' + - Let's talk more about. + - '&7&oI should talk to &a&oScribonia&7&o and hear out what she has to say.' +primis_pontis_mille_fields_camp_hunter_three_times_hunter: + name: '&2Hunter three times hunter' + questLore: + - So you found &aVolumnia&f. Thank the great hunters that she is alright. + - Since you have helped &aVolumnia&f and proven yourself a kind soul. + - How about a friendly challenge. I would be willing to offer you some nice + - quality armor should you face the challenge and return victorious. + - The challenge involves hunting + - '&cThree Great Beasts&f scattered across Pontis.' + - The &cBeast Cod Furiosa&f who swims underneath a bridge where two mountains stand. + - '&cBeast Crawler Megdun&f that slumbers on top of a sun covered grove.' + - Dancing between two western peaks you will find the + - '&cBeast Impaler Uladzimir' + - + - + questAcceptDialog: + - '&a[Milonia Majus]&f Here take this device it will roughly guide you to the their location.' + - '&7&oI should go and challenge the &c&oThree Great Beasts&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f You have returned. And you have brought all three items I requested as proof.' + - + - + - Well enough about me, here is your reward as promised! + - '&7You hand back the beast tracking device.' + - '&a[Milonia Majus]&fI had almost forgotten about that thing, thank you!' + - Until we meet again adventurer! +primis_pontis_mille_fields_do_it_yourself: + name: '&2Do it yourself' + questLore: + - Deal with the &cMonsters&f? Well I can tell you we have already been doing that. + - There is just too many of them and not enough of us. + - We started hunting them as soon as we made our &dCamp&f here. + - But their numbers just don't seem to be going down. + - And that's not even the worst of it. + - We have discovered a lair and a big old &cBeast&f that comes with it! + - Well since you have made it to our &dCamp&f in one piece, + - I assume you are quite capable yourself. + - How about joining the hunt? What say you? + questAcceptDialog: + - '&a[Scribonia Ingenvinus]&f I knew you would say yes! I see you are already well equipped.' + - OK, this is what I want you to do. + - + - + - Second I need you to slay 5 &cLonghorns&f and 6 &cShorthorns&f. + - Understood? Good. Report to me when you're done. + - '&7&oI should slay &c&oBig ol'' Bubba&7&o and kill 5 &c&oLonghorns&7&o and 6 &c&oShorthorns&7&o.' + questCompleteMessage: + - '&a[Scribonia Ingenvinus]&f I must say I am quite impressed.' + - Clearly you are way more than just 'capable'. + - Thank you for the assistance, we will be able to handle the rest. + - Until we meet again, great hunter. +primis_pontis_mille_fields_feeding_the_hungry: + customObjectives: + Objective3: + dialog: + - '&7You hand the over the bread and the flour.' + - '&a[Rufia Tertulus]&f I don''t know what to say. My children will be so happy!' + - '&7The woman bows to you in deep appreciation.' + Objective4: + dialog: + - '&a[Fabia Praetextus]&f I guess fantasies do come true sometimes. I am eternally grateful to you kind sir.' + Objective1: + dialog: + - '&a[Lena Lucan]&f Fresh bread! I cannot thank you enough!' + Objective2: + dialog: + - '&a[Tranio Florens]&f Wow! The day just keeps getting better!' + - Thank you for the flour kind soul. + name: '&2Feeding the hungry' + questLore: + - I can feel a good heart beating in that chest of yours. + - Not everyone is as fortunate as you and I. + - There are some poor souls living in the &dPontis Mille Slums&f. + - For a while now I have been working over + - time to produce surplus bread and flour. + - Would you mind taking these sacks of wheat and these bread stacks. + - Then travel with them to the &dSlums&f and hand them out to those in need? + - I have been doing this for a while now but I injured my left foot, + - so I cannot do much walking right now. + questAcceptDialog: + - '&a[Daemones Maritialis]&f I wish there were more people like you in the world.' + - The &dSlums&f are straight North of here, you can see the buildings in the distance. + - '&7&oI should go to the &dSlums&7&o and hand out the food to those in need.' + questCompleteMessage: + - '&a[Augustina Verrucosis]&f &2Daemones&f sent you here didn''t he.' + - + - + - Thank you stranger, my family won't forget this. +primis_pontis_mille_fields_fruity_hound: + name: '&2Fruity hound' + questLore: + - Since you are my NUMBER ONE berry recovery agent, + - I have another task for you. + - As you can see we grow some very large berries on our + - little &dBerry Farm&f here. + - There was a + - '&eSpecific Berry&f I was growing for a contest.' + - But as I was walking to the &dBerry Farm&f I saw a + - '&cFruity Rockhound&f jump for the bush holding my prized berry.' + - He snapped it off and carried it away. + - Its jaws were holding the berry by its stem so + - it should still be in one piece, I hope. + - If you go slay the beast and bring back my + - dear &eContest Berry&f I will have a nice + - reward waiting for you. + questAcceptDialog: + - '&a[Dordalus Nasica]&f I think I saw the &cHound&f head into the &dRedwoods&f, North-West of the farm.' + - '&7&oI should go slay the &c&oFruity Hound&7&o and see if the &e&oContest Berry&7&o is still in one piece.' + questCompleteMessage: + - '&a[Dordalus Nasica]&f YES! That is my darling! Fine and whole, not even any saliva on it!' + - + - + - + - +primis_pontis_mille_fields_not_on_my_farm: + name: '&2Not on my farm!' + questLore: + - Lately all these &cRats&f have been driving me crazy. + - They keep going into our little farm and eating all our goods! + - Any chance you could go and lower their numbers a bit? + - Be careful, there are so many of them. + - Oh, I almost forgot to tell you. + - If you see a large &cWell Fed Rat&f don't bother with it. + - It has grown so large and fat it would take you days to slay it. + questAcceptDialog: + - '&a[Milonia Majus]&f I am sure that you already noticed that they like to squirm around the path area.' + - '&7&oI should go kill the &cRats&7&o that hang around the path that leads to &dPontis Mille&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f Thank you so much! We can get back to making delicious goods now.' +primis_pontis_mille_fields_surprise_me_with_flour: + customObjectives: + Objective3: + dialog: + - '&a[Adulescens Lupis]&f I heard the farm was having &cRat&f problems. Three sacks of flour coming up, no problem!' + Objective1: + dialog: + - '&a[Dinia Niraemius]&f Flour? Sure, one sack of flour coming up!' + Objective2: + dialog: + - '&a[Daemones Maritialis]&f The farm needs more flour eh? Here ya go, two sacks!' + name: '&2Surprise me with flour' + questLore: + - Wow, you're quite handy. If I could bother you with another task. + - The &cRats&f had completely ruined our current stock of flour. + - So we need to a completely new batch of flour. + - The &dWindmills&f should have plenty of it. + - Go collect the flour and drop it off back here with me. + - I will be paying good coin for this service! + questAcceptDialog: + - '&a[Milonia Majus]&f You will need to collect the flour from all three &dWindmills&f.' + - '&7&oI need to visit the three &dWindmills&7&o and collect the flour they produce.' + questCompleteMessage: + - '&a[Milonia Majus]&f This should last us for quite a while!' + - Hopefully our flour tab won't get too big, hehe. +primis_pontis_mille_fields_wellness: + name: '&2Wellness' + questLore: + - Am I glad to see you right now! + - Dang &cNightmare Rat&f ambushed me while I was climbing down the well. + - I injured my arm and legs when I fell. + - Argh, I still have some of its toxic spit left in my eyes. + - Thankfully I managed to crawl my way onto this little + - ledge before it could come finish me off. + - How embarrassing, not sure what hurts more right now, my body or my pride. + - I have some + - '&eFirst Aid Equipment&f' + - in my chest at the &dHunters Camp&f. + - Would you mind getting it for me? Oh, and make sure not to tell anyone + - there a word about what you saw here. + - '...almost died in a well...this is chapter of my life I will need to erase...' + questAcceptDialog: + - '&a[Volumnia Zoilus]&f The &dHunters Camp&f is straight South, cannot miss it, look for tents.' + - '&7&oI need to go collect the &e&oFirst Aid Equipment&7&o for &a&oVolumnia&7&o at the &d&oHunters Camp&7&o.' + questCompleteMessage: + - '&a[Volumnia Zoilus]&f Already back? Hand me the equipment.' + - Do not worry about me, I will have myself patched up in no time. + - Thank you for everything! You saved my life you know! +primis_pontis_mille_field_check: + customObjectives: + Objective1: + dialog: + - '&a[Augustina Verrucosis]&f Oh, this is quite important! I will let the residents know.' + - Thank you for delivering these important documents. + name: '&2Field check' + questLore: + - If I could bother you with some delivery tasks. + - I have here some important documents that need to be delivered to the + - '&dSlums&f and to the &dFields Farm&f.' + - The soldier that was supposed to come and get them has not arrived yet. + - And this is an urgent matter, we cannot afford to wait any longer. + - Unfortunately I have strict orders to not leave my post. + - If you could do this for me it would help us out a lot. + questAcceptDialog: + - '&a[Godefridus Novation]&f You will do it? Excellent!' + - You can follow the &9Yellow Path&f to get to the slums. + - The &dFields Farm&f is right beyond the slums, just follow the path. + - Oh! And watch out for the field rats! + - '&7&oI should head for the &d&oSlums&7&o and then the &d&oFields Farm&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f Documents? Let me see them. Hmmm, looks official.' + - Thank you for coming all the way here to deliver them. + - '&7&oSeems like &a&oMilonia&7&o could use my help with the rats...' +primis_pontis_mille_fresh_rats_coming_up: + customObjectives: + Objective1: + dialog: + - '&a[Elite Guard]&f Plenty of rats inside.' + name: '&2Fresh rats coming up' + questLore: + - No cat food but I think I can help ya + - find something even better... + - I heard a couple of + - '&aGuards&f have been dealing with' + - a rat infestation in the lower parts of the city. + - Go down there and maybe you can get some + - '&cRats&f for your cat friend.' + questAcceptDialog: + - '&7&oI should check out the lower part of the city and see if I can find the &a&oElite Guards&7&o.' + questCompleteMessage: + - '&a[Mew Meowzer]&f Meow. MEOW! Prrrrr.' + - '&7&oI should let the cat enjoy it''s meal in peace.' + - '&7&oIt seems to have dropped something, hmm...' +primis_pontis_mille_hungry_friend: + customObjectives: + Objective3: + dialog: + - '&a[Melaenis Gelasius]&f Cat food? Where the heck did you manage to find a cat here...' + - No, I don't know where to get any cat food. + Objective4: + dialog: + - '&a[Sulpicio Panthera]&f I wish I could help, sorry.' + Objective1: + dialog: + - '&a[Royal Guard]&f Do I look like someone who keeps track of cat food?...' + Objective2: + dialog: + - '&a[Tyndarus Faustinius]&f Sorry, I have no idea.' + Objective5: + dialog: + - '&a[Tyndarus Columbanus]&f We used to have cat food around here somewhere, but heck knows what happened to it...' + name: '&2Hungry friend' + questLore: + - '&7&oWhat is wrong little one.' + - '&a[Mew Meowzer]&f Meow!' + - '&7&o Are you hungry? Does the' + - '&7&olittle one want some food?' + - '&a[Mew Meowzer]&f MREOOOW!!!' + - '&7&oLet''s see if we can' + - '&7&oget you some food.' + questAcceptDialog: + - '&7&oI should see if anybody in the city knows where to find some cat food.' + questCompleteMessage: + - '&a[Modestus Aper]&f Cat food? I don''t know about that. But...' + - '&7&oSeems like &a&oModestus&7&o might know something...' +primis_pontis_mille_late_delivery: + name: '&2Late delivery' + questLore: + - I ordered some &eFishing Nets&f from + - '&dGladius&f that haven''t arrived yet. I wonder' + - if something might have happened to the + - shipment. If you are willing, I would pay you + - a small fee if you could go see what + - happened to the shipment and get the + - '&eFishing Nets&f for me.' + questAcceptDialog: + - '&a[Delphium Calpurnius]&f Last I heard my shipment of &eFishing Nets&f was supposed to be heading for &dGladius&f.' + - '&7&oI need to go look around &d&oGladius&7&o for &a&oDelphium''s&7&o shipment of &e&oFishing Nets&7&o.' + questCompleteMessage: + - '&a[Delphium Calpurnius]&f Those are the &eFishing Nets&f! Thank you so much!' + - '&a[Delphium Calpurnius]&f I invested a lot of my savings into these! Not sure what I would have done if you hadn''t found them.' +primis_pontis_mille_let_them_know: + customObjectives: + Objective3: + dialog: + - So Fortes sent you? I see. + - Your help would be much appreciated, aid me and my forces will be ready. + Objective1: + dialog: + - So Fortes has decided to take action. + - Help me finish my task, and my forces will be ready. + Objective2: + dialog: + - So Fortes has decided to act. + - If you could assist me with this task, then my forces will be ready. + name: '&2Let them know!' + questLore: + - I am sorry that we cannot send aid to &dGladius&f right away. + - Ever since that new &cCounselor&f came, our ruler has not been himself. + - If you could reach out to the &aGenerals&f in the city and let them know + - that &dGladius&f needs help we might be able to to do something about it. + - But not before we deal with the existing issues first. + - + - + - Go talk to them and then come back to let me know they got the message. + - I will reward you for your time. + questAcceptDialog: + - '&a[Fortes]&f Follow the &9orange path&f from the main room to find &aGeneral Bromia&f.' + - '&a[Fortes]&f At the end of the &9yellow path&f you will find the &aGeneral Rogerius&f.' + - '&a[Fortes]&f At the end of the &9shorter purple&f path you will find the &aGeneral Cylindrus&f.' + - '&7&oI need to talk to the three &a&oGenerals&7&o.' + questCompleteMessage: + - '&a[Fortes]&f You managed to contact them? Excellent!' + - '&a[Fortes]&f Here is your reward. Don''t spend it all in one place.' +primis_pontis_mille_lighthouse_1: + customObjectives: + Objective1: + dialog: + - '&8[Hegio Remus]&f Another letter? Thank you for bringing it to me.' + name: '&2A quick delivery' + questLore: + - Before you go anywhere, could you deliver this letter for me? + - You can find the gentleman it needs to go to on top of the Lighthouse. + - Don't worry the Lighthouse is right behind me through that doorway. + questAcceptDialog: + - '&8[Fortes]&f Thank you.' + - '&8&oI should go talk to the Pontis Mille Lighthouse Keeper.' + questCompleteMessage: + - '&8[Hegio Remus]&f Hey, do you have a second?' + - '&8&oSeems like Hegio Remus needs me to talk to him.' +primis_pontis_mille_lighthouse_2: + customObjectives: + Objective1: + dialog: + - '&a[Jeeves]&f Oh, we meet again. It''s good to see you.' + - You have something for me? Oh, wow...that is quite the shopping list. + - I will have the items sent back to &aHegio&f as soon as possible. + - Thank you for stopping by. Hope we meet again. + - '&7&oI should let &aHegio&7&o know I delivered the note.' + name: '&2Ask Jeeves' + questLore: + - Would you mind taking the portal and delivering a note to my good friend &aJeeves&f. + questAcceptDialog: + - '&a[Hegio]&f Much appreciated friend.' + - '&7&oI should go talk to &aJeeves&f at &dCaeruleaum Village&7&o.' + questCompleteMessage: + - '&a[Hegio]&f You delivered the note? Excellent!' + - Here, you can have some of this &eRabbit Stew&f I keep in my back pocket. +primis_pontis_mille_mines_goblined_up_in_the_maze: + customObjectives: + Objective3: + dialog: + - '&a[Hurt Guard]&f Am so I happy to see you!' + Objective1: + dialog: + - '&a[Injured Guard]&f Thank the skies!' + Objective2: + dialog: + - '&a[Wounded Guard]&f Finally, the rescue is here!' + name: '&2Goblined up in the maze' + questLore: + - If I could bother you for a second. + - Since you will be going into the &dMines&f already, it + - would be great if you could help us resolve some issues. + - We are missing three &aGuards&f that were sent + - into the mines to hunt down a &cCursed Goblin&f. + - I fear that something might have happened to them. + - This &cCursed Goblin&f is supposed to be + - hiding in some sort of &9Maze&f in the &dMines&f. + - Could you locate the &aMissing Guards&f and + - bring me proof of the &cGoblins&f death. + questAcceptDialog: + - '&a[Centurion]&fTry to not get lost in the &9Maze&f.' + - May luck be on your side warrior! + - '&7&oI should venture through the &d&oMines&7&o and locate the &9&oMaze&7&o.' + questCompleteMessage: + - '&a[Centurion]&f They are alive, excellent, we will send some soldiers to get them out as soon as possible.' + - I see you brought proof of the &cGoblins&f death, well done. + - '&7&oHopefully people keep out of the &9Maze&7&o in the future.' +primis_pontis_mille_serious_sewage: + customObjectives: + Objective3: + dialog: + - '&a[Michelangelo]&f Tell that old man everything is in order!' + Objective4: + dialog: + - '&a[Raphael]&f Tell Rogerius I am alive and doing fine!' + Objective1: + dialog: + - '&a[Donatello]&f You can tell the General I am doing just fine!' + Objective2: + dialog: + - '&a[Leonardo]&f The General should not worry, I am ok!' + name: '&2Serious sewage' + questLore: + - If you are up to the task then I could use your help. + - + - + - + - + - They have a leader, I think he calls himself &cShreepper&f or something. + - Make sure to get rid of him, a snake without it's head is not a threat. + - If you could go down there and thin the numbers of critters and the trouble makers + - then that would allow me to assign my forces to more important tasks... + - We had also sent &a4 Agents&f down there, I have not heard from them yet. + - + - + - I also seem to have misplaced my personal &eSewage Keys&f + - if you could retrieve those too, that would be great. + questAcceptDialog: + - '&a[Rogerius]&fYou can get to the &dSewers&f by going to the fountain and then a bit south-east.' + - + - + - '&7&oI need to find my way into the &dSewers&7&o and complete the tasks.' + questCompleteMessage: + - '&a[Rogerius]&f You have completed the all I have asked? If only I had 10 more men like you...' +primis_pontis_mille_star_gazing: + customObjectives: + Objective1: + dialog: + - '&a[Virgo Dexippus]&f Yes, what is it?' + name: '&2Star gazing' + questLore: + - You have done so much for this city and its people. + - Having assisted the three &aGenerals&f and helped the areas around &dPontis Mille&f + - has freed up a serious amount of our forces and resources. + - We would be able to send our forces to aid &dGladius&f now. + - But before we take action there is one last thing I would like you to do. + - You should go speak with the &aStargazers&f. + - It is in regards to our lost history and the &cElementals&f. + - The &aStargazers&f will be able to tell you more once you talk to them. + - Here take this sealed note and show it to them. + questAcceptDialog: + - '&7[Fortes Bellator]&f You can find the &aStargazers&f at the &dObservatory&f.' + - + - + - '&7&oI should talk to the &aStargazers&7&o at the &dObservatory&7&o.' + questCompleteMessage: + - '&a[Virgo Dexippus]&f The &aMajor&f sent you? It must be important then.' + - '&7&oI should talk to &aVirgo&7&o.' +primis_pontis_mille_stay_a_while_and_listen: + name: '&2Stay a while and listen' + questLore: + - Hand me the note. Let me take a look... + - We have been given permission to share important + - information with you regarding our past. + - You must have done something quite important, + - this information is usually only shared with the top brass. + - '&aStella&f will share with you what we have uncovered.' + questAcceptDialog: + - '&a[Virgo Dexippus]&f Talk to &aStella&f and &9Click on the Sword&f to start listening.' + - '&7&oI should talk to &aStella&7&o and start the &9Arena Challenge&7&o.' + questCompleteMessage: + - '&a[Virgo Dexippus]&f Do not share this information with anyone.' + - '&7&oThat was quite a tale.' +primis_pontis_mille_the_groves_call: + customObjectives: + Objective1: + dialog: + - '&a[King Nemian]&f &2General Bromia&a sent you?' + - Excellent, I knew we could count on him. + name: '&2The groves call!' + questLore: + - It is our duty to protect the &dGroves&f from any threats. + - '&aKing Nemian&f of the &dGroves&f has sent a request for aid.' + - Nasty critters have come to the &dGroves&f and other + - invaders are taking over the trees. + - If you could go over there and sort out these issues + - then my forces will be free to come to &dGladius'&f aid + questAcceptDialog: + - '&a[Bromia]&f The &dGroves&f are located North of the city.' + - There is a path through the mountain,, below the mines. + - '&7&oI should talk to &aKing Nemian&7&o.' + questCompleteMessage: + - '&a[King Nemian]&f You have arrived just in time!' +primis_pontis_mille_to_lycan_or_not_to_lycan: + name: '&2To lycan or not to lycan' + questLore: + - Not sure how a single person can accomplish what + - an entire battalion cannot. + - But if the &aGeneral&f has sent you, then who I am to complain. + - We have located their &dDen&f, but the resistance is too strong. + - There was just no way to get through. + - But If you could fight your way into the &dDen&f and clear it out + - then the &dRedwoods&f could be safe yet again. Well safer at least... + - Their &dDen&f is located under a &9Corrupted Redwood Tree&f. + - Should be easy to spot it, it stands out among the healthy trees. + questAcceptDialog: + - '&a[Cylindrus]&f Be careful...' + - '&7&oI need to clear out the &dWerewolf Den&7&o.' + questCompleteMessage: + - '&a[Magnus]&f By the great tree fairy, you''ve done it!!!' + - Feel free to rest at our camp, you are always welcome here. +primis_pontis_mille_where_is_he_now: + customObjectives: + Objective1: + dialog: + - '&a[Gorenus Palis]&f My brother sent you looking for me?' + - Oh, I messed up again...I got real lost this time. + - I hope he isn't too mad. + - When you go back, please tell him I'm safe. + name: '&2Hungry friend' + questLore: + - Me and my &aBrother&f were on our way + - back here from the village. + - During our travels I had to do a little detour, so we got separated. + - We were supposed to meet up here. + - But no trace of him for quite some time now. + - He has a tendency to get lost...real lost. + - I am quite worried about him. + - I would be willing to pay a high reward + - to anyone who can find him. + questAcceptDialog: + - '&a[Rodenus Palis]&f So kind of you to offer your help.' + - Please if you find him come tell me where he is right away. + - '&7&oI need to go find &a&oRodenus''&7&o brother.' + questCompleteMessage: + - '&a[Rodenus Palis]&f What! How the heck did he end up all the way there!' + - Sigh, I better start going now then... + - Thank you for all your help. Here are the coins as promised. +primis_pontis_redwoods_big_brown_logs: + customObjectives: + Objective1: + dialog: + - '&a[Magnus]&f Who are you? Oh, you came from &dPontis Mille&f.' + name: '&2Big brown logs' + questLore: + - I could dedicate my forces to helping &dGladius&f if you could help + - us deal with the &cWerewolf&f crisis in the &dRedwoods&f. + - Our forces have been holding back the &cWerewolves&f for weeks now. + - It would be great if you could assist us. + - Go to the &dRedwoods&f and talk to &aMagnus Castorea&f. + - They will let you know what needs to be done to end this crisis. + questAcceptDialog: + - '&a[Cylindrus]&fThe &dRedwoods&f can be reached by heading North.' + - Head North until you reach the &dRailway Stop&f, then head West. + - '&7&oI need to head into the &dRedwoods&7&o and talk to &aMagnus&7&o.' + questCompleteMessage: + - '&a[Magnus]&f The general has sent you to help?' + - Hmm...you better be good. +primis_pontis_redwoods_its_reyn_time: + name: '&2It is Reyn time!' + questLore: + - My &ePocket-watch&f had fallen into the river when I was cutting down a tree. + - It is a special watch you see. Filled with air and quite robust. + - Fully resilient to heavy logs being dropped on it, yep. + - I saw one of those nasty &cBandits&f scoop it up and put it in their pocket. + - Pretty sure I saw them &9Carrying a Hatchet&f. + - + - + - A nice reward for you too when you get back! + questAcceptDialog: + - '&8[Reynus]&f You can find the &cBandits&f right across the river.' + - '&7&oI need to go slay the correct &cBandit&7&o and collect the &eWatch&7&o.' + questCompleteMessage: + - '&a[Reynus]&f I will make sure not to loose it again!' + - Your reward my good sir! +primis_pontis_redwoods_nasty_little_bandits: + name: '&2Nasty little bandits!' + questLore: + - Ever since these darn &cBandits&f settled across the river there has been no peace. + - They keep ruining the trees, yesterday I caught one of them + - trying to set one of these giant trees on fire! + - And not too long ago I got chased by a crazy person with a hatchet, + - I am quite sure it was one of the &cBandits&f. + - Not too mention they keep trying to rob anyone that + - has business with us good folk here at the &dSawmill&f. + - Enough is enough. I am willing to pay good coin to make this madness end. + questAcceptDialog: + - '&a[Ligna Crispian]&f You will find them across the river.' + - '&8&oI should go to the &dBandit Camp&f and clear it out.' + questCompleteMessage: + - '&a[Ligna Crispian]&f Finally! Some peace, thank you!' +primis_pontis_redwoods_need_a_smoke: + name: '&2Need a smoke' + questLore: + - I heard you helped good old &aReynus&f there. + - Well as you can see, I managed to cut my legs with that darn saw again. + - Oh, don't worry about me. My legs will be healed up again in no time. + - You see, the issue is, not much to do while I wait for my legs to heal. + - This makes me in the mood for some good puffin. + - I brought with me some &ePremium Tobacco&f for my pipe, + - but I had to hide it in case those &cBandits&f got their hands on it. + - The problem is, I completely forgot where I hid it! + - All I remember is burying it &9Near a Tree&f. + - Which tree? Who knows! + - Listen I got you a fine deal here. Find my tobacco and you can have + - all of my &eGolden Apples&f. + questAcceptDialog: + - '&a[Lyco]&f Hope ya find it soon.' + - '&7&oI should go look for the &eTobacco&7&o.' + questCompleteMessage: + - '&a[Lyco]&f You found it! HAHA! Knew I could rely on ya!' +primis_terravilla_bipedal_examination: + name: '&2Bipedal examination' + questLore: + - I have been studying the &cTwo Legged Terrors&f that roam + - around &dTerravilla&f. Did you know that their population + - used to be much larger just some years ago. In fact it was + - the reason why the first settlers decided to build + - '&dTerravilla&f on top of the ruins and not down on the ground.' + - For some reason their numbers have really decreased. I was + - trying to get some &eSamples&f but trying to kill any of them is + - far beyond my skill. But you look like the sort of type who + - can handle a &cTwo Legged Terror&f or two. Interested in + - helping me out? + questAcceptDialog: + - '&a[Plautia Suilius]&f Six &eSamples&f should do it. Return to me once you have collected the &eSamples&f.' + - '&7&oI need to slay 3 &c&oTwo Legged Terrors&7&o and collect their &e&oSamples&7&o.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Great! Let''s have a look.' + - '&7&oI should hear what &a&oPlautia Suilius&7&o has discovered.' +primis_terravilla_drowning_terror: + name: '&2Drowning terror' + questLore: + - My theory was correct. I dissected the growth and found + - an organism inside. After careful examination I have + - determined that the organism is of aquatic origin. And + - not only that, they are capable of hijacking the host's + - brain. Once ready to hatch they make the host go to the + - nearest water source and drown themselves. The organism + - can then freely hatch and swim away. Whatever is + - infecting the &cTwo Legged Terrors&f must be living in + - a nearby river. You should go there and collect a + - '&ePerfect Sample&f of whatever organism is causing this.' + - I do not know if this is something that can affect humans + - but just in case you should kill a few of the organisms + - to make sure. + questAcceptDialog: + - '&a[Plautia Suilius]&f Come back here once you have collected a &ePerfect Sample&f.' + - '&7&oI need to go to the nearby river and collect a &e&oPerfect Sample&7&o of whatever is causing the infections.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Wow it looks like a fish, but it''s internal organs are different.' + - It must infect other creatures by releasing these tiny worm like meat particles... + - Let me have a look at you. Hmm, you seem fine, no traces... + - + - + - + - + - + - '&7&oI should make sure to stay away from the river...' +primis_terravilla_hog_on_my_porch: + name: '&2Bipedal examination' + questLore: + - He is sitting on the darn lift again! + - I cannot believe it! You there! + - You look like you can handle a large beast. + - I will pay you good money if you can get rid + - of that &cAnnoying Large Hog&f that keeps sitting + - on the lift. How are we supposed to get goods + - up and down this way. + questAcceptDialog: + - '&a[Dorippa Sarimarcus]&f Get rid of that hog right down there, see it?' + - '&7&oI need to slay the &c&oAlpha Razorback&7&o.' + questCompleteMessage: + - '&a[Dorippa Sarimarcus]&f Finally! I can move on with my life now! Thank you!' +primis_terravilla_razorbag: + name: '&2Razorbag' + questLore: + - If you are looking for work I got some for ya. + - I design and make heavy duty bags that I sell + - here at my little shop. So I am in need of + - leather. Thankfully there are plenty of + - '&cRazorbacks&f around these parts. If you are' + - interested I would like to hire you to go hunt + - them for their leather. I would need a considerable + - amount of leather. So this won't be a quick job. + questAcceptDialog: + - '&a[Telestis Senna]&f You will mostly find them roaming around here and towards the fields area.' + - '&7&oI need to go hunt the &c&oMature Razorback&7&o.' + questCompleteMessage: + - '&a[Telestis Senna]&f Yep, that will do it. In pristine condition too! Here is your coin, as promised.' +primis_terravilla_terrifying: + name: '&2Terrifying' + questLore: + - Well that is concerning. The sample you brought shows + - that they are slowly being drained of their nutrients. + - My hypothesis is that there is most likely a parasite + - attached to them that is causing this. You should go + - out there again and see if you can find any large + - '&eGrowths&f on their bodies, and then cut them off' + - and bring them back here. + questAcceptDialog: + - '&a[Plautia Suilius]&f I would only need two &eGrowths&f no more than that.' + - '&7&oI need to slay &c&oTwo Legged Terrors&7&o and collect two &e&oGrowths&7&o.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Excellent, these should do it.' + - '&7&oI should hear what &a&oPlautia Suilius&7&o has managed to find.' +test_quest: + name: Kill the Test Boss + questLore: + - '&cEnd the test boss'' reign of terror!' +xmas_quest_0: + name: '&2Find the lost gifts!' + questLore: + - + - + - I will let you open one of them in return! + questAcceptDialog: + - '&8[&cSaint Nick&8]&f Thank you! I will be waiting here for you!' + questCompleteMessage: + - '&8[&cSaint Nick&8]&f Thank you for your help! There are still some lost gifts out there, talk to me again if you want to help out more!' diff --git a/src/main/resources/translations/french.yml b/src/main/resources/translations/french.yml new file mode 100644 index 000000000..37a7dbc63 --- /dev/null +++ b/src/main/resources/translations/french.yml @@ -0,0 +1,13253 @@ +config: + noArenaPermissionMessage: '[EliteMobs] Vous n''avez pas la permission d''entrer dans cette arène !' +ItemSettings: + itemLoreStructureV2: + - '&7&m&l---------&7<&lInfos d''Équipement&7>&m&l---------' + - '&7Item level: &f$itemLevel &7Prestige &6$prestigeLevel' + - '$weaponOrArmorStats' + - '$soulbindInfo' + - '$itemSource' + - '$ifLore&7&m&l-----------&7< &f&lLore&7 >&m&l-----------' + - '$customLore' + - '$ifEnchantments&7&m&l--------&7<&9&lEnchantements&7>&m&l--------' + - '$enchantments' + - '$eliteEnchantments' + - '$ifCustomEnchantments&7&m&l------&7< &3&lEnchantements personnalisés&7 >&m&l------' + - '$customEnchantments' + - '$ifPotionEffects&7&m&l----------&7< &5&lEffets&7 >&m&l----------' + - '$potionEffect' + - '&7&l&m-----------------------------' + - '$loreResaleValue' + shopSourceItemLores: '&7Acheté dans un magasin' + mobSourceItemLores: '&7Ramassé sur $mob' + loreWorths: '&7Vaut $worth $currencyName' + loreResaleValues: '&7Vendu pour $resale $currencyName' + eliteEnchantmentLoreStrings: Élite + noSoulbindLore: '&7Pas de lien d''âme !' + preventEliteItemDisenchantmentMessage: '&c[EliteMobs] Impossible de désenchanter les objets d''élite!' + scrapSucceededMessageV2: '&8[EliteMobs] &2Recyclage réussi $amount fois !' + scrapFailedMessageV2: '&8[EliteMobs] &2Recyclage échoué $amount fois !' + lowDurabilityItemDropMessage: '&8[EliteMobs] &cArme abandonnée en raison de sa faible durabilité ! &8Réparez-la au PNJ avec de la ferraille pour l''utiliser !' + lowWeaponItemDropMessage: '&8[EliteMobs] &cArme abandonnée en raison de sa faible durabilité ! &8Réparez-la au PNJ avec de la ferraille pour l''utiliser !' + simlootMessageSuccess: '&8[EliteMobs] &2Roulé pour butin et obtenu $itemName &2!' + simlootMessageFailure: '&8[EliteMobs] &cRoulé pour le butin et rien n''a été obtenu !' + directDropCustomLootMessage: '&8[EliteMobs] &2Obtenu $itemName &2!' + directDropMinecraftLootMessage: '&8[EliteMobs] $itemName &aObtenu !' + directDropCoinMessage: '&8[EliteMobs] &aObtenu &2$amount $currencyName &a !' + directDropSpecialMessage: '&8[EliteMobs] &2$amount $name &a obtenus !' + weaponEntry: '&7DPS sur Elite: &2$EDPS' + armorEntry: '&7Armure élite: &2$EDEF' +ProceduralItemGenerationSettings: + materialNames: + swordName: Épée + bowName: Arc + pickaxe: Pioche + spade: Bêche + hoe: Houe + axe: Hache + helmet: Casque + chestplate: Plastron + leggings: Jambières + boots: Bottes + shears: Cisailles + fishingRod: Canne à pêche + shield: Bouclier + trident: Trident + crossbow: Arbalète + nameFormats: + - '$verb $itemType du $adjective $noun' + - '$itemType du $adjective $noun' + - '$noun $adjective $verb $itemType' + - '$verb $itemType' + - '$adjective $verb $itemType' + - Le $verb-er + - Le $adjective $verb-er + nouns: + - MagmaGuy + - Aube + - Coucher du soleil + - Paradis + - Enfer + - Ange + - Archange + - Chérubins + - Séraphin + - Démon + - Fiélon + - Chauve-souris + - Poulet + - Vache + - Champimeuh + - Cochon + - Lapin + - Mouton + - Calamar + - Villageois + - Araignée venimeuse + - Enderman + - Ours Polaire + - Araignée + - Cochon Zombie + - Blaze + - Creeper + - Grand Gardien + - Endermite + - Évocateur + - Ghast + - Gardien + - Zombie Momifié + - Cube de Magma + - Shulker + - Silverfish + - Squelette + - Slime + - Vagabond + - Vex + - Vindicateur + - Sorcière + - Wither Squelette + - Zombie + - Âne + - Cheval + - Lama + - Mule + - Ocelot + - Loup + - Golem de fer + - Bonhomme de Neige + - Ender Dragon + - Wither + - Évocateur + - Perroquet + - Géant + - Lapin tueur + - Steve + - Wolfbane + - Chaos + - Aeon + - Dragon + - Sphynx + - Minotaure + - Hadès + - Oath + - Oathbreaker + - Déserteur + - Traqueur + - Jade + - Lumière + - Ténèbres + - Oubli + - Ombres + - Néant + - Xeno + - Zealot + - Zénith + - Soir + - Crépuscule + - Créature + - Créature d'élite + - Urist + - Nain + - Elfe + - Orc + - Gobelin + - Gnome + - Goliath + - Elfe Noir + - Humain + - Halfelin + - Demi-Orque + - Tyrannœil + - Flagelleur mental + - L'hibou-ours + - Bulette + - Le monstre rouillé + - Géant des collines + - Géant de pierre + - Géant de givre + - Géant de feu + - Géant des nuages + - Géant de tempête + - Kobold + - Liche + - Orc + - Umber Hulk + - Combattant + - Magicien + - Paladin + - L'évêque + - Garde + - Archer + - Mage + - Cravate + - Loup-garou + - Vampire + - Centaure + - Catfolk + - Demi-géant + - Ogre + - Troll + - Solitaire + - Barbare + - Barde + - Druide + - Moine + - Sorcier + - Démoniste + - Chasseur de démons + - Chevalier de la Mort + - Prêtre + - Chaman + - Guerrier + - Basilic + - Chimère + - Imp + - Dryade + - Gargouille + - Djinn + - Efreeti + - Fantôme + - Lutin + - Hydra + - Kraken + - Lamia + - Méduse + - Imiter + - Momie + - Pégase + - Roche + - Satyre + - Tarrasque + - Abomination + - Goule + - Tréant + - Licorne + - Spectre + - Acolyte + - Gladiateur + - Chevalier + - Griffon + - Pillard + - Éclaireur + - Espion + - Thg + - Noble + - Garde + - Vétéran + - Wyverne + - Abysses + - Infernal + - Élémentaire + - Tauren + - Pandaren + - Bigfoot + - Abandonné + - Yéti + - Banshee + - Arachnide + - Mort-vivant + - Elfe de la nuit + - Elfe de sang + - Draenei + - Worgen + - Chef de Guerre + - Sorcière + - Magi + - Sage + - Voleur + - Assassin + - Templier + - Dompteur + - Berserker + - Inventeur + - Luchador + - Pirate + - Avant-garde + - Lame du vide + - Mèche + - Paysan + - Valet de pied + - L'homme à l'épée + - Servitude + - Gangréné + - Chasseuse + - Chasseur + - Aarakorcra + - Abolit + - Déva + - Planet + - Solar + - Ankheg + - Azer + - Behir + - "Tyran de la mort \n" + - Brûlure + - Épouvantail + - Ours câlin + - Intimidateur + - Cambion + - Chuul + - Roi des liches + - Basilic + - Couatl + - Cyclope + - Titan + - Manteau sombre + - L'ancien + - Demilich + - Balor + - Barlgura + - Chasme + - Dretch + - Glabrezu + - Goristro + - Hezrou + - Mânes + - Marilith + - Nalfeshnee + - Quasit + - Vrock + - Yochlol + - Démon de la fosse + - Lémure + - Dracolich + - Sosie + - Dragon chromatique + - Drider + - élémentaire d'air + - élément de terre + - élément de feu + - élément d'eau + - Rohirrim + - Gondorien + - Empyréen + - Dragon féérique + - Ettin + - Flumph + - Fomorien + - Dao + - Gnoll + - Parshendi + - Auditeur + - Spren + - Père des tempêtes + - Rosharian + - Brightlord + - Haut prince + - Roi + - Empereur + - Tesson + - Liant de surtension + - Obligataire + - Golem + - Gorgone + - Guenaude + - Harpie + - Hippogriff + - Homunculus + - Alchimiste d'état + - Soldat Immortel + - Jackalwere + - Nothic + - Oni + - Rakshasa + - Revenant + - Fanatique + adjectives: + - Adorable + - Magnifique + - Propre + - Élégant + - Fantaisiste + - Glamour + - Charmant + - Long + - Superbe + - Simple + - Pittoresque + - Étincelant + - Laid + - Rouge + - Orange + - Jaune + - Vert + - Bleu + - Violet + - Gris + - Noir + - Blanc + - Mort + - Impaire + - Puissant + - Riche + - Vaste + - Zélé + - Assourdissant + - Décédé + - Mélodieux + - Calme + - Orageux + - Chuchotement + - Sifflant + - Ancien + - Vite + - Vieux + - Rapide + - Lent + - Pourri + - Effrayant + - Courbé + - Vide + - Lourd + - Exécrable + - Anormal + - Absurde + - Acceptable + - Accidentel + - Catégorique + - Aventureux + - Agoniser + - Alerte + - Ennuyé + - Ennuyant + - Anxieux + - Aromatique + - Agressif + - Distant + - Incroyable + - Ambigus + - Ambitieux + - Amusé + - Colérique + - Arrogant + - Honteux + - Inspirant + - Étonnant + - Propice + - Moyenne + - Impressionnant + - Terrible + - Mauvais + - Barbare + - Timide + - Convenable + - Belligérant + - Bénéfique + - Fou furieux + - Meilleur + - Perplexe + - Gros + - Bitter + - Bizarre + - Sanglant + - Ébullition + - Inaltérable + - Impétueux + - Courageux + - Musculeux + - Cassable + - Bref + - Lumineux + - Brisé + - Occupé + - Calcul en cours + - Insensible + - Calme + - Capricieux + - Prudent + - Imprudent + - Soucieux + - Prudent + - Incessant + - Certain + - Charmant + - Pas Cher + - Principal + - Froid + - Chevaleresque + - Gros + - Vidé + - Intelligent + - Isolé + - Maladroit + - Troublé + - Classe + - Colossal + - Combatif + - Commun + - Confus + - Condamné + - Cool + - Courageux + - Froussard + - Fou + - Lâche + - Cruel + - Câlin + - Curieux + - Mignon + - Endommagé + - Dommageable + - Dangereux + - Sombre + - Fringant + - Catégorique + - Profond + - Vaincu + - Défectueux + - Provocant + - Délicat + - Délicieux + - Exquis + - Démoniaque + - Délirant + - Dérangé + - Descriptif + - Diabolique + - Difficile + - Diligent + - Terrible + - Sale + - Catastrophique + - Dégoûté + - Dégoûtant + - Désabusé + - Distinct + - Perturbé + - Draconien + - Dramatique + - Maussade + - Dysfonctionnel + - Désireux + - Personnes âgées + - Électrique + - Élite + - Enchanté + - Enchanteur + - Énergétique + - Énorme + - Divertissant + - Enthousiaste + - Envieux + - Erratique + - Éthéré + - Évasive + - Excellent + - Excité + - Excitant + - Exotique + - Exubérant + - Fabuleux + - Dégradé + - Juste + - Fidèle + - 'Faux' + - Familié + - Célèbre + - Fanatique + - Fantastique + - Fasciné + - Gros + - Craintif + - Sans peur + - Faible + - Festif + - Féroce + - Crasseux + - Bien + - Pointilleux + - Premier + - Fixé + - Tape à l'oeil + - Parfait + - Fragile + - Désinvolte + - Fleuri + - Duveteux + - Flottant + - Mousseux + - Insensé + - Oublieux + - Fortuné + - Frêle + - Fragile + - Frénétique + - Gratuit + - Glace + - Frais + - Amical + - Effrayant + - Tâtonner + - Drôle + - Fourrure + - Furtif + - Flou + - Géant + - Offert + - Gigantesque + - Brillant + - Glorieux + - Divin + - Bon + - Maladroit + - Magnifique + - Gracieux + - Grandiose + - Reconnaissant + - Graisseux + - Super + - Glouton + - Deuil + - Sensationnel + - Grotesque + - Sale + - Horrible + - Grincheux + - Gardé + - Sans culpabilité + - Crédule + - Courageux + - Guttural + - Sanctifié + - Pendaison + - Malchanceux + - Content + - Harmonieux + - Haineux + - Sain + - Brise-cœur + - Céleste + - Atroce + - Utile + - Inutile + - Hésitant + - Hideux + - Hilarant + - Creux + - Sans-abri + - Honorable + - Horrible + - Hospitalier + - Énorme + - Lourdaud + - Humoristique + - Affamé + - Blessé + - Étouffé + - Hypnotisant + - Hystérique + - Icky + - Glacé + - Ignorant + - Malade + - Illégal + - Illustre + - Imaginaire + - Immense + - Imminent + - Impartial + - Imparfait + - Impoli + - Important + - Incandescent + - Incompétent + - Industriel + - Incroyable + - Pas cher + - Inconnu + - Innocent + - Inquisitif + - Insidieux + - Instinctif + - Intelligent + - Intéressant + - Invincible + - Furieux + - Démange + - Blasé + - Déchiqueté + - Jaloux + - Gai + - Joyeux + - Nerveux + - Juvénile + - Enthousiaste + - Gentil + - Coeur de coeur + - Connaissant + - Informé + - Connu + - Laborieux + - Boiteux + - Large + - Dernier + - Retard + - Ridicule + - Paresseux + - Maigre + - Léthal + - Lumière + - Petit + - Vivant + - Solitaire + - Bruyant + - Charmant + - Chanceux + - Magenta + - Magique + - Majestueux + - Malveillant + - Marqué + - Massif + - Merveilleux + - Méchant + - Médical + - Fondu + - Désordonné + - Puissant + - Militaire + - Stupide + - Mineur + - Brumeux + - Mixte + - Moderne + - Immobile + - Mystérieux + - Naïf + - Étroit + - Naturel + - Soigné + - Nécessaire + - Inutile + - Nécessiteux + - Nerveux + - Nouveau + - Agréable + - Normal + - Nostalgique + - Innombrable + - Obsolète + - Obtenable + - Océanique + - Démodé + - Omniscient + - Optimal + - Ordinaire + - Organique + - Exceptionnel + - Ovale + - Surcoté + - Douloureux + - Parallèle + - Pathétique + - Paisible + - Pénitent + - Parfait + - Périodique + - Petite + - Physique + - Rose + - Plastique + - Plaisant + - Inutile + - Poli + - Pauvre + - Précieux + - Premium + - Cadeau + - Joli + - Privé + - Productif + - Protectif + - Publique + - Problème + - Questionable + - Rapide + - Le plus rapide + - Rare + - Prêt + - Réel + - Rebelle + - Régulier + - Remarquable + - Responsable + - Romantique + - Round + - Royal + - Triste + - Sûr + - Salé + - Satisfaisant + - Effrayé + - Effrayant + - Scientifique + - Maigre + - Hurlant + - Deuxième + - D’occasion + - Secret + - Egoïste + - Séquacieux + - Sérieux + - Peu profond + - Tranchant + - Brillant + - Choquant + - Court + - Timide + - Malade + - Silencieux + - Soyeux + - Bête + - Simple + - Maigre + - Mince + - Visqueux + - Glissant + - Petit + - Intelligent + - Souriant + - Lisse + - Discret + - Doux + - Solide + - Spécial + - Spectaculaire + - Épicé + - Épineux + - Splendide + - Effrayant + - Impeccable + - Carré + - Jalonnement + - Permanent + - Stable + - Collant + - Étrange + - Rayé + - Fort + - Réussi + - Super + - Suprême + - Sucré + - Talentueux + - Grand + - Délicieux + - Temporaire + - Tendu + - Terrible + - Terrifiant + - Testé + - Reconnaissant + - Épais + - Mince + - Assoiffé + - Réfléchi + - Minuscule + - Fatigué + - Difficile + - Troublé + - 'Vrai' + - Laid + - Ultra + - Imprudent + - Désarmé + - Découvert + - Mauvaise santé + - Unique + - Inconnu + - Surnaturel + - Inutilisé + - Inhabituel + - Utilisé + - Utile + - Inutile + - De grande valeur + - Violent + - En attente + - Wandering + - Chaud + - Faible + - Riche + - Tout + - Sage + - Formidable + - En bois + - Inquiet + - Inutile + - Faux + - Menaçant + - Confiant + - Modeste + - Menaçant + verbs: + - Tranchant + - Coupe + - Aiguë + - Gratter + - Tuer + - Tuer + - Boucherie + - Détruire + - Chatouillement + - Enlacer + - Meurtre + - Claque + - Sifflant + - Voyageant + - Téléportation + - Clignotant + - Détruire + - Naufrager + - Clignoter + - Matérialiser + - Invoquer + - Questionner + - Curieux + - Plaider + - Demander + - Interroger + - Interroger + - Agresser + - Frappant + - Ambusquer + - Assaillir + - Se précipiter + - Assaut + - Bombarder + - Barrage + - Frapper + - Charger + - Écrasant + - Se battre + - Frapper + - Marteler + - Battement + - Combattant + - Accablant + - Raids + - S'attaquer + - Tir + - S'aventurer + - Craquer + - Rupture + - Brisant + - Bouleversant + - Fracturation + - Éclatement + - Pulvérisation + - Déchirure + - Déchirer + - Claquer + - Éclatement + - Explosif + - Dommageable + - Fragmenter + - Partage + - Fortifier + - Coup de coude + - Taper + - Bousculade + - Battant + - Buter + - Cliquetis + - Frappant + - Raclée + - Claquant + - Invocation + - Hurlement + - Mugissement + - Rugissement + - Changement + - Transformation + - Modification + - Tordant + - Mutant + - Distorsion + - Flou + - Ajustement + - Déformation + - Altérant + - Adaptation + - Évoluant + - Variant + - Chasser + - Après + - Suivant + - Traquage + - Ombre + - Traquer + - Boîtier + - Monture + - Ascendant + - Ascendant + - Houle + - Jaillissant + - Crête + - Collecte + - Rassemblement + - Palissade + - Fauchage + - Récolter + - Sauvegarde + - Protéger + - Camouflage + - Ensevelissement + - Enfermant + - Dissimulant + - Cacher + - Déguisement + - Masquage + - Enterrement + - Étouffant + - Brouiller + - Blindage + - Ombrage + - Scellage + - Envelopper + - Voilage + - Obscurcissant + - Traversant + - Gué + - Glissement + - Hurlement + - Gémissement + - Hurlement + - Hurlement + - Couinement + - Rugissement + - Pleur + - Brailler + - Hurlant + - Clivage + - Destruction + - Écaillage + - Couper + - Tranchage + - Coupure + - Partage + - Hachage + - Tranchant + - Déchirer + - Déchirure + - Éclaircie + - Recadrage + - Sculpter + - Dissection + - Piratage + - Perçant + - Sciage + - Rasage + - Tondre + - Minage + - Fouiller + - Excavation + - Creuser + - Forage + - Creuser + - Gougeage + - Tunnel + - Invasion + - Embarquement + - Wandering + - Infiltrant + - Intrus + - Evasion + - Fuyant + - Courir + - Esquive + - Collision + - Se battre + - Bagarre + - Lutte + - Bagarre + - Duel + - Bagarrer + - Jouter + - Combat + - Affrontement + - En guerre + - Grappling + - Abandon + - Attaquant + - Querelle + - Escarmouche + - Découverte + - Détection + - Attraper + - Résoudre + - Révéler + - Déterrement + - Saut + - Rebondir + - Jaillissant + - Voûte + - Encourageant + - Déferlement + - Barque + - Démarrage + - Coup de pied + - Capteurs + - Percevoir + - Détection + - Déclin + - Saignement + - Contraction + - Affaiblissement + - Décroissant + - Diminution + - Fonte + - Libérer + - Collecte + - Collecte + - Abattage + - Broyage + - Propulser + - Jogging + - Courir + - Quêtes + - Repérage + - Exploration + - Creuser + - Tremblant + - Cliquetis + - Séparation + - Piratage + - Rupture + - Sculpter + - Partage + - Division + - Rupture + - Scission + - Séparer + - Déchirer + - Déchirer + - Pâturage + - Emprisonner + - Grognant + - Virage + - Enchevêtrer + - Épingler + - Attraper + - Retenant + - Connexions + - Branchement + - Accrochage + - Arrachant + - Mise en cage + - Capturer + - Hanter + - Rampant + - Furtif + - Espionnage + - Venger + - Assaut + verb-ers (noun): + - Briseur de Monde + - Destructeur du Monde + - Vengeur + - Porte-cendres + - Chercheur de vent + - Profanateur + - Fureur du tonnerre + - Trancheur + - Entailleur + - Cutter + - Poignardeur + - Gratteur + - Tueur + - Pourfendeur + - Destructeur + - Hugger + - Meurtrier + - Slappeur + - Voyageur + - Téléporteur + - Clignoteur + - Démolisseur + - Matérialiseur + - Spawner + - Demander + - Assaillant + - Cogneur + - Embuscadeur + - Rusher + - Stormer + - Bombardier + - Barrager + - Smiter + - Chargeur + - Combattant + - Hammerer + - Batteur + - Combater + - Vainqueur + - Pillard + - Tackler + - Tireur + - Aventurier + - Fendoir + - Briseur + - Destructeur + - Fractureur + - Éclabousseur + - Pulvérisateur + - Déchireur + - Rendu + - Vivaneau + - Éclateur + - Exploseur + - Dommageur + - Fragmenteur + - Séparateur + - Fortifieur + - Nudger + - Tappeur + - Barrage + - Beurre + - Cliquetis + - Cogneur + - Batteur + - Prison + - Invoquateur + - Hurleur + - Shifter + - Transformateur + - Modifieur + - Ouragan + - Flou + - Warper + - Modificateur + - Adaptateur + - Évoluer + - Enchantement du Chasseur + - Bande-annonce + - Follower + - Harceleur + - Ombre + - Chasseur + - Caser + - Monteur + - Ascendeur + - Riser + - Springer + - Hoarder + - La Faucheuse + - Moissonneuse + - Tirelire + - Défenseur + - Dissimulateur + - Shrouder + - Encercleur + - Hider + - Masqueur + - Enterreur + - Clouder + - Shader + - Scelleur + - Enveloppeur + - Veilleur + - Traverseur + - Forder + - Planeur + - Hurleur + - Gémisseur + - Hurleur + - Couineur + - Braillard + - Hurleur + - Hachoir + - Déchiqueteur + - Snipper + - Séparateur + - Hacheur + - Entailleur + - Rendu + - Déchireur + - Plus mince + - Cultivateur + - Sculpteur + - Hacker + - Perceur + - Sawer + - Raseur + - Tondeur + - Mineur + - Excavater + - Fouisseur + - Foreur + - Tunneler + - Envahisseur + - Pensionnaire + - Vagabond + - Intrus + - Faufileur + - Coureur + - Esquiveur + - Cogneur + - Combattant + - Lutteur + - Échauffouré + - Dueliste + - Bagarreur + - Clasher + - Attrapeur + - Grattoir + - Attaquant + - Feuder + - Attrapeur + - Solveur + - Révélateur + - Sauteur + - Videur + - Voltigeur + - Entonnoir + - Chirurgien + - Parieur + - Dropkicker + - Percepteur + - Fader + - Saigneur + - Affaiblissant + - Faussaire + - Déclencheur + - Cueilleur + - Écrabouilleur + - Hélice + - Joggeur + - Sprinteur + - Éclaireur + - Explorateur + - Excavateur + - Trembleur + - Parter + - Hacker + - Sculpteur + - Diviseur + - Réducteur + - Briseur + - Rendu + - Éventreur + - Brouteur + - Prisionnier + - Coin + - Pinner + - Attrapeur + - Retenant + - Agrafe + - Accroc + - Pillard + - Cager + - Captureur + - Hanteur + - Creeper + - Basket + - Agrafe + - Prisonnier + - Séducteur + - Danseur + - Blasphémère + - Dévoreur + - Ronfleur + - Propulseur + - Slappeur +absorption: + name: Absorption +blindness: + name: Cécité +conduit_power: + name: Puissance de conduite +confusion: + name: Nausée +damage_resistance: + name: Résistance +dolphins_grace: + name: Grâce du dauphin +fast_digging: + name: Célérité +fire_resistance: + name: Résistance au feu +glowing: + name: Surbrillance +harm: + name: Dégâts instantanés +heal: + name: Soin instantané +health_boost: + name: Bonus de vie +hunger: + name: Faim +increase_damage: + name: Force +invisibility: + name: Invisibilité +jump: + name: Sauts améliorés +levitation: + name: Lévitation +luck: + name: Chance +night_vision: + name: Vision nocturne +poison: + name: Poison +regeneration: + name: Régénération +saturation: + name: Saturation +slow: + name: Lenteur +slow_digging: + name: Fatigue de minage +slow_falling: + name: Chute lente +speed: + name: Vitesse +unluck: + name: Malchance +water_breathing: + name: Respiration sous l'eau +weakness: + name: Faiblesse +wither: + name: Wither +translation: + Economy pay message v2: '&2Vous avez payé &2$amount_sent $currency_name &2à $receiver&2, qui a reçu $amount_received après les taxes !' + Economy currency left message: Vous avez maintenant &2$amount_left $currency_name + Economy money from payment message: Vous avez reçu &2$amount_received $currency_name &de $sender + Economy payment insuficient currency: '&cVous n''avez pas assez de $currency_name pour faire ça !' + Wallet command message: Vous avez &2$balance $currency_name + Tax confirmation message: '&cEnvoyer un paiement coûtera $percentage% de taxes. &aFaites &9$command &apour continuer !' + shopBatchSellItem: '&aVous avez vendu vos items &apour $currency_amount $currency_name!' + Shop buy message: '&aVous avez acheté $item_name &apour $item_value $currency_name!' + Shop current balance message: '&aVous avez $currency_amount $currency_name.' + Shop insufficient funds message: '&cVous n''avez pas assez de $currency_name!' + Shop item cost message: Cet article coûte &c$item_value $currency_name. + Shop sell message: '&aVous avez vendu $item_name &apour $currency_amount $currency_name!' + Shop sale player items warning: '&cVous ne pouvez pas vendre des objets qui ne sont pas liés à vous ! Ça inclut les objets d''autres paliers de prestige !' + Shop sale instructions: '&cVous pouvez vendre le butin d'' EliteMobs seulement ici ! (Les armes et armures lâchées par les élites montrent une valeur dans leur description)' + Teleport time left: '&7[EM] Téléportation dans &a$time &7secondes...' + Teleport cancelled: '&7[EM] &cTéléportation interrompue!' + noPendingCommands: '&cVous n''avez aucune commande en attente !' + trackMessage: Suivre le $name + chestLowRankMessage: '&7[EM] &cVotre niveau de guilde doit être d''au moins $rank &cpour ouvrir ce coffre !' + chestCooldownMessage: '&7[EM] &cVous avez déjà ouvert ce coffre récemment ! Attendez $time!' + insufficientCurrencyForWormholeMessage: '&8[EliteMobs] &cMonnaie insuffisante ! Vous avez besoin de $amount pour utiliser ce com.maguy.elitemobs.wormhole!' + dismissEMMessage: '&8[EliteMobs] &2/elitemobs &fmenu ne fonctionne pas pour vous ? Essayez &2/elitemobs alt &fpour voir une version alternative du menu ! &cVous ne voulez plus voir ce message ? &4/em dismiss' + switchEMStyleMessage: '&8[EliteMobs] &2/elitemobs &fmenu changé ! Vérifiez-le!' +EconomySettings: + currencyName: Elite Coins + chatCurrencyShowerMessage: '&7[EM] Vous avez ramassé &a$amount $currency_name!' + actionbarCurrencyShowerMessage: '&7[EM] Vous avez ramassé &a$amount $currency_name!' + adventurersGuildNotificationMessages: '&7[EM] Trop d''argent? Essayez &a/em !' +arrow_damage: + name: Puissance +arrow_fire: + name: Flamme +arrow_infinite: + name: Infinité +arrow_knockback: + name: Recul +binding_curse: + name: Malédiction du Lien Éternel +channeling: + name: Canalisation +critical_strikes: + name: Coup critique + criticalHitPopup: '&5Coup critique !' +damage_all: + name: Tranchant +damage_arthropods: + name: Fléau des Arthropodes +damage_undead: + name: Châtiment +depth_strider: + name: Agilité Aquatique +dig_speed: + name: Efficacité +drilling: + name: Forage +durability: + name: Solidité +earthquake: + name: Séisme + earthquakeActivationMessage: '&8[EliteMobs] &aSéisme déclenché ! &c2 min de temps de relance !' + earthquakeAvailableMessage: '&8[EliteMobs] &2Rechargement de séisme terminé !' +fire_aspect: + name: Aura de feu +flamethrower: + name: Lance-flammes +frost_walker: + name: Semelles givrantes +grappling_hook: + name: Grappin +hunter: + name: Chasseur +ice_breaker: + name: Brise-glace +impaling: + name: Empalement +knockback: + name: Recul +lightning: + name: Éclair +loot_bonus_blocks: + name: Fortune +loot_bonus_mobs: + name: Butin +loud_strikes: + name: Coups violents +loyalty: + name: Loyauté +lure: + name: Appât +mending: + name: Raccommodage +meteor_shower: + name: Pluie de météorites +multishot: + name: Tir multiple +oxygen: + name: Apnée +piercing: + name: Perçant +plasma_boots: + name: Bottes plasma +protection_environmental: + name: Protection +protection_explosions: + name: Protection contre les explosions +protection_fall: + name: Chute amortie +protection_fire: + name: Protection contre le Feu +protection_projectile: + name: Protection contre les projectiles +quick_charge: + name: Charge Rapide +riptide: + name: Riptide +silk_touch: + name: Toucher de soie +soulbind: + name: Lien d'âme + loreStrings: '&7Lien d''âme à &f$player' + hologramString: '$player' +summon_merchant: + name: Invoquer le marchand + message: Jeeves! +summon_wolf: + name: Invoquer le loup +sweeping_edge: + name: Bordure balayante +thorns: + name: Épines +unbind: + name: Délier +vanishing_curse: + name: Malédiction de la disparition +water_worker: + name: Affinité Aquatique +AntiExploit: + AntiExploit message: '&c[EM AntiExploit] &7Élite proche ne lâchera pas de butin spécial.' +CombatTag: + Combat tag message: '&c[EliteMobs] Balise de combat activée!' +AdventurersGuild: + adventurersGuildMenuName: '&6&lLe lieu des aventuriers' + Prestige 0 rank 0: '&8Commoner - désactive les élites !' + Prestige 0 rank 0 short placeholder: '&6&l✧&e0' + Prestige 0 rank 1: '&fDébutant' + Prestige 0 rank 1 short placeholder: '&6&l✧&eⅠ' + Prestige 0 rank 2: '&fNovice' + Prestige 0 rank 2 short placeholder: '&6&l✧&eⅠⅠ' + Prestige 0 rank 3: '&fApprenti' + Prestige 0 rank 3 short placeholder: '&6&l✧&eⅠⅠⅠ' + Prestige 0 rank 4: '&2Aventurier' + Prestige 0 rank 4 short placeholder: '&6&l✧&eⅠⅤ' + Prestige 0 rank 5: '&2Voyageur' + Prestige 0 rank 5 short placeholder: '&6&l✧&eⅤ' + Prestige 0 rank 6: '&2Adepte' + Prestige 0 rank 6 short placeholder: '&6&l✧&eⅤⅠ' + Prestige 0 rank 7: '&1Vétéran' + Prestige 0 rank 7 short placeholder: '&6&l✧&eⅤⅠⅠ' + Prestige 0 rank 8: '&1Élite' + Prestige 0 rank 8 short placeholder: '&6&l✧&eⅤⅠⅠⅠ' + Prestige 0 rank 9: '&lMaître' + Prestige 0 rank 9 short placeholder: '&6&l✧&eⅠⅩ' + Prestige 0 rank 10: '&5Héro' + Prestige 0 rank 10 short placeholder: '&6&l✧&eⅩ' + Prestige 1 rank 0: '&ePrestige 1 &8Roturier' + Prestige 1 rank 0 short placeholder: '&e⚜Ⅰ&6&l✧&e0' + Prestige 1 rank 1: '&ePrestige 1 &fDébutant' + Prestige 1 rank 1 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠ' + Prestige 1 rank 2: '&ePrestige 1 &fNovice' + Prestige 1 rank 2 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅠ' + Prestige 1 rank 3: '&ePrestige 1 &fApprenti' + Prestige 1 rank 3 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅠⅠ' + Prestige 1 rank 4: '&ePrestige 1 &2Aventurier' + Prestige 1 rank 4 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅤ' + Prestige 1 rank 5: '&ePrestige 1 &2Voyageur' + Prestige 1 rank 5 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤ' + Prestige 1 rank 6: '&ePrestige 1 &2Adepte' + Prestige 1 rank 6 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠ' + Prestige 1 rank 7: '&ePrestige 1 &1Vétéran' + Prestige 1 rank 7 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠⅠ' + Prestige 1 rank 8: '&ePrestige 1 & 1Élite' + Prestige 1 rank 8 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠⅠⅠ' + Prestige 1 rank 9: '&ePrestige 1 &5Maitre' + Prestige 1 rank 9 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅩ' + Prestige 1 rank 10 short placeholder: '&e⚜Ⅰ&6&l✧&eⅩ' + Prestige 1 rank 10: '&ePrestige 1 &5Héro' + Prestige 1 rank 11: '&ePrestige 1 &5Légende' + Prestige 1 rank 11 short placeholder: '&e⚜Ⅰ&6&l✧&eⅩⅠ' + Prestige 2 rank 0: '&2Prestige 2 &8Roturier' + Prestige 2 rank 0 short placeholder: '&2⚜ⅠⅠ&6&l✧&e0' + Prestige 2 rank 1: '&2Prestige 2 &fDébutant' + Prestige 2 rank 1 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠ' + Prestige 2 rank 2: '&2Prestige 2 &fNovice' + Prestige 2 rank 2 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅠ' + Prestige 2 rank 3: '&2Prestige 2 &fApprenti' + Prestige 2 rank 3 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 2 rank 4: '&2Prestige 2 &2Aventurier' + Prestige 2 rank 4 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅤ' + Prestige 2 rank 5: '&2Prestige 2 &2Voyageur' + Prestige 2 rank 5 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤ' + Prestige 2 rank 6: '&2Prestige 2 &2Adepte' + Prestige 2 rank 6 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠ' + Prestige 2 rank 7: '&2Prestige 2 &1Vétéran' + Prestige 2 rank 7 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 2 rank 8: '&2Prestige 2 &1Élite' + Prestige 2 rank 8 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 2 rank 9: '&2Prestige 2 &5Maitre' + Prestige 2 rank 9 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅩ' + Prestige 2 rank 10 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩ' + Prestige 2 rank 10: '&2Prestige 2 &5Héro' + Prestige 2 rank 11: '&2Prestige 2 &5Légende' + Prestige 2 rank 11 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩⅠ' + Prestige 2 rank 12: '&2Prestige 2 &5Mythe' + Prestige 2 rank 12 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 3 rank 0: '&aPrestige 3 &8Roturier' + Prestige 3 rank 0 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&e0' + Prestige 3 rank 1: '&aPrestige 3 &fDébutant' + Prestige 3 rank 1 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠ' + Prestige 3 rank 2: '&aPrestige 3 &fNovice' + Prestige 3 rank 2 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠ' + Prestige 3 rank 3: '&aPrestige 3 &fApprenti' + Prestige 3 rank 3 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 3 rank 4: '&aPrestige 3 &2Aventurier' + Prestige 3 rank 4 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅤ' + Prestige 3 rank 5: '&aPrestige 3 &2Voyageur' + Prestige 3 rank 5 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤ' + Prestige 3 rank 6: '&aPrestige 3 &2Adepte' + Prestige 3 rank 6 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠ' + Prestige 3 rank 7: '&aPrestige 3 &1Vétéran' + Prestige 3 rank 7 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 3 rank 8: '&aPrestige 3 &1Élite' + Prestige 3 rank 8 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 3 rank 9: '&aPrestige 3 &5Maitre' + Prestige 3 rank 9 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅩ' + Prestige 3 rank 10 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩ' + Prestige 3 rank 10: '&aPrestige 3 &5Héro' + Prestige 3 rank 11: '&aPrestige 3 &5Légende' + Prestige 3 rank 11 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠ' + Prestige 3 rank 12: '&aPrestige 3 &5Mythe' + Prestige 3 rank 12 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 3 rank 13: '&aPrestige 3 &5Immortel' + Prestige 3 rank 13 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 4 rank 0: '&3Prestige 4 &8Roturier' + Prestige 4 rank 0 short placeholder: '&3⚜ⅠⅤ&6&l✧&e0' + Prestige 4 rank 1: '&3Prestige 4 &fDébutant' + Prestige 4 rank 1 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠ' + Prestige 4 rank 2: '&3Prestige 4 &fNovice' + Prestige 4 rank 2 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅠ' + Prestige 4 rank 3: '&3Prestige 4 &fApprenti' + Prestige 4 rank 3 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅠⅠ' + Prestige 4 rank 4: '&3Prestige 4 &2Aventurier' + Prestige 4 rank 4 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅤ' + Prestige 4 rank 5: '&3Prestige 4 &2Voyageur' + Prestige 4 rank 5 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤ' + Prestige 4 rank 6: '&3Prestige 4 &2Adepte' + Prestige 4 rank 6 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠ' + Prestige 4 rank 7: '&3Prestige 4 &1Vétéran' + Prestige 4 rank 7 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠⅠ' + Prestige 4 rank 8: '&3Prestige 4 &1Élite' + Prestige 4 rank 8 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠⅠⅠ' + Prestige 4 rank 9: '&3Prestige 4 &5Maitre' + Prestige 4 rank 9 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅩ' + Prestige 4 rank 10 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩ' + Prestige 4 rank 10: '&3Prestige 4 &5Héro' + Prestige 4 rank 11: '&3Prestige 4 &5Légende' + Prestige 4 rank 11 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠ' + Prestige 4 rank 12: '&3Prestige 4 &5Mythe' + Prestige 4 rank 12 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅠ' + Prestige 4 rank 13: '&3Prestige 4 &5Immortel' + Prestige 4 rank 13 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅠⅠ' + Prestige 4 rank 14: '&3Prestige 4 &5Choisi' + Prestige 4 rank 14 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅤ' + Prestige 5 rank 0: '&bPrestige 5 &8Roturier' + Prestige 5 rank 0 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 5 rank 1: '&bPrestige 5 &fDébutant' + Prestige 5 rank 1 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠ' + Prestige 5 rank 2: '&bPrestige 5 &fNovice' + Prestige 5 rank 2 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅠ' + Prestige 5 rank 3: '&bPrestige 5 &fApprenti' + Prestige 5 rank 3 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅠⅠ' + Prestige 5 rank 4: '&bPrestige 5 &2Aventurier' + Prestige 5 rank 4 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅤ' + Prestige 5 rank 5: '&bPrestige 5 &2Voyageur' + Prestige 5 rank 5 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤ' + Prestige 5 rank 6: '&bPrestige 5 &2Adepte' + Prestige 5 rank 6 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠ' + Prestige 5 rank 7: '&bPrestige 5 &1Vétéran' + Prestige 5 rank 7 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠⅠ' + Prestige 5 rank 8: '&bPrestige 5 &1Élite' + Prestige 5 rank 8 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠⅠⅠ' + Prestige 5 rank 9: '&bPrestige 5 &5Maitre' + Prestige 5 rank 9 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅩ' + Prestige 5 rank 10 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩ' + Prestige 5 rank 10: '&bPrestige 5 &5Héro' + Prestige 5 rank 11: '&bPrestige 5 &5Légende' + Prestige 5 rank 11 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠ' + Prestige 5 rank 12: '&bPrestige 5 &5Mythe' + Prestige 5 rank 12 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅠ' + Prestige 5 rank 13: '&bPrestige 5 &5Immortel' + Prestige 5 rank 13 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅠⅠ' + Prestige 5 rank 14: '&bPrestige 5 &5Choisi' + Prestige 5 rank 14 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅤ' + Prestige 5 rank 15: '&bPrestige 5 &5Ascendant' + Prestige 5 rank 15 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅤ' + Prestige 6 rank 0: '&4Prestige 6 &8Roturier' + Prestige 6 rank 0 short placeholder: '&4⚜ⅤⅠ&6&l✧&e0' + Prestige 6 rank 1: '&4Prestige 6 &fDébutant' + Prestige 6 rank 1 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠ' + Prestige 6 rank 2: '&4Prestige 6 &fNovice' + Prestige 6 rank 2 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅠ' + Prestige 6 rank 3: '&4Prestige 6 &fApprenti' + Prestige 6 rank 3 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅠⅠ' + Prestige 6 rank 4: '&4Prestige 6 &2Aventurier' + Prestige 6 rank 4 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅤ' + Prestige 6 rank 5: '&4Prestige 6 &2Voyageur' + Prestige 6 rank 5 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤ' + Prestige 6 rank 6: '&4Prestige 6 &2Adepte' + Prestige 6 rank 6 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠ' + Prestige 6 rank 7: '&4Prestige 6 &1Vétéran' + Prestige 6 rank 7 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠⅠ' + Prestige 6 rank 8: '&4Prestige 6 &1Élite' + Prestige 6 rank 8 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 6 rank 9: '&4Prestige 6 &5Maitre' + Prestige 6 rank 9 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅩ' + Prestige 6 rank 10 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩ' + Prestige 6 rank 10: '&4Prestige 6 &5Héro' + Prestige 6 rank 11: '&4Prestige 6 &5Légende' + Prestige 6 rank 11 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠ' + Prestige 6 rank 12: '&4Prestige 6 &5Mythe' + Prestige 6 rank 12 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠ' + Prestige 6 rank 13: '&4Prestige 6 &5Immortel' + Prestige 6 rank 13 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 6 rank 14: '&4Prestige 6 &5Choisi' + Prestige 6 rank 14 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅤ' + Prestige 6 rank 15: '&4Prestige 6 &5Ascendant' + Prestige 6 rank 15 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤ' + Prestige 6 rank 16: '&4Prestige 6 &5Titan' + Prestige 6 rank 16 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤⅠ' + Prestige 7 rank 0: '&cPrestige 7 &8Roturier' + Prestige 7 rank 0 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&e0' + Prestige 7 rank 1: '&cPrestige 7 &fDébutant' + Prestige 7 rank 1 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠ' + Prestige 7 rank 2: '&cPrestige 7 &fNovice' + Prestige 7 rank 2 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅠ' + Prestige 7 rank 3: '&cPrestige 7 &fApprenti' + Prestige 7 rank 3 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 7 rank 4: '&cPrestige 7 &2Aventurier' + Prestige 7 rank 4 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅤ' + Prestige 7 rank 5: '&cPrestige 7 &2Voyageur' + Prestige 7 rank 5 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤ' + Prestige 7 rank 6: '&cPrestige 7 &2Adepte' + Prestige 7 rank 6 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠ' + Prestige 7 rank 7: '&cPrestige 7 &1Vétéran' + Prestige 7 rank 7 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 7 rank 8: '&ePrestige 7 & 1Élite' + Prestige 7 rank 8 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 7 rank 9: '&cPrestige 7 &5Maitre' + Prestige 7 rank 9 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅩ' + Prestige 7 rank 10 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩ' + Prestige 7 rank 10: '&cPrestige 7 &5Héro' + Prestige 7 rank 11: '&cPrestige 7 &5Légende' + Prestige 7 rank 11 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠ' + Prestige 7 rank 12: '&cPrestige 7 &5Mythe' + Prestige 7 rank 12 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 7 rank 13: '&cPrestige 7 &5Immortel' + Prestige 7 rank 13 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 7 rank 14: '&cPrestige 7 &5Choisi' + Prestige 7 rank 14 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅤ' + Prestige 7 rank 15: '&cPrestige 7 &5 Ascendant' + Prestige 7 rank 15 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤ' + Prestige 7 rank 16: '&cPrestige 7 &5Titan' + Prestige 7 rank 16 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤⅠ' + Prestige 7 rank 17: '&cPrestige 7 &5Demi-dieu' + Prestige 7 rank 17 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤⅠⅠ' + Prestige 8 rank 0: '&9Prestige 8 &8Roturier' + Prestige 8 rank 0 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&e0' + Prestige 8 rank 1: '&9Prestige 8 &fDébutant' + Prestige 8 rank 1 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠ' + Prestige 8 rank 2: '&9Prestige 8 &fNovice' + Prestige 8 rank 2 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅠ' + Prestige 8 rank 3: '&9Prestige 8 &fApprenti' + Prestige 8 rank 3 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 8 rank 4: '&9Prestige 8 &2Aventurier' + Prestige 8 rank 4 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅤ' + Prestige 8 rank 5: '&9Prestige 8 &2Voyageur' + Prestige 8 rank 5 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤ' + Prestige 8 rank 6: '&9Prestige 8 &2Adepte' + Prestige 8 rank 6 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠ' + Prestige 8 rank 7: '&9Prestige 8 &1Vétéran' + Prestige 8 rank 7 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 8 rank 8: '&9Prestige 8 &1Élite' + Prestige 8 rank 8 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 8 rank 9: '&9Prestige 8 &5Maitre' + Prestige 8 rank 9 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅩ' + Prestige 8 rank 10 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩ' + Prestige 8 rank 10: '&9Prestige 8 &5Héro' + Prestige 8 rank 11: '&9Prestige 8 &5Légende' + Prestige 8 rank 11 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠ' + Prestige 8 rank 12: '&9Prestige 8 &5Mythe' + Prestige 8 rank 12 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 8 rank 13: '&9Prestige 8 &5Immortel' + Prestige 8 rank 13 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 8 rank 14: '&9Prestige 8 &5Choisi' + Prestige 8 rank 14 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅤ' + Prestige 8 rank 15: '&9Prestige 8 &5Ascendant' + Prestige 8 rank 15 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤ' + Prestige 8 rank 16: '&9Prestige 8 &5Titan' + Prestige 8 rank 16 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠ' + Prestige 8 rank 17: '&9Prestige 8 &5Demi-dieu' + Prestige 8 rank 17 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠⅠ' + Prestige 8 rank 18: '&9Prestige 8 &5Dieu' + Prestige 8 rank 18 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 9 rank 0: '&dPrestige 9 &8Roturier' + Prestige 9 rank 0 short placeholder: '&d⚜ⅠⅩ&6&l✧&e0' + Prestige 9 rank 1: '&dPrestige 9 &fDébutant' + Prestige 9 rank 1 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠ' + Prestige 9 rank 2: '&dPrestige 9 &fNovice' + Prestige 9 rank 2 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅠ' + Prestige 9 rank 3: '&dPrestige 9 &fApprenti' + Prestige 9 rank 3 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅠⅠ' + Prestige 9 rank 4: '&dPrestige 9 &2Aventurier' + Prestige 9 rank 4 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅤ' + Prestige 9 rank 5: '&dPrestige 9 &2Voyageur' + Prestige 9 rank 5 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤ' + Prestige 9 rank 6: '&dPrestige 9 &2Adepte' + Prestige 9 rank 6 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠ' + Prestige 9 rank 7: '&dPrestige 9 &1Vétéran' + Prestige 9 rank 7 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠⅠ' + Prestige 9 rank 8: '&dPrestige 9 &1Élite' + Prestige 9 rank 8 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠⅠⅠ' + Prestige 9 rank 9: '&dPrestige 9 &5Maitre' + Prestige 9 rank 9 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅩ' + Prestige 9 rank 10 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩ' + Prestige 9 rank 10: '&dPrestige 9 &5Héro' + Prestige 9 rank 11: '&dPrestige 9 &5Légende' + Prestige 9 rank 11 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠ' + Prestige 9 rank 12: '&dPrestige 9 &5Mythe' + Prestige 9 rank 12 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅠ' + Prestige 9 rank 13: '&dPrestige 9 &5Immortel' + Prestige 9 rank 13 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅠⅠ' + Prestige 9 rank 14: '&dPrestige 9 &5Choisi' + Prestige 9 rank 14 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅤ' + Prestige 9 rank 15: '&dPrestige 9 &5Ascendant' + Prestige 9 rank 15 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤ' + Prestige 9 rank 16: '&dPrestige 9 &5Titan' + Prestige 9 rank 16 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠ' + Prestige 9 rank 17: '&dPrestige 9 &5Demi-dieu' + Prestige 9 rank 17 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠⅠ' + Prestige 9 rank 18: '&dPrestige 9 &5Dieu' + Prestige 9 rank 18 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 9 rank 19: '&dPrestige 9 &5Chasseur de dieux' + Prestige 9 rank 19 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅩ' + Prestige 10 rank 0: '&5Prestige 10 &8Roturier' + Prestige 10 rank 0 short placeholder: '&5⚜Ⅹ&6&l✧&e0' + Prestige 10 rank 1: '&5Prestige 10 &fDébutant' + Prestige 10 rank 1 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠ' + Prestige 10 rank 2: '&5Prestige 10 &fNovice' + Prestige 10 rank 2 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠ' + Prestige 10 rank 3: '&5Prestige 10 &fApprenti' + Prestige 10 rank 3 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠⅠ' + Prestige 10 rank 4: '&5Prestige 10 &2Aventurier' + Prestige 10 rank 4 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅤ' + Prestige 10 rank 5: '&5Prestige 10 &2Voyageur' + Prestige 10 rank 5 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤ' + Prestige 10 rank 6: '&5Prestige 10 &2Adepte' + Prestige 10 rank 6 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠ' + Prestige 10 rank 7: '&5Prestige 10 &1Vétéran' + Prestige 10 rank 7 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠ' + Prestige 10 rank 8: '&5Prestige 10 &1Élite' + Prestige 10 rank 8 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠⅠ' + Prestige 10 rank 9: '&5Prestige 10 &5Maitre' + Prestige 10 rank 9 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅩ' + Prestige 10 rank 10 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩ' + Prestige 10 rank 10: '&5Prestige 10 &5Héro' + Prestige 10 rank 11: '&5Prestige 10 &5Légende' + Prestige 10 rank 11 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠ' + Prestige 10 rank 12: '&5Prestige 10 &5Mythe' + Prestige 10 rank 12 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅠ' + Prestige 10 rank 13: '&5Prestige 10 &5Immortel' + Prestige 10 rank 13 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅠⅠ' + Prestige 10 rank 14: '&5Prestige 10 &5Choisi' + Prestige 10 rank 14 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅤ' + Prestige 10 rank 15: '&5Prestige 10 &5Ascendant' + Prestige 10 rank 15 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤ' + Prestige 10 rank 16: '&5Prestige 10 &5Titan' + Prestige 10 rank 16 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠ' + Prestige 10 rank 17: '&5Prestige 10 &5Demi-dieu' + Prestige 10 rank 17 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠⅠ' + Prestige 10 rank 18: '&5Prestige 10 &5Dieu' + Prestige 10 rank 18 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 10 rank 19: '&5Prestige 10 &5Dieu chasseur' + Prestige 10 rank 19 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅩ' + Prestige 10 rank 20: '&5Prestige 10 &5Dieu tueur' + Prestige 10 rank 20 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅩ' + lootLimiterMessage: '&7[EM] &cVous devez débloquer le prochain rang de guilde avec /ag pour ramasser de meilleurs objets !' + prestigeUnlockMessageTitle: '$player' + prestigeUnlockMessageSubtitle: '&2a déverrouillé $tier&2!' +buy_or_sell_menu: + Shop name: '[EM] Acheter ou vendre' +custom_quest_screen: + headerTextLines2: | + &a&l『&c&l$questName&a&l』 + acceptTextLines: '&a&l[Accepter!]' + acceptHoverLines: "&aClique pour \n&aaccepter la quête!" + acceptedTextLines: '&2&lAccepté ! &aRetournez avec $npcName &4[Abandon]' + acceptedHoverLines: '&aCliquez pour abandonner la quête !' + trackTextLines: '&2&l[Traquer]' + trackHoverLines: '&aCliquez pour suivre la quête !' + untrackTextLines: '&4&l[Ne plus traquer]' + untrackHoverLines: '&cCliquez pour annuler le suivi de quête !' + completedTextLines: '&2&l[Soumettre!]' + completedHoverLines: '&aCliquez pour suivre la quête !' + turnedInTextLines: '&8[Terminé !]' + turnedInHoverLines: '&8Déjà suivie!' + objectivesLine: '&c&lObjectifs:' + killQuestDefaultSummaryLine: '&c➤Tuer $name:$color$current&0/$color$target' + fetchQuestDefaultSummaryLine: '&c➤Obtenir $name:$color&$current&0/$color$target' + dialogQuestDefaultSummaryLine: '&c➤Allez parler à $name $location' + rewardsLine: '&2&lRécompenses:' + rewardsDefaultSummaryLine: '&2➤$amountx $rewardName &8($chance%)' +custom_shop_menu: + Shop name: '[EM] Boutique personnalisée' + Full inventory message: '[EliteMobs] &4Votre inventaire est plein! Vous ne pouvez pas acheter d''objets tant que vous n''avez pas de place libre.' +dynamic_quest_screen: + questName: Terrassez $amount $name + headerTextLines2: |- + &c&lRequête de guilde! + &0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ + defaultLoreTextLines: '&Terrassez $amount $name!' + acceptTextLines: '&a&lAccepter!' + acceptHoverLines: "&aClique pour \n&aaccepter la quête!" + acceptedTextLines: '&2&lAcceptée! &4[Abandonner]' + acceptedHoverLines: '&aCliquez pour abandonner la quête !' + completedTextLines: '&2&l[Soumettre!]' + completedHoverLines: '&aCliquez pour suivre la quête !' + turnedInTextLines: '&8[Terminé !]' + turnedInHoverLines: '&8Déjà soumis!' + objectivesLine: '&c&lObjectifs:' + killQuestDefaultSummaryLine: '&c➤Tuer $name:$color$current&0/$color$target' + rewardsLine: '&2&lRécompenses :' + rewardsDefaultSummaryLine: '&2➤$amountx $rewardName &8($chance%)' +enhancement_menu: + shopName: '[EM] Menu d''amélioration !' +get_loot_menu: + Menu name: '[EM] Menu Getloot' + tierTranslation: Niveau + itemFilterTranslation: Filtrer par objets de ce niveau. +guild_rank_selector_menu: + questTierSelectorMenuTitle: '[EM] Sélection du rang de guilde' + lowTierWarning: '&cLes élites ne peuvent pas lâcher un meilleur butin !' + normalTierWarning: '&aElite peut donner de meilleurs butins !' + notEnoughCurrencyMessages: '&7[EliteMobs] &4Vous n''avez pas assez d''Elite coins ($neededAmount $currencyName)! Vendez des loots Elite Mob [/em shop]! Vous avez $currentAmount $currencyName.' + unlockMessages: "&7[EliteMobs] &aVous avez débloqué le $rankName &arank pour $price\\ \\ $currencyName. \n&6Bonne chasse !" + questCompleteBroadcastMessages: '&7[EliteMobs] &a$player &aa a atteint le rang $rankName &aguild !' + failedMessages: '&7[EliteMobs] &cVous devez d''abord débloquer d''autres rangs !' + spawnRateModifierMessages: '&fChangeur de taux d''apparition des créatures d''élite : &c$modifier%' + lootModifierMessages: '&fChangeur de taux de loot Elite Mob : &c$modifier%' + difficultyModifierMessages: '&fModificateur de difficulté d''Elite Mob : &c$modifier%' + lootTierMessages: '&2Les élites peuvent déposer jusqu''à un butin de niveau de $tier!' + currencyBonusMessages: '&a$amountx% pièces provenant de drops et de quêtes !' + healthBonusMessages: '&cAjoute $amount ❤ de santé max' + critBonusMessages: '&eAjoute $amount% de chance de critique' + dodgeBonusMessages: '&8Augmente de $amount% les chances d''esquiver' +player_status_screen: + indexTexts0: '&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + indexTexts1: '&5&l/ag &7- &6Hub EliteMobs' + indexHovers1: |- + CLIQUEZ POUR UTILISER + L'endroit où vous pouvez trouver + Les PNJ qui donnent des quêtes, acheter et + vendre des objets, donner des conseils et plus encore ! + indexTexts2: '&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + indexTexts4: '&6&lIndex' + indexTexts6: '&bp. $statsPage &8- &6Statistiques' + indexHovers6: Cliquez pour y aller! + indexTexts7: '&bp. $gearPage &8- &6Équipement' + indexHovers7: Cliquez pour y aller! + indexTexts8: '&bp. $teleportsPage &8- &6Téléportations' + indexHovers8: Cliquez pour y aller! + indexTexts9: '&bp. $commandsPage &8- &6Commandes' + indexHovers9: Cliquez pour y aller! + indexTexts10: '&bp. $questsPage &8- &6Suivi des quêtes' + indexHovers10: Cliquez pour y aller! + indexTexts11: '&bp. $bossTrackingPage &8- &6Suivi du Boss' + indexHovers11: Cliquez pour y aller! + statsText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + statsText1: '&5&lStatistiques du joueur :' + statsText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + statsText4: '&2Argent: &a$money' + statsHover4: |- + Tuez des monstres d'élite pour avoir de l'argent ou + vendre leurs drops dans /em shop ou + compléter des quêtes dans /em quest! + statsText6: '&6Niveau de Guilde : &3$guildtier' + statsHover6: |- + Niveau de Prestige et rang de Guilde : + Le niveau de Guilde détermine le niveau de butin, définit votre bonus du niveau de Prestige, entre autres. Le Niveau de Prestige débloque des récompenses extrêmement puissantes, comme une vie maximale, des chances d'esquiver/critiquer, des récompenses de monnaie augmentées et plus encore ! Vous pouvez débloquer les rangs de guilde et les paliers de Prestige à /ag! + ⚜ = rang de prestige, = rang de guilde! + statsText7: '&4Kills d''élite : &c$kills' + statsHover7: Nombre d'Elite Mobs tués. + statsText8: '&4Niveaux Max Tués: &c$highestkill' + statsHover8: |- + Niveau de l'Elite Mob le plus élevé tué. + Les niveaux des Elite Mobs sont basés sur le niveau + de votre équipement ! Niveaux plus élevés, Elite + Mob plus élevé! + Note : seuls les kills sans exploitation sont comptés ! + statsText9: '&4Morts d''élite : &c$deaths' + statsHover9: Nombre de fois tué par des monstres d'élite. + statsText10: '&5Quêtes complétées: &d$quests' + statsHover10: |- + Nombre de quêtes d'EliteMobs terminées. + Vous pouvez accepter des quêtes en parlant à des PNJ! + statsText12: '&bScore : &3$score' + statsHover12: |- + Votre score EliteMobs. Il augmente + lorsque vous tuez des Elite Mobs + et il descend quand vous mourrez + face à un Élite. Les Élites de niveau supérieur + donnent plus de score. + gearText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + gearText1: '&7&lArmure & Armes:' + gearText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + gearText3: '&8&lTiers Équipement :' + gearText4: ' ☠ - $helmettier' + gearHover4: '$helmet' + gearText5: ' ▼ - $chestplatetier' + gearHover5: '$chestplate' + gearText6: ' Π - $leggingstier' + gearHover6: '$leggings' + gearText7: ' ╯╰ - $bootstier' + gearHover7: '$boots' + gearText8: '{⚔ - $mainhandtier} {⛨ - $offhandtier}' + gearHover8: '{$mainhand}{$offhand}' + gearText10: '{dmg : $damage} {armr: $armor}' + gearHover10: '{Base damage dealt to Elite Mobs}{Damage reduction from Elite Mobs}' + gearText11: 'Niveau de menace : $threat' + gearHover11: | + Ceci détermine le niveau des + Elite Mobs qui apparaissent près de chez vous. + Permet de prendre en compte l'armure, l'arme en main, la guilde + de niveau en jeu. + teleportText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + teleportText1: '&2&lTéléportations' + teleportText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + teleportText3: Point d'apparition + teleportHover3: Se téléporter au point d'apparition ! + teleportText4: '&6&lLe lieu des aventuriers' + teleportHover4: Téléportez-vous au lieu des aventuriers ! + onTeleportsHover: Cliquez pour vous téléporter ! + commandsText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + commandsText1: '&3&lCommandes:' + commandsText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + commandsText4: '&5/ag' + commandsHover4: |- + CLIQUEZ POUR UTILISER + L'endroit où vous pouvez trouver + Les PNJ qui donnent des quêtes, acheter et + vendre des objets, donner des conseils et plus encore ! + commandsText6: '&5/shareitem' + commandsHover6: |- + CLIQUEZ POUR UTILISER + Partage l'objet que vous détenez + sur le chat ! + questTrackerText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + questTrackerText1: '&6&lQuêtes :' + questTrackerHover1: Parlez aux PNJ pour accepter des quêtes ! + questTrackerText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + onQuestTrackHover: Cliquez pour abandonner ! + bossTrackerText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + bossTrackerText1: '&4&lTraqueur de Boss :' + bossTrackerHover1: Les Big Boss s'affichent ici ! + bossTrackerText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + onBossTrackHover: Cliquez pour pister/dépister ! + teleportChestMenuName: '&2Téléportations EliteMobs' + bossTrackerChestMenuName: '&2Suivi des Boss EliteMobs' + indexChestMenuName: '&2Menu EliteMobs' + gearChestMenuName: '&2Équipement EliteMobs' + statsChestMenuName: '&2Statistiques EliteMobs' + commandsChestMenuName: '&2Commandes EliteMobs' +procedural_shop_menu: + Shop name: '[EM] Boutique d''objets procédurale' + Full inventory message: '&7[EliteMobs] &4Votre inventaire est plein! Vous ne pouvez pas acheter d''objets tant que vous n''avez pas de place libre.' +quest_menu: + menuName: 'Sélection de quêtes [EM]' + cancelQuestMessage1: '&c&l&m&o---------------------------------------------&cVous ne pouvez avoir qu''une seule quête à la fois ! L''annulation de votre quête en cours réinitialisera la progression de la quête !' + cancelQuestMessage2: '&2[Cliquez ici pour annuler la quête en cours !]' + cancelQuestMessage3: '&7Vous pouvez voir l''état de votre quête avec la commande &a/em quest status&c&l&m&o---------------------------------------------' + questCancelMessage: '&7[EliteMobs] &cVotre quête en cours a été annulée !' + questStartTitle: Vous avez accepté une quête! + questStartSubtitle: Terrassez $objectiveAmount $objectiveName + questCompleteTitle: Quête terminée! + questCompleteSubtitle: Vous avez vaincu $objectiveAmount $objectiveName + bossBarObjective: Terrassez $objectiveAmount $objectiveName + questRewardMessage: '&7[EM] &aQuête complétée ! &6Votre récompense est &2$reward $currencyName' + questCompleteBroadcastMessage: '&7[EM] $player &2a terminé une quête $rank &2!' + questStartBroadcastMessage: '&7[EM] $player &2a accepté une quête $rank &2!' + questStatusMessage: '&7[EM] &aVous avez tué &a$currentAmount &f/ &c$objectiveAmount &a$objectiveName' +refiner_menu: + shopName: '[EM] Placez 10 ferrailles !' +repair_menu: + shopName: '[EM] Menu de réparation !' +scrapper_menu: + shopName: '[EM] Recycleur' +sell_menu: + shopName: '[EM] Vendre un magasin' +smelt_menu: + shopName: '[EM] Placez 25 ferrailles !' +unbind_menu: + shopName: '[EM] menu de déliaison!' +taunt: + onDamaged: + - Ow ! + - Oi! + - Arrêtez ça ! + - Pourquoi ?! + - Vous vous battez comme un fermier ! + - Vous êtes un boulet ! + - En garde! Touche! + - Hacks! + - Ma santé est buggée, immortelle! + - Vos coups ne me rendent que plus fort! + - Des bâtons et des pierres... + - 'Rien de plus qu''une blessure!' + - Protection de l'Empereur ! + - Herobrine, aidez-moi ! + - Derrière vous ! Un creeper! + - J'ai commis une terrible erreur. + - Ce qui ne me tue pas... + - Les zombies creusent des cicatrices + - Je vais vous montrer ma vraie puissance! + - Préparez-vous à mon attaque ultime! + - Mes renforts sont arrivés! + - Vous allez payer pour ça ! + - Ça va laisser une marque ! + - Œil pour œil, dent pour dent ! + - L'assurance-maladie couvrira cela + - Je l'ai senti dans mes os + - 'Rien de plus qu''une égratignure' + - Qu'est-ce que c'était? Une caresse? + - Vous ne me tuerez jamais comme ça + - Pathétique. + - Faible. + - Cela n'a même pas rayé mon armure! + - Ça va être facile + - Mes petits-enfants ressentiront cela + - Êtes-vous au moins en train d'essayer ? + - Un administrateur m'a complètement guéri + - Haxxor! + - Moi? Dommagé? Hacks! + - Je ne peux pas être vaincu! + - Bonne chose que j'utilise des hacks! + - Attention! Herobrine derrière vous! + - Ma vie pour Aiur! + - Votre maison est en train de se faire grief! + - Pourquoi ne pouvons-nous pas être amis? + - Valhalla! + - Notch sauve moi! + - Pas de retraite! + - Touche-moi avec ton meilleur tir! + onDamagedByBow: + - Combattez moi comme un Joueur! + - Tu as peur de te rapprocher ? + - Je peux sentir votre peur d'ici! + - Vous avez oublié votre épée? + - Lâche! L'arc n'est pas juste! + - Des arcs ? C'est tellement 2011... + - Les arcs sont pour les faibles d’esprit! + - Les arcs sont pour les sans-âme ! + - Les arcs sont pour les sans-cœur ! + - Je pensais que nous avions décidé que l'on n'utilisait pas d'arc ! + - Des arcs ? Vous regretterez cela + - Ow ! + - Oi! + - Arrêtez ça ! + - Pourquoi ?! + - Vous vous battez comme un fermier ! + - Vous êtes un boulet ! + - En garde! Touche! + - Hacks! + - Ma santé est buggée, immortelle! + - Vos coups ne me rendent que plus fort! + - Des bâtons et des pierres... + - 'Rien de plus qu''une blessure!' + - Protection de l'Empereur ! + - Herobrine, aidez-moi ! + - Derrière vous ! Un creeper! + - J'ai commis une terrible erreur. + - Ce qui ne me tue pas... + - Les zombies creusent des cicatrices + - Je vais vous montrer ma vraie puissance! + - Préparez-vous à mon attaque ultime! + - Mes renforts sont arrivés! + - Vous allez payer pour ça ! + - Ça va laisser une marque ! + - Œil pour œil, dent pour dent ! + - L'assurance-maladie couvrira cela + - Je l'ai senti dans mes os + - 'Rien de plus qu''une égratignure' + - Qu'est-ce que c'était? Une caresse? + - Vous ne me tuerez jamais comme ça + - Pathétique. + - Faible. + - Cela n'a même pas rayé mon armure! + - Ça va être facile + - Mes petits-enfants ressentiront cela + - Êtes-vous au moins en train d'essayer ? + - Un administrateur m'a complètement guéri + - Haxxor! + - Moi? Dommagé? Hacks! + - Je ne peux pas être vaincu! + - Bonne chose que j'utilise des hacks! + - Attention! Herobrine derrière vous! + - Ma vie pour Aiur! + - Votre maison est en train de se faire grief! + - Pourquoi ne pouvons-nous pas être amis? + - Valhalla! + - Notch sauve moi! + - Pas de retraite! + - Touche-moi avec ton meilleur tir! + onDamage: + - Un coup solide! + - Il tire, et il marque ! + - Vous le sentirez le matin ! + - La victoire approche ! + - La victoire sera à moi ! + - Ce n'était que la moitié de ma puissance! + - Vous êtes venu dans le mauvais quartier! + - Tu a emmerdé le mauvais mob! + - Préparez-vous à vous à être assailli! + - C'était votre dernière erreur ! + - Ressentez la brûlure! + - John Cena + - Comment êtes-vous toujours debout ? + - Abandonne déjà! + - Abandonne! + - J'ai la hauteur! + - Je vais te finir ! + - J'espère que vous êtes venu préparer à la douleur! + - Le chasseur devient le chassé! + - Du sang pour le trône de sang! + - Des crânes pour le trône de crâne! + - Un bon joueur est un joueur mort! + - Sois meilleur! + - Honorez le soleil ! + - La fin approche! + - Vous n'êtes pas prêt. + - Zug zug! + - À peine vaudrait-il mon temps! + - Je pensais que c'était un défi? + - 'Astuce de pro: ne soyez pas touché' + - Ima firin mah lazer bwooooooooo + - Pour l’Empereur ! + - Herobrine sera ravi ! + - C'est la fin pour vous! + - Êtes-vous au moins en train d'essayer ? + - Misérable! + - Pathétique. + - Peut-être que cela vous réveillera. + - C'est juste le début! + - Nous commençons tout juste ! + - Ce n'était qu'un échauffement ! + - Tu ne fais pas le poids! + - RKO de nulle part! + - Je peux le faire toute la nuit ! + - Un beau punching bag ! + - Je suis la nuit! + - Je me demande ce qui va se briser en premier + - Vengeance pour Steve! Sale monstre! + - Rejoignez le côté de la créature ! + - Trop facile, trop facile! + - Trop facile! + - Vous ne pouvez pas me vaincre! + - Pikachuuuuuu + - Avada kedavra! + - Crucio! + - Jierda! + - Coup critique ! + - Voici à quoi ressemblent les compétences ! + - 9001 dégâts ! + - Toujours debout ? + - Affrontez votre défaite! + - Un goût de douleur à venir! + - Je vais vous mettre en danger! + onDeath: + - Hélas, pauvre Yorick! + - Le reste est silencieux + - Je reviendrai + - Impardonnable + - Je vis, je meurs, je vis encore! + - SOIS TÉMOIN + - Je vais au Valhalla! + - VALHALLA! + - VALHALLA! DÉLIVRANCE + - Vous avez gagné, cette fois-ci + - Un fléau sur votre terre ! + - Variole sur toi! + - Vous me rejoindrai bien assez tôt! + - Ce n'est pas terminé + - La mort n'est qu'un revers + - Pas comme ça... + - Je voulais juste aller dans l'espace + - Nous pouvions être amis + - Vos péchés rampent sur votre dos + - A bientôt + - À plus tard + - Je vous attendrai + - Je serai vengé! + - Je n'irai pas doucement dans la nuit + - Je devrais souscrire une assurance vie + - C’était mon dernier jour de travail + - C’était mon dernier jour ici + - Et tu, Brute? + - RIP + - x.x + - (x.x) + - xox + - Décédé + - Bravo, bien joué + - Bravo + - Bien joué + - GG no RE + - HAX + - Hacker + - Pas juste, j'avais du lag + - Vous avez gagné, cette fois-ci + - Monstre... + - Médiocre... + onTarget: + - OI! Revenez ici ! + - Qu'est-ce que je vois ? Un lâche ? + - Monsieur, préparez vos poings! + - Réglons ça comme des hommes des cavernes! + - En garde! + - Attention ! Un creeper, derrière vous ! + - N'êtes-vous pas une bonne tasse laide! + - Vous avez l'air délicieux. + - Préparez-vous à des ennuis ! + - Que le meilleur cliqueur gagne! + - SPARTAAAAAA + - Je suis en fait niveau 9001 + - Pas un Elite Mob + - Elite Mob mal déguisé + - Ah, une proie fraîche! + - Le chasseur devient le chassé! + - En me tuant, le serveur plantera + - Je suis en fait un joueur déguisé ! + - Je ne vais pas lâcher de butin ! + - Pourquoi ne pouvons-nous pas être amis? + - Sssssss + - C'est mon dernier jour de travail! + - Arrêtez-vous saleté de criminel! + - Préparez-vous à mourir ! + - Honorez le soleil ! + - Sois meilleur + - Alea jacta est! + - Facta, non verba! + - Des crânes pour le trône de crâne! + - Du sang pour le trône de sang! + - Un sacrifice pour Herobrine! + - Je percerai les cieux! + - Qui crois-tu que je suis !? + - Un faible! Il est à moi. + - Argent sur les faibles! + - Accio joueur! + - Un duel à la mort! + - Je vous défie en duel! + - Pika pika! + - Viens-tu de m'appeler infernal + - Comment m'avez-vous appelé? + - Je sais ce que vous avez fait monstre! + - Voici comment se termine votre histoire! + - Préparez-vous à des ennuis ! + - Je me suis préparée pour cela ! + - Je suis prêt. Et vous? + - Un ennemi digne de ce nom! + - Un adversaire digne de ce nom! + - Un débutant! C'est mon jour de chance! + - Ton stuff ou ta vie! + - C'est un vol! + - C'est vous! Monstre! + - Je suis si affamé, donnez-moi votre chair! + - Il est là! + - Ce doit être mon imagination + - Hi I'm Mr Meeseeks! + - I'm Mr Meeseeks, look at me! + - Tes diamants ou ta vie! + - Pour le roi et le pays! + - Touche-moi avec ton meilleur tir! + - Sois témoin! + - Sois témoin sac de sang! + - Je suis tout brillant et de chrome! +zombie_friends: + friend1Name: 'BFF #1' + friend2Name: 'BFF #2' + friendDeathMessage: + - Nooon ! + - Médiocre! + - Zacharias! + - Il est plus mort qu'avant! + - Vengeance! + - Vengeance! + - Je n'arrive pas à croire que vous avez fait ça. + originalEntityDialog: + - Jouons à ZombieCraft plus tard! + - Sentez la puissance de l'amitié! + - El pueblo, unido! + - J'ai appelé mes amis ! + - BFF power! + - Un pour tous! + - Chopez-le ! + - Allez vous faire foutre, je rentre chez moi! + reinforcementDialog: + - Ne vous moquez pas de nos amis! + - On te couvre Zach! + - Les renforts sont arrivés! + - Un pour tous, un pour tous! + - Ça va être facile! + - Abandonner nous avons le terrain haut ! + - Tu veux y aller frérot? + - Worldstaaaaaaaaar! + - Que faites-vous à notre ami + - Sentez la puissance de l'amitié! + - La puissance de l'amitié à 100%! + - Zombies, rassemblez-vous! + - On te couvre camarade! + - Ensemble, nous sommes meilleurs! + - Plus il y en a mieux c'est! + - Je te protège membre de la famille! + - Tous pour un! +zombie_necronomicon: + summoningChant: Il ne faut pas non plus penser... que l'homme est soit le plus ancien, soit le dernier des maîtres de la terre, ou que la masse commune de la vie et de la substance marche seule. Les Anciens étaient, les Anciens sont, et les Anciens seront. Non pas dans les espaces que nous connaissons, mais entre eux, ils marchent sereins et primitifs, sans dimension et à nos yeux invisibles. Yog-Sothoth connaît la porte. Yog-Sothoth est la porte. Yog-Sothoth est la clé et le gardien de la porte. Passé, présent, futur, tous ne font qu'un dans Yog-Sothoth. Il sait où les Anciens ont percé par le passé, et où ils perceront à nouveau. Il sait où ils ont foulé les champs de la terre, et où ils les foulent encore, et pourquoi personne ne peut les voir fouler. Par leur odeur, les hommes peuvent parfois les connaître de près, mais de leur apparence, aucun homme ne peut les connaître, si ce n'est par les traits de ceux qu'ils ont engendrés sur l'humanité ; et parmi ceux-ci, il y en a de nombreux types, qui diffèrent par leur ressemblance du véritable eidolon de l'homme à cette forme sans vue ni substance qu'est Eux. Ils marchent sans être vus et sans foi ni loi dans des endroits isolés où les mots ont été prononcés et les rites hurlés à leurs saisons. Le vent s'agite avec leurs voix, et la terre murmure avec leur conscience. Ils tordent la forêt et écrasent la ville, mais ni la forêt ni la ville ne peuvent voir la main qui frappe. Kadath dans le froid des déchets les a connus, et quel homme connaît Kadath ? Le désert de glace du Sud et les îles englouties de l'océan contiennent des pierres sur lesquelles leur sceau est gravé, mais qui a vu la ville glacée ou la tour scellée, longtemps garnie d'algues et de balanes ? Le grand Cthulhu est leur cousin, mais il ne peut que faiblement les espionner. Iä ! Shub-Niggurath ! Vous les reconnaîtrez comme une infamie. Leur main est à vos gorges, mais vous ne les voyez pas. Et leur demeure ne fait qu'un avec votre seuil gardé. Yog-Sothoth est la clé de la porte, par laquelle les sphères se rencontrent. L'homme règne maintenant là où ils ont régné autrefois ; ils règneront bientôt là où l'homme règne maintenant. Après l'été, c'est l'hiver, après l'hiver, c'est l'été. Ils attendent avec patience et puissance, car c'est là qu'ils règneront à nouveau. +zombie_parents: + deathMessage: + - Vous monstre! + - Mon bébé ! + - Qu'est-ce que vous avez fait !? + - Vengeance! + - Nonnnnn! + - Vous allez me le payer ! + - Euh, il a été adopté + - Il est mort ! Encore ! + - Il est plus mort qu'avant! + - Vous l'avez cassé ! + bossEntityDialog: + - Vous m'embarrassez! + - Il me harcèle ! + - C'est lui qui s'en prend à moi ! + - Je peux régler ça seul! + - Laissez-moi tranquille, je peux le faire! + - Arrêtez de me suivre! + - Mon dieu c'est si embarrassant! + - Il a pris mon argent pour le déjeuner! + - Il me harcèle ! + zombieDad: + - Éloignez-vous de mon fils! + - Défendez-vous fils! + - Je vais m'occuper de lui! + - Arrêtez de vous en prendre à mon fils! + - Pourquoi faites-vous cela ? + - Je vais parler à vos parents ! + - Aller gamin! + - Montre-lui qui est le patron de gamin! + - Joli coup gamin! + zombieMom: + - Lâchez mon enfant! + - Es-tu blessé ma chérie? + - Vous a-t-il blessé ma chérie? + - Laisse-moi voir ce bobo chérie + - Je vais parler à ses parents ! + - Tu as oublié ta veste chérie! + - Posture, chérie + - Casse-le ! + - Arrête! + - Avez-vous sorti les ordures ? +elite_blaze: + name: '&fLvl &2$level &fElite &eBlaze' + deathMessages: + - '$player &ca été allumé par $entity!' +elite_cave_spider: + name: '&fNiveau&2$level &fElite &3Araignée des Grottes' + deathMessages: + - '$player &cs''est enchevêtré dans la toile de $entity!' +elite_creeper: + name: '&fNiveaux &2$level &fÉlite &2Creeper' + deathMessages: + - '$player &ca été arraché par $entity!' + - '$entity &ca éclaté $player&c !' +elite_drowned: + name: '&fNiveau &2$level &fElite &3Noyé' + deathMessages: + - '$player &ca été amené dans les profondeur par $entity!' + - '$player &ca été noyé par $entity!' +elite_elder_guardian: + name: '&fNiveau&2$level &fElite &3Gardien Ancien' + deathMessages: + - '$entity &ca empêché $player &cd''explorer les profondeurs !' +elite_guardian: + name: '&fNiveau&2$level &fElite &3Gardien' + deathMessages: + - '$entity &ca empêché $player &cd''explorer les profondeurs !' +elite_enderman: + name: '&fNiveau &2$level &fElite &5Enderman' + deathMessages: + - '$entity &ca envoyé $player &cdans le vide!' + - '$player &ca mal regardé $entity!' + - '$player &cet $entity &csont devenus les meilleurs amis !' +elitemob_endermite: + name: '&fNiveau &2$level &fElite &5Endermite' + deathMessages: + - '$entity &cest à $player &cce que David est à Goliath!' +elite_evoker: + name: '&fNiveau &2$level &fElite &5Evoker' + deathMessages: + - '$player &ca été enchanté par $entity&c!' +elite_husk: + name: '&fNiveau &2$level &fElite &7Husk' + deathMessages: + - '$player &ca été crevé par $entity&c!' +elite_illusioner: + name: '&fNiveaux &2$level &fElite &8Illusioneur' + deathMessages: + - '$player&c est tombé dans l''illusion de $entity&c!' +elite_iron_golem: + name: '&fNiveaux &2$level &fElite &8Golem de fer' + deathMessages: + - '$player &ca emmerdé le mauvais $entity&c!' + - '$player &ca appris le chemin du poing par $entity&c!' +elite_phantom: + name: '&fNiveaux &2$level &fÉlite &9Fantôme' + deathMessages: + - '$player &cA eu un mauvais cauchemar à propos de $entity&c!' + - '$player &caura des cauchemars à propos de $entity&c!' + - '$entity &ca enseigné la valeur du sommeil à $player &c!' +elite_pillager: + name: '&fNiveau &2$level &fElite &8Pilleur' + deathMessages: + - '$entity &ca pillé $player&c!' + - '$entity &ca pillé $player&c!' +elite_polar_bear: + name: '&fNiveaux &2$level &fElite &fOurs polaire' + deathMessages: + - '$player &ca été griffé à mort par $entity&c!' + - '$player &ca été malmené à mort par $entity&c!' +elite_ravager: + name: '&fLvl &2$level &fElite &6Ravageur' + deathMessages: + - '$entity &ca montré à $player &cqui était le responsable !' +elite_silverfish: + name: '&fLvl &2$level &fElite &7Silverfish' + deathMessages: + - '$player &ca confondu $entity &cavec un bloc de pierre!' +elite_skeleton: + name: '&fNiveau&2$level &fElite &fSquelette' + deathMessages: + - '$player &cest devenu le coussin &c de $entity!' + - '$entity &cvoulait voir les os de $player!' +elite_spider: + name: '&fNiveau &2$level &fElite &7Araignée' + deathMessages: + - '$player &cs''est enchevêtré dans la toile de $entity!' + - '$entity &ca dévoré $player&c !' +elite_stray: + name: '&fLvl &2$level &fElite &bStray' + deathMessages: + - '$player &ca été égaré par $entity&c!' +elite_vex: + name: '&fNiveau &2$level &fElite &bVex' + deathMessages: + - '$entity &ca vexé $player&c!' +elite_vindicator: + name: '&fNiveau &2$level &fÉlite &8Vindicateur' + deathMessages: + - '$entity &ca prouvé ses talents de combats sur $player&c!' +elite_witch: + name: '&fNiveau &2$level &fElite &5Sorcière' + deathMessages: + - '$player &cest devenu le sujet test de $entity!' + - '$player &ca été ensorcelé par $entity&c!' +elite_wither_skeleton: + name: '&fNiveau &2$level &fElite &8Wither Squelette' + deathMessages: + - Les projectiles de $entity ont flétri $player! + - '$entity''s &ca flétri $player &c!' +elite_zombie: + name: '&fNiveau &2$level &fElite &2Zombie' + deathMessages: + - '$player &ca été dévoré par $entity&c!' + - '$entity &ca eu le cerveau de $player!' +elite_ghast: + name: '&fNiveau &2$level &fElite &fGhast' + deathMessages: + - '$player &cn''a pas esquivé $entity&c &cles boules de feu!' + - '$player &ca été explosé en morceaux $entity&c!' + - '$entity &ca le bacon de $player!' +elite_wolf: + name: '[$level] Loup d''élite' + deathMessages: + - '$entity déchiquette $player !' + - '$player a été déchiquetté par $entity!' +elite_ender_dragon: + name: '&fLvl &2$level &fElite &5Ender Dragon' + deathMessages: + - '$entity &ca tué $player!' +elite_shulker: + name: '&fLvl &2$level &fElite &5Shulker' + deathMessages: + - '$entity &ca montré à $player &c de nouveaux horizons !' +super_chicken: + name: '&2Super Poulet' +super_cow: + name: '&2Super vache' +super_mushroom_cow: + name: '&2Super vache champignon' +super_pig: + name: '&dSuper Cochon' +super_sheep: + name: Super Mouton +elite_killer_bunny: + name: '&fLvl &2$level &fElite &cLapin Tueur' + deathMessages: + - '$entity &c $player &cfait vivre dans un état de ferme !' + - '$entity &ca donné une leçon à $player avec un baton et sans carotte !' +elite_llama: + name: '&fLvl &2$level &fElite &5Lama' + deathMessages: + - '$player &cs''est fait cracher dessus par $entity&c!' + - '$player &ca mis $entity&c en colère!' +elite_warden: + name: '&fNiveau&2$level &fÉlite &3Gardien' + deathMessages: + - '$entity &csenti $player &cétait à proximité !' +elite_goat: + name: '&fLvl &2$level &fElite &5Chèvre' + deathMessages: + - '$player &cs''est fait percuter par $entity&c !' + - '$player &cs''est fait écraser par $entity&c !' + - '$player &cs''est fait piétiner par $entity&c !' + - '$player &cs''est pris les cornes de $entity&c !' +elite_zombified_piglin: + name: '&fNiveau &2$level &fElite &6Piglin Zombifié' + deathMessages: + - '$player &ca été assailli jusqu''à la mort par $entity&c!' + - '$entity &ca le bacon de $player!' +elite_zoglin: + name: '&fLvl &2$level &fElite &dZoglin' + deathMessages: + - '$player &ca embêté $entity &cet s''est fait empaler !' + - '$entity &ca le bacon de $player!' +elite_piglin: + name: '&fNiveau &2$level &fElite &ePiglin' + deathMessages: + - '$entity &cva récupérer un bon prix pour les restes de $player!' + - '$entity &ca enseigné à $player &cla valeur de l''or !' +elite_hoglin: + name: '&fNiveau &2$level &fElite &dHoglin' + deathMessages: + - '$player &ca embêté $entity &cet s''est fait empaler !' + - '$entity &ca le bacon de $player!' +elite_piglin_brute: + name: '&fNiveau &2$level &fElite &cPiglin Brute' + deathMessages: + - '$entity &ca attendri $player!' + - '$entity &ca brutalisé $player!' +elite_bee: + name: '&fLvl &2$level &fElite &eAbeille' + deathMessages: + - '$player &ca été piqué par $entity!' +MobCombatSettings: + bossLocationMessage: '&7[EM] &2[Cliquez pour suivre !]' + bossKillParticipationMessage: '&eVos dégâts : &2$playerDamage' + defaultOtherWorldBossLocationMessage: '$name: Dans un autre monde !' + weakText: '&9&lFaible!' + resistText: '&c&lRésistance!' + fullHealMessage: '&2SOIN COMPLET !' +check_tier: + message1: '&7[EM] Votre niveau de combat est de $tier' + message2: '&7[EM] Votre bonus de niveau de guilde est de $tier' + message3: '&7[EM] Votre niveau de combat est de $tier' +check_tier_others: + message1: '&7[EM] Le niveau de combat de $player est de $tier' + message2: '&7[EM] Le bonus de niveau de guilde de $player est de $tier' + message3: '&7[EM] &aLe niveau de combat de $player est de $tier' +ScrapItemSettings: + scrapItemName: '&2Reste de niveau $level' + scrapItemLore: + - '&aRécoltez 25 restes du même niveau pour' + - '&acréer un orbe d''amélioration d''item!' + - '&aVous pouvez également utiliser les restes pour réparer' + - '&ades items et fabriquer des restes de niveau supérieur!' + - '&2Faites ceci au Hub de Guilde de l''Aventurier !' + upgradeItemName: '&2Orbe d''amélioration de niveau $level' + upgradeItemLore: + - '&aÀ utiliser au niveau du PNJ d''Enhancer pour améliorer' + - '&ales items jusqu''au niveau $orbLevel!' +Quests: + questJoinMessage: '&aVous avez accepté la quête $questName &a !' + questLeaveMessage: '&cVous avez abandonné la quête $questName &c !' + questCompleteMessage: '&2Vous avez terminé la quête $questName &2!' + leaveWhenNoActiveQuestsExist: '&cVous n''avez actuellement aucune quête active !' + questLeaveConfirmationMessage: '&cÊtes-vous sûr de vouloir abandonner votre quête actuelle ? Utilisez &a/em confirm &c pour confirmer votre choix !' + questStartTitle: '&aQuête acceptée !' + questCompleteTitle: '&2Quête terminée !' + questLeaveTitle: '&cQuête abandonnée !' + killQuestChatProgressionMessage: '&8[EliteMobs]&c➤Tuer $name:$color$current&0/$color$target' + fetchQuestChatProgressionMessage: '&8[EliteMobs]&c➤Obtenir $name:$color$current&0/$color$target' + dialogQuestChatProgressionMessage: '&8[EliteMobs]&c➤Parler à $name:$color$current&0/$color$target' + questCapMessage: '&8[EliteMobs] &cVous avez atteint le nombre maximum de quêtes actives (10)! &4Abandonner ou compléter au moins une quête active si vous voulez obtenir plus de quêtes !' + killQuestScoreboardProgressionMessage: '&c➤Tuer $name:$color$current&0/$color$target' + fetchQuestScoreboardProgressionMessage: '&c➤Obtenir $name:$color$current&0/$color$target' + dialogQuestScoreboardProgressionMessage: '&c➤Parler à $name:$color$current&0/$color$target' + chatTrackMessage: '&8[EliteMobs]&2 Cliquez ici pour suivre la quête !' + chatTrackHover: '&2Cliquez pour suivre !' + chatTrackingMessage: '&8[EliteMobs]&9 Vous suivez maintenant une quête !' + chatTrackingHover: '&2Cliquez pour suivre/ne plus suivre ! /em -> Quêtes pour suivre une autre quête!' + noQuestDestinationFound: '[EM] Aucune destination de quête trouvée !' + questDestinationInOtherWorld: '[EM] Allez dans le monde $world!' + questAlreadyCompletedMessage: '&8[EliteMobs] &cVous avez déjà terminé cette quête !' + questPrerequisitesMissingMessage: '&8[EliteMobs] &cVous ne pouvez pas encore accepter cette quête !' + lowRankDynamicQuestWarning: '&8[EliteMobs] &cVous ne pouvez pas accepter ces quêtes avec votre rang de guilde actuel! Augmentez le niveau de votre guilde pour accepter ces quêtes.' + questTurnInObjective: '&a2Parler à $npcName' +Wormholes: + dungeonNotInstalledMessage: '&8[EliteMobs] &cLe donjon $dungeonID &cn''est pas installé ! Ce téléporteur ne fonctionnera pas.' + defaultPortalMissingMessage: '&8[EliteMobs] &cCe portail ne semble mener nulle part !' +Arenas: + notEnoughPlayersMessage: '&8[EliteMobs] &cVous avez besoin d''au moins $amount pour commencer le match!' + startingMessage: '&2Commencement!' + startingSubtitle: '&2dans $count...' + arenaFullMessage: '&4[EliteMobs] &cL''Arène est pleine ! À la place vous pouvez observer en attendant qu''elle se termine !' + arenasOngoingMessage: '&4[EliteMobs] &cImpossible de rejoindre l''arène maintenant - un match est en cours ! Vous pouvez l''observer en attendant qu''il se termine !' + arenaStartHintMessage: '&2[EliteMobs] &aVous pouvez démarrer l''arène en faisant &2/em start' + arenaQuitHintMessage: '&4[EliteMobs] &cVous pouvez quitter l''arène en faisant &4/em quit' + arenaJoinPlayerMessage: "&2[EliteMobs] &aVous pouvez démarrer l'arène en faisant &2/em\\ \\ start &as'il y a au moins &2$count &ajoueurs dedans! \nVous pouvez quitter\\ \\ l'arène en faisant &c/em quit" + arenaJoinSpectatorMessage: '&2[EliteMobs] &aVous pouvez quitter l''arène à tout moment en utilisant &2/em quit' + waveTitle: '&aVague &2$wave' + victoryTitle: '&2Victoire!' + victorySubtitle: '&a$wave &avague complété !' + defeatTitle: '&4Défaite!' + defeatSubtitle: '&cVague atteinte &4$wave&c !' + victoryBroadcast: L'arène $arenaName a été vaincue par $players! + joinPlayerTitle: '&aCommencez avec &2/em start &a!' + joinPlayerSubtitle: '&cQuittez avec &4/em quit &c!' + joinSpectatorTitle: '&aMaintenant en spectateur!' + joinSpectatorSubtitle: '&cQuitter avec &4/em &c!' +ancient_corpse_drop_axe: + name: '&eCoupeurs de bouchers' + lore: + - '&aRécupérée depuis le' + - '&aCrane de cadavre antique...' +animated_armor_drop_axe: + name: '&8Hache enchantée' + lore: + - '&8Cette hache était presque la' + - '&8à la fin de vous.' +animated_armor_drop_boots: + name: '&8Bottes Enchantées' + lore: + - '&8Vous avez littéralement combattu ceci' + - '&8pièce d''armure.' +animated_armor_drop_chestplate: + name: '&8Plastron Enchanté' + lore: + - '&8Vous avez littéralement combattu ceci' + - '&8pièce d''armure.' +animated_armor_drop_helmet: + name: '&8Casque enchanté' + lore: + - '&8Vous avez littéralement combattu ceci' + - '&8pièce d''armure.' +animated_armor_drop_leggings: + name: '&8Jambières enchantées' + lore: + - '&8Vous avez littéralement combattu ceci' + - '&8pièce d''armure.' +arachnid_matriarch_drop_boots: + name: '&bBandes de soie' + lore: + - '&bFabriqué en soie d''araignée rare.' +baba_rhoga_drop_chest: + name: '&aRobe de Sorcières' + lore: + - '&aL''odeur doit être présente' + - '&aAbandonner éventuellement.' +baba_yaga_drop_helmet: + name: '&aChapeau de Sorcières' + lore: + - '&aL''odeur doit être présente' + - '&aAbandonner éventuellement.' +balloon_rider_drop_leggings: + name: '&dJambières spacieuses' + lore: + - '&dJambières très confortables et spacieuses.' +banshee_drop_charm: + name: '&8Chagrin manifesté' + lore: + - '&8Que ce chagrin endurci protège' + - '&8vous avez de la peine.' +beast_tamer_drop_axe: + name: '&eGrande hache' + lore: + - '&eAssez lourd pour couper n''importe quelle bête en deux.' +berserker_charm: + name: '$bAmulette du Berserker' + lore: + - '&aPerdez-vous face à' + - '$al''étouffante adversité de plus' + - '$ade manières qu''un...' +bigfoot_drop_chestplate: + name: '&eArmure en Fourrure' + lore: + - '&eConfortable et chaud.' +big_bad_wolf_drop_chestplate: + name: '&aGrosse fourrure de loup' + lore: + - '&aAngoissant!' +bloated_jeffrey_drop_tear: + name: '&bDouce Larme' + lore: + - '&bVous avez fait pleurer...' +bone_fiend_drop_leggings: + name: '&dJambières en os' + lore: + - '&aLes os pointus attachés à ces' + - '&ales leggings font beaucoup de bruit.' +challengers_boots: + name: '&cBottes du Challenger' + lore: + - '&2Décerné à ceux qui défient' + - '&2l''''Arène de la Ligue de Bois!' +challengers_chestplate: + name: '&cPlastron du Challenger' + lore: + - '&2Décerné à ceux qui défient' + - '&2l''''Arène de la Ligue de Bois!' +challengers_helmet: + name: '&cBottes du Challenger' + lore: + - '&2Décerné à ceux qui défient' + - '&2l''''Arène de la Ligue de Bois!' +challengers_leggings: + name: '&cJambières du Challenger' + lore: + - '&2Décerné à ceux qui défient' + - '&2l''''Arène de la Ligue de Bois!' +challengers_sword: + name: '&cÉpée du Challenger' + lore: + - '&2Décerné à ceux qui défient' + - '&2l''''Arène de la Ligue de Bois!' +chameleon_charm: + name: '&bCharme de caméléon' + lore: + - '&aLe Caméléon coloré peut' + - '&ablend in just about anywhere,' + - '&alentement rampant autour...' +changeling_drop_sword: + name: '&aÉpée cristalline' + lore: + - '&aLa lame brille lorsque vous la regardez.' +cheetah_charm: + name: '&bCharme du Guépard' + lore: + - '&aLes guépards peuvent atteindre des vitesses de' + - '&a120 km/h... pour environ 60' + - '&asecondes. Faites-les compter !' +circus_ringmaster_drop_charm: + name: '&dFouet des maîtres des anneaux' + lore: + - '&dCela a été utilisé pour une terrible punition.' +craftenmine_terror_drop_trident: + name: '&cGhast Lobotomizer' + lore: + - '&cParfait pour s''assurer que' + - '&cLes Ghasts restent au sol.' +creeperpede_drop_chestplate: + name: '&dGilet à l''épreuve des explosions' + lore: + - '&dFaire ressentir ''BOOM!''' + - '&dPlus comme ''boom''.' +crone_drop_axe: + name: '&fAbatteur de sorcière' + lore: + - '&fUne hache raffinée demande une chasse raffinée.' +depths_seeker: + name: '&2Chercheur des profondeurs' + lore: + - '&9Viennent de profondeurs immesurables' + - '&9et pillé sur le monstre le plus ignoble,' + - '&9on ne sait pas quelles horreurs' + - '&9cette canne à pêche a vu.' +divine_cinder_drop_charm: + name: '&6Feu Divin' + lore: + - '&6Béni soit le feu !' +dwarven_greed: + name: '&4La cupidité des nains' + lore: + - '&cCeux qui s''aventurent trop loin' + - '&cet trop profond peut réveiller l''ancien' + - '&cles horreurs de l''ombre et de la flamme' + - '&cil vaut mieux ne pas les déranger.' +elephant_charm: + name: '&bCharme de l''éléphant' + lore: + - '&aGagner la puissance d''un éléphant' + - '&ala ruée, pour le coût de' + - '&a la vitesse d''une ruée d''éléphants !' +enders_drop_chestplate: + name: '&dChemise de l''Ender' + lore: + - '&dProtectrice et confortable !' +enders_drop_helmet: + name: '&dCasquette de l''Ender' + lore: + - '&dConfortable, mais aussi assez robuste.' +enders_drop_leggings: + name: '&dPantalon de l''Ender' + lore: + - '&dUn peu trop long mais il le fera.' +ender_lapin_drop_boots: + name: '&cBottes de l''étoile Sombre' + lore: + - '&cTe donne le courage' + - '&cde courir en cas de danger.' +endless_pursuer_drop_sword: + name: '&7Épée de sang sombre' + lore: + - '&7L''épée semble' + - '&7pleurer le sang...' +enraged_snowman_drop_sword: + name: '&9Nez de bonhomme de neige' + lore: + - '&9Pas étonnant que le nez du bonhomme' + - '&9de neige soit aussi pointu...' +xmas_and_gold: + name: '&6et l''or !' + lore: + - '&7Tout le monde souhaite de l''argent' + - '&7et l''or !' +xmas_and_goooooold: + name: '&6et l''oooooor!' + lore: + - '&7Tout le monde souhaite de l''argent' + - '&7et l''or !' +xmas_cornelius_pick: + name: '&bPioche de Cornélius' + lore: + - '&3Si vous le jetez dans les airs' + - '&3et le laissez frapper le sol,' + - '&3Vous pourrez juste trouver' + - '&3Menthe poivrée!' +xmas_lost_present: + name: '&2un Cadeau perdu' + lore: + - '&2Mettez ceci en marche pour obtenir une récompense!' +xmas_peppermint: + name: '&cMenthe poivrée' + lore: + - '&fCe que j''ai cherché toute ma vie!' +xmas_siiiiilver: + name: '&7Argeeeeent' + lore: + - '&6Tout le monde souhaite de l''argent' + - '&6et l''or !' +xmas_silver: + name: '&7Argent' + lore: + - '&6Tout le monde souhaite de l''argent' + - '&6et l''or !' +xmas_substitute_elf_practice: + name: '&8Substitue de l''elfe d''entraînement' + lore: + - '&fCette poupée a besoin que l''on corrige ses dents' +xmas_treat: + name: '&aBonbon !' + lore: + - '&eUn délicieux en-cas !' +xmas_treat_v2: + name: '&aBonbon!' + lore: + - '&eUn délicieux en-cas !' +evil_undead_drop_sword: + name: '&eEpée transitoire' + lore: + - '&eElle ne vous servira que' + - '&ele temps d''une chanson.' +fallen_knight_drop_boots: + name: '&e7Bottes Anciennes' + lore: + - '&7Même si les bottes sont anciennes, elles' + - '&7offrent toujours une protection abondante.' +fallen_knight_drop_chestplate: + name: '&eAncien Plastron du Nether' + lore: + - '&7Cette armure peut paraître simple' + - '&7pour l''oeil inexpérimenté mais il est' + - '&7clair que tout ce qui veut pénétrer' + - '&7sa plaque épaisse devra déployer' + - '&7une force considérable.' +fallen_knight_drop_helmet: + name: '&e7Casque ancien' + lore: + - '&7De nombreuses épées ont laissées leur marque' + - '&7asur ce casque mais aucun n''a' + - '&7a réussi à briser sa défense.' +fallen_knight_drop_leggings: + name: '&e7Jambières Anciennes' + lore: + - '&7Vous êtes désolé pour tous ceux qui essayent' + - '&7de frapper ces jambières.' +fine_swine_drop_sword: + name: '&6Bonne Epée en Or' + lore: + - '&6Une belle épée en or fabriquée par un maître.' + - '&6L''or fondu coulant à l''intérieur' + - '&6l''épée s''assure que tout dommage' + - '&6à la lame est réparée rapidement.' +firefly_charm: + name: '&bCharme de luciole' + lore: + - '&aAllumez la nuit!' +firestarter_drop_helmet: + name: '&eCoupe-feu' + lore: + - '&eSeulement la moitié de la chaleur !' +fire_conjurer_drop_shield: + name: '&eBouclier touché par les flammes' + lore: + - '&eProtège contre le feu et les flammes.' +fishy_charm: + name: '&bCharme de Pêche' + lore: + - '&aIl y a juste quelque chose qui ne l''est pas' + - '&aassez droit avec celui-ci...' +fox_king_cold_drop_charm: + name: '&9Neige magique' + lore: + - '&9Vous sentez des énergies impossibles' + - '&9venant de cette neige.' +fulgora_drop_boots: + name: '&bBottes de montagne' + lore: + - '&bDoit être utile lorsque' + - '&bexplorer les montagnes.' +goblin_ballista: + name: '&8Baliste Gobelin' + lore: + - '&8Un trésor parmi les gobelins !' +goblin_boots: + name: '&8Bottes Gobelin' + lore: + - '&8Un trésor chez les gobelins !' +goblin_chestplate: + name: '&8Plastron gobelin' + lore: + - '&8Un trésor chez les gobelins !' +goblin_cleaver: + name: '&8Hachoir gobelin' + lore: + - '&8Un trésor chez les gobelins !' +goblin_helmet: + name: '&8Casque gobelin' + lore: + - '&8Un trésor chez les gobelins !' +goblin_invasion_drop_chestplate: + name: '&aPetit Plastron' + lore: + - '&aVraiment serré...' +goblin_invasion_drop_leggings: + name: '&aPetites Jambières' + lore: + - '&aEh bien, au moins c''est vraiment' + - '&amet en valeur tes jambes.' +goblin_leggings: + name: '&8Jambières Gobelin' + lore: + - '&8Un trésor chez les gobelins !' +goblin_poker: + name: '&8Tisonnier Gobelin' + lore: + - '&8Un trésor chez les gobelins !' +goblin_shooter: + name: '&8Tireur gobelin' + lore: + - '&8Un trésor parmi les gobelins !' +goblin_slasher: + name: '&8Trancheur gobelin' + lore: + - '&8Un trésor chez les gobelins !' +grappling_arrow: + name: '&6Flèche grapin' + lore: + - '&eTirez sur une CIBLE pour attraper !' +greedy_dwarf_drop_pickaxe: + name: '&9Besoin de nain' + lore: + - '&cCeux qui sont trop gourmands' + - '&cet trop profond peut réveiller l''ancien' + - '&chorreurs de l''ombre et des flammes' + - '&cpréférable de ne pas le déranger.' +grunter_drop_axe: + name: '&cGros Groin' + lore: + - '&cLa hache a une tendance' + - '&ccrier quand on l''agite.' +grunts_boots: + name: '&fBottes de Grunt' + lore: + - '&2Décerné à ceux qui défient' + - '&2l''''Arène de la Ligue de Bois!' +grunts_chestplate: + name: '&fPlastron de Grunt' + lore: + - '&2Décerné à ceux qui défient' + - '&2l''''Arène de la Ligue de Bois!' +grunts_helmet: + name: '&fCasque de Grunt' + lore: + - '&2Décerné à ceux qui défient' + - '&2l''''Arène de la Ligue de Bois!' +grunts_leggings: + name: '&fJambières de Grunt' + lore: + - '&2Décerné à ceux qui défient' + - '&2l''''Arène de la Ligue de Bois!' +grunts_sword: + name: '&fÉpée de Grunt' + lore: + - '&2Décerné à ceux qui défient' + - '&2l''''Arène de la Ligue de Bois!' +harmless_chicken_drop_boots: + name: '&aBottes Inutiles' + lore: + - '&aAu moins ils sont à l''épreuve des explosions...' +hog_rider_drop_boots: + name: '&aBottes Radioactives 3.6' + lore: + - '&aPas génial, pas terrible.' +horde_champion_drop_sword: + name: '&dÉviscérateur de la Horde' + lore: + - '&dQuand vous devez prendre' + - '&dattention à une horde de morts-vivants.' +horrid_duplicator_drop_arrow: + name: '&aFlèche Dupée' + lore: + - '&2Apparence et sensation' + - '&2comme le vrai...' +horrid_duplicator_drop_bow: + name: '&4Arc d''os Ardent' + lore: + - '&4Cet arc est fait à partir de' + - '&4un seul grand os.' +invasion_alien_treat: + name: '&6Friandises extraterrestres' + lore: + - '&6Le goût est hors de cette planète!' +invasion_cheap_plasma_boots: + name: '&2Bottes en Plasma bon marché' + lore: + - '&aMise à feu!' + - '&cNote: &8Double maj pour activer !' +invasion_low_grade_tinfoil_bolt_caster: + name: '&7Lance Tonnerre de faible qualité' + lore: + - '&7Quitter ma propriété !' +invasion_low_grade_tinfoil_boots: + name: '&7Chaussures en aluminium de qualité inférieure' + lore: + - '&7Évite les radiations du sol !' +invasion_low_grade_tinfoil_chestplate: + name: '&7Plastron en aluminium de qualité inférieure' + lore: + - '&7Empêche la 6G d''espionner votre pacemaker!' +invasion_low_grade_tinfoil_hat: + name: '&7Chapeau en aluminium de qualité inférieure' + lore: + - '&7Je veux y croire!' +invasion_low_grade_tinfoil_leggings: + name: '&7Pantalon en aluminium de qualité inférieure' + lore: + - '&7Conçu pour fuir les extraterrestres !' +invasion_polished_plasma_boots: + name: '&2Bottes de plasma polies' + lore: + - '&aMise à feu!' + - '&cNote: &8Double maj pour activer !' +invasion_quality_bolt_caster: + name: '&7Lance Tonnerre de qualité' + lore: + - '&7Quitter ma propriété !' +invasion_quality_tinfoil_boots: + name: '&7Chaussures en aluminium de qualité inférieure' + lore: + - '&7Évite les radiations du sol !' +invasion_quality_tinfoil_chestplate: + name: '&7Plastron en aluminium de qualité inférieure' + lore: + - '&7Empêche la 6G d''espionner votre pacemaker!' +invasion_quality_tinfoil_hat: + name: '&7Chapeau en aluminium de qualité' + lore: + - '&7Reste hors de ma tête !' +invasion_quality_tinfoil_leggings: + name: '&7Pantalon en aluminium de qualité' + lore: + - '&7Conçu pour fuir les extraterrestres !' +invictus_boots: + name: '&4Bottes Invictus' + lore: + - '&2Décerné aux champions de' + - '&2l''''Arène de la Ligue de Bois!' +invictus_chestplate: + name: '&4Plastron Invictus' + lore: + - '&2Décerné aux champions de' + - '&2l''''Arène de la Ligue de Bois!' +invictus_helmet: + name: '&4Casque Invictus' + lore: + - '&2Décerné aux champions de' + - '&2l''''Arène de la Ligue de Bois!' +invictus_leggings: + name: '&4Jambières Invictus' + lore: + - '&2Décerné aux champions de' + - '&2l''''Arène de la Ligue de Bois!' +invictus_pickaxe: + name: '&4Pioche Invictus' + lore: + - '&2Décerné aux champions de' + - '&2l''''Arène de la Ligue de Bois!' +invictus_shovel: + name: '&4Pelle Invictus' + lore: + - '&2Décerné aux champions de' + - '&2l''''Arène de la Ligue de Bois!' +invictus_sword: + name: '&4Epée Invictus' + lore: + - '&2Décerné aux champions de' + - '&2l''''Arène de la Ligue de Bois!' +krampus_drop_boots: + name: '&1Bottes de neige' + lore: + - '&1Fabriqué à partir de neige réelle.' +large_hopper_drop_axe: + name: '&aHache lourde' + lore: + - '&aParfait pour couper les têtes.' +living_shadow_drop_boots: + name: '&5Bottes de l''Ombre' + lore: + - '&5Tomber ne fait pas autant mal.' +lucky_charms: + name: '&bPorte-bonheur' + lore: + - '&aUne partie d''un petit déjeuner complet !' + - '&cNote: Absolument pas une partie de' + - '&ca petit déjeuner complet.' +magmaguys_toothpick: + name: '&4Magmaguy&c &2Toothpick' + lore: + - '&aDans des conditions quasi menthes !' +merman_drop_trident: + name: '&1Trident Triton' + lore: + - '&1L''arme préférée d''un triton.' +meteor_shower_scroll: + name: '&7Parchemin de Pluie de météores' + lore: + - '&4Appeler la destruction.' + - '&4Utilisation unique.' +monster_of_the_deep_drop_trident: + name: '&3Trident osseux' + lore: + - '&3Fabriqué à partir des os' + - '&3du Monstre des Profondeurs.' +moon_spider_drop_sword: + name: '&fÉpée filée en soie' + lore: + - '&fEntourage en soie tranchant comme un rasoir' + - '&fle noyau de fer de cette lame.' + - '&fLa lame vous servira,' + - '&fpour l''instant...' +necromancer_drop_helmet: + name: '&cHeaume du sombre présage' + lore: + - '&cIl y a quelque chose qui cloche' + - '&cà propos de ce casque.' +netherite_golem_drop_helmet: + name: '&8Casque Antique' + lore: + - '&8Vous n''êtes pas certain si vous' + - '&8devrait mettre ceci sur votre' + - '&8Rendez-vous ou envoyez le à un musée.' +nether_escapee_drop_charm: + name: '&6Amulette de feu' + lore: + - '&6Que les flammes ne vous nuisent pas.' +nether_hag_drop_sword: + name: '&7Épée ensorcelée' + lore: + - '&7Toutes sortes de malédictions et' + - '&7Les enchantements circulent à travers' + - '&7cette épée.' +nightwing_drop_crossbow: + name: '&aGuetteur céleste' + lore: + - '&aGarder le ciel en sécurité.' +night_crawler_drop_shield: + name: '&8Bouclier Nocturne' + lore: + - '&8Presque incassable.' +night_crawler_drop_sword: + name: '&8Lame Nocturne' + lore: + - '&eLa seule réponse à la' + - '&8menaces de la nuit.' +novices_boots: + name: '&8Bottes de Novice' + lore: + - '&2Décerné à ceux qui défient' + - '&2l''''Arène de la Ligue de Bois!' +novices_chestplate: + name: '&8Plastron de Novice' + lore: + - '&2Décerné à ceux qui défient' + - '&2l''''Arène de la Ligue de Bois!' +novices_helmet: + name: '&8Casque de Novice' + lore: + - '&2Décerné à ceux qui défient' + - '&2l''''Arène de la Ligue de Bois!' +novices_leggings: + name: '&8Jambières de Novice' + lore: + - '&2Décerné à ceux qui défient' + - '&2l''''Arène de la Ligue de Bois!' +novices_sword: + name: '&8Épée de Novice' + lore: + - '&2Décerné à ceux qui défient' + - '&2l''''Arène de la Ligue de Bois!' +oasis_beacons_brigandine: + name: '&8Brigandine de Phare' + lore: + - '&fL''acier solide peut repousser' + - '&fla plupart des attaques.' +oasis_chief_cultists_bow: + name: '&5Arc du Chef Cultiste' + lore: + - '&dL''arc de guerre nécrotique' + - '&ddu Chef Cultiste.' +oasis_earthquake_boots_10: + name: '&2Bottes du séisme' + lore: + - '&aFrappez le sol, et les créatures !' + - '&cNote: &8Double shift pour activer !' +oasis_earthquake_boots_20: + name: '&2Bottes du séisme' + lore: + - '&aFrappez le sol, et les créatures !' + - '&cNote: &8Double shift pour activer !' +oasis_earthquake_boots_30: + name: '&2Bottes du séisme' + lore: + - '&aFrappez le sol, et les créatures !' + - '&cNote: &8Double shift pour activer !' +oasis_earthquake_boots_40: + name: '&2Bottes du séisme' + lore: + - '&aFrappez le sol, et les créatures !' + - '&cNote: &8Double shift pour activer !' +oasis_earthquake_boots_50: + name: '&2Bottes du séisme' + lore: + - '&aFrappez le sol, et les créatures !' + - '&cNote: &8Double shift pour activer !' +oasis_earthquake_chestplate_10: + name: '&2Plastron du Séisme' + lore: + - '&aFrappez le sol, et les créatures !' + - '&cNote: &8Double shift pour activer !' +oasis_earthquake_chestplate_20: + name: '&2Plastron du Séisme' + lore: + - '&aFrappez le sol, et les créatures !' + - '&cNote: &8Double shift pour activer !' +oasis_earthquake_chestplate_30: + name: '&2Plastron du Séisme' + lore: + - '&aFrappez le sol, et les créatures !' + - '&cNote: &8Double shift pour activer !' +oasis_earthquake_chestplate_40: + name: '&2Plastron du Séisme' + lore: + - '&aFrappez le sol, et les créatures !' + - '&cNote: &8Double shift pour activer !' +oasis_earthquake_chestplate_50: + name: '&2Plastron du Séisme' + lore: + - '&aFrappez le sol, et les créatures !' + - '&cNote: &8Double shift pour activer !' +oasis_earthquake_helmet_10: + name: '&2Casque du séisme' + lore: + - '&aFrappez le sol, et les créatures !' + - '&cNote: &8Double shift pour activer !' +oasis_earthquake_helmet_20: + name: '&2Casque du séisme' + lore: + - '&aFrappez le sol, et les créatures !' + - '&cNote: &8Double shift pour activer !' +oasis_earthquake_helmet_30: + name: '&2Casque du séisme' + lore: + - '&aFrappez le sol, et les créatures !' + - '&cNote: &8Double shift pour activer !' +oasis_earthquake_helmet_40: + name: '&2Casque du séisme' + lore: + - '&aFrappez le sol, et les créatures !' + - '&cNote: &8Double shift pour activer !' +oasis_earthquake_helmet_50: + name: '&2Casque du séisme' + lore: + - '&aFracasse le sol, et les monstres !' + - '&cNote: &8Double shift pour activer !' +oasis_earthquake_leggings_10: + name: '&2Jambières du Séisme' + lore: + - '&aFracasse le sol, et les monstres !' + - '&cNote: &8Double shift pour activer !' +oasis_earthquake_leggings_20: + name: '&2Jambières du Séisme' + lore: + - '&aFracasse le sol, et les monstres !' + - '&cNote: &8Double shift pour activer !' +oasis_earthquake_leggings_30: + name: '&2Jambières du Séisme' + lore: + - '&aFracasse le sol, et les monstres !' + - '&cNote: &8Double shift pour activer !' +oasis_earthquake_leggings_40: + name: '&2Jambières du Séisme' + lore: + - '&aFracasse le sol, et les monstres !' + - '&cNote: &8Double shift pour activer !' +oasis_earthquake_leggings_50: + name: '&2Jambières du Séisme' + lore: + - '&aFracasse le sol, et les monstres !' + - '&cNote: &8Double shift pour activer !' +oasis_foundrys_flaming_hammer: + name: '&6Le marteau flamboyant de la Fonderie' + lore: + - '&eLe Marteau de la fonderie !' +oasis_foundrys_flux: + name: '&6L''écoulement de la fonderie' + lore: + - '&eLe flux qui infusé dans' + - '&etoutes les armes forgées !' +oasis_mask_of_the_warlock: + name: '&4Masque du Sorcier' + lore: + - '&7La pierre est dans son masque !' + - '&7La lumière UV l''aidera !' +oasis_monumental_lance: + name: '&3Lance Monumentale' + lore: + - '&bLa pêche à la lame est mon passe-temps.' +oasis_oracles_shroud: + name: '&3Coiffe d’Oracle' + lore: + - '&1L''illusion est votre arme !' +oasis_page_of_darkness_I: + name: '&0Page des Ténèbres I' + lore: + - '&829 pas au Nord' + - '&811 pas à l''Ouest' + - '&816 pas au Nord' + - '&86 pas à l''Est' +oasis_page_of_darkness_II: + name: '&0Page des Ténèbres II' + lore: + - '&87 pas au Sud' + - '&86 pas à l''Est' + - '&833 pas au Nord' + - '&812 pas à l''Ouest' +oasis_page_of_darkness_III: + name: '&0Page des ténèbres III' + lore: + - '&86 pas au Nord' + - '&83 pas à l''Ouest' + - '&830 pas au Nord' + - '&89 pas à l''Est' +oasis_page_of_darkness_index: + name: '&0Page de l''Index des Ténèbres' + lore: + - '&8Avance prudemment dans l''obscurité' + - '&8ils savent que vous venez.' + - '&8Etre fatigué sur le chemin à venir' + - '&8pour les balles de tambour de feu.' +oasis_page_of_darkness_IV: + name: '&0Page des ténèbres IV' + lore: + - '&824 pas au Sud' + - '&89 pas à l''Est' + - '&836 pas au Nord' + - '&83 pas à l''Ouest' +oasis_page_of_darkness_V: + name: '&0Page des ténèbres V' + lore: + - '&89 pas au Nord' + - '&812 pas à l''Est' + - '&86 pas au Sud' + - '&86 pas à l''Est' +oasis_page_of_darkness_VI: + name: '&0Page des ténèbres VI' + lore: + - '&86 pas au Sud' + - '&86 pas à l''Est' + - '&812 pas au Nord' + - '&83 pas à l''Est' +oasis_page_of_darkness_VII: + name: '&0Page des ténèbres VII' + lore: + - '&83 pas au Nord' + - '&86 pas à l''Est' + - '&88 pas au Sud' +oasis_page_of_darkness_VIII: + name: '&0Page des ténèbres VIII' + lore: + - '&8De l''ombre sort une lumière' + - '&8dont les robes sont gris terne, gâchées par le combat.' + - '&8De glace et de neige, de feu et de chaleur.' + - '&8Déviation des haches, mais défaite des épées.' +oasis_page_of_libraris_I: + name: '&7Page de Libraris I' + lore: + - '&fSous la bibliothèque' + - '&fqui n''a pas de réflexion' + - '&fvous apparaîtra' + - '&fpassage et direction.' +oasis_page_of_libraris_II: + name: '&7Page de Libraris II' + lore: + - '&fLe reflet de la bibliothèque' + - '&contient plus de connaissances' + - '&f4 étagères plus riches en livres' + - '&fque son image vers le haut !' +oasis_page_of_libraris_III: + name: '&7Page de Libraris III' + lore: + - '&fOrientation légèrement à l''ouest' + - '&fde l''étagère qui contient le meilleur.' + - '&fLe plus de connaissances le garde.' + - '&fUn favori pour ceux qui moissonnent.' +oasis_page_of_libraris_index: + name: '&7Page de l''Index de Libraris' + lore: + - '&f5 papiers à trouver,' + - '&f3 commutateurs à retourner,' + - '&fUne porte à ouvrir' + - '&fEt vous y glisserez.' +oasis_page_of_libraris_IV: + name: '&7Page de Libraris IV' + lore: + - '&fL''oracle de la connaissance' + - '&fdonne une surprise choquante' + - '&fdepuis les profondeurs du désespoir' + - '&fDes éclairs se lèveront.' +oasis_page_of_libraris_V: + name: '&7Page de Libraris V' + lore: + - '&fSon dernier secret' + - '&fil va essayer de cacher' + - '&fmalgré l''utilisation de l''ombre et des marionnettes' + - '&fpour vous frapper pendant que vous marchez.' +oasis_page_of_plundering_I: + name: '&6Page de Pillage I' + lore: + - '&eDes maisons dans toute la ville' + - '&ecachent leurs secrets vers le haut plutôt que vers le bas.' + - '&eGrappin ou vol' + - '&epeut aider votre sort.' +oasis_page_of_sentris: + name: '&1Page de Sentris' + lore: + - '&bL''armure d''une sentinelle est trop dure' + - '&bmanier une épée, votre combat sera rude.' +oasis_page_of_the_pharaoh_I: + name: '&0Page du Pharaon I' + lore: + - '&6Un sacrifice sur l''autel' + - '&6doit être fait pour poursuivre.' + - '&6Mais qu''offrirez-vous ?' + - '&fLe grès rouge contient cet indice.' +oasis_page_of_the_pharaoh_II: + name: '&0Page du Pharaon II' + lore: + - '&6Les salles des pharaons sont alignés' + - '&6dans l''or le plus fin qui soit.' + - '&6Ce sera sa perte' + - '&6car pour de l''or, vos dégâts seront nombreux.' +oasis_page_of_the_pharaoh_III: + name: '&0Page du Pharaon III' + lore: + - '&6Les murs des pharaons sont remplis' + - '&6avec des périls et des trésors précieux.' + - '&6Depuis le coin sud-ouest de la pièce avec des fenêtres bleues' + - '&6flux de pressions très inquiétantes.' +oasis_page_of_the_pharaoh_index: + name: '&0Page de l''index Pharaon' + lore: + - '&6Le pharaon est scellé' + - '&6dans son tombeau.' + - '&6Il guette, sans être dérangé;' + - '&6ses pièges seront votre perte.' + - '&63 pages vous aideront dans votre aventure' + - '&6d''être freiné.' +oasis_page_of_the_sewer_I: + name: '&0Page de l’Égout I' + lore: + - '&3Il y a un pou de taille inhabituelle.' + - '&3Il est à l''affût, voici son prix.' + - '&3Un grand nombre de trésors à trouver' + - '&3Tout ce que vous avez à faire est de nager.' +oasis_page_of_the_sewer_II: + name: '&0Page de l’Égout II' + lore: + - '&3Activation des portes une par une' + - '&3permettra à l''eau de couler.' + - '&3Nagez vers le haut une fois qu''il se déverse' + - '&3puis dans le tunnel de droite, vous devrez continuer.' +oasis_page_of_the_sewer_index: + name: '&0Page de l’Index de l''Égout' + lore: + - '&3Le mal se cache là où les eaux s''écoulent' + - '&3Soyez toujours vigilant, ils mangeront votre cerveau!' + - '&3Vous devez ouvrir 3 portes gardées par des créatures' + - '&3bordée d''éléments en grès rouge.' + - '&32 pages vous guideront, ne forcez pas.' +oasis_page_of_vampiris_I: + name: '&4Page de Vampiris I' + lore: + - '&cDes dizaines d''armes ont frappé la bête' + - '&cet chaque coup qu''il a subi.' + - '&cIl ne craint pas la morsure de la pierre, de l''or ou des diamants le moins du monde' + - '&cMais il tremble devant le bois.' +oasis_page_of_vampiris_II: + name: '&4Page de Vampiris II' + lore: + - '&cSi le démoniste que vous cherchez à mépriser,' + - '&cpréparez-vous à un combat acharné !' + - '&cLe deuxième étage testera votre puissance,' + - '&cla conquérir en premier est un rite.' +oasis_page_of_vampiris_III: + name: '&4Page de Vampiris III' + lore: + - '&cEn bas de la flèche et dans la grotte' + - '&cest le chemin des braves.' + - '&cMéfiez-vous de ceux qui reviennent de la tombe,' + - '&ctuez le maître pour ce dont vous avez envie.' +oasis_page_of_vampiris_index: + name: '&4Page de Vampiris' + lore: + - '&cÀ l''intérieur de l''observatoire' + - '&cUne créature se cache ici' + - '&cqui n''a jamais vu le soleil.' + - '&cTrouvez 4 pages pour vous aider' + - '&céchappez-vous en vie !' +oasis_page_of_vampiris_IV: + name: '&4Page de Vampiris IV' + lore: + - '&cDeux coffres de butin,' + - '&cNe réveillez pas les morts !' + - '&cUn sous les escaliers,' + - '&cl''autre où les livres peuvent être lus !' +oasis_pharaohs_feast: + name: '&6Festin des Pharaons' + lore: + - '&eUn rappel doré' + - '&ede la ville autrefois dorée' + - '&ecorrompu par les sables du temps.' +oasis_pharaohs_flail: + name: '&0Fléau du Pharaon' + lore: + - '&4Le fléau de l''au-delà.' +oasis_pick_of_darkness: + name: '&1Choix des Ténèbres' + lore: + - '&bBrillant à travers' + - '&bles ombres.' +oasis_sunkiller: + name: '&6Tueur du Soleil' + lore: + - '&eCe rocher n''est-il pas là-bas' + - '&ejuste assez grand pour quelqu''un' + - '&epour se cacher derrière ?' +oasis_tohth: + name: '&8Aventure des Frères Boingo' + lore: + - '&fMes prémonitions sont absolues !' + - '&fC''est le destin !' +okami_drop_leggings: + name: '&cBénédiction d''Okami' + lore: + - '&cLa vitesse du loup.' + - '&cProtection contre le feu d''un dieu.' +owl_charm: + name: '&bCharme de hibou' + lore: + - '&aDevenez l''ultime nocturne' + - '&aprédateur!' +primis_artifexs_shield: + name: '&6Bouclier d''Artifex' + lore: + - '&eUne vieille relique d''une autre' + - '&emoment dangeureux. Il l''a été' + - '&erestauré dans sa splendeur !' +primis_caeruleaums_hope: + name: '&9L''espoir de Caeruleaum' + lore: + - '&8Une relique d''une époque révolue, encore pointue' + - '&8suffisamment pour blesser mais assez rouillé pour' + - '&8être dans un musée !' +primis_catacomb_drop_boots: + name: '&7Pied d''Os Sombre' + lore: + - '&7Os noirs anormaux' + - '&7couvrir ces bottes.' +primis_catacomb_drop_boots_2: + name: '&7Pied d''Os Sombre' + lore: + - '&7Os noirs anormaux' + - '&7couvrir ces bottes.' +primis_catacomb_drop_chestplate: + name: '&7Armure en Os Sombre' + lore: + - '&7Os aussi sombres que les abysses' + - '&7ornent cette armure.' + - '&7Les flèches feront tout un' + - '&7du bruit lorsqu''ils rebondissent sur les os.' +primis_catacomb_drop_chestplate_2: + name: '&7Armure en os Sombre' + lore: + - '&7Les os sont aussi sombres que les abysses' + - '&7ornent cette armure.' + - '&7Les flèches feront tout un' + - '&7du bruit lorsqu''ils rebondissent sur les os.' +primis_catacomb_drop_leggings: + name: '&7Jambières en Os Sombre' + lore: + - '&7Les os sombres qui couvrent le' + - '&7Les jambières rendront dangereux' + - '&7la chute plus surmontable.' +primis_catacomb_drop_leggings_2: + name: '&7Jambières en Os Sombre' + lore: + - '&7Les Os Sombres qui couvrent le' + - '&7Les jambières rendront dangereux' + - '&7la chute plus surmontable.' +primis_catacomb_necromancer_drop_helmet: + name: '&5Capuche d''Os Sombre' + lore: + - '&5La capuche offre peu de protection,' + - '&5il ne cherche que le sang et la mort.' +primis_catacomb_necromancer_drop_helmet_2: + name: '&5Capuche d''Os Sombre' + lore: + - '&5La capuche offre peu de protection,' + - '&5il ne cherche que le sang et la mort.' +primis_catacomb_necromancer_drop_sword: + name: '&5Marque d''Os Sombre' + lore: + - '&5La marque d''os anormalement sombre' + - '&5scintille à la lumière' + - '&5prêt à tout séparer' + - '&5qui se dresse sur son chemin.' +primis_catacomb_necromancer_drop_sword_2: + name: '&5Marque d''Os Sombre' + lore: + - '&5Les hurlements de la Marque d''Os Sombre' + - '&5vicieusement à chaque coup' + - '&5alors que l''air s''engouffre' + - '&5c''est une cavité creuse.' +primis_cooked_rabbit: + name: '&cLapin Cuit' + lore: + - Hein, ce lapin a-t-il surchauffé ? +primis_diving_helmet: + name: '&1Casque de plongée' + lore: + - Un vieux casque de plongée. + - Fonctionne toujours très bien. +primis_fish_bait: + name: '&2Appât à poisson' + lore: + - '&aOn dirait qu''on peut remonter de gros poissons avec ça.' +primis_gladius_important_documents: + name: '&2Documents importants' + lore: + - '&aLes documents sont scellés.' +primis_gladius_lord_promise: + name: '&5Accord d''assistance' + lore: + - '... par conséquent, pour l''aide apportée au cours de ces moments les plus éprouvants' + - fois, Pontis Mille promet de revenir en personne chez Gladius + - heure la plus sombre. +primis_gladius_supplies: + name: '&2Fournitures' + lore: + - '&aConvient pour nourrir un soldat pendant une guerre.' +primis_gladius_sword: + name: '&5Gladius' + lore: + - '&8Le symbole même de la forteresse de Gladius.' +primis_gladius_the_good_stuff: + name: '&2Les bonnes choses' + lore: + - '&aOdeurs... fortes.' +primis_heirloom: + name: '&2Héritage Perdu' + lore: + - '&aSemble vieux, ancien même.' +primis_ice_village_alanus_dagger: + name: '&eDague d''Alanus' + lore: + - '&eUne simple dague avec' + - '&erunes couvrant la poignée.' +primis_ice_village_chains_shipment: + name: '&aExpédition des chaînes' + lore: + - '&aBeaucoup de chaînes.' +primis_ice_village_escaped_prisoner_body: + name: '&cCorps inconscient' + lore: + - '&cLourd.' +primis_ice_village_foot_of_mountain_chest_axe: + name: '&1Hache de givre terne' + lore: + - '&1Gel au toucher' +primis_ice_village_island_chest_trident: + name: '&3Délice de Magma' + lore: + - '&3Ceux qui regardent, doivent trouver.' +primis_ice_village_living_nightmares_reward_chest: + name: 'Manteau de fourrure' + lore: + - '&3Fait à partir de' + - '&3la fourrure la plus dure qui soit.' +primis_ice_village_magical_ice_crystals: + name: '&1Cristal de Glace en Fourrure' + lore: + - Avoir le cristal à proximité + - la neige le fait réagir. +primis_ice_village_make_them_go_ouch_reward_leggings: + name: '&dJambières de rechange Violet' + lore: + - '&dDonne envie de se pavaner' + - '&droute et infligez une punition.' +primis_ice_village_salmon: + name: '&2Saumon Frais' + lore: + - Vous ne pensez pas avoir vu + - plus gros saumon dans votre vie. +primis_ice_village_silence_reward_helmet: + name: '&aHeaume des Boomers' + lore: + - '&aDoit gérer une ou deux explosions.' +primis_ice_village_taking_the_bait_reward: + name: '&bSceptre du Nord' + lore: + - '&bC''est une canne à pêche bien faite.' +primis_ice_village_violet_boots: + name: '&dBottes en Cuir Violet' + lore: + - '&dBottes en cuir élégantes avec' + - '&dUn talon aiguille relevé.' +primis_ice_village_violet_leggings: + name: '&dJambières fantaisie de Violet' + lore: + - '&dSerré et légèrement transparent' + - '&davec de beaux motifs floraux.' +primis_ice_village_violet_whip: + name: '&dLe fouet de Violet' + lore: + - '&dDélivre une punition exquise.' +primis_ice_village_wanna_build_a_snowman_reward_boots: + name: '&3Bottes Givrées' + lore: + - '&3Ce sont juste des Bottes Givrées.' +primis_invaders_assassins_bow: + name: '&8Arc de l''Assassin' + lore: + - '&aLa façon idéale de leur donner' + - '&aun goût de leur propre médecine.' +primis_invaders_boots: + name: '&4Bottes de l''Envahisseur' + lore: + - '&aCeux-ci ne sentent pas si bon.' +primis_invaders_bow: + name: '&8Arc de l''Envahisseur' + lore: + - '&aUne fois le Soleil effacé.' +primis_invaders_captains_sword: + name: '&4Épée du capitaine Envahisseur' + lore: + - '&aCourbé et d''apparence méchante.' +primis_invaders_chestplate: + name: '&4Plastron de l''Envahisseur' + lore: + - '&aRouillé, moche et malodorant. Joli!' +primis_invaders_helmet: + name: '&4Casque de l''envahisseur' + lore: + - '&aBat une commotion cérébrale !' +primis_invaders_leggings: + name: '&4Jambières de l''Envahisseur' + lore: + - '&aUn peu de pétrole pourrait être utilisé.' +primis_invaders_sword: + name: '&4Épée de l''Envahisseur' + lore: + - '&aSuspicieusement taché de sang.' +primis_lucky_pickaxe: + name: '&6Pioche porte-bonheur' + lore: + - '&eBrille fort, même sous terre.' + - '&eVous voyez LL gravé dans la poignée' +primis_monster_slaying_spear: + name: '&8Lance Tueuse de Monstre' + lore: + - Transforme les Monstres Marins en barbecue. +primis_ogre_boots: + name: '&cBottes d''Ogre' + lore: + - '&7Vous gardera en bon état' + - '&7et grillé.' +primis_ogre_chestplate: + name: '&cPlastron d''Ogre' + lore: + - 'Chaud au toucher' +primis_ogre_helmet: + name: '&cCasque d''ogre' + lore: + - '&7Vous allez transpirer des balles.' +primis_ogre_leggings: + name: '&cJambières d''Ogre' + lore: + - '&7Pantalon fumant.' +primis_ogre_mines_lucky_pickaxe: + name: '&ePioche Chanceuse' + lore: + - '&aPorte-bonheur, mais inutile.' +primis_ogre_mines_waterworks_chest_shield: + name: '&aPorte robuste' + lore: + - '&aC''est juste une porte.' +primis_old_shield: + name: '&8Vieux Bouclier' + lore: + - '&eUne vieille relique d''une autre' + - '&emoment dangeureux. Il l''a été' + - '&7pourtant réparable...' +primis_pirate_boots: + name: '&4Bottes de Pirate' + lore: + - '&aIls ont un peu trop de' + - '&atrous pour être utile.' +primis_pirate_bow: + name: '&8Arc de Pirate' + lore: + - '&aPas tout à fait un silex,' + - '&amais ça ira !' +primis_pirate_chestplate: + name: '&4Plastron du Pirate' + lore: + - '&aEn gros, un t-shirt.' +primis_pirate_helmet: + name: '&4Casque de Pirate' + lore: + - '&aManque un cache-œil.' +primis_pirate_leggings: + name: '&4Jambières de Pirate' + lore: + - '&aOn a le pied marin !' +primis_pirate_sword: + name: '&4Épée de Pirate' + lore: + - '&aCourbé et méchant.' +primis_pointis_groves_heirloom: + name: '&2Héritage Précieux' + lore: + - '&aC''est le deuxième que vous avez récupéré.' +primis_pointis_mille_chest_dirty_note: + name: Note Sale + lore: + - '&fIl y avait une épée vraiment cool' + - '&fici, mais il est parti maintenant.' +primis_pontis_beast_horn: + name: '&2Corne trempée de sang' + lore: + - '&fEn y regardant de plus près, le klaxon n''est pas' + - '&fcouvert de sang mais semble' + - '&fen être fait.' + - '&fLe sang cristallisé est incroyablement tranchant.' +primis_pontis_beast_scale: + name: '&2Écaille de Poisson Toxique' + lore: + - '&fL''échelle est dure comme de la pierre à l''extérieur.' + - '&fL''intérieur est couvert de' + - '&fvase toxique et acide.' +primis_pontis_beast_silk: + name: '&2Soie imbibée de soleil' + lore: + - '&fLa soie rayonne de lumière et de chaleur.' +primis_pontis_elf_drop_boots: + name: '&7Bottes Elfes' + lore: + - '&7Vous sentez une énergie étrange' + - '&7venant de l''armure.' +primis_pontis_elf_drop_chestplate: + name: '&7Plastron Elfe' + lore: + - '&7Vous sentez une énergie étrange' + - '&7venant de l''armure.' +primis_pontis_elf_drop_crossbow: + name: '&7Arc sombre Elfe' + lore: + - '&7Les projectiles spéciaux que l''arc' + - '&7les utilisations sont à la fois pointues et émoussées.' +primis_pontis_elf_drop_helmet: + name: '&7Casque Elfe' + lore: + - '&7Vous sentez une énergie étrange' + - '&7venant de l''armure.' +primis_pontis_elf_drop_leggings: + name: '&7Jambières Elfes' + lore: + - '&7Vous sentez une énergie étrange' + - '&7venant de l''armure.' +primis_pontis_fields_berry_charm: + name: '&dGrande baie' + lore: + - '&dL''odeur fraîche que cette baie émet' + - '&dpeut être senti à des kilomètres.' + - '&dL''odeur semble avoir un effet calmant' + - '&deffet sur les monstres et les bêtes.' + - '&dCela rend leurs attaques moins vicieuses.' +primis_pontis_groves_brood_moher_drop_charm: + name: '&aTourment des rampants' + lore: + - '&aLa soie dégage une forte énergie.' +primis_pontis_groves_nest_crawler_drop_shield: + name: '&7Leurre de Magma' + lore: + - '&7Quand le bouclier est levé' + - '&7il attire les monstres pour qu''ils le frappent.' +primis_pontis_groves_spider_boots_reward: + name: '&1Bottes à pattes d''araignée' + lore: + - '&1Bottes en pattes d''araignée et cuir.' +primis_pontis_groves_tree_climbing_elf_bandits_reward_leggings: + name: '&aJambières de perles d''Elfe' + lore: + - '&aJambières de protection' + - '&aoré de perles.' +primis_pontis_mille_arena_knowledge: + name: '&2Connaissance' + lore: + - '&aConnaissance importante.' +primis_pontis_mille_arena_reward_1: + name: '&4Bouclier touché par les étoiles' + lore: + - '&7Un bouclier orné d''un motif de cosmos.' +primis_pontis_mille_arena_reward_2: + name: '&4Plastron touché par les étoiles' + lore: + - '&7Un millier de petites étoiles pointues s''étendent sur le plastron.' +primis_pontis_mille_arena_reward_3: + name: '&4Jambières touchées par les étoiles' + lore: + - '&7Les jambières scintillent comme les étoiles dans le ciel.' +primis_pontis_mille_cat_quest_reward_charm: + name: '&9Bénédiction du chat' + lore: + - '&9Si vous le tenez tout le temps' + - '&9jusqu''à ton oreille tu peux' + - '&9entendre un léger ronronnement.' +primis_pontis_mille_counselor_sword: + name: '&ePierre de la parole lointaine' + lore: + - '&aVous pouvez sentir une présence venant de la pierre.' +primis_pontis_mille_fields_beasts_reward_chest: + name: '&eFierté des Chasseurs' + lore: + - '&eCeux qui chassent ne peuvent pas être la proie.' +primis_pontis_mille_fields_contest_berry: + name: '&dConcours de Baie' + lore: + - '&dUne belle et très grande baie.' + - '&dVraiment un spécimen sur un million.' +primis_pontis_mille_fields_do_it_yourself_reward_bow: + name: '&cArc des Chasseurs' + lore: + - '&cUn arc finement crafté.' + - '&cDes flèches tirées de ce' + - '&cl''arc blessera n''importe quelle bête.' +primis_pontis_mille_fields_first_aid: + name: '&2Matériel de premiers secours' + lore: + - '&fTout ce dont on aurait besoin" - "&fpour soigner les blessures graves.' +primis_pontis_mille_fields_rat_drop_helmet: + name: '&fChapeau du Rat à Plumes' + lore: + - '&fVous avez réussi à faire un' + - '&fchapeau hors de votre proie.' + - '&fAprès avoir extrait les proies' + - '&fpropriétés aveuglantes, vous avez fait' + - '&fcela fonctionne en votre faveur.' +primis_pontis_mille_fields_rat_meat: + name: '&cViande de Rat' + lore: + - Viande de rat crue. Pas besoin de cuire. +primis_pontis_mille_fields_stolen_berries: + name: '&4Baies volées' + lore: + - '&fCe sont les baies volées' +primis_pontis_mille_fish_nets: + name: '&2Filets de pêche' + lore: + - '&aAttraper du poisson en toute simplicité !' +primis_pontis_mille_fresh_rat: + name: '&fRat frais' + lore: + - Le chat va adorer ça. +primis_pontis_mille_mines_goblined_up_in_the_maze_reward_axe: + name: '&aHache de gobelin runique' + lore: + - '&aDes runes sont gravées sur le manche de la hache.' + - '&aElles sont assez fanés maintenant.' + - '&aOn dirait que cette hache a été maudite à un moment donné...' +primis_pontis_mille_mines_goblin_head: + name: '&2Plumes de Gobelins' + lore: + - '&aSi doux et piquant.' +primis_pontis_mille_parkour_reward_boots: + name: '&4Bottes d''arbre en diamant' + lore: + - '&7Bottes en écorce douce spéciale.' + - '&7Décoré de gemmes.' +primis_pontis_mille_reward_boots: + name: '&4Bottes Pontis Mille' + lore: + - '&7Bottes Pontis Mille traditionnelles' +primis_pontis_mille_reward_chest: + name: '&4Plastron Pontis Mille' + lore: + - '&7Un Plastron Pontis Mille traditionnel' +primis_pontis_mille_reward_helmet: + name: '&4Heaume Pontis Mille' + lore: + - '&7Heaume Pontis Mille traditionnel' +primis_pontis_mille_reward_leggings: + name: '&4Jambière Pontis Mille' + lore: + - '&4Jambière Pontis Mille traditionnelle' +primis_pontis_mille_reward_shield: + name: '&4Bouclier Pontis Mille' + lore: + - '&4Un Bouclier Pontis Mille traditionnel' +primis_pontis_mille_reward_sword: + name: '&4Katana Pontis Mille' + lore: + - '&7Incroyablement pointu' +primis_pontis_mille_serious_sewage_reward_helmet: + name: '&2Heaume de carapace de tortue' + lore: + - '&2Ça donne envie de manger une pizza.' +primis_pontis_mille_sewage_keys: + name: '&2Clés d''égout' + lore: + - '&aUn porte-clés avec beaucoup de clés dessus.' +primis_pontis_mille_sewers_ninja_drop_chestplate: + name: '&7Plastron de Ninja' + lore: + - Maintenant tu es aussi est un Ninja +primis_pontis_mille_sewers_ninja_drop_leggings: + name: '&7Jambières de Ninja' + lore: + - Maintenant tu es aussi est un Ninja +primis_pontis_mille_sewers_shredder_drop: + name: '&4Casque Déchiqueteur' + lore: + - Plein de petites lames de rasoir + - comme les points sur l'extérieur. +primis_pontis_mille_slums_chest_sword: + name: '&4Katana Pontis Mille' + lore: + - '&7Incroyablement pointu' +primis_pontis_mille_to_lycan_or_not_to_lycan_reward: + name: '&aPantalon en fourrure' + lore: + - '&aRobuste et léger' + - '&aFait à partir de fourrure et de peau.' +primis_pontis_mines_goblin_drop_boots: + name: '&8Bottes de Gobelin' + lore: + - '&7Il semble que quelqu''un ait pris un lingot de fer' + - '&7et l''a martelé dans une bonne forme.' +primis_pontis_mines_goblin_drop_chestplate: + name: '&7Plastron de Gobelin' + lore: + - '&7Il semble que quelqu''un ait pris un lingot de fer' + - '&7et l''a martelé dans une bonne forme.' +primis_pontis_mines_goblin_drop_helmet: + name: '&7Casque gobelin' + lore: + - '&7Il semble que quelqu''un ait pris un lingot de fer' + - '&7et l''a martelé dans une bonne forme.' +primis_pontis_mines_goblin_drop_leggings: + name: '&7Jambières de Gobelin' + lore: + - '&7Il semble que quelqu''un ait pris un lingot de fer' + - '&7et l''a martelé dans une bonne forme.' +primis_pontis_mines_goblin_drop_spear: + name: '&7Lance de Gobelin' + lore: + - '&7Une pierre agréable et pointue à la fin.' +primis_pontis_mines_goblin_drop_sword: + name: '&7Épée de Gobelin' + lore: + - '&7C''est juste une massue en pierre avec un manche.' +primis_pontis_redwoods_nasty_little_bandits_reward_boots: + name: 'Bottes des Bois' + lore: + - '&2Les bottes semblent être faites' + - '&2d''écorce molle, feuilles' + - '&2et la sève cristallisée des arbres.' +primis_pontis_redwoods_spider_legs: + name: '&2Pattes d''Araignée' + lore: + - '&aCe ne sont que des pattes d''araignée...' +primis_pontis_redwoods_tobacco: + name: '&2Tabac Premium' + lore: + - '&aUne odeur incroyable...' +primis_pontis_redwoods_watch: + name: '&2Montre de poche robuste' + lore: + - '&aÉtonnamment léger et robuste.' +primis_pontis_redwoods_werewolf_drop_chestplate: + name: '&7Plastron en fourrure' + lore: + - '&aFait à partir de fourrure et de peau.' + - '&7Léger, mais très résistant.' +primis_roughspun_boots: + name: '&5Bottes Rugueuses' + lore: + - '&dUsé et patiné, battu' + - '&daucune armure !' +primis_roughspun_chestplate: + name: '&5Plastron Rugueux' + lore: + - '&dUsé et patiné, battu' + - '&daucune armure !' +primis_roughspun_helmet: + name: '&5Casque Rugueux' + lore: + - '&dUsé et patiné, battu' + - '&daucune armure du tout!' +primis_roughspun_leggings: + name: '&5Jambières grossièrement filées' + lore: + - '&dUsé et patiné, battu' + - '&daucune armure du tout!' +primis_ruins_bow: + name: '&8Arc en ruine' + lore: + - Un vieil arc. Ça aurait pu être bien à un moment donné. +primis_ruins_diary_entry: + name: Page du journal + lore: + - '... Je regrette maintenant d''avoir couru après le trésor de ces ruines.' + - Maintenant que je suis tombé et que je me suis cassé les jambes, il semblerait que + - comme si je devais mourir sous le trésor que je cherchais. + - Si seulement j'avais fait plus attention pendant les cours de parkour ! +primis_ruin_relic_boots: + name: '&bBottes de la relique en ruine' + lore: + - '&6Enterré avec les ruines.' + - '&6Imprégné de pouvoir ancien.' +primis_ruin_relic_chestplate: + name: '&bPlastron de la relique en ruine' + lore: + - '&6Enterré avec les ruines.' + - '&6Imprégné de pouvoir ancien.' +primis_ruin_relic_helmet: + name: '&bHaume de la relique en ruine' + lore: + - '&6Enterré avec les ruines.' + - '&6Imprégné de pouvoir ancien.' +primis_ruin_relic_leggings: + name: '&bJambières de la relique en ruine' + lore: + - '&6Enterré avec les ruines.' + - '&6Imprégné de pouvoir ancien.' +primis_rusty_mail_boots: + name: '&3Bottes rouillées en mailles' + lore: + - '&9Rouillé mais durable, bat' + - '&9chutes de cuir !' +primis_rusty_mail_chestplate: + name: '&3Plastron en mailles rouillées' + lore: + - '&9Rouillé mais durable, bat' + - '&9chutes de cuir !' +primis_rusty_mail_helmet: + name: '&3Casque en maille grossière' + lore: + - '&9Rouillé mais durable, bat' + - '&9chutes de cuir !' +primis_rusty_mail_leggings: + name: '&3Jambières grossières en mailles' + lore: + - '&9Rouillé mais durable, bat' + - '&9chutes de cuir !' +primis_starter_boots: + name: '&4Bottes du naufragé' + lore: + - '&aCes bouts de cuir comptent à peine comme une armure.' +primis_starter_chestplate: + name: '&4Plastron du naufragé' + lore: + - '&aCes bouts de cuir comptent à peine comme une armure.' +primis_starter_helmet: + name: '&4Haume du naufragé' + lore: + - '&aCes bouts de cuir comptent à peine comme une armure.' +primis_starter_leggings: + name: '&4Jambières du naufragé' + lore: + - '&aCes bouts de cuir comptent à peine comme une armure.' +primis_starter_sword: + name: '&4L''épée du naufragé' + lore: + - '&aPeut-être improvisé à partir des restes échoués d''un navire !' +primis_storm_temple_drop_axe: + name: '&bHache de la tempête' + lore: + - '&bLe vent les repoussera.' +primis_storm_temple_drop_boots: + name: '&bBottes de tempête' + lore: + - '&bLe Temple de la Tempête' + - '&bn''a épargné aucune dépense.' +primis_storm_temple_drop_charm: + name: '&bCollier de tempête' + lore: + - '&bLa puissance de la tempête.' +primis_storm_temple_drop_chestplate: + name: '&bPlastron de tempête' + lore: + - '&bLe Temple de la Tempête' + - '&bn''a épargné aucune dépense.' +primis_storm_temple_drop_helmet: + name: '&bCasque de tempête' + lore: + - '&bLe Temple de la Tempête' + - '&bn''a épargné aucune dépense.' +primis_storm_temple_drop_leggings: + name: '&bJambières de tempête' + lore: + - '&bLe Temple de la Tempête' + - '&bn''a épargné aucune dépense.' +primis_terravilla_big_trouble_in_little_pub_reward_leggings: + name: '&eBénédiction de la Terre' + lore: + - '&eSemblent lourdes mais sont' + - '&eétonnament légères.' + - '&eIl est clair que ces' + - '&ejambières sont au moins' + - '&eVieilles de quelques siècles.' +primis_terravilla_drowning_terror_reward_charm: + name: '&bCharme de Pêche' + lore: + - '&aPoisseux.' +primis_terravilla_hog_on_my_porch_reward_helmet: + name: '&6Casque de porc' + lore: + - '&6Fabriqué à partir de cuir robuste de Razorback.' +primis_terravilla_perfect_sample: + name: '&eExemple parfait' + lore: + - '&eOn dirait un poisson...' + - '&eMais ce n''est pas le cas...' +primis_terravilla_strike_the_earth_reward_sword: + name: '&5Séparateur de Terre' + lore: + - '&5Vous avez sorti cette lame de' + - '&5du cadavre des Élémentaux de la Terre.' + - '&5Contrairement à son jumeau terne, cette' + - '&5lame est en parfait état.' +primis_terravilla_taking_out_the_trash_reward_sword: + name: '&5Séparateur de Terre' + lore: + - '&9A l''air ancien et terne.' +primis_terravilla_two_legged_terror_growth: + name: '&eCroissance de la terreur à deux jambes' + lore: + - '&eGrande croissance de la chair.' +primis_terravilla_two_legged_terror_sample: + name: '&eExemple de terreur à deux jambes' + lore: + - '&eC''est un échantillon simple.' +primis_wolf_hide_boots: + name: '&5Pantoufles cachées du loup' + lore: + - '&dUsé et patiné, battu' + - '&daucune armure !' +primis_wolf_hide_chestplate: + name: '&5Gambeson caché du loup' + lore: + - '&dUsé et patiné, battu' + - '&daucune armure !' +primis_wolf_hide_helmet: + name: '&5Casque caché du loup' + lore: + - '&dUsé et patiné, battu' + - '&daucune armure !' +primis_wolf_hide_leggings: + name: '&5Pantalon du loup caché' + lore: + - '&dUsé et patiné, battu' + - '&daucune armure du tout!' +pufferfish_drop_helmet: + name: '&bHeaume Globe' + lore: + - '&bUne fois un poisson, maintenant un casque.' +rabbit_charm: + name: '&bCharme de Lapin' + lore: + - '&aAvec ce charme, juste à propos' + - '&aune destination n''est qu''un houblon,' + - '&apassez et sautez !' +rabbit_wolf_drop_chestplate: + name: '&6Plastron chargé électriquement' + lore: + - '&6Tant que vous ne vous souciez pas de' + - '&6zap décontracté ici et là.' +rabbit_wolf_drop_leggings: + name: '&6Jambières léchées par la flamme' + lore: + - '&6Juste légèrement brûlé.' +regular_hoglin_drop_boots: + name: '&eBottes de cochon' + lore: + - '&eFabriqué en matériau durable' + - '&ecuir de porc qui parle.' +regular_hoglin_drop_chestplate: + name: '&eArmure de cochon' + lore: + - '&eFabriqué en matériau durable' + - '&ecuir de porc qui parle.' +regular_hoglin_drop_helmet: + name: '&eCapuche de cochon' + lore: + - '&eFabriqué en matériau durable' + - '&ecuir de porc qui parle.' +regular_hoglin_drop_leggings: + name: '&7Jambières de cochon' + lore: + - '&eFabriqué en matériau durable' + - '&ecuir de porc qui parle.' +rod_of_the_depths: + name: '&3Bâton des profondeurs' + lore: + - '&3Vous voulez savoir où' + - '&3Je tiens ça de ? Assieds-toi mec,' + - '&3J''ai une histoire pour toé...' +rotting_diver_drop_hoe: + name: '&bHoue de plongeurs' + lore: + - '&bTrouvé sur le cadavre d''un plongeur pourrissant.' +salamander_charm: + name: '&bCharme de salamandre' + lore: + - '&aPresque aussi chaud que la' + - '&anouvelle mixtape de MagmaGuy!' +salty_corpse_drop_helmet: + name: '&aHeaume puant' + lore: + - '&aVous ne savez pas pourquoi' + - '&avous décidez de tirer' + - '&aceci hors du cadavre.' +scorpion_charm: + name: '&bCharme de Scorpion' + lore: + - 'Flotter comme un papillon,' + - '&apique comme une abeille' + - '&apoison comme une pomme de terre !' +shulker_charm: + name: '&bCharme de Shulker' + lore: + - '&aI believe I can fly' + - '&aI believe I can touch the sky' + - '&aEt tu viens avec moi !' +skeleton_knight_drop_helmet: + name: '&fHonneur des Chevaliers' + lore: + - '&fUn casque de chevaliers. Fait pour durer.' +sky_archer_drop_bow: + name: '&aArc du ciel' + lore: + - '&aBon pour garder les fantômes à distance.' +slowpoke_charm: + name: '&bCharme de Slowpoke' + lore: + - '&aEspérons juste qu''il ne frappe pas' + - '&alui-même dans sa confusion...' +spider_knight_drop_helmet: + name: '&aPetit haume' + lore: + - '&aUn casque décent. Peut-être un peu serré.' +stacked_bones_drop_helmet: + name: '&6Crâne' + lore: + - '&6Assez grand pour s''adapter à votre' + - '&6tête à l''intérieur, alors pourquoi pas.' +summon_merchant_scroll: + name: '&6Parchemin d''invocation de marchand' + lore: + - '&aBesoin de vendre un objet ?' + - '&aClic droit pour activer' + - '&aou crie &9Jeeves!' +summon_wolf_scroll: + name: '&6Parchemin d''invocation de loup' + lore: + - '&aInvoque un bon garçon' + - '&apour vous aider à mordre les Élites!' + - '&aAssurez-vous de l''apprivoiser !' +super_mite_drop_charm: + name: '&dPerle d''acarien' + lore: + - '&dCela en valait-il la peine...' +air_ship_air_buccaneer_boots: + name: '&5Bottes de boucanier de l''air' + lore: + - '&dParfait pour les raids aériens !' +air_ship_air_buccaneer_chestplate: + name: '&5Plastron de boucanier de l''air' + lore: + - '&dParfait pour les raids aériens !' +air_ship_air_buccaneer_helmet: + name: '&5Casque de boucanier de l''air' + lore: + - '&dParfait pour les raids aériens !' +air_ship_air_buccaneer_leggings: + name: '&5Jambières de boucanier de l''air' + lore: + - '&dParfait pour les raids aériens !' +air_ship_air_pirates_boots: + name: '&5Bottes de pirate de l''air' + lore: + - '&dParfaites pour les raids aériens !' +air_ship_air_pirates_chestplate: + name: '&5Plastron du Pirate' + lore: + - '&dParfait pour les raids aériens !' +air_ship_air_pirates_helmet: + name: '&5Casque de pirate de l''air' + lore: + - '&dParfait pour les raids aériens !' +air_ship_air_pirates_leggings: + name: '&5Jambières de Pirate' + lore: + - '&dParfaites pour les raids aériens !' +air_ship_bowsmans_bow: + name: '&2Arc de l''Archer' + lore: + - '&aAbandonné par le regretté' + - '&adirigeable de l''Archer !' +air_ship_cannon_powder: + name: '&cPoudre à Canon' + lore: + - '&8Sinon, comment êtes-vous censé' + - '&8allumer la mèche ?' +air_ship_daveys_digger: + name: '&4Le Mineur de Davey' + lore: + - '&cDavey ne veut pas être opprimé' + - '&cimbéciles montrant sa pelleteuse.' +air_ship_quartermasters_whip: + name: '&fFouet de l''Intendant' + lore: + - '&7L''intendant a un ' + - '&7horaire à respecter.' +air_ship_wayfinders_windlass: + name: '&3Treuil de Wayfinder' + lore: + - '&bUtilisé pour guider les vaisseaux' + - '&bavec rien d''autre que les étoiles !' +pirate_ship_sea_feast: + name: '&6Festin de la Mer' + lore: + - '&6Un festin pour les yeux' + - '&6et la barre de vie !' +pirate_ship_sea_ration: + name: '&eRation de la Mer' + lore: + - '&eUne pomme par jour' + - '&eéloigner le scorbut' + - '&cNote: il ne l''est pas' +catacombs_tier_10_miniboss_boots: + name: '&9Bottes en toile d''araignée' + lore: + - '&5Aussi légères que l''air !' +catacombs_tier_10_miniboss_spider_eye: + name: '&7Œil de Terragog' + lore: + - '&7Des chuchotements de nulle part atteignent' + - '&7vos oreilles en tenant ceci...' +catacombs_tier_15_boss_bone: + name: Le Cueilleur + lore: + - '&fVous avez un os à choisir !' +catacombs_tier_15_boss_bow: + name: '&6Le secoueur d''Os' + lore: + - '&fIls le sentiront jusque dans' + - '&fleurs os !' +catacombs_tier_15_boss_shovel: + name: '&8Fossoyeur' + lore: + - '&fIls la sentiront jusque dans' + - '&fleurs os !' +catacombs_tier_15_mimic_boss_shield: + name: '&3Bouclier du Templier Perdu' + lore: + - Trouvé à l'intérieur d'un mystérieux coffre dans un + - chambre secrète des anciennes catacombes... +colosseum_pit_breaker: + name: '&4Destructeur de Fosses' + lore: + - '&4Véni' +colosseum_pit_filler: + name: '&4&lRemplisseur de fosse' + lore: + - '&4Vici' +colosseum_pit_maker: + name: '&4&lRemplisseur de fosse' + lore: + - '&4Vidi' +dark_cathedral_tier_75_sword: + name: '&0Épée maudite' + lore: + - '&0&kChtulhu est le seul vrai Dieu.' + - '&0&kCe monde n''est qu''un agneau' + - '&0&kà l''abattoir' +darkspire_arzags_boots: + name: '&8Bottes de guerre d''Arzag' + lore: + - '&7Autrefois porté par le puissant Arzag !' +darkspire_arzags_chestplate: + name: '&8Plastron de guerre d''Arzag' + lore: + - '&7Autrefois porté par le puissant Arzag !' +darkspire_arzags_helmet: + name: '&8Haume de guerre d''Arzag' + lore: + - '&7Autrefois porté par le puissant Arzag !' +darkspire_arzags_leggings: + name: '&8Jambières de guerre d''Arzag' + lore: + - '&7Autrefois porté par le puissant Arzag !' +darkspire_arzags_slicer: + name: '&8Trancheur d''Arzag' + lore: + - '&7Autrefois porté par le puissant Arzag !' +darkspire_crypt_keepers_boots: + name: '&4Bottes du gardien des cryptes' + lore: + - '&cAutrefois les bottes du' + - '&cGardien Corrompu de la Crypte !' +darkspire_hellraisers_battle_armor: + name: '&4Armure de Combat d''Eerbix' + lore: + - '&cAutrefois la bataille' + - '&carmure de l''égoïste' + - '&cEerbix le Déchu !' +darkspire_maalkvs_bow: + name: '&4Arc de Maalkv' + lore: + - '&cAnciennement l''arc de' + - '&cl''espiègle Maalkv!' +darkspire_netherite_axe: + name: '&8Éviscérateur du Néant' + lore: + - '&8Les fragments du vide lui-même étaient' + - '&8Collectés pour former le clivage' + - '&8Tête de cette ancienne arme.' +darkspire_nicolas_ribcages_helmet: + name: '&4Casque de Nicolas Ribcage' + lore: + - '&cAncien casque de' + - '&cl''infâme Nicolas Ribcage!' +darkspire_oroxaks_sword: + name: '&4Épée d''Oroxak' + lore: + - '&cAnciennement l''épée de' + - '&cl''odieux Oroxak!' +darkspire_zalmurs_leggings: + name: '&4Jambières de Zalmur' + lore: + - '&cAutrefois les jambières de' + - '&cZalmur le Zélé' + - '&cLe Trancheur de Gobelin!' +the_feller: + name: '&2L''abatteur' + lore: + - '&aMême dans votre sommeil,' + - '&avous pouvez sentir cette hache' + - '&asaplust' +the_great_weaver_drop_charm: + name: '&cSoie des tisseurs' + lore: + - '&cUne grande puissance est imprégnée en cette soie.' +hallosseum_amazing_treat: + name: '&aEtonnant Régal!' + lore: + - '&eUne collation incroyable!' +hallosseum_axe_of_beheadings: + name: '&cHache de Décapitation' + lore: + - '&4Célèbrement utilisée pour décapiter un' + - '&4certain cavalier sans tête !' +hallosseum_incredible_treat: + name: '&aIncroyable Régal!' + lore: + - '&eUne collation incroyable!' +hallosseum_treat: + name: '&aBonbon!' + lore: + - '&eUn délicieux en-cas !' +hallosseum_treat_v2: + name: '&aBonbon!' + lore: + - '&eUn délicieux en-cas !' +the_hunter_drop_crossbow: + name: '&aAmi du Chasseur' + lore: + - '&aQue la chasse commence.' +northpole_amazing_treat: + name: '&aEtonnant Régal!' + lore: + - '&eUne collation incroyable!' +northpole_coalbringer: + name: '&8Porteur de charbon' + lore: + - '&cTout ce que je touche' + - '&cCommence à fondre dans mon etreinte.' + - '&cJe suis incroyable !' +northpole_frostcaster: + name: '&bLanceur de givre' + lore: + - '&7Tout ce que je touche' + - '&7Se transforme en neige dans mon étreinte!' + - '&7Je suis incroyable' +northpole_incredible_treat: + name: '&aIncroyable Régal!' + lore: + - '&eUne collation incroyable!' +northpole_naughty_lister: + name: '&4Le vilain Auditeur' + lore: + - '&cPrend les noms. Ne demande pas deux fois !' + - '&cAvez-vous été méchant cette année ?' +northpole_treat: + name: '&aBonbon !' + lore: + - '&eUn délicieux en-cas !' +northpole_treat_v2: + name: '&aBonbon!' + lore: + - '&eUn délicieux en-cas !' +the_phantom_drop_chestplate: + name: '&dPhantom Gambison' + lore: + - '&dVous direz qu''il est fait de douceur' + - '&det confortable tissu fibreux, mais une lame' + - '&dne se recuperait pas d''un tissu frappant.' +pirate_ship_tier_15_boots: + name: Sandales pirates + lore: + - Vous donner envie + - d'aller à la plage ! +pirate_ship_tier_15_bow: + name: Arc court Pirate + lore: + - Parfait pour les parties à bord! +pirate_ship_tier_15_chestplate: + name: Chemise de pirate + lore: + - Pas de chaussures, pas de chemise + - pas de problème ! +pirate_ship_tier_15_helmet: + name: Bandana de pirate + lore: + - Pas de chaussures, pas de chemise + - pas de problème ! +pirate_ship_tier_15_leggings: + name: Ceinture de Pirate + lore: + - Celle-ci pourraient être lavée ! +pirate_ship_tier_15_sword: + name: Pointe de marin pirate + lore: + - Bruyant et mortel ! +pirate_ship_tier_20_miniboss_axe: + name: '&5Cookie Attendrisseur' + lore: + - '&5Vous sentirez cela demain !' +pirate_ship_tier_20_miniboss_chestplate: + name: '&5Tablier de cookie' + lore: + - '&5A vu de meilleurs jours !' +pirate_ship_tier_25_boots: + name: '&aChaussures pirates' + lore: + - '&aParfait pour voler !' +pirate_ship_tier_25_bow: + name: '&aMousquet Pirate' + lore: + - '&aAttention là où vous le pointez !' +pirate_ship_tier_25_chestplate: + name: '&aVeste Pirate' + lore: + - '&aProbablement obtenu illégalement !' +pirate_ship_tier_25_helmet: + name: '&aBoucles d''oreilles pirates' + lore: + - '&aUne valeur suffisante pour payer pour' + - '&aun enterrement!' +pirate_ship_tier_25_leggings: + name: '&aPantalon Pirate' + lore: + - '&aPlein de pièces d''or !' +pirate_ship_tier_25_miniboss_helmet: + name: '&5Cache-œil du Helmsman' + lore: + - '&5Comment pouvez-vous mieux voir' + - '&5avec!?' +pirate_ship_tier_25_miniboss_trident: + name: '&5Trident du Helmsman' + lore: + - '&5Pointe tendue vers l''ennemi!' +pirate_ship_tier_25_sword: + name: '&aCoutelas de Pirate' + lore: + - '&aVraiment piraté !' +pirate_ship_tier_30_miniboss_axe: + name: '&5Hacheur de Crushy' + lore: + - '&5Prenez garde !' +pirate_ship_tier_30_miniboss_shield: + name: '&5Épaule de Crushy' + lore: + - '&5Jamais raté la journée des épaules!' +pirate_ship_tier_35_boots: + name: '&9Bottes de Pirate' + lore: + - '&9Parfait pour faire du cape et d''épée !' +pirate_ship_tier_35_bow: + name: '&9Canon à Main de Pirate' + lore: + - '&9Faites-les exploser !' +pirate_ship_tier_35_chestplate: + name: '&9Bracelets pirates' + lore: + - '&9Parfait pour looter !' +pirate_ship_tier_35_helmet: + name: '&9Cache-œil de Pirate' + lore: + - '&9Pas génial pour voir !' +pirate_ship_tier_35_leggings: + name: '&9Jambières de Pirate' + lore: + - '&9Parfaites pour looter !' +pirate_ship_tier_35_miniboss_boots: + name: '&9Bottes du Garde du Corps' + lore: + - '&5Pour ceux qui ont quelque chose à défendre !' +pirate_ship_tier_35_miniboss_chestplate: + name: '&5Bretelles du Garde du Corps' + lore: + - '&5Pour ceux qui ont quelque chose à défendre !' +pirate_ship_tier_35_miniboss_crossbow: + name: '&5Canon à Main du Garde du Corps' + lore: + - '&5Pour ceux qui ont quelque chose à défendre !' +pirate_ship_tier_35_miniboss_helmet: + name: '&5Cache-œil du Garde du corps' + lore: + - '&5Pour ceux qui ont quelque chose à défendre !' +pirate_ship_tier_35_miniboss_leggings: + name: '&5Jambières du Garde du Corps' + lore: + - '&5Pour ceux qui ont quelque chose à défendre !' +pirate_ship_tier_35_miniboss_sword: + name: '&5Coutelas du Garde du Corps' + lore: + - '&5Pour ceux qui ont quelque chose à défendre !' +pirate_ship_tier_35_sword: + name: '&9Coutelas de Pirate' + lore: + - '&9Vraiment pirate !' +pirate_ship_tier_40_miniboss_crossbow: + name: '&5Le Tromblon' + lore: + - '&5Pulvérisez et priez !' +pirate_ship_tier_40_miniboss_leggings: + name: '&5Les Zaggers' + lore: + - '&5Quand ils pensent que vous allez !' + - '&5allez zigzaguer entre eux !' +pirate_ship_tier_45_boss_helmet: + name: '&5Cache-œil du Capitaine' + lore: + - '&5Je ne vois aucun problème !' +pirate_ship_tier_45_boss_sword: + name: '&5Cimeterre du Capitaine' + lore: + - '&5En garde, sales rats pleins de scorbut !' +the_ruins_boss_loot: + name: '&6Hache de Thor' + lore: + - Seul un cœur pur + - peut manier cette hache. +sewer_drowned_kings_boots: + name: '&4Bottes du Roi des Noyés' + lore: + - '&cAutrefois les bottes du' + - '&cdiabolique Roi des Noyés !' +sewer_drowned_kings_chestplate: + name: '&4Plastron du Roi des Noyés' + lore: + - '&cAncien casque du' + - '&cdiabolique Roi des Noyés !' +sewer_drowned_kings_crown: + name: '&4Couronne du Roi des Noyés' + lore: + - '&cAutrefois la couronne du' + - '&cdiabolique Roi des Noyés !' +sewer_drowned_kings_leggings: + name: '&4Jambières du Roi des Noyés' + lore: + - '&cAutrefois les jambières du' + - '&cdiabolique Roi des Noyés !' +sewer_drowned_kings_trident: + name: '&4Trident du Roi des Noyés' + lore: + - '&cAncien trident du' + - '&cle diabolique Roi Noyé !' +sewer_spelunkers_boots: + name: '&2Bottes du Spéléologue d''égout' + lore: + - '&aLes égouts meilleurs et à venir' + - '&aJambières essentielles de l''explorateur!' +sewer_spelunkers_chestplate: + name: '&2Plastron du Spéléologue d''égout' + lore: + - '&aLes égouts meilleurs et à venir' + - '&aPlastron essentiel de l''explorateur!' +sewer_spelunkers_helmet: + name: '&2Casque du Spéléologue d''égout' + lore: + - '&aLes égouts meilleurs et à venir' + - '&aCasque essentiel de l''explorateur!' +sewer_spelunkers_leggings: + name: '&2Jambières du Spéléologue d''égout' + lore: + - '&aLes égouts meilleurs et à venir' + - '&aJambières essentielles de l''explorateur!' +sewer_spelunkers_sword: + name: '&2Épée du Spéléologue d''égout' + lore: + - '&aLes égouts meilleurs et à venir' + - '&aCasque essentiel de l''explorateur!' +the_stinger: + name: '&eLe Dard' + lore: + - 'Flotter comme un papillon,' + - '&apique comme une abeille!' +tree_defender_drop_shield: + name: '&7Bouclier de bois vivant' + lore: + - '&7Ce bouclier se' + - '&7Réparera lentement tout seul.' +unbind_scroll: + name: '&5Délier le parchemin' + lore: + - '&5Permet aux utilisateurs de délier un' + - '&5objet lié à une enclume !' + - '&5À utiliser avec sagesse !' +undead_farmer_drop_shovel: + name: '&8Maître du fumier' + lore: + - '&8Parfait pour pelleter le fumier de cochon.' +unwanted_visitor_drop_bow: + name: '&1Arc de givre' + lore: + - '&9Vous donne envie de vous rafraîchir' + - '&9 et tirer de loin.' +vampire_manor_gargoyle_granulator: + name: '&8Granulateur de Gargouille' + lore: + - '&cLégèrement saupoudré d''ail.' +vampire_manor_stake_your_claim: + name: '&4Reprendre votre réclamation' + lore: + - '&cLégèrement saupoudré d''ail.' +vampiric_charm: + name: '&bCharme vampirique' + lore: + - '&aPersonne ne peut se rappeler où ça' + - '&aest venu de, et personne ne peut,' + - '&aoubliez à quel point c''est dangereux...' +veterans_boots: + name: '&6Bottes du vétéran' + lore: + - '&2Décerné à ceux qui défient' + - '&2l''''Arène de la Ligue de Bois!' +veterans_chestplate: + name: '&6Plastron du vétéran' + lore: + - '&2Décerné à ceux qui défient' + - '&2l''''Arène de la Ligue de Bois!' +veterans_helmet: + name: '&6Casque du vétéran' + lore: + - '&2Décerné à ceux qui défient' + - '&2l''''Arène de la Ligue de Bois!' +veterans_leggings: + name: '&6Jambières du vétéran' + lore: + - '&2Décerné à ceux qui défient' + - '&2l''''Arène de la Ligue de Bois!' +veterans_sword: + name: '&6Épée du vétéran' + lore: + - '&2Décerné à ceux qui défient' + - '&2l''''Arène de la Ligue de Bois!' +vex_top_drop_boots: + name: '&bBottes Vexées' + lore: + - '&bAvec de puissantes bottes' + - '&bVient la puissance.' +warlock_drop_chestplate: + name: '&dRobe de démoniste' + lore: + - '&dOffre une bonne protection contre les sorts.' +warlock_drop_helmet: + name: '&dCapuche de démoniste' + lore: + - '&dOffre une bonne protection contre les sorts.' +water_pest_drop_shield: + name: '&bBouclier détrempé' + lore: + - '&bIl est assez robuste en fait.' +wendigo_drop_sword: + name: '&8Lame de la famine' + lore: + - '&8Cette lame sera toujours' + - '&8assoifée de plus de sang.' +werehare_drop_charm: + name: '&eTrophée Garou' + lore: + - '&eChance et santé à' + - '&eceux qui le portent.' +werewolf_bone: + name: '&6Os de Loup-garou' + lore: + - '&aAyant tué l''alpha,' + - '&aCela fait temporairement de vous !' + - '&aLe nouveau chef des loups' +wolfsbane: + name: '&7Fléau des Loups' + lore: + - '&aFabriqué à partir des restes de' + - '&aUn loup-garou alpha, tout' + - '&ales loups se recroquevillent à sa vue.' +yeti_drop_leggings: + name: '&aPantalon en fourrure' + lore: + - '&eConfortable et chaud.' +yezhi_baba_drop_boots: + name: '&aRobe de Sorcières' + lore: + - '&aL''odeur devrait partir' + - '&aéventuellement.' +zombie_kings_axe: + name: '&4Hache du Roi Zombie' + lore: + - La hache des zombies uniques + - appeler leur roi. + - La soif de sang est palpable. +airship_minidungeon: + name: '&6L''aéronef' + customInfo: + - '&fUn formidable aéronef plein de pirates morts-vivants!' + - '&6Credits: MagmaGuy, 69OzCanOfBepis' + - '&6et Realm of Lotheridon' + playerInfo: |- + Difficulté: &6Moyen + $bossCount boss, de niveau $lowestTier à $highestTier + &6Un aéronef génial plein de pirates morts-vivants + &6pour les joueurs expérimentés! + regionEnterMessage: '&8[EM] &cEntrée dans la zone aérienne hostile !' + regionLeaveMessage: '&8[EM] &cSortie de la zone aérienne hostile !' +binder_of_worlds_lair: + name: '&5Lieur de mondes' + customInfo: + - '&5Le défi ultime. Soyez prêt !' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulté: &6Cauchemar + Boss final $highestTier de niveau $bossCount! + &5C'est le combat le plus dur d'EliteMobs! + regionEnterMessage: '&8[EM] &5La réalité se déchaîne autour de vous. Vous faites face au défi final. &4Vous n''êtes pas prêts!' + regionLeaveMessage: '&8[EM] &5Vous avez quitté le déchaînement. Avez-vous trouvé ce que vous cherchiez ? En valait-il la peine?' +catacombs_lair: + name: '&fLes Catacombes' + customInfo: + - '&fLe meilleur donjon de départ pour les joueurs !' + - '&6Crédits: Realm of Lotheridon' + playerInfo: |- + Difficulté: &cDifficile + $bossCount boss, de palier $lowestTier à $highestTier + &2La meilleure tanière pour les groupes de débutants! + regionEnterMessage: '&8[EM] &8Entrée dans les Catacombes. Faites attention à ce qui habite au-dessous...' + regionLeaveMessage: '&8[EM] &8Vous avez quitté les Catacombes. Est-ce que ça en valait le coup?' +colosseum_lair: + name: '&6Le Colisée' + customInfo: + - '&fAvec le premier vrai boss du monde, en premier' + - '&fbataille multi-phasée, premier boss monté,' + - '&fpremier boss déguisé... un combat vraiment épique!' + - '&6Crédits: MagmaGuy & Maldini' + playerInfo: |- + Difficulté: &4Difficile + $bossCount boss, du niveau $lowestTier à $highestTier + &cUn vrai challenge pour les grands groupes de joueurs! + regionEnterMessage: '&8[EM] &6Les champions et les challengers se préparent ! &eProuvez votre valeur contre les plus puissants des ennemis !' + regionLeaveMessage: '&8[EM] &6Adieu voyageur ! &eRevenez bientôt pour montrer votre puissance une fois de plus !' +dark_cathedral_lair: + name: '&8La Cathédrale Sombre' + customInfo: + - '&fLe tout premier repaire EliteMobs !' + - '&fUn classique dont tous les serveurs ont besoin !' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulté: &cDifficile + $bossCount niveau $highestTier Big Boss! + &cLe mini donjon original, un défi pour + &ca petit groupe de joueurs ou pour les vétérans! + regionEnterMessage: '&8[EM] &8Bienvenue dans la Cathédrale des ténèbres. &4La mort vous attend dedans...' + regionLeaveMessage: '&8[EM] &8Quitter maintenant la Cathédrale des ténèbres. &4Elle attend votre retour...' +dark_spire_minidungeon: + name: '&8La Cime Sombre' + customInfo: + - '&fLe premier contenu de haut niveau !' + - '&fFait pour ceux qui veulent un vrai défi!' + - '&6Credits: 69OzCanOfBepis' + playerInfo: |- + Difficulté: &6Moyenne + $bossCount boss, du niveau $lowestTier à $highestTier + &cUn vaste défi pour les joueurs avancés! + regionEnterMessage: '&8[EM] &1Une invasion est en cours. &9Arrêtez l’insurrection!' + regionLeaveMessage: '&8[EM] &1Vous avez réussi à les retenir. &9Pour l''instant...' +fireworks_lair: + name: '&aFeux d''Artifices' + customInfo: + - '&fLa carte 2021 du 4 juillet 2021!' + - '&6Crédits: MagmaGuy' + playerInfo: |- + Difficulté: &cDifficile + $bossCount niveau $lowestTier Big Boss! + &6Une rencontre pleine d'explosions! + regionEnterMessage: '&8[EM] &eBienvenue dans le spectacle des feux d''artifice !' + regionLeaveMessage: '&8[EM] &eVous avez quitté la fête !' +frost_palace_sanctum: + name: Palais de Glace + customInfo: + - '&fUn combat en 7 phases contre' + - la reine de la glace! + - '&6Crédits: MagmaGuy, Delio' + playerInfo: 'Difficulté: &4Contenu difficile pour 5!' + regionEnterMessage: '&bVous entrez dans le palais de glace ! Restez givrés !' + regionLeaveMessage: '&bVous avez quitté le Palais de Glace !' +hallosseum_lair: + name: '&cHallosseum' + customInfo: + - '&fLa rencontre d''halloween effrayant 2020 !' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulté: &cdifficile + $bossCount niveau $lowestTier Big Boss! + &6Un défi Halloween amusant! + regionEnterMessage: '&8[EM] &4Un bonbon ou un sort! &8Votre âme est à moi!' + regionLeaveMessage: '&8[EM] &4Vous vous êtes échappé avec votre âme intacte.' +invasion_minidungeon: + name: '&2L''Invasion' + customInfo: + - '&fLe Minidonjon d''Halloween!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulté: &6Moyenne + $bossCount aliens, du niveau $lowestTier à $highestTier + &6Ne vous faîtes pas enlever! + regionEnterMessage: '&8[EM] &7Invasion extraterrestre en cours ! Triomphez de la Mère !' + regionLeaveMessage: '&8[EM] &7Vous avez échappé aux enlèvements extraterrestres ! Personne ne vous croira jamais.' +north_pole_minidungeon: + name: '&9Le Pôle Nord' + customInfo: + - '&fLe mini donjon de Noël !' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulté: &cMedium + $bossCount boss, du niveau $lowestTier à $highestTier + &6Noël dans une boule de neige! + regionEnterMessage: '&8[EM] &7Vous avez atteint le Pôle Nord ! &fAvez-vous été vilain cette année ?' + regionLeaveMessage: '&8[EM] &7Revenez visiter. &fIl y a beaucoup de bonbons et de gâteries pour la prochaine fois!' +oasis_adventure: + name: '&6L''Oasis' + customInfo: + - '&fUne aventure massive pour les débutants!' + - '&6Credits: 69OzCanOfBepis' + playerInfo: |- + Difficulté: Solotable + $bossCount &2boss, du niveau $lowestTier à $highestTier + &6Une grande aventure pour les gens qui connaissent les ficelles ! + regionEnterMessage: '&8[EM] &6Vous êtes arrivé à l''Oasis !' + regionLeaveMessage: '&8[EM] &6Vous avez quitté l''Oasis !' +pirate_ship_minidungeon: + name: '&6Le Navire Pirate' + customInfo: + - '&fUn plaisir, minidungeon difficile plein de' + - '&fboss fait pour les joueurs qui commencent à s''améliorer,' + - '&gros EliteMobs!' + - '&6Crédits : MagmaGuy & Domaine de Lotheridon' + playerInfo: |- + Difficulté: &6Chefs + Moyens de$bossCount , de niveau $lowestTier à $highestTier + &6Un des meilleurs terrains de chasse pour&6aventuriers ! + regionEnterMessage: '&8[EM] &3Pillage et pillage du contenu du bateau Pirate maintenant !' + regionLeaveMessage: '&8[EM] &3Joueur par-dessus bord ! &bRetournez quand vous avez gagné vos jambes de mer vous êtes le plombier !' +primis_adventure: + name: '&7Primis' + customInfo: + - '&fUne aventure tutorielle pour les nouveaux joueurs!' + - '&6Credits: 69OzCanOfBepis, MagmaGuy' + playerInfo: |- + Difficulté: &2Facile + $bossCount boss, du niveau $lowestTier à $highestTier + &6Une aventure tutorielle pour les nouveaux joueurs! + regionEnterMessage: '&8[EM] &6Primis attend, frappez la terre !' + regionLeaveMessage: '&8[EM] &6Vous avez quitté Primis!' +sewers_minidungeon: + name: '&8Les égouts' + customInfo: + - '&fLe plus grand minidungeon jamais créé !' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulté: &6Chefs + Moyens de$bossCount , de niveau $lowestTier à $highestTier + &6Un labyrinthe complexe de donjons avec une section difficile ! + regionEnterMessage: '&8[EM] &5Cet endroit semble abandonné... &dPourtant, quelque chose se cache dans ces égouts !' + regionLeaveMessage: '&8[EM] &5Vous avez réussi à rester au-dessus de l''eau. &dPeut-être que la prochaine fois que vous vous noierez.' +the_ruins: + name: '&6Les Ruines' + customInfo: + - '&fUn combat contre un mythe de' + - '&fLa mythologie nordique, préparez-vous à être frappé !' + - '&6Credits: 69OzCanOfBepis, MagmaGuy' + playerInfo: |- + Difficulté: &cDifficile + $bossCount niveau $lowestTier Big Boss! + &cUn dur combat contre un dieu nordique! + regionEnterMessage: '&8[EM] &3Ceux qui défient les mythes doivent être préparés à leur chute !' + regionLeaveMessage: '&8[EM] &3Vous savez maintenant ce qu''il faut pour faire une légende !' +vampire_manor: + name: '&cLe Manoir Vampire' + customInfo: + - '&fPréparez-vous à répandre du sang!' + - '&6Credits: MagmaGuy, 69OzCanOfBepis' + playerInfo: |- + Difficulté: Moyen + $bossCount &6Boss, de niveau $lowestTier à $highestTier + &6Un manoir mortel plein de créatures enragées ! + &6Êtes-vous prêt à affronter ce qui hante la nuit? + regionEnterMessage: '&8[EM] &cIntrusion en terrains dangereux!!' + regionLeaveMessage: '&8[EM] &cTu quittes la terre hantée !' +alpha_werewolf_p1: + name: '$eventBossLevel &7Vindicateur enragé' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Le Loup Alpha a été abattu!' + - '&c&l 1er en dégât : $damager1name &cavec $damager1damage dégâts !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&aTueurs : $players' + - '&e&l---------------------------------------------' + locationMessage: '&7Vindicateur enragé : $distance blocs de distance !' + spawnMessage: '&cLes hurlements d''un loup-garou Alpha ont été entendus !' + deathMessage: '&aLe Loup-garou Alpha a été arrêté par $players!' + escapeMessage: '&4L''Aube se lève, le Loup Alpha disparaît sans laisser de traces !' +alpha_werewolf_p2: + name: '$eventBossLevel &7Loup-garou Alpha' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Le Loup Alpha a été abattu!' + - '&c&l 1er en dégât : $damager1name &cavec $damager1damage dégâts !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&aTueurs : $players' + - '&e&l---------------------------------------------' + locationMessage: '&7Loup Alpha : $distance blocs de distance !' + spawnMessage: '&cLes hurlements d''un loup-garou Alpha ont été entendus !' + deathMessage: '&aLe Loup-garou Alpha a été arrêté par $players!' + escapeMessage: '&4L''Aube se lève, le Loup Alpha disparaît sans laisser de traces !' +ancient_corpse: + name: '$eventBossLevel &eCadavre Ancien' +animated_armor: + name: '$eventBossLevel &8Armure animée' + locationMessage: '&cArmure Animée : $distance blocs de distance !' + spawnMessage: '&cOh non ! Une armure animée s''est échappée de son porte-armure !' + deathMessage: '&aL''Armure Animée a été arrêtée par $players!' + escapeMessage: '&4L''armure animée a disparu !' +arachnid_matriarch: + name: '$eventBossLevel &cMatriarche arachnide' + locationMessage: '&cMatriarche Arachnide : $distance blocs de distance !' + spawnMessage: '&cUne Matriarche est venue répandre sa progéniture sur la terre !' + deathMessage: '&aLa Matriarche et sa progéniture ont été arrêtées par $players!' + escapeMessage: '&4La Matriarche est partie!' +arachnid_matriarch_summon: + name: '$eventBossLevel &4Broyeuse' +armor_goblin: + name: '$eventBossLevel &3Goblin Armurier' + deathMessages: + - '&e&l---------------------------------------------' + - '&eLe gobelin armurier a été pillé !' + - '&c&l 1er en dégât : $damager1name &cavec $damager1damage dégâts !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&aTueurs : $players' + - '&e&l---------------------------------------------' + locationMessage: '&cGobelin armurier : $distance blocs de distance !' + spawnMessage: '&eUn gobelin armurier a été aperçu !' + deathMessage: '&aUn gobelin armurier a été vaincu par $players!' + escapeMessage: '&4Un gobelin armurier s''est échappé!' +baba_rhoga: + name: '$eventBossLevel &cBaba Rhoga' + locationMessage: '&cBaba Rhoga : $distance blocs de distance !' + spawnMessage: '&cUne folle maléfique est sortie de sa demeure !' + deathMessage: '&a$players! a mis la folle au repos pour le moment.' + escapeMessage: '&4ALa folle est partie!' +baba_rhoga_summon: + name: '$reinforcementLevel &4Baba Rhoga' +baba_yaga: + name: '$eventBossLevel &cBaba Yaga' + locationMessage: '&cBaba Yaga: $distance blocs de distance !' + spawnMessage: '&cUne folle maléfique est sortie de sa demeure !' + deathMessage: '&a$players! a mis la folle au repos pour le moment.' + escapeMessage: '&4ALa folle est partie!' +baba_yaga_summon: + name: '$reinforcementLevel &4Baba Yaga' +balloon_rider: + name: '$eventBossLevel &dPilote de montgolfière' + locationMessage: '&cPilote de montgolfière : $distance blocs de distance !' + spawnMessage: '&cUn brave pilote de montgolfière est arrivé au Nether!' + deathMessage: '&aLe pilote de montgolfière a fait sa dernière course grâce à $players!' + escapeMessage: '&4Le Pilote de montgolfière est parti !' +balloon_rider_mount: + name: '$eventBossLevel &5Horrible Montgolfière' +balrog: + name: '$eventBossLevel &4Balrog' +banshee: + name: '$eventBossLevel &cBanshee' + locationMessage: '&cBanshee: $distance blocs de distance !' + spawnMessage: '&cOn peut entendre les pleurs de la Banshee !' + deathMessage: '&aLa banshee a été réduite au silence par $players!' + escapeMessage: '&4La banshee est partie!' +banshee_summon: + name: '$eventBossLevel &cGrief' +beast_master: + name: '$eventBossLevel &6Maître des Bêtes' + deathMessages: + - '&e&l---------------------------------------------' + - '&eLe Maître des Bêtes a été sauvé !' + - '&c&l 1er en dégât : $damager1name &cavec $damager1damage dégâts !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&aTueurs : $players' + - '&e&l---------------------------------------------' + locationMessage: '&cMaître des Bêtes : $distance blocs de distance !' + spawnMessage: '&cLe Maître des Bêtes a été aperçu !' + deathMessage: '&aLe Maître des Bêtes a été vaincu par $players!' + escapeMessage: '&4Le Maître des Bêtes est retourné dans la nature !' +beast_tamer: + name: '$eventBossLevel &6Maître des Bêtes' + locationMessage: '&cDompteur de bêtes : $distance blocs de distance !' + spawnMessage: '&cUn maître des bêtes rôde dans le monde !' + deathMessage: '&aLe dompteur de bêtes a été arrêté par $players!' + escapeMessage: '&4Le dompteur de bêtes est parti!' +beast_tamer_summon: + name: '$eventBossLevel &6Grande Bête' +beast_tamer_summon_1: + name: '$eventBossLevel &6Bête' +beta_wolf: + name: '$reinforcementLevel &7Loup Beta' +bigfoot: + name: '$eventBossLevel &fBigfoot' + locationMessage: '&Bigfoot: $distance blocs de distance !' + spawnMessage: '&cUne bête puissante est apparue !' + deathMessage: '&aLa bête n''est reconnaissante envers $players!.' + escapeMessage: '&4La bête s''est échappée !' +big_bad_wolf: + name: '$eventBossLevel &fGrand Méchant Loup' + locationMessage: '&cGrand Méchant loup : $distance blocs de distance !' + spawnMessage: '&cEt il bouffa et il gonfla !' + deathMessage: '&aLes petits cochons sont maintenant en sécurité grâce à $players!' + escapeMessage: '&4Le Grand Méchant Loup est parti!' +binder_of_worlds_phase_1_endermite_reinforcement: + name: '$reinforcementLevel &5Corrupteur de réalité' +binder_of_worlds_phase_3_enderman_reinforcement: + name: '$reinforcementLevel &5Meurtrier de réalité' +binder_of_worlds_phase_3_ghast_reinforcement: + name: '$reinforcementLevel &5Déchiqueteur de réalité' +blayyze: + name: '$eventBossLevel &6Blayyze' + deathMessages: + - '&e&l---------------------------------------------' + - '&6Le Blayyze a été repoussé !' + - '&c&l 1er en dégât : $damager1name &cavec $damager1damage dégâts !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&aTueurs : $players' + - '&e&l---------------------------------------------' + locationMessage: '&6????: $distance blocs de distance' + spawnMessage: '&cQuelque chose est sorti du cratère de la météorite...' + deathMessage: '&6$players a terminé le premier contact.' + escapeMessage: '&6Les aliens ont été emmenés dans la zone 51 !' +bloated_jeffrey: + name: '$eventBossLevel &dJeffrey gonflé' + locationMessage: '&cJeffrey gonflé : $distance blocs de distance !' + spawnMessage: '&cC''est Jeffrey ! Ils sont dans le nether! Apportez un arc !' + deathMessage: '&aJeffrey gonflé a été tué par $players!' + escapeMessage: '&4Jeffrey et ses amis se sont ennuyés et ils sont partis!' +bloated_jeffrey_summon: + name: '$eventBossLevel &dAmis de Jeffrey' +bone_fiend: + name: '$eventBossLevel &7Démon des os' + locationMessage: '&cDémon des os : $distance blocs de distance !' + spawnMessage: '&cUne créature osseuse en os est apparue !' + deathMessage: '&aLeDémon des os a été vaincu par $players!' + escapeMessage: '&4Le Démon des os n''a pas trouvé d''os et est parti!' +bone_fiend_mount: + name: '$eventBossLevel &8Porteur d''os' +changeling: + name: '$eventBossLevel &4Changelin' + locationMessage: '&cChangelin: $distance blocs de distance !' + spawnMessage: '&cUn Métamorphe est entré dans ce monde.' + deathMessage: '&aLe Changelin a été arrêté par $players!' + escapeMessage: '&4Le Changelin s''est échappé!' +changeling_p2: + name: '$eventBossLevel &4Changelin' +changeling_p3: + name: '$eventBossLevel &4Changelin' +changeling_p4: + name: '$eventBossLevel &4Changelin' +changeling_p5: + name: '$eventBossLevel &4Changelin' +changeling_p6: + name: '$eventBossLevel &4Changelin' +changeling_p7: + name: '$eventBossLevel &4Changelin' +charms_goblin: + name: '$eventBossLevel &2Gobelin Charmant' + deathMessages: + - '&e&l---------------------------------------------' + - '&eLe Gobelin Charmant a été pillé !' + - '&c&l 1er en dégât : $damager1name &cavec $damager1damage dégâts !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&aTueurs : $players' + - '&e&l---------------------------------------------' + locationMessage: '&cGobelin Charmant : $distance blocs plus loin !' + spawnMessage: '&cUn Gobelin Charmant a été aperçu !' + deathMessage: '&aUn Gobelin Charmant été vaincu par $players !' + escapeMessage: '&4Un Gobelin Charmant s''est échappé !' +circus_ringmaster: + name: '$eventBossLevel &dMonsieur Loyal' + locationMessage: '&cMonsieur Loyal : $distance blocs plus loin !' + spawnMessage: '&cUn terrible cirque est en ville !' + deathMessage: '&a$players a/ont mis fin au règne abusé de Monsieur Loyal !' + escapeMessage: '&4Le cirque a quitté la ville !' +circus_ringmaster_summon: + name: '$eventBossLevel &5Animal Torturé' +circus_ringmaster_summon_1: + name: '$eventBossLevel &5Clown Maltraité' +circus_ringmaster_summon_2: + name: '$eventBossLevel &5Ballon Maltraité' +coins_goblin: + name: '$eventBossLevel &eGobelin aux Pièces' + deathMessages: + - '&e&l---------------------------------------------' + - '&eLe Gobelin aux Sous a été pillé !' + - '&c&l 1er en dégât : $damager1name &cavec $damager1damage dégâts !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&aTueurs : $players' + - '&e&l---------------------------------------------' + locationMessage: '&cGoblin de Pièces : $distance blocs de distance !' + spawnMessage: '&cUn Gobelin aux Sous a été vu !' + deathMessage: '&aA Gobelin aux Sous a été tué par $players !' + escapeMessage: '&4Un Gobelin aux Sous s''est échappé !' +craftenmine_stacked_bones: + name: '$eventBossLevel &eCrâne Armé' + locationMessage: '&cLe Tas d''Os du Dr. Craftenmine''s : $distance blocs plus loin !' + spawnMessage: '&cUne horrible création de Dr. Craftenmine est en pleine nature!' + deathMessage: '&aL''horrible création du Tas d''Os a été tuée par $players !' + escapeMessage: '&4L''horrible création du Dr. Craftenmines s''est échappée !' +craftenmine_stacked_bones_ankle: + name: '$eventBossLevel &6Cheville Armée' +craftenmine_stacked_bones_backbone: + name: '$eventBossLevel &6Colonne Vertébrale Armée' +craftenmine_stacked_bones_femur: + name: '$eventBossLevel &6Fémur Armé' +craftenmine_stacked_bones_spine: + name: '$eventBossLevel &6Colonne Vertébrale Armée' +craftenmine_terror: + name: '$eventBossLevel &cGhast Lobotomisé' + locationMessage: '&cTerreur du Dr. Craftenmine : $distance blocs plus loin !' + spawnMessage: '&cUne création du Dr Craftenmine est en liberté !' + deathMessage: '&aLe Ghast Lobotomisé a été tué par $players !' + escapeMessage: '&4Le Ghast Lobotomisé est parti !' +craftenmine_terror_mount: + name: '$eventBossLevel &dTransporteur Fantôme' +creeperpede_1: + name: '$eventBossLevel &5Observateur de Creeperpede' + locationMessage: '&cCreeperpede : à $distance blocs de distance !' + spawnMessage: '&cUne expérience du Dr Craftenmine est en cours !' + deathMessage: '&aLe Creeperpede a été stoppé net par $players !.' + escapeMessage: '&4L''expérience du Dr Craftenmine a réussi à s''échapper !' +creeperpede_2: + name: '$eventBossLevel &5Cavalier de Creeperpede' +creeperpede_3: + name: '$eventBossLevel &5Cavalier de Creeperpede' +creeperpede_4: + name: '$eventBossLevel &5Cavalier de Creeperpede' +creeperpede_5: + name: '$eventBossLevel &5Porteur de Creeperpede' +crone: + name: '$eventBossLevel &aVieille Âgée' + locationMessage: '&cVieille Âgée : $distance blocs plus loin !' + spawnMessage: '&cUne Vieille Âgée a erré dans ce monde !' + deathMessage: '&aLa Vieille a été vaincue par $players !.' + escapeMessage: '&4La Vieille bique a quitté ce monde sur son balai !' +crone_summon: + name: '$eventBossLevel &fAraignée apprivoisée' +divine_cinder: + name: '$eventBossLevel &cCendre Divine' + locationMessage: '&cCendre Divine : $distance blocs de distance !' + spawnMessage: '&cUn feu divin est apparu !' + deathMessage: '&aLa Cendre divine a été vaincue par $players!' + escapeMessage: '&4La Cendre Divine a fumé !' +ember: + name: '$reinforcementLevel &cBraise' +enders_1: + name: '$eventBossLevel &dGarçon de l''End' + locationMessage: '&cClique de l''End: $distance blocs de distance !' + spawnMessage: '&cUn groupe de fauteurs de troubles de l''End est apparu.' + deathMessage: '&aLa Clique de l''End a été arrêtée par $players!' + escapeMessage: '&4La Clique de l''End est partie!' +enders_2: + name: '$eventBossLevel &dChenapan de l''End' + locationMessage: '&cMembre de la Clique : $distance blocs de distance !' +enders_3: + name: '$eventBossLevel &dGars de l''End' + locationMessage: '&cMembre de la Clique : $distance blocs de distance !' +ender_lapin: + name: '$eventBossLevel &aLapin de l''End' +endless_pursuer: + name: '$eventBossLevel &dPoursuivant sans fin' + locationMessage: '&cPoursuivant sans fin : $distance blocs de distance !' + spawnMessage: '&cIl n''arrêtera pas de poursuivre...' + deathMessage: '&aLa poursuite s''est arrêtée grâce à $players!' + escapeMessage: '&4Le poursuivant a disparu !' +enraged_snowman: + name: '$eventBossLevel &1Bonhomme de neige enragé' + locationMessage: '&cBonhomme de Neige enragé : $distance blocs de distance !' + spawnMessage: '&cUn bonhomme de neige en colère a été vu !' + deathMessage: '&aLe bonhomme de neige enragé a été mis au repos par $players!' + escapeMessage: '&4Le bonhomme de neige enragé a disparu!' +evil_undead: + name: '$eventBossLevel &cMort-vivant maléfique' + locationMessage: '&cMort-vivant maléfique : $distance blocs de distance !' + spawnMessage: '&cUn mort-vivant maléfique est apparu !' + deathMessage: '&aLe mort-vivant maléfique a été mis au repos par $players!' + escapeMessage: '&4Le mort-vivant maléfique s''est échappé!' +evil_undead_p2: + name: '$eventBossLevel &cMort-vivant maléfique' + locationMessage: '&cMort-vivant maléfique : $distance blocs de distance !' + spawnMessage: '&cUn mort-vivant maléfique est apparu !' + deathMessage: '&aLe mort-vivant maléfique a été mis au repos par $players!' + escapeMessage: '&4Le mort-vivant maléfique s''est échappé!' +fallen_knight: + name: '$eventBossLevel &7Chevalier Déchu' + locationMessage: '&cChevalier déchu : $distance blocs de distance !' + spawnMessage: '&cUn Chevalier déchu se lève de sa tombe !' + deathMessage: '&aUn chevalier déchu est tombé face à $players!.' + escapeMessage: '&4Le Chevalier déchu retourne au sommeil !' +fine_swine: + name: '$eventBossLevel &ePorc fin' +fine_swine_summon: + name: '$eventBossLevel &ePuissant Protecteur' +firestarter: + name: '$eventBossLevel &6Allume feu' + locationMessage: '&cAllume feu : $distance blocs de distance !' + spawnMessage: '&cUn Méchant allume feu est apparu !' + deathMessage: '&aL''Allume Feu a été tué par $players!' + escapeMessage: '&4L''allume feu est parti!' +firestarter_mount: + name: '$eventBossLevel &6Étincelle' +fire_conjurer: + name: '$eventBossLevel &eInvocateur de Feu' + locationMessage: '&cInvocateur de Feu : $distance blocs plus loin !' + spawnMessage: '&cUn maître du feu et de la flamme marche dans ce monde !' + deathMessage: '&aL''Invocateur de Feu a été éteint par $players !' + escapeMessage: '&4L''Invocateur de Feu a disparu !' +fire_conjurer_summon: + name: '$eventBossLevel &6Flamme Invoquée' +fire_fae: + name: '$eventBossLevel &cFée de feu' +foreign_visitor: + name: '$eventBossLevel &5Visiteur Étranger' + locationMessage: '&cVisiteur Étranger : $distance blocs plus loin !' + spawnMessage: '&cUn visiteur d''une autre dimension est arrivé !' + deathMessage: '&a$players s''est/se sont assuré(s) de faire savoir au visiteur qu''il n''est pas le bienvenu ici.' + escapeMessage: '&4Le visiteur est rentré chez lui !' +fox_king_cold: + name: '$eventBossLevel &1Roi Renard Polaire' + locationMessage: '&cRoi Renard Polaire : $distance blocs plus loin !' + spawnMessage: '&cUne créature magique rôde dans le monde.' + deathMessage: '&aLe Roi Renard Polaire a été vaincu par $players !' + escapeMessage: '&4Le Roi Renard Polaire a quitté ce monde.' +frost_palace_frost_queen_p0: + name: '$bossLevel &8Reine de Givre' + locationMessage: '&9Reine de Givre' + spawnMessage: '&9Le vent hurle. La Reine de Givre relève le défi.' + deathMessage: '&aLa Reine de Givre n''est plus, tuée par $players !' +frost_palace_frost_queen_p1: + name: '$bossLevel &8Reine de Givre phase 1' + locationMessage: '&9Reine de Givre phase 1' +frost_palace_frost_queen_p2: + name: '$bossLevel &8Reine de Givre phase 2' + locationMessage: '&9Reine de Givre phase 2' +frost_palace_frost_queen_p3: + name: '$bossLevel &8Reine de Givre phase 3' + locationMessage: '&9Reine de Givre phase 3' +frost_palace_frost_queen_p4: + name: '$bossLevel &8Reine de Givre phase 4' + locationMessage: '&9Reine de Givre phase 4' +frost_palace_frost_queen_p5: + name: '$bossLevel &8Reine de Givre phase 5' + locationMessage: '&9Reine de Givre phase 5' +frost_palace_frost_queen_p6: + name: '$bossLevel &8Reine de Givre phase 6' + locationMessage: '&9Reine de Givre phase 6' +frost_palace_frost_queen_p7: + name: '$bossLevel &8Reine de Givre phase 7' + deathMessages: + - '&e&l---------------------------------------------' + - '&eLa Reine de Givre a été décongelée !' + - '&c&l 1er en dégats : $damager1name &cavec $damager1damage dégats !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&aTueurs : $players' + - '&e&l---------------------------------------------' + locationMessage: '&9Reine de Givre phase 7' +frost_palace_reinforcement_1: + name: '$reinforcementLevel Esprit de l''Hiver' +frost_palace_reinforcement_2: + name: '$reinforcementLevel Esprit du Printemps' +frost_palace_reinforcement_3: + name: '$reinforcementLevel Esprit de l''Été' +fulgora: + name: '$eventBossLevel &3Fulgora' + locationMessage: '&cFulgora: $distance blocs plus loin !' + spawnMessage: '&cUn puissant tonnerre est arrivé !' + deathMessage: '&aFulgora a été arrêté par $players !' + escapeMessage: '&4Fulgora a quitté cet endroit !' +gamma_werewolf: + name: '$reinforcementLevel &7Loup-garou Gamma' +goblin_invader: + name: '$eventBossLevel &2Chef Gobelin' + locationMessage: '&cArmée gobeline: $distance blocs de distance !' + spawnMessage: '&cUne armée de gobelins a envahi ce royaume !' + deathMessage: '&aL''Armée Gobelin a été vaincue par $players!' + escapeMessage: '&4L''Armée Gobelin en a terminé avec ce royaume !' +goblin_invader_summon_1: + name: '&2Guerrier gobelin' +goblin_invader_summon_2: + name: '&2Combattant gobelin' +goblin_invader_summon_3: + name: '&2Soldat gobelin' +goblin_invader_summon_4: + name: '&2Renforts gobelins' +greedy_dwarf: + name: '$eventBossLevel &9Nain cupide' + locationMessage: '&cNain cupide : $distance blocs de distance !' + spawnMessage: '&cPouvez-vous trouver le nain cupide creusant quelque part sous terre ?!' + deathMessage: '&aLe nain cupide a été libéré de sa malédiction par $players!' + escapeMessage: '&4Le nain cupide a trouvé son trésor etil est parti!' +gremlin_1: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocs de distance !' + spawnMessage: '&cUne horde de Gremlin a envahi ce monde !' + escapeMessage: '&4La horde de Gremlin a disparu !' +gremlin_10: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocs de distance !' + escapeMessage: '&4La horde de Gremlin a disparu !' +gremlin_2: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocs de distance !' + escapeMessage: '&4La horde de Gremlin a disparu !' +gremlin_3: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocs de distance !' + escapeMessage: '&4La horde de Gremlin a disparu !' +gremlin_4: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocs de distance !' + escapeMessage: '&4La horde de Gremlin a disparu !' +gremlin_5: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocs de distance !' + escapeMessage: '&4La horde de Gremlin a disparu !' +gremlin_6: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocs de distance !' + escapeMessage: '&4La horde de Gremlin a disparu !' +gremlin_7: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocs de distance !' + escapeMessage: '&4La horde de Gremlin a disparu !' +gremlin_8: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocs de distance !' + escapeMessage: '&4La horde de Gremlin a disparu !' +gremlin_9: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocs de distance !' + escapeMessage: '&4La horde de Gremlin a disparu !' +grunter: + name: '$eventBossLevel &cGrief' + locationMessage: '&cGremlin: $distance blocs de distance !' + spawnMessage: '&cUn puissant cochon rôde dans les terres.' + deathMessage: '&aLe Grogneur a été arrêté par $players!' + escapeMessage: '&4Le Grogneur s''est échappé!' +harmless_chicken: + name: '$eventBossLevel Poulet inoffensif' + locationMessage: '&cPoussin Inoffensif : à $distance blocs de distance !' + spawnMessage: '&cBwok!!! Cluck, Cluck! Bawk!' + deathMessage: '&aBaaaawk! Cluck...$players !' + escapeMessage: '&4Le Poussin Inoffensif a baaaaaawk.' +harmless_chicken_summon: + name: '$eventBossLevel &fClucktector' +hog_rider: + name: '$eventBossLevel &6Cavalier de Porc' + locationMessage: '&cCavalier de porc : à $distance blocs de distance !' + spawnMessage: '&cUn puissant Cavalier de Porc est apparu !' + deathMessage: '&aLe Cavalier de Porc et son Porc ​​ont été vaincus par $players !' + escapeMessage: '&4Le Cavalier de Porc a disparu.' +hog_rider_mount: + name: '$eventBossLevel &ePorc Fidèle' +hog_rider_p2: + name: '$eventBossLevel &6Cavalier de Porc' + locationMessage: '&cCavalier de Porc : à $distance blocs de distance !' + deathMessage: '&aLe Cavalier de Porc et son Porc ​​ont été vaincus par $players !' + escapeMessage: '&4Le Cavalier de Porc a disparu.' +hog_rider_summon: + name: '$eventBossLevel &ePorc Sans Valeur' +horde_champion: + name: '$eventBossLevel &cChampion de la Horde' + locationMessage: '&cChampion Zombie de la Horde : $distance blocs plus loin !' + spawnMessage: '&cUne horde de morts-vivants approche !' + deathMessage: '&aLa horde a été arrêtée par $players !.' + escapeMessage: '&4La horde de morts-vivants est partie !' +horrid_duplicator: + name: '$eventBossLevel &dAffreux Duplicateur' + locationMessage: '&7Affreux Duplicateur : à $distance blocs de distance !' + spawnMessage: '&cUn ennemi sans fin est apparu !' + deathMessage: '&aL''Affreux Duplicateur a été tué par $players !' + escapeMessage: '&4L''Affreux Duplicateur est parti !' +horrid_duplicator_summon: + name: '$eventBossLevel &dAffreux Duplicateur' +horrid_duplicator_summon_1: + name: '$eventBossLevel &dAffreux Duplicateur' +ice_fae: + name: '$eventBossLevel &cFée de glace' +imperial_bee_guard: + name: '$reinforcementLevel &eSoldat de l''Abeille Impériale' +invasion_abducted_hoglin_leader: + name: '$normalLevel &8Chef Hoglin Enlevé' +invasion_abducted_pillager_leader: + name: '$normalLevel &8Chef des Pillards Enlevé' +invasion_abducted_silverfish: + name: '$normalLevel &8Poisson d''Argent Enlevé' +invasion_abducted_silverfish_leader: + name: '$normalLevel &8Poisson d''Argent Enlevé' +invasion_abducted_zombie: + name: '$normalLevel &8Zombie Enlevé' +invasion_abducted_zombie_leader: + name: '$normalLevel &8Zombie Enlevé' +invasion_abductor: + name: '$normalLevel &6Ravisseur' +invasion_abudcted_pillager: + name: '$normalLevel &8Pilleur Enlevé' +invasion_analytic_thin_man_1: + name: '$normalLevel &8Homme fin analytique' +invasion_analytic_thin_man_2: + name: '$normalLevel &8Homme fin analytique' +invasion_analytic_thin_man_3: + name: '$normalLevel &8Homme fin analytique' +invasion_analytic_thin_man_4: + name: '$normalLevel &8Homme fin analytique' +invasion_ballistic_construct: + name: '$minibossLevel &fConstruction balistique' +invasion_convert: + name: '$normalLevel &6Conversion' +invasion_energy_construct: + name: '$minibossLevel &fConstruction d''énergie' +invasion_fire_construct: + name: '$minibossLevel &fConstruction de Feu' +invasion_genetically_modified_cow_phase_1: + name: '$minibossLevel Vache génétiquement modifiée' +invasion_genetically_modified_cow_phase_2: + name: '$minibossLevel Vache génétiquement modifiée' +invasion_gray_man_courthouse_phase_1: + name: '$minibossLevel &7Homme gris' +invasion_gray_man_courthouse_phase_2: + name: '$minibossLevel &7Homme gris' +invasion_green_man_hotel_phase_1: + name: '$bossLevel &2Homme Vert' +invasion_green_man_hotel_phase_2: + name: '$bossLevel &2Homme Vert' +invasion_green_man_hotel_phase_3: + name: '$bossLevel &2Homme Vert' + deathMessage: '&4L''homme vert &4a été vaincu par $players! C''est la fin de cette version de la carte, l''intérieur de l''OVNI est dans la version complète !' +invasion_green_man_spaceship_phase_1: + name: '$bossLevel &2Homme Vert' +invasion_green_man_spaceship_phase_2: + name: '$bossLevel &2Homme Vert' +invasion_green_man_spaceship_phase_3: + name: '$bossLevel &2Homme Vert' +invasion_green_man_spaceship_phase_4: + name: '$bossLevel &2Homme Vert' + deathMessages: + - '&e&l---------------------------------------------' + - '&2La menace extraterrestre n''est plus !' + - '&c&l 1er en dégât : $damager1name &cavec $damager1damage dégâts !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&aTueurs : $players' + - '&e&l---------------------------------------------' +invasion_ice_construct: + name: '$minibossLevel &fConstruction glacée' +invasion_merman: + name: '$normalLevel &6Triton' +invasion_merman_leader: + name: '$normalLevel &6Chef Triton' +invasion_otherwordly_ember: + name: '$normalLevel &6Ambre autrement mondaine' +invasion_psychic_apparition: + name: '$normalLevel &5Apparition psychique' +invasion_psychic_clone: + name: '$reinforcementLevel &6Clone psychique' +invasion_psychic_explosion: + name: '$reinforcementLevel &5Explosion psychique' +invasion_psychic_summon_gold_boots: + name: '$reinforcementLevel &5Apparition psychique' +invasion_psychic_summon_gold_pants: + name: '$reinforcementLevel &5Apparition psychique' +invasion_psychic_summon_leather_hat: + name: '$reinforcementLevel &5Apparition psychique' +invasion_shrieking_shulker: + name: '$normalLevel &8Shulker hurlant' +invasion_thin_man: + name: '$normalLevel &8Homme fin' +killer_rabbit_of_caerbannog: + name: '$eventBossLevel &cLapin tueur de Caerbannog' +kraken: + name: '$eventBossLevel &3Kraken' +krampus: + name: '$eventBossLevel &1Krampus' + locationMessage: '&cKrampus : $distance blocs de distance !' + spawnMessage: '&cKrampus est venu punir les vilains!' + deathMessage: '&aKrampus a été renvoyé dans son royaume par $players!.' + escapeMessage: '&4Il n''y avait personne à punir !' +large_hopper: + name: '$eventBossLevel &dGrand entonnoir' + locationMessage: '&cGrand entonnoir : $distance blocs de distance !' + spawnMessage: '&cUne grande bête saute autour de vous !' + deathMessage: '&aLe grand entonnoir a été arrêté par $players!' + escapeMessage: '&4Le grand entonnoir a sauté hors de ce monde !' +large_hopper_mount: + name: '$eventBossLevel &aEntonnoir' +lightning_fae: + name: '$eventBossLevel &eFée de la foudre' +living_shadow: + name: '$eventBossLevel &7Ombre vivante' + locationMessage: '&cOmbre vivante : $distance blocs de distance !' + spawnMessage: '&cL''ombre vivante est apparue ! Ne la regardez pas dans les yeux !' + deathMessage: '&aL’ombre vivante a été transformée en Ombre Morte par $players!.' + escapeMessage: '&4L''Ombre Vivante n''a rien vu alors, elle est partir!' +meme_boss: + name: '&2Le Maestro' +meme_boss_reinforcement: + name: '&cFan' +merman: + name: '$eventBossLevel &1Triton' + locationMessage: '&cTriton: $distance blocs de distance !' + spawnMessage: '&cUn Triton nage dans les océans!' + deathMessage: '&aLe Triton a été tué par $players!' + escapeMessage: '&4Le Triton a reculé.' +monster_of_the_deep: + name: '$eventBossLevel &bMonstre des profondeurs' + locationMessage: '&cMonstre des profondeurs: $distance blocs de distance !' + spawnMessage: '&cQuelque chose de terrible nage dans les océans !' + deathMessage: '&aLe monstre des profondeurs a été tué par $players!' + escapeMessage: '&4Les océans sont à nouveau en sécurité!' +moon_spider: + name: '$eventBossLevel &fAraignée de Lune' + locationMessage: '&cAraignée de Lune : $distance blocs de distance !' + spawnMessage: '&cUn arachnide puissant a été repéré !' + deathMessage: '&aL''Araignée de la Lune a été tuée par $players !' + escapeMessage: '&4L''araignée de la Lune est partie !' +moon_spider_summon: + name: '&fRéparateur de Soie' +necromancer: + name: '$eventBossLevel &7Nécromancien' + locationMessage: '&cNécromancien : $distance blocs plus loin !' + spawnMessage: '&cUn puissant Nécromancien maléfique est entré dans ce monde !' + deathMessage: '&aLe Nécromancien n''est plus grâce à $players !' + escapeMessage: '&4Le Nécromancien a disparu.' +necromancer_summon_1: + name: '$eventBossLevel &fOs Ardents' +necromancer_summon_2: + name: '$eventBossLevel &bOs Glacés' +necromancer_summon_3: + name: '$eventBossLevel &8Os Carbonisés' +necronomicon_skeleton: + name: '$reinforcementLevel &7Squelette invoqué' +necronomicon_zombie: + name: '$reinforcementLevel &7Zombie invoqué' +netherite_golem: + name: '$eventBossLevel &8Golem de Netherite' + locationMessage: '&cGolem de Netherite : $distance blocs plus loin !' + spawnMessage: '&cUn ancien golem est entré dans ce monde !' + deathMessage: '&aLe Golem de Netherite a été vaincu par $players !' + escapeMessage: '&4Le Golem de Netherite a quitté le monde !' +nether_escapee: + name: '$eventBossLevel &6Évadé du Nether' + locationMessage: '&cÉvadé du Nether : $distance blocs plus loin !' + spawnMessage: '&cUn terrible ennemi s''est échappé du Nether !' + deathMessage: '&aL''évadé du Nether a été renvoyé dans le Nether par $players !' + escapeMessage: '&4L''évadé du Nether a quitté cet endroit !' +nether_hag: + name: '$eventBossLevel &4Sorcière du Néant' + locationMessage: '&cSorcière du Néant : $distance blocs plus loin !' + spawnMessage: '&cUne sorcière maléfique marche dans le Nether !' + deathMessage: '&aLa Sorcière du Néant a été tuée par $players !' + escapeMessage: '&4La Sorcière du Néant a disparu !' +nether_wasp: + name: '$eventBossLevel &6Guêpe du Néant' + locationMessage: '&cGuêpe du Néant : $distance blocs plus loin !' + spawnMessage: '&cEssayez de ne pas vous faire piquer, une guêpe rôde dans le Nether !' + deathMessage: '&aLa Guêpe du Néant a été tuée par $players !' + escapeMessage: '&4La Guêpe du Nether a décidé d''aller faire bzzz ailleurs !' +nether_wasp_summon_1: + name: '$eventBossLevel &cInvocateur de la Ruche' +nether_wasp_summon_2: + name: '$eventBossLevel &cGuêpe de la Ruche' +nightwing: + name: '$eventBossLevel &cAile de nuit' + locationMessage: '&cAile de Nuit : $distance blocs plus loin !' + spawnMessage: '&cUn oiseau de nuit est apparu !' + deathMessage: '&aAile de Nuit a été arrêtée par $players !' + escapeMessage: '&4Aile de nuit est rentrée chez elle.' +nightwing_summon: + name: '$eventBossLevel &cBombe Intelligente' +nightwing_summon_1: + name: '$eventBossLevel &cProtecteur juré' +night_crawler: + name: '$eventBossLevel &4Somnambule' + locationMessage: '&cSomnambule : $distance blocs plus loin !' + spawnMessage: '&cQuelque chose d''horrible rampe !' + deathMessage: '&aLe Somnambule a été vaincu par $players !' + escapeMessage: '&4Le Somnambule Mort-Vivant est parti !' +night_horder: + name: '$eventBossLevel &aHordre de la Nuit' + locationMessage: '&cHordre de la Nuit : $distance blocs plus loin !' + spawnMessage: '&cUne Horde de la Nuit est apparue ! Tuez-la pour piller son butin !' + deathMessage: '&aLa Hordre de la nuit s''est fait plumer par $players !' + escapeMessage: '&4La Hordre de la Nuit s''est échapée !' +oasis_10_old_bones: + name: '$normalLevel &fVieux os' +oasis_10_surreptitious_scribe: + name: '$minibossLevel &7Scribe furtif' +oasis_12_entombed_tenant: + name: '$normalLevel &7Locataire enterré' +oasis_12_entombed_tenant_p2: + name: '$normalLevel &7Locataire enterré' +oasis_12_sinister_siren: + name: '$minibossLevel &5Sirène Sinistre' +oasis_14_gnarly_grimace: + name: '$normalLevel &8Grimace noueuse' +oasis_14_undead_drifter: + name: '$normalLevel &1Vagabond mort-vivant' +oasis_16_lesser_sentinel: + name: '$normalLevel &9Sentinelle inférieure' +oasis_16_magical_magus: + name: '$normalLevel &3Mage Magique' +oasis_16_rancid_roamer: + name: '$normalLevel &8Vagabond Rance' +oasis_18_sly_sharpshooter: + name: '$normalLevel &eTireur d''élite furtif' +oasis_18_stout_thaumaturge: + name: '$normalLevel &5Gros Faiseur de miracles' +oasis_18_tricky_treasure_hoarder: + name: '$normalLevel &dCollectionneur de trésors astucieux' +oasis_20_scheming_scribe: + name: '$minibossLevel &7Scribe de Schéma' +oasis_20_septic_scribe: + name: '$minibossLevel &7Scribe Septique' +oasis_20_vampiric_sorcerer: + name: '$bossLevel &cSorcier Vampirique' +oasis_20_wrapped_wraith: + name: '$normalLevel &8Spectre enveloppé' +oasis_20_wrapped_wraith_p2: + name: '$normalLevel &8Spectre enveloppé' +oasis_25_vampiric_warlock: + name: '$bossLevel &4Démoniste vampirique' +oasis_25_warlocks_spirit_summon: + name: '$reinforcementLevel &cEsprit des démonistes' +oasis_26_adept_sentinel: + name: '$normalLevel &1Sentinelle Adepte' +oasis_26_grim_grovetender: + name: '$normalLevel &aPréposé aux bosquets sinistre' +oasis_26_precarious_sniper: + name: '$normalLevel &3Sniper Précis' +oasis_26_superior_sharpshooter: + name: '$normalLevel &3Tireur d''élite Supérieur' +oasis_28_perilous_prophet: + name: '$normalLevel &3Prophète périlleux' +oasis_28_treacherous_treasure_hoarder: + name: '$normalLevel &dCollectionneur de trésors perfide' +oasis_2_haunted_hauler: + name: '$normalLevel &9Hanteur hanté' +oasis_30_forsaken_soul: + name: '$reinforcementLevel &0Ame abandonnée' +oasis_30_lost_soul: + name: '$normalLevel Âme Perdue' +oasis_30_parlous_preist: + name: '$minibossLevel &bPrêtre alarmant' +oasis_30_seeker_of_the_staid: + name: '$normalLevel &cChercheur de l''étal' +oasis_30_wimpy_louse: + name: '$reinforcementLevel &8Salop répugnant' +oasis_32_loathing_louse: + name: '$normalLevel &8Salop répugnant' +oasis_32_skeletal_sniper: + name: '$normalLevel &9Sniper Squelettique' +oasis_34_grizly_grimace: + name: '$normalLevel &8Grimace noueuse' +oasis_34_gruesome_grimace: + name: '$normalLevel &8Grimace horrible' +oasis_35_ice_eidolon: + name: '$reinforcementLevel &9Eidolon de glace' +oasis_35_light_of_darkness: + name: '$minibossLevel &9Lumière des ténèbres' +oasis_36_cruel_cultist: + name: '$normalLevel &3Cultiste cruel' +oasis_36_cultists_cretins: + name: '$reinforcementLevel &3Cultiste cruel' +oasis_36_cultists_cretins_drowned: + name: '$reinforcementLevel &3Cultiste cruel' +oasis_36_dexterous_sentinel: + name: '$normalLevel &9Sentinelle agile' +oasis_36_grudging_grovetender: + name: '$normalLevel &aPréposé aux bosquets plaignant' +oasis_36_parlous_sniper: + name: '$normalLevel &3Sniper Dangereux' +oasis_36_rueful_roamer: + name: '$normalLevel &8Vagabond Piteux' +oasis_36_spectral_magus: + name: '$normalLevel &3Mage Spectrale' +oasis_38_poisonous_perch: + name: '$normalLevel &3Perche empoisonnée' +oasis_38_traitorous_treasure_hoarder: + name: '$normalLevel &dCollectionneur de trésors traître' +oasis_40_chief_cultist: + name: '$minibossLevel &5Cultiste en chef' +oasis_40_louse_lord: + name: '$minibossLevel &8Seigneur des salops' +oasis_40_pharaohs_scribe: + name: '$minibossLevel &7Scribe du Pharaon' +oasis_40_skeletal_stiff: + name: '$normalLevel &9Raideur squelettique' +oasis_40_soaked_sacrifice: + name: '$reinforcementLevel &1Sacrifice imbibé' +oasis_40_solar_flare: + name: '$reinforcementLevel &eEruption solaire' +oasis_42_hexed_hauler: + name: '$normalLevel &9Hanteur ensorcelé' +oasis_42_skeletal_sharpshooter: + name: '$normalLevel &9Tireur d''élite squelettique' +oasis_42_tyranical_treasure_hoarder: + name: '$normalLevel &dCollectionneur de trésors tyrannique' +oasis_42_tyranical_treasure_hoarder_phase_2: + name: '$normalLevel &dCollectionneur de trésors tyrannique' +oasis_45_golden_cast_autonomation: + name: '$reinforcementLevel &6Automate de la Caste Dorée' +oasis_45_monumental_monstrosity: + name: '$bossLevel &bMonstruosité Monumentale' +oasis_45_monumental_monstrosity_phase_2: + name: '$bossLevel &bMonstruosité Monumentale' +oasis_45_monumental_monstrosity_phase_3: + name: '$bossLevel &bMonstruosité Monumentale' +oasis_45_monumental_monstrosity_phase_4: + name: '$bossLevel &bMonstruosité Monumentale' +oasis_45_oracle_of_knowledge: + name: '$minibossLevel &0Oracle de la connaissance' +oasis_45_shadow_of_knowledge_summon: + name: '$reinforcementLevel &8Ombre de la Connaissance' +oasis_45_the_beacon: + name: '$minibossLevel &6La Balise' +oasis_45_the_beacon_phase_2: + name: '$minibossLevel &6La Balise' +oasis_45_the_beacon_phase_3: + name: '$minibossLevel &6La Balise' +oasis_45_the_beacon_phase_4: + name: '$minibossLevel &6La Balise' +oasis_46_pharaohs_sentinel: + name: '$normalLevel &9Sentinelle de Pharaon' +oasis_4_cursed_desert_dweller: + name: '$normalLevel &eHabitant du Désert maudit' +oasis_4_grotesque_grimace: + name: '$normalLevel &8Grimace grotesque' +oasis_4_swamp_rat: + name: '$normalLevel &6Rat des marais' +oasis_50_moneychanger_arrow: + name: '$minibossLevel &6Changeur d''Argent' +oasis_50_moneychanger_arrow_phase_2: + name: '$minibossLevel &6Changeur d''Argent' +oasis_50_moneychanger_blindness: + name: '$minibossLevel &6Changeur d''Argent' +oasis_50_moneychanger_blindness_phase_2: + name: '$minibossLevel &6Changeur d''Argent' +oasis_50_moneychanger_fire: + name: '$minibossLevel &6Changeur d''Argent' +oasis_50_moneychanger_fire_phase_2: + name: '$minibossLevel &6Changeur d''Argent' +oasis_50_moneychanger_freeze: + name: '$minibossLevel &6Changeur d''Argent' +oasis_50_moneychanger_freeze_phase_2: + name: '$minibossLevel &6Changeur d''Argent' +oasis_50_moneychanger_knockback: + name: '$minibossLevel &6Changeur d''Argent' +oasis_50_moneychanger_knockback_phase_2: + name: '$minibossLevel &6Changeur d''Argent' +oasis_50_moneychanger_poison: + name: '$minibossLevel &6Changeur d''Argent' +oasis_50_moneychanger_poison_phase_2: + name: '$minibossLevel &6Changeur d''Argent' +oasis_50_moneychanger_wither: + name: '$minibossLevel &6Changeur d''Argent' +oasis_50_moneychanger_wither_phase_2: + name: '$minibossLevel &6Changeur d''Argent' +oasis_50_pharaohs_royal_guard: + name: '$reinforcementLevel &8Garde Royale du Pharaon' +oasis_50_the_foundry: + name: '$bossLevel &4La Fonderie' +oasis_50_the_foundry_phase_2: + name: '$bossLevel &4La Fonderie' +oasis_55_pharaoh_of_pestilence: + name: '$bossLevel &0Pharaon de la Peste' +oasis_6_dry_bones: + name: '$normalLevel &fVieux Os' +oasis_6_rotten_roamer: + name: '$normalLevel &8Vagabond Pourri' +oasis_8_mythical_magus: + name: '$normalLevel &3Mage Mythique' +oasis_8_tough_thaumaturge: + name: '$normalLevel &5Gros Faiseur de miracles' +oasis_8_troublesome_treasure_hoarder: + name: '$normalLevel &dCollectionneur de Trésors Gênants' +okami: + name: '$eventBossLevel &cOkami' + locationMessage: '&cOkami : à $distance blocs de distance !' + spawnMessage: '&cUn dieu s''est réveillé !' + deathMessage: '&a$players a/ont combattu avec un dieu et a/ont gagné !.' + escapeMessage: '&4Okami est parti !' +okami_p2: + name: '$eventBossLevel &cOkami' +okami_p3: + name: '$eventBossLevel &cOkami' +omega_wolf: + name: '$reinforcementLevel &7Loup Omega' +pillager_caravan_beast: + name: '$reinforcementLevel &cBête de la Caravane' +pillager_caravan_guard: + name: '$reinforcementLevel &cGarde de la Caravane' +pillager_caravan_leader: + name: '$eventBossLevel &cChef de Caravane des Pillards' + locationMessage: '&cCaravane des Pillards : à $distance blocs de distance !' + spawnMessage: '&cUne caravane de pillards a été aperçue !' +primis_acolyte_brute: + name: '$normalLevel &bBrute Acolyte' +primis_acolyte_forest_brute: + name: '$normalLevel &bElf Bandit Brute' +primis_acolyte_forest_brute_with_watch: + name: '$normalLevel &bElf Bandit Brute' +primis_acolyte_forest_sharpshooter: + name: '$normalLevel &bElf Bandit Ranger' +primis_acolyte_forest_summoner: + name: '$normalLevel &bInvoquateur d''Elf Bandit' +primis_acolyte_forest_summoner_heirloom_guardian: + name: '$normalLevel &bMage Elf Bandit' +primis_acolyte_guard_1: + name: '$normalLevel &bGarde Acolyte' + onDamagedMessages: + - Vous ne pouvez pas entrer ! + - La mage ne le permet pas! + - Quittez cet endroit ! + - Le mage protège cet endroit ! + - Folie ! + - Partez! + deathMessage: '[Garde Acolyte] Vous êtes aveugle à la vérité, le mage de la tour voit tout!' +primis_acolyte_guard_2: + name: '$normalLevel &bGarde Acolyte' + onDamagedMessages: + - Vous ne pouvez pas entrer ! + - La mage ne le permet pas! + - Quittez cet endroit ! + - Le mage protège cet endroit ! + - Folie ! + - Partez! + deathMessage: '[Garde Acolyte] Vous ne passerez pas, le mage dans la tour ne le permettra pas!' +primis_acolyte_sharpshooter: + name: '$normalLevel &bRanger Acolyte' +primis_aggressive_llama: + name: '$normalLevel &6Lama agressif' +primis_angry_goat: + name: '$normalLevel &6Chèvre en colère' +primis_beta_feral_wolf: + name: '$reinforcementLevel &7Loup Beta Sauvage' +primis_blood_temple_blood_golem: + name: '$normalLevel &cGolem de Sang' +primis_blood_temple_charred_construct: + name: '$normalLevel &cConstruction carbonisée' +primis_blood_temple_conjured_flame: + name: '$normalLevel &cFlamme Conjurée' +primis_blood_temple_eradicator: + name: '$normalLevel &cÉradicateur' +primis_blood_temple_fire_conjurer: + name: '$normalLevel &cIllusionniste de Feu' +primis_blood_temple_flame_elemental: + name: '$normalLevel &cÉlémentaire de flamme' +primis_catacomb_nemus_to_redwood_archer: + name: '$normalLevel &8Archer de Catacombe' +primis_catacomb_nemus_to_redwood_golem: + name: '$normalLevel &bGolem de Catacombe' +primis_catacomb_nemus_to_redwood_necromancer: + name: '$bossLevel &4Nécromancien de Catacombe' +primis_catacomb_nemus_to_redwood_necromancer_p1: + name: '$bossLevel &4Nécromancien de Catacombe' +primis_catacomb_nemus_to_redwood_necromancer_p2: + name: '$bossLevel &4Nécromancien de Catacombe' +primis_catacomb_nemus_to_redwood_soul_reinforcement: + name: '$reinforcementLevel &8Âme de Catacombe' +primis_catacomb_nemus_to_redwood_swordsman: + name: '$normalLevel &8Épéiste de Catacombe' +primis_catacomb_pontis_to_ice_archer: + name: '$normalLevel &8Archer de Catacombe' +primis_catacomb_pontis_to_ice_golem: + name: '$normalLevel &bGolem de Catacombe' +primis_catacomb_pontis_to_ice_necromancer_p1: + name: '$bossLevel &4Nécromancien de Catacombe' +primis_catacomb_pontis_to_ice_necromancer_p2: + name: '$bossLevel &4Nécromancien de Catacombe' +primis_catacomb_pontis_to_ice_swordsman: + name: '$normalLevel &8Épéiste de Catacombe' +primis_catacomb_trio_archer: + name: '$normalLevel &8Archer de Catacombe' +primis_catacomb_trio_golem: + name: '$normalLevel &bGolem de Catacombe' +primis_catacomb_trio_necromancer_p1: + name: '$bossLevel &4Nécromancien de Catacombe' +primis_catacomb_trio_necromancer_p2: + name: '$bossLevel &4Nécromancien de Catacombe' +primis_catacomb_trio_necromancer_summon: + name: '$bossLevel &4Nécromancien de Catacombe' +primis_catacomb_trio_swordsman: + name: '$normalLevel &8Épéiste de Catacombe' +primis_crazed_rabbit: + name: '$normalLevel &cLapin Fou' +primis_crystaline_summoner_p1: + name: '$normalLevel &3Invocateur de cristaux' +primis_crystaline_summoner_p2: + name: '&3Invocateur de cristaux' +primis_earth_temple_golem: + name: '$normalLevel &fArgile Animée' +primis_emerald_eater: + name: '$normalLevel &aDévoreur émeraude' +primis_farmstead_lighthouse_keeper: + name: '$bossLevel &6Gardien du Phare' + questLore: + - Quelque chose ne va pas vraiment avec mon mari. + - Auparavant, il était un mari et un père aimant, + - mais ces derniers temps, il s'est concentré sur les documents qu'il a trouvés dans le sous-sol. + - Il a dit que c'était pour ldes recherches importantes, qui pourraient changer le monde. + - J'aurais dû lui dire de s'arrêter quand j'ai vu à quel point il devenait obsédé. + - Il a fait... quelque chose... au phare - et + - Je crains que le phare ne lui ait aussi fait quelque chose. + - Il l'a transformé en une sorte de monstre. Il ne nous reconnaît plus, + - et nous a même attaqués quand nous avons essayé de l'approcher. + - La nuit, nous ne pouvons pas dormir à cause des gémissements + - venants du &dSous-sol du Phare&f. + - Il souffre, et nous sommes impuissants pour l'aider. + - Je sais que ça demande beaucoup, mais pensez-vous que vous pourriez nous aider ? + questAcceptDialog: + - '&a[Amavit]&f Merci beaucoup d''avoir accepté notre demande. J''espère de tout mon cœur que vous allez réussir.' + - '&7&oJe devrais aller au &dSous-sol du Phare &7&o et sortir le &cGardien du Phare&7&o de sa misère.' + questCompleteMessage: + - '&a[Amavit]&f Je l''ai entendu - alors c''est fini ? A-t-il souff - non, oubliez, je ne veux pas le savoir.' + - '&fIl semble que le phare ait commencé à émettre une lumière étrange lorsque vous... vous êtes occupé du problème. Nous devons nous assurer que ce n''est pas un problème.' + - '&7&oOn dirait que &aAmavit&7&o a une autre tâche pour moi. Je devrais lui parler.' +primis_feral_alpha_wolf: + name: '$normalLevel &8Loup Alpha Sauvage' +primis_feral_wolf: + name: '$normalLevel &8Loup sauvage' +primis_feral_wolf_scout: + name: '$normalLevel &8Éclaireur du Loup sauvage' +primis_gladius_admiral: + name: '$normalLevel &fAmiral Envahisseur' +primis_gladius_assassin: + name: '$normalLevel &fAssassin Envahisseur' +primis_gladius_barkeep_p1: + name: '$minibossLevel &6Le Barman' +primis_gladius_barkeep_p2: + name: '$minibossLevel &6Le Barman' +primis_gladius_captain: + name: '$normalLevel &Capitaine envahisseur' +primis_gladius_champion_p1: + name: '$bossLevel &6Natus Champion déchu' +primis_gladius_champion_p2: + name: '$bossLevel &6Natus Champion déchu' +primis_gladius_gatekeeper_p1: + name: '$minibossLevel &5Le Gardien de la Porte' +primis_gladius_gatekeeper_p2: + name: '$minibossLevel &5Le Gardien de la Porte' +primis_gladius_gatekeeper_pontis_p1: + name: '$minibossLevel &5Le Gardien de la Porte' +primis_gladius_gatekeeper_pontis_p2: + name: '$minibossLevel &5Le Gardien de la Porte' +primis_gladius_longbowman: + name: '$normalLevel &fArcher Long Envahisseur' +primis_gladius_mariner: + name: '$normalLevel &fMarin Envahisseur' +primis_gladius_mariner_quest: + name: '$normalLevel &fMarin Envahisseur' +primis_gladius_monk_p1: + name: '$minibossLevel &6Le Moine' +primis_gladius_monk_p2: + name: '$minibossLevel &6Le Moine' +primis_gladius_raider: + name: '$normalLevel &fRaideur Envahisseur' +primis_gladius_swordsman: + name: '$normalLevel &fÉpéiste Envahisseur' +primis_gladius_undead_buccaneer: + name: '$normalLevel &fBoucanier Mort-Vivant' +primis_gladius_undead_captain: + name: '$minibossLevel &fCapitaine mort-vivant' +primis_gladius_undead_swashbuckler: + name: '$normalLevel &fFier-à-bras Mort-Vivant' +primis_gladius_underlord: + name: '$minibossLevel &0Sous-Seigneur' +primis_gladius_villager: + name: '$normalLevel &fVillageois mort-vivant' +primis_goblin_fowl_warrior: + name: '$minibossLevel &6Gobelin poltron maudit' +primis_goblin_grunt: + name: '$normalLevel &6Goblin Grogneur' +primis_goblin_king: + name: '$bossLevel &2Roi gobelin' +primis_goblin_piranah: + name: '$normalLevel &9Piranah gobelin' +primis_goblin_spearman: + name: '$normalLevel &6Lancier gobelin' +primis_goblin_warrior: + name: '$normalLevel &6Guerrier gobelin' +primis_ice_mage: + name: '$minibossLevel &9Mage de Glace' +primis_ice_mage_p2: + name: '$minibossLevel &bMage de Glace' + deathMessage: '&8&oVous entendez le bruit d''un mur de glace à proximité qui craque et se brise...' +primis_ice_village_annoyed_goat: + name: '$normalLevel &bChèvre agacée' +primis_ice_village_bell_banger: + name: '$minibossLevel &6Mort-vivant' + questLore: + - Voyez-vous? Là, regardez ce clocher + - dans le village. + - Vous le voyez aussi, n'est-ce pas? Le défunt là-bas + - se frappe la tête contre la cloche. + - Je suis assez sûr que c'est ce qui se passe, + - à moins que ma vision ne me fasse défaut. + - Pourriez-vous aller enquêter et me faire un rapport + - de ce que vous avez trouvé. + questAcceptDialog: + - '&a[Eleusium Festus]&f Que se passe-t-il...' + - '&7&oJe devrais aller voir ce qui se passe au &d&oClocher du village de glace &7&o.' + questCompleteMessage: + - '&a[Eleusium Festus]&f Vous avez trouvé un morte-vivant qui se cogne la tête sur la cloche...' + - Eh bien, maintenant j'ai entendu tout cela... +primis_ice_village_escaped_prisoner: + name: '$normalLevel &bPrisonnier échappé' +primis_ice_village_fallen_trial_warrior_summon: + name: '$reinforcementLevel &7Âme asservie' +primis_ice_village_frost_fur_ursus: + name: '$normalLevel &9Ursus Fourrure Gelée' +primis_ice_village_frost_simulacrum: + name: '$normalLevel &3Simulacre gelé' +primis_ice_village_ice_simulacrum: + name: '$reinforcementLevel &3Simulacre de glace' +primis_ice_village_manifested_nightmare: + name: '$normalLevel &bCauchemar manifesté' +primis_ice_village_meek_customer: + name: '$normalLevel &cClient Doux' +primis_ice_village_naughty_customer: + name: '$normalLevel &cClient vilain' +primis_ice_village_screecher_bomb_summon: + name: '$reinforcementLevel &dDéjections de Hurleur' +primis_ice_village_sky_screecher: + name: '$normalLevel &bCri Céleste' +primis_ice_village_the_ice_aspect: + name: '$minibossLevel &9Aspect de Glace' +primis_ice_village_the_ice_elemental: + name: '$bossLevel &9Élémentaire de Glace' +primis_ice_village_the_ice_elemental_p2: + name: '$bossLevel &9Élémentaire de Glace' +primis_ice_village_the_ice_elemental_p3: + name: '$bossLevel &9Élémentaire de Glace' +primis_ice_village_trial_of_ice_minor_ice_elemental: + name: '$minibossLevel &9Élémentaire de Glace Mineur' +primis_ice_village_wolf_summon: + name: '$reinforcementLevel &cLoup apprivoisé' +primis_minor_ice_elemental: + name: '$bossLevel &9Élémentaire de Glace Mineur' +primis_minor_ice_elemental_p2: + name: '$bossLevel &9Élémentaire de Glace Mineur' +primis_mountain_pass_guardian_p1: + name: '$bossLevel &6Le Gardien' +primis_mountain_pass_guardian_p2: + name: '$bossLevel &6Le Gardien' +primis_mountain_pass_healer: + name: '$reinforcementLevel &fRepairtron' +primis_nasty_worm: + name: '$normalLevel &fVer malsain' +primis_ogre_mines_mite: + name: '$normalLevel &fMite de Mine' +primis_ogre_mines_ogre_archer: + name: '$minibossLevel &fOgre Archer' +primis_ogre_mines_ogre_magi: + name: '$minibossLevel &fOgre Magique' +primis_ogre_mines_ogre_warrior: + name: '$minibossLevel &fOgre Guerrier' +primis_ogre_mines_undead_archer: + name: '$normalLevel &fArcher mort-vivant' +primis_ogre_mines_undead_swordsman: + name: '$normalLevel &fÉpéiste Mort-vivant' +primis_pontis_beast_cod: + name: '$minibossLevel &dFuriosa, la Morue Bestiale' +primis_pontis_beast_crawler: + name: '$minibossLevel &dMegdun, la Bête Rampante' +primis_pontis_beast_impaler: + name: '$minibossLevel &dUladzimir, la Bête Empaleuse' +primis_pontis_counselor_guard_left_1: + name: '$normalLevel &4Garde du Conseiller Corrompu' +primis_pontis_counselor_guard_left_2: + name: '$normalLevel &4Garde du Conseiller Diforme' + deathMessage: '&5[Conseiller Machiavelli]&f Pour que cet imbécile ait fini par le comprendre...' +primis_pontis_counselor_guard_left_3: + name: '$normalLevel &4Expérience améliorée' + deathMessage: '&5[Conseiller Machiavelli]&f Vous êtes plus fort que je ne le pensais.' +primis_pontis_counselor_guard_left_4: + name: '$normalLevel &4Abomination' + deathMessage: '&5[Conseiller Machiavelli]&f Ma magie de l''âme me protégera !!!' +primis_pontis_counselor_guard_mid: + name: '$normalLevel &4Garde du Conseiller Corrompu' + deathMessage: '&8[Conseiller Machiavelli]&f Je vois que nous avons des invités!...' +primis_pontis_counselor_guard_right_1: + name: '$normalLevel &4Garde du Conseiller Corrompu' +primis_pontis_counselor_guard_right_2: + name: '$normalLevel &4Garde du Conseiller Diforme' +primis_pontis_counselor_guard_right_3: + name: '$normalLevel &4Expérience améliorée' +primis_pontis_counselor_guard_right_4: + name: '$normalLevel &4Abomination' +primis_pontis_counselor_twisted_copy: + name: '$reinforcementLevel &4Copie tordue' +primis_pontis_mille_arena_air_elemental: + name: '$minibossLevel &fÉlémentaire d''Air' +primis_pontis_mille_arena_human_wave_4: + name: '$normalLevel &4Guerrier Humain' +primis_pontis_mille_arena_human_wave_6: + name: '$normalLevel &4Guerrier Humain' +primis_pontis_mille_arena_human_wave_7: + name: '$normalLevel &4Guerrier Humain' +primis_pontis_mille_arena_human_wave_8: + name: '$normalLevel &4Guerrier Humain Dominé' +primis_pontis_mille_arena_human_worshiper: + name: '$normalLevel &4Adorateur Élémentaire' +primis_pontis_mille_arena_minor_air_elemental: + name: '$normalLevel &fAir Élémentaire Secondaire' +primis_pontis_mille_arena_minor_earth_elemental: + name: '$normalLevel &7Terre Élémentaire Secondaire' +primis_pontis_mille_arena_minor_fire_elemental: + name: '$normalLevel &eFeu Élémentaire Secondaire' +primis_pontis_mille_arena_minor_fire_elemental_prime: + name: '$normalLevel &eFeu Élémentaire Secondaire' +primis_pontis_mille_arena_minor_water_elemental: + name: '$normalLevel &bEau Élémentaire Secondaire' +primis_pontis_mille_arena_primal_air_wisp: + name: '$normalLevel &fBrin d''Air Primitif' +primis_pontis_mille_arena_primal_air_wisp_2: + name: '$normalLevel &fBrin d''Air Primitif' +primis_pontis_mille_arena_primal_earth_wisp: + name: '$normalLevel &fÉchantillon de Terre Primitive' +primis_pontis_mille_arena_primal_earth_wisp_2: + name: '$normalLevel &fÉchantillon de Terre Primitive' +primis_pontis_mille_arena_primal_fire_wisp: + name: '$normalLevel &fÉtincelle de Feu Primitif' +primis_pontis_mille_arena_primal_fire_wisp_2: + name: '$normalLevel &fÉtincelle de Feu Primitif' +primis_pontis_mille_arena_primal_fire_wisp_3: + name: '$normalLevel &fÉtincelle de Feu Primitif' +primis_pontis_mille_arena_primal_water_wisp: + name: '$normalLevel &fGoutte d''Eau Primitive' +primis_pontis_mille_arena_primal_water_wisp_2: + name: '$normalLevel &fGoutte d''Eau Primitive' +primis_pontis_mille_arena_primal_water_wisp_3: + name: '$normalLevel &fGoutte d''Eau Primitive' +primis_pontis_mille_arena_primal_wisp: + name: '$normalLevel &fBrin Primitif' +primis_pontis_mille_arena_water_elemental: + name: '$minibossLevel &1Élément Eau' +primis_pontis_mille_counselor_p1: + name: '$minibossLevel &fConseiller Machiavelli' +primis_pontis_mille_counselor_p2: + name: '$minibossLevel &fConseiller Machiavelli' +primis_pontis_mille_counselor_p3: + name: '$minibossLevel &fConseiller Machiavelli' +primis_pontis_mille_fields_babe_razorback: + name: '$normalLevel &2Bébé Razorback' +primis_pontis_mille_fields_bird: + name: '$normalLevel &fPlume de Rat des Champs' +primis_pontis_mille_fields_bird_nightmare: + name: '$normalLevel &dPlume de Rat Cauchemardesque' +primis_pontis_mille_fields_bubba: + name: '$minibossLevel &cLa Grosse et Vieille Bubba' +primis_pontis_mille_fields_field_rat: + name: '$normalLevel &fRat des Champs' +primis_pontis_mille_fields_juvenile_razorback: + name: '$normalLevel &2Razorback Juvénile' +primis_pontis_mille_fields_longhorn: + name: '$normalLevel &4Champs Longhorn' +primis_pontis_mille_fields_mature_razorback: + name: '$normalLevel &2Razorback Mature' +primis_pontis_mille_fields_shorthorn: + name: '$normalLevel &6Champs Shorthorn' +primis_pontis_mille_fields_two_legged_terror: + name: '$normalLevel &2Terreur à Deux Pattes' +primis_pontis_mille_fields_well_fed_rat: + name: '$normalLevel &fRat Bien Nourri' +primis_pontis_mille_rat: + name: '$normalLevel &fRat' +primis_quartz_elemental: + name: '$bossLevel &dÉlément Quartz' +primis_quartz_elemental_p2: + name: '$bossLevel &dÉlément Quartz' +primis_redwood_barracuda: + name: '$normalLevel &3Barracuda des Séquoias' +primis_redwood_fruity_hound: + name: '$normalLevel &2Chien Fruité' +primis_redwood_rockhound: + name: '$normalLevel &7Chien de Roche des Séquoias' +primis_redwood_werewolf_grunt: + name: '$normalLevel &cGrognement de Loup-garou des Séquoias' +primis_redwood_werewolf_packleader: + name: '$normalLevel &4Chef des Loup-garous des Séquoias' +primis_river_guardian: + name: '$normalLevel &5Gardien de la Rivière' +primis_roofed_forest_cave_spider: + name: '$normalLevel &6Le Rampant de la Niche' +primis_roofed_forest_cave_spider_boss: + name: '$bossLevel &eMère de la Niche' +primis_roofed_forest_spider: + name: '$normalLevel &6Le Rampant de la Forêt' +primis_roofed_forest_spider_reinforcement: + name: '$reinforcementLevel &6Couvé de la Niche' +primis_sea_monster: + name: '$bossLevel &dMonstre de la Mer' +primis_sewer_noxious_ninja: + name: '$normalLevel &2Ninja Toxique' +primis_sewer_spore_spreader: + name: '$normalLevel &4Étendoir à Spores' +primis_sewer_the_shredder_p1: + name: '$bossLevel &5Le Broyeur' +primis_sewer_the_shredder_p2: + name: '$bossLevel &5Le Broyeur' +primis_storm_temple_axeman: + name: '$normalLevel &dHacheur du Temple de la tempête' +primis_storm_temple_bowman: + name: '$normalLevel &dArcher du Temple de la Tempête' +primis_storm_temple_kuzco: + name: '$normalLevel &6Kuzco' +primis_storm_temple_minor_storm_elemental: + name: '$normalLevel &5Élémentaire de Tempête mineur' +primis_storm_temple_storm_elemental: + name: '$bossLevel &1Élémentaire de Tempête' +primis_storm_temple_storm_elemental_p2: + name: '$bossLevel &1Élémentaire de Tempête' +primis_storm_temple_storm_elemental_p3: + name: '$bossLevel &1Élémentaire de tempête' +primis_storm_temple_summoner: + name: '$normalLevel &5Invocateur du Temple de la tempête' +primis_terravilla_alpha_razorback: + name: '$minibossLevel &2Alpha Razorback' +primis_terravilla_alpha_razorback_p2: + name: '$minibossLevel &2Alpha Razorback' +primis_terravilla_bar_brawler: + name: '$normalLevel &6Bagarreur de barre' + onDamagedMessages: + - C'est tout ce que vous avez! + - Je n'ai même pas ressenti cela! + - Pourquoi... vous! + - Je vais vous montrer ! + - Qui t'es, putain ! + - PRENDS ÇA! +primis_terravilla_earth_elemental: + name: '$bossLevel &fÉlémentaire de Terre' +primis_terravilla_earth_elemental_p2: + name: '$bossLevel &fÉlémentaire de Terre' +primis_terravilla_earth_elemental_p3: + name: '$bossLevel &fÉlémentaire de Terre' +primis_terravilla_regular_fish: + name: '$normalLevel &bPoisson ordinaire' +primis_terravilla_robber_gladiator: + name: '$normalLevel &bGladiateur Voleur' +primis_terravilla_robber_slugger: + name: '$normalLevel &bCogneur' +primis_undead_archer: + name: '$normalLevel &fArcher mort-vivant' +primis_undead_climber: + name: '$normalLevel &0Grimpeur mort-vivant' +primis_undead_grappler: + name: '$normalLevel &3Grappeur mort-vivant' +primis_undead_guardian: + name: '$normalLevel &bGardien mort-vivant' +primis_undead_swordsman: + name: '$normalLevel &0Épéiste Mort-vivant' +pufferfish: + name: '$eventBossLevel &3Poisson Globe' + locationMessage: '&cPoisson Globe: $distance blocs de distance !' + spawnMessage: '&cUn poisson globe nage dans les océans!' + deathMessage: '&aLe règne du Poisson Globe est terminé par $players!' + escapeMessage: '&4Le Poisson Globe a nagé loin !' +pufferfish_summon_1: + name: '$eventBossLevel &bPooferfish' +pufferfish_summon_2: + name: '$eventBossLevel &bPooperfish' +pufferfish_summon_3: + name: '$eventBossLevel &bPooderfish' +pufferfish_summon_4: + name: '$eventBossLevel &bPudderfish' +queen_bee: + name: '$eventBossLevel &6Reine des abeilles' +rabbit_wolf_1: + name: '$eventBossLevel &cLoup de Flamme' + locationMessage: '&cFlamme : $distance blocs de distance !' + spawnMessage: '&cUn puissant duo est venu dans ce monde !' + deathMessage: '&aLe Loup et le Lapin ont été arrêtés par $players!' + escapeMessage: '&4Le Loup et le Lapin ont quitté cet endroit !' +rabbit_wolf_2: + name: '$eventBossLevel &cLapin Foudre' + locationMessage: '&cLumière: $distance blocs de distance !' + deathMessage: '&aLe Loup et le Lapin ont été arrêtés par $players!' + escapeMessage: '&4Le Loup et le Lapin ont quitté cet endroit !' +raug: + name: '$reinforcementLevel &4Raug' +regular_hoglin: + name: '$eventBossLevel &4Hoglin ordinaire' + locationMessage: '&cHoglin Ordinaire : $distance blocs de distance !' + spawnMessage: '&cUn Hoglin Ordinaire est arrivé ! Rien de spécial à propos de ce Hoglin !' + deathMessage: '&aLe Hoglin Ordinaire a été tué par $players !.' + escapeMessage: '&4Le Hoglin Ordinaire est parti !' +rotting_diver: + name: '$eventBossLevel &bPlongeur Moisi' + locationMessage: '&cLe Plongeur Moisi : à $distance blocs de distance !' + spawnMessage: '&cUn cadavre immonde flotte dans les eaux !' + deathMessage: '&aLe Plongeur Moisi a été envoyé dans les profondeurs par $players !' + escapeMessage: '&4Le Plongeur Moisi s''est envolé !' +salty_corpse: + name: '$eventBossLevel &bCadavre Salé' + locationMessage: '&cCadavre Salé : à $distance blocs de distance !' + spawnMessage: '&cQuelque chose d''horrible est remonté à la surface !' + deathMessage: '&aLe Cadavre Salé a été renvoyé dans les profondeurs par $players !' + escapeMessage: '&4Le Cadavre Salé est parti !' +skeleton_knight: + name: '$eventBossLevel &fChevalier Squelette' + locationMessage: '&cChevalier Squelette : à $distance blocs de distance !' + spawnMessage: '&cLes morts-vivants ont envoyé un Chevalier Squelette dans la nuit !' + deathMessage: '&aLe Chevalier Squelette a été tué par $players !' + escapeMessage: '&4Le Chevalier Squelette a dû se retirer !' +sky_archer: + name: '$eventBossLevel &aArcher du Ciel' + locationMessage: '&cArcher du Ciel : à $distance blocs de distance !' + spawnMessage: '&cUn archer céleste est entré dans ce monde ! Apportez votre arc !' + deathMessage: '&aL''Archer Céleste a été snipé par $players!' + escapeMessage: '&4L''Archer Céleste s''est envolé !' +sky_archer_mount: + name: '$eventBossLevel &aCoursier Céleste' +smallstack: + name: '$eventBossLevel &bDessus de Petit Stack' + locationMessage: '&cPetit Stack: $distance blocks away!' + spawnMessage: '&cUn Petit Stack est en itinérance !' + deathMessage: '&aLe Petit Stack a été déempilée par $players!' + escapeMessage: '&4Le Petit Stack est parti!' +smallstack_1: + name: '$eventBossLevel &bMilieu de Petit Stack' +smallstack_2: + name: '$eventBossLevel &bMilieu de Petit Stack' +smallstack_3: + name: '$eventBossLevel &bMilieu de Petit Stack' +smallstack_4: + name: '$eventBossLevel &bBas de Petit Stack' +smallstack_5: + name: '$eventBossLevel &bBas de Petit Stack' +smallstack_6: + name: '$eventBossLevel &bTransporteur de Petit Stack' +snoopy: + name: '&6{&4☠&6} &fSnoopy' + onDamageMessages: + - Ouaf ! + onDamagedMessages: + - Ouaf ! + spawnMessage: '&aUn Snoopy extrêmement rare a été aperçu !' +sorcerer_supreme: + name: '$eventBossLevel &5Sorcier Suprême' + locationMessage: '&cSorcier Suprême : $distance blocs de distance !' + spawnMessage: '&cUn sorcier tout-puissant s''est introduit dans ce monde !' + deathMessage: '&aLe Sorcier suprême a été vaincu par $players!' + escapeMessage: '&4Le sorcier suprême a quitté ce monde!' +sorcerer_supreme_summon: + name: '$eventBossLevel &5Serviteur Éternel' +spider_knight: + name: '$eventBossLevel &aChevalier nain' + locationMessage: '&cChevalier nain : $distance blocs de distance !' + spawnMessage: '&cUn Chevalier est venu défier les héros de ce lieu !' + deathMessage: '&aLe Chevalier a été vaincu par $players!' + escapeMessage: '&4Le Chevalier a quitté cet endroit !' +spider_knight_mount: + name: '$eventBossLevel &aCoursier Fidèle' +summonable_wolf: + name: '$normalLevel Wolfy' + onDamageMessages: + - Ouaf ! + onDamagedMessages: + - Ouaf ! +super_mite: + name: '$eventBossLevel &dSuper Mite' + locationMessage: '&cSuper Mite : $distance blocs de distance !' + spawnMessage: '&cUn fauteur de troubles apparait !' + deathMessage: '&aLa mite n''a pas pu gérer un combat avec $players!.' + escapeMessage: '&4Le Super Mite est sorti de l''ennui !' +super_mite_summon: + name: '$eventBossLevel &dAmi Mite' +suspicious_phantom: + name: '$eventBossLevel &ePhantom suspect' + locationMessage: '&cPhantome suspect : $distance blocs de distance !' + spawnMessage: '&cUn Phantom suspect a été vu dans les cieux !' + deathMessage: '&aLe Phantom a été mis au lit par $players!' + escapeMessage: '&4Le Phantom suspect est parti!' +suspicious_phantom_summon: + name: '$eventBossLevel &cIncendiaire' +suspicious_phantom_summon_1: + name: '$eventBossLevel &cLanceur de boules de feu' +test_boss: + name: '$eventBossLevel &6Test boss' + deathMessages: + - '&e&l---------------------------------------------' + - '&eLe Boss de test a été débogué !' + - '&c&l 1er en dégât : $damager1name &cavec $damager1damage dégâts !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&aTueurs : $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Je t'ai frappé! + onDamagedMessages: + - J'ai été frappé! + locationMessage: 'Entité test: $distance' + spawnMessage: Un boss de test est apparu ! + deathMessage: Un boss de test a été vaincu par $players! + escapeMessage: Un boss de test s'est échappé! +airship_tier_45_knockback: + name: '$normalLevel &2Archer à Arc' +airship_tier_45_witherblind: + name: '$normalLevel &aArcher Noxious' +airship_tier_50_powder_monkeys: + name: '$normalLevel &7Singe de Poudre' +airship_tier_50_scourge: + name: '$normalLevel &8Fier-à-bras Fléau' +airship_tier_60_mess_hall_mate: + name: '$normalLevel &bCamarade de foutoir' +airship_tier_65_boatswain_boss: + name: '$normalLevel &cChef maître d''Équipage' +airship_tier_65_bodyguard: + name: '$normalLevel &eboucanier Garde-du-corps' +airship_tier_65_silverfish: + name: '$normalLevel &8Rat de navire' +airship_tier_65_silverfish_reinforcement: + name: '$reinforcementLevel &8Souris du navire' +airship_tier_70_miniboss: + name: '$minibossLevel Quark l''Intendant ' +airship_tier_70_miniboss_2: + name: '$minibossLevel &6Chaudière vivante' +airship_tier_70_miniboss_wayfinder: + name: '$minibossLevel &3Guide de Quai' +airship_tier_75_boss: + name: '$bossLevel &4Capitaine Davey' + deathMessages: + - '&e&l---------------------------------------------' + - '&9Le capitaine Davey a été mis au repos ! ... à nouveau.' + - '&c&l 1er en dégât : $damager1name &cavec $damager1damage dégâts !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&aTueurs : $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Capitaine Davey : $distance' + spawnMessage: '&4Le capitaine Davey hante à nouveau les cieux !' + deathMessage: '$players &aa débarassé le &4Capitain Davey &ade son enveloppe mortelle!' + escapeMessage: '&6Le capitaine Davey est parti hanter un autre temps !' +binder_of_worlds_phase_1: + name: '$eventBossLevel &eLieur de Mondes' + spawnMessage: '&5Le lieur de mondes approche !' +binder_of_worlds_phase_1_melee_miniboss: + name: '$reinforcementLevel &5Déracineur de réalité' +binder_of_worlds_phase_1_melee_reinforcement: + name: '$reinforcementLevel &6Gaspilleur de réalité' +binder_of_worlds_phase_1_parkour_reinforcement: + name: '$reinforcementLevel &6Annonciateur de réalité' +binder_of_worlds_phase_1_ranged_miniboss: + name: '$reinforcementLevel &3Ruineur de réalité' +binder_of_worlds_phase_1_ranged_reinforcement: + name: '$reinforcementLevel &6Ruineur de réalité' +binder_of_worlds_phase_1_status_miniboss: + name: '$reinforcementLevel &1Arracheur de Réalité' +binder_of_worlds_phase_1_status_reinforcement: + name: '$reinforcementLevel &7Briseur de réalité' +binder_of_worlds_phase_2: + name: '$eventBossLevel &eLieur de Mondes' +binder_of_worlds_phase_3: + name: '$eventBossLevel &eLieur de Mondes' +binder_of_worlds_phase_3_shulker_reinforcement: + name: '$reinforcementLevel &5Déchiqueteur de réalité' +binder_of_worlds_phase_4: + name: '$eventBossLevel &eLieur de Mondes' + deathMessages: + - '&e&l---------------------------------------------' + - '&9Le lieur n''est plus lié à ce plan mortel !' + - '&c&l 1er en dégât : $damager1name &cavec $damager1damage dégâts !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&aTueurs : $players' + - '&e&l---------------------------------------------' +catacombs_tier_10_miniboss: + name: '$minibossLevel &7Terragog' +catacombs_tier_15_boss: + name: '$bossLevel &6Le Crotale' + deathMessages: + - '&e&l---------------------------------------------' + - '&9Le Crotale a fait des bruits !' + - '&c&l 1er en dégât : $damager1name &cavec $damager1damage dégâts !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&aTueurs : $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Se sentir... bruyant? + - Montrez-moi votre squelette ! + - Vous avez osé ! + - Votre calcium est faible ! + onDamagedMessages: + - Je l'ai senti dans mes os! + - J'ai un os à ronger avec vous ! + - Doot doot mr skeltal + - J'ai besoin de calcium! + locationMessage: 'Le Crotale: $distance blocs de distance !' + spawnMessage: '&6Le Crotale s''élève !' + deathMessage: '&aLe Crotale a été vaincu par $players!' +catacombs_tier_15_mimic_boss: + name: '$bossLevel &6L''Oublié' +catacombs_tier_15_reinforcement: + name: '$reinforcementLevel &eRetourné' +catacombs_tier_5_evoker_guard_2: + name: '$normalLevel &7Garde de Catacombe' + onDamageMessages: + - Interdiction d'entrer! + - Entrée interdite! +catacombs_tier_5_illusioner_guard_1: + name: '$normalLevel &7Garde de Catacombe' + onDamageMessages: + - Interdiction d'entrer! + - Entrée interdite! +colosseum_tier_70_boss_mount: + name: '$bossLevel &4Seigneur de la fosse' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Le Seigneur de la Fosse n''est plus !' + - '&c&l 1er en dégât : $damager1name &cavec $damager1damage dégâts !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&4Tueurs : $players' + - '&e&l---------------------------------------------' + deathMessage: '&2Le Seigneur de la Fosse a été vaincu par $players!' +colosseum_tier_70_boss_p1: + name: '$bossLevel &cMaître de la fosse' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Le maître de la fosse est tombé !' + - '&c&l 1er en dégât : $damager1name &cavec $damager1damage dégâts !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&4Tueurs : $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Maître de la fosse : $distance blocs de distance !' + spawnMessage: '&4Le Maître de la fosse charge une fois de plus au combat!' + deathMessage: '&2Le maître de la fosse a été tué par $players!' +colosseum_tier_70_boss_p2: + name: '$bossLevel &cMaître de la fosse' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Le maître de la fosse est tombé !' + - '&c&l 1er en dégât : $damager1name &cavec $damager1damage dégâts !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&4Tueurs : $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Maître de la fosse : $distance blocs de distance !' + deathMessage: '&2Le maître de la fosse a été tué par $players!' +colosseum_tier_70_boss_reinforcements_p1: + name: '$reinforcementLevel &6Gladiateur' +colosseum_tier_70_boss_reinforcements_p2: + name: '$reinforcementLevel &6Gladiateur' +colosseum_tier_70_gladiator: + name: '$normalLevel &6Gladiateur' +colosseum_tier_70_mount_reinforcements: + name: '$reinforcementLevel &cBête de la Fosse' +dark_cathedral_tier_75_boss: + name: '$bossLevel &4Cultiste de Cthulhu' + deathMessages: + - '&e&l---------------------------------------------' + - '&4L''invocation a été interrompue !' + - '&c&l 1er en dégât : $damager1name &cavec $damager1damage dégâts !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&4Tueurs : $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Imbéciles! + - Cthulhu R'lyeh! + - Personne ne peut vaincre Chtulhu! + - Observe dans les abysses... + locationMessage: 'Cultiste de Cthulhu: $distance blocs de distance' + spawnMessage: '&cUn cultiste sombre invoque Cthulhu!' + deathMessage: '&2L''Invocation a été déjouée $players!' + escapeMessage: '&2Le fanatique a terminé l''invocation !' +dark_cathedral_tier_75_reinforcement: + name: '$reinforcementLevel Suiveur de Cthulhu' + onDamageMessages: + - Cthulhu R'lyeh + onDamagedMessages: + - Cthulhu R'lyeh +darkspire_level_100_berserker_brute: + name: '$normalLevel &7Berserker du monde souterrain' +darkspire_level_100_berserker_reanimated: + name: '$normalLevel &fBerserker Réanimé de monde souterrain' +darkspire_level_100_blacksmith_brute: + name: '$normalLevel &eForgeron d''Or fumante' +darkspire_level_100_endermite: + name: '$normalLevel &5Rampeur de Vide' +darkspire_level_100_marksman_piglin: + name: '$normalLevel &9Tireur d''élite imbécile' +darkspire_level_100_sentry_brute: + name: '$normalLevel &3Sentinelle Garde-Sombre' +darkspire_level_100_summon_blaze: + name: '$reinforcementLevel &cApparition infernale' +darkspire_level_100_summon_evoker: + name: '$reinforcementLevel &cFaux Enfer' +darkspire_level_100_summon_ghast: + name: '$reinforcementLevel &7Maalkvvhar' +darkspire_level_100_summon_husk: + name: '$reinforcementLevel &cOroxak le Corrompu' +darkspire_level_100_summon_ravager: + name: '$reinforcementLevel &cEerbix le Déchu' +darkspire_level_100_summon_skeleton: + name: '$reinforcementLevel &cConnerie' +darkspire_level_110_berserker_reanimated: + name: '$normalLevel &7Berserker Réanimé de monde souterrain' +darkspire_level_110_marksman_reanimated: + name: '$normalLevel &9Tireur d''élite imbécile réanimé' +darkspire_level_110_necromancer_evoker: + name: '$normalLevel &8Enchanteur noir' +darkspire_level_110_sentry_reanimated: + name: '$normalLevel &3Guet Sombre réanimé' +darkspire_level_110_stationary_stray: + name: '$normalLevel &6Guetteur taillé' +darkspire_level_120_miniboss_evoker: + name: '$minibossLevel &4Enfer' +darkspire_level_120_miniboss_illusioner: + name: '$minibossLevel &4Maalkv' +darkspire_level_120_miniboss_skeleton: + name: '$minibossLevel &4Gardien de Crypte' +darkspire_level_120_miniboss_stray: + name: '$minibossLevel &4Nicolas Ribcage' +darkspire_level_120_miniboss_vindicator: + name: '$minibossLevel &4Zalmur le Trancheur de Lutin' +darkspire_level_120_miniboss_wither_skeleton: + name: '$minibossLevel &4Oroxak' +darkspire_level_120_summon_zoglin: + name: '$reinforcementLevel &cHorde d''Arzag' +darkspire_level_130_miniboss_phase_brute: + name: '$bossLevel &4Arzag la Bête' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Arzag l''invasion de la Bête a été stoppée!' + - '&c&l 1er en dégât : $damager1name &cavec $damager1damage dégâts !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&4Tueurs : $players' + - '&e&l---------------------------------------------' +darkspire_level_130_miniboss_zoglin: + name: '$bossLevel &4Arzag la Bête' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Arzag l''invasion de la Bête a été stoppée!' + - '&c&l 1er en dégât : $damager1name &cavec $damager1damage dégâts !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&4Tueurs : $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Arzag la Bête : $distance blocs de distance' + spawnMessage: '&4Arzag la Bête prépare l''invasion !' + escapeMessage: '&cArzag la Bête a fini de piller !' +darkspire_level_80_summon_blaze: + name: '$reinforcementLevel &dFaux spawn infernal' +fireworks_level_50_boss_phase_1: + name: '$eventBossLevel &cSparky' + spawnMessage: '&eDes étincelles remplissent le ciel!' +fireworks_level_50_boss_phase_2: + name: '$eventBossLevel &cSparky' +fireworks_level_50_boss_phase_3: + name: '$eventBossLevel &cSparky' + deathMessages: + - '&e&l---------------------------------------------' + - '&eSortie de Sparky, la fête est terminée !' + - '&c&l 1er en dégât : $damager1name &cavec $damager1damage dégâts !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&aTueurs : $players' + - '&e&l---------------------------------------------' + spawnMessage: '&6Sparky revient pour fêter ça !' +fireworks_phase_2_reinforcement: + name: '$eventBossLevel &cBoomi' +fireworks_phase_3_reinforcement: + name: '$eventBossLevel &cFêtard' +the_great_weaver: + name: '$eventBossLevel &cLe Grand Tisseur' + locationMessage: '&cLe Grand Tisseur : $distance blocs de distance !' + spawnMessage: '&cDes créatures terribles sont apparues !' + deathMessage: '&aLe Grand Tisseur et sa progéniture ont été arrêtés par $players!' + escapeMessage: '&4Le Grand Tisseur et sa progéniture ont été arrêtés par!' +the_great_weaver_summon: + name: '$eventBossLevel &4Mère de la couvée' +the_great_weaver_summon_1: + name: '$eventBossLevel &6Couvée' +halloween_event_boss_mount: + name: '$minibossLevel Daredevil' +halloween_event_boss_p1: + name: '$bossLevel Dullahan' + locationMessage: '&4Dullahan : $distance blocs de distance !' + spawnMessage: '&4Ne perdez pas la tête maintenant, le cavalier sans tête marche à nouveau sur la terre !' + deathMessage: '&4Le cavalier sans tête a été vaincu par $players!' + escapeMessage: '&4Le cavalier sans tête est parti hanter les rêves de quelqu''un !' +halloween_event_boss_p2: + name: '$bossLevel Dullahan' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Le Cavalier sans tête a été vaincu !' + - '&c&l 1er en dégât : $damager1name &cavec $damager1damage dégâts !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&4Tueurs : $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Dullahan : $distance blocs de distance !' + deathMessage: '&4Le cavalier sans tête a été vaincu par $players!' + escapeMessage: '&4Le cavalier sans tête est parti hanter les rêves de quelqu''un !' +halloween_event_boss_reinforcement: + name: '$normalLevel Squelette Effrayant' +the_hunter: + name: '$eventBossLevel &4Le Chasseur' + locationMessage: '&cLe Chasseur : $distance blocs de distance !' + spawnMessage: '&cUn chasseur est sur la proue !' + deathMessage: '&aLe Chasseur a été chassé à l''extinction par $players!' + escapeMessage: '&4Le chasseur déclare que la chasse est terminée !' +the_hunter_mount: + name: '$eventBossLevel &fBête apprivoisée' +the_living_dead: + name: '$reinforcementLevel &6La Mort Vivante' +northpole_elf: + name: '$normalLevel &2Elfe de l''Atelier' +northpole_elf_summon: + name: '$reinforcementLevel &aElfe du Père Noël' +northpole_jack_frost: + name: '$bossLevel &bJack Frost' +northpole_krampus: + name: '$bossLevel &5Krampus' +northpole_mrs_claus: + name: '$bossLevel &cMère Noël' +northpole_santa_claus: + name: '$bossLevel &4Père Noël' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Quelqu''un a volé tous les cadeaux du Père Noël!' + - '&c&l 1er en dégât : $damager1name &cavec $damager1damage dégâts !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&4Tueurs : $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Père Noël: $distance blocs de distance' + spawnMessage: '&4Le Père Noël se prépare pour Noël!!' + escapeMessage: '&cLe Père Noël est parti sur son traîneau !' +northpole_skeleton_summon: + name: '$reinforcementLevel &dÂme de la liste des vilains' +northpole_snowy_wraith: + name: '$reinforcementLevel &1Spectre neigeux' +the_phantom: + name: '$eventBossLevel &7Le Fantôme' + locationMessage: '&cLe Fantôme : $distance blocs de distance !' + spawnMessage: '&cUn Fantôme circule dans l''obscurité !' + deathMessage: '&aLe Fantôme et sa troupe maléfique ont été arrêtés par $players!' + escapeMessage: '&4Le Fantôme est parti!' +the_phantom_summon_1: + name: '&fAraignée cavernicole' +the_phantom_summon_2: + name: '&fSorcière' +the_phantom_summon_3: + name: '&fZombie' +the_phantom_summon_4: + name: '&fHusk' +the_phantom_summon_5: + name: '&fNoyé' +the_phantom_summon_6: + name: '&fSquelette' +the_phantom_summon_7: + name: '&fErrer' +the_phantom_summon_8: + name: '&fEnderman' +pirate_ship_tier_10: + name: '$normalLevel &cMembre d''équipage' + onDamageMessages: + - Yarr! + - Harr! + - Avast, mon pote ! + - Toutes les mains hissées! + - Dansez la gigue de chanvre ! + - Ye dungbie! + - Faites-moi frissoner! +pirate_ship_tier_15: + name: '$normalLevel &cMatelot' + onDamageMessages: + - Yarr! + - Harr! + - Avast, mon pote ! + - Toutes les mains hissées! + - Dansez la gigue de chanvre ! + - Ye dungbie! + - Faites-moi frissoner! +pirate_ship_tier_20_melee_1: + name: '$normalLevel &cMembre d''équipage' + onDamageMessages: + - Yarr! + - Harr! + - Avast, mon pote ! + - Toutes les mains hissées! + - Dansez la gigue de chanvre ! + - Ye dungbie! + - Faites-moi frissoner! +pirate_ship_tier_20_melee_2: + name: '$normalLevel &eLourd ivre' + onDamageMessages: + - Yarr! + - Harr! + - Avast, mon pote ! + - Toutes les mains hissées! + - Dansez la gigue de chanvre ! + - Ye dungbie! + - Faites-moi frissoner! +pirate_ship_tier_20_miniboss: + name: '$minibossLevel &dCookie le cuisinier' + onDamageMessages: + - Qu'est-ce que tu fais dans ma cuisine ! + - J'ai plusieurs couches ! + - Vous avez été servi ! + - Sortez de ma cuisine ! + deathMessage: '&2Cookie le cuisinier a été tranché et coupé par $players!' +pirate_ship_tier_20_ranged: + name: '$normalLevel &cMembre d''équipage' + onDamageMessages: + - Yarr! + - Harr! + - Avast, mon pote ! + - Toutes les mains hissées! + - Dansez la gigue de chanvre ! + - Ye dungbie! + - Faites-moi frissoner! +pirate_ship_tier_25_miniboss_1: + name: '$miniboss &cCharon le Timonier' + onDamageMessages: + - Imbéciles ahoy! + - Véritable adversaire à la proue ! + deathMessage: '&2Charon le Timonier a été égaré par $players!' +pirate_ship_tier_30_melee: + name: '$normalLevel &cPirate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, mon pote ! + - Toutes les mains hissées! + - Dansez la gigue de chanvre ! + - Ye dungbie! + - Faites-moi frissoner! +pirate_ship_tier_30_miniboss_1: + name: '$minibossLevel &7Crushy le Broyeur' + onDamageMessages: + - Yarr! + - Harr! + - Avast, mon pote ! + - Toutes les mains hissées! + - Dansez la gigue de chanvre ! + - Ye dungbie! + - Faites-moi frissoner! + deathMessage: '&7Crushy le Broyeur a été écrasé par $players!' +pirate_ship_tier_30_ranged: + name: '$normalLevel &cPirate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, mon pote ! + - Toutes les mains hissées! + - Dansez la gigue de chanvre ! + - Ye dungbie! + - Faites-moi frissoner! +pirate_ship_tier_35: + name: '$normalLevel &4Navigateur pirate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, mon pote ! + - Toutes les mains hissées! + - Dansez la gigue de chanvre ! + - Ye dungbie! + - Faites-moi frissoner! +pirate_ship_tier_35_miniboss_1: + name: '$minibossLevel &cDeuxième lieutenant' + onDamageMessages: + - Vous n'êtes pas autorisé ici ! + - Quartiers du capitaine, reculez ! +pirate_ship_tier_35_miniboss_2: + name: '$minibossLevel &cDeuxième lieutenant' + onDamageMessages: + - Vous n'êtes pas autorisé ici ! + - Quartiers du capitaine, reculez ! +pirate_ship_tier_40_miniboss_1: + name: '$minibossLevel &4Première main' + onDamageMessages: + - Yarr! + - Harr! + - Avast, mon pote ! + - Toutes les mains hissées! + - Dansez la gigue de chanvre ! + - Ye dungbie! + - Faites-moi frissoner! + deathMessage: '&6La première main du bateau pirate a été rétrogradée par $players !' +pirate_ship_tier_45_boss: + name: '$bossLevel &4Capitaine Barbe Noire' + onDamageMessages: + - Descendez de mon vaisseau ! + - Arr, terriens ! + spawnMessage: '&4Le capitaine Blackbeard est à la tête du bateau pirate !' + deathMessage: '&2La barbe du Capitaine Barbe Noire a été rasée par $players !' + escapeMessage: '&2Le capitaine Barbe Noire s''est enfui avec le butin !' +the_returned: + name: '$reinforcementLevel &6Le Revenu' +ruins_boss_p1: + name: '$eventBossLevel &9Thor' + spawnMessage: '&6La foudre descend du ciel!' +ruins_boss_p2: + name: '$eventBossLevel &9Thor' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Thor a été renvoyé à Asgard!' + - '&c&l 1er en dégât : $damager1name &cavec $damager1damage dégâts !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&aTueurs : $players' + - '&e&l---------------------------------------------' + spawnMessage: '&6La foudre descend du ciel!' +ruins_boss_reinforcement: + name: '$eventBossLevel &7Fenrir' +sewer_tier_10: + name: '$normalLevel &fRôdeur' +sewer_tier_15: + name: '$normalLevel &2Crawler' +sewer_tier_20_dry: + name: '$normalLevel &1Vagabond perdu' +sewer_tier_20_gravity_boss: + name: '$minibossLevel &1Étincelle' +sewer_tier_20_water: + name: '$normalLevel &1Contrebandier' + onDamageMessages: + - Vous ne devriez pas être ici! + onDamagedMessages: + - Personne ne se mettra en travers de notre chemin ! +sewer_tier_20_water_boss: + name: '$minibossLevel &1Héros oublié' +sewer_tier_20_wither_boss: + name: '$minibossLevel &2Cadavre desséché' +sewer_tier_30_ice_boss: + name: '$minibossLevel &2Spectre de glace' +sewer_tier_30_invisibility_boss: + name: '$minibossLevel &2Archer des ombres' +sewer_tier_30_melee: + name: '$normalLevel &5Bête d''égout' +sewer_tier_30_ranged: + name: '$normalLevel &5Murmure d''Esprit' + onDamageMessages: + - Une malédiction sur vous ! + - Une vérole sur votre famille ! + - Ressentez la colère des esprits ! + onDamagedMessages: + - Vous me vexez ainsi! + - Esprits, protégez-moi ! +sewer_tier_40: + name: '$normalLevel &6Mirage' + onDamageMessages: + - Vous avez gagné, un mensonge + - Vos chances, sinistres + - Votre vie, la mienne + onDamagedMessages: + - Cette douleur, une illusion + - Ce sang, un mirage + - Cette faiblesse, un mensonge +sewer_tier_40_darkness_boss: + name: '$minibossLevel &2Le Maître des ombres' +sewer_tier_40_darkness_boss_reinforcement: + name: '$reinforcementLevel &2Ombre' +sewer_tier_40_fire_boss: + name: '$minibossLevel &2Le maître du grill' +sewer_tier_40_fire_boss_reinforcement: + name: '$reinforcementLevel &2Flamme' +sewer_tier_40_poison_boss: + name: '$minibossLevel &2Jardinier Toxique' + onDamageMessages: + - Sentez la colère de la nature! + onDamagedMessages: + - A moi, les serviteurs! +sewer_tier_40_poison_boss_reinforcement: + name: '$reinforcementLevel &2Jardin déchu' +sewer_tier_5: + name: '$normalLevel &7Ouvrier d''égout' + onDamageMessages: + - L'accès à cette zone est restreint ! + - Ne sautez pas dans les cuves ! + - | + Vous n'êtes pas censé être ici| + onDamagedMessages: + - Savez-vous ce que vous faites!? + - Folie ! + - N'y pense même pas! +sewer_tier_50: + name: '$normalLevel &3Piranha d''égout' +sewer_tier_50_lightning_boss: + name: '$minibossLevel &2Mjolnir' +sewer_tier_50_ravager_boss: + name: '$minibossLevel &2Monstruosité des égouts' +sewer_tier_50_spider_boss: + name: '$minibossLevel &2Ancien Rampeur' +sewer_tier_50_spider_boss_reinforcement: + name: '$reinforcementLevel &2Araignée' +sewer_tier_50_water_boss: + name: '$minibossLevel &2Roi Piranha' +sewer_tier_50_water_boss_reinforcement: + name: '$reinforcementLevel &2Prince Piranha' +sewer_tier_60: + name: '$normalLevel &4Pemier Noyé' +sewer_tier_70_boss: + name: '$bossLevel &4Roi noyé' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Le Roi noyé a été tué !' + - '&c&l 1er en dégât : $damager1name &cavec $damager1damage dégâts !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&4Tueurs : $players' + - '&e&l---------------------------------------------' + spawnMessage: '&cLes égouts font écho à la clameur d''un roi retourné...' + deathMessage: '&2Le Roi noyé a été tué !' + escapeMessage: '&2Les égouts deviennent silencieux, pour l''instant...' +sewer_tier_70_boss_reinforcement: + name: '$reinforcementLevel &4Pemier Noyé' +totem_zombie_1: + name: '$eventBossLevel Tête Zombie' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Le Totem de Zombie a été vaincu !' + - '&c&l 1er en dégât : $damager1name &cavec $damager1damage dégâts !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&aTueurs : $players' + - '&e&l---------------------------------------------' + locationMessage: '&cTotem de Zombie: $distance blocs de distance !' + spawnMessage: '&cUne abomination du Dr Craftenmine a été vue !' + deathMessage: '&aL''abomination de Craftenmine a été terminée par $players!' + escapeMessage: '&4La création de la Dr. Craftenmine s''est échappée!' +totem_zombie_2: + name: '$eventBossLevel Zombie Totem' +totem_zombie_3: + name: '$eventBossLevel Zombie Totem' +totem_zombie_4: + name: '$eventBossLevel Zombie Totem' +totem_zombie_5: + name: '$eventBossLevel Zombie Totem' +totem_zombie_6: + name: '$eventBossLevel Zombie Totem' +treasure_goblin: + name: '$eventBossLevel &eGobelin au Trésor' + deathMessages: + - '&e&l---------------------------------------------' + - '&eLe Gobelin au Trésor a été pillé !' + - '&c&l 1er en dégât : $damager1name &cavec $damager1damage dégâts !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&aTueurs : $players' + - '&e&l---------------------------------------------' + locationMessage: '&cGobelin au trésor : $distance blocs de distance !' + spawnMessage: '&cUn gobelin au trésor a été aperçu !' + deathMessage: '&aUn gobelin au trésor a été vaincu par $players!' + escapeMessage: '&4Un gobelin au trésor s''est échappé!' +tree_defender: + name: '$eventBossLevel &2Défenseur d''arbre' +undead_farmer: + name: '$eventBossLevel &aFermier mort-vivant' + locationMessage: '&cFermier mort-vivant : $distance blocs de distance !' + spawnMessage: '&cUn fermier mort-vivant parcourt la terre !' + deathMessage: '&aLa carrière du fermier mort-vivant s''est terminée par $players !' + escapeMessage: '&4Le fermier mort-vivant est retourné se reposer !' +undead_farmer_summon: + name: '$eventBossLevel &2Fierté des agriculteurs' +undead_farmer_summon_1: + name: '$eventBossLevel &2Porc raté' +undead_horde_summon_1: + name: '$reinforcementLevel &aHorde de Morts-Vivants' +undead_horde_summon_2: + name: '$reinforcementLevel &dHorde de Morts-Vivants' +undead_horde_summon_3: + name: '$reinforcementLevel &eHorde de Morts-Vivants' +unwanted_visitor: + name: '$eventBossLevel &9Visiteur Inattendu' + locationMessage: '&cVisiteur Inattendu: $distance blocs de distance !' + spawnMessage: '&cUn Visiteur Inattendu est venu au Nether pour se réchauffer !' + deathMessage: '&aLe Visiteur a été tué par $players!' + escapeMessage: '&4Le Visiteur est retourné dans son domaine frileux !' +unwanted_visitor_summon: + name: '$eventBossLevel &bClone de glace' +vampire_boneman: + name: '$reinforcementLevel &7Drainlings' +vampire_brute: + name: '$normalLevel &1Vampire Brute' +vampire_brute_coffin_breaker: + name: '$normalLevel &1Vampire Brute' +vampire_brute_gargoyle_rush_left: + name: '$normalLevel &3Vampire Brute' +vampire_brute_gargoyle_rush_left_phase_2: + name: '$normalLevel &3Vampire Brute' +vampire_brute_gargoyle_rush_right: + name: '$normalLevel &3Vampire Brute' +vampire_brute_gargoyle_rush_right_phase_2: + name: '$normalLevel &3Vampire Brute' +vampire_fledgling: + name: '$normalLevel &9Jeune Vampire' +vampire_fledgling_coffin_breaker: + name: '$normalLevel &9Jeune Vampire' +vampire_fledgling_gargoyle_overlord: + name: '$normalLevel &9Jeune Vampire' +vampire_gargoyle: + name: '$normalLevel &6Gargouille de Vampire' +vampire_grunt: + name: '$normalLevel &1Grognement de Vampire' +vampire_grunt_coffin_breaker: + name: '$normalLevel &1Grognement de Vampire' +vampire_grunt_gargoyle_rush_left: + name: '$normalLevel &1Grognement de Vampire' +vampire_grunt_gargoyle_rush_left_phase_2: + name: '$normalLevel &1Grognement de Vampire' +vampire_grunt_gargoyle_rush_right: + name: '$normalLevel &1Grognement de Vampire' +vampire_grunt_gargoyle_rush_right_phase_2: + name: '$normalLevel &1Grognement de Vampire' +vampire_hound: + name: '$reinforcementLevel &bMolosse de Vampire' +vampire_king: + name: '$bossLevel &4Roi Vampire' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Le Roi Vampire a été tué !' + - '&c&l 1er en dégât : $damager1name &cavec $damager1damage dégâts !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&4Tueurs : $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Roi Vampire : à $distance blocs de distance.' + spawnMessage: '&cLe roi vampire rampe vers son trône...' + deathMessage: '&2Le roi vampire a été frappé !' + escapeMessage: '&2Les ténèbres fuient, mais pour combien de temps...' +vampire_king_phase_2: + name: '$bossLevel &4Roi Vampire' +vampire_king_phase_3: + name: '$bossLevel &4Roi Vampire' +vampire_king_phase_4: + name: '$bossLevel &4Roi Vampire' +vampire_king_phase_5: + name: '$bossLevel &4Roi Vampire' +vampire_king_phase_6: + name: '$bossLevel &4Roi Vampire' +vampire_level_120_miniboss_evoker: + name: '$minibossLevel &4Esprit d''éleveur infernal' +vampire_level_120_miniboss_skeleton: + name: '$minibossLevel &4Esprit du gardien de la crypte' +vampire_level_120_miniboss_stray: + name: '$minibossLevel &4Esprit de Nicolas Ribcage' +vampire_level_120_miniboss_wither_skeleton: + name: '$minibossLevel Esprit d''Oroxak' +vampire_necromancer: + name: '$normalLevel &5Nécromancien Vampire' +vampire_necromancer_dining_hall: + name: '$normalLevel &5Nécromancien Vampire' +vampire_necromancer_entrance: + name: '$normalLevel &5Nécromancien Vampire' +vampire_necromancer_foresight_pool: + name: '$normalLevel &5Nécromancien Vampire' +vampire_necromancer_gargoyle_rush: + name: '$normalLevel &5Nécromancien Vampire' +vampire_necromancer_gargoyle_rush_phase_2: + name: '$normalLevel &5Nécromancien Vampire' +vampire_necromancer_left_bedroom: + name: '$normalLevel &5Nécromancien Vampire' +vampire_necromancer_right_bedroom: + name: '$normalLevel &5Nécromancien Vampire' +vampire_necromancer_supply_room: + name: '$normalLevel &5Nécromancien Vampire' +vampire_necromancer_supreme_coffin_breaker: + name: '$minibossLevel &5Nécromancien Vampire Suprême' +vampire_necromancer_supreme_coffin_breaker_phase_2: + name: '$minibossLevel &5Nécromancien Vampire Suprême' +vampire_necromancer_supreme_coffin_breaker_phase_3: + name: '$minibossLevel &5Nécromancien Vampire Suprême' +vampire_necromancer_supreme_coffin_breaker_phase_4: + name: '$minibossLevel &5Nécromancien Vampire Suprême' +vampire_necromancer_supreme_coffin_breaker_phase_5: + name: '$minibossLevel &5Nécromancien Vampire Suprême' +vampire_necromancer_supreme_gargoyle_overlord: + name: '$minibossLevel &5Nécromancien Vampire Suprême' +vampire_necromancer_supreme_gargoyle_overlord_phase_2: + name: '$minibossLevel &5Nécromancien Vampire Suprême' +vampire_necromancer_supreme_gargoyle_overlord_phase_3: + name: '$minibossLevel &2Suzerain Gargouille' +vampire_sentinel: + name: '$minibossLevel &eSentinelle du Vampire' +vampire_thrall: + name: '$reinforcementLevel &dServiteur du Vampire' +vampire_wraith: + name: '$minibossLevel &8Premier Asséché' +vampire_wraith_phase_2: + name: '$minibossLevel &8Premier Noyé' +vampire_zombie: + name: '$normalLevel &aHusk Asséché' +vex_top: + name: '$eventBossLevel &eVex Egoïste supérieur' + locationMessage: '&cVex Fauteur de troubles : $distance blocs de distance !' + spawnMessage: '&cUn groupe de fauteurs de troubles Vex est apparu!' + deathMessage: '&aLesVex Fauteurs de troubles ont été tués par $players!' + escapeMessage: '&4Les Vex fauteurs de troubles ont décidé de partir.' +vex_top_mount_1: + name: '$eventBossLevel &6Vex inférieur' +vex_top_mount_2: + name: '$eventBossLevel &6Vex inférieur' +vex_top_mount_3: + name: '$eventBossLevel &6Vex inférieur' +warlock: + name: '$eventBossLevel &dDémoniste' + locationMessage: '&cDémoniste : $distance blocs de distance !' + spawnMessage: '&cUn démoniste chevaucheur de démon est apparu!' + deathMessage: '&aLe Démoniste a été tué par $players!' + escapeMessage: '&4Le démoniste s''est enfui sur son démon!' +warlock_mount: + name: '$eventBossLevel &dDémon' +wasp_queen: + name: '$eventBossLevel &aReine Guêpe' + locationMessage: '&cReine guêpe : à $distance blocs de distance !' + spawnMessage: '&cUn essaim de guêpes a été détecté !' + deathMessage: '&aL''essaim de guêpes a été éliminé par $players!' + escapeMessage: '&4L''essaim de guêpes s''est envolé.' +wasp_queen_summon: + name: '$eventBossLevel &aGuêpe' +water_pest: + name: '$eventBossLevel &3Peste d''eau' + locationMessage: '&cPeste d''eau : $distance blocs de distance !' + spawnMessage: '&cUn ennemi agaçant nage dans les eaux!' + deathMessage: '&aLa Peste d''eau a été tuée par $players!' + escapeMessage: '&4Les eaux sont dégagées de tous les parasites' +weapons_goblin: + name: '$eventBossLevel &cGobelin d''armes' + deathMessages: + - '&e&l---------------------------------------------' + - '&eLe Gobelin d''armes a été pillé !' + - '&c&l 1er en dégât : $damager1name &cavec $damager1damage dégâts !' + - '&6&l 2nd en dégât : $damager2name &6avec $damager2damage dégâts !' + - '&e&l 3ème en dégât : $damager3name &eavec $damager3damage dégâts !' + - '&aTueurs : $players' + - '&e&l---------------------------------------------' + locationMessage: '&cGobelin d''armes : $distance blocs de distance !' + spawnMessage: '&cUn gobelin d''armes a été vu!' + deathMessage: '&aUn gobelin d''armes a été vaincu par $players!' + escapeMessage: '&4Un gobelin d''armes s''est échappé !' +wendigo: + name: '$eventBossLevel &7Wendigo' + locationMessage: '&cWendigo: à $distance blocs de distance !' + spawnMessage: '&cQuelque chose de terrible est apparu !' + deathMessage: '&aLe Wendigo a été tué $players!' + escapeMessage: '&4Le Wendigo a disparu !' +wendigo_summon: + name: '$reinforcementLevel &aWindigo' +werehare: + name: '$eventBossLevel &5Alice' + locationMessage: '&cGarou: à $distance blocs de distance !' + spawnMessage: '&cUn rugissement sanglant se fait entendre ! Un Garou approche !' + deathMessage: '&a$players! fait en sorte de mettre fin au règne du Garou !' + escapeMessage: '&4Le Garou s''est échappé !' +werehare_p2: + name: '$eventBossLevel &dGarou' +wild_wolf: + name: '$reinforcementLevel &7Loup Sauvage' +wood_league_wave_10_boss: + name: '$bossLevel &4Mauvais Dogo' +wood_league_wave_10_reinforcement: + name: '$reinforcementLevel &cMauvais Chiot' +wood_league_wave_11_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_11_ranged: + name: '$normalLevel Arbalétrier d''arène' +wood_league_wave_12_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_12_ranged: + name: '$normalLevel Arbalétrier de l''Arène' +wood_league_wave_13_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_13_ranged: + name: '$normalLevel Arbalétrier d''arène' +wood_league_wave_14_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_14_ranged: + name: '$normalLevel Arbalétrier d''arène' +wood_league_wave_15_miniboss: + name: '$bossLevel &4M. Oinkers' + onDamagedMessages: + - Oink!? +wood_league_wave_16_melee: + name: '$normalLevel Fan de monsieur Oinkers' +wood_league_wave_16_ranged: + name: '$normalLevel Fan de monsieur Oinkers' +wood_league_wave_17_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_17_ranged: + name: '$normalLevel Arbalétrier d''arène' +wood_league_wave_18_melee: + name: '$normalLevel &4Passionné de club d''escrime' +wood_league_wave_19_ranged: + name: '$normalLevel Passionné de club de tir à l''arc' +wood_league_wave_1_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_1_ranged: + name: '$normalLevel Arbalétrier de l''Arène' +wood_league_wave_20_boss: + name: '$bossLevel &2Zoltan' +wood_league_wave_21_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_21_ranged: + name: '$normalLevel Arbalétrier d''arène' +wood_league_wave_22_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_22_ranged: + name: '$normalLevel Arbalétrier de l''Arène' +wood_league_wave_23_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_23_ranged: + name: '$normalLevel Arbalétrier d''arène' +wood_league_wave_24_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_24_ranged: + name: '$normalLevel Arbalétrier de l''Arène' +wood_league_wave_25_miniboss: + name: '$minibossLevel &bAgdluak' +wood_league_wave_26_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_26_ranged: + name: '$normalLevel Arbalétrier d''arène' +wood_league_wave_27_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_27_ranged: + name: '$normalLevel Arbalétrier d''arène' +wood_league_wave_28_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_29_ranged: + name: '$normalLevel Arbalétrier d''arène' +wood_league_wave_2_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_2_ranged: + name: '$normalLevel Arbalétrier d''arène' +wood_league_wave_30_boss: + name: '$bossLevel &2Vipère du Sud' +wood_league_wave_31_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_31_ranged: + name: '$normalLevel Arbalétrier d''arène' +wood_league_wave_32_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_32_ranged: + name: '$normalLevel Arbalétrier d''arène' +wood_league_wave_33_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_33_ranged: + name: '$normalLevel Arbalétrier d''arène' +wood_league_wave_34_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_34_ranged: + name: '$normalLevel Arbalétrier d''arène' +wood_league_wave_35_miniboss: + name: '$minibossLevel &6Le Bouffon' +wood_league_wave_36_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_36_ranged: + name: '$normalLevel Arbalétrier de l''Arène' +wood_league_wave_37_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_37_ranged: + name: '$normalLevel Arbalétrier d''arène' +wood_league_wave_38_melee: + name: '$normalLevel &4Epéiste d''Arène' +wood_league_wave_39_ranged: + name: '$normalLevel Archer d''Arène' +wood_league_wave_3_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_3_ranged: + name: '$normalLevel Arbalétrier d''arène' +wood_league_wave_40_boss: + name: '$bossLevel &cCrucio le Porteur de Malédictions' +wood_league_wave_41_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_41_ranged: + name: '$normalLevel Arbalétrier d''arène' +wood_league_wave_42_healer: + name: '$normalLevel Soigneur d''Arène' +wood_league_wave_42_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_42_ranged: + name: '$normalLevel Arbalétrier d''arène' +wood_league_wave_43_healer: + name: '$normalLevel Soigneur d''Arène' +wood_league_wave_43_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_43_ranged: + name: '$normalLevel Arbalétrier d''arène' +wood_league_wave_44_healer: + name: '$normalLevel Soigneur d''Arène' +wood_league_wave_44_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_44_ranged: + name: '$normalLevel Arbalétrier d''arène' +wood_league_wave_45_miniboss: + name: '$minibossLevel &6Mille Lames' +wood_league_wave_46_healer: + name: '$normalLevel Soigneur d''Arène' +wood_league_wave_46_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_46_ranged: + name: '$normalLevel Arbalétrier d''arène' +wood_league_wave_47_healer: + name: '$normalLevel Soigneur d''Arène' +wood_league_wave_47_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_47_ranged: + name: '$normalLevel Arbalétrier d''arène' +wood_league_wave_48_healer: + name: '$normalLevel Soigneur d''Arène' +wood_league_wave_48_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_49_healer: + name: '$normalLevel Soigneur d''Arène' +wood_league_wave_49_ranged: + name: '$normalLevel Arbalétrier d''arène' +wood_league_wave_4_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_4_ranged: + name: '$normalLevel Arbalétrier d''arène' +wood_league_wave_50_boss: + name: '$bossLevel &6Uther le Champion' +wood_league_wave_50_boss_p2: + name: '$bossLevel &6Uther le Champion' +wood_league_wave_50_boss_p3: + name: '$bossLevel &6Uther le Champion' +wood_league_wave_50_reinforcement: + name: '$reinforcementLevel &6Uther Stan' +wood_league_wave_5_miniboss: + name: '$minibossLevel &cVache Bizarre' + onDamagedMessages: + - Ouaf ! +wood_league_wave_6_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_6_ranged: + name: '$normalLevel Arbalétrier d''arène' +wood_league_wave_7_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_7_ranged: + name: '$normalLevel Arbalétrier de l''Arène' +wood_league_wave_8_melee: + name: '$normalLevel &4Zombie d''Arène' +wood_league_wave_9_ranged: + name: '$normalLevel Arbalétrier de l''Arène' +yeti: + name: '$eventBossLevel &bYeti' + locationMessage: '&cYeti: à $distance blocs de distance !' + spawnMessage: '&cUne bête puissante est apparue !' + deathMessage: '&aLa bête n''est plus grâce à $players!.' + escapeMessage: '&4La bête s''est échappée !' +yezhi_baba: + name: '$eventBossLevel &cYezhi Baba' + locationMessage: '&cYezhi Baba : à $distance blocs de distance !' + spawnMessage: '&cUne méchante sorcière a émergé de sa demeure !' + deathMessage: '&a$players ! a mis la sorcière au repos, pour l''instant.' + escapeMessage: '&4ALa folle est partie!' +yezhi_baba_summon: + name: '$reinforcementLevel &4Yezhi Baba' +zombie_friends_friend: + name: '$reinforcementLevel &7Ami Zombie' +zombie_king: + name: '$eventBossLevel &4Roi des Zombies' + locationMessage: '&cRoi des Zombies : $distance blocs de distance !' + spawnMessage: '&cLe Roi des Zombies a été vu !' + deathMessage: '&aLe Roi des Zombies a été vaincu par $players!' + escapeMessage: '&4Le Roi des Zombies s''est échappé!' +zombie_parents_dad: + name: '$reinforcementLevel &7Papa Zombie' +zombie_parents_mom: + name: '$reinforcementLevel &7Maman Zombie' +back_teleporter: + name: Hermès + role: + greetings: + - Bienvenue au \nHub de Guilde des Aventuriers ! + dialog: + - Vous avez besoin de revenir en arrière ? + farewell: + - Bon voyage, mon ami. + noPreviousLocationMessage: '&8[EliteMobs] &cImpossible de vous renvoyer à votre emplacement précédent - aucun emplacement trouvé !' +barkeep: + name: Bartley + role: + greetings: + - Besoin d'un verre ? + - Vous voulez un verre + - Assoiffé? + - Salut, partenaire. + dialog: + - Goûtez une des spécialités de la maison. + - Vous ne trouverez ces boissons spéciales \nnulle part ailleurs. + - Une gorgée et vous \nreviendrez chez nous. + farewell: + - Revenez quand vous le souhaitez + - Cul sec ! + - Kampai! + - Salut! + - Brosd! + - Salud! + - À la vôtre ! + - Prost ! + - Santi! + - Salute ! + - Saúde! + - Santé ! + - 乾杯! +blacksmith: + name: Greg + role: + greetings: + - Bienvenue dans notre boutique ! + - Vendez votre marchandises ici ! + - Des produits frais, juste pour vous! + - Vous avez quelque chose à vendre ? + - Vous voulez acheter quelque chose ? + - Des produits frais chaque jour ! + dialog: + - Les monstres de haut niveau donnent des \nobjets d'une valeur plus élevée ! + - Les objets avec beaucoup \nd'enchantement valent plus cher ! + - Les monstres de haut niveau lâchent des \nobjets de meilleure qualité ! + - Les monstres de haut niveau ont des \nchances plus élevées de lâcher un butin ! + - + - + - Certains objets ont un \neffet spécial de potion! + - Certains objets ont des \neffets uniques ! + - L'enchantement du chasseur\nattire les monstres d'élites vers votre \nposition ! + - Les armes et armures spéciales \nlâchées par les monstres d'élite peuvent être \nvendues ici! + - Un rang de guilde plus élevé \naméliorera la qualité du \nbutin des créatures d'élite! + farewell: + - Merci de votre achat ! + - A bientôt ! + - Revenez à tout moment! + - Recommandez cette boutique\nà vos amis ! +combat_instructor: + name: Charles + role: + greetings: + - Vous voulez en savoir plus sur le combat ? + - Besoin d'une leçon de combat? + - Vous voulez en savoir plus sur le combat ? + - Prêt à combattre les monstres d'élite ? + dialog: + - Les objets autour de Elite Mobs\nmontrent les pouvoirs dont ils disposent. + - Plus le niveau des \nMonstre d'élite est élevé, \nplus ils peuvent avoir de pouvoirs + - Plus le niveau des \nMonstre d'élite est élevé, \nmeilleur sera le butin qu'ils peuvent lâcher + - Les Monstre d'élite de niveau supérieur\nont plus de chances de \nlâcher des objets spéciaux + - Les Monstres d'élite avec des \nflèches flottantes tirent des flèches sur les \njoueurs à proximité + - Mobs d'élite avec\nyeux flottants vous aveuglant\nquand ils vous touchent + - Les monstres d'élite avec des particules flottantes de\nsorts vous confusent\nquand ils vous touchent + - Les Monstres d'élite avec des \nsceau de lave flottants vous enflamment \nquand ils vous touchent + - |- + Mobs d'élite avec\nboules de feu flottantes tirent des boules de feu + sur les joueurs proches + - Les Monstres d'élite avec des \nblocs de glace flottants vous glacent \nquand ils vous touchent + - Les Monstres d'élite avec des \nelytres flottants vous font léviter \nquand ils vous touchent + - Les Monstres d'élite avec des \némeraudes flottantes vous empoisonnent \nquand ils vous touchent + - Les Monstres d'élite avec des \npistons flottants vous poussent \nquand ils vous touchent + - Les Monstres d'élite avec des \ntotem flottants vous affaiblissent \nquand ils vous touchent + - Les monstres d'élite avec des toiles\nflottantes vous bloquent\n lorsqu'ils vous touchent + - Les monstres d'élite avec des têtes\nflottantes vous flétrissent\nlorsqu'ils vous touchent + - Les Monstres d'élite avec des \ncoffres flottants lâchent du butin bonus \nquand vous les tuez + - Mobs d'élite avec des bottes d'or\nflottantes sont plus rapides + - Les Monstres d'élite avec des \njuke-boxes flottants vous provoquent \ndurant le combat + - Les mobs d'élite avec des vitres flottantes\nsont invisibles + - Les Monstres d'élite avec des \nflèches spectrales flottantes sont immunisés \naux flèches + - Les Monstres d'élite avec des \nplumes flottantes sont immunisés \naux dégâts de chute + - Les monstres d'élite avec\ndes flammes flottantes sont immunisées\nau feu + - Les monstres d'élite avec des enclume\nflottantes sont plus lourds que d'habitude\n + - Les Monstres d'élite avec des \nos flottants laissent leur \ncorps après leur mort + - Les Monstres d'élite avec des \nblocs de slime flottants sautent plus haut \nque d'habitude + - Les monstres d'élite avec des boules de slime\nflottantes créent un vide\nlorsqu'elles meurent + - Les monstres d'élite avec des laisses flottantes\nvous tirent\nlorsqu'ils vous touchent + - Les monstres d'élite avec des os\nflottants créent des piliers d'os\npendant le combat + - Les Monstres d'élite avec des \nflèches efnlammées flottantes traquent \nles flèches durant le combat + - Les Monstres d'élite avec des \nchampignons flottants deviennent géants \nquand ils sont touchés + - Les Monstres d'élite avec des \ncrânes flottants invoquent des renforts \nquand ils sont touchés + - Les monstres d'élite avec des livres\nflottants invoquent des renforcements\njusqu'à ce que vous ayez tué l'invocateur + - Les Monstres d'élite avec des \noeufs flottants invoquent des renforts \nquand ils sont touchés + - Les Monstres d'élite avec des \nfeux d'artifices flottants invoquent la Team Rocket \nquand ils sont touchés +enhancer_config: + name: Tim + role: + greetings: + - Vous voulez améliorer vos objets? + - Vous avez des orbes d'amélioration ? + - Récupère tes items améliorés ici ! + - Ahoy! + - Tu as des restes, gamin ? + dialog: + - Tes objets sont lamentables,\n améliore-les ici! + - Améliore tes items ici ! + - Tu as un orbe d'amélioration ? + - Cette épée est horrible,\n améliore-la ici ! + - Besoin d'une amélioration ? + farewell: + - Ne sois pas gêné ! + - Reviens quand tu auras plus d'orbes! + - Va obtenir plus d'orbes! +frost_queen_teleporter: + name: Ishard le Gelé + role: + greetings: + - '' +guide_0: + name: Dux + role: + greetings: + - Vous avez entendu parler de l’AG? + - Vous avez été à l'AG? + - Vous avez entendu parler de la guilde de l'Aventurier? + - Connaissez-vous la guilde de l'Aventurier? + dialog: + - Vous avez entendu parler de l’AG? + - Vous avez été à l'AG? + - Vous avez entendu parler de la guilde de l'Aventurier? + - Connaissez-vous la guilde de l'Aventurier? + farewell: + - Revenez quand vous le souhaitez + - Je serai là si vous avez besoin de moi! + - Je serais dans le coin! + - À plus tard! +guide_1: + name: Casus + role: + greetings: + - Besoin de conseils ? + - Besoin d'un indice + - Vous êtes perdu ? + - Besoin d'aide ? + dialog: + - Je sais tout sur\ncet endroit ! + - Vous voulez rencontrer les autres membres\nde la guilde d'aventurier? + - Vous avez besoin d'apprendre à vous déplacer\ndans cet endroit ? + farewell: + - Revenez quand vous le souhaitez + - Je serai là si vous avez besoin de moi! + - Je serais dans le coin! + - À plus tard! +guild_attendant: + name: Gillian + role: + greetings: + - Bienvenue à la \nGuilde des Aventuriers ! + - Bienvenue! + dialog: + - Consultez le tableau des quêtes pour\nvoir les quêtes actives ! + - Vous pouvez me parler pour\nchanger le rang de votre guilde ! + - Vous pouvez vendre des objets au\nforgeron contre des pièces de monnaie ! + - Vous pouvez parler au maître de l'arène\npour prendre l'arène ! + - Vous pouvez acheter de l'équipement chez\nle forgeron ! + - Vous pouvez parler au maître\nde combat pour vérifier votre niveau de combat ! + - Débloquer de nouveaux niveaux de guide\naugmente votre vie maximale ! + farewell: + - À bientôt! + - Merci de vous être arrêté! + - Bonne chasse! +primis_69ozcanofbepis: + name: '&a69OzCanOfBepis' + role: '&2Créateur de cartes (Graaaand Joueur)' + dialog: + - J'espère que vous appréciez la carte ! + farewell: + - Amuse-toi ! +primis_caeruleaum_fisherman: + name: '&3Piscis Nemesis' + role: '&b' + greetings: + - Hiya!. + dialog: + - Wouah! Il est presque tombé du bateau. + - Monstre de la mer Darn! + - Besoin de plus d'appâts. + farewell: + - Plus tard! + - Bonne chance! +primis_caeruleaum_fletcher: + name: '&6Ventus Artifex' + role: '&e' + greetings: + - Salutations. + dialog: + - J'étais un aventurier comme vous. + - Bienvenue, étranger + - Besoin de quelque chose? + - |- + Vous n'êtes pas d'ici, + n'est-ce pas? + farewell: + - À la revoyure ! + - A bientôt ! +primis_caeruleaum_forager: + name: '&5Venator Pabulatus' + role: '&d' + greetings: + - Bonjour, Etranger. + dialog: + - J'étais un aventurier comme vous. + - Bienvenue, étranger + - Besoin de quelque chose? + - |- + Vous n'êtes pas d'ici, + n'est-ce pas? + farewell: + - À la revoyure ! + - A bientôt ! +primis_caeruleaum_hint_giver: + name: '&fVir Loquax' + role: '&fSage homme' + greetings: + - Salut ! + - Bonjour ! + - C'est un plaisir de vous voir! + - Salutations! + dialog: + - + - + - + - + - Les ruines du sud-ouest sont un endroit si horrible !\n Qui s'y rendrait... + - + - + - J'ai entendu dire qu'un méchant\n loup s'était installé dans la tanière des loups ! + farewell: + - Au revoir ! + - À plus tard! + - Venez me rendre visite à nouveau! + - Adieu! +primis_caeruleaum_injured_fisherman: + name: '&3Callidus Piscatus' + role: '&b' + greetings: + - Bonjour, vagabond. + dialog: + - Vous avez pêché du bon poisson dernièrement ? + - Bienvenue, étranger + - Besoin de quelque chose? + - |- + Vous n'êtes pas d'ici, + n'est-ce pas? + farewell: + - À bientôt ! + - A bientôt ! +primis_caeruleaum_jeeves: + name: Jeeves + role: + greetings: + - Juste en voyage ! + dialog: + - Juste ici pour vendre\nà la boutique. + - Je suis occupé à négocier\nici. + - Pas maintenant,\nrevenez plus tard. + farewell: + - Uhuh... +primis_caeruleaum_leader: + name: '&4Chef Piscis' + role: '&c' + greetings: + - Bienvenue dans notre village ! + dialog: + - |- + Ne demande pas ce que ce village peut faire pour toi, + demande plutôt ce que tu peux faire pour ce village ! + - Bienvenue, étranger + - Besoin de quelque chose? + - |- + Vous n'êtes pas d'ici, + n'est-ce pas? + farewell: + - C'est parti! + - A bientôt ! +primis_caeruleaum_merchant: + name: Emptor + role: + greetings: + - Vous avez quelque chose à vendre ? + dialog: + - Des bandits ont volé mes marchandises ! + - Je n'ai rien à vendre, j'en ai peur. + - Je vais acheter tout ce que vous avez! + farewell: + - Voyages en toute sécurité ! +primis_captain: + name: '&4Capitaine Squalus' + role: '&c' + greetings: + - Alors tu es enfin réveillé ! + - C'était une course folle ! + - Toujours en vie ? + - Ne recommençons pas! + dialog: + - J'ai une tâche pour vous! + - J'ai besoin de votre aide! + - |- + Heureusement que tu es là, + nous avons besoin d'aide! + farewell: + - C'est parti! + - Ne m'oublie pas ! + - A bientôt ! +primis_deli'o: + name: '&eDéli''O' + role: '&6Créateur de carte (Gamer)' + dialog: + - J'espère que vous appréciez la carte ! + farewell: + - Amuse-toi ! +primis_farmstead_son: + name: '&4Filius' + role: '&c' + greetings: + - D'où viens-tu ? + - On dirait que vous avez parcouru un long chemin. + dialog: + - Les temps dangereux que nous vivons. + - Avez-vous vu mon père ? + - Sans phare, comment les bateaux navigueront-ils ? + farewell: + - Surveillez vos arrières! + - Marchez doucement! +primis_farmstead_wife: + name: '&4Amavit' + role: '&c' + greetings: + - Je ne vous ai pas vu auparavant ! + - Des nouvelles de Pontis Mille ? + dialog: + - Avez-vous vu mon mari ? + - J'ai besoin de votre aide! + - À quelle époque dangereuse nous vivons. + - Quelque chose ne va pas ! + farewell: + - Voyages en toute sécurité ! + - Merci ! +primis_first_mate: + name: '&cIracundi' + role: '&c' + greetings: + - Alors tu es enfin réveillé ! + - C'était une course folle ! + - Toujours en vie ? + - Ne recommençons pas! + dialog: + - J'ai une tâche pour vous! + - J'ai besoin de votre aide! + - |- + Heureusement que tu es là, + nous avons besoin d'aide! + farewell: + - C'est parti! + - Ne m'oublie pas ! + - A bientôt ! +primis_frostcone: + name: '&bCône givré' + role: '&9Créateur de carte (Gamer)' + dialog: + - J'espère que vous appréciez la carte ! + - C'est une pomme de pin recouverte de neige. + - Primis est déjà sorti? + farewell: + - Amuse-toi ! +primis_gladius_guard_1: + name: '&2Garde de la ville' + role: '&a' + greetings: + - Marchez doucement! + - Des renforts ? + - Maudits envahisseurs ! + - Surveillez vos arrières! + - Soyez prudent. +primis_gladius_guard_2: + name: '&2Garde de la ville' + role: '&a' + greetings: + - Marchez doucement! + - Des renforts ? + - Maudits envahisseurs ! + - Surveillez vos arrières! + - Soyez prudent. +primis_gladius_guard_3: + name: '&2Garde de la ville' + role: '&a' + greetings: + - Marchez doucement! + - Des renforts ? + - Maudits envahisseurs ! + - Surveillez vos arrières! + - Soyez prudent. +primis_gladius_guard_4: + name: '&2Garde de la ville' + role: '&a' + greetings: + - Marchez doucement! + - Des renforts ? + - Maudits envahisseurs ! + - Surveillez vos arrières! + - Soyez prudent. +primis_gladius_lord: + name: '&4Général Hasta' + role: '&c' + greetings: + - Êtes-vous ici pour aider? + - C'est une zone de guerre là-bas ! + dialog: + - Ils sont venus dans la nuit ! + - On ne les a jamais vus venir ! + - Où sont nos renforts ? + farewell: + - Surveillez vos arrières! + - Marchez doucement! +primis_gladius_quartermaster: + name: '&6Cibus' + role: '&c' + greetings: + - Êtes-vous ici pour aider? + - C'est une zone de guerre là-bas ! + dialog: + - Ils sont venus dans la nuit ! + - On ne les a jamais vus venir ! + - Où sont nos renforts ? + farewell: + - Surveillez vos arrières! + - Marchez doucement! +primis_gladius_strategist: + name: '&6Belli' + role: '&c' + greetings: + - Êtes-vous ici pour aider? + - C'est une zone de guerre là-bas ! + dialog: + - Ils sont venus dans la nuit ! + - On ne les a jamais vus venir ! + - Où sont nos renforts ? + farewell: + - Surveillez vos arrières! + - Marchez doucement! +primis_groves_nemus_leader: + name: '&3Roi Némian' + role: '&c' + dialog: + - Qu'est-ce qui vous amène sous la colline ? + - D'où êtes-vous ? + - |- + Avez-vous essayé notre + de délicieuses baies lumineuses? + farewell: + - Jusqu'à la prochaine fois. +primis_ice_village_fisherman_boat: + name: '&3Théopropide Néron' + role: '&3' + greetings: + - Jour du poisson! + dialog: + - Une journée glaciale pour la pêche. + - Ils ne mordent pas. + - Il faut juste être patient. + farewell: + - Ne tombez pas dans\nl'eau ! +primis_ice_village_friendly_villager: + name: '&3Luxuria Placidus' + role: '&3' + greetings: + - Bonjour ! + dialog: + - La vieillesse ne va pas\nme ralentir ! + - Être dans une bonne humeur\nest important. + - Nous espérons bientôt voir\nde la neige . + farewell: + - Au revoir! +primis_ice_village_generic_npc_1: + name: '&3Albertus Vitalis' + role: '&3' + greetings: + - Comment ça va. + dialog: + - Rien de tel qu'une bonne bière ! + farewell: + - Au revoir. +primis_ice_village_generic_npc_10: + name: '&3Trebatia Cornix' + role: '&3' + greetings: + - OK. + dialog: + - Ouais, j'ai compris. + - Je vois... + - Oh ! + farewell: + - Je vais essayer cela\nla prochaine fois. +primis_ice_village_generic_npc_11: + name: '&3Albatia Lateranus' + role: '&3' + greetings: + - Visite de Violette ? + dialog: + - Ne causez pas de problèmes. + farewell: + - Plus tard inconnu. +primis_ice_village_generic_npc_12: + name: '&3Hostilia Carantus' + role: '&3' + greetings: + - Salut. + dialog: + - Je ne faisais que\npartir. + farewell: + - Au revoir. +primis_ice_village_generic_npc_13: + name: '&3Vagennia Sejanus' + role: '&3' + greetings: + - Hiya. + dialog: + - Qu'est-ce qui vous amène\naux quais ? + farewell: + - À plus tard . +primis_ice_village_generic_npc_14: + name: '&3Dinia Vettonius' + role: '&3' + greetings: + - Salut.. + dialog: + - Un autre jour... + farewell: + - '...' +primis_ice_village_generic_npc_15: + name: '&3Sceledrus Marcallas' + role: '&3' + greetings: + - Bonjour.. + dialog: + - Un autre jour... + farewell: + - '...' +primis_ice_village_generic_npc_16: + name: '&3Fridericus Castinus' + role: '&3' + greetings: + - Bonjour.. + dialog: + - Un autre jour... + farewell: + - '...' +primis_ice_village_generic_npc_17: + name: '&3Cario Fimbria' + role: '&3' + greetings: + - Bonjour.. + dialog: + - Un autre jour... + farewell: + - '...' +primis_ice_village_generic_npc_18: + name: '&3Piscatores Laevinus' + role: '&3' + greetings: + - Bonjour.. + dialog: + - Un autre jour... + farewell: + - '...' +primis_ice_village_generic_npc_19: + name: '&3Monkerius Vitalis' + role: '&3' + greetings: + - Vous avez chassé ? + dialog: + - Il est temps d'aller chasser. + farewell: + - Adieu. +primis_ice_village_generic_npc_2: + name: '&3Luxuria Tyranus' + role: '&3' + greetings: + - Comment ça va. + dialog: + - Un de plus! + farewell: + - Au revoir. +primis_ice_village_generic_npc_3: + name: '&3Aurelio Nigidius' + role: '&3' + greetings: + - Salut. + dialog: + - Quelle vue! + farewell: + - Au revoir. +primis_ice_village_generic_npc_4: + name: '&3Lysidamus Paratus' + role: '&3' + greetings: + - Dehors pour une balade ? + dialog: + - Je ne pouvais pas imaginer\nvivre quelque part\nsans neige. + - Commence à avoir froid. + farewell: + - Jusqu'à plus tard. +primis_ice_village_generic_npc_5: + name: '&3Simo Proceus' + role: '&3' + greetings: + - Quelle vue! + dialog: + - J'adore l'escalade. + - Regardez tous les poissons ! + farewell: + - Oui. +primis_ice_village_generic_npc_6: + name: '&3Dordalus Marullinus' + role: '&3' + greetings: + - Bienvenue dans le pub! + dialog: + - Il est temps de réchauffer\nmes doigts. + - Confortable et chaud. + farewell: + - Ne laissez pas le froid de\nvous ravir. +primis_ice_village_generic_npc_7: + name: '&3Tranio Silvanus' + role: '&3' + greetings: + - Ici quelque part.. + dialog: + - Où est-il . + farewell: + - J'étais sûr de\nl'avoir laissé ici. +primis_ice_village_generic_npc_8: + name: '&3Milonia Trebellius' + role: '&3' + greetings: + - Bienvenue dans \nnotre village ! + dialog: + - Je suis sûr d'avoir faim. + - Allez, un peu\nde saumon. + farewell: + - Au revoir. +primis_ice_village_generic_npc_9: + name: '&3Barria Brocchus' + role: '&3' + greetings: + - As-tu entendu... + dialog: + - Gardez cela à l'esprit\nla prochaine fois que vous passerez\nvotre épée. + - Le bouclier peut être\nplus que de la défense. + farewell: + - Compris? +primis_ice_village_hunter: + name: '&3Alanus Isatis' + role: '&3' + greetings: + - Hey! + dialog: + - En espérant un bon jour\ndemain. + - Bien sûr, il y a beaucoup de Razorbacks\nen cette saison. + farewell: + - Je vous vois. +primis_ice_village_imprisoned_husband: + name: '&3Eleusium Calenus' + role: '&3' + greetings: + - '.....' + dialog: + - Un autre jour dans une cage... + farewell: + - '.....' +primis_ice_village_jail_caretaker: + name: '&3Philolaches Triferus' + role: '&3' + greetings: + - Salut toi. + dialog: + - Quoi d'autre a besoin de\nréparation. + - Je devrais vérifier\ndans les cages. + farewell: + - Plus tard. +primis_ice_village_jail_guard: + name: '&3Eleusium Festus' + role: '&3' + greetings: + - Vous avez escaladé \nla tour eh. + dialog: + - Tout semble en ordre. + - Presque tout... + farewell: + - Prenez soin de vous. +primis_ice_village_jail_master: + name: '&3Romanus Superbus' + role: '&3' + greetings: + - Enchanté. + dialog: + - Ne faites pas de crime si\nvous ne pouvez pas faire le temps de prison. + - Le crime ne paie pas. + farewell: + - Jusqu'à plus tard. +primis_ice_village_leader: + name: '&3Glacies Princeps' + role: '&3' + greetings: + - Hey. + dialog: + - Sacré élémentaire de glace ! + - Trop de problèmes... + - Comment sommes-nous censés\nterminer les essais maintenant. + farewell: + - Au revoir. +primis_ice_village_lighthouse_keeper: + name: '&3Severinus Martius' + role: '&3' + greetings: + - Enchanté inconnu. + dialog: + - Journée calme aujourd'hui. + - Méfiez-vous\nde l'Ursus ! + farewell: + - Vas-y doucement. +primis_ice_village_missing_daughter: + name: '&3Cornelia Ennodius' + role: '&3' + greetings: + - A l'aide... + dialog: + - Va-t'en, va-t'en,\nVA-T'EN ! + - Ils ne sont pas\nréels... + - Ne les regardez pas\nat Cornelia. + farewell: + - Au revoir. +primis_ice_village_prisoner: + name: '&3Adrius Calpornius' + role: '&3' + greetings: + - Je suis innocent! + dialog: + - Ce n'est pas là que\njje devrais être !!! + farewell: + - Fais-moi sortir d'ici! +primis_ice_village_pubkeeper: + name: '&3Grania Cecilius' + role: '&3' + greetings: + - Bienvenue! + dialog: + - Rejoignez-nous ! + - Essayez notre bière noire ! + - Besoin d'un verre ? + farewell: + - Une à venir! +primis_ice_village_tower_squatter: + name: '&3Modestus Eulogius' + role: '&3' + greetings: + - Le bruit ! + dialog: + - Tant de cris ! + - Juste en essayant de\nprofiter de la paix. + farewell: + - Au revoir. +primis_ice_village_violet: + name: '&5Violet Domina' + role: '&d' + greetings: + - Ai-je demandé à\nvotre avis ? + dialog: + - Je me sens assez bien\npour le sortir. + - Ils vont payer\npendant que je les ramasse. + farewell: + - Non, c'est ce que je pensais. +primis_ice_village_worried_father: + name: '&3Sparax Ennodius' + role: '&3' + greetings: + - J'espère qu'elle va bien... + dialog: + - Que notre fille soit\nen sécurité, s'il vous plaît. + farewell: + - Au revoir. +primis_ice_village_worried_mother: + name: '&3Sestia Ennodius' + role: '&3' + greetings: + - Où est-elle allée. + dialog: + - Hmm, on a perdu la piste. + farewell: + - Au revoir. +primis_ice_village_worried_wife: + name: '&3Titia Calenus' + role: '&3' + greetings: + - Hiya! + dialog: + - Des lits agréables et propres. + - Ai-je manqué quelque chose? + - Un autre coffre a été trié. + farewell: + - Au revoir! +primis_magmaguy: + name: '&4Magmaguy' + role: '&cDéveloppeur principal (Non-gamer)' + dialog: + - J'espère que vous appréciez la carte ! + farewell: + - Amuse-toi ! +primis_mountain_guide: + name: '&4Petrae' + role: '&c' + greetings: + - Bienvenue dans notre village ! + dialog: + - |- + Ne demande pas ce que ce village peut faire pour toi, + demande plutôt ce que tu peux faire pour ce village ! + - Bienvenue, étranger + - Besoin de quelque chose? + - |- + Vous n'êtes pas d'ici, + n'est-ce pas? + farewell: + - C'est parti! + - A bientôt ! +primis_mountain_guide_2: + name: '&4Petrae' + role: '&c' + greetings: + - Bienvenue dans notre village ! + dialog: + - |- + Ne demande pas ce que ce village peut faire pour toi, + demande plutôt ce que tu peux faire pour ce village ! + - Bienvenue, étranger + - Besoin de quelque chose? + - |- + Vous n'êtes pas d'ici, + n'est-ce pas? + farewell: + - C'est parti! + - A bientôt ! +primis_nemus_leader: + name: '&3Roi Némian' + role: '&c' + dialog: + - Qu'est-ce qui vous amène sous la colline ? + - D'où êtes-vous ? + - |- + Avez-vous essayé nos + délicieuses baies lumineuses? + farewell: + - Jusqu'à la prochaine fois. +primis_ogre_mines_escaped_miner: + name: '&cFugit Fossores' + role: '&c' + greetings: + - Je ne peux pas croire que je l'ai fait ! + - Ils sont partout ! + - Pourriez-vous prêter un coup de main? + dialog: + - J'ai une tâche pour vous! + - J'ai besoin de votre aide! + farewell: + - C'est parti! + - Soyez prudent là-dedans! + - Prenez soin de vous! +primis_ogre_mines_lone_miner: + name: '&cFortis Fossores' + role: '&c' + greetings: + - Enfin, un peu d'aide ! + - Ne les laissez pas vous voir! + - Aidez-moi! + dialog: + - J'ai une tâche pour vous! + - J'ai besoin de votre aide! + farewell: + - C'est parti! + - Retour à la mine pour moi ! + - Restez en sécurité ! +primis_ogre_mines_old_miner: + name: '&cVetus Fossores' + role: '&c' + greetings: + - Hé là ! + - Vous semblez un peu perdu! + - Qu'est-ce qui vous amène ici ? + dialog: + - J'ai une tâche pour vous! + - J'ai besoin de votre aide! + farewell: + - C'est parti! + - Ne laissez pas les mites de mine vous mordre ! + - Prenez soin de vous! +primis_ogre_mines_panicked_miner: + name: '&cMetus' + role: '&c' + greetings: + - La mine est dépassée! + dialog: + - Il y a des ogres partout! + - Pouvez-vous nous aider? + farewell: + - Soyez prudent! +primis_pontis_citizen_1: + name: '&7Agorastocles Gorgonius' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_citizen_10: + name: '&7Pardalisca Saunio' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_citizen_11: + name: '&7Sobersides Colias' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_citizen_12: + name: '&7Saturio Caepio' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_citizen_13: + name: '&7Chrysalus Trebonius' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_citizen_14: + name: '&7Toxilus Micon' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_citizen_15: + name: '&7Phronesium Viridio' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_citizen_16: + name: '&7Aurelio Zoilus' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_citizen_17: + name: '&7Diniarchus Nelius' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_citizen_18: + name: '&7Cleostrata Senopius' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_citizen_19: + name: '&7Georgius Sorio' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_citizen_2: + name: '&7Franciscus Crispian' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_citizen_20: + name: '&7Epidicus Silvanus' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_citizen_21: + name: '&7Pleusicles Marcellinus' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_citizen_22: + name: '&7Plesidippus Nerva' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_citizen_23: + name: '&7Plesidippus Megellus' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est un beau jour aujourd'hui. + farewell: + - À la revoyure ! + - Adieu! +primis_pontis_citizen_24: + name: '&7Fridericus Achaicus' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Adieu! +primis_pontis_citizen_25: + name: '&7Curculio Zosimus' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Adieu! +primis_pontis_citizen_26: + name: '&7Demipho Sylvius' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Adieu! +primis_pontis_citizen_27: + name: '&7Peniculus Nemesius' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Adieu! +primis_pontis_citizen_28: + name: '&7Tyndarus Faustinius' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Adieu! +primis_pontis_citizen_29: + name: '&7Sulpicio Panthera' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_citizen_3: + name: '&7Tycho Sellic' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_citizen_30: + name: '&7Melaenis Gelasius' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_citizen_31: + name: '&7Tyndarus Columbanus' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_citizen_32: + name: '&7Antamonides Cerinthus' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_citizen_33: + name: '&7Lesbonicus Momus' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_citizen_34: + name: '&7Fridericus Saloninus' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_citizen_35: + name: '&7Anterastilis Fabricius' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Adieu! +primis_pontis_citizen_36: + name: '&7Tyndarus Faustinius' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Adieu! +primis_pontis_citizen_37: + name: '&7Modestus Aper' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Adieu! +primis_pontis_citizen_38: + name: '&7Henricus Crassus' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Adieu! +primis_pontis_citizen_39: + name: '&7Franciscus Tancinus' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Adieu! +primis_pontis_citizen_4: + name: '&7Advocati Micon' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Adieu! +primis_pontis_citizen_40: + name: '&7Phygia Aurelius' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_citizen_5: + name: '&7Advocati Micon' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_citizen_6: + name: '&7Messenio Rectus' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_citizen_7: + name: '&7Hadrius Donicus' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_citizen_8: + name: '&7Sulpicio Sejanus' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_citizen_9: + name: '&7Stasimus Mutilus' + role: '&8Résident de Pontis' + dialog: + - Avez-vous été à l'observatoire? + - D'où avez-vous voyagé ? + - Tu n'as pas l'air d'être d'ici... + - C'est une belle journée aujourd'hui. + farewell: + - À la revoyure ! + - Au revoir! +primis_pontis_dockworker_1: + name: '&3Compagnon de Pontis' + role: '&8Employé du dock' + dialog: + - Beaucoup de fournitures à déménager! + - Fais attention! + - Passer au travers. + farewell: + - À plus tard! +primis_pontis_dockworker_10: + name: '&3Compagnon de Pontis' + role: '&8Docker' + dialog: + - Beaucoup de fournitures à déménager! + - Fais attention! + - Passer au travers. + farewell: + - À plus tard! +primis_pontis_dockworker_2: + name: '&3Compagnon de Pontis' + role: '&8Docker' + dialog: + - Beaucoup de fournitures à déménager! + - Fais attention! + - Passer au travers. + farewell: + - À plus tard! +primis_pontis_dockworker_3: + name: '&3Compagnon de Pontis' + role: '&8Docker' + dialog: + - Beaucoup de fournitures à déménager! + - Fais attention! + - Passer au travers. + farewell: + - À plus tard! +primis_pontis_dockworker_4: + name: '&3Compagnon de Pontis' + role: '&8Docker' + dialog: + - Beaucoup de fournitures à déménager! + - Fais attention! + - Passer au travers. + farewell: + - À plus tard! +primis_pontis_dockworker_5: + name: '&3Compagnon de Pontis' + role: '&8Docker' + dialog: + - Beaucoup de fournitures à déménager! + - Fais attention! + - Passer au travers. + farewell: + - À plus tard! +primis_pontis_dockworker_6: + name: '&3Compagnon de Pontis' + role: '&8Docker' + dialog: + - Beaucoup de fournitures à déménager! + - Fais attention! + - Passer au travers. + farewell: + - À plus tard! +primis_pontis_dockworker_7: + name: '&3Compagnon de Pontis' + role: '&8Docker' + dialog: + - Beaucoup de fournitures à déménager! + - Fais attention! + - Passer au travers. + farewell: + - À plus tard! +primis_pontis_dockworker_8: + name: '&3Compagnon de Pontis' + role: '&8Docker' + dialog: + - Beaucoup de fournitures à déménager! + - Fais attention! + - Passer au travers. + farewell: + - À plus tard! +primis_pontis_dockworker_9: + name: '&3Compagnon de Pontis' + role: '&8Docker' + dialog: + - Beaucoup de fournitures à déménager! + - Fais attention! + - Passer au travers. + farewell: + - À plus tard! +primis_pontis_enhancer: + name: '&7Meliorem' + role: '&8' + greetings: + - Besoin d'une amélioration ? + - Vous avez des restes? + - Améliorons ! + dialog: + - J'améliore pour des fragments ! + - Apportez-moi des fragments! + - Améliorez votre équipement contre des fragments! +primis_pontis_gardener_1: + name: '&eGorgines Asina' + role: '&8Jardinier' + dialog: + - Les fleurs ne sont-elles pas jolies ? + - Voici, mon chef-d'œuvre! + - Les fleurs s'épanouissent. + farewell: + - S'il vous plaît, ne marchez pas sur les belles fleurs. + - Prend soin de toi, mon garçon ! +primis_pontis_gardener_2: + name: '&ePiscatores Orissus' + role: '&8Jardinier' + dialog: + - Les fleurs ne sont-elles pas jolies ? + - Voici, mon chef-d'œuvre! + - Les fleurs s'épanouissent. + farewell: + - S'il vous plaît, ne marchez pas sur les belles fleurs. + - Prend soin de toi, mon garçon ! +primis_pontis_gardener_3: + name: '&eAlcesimus Abito' + role: '&8Jardinier' + dialog: + - Les fleurs ne sont-elles pas jolies ? + - Voici, mon chef-d'œuvre! + - Les fleurs s'épanouissent. + farewell: + - S'il vous plaît, ne marchez pas sur les belles fleurs. + - Prend soin de toi, mon garçon ! +primis_pontis_gardener_4: + name: '&ePyrgopolynices Perpenna' + role: '&8Jardinier' + dialog: + - Les fleurs ne sont-elles pas jolies ? + - Voici, mon chef-d'œuvre! + - Les fleurs s'épanouissent. + farewell: + - S'il vous plaît, ne marchez pas sur les belles fleurs. + - Prend soin de toi, mon garçon ! +primis_pontis_gardener_5: + name: '&eLemniselenis Gelasius' + role: '&8Jardinier' + dialog: + - Les fleurs ne sont-elles pas jolies ? + - Voici, mon chef-d'œuvre! + - Les fleurs s'épanouissent. + farewell: + - S'il vous plaît, ne marchez pas sur les belles fleurs. + - Prend soin de toi, mon garçon ! +primis_pontis_gardener_6: + name: '&eLysimachus Sulinus' + role: '&8Jardinier' + dialog: + - Les fleurs ne sont-elles pas jolies ? + - Voici, mon chef-d'œuvre! + - Les fleurs s'épanouissent. + farewell: + - S'il vous plaît, ne marchez pas sur les belles fleurs. + - Prend soin de toi, mon garçon ! +primis_pontis_gardener_7: + name: '&eStrobilus Farus' + role: '&8Jardinier' + dialog: + - Les fleurs ne sont-elles pas jolies ? + - Voici, mon chef-d'œuvre! + - Les fleurs s'épanouissent. + farewell: + - S'il vous plaît, ne marchez pas sur les belles fleurs. + - Prend soin de toi, mon garçon ! +primis_pontis_groves_catacombs_npc: + name: '&7Inaequaliter Hyaena' + role: '&7' + greetings: + - Psssst! + dialog: + - J'ai entendu dire qu'il y a un \ngrand trésor à obtenir! + - Quelque chose de merveilleux vous attend\nsi vous participez ! + - Vous devriez aventurer\nà cet endroit... + - Pourquoi ne pas y entrer? + - Vous devriez aller dedans... + - Ne vous inquiétez pas, c'est\ncomplètement sûr. + - Pas de danger. Je vous jure ! + - Jetez un coup d'œil. + - Vous devriez jeter un coup d'œil à\ncet endroit ! + - He he he he he... + - Que faire si quelqu'un\nà l'intérieur a besoin d'aide. + - Allez-y, allez ! + - Vous n'êtes pas curieux ? + - Vous devriez sûrement\njeter un coup d'œil. + farewell: + - He he he, plus tard! +primis_pontis_groves_generic_npc_1: + name: '&2Sycophanta Mucius' + role: '&2' + greetings: + - Je vais bien ! + dialog: + - Ne vous inquiétez pas pour moi. + - Mon frère viendra me sauver. + - Ils ne me mangeront pas. + - Je vous assure que je vais être très bien. + farewell: + - À plus tard! +primis_pontis_groves_generic_npc_10: + name: '&2Hostilia Metunus' + role: '&2' + greetings: + - Bonjour . + dialog: + - Vous vous ennuyez aussi? + - Il doit y avoir quelque chose à faire. + - Je devrais peut-être préparer plus de boissons. + farewell: + - À plus tard ! +primis_pontis_groves_generic_npc_11: + name: '&2Tortilia Getha' + role: '&2' + greetings: + - Salut. + dialog: + - Mon mari fait les meilleurs gâteaux. + - Vous voulez une tranche ? + - Tellement délicieux et humide! + farewell: + - Au revoir! +primis_pontis_groves_generic_npc_12: + name: '&2Consentia Apellinus' + role: '&2' + greetings: + - Ah, bonjour . + dialog: + - Là, comme neuf! + - Veillez à ce que la lumière les maintienne à l'écart. + - Une autre lanterne a été réparée... + farewell: + - Ne laissez pas les araignées mordre ! +primis_pontis_groves_generic_npc_13: + name: '&2Novia Senecius' + role: '&2' + greetings: + - Salut! + dialog: + - Oh, je ne m'attendais pas à voir quelqu'un ici. + - Il faut juste être rapide et ils ne peuvent pas vous avoir. + - Les araignées ne m'arrêtent pas. + - C'est mon lieu de repos préféré. + farewell: + - Prenez soin de vous. +primis_pontis_groves_generic_npc_14: + name: '&2Maximia Priscus' + role: '&2' + greetings: + - Shhhhh... + dialog: + - Vous avez pensé que vous pouviez\nme voler des elfes... + - Je vais récupérer mes\npossessions quand\nils dormiront. + - Faites-le ici en\nen parcourant le site. + - Ils ne m’ont jamais \nvu venir. + farewell: + - Gardez-le. +primis_pontis_groves_generic_npc_15: + name: '&2Herennia Exsupereus' + role: '&2' + greetings: + - Salut toi. + dialog: + - Réveillez-vous. + - Ca va être une bonne\n journée, je le sens. + farewell: + - Au revoir. +primis_pontis_groves_generic_npc_16: + name: '&2Atria Maursus' + role: '&2' + greetings: + - Salutations. + dialog: + - Je ne sais pas comment le roi\ns'attend à ce que je fasse\ntout ceci... + - Tant de travail.. + - Occupé, occupé, occupé. + - Cette papèterie\nne se fera pas toute seule. + farewell: + - Au revoir. +primis_pontis_groves_generic_npc_17: + name: '&2Felicius Esurpus' + role: '&2' + greetings: + - Salutations! + dialog: + - Si vous avez besoin de quelque chose\nparlez au roi. + - Désolé, je suis occupé. + - Pas de temps pour chit-chat,\nmes excuses. + farewell: + - Au revoir. +primis_pontis_groves_generic_npc_2: + name: '&2Sceledrus Fredisius' + role: '&2' + greetings: + - Coucou ! + dialog: + - Je pêche en fait pour les punaises. + - De grands punaises d'eau tombent des arbres. + - J'utilise de la sève d'arbre comme appât. + - Les punaises d'eau ne peuvent pas résister à l'appât ! + - Elles sont en fait amphibies. + - Il faut les attraper avant qu'elles ne se dirigent vers les arbres. + - Elles sont assez savoureuses si vous les rôtissez. + - En espérant une bonne prise ! + farewell: + - Plus tard. +primis_pontis_groves_generic_npc_3: + name: '&2Felicius Surius' + role: '&2' + greetings: + - Salut! + dialog: + - L'océan est si joli. + - Je pourrais rester ici pendant des jours. + - Les araignées sont bien ennuyeuses. + farewell: + - Au revoir. +primis_pontis_groves_generic_npc_4: + name: '&2Periplectomenus Burcanius' + role: '&2' + greetings: + - Bienvenue! + dialog: + - Beaucoup de baies brillantes restent. + - J'espère que vous aimez ma petite ferme. + - Tant de vins à déguster. + farewell: + - À plus tard. +primis_pontis_groves_generic_npc_5: + name: '&2Stephanus Magnus' + role: '&2' + greetings: + - Salut toi! + dialog: + - Avez-vous vu la ferme de baies ? + - Beau temps pour une promenade. + - Ne peut pas être à l'intérieur tout le temps. + farewell: + - Bonne journée. +primis_pontis_groves_generic_npc_6: + name: '&2Abundantius Rogatus' + role: '&2' + greetings: + - Coucou! + dialog: + - Qu'est-ce qui vous amène dans notre joli trou ? + - N'hésitez pas à rester un moment. + farewell: + - Au revoir. +primis_pontis_groves_generic_npc_7: + name: '&2Albanus Ivmarus' + role: '&2' + greetings: + - Facile... + dialog: + - Quoi? Oui, je me débrouille parfaitement. + - Je n'ai pas eu trop de choses, non. + - Encore une fois... + - Encore une pinte... + farewell: + - Au revoir. +primis_pontis_groves_generic_npc_8: + name: '&2Bacchis Aventinus' + role: '&2' + greetings: + - Bonjour ou soir... + dialog: + - Je suis si confortable en ce moment. + - Nous allions plus souvent à l'extérieur. + - Trop de dangers à l'extérieur de nos jours. + farewell: + - Soit béni. +primis_pontis_groves_generic_npc_9: + name: '&2Pasicompsa Getha' + role: '&2' + greetings: + - Venez, entrez ! + dialog: + - Bienvenue dans le meilleur trou du bosquet ! + - J'ai construit ce trou avec mes propres mains! + - Nous espérons que vous apprécierez votre séjour ! + farewell: + - Revenez vite ! +primis_pontis_groves_hole_luxuria: + name: '&cLuxuria Gorgonius' + role: '&c' + greetings: + - Salut! + - Bonjour ! + dialog: + - La vie consiste à la prendre facilement. + - Pourquoi stresser. + farewell: + - Rendez-nous visite à nouveau! +primis_pontis_groves_hole_phygia: + name: '&cPhygia Gorgonius' + role: '&c' + greetings: + - Bienvenue chez moi ! + - Bonjour ! + dialog: + - Nous devons agir! + - Trop d'elfes dans notre bosquet. + farewell: + - Rendez-nous visite à nouveau! +primis_pontis_groves_lighthouse_generic_npc_1: + name: '&3Eleusium Martius' + role: '&3' + greetings: + - Qu'est-ce qui t'amène ici ? + dialog: + - Assurez-vous que le phare\nfonctionne. + - Ravi de voir quelqu'un\nvenir visiter. + farewell: + - Au revoir. +primis_pontis_groves_lighthouse_generic_npc_2: + name: '&3Caelia Zoilus' + role: '&3' + greetings: + - Hey. + dialog: + - J'espère qu'il va\nêtre d'accord. + - Mon tour de veiller sur\nsur la lumière. + - Nous avons presque manqué\nde nourriture. + farewell: + - Au revoir. +primis_pontis_groves_lighthouse_sick_man: + name: '&3Alanus Secundas' + role: '&c' + dialog: + - Je ne me sens pas si bien + - J'espère que je me remettrai bientôt. + - Eh bien, je me sens un peu mieux. + - Nous avons besoin de plus de nourriture. + farewell: + - Au revoir. +primis_pontis_groves_parkour_npc_1: + name: '&3Posuere Hominem' + role: '&c' + dialog: + - Prêt à relever un défi? + - Vous pensez que vous avez obtenu ce qu'il faut ? + - Vous voulez bouger? + - Vous êtes un gars fou? + - Pas de tricherie! + farewell: + - À plus tard. +primis_pontis_groves_parkour_npc_2: + name: '&cIdoneitatem Hominem' + role: '&3' + dialog: + - C'était impressionnant! + - Essayez de battre mon record de 1m 47s. + - Pas de tricherie! + farewell: + - À plus tard. +primis_pontis_guard: + name: '&cGarde de Pontis' + role: '&8' + greetings: + - Vous voulez améliorer votre équipement ? + dialog: + - Perdu ? Suivez les couleurs du pont. + - Chaque pont a au moins une couleur ! + - Restez en dehors des ennuis ! + - Ne causez pas de problèmes! + - Pontis a été construit comme un labyrinthe pour la défense. + - Les plafonds du pont montrent la couleur de ce chemin! +primis_pontis_guard_1: + name: '&cGarde de Pontis' + role: '&8' + greetings: + - Vous voulez améliorer votre équipement ? + dialog: + - Perdu ? Suivez les couleurs du pont. + - Chaque pont a au moins une couleur ! + - Restez en dehors des ennuis ! + - Ne causez pas de problèmes! + - Pontis a été construit comme un labyrinthe pour la défense. + - Les plafonds du pont montrent la couleur de ce chemin! +primis_pontis_guard_2: + name: '&cGarde de Pontis' + role: '&8' + greetings: + - Bonjour ! + dialog: + - Ce chemin va vers le shogun! +primis_pontis_guard_rat: + name: '&cGarde d''Élite de Pontis' + role: '&8' + greetings: + - Putain de rats! + dialog: + - Des rats puants!!! + - Attendez,\nmon cher ! + - Arrêtez d'esquiver\nmes attaques ! + - J'en ai presque eu un! + - Crève! + - Pourquoi ne mourrez-vous pas !!! + - Vous ne pouvez pas esquiver\npour toujours! + - Prochaine attaque! + - Vous êtes mort ! + - Comment osez-vous\nesquiver ! + - Presque ! +primis_pontis_guard_rat_at_wormhole: + name: '&cGarde d''Élite de Pontis' + role: '&8' + greetings: + - Qu'est-ce qui prend\n si longtemps . + dialog: + - Nous avons ceci\nsous contrôle. + - Ne vous inquiétez pas,\nla garde d'élite\nest sur le cas! +primis_pontis_guard_shogun_1: + name: '&4Garde Royal' + role: '&8' + dialog: + - Ne vous mettez pas en difficulté. + - Ne faîtes pas attention, je maintiens la paix. + - Aucune affaire amusante ici. + - J'ai l'œil sur vous, aventurier. + - Pas de questions, et personne n'aura mal! + - Nous n'avons pas le temps de nous amuser. + farewell: + - Voyages sûrs, aventuriers. +primis_pontis_guard_shogun_1_cat_quest: + name: '&4Garde Royal' + role: '&8' + dialog: + - Évitez les problèmes. + - Ne faîtes pas attention, je maintiens la paix. + - Aucune affaire amusante ici. + - J'ai l'œil sur vous, aventurier. + - Pas de questions, et personne n'aura mal! + - Nous n'avons pas le temps de nous amuser. + farewell: + - Voyages sûrs, aventuriers. +primis_pontis_mille_arena_master_observatory: + name: Stella Hominis + role: + greetings: + - Bonjour ! + dialog: + - J'espère voir beaucoup d'étoiles. + - Ces corps célestes ! + - Le cosmos m'appelle. + - Possibilités infinies. + - La connaissance ancienne... + - J'ai des histoires à raconter. + - Si seulement vous saviez... + farewell: + - Que les étoiles vous bénissent. +primis_pontis_mille_concerned_shipmate: + name: '&3Delphium Calpurnius' + role: '&8' + dialog: + - Sigh. + - Voilà pour mes\nexpéditions... + farewell: + - Voyages en toute sécurité ! +primis_pontis_mille_fields_camp_generic_npc_1: + name: '&cScribonia Ingenvinus' + role: '&c' + dialog: + - L'arme\nla plus dangereuse est celle\nentre vos oreilles. + - Trois flèches\nsont tout ce dont j'ai besoin. + farewell: + - On se revoit tout à l'heure! +primis_pontis_mille_fields_camp_generic_npc_2: + name: '&cValador Lumus' + role: '&c' + dialog: + - J'ai chassé dans\nde nombreux endroits. + - Vous voyagez également\nbeaucoup ? + farewell: + - Puisse votre lame être rapide. +primis_pontis_mille_fields_camp_generic_npc_3: + name: '&cPhygia Ahala' + role: '&c' + dialog: + - Rien de tel qu'une\nbonne chasse ! + farewell: + - Prenez soin de vous. +primis_pontis_mille_fields_camp_generic_npc_4: + name: '&cAdrius Paterculus' + role: '&c' + dialog: + - La chasse appelle ! + farewell: + - Mort rapide. +primis_pontis_mille_fields_camp_generic_npc_5: + name: '&cCappadox Galerus' + role: '&c' + dialog: + - Rejoignez-nous, étranger ! + farewell: + - Plus tard. +primis_pontis_mille_fields_camp_generic_npc_6: + name: '&cSulpicio Rutilius' + role: '&c' + dialog: + - Espérons que notre camp\nvous offre un répit\nde la nature. + farewell: + - Au revoir. +primis_pontis_mille_fields_camp_generic_npc_7: + name: '&cAquarius Manus' + role: '&c' + dialog: + - Ne vous inquiétez pas pour moi je vais\njuste récupérer de l'eau. + - De l'eau cristalline aujourd'hui. + farewell: + - Au revoir. +primis_pontis_mille_fields_camp_magmus: + name: '&cMagmus Hypnos' + role: '&4' + dialog: + - Où se trouve Volumnia... + - J'espère qu'elle ne sera pas \n à nouveau dans les problèmes. + - J'ai besoin d'un bon repos. + - Si seulement il y avait plus \nd'heures dans la journée. + - Parlez-moi lorsque vous aurez \ntrouvé Volumnia. + - Tant de travail,\nsi peu de temps. + - Encore une journée de 17 heures. + - Je m'inquiète trop. + farewell: + - Pas assez de temps... +primis_pontis_mille_fields_farm_berry_npc: + name: '&9Dordalus Nasica' + role: '&e' + dialog: + - Les baies sont si savoureuses! + - Vous devriez manger\nplus de baies! + - Pourquoi\nvoleraient-ils mes baies ... + farewell: + - À plus tard. +primis_pontis_mille_fields_farm_boy_npc: + name: '&9Planesium Victricius' + role: '&e' + dialog: + - Tant de rats... + - Ouf presque\nfini ici. + - Cette chose est mieux conservée. + - Plus d'arrachages et\nje vais me briser. + - La vue d'ici\nest vraiment sympa. + - OK, retour au travail ! + farewell: + - Essayez nos baies ! +primis_pontis_mille_fields_farm_npc: + name: '&9Milonia Majus' + role: '&e' + dialog: + - Éloignez-vous, mes chers rats! + - Arrêtez de manger mes marchandises! + - Sigh... + farewell: + - Plus tard. +primis_pontis_mille_fields_farm_well_npc: + name: '&eVolumnia Zoilus' + role: '&c' + dialog: + - Attention à son crachât ! + - Sa salive est toxique. + - S'il te plaît, aide-moi ! + - J'espère que personne n'a entendu\nparler de ça... + - Je suis heureux de vous voir! + farewell: + - Comment pourrais-je le permettre. +primis_pontis_mille_fields_windmill_npc_1: + name: '&eDinia Niraemius' + role: '&d' + dialog: + - Beaucoup de blé à transformer ! + - Pas de farine pas de pain. + - Aimez-vous le pain aussi? + farewell: + - À bientôt. +primis_pontis_mille_fields_windmill_npc_2: + name: '&eDaemones Maritialis' + role: '&d' + dialog: + - C'est tellement beau ici! + - Aimez-vous mon moulin à vent ? + - Juste ici en pause. + farewell: + - À bientôt. +primis_pontis_mille_fields_windmill_npc_3: + name: '&eAdulescens Lupis' + role: '&d' + dialog: + - En espérant un bon vent ! + - Besoin de farine ? + - Celui-ci est le meilleur moulin à vent autour ! + farewell: + - Soit béni. +primis_pontis_mille_general_bromia: + name: '&6Bromia Curio' + role: '&6Général' + greetings: + - Salut ! + dialog: + - Il est temps pour la guerre! + farewell: + - Au revoir! +primis_pontis_mille_general_cylindrus: + name: '&eCylindrus Celatus' + role: '&eGénéral' + greetings: + - Salut ! + dialog: + - Il n'y a pas assez de temps! + farewell: + - Au revoir! +primis_pontis_mille_general_godefridus: + name: '&cGodefridus Novation' + role: '&c' + greetings: + - Salutations! + - Salut ! + dialog: + - Quelqu'un doit déposer\nces documents. + - Tant de bougies... + farewell: + - À bientôt +primis_pontis_mille_general_rogerius: + name: '&eRogerius Olennius' + role: '&eGénéral' + greetings: + - Salut ! + dialog: + - Tant de choses à faire! + - J'espère que ces 4 sont ok... + farewell: + - Au revoir! +primis_pontis_mille_lighthouse_man: + name: '&3Hegio Remus' + role: '&c' + dialog: + - Il est si beau ici. + - La meilleure vue... + farewell: + - Au revoir. + - Le soleil se couche! +primis_pontis_mille_major: + name: '&cFortes Bellator' + role: '&c' + greetings: + - Bonjour voyageur! + - Salut ! + dialog: + - Ces pauvres gobelins! + farewell: + - Au revoir! +primis_pontis_mille_mew_meowzer: + name: '&aMew Meowzer' + role: '&d' + dialog: + - Meooooww! + - Meow... + - Mreeeooooowww... + - Meowww. + - MEOW! + farewell: + - Prrrr meow! +primis_pontis_mille_observatory_arena_turn_in: + name: Virgo Dexippus + role: + greetings: + - Salut ! + dialog: + - Stella en sait beaucoup. + - Les étoiles ont tant à dire. + - La lumière dit tout. + farewell: + - Que la lune illumine votre chemin. +primis_pontis_mille_royal_guard_centurion: + name: '&4Centurion de la garde royale' + role: '&8' + dialog: + - Ne trainez pas! + - Mettez en place le camp ! + - Où sont nos renforts ? + - Combien sont tombés ? + - Nous devons nous réorganiser ! + farewell: + - Marchez légèrement et portez une grande épée. +primis_pontis_mille_scout_1: + name: '&cSyra Ursacius' + role: '&cÉclaireur blessé' + greetings: + - Salut ! + dialog: + - Je peux à peine tenir... + farewell: + - Au revoir! +primis_pontis_mille_scout_2: + name: '&cSparax Auxilius' + role: '&cÉclaireur blessé' + greetings: + - Salut ! + dialog: + - La douleur... + farewell: + - Au revoir! +primis_pontis_mille_scout_leader: + name: '&cBlepharo Octavius' + role: '&cChef Éclaireur' + greetings: + - Salut ! + dialog: + - C'était trop... + farewell: + - Au revoir! +primis_pontis_mille_shogun: + name: '&6Navita' + role: '&c' + greetings: + - Oui? + dialog: + - Comment puis-je vous aider ? + farewell: + - Marcher doucement et porter un gros canon. +primis_pontis_mille_slums_generic_npc_1: + name: '&7Gallicles Rex' + role: '&7' + dialog: + - Ce n'est pas grand chose, mais c'est notre\n petite partie de la ville + farewell: + - Plus tard. +primis_pontis_mille_slums_generic_npc_2: + name: '&7Gallicles Caelistis' + role: '&7' + dialog: + - Jour après jour... + farewell: + - '...' +primis_pontis_mille_slums_generic_npc_3: + name: '&7Nicodemus Frontinus' + role: '&7' + dialog: + - Eau fraîche pour\nla maison. + farewell: + - Le puits nous sert\nbien +primis_pontis_mille_slums_generic_npc_4: + name: '&7Cocus Lucio' + role: '&7' + dialog: + - J'espère que vous avez\nune grande journée. + farewell: + - Profitez bien de votre séjour. +primis_pontis_mille_slums_generic_npc_5: + name: '&7Cornelia Florius' + role: '&7' + dialog: + - Lequel devrais-je\nobtenir... + farewell: + - Tant de jolies \n fleurs. +primis_pontis_mille_slums_generic_npc_6: + name: '&7Rutilia Placidus' + role: '&7' + dialog: + - Je l'adore ici. + - L'odeur du foin\nme rend heureux. + - Mon endroit préféré pour\nse détendre après une dure journée. + farewell: + - À plus tard ! +primis_pontis_mille_slums_npc_1: + name: '&7Lena Lucan' + role: '&7' + dialog: + - Un seul morceau de pain... + farewell: + - Je me demande ce que demain apportera. +primis_pontis_mille_slums_npc_2: + name: '&7Tranio Florens' + role: '&7' + dialog: + - Faire bien aujourd'hui\nen fait. + farewell: + - La nuit vous sauve. +primis_pontis_mille_slums_npc_3: + name: '&7Rufia Tertulus' + role: '&7' + dialog: + - Au moins quelque chose de\nbon pour\nles enfants. + - Pas grand chose sur\nle marché... + - Je ne peux pas\nme le permettre. + farewell: + - Plus tard. +primis_pontis_mille_slums_npc_4: + name: '&7Fabia Praetextus' + role: '&7' + dialog: + - Fermer les yeux\npendant une seconde. + - J'imagine que je suis\ndans un meilleur endroit. + farewell: + - Au revoir. +primis_pontis_mille_slums_npc_5: + name: '&7Augustina Verrucosis' + role: '&7' + dialog: + - Tant de bouches\nà nourrir. + - Peut-être quelques fruits\npour les petits. + farewell: + - Au revoir. +primis_pontis_mines_guard_1: + name: '&cGarde Pontis' + role: '&c' + greetings: + - AIDE!!! + dialog: + - S'il vous plaît, tuez-les! + - J'ai tellement peur. +primis_pontis_mines_guard_2: + name: '&cGarde Pontis' + role: '&c' + greetings: + - QUELQU'UN S'IL VOUS PLAÎT!!! + dialog: + - Je ne veux pas mourir! + - Je ne peux plus tenir. +primis_pontis_mines_guard_3: + name: '&cGarde Pontis' + role: '&c' + greetings: + - SAUVEZ MOI!!! + dialog: + - Est-ce qu'ils sont partis? + - SORTEZ-MOI DE LÀ! +primis_pontis_outpost_officer: + name: '&4NOMME MOI' + role: '&8' + dialog: + - Je ne suis pas fini! + - Il est censé y avoir\nun avant-poste\nici. + farewell: + - Au revoir! +primis_pontis_redwoods_injured_lumberjack: + name: '&6Lyco Lupicinus' + role: '&6' + greetings: + - Yo! + dialog: + - Sacrée scie! + - Regardez-moi ... + farewell: + - À plus tard. +primis_pontis_redwoods_lumberjack: + name: '&6Ligna Crispian' + role: '&6' + greetings: + - Salutations! + dialog: + - J'aime l'apparence d'un arbre sain. + - L'arbre brun sent vraiment bon. + - |- + Je suis sûr d'avoir vu un loup sur deux jambes + ramper la nuit dans les alentours. + farewell: + - Jusqu'à la prochaine fois. +primis_pontis_redwoods_lumberjack_generic_1: + name: '&6Mulier Proculus' + role: '&6' + greetings: + - Hay Yo! + dialog: + - Je voudrais qu'ils nous laissent tranquilles. + - Journée parfaite pour l'élagage. + farewell: + - Pomme de pin, plus tard! +primis_pontis_redwoods_lumberjack_generic_10: + name: '&6Piscatores Trenico' + role: '&6' + greetings: + - Enchanté! + dialog: + - Partez les loups! + - Laissez-moi tranquille, boules de poils! + - Hah! Essayez de me rejoindre ici! + farewell: + - Bye Bye! +primis_pontis_redwoods_lumberjack_generic_2: + name: '&6Alanus Hermina' + role: '&6' + greetings: + - Salut... + dialog: + - Pas si fort, maintenez-le. + - Je prends une pause supplémentaire. + - Ne leur dites pas que je suis ici. + - Le bucheronnage est un travail ardu... + farewell: + - Plus tard +primis_pontis_redwoods_lumberjack_generic_3: + name: '&6Lena Triarius' + role: '&6' + greetings: + - Quoi de neuf! + dialog: + - Juste debout ici ! + - Le fonctionnement de la scie est plutôt amusant. + - Veillez à ne pas vous faire mal. + farewell: + - On se revoit tout à l'heure! +primis_pontis_redwoods_lumberjack_generic_4: + name: '&6Aquila Isatis' + role: '&6' + greetings: + - Comment ça va ! + dialog: + - Bon sang! + - Non, pas de cette façon! + - Flottez mieux !!! + - Oui, ça va le faire. + farewell: + - À plus tard ! +primis_pontis_redwoods_lumberjack_generic_5: + name: '&6Sulpicio Sidonius' + role: '&6' + greetings: + - Salut! + dialog: + - Rien de tel qu'un bon feu ! + - Il suffit de se détendre après une journée de travail honnête. + - Rejoignez-nous! + farewell: + - Au revoir, mon ami ! +primis_pontis_redwoods_lumberjack_generic_6: + name: '&6Strobilus Clemens' + role: '&6' + greetings: + - Salutations! + dialog: + - Couper comme un castor ! + - La hache la plus rapide de l'ouest. + - Aucun arbre ne correspond à moi ! + farewell: + - Vous le sentirez plus tard! +primis_pontis_redwoods_lumberjack_generic_7: + name: '&6Candidus Nigellus' + role: '&6' + greetings: + - Salutations! + dialog: + - Hache la plus rapide... mes fesses! + - Ne prenez pas ses promenades au sérieux. + - M. big-shot a certainement beaucoup à dire. + farewell: + - Au revoir ! +primis_pontis_redwoods_lumberjack_generic_8: + name: '&6Strobilus Clemens' + role: '&6' + greetings: + - Je suis un peu occupé! + dialog: + - Nous devons augmenter la production... + - Si nous augmentons les coûts... + - Besoin de commander plus d'haches. + farewell: + - Euh... +primis_pontis_redwoods_lumberjack_generic_9: + name: '&6Martinus Lepontus' + role: '&6' + greetings: + - Woah, bonjour ! + dialog: + - Vous êtes en train de tomber gros ! + - Je vais vous montrer ! + - Ma hache, votre écorce, ils devraient se rencontrer. + - Commencez par un bon coup. + farewell: + - Je me suis effrayé... +primis_pontis_redwoods_lumberlord: + name: '&6Magnus Castorea' + role: '&6' + greetings: + - BONJOUR! + dialog: + - Rien de tel qu'un bois sain. + - |- + Pour chaque arbre que nous coupons, + nous en plantons un nouveau ! + - Gros troncs brun, oui. + farewell: + - AU REVOIR! +primis_pontis_redwoods_reyn: + name: '&6Reynus Protectoris' + role: '&6' + greetings: + - Je fais monter la température! + - Hiya! + dialog: + - Êtes-vous dans les troncs ? + - J'aime l'odeur du bois! + farewell: + - À plus tard. + - Au revoir! +primis_pontis_scrapper: + name: '&7Fragmentum' + role: '&8' + greetings: + - Vous avez quelque chose à fragmenter ? + - Des déchets? + - Besoin de rebuts ? + dialog: + - Je recyclerai tout ce que vous apporterez! + - Besoin de fragments? + - Vous voulez des fragments? +primis_pontis_smelter: + name: '&7Orbis' + role: '&8' + greetings: + - Vous voulez améliorer votre équipement ? + dialog: + - Vous avez besoin d'améliorer les orbes? + - Je vais faire des orbes améliorés pour des fragments! + - Apportez-moi des fragments! +primis_sewer_donatello: + name: '&5Donatello' + role: '&dDéfenseur des égouts' + dialog: + - Quoi de neuf? + - Comment avez-vous réussi à nous trouver ici? + - Méfiez-vous du Déchiqueteur ! + farewell: + - À plus tard! +primis_sewer_leonardo: + name: '&1Leonardo' + role: '&9Défenseur des égouts' + dialog: + - Quoi de neuf? + - Comment avez-vous réussi à nous trouver ici? + - Méfiez-vous du Déchiqueteur ! + farewell: + - À plus tard! +primis_sewer_michelangelo: + name: '&6Michelangelo' + role: '&eDéfenseur des égouts' + dialog: + - Quoi de neuf? + - Comment avez-vous réussi à nous trouver ici? + - Méfiez-vous du Déchiqueteur ! + farewell: + - À plus tard! +primis_sewer_raphael: + name: '&4Raphael' + role: '&cDéfenseur des égouts' + dialog: + - Quoi de neuf? + - Comment avez-vous réussi à nous trouver ici? + - Méfiez-vous du Déchiqueteur ! + farewell: + - À plus tard! +primis_spa_attendee_1: + name: '&fNatsumi' + role: '&7' + dialog: + - Aimez-vous la source thermale ? + - Asseyez-vous et détendez-vous ! + - Nya! + - uwu... + - OwO + farewell: + - Amuse-toi ! +primis_spa_attendee_2: + name: '&5Hanako' + role: '&7' + dialog: + - Aimez-vous la source thermale ? + - Asseyez-vous et détendez-vous ! + - Nya! + - uwu... + - OwO + farewell: + - Amuse-toi ! +primis_spa_attendee_3: + name: '&3Tamika' + role: '&7' + dialog: + - Aimez-vous la source thermale ? + - Asseyez-vous et détendez-vous ! + - Nya! + - uwu... + - OwO + farewell: + - Amuse-toi ! +primis_spa_attendee_4: + name: '&9Zaphra' + role: '&7' + dialog: + - Aimez-vous la source thermale ? + - Asseyez-vous et détendez-vous ! + - Nya! + - uwu... + - OwO + farewell: + - Amuse-toi ! +primis_spa_attendee_5: + name: '&4Chie' + role: '&7' + dialog: + - Aimez-vous la source thermale ? + - Asseyez-vous et détendez-vous ! + - Nya! + - uwu... + - OwO + farewell: + - Amuse-toi ! +primis_spa_attendee_6: + name: '&fKatashi' + role: '&7' + dialog: + - Aimez-vous la source thermale ? + - Asseyez-vous et détendez-vous ! + - Nya! + - uwu... + - OwO + farewell: + - Amuse-toi ! +primis_spa_attendee_7: + name: '&dAkihiko' + role: '&7' + dialog: + - Aimez-vous la source thermale ? + - Asseyez-vous et détendez-vous ! + - Nya! + - uwu... + - OwO + farewell: + - Amuse-toi ! +primis_spa_attendee_8: + name: '&6Sheranee' + role: '&7' + dialog: + - Aimez-vous la source thermale ? + - Asseyez-vous et détendez-vous ! + - Nya! + - Rawr... + - OwO + farewell: + - Amuse-toi ! +primis_spa_staff: + name: '&cAozora' + role: '&7' + dialog: + - Profitez de la source thermale ! + - Nya! + - uwu... + - OwO + farewell: + - Amuse-toi ! +primis_spa_staff_2: + name: '&6Rei' + role: '&7' + dialog: + - Profitez de la source thermale ! + - Nya! + - uwu... + - OwO + farewell: + - Amuse-toi ! +primis_terravilla_annoyed_explorer: + name: '&6Dorippa Sarimarcus' + role: '&6' + greetings: + - Comment ça va . + dialog: + - Pas encore . + - Bloqué une fois de plus. + farewell: + - Je vous vois. +primis_terravilla_explorer: + name: '&6Telestis Senna' + role: '&6' + greetings: + - Comment ça va. + dialog: + - Toujours si\noccupé. + - Besoin d'un sac ? + farewell: + - Au revoir. +primis_terravilla_generic_npc_1: + name: '&6Stephanium Major' + role: '&6' + greetings: + - Bienvenue à Terravilla ! + dialog: + - Faites attention à la\nTerreur à Deux Jambes ! + - Vous êtes ici pour découvrir les ruines ? + farewell: + - Au revoir. +primis_terravilla_generic_npc_10: + name: '&6Mallia Galvisius' + role: '&6' + greetings: + - Yo! + dialog: + - Je préférerais être \ndans les ruines... + - Observer le houblon \npasse le temps. + farewell: + - Plus tard. +primis_terravilla_generic_npc_11: + name: '&6Papiria Virginius' + role: '&6' + greetings: + - Ok alors... + dialog: + - Frappez plus fort! + - Ha ! Elle est bien bonne ! + - Ouais! Détruits le! + farewell: + - Oui... +primis_terravilla_generic_npc_12: + name: '&6Umbria Maccalus' + role: '&6' + greetings: + - Quoi! + dialog: + - Une fille n'est-elle pas autorisée à\nêtre\nsur un toit. + - Il suffit d'essayer\nde me faire descendre ! + farewell: + - Ouais, quoi... +primis_terravilla_generic_npc_2: + name: '&6Delphium Assanius' + role: '&6' + greetings: + - Laissez-moi tranquille! + dialog: + - Qu'est-ce que \ntu regarde. + farewell: + - Scram! +primis_terravilla_generic_npc_3: + name: '&6Stephanium Vopiscus' + role: '&6' + greetings: + - Laissez-moi tranquille! + dialog: + - Qu'est-ce que \ntu regarde. + farewell: + - Scram! +primis_terravilla_generic_npc_4: + name: '&6Simo Clericus' + role: '&6' + greetings: + - Hey! + dialog: + - Il a été dit que le porc était sur\nde nouveau sur l'ascenseur. + farewell: + - Au revoir. +primis_terravilla_generic_npc_5: + name: '&6Harpax Colias' + role: '&6' + greetings: + - Bonjour. + dialog: + - La ch...je veux dire que la Surveillante\nest à l'étage supérieur. + farewell: + - Plus tard. +primis_terravilla_generic_npc_6: + name: '&6Sulpicio Epolonius' + role: '&6' + greetings: + - Salut. + dialog: + - J'espère que les ruines\ns'ouvriront bientôt de nouveau. + - La chasse à l'artefact\nme manque. + farewell: + - Au revoir. +primis_terravilla_generic_npc_7: + name: '&6Baebia Lucan' + role: '&6' + greetings: + - '...' + dialog: + - Frisson... + farewell: + - '...' +primis_terravilla_generic_npc_8: + name: '&6Novia Longinus' + role: '&6' + greetings: + - '...' + dialog: + - Êtes-vous toujours\nen train de regarder les gens ? + - Que pensez-vous de la \nvie privée ? + farewell: + - '...' +primis_terravilla_generic_npc_9: + name: '&6Septimia Baro' + role: '&6' + greetings: + - Oh, hey. + dialog: + - Si cela s'ouvre à nouveau\nalors je dois aller\nen obtenir plus. + - Quel est ce crâne\nhmm... + farewell: + - '...' +primis_terravilla_overseer: + name: '&6Lutum Princeps' + role: '&6' + greetings: + - Oui? + dialog: + - Qu'est-ce que c'est\nmaintenant... + - Je dois vérifier\nsur eux. + - Au moins je\nne m'ennuie pas. + farewell: + - Bonne chance. +primis_terravilla_researcher: + name: '&6Plautia Suilius' + role: '&6' + greetings: + - Hmm... + dialog: + - Peut-être si... + - Cela ne peut pas être correct + - Pas sûr... + farewell: + - Plus tard... +primis_traveler_1: + name: '&6Lysidamus Nolus' + role: '&6' + greetings: + - Bonjour, Etranger! + dialog: + - De retour du village. + - Vous vous rendez au village? + - Bonne chance pour\nvos voyages. + farewell: + - Les routes vous bénissent. +primis_traveler_2: + name: '&6Citro Gala' + role: '&6' + greetings: + - Salut ! + dialog: + - De retour \ndu village. + - Vous venez de Pontis Mille ou ? + - Bonne chance! + farewell: + - Les routes vous bénissent. +primis_traveler_3: + name: '&6Bromia Culleolus' + role: '&6' + greetings: + - Bonjour ! + dialog: + - Vous allez aussi\nau village ? + - J'ai entendu dire qu'il faisait\nfroid dans\nle village. + - Ouf ! Presque !\nJe dois continuer. + farewell: + - Les routes vous bénissent. +primis_traveler_4: + name: '&6Demenis Nolus' + role: '&6' + greetings: + - Bonjour, Etranger! + dialog: + - Il est bon de voir quelqu'un\nsur la route. + - Le village est presque atteint. + - Ouf ! + farewell: + - Les routes vous bénissent. +primis_traveler_5: + name: '&6Callipho Classicius' + role: '&6' + greetings: + - Coucou ! + dialog: + - J'ai besoin de meilleures chaussures. + - Bientôt, je serai\nà la maison. + - C'est bon de revoir \nles champs! + farewell: + - Voyages en toute sécurité ! +primis_traveler_6: + name: '&6Rodenus Palis' + role: '&6' + greetings: + - Salut! + dialog: + - De retour \ndu village. + - C''est bon de revoir\nPontis Mille à nouveau. + - Mon frère est-il à nouveau perdu... + - Où est-il ? + farewell: + - Plus tard! +primis_traveler_7: + name: '&6Gorenus Palis' + role: '&6' + greetings: + - Hey... + dialog: + - Suis-je encore perdu? + - Ce n'est pas Pontis Mille. + - Où suis-je? + - Euh, cela ne\nressemble pas\n au bon chemin... + farewell: + - Au revoir. +quest_giver: + name: Qel'Thuzad + role: + greetings: + - Salutations, aventurier !\nVous voulez une quête ? + - Vous! J'ai une quête! + - Vous vous sentez... aventureux? + dialog: + - Complétez les quêtes de guilde\npour obtenir des récompenses cool! + - Les quêtes de plus haut niveau ont\nde meilleures récompenses! + - Les quêtes de niveau supérieur \nvous font chasser des monstres de niveau supérieur! + - Vous voulez un défi plus difficile?\nAugmentez votre rang de guilde! + - Assurez-vous que vous êtes bien équipé\npour ces quêtes ! + farewell: + - Bon voyage, mon ami. + - Bonne chasse! + - Vivre longtemps et prospérer! + - Revenez avec votre bouclier,\n ou dessus. + - La vie avant la mort ! + - Force avant la faiblesse ! + - Voyage avant destination! +refiner_config: + name: Ralph + role: + greetings: + - Vous voulez vous débarrasser de votre ferraille? + - Vous avez des restes? + - Je cherche des restes de bas niveau ! + - Salutations, tu as des restes? + - Je vais recycler tes restes! + dialog: + - Besoin d'une amélioration pour tes restes? + - Améliore tes restes ici ! + - Améliorez 10 restes à un niveau supérieur ! + - Rendez vos restes plus utile ! + - Vous avez des restes de bas niveau ? + farewell: + - Reviens quand tu auras\nplus de restes de bas niveau + - N'oubliez pas de rendre ce\nreste utile! + - Allez dans un reste! +repairman_config: + name: Reggie + role: + greetings: + - Réparez vos items! + - Réparation d'items contre des restes! + - Transformez cette ferraille en durabilité ! + - Besoin d'une réparation ? + - Vous avez des items endommagés ? + dialog: + - Meilleures réparations de cette ville! + - Je me charge de tes réparations! + - Besoin d'une réparation ? + - Je vais réparer vos items! + - Besoin de réparer des items d'élite ? + farewell: + - N'oubliez pas de l'entretenir! + - Je serai là si vous avez besoin de moi! + - Appelle-moi, bippe-moi si tu veux me rejoindre, \nsi vous ne voulez pas ce n'est pas grave +santa: + name: '&4Saint Nick' + role: '&c' + greetings: + - Ho ho ho! + dialog: + - J'ai perdu des cadeaux, \npouvez-vous m'aider ? + - Cher voyageur, j'ai\nune demande pour vous! + - Pouvez-vous aider un vieil homme\nqui a besoin d'aide? + farewell: + - Ho ho ho! +scrapper_config: + name: Kelly + role: + greetings: + - Vous voulez vous débarrasser d'items ? + - Besoin de recycler des items ? + - Vous cherchez des restes? + - C'est l'heure des restes! + - C'est le temps des restes ! + dialog: + - Des offres incroyables ! + - Obtenez vos restes ici ! + - 75% de chances de fonctionner ! + - Il n'y a pas de remboursement. + - Recycler, réutiliser, réduire! + farewell: + - Revenez quand vous aurez\nplus de restes + - N'oubliez pas de rendre ce\nreste utile! + - Joyeux restes ! +smelter: + name: Sam + role: + greetings: + - Vous avez des restes? + - Vous avez des restes supplémentaires? + - Je sens des restes sur vous !? + - Je vous en supplie, j'ai besoin de restes! + - Donnez-moi des restes! + dialog: + - Je rendrai vos restes utiles! + - Donne-moi des restes et je te\ndonnerai des orbes d'amélioration! + - Les restes sont inutiles, donnez-les moi ! + farewell: + - Revenez quand vous aurez\nplus de restes + - En route chez l'améliorateur, allez! +special_blacksmith: + name: Grog + role: + greetings: + - Besoin de quelque chose? + - Vous avez quelque chose de bon ? + - Nous n'avons rien d'autre que le meilleur + - Vous avez quelque chose à vendre ? + - Nous n'achetons que de l'équipement de mob d'élite. + dialog: + - Nous achetons bas et vendons haut. + - Pas de remboursements. + - Absolument aucun remboursement. + - Il n'y a pas de remboursement. + - Aucun remboursement. + - Les achats de la boutique sont finaux. + farewell: + - Revenez quand vous aurez\nplus à dépenser + - Ne vous faites pas tuer,\nnous voulons que vous nous apportiez\nplus d'équipement. + - La prochaine fois achetez quelquechose \nplus cher. + - N'oubliez pas, aucun remboursement. +test_npc: + name: Test PNJ + role: Testing! + greetings: + - Test Greeting! + dialog: + - Test Dialog! + farewell: + - Test Farewell! +travelling_merchant: + name: Jeeves + role: + greetings: + - Vous avez quelque chose à vendre ? + - Vous m'avez appelé ? + - Hein ? + dialog: + - Je vais l'acheter à bas prix! + - Vous avez quelque chose pour moi ? + - Le temps, c'est de l'argent! + farewell: + - Rappelez-moi à tout moment ! + - Ce sera tout ? + - Voyages en toute sécurité ! + - Ne vous faites pas tuer! + - Bonne chasse! +unbinder: + name: Ulfric + role: + greetings: + - Salutations. + - Enchanté. + - Salut, l'ami. + - Oui? + - Je peux vous aider ? + dialog: + - Je vais délier vos items\npour un parchemin extrêmement rare. + - Je suis le seul qualifié\npour délier vos biens. + - Avez-vous un parchemin de déliement ? + farewell: + - "Rappelez-vous : Utilise un parchemin\nde déliement judicieusement." + - Bon voyage, mon ami. +wood_league_arena_master: + name: Gladius + role: + greetings: + - Bienvenue dans \nl’Arène ! + dialog: + - Vous vous êtes préparé à affronter l'arène? + farewell: + - Revenez avec votre bouclier, ou dessus! +wood_league: + arenaName: Ligue de bois + arenaMessages: + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - wave=8:message=&8[Gladius] &fPas mal, mais que se passe-t-il si on t'envoie une horde de monstres ? + - wave=9:message=&8[Gladius] &fBien bien, et maintenant voyons voir ce que tu peux faire s'ils restent à distance? + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - wave=44:message=&8[Gladius] &fCa ne marche clairement pas, laissez moi réfléchir une minute... + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +ag_welcome_quest_0: + customObjectives: + Objective1: + dialog: + - '&8[&aCasus&8]&f Bienvenue dans le Hub de Guilde des Aventuriers, le hub pour tout ce qui concerne EliteMobs!' + - Vous pouvez toujours revenir ici en utilisant &2/ag&f! + - Parlez-moi à nouveau pour une quête! + name: '&2Trouver l''AG!' + questLore: + - + - + questAcceptDialog: + - '&8[Odigos]&f Très bien, assurez-vous d''utiliser &2/ag &f ou &2/aventurersguild&f pour vous rendre au Hub de Guilde de l''Aventurier !' + - Assurez-vous de parler à Casus quand vous êtes là! +ag_welcome_quest_1: + customObjectives: + Objective3: + dialog: + - '&8[&aGreg&8]&f Vous voulez acheter ou vendre quelque chose ? J''ai un peu de tout !' + Objective4: + dialog: + - '&8[&aCharles&8]&f Vous voulez en savoir plus sur le combat d''élites ? Parlez-moi !' + Objective1: + dialog: + - '&8[&aHermes&8]&f Je vous ramène à l''endroit où vous étiez auparavant ! Parlez-moi à nouveau !' + Objective2: + dialog: + - '&8[&aBartley&8]&f Besoin d''une boisson raide ? Mes boissons contiennent un punch supplémentaire !' + Objective7: + dialog: + - '&8[&aQel''Thuzad&8]&f Ces monstres élites, d’où viennent-ils ?' + - + - + - Parlez-moi pour en obtenir une! + Objective12: + dialog: + - '&8[&aGrog&8]&f Vous voulez acheter des objets spéciaux ? J''ai ce qu''il faut !' + Objective8: + dialog: + - '&8[&aRalph&8]&f Tirez plus de vos fragments en les améliorant ! Parlez-moi à tout moment.' + Objective13: + dialog: + - '&8[&aUlfric&8]&f Si vous m''apportez un objet très spécial et rare, je peux délier vos objets Élite.' + - + - + Objective5: + dialog: + - '&8[&aTim&8]&f Vous voulez améliorer vos objets d''élite ? Il vous suffit d''obtenir un orbe d''amélioration auprès de Sam là-bas !' + Objective10: + dialog: + - '&8[&aKelly&8]&f Vous avez des objets d''élite supplémentaires? Vous ne savez pas quoi faire avec eux? Donnez-les moi, et je les transformerai en fragments!' + - + - + Objective6: + dialog: + - '&8[&aGillian&8]&f Vous cherchez de la puissance ? Souhaitez-vous atteindre de nouveaux sommets ? Parlez-moi pour débloquer de nouveaux rangs de guilde, et atteindre des niveaux de puissance que vous n''auriez jamais pensé être possible!' + Objective11: + dialog: + - '&8[&aSam&8]&f Vous avez des fragments en trop ? Je peux les affiner en améliorant les orbes que vous pouvez donner à Tim pour améliorer vos objets d''élite avec !' + Objective9: + dialog: + - '&8[&aReggie&8]&f Besoin de vos objets Élite réparés ? Apportez-moi juste des fragments, et je les rendrai comme neuf !' + - + - + name: '&2Bienvenue dans l''AG!' + questLore: + - '&aRencontrez les PNJ de la Guilde de l''Aventurier !' +primis_caeruleaum_a_can_of_worms: + customObjectives: + Objective1: + dialog: + - '&a[Chef Piscis] &fS''il vous plaît dites-moi que vous êtes celui qui apporte l''appât.' + name: '&2Une boîte de vers' + questLore: + - Ici, prenez l'appât et allez-y. + - Dépêchez-vous, s'il vous plaît! + questAcceptDialog: + - '&a[Callidus Piscatus]&f Mon ami est dans un bateau près des quais!' + - '&7&oJe devrais me dépêcher vers le bateau.' + questCompleteMessage: + - '&a[Piscis Nemesis]&f Vous avez apporté l''appât? Parfait!' + - L'appât devrait l'attirer ! + - '&7&oJe devrais parler avec Nemesis.' +primis_caeruleaum_fishing: + name: '&2Appât à poisson' + questLore: + - Nous avons un gros problème ! + - + - + - + - + - mais il ne peut rien faire sans le bon appât ! + - Je vais vous dire où obtenir &el'Appât de poisson &f, s'il vous plaît aidez mon ami! + - Je vous promets que je vous récompenserai ! + questAcceptDialog: + - '&a[Callidus Piscatus]&f Le temps presse ! Il y a un tas de &cGros Vers&f à droite quand vous quittez le village !' + - Prenez en 5 et revenez ici et je les préparerai à l’utilisation. + - '&7&oJe devrais aller chercher des appâts à poisson.' + questCompleteMessage: + - '&a[Callidus Piscatus]&f Vous avez apporté un appât? Parfait!' + - Je vais le préparer tout de suite! + - '&7&oJe devrais encore parler à &aCallidus &7&o et récupérer l''appât préparé.' +primis_caeruleaum_fishing_2: + name: '&2Appât de monstre' + questLore: + - Cela a fait l'affaire ! Sautez dans le trou de ver, je tiendrai le bateau ! + - Montrons à ce monstre la colère d'un pêcheur ! + questAcceptDialog: + - '&a[Piscis Nemesis]&f Montez, je tiens le bateau !' + - N'oubliez pas de mettre ce &eCasque de Plongée&f ! + - '&7&oJe devrais entrer dans le trou de ver et vaincre le monstre marin.' + questCompleteMessage: + - '&a[Piscis Nemesis]&f Haha ! Quel spectacle!' + - '&fBien sûr, j''ai eu la situation sous contrôle pendant tout ce temps, mais vous m''avez certainement un peu aidé !' + - '&fTiens, tu peux avoir ça !' + - '&7&oLe monstre est mort et le rivage est sûr. Ca semble être un travail bien fait.' +primis_caeruleaum_fletching: + name: '&2Chasseur de flèches' + questLore: + - Vous avez quelques minutes pour aider ? + - Avec tous les raids récents, nous nous sommes retrouvés sans &eFlèche Grappin&f ! + - C'est généralement mon travail de les obtenir, mais les choses ne sont qu'un + - un peu trop dangereux en ce moment pour moi d'aller fouiller des donjons. + - Si vous pouviez me procurer ces &eFlèche Grappin&f, + - Je vais vous apprendre à les utiliser ! + questAcceptDialog: + - '&a[Ventus Artifex]&f Veuillez m''apporter 10 &eFlèche Grappin &fdes ruines juste au-delà du village.' + - Les &cSquelettes morts-vivants&f et &cNoyée&f d'autrefois en portent généralement. + - '&7&oJe devrais aller tuer des &cSquelettes&7&o et des &cNoyés&7&o dans les ruines près du village pour leurs &eFlèches Grappin&7&o.' + questCompleteMessage: + - '&a[Ventus Artifex]&f Excellent travail !' + - '&eLes Flèches Grappin &fpeuvent être utilisées sur les &cClocs Cibles &fpour atteindre des endroits difficiles d''accès.' + - Ils sont indispensables pour l'aspirant fouilleur de ruines antiques. + - Voici votre récompense ! + - Et si vous mettiez vos connaissances à l'épreuve ? + - '&7&oOn dirait que &aVentus Artifex&7&o a un défi pour moi.' +primis_caeruleaum_fletching_2: + name: '&2Chasseur de bouclier' + questLore: + - Vous avez les flèches? Super! + - Utilisez ces flèches avec un arc pour escalader la tour ! + questAcceptDialog: + - '&a[Ventus Artifex]&f Utilisez les flèches que vous venez de recevoir pour vous rendre dans les ruines et tirez sur les cibles avec !' + - + - + - + - + - '&7&oJe dois aller chercher le &eBouclier&7&o à l''intérieur des ruines, en utilisant les &eFlèches Grappin&7&o afin de tirer sur les cibles à l''intérieur du bâtiment.' + questCompleteMessage: + - '&a[Ventus Artifex]&f Exceptionnel !' + - Vraiment, vous êtes un véritable fouilleur de ruines ! + - Voici votre récompense ! + - '&7&oSemble que les Flèches Grappin seront utile à l''avenir.' +primis_caeruleaum_foraging: + name: '&2Appât loup' + questLore: + - J'ai entendu dire que vous cherchiez à aider ici. + - Il y a un &dRepaire des loups&f à proximité qui est + - vraiment gênant ma recherche de nourriture pour le village ! + questAcceptDialog: + - '&a[Venator Pabulatus]&f Si vous parvenez à vous débarrasser de ces embêtants &cLoups&f, je vous récompenserai généreusement !' + - Je deviens trop vieux pour m'occuper des choses sauvages de ces terres... + - '&7&oJe devrais aller tuer les &cLoups&7&o dans la tanière au sud-est du village.' + questCompleteMessage: + - '&a[Venator Pabulatus]&f Je savais que je pouvais compter sur vous !' + - Merci pour tout votre aide! + - Voici votre récompense comme promis. +primis_farmstead_lighthouse_keeper_2: + customObjectives: + Objective1: + dialog: + - "&a[Jeeves]&f &2Amavit&f vous a envoyé ? Qu'est-ce que c'est que ce phare ? Mon Dieu, quelle découverte !\n&fCela va révolutionner mon métier de marchand ambulant ! Tenez, prenez ces &eParchemins&f - appelez-moi et je serai là en un tournemain !\n&7&oOn dirait que &aJeeves&7&o a quelque chose pour moi. Je devrais lui parler." + name: '&2Les lumières mystérieuses' + questLore: + - + - + - Mon père &aJeeves&f est allé au sommet pour vérifier mais il n'est pas encore revenu. + - + - + questAcceptDialog: + - '&a[Amavit]&f Encore merci et bonne chance. Espérons que ce n''est rien.' + - '&7&oJe devrais aller en &dHaut du phare&f, enquêter sur le problème et ensuite faire rapport à &aJeeves&f le père d''&aAmavit dans le village.' + questCompleteMessage: + - '&7&oCes parchemins semblent puissants ! Je devrais utiliser le &dPhare&7&o pour revenir à la &dFerme&7&o et continuer à bouger.' +primis_gladius_assassins: + name: '&5Qui snipe les snipers ?' + questLore: + - Les toits de &dGladius&f sont couverts d'&cAssassins&f! + - Se promener dans la rue est une condamnation à mort. Nous devons nous occuper de ces snipers! + - + - + questAcceptDialog: + - '&a[Belli] Gère ces &cAssassins&f! N''oublie pas d''utiliser les &eFlèches Grapins&f!.' + - '&7&oJe devrais tuer ces &cAssassins&7&o.' + questCompleteMessage: + - '&a[Belli]&f Vous avez géré ces &cAssassins&f? Parfait! C''est un mal de tête en moins !' +primis_gladius_clear: + name: '&5Reprendre les rues' + questLore: + - Je n'ai pas besoin de vous dire que la ville est en train d'être envahie, n'est-ce pas? + - Nous offrons une récompense à ceux qui sont prêts à diminuer le nombre d'&cEnvahisseurs&f. + - Êtes-vous prêt à le faire? + questAcceptDialog: + - '&a[Belli] &fIl suffit de sortir et de réduire leurs nombres !' + - '&7&oJe vais sortir et nettoyer les rues de &dGladius&7&o.' + questCompleteMessage: + - '&a[Belli]&f Regardez, les Dieux ont fourni un véritable guerrier à notre sombre époque! J''ai un emploi pour une personne comme vous.' + - '&7&oOn dirait que &aBelli&7&o a un plan pour moi. Je devrais lui parler..' +primis_gladius_prayer: + name: 'Saut de l''Ange' + questLore: + - Je ne vais pas la couvrir, les choses semblent carrément sinistres! + - Les murs sont tombés, les rues grouillent + - avec le &cMort-Vivant&f et je viens juste de tomber à court de boissons. + - Dans des moments comme ceux-ci, les gens donnent leur espoir + - une sorte d’intervention divine! + - Il y a un &dChemin&f, éclairé par des bougies, qui mène à un + - '&dSanctuaire dans les Montagnes&f.' + - Guerriers, remontez sur ce chemin et terrassez le &cMoinek&f qui garde + - le sanctuaire pour être béni par le dieu de guerre en combat. + - Ce n'est peut-être qu'une superstition, mais est-ce que cela ferait du mal + - pour donner de l’espoir aux gens? + - Le fait que vous ayez fait votre chemin ici montre que vous êtes un cran au-dessus + - du reste - montez la montagne et terrassez le &cMoinek&f. + - Tous les guerriers se sentiront mieux en sachant qu'ils sont couverts. + questAcceptDialog: + - '&a[Belli] &fAllez &dà l''étage&f et suivez les bougies ! Attention à ne pas tomber, le chemin est traître!' + - '&7&oJe devrais suivre le &Chemin sinueux&7&o et terrasser le &cMoine&7&o.' + questCompleteMessage: + - '&a[Belli]&f Vous avez terminé la prière? Merci, les soldats se sentiront soulagés de l''entendre.' +primis_gladius_ships: + name: '&5Une sensation de naufrage' + questLore: + - Vous les avez vus ? Les douzaines de navires à l'extérieur + - de &dGladius&f? Ils sont responsables de tout cela. + - Nous ne nous attendions jamais à une invasion du &dTemple de Sang&f, + - encore moins par des armes de siège montées sur des bateaux! + - Nous devons faire quelque chose à ce sujet. Tuer l'&cAmiral&f + - et aucune force ne nous redonnera ce que nous avons perdu, + - mais ça nous aidera à nous sentir mieux. + questAcceptDialog: + - '&a[Belli] &fTuez l''&cAmiral&f et une partie des troupes sur les bateaux. Faites attention à leur supériorité dans l''eau ! Je recommande d''utiliser des &eFlèches Grappin&f pour se déplacer dans les navires.' + - '&7&oje devrais aller tuer l''&cAmiral&7&o et certaines de ses troupes sur les bateaux juste &dà l''Exterieur de Gladius&7&o.' + questCompleteMessage: + - '&a[Belli]&f L''amiral n''est plus ? Pourquoi, je me sens déjà mieux !' +primis_gladius_sunken_ship: + name: '&5Navire englouti' + questLore: + - Maintenant que vous avez pris soin des &cForces de Mariner &f j'ai reçu + - une autre tâche pour toi. + - Le &dNavire Coulé&f devrait maintenant être accessible. + - Vous voyez, il y a quelque temps, un de nos navires a été coulé, + - malheureusement, il transportait des &eDocuments importants&f. + - J'ai besoin que vous atteigniez le &dNavire Coulé&f et tuiez toutes les menaces + - et récupérez les &eDocuments&f. + - Revenez me voir après avoir terminé la tâche. + questAcceptDialog: + - '&a[Belli] &fTu trouveras le navire dans les eaux au sud-ouest. Donne leur l''enfer!' + - '&7&oJe devrais aller chercher les &eDocuments&7&o et tuer tous les &cMarins&7&o à proximité du navire.' + questCompleteMessage: + - '&a[Belli]&f déjà de retour ? Excellent travail! Nous avions vraiment besoin de ces &eDocuments&f.' +primis_gladius_supplies_1: + name: '&cProblèmes d''approvisionnement' + questLore: + - Nous manquons de &eFournitures&f ! + - '&dGladius&f est une forteresse équipée pour durer un long siège' + - sans aucun problème, mais cela suppose que nous ayons + - accès à l'&dEntrepôt&f! + - Malheureusement, l'&dEntrepôt&f a été l'un des premiers endroits à tomber, + - et maintenant nous mourons lentement de faim ! + - Si vous pouvez dégager un chemin vers l'&dEntrepôt&f et obtenir des &eFournitures&f + - cela aiderait grandement à l'effort de guerre ! + questAcceptDialog: + - '&a[Cibus]&f L''&dEntrepôt&f est difficile à manquer ! C''est le très grand bâtiment qui ressemble à un entrepôt près de la partie où le mur est tombé ! Prenez des &eFournitures&f et rapportez-les ici !' + - '&7&oJe devrais aller à l''&dEntrepôt&7&o et rapporter les &eFournitures&7&o.' + questCompleteMessage: + - '&a[Cibus]&f Vous avez ramené les &eFournitures&f ? Fantastique! Pendant ce temps, j''ai trouvé l''idée parfaite pour les boissons - et cela devrait remonter le moral des soldats !' + - '&7&oOn dirait que le &aCibus&7&o a un plan, je devrais leur parler.' +primis_gladius_supplies_2: + name: '&cFournir plus de problèmes' + questLore: + - Nous avons de la nourriture, mais qu'en est-il des boissons ? + - Certains diraient que c'est stupide de se saouler au milieu + - d'une guerre, mais si ce n'est pas maintenant, alors quand? + - Le &cBarman&f de l'autre côté de la rue a gardé tout le bien + - trucs dans le &dSous-sol&f. + - Je pense que vous savez où je veux en venir ! + - Allez au &dSous-sol&f de la taverne de l'autre côté de la rue et prenez + - les &eBon produits&f. Si vous trouvez le &cBarman&f, je le considérerais comme un + - faveur personnelle si vous le libérez de cette malédiction du mort-vivant. + - Nous sommes presque sûrs qu'il était dans le &dSous-Sol&f quand le + - l'invasion s'est produite donc il y a de fortes chances qu'il soit toujours là, + - mais probablement plus lui-même. + - Soyez prudent! + questAcceptDialog: + - '&a[Cibus]&f La &dTaverne&f est juste de l''autre côté de la rue, difficile à manquer ! Rendez-vous simplement au &dSous-sol&f et obtenez les &eBon produits&f !' + - '&7&oJe devrais aller au &dSous-sol&7&o de la taverne et prendre "les &eBon Produits&7&o".' + questCompleteMessage: + - '&a[Cibus]&f Vous avez vaincu le &cBarman&f ? Je vous remercie d''avoir libéré mon vieil homme de cette malédiction. Tiens, je vais prendre le premier verre avec toi.' +primis_ice_village_all_out_of_chains: + customObjectives: + Objective1: + dialog: + - '&a[Orbis]&f Oh, le colis de chaîne du Village de Glace. Oui, c''est juste dans ce coffre là-bas.' + - Désolé de ne pas l'avoir envoyé, mais nous étions très occupés et n'avions pas le temps. + - Tout est payé, alors n'hésitez pas à le saisir. + name: '&2Tous enchaînés' + questLore: + - Hé, vous venez de &dPontis Mille&f, n'est-ce pas ? + - Comment voulez-vous nous aider. + - Ici, à la prison, nous avons tendance à traverser une + - beaucoup de chaines... + - Surtout les chaînes qui retiennent les cages. + - Ils rouillent beaucoup puis ils cassent. C'est + - comment l'un des prisonniers s'est échappé. Le rouillé + - la cage est tombée et il a couru. + - Nous avons payé pour un + - '&eEnvoi de nouvelles chaînes&f, mais il' + - n'est pas encore arrivé. Si vous pouviez aller à + - '&dPontis Mille&f et récupérer notre' + - '&aColis de chaînes' + - ce serait génial ! + questAcceptDialog: + - '&a[Philolaches Triferus]&f Allez parler à Orbis. Ce sont eux qui font les chaînes.' + - '&7&oJe devrais aller parler à &a&oOrbis&7&o et rapporter le &e&oColis de chaînes&7&o.' + questCompleteMessage: + - '&a[Philolaches Triferus]&f Ce sont les chaînes ! Merci de les avoir récupérées, nous en avions vraiment besoin.' +primis_ice_village_catch_me_if_you_can: + name: '&2Attrape moi si tu peux' + questLore: + - Quel timing! Je cherchais juste quelqu'un pour aller capturer notre + - '&cPrisonnier échappé.' + - + - + - + - + - + - + questAcceptDialog: + - '&a[Romanus Superbus]&f Il doit se trouver quelque part dans les montagnes.' + - '&7&oJe dois trouver le &c&oPrisonnier Echappé&7&o et le ramener à la prison.' + questCompleteMessage: + - '&a[Romanus Superbus]&f Eh bien, bon, si ce n''est pas notre beauté endormie échappée.' + - Bon travail. Un travail bien fait mérite un bon paiement, aller tiens. + - '&aRomanus&7 vous tend un lourd sac de monnaie.' +primis_ice_village_get_them_off_my_back: + name: '&2Retirez-les de mon dos !' + questLore: + - Laissez-moi vous le dire, je suis sûr que vous êtes ici pour aider, ha ha. + - Notre mission ici est de chasser les &cRazorbacks&f et de les garder nombre gérable. + - Il ne s'agit pas non plus de contrôle de la population. + - Ils nous fournissent du cuir précieux, des défenses et de la viande. + - Pas sûr que ce village existerait sans eux. + - + - + - + - + - + - + - Nous n'avons besoin que de vous pour abattre les &cBébés&f et les &cjeunes Razorbacks&f. + - + - + - + - + - Cela signifierait beaucoup pour moi si vous pouviez le récupérer. + questAcceptDialog: + - '&a[Alanus Isatis]&f Vous devez avoir vu les &cRazorbacks&f sur votre chemin, donc je suppose que vous savez où les trouver.' + - '&7&oJe dois diminuer la population de &c&oRazorback&7&o et récupérer le &e&oPoignard d''Alanus&7&o.' + questCompleteMessage: + - '&a[Alanus Isatis]&f Bien joué l''ami ! Ça devrait beaucoup aider.' + - + - + - La dague n'a rien de spécial, mais c'était un cadeau fait de la main de mon regretté père. + - La prochaine fois que vous aurez soif, les boissons sont pour moi! +primis_ice_village_gotta_keep_warm: + customObjectives: + Objective1: + dialog: + - '&a[Severinus Martius]&f Ha ha! Ça devrait me garder au chaud pendant encore quelques semaines!' + - Hé l'ami, il y aurait-il une chance que vous vous rendiez au &dVillage de Caerullium&f ? + name: '&2Restez au chaud' + questLore: + - Nous livrons le &aGardien de Phare&f avec + - des trucs assez fort, toutes les quelques semaines. + - Cela lui tient chaud pendant les jours les plus froids. + - C'est un petit geste de remerciement pour tout son + - dur labeur. Il y a possibilité que vous nous aidiez ? + - et apporter le prochain lot ? + questAcceptDialog: + - '&a[Grania Cecilius]&f Vous trouverez le phare à l''est. Merci!' + - '&7&oJe dois me rendre au &d&oPhare&7&o et les remettre au &a&oGardien du Phare&7&o.' + questCompleteMessage: + - '&a[Severinus Martius]&f Si vous vous rendez là-bas, j''apprécierais si vous pouviez en livrer quelques-uns à mon bon ami &aJeeves&f.' + - '&7&oOn dirait que le &a&oGardien duPhare&7&o a une quête pour moi.' +primis_ice_village_gotta_see_jeeves: + customObjectives: + Objective1: + dialog: + - '&a[Jeeves]&f Oh ! Un cadeau de mon ami Severinus me dites-vous.' + - Eh bien, merci de l'avoir apporté. C'était sympa de te revoir ! + name: '&2Je dois voir Jeeves' + questLore: + - Maintenant, maintenant ce serait vraiment impoli de ma part de garder + - toutes les bonnes choses pour moi! + - Si vous vouliez bien m'aider mon ami et + - livrer quelques-unes des bonnes choses + - à mon ami &aJeeves&f à &dCaerullium Village&f. + - Vous pouvez vous y rendre rapidement en empruntant le + - '&9Portail du Phare&f.' + questAcceptDialog: + - '&a[Severinus Martius]&f Le portail est tout en haut.' + - '&7&oJe devrais aller au &d&oCaerullium Village&7&o et livrer quelques bonnes choses à &a&oJeeves&7&o.' + questCompleteMessage: + - '&a[Severinus Martius]&f Merci d''avoir livré quelques-uns des trucs forts à Jeeves. Je sais qu''il aime bien boire un verre ici et là ha ha !' +primis_ice_village_living_nightmares: + customObjectives: + Objective1: + dialog: + - '&a[Cornelia Ennodius]&f Sont-ils partis ? J''avais si peur. Mes parents vous ont envoyé ? Dieu merci.' + - + - + - Je ne pouvais pas m'échapper. Je, je... ça ira, j'ai juste besoin d'une minute... + name: '&2Vivre des cauchemars' + questLore: + - Je suivais sa piste, c'est là que ça se termine. + - Je ne sais pas où elle serait allée d'ici. + - Je crains que quelque chose de mal ne soit arrivé. + - Notre &aFille&f prend beaucoup de moi et de mes pouvoirs spéciaux. + - Sauf que les siens sont beaucoup plus puissants, elle est capable + - de rendre manifestes des émotions puissantes dans le monde réel. + - Nous manquons de temps, nous devons la retrouver rapidement. + questAcceptDialog: + - '&a[Sestia Ennodius]&f La piste s''est refroidie ici, elle ne doit pas être si loin...' + - '&7&oJe dois trouver la &a&oFille Disparue&7&o avant que quelque chose ne lui arrive.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f Vous l''avez trouvée ! Vite, où est-elle ?' + - Merci étranger, je vais aller la voir tout de suite! +primis_ice_village_make_them_go_ouch: + name: '&2Faites-les sortir' + questLore: + - J'ai eu des '&cClients&f' coquins + - venez visiter il y a quelques jours. + - Ils ont volé le plus précieux + - de mes &ePossessions&f. + - Vous devez les trouver et vous assurer + - pour leur donner une leçon. + - Assurez-vous qu'ils savent que + - '&aViolet&f n''oublie pas de collectionner.' + questAcceptDialog: + - '&a[Domina Violet]&f Ils sont allés vers l''est après les &9Arbres&f.' + - '&7&oJe dois m''assurer que les &c&oClients&7&o savent qu''il ne faut pas jouer avec &a&oViolet&7&o. Je dois également récupérer la propriété de &e&oViolet&7&o.' + questCompleteMessage: + - '&a[Domina Violet]&f J''espère que vous leur avez appris la valeur de la douleur.' + - + - +primis_ice_village_objection!: + customObjectives: + Objective3: + dialog: + - '&a[Glacies Princeps]&f Quoi, absolument pas. Je ne sais pas comment il t''a convaincu de venir ici et de demander sa libération.' + - + - + - Il ne sera jamais libéré. Est-ce bien compris. + Objective1: + dialog: + - '&a[Romanus Superbus]&f Le libérer ? Non coupable? T''es en colère? Tu as de la chance que je ne te jette pas en cage toi aussi pour avoir suggéré de telles bêtises.' + Objective2: + dialog: + - '&a[Luxuria Placidus]&f Qui ? Jamais entendu parler de lui.' + name: '&2Objection!' + questLore: + - Je n'ai pas de place ici! Vous pouvez certainement le voir? + - Je n'ai pas mal fait! Étranger vous entendrez mon appel. + - Aideriez-vous cette pauvre âme prise au piège + - ici dans cette horrible cage, qui n'a commis aucune faute ? + - Tu dois aller parler au + - '&aMaître de la prison &f ou au ' + - '&aChef de village&f.' + - Ou n'importe quel autre + - '&aVillageois amical&f' + - qui serait + - prêt à plaider pour + - ma libération ! + questAcceptDialog: + - '&a[Adrius Calpornius]&f Allez leur parler! Sortez moi d''ici !' + - '&7&oJe devrais aller parler avec les personnes de ma liste.' + questCompleteMessage: + - '&a[Adrius Calpornius]&f QUOI ?! MENSONGES!!! Je ne ferais jamais une chose aussi horrible à ma famille...' + - + - + - '&7Quelle que soit la raison pour laquelle ce pauvre homme était resté, il est maintenant parti...' +primis_ice_village_run_away_daughter: + customObjectives: + Objective1: + dialog: + - '&a[Sestia Ennodius]&f Je peux sentir que tu approches.' + name: '&2Fille fugueuse' + questLore: + - Étranger! Aideriez-vous notre famille? + - Notre &aFille&f a disparu. + - Elle a reçu des pouvoirs + - spéciaux tout comme sa &aMère&f + - Je crains que cette nuit quelque chose + - de terrible a dû arriver et + - l'a fait fuir en plein milieu de + - la nuit. + questAcceptDialog: + - '&a[Sparax Ennodius]&f Ma &aFemme&f est déjà partie à sa recherche.' + - Je suis sûr qu'elle est quelque part en dehors du village. Allez la trouver et lui parler. + - '&7&oJe devrais aller chercher la &a&Mère inquiète&7&o.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f Vous avez été envoyé par mon &aMari&f pour aider à la recherche ?' + - '&7&oJe devrais écouter la &a&Mère inquiète&7&o.' +primis_ice_village_silence: + name: '&2Faites-les sortir' + questLore: + - Shhh! Vous l'entendez? + - Les hurlements agaçants. + - Ugh, je ne peux plus le supporter ! + - Écoutez, je paierai de bonnes pièces + - si vous trouvez la source + - de ces hurlements agaçants + - et les arrêtez. + questAcceptDialog: + - '&a[Modestus Eulogius]&f On dirait que ça vient quelque part dans les collines derrière moi.' + - '&7&oJe devrais trouver la source de tout ce bruit et le faire arrêter.' + questCompleteMessage: + - '&a[Modestus Eulogius]&f Mes oreilles et moi vous remercions!' +primis_ice_village_taking_the_bait: + name: '&2Prendre l''appât' + questLore: + - Ces &cPoissons&f, qu'est-ce qui ne va pas avec eux ! + - Je suis ici depuis des jours! + - Pas une seule prise. Si seulement j'étais plus jeune, je leur montrerais ! + - + - + - Et si nous ne pouvons pas en attraper, eh bien c'est un gros problème. + - Vous devrez descendre là-bas et les battre sans raison. + questAcceptDialog: + - '&a[Theopropides Nero]&f Vous vouliez aider alors voici votre chance !' + - '&7&oJe dois sauter dans le lac et tuer 7 &c&oSaumon Frileux&7&o et récupérer leurs corps.' + questCompleteMessage: + - '&a[Théopropide Néron]&f Oh ! Regarde-les! Ils sont grands!.' + - + - +primis_ice_village_treats_for_the_punished: + customObjectives: + Objective1: + dialog: + - '&a[Eleusium Calenus]&f Ma femme vous a envoyé ? Oh, ce sont des friandises ? Mes préférées aussi ! Elle est tellement charmante.' + - + - + - 'Tu lui dis que je vais très bien et que je l''aime beaucoup. ' + name: '&2Gâteries pour les punis' + questLore: + - Si cela ne vous dérange pas, puis-je vous demander de faire quelque chose pour moi ? + - Mon cher &aMari&f a été emprisonné et je sais que c'est dur de vivre en cage toute la journée. + - J'ai donc préparé des friandises que j'allais lui livrer. + - + - + questAcceptDialog: + - '&a[Titia Calenus]&f Il sera dans l''une des cages du milieu.' + - N'oubliez pas de lui dire que je l'aime. + - '&7&oJe devrais livrer ces friandises au &a&oMari&7&o.' + questCompleteMessage: + - '&a[Titia Calenus]&f De retour si vite ! Oh, a-t-il vraiment dit ça ? Il est tellement adorable.' +primis_ice_village_wanna_make_a_snowman: + name: '&2Je veux construire un bonhomme de neige' + questLore: + - Les enfants du village se sont bien ennuyés ces derniers temps + - et j'ai réfléchi. Il y a ces + - '&cCréatures magiques&f qui habitent les bois autour de ce' + - village. La fourrure des créatures pousse &eCristaux de glace magiques&e. + - Lorsque vous infusez de la neige avec ces &eCristaux&f, cela rend la + - la neige bouge, s'étend et se contracte. + - Et si tu construis un bonhomme de neige avec cette neige infusée + - cela donne l'impression que le bonhomme de neige est vivant. + - Les enfants adoreraient ! Alors, envie d'aider + - ce vieil homme remonte le moral des enfants? + questAcceptDialog: + - '&a[Sparax Ennodius]&f Vous trouverez les &cCréatures&f dans n''importe quel bois près du village.' + - + - + - '&7&oJe devrais tuer assez d''&c&oUrsus à fourrure de givre&7&o pour récolter 15 &e&oCristaux de glace&7&o.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f Vous avez ramassé assez de cristaux ? Formidable!' + - Je peux commencer à faire le bonhomme de neige maintenant, j'ai hâte que les enfants le voient ! +primis_main_quest_: + name: '&2Gobelins dans les mines!' + questLore: + - Cette journée ne fait qu'empirer. Tout d'abord, nous sommes pris en embuscade par des gobelins. + - Nous nous retirons, seulement pour trouver notre armée divisée. Certains sont morts, beaucoup sont portés disparus. + - Pire encore, nous craignons d'avoir réveillé le Roi Gobelin. + - Certains, espérons-le, ont réussi. Nous devons installer le camp et récupérer pour l'instant. + - Si vous osez braver les mines, vous êtes seul. + - Nous avons essayé de nous faufiler devant eux, et ça ne s'est pas bien passé. + - Le seul moyen d'avancer est le bain de sang. + questAcceptDialog: + - '&8[Centurion]&fBravez-vous les Mines Gobelines ? Méfiez-vous du Roi Gobelin !' + - '&8[Centurion]&fNous espérons que notre équipe de reconnaissance l''a dépassé. Rencontrez-les si vous le pouvez.' + - '&8&oJe devrais m''aventurer dans les mines et vaincre le Roi Gobelin.' + questCompleteMessage: + - '&8[Groupe de Repérage]&fVous avez réussi ? J''aurais presque souhaité que vous ne l''avez pas fait. Vous ne croirez pas ce qui vous attend.' + - '&8&oOn dirait que le groupe de reconnaissance a de mauvaises nouvelles pour moi.' +primis_main_quest_1: + customObjectives: + Objective1: + dialog: + - '&a[Chef Piscis] &fOh donc vous étiez dans le navire qui s''est échoué il y a quelques heures ?' + - + - + - + - + - + - + - '&7&oJe devrais me présenter au &aSecond &7&opour voir si je dois aider ces gens !' + name: '&2Naufragé !' + questLore: + - Vous êtes enfin réveillé ? Bien! Nous avons besoin de votre aide. + - Le navire s'est échoué lors de la tempête de la nuit dernière. + - On voit a &dPhare &fau loin, donc il doit y avoir un village là-bas ! + - Allez parler au &aChef de Village &fet voyez s'il peut vous aider ! + - Le &aSecond &fvous a précédé, mais n'est pas encore revenu. + - Suivez ses instructions si vous le voyez ! + questAcceptDialog: + - '&a[Capitaine Squalus]&f Allez au village voisin et voyez s''ils nous aideront !' + - Soyez prudent sur votre chemin, nous ne savons pas ce qui se cache autour de ces pièces ! + - '&7&oJe devrais enquêter sur le village voisin et parler à leur chef.' + questCompleteMessage: + - '&a[Premier lieutenant Iracundi]&f Darnation ! Nous ne pouvons tout simplement pas faire une pause aujourd''hui ! Ici, c''est clairement dangereux d''y aller seul, prends ça !' + - '&7&oIl semble que le Premier Lieutenant Iracundi a une demande pour moi...' +primis_main_quest_10: + customObjectives: + Objective2: + dialog: + - "&a[Shogun Navita] &f&dGladius&f appelle à notre aide ?\n&7&oOn dirait que je devrais parler au &aShogun&7&o." + name: '&5Combler le fossé' + questLore: + - Il est temps d'appeler &dPontis Mille&f à l'aide. + - Faites-leur savoir ce qui s'est passé ici et dites-leur que nous encaissons en notre faveur. + - + - + questAcceptDialog: + - '&a[Général Hasta] &fBon voyage, mon ami. N''oubliez pas : tuez le &cGardien de la porte&f et assurez-vous que notre plaidoyer atteigne les oreilles de &aShogun Navita&f..' + - '&7&oJe devrais tuer le &cGardien de la porte&7&o au &dPont&7&o et me diriger vers &aShogun Navita&7&o à &dPontis Mille&7&o.' + questCompleteMessage: + - '&a[Shogun Navita]&f Vraiment, les nouvelles que vous m''apportez sont des plus inquiétantes, mais je crains que nous ne soupçonnions déjà que quelque chose... d''anormal... se passait.' + - '&7&oOn dirait que &aShogun Navita&7&o veut me parler.' +primis_main_quest_11: + customObjectives: + Objective1: + dialog: + - '&a[Commandant Fortes Bellator]&f Oui, voyageur ?' + name: '&2Envoi d''un message !' + questLore: + - Les récits de votre voyage sont des plus surprenants. + - Que tu sois arrivé vivant ici n'est rien de moins qu'un miracle. + - Les forces qui envahissent &dGladius&f sont insurmontables. + - '&dGladius&f finira par s''effondrer sous leur puissance...' + - Aide ?... Ah, oui. Allez voir &aCommandant Fortes Bellator&f. + - Il pourra vous assister. + questAcceptDialog: + - '&a[Navita]&f Vous pouvez trouver le &aCommandant&f en haut de ces escaliers juste devant !' + - '&7&oJe devrais aller parler au &aCommandant&f et voir s''il peut m''aider.' + questCompleteMessage: + - '&a[Commandant Fortes Bellator]&f Le &aShogun&f cherche à aider &dGladius&f ? Je pensais qu''il ne demanderait jamais ! Mais d''abord, nous devons nous préparer.' + - '&7&oOn dirait que &aFortes Bellator&7&o a du travail pour moi.' +primis_main_quest_12: + customObjectives: + Objective1: + dialog: + - '&a[Centurion]&f Où sont nos renforts ?' + name: '&2Chemin de la mine' + questLore: + - Je ne peux pas croire ce qui est arrivé à &dGladius&f. Ils l'ont frappé rapidement, + - et ils le frappent là où ça fait le plus mal. + - Il est de notre devoir juré d'aider nos alliés. Nous avons échoué notre + - devoir, et nous avons laissé tomber nos alliés. + - Le &cConseiller&f nous a ordonné de mobiliser nos troupes dans plusieurs + - zones avant l'invasion. + - Vous voyez, récemment, une tempête inhabituelle et dévastatrice a été repérée + - au &dTemple de la Tempête&f. + - La Garde royale a reçu l'ordre de calmer la Tempête, et le &aShogun&f + - refuse d'assurer cet ordre. + - Nos propres gardes sont ailleurs, et je crains que nous n'ayons besoin de tous + - que nous devons retourner à &dGladius&f. + - Le chemin vers le &dTemple de la tempête&f est perfide, car il faut aller + - par les mines &dGobelins &f. + - Aidez notre garde à nettoyer les mines et à faire un chemin vers le &dTemple de la Tempête&f! + questAcceptDialog: + - '&a[Fortes Bellator]&fMarchez lentement, les Mines &dGoblin &f sont un endroit dangereux. Peut-être devriez-vous aller avec la garde normale avant d''aider la Garde royale&f.' + - Les &dMines&f sont au nord de la ville. Il y a des escaliers menant à leur entrée. + - '&7&oJe devrais voir ce que je peux d''autre faire pour aider &aFortes Bellator&7&o, ou je peux me rendre à l''entrée des &dMines de Gobelin&7&o.' + questCompleteMessage: + - '&a[Centurion]&fC''est tellement bon de voir quelqu''un ! Avez-vous été envoyé par &dPontis Mille&f ?' + - '&7&oje devrais écouter ce que le &aCenturion&7&o a à dire' +primis_main_quest_13: + name: '&2Gobelins dans les mines!' + questLore: + - Cette journée ne fait qu'empirer. Tout d'abord, nous sommes pris en embuscade par des gobelins. + - Nous nous retirons, seulement pour trouver notre armée divisée. Certains sont morts, beaucoup sont portés disparus. + - Pire encore, nous craignons d'avoir réveillé le &cRoi Gobelin&f. + - Certains, espérons-le, ont réussi. Nous devons installer le camp et récupérer pour l'instant. + - Si vous osez braver les mines, vous êtes seul. + - Nous avons essayé de nous faufiler devant eux, et ça ne s'est pas bien passé. + - Le seul moyen d'avancer est le bain de sang. + questAcceptDialog: + - '&8[Centurion]&fBravez-vous les &dMines Gobelines &f? Méfiez-vous du &cRoi Gobelin&f !' + - Nous espérons que notre &aéquipe de reconnaissance&f l'a dépassé. Rencontrez-les si vous le pouvez. + - '&7&oJe devrais m''aventurer à travers les &dMines&7&o et vaincre le &cRoi Gobelin&7&o.' + questCompleteMessage: + - '&a[Groupe de Repérage]&fVous avez réussi ? J''aurais presque souhaité que vous ne l''avez pas fait. Vous ne croirez pas ce qui vous attend.' + - '&7&oOn dirait que le groupe de reconnaissance a de mauvaises nouvelles pour moi.' +primis_main_quest_14: + name: '&2Fin de tempête' + questLore: + - Il est difficile de croire que vous avez traversé la + - '&dMines gobeline&f par vous-même.' + - Peut-être qu'avec votre courage, vous serez en mesure de relever le défi qui vous attend. + - Nous avons tenté d'attaquer le &dTemple de la tempête&f, et avons atteint son point le plus profond + - confine à grands frais. + - Ce que nous avons trouvé là-bas... Cela défie l'entendement. + - C'est peut-être difficile à croire, mais cela ressemble à la tempête même + - lui-même s'est matérialisé comme notre adversaire. + - Nous ne savons même pas s'il peut être vaincu. Nous craignions d'être envoyés à la mort. + - + - + questAcceptDialog: + - '&a[Blepharo]&f Nous avons un peu affaibli leurs forces, mais ce n''est quand même pas une tâche facile.' + - La Tempête n'est pas un adversaire ordinaire. Ne le sous-estimez pas. + - '&7&oJe devrais aller dans le &dTemble de la Tempête&f et tuer la &cTempête&f.' + questCompleteMessage: + - '&a[Shogun Navita]&f Vous QUOI !?' + - Vous avez vaincu la &cTempête&f ? On m'a dit que c'était impossible ! Je veux dire... + - '... il ne sert à rien de le cacher maintenant. Je connaissais la &cTempête&f. J''étais au courant de l''invasion de &dGladius&f - je l''ai même facilitée. Je l''ai fait pour mon peuple - pour &dPontis Mille&f.' + - 'Le &cConseiller Machiavel&f m''a convaincu que la &cTempête&f était aussi imparable que la nature elle-même, et que la chute de &dGladius&f et &dPontis Mille&f était une fatalité que nous ne pouvions que retarder par des sacrifices.' + - + - + - '&8&oOn dirait que &aShogun Navita&7&o a un problème dont il veut que je m''occupe.' +primis_main_quest_15: + name: '&2Retour de rupture!' + questLore: + - + - + - + - + - + - + - + - + - + - Je nous ai fait gagner du temps. + - + - + - + - + - Il nous a guidés à notre destin, et il s'en serait sorti si vous n'étiez pas apparu. + - Maintenant, il y a de l'espoir. + - Je vous le demande, s'il vous plaît, débarrassez-nous du traître &cConseillé&f. + - + - + - + - + - + - + - Je souhaite leur transmettre un dernier message. + questAcceptDialog: + - '&a[Shogun Navita]&f &cLe conseiller Machiavelli&f s''est retiré dans ses quartiers dans la ville inférieure par le marché. Attention, il a amassé une suite dévouée avec le temps, et ne partira pas sans lutte.' + - '&7&oIl est temps pour &cLe conseiller Machiavelli&f de faire face à une juste rétribution.' + questCompleteMessage: + - '&a[Shogun Navita]&f Donc c''est fait.' + - '&dPontis Mille&f vous doit une grande dette, errante. Une fois que nous aurons fini de mobiliser l''armée, nous serons prêts à réparer nos torts et à marcher vers l''aide de &dGladius''&f .' + - '&7&a[Shogun Navita]&2 Nous vous craignions. Nous vous avons rendu nos alliés. Nous avons dispersé nos armées. Fini.' + - '&dPontis Mille&2 marche vers la guerre, et nous ne marcherons pas seuls, vous regretterez le jour où vous croiserez notre chemin.' + - '&7' + - '&7&oOn dirait que le &aShogun&7&o a un plan. Je devrais lui parler.' +primis_main_quest_16: + customObjectives: + Objective3: + dialog: + - '&a[Demenis Nolus]&f Se diriger vers le village, eh. Continuez vers l''est, suivez la route et vous devriez y être en un rien de temps!' + Objective4: + dialog: + - '&a[Callipho Classicius]&f Itinéraire ? Prenez la route qui mène au cimetière.' + Objective1: + dialog: + - '&a[Glacies]&f Bienvenue dans notre village, cher voyageur! S''il vous plaît, dites-moi, ce qui vous amène ici l''ami.' + Objective2: + dialog: + - '&a[Bromia Culleolus]&f Oh, le chemin vers le village. Oui, prenez simplement cette route qui mène à la montagne.' + - Heureux de vous aider! + name: '&2Le village de glace vous attend' + questLore: + - Nous devons envoyer une aide à &dGladius&f dès que possible. + - Champion, il y a un village de puissants guerriers à l'extrême sud. + - Vous devriez vous y rendre et les informer que &dPontis Mille&f + - chercherait leur aide pour repousser les envahisseurs du &dTemple du Sang&f. + - Trouvez &aGlacies Princeps&f et dites-leur que je vous ai envoyé. + - Il y a beaucoup de voyageurs sur les routes, vous devriez vous arrêter et leur demander votre chemin. + questAcceptDialog: + - '&a[Shogun Navita]&f Ce sera un long voyage. Assurez-vous de vous préparer. Suivez les routes qui mènent vers le sud.' + - '&7&oJe dois aller localiser le &d&oVillage de Glace&7&o tout au sud.' + questCompleteMessage: + - '&a[Glacies Princeps]&f Le Shogun vous a envoyé, je vois, il est bon d''entendre que &aNavita&f est redevenu lui-même.' + - + - + - Laisse-moi t'en dire plus... + - '&7&oJe devrais parler à &a&oGlacies&7&o.' +primis_main_quest_17: + customObjectives: + Objective3: + dialog: + - '&a[Theopropides Nero]&f Aide ? Oui s''il te plaît!' + Objective1: + dialog: + - '&a[Alanus Isatis]&f Ici pour aider avec les &cRazorbacks&f ?' + Objective2: + dialog: + - '&a[Domina Violet]&f J''espère que vous êtes là pour m''aider !' + name: '&2Aider le nord' + questLore: + - Avant de discuter davantage de quoi que ce soit à propos du + - '&dTemple du Sang&f.' + - + - + - Si ces problèmes ne sont pas résolus, je manquerais à mes devoirs de chef de village. + - Il n'y a aucun moyen pour moi d'ignorer l'appel de mon propre peuple et de faire passer les autres en premier. + - + - + - + - + - + - + - + - + - Ils seront en mesure de vous dire plus en détail ce qui doit être fait. + questAcceptDialog: + - '&a[Glacies Princeps]&f Une fois que vous avez fini de les aider. Reviens vers moi et on pourra parler.' + - '&7&o Je devrais aller parler aux villageois sur ma liste et les aider avec tous les problèmes qu''ils pourraient avoir.' + questCompleteMessage: + - '&a[Romanus Superbus]&f &2Glacies&f vous envoie, il était temps ! Nous avons un prisonnier en liberté !' + - '&7&oJe devrais parler à &a&oRomanus Superbus&7&o.' +primis_main_quest_18: + name: '&2L''épreuve de la glace' + questLore: + - Eh bien, vous m'avez certainement impressionné, ainsi que la plupart du village. + - + - + - les &cÉlémentaires de glace&f. + - + - + - + - + - '&cÉlémentaires de glace mineurs&f au combat.' + - + - + - Si vous avez échoué... alors... votre énergie et votre être appartenaient aux &cÉlémentaires de glace&f. + - + - + - Depuis + - + - + - Plusieurs de nos gens ont été corrompus et nous avons dû les emprisonner pour notre propre sécurité. + - + - + - + - + - Esclaves de la + - '&cÉlémentaires de glace&f.' + - Il est clair que nos vieilles traditions ne le sont plus. + - Les &cÉlémentaires de glace&f doivent être traités... + - Je vous demanderais d'être le dernier à + - entreprendre &9L'épreuve de la Glace&f. Montez au sommet et affrontez le + - '&cElémentaire de Glace Mineur&f et libérez les âmes de ceux qui ont échoué à l''épreuve.' + questAcceptDialog: + - '&a[Glacies Princeps]&f Vous pouvez trouver le début du parcours de l''épreuve à la maison de &aViolet&f .' + - Suivez les blocs d'&9Amethystet&f , ils vous guideront jusqu'au pic. + - '&7&oJe devrais suivre les blocs d''&9&oAmethyste&7&o vers le pic de la montagne et découper l'' &c&oElémentaire de Glace Mineur&7&o.' + questCompleteMessage: + - '&a[Glacies Princeps]&f Vous l''avez fait ? Puisse leurs âmes reposer en paix maintenant.' + - Parlons à nouveau l'ami. Il reste encore beaucoup à faire. + - '&7&oJe devrais parler à &a&oGlacies&7&o.' +primis_main_quest_19: + name: '&2Relax' + questLore: + - Il est temps de nous libérer de cette malédiction. + - Nous n'aurions jamais dû nous rendre dépendants d'une puissance &cElementale&f. + - Nous corrigerons cette erreur ici et maintenant. + - Ce que vous avez tué n'était qu'un + - '&cÉlémentaire de glace mineurs&f,' + - '&cL''Élémentaire de Glace&f repose dans un temple juste en face de notre village.' + - C'était la principale source de notre pouvoir... et de notre folie . + - Allez-y et tuez &cL'Élémentaire de Glace&f. + questAcceptDialog: + - '&a[Glacies Princeps]&f Vous trouverez un chemin qui mène au temple au sommet du village.' + - '&7&oje devrais entrer dans le temple et tuer l''&c&oÉlémentaire de Glace&7&o.' + questCompleteMessage: + - '&a[Glacies Princeps]&f Je peux sentir les énergies qui affluent, à partir d''ici.' + - + - + - Il y a un autre campement qui pourrait avoir besoin de votre aide, disons. + - '&7&oJ''entendrais ce que &a&oGlacies&7&o a à dire.' +primis_main_quest_2: + customObjectives: + Objective1: + dialog: + - '&a[Chef Piscis]&fVous nous aiderez ? Merci! Cela commençait à ressembler à un navire en plein naufrage!' + name: '&2Étrangers dans le besoin...' + questLore: + - Alors non seulement ils ne peuvent pas aider, mais en plus ils veulent la notre? Bah! + - Eh bien, nous n'avons pas beaucoup de choix pour l'instant, n'est-ce pas? + - Allez, aidez-les, puis faites en sorte qu'ils nous aident! + questAcceptDialog: + - '&a[Second Iracundi]&f Très bien, allez aider les habitants du pays, voir quelles informations vous pouvez collecter et voir si vous pouvez les obtenir pour nous aider à notre tour. Je serai là pour négocier.' + - Revenez dès que vous aurez quelque chose ! + - '&7&oJe devrais parler au &aChef du Village&f pour savoir comment aider les habitants.' + questCompleteMessage: + - '&a[Chef Piscis]&f Tout le monde dans le village a un problème qui doit être résolu, et je ne suis pas une exception. Ma demande est assez difficile, alors peut-être que vous voulez vous réchauffer et prendre connaissance du terrain avec certains des problèmes des autres villageois.' + - + - + - '&7&oJe devrais parler à la population locale et voir qui a besoin d''aide, et revenir voir le chef quand je me sentirais prêt à continuer.' +primis_main_quest_20: + customObjectives: + Objective1: + dialog: + - '&a[Lutum Princeps]&f Cela vaudrait mieux être important.' + name: '&2Terravilla' + questLore: + - Il y a quelque temps, nous avons reçu une demande d'aide d'une + - colonie à proximité. Il y a des années + - des explorateurs se sont installés au sommet de cette ruine antique. + - Je pense qu'ils appellent leur petit + - campement &dTerravilla&f. Apparemment, il y a beaucoup + - de trésors à obtenir si vous ne vous souciez pas des risques. + - Mais j'ai entendu que les choses ont mal tourné là-bas et ils ont demandé + - si nous pouvions leur envoyer de l'aide. Pour être + - honnête, vous êtes le guerrier le plus fort que j'ai jamais vu. + - Vous êtes la meilleure aide que nous puissions envoyer. Si vous souhaitez + - y aller bien sûr. + questAcceptDialog: + - '&a[Glacies Princeps]&f Vous trouverez &aTerravilla&f directement à l''ouest d''ici.' + - + - + - Oh, j'ai presque oublié. La personne à qui vous voulez parler est le &aSurveillant Lutum&f. + - '&7&oJe devrais aller à &d&oTerravilla&7&o et parler au &a&oSurveillantLutum&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f Vous êtes venu tout droit du &dVillage de Glace&f, eh. Bon de voir de l''aide arriver.' + - + - + - + - + - '&7&oJe devrais parler à &a&oLutum&7&o.' +primis_main_quest_21: + name: '&2Sortir les poubelles' + questLore: + - Il y a de nombreuses années, des explorateurs sont tombés sur cette ruine et + - alors qu'ils l'étudiaient de plus près, ils découvrirent une + - grande structure souterraine en forme de labyrinthe. Dans cette structure + - il y avait beaucoup d'objets anciens et de trésors. Mais + - aussi beaucoup de danger. Ce n'est pas comme ça qui a empêché quiconque de + - descendre là-bas. Et au fur et à mesure que le mot se répandait, de plus en plus + - les gens venaient ici pour faire fortune. Avant toi + - le sais, il s'est transformé en une petite colonie. Jusqu'à récemment + - tout allait bien, mais ensuite des choses horribles ont commencé + - événement. Avant de vous en dire plus, il faudrait commencer par + - traiter d'abord les problèmes simples. Une petite bande de + - '&cVoleurs&f a pris pied dans les collines environnantes' + - '&dTerravilla&f. Nous avons besoin qu''ils disparaissent. Aussi, n''hésitez pas à aider' + - tous les villageois de &aTerravilla&f qui pourraient avoir besoin d'aide. + questAcceptDialog: + - '&a[Lutum Princeps]&f Je ne sais pas exactement où sont les &cRobbers&f. Je sais juste que des gens ont rapporté les avoir vus venir des collines.' + - '&7&oJe devrais m''occuper des &c&oVoleurs&7&o et aider les villageois dans le besoin si j''ai le temps.' + questCompleteMessage: + - '&a[Lutum Princeps]&f Eh bien, c''est un problème résolu. Au suivant !' + - Avant de poursuivre, je veux que vous ayez cette lame. + - + - + - '&7&oJe devrais savoir ce que &a&oLutum&7&o a prévu ensuite.' +primis_main_quest_22: + name: '&2Gros problème dans un petit pub' + questLore: + - Avant d'aborder le gros problème sous terre, je voudrais + - j'aimerais que vous fassiez une dernière chose ici en ville. Il y a + - été d'énormes problèmes dans notre petit pub. Il y a certains + - personnages de la ville qui continuent d'aller au pub et de causer + - un chahut. Eh bien, j'ai entendu dire que cette fois, ils ont tous réussi + - se rassembler au pub en même temps. Et bien sûr maintenant + - il y a une énorme bagarre là-bas. C'est une superbe + - occasion pour nous de tous les arrêter d'un coup. Allez à la + - pub et assommez-les tous. Nous nous occuperons du reste. + questAcceptDialog: + - '&a[Lutum Princeps]&f Le pub est au rez-de-chaussée, juste en face. Ne les laissez pas vous submerger.' + - J'aurai une belle récompense qui t'attendra ici quand tu seras de retour. + - '&7&oJe dois aller au pub et m''occuper des &c&oBagarreurs de Bar&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f J''ai entendu dire que le pub était redevenu un endroit paisible. Abordons maintenant le vrai problème.' + - '&7&oJ''ai besoin de parler à &a&oLutum&7&o.' +primis_main_quest_23: + name: '&2Frapper la terre' + questLore: + - Vous voyez, la vraie raison pour laquelle nous avons demandé de l'aide est à cause de ce qui s'est passé + - aux ruines. Il y avait toujours des choses dangereuses là-bas, + - mais rien qu'un aventurier ou un explorateur chevronné ne puisse gérer. Mais alors + - quelque chose s'est éveillé, ces anciennes constructions ont commencé à sortir du + - ground and the walls. Then these quakes started happening, it was weird, + - parce que vous ne pouviez les sentir que si vous étiez dans les ruines. Alors on ferme + - tout en bas, plus personne n'avait le droit d'accéder aux ruines. Quelques jours + - il y a quelques temps, j'ai rassemblé quelques-uns de mes meilleurs hommes et je les ai envoyés là-bas pour trouver la source + - de tout ça. Ils sont à peine revenus. Ils ont trouvé un &cÉlémentaire de terre&f haut + - au-dessus des piliers, au sommet une sorte de plate-forme. Ça devait être là + - dormant tout ce temps. Pas d'idée pourquoi il a décidé de se réveiller... + - Votre travail serait de descendre là-bas, de naviguer dans le labyrinthe et de mettre + - '&cL''Élémentaire de Terre&f dans un sommeil dont il ne se réveillera jamais.' + questAcceptDialog: + - '&a[Lutum Princeps]&f Vous pouvez vous rendre au labyrinthe en descendant l''escalier en spirale au milieu des ruines.' + - + - + - '&7&oJe devrais entrer dans le labyrinthe des &d&oRuines &7&o et tuer l'' &c&oÉlémentaire de la Terre&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f Je ne peux pas y croire, tu es de retour. Et en un seul morceau!' + - + - + - + - '&7&oJe dois parler à &a&oLutum&7&o de ma quête et du &d&oTemple du Sand&7&o.' +primis_main_quest_24: + customObjectives: + Objective1: + dialog: + - '&a[Navita]&f Vous êtes revenu! J''espère que vous avez de bonnes nouvelles.' + name: '&2Aller-retour' + questLore: + - Nous n'avions aucune idée de ce qui se passait... Oui, + - '&dTerravilla&f sera en mesure de promettre un peu' + - de nos forces pour votre cause. Je me demande si + - 'L''éveil de l''&cÉlémentaire de la Terre &favait quelque chose' + - à faire avec le &dTemple de sang&f. Nous allons + - préparer nos forces et attendre le signal de + - '&dPontis Mille&f.' + questAcceptDialog: + - '&a[Lutum Princeps]&f Donc vous allez à &dPontis Mille&f, assurez-vous de dire au &aShogun&f que &dTerravilla&f sera prêt à vous aider.' + - '&7&oJe devrais me rendre à &d&oPontis Mille&7&o et parler avec le &a&oShogun Navita&7&o.' + questCompleteMessage: + - '&a[Navita]&f Il est agréable d''entendre que le &dVillage de Glace&f a décidé de se joindre à notre cause ! Mais je ne m''attendais pas à ce que vous arriviez à convaincre &dTerravilla&f de s''engager pour notre cause également.' +primis_main_quest_25: + customObjectives: + Objective1: + dialog: + - '&a[Responsable de l''avant-poste]&fFILLER TEXT!' + name: '&2Vers l''avant-poste' + questLore: + - Il est si agréable de vous revoir l'ami! + - Pendant que vous étiez parti, nous préparions nos + - forces. Nous avons fait un &dAvant-Poste&f + - entre le &dTemple de Sang&f et &dPontis Mille&f. + - Vous devriez vous y rendre et faire votre rapport à + - '&al''Officier de l''Avant-poste &f. Ils vous informeront' + - comment nous allons procéder à l'assaut sur le + - '&dTemple du Sang&f.' + questAcceptDialog: + - '&a[Navita]&f L''avant-poste se trouve au sud de la ville. Il ne reste pas trop longtemps maintenant, avant l''arrivée des forces supplémentaires de &dTerravilla&f et du &dVillage de Glace&f.' + - '&7&oJe devrais aller à l'' &d&oAvant-poste&7&o et parler avec l''&a&oOfficier de l''Avant-poste&7&o.' + questCompleteMessage: + - '&a[Responsable de l''avant-poste]&f JE N''AI AUCUNE IDÉE DE QUOI DIRE CAR JE NE SUIS PAS FINI' +primis_main_quest_3: + name: '&cCamp de bandits !' + questLore: + - Un &dCamp de Bandit&f proche a été récemment aperçu + - et il essaye de nous démolir! + - Ils continuent à piller nos fournitures et à kidnapper nos villageois! + - Ils ont même pris l'&eHéritage de mon grand-père &f! + - Nous ne savons pas ce qu'ils veulent, mais nous avons besoin qu'ils disparaissent! + - Trouvez ce qu'ils font, traitez avec eux et apportez + - moi l'&eHéritage de mon grand-père&f! + questAcceptDialog: + - '&a[Chief Piscis]&f Le &dCamp de Bandits&f n''est pas trop loin si vous suivez la route!' + - + - + - Oh, et assurez-vous de rapporter l'&eHéritage de mon grand-père&f! + - '&7&oJe devrais aller au &dCamp de Bandits&7&o à proximité et le nettoyer.' + questCompleteMessage: + - '&a[Chef Piscis]&f Je vois que vous êtes de retour! Avez-vous de bonnes nouvelles?' + - '&7&oVous parlez du camp au &aChef Piscis&7&o et rendez &el''héritage&7&o.' + - + - + - + - + - '&7&oOn dirait que le &aChef Piscis&f est prêt à me dire comment sortir d''ici.' +primis_main_quest_4: + customObjectives: + Objective1: + dialog: + - '&a[Petrae]&f &2Chef Piscis&f vous a envoyé ? Malheureusement le passage est fermé, et l''&cÉlémentaire&f le garde...' + name: '&9Chemin des fleurs bleues !' + questLore: + - Nous devons rendre compte de nos constatations sur le + - '&dCamp de Bandit&f à &dGladius&f !' + - Le col de la montagne est gardé par un ancien, + - puissant &cGolem&f qu'il faut éviter à tout prix ! + - Suivez les &eFleurs bleues&f le long du chemin, + - ils vous mèneront à un passage secret + - à travers les montagnes ! + - Un guide de montagne vous attendra à la fin + - du chemin &9Fleur bleue&f! + questAcceptDialog: + - '&a[Chef Piscis]&f Le col de la montagne est gardé par un &cGolem&f extrêmement dangereux, que vous n''êtes probablement pas en mesure de vaincre en ce moment !' + - + - + - '&7&oJe devrais suivre le chemin &9&oFleur Bleue &7&o vers le &aGuide de Montagne&7&o !' + - '&7&oJe dois m''assurer de terminer toutes les affaires qui me restent avant de partir.' + - '&7&oAstuce : assurez-vous de suivre la quête pour faciliter la recherche de votre destination !' + questCompleteMessage: + - '&a[Petrae]&f Êtes-vous sûr de vouloir prendre le risque ? Je peux vous aider...' + - '&7&oOn dirait que &aPetrae&f a une demande pour moi.' +primis_main_quest_5: + name: '&5L''élémentaire de cristal' + questLore: + - Vous devez passer ? Mauvais timing, mon ami. + - Un &cÉlémentaire de cristal &fa envahi notre passage + - et le ferme. + - Si vous devez vraiment vous rendre à Gladius, + - vous devrez d'abord vaincre cet &cÉlémentaire&f ! + questAcceptDialog: + - '&a[Petrae]&f Vous cherchez à vaincre l''&cÉlémentaire de cristal&f ? Je ne peux que vous souhaiter bonne chance dans votre entreprise!' + - + - + - '&7&oOn dirait que je dois vaincre l''&cÉlémentaire de cristal&7&o.' + questCompleteMessage: + - '&a[Petrae]&f Exceptionnel ! Je vous ai vu vaincre le &cÉlémentaire de cristal&f, il y a clairement de la grandeur dans votre avenir !' + - Maintenant que nous sommes de l'autre côté, laissez-moi vous dire le chemin vers &dGladius&f ! +primis_main_quest_6: + customObjectives: + Objective1: + dialog: + - '&a[Filius] &fVous avez traversé la montagne ! Vous ne voyez pas cela tous les jours.' + - + - + - '&7&oIl semble que &aFilius&7&o peut m''aider à trouver le chemin de &dGladius&7&o.' + name: '&5La Ferme' + questLore: + - Le chemin vers &dGladius&f devrait être facile, mais avec + - toutes les perturbations que nous avons vues je soupçonne + - ce n'est peut-être pas si simple. + - Je suis en bons termes avec le &apropriétaire de la ferme&f + - en bas de la route. Si vous leur dites que je vous ai envoyé, je suis sûr + - ils vous diront comment atteindre &dGladius&f en toute sécurité et + - vous donner des nouvelles de la région environnante. + - Bonne chance dans vos voyages et faîtes attention à vous! + questAcceptDialog: + - '&a[Petrae]&f Dites simplement au propriétaire de la ferme&f que je vous ai envoyé, même si j''ai entendu dire que le propriétaire n''a pas été vu depuis un moment.' + - + - + - Voyages en toute sécurité ! + - '&7&oJe dois suivre le chemin vers la &dferme&7&o et parler à son &apropriétaire&7&o.' + questCompleteMessage: + - '&a[Petrae]&f Exceptionnel ! Je vous ai vu vaincre le &cÉlémentaire de cristal&f, il y a clairement de la grandeur dans votre avenir !' + - Maintenant que nous sommes de l'autre côté, laissez-moi vous dire le chemin vers &dGladius&f ! + - '&7&oJe devrais parler à &aFilius&7&o pour apprendre comment &dGladius&7&o, et peut-être parler à sa &aMère&7&o pour voir comment je peux aider.' +primis_main_quest_7: + customObjectives: + Objective4: + dialog: + - '&a[Général Hasta] &fJe n''arrive pas à croire que vous ayez dépassé les ennemis.' + - Vous êtes exactement le genre d'aide dont nous avons besoin en ce moment ! + - '&7&oOn dirait que je devrais parler au &aGénéral Hasta&7&o.' + name: '&5Le Chemin menant à Gladius' + questLore: + - Récemment, de la fumée a été aperçue au-dessus de la forteresse de &dGladius&f. + - Nous n'avons pas pu y aller et voir ce qu'il se passe + - car un &dBateau&f bloque actuellement le chemin. + - Nous avons été attaqués par un groupe de créatures ressemblant à des morts-vivants + - quand nous nous sommes approchés du &dBateau&f, alors nous avons fui. + - Je crains que vous ne deviez vous frayer un chemin à travers ce + - '&dBateau&f afin d''atteindre &dGladius&f. Je suis sûr qu''ils vous' + - récompenserons si vous aidez à réduire le nombre de &cMort-Vivants&f sur ce bateau ! + questAcceptDialog: + - '&a[Filius] Soyez prudent sur la route, il est clair que quelque chose s''est mal passé dans &dGladius&.' + - + - + - '&7&oJe devrais descendre le chemin vers &dGladius&7&o et éliminer quelques &cMarins Morts-Vivants&7&o sur le chemin.' + questCompleteMessage: + - '&a[Lord Hasta]&f Avez-vous été envoyé en renfort par Pontis Mille ? Où sont les autres ? Êtes-vous un messager ?' + - '&7&oJe devrait parler à &aLord Hasta&7&o.' +primis_main_quest_8: + name: '&5Retrouver Espoir' + questLore: + - Nous n'avons absolument pas vu venir cette invasion. + - Ils sont arrivés au milieu de la nuit, nous ont frappés fort et vite. + - Avant que nous nous en rendions compte, la moitié de la ville était envahie. + - Le moral est bas. Tout le monde ici a perdu quelqu'un. + - Malgré notre peine, nos propres proches défilent + - à travers les rues dans une moquerie de la vie elle-même. + - Nous devons nous rallier et remonter le moral, + - ou nous ne verrons pas une autre aube ! + - Retournez dans mon &dManoir&f, dans mon trésor se trouve un &eDocument&f + - de la plus haute importance. C'est une promesse écrite avec + - l'un des fondateurs de &dPontis Mille&f pour nous porter + - assistance en cas de besoin urgent. Le moment est venu. + - Récupérez le &eDocument&f, rapportez-le-moi et + - je vous promets que vous serez accueillis à &dPontis Mille&f à + - bras ouverts. Les soldats se battront jusqu'à leur dernier souffle + - si on leur donne ce petit espoir. + questAcceptDialog: + - '&a[General Hasta] La note est dans mon &dManoir&f. Assurez-vous de la ramener. Mes hommes ici ont aussi d''autres demandes en ville pour lesquelles vous pouvez aider, si possible.' + - '&7&oJe devrais vérifier ce dont les autres soldats ont besoin et me diriger vers le &dManoir&7&o à la sortie de la ville.' + questCompleteMessage: + - '&a[Lord Hasta]&f Exceptionnel ! Récupérer ce &eDocument&f en pleine guerre ? Si nous en avions 10 comme vous, la ville n''aurait jamais été prise !' + - Avant de partir, pensez-vous que vous pourriez me rendre un petit service personnel ? + - '&7&oOn dirait que &aLord Hasta&7&o veut me parler.' +primis_main_quest_9: + name: '&5Champion de Gladius' + questLore: + - Avant de me diriger vers &dPontis Mille&f, j'ai une + - faveur personnelle à demander. + - Notre &cChampion&f a été vu pour la dernière fois en train de combattre une horde de + - ennemis près de la &dStatue&f. + - Nous n'avons pas entendu parler de lui depuis le début de + - l'invasion et à ce stade nous craignons le pire. + - S'il vous plait, allez le voir. Si vous le trouvez et qu'il s'est + - transformé en l'un de ces morts-vivants... s'il vous plaît, libérez-le de sa malédiction. + questAcceptDialog: + - '&a[General Hasta] &fDirigez-vous vers la &dStatue&f. Je suis sûr que notre &cChampion&f sera facile à trouver.' + - '&7&oJe devrais aller à la &dStatue&7&o et enquêter sur ce qui est arrivé au &cChampion de Gladius&7&o.' + questCompleteMessage: + - '&a[General Hasta]&f Alors... Le pire est arrivé. Je vais m''assurer que ces bêtes paieront pour avoir tué mon fils.' + - 7&oOn dirait que &aLe Général Hasta&7&o a des choses à me dire. +primis_ogre_mines_clear: + name: '&2Problèmes de taille ogre' + questLore: + - Notre campement minier a été dépassé! + - Nous avons besoin d'aide! + - Je ne sais pas vraiment ce qui s'est passé, mais nous devons clarifier + - le campement et parlez à &aVieux Vetus&f ! + questAcceptDialog: + - '&a[Metus]&f Vous allez aider ? Dépêchez-vous, le campement est juste derrière !' + - '&7&oJe devrais dégager le campement et parler à &aVieux Vetus&7&o.' + questCompleteMessage: + - '&a[Vetus Fossores]&f Vous êtes venu aider ? Fantastique, nous avons absolument besoin d''aide en ce moment !' + - Voici un petit quelque chose pour votre aide à nettoyer le campement ! +primis_ogre_mines_lost_bretheren: + customObjectives: + Objective1: + dialog: + - '&a[Fortis Fossores] &fQue voulez-vous ? Quoi, &aFugit&f vous envoie ? Pourquoi? Les mines ont été envahies ? Ha, je n''avais même pas remarqué !' + - + - + - + name: '&5Frères Perdus' + questLore: + - La mine a été envahie par des &cOgres&7&o ! + - Dans la confusion j'ai été séparé de mon &aFrère&f dans les &dMines&f, + - et je crains pour sa sécurité ! + - C'est un homme un peu excentrique, très dévoué à l'exploitation minière. + - Vous saurez si vous l'avez vu ! + - S'il vous plaît, ramenez-le ici, ou au moins dites-moi s'il est en sécurité. + - Je ferai en sorte que cela en vaille la peine ! + questAcceptDialog: + - '&a[Fugit] &fVeuillez trouver mon &aFrère&f et assurez-vous qu''il va bien !' + - '&7&oJe trouve le &aFrère de Fugit&7&o dans les &dMines&7&o envahies par des &cOgres&7&o.' + questCompleteMessage: + - '&a[Fugit Fossores]&f Mon &aFrère&f a dit quoi ? Ah, typique de lui, trop concentré sur son travail pour s''apercevoir que tout l''endroit était pris d''assaut !' + - J'aurai une conversation sérieuse avec lui la prochaine fois que je le verrai ! + - + - +primis_ogre_mines_old_miner_quest: + name: '&2Pioche porte-bonheur' + questLore: + - Nous avons nous-mêmes un peu de cornichon! + - Alors que nous minions, nous sommes tombés sur une mystérieuse grotte pleine de monstres ! + - J'ai laissé tomber ma &ePioche&f préférée en courant, j'ai besoin de votre aide pour aller la chercher ! + - Je suis sûr que l'&cOgre Magi&f l'a ramassé lui-même. + - Récupérez ma &ePioche porte-bonheur&f de cette brute ! + - J'ai des bibelots pour toi à ton retour. + questAcceptDialog: + - '&a[Vetus Fossores]&f Cet &cOgre&f ne devrait pas être loin ! Vous pouvez le trouver dans la grotte à droite, avant la zone effondrée.' + - Il devrait avoir la &ePioche&f, les &cOgres&f aiment les choses brillantes après tout ! + - '&7&oJe devrais vaincre le &cChef Ogre&f.' + questCompleteMessage: + - '&aa[Vetus Fossores]&f Vous avez ma pioche chanceuse? Excellent!' + - Voici votre récompense ! +primis_pontis_groves_acrobatics: + customObjectives: + Objective1: + dialog: + - '&a[Idoneitatem Hominem]&f Félicitations !' + name: '&2Acrobatie' + questLore: + - Alors vous pensez que vous avez ce qu'il faut. + - Es-tu assez en forme, es-tu assez rapide, es-tu assez fort ? + - Plates-formes, lianes, hauteurs dangereuses. Tout ce que vous pourriez souhaiter ! + - Le défi ultime nous attend ! + - OK OK. Moi et mon &aFrère&f aurions pu nous ennuyer un peu et + - fait tout un cours d'acrobatie. + - Le but est d'aller de plateforme en plateforme en utilisant les &9Lianes&f et + - '&9Acrobaties&f et atteindre la fin du parcours.' + - + - + - Vous serez récompensé par un très joli &eObjet&f ! + questAcceptDialog: + - '&a[Posuere Hominem]&f Vous pouvez trouver le départ du parcours à la &dFin de ce Tunnel&f.' + - + - + - N'oubliez pas de parler à mon &aFrère&f à la fin du parcours pour la récompense ! + - '&7&oJe devrais me diriger vers le début du parcours.' + questCompleteMessage: + - '&a[Idoneitatem Hominem]&f Bien mérité ! J''espère que tu n''as pas triché ! Essayez de battre mon record si vous le pouvez.' +primis_pontis_groves_caught in the web: + name: '&2Pris dans la toile' + questLore: + - Ils ont donc un f &dNid&quelque part dans le &d§Bosquet&f. + - Cela expliquerait pourquoi leur population a grimpé en flèche. + - + - + - Ce serait bien si vous pouviez localiser le &dNid&f et le dégager. + - Nous allons vous faire de belles &eBottes en jambes d'Araignées&f en récompense! + questAcceptDialog: + - '&a[Roi Nemian]&f S''il y avait un &dNid&f, je suis sûr qu''il serait &9Entouré par des Toiles d''Araignées&f.' + - '&7&oJe devrais trouver le &dNid d''Araignées&7&o et le nettoyer.' + questCompleteMessage: + - '&a[Roi Nemian]&f Hah! Je savais que nous pouvions compter sur vous!' + - Voici vos belles bottes bien méritées! +primis_pontis_groves_elf_stole_from_my_shelf: + name: '&2Les elfes ont volé mon étagère' + questLore: + - Le désastre a frappé notre petit trou. + - Il n'y a pas si longtemps, notre belle maison a été attaquée par des &cBandits Elfes&f. + - Heureusement, nous n'étions pas à la maison à ce moment, donc personne n'a été blessé. + - Nous avons réussi à remplacer la plupart de nos biens. + - Mais ils ont pris mon &eHeritage Familial&f qui était sur l'étagère. + - Si vous seriez si gentil d'aller essayer de le récupérer pour moi, je serais très reconnaissant. + - Je fais les meilleurs ragoûts, je serais heureux d'en partager avec vous en récompense. + questAcceptDialog: + - '&a[Luxuria Gorgonius]&f L''&eHéritage&f est très précieux, je suis sûr qu''ils le gardent dans un &9Endroit Très Sécurisé&f.' + - '&7&oJe dois aller récupérer l''&eHéritage&7&o.' + questCompleteMessage: + - '&a[Luxuria Gorgonius]&f Oh mon dieu! Vous l''avez trouvé!' + - Je ne pourrais jamais assez vous remercier pour ce que vous venez de faire pour moi. + - '&7&oCe ragoût devrait me nourrir pendant un certain temps.' +primis_pontis_groves_into_the_next_hole: + customObjectives: + Objective1: + dialog: + - '&a[Phygia Gorgonius]&f Il est temps d''expulser ces &cElfes&f pour de bon !' + name: '&2Dans le trou suivant...' + questLore: + - Si vous êtes disponible, il y a encore beaucoup de travail à faire ici. + - Nous avons de sérieux problèmes avec les &cElfes&f, + - mais j'ai assigné &aPhygia&f pour gérer ces problèmes. + - Allez parler à &aPhygia Gorgonius&f dans le trou à côté de celui-ci. + - Ils pourront vous en dire plus et ce qu'il faut faire. + questAcceptDialog: + - '&a[Roi Nemian]&f Le trou juste à côté de celui-ci, ne peut pas le rater !' + - '&7&oJe devrais aller parler à &aPhygia Gorgonius&7&o.' + questCompleteMessage: + - '&a[Phygia Gorgonius]&f Parlons...' + - '&7&oJe devrais écouter &aPhygia Gorgonius&7&o.' +primis_pontis_groves_lighthouse_1: + customObjectives: + Objective1: + dialog: + - '&a[Alanus Secundas] &fLe &dBosquet&f vous a-t-il envoyé ?' + name: '&2Nourrir les malades' + questLore: + - Vagabond pourrais-je vous demander une simple faveur? + - + - + - Mais depuis le début des problèmes, nous ne pouvions pas quitter notre &dBosquet&f. + - Vous seriez si aimable d'apporter à la famille leur dernier lot de nourriture. + - Ce serait bien si vous pouviez vous dépêcher, cela fait un certain temps que la dernière livraison a été effectuée. + questAcceptDialog: + - '&a[Roi Nemian]&f Lorsque vous sortez du trou, le &dPhare&f est tout droit devant et un peu à gauche.' + - '&7&oJe devrais aller au &dPhare&7&o.' + questCompleteMessage: + - '&a[Alanus Secundas]&f Je suis si reconnaissant ! Nous commencions à manquer de nourriture.' + - Êtes-vous occupé ? + - '&7&oOn dirait qu''&aAlanus&7&o veut me parler.' +primis_pontis_groves_lighthouse_2: + customObjectives: + Objective1: + dialog: + - '&8[Jeeves]&fOh, re-bonjour !' + - '&8[Jeeves]&f Ils n''ont plus besoin de nourriture supplémentaire ? J''étais sur le point d''aller faire les courses.' + - '&8[Jeeves]&f C''est si gentil à vous de venir ici et de me le faire savoir.' + name: '&2Ne demandez pas à Jeeves' + questLore: + - Euh, avant que tu viennes. Jeeves le Marchand Ambulant s'est arrêté. + - Nous lui avons demandé s'il pouvait aller nous chercher de la nourriture. + - + - + - + - + questAcceptDialog: + - '&8[Alanus Secundas]&f Lorsque vous sortez de l''habitation, le phare est tout droit et un peu à gauche.' + - '&8&oJe devrais aller au Phare.' + questCompleteMessage: + - '&8[Alanus]&f Vous lui avez fait savoir ? Bien bien !' + - '&8&oOn dirait qu''Alanus est assez nourri.' +primis_pontis_groves_population_control: + name: '&2Contrôle de population !' + questLore: + - Oh, je suis si heureux que quelqu'un soit enfin arrivé pour nous aider. + - Nous avons un gros problème d'arachnides dans notre petit bois. + - Il y a tellement d'araignées de nos jours que vous ne pouvez même pas + - faire une belle promenade du soir sans l'une des méchantes bougresses + - vous saute dessus depuis l'ombre. + - Il est clair que leur nombre a sérieusement besoin d'être réduit. + - Oh ! Veuillez m'apporter toutes les pattes d'araignées qui sont encore en bon état. + - Nous les utilisons pour fabriquer de petites grues et des pinces. + questAcceptDialog: + - '&8[King Nemian]&f Vous les trouverez cachés sous l''ombre des arbres.' + - '&8&oJe dois trouver des Rampantes Forestières et les tuer.' + questCompleteMessage: + - '&8[King Nemian]&fC''est bon de te voir revenir, et avec plein de jambes en plus !' + - '&8[King Nemian]&f Vous pensez que leur nid pourrait être proche ? Parlons plus de cela' +primis_pontis_groves_tree_climbing_elf_bandits: + name: '&2Elfes Bandits Grimpants Des Arbres !' + questLore: + - + - + - Pas comme si les &cAraignées&f suffisaient, + - maintenant ces noix de caca amoureuses de l'ombre ont décidé de s'installer dans nos arbres ! + - + - + - + - + - Elles se fraient un chemin avec leur supériorité numérique. + - Eh bien, elles ont quelque chose qui va bien, + - un regard sur vous et je peux dire que vous pouvez manipuler quelques géants de pierre ! + - Je suis sûr que certains elfes ne seront pas vraiment un problème pour vous. + - + - + questAcceptDialog: + - '&a[Phygia Gorgonius]&f Je suis sûr que vous en trouverez beaucoup si vous trouvez un endroit ombragé et que vous levez les yeux, difficile de manquer leurs cabanes dans les arbres.' + - '&7&oJe devrais aller m''occuper de ces &cElfes&7&o avant que &aPhygia&7&o ne s''enflamme de rage.' + questCompleteMessage: + - '&a[Phygia Gorgonius]&f Mon ami ! HAHA ! Tellement bon de vous revoir !' + - + - + - '&7&oLes elfes ne dérangeront plus jamais &aPhygia&7&o.' +primis_pontis_mille_fields_berry_crazed_wolf: + name: '&2Loups fous de Baies' + questLore: + - Oh gosh, je n'ai aucune idée de ce qui ne va pas avec ces &cChiens de Roche&f. + - Ils continuent à entrer dans la &dFerme de Baie&f pendant que je suis loin ou durant mon sommeil. + - Vous croiriez qu'ils viennent ici pour manger les baies, mais non! + - Ils chargent leur bouche avec eux et les transportent + - quelque part dans la forêt. + - Je veux dire qu'ils sont des &cChiens&f! Pourquoi vole-t-on même des baies. + - Eh bien, je suppose que ce n'est pas grave, j'ai une faveur à demander. + - Pourriez-vous nettoyer la + - '&9Zone derrière la ferme&f,' + - et rapporter mes &eBaies volées&f. + - J'ai beaucoup de tartes à faire et les baies qu'ils ont volées étaient mûres et prêtes. + questAcceptDialog: + - '&a[Dordalus Nasica]&f Je n''ai vu que les &cChiens de Roche&f voler les baies.' + - '&7&oJe devrais tuer les &c&oChiens de Roche de Sequoïa&7&o et ramasser les &e&oBaies volées&7&o qu''ils vont lâcher.' + questCompleteMessage: + - '&a[Dordalus Nasica]&f Oh mon, vous l''avez fait. Pourrais-je vous ennuyer avec une autre petite faveur.' + - '&7&o On dirait que &d&oMilonia&7&o a plus de travail pour moi.' +primis_pontis_mille_fields_camping_hunters: + customObjectives: + Objective1: + dialog: + - '&a[Scribonia Ingenvinus]&f Oui?' + name: '&2Chasseurs de camp' + questLore: + - J'espère que je ne vous dérange pas. Vous ressemblez à une personne qui écouterait un plaidoyer. + - Nous n'avons pas grand-chose à faire ici dans les &dBidonvilles&f, + - la plupart d'entre nous aiment se promener dans les &dChamps&f pour passer le temps. + - Malheureusement, cela s'est arrêté après qu'un groupe + - de &cMonstres&f a commencé à circuler autour des &dChamps&f. + - Nous avons entendu que certains chasseurs ont fait un &dCamp&f près des &dChamps&f. + - Si vous pouviez y aller et leur parler et leur demander de tuer ces &cMonsteres&f... + questAcceptDialog: + - '&a[Augustina Verrucosis]&f Leur &dCamp&f devrait se trouver quelque part au nord-ouest d''ici.' + - '&7&oJe dois aller dans le &d&ocamp des Chasseurs&7&o.' + questCompleteMessage: + - '&a[Scribonia Ingenvinus]&f Aider le &dBidonville&f avec son problème de &cMonstre&f?' + - Parlons davantage. + - '&7&oJe devrais parler à &a&oScribonia&7&o et entendre ce qu''elle a à dire.' +primis_pontis_mille_fields_camp_hunter_three_times_hunter: + name: '&2Chasseur trois fois chasseur' + questLore: + - Vous avez donc trouvé &aVolumnia&f. Merci aux grands chasseurs d'avoir bien fait. + - Depuis que vous avez aidé &aVolumnia&f et que vous avez prouvé votre gentillesse. + - Que diriez-vous d'un défi amical ? Je serais prêt à vous offrir une plaisante + - armure de qualité si vous surmontez le défi et revenez victorieux. + - Le défi consiste à chasser + - '&cTrois grandes bêtes&f dispersées à travers Pontis.' + - '&c Furiosa, la Morue Bestiale&f qui nage sous un pont où se trouvent deux montagnes.' + - '&cBête Rampante Megdun&f qui sommeille au sommet d''un bois couvert de soleil.' + - Dansant entre deux sommets occidentaux, vous trouverez la + - '&cBête Empaleuse Uladzimir' + - + - + questAcceptDialog: + - '&a[Milonia Majus]&f Prenez cet appareil, il vous guidera approximativement vers leur emplacement.' + - '&7&o Je devrais aller défier les &c&oTrois Grandes Bêtes&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f Vous êtes revenu. Et vous avez apporté les trois objets que j''ai demandés comme preuve.' + - + - + - Assez parlé de moi, voici votre récompense comme promis ! + - '&7Vous remettez le dispositif de suivi des bêtes.' + - '&a[Milonia Majus]&f J''avais presque oublié ce truc, merci !' + - Jusqu'à ce que nous nous retrouvions aventurier ! +primis_pontis_mille_fields_do_it_yourself: + name: '&2Faites-le vous-même' + questLore: + - Traiter avec les &cMonstres&f ? Eh bien, je peux vous dire que nous l'avons déjà fait. + - Ils sont tout simplement trop nombreux et nous pas assez. + - Nous avons commencé à les chasser dès que nous avons installé notre &dCamp&f ici. + - Mais leur nombre ne semble tout simplement pas diminuer. + - Et ce n'est même pas le pire. + - Nous avons découvert une tanière et la grosse et vieille &cBête&f qui va avec ! + - Eh bien, puisque vous êtes arrivé à notre &dCamp&f en un seul morceau, + - je suppose que vous êtes tout à fait capable vous-même. + - Et si vous rejoigniez la chasse ? Qu'en dites-vous ? + questAcceptDialog: + - '&a[Scribonia Ingenvinus]&f Je savais que vous diriez oui ! Je vois que vous êtes déjà bien équipé.' + - OK, c'est ce que je veux que vous fassiez. + - + - + - Deuxièmement, j'ai besoin que vous tuiez 5 &cLonghorns&f et 6 &cShorthorns&f. + - Entendu ? Bien. Faites-moi un rapport lorsque vous avez terminé. + - '&7&oJe devrais tuer la &c&oGrosse et Vieille Bubba&7&o et tuer 5 &c&oLonghorns&7&o et 6 &c&oShorthorns&7&o.' + questCompleteMessage: + - '&a[Scribonia Ingenvinus]&f Je dois dire que je suis assez impressionnée.' + - De toute évidence, vous êtes bien plus que simplement "capable". + - Merci pour l'aide, nous allons pouvoir nous occuper du reste. + - Jusqu'à ce que nous nous revoyions, grand chasseur. +primis_pontis_mille_fields_feeding_the_hungry: + customObjectives: + Objective3: + dialog: + - '&7Vous remettez le pain et la farine.' + - '&a[Rufia Tertulus]&f Je ne sais pas quoi dire. Mes enfants seront tellement heureux !' + - '&7La femme s''incline devant vous avec une profonde gratitude.' + Objective4: + dialog: + - '&a[Fabia Praetextus]&f Je suppose que les fantasmes se réalisent parfois. Je vous suis éternellement reconnaissante.' + Objective1: + dialog: + - '&a[Lena Lucan]&f Du pain frais ! Je ne vous remercierai jamais assez !' + Objective2: + dialog: + - '&a[Tranio Florens]&f Ouah! La journée ne fait que s''améliorer !' + - Merci pour la farine, âme charitable. + name: '&2Nourrir les affamés' + questLore: + - Je peux sentir un bon cœur battre dans votre poitrine. + - Tout le monde n'a pas la même chance que vous et moi. + - Il y a des pauvres âmes qui vivent dans les &dBidonvilles de Pontis Mille&f. + - Cela fait maintenant un moment que je travaille + - au fil du temps pour produire des surplus de pain et de farine. + - Accepteriez-vous de prendre ces sacs de blé et ces piles de pain. + - Pour ensuite voyager avec eux dans les &dBidonvilles&f et les distribuer à ceux qui en ont besoin ? + - Je fais ça depuis un moment maintenant mais je me suis blessé au pied gauche, + - donc je ne peux pas faire beaucoup de marche en ce moment. + questAcceptDialog: + - '&a[Daemones Maritialis]&f J''aimerais qu''il y ait plus de gens comme vous dans le monde.' + - D'ici, les &dBidonvilles&f sont tout droit au Nord, vous pouvez voir les bâtiments au loin. + - '&7&oJe devrais aller dans les &dBidonvilles&7&o et distribuer la nourriture à ceux qui en ont besoin.' + questCompleteMessage: + - '&a[Augustina Verrucosis]&f &2Daemones&f vous a envoyé ici, n''est-ce pas.' + - + - + - Merci étranger, ma famille ne l'oubliera pas. +primis_pontis_mille_fields_fruity_hound: + name: '&2Chien Fruité' + questLore: + - Puisque vous êtes mon agent de récupération de baies NUMÉRO UN, + - j'ai une autre tâche pour vous. + - Comme vous pouvez le voir, nous cultivons de très grosses baies sur notre + - petite &dFerme à Baies&f ici. + - Il y avait une + - '&eBaie Spécifique&f que je cultivais pour un concours.' + - Mais alors que je marchais vers la &dFerme à Baies&f, j'ai vu un + - '&cChien de Roche Fruité&f sauter vers le buisson tenant ma précieuse baie.' + - Il l'a arrachée et l'a emporté. + - Ses mâchoires retenaient la baie par sa tige donc + - elle devrait encore être en un seul morceau, je l'espère. + - Si tu vas tuer la bête et me ramène la + - chère &eBaie de Concours&f j'aurais une belle + - récompense qui vous attend. + questAcceptDialog: + - '&a[Dordalus Nasica]&f Je crois avoir vu le &cChien&f se diriger vers les &dSéquoias&f, au Nord-Ouest de la ferme.' + - '&7&oJe devrais aller tuer le &c&oChien Fruité&7&o et voir si la &e&oBaie de Concours&7&o est toujours en un seul morceau.' + questCompleteMessage: + - '&a[Dordalus Nasica]&f OUI ! C''est ma chérie ! Fine et entière, même pas de salive dessus !' + - + - + - + - +primis_pontis_mille_fields_not_on_my_farm: + name: '&2Pas dans ma ferme !' + questLore: + - Ces derniers temps, tous ces &cRats&f me rendent fou. + - Ils continuent d'entrer dans notre petite ferme et de manger tous nos produits ! + - Possible que vous y alliez pour réduire un peu leur nombre ? + - Attention, il y en a tellement. + - Oh, j'ai failli oublier de vous le dire. + - Si vous voyez un &cGros Rat Bien Nourri&f, ne vous en souciez pas. + - Il est devenu si gros et si gras qu'il vous faudrait des jours pour le tuer. + questAcceptDialog: + - '&a[Milonia Majus]&f Je suis sûre que vous avez déjà remarqué qu''ils aiment trainer autour du chemin.' + - '&7&oJe devrais aller tuer les &cRats&7&o qui traînent sur le chemin qui mène à &dPontis Mille&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f Merci beaucoup ! Nous pouvons recommencer à faire de délicieux produits maintenant.' +primis_pontis_mille_fields_surprise_me_with_flour: + customObjectives: + Objective3: + dialog: + - '&a[Adulescens Lupis]&f J''ai entendu dire que la ferme avait des problèmes &cRat&f. Trois sacs de farine qui arrivent, pas de problème !' + Objective1: + dialog: + - '&a[Dinia Niraemius]&f Farine ? Bien sûr, un sac de farine à venir !' + Objective2: + dialog: + - '&a[Daemones Maritialis]&f La ferme a besoin de plus de farine hein ? Et voilà, deux sacs !' + name: '&2Surprenez-moi avec de la farine' + questLore: + - Waouh, vous êtes plutôt efficace. Si je pouvais vous déranger avec une autre tâche. + - Les &cRats&f ont complètement ruiné notre stock actuel de farine. + - Nous avons donc besoin d'un tout nouveau lot de farine. + - Les &dMoulins à Vent&f devraient en avoir beaucoup. + - Allez chercher la farine et déposez-la ici avec moi. + - Je paierai d'une bonne pièce pour ce service ! + questAcceptDialog: + - '&a[Milonia Majus]&f Vous devrez collecter la farine des trois &dMoulins&f.' + - '&7&oJe dois me rendre aux trois &dMoulins à Vent&7&o et récupérer la farine qu''ils produisent.' + questCompleteMessage: + - '&a[Milonia Majus]&f Cela devrait nous durer un bon bout de temps !' + - Espérons que notre pâte de farine ne devienne pas trop grosse, héhé. +primis_pontis_mille_fields_wellness: + name: '&2Bien-être' + questLore: + - Suis-je heureux de vous voir en ce moment ! + - Le &cRat Cauchemardesque&f m'a tendu une embuscade pendant que je descendais dans le puits. + - Je me suis blessé au bras et aux jambes en tombant. + - Argh, j'ai encore un peu de sa salive toxique dans les yeux. + - Heureusement, j'ai réussi à ramper sur ce petit + - rebord avant qu'il ne puisse venir m'achever. + - Comme c'est embarrassant, je ne sais pas ce qui me fait le plus mal en ce moment, mon corps ou ma fierté. + - J'ai du + - '&eMatériel de Premiers Secours&f' + - dans mon coffre au &dCamp des Chasseurs&f. + - Cela vous dérangerait-il de me le rapporter ? Oh, et assurez-vous de ne le dire à personne + - un mot de ce que vous avez vu ici. + - '... a failli mourir dans un puits... c''est un chapitre de ma vie que je vais devoir effacer...' + questAcceptDialog: + - '&a[Volumnia Zoilus]&f Le &dCamp des Chassuers&f est tout droit au Sud, impossible de le rater, cherchez des tentes.' + - '&7&oJe dois aller chercher l''&e&oÉquipement de Premiers Secours&7&o pour &a&oVolumnia&7&o au &d&oCamp des Chasseurs&7&o.' + questCompleteMessage: + - '&a[Volumnia Zoilus]&f Déjà de retour ? Passez-moi l''équipement.' + - Ne vous inquiétez pas pour moi, je vais me rafistoler en un rien de temps. + - Merci pour tout ! Vous savez, vous m'avez sauvé la vie ! +primis_pontis_mille_field_check: + customObjectives: + Objective1: + dialog: + - '&a[Augustina Verrucosis]&f Oh, c''est assez important ! J''en informerai les habitants.' + - Merci de nous avoir remis ces importants documents. + name: '&2Contrôle du Terrain' + questLore: + - Si je pouvais vous déranger avec des tâches de livraison. + - J'ai ici des documents importants qui doivent être remis au + - '&dBidonvilles&f et à la &dFerme des Champs&f.' + - Le soldat qui devait venir les chercher n'est pas encore arrivé. + - Et c'est urgent, nous ne pouvons pas nous permettre d'attendre plus longtemps. + - Malheureusement, j'ai la consigne stricte de ne pas quitter mon poste. + - Si vous pouviez le faire pour moi, cela nous aiderait beaucoup. + questAcceptDialog: + - '&a[Godefridus Novation]&f Vous allez le faire ? Excellent !' + - Vous pouvez suivre le &9Chemin Jaune&f pour vous rendre dans les bidonvilles. + - La &dFerme des Champs&f est juste au-delà des bidonvilles, il suffit de suivre le chemin. + - Oh ! Et attention aux rats des champs ! + - '&7&oJe devrais me diriger vers les &d&oBidonvilles&7&o puis vers la &d&oFerme des Champs&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f Des documents ? Laissez-moi les voir. Hmmm, ça a l''air officiel.' + - Merci d'être venu jusqu'ici pour les livrer. + - '&7&oOn dirait que &a&oMilonia&7&o a besoin de mon aide avec les rats...' +primis_pontis_mille_fresh_rats_coming_up: + customObjectives: + Objective1: + dialog: + - '&a[Garde d''élite]&f Beaucoup de rats à l''intérieur.' + name: '&2De nouveaux rats à venir' + questLore: + - Pas de nourriture pour chat mais je pense que je peux aider ouais + - trouvez quelque chose de mieux... + - J'ai entendu dire que + - 'deux &aGardes&f avaient affaire à' + - une infestation de rats dans les parties basses de la ville. + - Descendez là-bas et vous pourrez peut-être obtenir + - 'des &cRats&f pour votre ami chat.' + questAcceptDialog: + - 'Je devrais vérifier la partie basse de la ville et voir si je peux trouver les &a&oGardes d''élite&7&o.' + questCompleteMessage: + - '&a[Mew Meowzer]&f Miaouh. MIAOUH ! Grrrrr.' + - '&7&oJe devrais laisser le chat profiter de son repas en paix.' + - '&7&oIl semble avoir laissé tomber quelque chose, hmm...' +primis_pontis_mille_hungry_friend: + customObjectives: + Objective3: + dialog: + - '&a[Melaenis Gelasius]&f De la nourriture pour chat ? Où diable avez-vous réussi à trouver un chat ici...' + - Non, je ne sais pas où trouver de la nourriture pour chat. + Objective4: + dialog: + - '&a[Sulpicio Panthera]&f J''aimerais pouvoir aider, désolé.' + Objective1: + dialog: + - '&a[Royal Guard]&f Est-ce que j''ai l''air de quelqu''un qui suit à la trace de la nourriture pour chat ?...' + Objective2: + dialog: + - '&a[Tyndarus Faustinius]&f Désolé, je n''en ai aucune idée.' + Objective5: + dialog: + - '&a[Tyndarus Columbanus]&f Nous avions l''habitude d''avoir de la nourriture pour chat quelque part ici, mais dieu sait ce qui lui est arrivée...' + name: '&2Ami Affamé' + questLore: + - '&7&oQu''est-ce qui ne va pas mon petit.' + - '&a[Mew Meowzer]&f Miaouh !' + - '&7&o Tu as faim ? Est-ce que le' + - '&7&opetit veut de la nourriture ?' + - '&a[Mew Meowzer]&f MIAOUUUUH !!!' + - '&7&oVoyons si nous pouvons' + - '&7&ot''apporter de la nourriture.' + questAcceptDialog: + - '&7&oJe devrais voir si quelqu''un dans la ville sait où trouver de la nourriture pour chat.' + questCompleteMessage: + - '&a[Modestus Aper]&f De la nourriture pour chat ? Je n''en sais rien. Mais...' + - '&7&oOn dirait que &a&oModestus&7&o pourrait savoir quelque chose...' +primis_pontis_mille_late_delivery: + name: '&2Livraison tardive' + questLore: + - J'ai commandé des &eFilets de Pêche&f à + - '&dGladius&f qui ne sont pas encore arrivés. Je me demande' + - s'il est arrivé quelque chose à + - la cargaison. Si vous êtes d'accord, je vous paierais + - un petit supplément si vous pouviez aller voir ce + - qu'il est arrivé à l'expédition et obtenir le + - '&eDes Filets de Pêche&f pour moi.' + questAcceptDialog: + - '&a[Delphium Calpurnius]&f La dernière fois que j''ai entendu dire que mon envoi de &eFilets de pêche&f devait se diriger vers &dGladius&f.' + - '&7&oJe dois aller chercher &d&oGladius&7&o pour l''expédition de &e&oFilets de pêche&7&o de &a&oDelphium&7&o.' + questCompleteMessage: + - '&a[Delphium Calpurnius]&f Ce sont les &eFilets de Pêche&f ! Merci beaucoup !' + - '&a[Delphium Calpurnius]&f J''y ai investi une grande partie de mes économies ! Je ne sais pas ce que j''aurais fait si vous ne les aviez pas trouvés.' +primis_pontis_mille_let_them_know: + customObjectives: + Objective3: + dialog: + - Alors Fortes vous envoie ? Je vois. + - Votre aide serait très appréciée, aidez-moi et mes forces seront prêtes. + Objective1: + dialog: + - Alors Fortes a décidé d'agir. + - Aidez-moi à terminer ma tâche, et mes forces seront prêtes. + Objective2: + dialog: + - Alors Fortes a décidé d'agir. + - Si vous pouviez m'aider dans cette tâche, mes forces seraient prêtes. + name: '&2Faites-leur savoir !' + questLore: + - Je suis désolé que nous ne puissions envoyer de l'aide à &dGladius&f tout de suite. + - Depuis l'arrivée de ce nouveau &cConseiller&f, notre dirigeant n'est plus lui-même. + - Si vous pouviez contacter les &aGénéraux&f de la ville et leur faire savoir + - que &dGladius&f a besoin d'aide, nous pourrions peut-être faire quelque chose à ce sujet. + - Mais pas avant d'aborder les problèmes existants. + - + - + - Allez leur parler et revenez me dire qu'ils ont compris le message. + - Je vous récompenserai pour votre temps. + questAcceptDialog: + - '&a[Fortes]&f Suivez le &9Chemin Orange&f depuis la pièce principale pour trouver le &aGénéral Bromia&f.' + - '&a[Fortes]&f Au bout du &9Chemin Jaune&f vous trouverez le &aGénéral Rogerius&f.' + - '&a[Fortes]&f Au bout du &9Plus Court Chemin Violet&f, vous trouverez le &aGénéral Cylindrus&f.' + - '&7&oJe dois parler aux trois &a&oGénéraux&7&o.' + questCompleteMessage: + - '&a[Fortes]&f Vous avez réussi à les contacter ? Excellent !' + - '&a[Fortes]&f Voici votre récompense. Ne dépensez pas tout au même endroit.' +primis_pontis_mille_lighthouse_1: + customObjectives: + Objective1: + dialog: + - "&8[Hegio Remus]&f \nUne autre lettre ? Merci de me l'avoir apporté." + name: '&2Une livraison rapide' + questLore: + - Avant d'aller quelque part, pourriez-vous me remettre cette lettre ? + - Vous pouvez trouver le gentleman, il faut aller au sommet du Phare. + - Ne vous inquiétez pas, le Phare est juste derrière moi par cette porte. + questAcceptDialog: + - '&8[Fortes]&f Merci.' + - '&8&oJe devrais aller parler au Gardien du Phare de Pontis Mille.' + questCompleteMessage: + - '&8[Hegio Réus]&f Hey, avez-vous une seconde?' + - '&8&oOn dirait que Hegio Remus a besoin que je lui parle.' +primis_pontis_mille_lighthouse_2: + customObjectives: + Objective1: + dialog: + - '&a[Jeeves]&f Oh, nous nous rencontrons à nouveau. C''est bon de vous voir.' + - Vous avez quelque chose pour moi ? Oh, wow...c'est tout à fait une liste de courses. + - Je ferai renvoyer les articles à &aHegio&f dès que possible. + - Merci pour la visite. J'espère que nous nous reverrons. + - '&7&oJe devrais faire savoir à &aHegio&7&o que j''ai remis la note.' + name: '&2Demander à Jeeves' + questLore: + - Accepteriez-vous de prendre le portail et remettre une note à mon bon ami &aJeeves&f. + questAcceptDialog: + - '&a[Hegio]&f Un ami très apprécié.' + - '&7&oJe devrais aller parler à &aJeeves&f au &dVillage de Caeruleum&7&o.' + questCompleteMessage: + - '&a[Hegio]&f Vous avez livré la note ? Excellent !' + - Ici, vous pouvez avoir un peu de ce &eRagout de Lapin&f que je garde dans ma poche arrière. +primis_pontis_mille_mines_goblined_up_in_the_maze: + customObjectives: + Objective3: + dialog: + - '&a[Hurt Guard]&f Je suis si heureux de vous voir !' + Objective1: + dialog: + - '&a[IGarde Blessé]&f Dieu merci !' + Objective2: + dialog: + - '&a[Garde Blessé]&f Enfin, les secours sont là !' + name: '&2Gobelins dans le labyrinthe' + questLore: + - Si je pouvais vous déranger une seconde. + - Puisque vous allez déjà entrer dans les &dMines&f, il + - serait formidable si vous pouviez nous aider à résoudre certains problèmes. + - Il nous manque trois &aGardes&f qui ont été envoyés + - dans les mines pour traquer un &cGobelin Maudit&f. + - Je crains qu'il ne leur soit arrivé quelque chose. + - Ce &cGoblin Maudit&f est censé + - se cacher dans une sorte de &9Labyrinthe&f dans les &dMines&f. + - Pourriez-vous localiser les &aGardes Perdus&f et + - me rapporter la preuve de la mort des &cGobelins&f. + questAcceptDialog: + - '&a[Centurion]&f Essayez de ne pas vous perdre dans le &9Labyrinthe&f.' + - Que la chance soit de ton côté guerrier ! + - '&7&oJe devrais m''aventurer dans les &d&oMines&7&o et localiser le &9&oLabyrinthe&7&o.' + questCompleteMessage: + - '&a[Centurion]&f Ils sont vivants, excellent, nous allons envoyer des soldats pour les faire sortir au plus vite.' + - Je vois que vous avez apporté la preuve de la mort des &cGobelins&f, bien joué. + - '&7&oEspérons que les gens restent à l''écart du &9Labyrinthe&7&o à l''avenir.' +primis_pontis_mille_serious_sewage: + customObjectives: + Objective3: + dialog: + - '&a[Michelangelo]&f Dites à ce vieil homme que tout est en ordre !' + Objective4: + dialog: + - '&a[Raphael]&f Dites à Rogerius que je suis en vie et que je vais bien !' + Objective1: + dialog: + - '&a[Donatello]&f Vous pouvez dire au Général que je vais très bien !' + Objective2: + dialog: + - '&a[Leonardo]&f Le Général ne devrait pas s''inquiéter, je vais bien !' + name: '&2Egouts d''Eaux Usées' + questLore: + - Si vous êtes à la hauteur de la tâche, alors je pourrais utiliser votre aide. + - + - + - + - + - Ils ont un chef, je pense qu'il s'appelle &cShreepper&f ou quelque chose. + - Assurez-vous de vous débarrasser de lui, un serpent sans sa tête n'est pas une menace. + - Si vous pouviez aller là-bas et réduire le nombre de bestioles et de fauteurs de troubles + - alors cela me permettrait d'assigner mes forces à des tâches plus importantes... + - Nous avions également envoyé &a4 Agents&f là-bas, je ne les ai pas encore entendus. + - + - + - Il semble également que j'ai égaré mes &eClés d'égout&f personnelles + - si vous pouviez les récupérer aussi, ce serait génial. + questAcceptDialog: + - '&a[Rogerius]&fVous pouvez accéder au &dÉgouts&f en allant à la fontaine, puis un peu au sud-est.' + - + - + - '&7&oJe dois retrouver mon chemin dans les &dÉgouts&7&o et compléter les tâches.' + questCompleteMessage: + - '&a[Rogerius]&f Vous avez terminé tout ce que j''ai demandé ? Si seulement j''avais 10 hommes de plus comme vous...' +primis_pontis_mille_star_gazing: + customObjectives: + Objective1: + dialog: + - '&a[Virgo Dexippus]&f Oui, qu''est-ce que c''est?' + name: '&2Observation des étoiles' + questLore: + - Vous avez tant fait pour cette ville et ses habitants. + - Avoir aidé les trois &aGénéraux&f et nettoyé les zones autour de &dPontis Mille&f + - a libéré une grande partie de nos forces et de nos ressources. + - Nous sommes maintenant en mesure d'envoyer nos forces pour aider &dGladius&f. + - Mais avant d'agir, je voudrais que vous fassiez une dernière chose. + - Vous devriez aller parler avec l'&aObservateur d'Etoiles&f. + - C'est en ce qui concerne notre histoire perdue et les &cÉlémentaires&f. + - L'&aObservateur d'Etoiles&f pourra vous en dire plus une fois que vous lui aurez parlé. + - Prenez cette note scellée et montrez-leur. + questAcceptDialog: + - '&7[Fortes Bellator]&f Vous pouvez trouver l''&aObservateur d''Étoiles&f à l''&dObservatoire&f.' + - + - + - '&7&oJe devrais parler avec l''&aObservateur d''Étoiles&7&o à l''&dObservatoire&7&o.' + questCompleteMessage: + - '&a[Virgo Dexippus]&f Le &aMajor&f vous a envoyé? Ça doit être important.' + - '&7&oJe devrais parler à &a&oVirgo&7&o.' +primis_pontis_mille_stay_a_while_and_listen: + name: '&2Reste un moment et écoute' + questLore: + - Donnez-moi la note. Laissez-moi jeter un œil... + - Nous avons été autorisés à partager des informations importantes + - avec vous concernant notre passé. + - Vous avez dû faire quelque chose de très important, + - cette information n'est généralement partagée qu'avec les gens haut placés. + - '&aStella&f partagera avec vous ce que nous avons découvert.' + questAcceptDialog: + - '&a[Virgo Dexippus]&f Parlez à &aStella&f et &9Cliquez sur l''épée&f pour commencer à écouter.' + - '&7&oJe devrais parler à &aStella&7&o et commencer le &9Défi Arène &7&o.' + questCompleteMessage: + - '&a[Virgo Dexippus]&f Ne partagez pas cette information avec quiconque.' + - '&7&oC’était une histoire.' +primis_pontis_mille_the_groves_call: + customObjectives: + Objective1: + dialog: + - '&a[Roi Nemian]&f &2Le Général Bromia&a vous a envoyé?' + - Excellent, je savais que nous pouvions compter sur lui. + name: '&2L''appel des bosquets !' + questLore: + - Il est de notre devoir de protéger le &dBosquet&f contre toute menace. + - '&aLe Roi Nemian&f du &dBosquet&f a envoyé une demande d''aide.' + - Des bestioles maladroites sont venues au &dBosquet&f et d'autres + - envahisseurs prennent le contrôle des arbres. + - Si vous pouviez aller là-bas et résoudre ces problèmes + - alors mes forces seront libres de venir à l'aide de &dGladius'&f + questAcceptDialog: + - '&a[Bromia]&f Les &dBosquets&f sont situés au nord de la ville.' + - Il y a un sentier à travers la montagne, sous les mines. + - '&7&oJe devrais parler à &aRoi Nemian&7&o.' + questCompleteMessage: + - '&a[Roi Nemian]&f Vous êtes arrivé juste à temps!' +primis_pontis_mille_to_lycan_or_not_to_lycan: + name: '&2To lycan or not to lycan' + questLore: + - Pas sûr de savoir comment une seule personne peut accomplir ce + - qu'un bataillon entier ne peut pas faire. + - Mais si le &aGeneral&f vous a envoyé, alors qui suis-je pour me plaindre. + - Nous avons localisé leur &dTanière&f, mais la résistance est trop forte. + - Il n'y avait tout simplement aucun moyen d'y parvenir. + - Mais si vous pouviez vous frayer un chemin dans la &dTanière&f et dégager votre chemin + - alors les &dSéquoïas&f serraient à nouveau en sécurité. Bien plus sûr au moins... + - Leur &dTanière&f est situé sous un &9Séquoia Corrompu&f. + - Il est facile de le repérer, il se distingue parmi les arbres sains. + questAcceptDialog: + - '&a[Cylindrus]&f Faites attention...' + - '&7&oJe dois nettoyer la &dTanière de Loup-Garou&7&o.' + questCompleteMessage: + - '&a[Magnus]&f Par la grande fée d''arbre, vous avez fait ça !!!' + - N'hésitez pas à vous reposer sur notre camp, vous serez toujours le bienvenu ici. +primis_pontis_mille_where_is_he_now: + customObjectives: + Objective1: + dialog: + - '&a[Gorenus Palis]&f Mon frère vous a envoyé me chercher?' + - Oh, j'ai encore tout gâché... Je me suis vraiment perdu cette fois-ci. + - J'espère qu'il ne sera pas trop énervé. + - Quand vous y retournez, dites-lui que je suis en sécurité. + name: '&2Ami Affamé' + questLore: + - Moi et mon &aBrother&f étions en route + - pour retourner au village. + - Au cours de nos voyages, j'ai dû faire un petit détour et nous avons donc été séparés. + - Nous étions censés nous rencontrer ici. + - Mais aucune trace de lui depuis un certain temps maintenant. + - Il a tendance à se perdre... vraiment. + - Je suis plutôt inquiet à son sujet. + - Je serais prêt à payer une grande récompense + - à toute personne capable de le trouver. + questAcceptDialog: + - '&a[Rodenus Palis]&f Vous êtes si aimable à offrir votre aide.' + - S'il vous plaît, si vous le trouvez venez me dire où il est tout de suite. + - '&7&oJe dois aller trouver le frère de &a&oRodenus&7&o.' + questCompleteMessage: + - '&a[Rodenus Palis]&f Quoi! Comment il a fini par se retrouver là-bas!' + - Sigh, je ferais mieux de commencer maintenant... + - Merci pour votre aide. Voici les pièces comme promis. +primis_pontis_redwoods_big_brown_logs: + customObjectives: + Objective1: + dialog: + - '&a[Magnus]&f Qui êtes-vous ? Oh, vous êtes venu de &dPontis Mille&f.' + name: '&2Grands troncs bruns' + questLore: + - Je pourrais consacrer mes forces à aider &dGladius&f si vous pouviez aider + - à gérer la crise des &cLoup-garous&f dans la &dforêt de Séquoïas&f. + - Nos forces retiennent les &cLoup-garous&f depuis des semaines. + - Ce serait formidable si vous pouviez nous aider. + - Allez au &dSéquoïas&f et parlez à &aMagnus Castorea&f. + - Ils vous feront savoir ce qu'il faut faire pour mettre un terme à cette crise. + questAcceptDialog: + - '&a[Cylindrus]&fLes &dSéquoïas&f peuvent être atteints en direction du Nord.' + - Continuez vers le nord jusqu'à ce que vous arriviez à la &dL'arrêt du chemin de fer&f, puis dirigez-vous vers l'ouest. + - '&7&oJe dois aller dans la &dforêt de Séquoïas&7&o et parler à &aMagnus&7&o.' + questCompleteMessage: + - '&a[Magnus]&f Le général vous a envoyé pour nous aider ?' + - Hum... Vous feriez mieux d'être bon. +primis_pontis_redwoods_its_reyn_time: + name: '&2C''est l''heure de Reyn !' + questLore: + - Ma &eMontre à gousset&f est tombée dans la rivière quand j'abattais un arbre. + - C'est une montre spéciale que vous voyez, remplie d'air et assez robuste. + - Entièrement résistant aux bûches lourdes qui sont jetées dessus, oui. + - J'ai vu un de ces méchants &cBandits&f la ramasser et la mettre dans sa poche. + - Je suis presque sûr de les avoir vus &9Porter une Hachette&f. + - + - + - Une belle récompense vous attends à votre retour! + questAcceptDialog: + - '&8[Reynus]&f Vous pouvez trouver les &cBandits&f juste de l''autre côté de la rivière.' + - '&7&oJe dois aller chasser le bon &cBandit&7&o et récupérer la &eMontre&7&o.' + questCompleteMessage: + - '&a[Reynus]&f Je m''assurerai de ne pas la perdre à nouveau!' + - Votre récompense mon bon monsieur! +primis_pontis_redwoods_nasty_little_bandits: + name: '&2Petits bandits maladroits !' + questLore: + - Depuis que ces chers &cBandits&f se sont installées sur la rivière, il n'y a plus de répit. + - Ils continuent à ruiner les arbres, hier j'ai attrapé l'un d'eux + - essayant de mettre un de ces arbres géants en feu! + - Et il n'y a pas si longtemps, j'ai été pourchassé par une folle personne avec une hache, + - Je suis sûr que c'était l'un des &cBandits&f. + - Sans oublier de mentionner qu'ils continuent d'essayer de voler tout ceux qui + - font des affaires avec les gens de la &dScierie&f. + - Trop, c'est trop. Je suis prêt à payer de bonnes pièces pour mettre fin à cette folie. + questAcceptDialog: + - '&a[Ligna Crispian]&f Vous les trouverez de l''autre côté de la rivière.' + - '&7&oJe devrais aller au &dCamp de Bandits&7&o à proximité et le nettoyer.' + questCompleteMessage: + - '&a[Ligna Crispian]&f Enfin !' +primis_pontis_redwoods_need_a_smoke: + name: '&2Besoin de fumée' + questLore: + - J'ai entendu que vous avez aidé le bon vieux &aReynus&. + - Eh bien, comme vous pouvez le voir, j'ai encore réussi à me couper les jambes avec cette sacrée scie. + - Oh, ne vous inquiétez pas pour moi. Mes jambes seront guéries à nouveau en un rien de temps. + - Vous voyez, le problème est, que je ne peux pas faire grand-chose en attendant que mes jambes se guérissent. + - Cela me rend d'humeur pour une bonne bouffée. + - J'ai apporté avec moi un peu de &eTabac Premium&f pour ma pipe, + - mais je devais le cacher au cas où ces &cBandits&f mettraient la main dessus. + - Le problème est que j'ai complètement oublié où je l'ai caché! + - Tout ce dont je me souviens, c'est de l'avoir enterré &9Près d'un arbre&f. + - Quel arbre? Qui sait! + - Écoutez car j'ai une bonne affaire pour vous. Trouvez mon tabac et vous pourrez avoir + - toutes mes &ePommes dorées&f. + questAcceptDialog: + - '&a[Lyco]&f J''espère que vous le trouverez bientôt.' + - '&7&oje devrais aller chercher le &eTabac&7&o.' + questCompleteMessage: + - '&a[Lyco]&f Vous l''avez trouvé! HAHA! Je savais que je pouvais compter sur vous !' +primis_terravilla_bipedal_examination: + name: '&2Examen bipédal' + questLore: + - J'ai étudié les &cTerreurs à Deux Jambes&f qui rôdent + - autour de &dTerravilla&f. Saviez-vous que leur population + - était beaucoup plus importante jadis, et en fait, c'était + - la raison pour laquelle les premiers colons ont décidé de construire + - '&dTerravilla&f sur les ruines et non pas sur le sol.' + - Pour une raison ou une autre, leur nombre a vraiment diminué. J'étais + - en train d'essayer d'obtenir quelques &eÉchantillons&f mais tenter de tuer n'importe lequel d'entre eux est + - bien au-delà de mes compétences. Mais vous ressemblez au genre de type qui + - peut gérer une &cTerreur à Deux Jambes&f. Êtes-vous intéressé à + - m'apporter de l'aide ? + questAcceptDialog: + - '&a[Plautia Suilius]&f Six &eÉchantillons&f devraient suffire. Revenez me voir lorsque vous aurez les &eÉchantillons&f.' + - '&7&oJ''ai besoin de tuer des &c&oTerreur à Deux Jambes&7&o et de collecter sic &e&oÉchantillons&7&o.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Super! Jetons un œil.' + - '&7&oJe devrais entendre ce que &a&oPlautia Suilius&7&o a réussi à trouver.' +primis_terravilla_drowning_terror: + name: '&2Terreur noyée' + questLore: + - Ma théorie était correcte. J'ai disséqué la croissance et trouvé + - un organisme à l'intérieur. Après un examen minutieux, j'ai + - déterminé que l'organisme est d'origine aquatique. Et + - non seulement cela, mais ils sont aussi capables de détourner le cerveau + - des hôtes. Une fois prêt à éclore, ils font en sorte que l'hôte aille à la + - source d'eau la plus proche et se noie. L'organisme + - peut alors éclore et nager librement. Quel que soit ce qui + - infecte la &cTerreur à Deux Jambes&f cela doit vivre dans + - une rivière à proximité. Vous devriez y aller et ramasser un + - '&eÉchantillon parfait&f de n''importe quel organisme qui est à l''origine de cela.' + - Je ne sais pas si c'est quelque chose qui peut affecter l'homme + - mais juste au cas où vous devriez tuer quelques-uns des organismes + - pour être sûr. + questAcceptDialog: + - '&a[Plautia Suilius]&f Revenez ici une fois que vous aurez collecté un &eEchantillon&f.' + - '&7&oJe dois aller dans la rivière voisine et ramasser un &e&oéchantillon parfait &7&o de ce qui est à l''origine des infections.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Wow il ressemble à un poisson, mais ses organes internes sont différents.' + - Il doit infecter d'autres créatures en libérant ce petit ver comme des particules de viande... + - Laissez-moi vous regarder. Hmm, vous avez l'air sain, aucune trace... + - + - + - + - + - + - '&7&oJe devrais m''assurer de rester à l''écart de la rivière...' +primis_terravilla_hog_on_my_porch: + name: '&2Examen bipédal' + questLore: + - Il est à nouveau assis sur l'ascenseur! + - Je ne peux pas le croire! Vous, là! + - On dirait que vous pouvez gérer une grande bête. + - Je vous paierai de l'argent si vous pouvez vous débarrasser + - de ce &cGrand Porc ennuyeux&f qui reste assis + - sur l'ascenseur. Comment sommes-nous censés transporter des marchandises + - de haut en bas de cette façon. + questAcceptDialog: + - '&a[Dorippa Sarimarcus]&f Débarrassez-vous de ce cochon là-bas, voyez-vous?' + - '&7&oJe dois tuer le &c&oRazorback Alpha&7&o.' + questCompleteMessage: + - '&a[Dorippa Sarimarcus]&f Enfin! Je peux continuer ma vie maintenant! Merci!' +primis_terravilla_razorbag: + name: '&2Razorbag' + questLore: + - Si vous cherchez du travail, j'en ai pour vous. + - Je conçois et fabrique des sacs lourds que je vend + - ici dans ma petite boutique, j'ai donc besoin de + - cuir. Heureusement il y a beaucoup de + - '&cRazorbacks&f autour de cet endroit. Si vous êtes' + - intéressé, je voudrais vous engager pour partir à leur chasse + - pour leur cuir. J'ai besoin d'une grande quantité + - de cuir. Ce ne sera donc pas une tâche rapide. + questAcceptDialog: + - '&a[Telestis Senna]&f Vous les trouverez principalement se promenant autour d''ici et vers la zone des champs.' + - '&7&oJe dois aller chasser le &c&oRazorback Mature&7&o.' + questCompleteMessage: + - '&a[Telestis Senna]&f Oui, ça va le faire. En parfait état aussi ! Voici votre pièce, comme promis.' +primis_terravilla_terrifying: + name: '&2Terrifiant' + questLore: + - Eh bien, c'est préoccupant. L'échantillon que vous avez apporté montre + - qu'elles sont lentement drainées de leurs nutriments. + - Mon hypothèse est qu'il y a très probablement un parasite + - attaché à eux qui cause cela. Vous devriez aller + - à nouveau voir si vous pouvez trouver de grandes + - '&eExcroissances&f sur leur corps, puis les couper' + - et rapportez-les ici. + questAcceptDialog: + - '&a[Plautia Suilius]&f Je n''aurai besoin que de deux &eExcroissances&f pas plus.' + - '&7&oJ''ai besoin de tuer &c&oLa Terreur à Deux Jambes&7&o et de collecter deux &e&oExcroissances&7&o.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Excellent, ça devrait le faire.' + - '&7&oJe devrais entendre ce que &a&oPlautia Suilius&7&o a réussi à trouver.' +test_quest: + name: Kill the Test Boss + questLore: + - '&cTerminer le règne de terreur du boss de test !' +xmas_quest_0: + name: '&2Trouvez les cadeaux perdus !' + questLore: + - + - + - Je vous laisserai ouvrir l'un d'eux en retour! + questAcceptDialog: + - '&8[&cPère Noel&8]&f Merci ! Je vous attendrai ici !' + questCompleteMessage: + - '&8[&cPère Noel&8]&f Merci pour votre aide ! Il y a encore des cadeaux perdus là-bas, parlez-moi à nouveau si vous voulez aider plus!' diff --git a/src/main/resources/translations/german.yml b/src/main/resources/translations/german.yml new file mode 100644 index 000000000..54624cb8a --- /dev/null +++ b/src/main/resources/translations/german.yml @@ -0,0 +1,13250 @@ +config: + noArenaPermissionMessage: '[EliteMobs] Du hast nicht die Berechtigung, diese Arena zu betreten!' +ItemSettings: + itemLoreStructureV2: + - '&7&m&l---------&7<&lAusrüstungsinfo&7>&m&l---------' + - '&7Gegenstands stufe: &f$itemLevel &7Prestige &6$prestigeLevel' + - '$weaponOrArmorStats' + - '$soulbindInfo' + - '$itemSource' + - '$ifLore&7&m&L-----------&7< &f&lBeschreibung&7 >&m&l-----------' + - '$customLore' + - '$ifEnchantments&7&m&l--------&7<&9&lVerzauberungen&7>&m&l--------' + - '$enchantments' + - '$eliteEnchantments' + - '$ifCustomEnchantments&7&m&l------&7< &3&lEigene Verzauberungen&7 >&m&l------' + - '$customEnchantments' + - '$ifPotionEffects&7&m&l----------&7< &5&lEffekte&7 >&m&l----------' + - '$potionEffect' + - '&7&l&m-----------------------------' + - '$loreResaleValue' + shopSourceItemLores: '&7Von einem Shop gekauft' + mobSourceItemLores: '&7Geplündert von $mob' + loreWorths: '&7Wert $worth $currencyName' + loreResaleValues: '&7Verkaufe für $resale $currencyName' + eliteEnchantmentLoreStrings: Meister + noSoulbindLore: '&7Nicht Seelengebunden!' + preventEliteItemDisenchantmentMessage: '&c[EliteMobs] Kann Elite-Items nicht entzaubern!' + scrapSucceededMessageV2: '&8[EliteMobs] &2Verschrottung war $amount Mal erfolgreich!' + scrapFailedMessageV2: '&8[EliteMobs] &cVerscrotten ist $amount Mal gescheitert!' + lowDurabilityItemDropMessage: '&8[EliteMobs] &cRüstung wurde aufgrund von geringer Haltbarkeit fallen gelassen! &8Repariere es beim NPC mit Schrott, um sie zu benutzen!' + lowWeaponItemDropMessage: '&8[EliteMobs] &cWaffe wurde aufgrund geringer Haltbarkeit fallen gelassen! &8Repariere sie beim NPC mit Schrott, um sie zu benutzen!' + simlootMessageSuccess: '&8[EliteMobs] &2Für Beute gerollt und $itemName &2!' + simlootMessageFailure: '&8[EliteMobs] &cFür Beute gerollt und nichts bekommen!' + directDropCustomLootMessage: '&8[EliteMobs] &2Erhielt $itemName &2!' + directDropMinecraftLootMessage: '&8[EliteMobs] &2Erhielt $itemName &a!' + directDropCoinMessage: '&8[EliteMobs] &aErhielt &2$$amount $currencyName &a!' + directDropSpecialMessage: '&8[EliteMobs] &aErhielt &2$amount $name &a!' + weaponEntry: '&7Elite SPS: &2$EDPS' + armorEntry: '&7Elite Rüstung: &2$EDEF' +ProceduralItemGenerationSettings: + materialNames: + swordName: Schwert + bowName: Bogen + pickaxe: Spitzhacke + spade: Spaten + hoe: Hacke + axe: Axt + helmet: Helm + chestplate: Brustpanzer + leggings: Hosen + boots: Schuhe + shears: Schere + fishingRod: Angel + shield: Schild + trident: Dreizack + crossbow: Armbrust + nameFormats: + - '$verb $itemType von $adjective $noun' + - '$itemType von $adjective $noun' + - '$noun''s $adjective $verb $itemType' + - '$verb $itemType' + - '$adjective $verb $itemType' + - Der $verb-er + - Der $adjective $verb-er + nouns: + - MagmaTyp + - Sonnenaufgang + - Sonnenuntergang + - Himmel + - Hölle + - Engel + - Erzengel + - Cherub + - Seraphe + - Dämon + - Unhold + - Fledermaus + - Hühnchen + - Kuh + - Pilzkuh + - Schwein + - Kaninchen + - Schaf + - Tintenfisch + - Bewohner + - Höhlenspinne + - Enderman + - Eisbär + - Spinne + - Zombie Pigman + - Blaze + - Creeper + - Elder Wächter + - Endermite + - Magier + - Ghast + - Wächter + - Husk + - Magmawürfel + - Shulker + - Silberfisch + - Skelett + - Schleim + - Streuner + - Vex + - Verteidiger + - Hexe + - Witherskelett + - Zombie + - Esel + - Pferd + - Lama + - Maultier + - Ozelot + - Wolf + - Eisengolem + - Schneegolem + - Enderdrache + - Wither + - Illusioner + - Papagei + - Gigant + - Killerhase + - Steve + - Wolfschwanz + - Chaos + - Aeon + - Drachen + - Sphynx + - Minotaurus + - Hades + - Oath + - Eidbrecher + - Deserteur + - Verräter + - Jade + - Hell + - Dunkelheit + - Oblivion + - Schatten + - Nichts + - Xeno + - Zealot + - Zenit + - Dämmerung + - Mitternacht + - Kreaturen + - Elite-Mob + - Urist + - Zwerg + - Elf + - Ork + - Kobold + - Gnom + - Goliath + - Drow + - Mensch + - Halbling + - Halbork + - Betrachter + - Mind Flayer + - Eulenbär + - Landhai + - Rost Monster + - Hügelriese + - Steinriese + - Frostriese + - Feuer-Riese + - Wolkenriese + - Sturm Riese + - Kobold + - Lich + - Ork + - Umber Hulk + - Kämpfer + - Zauberer + - Paladin + - Kleriker + - Waldläufer + - Schütze + - Magier + - Tiefling + - Werwolf + - Vampir + - Zentaur + - Catfolk + - Halb-Riese + - Oger + - Troll + - Schurke + - Barbaren + - Barde + - Druide + - Mönch + - Hexenmeister + - Warlock + - Dämonenjäger + - Todes Ritter + - Priester + - Schamane + - Kämpfer + - Basilisk + - Chimäre + - Imp + - Dryad + - Gargoyle + - Dschinn + - Efreeti + - Geist + - Kobold + - Hydra + - Kraken + - Lamia + - Medusa + - Mimik + - Mumie + - Pegasus + - Roc + - Satyr + - Tarrasque + - Abomination + - Ghul + - Treant + - Einhorn + - Gespenst + - Acolyte + - Gladiator + - Ritter + - Greif + - Räuber + - Späher + - Spion + - Thg + - Nobel + - Wächter + - Veteran + - Wyvern + - Abyssal + - Höllisch + - Elementare + - Tauren + - Pandaren + - Big Foot + - Verlassener + - Yeti + - Banshee + - Spinnentiere + - Untote + - Nachtelf + - Blutelf + - Draenei + - Worgen + - Kriegsherr + - Hexe + - Weisen + - Weiser + - Dieb + - Assassine + - Templar + - Bestienzähmer + - Berserker + - Erfinder + - Luchador + - Pirat + - Vorreiter + - Voidblade + - Wisp + - Landarbeiter + - Waffenknecht + - Schwertkämpfer + - Thrall + - Katzenhund + - Jägerin + - Jäger + - Aarakorcra + - Aboleth + - Deva + - Planetar + - Solar + - Ankheg + - Azer + - Behir + - Todestyrann + - Seuche + - Bugbear + - Hugbear + - Bullywug + - Kambion + - Chuul + - Lichkönig + - Cockatrice + - Couatl + - Zyklop + - Titan + - Dunkelmantel + - Uralte Urne + - Demilich + - Balor + - Barlgura + - Chasm + - Dretch + - Glabrezu + - Goristro + - Hezrou + - Mähne + - Marilith + - Nalfeshnee + - Quasit + - Vrock + - Yochlol + - Pit Fiend + - Lemure + - Dracolich + - Doppelgänger + - Chromatischer Drache + - Drider + - Luftelementar + - Erdelementar + - Feuergenius + - Wasserelement + - Rohirrim + - Gondorian + - Empyrean + - Feendrache + - Ettin + - Flumph + - Formorian + - Dao + - Gnoll + - Parshendi + - Zuhörer + - Spren + - Sturmvater + - Roscharisch + - Heldenfürst + - Hochprinz + - König + - Imperator + - Scherbenträger + - Surgebinder + - Anleihenschmied + - Golem + - Gorgon + - Vettel + - Harpyie + - Hippogriff + - Homunculus + - Magister der Alchemie + - Untoter Soldat + - Jackalwere + - Nothisch + - Oni + - Rakshasa + - Wiederbelebter + - Kultist + adjectives: + - Bezaubernd + - Schön + - Rein + - Elegant + - Schick + - Glamourös + - Gut aussehend + - Lang + - Großartig + - Schlicht + - Urig + - Prickelnd + - Am Hässlichsten + - Rot + - Orange + - Gelb + - Grün + - Blau + - Lila + - Grau + - Schwarz + - Weiß + - Tot + - Ungerade + - Kraftvoll + - Reich + - Groß + - Eifrig + - Taubend + - Ohnmacht + - Melodisch + - Ruhig + - Donnernd + - Flüstern + - Hissen + - Uralt + - Schnell + - Alt + - Schnell + - Langsam + - Verfault + - Gruselig + - Betrügerisch + - Leer + - Schwer + - Abscheulich + - Abnormal + - Absurd + - Akzeptabel + - Zufällig + - Adamant + - Abenteurer + - Quälend + - Alarm + - Verärgert + - Nervig + - Ängstlich + - Aromatisch + - Aggressiv + - Aloof + - Erstaunlich + - Zweideutig + - Ehrgeizig + - Erfreut + - Ärgerlich + - Arrogant + - Beschämt + - Angestrebt + - Erstaunlich + - Verheißungsvoll + - Durchschnittlich + - Großartig + - Schrecklich + - Schlecht + - Barmherzig + - Schüchtern + - Beffiting + - Streitlustig + - Wertvoll + - Berserker + - Bester + - Verwirrt + - Groß + - Bitter + - Bizarr + - Blutig + - Kochen + - Grenzenlos + - Frech + - Mutig + - Kräftig + - Zerbrechlich + - Kurze + - Hell + - Beschädigt + - Beschäftigt + - Berechend + - Herzlos + - Ruhig + - Launisch + - Vorsichtig + - Unachtsam + - Fürsorglich + - Vorsichtig + - Ceaseless + - Bestimmte + - Bezaubernd + - Billig + - Leiter + - Chillig + - Ritterlich + - Klobig + - Leeren + - Clever + - Klösterliches + - Tollpatsch + - Bewölkt + - Nobel + - Kolossal + - Kombinativ + - Allgemein + - Verwirrend + - Verdammt + - Cool + - Mutig + - Feigheit + - Verrückt + - Craven + - Grausam + - Kuschlig + - Neugierig + - Niedlich + - Beschädigt + - Schädigen + - Gefährlich + - Dunkel + - Schneidig + - Maßgebend + - Tief + - Niederlage + - Fehlerhaft + - Trotzig + - Zart + - Lecker + - Köstlich + - Demonisch + - Delirium + - Verderbt + - Beschreibend + - Teuflisch + - Schwierig + - Fleiß + - Direful + - Verschmutzt + - Verheerend + - Angewidert + - Widerlich + - Desillusioniert + - Unverwechselbar + - Gestört + - Draconian + - Dramatisch + - Düster + - Dysfunktional + - Eifrig + - Senioren + - Elektrisch + - Meister + - Verzaubert + - Verzaubern + - Energetisch + - Enorm + - Unterhaltend + - Begeistert + - Neidisch + - Erratisch + - Ätherisch + - Ausweichend + - Exzellent + - Aufgeregt + - Aufregend + - Exotisch + - Überschwänglich + - Fabelhaft + - Verblasst + - Fair + - Treu + - 'Falsch' + - Vertraut + - Berühmt + - Fanatisch + - Fantastisch + - Fasziniert + - Fett + - Ängstlich + - Furchtlos + - Feeble + - Festlich + - Wilde + - Schmutzig + - Gut + - Empfindlich + - Erster + - Fest + - Flashig + - Makellos + - Flimsig + - Flippant + - Blumig + - Flauschig + - Flattern + - Schaumig + - Narrisch + - Vergesslich + - Glücklich + - Zerbrechlich + - Zerbrechlich + - Verzweifelt + - Frei + - Einfrierend + - Frisch + - Freundlich + - Furchteinflößend + - Fumbeln + - Witzig + - Zornig + - Heimlich + - Unscharf + - Gigant + - Vergiftet + - Gigantisch + - Glitzernd + - Glorreich + - Göttlich + - Gut + - Doof + - Wunderschön + - Anmutig + - Grandiose + - Dankbar + - Fetthaltig + - Super + - Gierig + - Trauernd + - Groovy + - Grotesk + - Grubby + - Grausig + - Mürrisch + - Bewacht + - Schuldlos + - Leichtgläubig + - Gutsy + - Kehlig + - Heiligtum + - Hängend + - Unglücklich + - Glücklich + - Harmonisch + - Hasserfüllt + - Gesund + - Herzbrechend + - Himmlisch + - Höllisch + - Hilfreich + - Hilflos + - Zögernd + - Abscheulich + - Urkomisch + - Hohl + - Obdachlos + - Verehrbar + - Schrecklich + - Gastfreundlich + - Riesig + - Hulken + - Humorvoll + - Hungrig + - Verletzt + - Stummgeschaltet + - Hypnotisch + - Hysterisch + - Icky + - Eisig + - Ignorant + - Krank + - Illegal + - Illustriert + - Erfunden + - Immens + - Unmittelbar + - Unparteiisch + - Unvollkommen + - Unhöflich + - Wichtig + - Glühend + - Inkompetent + - Fleißig + - Unglaublich + - Kostengünstig + - Berühmt + - Unschuldig + - Wissbegierig + - Heimtückisch + - Instinktiv + - Intelligent + - Interessant + - Unbesiegbar + - Wütend + - Juckend + - Jaded + - Zerklüftet + - Eifersüß + - Lustig + - Fröhlich + - Sprunghaft + - Jugendlich + - Eifrig + - Freundlich + - Kindherzigkeit + - Wissend + - Kenntnisreich + - Bekannt + - Arbeitet + - Langweilig + - Groß + - Letzter + - Spät + - Lächerlich + - Faul + - Schlank + - Tödlich + - Hell + - Klein + - Wohnen + - Einsam + - Laut + - Allerliebst + - Glücklich + - Magenta + - Magisch + - Majestätisch + - Böswillig + - Gezeichnet + - Massiv + - Wunderbar + - Mittelwert + - Medizinisch + - Geschmolzen + - Unordentlich + - Mächtig + - Militärisch + - Gedankenlos + - Gering + - Neblig + - Gemischt + - Modern + - Bewegungslos + - Geheimnisvoll + - Naiv + - Schmal + - Natürlich + - Ordentlich + - Notwendig + - Unnötig + - Nötig + - Nervös + - Neu + - Schön + - Normal + - Nostalgisch + - Zahlenlos + - Veraltet + - Erhältlich + - Ozeanisch + - Altmodisch + - Allwissend + - Optimal + - Gewöhnlich + - Bio + - Hervorragend + - Oval + - Überbewertet + - Schmerzhaft + - Parallel + - Erbärmlich + - Friedlich + - Buße + - Perfekt + - Periodisch + - Zierlich + - Physisch + - Pink + - Plastik + - Angenehm + - Sinnlos + - Höflich + - Schwach + - Wertvoll + - Premium + - Geschenk + - Hübsch + - Privat + - Produktiv + - Schützend + - Öffentlich + - Rätselhaft + - Fraglich + - Schnell + - Schnellste + - Selten + - Bereit + - Tatsächlich + - Rebell + - Standard + - Bemerkenswert + - Verantwortlicher + - Romantisch + - Rund + - Königlich + - Traurig + - Sicher + - Salzig + - Befriedigend + - Ängstlich + - Gruselig + - Wissenschaftlich + - Geringfügig + - Kreischen + - Zweite + - Gebraucht + - Geheimnis + - Egoistisch + - Sequenziert + - Ernsthaft + - Untiefe + - Scharf + - Schillernd + - Schockierend + - Kurz + - Schüchtern + - Krank + - Stumm + - Seidig + - Albern + - Einfach + - Dünn + - Schlank + - Schleimig + - Rutschig + - Klein + - Smart + - Lächeln + - Glatt + - Hinterhältig + - Weich + - Fest + - Speziell + - Spektakulär + - Scharf + - Stachelig + - Herrlich + - Gruselig + - Spotlos + - Quadratisch + - Staking + - Stehend + - Konstant + - Haftend + - Seltsam + - Gestreift + - Stark + - Erfolgreich + - Super + - Supreme + - Süß + - Talentiert + - Groß + - Lecker + - Temporär + - Gespannt + - Schrecklich + - Hervorragend + - Getestet + - Dankbar + - Dick + - Dünn + - Durstig + - Bedachtsam + - Winzig + - Müde + - Knifflig + - Unruhig + - 'Wahr' + - Hächlich + - Ultra + - Unempfohlen + - Unbewaffnet + - Enthüllt + - Ungesund + - Einzigartig + - Unbekannt + - Unnatürlich + - Unbenutzt + - Ungewöhnlich + - Gebraucht + - Nützlich + - Nutzlos + - Wertvoll + - Gewalttätig + - Wartend + - Wandernd + - Warm + - Schwach + - Reich + - Komplett + - Weise + - Wunderbar + - Hölzern + - Sorgenvoll + - Wertlos + - Falsch + - Bedrohlich + - Vertrauen + - Unscheinbar + - Bedroht + verbs: + - Aufschlitzen + - Schneiden + - Stechend + - Kratzen + - Töten + - Töten + - Schlachten + - Zerstören + - Kitzeln + - Umarmen + - Ermorden + - Schlagen + - Hissen + - Reisen + - Teleportieren + - Blinkend + - Zerstören + - Zerstören + - Flashen + - Materialisieren + - Spawnen + - Fragend + - Nachfragen + - Flehend + - Anspruchsvoll + - Abfrage von + - Abfrage + - Übergriffe + - Auffallend + - Hinterhalt + - Angreifen + - Rushing + - Stürmen + - Bombardierung + - Sperrung + - Klopfen + - Aufladen + - Prügeln + - Kämpfend + - Battering + - Hämmernd + - Schlagend + - Kämpfend + - Überwältigend + - Raiding + - Tackeln + - Schießen + - Venturing + - Knacken + - Aufbrechen + - Zertrümmern + - Zerschmetternd + - Brechend + - Absplitternd + - Pulverisierend + - Tränen + - Rending + - Schnappen + - Berstend + - Explodierend + - Schädigen + - Fragmentieren + - Aufteilen + - Verstärkung + - Stoppen + - Anzapfen + - Drängeln + - Klopfen + - Stöbern + - Klappernde + - Auffällig + - Wichsen + - Schlagen + - Beschwören + - Schreien + - Brüllen + - Brüllen + - Verschieben + - Umformen + - Modifizieren + - Verdrehen + - Mutieren + - Verzerren + - Verwischen + - Anpassen + - Warpen + - Ändern + - Anpassen + - Weiterentwickeln + - Variieren + - Jagen + - Nachfolgende + - Folgend + - Stalking + - Beschattung + - Hetzjagd + - Gehäuse + - Befestigen + - Aufsteigend + - Ansteigend + - Heben + - Springen + - Erklimmend + - Sammeln + - Corralling + - Horten + - Ernten + - Ernten + - Speichern + - Zuflucht suchen + - Tarnen + - Abdecken + - Umschließen + - Verbergen + - Verstecken + - Tarnen + - Maskieren + - Begraben + - Glätten + - Bewölkt + - Abschirmung + - Beschattung + - Verdichtend + - Umhüllend + - Verschleiern + - Verdunkeln + - Überquerung + - Füllen + - Gleiten + - Heulen + - Wimmern + - Schreien + - Schreiend + - Quietschen + - Brüllen + - Wehklagen + - Grölen + - Kreischen + - Spalten + - Hacken + - Chippen + - Trennen + - Schneiden + - Schnippen + - Aufteilen + - Ätzen + - Aufschlitzen + - Rending + - Tränen + - Dünnen + - Zuschneiden + - Carven + - Sezieren + - Hacken + - Durchschuss + - Sägen + - Rasieren + - Scheren + - Abbauen + - Eintauchen + - Ausgraben + - Vergraben + - Bohren + - Aushöhlen + - Hobeln + - Tunneln + - Eindringend + - Zustieg + - Wandernd + - Infiltrieren + - Eindringen + - Ausweichen + - Fliehen + - Rennen + - Ausweichen + - Abstürzen + - Kämpfend + - Tussling + - Ringen + - Scharren + - Duellieren + - Rauferei + - Lanzenstechen + - Sparring + - Kollidieren + - Warring + - Greifen + - Schrotten + - Angreifen + - Feuern + - Plänkeln + - Entdecken + - Erkennen + - Fangen + - Lösen + - Enthüllen + - Freilegen + - Springen + - Springen + - Springen + - Gewölbe + - Springen + - Schwanken + - Putzen + - Booten + - Drop-Kicking + - Messen + - Empfangend + - Erkennen + - Ausblenden + - Blutend + - Schrumpfen + - Schwächen + - Abnehmen + - Abnehmend + - Schmieden + - Veröffentlichen + - Sammeln + - Sammeln + - Keulen + - Zerkleinern + - Antreiben + - Joggen + - Sprinten + - Quests + - Spähen + - Erkunden + - Graben + - Zitternd + - Klappern + - Trennen + - Hacken + - Aufbrechen + - Carven + - Teilen + - Halbierung + - Brechen + - Unterbrechung + - Teilen + - Rending + - Rippen + - Grasen + - Inhaftierung + - Fangen + - Ecken + - Verstricken + - Anstecken + - Fangen + - Zurückhaltung + - Binden + - Hooking + - Snagging + - Schnappen + - Einfangen + - Fangen + - Jagen + - Schleichen + - Schleichen + - Spionieren + - Rächen + - Stürmen + verb-ers (noun): + - Welt Brecher + - Weltenbrecher + - Avenger + - Aschenbringer + - Windsucher + - Beschmutzer + - Gewitterwut + - Schneider + - Slasher + - Abschneider + - Messerstecher + - Kratzer + - Killer + - Slayer + - Zerstörer + - Umleger + - Mörder + - Slapper + - Reisender + - Teleporter + - Blinker + - Zerstörer + - Materializer + - Brutstätte + - Nachfrager + - Anstürmer + - Striker + - Hintermann + - Rusher + - Stürmer + - Bombardier + - Barrager + - Peiniger + - Stürmer + - Kämpfer + - Hammer + - Beater + - Kämpfer + - Überwältiger + - Räuber + - Tackler + - Schütze + - Abenteurer + - Cracker + - Smasher + - Zerschmettert + - Fracturer + - Splinterer + - Pulverizer + - Tearer + - Renderer + - Snapper + - Burster + - Exploder + - Damager + - Fragmenter + - Splitter + - Verstärker + - Nudger + - Tapper + - Klopfer + - Butter + - Gatterer + - Striker + - Whacker + - Slammer + - Beschwörer + - Kreischer + - Shifter + - Transformer + - Modifyer + - Twister + - Blurrer + - Warper + - Alterer + - Adapter + - Evolver + - Jäger-Verzauberung + - Trailer + - Follower + - Stalker + - Shadower + - Hounder + - Caser + - Mounter + - Ascender + - Riser + - Springer + - Hoarder + - Reaper + - Harvester + - Saver + - Shelterer + - Cloaker + - Shrouder + - Encloser + - Verstecker + - Maskierer + - Beerdigung + - Wolke + - Shader + - Sealer + - Enveloper + - Veiler + - Traverser + - Forder + - Gleiter + - Heuler + - Whimperer + - Kreischer + - Squealer + - Bawler + - Screecher + - Chopper + - Chipper + - Snipper + - Splitter + - Axer + - Slasher + - Renderer + - Tearer + - Thinner + - Cropper + - Carver + - Hacker + - Piercer + - Sawer + - Shaver + - Shearer + - Miner + - Excavater + - Burrower + - Bohrer + - Tunneler + - Räuber + - Boarder + - Wanderer + - Eindringling + - Evader + - Läufer + - Dodger + - Crasher + - Kämpfer + - Ringer + - Scuffler + - Dueler + - Raufbold + - Clasher + - Greifarm + - Scrapper + - Angreifer + - Feuder + - Fänger + - Löser + - Revealer + - Leaper + - Bouncer + - Vaulter + - Trichter + - Surger + - Punter + - Dropkicker + - Empfänger + - Fader + - Bleeder + - Weakener + - Forger + - Releaser + - Gatherer + - Crusher + - Propeller + - Jogger + - Sprinter + - Scouter + - Entdecker + - Gräber + - Trembler + - Parter + - Hacker + - Carver + - Divider + - Halver + - Breaker + - Renderer + - Ripper + - Grazer + - Gefangener + - Cornerer + - Pinner + - Fänger + - Rückhalter + - Binder + - Snagger + - Snatcher + - Cager + - Fänger + - Jäger + - Creeper + - Basket + - Binder + - Jailer + - Seducer + - Dancer + - Blasphemer + - Eater + - Snorer + - Thruster + - Slapper +absorption: + name: Absorbieren +blindness: + name: Blindheit +conduit_power: + name: Meereskraft +confusion: + name: Übelkeit +damage_resistance: + name: Widerstand +dolphins_grace: + name: Gnade des Delphins +fast_digging: + name: Eile +fire_resistance: + name: Feuerresistenz +glowing: + name: Leuchten +harm: + name: Direktschaden +heal: + name: Direktheilung +health_boost: + name: Gesundheitsboost +hunger: + name: Sättigung +increase_damage: + name: Stärke +invisibility: + name: Unsichtbarkeit +jump: + name: Sprungkraft +levitation: + name: Schwebekraft +luck: + name: Glück +night_vision: + name: Nachtsicht +poison: + name: Gift +regeneration: + name: Regenerierung +saturation: + name: Sättigung +slow: + name: Langsamkeit +slow_digging: + name: Abbaulähmung +slow_falling: + name: Langsames Fallen +speed: + name: Geschwindigkeit +unluck: + name: Pech +water_breathing: + name: Unterwasser-Atmung +weakness: + name: Schwäche +wither: + name: Wither +translation: + Economy pay message v2: '&2Du hast &2$amount_sent $currency_name &2an $receiver&2 bezahlt, der nach Steuern $amount_received erhalten hat!' + Economy currency left message: Du hast jetzt &2$amount_left $currency_name + Economy money from payment message: Du hast &2$amount_received $currency_name &fvon $sender erhalten + Economy payment insuficient currency: '&cDu hast nicht genug $currency_name um das zu tun!' + Wallet command message: Du hast &2$balance $currency_name + Tax confirmation message: '&cDas Senden einer Zahlung wird $percentage% Steuern kosten. &aBenutze &9$command &aum fortzufahren!' + shopBatchSellItem: '&aDu hast den Gegenstand &afür $currency_amount $currency_name verkauft!' + Shop buy message: '&aDu hast $item_name &afür $item_value $currency_name gekauft!' + Shop current balance message: '&aDu hast $currency_amount $currency_name.' + Shop insufficient funds message: '&cDu hast nicht genug $currency_name!' + Shop item cost message: Dieser Gegenstand kostet &c$item_value $currency_name. + Shop sell message: '&aDu hast $item_name &afür $currency_amount $currency_name verkauft!' + Shop sale player items warning: '&cDu kannst keine Gegenstände verkaufen, die momentan nicht mit dir verbunden sind! Dazu gehören Gegenstände aus anderen Prestigestufe!' + Shop sale instructions: '&cDu kannst hier nur EliteMobs Beute verkaufen! (Rüstung / Waffen von Elitegegnern zeigen ihren Wert in der Lore)' + Teleport time left: '&7[EM] Teleportiere in &a$time &7Sekunden...' + Teleport cancelled: '&7[EM] &cTeleport unterbrochen!' + noPendingCommands: '&cDu hast momentan keine ausstehenden Befehle!' + trackMessage: Verfolge $name + chestLowRankMessage: '&7[EM] &cEurer Gildenrang muss mindestens $rank &csein, um diese Truhe zu öffnen!' + chestCooldownMessage: '&7[EM] &cDu hast diese Truhe bereits kürzlich geöffnet! Warte $time!' + insufficientCurrencyForWormholeMessage: '&8[EliteMobs] &cUnzureichende Währung! Du benötigst $amount, um dieses com.magmaguy.elitemobs.wormhole benutzen zu können!' + dismissEMMessage: '&8 [EliteMobs] &2 /elitemobs &fDas Menü funktioniert nicht für dich? Versuche stattdessen den Befehl &2/elitemobs alt &f, um eine alternative Version des Menüs zu sehen! &cMöchtest du diese Nachricht nicht noch einmal sehen? schreibe &4/em dismiss' + switchEMStyleMessage: '&8[EliteMobs] &2/elitemobs &fmenu-Stil geändert! Probiere es aus!' +EconomySettings: + currencyName: Elite-Behälter + chatCurrencyShowerMessage: '&7[EM] Du hast &a$amount $currency_name aufgenommen!' + actionbarCurrencyShowerMessage: '&7[EM] Du hast &a$amount $currency_name aufgenommen!' + adventurersGuildNotificationMessages: '&7[EM] Zusätzliches Geld ausgeben? Versuchen Sie &a/em !' +arrow_damage: + name: Stärke +arrow_fire: + name: Flamme +arrow_infinite: + name: Unendlichkeit +arrow_knockback: + name: Schlag +binding_curse: + name: Fluch der Bindung +channeling: + name: Entladung +critical_strikes: + name: Kritischer Treffer + criticalHitPopup: '&5Kritischer Treffer!' +damage_all: + name: Schärfe +damage_arthropods: + name: Nemesis der Gliederfüsser +damage_undead: + name: Bann +depth_strider: + name: Wasserläufer +dig_speed: + name: Effizienz +drilling: + name: Bohren +durability: + name: Haltbarkeit +earthquake: + name: Erdbeben + earthquakeActivationMessage: '&8[EliteMobs] &aErdbeben ausgelöst! &c2 min Abklingzeit!' + earthquakeAvailableMessage: '&8[EliteMobs] &2Erdbeben-Abklingzeit vorbei!' +fire_aspect: + name: Verbrennung +flamethrower: + name: Flammenwerfer +frost_walker: + name: Eisläufer +grappling_hook: + name: Greifarm +hunter: + name: Jäger +ice_breaker: + name: Eisbrecher +impaling: + name: Harpune +knockback: + name: Rückstoss +lightning: + name: Blitz +loot_bonus_blocks: + name: Glück +loot_bonus_mobs: + name: Plünderung +loud_strikes: + name: Laute Schläge +loyalty: + name: Treue +lure: + name: Köder +mending: + name: Reperatur +meteor_shower: + name: Meteor hagel +multishot: + name: Mehrfachschuss +oxygen: + name: Atmung +piercing: + name: Durchschuss +plasma_boots: + name: Plasma-Stiefel +protection_environmental: + name: Schutz +protection_explosions: + name: Explosionsschutz +protection_fall: + name: Federfall +protection_fire: + name: Feuerschutz +protection_projectile: + name: Schusssicher +quick_charge: + name: Schnellladen +riptide: + name: Sog +silk_touch: + name: Behutsamkeit +soulbind: + name: Seelenbund + loreStrings: '&7Seelengebunden an &f$player' + hologramString: '$player&f''s' +summon_merchant: + name: Beschwöre Händler + message: Jeeves! +summon_wolf: + name: Beschwöre Wolf +sweeping_edge: + name: Schwungkraft +thorns: + name: Dornen +unbind: + name: Entbinden +vanishing_curse: + name: Fluch des Verschwindens +water_worker: + name: Wasseraffinität +AntiExploit: + AntiExploit message: '&c[EM AntiExploit] &7In der Nähe der Elite wird keine spezielle Beute fallen.' +CombatTag: + Combat tag message: '&c[EliteMobs] Kampftag aktiviert!' +AdventurersGuild: + adventurersGuildMenuName: '&6§lAbenteurer Gilde' + Prestige 0 rank 0: '&8Commoner - deaktivier Eliten!' + Prestige 0 rank 0 short placeholder: '&6&l✧&e0' + Prestige 0 rank 1: '&fAnfänger' + Prestige 0 rank 1 short placeholder: '&6&l✧&eⅠ' + Prestige 0 rank 2: '&fNeuling' + Prestige 0 rank 2 short placeholder: '&6&l✧&eⅠⅠ' + Prestige 0 rank 3: '&fLehrling' + Prestige 0 rank 3 short placeholder: '&6&l✧&eⅠⅠⅠ' + Prestige 0 rank 4: '&2Abenteurer' + Prestige 0 rank 4 short placeholder: '&6&l✧&eⅠⅤ' + Prestige 0 rank 5: '&2Reisender' + Prestige 0 rank 5 short placeholder: '&6&l✧&eⅤ' + Prestige 0 rank 6: '&2Adept' + Prestige 0 rank 6 short placeholder: '&6&l✧&eⅤⅠ' + Prestige 0 rank 7: '&1Veteran' + Prestige 0 rank 7 short placeholder: '&6&l✧&eⅤⅠⅠ' + Prestige 0 rank 8: '&1Elite' + Prestige 0 rank 8 short placeholder: '&6&l✧&eⅤⅠⅠⅠ' + Prestige 0 rank 9: '&lMaster' + Prestige 0 rank 9 short placeholder: '&6&l✧&eⅠⅩ' + Prestige 0 rank 10: '&5Held' + Prestige 0 rank 10 short placeholder: '&6&l✧&eⅩ' + Prestige 1 rank 0: '&ePrestige 1 &8Bürgerlicher' + Prestige 1 rank 0 short placeholder: '&e⚜Ⅰ&6&l✧&e0' + Prestige 1 rank 1: '&ePrestige 1 &fAnfänger' + Prestige 1 rank 1 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠ' + Prestige 1 rank 2: '&ePrestige 1 &fNeuling' + Prestige 1 rank 2 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅠ' + Prestige 1 rank 3: '&ePrestige 1 &fLehrling' + Prestige 1 rank 3 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅠⅠ' + Prestige 1 rank 4: '&ePrestige 1 &2Abenteurer' + Prestige 1 rank 4 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅤ' + Prestige 1 rank 5: '&ePrestige 1 &2Reisender' + Prestige 1 rank 5 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤ' + Prestige 1 rank 6: '&ePrestige 1 &2Adept' + Prestige 1 rank 6 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠ' + Prestige 1 rank 7: '&ePrestige 1 &1Veteran' + Prestige 1 rank 7 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠⅠ' + Prestige 1 rank 8: '&ePrestige 1 &1Elite' + Prestige 1 rank 8 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠⅠⅠ' + Prestige 1 rank 9: '&ePrestige 1 &5Meister' + Prestige 1 rank 9 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅩ' + Prestige 1 rank 10 short placeholder: '&e⚜Ⅰ&6&l✧&eⅩ' + Prestige 1 rank 10: '&ePrestige 1 &5Held' + Prestige 1 rank 11: '&ePrestige 1 &5Legende' + Prestige 1 rank 11 short placeholder: '&e⚜Ⅰ&6&l✧&eⅩⅠ' + Prestige 2 rank 0: '&ePrestige 2 &8Bürgerlicher' + Prestige 2 rank 0 short placeholder: '&2⚜ⅠⅠ&6&l✧&e0' + Prestige 2 rank 1: '&2Prestige 2 &fAnfänger' + Prestige 2 rank 1 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠ' + Prestige 2 rank 2: '&2Prestige 2 &fNeuling' + Prestige 2 rank 2 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅠ' + Prestige 2 rank 3: '&2Prestige 2 &fLehrling' + Prestige 2 rank 3 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 2 rank 4: '&2Prestige 2 &2Abenteurer' + Prestige 2 rank 4 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅤ' + Prestige 2 rank 5: '&2Prestige 2 &2Reisender' + Prestige 2 rank 5 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤ' + Prestige 2 rank 6: '&2Prestige 2 &2Adept' + Prestige 2 rank 6 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠ' + Prestige 2 rank 7: '&2Prestige 2 &1Veteran' + Prestige 2 rank 7 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 2 rank 8: '&2Prestige 2 &1Elite' + Prestige 2 rank 8 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 2 rank 9: '&2Prestige 2 &5Meister' + Prestige 2 rank 9 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅩ' + Prestige 2 rank 10 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩ' + Prestige 2 rank 10: '&2Prestige 2 &5Held' + Prestige 2 rank 11: '&2Prestige 2 &5Legende' + Prestige 2 rank 11 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩⅠ' + Prestige 2 rank 12: '&2Prestige 2 &5Mythos' + Prestige 2 rank 12 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 3 rank 0: '&aPrestige 3 &8Bürgerlicher' + Prestige 3 rank 0 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&e0' + Prestige 3 rank 1: '&aPrestige 3 &fAnfänger' + Prestige 3 rank 1 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠ' + Prestige 3 rank 2: '&aPrestige 3 &fNeuling' + Prestige 3 rank 2 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠ' + Prestige 3 rank 3: '&aPrestige 3 &fLehrling' + Prestige 3 rank 3 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 3 rank 4: '&aPrestige 3 &2Abenteurer' + Prestige 3 rank 4 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅤ' + Prestige 3 rank 5: '&aPrestige 3 &2Reisender' + Prestige 3 rank 5 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤ' + Prestige 3 rank 6: '&aPrestige 3 &2Adept' + Prestige 3 rank 6 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠ' + Prestige 3 rank 7: '&aPrestige 3 &1Veteran' + Prestige 3 rank 7 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 3 rank 8: '&aPrestige 3 &1Elite' + Prestige 3 rank 8 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 3 rank 9: '&aPrestige 3 &5Meister' + Prestige 3 rank 9 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅩ' + Prestige 3 rank 10 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩ' + Prestige 3 rank 10: '&aPrestige 3 &5Held' + Prestige 3 rank 11: '&aPrestige 3 &5Legende' + Prestige 3 rank 11 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠ' + Prestige 3 rank 12: '&aPrestige 3 &5Mythos' + Prestige 3 rank 12 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 3 rank 13: '&aPrestige 3 &5Unsterblich' + Prestige 3 rank 13 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 4 rank 0: '&3Prestige 4 &8Bürgerlicher' + Prestige 4 rank 0 short placeholder: '&3⚜ⅠⅤ&6&l✧&e0' + Prestige 4 rank 1: '&3Prestige 4 &fAnfänger' + Prestige 4 rank 1 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠ' + Prestige 4 rank 2: '&3Prestige 4 &fNeuling' + Prestige 4 rank 2 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅠ' + Prestige 4 rank 3: '&3Prestige 4 &fLehrling' + Prestige 4 rank 3 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅠⅠ' + Prestige 4 rank 4: '&3Prestige 4 &2Abenteurer' + Prestige 4 rank 4 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅤ' + Prestige 4 rank 5: '&3Prestige 4 &2Reisender' + Prestige 4 rank 5 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤ' + Prestige 4 rank 6: '&3Prestige 4 &2Adept' + Prestige 4 rank 6 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠ' + Prestige 4 rank 7: '&3Prestige 4 &1Veteran' + Prestige 4 rank 7 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠⅠ' + Prestige 4 rank 8: '&3Prestige 4 &1Elite' + Prestige 4 rank 8 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠⅠⅠ' + Prestige 4 rank 9: '&3Prestige 4 &5Meister' + Prestige 4 rank 9 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅩ' + Prestige 4 rank 10 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩ' + Prestige 4 rank 10: '&3Prestige 4 &5Held' + Prestige 4 rank 11: '&3Prestige 4 &5Legende' + Prestige 4 rank 11 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠ' + Prestige 4 rank 12: '&3Prestige 4 &5Mythos' + Prestige 4 rank 12 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅠ' + Prestige 4 rank 13: '&3Prestige 4 &5Unsterblich' + Prestige 4 rank 13 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅠⅠ' + Prestige 4 rank 14: '&3Prestige 4 &5Ausgewählter' + Prestige 4 rank 14 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅤ' + Prestige 5 rank 0: '&bPrestige 5 &8Bürgerlicher' + Prestige 5 rank 0 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 5 rank 1: '&bPrestige 5 &fAnfänger' + Prestige 5 rank 1 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠ' + Prestige 5 rank 2: '&bPrestige 5 &fNeuling' + Prestige 5 rank 2 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅠ' + Prestige 5 rank 3: '&bPrestige 5 &fLehrling' + Prestige 5 rank 3 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅠⅠ' + Prestige 5 rank 4: '&bPrestige 5 &2Abenteurer' + Prestige 5 rank 4 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅤ' + Prestige 5 rank 5: '&bPrestige 5 &2Reisender' + Prestige 5 rank 5 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤ' + Prestige 5 rank 6: '&bPrestige 5 &2Adept' + Prestige 5 rank 6 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠ' + Prestige 5 rank 7: '&bPrestige 5 &1Veteran' + Prestige 5 rank 7 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠⅠ' + Prestige 5 rank 8: '&bPrestige 5 &1Elite' + Prestige 5 rank 8 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠⅠⅠ' + Prestige 5 rank 9: '&bPrestige 5 &5Meister' + Prestige 5 rank 9 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅩ' + Prestige 5 rank 10 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩ' + Prestige 5 rank 10: '&bPrestige 5 &5Held' + Prestige 5 rank 11: '&bPrestige 5 &5Legende' + Prestige 5 rank 11 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠ' + Prestige 5 rank 12: '&bPrestige 5 &5Mythos' + Prestige 5 rank 12 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅠ' + Prestige 5 rank 13: '&bPrestige 5 &5Unsterblich' + Prestige 5 rank 13 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅠⅠ' + Prestige 5 rank 14: '&bPrestige 5 &5Ausgewählter' + Prestige 5 rank 14 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅤ' + Prestige 5 rank 15: '&bPrestige 5 &5Ascendant' + Prestige 5 rank 15 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅤ' + Prestige 6 rank 0: '&4Prestige 6 &8Bürgerlicher' + Prestige 6 rank 0 short placeholder: '&4⚜ⅤⅠ&6&l✧&e0' + Prestige 6 rank 1: '&4Prestige 6 &fAnfänger' + Prestige 6 rank 1 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠ' + Prestige 6 rank 2: '&4Prestige 6 &fNeuling' + Prestige 6 rank 2 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅠ' + Prestige 6 rank 3: '&4Prestige 6 &fLehrling' + Prestige 6 rank 3 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅠⅠ' + Prestige 6 rank 4: '&4Prestige 6 &2Abenteurer' + Prestige 6 rank 4 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅤ' + Prestige 6 rank 5: '&4Prestige 6 &2Reisender' + Prestige 6 rank 5 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤ' + Prestige 6 rank 6: '&4Prestige 6 &2Adept' + Prestige 6 rank 6 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠ' + Prestige 6 rank 7: '&4Prestige 6 &1Veteran' + Prestige 6 rank 7 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠⅠ' + Prestige 6 rank 8: '&4Prestige 6 &1Elite' + Prestige 6 rank 8 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 6 rank 9: '&4Prestige 6 &5Meister' + Prestige 6 rank 9 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅩ' + Prestige 6 rank 10 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩ' + Prestige 6 rank 10: '&4Prestige 6 &5Held' + Prestige 6 rank 11: '&4Prestige 6 &5Legende' + Prestige 6 rank 11 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠ' + Prestige 6 rank 12: '&4Prestige 6 &5Mythos' + Prestige 6 rank 12 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠ' + Prestige 6 rank 13: '&4Prestige 6 &5Unsterblich' + Prestige 6 rank 13 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 6 rank 14: '&4Prestige 6 &5Ausgewählter' + Prestige 6 rank 14 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅤ' + Prestige 6 rank 15: '&4Prestige 6 &5Ascendant' + Prestige 6 rank 15 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤ' + Prestige 6 rank 16: '&4Prestige 6 &5Titan' + Prestige 6 rank 16 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤⅠ' + Prestige 7 rank 0: '&cPrestige 7 &8Bürgerlicher' + Prestige 7 rank 0 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&e0' + Prestige 7 rank 1: '&cPrestige 7 &fAnfänger' + Prestige 7 rank 1 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠ' + Prestige 7 rank 2: '&cPrestige 7 &fNeuling' + Prestige 7 rank 2 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅠ' + Prestige 7 rank 3: '&cPrestige 7 &fLehrling' + Prestige 7 rank 3 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 7 rank 4: '&cPrestige 7 &2Abenteurer' + Prestige 7 rank 4 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅤ' + Prestige 7 rank 5: '&cPrestige 7 &2Reisender' + Prestige 7 rank 5 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤ' + Prestige 7 rank 6: '&cPrestige 7 &2Adept' + Prestige 7 rank 6 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠ' + Prestige 7 rank 7: '&cPrestige 7 &1Veteran' + Prestige 7 rank 7 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 7 rank 8: '&cPrestige 7 &1Elite' + Prestige 7 rank 8 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 7 rank 9: '&cPrestige 7 &5Meister' + Prestige 7 rank 9 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅩ' + Prestige 7 rank 10 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩ' + Prestige 7 rank 10: '&cPrestige 7 &5Held' + Prestige 7 rank 11: '&cPrestige 7 &5Legende' + Prestige 7 rank 11 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠ' + Prestige 7 rank 12: '&cPrestige 7 &5Mythos' + Prestige 7 rank 12 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 7 rank 13: '&cPrestige 7 &5Unsterblich' + Prestige 7 rank 13 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 7 rank 14: '&cPrestige 7 &5Ausgewählter' + Prestige 7 rank 14 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅤ' + Prestige 7 rank 15: '&cPrestige 7 &5Ascendant' + Prestige 7 rank 15 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤ' + Prestige 7 rank 16: '&cPrestige 7 &5Titan' + Prestige 7 rank 16 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤⅠ' + Prestige 7 rank 17: '&cPrestige 7 &5Halbgott' + Prestige 7 rank 17 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤⅠⅠ' + Prestige 8 rank 0: '&9Prestige 8 &8Bürgerlicher' + Prestige 8 rank 0 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&e0' + Prestige 8 rank 1: '&9Prestige 8 &fAnfänger' + Prestige 8 rank 1 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠ' + Prestige 8 rank 2: '&9Prestige 8 &fNeuling' + Prestige 8 rank 2 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅠ' + Prestige 8 rank 3: '&9Prestige 8 &fLehrling' + Prestige 8 rank 3 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 8 rank 4: '&9Prestige 8 &2Abenteurer' + Prestige 8 rank 4 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅤ' + Prestige 8 rank 5: '&9Prestige 8 &2Reisender' + Prestige 8 rank 5 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤ' + Prestige 8 rank 6: '&9Prestige 8 &2Adept' + Prestige 8 rank 6 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠ' + Prestige 8 rank 7: '&9Prestige 8 &1Veteran' + Prestige 8 rank 7 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 8 rank 8: '&9Prestige 8 &1Elite' + Prestige 8 rank 8 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 8 rank 9: '&9Prestige 8 &5Meister' + Prestige 8 rank 9 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅩ' + Prestige 8 rank 10 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩ' + Prestige 8 rank 10: '&9Prestige 8 &5Held' + Prestige 8 rank 11: '&9Prestige 8 &5Legende' + Prestige 8 rank 11 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠ' + Prestige 8 rank 12: '&9Prestige 8 &5Mythos' + Prestige 8 rank 12 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 8 rank 13: '&9Prestige 8 &5Unsterblich' + Prestige 8 rank 13 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 8 rank 14: '&9Prestige 8 &5Ausgewählter' + Prestige 8 rank 14 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅤ' + Prestige 8 rank 15: '&9Prestige 8 &5Ascendant' + Prestige 8 rank 15 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤ' + Prestige 8 rank 16: '&9Prestige 8 &5Titan' + Prestige 8 rank 16 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠ' + Prestige 8 rank 17: '&9Prestige 8 &5Halbgott' + Prestige 8 rank 17 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠⅠ' + Prestige 8 rank 18: '&9Prestige 8 &5Gottheit' + Prestige 8 rank 18 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 9 rank 0: '&dPrestige 9 &8Bürgerlicher' + Prestige 9 rank 0 short placeholder: '&d⚜ⅠⅩ&6&l✧&e0' + Prestige 9 rank 1: '&dPrestige 9 &fAnfänger' + Prestige 9 rank 1 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠ' + Prestige 9 rank 2: '&dPrestige 9 &fNeuling' + Prestige 9 rank 2 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅠ' + Prestige 9 rank 3: '&dPrestige 9 &fLehrling' + Prestige 9 rank 3 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅠⅠ' + Prestige 9 rank 4: '&dPrestige 9 &2Abenteurer' + Prestige 9 rank 4 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅤ' + Prestige 9 rank 5: '&dPrestige 9 &2Reisender' + Prestige 9 rank 5 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤ' + Prestige 9 rank 6: '&dPrestige 9 &2Adept' + Prestige 9 rank 6 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠ' + Prestige 9 rank 7: '&dPrestige 9 &1Veteran' + Prestige 9 rank 7 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠⅠ' + Prestige 9 rank 8: '&dPrestige 9 &1Elite' + Prestige 9 rank 8 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠⅠⅠ' + Prestige 9 rank 9: '&dPrestige 9 &5Meister' + Prestige 9 rank 9 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅩ' + Prestige 9 rank 10 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩ' + Prestige 9 rank 10: '&dPrestige 9 &5Held' + Prestige 9 rank 11: '&dPrestige 9 &5Legende' + Prestige 9 rank 11 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠ' + Prestige 9 rank 12: '&dPrestige 9 &5Mythos' + Prestige 9 rank 12 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅠ' + Prestige 9 rank 13: '&dPrestige 9 &5Unsterblich' + Prestige 9 rank 13 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅠⅠ' + Prestige 9 rank 14: '&dPrestige 9 &5Ausgewählter' + Prestige 9 rank 14 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅤ' + Prestige 9 rank 15: '&dPrestige 9 &5Ascendant' + Prestige 9 rank 15 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤ' + Prestige 9 rank 16: '&dPrestige 9 &5Titan' + Prestige 9 rank 16 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠ' + Prestige 9 rank 17: '&dPrestige 9 &5Halbgott' + Prestige 9 rank 17 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠⅠ' + Prestige 9 rank 18: '&dPrestige 9 &5Gottheit' + Prestige 9 rank 18 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 9 rank 19: '&dPrestige 9 &5Gottjäger' + Prestige 9 rank 19 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅩ' + Prestige 10 rank 0: '&5Prestige 10 &8Bürgerlicher' + Prestige 10 rank 0 short placeholder: '&5⚜Ⅹ&6&l✧&e0' + Prestige 10 rank 1: '&5Prestige 10 &fAnfänger' + Prestige 10 rank 1 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠ' + Prestige 10 rank 2: '&5Prestige 10 &fNeuling' + Prestige 10 rank 2 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠ' + Prestige 10 rank 3: '&5Prestige 10 &fLehrling' + Prestige 10 rank 3 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠⅠ' + Prestige 10 rank 4: '&5Prestige 10 &2Abenteurer' + Prestige 10 rank 4 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅤ' + Prestige 10 rank 5: '&5Prestige 10 &2Reisender' + Prestige 10 rank 5 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤ' + Prestige 10 rank 6: '&5Prestige 10 &2Adept' + Prestige 10 rank 6 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠ' + Prestige 10 rank 7: '&5Prestige 10 &1Veteran' + Prestige 10 rank 7 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠ' + Prestige 10 rank 8: '&5Prestige 10 &1Elite' + Prestige 10 rank 8 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠⅠ' + Prestige 10 rank 9: '&5Prestige 10 &5Meister' + Prestige 10 rank 9 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅩ' + Prestige 10 rank 10 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩ' + Prestige 10 rank 10: '&5Prestige 10 &5Held' + Prestige 10 rank 11: '&5Prestige 10 &5Legende' + Prestige 10 rank 11 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠ' + Prestige 10 rank 12: '&5Prestige 10 &5Mythos' + Prestige 10 rank 12 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅠ' + Prestige 10 rank 13: '&5Prestige 10 &5Unsterblich' + Prestige 10 rank 13 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅠⅠ' + Prestige 10 rank 14: '&5Prestige 10 &5Ausgewählter' + Prestige 10 rank 14 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅤ' + Prestige 10 rank 15: '&5Prestige 10 &5Ascendant' + Prestige 10 rank 15 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤ' + Prestige 10 rank 16: '&5Prestige 10 &5Titan' + Prestige 10 rank 16 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠ' + Prestige 10 rank 17: '&5Prestige 10 &5Halbgott' + Prestige 10 rank 17 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠⅠ' + Prestige 10 rank 18: '&5Prestige 10 &5Gottheit' + Prestige 10 rank 18 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 10 rank 19: '&5Prestige 10 &5Gottjäger' + Prestige 10 rank 19 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅩ' + Prestige 10 rank 20: '&5Prestige 10 &5Göttertöter' + Prestige 10 rank 20 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅩ' + lootLimiterMessage: '&7[EM] &cDu musst zunächst den nächsten Gilden Rang mit /ag freischalten um bessere Items zu erhalten!' + prestigeUnlockMessageTitle: '$player' + prestigeUnlockMessageSubtitle: '&2hat $tier&2 freigeschaltet!' +buy_or_sell_menu: + Shop name: '[EM] Kaufen oder Verkaufen' +custom_quest_screen: + headerTextLines2: | + &a&l『&c&l$questName&a&l』 + acceptTextLines: '&a&l[Annehmen!]' + acceptHoverLines: "&aKlicke auf \n&aAufgabe annehmen!" + acceptedTextLines: '&2&lAkzeptiert! &aMit $npcName reden &4[Abandon]' + acceptedHoverLines: '&aKlicke, um die Aufgabe abzubrechen!' + trackTextLines: '&2&l[Verfolgen]' + trackHoverLines: '&aKlicke hier um die Aufgabe zu verfolgen!' + untrackTextLines: '&4&l[Entfolgen]' + untrackHoverLines: '&cKicke hier um die Aufgabe zu entfolgen!' + completedTextLines: '&2&l[Gehe zu!]' + completedHoverLines: '&aKlicke hier, um die Quest abzugeben!' + turnedInTextLines: '&8[Abgeschlossen!]' + turnedInHoverLines: '&8Schon abgegeben!' + objectivesLine: '&c&lZiele:' + killQuestDefaultSummaryLine: '&c➤Erlege $name:$color$current&0/$color$target' + fetchQuestDefaultSummaryLine: '&c➤Erhalte $name:$color&$current&0/$color$target' + dialogQuestDefaultSummaryLine: '&c➤Gehe und sprich zu $name $location' + rewardsLine: '&2&lBelohnungen:' + rewardsDefaultSummaryLine: '&2➤$amountx $rewardName &8($chance%)' +custom_shop_menu: + Shop name: '[EM] Eigener Laden' + Full inventory message: '[EliteMobs] &4Dein Inventar is voll! Du kannst keine Items kaufen bis du freie plätze hast.' +dynamic_quest_screen: + questName: Töte $amount $name + headerTextLines2: |- + &c&lGildenanfrage! + &0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ + defaultLoreTextLines: '&8Schlage $amount $name!' + acceptTextLines: '&a&lAnnehmen!' + acceptHoverLines: "&aKlicke um die\n&aAufgabe anzunehmen!" + acceptedTextLines: '&2&lAngenommen! &4[Abbrechen]' + acceptedHoverLines: '&aKlicke hier, um die Aufgabe abzubrechen!' + completedTextLines: '&2&l[Gehe zu!]' + completedHoverLines: '&aKlicke hier, um die Quest abzugeben!' + turnedInTextLines: '&8[Abgeschlossen!]' + turnedInHoverLines: '&8Schon abgegeben!' + objectivesLine: '&c&lZiele:' + killQuestDefaultSummaryLine: '&c➤Erlege $name:$color$current&0/$color$target' + rewardsLine: '&2&lBelohnungen:' + rewardsDefaultSummaryLine: '&2➤$amountx $rewardName &8($chance%)' +enhancement_menu: + shopName: '[EM] Verbesserungsmenü!' +get_loot_menu: + Menu name: '[EM] Loot hol Menü' + tierTranslation: Stufe + itemFilterTranslation: Filtere nach Gegenständen in dieser Ebene. +guild_rank_selector_menu: + questTierSelectorMenuTitle: '[EM] Gilden Rang Selektion' + lowTierWarning: '&cEliten können kein besseres Loot fallen lassen!' + normalTierWarning: '&aEliten können besseres Loot fallen lassen!' + notEnoughCurrencyMessages: '&7[EliteMobs] &4Du hast nicht genug Elite Coins ($neededAmount $currencyName)! Verkaufe dein Elite Mob loot an [/em shop]! Du hast $currentAmount $currencyName.' + unlockMessages: "&7[EliteMobs] &aDu hast den $rankName &arang für $price freigeschalten\\ \\ $currencyName. \n&6Fröhliches jagen!" + questCompleteBroadcastMessages: '&7[EliteMobs] &a$player &ahat den $rankName &aGilden Rang erreicht!' + failedMessages: '&7[EliteMobs] &cDu musst zuerst die anderen Ränge freischalten!' + spawnRateModifierMessages: '&fElite Mob Spawn Rate Modifikator: &c$modifier%' + lootModifierMessages: '&fElite Mob loot Modifikator: &a$modifier%' + difficultyModifierMessages: '&fElite Mob Schwierigkeits Modifikator: &c$modifier%' + lootTierMessages: '&2Eliten können bis zu Stufe $tier loot fallen lassen!' + currencyBonusMessages: '&a$amountx Münzen aus Drops und Aufgaben!' + healthBonusMessages: '&cFügt $amount ❤ Maximales Leben hinzu' + critBonusMessages: '&eFügt $amount% Kritische Treffer chance hinzu' + dodgeBonusMessages: '&8Fügt $amount% Auswichchance hinzu' +player_status_screen: + indexTexts0: '&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + indexTexts1: '&5&l/ag &7- &6EliteMobs Hub' + indexHovers1: |- + Klicke zum benutzen + Der Ort an dem du NPCs findest + die dir Quests geben, items kaufen + und verkaufen, dir Ratschläge geben + und mehr! + indexTexts2: '&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + indexTexts4: '&6&lIndex' + indexTexts6: '&bp. $statsPage &8- &6Stats' + indexHovers6: Klicke um zu gehen! + indexTexts7: '&bp. $gearPage &8- &6Ausrüstung' + indexHovers7: Klicke um zu gehen! + indexTexts8: '&bp. $teleportsPage &8- &6Teleports' + indexHovers8: Klicke um zu gehen! + indexTexts9: '&bp. $commandsPage &8- &6Kommandos' + indexHovers9: Klicke um zu gehen! + indexTexts10: '&bp. $questsPage &8- &6Quest Journal' + indexHovers10: Klicke um zu gehen! + indexTexts11: '&bp. $bossTrackingPage &8- &6Boss Verfolgung' + indexHovers11: Klicke um zu gehen! + statsText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + statsText1: '&5&lSpieler Statistiken:' + statsText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + statsText4: '&2Geld: &a$money' + statsHover4: |- + Töte Elite-Mobs, um Währung zu plündern oder + ihre Beute im /em Shop zu verkaufen oder + Schließe Aufgaben ab! + statsText6: '&6Gilden Stufe: &3$guildtier' + statsHover6: |- + Prestige Stufe und Gilden Rang: + Gilden Rang bestimmt wie gut dein Loot sein kann, den Bonus von deiner Prestige Stufe, und ähnliches. Deine Prestige Stufe schaltet extrem starke belohnungen frei, so wie erhöte maximale HP, die chance auszuweichen und kritischen Schaden zuzufügen, erhöhte Geld belohnungen, und mehr! Du kannst deine Gilden und Prestige Level bei /ag erhöhen! + ⚜ = prestige rank, ✧ = guild rank! + statsText7: '&4Elite Kills: &c$kills' + statsHover7: Menge der getöteten Eliten. + statsText8: '&4Max Lvl getötet: &c$highestkill' + statsHover8: |- + Das Höchste Level eines getötetn Eliten. + Elite Mob Level basieren auf dem Level + deiner Ausrüstung. Bessere Ausrüstung, + Stärkere Gegner! + Notiz: Nur legitime kills werden gezählt! + statsText9: '&4Elite Tode: &c$deaths' + statsHover9: Wie oft du gegen Eliten gestorben bist. + statsText10: '&5Quests Vervollständigt: &d$quests' + statsHover10: |- + Anzahl der abgeschlossenen EliteMobs-Aufgaben. + Du kannst Aufgaben annehmen, indem du mit NPCs sprichst! + statsText12: '&bPunktzahl: &3$score' + statsHover12: |- + Deine EliteMobs Punktzahl. Sie + erhöht sich wenn du Eliten tötest, + und sie sinkt wenn du von einem + Eliten getötet wirst. Eliten mit + höherem Level geben mehr Punkte. + gearText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + gearText1: '&7&lRüstung & Waffen:' + gearText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + gearText3: '&8&lAusrüstungsstufen:' + gearText4: ' ☠ - $helmettier' + gearHover4: '$helmet' + gearText5: ' ▼ - $chestplatetier' + gearHover5: '$chestplate' + gearText6: ' Π - $leggingstier' + gearHover6: '$leggings' + gearText7: ' ╯╰ - $bootstier' + gearHover7: '$boots' + gearText8: '{⚔ - $mainhandtier} {⛨ - $offhandtier}' + gearHover8: '{$mainhand}{$offhand}' + gearText10: '{dmg : $damage} {armr: $armor}' + gearHover10: '{Base damage dealt to Elite Mobs}{Damage reduction from Elite Mobs}' + gearText11: 'Gefahren Level: $threat' + gearHover11: | + Dies bestimmt den Level der Eliten + die in deiner nähe spawnen. + Berücksichtigt Rüstung, Waffen in + deinen Händen, und deine Gilden + Stufe. + teleportText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + teleportText1: '&2&lTeleports' + teleportText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + teleportText3: Spawn + teleportHover3: Teleportiert dich zum Spawn! + teleportText4: '&6§lAbenteurer Gilde' + teleportHover4: Teleportiert dich zur Abenteurer Gilde! + onTeleportsHover: Klicke zum Teleportieren! + commandsText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + commandsText1: '&3&lKommandos:' + commandsText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + commandsText4: '&5/ag' + commandsHover4: |- + Klicke zum benutzen + Der Ort an dem du NPCs findest + die dir Quests geben, items kaufen + und verkaufen, dir Ratschläge geben + und mehr! + commandsText6: '&5/shareitem' + commandsHover6: |- + Klicke zum benutzen! + Teilt das item in deiner + Hand im chat! + questTrackerText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + questTrackerText1: '&6&lQuests:' + questTrackerHover1: Sprecht mit NPCs, um Quests anzunehmen! + questTrackerText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + onQuestTrackHover: Klicke um aufzugeben! + bossTrackerText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + bossTrackerText1: '&4&lBoss Verfolger:' + bossTrackerHover1: Grosse Bosse werden hier angezeigt! + bossTrackerText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + onBossTrackHover: Klicke um zu verfolgen/auszublenden! + teleportChestMenuName: '&2EliteMobs Teleportationen' + bossTrackerChestMenuName: '&2EliteMobs Boss Verfolgung' + indexChestMenuName: '&2EliteMobs Inhalt' + gearChestMenuName: '&2EliteMobs Ausrüstung' + statsChestMenuName: '&2EliteMobs Statistik' + commandsChestMenuName: '&2EliteMobs Befehle' +procedural_shop_menu: + Shop name: '[EM] Prozeduraler Item Laden' + Full inventory message: '&7[EliteMobs] &4Dein Inventar is voll! Du kannst keine Items kaufen bis du etwas Platz hast.' +quest_menu: + menuName: '[EM] Quest Auswahl' + cancelQuestMessage1: '&c&l&m&o---------------------------------------------&cDu kannst nur einen Quest aktiv haben! Wenn du du deinen aktuellen Quest aufgibst, wird dein Quest Fortschritt zurückgesetzt!' + cancelQuestMessage2: '&2[Klicke hier um deinen Quest aufzugeben!]' + cancelQuestMessage3: '&7Du kannst deinen Quest fortschritt mit dem Kommando &a/em einsehen&c&l&m&o---------------------------------------------' + questCancelMessage: '&7[EliteMobs] &cDu hast deinen Quest aufgegeben!' + questStartTitle: Du hast einen Quest akzeptiert! + questStartSubtitle: Töte $objectiveAmount $objectiveName + questCompleteTitle: Quest erfolgreich! + questCompleteSubtitle: Du hast $objectiveAmount $objectiveName getötet + bossBarObjective: Töte $objectiveAmount $objectiveName + questRewardMessage: '&7[EM] &aQuest erfolgreich! &6Deine Belohnung ist &2$reward $currencyName' + questCompleteBroadcastMessage: '&7[EM] $player &2hat einen $rank &2quest erledigt!' + questStartBroadcastMessage: '&7[EM] $player &2hat einen $rank &2quest akzeptiert!' + questStatusMessage: '&7[EM] &adu hast &a$currentAmount &f/ &c$objectiveAmount &a$objectiveName getötet' +refiner_menu: + shopName: '[EM] Platziere 10 Schrott!' +repair_menu: + shopName: '[EM] Reparatur-Menü!' +scrapper_menu: + shopName: '[EM] Schrottsammler & Recycler' +sell_menu: + shopName: '[EM] Verkaufs Laden' +smelt_menu: + shopName: '[EM] Platziere 25x Schrott!' +unbind_menu: + shopName: '[EM] Entbindunsmenü!' +taunt: + onDamaged: + - Aua! + - Oi! + - Lass das! + - Warum?! + - Du kämpfst wie ein Milchbauern! + - Du bist ein Schmerz im Rücken! + - En garde! Touche! + - Man! + - Meine Gesundheit ist gebrochen, untötbar! + - Deine Treffer machen mich nur stärker! + - Vollkommen überflüssig... + - 'Das ist nur eine Fleischwunde!' + - Imperium beschützt! + - Herobrine, hilf mir! + - Hinter dir! Ein Creeper! + - Ich habe einen schrecklichen Fehler begangen. + - Was mich nicht tötet... + - Zombies machen Narben + - Ich werde dir meine wahre Macht zeigen! + - Bereite dich auf meinen ultimativen Angriff vor! + - Verstärkung trifft ein! + - Du wirst dafür bezahlen! + - Das wird ein Zeichen hinterlassen! + - Auge um Auge! + - Die Krankenversicherung wird das abdecken + - Das fühle ich in meinen Knochen + - 'Das ist nur ein Kratzer' + - Was war das? Eine weiche Brise? + - Du wirst mich nie so besiegen + - Erbärmlich. + - Schwach. + - Das war nicht einmal meine Rüstung! + - Das wird einfach sein + - Meine Enkel werden das spüren + - Versuchst du es überhaupt? + - Ein Admin hat mich gerade vollständig geheilt + - Haxxor! + - Ich? Beschädigt? Hacks! + - Ich kann nicht besiegt werden! + - Gut, dass ich Hacks verwende! + - Pass auf! Herobrine ist hinter dir! + - Mein Leben für Aiur! + - Mein Haus wird gegrieft! + - Warum können wir keine Freunde sein? + - Valhalla! + - Notch hat mich gerettet! + - Kein Rückzug! + - Triff mich mit deinem besten Schuss! + onDamagedByBow: + - Bekämpfe mich wie ein Spieler! + - Angst näher zu kommen? + - Ich kann deine Angst von hier riechen! + - Hast du dein Schwert vergessen? + - Feiglinge! Bogen ist nicht fair! + - Bögen? Das ist so 2011... + - Bögen sind für die Geistesschwachen! + - Bögen sind für die Geistesschwachen! + - Bögen sind für die Geistesschwachen! + - Ich dachte, wir haben uns auf keinen Bögen geeinigt! + - Bögen? Du wirst das bereuen + - Aua! + - Oi! + - Lass das! + - Warum?! + - Du kämpfst wie ein Milchbauern! + - Du bist ein Schmerz im Rücken! + - En garde! Touche! + - Man! + - Meine Gesundheit ist gebrochen, untötbar! + - Deine Treffer machen mich nur stärker! + - Vollkommen überflüssig... + - 'Das ist nur eine Fleischwunde!' + - Imperium beschützt! + - Herobrine, hilf mir! + - Hinter dir! Ein Creeper! + - Ich habe einen schrecklichen Fehler begangen. + - Was mich nicht tötet... + - Zombies machen Narben + - Ich werde dir meine wahre Macht zeigen! + - Bereite dich auf meinen ultimativen Angriff vor! + - Verstärkung trifft ein! + - Du wirst dafür bezahlen! + - Das wird ein Zeichen hinterlassen! + - Auge um Auge! + - Die Krankenversicherung wird das abdecken + - Das fühle ich in meinen Knochen + - 'Das ist nur ein Kratzer' + - Was war das? Eine weiche Brise? + - Du wirst mich nie so besiegen + - Erbärmlich. + - Schwach. + - Das war nicht einmal meine Rüstung! + - Das wird einfach sein + - Meine Enkel werden das spüren + - Versuchst du es überhaupt? + - Ein Admin hat mich gerade vollständig geheilt + - Haxxor! + - Ich? Beschädigt? Hacks! + - Ich kann nicht besiegt werden! + - Gut, dass ich Hacks verwende! + - Pass auf! Herobrine ist hinter dir! + - Mein Leben für Aiur! + - Mein Haus wird gegrieft! + - Warum können wir keine Freunde sein? + - Valhalla! + - Notch hat mich gerettet! + - Kein Rückzug! + - Triff mich mit deinem besten Schuss! + onDamage: + - Ein solider Treffer! + - Er schießt und er punktet! + - Das wirst du am nächsten morgen spüren! + - Siegesang! + - Der Sieg wird mein sein! + - Das war nur die Hälfte meiner Macht! + - Du bist auf den falschen Hut gekommen! + - Du hast dich mit dem falschen Mob angelegt! + - Bereite dich darauf vor ge-mobbt zu werden! + - Das war dein letzter Fehler! + - Spüre das Brennen! + - John Cena + - Wie stehst du noch? + - Gibt einfach auf! + - Gib auf! + - Ich habe die Anhöhe! + - Ich werde dich beenden! + - Ich hoffe du hast dich auf Schmerzen vorbereitet! + - Der Jäger wird gejagt! + - Blut für den Blut Thron! + - Schädel für den Schädelthron! + - Ein guter Spieler ist ein toter Spieler! + - Git gud! + - Preiset die Sonne! + - Das Ende nähert sich! + - Du bist nicht vorbereitet. + - Zug zug! + - Kaum meine Zeit wert! + - Ich dachte, dies sei eine Herausforderung? + - 'Pro Tipp: Keine Treffer erhalten' + - Ima firin mah lazer bwooooooooo + - Für den Kaiser! + - Herobrine wird sich freuen! + - Das ist das Ende für dich! + - Versuchst du es überhaupt? + - Schwäche! + - Erbärmlich. + - Vielleicht weckt dich das auf. + - Und das ist erst der Anfang! + - Wir fangen gerade erst an! + - Das war nur zum Aufwärmen! + - Du bist kein Gegner für mich! + - RKO aus dem Nichts heraus! + - Ich kann das die ganze Nacht machen! + - Eine gute Kampfpuppe! + - Ich bin die Nacht! + - Ich frage mich, was zuerst brechen wird + - Rache für Steve! Du Monster! + - Trete der Mob-Seite bei! + - Zu einfach, zu einfach! + - Zu einfach! + - Du kannst mich nicht besiegen! + - Pikachuuuuu + - Avada kedavra! + - Crucio! + - Jierda! + - Kritischer Treffer! + - So sieht die Kompetenz aus! + - 9001 Schaden! + - Du lebst immer noch? + - Gewöhn dich an deine Niederlage! + - Ein Geschmack des Schmerzes wird kommen! + - Ich werde dich in Gefahr bringen! + onDeath: + - Leider armes Yorick! + - Der Rest ist Stille + - Ich werde zurückkehren + - Unverzeihlich + - Ich lebe, ich sterbe, ich komme wieder! + - Bezeuge mich + - Ich reite zu valhalla! + - VALHALLA! + - VALHALLA! AUSLIEFERUNG + - Du gewinnst, diesmal + - Eine Plage für Ihr Land! + - Verflucht seist du! + - Du wirst noch früh genug zu mir stoßen! + - Es ist noch nicht vorbei + - Tod ist nur ein Rückschlag + - Nicht so... + - Ich wollte nur ins All gehen + - Wir könnten Freunde sein + - Deine Sünden kriechen dir auf den Rücken + - Bis gleich + - Auf Wiedersehen + - Ich warte auf dich + - Ich werde mich rächen! + - Ich werde nicht sanft in die Nacht gehen + - Hätte eine Lebensversicherung abschließen sollen + - Es war mein letzter Tag auf dem Job + - Es war mein letzter Tag hier + - Et tu, Brute? + - RIP + - x.x + - (x.x) + - haha + - Ohnmacht + - GG WP + - GG + - WP + - GG no RE + - HAX + - Hacker + - Nicht fair war ich im Verzug + - Du gewinnst, diesmal + - Du Monster... + - Mäßig... + onTarget: + - Komm' hier rüber! + - Was sehe ich? Ein Feigling? + - Sir, bereiten Sie Ihre fisticuffs vor! + - Lass und das wie Höhlenmenschen regeln! + - En garde! + - Pass auf! Ein Creeper hinter dir! + - Bist du nicht richtig hässlich! + - Du siehst köstlich aus. + - Bereite dich auf Probleme vor! + - Lass den besten Klick Spammer gewinnen! + - SPARTAAAAAA + - Ich bin tatsächlich Level 9001 + - Kein Elite Mob + - Schlecht verkleideter Elite-Mob + - Ah, frische Beute! + - Der Jäger wird gejagt! + - Mich töten lässt den Server abstürzen + - Ich bin eigentlich ein getarnter Spieler! + - Ich werde keine Beute droppen! + - Warum können wir keine Freunde sein? + - Sssssss + - Es war mein letzter Tag auf dem Job! + - Stoppe genau dort kriminellen Abschaum! + - Bereite dich vor zu sterben! + - Preiset die Sonne! + - Git gud + - Alea jacta est! + - Facta, non verba! + - Schädel für den Schädelthron! + - Blut für den Blut Thron! + - Ein Opfer für Herobrine! + - Ich werde den Himmel durchbohren! + - Wer glaubt du, ich bin!? + - Ein Schwächling! Er gehört mir. + - Der Schwächling gehört mir! + - Accio Spieler! + - Ein Duell bis zum Tod! + - Ich fordere dich zu einem Duell heraus! + - Pika pika! + - Hast du mich gerade als Höllenhalle bezeichnet + - Wie hast du mich genannt? + - Ich weiß was du mit den Monstern gemacht hast! + - So endet deine Geschichte! + - Bereite dich auf Probleme vor! + - Ich habe mich darauf vorbereitet! + - Ich bin vorbereitet. Bist du? + - Ein würdiger Feind! + - Ein würdiger Gegner! + - Ein Neulingen! Das ist mein Glückstag! + - Dein Zeug oder dein Leben! + - Das ist ein Raub! + - Du bist du! Du Monster! + - So hungrig, gib mir dein Fleisch! + - Da ist er! + - Muss meine Phantasie gewesen sein + - Hi ich bin Mr Meeseeks! + - Ich bin Mr Meeseeks, schau mich an! + - Deine Diamanten oder dein Leben! + - Für König und Land! + - Triff mich mit deinem besten Schuss! + - Sei ein Zeuge! + - Bezeuge das Blutbad! + - Ich mache alles glänzend und verchromt! +zombie_friends: + friend1Name: 'BFF #1' + friend2Name: 'BFF #2' + friendDeathMessage: + - Neeein! + - Mäßig! + - Zacharien! + - Toter als tot! + - Vergeltung! + - Rache! + - Ich kann nicht glauben, dass du das getan hast. + originalEntityDialog: + - Lass uns später ZombieCraft spielen! + - Spüre die Kraft der Freundschaft! + - El pueblo, unido! + - Ich rufe meine Freunde an! + - BFF-Macht! + - Einer für Alle! + - Hol ihn! + - Ist mir egal, ich gehe nach Hause! + reinforcementDialog: + - Leg dich nicht mit unseren Freunden an! + - Wir haben dich Zach! + - Verstärkung ist angekommen! + - Einer für alle, alle für einen! + - Das wird einfach sein! + - Geben Sie auf, wir haben den hohen Boden! + - Möchtest du gehen bruv? + - Weltstaaaaaaaar! + - Was machst du mit unserem Freund + - Spüre die Kraft der Freundschaft! + - Freundschaftsstärke bei 100%! + - Zombies, vereint euch! + - Wir geben dir Rückendeckung Kumpel! + - Gemeinsam sind wir besser! + - Je mehr, desto besser! + - Ich hab' dich wieder! + - Alle für einen! +zombie_necronomicon: + summoningChant: Es ist auch nicht zu überdenken... Der Mensch ist entweder der älteste oder der letzte Meister der Erde, oder dass der gemeinsame Großteil von Leben und Stoff allein wandert. Die Alten waren es, die Alten sind und die Alten werden sein. Nicht in den Räumen, die wir kennen, sondern zwischen ihnen gehen sie ruhig und primär, undimensioniert und zu uns ungesehen.Yog-Sothoth kennt das Tor. Yog-Sothoth ist das Tor. Yog-Sothoth ist der Schlüssel und Wächter des Tores. Er weiß, wo die Alten von Alten durchbrochen sind und wo sie wieder durchbrechen werden. Er weiß, wo sie die Felder der Erde betraten und wo sie sie noch verharren und warum niemand sie sehen kann, wie sie sich bewegen. Durch ihren Geruch wissen die Menschen manchmal in der Nähe, aber ihres Ansehens kann kein Mensch wissen nur in den Merkmalen derer, die sie auf die Menschheit geführt haben; und von denen gibt es viele Arten, unterscheiden sich in der Ähnlichkeit von der wahren Eidolon zu der Form ohne Anblick oder Substanz, die sie sind. Sie gehen ungesehen und verdorben an einsamen Orten, an denen die Worte gesprochen wurden und die Riten zu ihrer Jahreszeit durchgestempelt wurden. Die Windgitter mit ihren Stimmen, und die Erde mutiert mit ihrem Bewusstsein. Sie beugen den Wald und vernichten die Stadt, aber vielleicht werden sie nicht die Hand sehen, die schlägt. Kadath in der kalten Abfälle hat sie bekannt, und was kennt Kadath? Die Eiswüste des Südens und die versunkenen Inseln des Ozeans enthalten Steine, deren Siegel größer ist, aber wer hat die tief gefrorene Stadt oder den versiegelten Turm gesehen lang mit Algen und Stacheln gegarlandet? Großer Cthulhu ist ihr Cousin, aber kann er sie nur trostlos ausspionieren. Iä! Shub-Niggurath! Wie ein Unglück werdet ihr sie kennen. Ihre Hand liegt an euren Kehen, doch seht ihr dich nicht; und ihr Wohnort ist sogar eine mit eurer bewachten Schwelle. Yog-Sothoth ist der Schlüssel zum Tor, bei dem sich die Sphären treffen. Der Mensch regiert jetzt, wo sie einmal regiert haben; sie werden bald bestimmen, wo der Mensch jetzt regiert. Nach dem Sommer ist Winter, nach dem Wintersommer, sie warten geduldig und mächtig, denn hier werden sie wieder regieren. +zombie_parents: + deathMessage: + - Du Monster! + - Mein Baby! + - Was hast du getan!? + - Rache! + - Neeeeein! + - Du wirst dafür bezahlen! + - Eh, er wurde adoptiert + - Er ist tot! Wieder einmal! + - Toter als tot! + - Du hast ihn hergebracht! + bossEntityDialog: + - Du bist peinlich! + - Er schikaniert mich! + - Er ist derjenige, der mich ärgert! + - Ich kann allein damit umgehen! + - Lassen Sie mich allein, ich kann das! + - Folge mir nicht mehr! + - Gott das ist so peinlich! + - Er nahm mein Mittagessen Geld! + - Er schikaniert mich! + zombieDad: + - Gehe weg von meinem Sohn! + - Stehe für dich selbst, Sohn! + - Ich werde mich mit ihm befassen! + - Hör auf meinen Sohn zu ärgern! + - Warum tust du das? + - Ich werde mit deinen Eltern sprechen! + - Hau ab Kind! + - Zeig ihm wer der Boss ist Kind! + - Guter Schlag Kind! + zombieMom: + - Hände weg von meinem Kind! + - Bist du verletzt, Sweetie? + - Hat er dir wehgetan? + - Lass mich die Wunde sehen sweetie + - Ich werde mit seinen Eltern sprechen! + - Du hast deine Jacke vergessen! + - Haltung, Sweetheart + - Zerbreche es! + - Lass das! + - Hast du den Müll rausgenommen? +elite_blaze: + name: '&fLvl &2$level &fElite &eLohe' + deathMessages: + - '$player &cwurde von einer $entity verbrannt!' +elite_cave_spider: + name: '&fLvl &2$level &fElite &3Höhlenspinne' + deathMessages: + - '$player &cwurde von einer $entity &ceingewoben!' +elite_creeper: + name: '&fLvl &2$level &fElite &2Creeper' + deathMessages: + - '$player &cwurde von einem $entity in die Luft gejagt!' + - '$entity &cjust oh man''d $player&c!' +elite_drowned: + name: '&fLvl &2$level &fElite &3Ertrunkener' + deathMessages: + - '$player &cwurde von einem $entity in die Tiefen gezogen!' + - '$player &cwurde von einem $entity ertränkt!' +elite_elder_guardian: + name: '&fLvl &2$level &fElite &3Grosser Wächter' + deathMessages: + - '$entity &chat $player &cdavon abgehalten die Tiefen zu erkunden!' +elite_guardian: + name: '&fLvl &2$level &fElite &3Wächter' + deathMessages: + - '$entity &chat $player &cdavon abgehalten die Tiefen zu erkunden!' +elite_enderman: + name: '&fLvl &2$level &fElite &5Enderman' + deathMessages: + - '$entity &chat $player &cin die Leere geworfen!' + - '$player &chat $entity &cschräg angeschaut!' + - '$player &cund $entity &csind jetzt beste Freunde!' +elitemob_endermite: + name: '&fLvl &2$level &fElite &7Endermite' + deathMessages: + - '$entity &cist zu $player &cwas David zu Goliath ist!' +elite_evoker: + name: '&fLvl &2$level &fElite &5Magier' + deathMessages: + - '$player &cwurde von einem $entity &cverzaubert!' +elite_husk: + name: '&fLvl &2$level &fElite &7Wüstenzombie' + deathMessages: + - '$player &cwurde von einm $entity&causeinander genommen!' +elite_illusioner: + name: '&fLvl &2$level &fElite &8Illusionist' + deathMessages: + - '$player&c ist auf die Illusionen eines $entity &chereingefallen!' +elite_iron_golem: + name: '&fLvl &2$level &fElite &fEisengolem' + deathMessages: + - '$player &chat sich mit dem falschen $entity &cangelegt!' + - '$player &chat die Eisenfaust technik von einem $entity &cgelernt!' +elite_phantom: + name: '&fLvl &2$level &fElite &9Phantom' + deathMessages: + - '$player &chat einen schlimmen albtraum über $entity &cgehabt!' + - '$player &cwird albträume über $entity &chaben!' + - '$entity &chat $player &cden wert des schlafens beigebracht!' +elite_pillager: + name: '&fLvl &2$level &fElite &8Plünderer' + deathMessages: + - '$entity &cplünderte $player&c!' + - '$entity &chat $player &causgenommen!' +elite_polar_bear: + name: '&fLvl &2$level &fElite &fEisbär' + deathMessages: + - '$player &cwurde von einem $entity &czu tode gekratzt!' + - '$player &cwurde von einem $entity &cgefressen!' +elite_ravager: + name: '&fLvl &2$level &fElite &6Verwüster' + deathMessages: + - '$entity &chat $player &cgezeigt wer die Hosen an hat!' +elite_silverfish: + name: '&fLvl &2$level &fElite &7Silberfischchen' + deathMessages: + - '$player &chat ein $entity &cmit einem Block verwechselt!' +elite_skeleton: + name: '&fLvl &2$level &fElite &fSkelett' + deathMessages: + - '$player &cwurde zum Nadelkissen von einem $entity&c!' + - '$entity &cwollte die Knochen von $player &csehen!' +elite_spider: + name: '&fLvl &2$level &fElite &7Spinne' + deathMessages: + - '$player &cwurde von einer $entity &ceingewoben!' + - '$entity &chat $player &cverschlungen!' +elite_stray: + name: '&fLvl &2$level &fElite &bEiswanderer' + deathMessages: + - '$player &cwurde von einem $entity &cin die Irre geführt!' +elite_vex: + name: '&fLvl &2$level &fElite &bPlagegeist' + deathMessages: + - '$entity &chat $player &cgeplagt!' +elite_vindicator: + name: '&fLvl &2$level &fElite &8Diener' + deathMessages: + - '$entity &chat $player &czerhackt!' +elite_witch: + name: '&fLvl &2$level &fElite &5Hexe' + deathMessages: + - '$player &cwurde zum Test-Objekt von $entity&c!' + - '$player &cwurde verzaubert von $entity&c!' +elite_wither_skeleton: + name: '&fLvl &2$level &fElite &8Witherskelett' + deathMessages: + - '$entity''s &cPfeile hat $player &causgedörrt!' + - '$entity &chat $player &causgedörrt!' +elite_zombie: + name: '&fLvl &2$level &fElite &2Zombie' + deathMessages: + - '$player &cwurde von $entity &cverschlungen!' + - '$entity &chat $player &cGehirn gefressen!' +elite_ghast: + name: '&fLvl &2$level &fElite &fGhast' + deathMessages: + - '$player &cist $entity&c &cFeuerbällen nicht ausgewichen!' + - '$player &cwurde in die Luft gejagt von einem $entity&c!' + - '$entity &chat $player &cgeklatscht!' +elite_wolf: + name: '[$level] Elite Wolf' + deathMessages: + - '$entity hat $player auseinander gerissen!' + - '$player wurde in stücke gerissen von $entity!' +elite_ender_dragon: + name: '&fLvl &2$level &fElite &5Enderdrache' + deathMessages: + - '$entity &cnahm $player auseinander!' +elite_shulker: + name: '&fLvl &2$level &fElite &5Shulker' + deathMessages: + - '$entity &czeigte $player &cneue Höhen!' +super_chicken: + name: '&2Super Huhn' +super_cow: + name: '&2Super Kuh' +super_mushroom_cow: + name: '&2Super Mooshroom Kuh' +super_pig: + name: '&dSuper Schwein' +super_sheep: + name: Super Schaf +elite_killer_bunny: + name: '&fLvl &2$level &fElite &cKiller Kaninchen' + deathMessages: + - '$entity &chat $player &cin einer Farm im Hinterland hinein gehen lassen!' + - '$entity &cerzog $player mit einer Peitsche und nicht mit einer Karotte!' +elite_llama: + name: '&fLvl &2$level &fElite &5Llama' + deathMessages: + - '$player &cwurde von $entity angespuckt!' + - '$player &chat $entity &cwütend gemacht!' +elite_warden: + name: '&fLvl &2$level &fElite &3Wärter' + deathMessages: + - '$entity &chat $player &cin der Nähe gespürt!' +elite_goat: + name: '&fLvl &2$level &fElite &5Ziege' + deathMessages: + - '$player &cwurde von $entity &cgerammt!' + - '$player &cwurde von $entity &cüberrannt!' + - '$player &cwurde von $entity &czertrampelt!' + - '$player &cbekam $entity ''s &cHörner!' +elite_zombified_piglin: + name: '&fLvl &2$level &fElite &6Zombifizierter Piglin' + deathMessages: + - '$player &cwurde zu tode gemobbt von einem $entity&c!' + - '$entity &chat $player &cgeklatscht!' +elite_zoglin: + name: '&fLvl &2$level &fElite &dZoglin' + deathMessages: + - '$player &chat den $entity &cherausgefordert!' + - '$entity &chat $player &cgeklatscht!' +elite_piglin: + name: '&fLvl &2$level &fElite &ePiglin' + deathMessages: + - '$entity &cwird einen guten Preis vom verkauf von $player''s überresten erhalten!' + - '$entity &chat $player &cden Wert von Gold beigebracht!' +elite_hoglin: + name: '&fLvl &2$level &fElite &dHoglin' + deathMessages: + - '$player &chat den $entity &cherausgefordert!' + - '$entity &chat $player &cgeklatscht!' +elite_piglin_brute: + name: '&fLvl &2$level &fElite &cPiglin Barbar' + deathMessages: + - '$entity &czerhackte $player!' + - '$entity &cnahm $player auseinander!' +elite_bee: + name: '&fLvl &2$level &fElite &eBiene' + deathMessages: + - '$player &cwurde von $entity gestochen!' +MobCombatSettings: + bossLocationMessage: '&7[EM] &2[Zum Tracken klicken!]' + bossKillParticipationMessage: '&eDein Schaden: &2$playerDamage' + defaultOtherWorldBossLocationMessage: '$name: In einer anderen Welt!' + weakText: '&9&lSchwach!' + resistText: '&c&lWiderstehen!' + fullHealMessage: '&2Volle Heilung!' +check_tier: + message1: "&7[EM] Deine Kampfstufe ist $tier\n" + message2: '&7[EM] Dein Gildenstufen Bonus ist $tier' + message3: '&7[EM] &aDeine Bedrohungsstufe ist $tier' +check_tier_others: + message1: '&7[EM] Die Kampfstufe von $player ist $tier' + message2: '&7[EM] Der Gildenstufen Bonus von $player ist $tier' + message3: '&7[EM] &aDie Gefahrenstufe von $player&a ist $tier' +ScrapItemSettings: + scrapItemName: '&2Stufe $level Schrott' + scrapItemLore: + - '&aSammle 25 Schrott des gleichen Levels um' + - '&aein Item Upgrade zu erstellen!' + - '&aDu kannst auch Schrott zur Reparatur verwenden' + - '&aItems verwenden und um höherwertigen Schrott anzufertigen!' + - '&2Tu dies in der Abenteuer Gilde!' + upgradeItemName: '&2Level $level Verbesserungs-Orb' + upgradeItemLore: + - '&aBenutze es bei dem Erweiterten NPC um es zu Upgraden' + - '&aItems bis Level $orbLevel!' +Quests: + questJoinMessage: '&aDu hast die Aufgabe $questName angenommen &a!' + questLeaveMessage: '$cDu hast die Aufgabe $questName abgelehnt!' + questCompleteMessage: '&2Du hast die Aufgabe $questName &2 abgeschlossen!' + leaveWhenNoActiveQuestsExist: '&cDu hast derzeit keine aktive Aufgabe!' + questLeaveConfirmationMessage: '&cBist du sicher, dass du deine aktuelle Aufgabe aufgeben willst? Bestätige es mit &a/em confirm &c, um die Auswahl zu bestätigen!' + questStartTitle: '&aAufgabe Angenommen!' + questCompleteTitle: '&2Aufgabe Abgeschlossen!' + questLeaveTitle: '&cAufgabe Abgebrochen!' + killQuestChatProgressionMessage: '&8[EliteMobs]&c➤Erlege $name:$color$current&0/$color$target' + fetchQuestChatProgressionMessage: '&8[EliteMobs]&c➤Erhalte $name:$color$current&0/$color$target' + dialogQuestChatProgressionMessage: '&8[EliteMobs]&c➤Rede mit $name:$color$current&0/$color$target' + questCapMessage: '&8[EliteMobs] &cDu hast die maximale Anzahl aktiver Aufgaben (10) erreicht! &4Gib mindestens eine aktive Aufgabe ab oder schließe sie ab, wenn du mehr Aufgaben erhalten möchtest!' + killQuestScoreboardProgressionMessage: '&c➤Erlege $name:$color$current&0/$color$target' + fetchQuestScoreboardProgressionMessage: '&c➤Erhalte $name:$color$current&0/$color$target' + dialogQuestScoreboardProgressionMessage: '&c➤Rede mit $name:$color$current&0/$color$target' + chatTrackMessage: '&8[EliteMobs]&2 Klicke hier um die Aufgabe zu verfolgen!' + chatTrackHover: '&2Zum verfolgen klicken!' + chatTrackingMessage: '&8[EliteMobs]&9 Du verfolgst nun die Aufgabe!' + chatTrackingHover: '&2Klicke hier, um das verfolgen eine Aufgabe zu starten oder zu beenden! /em -> Aufgaben, um eine andere Aufgabe zu verfolgen!' + noQuestDestinationFound: '[EM] Kein Aufgabenziel gefunden!' + questDestinationInOtherWorld: '[EM] Gehe zur Welt $world!' + questAlreadyCompletedMessage: '&8[EliteMobs] &cDu hast diese Aufgabe bereits abgeschlossen!' + questPrerequisitesMissingMessage: '&8[EliteMobs] &ckann diese Aufgabe noch nicht annehmen!' + lowRankDynamicQuestWarning: '&8[EliteMobs] &cDu kannst diese Quests nicht mit deinem aktuellen Gildenrang annehmen! Erhöhe deinen Gildenrang, um diese Quests anzunehmen.' + questTurnInObjective: '&a2Sprich mit $npcName' +Wormholes: + dungeonNotInstalledMessage: '&8[EliteMobs] &cDungeon $dungeonID &cist nicht installiert! Die Teleportation geht nicht.' + defaultPortalMissingMessage: '&8[EliteMobs] &cDieses Portal scheint nirgendwohin zu führen!' +Arenas: + notEnoughPlayersMessage: '&8[EliteMobs] &cDu brauchst mindestens $amount, um das Spiel zu beginnen!' + startingMessage: '&2Starten!' + startingSubtitle: '&2in $count...' + arenaFullMessage: '&4[EliteMobs] &cArena ist voll! Sie können stattdessen zuschauen, während Sie darauf warten, dass es fertig ist!' + arenasOngoingMessage: '&4[EliteMobs] &cKann jetzt nicht in die Arena kommen - ein Match findet gerade statt! Sie können stattdessen zuschauen, während Sie darauf warten, dass es fertig ist!' + arenaStartHintMessage: '&2[EliteMobs] &aDu kannst die Arena starten, indem du &2 /em start schreibst' + arenaQuitHintMessage: '&4[EliteMobs] &cDu kannst die Arena verlassen, indem Du &4 /em quit schreibst' + arenaJoinPlayerMessage: "&2[EliteMobs] &aSie können die Arena starten, indem Sie &2/em start &aWenn es am wenigsten &2$count &a Spieler darin gibt, tun! \nDu kannst die Arena mit &c/em quit verlassen" + arenaJoinSpectatorMessage: '&2[EliteMobs] &a Du kannst die Arena jederzeit verlassen mit &2/em quit' + waveTitle: '&aWelle &2$wave' + victoryTitle: '&2Siegreich!' + victorySubtitle: '&aAbgeschlossen &2$wave &aWellen!' + defeatTitle: '&4Niederlage!' + defeatSubtitle: '&cErreichte Welle &4$wave&c!' + victoryBroadcast: Arena $arenaName wurde von $players erobert! + joinPlayerTitle: '&aBeginne mit &2/em start &a!' + joinPlayerSubtitle: '&c Verlassen mit &4/em quit&c!' + joinSpectatorTitle: '&aJetzt zuschauen!' + joinSpectatorSubtitle: '&c Verlassen mit &4/em quit&c!' +ancient_corpse_drop_axe: + name: '&eSchlächters Hackbeil' + lore: + - '&aGeborgen von dem' + - '&aKopf einer uralten Leiche...' +animated_armor_drop_axe: + name: '&8Verzauberte Axt' + lore: + - '&8Diese Axt war beinahe' + - '&8Dein Ende.' +animated_armor_drop_boots: + name: '&8Verzauberte Stiefel' + lore: + - '&8Du hast dies buchstäblich bekämpft' + - '&8Rüstungsteil.' +animated_armor_drop_chestplate: + name: '&8Verzauberte Brustplatte' + lore: + - '&8Du hast dies buchstäblich bekämpft' + - '&8Rüstungsteil.' +animated_armor_drop_helmet: + name: '&8Verzauberter Helm' + lore: + - '&8Du hast dies buchstäblich bekämpft' + - '&8Rüstungsteil.' +animated_armor_drop_leggings: + name: '&8Verzauberte Hose' + lore: + - '&8Du hast dies buchstäblich bekämpft' + - '&8Rüstungsteil.' +arachnid_matriarch_drop_boots: + name: '&bSeidenläufer' + lore: + - '&bAus seltener Spinnseide hergestellt.' +baba_rhoga_drop_chest: + name: '&aHexen Roben' + lore: + - '&a Der Geruch sollte' + - '&airgendwann weg sein.' +baba_yaga_drop_helmet: + name: '&aHexen Hut' + lore: + - '&a Der Geruch sollte' + - '&airgendwann weg sein.' +balloon_rider_drop_leggings: + name: '&dWeite Hose' + lore: + - '&dSehr bequeme und weite Hose.' +banshee_drop_charm: + name: '&8Manifestierter Kummer' + lore: + - '&8Möge dieser gehärtete Kummer' + - 'Dich vor Leid schützen.' +beast_tamer_drop_axe: + name: '&eGroßaxt' + lore: + - '&eSchwer genug, um jede Bestie in zwei zu trennen.' +berserker_charm: + name: '&bBerserker Talisman' + lore: + - '&aVerliere deinen Sinn im angesicht von' + - '&aüberwältigendem wiederstand in mehr' + - '&aals nur einem Weg...' +bigfoot_drop_chestplate: + name: '&eFellrüstung' + lore: + - '&eSchön und warm.' +big_bad_wolf_drop_chestplate: + name: '&aGroßer böser Wolf Pelz' + lore: + - '&aUnheimlich!' +bloated_jeffrey_drop_tear: + name: '&bSüße Träne' + lore: + - '&bDu hast Jeffrey zum Weinen gebracht...' +bone_fiend_drop_leggings: + name: '&aKnochige Hose' + lore: + - '&aDie scharfen Knochen befestigt an diesen' + - '&aHosen klappern wirklich sehr.' +challengers_boots: + name: '&cChallenger''s Stiefel' + lore: + - '&2Verliehen an diejenigen, die die' + - '&2Holzliga-Arena!' +challengers_chestplate: + name: '&cChallenger''s Bruspanzer' + lore: + - '&2Verliehen an diejenigen, die die' + - '&2Holzliga-Arena!' +challengers_helmet: + name: '&cChallenger''s Helm' + lore: + - '&2Verliehen an diejenigen, die die' + - '&2Holzliga-Arena!' +challengers_leggings: + name: '&cChallenger''s Hosen' + lore: + - '&2Verliehen an diejenigen, die die' + - '&2Holzliga-Arena!' +challengers_sword: + name: '&cChallenger''s Schwert' + lore: + - '&2Verliehen an diejenigen, die die' + - '&2Holzliga-Arena!' +chameleon_charm: + name: '&bChamäleon Talisman' + lore: + - '&aDas farbige Chamäleon kann' + - '&asich fast überall verstecken,' + - '&alangsam herumschleichend...' +changeling_drop_sword: + name: '&aKristallines Schwert' + lore: + - '&aDie Klinge schimmert, wenn du sie betrachtest.' +cheetah_charm: + name: '&bGepard Talisman' + lore: + - '&aGeparden können Geschwindigkeiten von' + - '&a120 km/h erreichen... für ungefähr' + - '&a60 sekunden. Lass sie zählen!' +circus_ringmaster_drop_charm: + name: '&dRingmeisters Peitsche' + lore: + - '&dDies wurde für schreckliche Bestrafung verwendet.' +craftenmine_terror_drop_trident: + name: '&cGhast Lobotomisierer' + lore: + - '&cPerfekt um sicherzustellen, dass' + - '&cDie Ghasts am Boden bleiben.' +creeperpede_drop_chestplate: + name: '&dExplosionsfeste Weste' + lore: + - '&dFühle den ''BOOM!''' + - '&deher ''boom''.' +crone_drop_axe: + name: '&dHexenjäger' + lore: + - '&dEine feine Axt, die eine feine Jagd verlangt.' +depths_seeker: + name: '&2Tiefen Sucher' + lore: + - '&9Aus unvorstellbaren tiefen gestohlen' + - '&9von einem abscheulichen Monster,' + - '&9ist es unmöglich zu erahnen' + - '&9 welche Schrecken diese Rute sah.' +divine_cinder_drop_charm: + name: '&6Göttliches Feuer' + lore: + - '&6Gesegnet sei das Feuer!' +dwarven_greed: + name: '&4Zwergische Gier' + lore: + - '&cWer zu tief und zu gierig' + - '&cgräbt, kann uralte gräuel aus' + - '&cschatten und flamme erwecken' + - '&cdie man besser hätte ruhen lassen.' +elephant_charm: + name: '&bElefanten Talisman' + lore: + - '&aErhalte die Kraft eines Elefanten' + - '&aAnsturms, auf kosten der Geschwindigkeit' + - '&aeines Elefanten Ansturms!' +enders_drop_chestplate: + name: '&dEnderhemd' + lore: + - '&dSchützend und bequem!' +enders_drop_helmet: + name: '&dEnderkappe' + lore: + - '&dBequem aber auch ziemlich robust.' +enders_drop_leggings: + name: '&dEnder Hosen' + lore: + - '&dEin bisschen zu lang, aber passt schon.' +ender_lapin_drop_boots: + name: '&cDunkle Sternstiefel' + lore: + - '&cGibt dir den Mut' + - '&cdes vor Angst davonlaufens.' +endless_pursuer_drop_sword: + name: '&7Dunkles Blutschwert' + lore: + - '&7Das Schwert scheint' + - '&7Blut zu weinen...' +enraged_snowman_drop_sword: + name: '&9Schneemann''s Nase' + lore: + - '&9Kein Wunder das des Schneemann''s' + - '&9so spitz war...' +xmas_and_gold: + name: '&6und Gold!' + lore: + - '&7Jeder wünscht sich Silber' + - '&7und Gold!' +xmas_and_goooooold: + name: '&6und Gooooooooooooooold!' + lore: + - '&7Jeder wünscht sich Silber' + - '&7und Gold!' +xmas_cornelius_pick: + name: '&bCornelius'' Pick' + lore: + - '&3Wenn Sie es in die Luft werfen' + - '&3und es auf den Boden fallen lassen,' + - '&3Du wirst finden einige' + - '&3Pfefferminze!' +xmas_lost_present: + name: '&2Verlorenes Geschenk' + lore: + - '&2Gib dies für eine Belohnung ab!' +xmas_peppermint: + name: '&cPfefferminze' + lore: + - '&fWonach ich mein ganzes Leben lang gesucht habe!' +xmas_siiiiilver: + name: '&7Siiiiiilber' + lore: + - 'Alle wünschen sich Silber' + - '&aund Gold!' +xmas_silver: + name: '&7Silber' + lore: + - '&6Jeder wünscht sich Silber' + - '&6und Gold!' +xmas_substitute_elf_practice: + name: '&8Elfenpraxis ersetzen' + lore: + - '&fDiese Puppe muss ihre Zähne fixieren' +xmas_treat: + name: '&aLeckereien!' + lore: + - '&eEin leckerer Snack!' +xmas_treat_v2: + name: '&aLeckereien!' + lore: + - '&eEin leckerer Snack!' +evil_undead_drop_sword: + name: '&eFlüchtige Klinge' + lore: + - '&eEs wird nur dienen' + - '&eFür so lang...' +fallen_knight_drop_boots: + name: '&e7Antike Stiefel' + lore: + - '&7Obowhl diese Schuhe alt sind' + - '&7bieten Sie einiges an Schutz' +fallen_knight_drop_chestplate: + name: '&e7Antike Netherplatte' + lore: + - '&7Diese Rüstung mag Ungeübten' + - '&7alt erscheinen aber es ist klar' + - '&7das was immer seine dicken Platten' + - '&7durchdringen will mit kräftigem' + - '&7Schwung geschwungen werden muss.' +fallen_knight_drop_helmet: + name: '&7Antiker Kopfschutz' + lore: + - '&7Viele Schwerter haben auf diesem' + - '&7Helm ihre Zeichen hinterlassen' + - '&7aber keins hat ihn durchbrochen.' +fallen_knight_drop_leggings: + name: '&7Antiker Beinschutz' + lore: + - '&7Du fühlst dich schlecht für jeden' + - '&7der versucht diese Hose zu durchschlagen.' +fine_swine_drop_sword: + name: '&6Feines goldenes Schwert' + lore: + - '&6Ein feines Meister-gefertigtes goldenes Schwert.' + - '&6Das geschmolzene Gold fließt innerhalb' + - '&6Das Schwert stellt sicher, dass jeder Schaden' + - '&6an der Klinge schnell repariert wird.' +firefly_charm: + name: '&bGlühwürmchen Talisman' + lore: + - '&aErleuchte die Nacht!' +firestarter_drop_helmet: + name: '&eFeuer Stopper' + lore: + - '&eNur die halbe Hitze!' +fire_conjurer_drop_shield: + name: '&eFlammenberührter Schild' + lore: + - '&eSchützt vor Feuer und Flamme.' +fishy_charm: + name: '&bFischiger Talisman' + lore: + - '&aEtwas stimmt damit' + - '&aeinfach nicht so ganz...' +fox_king_cold_drop_charm: + name: '&9Magischer Schnee' + lore: + - '&9Du spürst unmögliche Energien' + - '&9aus diesem Schnee.' +fulgora_drop_boots: + name: '&bBergstiefel' + lore: + - '&bSollte nützlich sein, wenn' + - '&bdu Berge erkundest.' +goblin_ballista: + name: '&8Goblin Ballista' + lore: + - 'Ein Schatz unter Goblins!' +goblin_boots: + name: '&6Goblin Schuhe' + lore: + - '&8Ein Schatz unter Kobolden!' +goblin_chestplate: + name: '&8Goblin Panzer' + lore: + - '&8Ein Schatz unter Kobolden!' +goblin_cleaver: + name: '&8Goblin Hackmesser' + lore: + - '&8Ein Schatz unter Kobolden!' +goblin_helmet: + name: '&8Goblin Helm' + lore: + - '&8Ein Schatz unter Kobolden!' +goblin_invasion_drop_chestplate: + name: '&aKleine Brustplatte' + lore: + - '&aWirklich eng...' +goblin_invasion_drop_leggings: + name: '&aKleiner Beinschutz' + lore: + - '&aNaja, zumindest betont es' + - '&awirklich deine Beine.' +goblin_leggings: + name: '&8Goblin Hosen' + lore: + - '&8Ein Schatz unter Kobolden!' +goblin_poker: + name: '&8Goblin Poker' + lore: + - '&8Ein Schatz unter Kobolden!' +goblin_shooter: + name: '&8Goblin Schütze' + lore: + - '&8Ein Schatz unter Kobolden!' +goblin_slasher: + name: '&8Goblin Haumesser' + lore: + - '&8Ein Schatz unter Kobolden!' +grappling_arrow: + name: '&6Greifender Pfeil' + lore: + - '&eSchieße auf einen Zielblock um dich daran festzuhalten!' +greedy_dwarf_drop_pickaxe: + name: '&9Zwergen Bedarf' + lore: + - '&cWer zu tief und zu gierig' + - '&cgräbt, kann uralte Gräuel aus' + - '&cAchatten und Flamme erwecken' + - '&cdie man besser hätte ruhen lassen.' +grunter_drop_axe: + name: '&cGroßer Grunzer' + lore: + - '&cDie Axt hat eine Tendenz' + - '&cbeim Schwung zu quieken.' +grunts_boots: + name: '&fGrunts Stiefel' + lore: + - '&2Verliehen an diejenigen, die die' + - '&2Wood League Arena!' +grunts_chestplate: + name: '&fGrunts Brustpanzer' + lore: + - '&2Verliehen an diejenigen, die die' + - '&2Holzliga-Arena!' +grunts_helmet: + name: '&fGrunt''s Helm' + lore: + - '&2Verliehen an diejenigen, die die' + - '&2Holzliga-Arena!' +grunts_leggings: + name: '&fGrunt''s Hosen' + lore: + - '&2Verliehen an diejenigen, die die' + - '&2Holzliga-Arena!' +grunts_sword: + name: '&fGrunt''s Schwert' + lore: + - '&2Verliehen an diejenigen, die die' + - '&2Holzliga-Arena!' +harmless_chicken_drop_boots: + name: '&aNutzlose Stiefel' + lore: + - '&aZumindest sind sie explosionssicher...' +hog_rider_drop_boots: + name: '&aRadioaktive Schuhe' + lore: + - '&aNicht großartig, nicht schlecht.' +horde_champion_drop_sword: + name: '&8Massen Ausweider' + lore: + - '&dWenn du dich um Horden' + - '&dvon Untoten kümmern musst.' +horrid_duplicator_drop_arrow: + name: '&aDuplizierter Pfeil' + lore: + - '&2Sieht aus und fühlt sich an' + - '&2wie das Original...' +horrid_duplicator_drop_bow: + name: '&4Feuriger Knochenbogen' + lore: + - '&4Dieser Bogen besteht aus' + - '&4einem einzigen großen Knochen.' +invasion_alien_treat: + name: '&6Alien Leckereien' + lore: + - '&6Der Geschmack ist nicht auf diesem Planeten!' +invasion_cheap_plasma_boots: + name: '&2Günstige Plasmastiefel' + lore: + - '&aBlast los!' + - '&cHinweis: &8Doppelt Umschalttaste antippen zur Aktivierung!' +invasion_low_grade_tinfoil_bolt_caster: + name: '&7Minderwertige Bolzenrolle' + lore: + - '&7Geh weg von meinem Grundstück!' +invasion_low_grade_tinfoil_boots: + name: '&7Minderwertige Alufolienschuhe' + lore: + - '&7Vermeidet Bodenstrahlung!' +invasion_low_grade_tinfoil_chestplate: + name: '&7Minderwertiges Bruststück aus Alufolie' + lore: + - '&7Verhindert, dass 6G Ihren Herzschrittmacher ausspioniert!' +invasion_low_grade_tinfoil_hat: + name: '&7Minderwertiger Aluhut' + lore: + - '&7Ich will glauben!' +invasion_low_grade_tinfoil_leggings: + name: '&7Minderwertige Alufolienhose' + lore: + - '&7Gemacht für das weglaufen vor Aliens!' +invasion_polished_plasma_boots: + name: '&2Polierte Plasmastiefel' + lore: + - '&aBlast los!' + - '&cHinweis: &8Doppelt Umschalttaste antippen zur Aktivierung!' +invasion_quality_bolt_caster: + name: '&7Qualität Bolzenrolle' + lore: + - '&7Geh weg von meinem Grundstück!' +invasion_quality_tinfoil_boots: + name: '&7Minderwertige Alufolienschuhe' + lore: + - '&7Vermeidet Bodenstrahlung!' +invasion_quality_tinfoil_chestplate: + name: '&7Hochwertiges Alufolien-Bruststück' + lore: + - '&7Verhindert, dass 6G Ihren Herzschrittmacher ausspioniert!' +invasion_quality_tinfoil_hat: + name: '&7Qualitäts Aluhut' + lore: + - '&7Bleib aus meinem Kopf!' +invasion_quality_tinfoil_leggings: + name: '&7Qualität Alufolienhose' + lore: + - '&7Gemacht für das weglaufen vor Aliens!' +invictus_boots: + name: '&4Invictus Stiefel' + lore: + - '&2Verliehen an die Champions der' + - '&2Holzliga-Arena!' +invictus_chestplate: + name: '&4Invictus Brustplatte' + lore: + - '&2Verliehen an die Champions der' + - '&2Holzliga-Arena!' +invictus_helmet: + name: '&4Invictus Helm' + lore: + - '&2Verliehen an die Champions der' + - '&2Holzliga-Arena!' +invictus_leggings: + name: '&4Invictus Hosen' + lore: + - '&2Verliehen an die Champions der' + - '&2Holzliga-Arena!' +invictus_pickaxe: + name: '&4Invictus Spitzhacke' + lore: + - '&2Verliehen an die Champions der' + - '&2Holzliga-Arena!' +invictus_shovel: + name: '&4Invictus Schaufel' + lore: + - '&2Verliehen an die Champions der' + - '&2Holzliga-Arena!' +invictus_sword: + name: '&4Invictus Schwert' + lore: + - '&2Verliehen an die Champions der' + - '&2Holzliga-Arena!' +krampus_drop_boots: + name: '&1Schneestiefel' + lore: + - '&1Aus echtem Schnee gemacht.' +large_hopper_drop_axe: + name: '&aSchwere Axt' + lore: + - '&aPerfekt um Köpfe abzuhacken.' +living_shadow_drop_boots: + name: '&5Schattenstiefel' + lore: + - '%5Fallen schmerzt nicht mehr ganz so sehr.' +lucky_charms: + name: '&bLucky Charms' + lore: + - '&aTeil eines vollständigen Frühstücks!' + - '&cNotiz: Definitv nicht teil eines' + - '&cvollständigen Frühstücks.' +magmaguys_toothpick: + name: '&4Magmaguy&c''s &2Zahnstocher' + lore: + - '&aIn beinahe neuem Zustand!' +merman_drop_trident: + name: '&1Wassermann Dreizack' + lore: + - '&1Die Lieblingswaffe des Wassermanns.' +meteor_shower_scroll: + name: '&7Meteorhagel Schriftrolle' + lore: + - '&4Zerstörung auf abruf.' + - '&4Verbrauchsgegenstand.' +monster_of_the_deep_drop_trident: + name: '&3Knochendreizack' + lore: + - '&3Aus den Knochen des Monsters' + - '&3der Tiefe gefertigt.' +moon_spider_drop_sword: + name: '&fSeidengesponnes Schwert' + lore: + - '&fRasiermesser scharfe Seide umgibt' + - '&fden eisernen Kern der Klinge.' + - '&fDie Klinge wird dir dienen,' + - '&ffür den Moment...' +necromancer_drop_helmet: + name: '&cDunkle Omen Helm' + lore: + - '&cEtwas an diesem Helm' + - '&cwirkt falsch.' +netherite_golem_drop_helmet: + name: '&8Antiker Helm' + lore: + - '&8Du bist dir nicht sicher, ob' + - '&8du diesen Helm aufziehen' + - '&8oder in ein Museum geben solltest.' +nether_escapee_drop_charm: + name: '&6Feuer Amulett' + lore: + - '&6Mögen die Flammen dir nicht schaden.' +nether_hag_drop_sword: + name: '&7Verhextes Schwert' + lore: + - '&7Alle Arten von Flüchen und' + - '&7Verzauberungen fließen durch' + - '&7dieses Schwert.' +nightwing_drop_crossbow: + name: '&aHimmelsbeobachter' + lore: + - '&aDen Himmel bewahren.' +night_crawler_drop_shield: + name: '&8Nachtschild' + lore: + - '&8Fast unzerbrechlich.' +night_crawler_drop_sword: + name: '&8Nachtklinge' + lore: + - '&8Die einzige Antwort auf die' + - '&8Bedrohungen der Nacht.' +novices_boots: + name: '&8Anfänger Stiefel' + lore: + - '&2Verliehen an diejenigen, die die' + - '&2Holzliga-Arena!' +novices_chestplate: + name: '&8Anfänger Brustplatte' + lore: + - '&2Verliehen an diejenigen, die die' + - '&2Holzliga-Arena!' +novices_helmet: + name: '&8Anfänger Helm' + lore: + - '&2Verliehen an diejenigen, die die' + - '&2Holzliga-Arena!' +novices_leggings: + name: '&Anfänger Hosen' + lore: + - '&2Verliehen an diejenigen, die die' + - '&2Holzliga-Arena!' +novices_sword: + name: '&Anfänger Schwert' + lore: + - '&2Verliehen an diejenigen, die die' + - '&2Holzliga-Arena!' +oasis_beacons_brigandine: + name: '&8Beacons Brigandine' + lore: + - '&fMassivstahl kann abstoßen' + - '&die meisten Angriffe.' +oasis_chief_cultists_bow: + name: '&5Der Bogen des Hauptkultisten' + lore: + - '&dDer nekrotische Kriegsbogen' + - '&ddes Kultistenchefs.' +oasis_earthquake_boots_10: + name: '&2Erdbebenstiefel' + lore: + - '&aschlag auf den Boden und mobs!' + - '&cHinweis: &8Doppelt Umschalttaste antippen zur Aktivierung!' +oasis_earthquake_boots_20: + name: '&2Erbebenstiefel' + lore: + - '&aschlag auf den Boden und mobs!' + - '&cHinweis: &8Doppelte Umschalttaste drücken zur Aktivierung!' +oasis_earthquake_boots_30: + name: '&2Erdbebenschuhe' + lore: + - '&aschlag auf den Boden und mobs!' + - '&cHinweis: &8Doppelte Umschalttaste drücken zur Aktivierung!' +oasis_earthquake_boots_40: + name: '&2Erdbeben Schuhe' + lore: + - '&aschlag auf den Boden und mobs!' + - '&cHinweis: &8Doppelte Umschalttaste drücken zur Aktivierung!' +oasis_earthquake_boots_50: + name: '&2Erdbeben Schuhe' + lore: + - '&aschlag auf den Boden und mobs!' + - '&cHinweis: &8Doppelt Umschalttaste antippen zur Aktivierung!' +oasis_earthquake_chestplate_10: + name: '&2Erdbeben Brustplatte' + lore: + - '&aSchlag auf den Boden und die mobs!' + - '&cHinweis: &8Doppelt Umschalttaste antippen zur Aktivierung!' +oasis_earthquake_chestplate_20: + name: '&2Erdbeben Brustplatte' + lore: + - '&aSchlag auf den Boden und die mobs!' + - '&cHinweis: &8Doppelt Umschalttaste antippen zur Aktivierung!' +oasis_earthquake_chestplate_30: + name: '&2Erdbeben Brustplatte' + lore: + - '&aSchlag auf den Boden und die mobs!' + - '&cHinweis: &8Doppelt Umschalttaste antippen zur Aktivierung!' +oasis_earthquake_chestplate_40: + name: '&2Erdbeben Brustplatte' + lore: + - '&aSchlag auf den Boden und die mobs!' + - '&cHinweis: &8Doppelt Umschalttaste antippen zur Aktivierung!' +oasis_earthquake_chestplate_50: + name: '&2Erdbeben Brustplatte' + lore: + - '&aSchlag auf den Boden und die mobs!' + - '&cHinweis: &8Doppelt Umschalttaste antippen zur Aktivierung!' +oasis_earthquake_helmet_10: + name: '&2Erdbebenhelm' + lore: + - '&aSchlag auf den Boden und die mobs!' + - '&cHinweis: &8Doppelt Umschalttaste antippen zur Aktivierung!' +oasis_earthquake_helmet_20: + name: '&2Erdbebenhelm' + lore: + - '&aSchlag auf den Boden und die mobs!' + - '&cHinweis: &8Doppelt Umschalttaste antippen zur Aktivierung!' +oasis_earthquake_helmet_30: + name: '&2Erdbebenhelm' + lore: + - '&aSchlag auf den Boden und die mobs!' + - '&cHinweis: &8Doppelt Umschalttaste antippen zur Aktivierung!' +oasis_earthquake_helmet_40: + name: '&2Erdbebenhelm' + lore: + - '&aSchlag auf den Boden und die mobs!' + - '&cHinweis: &8Doppelt Umschalttaste antippen zur Aktivierung!' +oasis_earthquake_helmet_50: + name: '&2Erdbebenhelm' + lore: + - '&aSchlag auf den Boden und die mobs!' + - '&cHinweis: &8Doppelt Umschalttaste antippen zur Aktivierung!' +oasis_earthquake_leggings_10: + name: '&2Erdbeben Hose' + lore: + - '&aSchlag auf den Boden und die mobs!' + - '&cHinweis: &8Doppelt Umschalttaste antippen zur Aktivierung!' +oasis_earthquake_leggings_20: + name: '&2Erdbeben Hose' + lore: + - '&aSchlag auf den Boden und die mobs!' + - '&cHinweis: &8Doppelt Umschalttaste antippen zur Aktivierung!' +oasis_earthquake_leggings_30: + name: '&2Erdbeben Hose' + lore: + - '&aSchlag auf den Boden und die mobs!' + - '&cHinweis: &8Doppelt Umschalttaste antippen zur Aktivierung!' +oasis_earthquake_leggings_40: + name: '&2Erdbeben Hose' + lore: + - '&aSchlag auf den Boden und die mobs!' + - '&cHinweis: &8Doppelt Umschalttaste antippen zur Aktivierung!' +oasis_earthquake_leggings_50: + name: '&2Erdbeben Hose' + lore: + - '&aSchlag auf den Boden und die mobs!' + - '&cHinweis: &8Doppelt Umschalttaste antippen zur Aktivierung!' +oasis_foundrys_flaming_hammer: + name: '&6Foundry''s Flammender Hammer' + lore: + - '&eDer Hammer der Gießerei!' +oasis_foundrys_flux: + name: '&6Gießerei''s Flux' + lore: + - '&eDer Fluss, der infundiert wird in' + - '&ejede geschmiedete Waffe!' +oasis_mask_of_the_warlock: + name: '&4Maske des Hexenmeisters' + lore: + - '&7Der Stein ist in seiner Maske!' + - '&7Das UV-Licht wird ihm helfen!' +oasis_monumental_lance: + name: '&3Monumentale Lanze' + lore: + - '&bSpeerfischen ist mein Hobby.' +oasis_oracles_shroud: + name: '&3Oracles Grabtuch' + lore: + - '&1Illusion ist deine Waffe!' +oasis_page_of_darkness_I: + name: '&0Seite der Dunkelheit I' + lore: + - '&829 Schritte nördlich' + - '&811 Schritte nach Westen' + - '&816 Schritte nach Norden' + - '&86 Schritte nach Osten' +oasis_page_of_darkness_II: + name: '&0Seite der Dunkelheit II' + lore: + - '&87 Schritte nach Süden' + - '&86 Schritte nach Osten' + - '&833 Schritte nach Norden' + - '&812 Schritte nach Westen' +oasis_page_of_darkness_III: + name: '&0Seite der Dunkelheit III' + lore: + - '&86 Schritte nach Norden' + - '&83 Schritte nach Westen' + - '&830 Schritte nach Norden' + - '&88 Schritte nach Osten' +oasis_page_of_darkness_index: + name: '&0Seite des Darkness Index' + lore: + - '&8Gehen Sie vorsichtig in der Dunkelheit vor' + - '&8 Sie wissen, dass du gekommen bist.' + - '&8Seien Sie müde auf dem Weg vor uns' + - '&8für Kugeln der Feuertrommel.' +oasis_page_of_darkness_IV: + name: '&0Seite der Dunkelheit IV' + lore: + - '&824 Schritte nach Süden' + - '&88 Schritte nach Osten' + - '&836 Schritte nach Norden' + - '&83 Schritte nach Westen' +oasis_page_of_darkness_V: + name: '&0Seite der Dunkelheit V' + lore: + - '&89 Schritte nach Norden' + - '&812 Schritte nach Osten' + - '&86 Schritte nach Süden' + - '&86 Schritte nach Osten' +oasis_page_of_darkness_VI: + name: '&0Seite der Dunkelheit VI' + lore: + - '&86 Schritte nach Süden' + - '&86 Schritte nach Osten' + - '&812 Schritte nach Norden' + - '&83 Schritte nach Osten' +oasis_page_of_darkness_VII: + name: '&0Seite der Dunkelheit VII' + lore: + - '&83 Schritte nach Norden' + - '&86 Schritte nach Osten' + - '&88 Schritte nach Süden' +oasis_page_of_darkness_VIII: + name: '&0Seite der Dunkelheit VIII' + lore: + - '&8Aus dem Schatten kommt ein Licht' + - '&8deren Roben sind mattgrau, vom Kampf überschattet.' + - '&8Von Eis und Schnee, von Feuer und Hitze.' + - '&8Achsen lenken ab, aber Schwerter besiegen.' +oasis_page_of_libraris_I: + name: '&7Seite von Libraris I' + lore: + - '&fUnter dem Bücherregal' + - '&fthat hat keine Reflexion' + - '&fwird Ihnen angezeigt' + - '&fpassage und Richtung.' +oasis_page_of_libraris_II: + name: '&7Seite von Libraris II' + lore: + - '&fDie Reflexion des Bücherregals' + - '&fverfügt über mehr Wissen' + - '&f4 Regale voller Bücher' + - '&fals sein Bild nach oben!' +oasis_page_of_libraris_III: + name: '&7Seite von Libraris III' + lore: + - '&fLeicht westlich lagern' + - '&fdes Bücherregals, das das Beste hält.' + - '&fDas meiste Wissen behält es.' + - '&fEin Favorit für diejenigen, die ernten.' +oasis_page_of_libraris_index: + name: '&7Seite des Libraris Index' + lore: + - '&f5 Papiere zu finden,' + - '&f3 schaltet auf Flip um,' + - '&f eine Tür, die geöffnet werden soll' + - '&f und darin sollt ihr verrutschen.' +oasis_page_of_libraris_IV: + name: '&7Seite von Libraris IV' + lore: + - '&fDas Orakel des Wissens' + - '&f ergibt schockierende Überraschung' + - '&faus den Tiefen der Verzweiflung' + - '&f sollen Blitze entstehen.' +oasis_page_of_libraris_V: + name: '&7Seite von Libraris V' + lore: + - '&fSein letztes Geheimnis' + - '&f er wird versuchen zu verstecken' + - '&ftdurch Verwendung von Schatten und Marionetten' + - '&f, um dich zu schlagen, während du gehst.' +oasis_page_of_plundering_I: + name: '&6Seite der Plünderung I' + lore: + - '&eHäuser in der ganzen Stadt' + - '&e verstecken ihre Geheimnisse eher nach oben als nach unten.' + - '&eGreifen oder Fliegen' + - '&ekann Ihrer Notlage helfen.' +oasis_page_of_sentris: + name: '&1Seite von Sentris' + lore: + - '&bDie Rüstung eines Wachpostens ist zu robust' + - '&bMit einem Schwert wird dein Kampf hart sein.' +oasis_page_of_the_pharaoh_I: + name: '&0Seite des Pharaos I' + lore: + - '&6Ein Opfer auf dem Altar' + - '&6muss zur Verfolgung gebracht werden.' + - '&6Aber was sollt ihr anbieten?' + - '&Red Sandstone hält diesen Hinweis.' +oasis_page_of_the_pharaoh_II: + name: '&0Seite des Pharaos II' + lore: + - '&6Die Pharaonen Hallen sind gesäumt' + - '&6im feinsten Golde rundherum.' + - '&6Es sollte seine Untat sein' + - '&6denn von Gold wird dein Schaden reichlich sein.' +oasis_page_of_the_pharaoh_III: + name: '&0Seite des Pharao Teil 3' + lore: + - '&6Des Pharaos Wände sind gefüllt' + - '&6mit Gefahren und kostbaren Schätzen.' + - '&6Von der südwestlichen Ecke des Raumes mit blauen Fenstern' + - '&6strömt einen unheilvollen Druck aus.' +oasis_page_of_the_pharaoh_index: + name: '&0Seite des Registers vom Pharao' + lore: + - '&6Der Pharao ist versiegelt' + - '&6innerhalb seines Grabes.' + - '&6Er liegt in Warte, ungestört;' + - '&6seine Fallen werden dein Untergang sein.' + - '&63 Seiten werden deinem Abenteuer helfen' + - '&6vom gebremst werden.' +oasis_page_of_the_sewer_I: + name: '&0Seite der Kanalisation I' + lore: + - '&3Es gibt eine Laus von ungewöhnlicher Größe.' + - '&3sie ist auf der Pirsch, bewacht ihren Preis.' + - '&3Viele Schätze zu finden' + - '&3Alles, was Sie tun müssen, ist herumzuschwimmen.' +oasis_page_of_the_sewer_II: + name: '&0Seite der Kanalisation II' + lore: + - '&3Aktivieren der Gates nacheinander' + - '&3 lässt das Wasser fließen.' + - '&3Schwimmen Sie aufwärts, sobald es ausströmt' + - '&3dann den richtigen Tunnel hinunter musst du gehen.' +oasis_page_of_the_sewer_index: + name: '&0Seite des Kanalisationsindex' + lore: + - '&3Das Böse lauert dort, wo Wasser abfließt' + - '&3Sei immer wachsam, sie werden dein Gehirn fressen!' + - '&3Du musst 3 Tore öffnen, die von Kreaturen bewacht werden' + - '&3gefüttert mit roten Sandsteinelementen.' + - '&32 Seiten werden Sie führen, nicht anstrengen.' +oasis_page_of_vampiris_I: + name: '&4Seite von Vampiris I' + lore: + - '&cDutzende von Waffen haben das Biest getroffen' + - '&cund jeder Schlag, dem es standgehalten wird.' + - '&cEs fürchtet nicht im Geringsten den Biss von Stein, Gold oder Diamanten' + - '&c aber es zittert vor Holz.' +oasis_page_of_vampiris_II: + name: '&4Seite von Vampiris II' + lore: + - '&cWenn Sie den Hexenmeister beschimpfen möchten,' + - '&csei bereit für einen harten Kampf!' + - '&cDer zweite Stock wird Ihre Macht testen,' + - '&cEs zuerst zu erobern ist ein Ritus.' +oasis_page_of_vampiris_III: + name: '&4Seite von Vampiris III' + lore: + - '&cRunter in die Turmspitze und in die Höhle' + - '&cist der Weg der Tapferen.' + - '&cHüten Sie sich vor denen, die aus dem Grab zurückgekehrt sind,' + - '&cschlag den Meister für das, wonach du dich sehnst.' +oasis_page_of_vampiris_index: + name: '&4Seite des Vampiris Index' + lore: + - '&cInnerhalb des Observatoriums' + - '&cda lauert eine Kreatur' + - '&cdiese hat noch nie die Sonne gesehen.' + - '&cFinde 4 Seiten, die dir helfen' + - '&c Flucht lebendig!' +oasis_page_of_vampiris_IV: + name: '&4Seite von Vampiris IV' + lore: + - '&cZwei Truhen mit Beute,' + - '&cWecke nicht die Toten auf!' + - '&c Einer unter der Treppe,' + - '&cder andere, wo Bücher gelesen werden können!' +oasis_pharaohs_feast: + name: '&6Pharaonenfest' + lore: + - '&eEine goldene Erinnerung' + - '&eder einst goldenen Stadt' + - '&ekorrumpiert durch den Sand der Zeit.' +oasis_pharaohs_flail: + name: '&0Pharaos Dregel' + lore: + - '&4Der Dreck des Jenseits.' +oasis_pick_of_darkness: + name: '&1Auswahl der Dunkelheit' + lore: + - '&bLeuchten hell durch' + - '&bdie Schatten.' +oasis_sunkiller: + name: '&6Sonnenlöscher' + lore: + - '&6Ist es nicht der Felsen da drüben' + - '&egerade groß genug für jemanden' + - '&eum sich dahinter zu verstecken?' +oasis_tohth: + name: '&8Oingo Boingo Brüder Abenteuer' + lore: + - '&fMeine Vorgaben sind absolut!' + - '&fEs ist Schicksal!' +okami_drop_leggings: + name: '&cOkami''s Segen' + lore: + - '&cSchnelligkeit des Wolf.' + - '&cFeuerschutz eines Gottes.' +owl_charm: + name: '&bEulen Talisman' + lore: + - '&aWerde zum ultimativen' + - '&aJäger der Nacht!' +primis_artifexs_shield: + name: '&6Artifex''s Schild' + lore: + - '&eEin altes Relikt aus früheren Zeiten' + - '&eGefährliche Zeit. Es wurde' + - '&ein seiner ganzen Pracht wiederhergestellt!' +primis_caeruleaums_hope: + name: '&9Caeruleaums Hoffnung' + lore: + - '&8Ein Relikt einer vergangenen Epoche, immer noch scharf' + - '&8genug, um zu verletzen, aber rostig genug, um' + - '&8in ein Museum zu gehören!' +primis_catacomb_drop_boots: + name: '&7Düstere Knochenschuhe' + lore: + - '&7Seltsame dunkle Knochen' + - '&7Bedeckte Stiefel.' +primis_catacomb_drop_boots_2: + name: '&7Düstere Knochenschuhe' + lore: + - '&7Unnatürlich dunkle Knochen' + - '&7bedecken diese Stiefel.' +primis_catacomb_drop_chestplate: + name: '&7Dunkle Knochenplatte' + lore: + - '&7Knochen, so dunkel wie der Abgrund' + - '&7schmücken diese Rüstung.' + - '&7Die Pfeile werden einen ziemlichen Krach machen,' + - '&7wenn sie von den Knochen abprallen.' +primis_catacomb_drop_chestplate_2: + name: '&7Dunkle Knochenrüstung' + lore: + - '&7Knochen, so dunkel wie der Abgrund' + - '&7schmücken diese Rüstung.' + - '&7Die Pfeile werden einen ziemlichen Krach machen,' + - '&7wenn sie von den Knochen abprallen.' +primis_catacomb_drop_leggings: + name: '&7Dunkle Knochenhose' + lore: + - '&7Die dunklen Knochen bedecken die' + - '&7diese Leggings umgeben, machen' + - '&7gefährliche Stürze überlebensfähiger.' +primis_catacomb_drop_leggings_2: + name: '&7Dunkle Knochenhose' + lore: + - '&7Die dunklen Knochen, die' + - '&7diese Hosen umgeben, machen' + - '&7gefährliche Stürze überlebbarer.' +primis_catacomb_necromancer_drop_helmet: + name: '&5Dunkle Knochenkugel' + lore: + - '&5Die Kugel bietet wenig Schutz,' + - '&5sie sucht nur Blut und Tod.' +primis_catacomb_necromancer_drop_helmet_2: + name: '&5Dunkle Knochenhaube' + lore: + - '&5Die Haube bietet wenig Schutz,' + - '&5sie sucht nur Blut und Tod.' +primis_catacomb_necromancer_drop_sword: + name: '&5Dunkle Knochenmarke' + lore: + - '&5Die unnatürlich dunkle Knochenmarke' + - '&5glitzert im Licht' + - '&5bereit alles zu zerteilen' + - '&5was ihm in seinem Weg steht.' +primis_catacomb_necromancer_drop_sword_2: + name: '&5Dunkle Knochenmarke' + lore: + - '&5Die dunklen Knochenmarke heult' + - '&5bösartig mit jedem Schlag' + - '&5während die Luft durch' + - '&5durch ihr Inneres strömt.' +primis_cooked_rabbit: + name: '&cGekochtes Kaninchen' + lore: + - Huh, hat sich dieses Kaninchen überhitzt? +primis_diving_helmet: + name: '&1Taucherhelm' + lore: + - Ein alter Tauchhelm. + - Er funktioniert immer noch gut. +primis_fish_bait: + name: '&2Fischköder' + lore: + - '&aSieht so aus, als könntest du große Fische mit ihnen einholen.' +primis_gladius_important_documents: + name: '&2Wichtige Dokumente' + lore: + - '&aDie Dokumente sind versiegelt.' +primis_gladius_lord_promise: + name: '&5Hilfs-Vereinbarung' + lore: + - '... für die Hilfe, die sie in diesen schwierigen Zeiten geleistet haben' + - mals, Pontis Mille verspricht, in Güte bei Gladius' zurückzukehren + - dunkelste Stunde. +primis_gladius_supplies: + name: '&2Lieferungen' + lore: + - '&agemacht, um einen Soldaten während eines Krieges satt zu halten.' +primis_gladius_sword: + name: '&5Gladius' + lore: + - '&8Das einzigwahre Symbol der Gladiusfestung.' +primis_gladius_the_good_stuff: + name: '&2Die guten Sachen' + lore: + - '&aRiecht... stark.' +primis_heirloom: + name: '&2Verlorenes Erbstück' + lore: + - '&aScheint alt, sogar uralt.' +primis_ice_village_alanus_dagger: + name: '&eAlanus'' Dolch' + lore: + - '&eEin einfacher Dolch mit' + - '&eRunen die den Griff bedecken.' +primis_ice_village_chains_shipment: + name: '&aLieferung von Ketten' + lore: + - '&aEiner Menge Ketten.' +primis_ice_village_escaped_prisoner_body: + name: '&cBewusstloser Körper' + lore: + - '&cSchwer.' +primis_ice_village_foot_of_mountain_chest_axe: + name: '&1Stumpfe Frostaxt' + lore: + - '&1Gefriert alles bei der kleinsten Berührung' +primis_ice_village_island_chest_trident: + name: '&3Magma''s Freude' + lore: + - '&3Diejenigen, die schauen, werden finden.' +primis_ice_village_living_nightmares_reward_chest: + name: '&3Pelzmantel' + lore: + - '&3Hergestellt aus' + - '&3härtestem Fell um der Welt.' +primis_ice_village_magical_ice_crystals: + name: '&1Pelz-Eiskristall' + lore: + - Ist der Kristall in der Nähe + - lässt Schnee ihn reagieren. +primis_ice_village_make_them_go_ouch_reward_leggings: + name: '&dViolet''s Ersatzgamaschen' + lore: + - '&dLässt dich die Straße hinab schreiten' + - '&dund bestraft dich.' +primis_ice_village_salmon: + name: '&2Frischer Lachs' + lore: + - Du glaubst nicht, dass du je + - einen größeren Lachs in deinem Leben gesehen hast. +primis_ice_village_silence_reward_helmet: + name: '&aBoomer-Helm' + lore: + - '&aSollte mit einer oder zwei Explosionen fertig werden.' +primis_ice_village_taking_the_bait_reward: + name: '&bNordstab' + lore: + - '&bEs ist eine gut gemachte Angelrute.' +primis_ice_village_violet_boots: + name: '&dViolet''s Lederstiefel' + lore: + - '&dFancy Lederstiefel mit einer' + - '&derhöhten Stöckel-Ferse.' +primis_ice_village_violet_leggings: + name: '&dViolet''s schicke Hose' + lore: + - '&dEng und leicht durchsichtig' + - '&dmit schönen Blumenmotiven.' +primis_ice_village_violet_whip: + name: '&dViolet''s Peitsche' + lore: + - '&dLiefert exquisite Bestrafung.' +primis_ice_village_wanna_build_a_snowman_reward_boots: + name: '&3Froststiefel' + lore: + - '&3Es ist nur Froststiefel.' +primis_invaders_assassins_bow: + name: '&8Attentäter Bogen' + lore: + - '&aDer perfekte Weg, ihnen' + - '&aEtwas von der eigenen Medizin zu geben.' +primis_invaders_boots: + name: '&4Invasoren Schuhe' + lore: + - '&4Sie riechen nicht so gut.' +primis_invaders_bow: + name: '&8Invasoren Bogen' + lore: + - '&aEinst wurde die Sonne ausgelöscht.' +primis_invaders_captains_sword: + name: '&4Invasoren Hauptmann Schwert' + lore: + - '&aGekrümmt und gemein aussehend.' +primis_invaders_chestplate: + name: '&4Invasoren Brustpanzer' + lore: + - '&aRostig, hässlich und stinkig. Einfach Liebreizend!' +primis_invaders_helmet: + name: '&4Invasoren Helm' + lore: + - '&aVerhindert eine Gehirnerschütterung!' +primis_invaders_leggings: + name: '&4Invasoren Leggings' + lore: + - '&aKönnten etwas Öl vertragen.' +primis_invaders_sword: + name: '&4Invasoren Schwert' + lore: + - '&aVerdächtig blutbefleckt.' +primis_lucky_pickaxe: + name: '&6Glückliche Lickaxt' + lore: + - '&e leuchtet hell, auch unterirdisch.' + - '&eSie sehen LL ist im Griff eingraviert' +primis_monster_slaying_spear: + name: '&8Monster tötet Speer' + lore: + - Verwandelt Sea Monsters in Barbecue. +primis_ogre_boots: + name: '&c Ogers Stiefel' + lore: + - '&7Sie werden dich nett halten' + - '&7und toasty.' +primis_ogre_chestplate: + name: '&cOgers Brustplatte' + lore: + - '&7Heiß auf die Berührung' +primis_ogre_helmet: + name: '&cOgers Helm' + lore: + - '&7Du wirst Kugeln schwitzen.' +primis_ogre_leggings: + name: '&cOgers Hosen' + lore: + - '&7Schwelende Lücken.' +primis_ogre_mines_lucky_pickaxe: + name: '&eGlücksspitzhacke' + lore: + - '&a Glücklich, aber nutzlos.' +primis_ogre_mines_waterworks_chest_shield: + name: '&aeine robuste Tür' + lore: + - '&aEs ist nur eine Tür.' +primis_old_shield: + name: '&8Altes Schild' + lore: + - '&7Ein altes Relikt aus einer mehr' + - '&7gefährlichen Zeit. Glaube ich' + - '&7kann jedoch repariert werden...' +primis_pirate_boots: + name: '&Piraten Schuhe' + lore: + - '&aDiese haben ein paar zu viel' + - '&a Löcher, um nützlich zu sein.' +primis_pirate_bow: + name: '&8Piratenbogen' + lore: + - '&aNicht ganz ein Feuersteinlocken,' + - '&aaber es wird reichen!' +primis_pirate_chestplate: + name: '&4Piratenbrustplatte' + lore: + - '&aEin einfaches T-Shirt.' +primis_pirate_helmet: + name: '&4Piratenhelm' + lore: + - '&aEs fehlt eine Augenklappe.' +primis_pirate_leggings: + name: '&4Piraten Hose' + lore: + - '&aFühlt sich wie Seebeine an!' +primis_pirate_sword: + name: '&4Piraten Schwert' + lore: + - '&aGekrümmt und gemein.' +primis_pointis_groves_heirloom: + name: '&2Wertvolles Erbstück' + lore: + - '&aDies ist der zweite von ihnen, den du gerufen hast.' +primis_pointis_mille_chest_dirty_note: + name: Schmutzige Notiz + lore: + - '&fEs gab ein wahrlich vorzügliches Schwert' + - '&fhier drin, aber jetzt ist es weg.' +primis_pontis_beast_horn: + name: '&2Blutgetränktes Horn' + lore: + - '&fBei näherer Betrachtung ist das Horn nicht' + - '&fin Blut getränkt, doch erscheint es so' + - '&fals wäre es daraus geschaffen.' + - '&fDas kristallisierte Blut ist unglaublich scharf.' +primis_pontis_beast_scale: + name: '&2Giftige Fischschuppen' + lore: + - '&fDie Schuppe ist von außen steinhart.' + - '&fDie Innenseite ist überzogen mit' + - '&fgiftigem und saurem Schlamm.' +primis_pontis_beast_silk: + name: '&2Sonnengetränkte Seide' + lore: + - '&fSeide strahlt Licht und Wärme aus.' +primis_pontis_elf_drop_boots: + name: '&7Elfenstiefel' + lore: + - '&7Du fühlst eine seltsame Energie' + - '&7Die von der Rüstung kommt.' +primis_pontis_elf_drop_chestplate: + name: '&7Elfenplatte' + lore: + - '&7Du fühlst eine seltsame Energie' + - '&7Die von der Rüstung kommt.' +primis_pontis_elf_drop_crossbow: + name: '&7Elfen Dunkelbogen' + lore: + - '&7Die speziellen Pfeile, die der Bogen' + - '&7nutzt sind sowohl scharf als auch stumpf.' +primis_pontis_elf_drop_helmet: + name: '&7Elfenhelm' + lore: + - '&7Du fühlst eine seltsame Energie' + - '&7Die von der Rüstung kommt.' +primis_pontis_elf_drop_leggings: + name: '&7Elfenbeinschutz' + lore: + - '&7Du fühlst eine seltsame Energie' + - '&7Die von der Rüstung kommt.' +primis_pontis_fields_berry_charm: + name: '&dGroße Beere' + lore: + - '&dDer frische Geruch, den diese Beere verströmt' + - '&dkann man meilenweit riechen.' + - '&dDer Geruch scheint beruhigend zu sein' + - '&Deffizienzt bei Monstern und Biesten.' + - '&dEs macht deren Angriffe weniger bösartig.' +primis_pontis_groves_brood_moher_drop_charm: + name: '&aDes Kriechers Qual' + lore: + - '&aDie Seide strahlt starke Energie aus.' +primis_pontis_groves_nest_crawler_drop_shield: + name: '&7Magmas Köder' + lore: + - '&7Wenn der Schild gehalten wird' + - '&7lockt es Monster dazu, es zu schlagen.' +primis_pontis_groves_spider_boots_reward: + name: '&1Spinnenbeinstiefel' + lore: + - '&1Stiefel aus Spinnenbeinen und Leder.' +primis_pontis_groves_tree_climbing_elf_bandits_reward_leggings: + name: '&aElfen Perlbeinschutz' + lore: + - '&aschützende Hosen' + - '&ageschmückt mit Perlen.' +primis_pontis_mille_arena_knowledge: + name: '&2Wissen' + lore: + - '&aBedeutendes Wissen.' +primis_pontis_mille_arena_reward_1: + name: '&4Sternenberührtes Schild' + lore: + - '&7Ein verzierter Schild mit einem Kosmos-Motiv.' +primis_pontis_mille_arena_reward_2: + name: '&4Sternenberührte Brustplatte' + lore: + - '&7Tausend winzige stachelige Sterne erstrecken sich über die Brustplatte.' +primis_pontis_mille_arena_reward_3: + name: 'Sternenhose' + lore: + - '&7Die Leggings funkeln wie die Sterne am Himmel.' +primis_pontis_mille_cat_quest_reward_charm: + name: '&9Katzen-Segen' + lore: + - '&9Wenn du das alles hochhältst' + - 'weg zu deinem Gehör' + - '&9Höre sich armselig an.' +primis_pontis_mille_counselor_sword: + name: '&eStein der Fernrede' + lore: + - '&aDu kannst eine Präsenz spüren, die aus dem Stein kommt.' +primis_pontis_mille_fields_beasts_reward_chest: + name: '&eJäger-Stolz' + lore: + - '&eDiejenigen, die jagen, können nicht die Beute sein.' +primis_pontis_mille_fields_contest_berry: + name: '&dWettbewerbs Beere' + lore: + - '&dEine schöne und sehr große Beere.' + - '&dWirklich eine in einer Million Exemplare.' +primis_pontis_mille_fields_do_it_yourself_reward_bow: + name: '&cJagdbogen' + lore: + - '&cEin handgefertigter Bogen.' + - '&cPfeile aus diesem' + - '&cBogen wird jeder Bestie schaden.' +primis_pontis_mille_fields_first_aid: + name: '&2Erste Hilfe-Ausrüstung' + lore: + - '&fAlles, was man braucht" - "&fum schwere Verletzungen zu behandeln.' +primis_pontis_mille_fields_rat_drop_helmet: + name: '&fgefederter Rattenhut' + lore: + - '&fDu hast es geschafft einen' + - '&fHut aus deiner Beute zu machen.' + - '&fNachdem die Beute extrahiert wurde' + - '&fBlendende Eigenschaften, die du gemacht hast' + - '&fes arbeitet zu deinen Gunsten.' +primis_pontis_mille_fields_rat_meat: + name: '&cRattenfleisch' + lore: + - Rohes Rattenfleisch. Nicht zu kochen. +primis_pontis_mille_fields_stolen_berries: + name: '&4Gestohlene Beeren' + lore: + - '&fEs sind die gestohlenen Beeren' +primis_pontis_mille_fish_nets: + name: '&2Fischnetze' + lore: + - '&aFischen einfach gemacht!' +primis_pontis_mille_fresh_rat: + name: '&fFrische Ratte' + lore: + - Die Katze wird es lieben. +primis_pontis_mille_mines_goblined_up_in_the_maze_reward_axe: + name: '&aRunenverzierte Goblin-Axt' + lore: + - '&aEs sind Runen in den Axgriff geätzt.' + - '&aSie sind mittlerweile ziemlich verblasst.' + - '&aAnscheinend wurde diese Axt an einem Punkt verflucht...' +primis_pontis_mille_mines_goblin_head: + name: '&2Fowl Goblinfedern' + lore: + - '&aSo weich und stachelig.' +primis_pontis_mille_parkour_reward_boots: + name: '&4Diamantbaumstiefel' + lore: + - '&7Stiefel aus spezieller Weichrinde.' + - '&7Mit Juwelen dekoriert.' +primis_pontis_mille_reward_boots: + name: '&4Pontis Mille Stiefel' + lore: + - '&7Traditionelle Pontis Mille Stiefel' +primis_pontis_mille_reward_chest: + name: '&4Pontis Mille Brustplatte' + lore: + - '&7Eine Traditionelle Pontis Mille Brustplatte' +primis_pontis_mille_reward_helmet: + name: '&4Pontis Mille Helm' + lore: + - '&7Ein Traditioneller Pontis Mille Helm' +primis_pontis_mille_reward_leggings: + name: '&4Pontis Mille Hosen' + lore: + - '&7Traditionelle Pontis Mille Hosen' +primis_pontis_mille_reward_shield: + name: '&4Pontis Mille Schild' + lore: + - '&7Ein Traditionelles Pontis Mille Schild' +primis_pontis_mille_reward_sword: + name: '&4Pontis Mille Katana' + lore: + - '&7Unglaublich scharf' +primis_pontis_mille_serious_sewage_reward_helmet: + name: '&2Schildkrötenpanzer Helm' + lore: + - '&2Damit möchten Sie etwas Pizza essen.' +primis_pontis_mille_sewage_keys: + name: '&2Kanalisationsschlüssel' + lore: + - '&aEin Schlüsselring mit vielen Schlüsseln.' +primis_pontis_mille_sewers_ninja_drop_chestplate: + name: '&7Ninja-Garbbrustplatte' + lore: + - Nun bist auch du ein Ninja +primis_pontis_mille_sewers_ninja_drop_leggings: + name: '&7Ninja Garb Hose' + lore: + - Nun bist auch du ein Ninja +primis_pontis_mille_sewers_shredder_drop: + name: '&4Schredder Helm' + lore: + - Voller kleiner kleiner Rasierklinge + - wie Punkte auf der Außenseite. +primis_pontis_mille_slums_chest_sword: + name: '&4Stumpfes Pontis Mille Katana' + lore: + - '&7Unglaublich scharf' +primis_pontis_mille_to_lycan_or_not_to_lycan_reward: + name: '&7Elfenbeinschutz' + lore: + - '&aWiderstandsfähig und leicht' + - '&7Hergestellt aus hartem Fell und Leder.' +primis_pontis_mines_goblin_drop_boots: + name: '&7Goblin Schuhe' + lore: + - '&7Es sieht so aus, als ob jemand einen Eisen Barren nahm' + - '&7und ihn in die richtige Form schmolz.' +primis_pontis_mines_goblin_drop_chestplate: + name: '&7Goblin Brustplatte' + lore: + - '&7Es sieht so aus, als ob jemand einen Eisen Barren nahm' + - '&7und ihn in die richtige Form schmolz.' +primis_pontis_mines_goblin_drop_helmet: + name: '&7Goblin Helm' + lore: + - '&7Es sieht so aus, als ob jemand einen Eisen Barren nahm' + - '&7und ihn in die richtige Form schmolz.' +primis_pontis_mines_goblin_drop_leggings: + name: '&7Goblinhose' + lore: + - '&7Es sieht so aus, als ob jemand einen Eisen Barren nahm' + - '&7und ihn in die richtige Form schmolz.' +primis_pontis_mines_goblin_drop_spear: + name: '&7Goblinspeer' + lore: + - '&7Ein netter und scharfer Stein am Ende.' +primis_pontis_mines_goblin_drop_sword: + name: '&7Goblinschwert' + lore: + - '&7Es ist nur ein Steinknüppel mit einem Griff.' +primis_pontis_redwoods_nasty_little_bandits_reward_boots: + name: '&2Waldstiefel' + lore: + - '&2Die Stiefel scheinen gemacht zu sein,' + - '&2aus weicher Rinde und Blättern' + - '&2sowie kristallisierten Baumharz.' +primis_pontis_redwoods_spider_legs: + name: '&2Spinnenbeine' + lore: + - '&aEs sind nur Spinnenbeine...' +primis_pontis_redwoods_tobacco: + name: '&2Premium Tabak' + lore: + - '&aRiecht Erstaunlich...' +primis_pontis_redwoods_watch: + name: '&2Stabile Taschenuhr' + lore: + - '&aÜberraschend leicht und stabil.' +primis_pontis_redwoods_werewolf_drop_chestplate: + name: '&7Fell Brustplatte' + lore: + - '&7Hergestellt aus hartem Fell und Leder.' + - '&7Leicht, aber sehr Zäh.' +primis_roughspun_boots: + name: '&5Grob gesponnene Stiefel' + lore: + - '&dAbgenutzt und verwittert, Beats' + - '&d überhaupt keine Rüstung!' +primis_roughspun_chestplate: + name: '&5Grob gesponnene Brustplatte' + lore: + - '&dAbgenutzt und verwittert, Beats' + - '&d überhaupt keine Rüstung!' +primis_roughspun_helmet: + name: '&5Grobgesponnener Helm' + lore: + - '&dAbgenutzt und verwittert, Beats' + - '&d überhaupt keine Rüstung!' +primis_roughspun_leggings: + name: '&5 Grob gesponnene Hosen' + lore: + - '&dAbgenutzt und verwittert, Beats' + - '&d überhaupt keine Rüstung!' +primis_ruins_bow: + name: '&8Ruinierter Bogen' + lore: + - Ein alter Bogen. Könnte irgendwann gut gewesen sein. +primis_ruins_diary_entry: + name: Tagebuch-Seite + lore: + - '... Ich bereue es nun den Schatz in den Ruinen nachgejagt zu sein.' + - Nun nachdem ich gestolpert bin und, so wie es aussieht, meine Beine gebrochen habe, + - denke ich, bin ich nun verdammt unter dem Schatz zu sterben, den ich suchte. + - Hätte ich nur in der Parkour Klasse besser aufgepasst! +primis_ruin_relic_boots: + name: '&bRuinen Relikt Stiefel' + lore: + - '&6Begraben mit den Ruinen.' + - '&6Gefüllt mit Uralter Macht.' +primis_ruin_relic_chestplate: + name: '&bRuinenbrustpanzer' + lore: + - '&6Begraben mit den Ruinen.' + - '&6Gefüllt von uralter Macht.' +primis_ruin_relic_helmet: + name: '&bRuinen Relikt Helm' + lore: + - '&6Begraben mit den Ruinen.' + - '&6Gefüllt mit uralter Macht.' +primis_ruin_relic_leggings: + name: '&bRuinen Relikt Hose' + lore: + - '&6Begraben mit den Ruinen.' + - '&6Gefüllt mit uralter Macht.' +primis_rusty_mail_boots: + name: '&3Rostige Plattenstiefel' + lore: + - '&9Rostig, aber langlebig, schlägt' + - '&9Leder Schrott!' +primis_rusty_mail_chestplate: + name: '&3Rostige Plattenbrustplatte' + lore: + - '&9Rostig, aber langlebig, schlägt' + - '&9Leder Schrott!' +primis_rusty_mail_helmet: + name: '&3Grober Plattenhelm' + lore: + - '&9Rostig, aber langlebig, schlägt' + - '&9Leder Schrott!' +primis_rusty_mail_leggings: + name: '&3Grobe Plattenhosen' + lore: + - '&9Rostig, aber langlebig, schlägt' + - '&9Leder Schrott!' +primis_starter_boots: + name: '&4Schiffswrack Stiefel' + lore: + - '&aDieser Lederschrott zählt kaum mehr als Rüstung.' +primis_starter_chestplate: + name: '&4Schiffswrack Brustplatte' + lore: + - '&aDieser Lederschrott zählt kaum mehr als Rüstung.' +primis_starter_helmet: + name: '&4Schiffswrack Helm' + lore: + - '&aDieser Lederschrott zählt kaum mehr als Rüstung.' +primis_starter_leggings: + name: '&4Schiffswrack Beinschutz' + lore: + - '&aDieser Lederschrott zählt kaum mehr als Rüstung.' +primis_starter_sword: + name: '&4Schiffswrack Schwert' + lore: + - '&aMöglicherweise improvisiert von den gestrandeten Resten eines Schiffes!' +primis_storm_temple_drop_axe: + name: '&bSturm-Axt' + lore: + - '&bDer Wind wird sie abwehren.' +primis_storm_temple_drop_boots: + name: '&bSturmstiefel' + lore: + - '&bDer Sturmtempel' + - '&bKeine Kosten gespart.' +primis_storm_temple_drop_charm: + name: '&bSturm-Halskette' + lore: + - '&bDie Macht des Sturms.' +primis_storm_temple_drop_chestplate: + name: '&bSturm Brustplatte' + lore: + - '&bDer Sturmtempel' + - '&bKeine Kosten gespart.' +primis_storm_temple_drop_helmet: + name: '&bSturm Helm' + lore: + - '&bDer Sturmtempel' + - '&bKeine Kosten gespart.' +primis_storm_temple_drop_leggings: + name: '&bSturm Beinschutz' + lore: + - '&bDer Sturmtempel' + - '&bKeine Kosten gespart.' +primis_terravilla_big_trouble_in_little_pub_reward_leggings: + name: '&eDer Segen der Erde' + lore: + - '&eSieht schwer, aber es ist' + - '&eüberraschend leicht.' + - '&eEs ist klar, dass diese' + - '&eHosen bereits ein paar' + - '&eJahrhunderte alt sind.' +primis_terravilla_drowning_terror_reward_charm: + name: '&bFisch Talisman' + lore: + - '&aFischig.' +primis_terravilla_hog_on_my_porch_reward_helmet: + name: 'Schweine Helm' + lore: + - '&6Aus dicken Eberleder gemacht.' +primis_terravilla_perfect_sample: + name: '&ePerfektes Beispiel' + lore: + - '&eEs sieht wie ein Fisch aus...' + - '&eAber sicher ist es keiner...' +primis_terravilla_strike_the_earth_reward_sword: + name: '&5Erd Splitter' + lore: + - '&5Du hast diese Klinge aus' + - '&5der Erdelementar Leich gezogen.' + - '&5Im Gegensatz zu seinem stumpfen Zwilling, ist diese' + - '&5Klinge in einem unberührtem Zustand.' +primis_terravilla_taking_out_the_trash_reward_sword: + name: '&5Erd Splitter' + lore: + - '&9Sieht alt und stumpf aus.' +primis_terravilla_two_legged_terror_growth: + name: '&eZweibeiniger Terrorwachstum' + lore: + - '&eGroßes fleischiges Wachstum.' +primis_terravilla_two_legged_terror_sample: + name: '&eZweibeinige Terror Probe' + lore: + - '&eEs ist eine einfache Probe.' +primis_wolf_hide_boots: + name: '&5Wolfsfell Sandalen' + lore: + - '&dAbgetragen und verwittert, schlägt' + - '&dkeine Rüstung aber um Längen!' +primis_wolf_hide_chestplate: + name: '&5Wolfsfell Gambeson' + lore: + - '&dAbgetragen und verwittert, schlägt' + - '&dkeine Rüstung aber um Längen!' +primis_wolf_hide_helmet: + name: '&5Wolfsfell Helm' + lore: + - '&dAbgetragen und verwittert, schlägt' + - '&dkeine Rüstung aber um Längen!' +primis_wolf_hide_leggings: + name: '&5Wolfsfell Hosen' + lore: + - '&dAbgetragen und verwittert, schlägt' + - '&dkeine Rüstung aber um Längen!' +pufferfish_drop_helmet: + name: '&bPufferhelm' + lore: + - '&bEinst ein Fisch, jetzt ein Helm.' +rabbit_charm: + name: '&bHasen Talisman' + lore: + - '&aMit diesem Talisman' + - '&aist fast jedes ziel nur' + - '&aeinen Sprung entfernt!' +rabbit_wolf_drop_chestplate: + name: '&6Elektrisch geladene Brustplatte' + lore: + - '&6Solange du nichts dagegen hat einen' + - '&6gelegentliche Stromschläge hier und dort.' +rabbit_wolf_drop_leggings: + name: '&6Flambierte Hosen' + lore: + - '&6Nur leicht verbrannt.' +regular_hoglin_drop_boots: + name: '&eStiefel für Schweine' + lore: + - '&eAus haltbarem Material hergestellt' + - '&etalking-hog leather.' +regular_hoglin_drop_chestplate: + name: '&eSchweinerüstung' + lore: + - '&eAus haltbarem Material hergestellt' + - '&etalking-hog leather.' +regular_hoglin_drop_helmet: + name: '&eSchweinehelm' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_leggings: + name: '&eHog Leggings' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +rod_of_the_depths: + name: '&3Stab der Tiefen' + lore: + - '&3Sie möchten wissen, wo' + - '&3Ich habe das von? Setz dich, Junge,' + - '&3Ich habe eine Geschichte für euch...' +rotting_diver_drop_hoe: + name: '&bDivers Hoe' + lore: + - '&bFound on the Rotting Divers corpse.' +salamander_charm: + name: '&bSalamander Talisman' + lore: + - '&aFast so heiss wie MagmaGuy''s' + - '&aneues Mixtape!' +salty_corpse_drop_helmet: + name: '&aStinky Helm' + lore: + - '&aYou''re not sure why' + - '&ayou decided to pull' + - '&athis off of the corpse.' +scorpion_charm: + name: '&bSkorpion Talisman' + lore: + - '&aSchwebe wie ein Schmetterling,' + - '&asteche wie ne Biene,' + - '&avergifte wie eine Kartoffel!' +shulker_charm: + name: '&bShulker Talisman' + lore: + - '&aI believe I can fly' + - '&aI believe I can touch the sky' + - '&aUnd du kommst mit mir!' +skeleton_knight_drop_helmet: + name: '&fKnights Honor' + lore: + - '&fA knights helmet. Made to last.' +sky_archer_drop_bow: + name: '&aHimmelsbogen' + lore: + - '&aGut um Phantome in Schach zu halten.' +slowpoke_charm: + name: '&bFlegmon Talisman' + lore: + - '&aBleibt nur zu hoffen das es sich nicht' + - '&ain verwirrung selbst verletzt...' +spider_knight_drop_helmet: + name: '&aKleiner Helm' + lore: + - '&aEin anständiger Helm. Aber vielleicht etwas eng.' +stacked_bones_drop_helmet: + name: '&6Schädel' + lore: + - '&6Large enough to fit your' + - '&6Kopf drinnen, also warum nicht.' +summon_merchant_scroll: + name: '&6Schriftrolle des Händler Beschwörens' + lore: + - '&aHast du etwas zu verkaufen?' + - '&aRechts Klicken zum aktivieren' + - '&aoder rufe &9Jeeves!' +summon_wolf_scroll: + name: '&6Schriftrolle des Wolf Beschwörens' + lore: + - '&aBeschwört einen guten jungen' + - '&ader dir hilft Eliten zu beissen!' + - '&aVergiss nicht ihn zu loben!' +super_mite_drop_charm: + name: '&dMite Pearl' + lore: + - '&dWar es das wert...' +air_ship_air_buccaneer_boots: + name: '&5 Air Bucanneer''s Stiefel' + lore: + - '&d Perfekt für Luftangriffe!' +air_ship_air_buccaneer_chestplate: + name: '&5Luft Bucanneers Brustpanzer' + lore: + - '&d Perfekt für Luftangriffe!' +air_ship_air_buccaneer_helmet: + name: '&5Luft Bucanneers Helm' + lore: + - '&d Perfekt für Luftangriffe!' +air_ship_air_buccaneer_leggings: + name: '&5Luft Bucanneers Hosen' + lore: + - '&d Perfekt für Luftangriffe!' +air_ship_air_pirates_boots: + name: '&5Luftpiraten Schuhe' + lore: + - '&dPerfekt für Luftangriffe!' +air_ship_air_pirates_chestplate: + name: '&5Luftpiraten Brustpanzer' + lore: + - '&d Perfekt für Luftangriffe!' +air_ship_air_pirates_helmet: + name: '&5Luftpiraten Helm' + lore: + - '&d Perfekt für Luftangriffe!' +air_ship_air_pirates_leggings: + name: '&5Luftpiraten Hosen' + lore: + - '&d Perfekt für Luftangriffe!' +air_ship_bowsmans_bow: + name: '&2Bogenmanns-Bogen' + lore: + - '&a Von den Spätesten fallen gelassen' + - '&aLuftschiff Bogenmann!' +air_ship_cannon_powder: + name: '&cKanonenpulver' + lore: + - '&8Wie sollen Sie sonst noch' + - '&8zum Anzünden der Sicherung?' +air_ship_daveys_digger: + name: '&4 Dave''s Bagger' + lore: + - '&c Dave begehrt keine Unterdrückten' + - '&cUnterköpfe, die seinen Bagger zeigen.' +air_ship_quartermasters_whip: + name: 'Peitsche des Quartiermeisters' + lore: + - '&7Der Quartiermeister hat einen ' + - '&7Zeitplan einzuhalten.' +air_ship_wayfinders_windlass: + name: '&3Wegfinders Ankerwinde' + lore: + - '&bVerwendet um Schiffe zu leiten' + - '&bmit nichts als den Sternen!' +pirate_ship_sea_feast: + name: '&6Meer-Fest' + lore: + - '&6Ein Fest für Augen' + - '&6und der Gesundheitsleiste!' +pirate_ship_sea_ration: + name: '&eMeeres-Ration' + lore: + - '&eEin Apfel pro Tag' + - '&ehält die Skorbut fern' + - '&cHinweis: Macht es nicht' +catacombs_tier_10_miniboss_boots: + name: '&9Spinnenwebenstiefel' + lore: + - '&5So leicht wie Luft!' +catacombs_tier_10_miniboss_spider_eye: + name: '&7Terragog''s Auge' + lore: + - '&7Flüstert aus dem Nichts' + - '&7in deine Ohren während du es hälst...' +catacombs_tier_15_boss_bone: + name: Der Picker + lore: + - '&fSie haben ein Hühnchen zu rupfen!' +catacombs_tier_15_boss_bow: + name: '&6Der Knochenschütteler' + lore: + - '&fSie fühlen diesen hier bis runter' + - '&fzu ihren Knochen!' +catacombs_tier_15_boss_shovel: + name: '&8Der Grabschaufler' + lore: + - '&fSie fühlen diesen hier bis runter' + - '&fzu ihren Knochen!' +catacombs_tier_15_mimic_boss_shield: + name: '&3Schild des verlorenen Templers' + lore: + - Gefunden in einer mysteriösen Truhe in einem + - geheimen Raum von antiken Katakomben... +colosseum_pit_breaker: + name: '&4Grubenbrecher' + lore: + - '&4Veni' +colosseum_pit_filler: + name: '&4&lGrubenfüller' + lore: + - '&4Vici' +colosseum_pit_maker: + name: '&4&lGrubenmacher' + lore: + - '&4Ich sah' +dark_cathedral_tier_75_sword: + name: '&0Verfluchtes Schwert' + lore: + - '&0&kChtulhu ist der einzige wahre Gott.' + - '&0Diese Welt ist nur ein Lamm' + - '&0Zur Schlachtung' +darkspire_arzags_boots: + name: '&8Arzags Kriegsstiefel' + lore: + - '&7Einmal getragen vom mächtigen Arzag!' +darkspire_arzags_chestplate: + name: '&8Arzags Kriegsbrustschutz' + lore: + - '&7Einmal getragen vom mächtigen Arzag!' +darkspire_arzags_helmet: + name: '&8Arzag''s Kriegshelm' + lore: + - '&7Einmal getragen vom mächtigen Arzag!' +darkspire_arzags_leggings: + name: '&8Arzags Kriegsbeinschutz' + lore: + - '&7Einmal getragen vom mächtigen Arzag!' +darkspire_arzags_slicer: + name: '&8Arzag''s Schlitzer' + lore: + - '&7Einst genutzt vom mächtigen Arzag!' +darkspire_crypt_keepers_boots: + name: '&4Kryptenwächterstiefel' + lore: + - '&cEinst die Stiefel vom' + - '&cKorumpierten Kryptenwächter!' +darkspire_hellraisers_battle_armor: + name: '&4Eerbix''s Kampfrüstung' + lore: + - '&cFrüher die Schlacht' + - '&krüstung des ungeheuerlichen' + - '&cEerbix dem gefallenen!' +darkspire_maalkvs_bow: + name: '&4Maalkv''s Bogen' + lore: + - '&cFrüher der Bogen des' + - '&cschadenfrohen Maalkv!' +darkspire_netherite_axe: + name: '&8Leeren Ausweider' + lore: + - '&8Scherben der Leere selbst wurden' + - '&8gesammelt, um das Hackmesser zu bilden' + - '&8dieser antiken Waffe.' +darkspire_nicolas_ribcages_helmet: + name: '&4Nicolas Brustkorb Helm' + lore: + - '&cFrüher der Helm des' + - '&cruchlosen Nicolas Brustkorb!' +darkspire_oroxaks_sword: + name: '&4Oroxaks Schwert' + lore: + - '&cFrüher das Schwert des' + - '&cabscheulichen Oroxak!' +darkspire_zalmurs_leggings: + name: '&4Zalmurs Beinschutz' + lore: + - '&cFrüher der Beinschutz von' + - '&cdem eifrigen Zalmur' + - '&cder Zwergenschächter!' +the_feller: + name: '&2Der Fäller' + lore: + - '&aSogar in deinem Schlaf,' + - '&aspürst du die Harzlust' + - '&adieser Axt' +the_great_weaver_drop_charm: + name: '&cWeavers Silk' + lore: + - '&cGroßartige Macht ist in dieser Seide eingefangen.' +hallosseum_amazing_treat: + name: '&aErstaunlicher Leckerbissen!' + lore: + - '&eEin fantastischer Snack!' +hallosseum_axe_of_beheadings: + name: '&cAxt der Enthauptung' + lore: + - '&4Berühmt geworden durch die Enthauptung eines' + - '&4gewissen kopflosen Reiters!' +hallosseum_incredible_treat: + name: '&aUnglaubliche Leckerei!' + lore: + - '&eEin unglaublicher Snack!' +hallosseum_treat: + name: '&aLeckerbissen!' + lore: + - '&eEin köstlicher Snack!' +hallosseum_treat_v2: + name: '&aLeckerei!' + lore: + - '&eEin delikater Snack!' +the_hunter_drop_crossbow: + name: '&aJägers Freund' + lore: + - '&aLasst die Jagd beginnen.' +northpole_amazing_treat: + name: '&aErstaunliche Leckerei!' + lore: + - '&eEin erstaunlicher Snack!' +northpole_coalbringer: + name: '&8Kohlebringer' + lore: + - '&cWas auch immer ich berühre' + - '&cBeginnt in meinem Griff zu schmelzen.' + - '&cIch bin zu stark!' +northpole_frostcaster: + name: '&bFrostbeschwörer' + lore: + - '&cWas auch immer ich berühre' + - '&/Wandelt sich zu Schnee in meinem Griff!' + - '&cIch bin zu stark' +northpole_incredible_treat: + name: '&aUnglaubliche Leckerei!' + lore: + - '&eEin unglaublicher Snack!' +northpole_naughty_lister: + name: '&4Der Auflister der Unartigen' + lore: + - '&cNotiert Namen. Fragt nicht zweimal nach!' + - '&cWarst du dieses Jahr unartig?' +northpole_treat: + name: '&aLeckerei!' + lore: + - '&eEin köstlicher Snack!' +northpole_treat_v2: + name: '&aLeckerei!' + lore: + - '&eEin köstlicher Snack!' +the_phantom_drop_chestplate: + name: '&dPhantom Gambison' + lore: + - '&dYou would say it is made out of soft' + - '&dand comfy fibrous cloth, but a blade' + - '&dwould not recoil from striking cloth.' +pirate_ship_tier_15_boots: + name: Piratensandalen + lore: + - Sorgen dafür das du + - an den Strand willst! +pirate_ship_tier_15_bow: + name: Piraten-Kurzbogen + lore: + - Perfekt für Enter-Parties! +pirate_ship_tier_15_chestplate: + name: Piratenhemd + lore: + - Keine Schuhe, kein Hemd + - kein Problem! +pirate_ship_tier_15_helmet: + name: Piraten-Bandana + lore: + - Keine Schuhe, kein Hemd + - kein Problem! +pirate_ship_tier_15_leggings: + name: Piraten-Schärpe + lore: + - Diese könnten eine Wäsche vertragen! +pirate_ship_tier_15_sword: + name: Piraten-Marlinspike + lore: + - Lebhaft und tödlich! +pirate_ship_tier_20_miniboss_axe: + name: '&5Cookie´s Zartmacher' + lore: + - '&5Du wirst das morgen spüren!' +pirate_ship_tier_20_miniboss_chestplate: + name: '&5Cookie´s Schürze' + lore: + - '&5Hat schon bessere Tage gesehen!' +pirate_ship_tier_25_boots: + name: '&aPiraten-Schuhe' + lore: + - '&aPerfekt für Diebstahl!' +pirate_ship_tier_25_bow: + name: '&aPiraten Muskete' + lore: + - '&aVorsicht, wo du ihn zeigst!' +pirate_ship_tier_25_chestplate: + name: '&aPiraten Weste' + lore: + - '&aWahrscheinlich unrechtmäßig erhalten!' +pirate_ship_tier_25_helmet: + name: '&aPiraten-Ohrringe' + lore: + - '&aWertvoll genug, um eine' + - '&aBeerdigung zu bezahlen!' +pirate_ship_tier_25_leggings: + name: '&aPiraten Hose' + lore: + - '&avoll mit Goldmünzen!' +pirate_ship_tier_25_miniboss_helmet: + name: '&5Helmsmans Augenklappe' + lore: + - '&5Wie kannst du besser sehen' + - '&5mit ihm auf dem Kopf!?' +pirate_ship_tier_25_miniboss_trident: + name: '&5Helmsmans Dreizack' + lore: + - '&5Spitzes Ende richtung Feind!' +pirate_ship_tier_25_sword: + name: '&aPiraten-Entermesser' + lore: + - '&aWahre Piraterie!' +pirate_ship_tier_30_miniboss_axe: + name: '&5Crushys Hackmesser' + lore: + - '&5Schritt zurück!' +pirate_ship_tier_30_miniboss_shield: + name: '&5Crushys Schulter' + lore: + - '&5Schultertag niemals übersprungen!' +pirate_ship_tier_35_boots: + name: '&9Piraten Schuhe' + lore: + - '&9Perfekt zum Säbelrasseln!' +pirate_ship_tier_35_bow: + name: '&9Piratenhandkanone' + lore: + - '&9Sprengt sie weg!' +pirate_ship_tier_35_chestplate: + name: '&9Piraten-Riemen' + lore: + - '&9Perfekt für Plünderung!' +pirate_ship_tier_35_helmet: + name: '&9Piraten-Augenklappe' + lore: + - '&9Nicht perfekt um zu sehen!' +pirate_ship_tier_35_leggings: + name: '&9Piratengamaschen' + lore: + - '&9Perfekt für Plünderung!' +pirate_ship_tier_35_miniboss_boots: + name: '&9Bodyguard Stiefel' + lore: + - '&5Für diejenigen, die etwas zu verteidigen haben!' +pirate_ship_tier_35_miniboss_chestplate: + name: '&5Bodyguard Riemen' + lore: + - '&5Für diejenigen, die etwas zu verteidigen haben!' +pirate_ship_tier_35_miniboss_crossbow: + name: '&5Bodyguard Handkanone' + lore: + - '&5Für diejenigen, die etwas zu verteidigen haben!' +pirate_ship_tier_35_miniboss_helmet: + name: '&5Bodyguard Augenklappe' + lore: + - '&5Für diejenigen, die etwas zu verteidigen haben!' +pirate_ship_tier_35_miniboss_leggings: + name: '&5Bodyguard-Gamaschen' + lore: + - '&5Für diejenigen, die etwas zu verteidigen haben!' +pirate_ship_tier_35_miniboss_sword: + name: '&5Bodyguard Entermesser' + lore: + - '&5Für diejenigen, die etwas zu verteidigen haben!' +pirate_ship_tier_35_sword: + name: '&9Piraten-Entermesser' + lore: + - '&9Wahre Piraterie!' +pirate_ship_tier_40_miniboss_crossbow: + name: '&5Die Donnerbüchse' + lore: + - '&5Sprühen ''n beten!' +pirate_ship_tier_40_miniboss_leggings: + name: '&5Die Zaggers' + lore: + - '&5Wenn sie denken, dass du gleich,' + - '&5Zick, Zack auf ihnen machst!' +pirate_ship_tier_45_boss_helmet: + name: '&5Kapitäns Augenklappe' + lore: + - '&5Ich sehe keine Probleme!' +pirate_ship_tier_45_boss_sword: + name: '&5Captain''s Krummsäbel' + lore: + - '&5En Garde, ihr gemeinen Ratten!' +the_ruins_boss_loot: + name: '&6Thors Axt' + lore: + - Nur die reinen Herzen + - können diese Axt führen. +sewer_drowned_kings_boots: + name: '&4Stiefel des ertrunkenen Königs' + lore: + - '&cFrüher die Stiefel vom' + - '&cteuflischen Ertrunkenen König!' +sewer_drowned_kings_chestplate: + name: '&4Ertrunkener Königs-Brustplatte' + lore: + - '&cFrüher die Brustplatte vom' + - '&cteuflischen Ertrunkenen König!' +sewer_drowned_kings_crown: + name: '&4Krone des ertrunkenen Königs' + lore: + - '&cFrüher die Krone vom' + - '&cteuflischen Ertrunkenen König!' +sewer_drowned_kings_leggings: + name: '&4Beinschutz des ertrunkenen Königs' + lore: + - '&cFrüher die Leggings vom' + - '&cteuflischen Ertrunkenen König!' +sewer_drowned_kings_trident: + name: '&4Dreizack des ertrunkenen Königs' + lore: + - '&cFrüher der Dreizack vom' + - '&cteuflischen Ertrunkenen König!' +sewer_spelunkers_boots: + name: '&2Kanalisationsstiefel des Spelunkers' + lore: + - '&afür die folgende Kanalisation' + - '&aEntdeckers wesentliche Leggings!' +sewer_spelunkers_chestplate: + name: '&2Kanalisation Spelunker-Brustplatte' + lore: + - '&afür die folgende Kanalisation' + - '&aEntdeckers essentielle Brustplatte!' +sewer_spelunkers_helmet: + name: '&2Kanalisationshelm des Spelunkers' + lore: + - '&afür die folgende Kanalisation' + - '&aEntdeckers essentieller Helm!' +sewer_spelunkers_leggings: + name: '&2Kanalisations Spelunkers Beinschutz' + lore: + - '&afür die folgende Kanalisation' + - '&aEntdeckers wesentliche Leggings!' +sewer_spelunkers_sword: + name: '&2Kanalisations-Spelunker-Schwert' + lore: + - '&afür die folgende Kanalisation' + - '&aEntdeckers wesentliches Schwert!' +the_stinger: + name: '&eDer Stinger' + lore: + - '&aSchwebe wie ein Schmetterling,' + - '&asteche wie ne Biene!' +tree_defender_drop_shield: + name: '&7Lebendes Holzschild' + lore: + - '&7Dieses Schild wird' + - '&7Repariert sich langsam von selbst.' +unbind_scroll: + name: '&5Entbindungs Rolle' + lore: + - '&5Erlaubt es Benutzern einen' + - '&5seelengebundenen Gegenstände in einem Amboss zu lösen!' + - '&5Benutze es weise!' +undead_farmer_drop_shovel: + name: '&8Manure Master' + lore: + - '&8Perfect for shoveling pig manure.' +unwanted_visitor_drop_bow: + name: '&1Frostbogen' + lore: + - '&9Versucht dich zu entspannen' + - '&9and snipe from afar.' +vampire_manor_gargoyle_granulator: + name: '&8Gargoyle-Granulator' + lore: + - '&cLeicht mit Knoblauch bestäubt.' +vampire_manor_stake_your_claim: + name: '&4Stecke deinen Anspruch ab' + lore: + - '&cLeicht mit Knoblauch bestäubt.' +vampiric_charm: + name: '&bVampir Talisman' + lore: + - '&aNiemand weiss woher es kam,' + - '&aun niemand kann vergessen' + - '&awie gefährlich es ist...' +veterans_boots: + name: '&6Veteranenstiefel' + lore: + - '&2Verliehen an diejenigen, die die' + - '&2Holzliga-Arena herausforderten!' +veterans_chestplate: + name: '&6Veteranen Brustplatte' + lore: + - '&2Verliehen an diejenigen, die die' + - '&2Holzliga-Arena herausforderten!' +veterans_helmet: + name: '&6Veteranenhelm' + lore: + - '&2Verliehen an diejenigen, die die' + - '&2Holzliga-Arena herausforderten!' +veterans_leggings: + name: '&6Veteranen Beinschutz' + lore: + - '&2Verliehen an diejenigen, die die' + - '&2Holzliga-Arena herausforderten!' +veterans_sword: + name: '&6Veteranen-Schwert' + lore: + - '&2Verliehen an diejenigen, die die' + - '&2Holzliga-Arena herausforderten!' +vex_top_drop_boots: + name: '&bVerärgerte Stiefel' + lore: + - '&bMit mächtigen Stiefeln' + - '&bkommt mächtige Stärke.' +warlock_drop_chestplate: + name: '&dHexer-Roben' + lore: + - '&dBietet guten Schutz vor Zaubern.' +warlock_drop_helmet: + name: '&dHexer-Kapuze' + lore: + - '&dBietet guten Schutz vor Zaubern.' +water_pest_drop_shield: + name: '&bWasser getränktes Schild' + lore: + - '&bEs ist eigentlich ziemlich robust.' +wendigo_drop_sword: + name: '&8Klinge des Hungers' + lore: + - '&8Diese Klinge wird immer' + - '&8nach Blut hungern.' +werehare_drop_charm: + name: '&eWerhasen Trophäe' + lore: + - '&eGlück und Gesundheit für' + - '&ediejenigen, die es tragen.' +werewolf_bone: + name: '&6Werwolfknochen' + lore: + - '&aNachdem der Alpha getötet wurde,' + - '&amacht dich das vorübergehend!' + - '&azum neuen Rudelsführer' +wolfsbane: + name: '&7Wolfsfluch' + lore: + - '&aGemacht aus Überresten von' + - '&aEinem Alpha Werwolf, alle' + - '&aWölfe erzittern bei seinem Anblick.' +yeti_drop_leggings: + name: '&eFell Beinschutz' + lore: + - '&eSchön und warm.' +yezhi_baba_drop_boots: + name: '&aHexen Roben' + lore: + - '&aDer Geruch sollte' + - '&airgendwann verschwinden.' +zombie_kings_axe: + name: '&4Axt des Zombie Königs' + lore: + - Die Axt dessen, den die Zombies + - ihren König nennen. + - Die Blutlust is spürbar. +airship_minidungeon: + name: '&6Das Luftschiff' + customInfo: + - '&fEin Ehrfucht gebietendes Luftschiff voll mit untoten Piraten!' + - '&6Credits: MagmaGuy, 69OzCanOfBepis' + - '&6und Realm of Lotheridon' + playerInfo: |- + Schwierigkeit: &6Mittel + $bossCount Bosse, von Stufe $lowestTier bis $highestTier + &6Ein Ehrfucht gebietendes Luftschiff voll mit untoten Piraten + &6für ehrfahrene Spieler! + regionEnterMessage: '&8[EM] &cDringe in feindliche Luftzone ein!' + regionLeaveMessage: '&8[EM] &cVerlasse feindliche Luftzone!' +binder_of_worlds_lair: + name: '&5Ordner der Welten' + customInfo: + - '&5Die ultimative Herausforderung. Sei vorbereitet!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Schwierigkeit: &6Albtraum + $bossCount Level $highestTier Endboss! + &5Dies ist der schwierigste Kampf in EliteMobs! + regionEnterMessage: '&8[EM] &5Reality löst sich um dich herum auf. Du stehst vor der letzten Herausforderung. &4Dafür bist du nicht vorbereitet!' + regionLeaveMessage: '&8[EM] &5Du hast das Enträtselung verlassen. Hast du das gefunden, was du gesucht hast? War das es wert?' +catacombs_lair: + name: '&8Die Katakomben' + customInfo: + - '&fDer beste Dungeon für Anfänger!' + - '&6Credits: Realm of Lotheridon' + playerInfo: |- + Schwierigkeit: &aSchwer + $bossCount Bosse, von Stufe $lowestTier bis $highestTier + &2Der beste Dungeon für Gruppen von Anfängern! + regionEnterMessage: '&8[EM] &8Du betrittst nun die Katakomben. Vorsicht, vor jenen die sie ihr zuhause nennen...' + regionLeaveMessage: '&8[EM] &8Du hast die Katakomben verlassen. Hat es dir was gebracht?' +colosseum_lair: + name: '&6Das Kolosseum' + customInfo: + - '&fEnthält den ersten echten Welt-Boss, ersten' + - '&fMulti-Phasen Kampf, ersten Boss zu Ross,' + - '&fersten verkleideten Boss... ein wahrhaft epischer Kampf!' + - '&6Credits: MagmaGuy & Maldini' + playerInfo: |- + Schwierigkeit: &cSchwer + $bossCount Bosse, vom Level $lowestTier zu $highestTier + &cEine wahre für große Gruppen von Spielern! + regionEnterMessage: '&8[EM] &6Champions und Herausforderer bereitet euch vor! Beweist euren Wert gegen den mächtigsten Gegner!' + regionLeaveMessage: '&8[EM] &6Lebewohl Reisender! &eKomm bald zurück und demonstriere deine Macht nochmal!' +dark_cathedral_lair: + name: '&8Die Dunkle Kathedrale' + customInfo: + - '&fDas allereste EliteMobs Lair!' + - '&fEin klassiker den alle Server brauchen!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Schwierigkeit: &cSchwer + $bossCount level $highestTier Endboss! + &cDas Originale Minidungeon, eine Herausforderung für + &ceine Gruppe von Spielern oder Veteranen! + regionEnterMessage: '&8[EM] &8Wilkommen in der Dunklen Kathedrale. &4Der Tot erwartet dich...' + regionLeaveMessage: '&8[EM] &8Du verlässt nun die Dunkle Kathedrale. &4Deine Wiederkehr wird erwartet...' +dark_spire_minidungeon: + name: '&8Der Dunkle Turm' + customInfo: + - '&fDer erste Inhalt für Spieler mit hohem Level!' + - '&fGemacht für die, die eine wahre Herausforderung suchen!' + - '&6Credits: 69OzCanOfBepis' + playerInfo: |- + Schwierigkeit: &6Mittel + $bossCount Bosse, ab level $lowestTier bis $highestTier + &cEine breite Herausforderung für fortgeschrittene Spieler! + regionEnterMessage: '&8[EM] &1Eine Invasion wird durchgeführt. &9Halte den aufstand auf!' + regionLeaveMessage: '&8[EM] &1Du hast es geschafft sie aufzuhalten. &9Vorerst...' +fireworks_lair: + name: '&aFeuerwerk' + customInfo: + - '&fDie Karte vom 4. Juli 2021!' + - '&6Credits: MagmaGuy' + playerInfo: |- + Schwierigkeit: &cHard + $bossCount Level $lowestTier Big Boss! + &6Eine Begegnung voller Explosionen! + regionEnterMessage: '&8[EM] &eWillkommen bei der Feuerwerksshow!' + regionLeaveMessage: '&8[EM] &eDu hast die Party verlassen!' +frost_palace_sanctum: + name: Frost-Palast + customInfo: + - '&fEin 7-Phasen-Kampf gegen' + - die Königin des Eises! + - '&6Credits: MagmaGuy, Delio' + playerInfo: 'Schwierigkeit: &45 Mann schwerer Inhalt!' + regionEnterMessage: '&bDu betrittst den Frost-Palast! Bleib eisig!' + regionLeaveMessage: '&bDu hast den Frost-Palast verlassen!' +hallosseum_lair: + name: '&cHallosseum' + customInfo: + - '&fDas unheimliche Halloween begegnis von 2020!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Schwierigkeit: &cHard + $bossCount Level $lowestTier Big Boss! + &6Eine Begegnung voller Explosionen! + regionEnterMessage: '&8[EM] &4Süsses oder Saures! &8Deine Seele gehört mir!' + regionLeaveMessage: '&8[EM] &4Du bist im besitz deiner Seele entkommen.' +invasion_minidungeon: + name: '&2Die Invasion' + customInfo: + - '&fDer Halloween Minidungeon!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Schwierigkeit: &6Mittel + $bossCount Aliens, vom Level $lowestTier zu $highestTier + &6Werd nicht entführt! + regionEnterMessage: '&8[EM] &7Alien Invasion im Gange! Besiege das Mutterschiff!' + regionLeaveMessage: '&8[EM] &7Du bist den außerirdischen Entführungen entkommen! Niemand wird dir jemals glauben.' +north_pole_minidungeon: + name: '&9Der Nordpol' + customInfo: + - '&fDer Weihnachts Minidungeon!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Schwierigkeit: &6Mittel + $bossCount Bosse, von Stufe $lowestTier bis $highestTier + &6Weihnachten in einer Schneekugel! + regionEnterMessage: '&8[EM] &7Du hast den Nordpol erreicht! &fWarst du dieses Jahr unartig?' + regionLeaveMessage: '&8[EM] &7Besuch uns mal wieder. &fEs gibt genug Süsses und Belohnungen fürs nächste mal!' +oasis_adventure: + name: '&6Die Oase' + customInfo: + - '&fEin massives abenteuer für Anfänger!' + - '&6Credits: 69OzCanOfBepis' + playerInfo: |- + Schwierig: &2Einzeln Absolvierbar + $bossCount Bosse, ab level $lowestTier bis $highestTier + &6Ein großes Abenteuer für Spieler die schon die Seile kennen! + regionEnterMessage: '&8[EM] &6Du bist an der Oase angekommen!' + regionLeaveMessage: '&8[EM] &6Du hast die Oase verlassen!' +pirate_ship_minidungeon: + name: '&6Das Piratenschiff' + customInfo: + - '&fEin lustiger, Herausfordernder Minidungeon voll mit' + - '&fBossen. Gemacht für Spieler die langsam besser' + - '&fwerden in EliteMobs!' + - '&6Credits: MagmaGuy & Realm of Lotheridon' + playerInfo: |- + Schwierigkeit: &6Mittel + $bossCount Bosse, von Stufe $lowestTier bis $highestTier + &6Eine der besten Jagdgründe für aufstrebende Abenteurer! + regionEnterMessage: '&8[EM] &3Du betrittst nun das Piratenschiff! &bPlündere und Raube wie es dir gefällt!' + regionLeaveMessage: '&8[EM] &3Spieler über Bord! &bKomm zurück wenn du dich an die See gwöhnt hast, du Landratte!' +primis_adventure: + name: '&7Primis' + customInfo: + - '&fEin Tutorial-Abenteuer für neue Spieler!' + - '&6Credits: 69OzCanOfBepis, MagmaGuy' + playerInfo: |- + Schwierigkeit: &2Einfach + $bossCount Bosse, von Stufe $lowestTier bis $highestTier + &6Ein einführungsabenteuer für neue Spieler! + regionEnterMessage: '&8[EM] &6Primis wartet, treffen Sie die Erde!' + regionLeaveMessage: '&8[EM] &6Du hast Primis verlassen!' +sewers_minidungeon: + name: '&8Die Kanalisation' + customInfo: + - '&fDer grösste Minidungeon der je gemacht wurde!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Schwierigkeit: &6Mittel + $bossCount Bosse, von Stufe $lowestTier bis $highestTier + &6Ein komplexes Dungeon-Labyrinth mit Herausfordernden Abschnitten! + regionEnterMessage: '&8[EM] &5Dieser Ort sieht verlassen aus... &dJedoch scheint etwas in der Kanalisation zu leben!' + regionLeaveMessage: '&8[EM] &5Du hast es geschafft über Wasser zu bleiben. &dVielleicht ertrinkst du beim nächsten mal.' +the_ruins: + name: '&6Die Ruinen' + customInfo: + - '&fEin Kampf gegen einen Mythos von' + - '&fNordische Mythologie, bereite dich auf einen Schlag vor!' + - '&6Credits: 69OzCanOfBepis, MagmaGuy' + playerInfo: |- + Schwierigkeit: &cSchwer + $bossCount Stufe $lowestTier Endboss! + &cEin harter Kampf gegen einen Nordischen Gott! + regionEnterMessage: '&8[EM] &3Diejenigen, die die Mythen herausfordern, müssen auf ihren Untergang vorbereitet sein!' + regionLeaveMessage: '&8[EM] &3Du weißt jetzt, was es braucht, um eine Legende zu erschaffen!' +vampire_manor: + name: '&cDer Vampir Gutshof' + customInfo: + - '&fBereite dich auf Blutvergießen vor!' + - '&6Credits: MagmaGuy, 69OzCanOfBepis' + playerInfo: |- + Schwierigkeit: &6Mittel + $bossCount Bosse, ab level $lowestTier bis $highestTier + &6Ein tötliches Anwesen voll mit Blutrünstigen Kreaturen! + &6Bist du bereit dem ins Gesicht zu schauen was die Nacht heimsucht? + regionEnterMessage: '&8[EM] &cBetreten von gefährlichem Gelände!!' + regionLeaveMessage: '&8[EM] &cVerlasst nun das heimgesuchte Land!' +alpha_werewolf_p1: + name: '$eventBossLevel &7Wahnsinniger Verteidiger' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Der Alpha Wolf wurde niedergestreckt!' + - '&c&l Höchster Schaden: $damager1name &cmit $damager1damage Schaden!' + - '&6&l Zweit höchster Schaden: $damager2name &6mit $damager2damage Schaden!' + - '&e&l Dritt höchster Schaden: $damager3name &emit $damager3damage Schaden!' + - '&aTöter: $players' + - '&e&l---------------------------------------------' + locationMessage: '&7Wahnsinniger Verteidiger: $distance Blöcke entfernt!' + spawnMessage: '&cDas Heulen eines Alpha Werwolfs wurde gehört!' + deathMessage: '&aDer Alpha Werwolf wurde von $players erlegt!' + escapeMessage: '&4Die Dämmerung bricht an, der Alpha Wolf verschwindet ohne Spur!' +alpha_werewolf_p2: + name: '$eventBossLevel &7Alpha Werwolf' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Der Alpha Wolf wurde niedergestreckt!' + - '&c&l Höchster Schaden: $damager1name &cmit $damager1damage Schaden!' + - '&6&l Zweit höchster Schaden: $damager2name &6mit $damager2damage Schaden!' + - '&e&l Dritt höchster Schaden: $damager3name &emit $damager3damage Schaden!' + - '&aTöter: $players' + - '&e&l---------------------------------------------' + locationMessage: '&7Alpha Wolf: $distance Blöcke entfernt!' + spawnMessage: '&cDas Heulen eines Alpha Werwolfs wurde gehört!' + deathMessage: '&aDer Alpha Werwolf wurde von $players gestoppt!' + escapeMessage: '&4Dämmerung bricht an, der Alpha Wolf verschwindet ohne Spur!' +ancient_corpse: + name: '$eventBossLevel &eUralte Leiche' +animated_armor: + name: '$eventBossLevel &8Belebte Rüstung' + locationMessage: '&cBelebte Rüstung: $distance Blöcke entfernt!' + spawnMessage: '&cOh Nein! Eine belebte Rüstung ist seinen Rüstungsständer entkommen!' + deathMessage: '&aDie belebte Rüstung wurde von $players aufgehalten!' + escapeMessage: '&4Die belebte Rüstung ist weg!' +arachnid_matriarch: + name: '$eventBossLevel &cSpinnen-Matriarchin' + locationMessage: '&cSpinnen-Matriarchin: $distance Blöcke entfernt!' + spawnMessage: '&cEine Matriarchin ist gekommen, um ihre Brut über das Land zu verbreiten!' + deathMessage: '&aDie Matriarchin und ihre Brut wurden von $players aufgehalten!' + escapeMessage: '&4Die Matriachin ist weg!' +arachnid_matriarch_summon: + name: '$eventBossLevel &4Brutling' +armor_goblin: + name: '$eventBossLevel &3Rüstungs Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eDer Rüstungs Goblin wurde ausgeraubt!' + - '&c&l Höchster Schaden: $damager1name &cmit $damager1damage Schaden!' + - '&6&l Zweit höchster Schaden: $damager2name &6mit $damager2damage Schaden!' + - '&e&l Dritt höchster Schaden: $damager3name &emit $damager3damage Schaden!' + - '&aTöter: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cRüstungs Goblin: $distance Blöcke entfernt!' + spawnMessage: '&cEin Rüstungs Goblin wurde gesichtet!' + deathMessage: '&aEin Rüstungs Goblin wurde von $players besiegt!' + escapeMessage: '&4Ein Rüstungs Goblin ist entkommen!' +baba_rhoga: + name: '$eventBossLevel &cBaba Rhoga' + locationMessage: '&cBaba Rhoga: $distance Blöcke entfernt!' + spawnMessage: '&cEine bösartige Hexe ist aus ihrer Behausung gekrochen!' + deathMessage: '&a$players hat die Hexe zur Ruhe gelegt, für den Moment.' + escapeMessage: '&4Die Hexe ist entkommen!' +baba_rhoga_summon: + name: '$reinforcementLevel &4Baba Rhoga' +baba_yaga: + name: '$eventBossLevel &cBaba Yaga' + locationMessage: '&cBaba Yaga: $distance Blöcke entfernt!' + spawnMessage: '&cEine bösartige Hexe ist aus ihrer Behausung gekrochen!' + deathMessage: '&a$players hat die Hexe zur Ruhe gelegt, für den Moment.' + escapeMessage: '&4AThe hag has left!' +baba_yaga_summon: + name: '$reinforcementLevel &4Baba Yaga' +balloon_rider: + name: '$eventBossLevel &dBalloon Rider' + locationMessage: '&cBalloon Rider: $distance blocks away!' + spawnMessage: '&cA brave Balloon Rider has come to the Nether!' + deathMessage: '&aThe Balloon Rider has taken his last ride thanks to $players!' + escapeMessage: '&4The Balloon Rider has floated away!' +balloon_rider_mount: + name: '$eventBossLevel &5Ghastly Balloon' +balrog: + name: '$eventBossLevel &4Balrog' +banshee: + name: '$eventBossLevel &cBanshee' + locationMessage: '&cBanshee: $distance blocks away!' + spawnMessage: '&cA Banshee''s wail can be heard!' + deathMessage: '&aThe Banshee was silenced by $players!' + escapeMessage: '&4The Banshee has left!' +banshee_summon: + name: '$eventBossLevel &cGrief' +beast_master: + name: '$eventBossLevel &6Bestienmeister' + deathMessages: + - '&e&l---------------------------------------------' + - '&eDer Bestienmeister wurde ausgenommen!' + - '&c&l Höchster Schaden: $damager1name &cmit $damager1damage Schaden!' + - '&6&l Zweit höchster Schaden: $damager2name &6mit $damager2damage Schaden!' + - '&e&l Dritt höchster Schaden: $damager3name &emit $damager3damage Schaden!' + - '&aTöter: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cBestienmeister: $distance Blöcke entfernt!' + spawnMessage: '&cDer Bestienmeister wurde gesichtet!' + deathMessage: '&aDer Bestienmeister wurde von $players erschlagen!' + escapeMessage: '&4Der Bestienmeister ist in die Wildnis zurückgekehrt!' +beast_tamer: + name: '$eventBossLevel &eBeast Tamer' + locationMessage: '&cBeast Tamer: $distance blocks away!' + spawnMessage: '&cA master of beasts roams the world!' + deathMessage: '&aThe Beast Tamer was stopped by $players!' + escapeMessage: '&4The Beast Tamer has left!' +beast_tamer_summon: + name: '$eventBossLevel &6Large Beast' +beast_tamer_summon_1: + name: '$eventBossLevel &6Beast' +beta_wolf: + name: '$reinforcementLevel &7Beta Wolf' +bigfoot: + name: '$eventBossLevel &fBigfoot' + locationMessage: '&cBigfoot: $distance blocks away!' + spawnMessage: '&cA mighty beast has appeared!' + deathMessage: '&aThe beast is no more thanks to $players!.' + escapeMessage: '&4Das Biest ist entkommen!' +big_bad_wolf: + name: '$eventBossLevel &fGroßer böser Wolf' + locationMessage: '&cBig Bad Wolf: $distance blocks away!' + spawnMessage: '&cAnd he huffed and he puffed!' + deathMessage: '&aThe little piggies are now safe thanks to $players!' + escapeMessage: '&4The Big Bad Wolf has left!' +binder_of_worlds_phase_1_endermite_reinforcement: + name: '$reinforcementLevel &5Korrupte Realität' +binder_of_worlds_phase_3_enderman_reinforcement: + name: '$reinforcementLevel &5Realitätstöter' +binder_of_worlds_phase_3_ghast_reinforcement: + name: '$reinforcementLevel &5Realität Shredder' +blayyze: + name: '$eventBossLevel &6Blayyze' + deathMessages: + - '&e&l---------------------------------------------' + - '&6Der Blayyze wurde zurückgeschlagen!' + - '&c&l Höchster Schaden: $damager1name &cmit $damager1damage Schaden!' + - '&6&l Zweit höchster Schaden: $damager2name &6mit $damager2damage Schaden!' + - '&e&l Dritt höchster Schaden: $damager3name &emit $damager3damage Schaden!' + - '&aTöter: $players' + - '&e&l---------------------------------------------' + locationMessage: '&6????: $distance Blöcke entfernt' + spawnMessage: '&cEtwas steigt aus dem Meteoritenkrater hervor...' + deathMessage: '&6$players haben Erstkontakt hergestellt.' + escapeMessage: '&6Die Ayyliens wurden nach Area 51 verfrachtet!' +bloated_jeffrey: + name: '$eventBossLevel &dBloated Jeffrey' + locationMessage: '&cBloated Jeffrey: $distance blocks away!' + spawnMessage: '&cIt''s Jeffrey! They are in the nether! Bring a bow!' + deathMessage: '&aBloated Jeffrey has been slain by $players!' + escapeMessage: '&4Jeffrey and his friends grew bored and they left!' +bloated_jeffrey_summon: + name: '$eventBossLevel &dJeffrey''s Friend' +bone_fiend: + name: '$eventBossLevel &7Bone Fiend' + locationMessage: '&cBone Fiend: $distance blocks away!' + spawnMessage: '&cA creature of bone and bone has appeared!' + deathMessage: '&aThe Bone Fiend was defeated by $players!' + escapeMessage: '&4The Bone Fiend found no bone and left!' +bone_fiend_mount: + name: '$eventBossLevel &8Bone Carrier' +changeling: + name: '$eventBossLevel &4Changeling' + locationMessage: '&cChangeling: $distance blocks away!' + spawnMessage: '&cA shape-shifter has entered this world.' + deathMessage: '&aThe Changeling was stopped by $players!' + escapeMessage: '&4The Changeling has escaped!' +changeling_p2: + name: '$eventBossLevel &4Changeling' +changeling_p3: + name: '$eventBossLevel &4Veränderlicher' +changeling_p4: + name: '$eventBossLevel &4Veränderlicher' +changeling_p5: + name: '$eventBossLevel &4Veränderlicher' +changeling_p6: + name: '$eventBossLevel &4Veränderlicher' +changeling_p7: + name: '$eventBossLevel &4Veränderlicher' +charms_goblin: + name: '$eventBossLevel &2Talisman Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eDer Talisman Goblin wurde ausgeraubt!' + - '&c&l Höchster Schaden: $damager1name &cmit $damager1damage Schaden!' + - '&6&l Zweit höchster Schaden: $damager2name &6mit $damager2damage Schaden!' + - '&e&l Dritt höchster Schaden: $damager3name &emit $damager3damage Schaden!' + - '&aTöter: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cTalisman Goblin: $distance Blöcke entfernt!' + spawnMessage: '&cEin Talisman Goblin wurde gesichtet!' + deathMessage: '&aEin Talisman Goblin wurde von $players besiegt!' + escapeMessage: '&4Ein Talisman Goblin ist entkommen!' +circus_ringmaster: + name: '$eventBossLevel &dRingmeister' + locationMessage: '&cZirkus Ringmeister: $distance Blöcke entfernt!' + spawnMessage: '&cEin schrecklicher Zirkus ist in der Stadt!' + deathMessage: '&a$players hat die Herrschaft des Missbrauchs durch den Ringmeister beendet!' + escapeMessage: '&4Der Zirkus hat die Stadt verlassen!' +circus_ringmaster_summon: + name: '$eventBossLevel &5Gequältes Tier' +circus_ringmaster_summon_1: + name: '$eventBossLevel &5Missbrauchter Clown' +circus_ringmaster_summon_2: + name: '$eventBossLevel &5Verwirrter Ballon' +coins_goblin: + name: '$eventBossLevel &eMünz Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eDer Münz Goblin wurde ausgeraubt!' + - '&c&l Höchster Schaden: $damager1name &cmit $damager1damage Schaden!' + - '&6&l Zweit höchster Schaden: $damager2name &6mit $damager2damage Schaden!' + - '&e&l Dritt höchster Schaden: $damager3name &emit $damager3damage Schaden!' + - '&aTöter: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cMünz Goblin: $distance Blöcke entfernt!' + spawnMessage: '&cEin Münz Goblin wurde gesichtet!' + deathMessage: '&aEin Münz Goblin wurde von $players besiegt!' + escapeMessage: '&4Ein Münz Goblin ist entkommen!' +craftenmine_stacked_bones: + name: '$eventBossLevel &eBewaffneter Schädel' + locationMessage: '&cDr. Craftenmine''s gestapelte Knochen: $distance Blöcke entfernt!' + spawnMessage: '&cEine entsetzliche Dr. Craftenmine Kreation ist in freier Wildbahn!' + deathMessage: '&aDie schreckliche Kreation der gestapelten Knochen wurde von $players getötet!' + escapeMessage: '&4Dr. Craftenmines Kreation ist entkommen!' +craftenmine_stacked_bones_ankle: + name: '$eventBossLevel &6Bewaffneter Knöchel' +craftenmine_stacked_bones_backbone: + name: '$eventBossLevel &6Bewaffnetes Rückgrat' +craftenmine_stacked_bones_femur: + name: '$eventBossLevel &6Bewaffneter Oberschenkel' +craftenmine_stacked_bones_spine: + name: '$eventBossLevel &6Bewaffnete Wirbelsäule' +craftenmine_terror: + name: '$eventBossLevel &cBetäubter Ghast' + locationMessage: '&cDr. Craftenmines Terror: $distance Blöcke entfernt!' + spawnMessage: '&cEine Dr. Craftenmine Kreation ist auf der Flucht!' + deathMessage: '&aDer betäubte Ghast wurde von $players besiegt!' + escapeMessage: '&aDer betäubte Ghast ist weg!' +craftenmine_terror_mount: + name: '$eventBossLevel &dGhast-Träger' +creeperpede_1: + name: '$eventBossLevel &5Creeperpede-Beobachter' + locationMessage: '&cCreeperpede: $distance Blöcke entfernt!' + spawnMessage: '&cEin Dr. Craftenmine Experiment ist auf der Flucht!' + deathMessage: '&aDer Creeperpede wurde durch $players aufgehalten!' + escapeMessage: '&4Dem Dr. Craftenmine Expiriment ist es gelungen zu entkommen!' +creeperpede_2: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_3: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_4: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_5: + name: '$eventBossLevel &5Creeperpede Carrier' +crone: + name: '$eventBossLevel &aOld Crone' + locationMessage: '&cOld Crone: $distance blocks away!' + spawnMessage: '&cAn Old Crone has wandered into this world!' + deathMessage: '&aThe Crone was vanquished by $players!.' + escapeMessage: '&4The Old Crone has left this world on her broom!' +crone_summon: + name: '$eventBossLevel &fPet Spider' +divine_cinder: + name: '$eventBossLevel &cDivine Cinder' + locationMessage: '&cDivine Cinder: $distance blocks away!' + spawnMessage: '&cA divine blaze has appeared!' + deathMessage: '&aThe Divine Cinder was defeated by $players!' + escapeMessage: '&4The Divine Cinder has smoked away!' +ember: + name: '$reinforcementLevel &cGlut' +enders_1: + name: '$eventBossLevel &dEnderlad' + locationMessage: '&cEnder Clique: $distance blocks away!' + spawnMessage: '&cA group of ender troublemakers have appeared.' + deathMessage: '&aThe Ender Clique was stopped by $players!' + escapeMessage: '&4The Ender Clique have left!' +enders_2: + name: '$eventBossLevel &dEnderchap' + locationMessage: '&cClique Member: $distance blocks away!' +enders_3: + name: '$eventBossLevel &dEnderdude' + locationMessage: '&cClique Member: $distance blocks away!' +ender_lapin: + name: '$eventBossLevel &aEnder Lapin' +endless_pursuer: + name: '$eventBossLevel &dEndless Pursuer' + locationMessage: '&cEndless Pursuer: $distance blocks away!' + spawnMessage: '&cIt will not stop chasing...' + deathMessage: '&aThe chase has stopped thanks to $players!' + escapeMessage: '&4The Pursuer has vanished!' +enraged_snowman: + name: '$eventBossLevel &1Enraged Snowman' + locationMessage: '&cEnraged Snowman: $distance blocks away!' + spawnMessage: '&cAn angry Snowman was sighted!' + deathMessage: '&aThe Enraged Snowman was put to rest by $players!' + escapeMessage: '&4The Enraged Snowman has vanished!' +evil_undead: + name: '$eventBossLevel &cEvil Undead' + locationMessage: '&cEvil Undead: $distance blocks away!' + spawnMessage: '&cAn Evil Undead has appeared!' + deathMessage: '&aThe Evil Undead was put to rest by $players!' + escapeMessage: '&4The Evil Undead has escaped!' +evil_undead_p2: + name: '$eventBossLevel &cEvil Undead' + locationMessage: '&cEvil Undead: $distance blocks away!' + spawnMessage: '&cAn Evil Undead has appeared!' + deathMessage: '&aThe Evil Undead was put to rest by $players!' + escapeMessage: '&4The Evil Undead has escaped!' +fallen_knight: + name: '$eventBossLevel &7Fallen Knight' + locationMessage: '&cFallen Knight: $distance blocks away!' + spawnMessage: '&cA Fallen Knight rises from their grave!' + deathMessage: '&aA Fallen Knight has fallen to $players!.' + escapeMessage: '&4The Fallen Knight goes back to slumber!' +fine_swine: + name: '$eventBossLevel &eFine Swine' +fine_swine_summon: + name: '$eventBossLevel &eMighty Protector' +firestarter: + name: '$eventBossLevel &6Firestarter' + locationMessage: '&cFirestarter: $distance blocks away!' + spawnMessage: '&cA wicked Firestarter has appeared!' + deathMessage: '&aThe Firestarter was slain by $players!' + escapeMessage: '&4The Firestarter has left!' +firestarter_mount: + name: '$eventBossLevel &6Spark' +fire_conjurer: + name: '$eventBossLevel &eFire Conjurer' + locationMessage: '&cFire Conjurer: $distance blocks away!' + spawnMessage: '&cA master of fire and flame walks this world!' + deathMessage: '&aThe Fire Conjurer was extinguished by $players!' + escapeMessage: '&4The Fire Conjurer has vanished!' +fire_conjurer_summon: + name: '$eventBossLevel &6Summoned Flame' +fire_fae: + name: '$eventBossLevel &cFeuer Fee' +foreign_visitor: + name: '$eventBossLevel &5Foreign Visitor' + locationMessage: '&cForeign Visitor: $distance blocks away!' + spawnMessage: '&cA visitor from a another dimension has arrived!' + deathMessage: '&a$players has made sure to let the visitor know that they are not welcome here.' + escapeMessage: '&4The visitor has gone back home!' +fox_king_cold: + name: '$eventBossLevel &1Fox King Cold' + locationMessage: '&cFox King Cold: $distance blocks away!' + spawnMessage: '&cA magical creature roams the world.' + deathMessage: '&aFox King Cold was defeated by $players!' + escapeMessage: '&4Fox King Cold has left this world.' +frost_palace_frost_queen_p0: + name: '$bossLevel &8Frost Queen' + locationMessage: '&9Frost Queen' + spawnMessage: '&9The wind howls. The Frost Queen rises up to the challenge.' + deathMessage: '&aThe Frost queen is no more, slain by $players!' +frost_palace_frost_queen_p1: + name: '$bossLevel &8Frost Queen phase 1' + locationMessage: '&9Frost Queen phase 1' +frost_palace_frost_queen_p2: + name: '$bossLevel &8Frost Queen phase 2' + locationMessage: '&9Frost Queen phase 2' +frost_palace_frost_queen_p3: + name: '$bossLevel &8Frost Queen phase 3' + locationMessage: '&9Frost Queen phase 3' +frost_palace_frost_queen_p4: + name: '$bossLevel &8Frost Queen phase 4' + locationMessage: '&9Frost Queen phase 4' +frost_palace_frost_queen_p5: + name: '$bossLevel &8Frost Queen phase 5' + locationMessage: '&9Frost Queen phase 5' +frost_palace_frost_queen_p6: + name: '$bossLevel &8Frost Queen phase 6' + locationMessage: '&9Frost Queen phase 6' +frost_palace_frost_queen_p7: + name: '$bossLevel &8Frost Queen phase 7' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Frost Queen was thawed!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&9Frost Queen phase 7' +frost_palace_reinforcement_1: + name: '$reinforcementLevel Spirit of Winter' +frost_palace_reinforcement_2: + name: '$reinforcementLevel Spirit of Spring' +frost_palace_reinforcement_3: + name: '$reinforcementLevel Spirit of Summer' +fulgora: + name: '$eventBossLevel &3Fulgora' + locationMessage: '&cFulgora: $distance blocks away!' + spawnMessage: '&cA mighty thunder goat has come!' + deathMessage: '&aFulgora was stopped by $players!' + escapeMessage: '&4Fulgora has left this place!' +gamma_werewolf: + name: '$reinforcementLevel &7Gamma Werwolf' +goblin_invader: + name: '$eventBossLevel &2Goblin Leader' + locationMessage: '&cGoblin Army: $distance blocks away!' + spawnMessage: '&cA Goblin Army has invaded this realm!' + deathMessage: '&aThe Goblin Army has been vanquished by $players!' + escapeMessage: '&4The Goblin Army is done with this realm!' +goblin_invader_summon_1: + name: '&2Goblin Warrior' +goblin_invader_summon_2: + name: '&2Goblin Fighter' +goblin_invader_summon_3: + name: '&2Goblin Trooper' +goblin_invader_summon_4: + name: '&2Goblin Reinforcements' +greedy_dwarf: + name: '$eventBossLevel &9Greedy Dwarf' + locationMessage: '&cGreedy Dwarf: $distance blocks away!' + spawnMessage: '&cCan you find the Greedy Dwarf digging somewhere underground?!' + deathMessage: '&aThe Greedy Dwarf was released of their curse by $players!' + escapeMessage: '&4The Greedy Dwarf had found their treasure and they left!' +gremlin_1: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + spawnMessage: '&cA Gremlin hoard has invaded this world!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_10: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_2: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_3: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_4: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_5: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_6: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_7: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_8: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_9: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +grunter: + name: '$eventBossLevel &aGrunter' + locationMessage: '&cGrunter: $distance blocks away!' + spawnMessage: '&cA mighty hog roams the lands.' + deathMessage: '&aGrunter was stopped by $players!' + escapeMessage: '&4Grunter has escaped!' +harmless_chicken: + name: '$eventBossLevel &fHarmless Chick' + locationMessage: '&cHarmless Chick: $distance blocks away!' + spawnMessage: '&cBwok!!! Cluck, Cluck! Bawk!' + deathMessage: '&aBaaaawk! Cluck...$players!' + escapeMessage: '&4Harmless Chicken has baaaaaawked away.' +harmless_chicken_summon: + name: '$eventBossLevel &fClucktector' +hog_rider: + name: '$eventBossLevel &6Hog Rider' + locationMessage: '&cHog Rider: $distance blocks away!' + spawnMessage: '&cA mighty Hog Rider has appeared!' + deathMessage: '&aThe Hog Rider and their Hog were vanquished by $players!' + escapeMessage: '&4The Hog Rider has vanished.' +hog_rider_mount: + name: '$eventBossLevel &eLoyal Hog' +hog_rider_p2: + name: '$eventBossLevel &6Hog Rider' + locationMessage: '&cHog Rider: $distance blocks away!' + deathMessage: '&aThe Hog Rider and their Hog were vanquished by $players!' + escapeMessage: '&4The Hog Rider has vanished.' +hog_rider_summon: + name: '$eventBossLevel &eLoyal Zob-Hog' +horde_champion: + name: '$eventBossLevel &cHorde Champion' + locationMessage: '&cUndead Horde Champion: $distance blocks away!' + spawnMessage: '&cAn undead horde approaches!' + deathMessage: '&aThe horde has been stopped by $players!.' + escapeMessage: '&4AThe undead horde has left!' +horrid_duplicator: + name: '$eventBossLevel &dHorrid Duplicator' + locationMessage: '&cHorrid Duplicator: $distance blocks away!' + spawnMessage: '&cAn endless foe has appeared!' + deathMessage: '&aThe Horrid Duplicator was slain by $players!' + escapeMessage: '&4The Horrid Duplicator has left!' +horrid_duplicator_summon: + name: '$eventBossLevel &dHorrid Duplicator' +horrid_duplicator_summon_1: + name: '$eventBossLevel &dHorrid Duplicator' +ice_fae: + name: '$eventBossLevel &bEis Fee' +imperial_bee_guard: + name: '$reinforcementLevel &eImperialer Bienensoldat' +invasion_abducted_hoglin_leader: + name: '$normalLevel &8Entführter Hoglin Anführer' +invasion_abducted_pillager_leader: + name: '$normalLevel &8Entführter Plünderer Anführer' +invasion_abducted_silverfish: + name: '$normalLevel &8Entführte Silberfische' +invasion_abducted_silverfish_leader: + name: '$normalLevel &8Entführte Silberfische' +invasion_abducted_zombie: + name: '$normalLevel &8Entführter Zombie' +invasion_abducted_zombie_leader: + name: '$normalLevel &8Entführter Zombie' +invasion_abductor: + name: '$normalLevel &6Entführer' +invasion_abudcted_pillager: + name: '$normalLevel &8Entführter Plünderer' +invasion_analytic_thin_man_1: + name: '$normalLevel &8Analytischer schlanker Mann' +invasion_analytic_thin_man_2: + name: '$normalLevel &8Analytischer schlanker Mann' +invasion_analytic_thin_man_3: + name: '$normalLevel &8Analytischer schlanker Mann' +invasion_analytic_thin_man_4: + name: '$normalLevel &8Analytischer schlanker Mann' +invasion_ballistic_construct: + name: '$minibossLevel &fBallistische Konstruktion' +invasion_convert: + name: '$normalLevel &6Konvertiere' +invasion_energy_construct: + name: '$minibossLevel &fEnergie Konstrukt' +invasion_fire_construct: + name: '$minibossLevel &fFeuer Konstrukt' +invasion_genetically_modified_cow_phase_1: + name: '$minibossLevel &fGenetisch veränderte Kuh' +invasion_genetically_modified_cow_phase_2: + name: '$minibossLevel &fGenetisch veränderte Kuh' +invasion_gray_man_courthouse_phase_1: + name: '$minibossLevel &7Grauer Mann' +invasion_gray_man_courthouse_phase_2: + name: '$minibossLevel &7Grauer Mann' +invasion_green_man_hotel_phase_1: + name: '$bossLevel &2Grüner Mann' +invasion_green_man_hotel_phase_2: + name: '$bossLevel &2Grüner Mann' +invasion_green_man_hotel_phase_3: + name: '$bossLevel &2Grüner Mann' + deathMessage: '&4Der &2Grüne Mann &4wurde besiegt von $players! Das ist das Ende dieser Version der Karte, die Innenseite des UFOs ist in der Vollversion!' +invasion_green_man_spaceship_phase_1: + name: '$bossLevel &2Grüner Mann' +invasion_green_man_spaceship_phase_2: + name: '$bossLevel &2Grüner Mann' +invasion_green_man_spaceship_phase_3: + name: '$bossLevel &2Grüner Mann' +invasion_green_man_spaceship_phase_4: + name: '$bossLevel &2Grüner Mann' + deathMessages: + - '&e&l---------------------------------------------' + - '&2Die Alien-Bedrohung ist nicht mehr!' + - '&c&l Höchster Schaden: $damager1name &cmit $damager1damage Schaden!' + - '&6&l Zweit höchster Schaden: $damager2name &6mit $damager2damage Schaden!' + - '&e&l Dritt höchster Schaden: $damager3name &emit $damager3damage Schaden!' + - '&aTöter: $players' + - '&e&l---------------------------------------------' +invasion_ice_construct: + name: '$minibossLevel &fEis Konstrukt' +invasion_merman: + name: '$normalLevel &6Meermensch' +invasion_merman_leader: + name: '$normalLevel &6Meermenschen Anführer' +invasion_otherwordly_ember: + name: '$normalLevel &6Ausserweltlicher Funken' +invasion_psychic_apparition: + name: '$normalLevel &5Psychische Erscheinungsform' +invasion_psychic_clone: + name: '$reinforcementLevel &6Psychischer Klon' +invasion_psychic_explosion: + name: '$reinforcementLevel &5Psychische Explosion' +invasion_psychic_summon_gold_boots: + name: '$reinforcementLevel &5psychische Erscheinung' +invasion_psychic_summon_gold_pants: + name: '$reinforcementLevel &5psychische Erscheinung' +invasion_psychic_summon_leather_hat: + name: '$reinforcementLevel &5psychische Erscheinung' +invasion_shrieking_shulker: + name: '$normalLevel &8Schreiende Schulker' +invasion_thin_man: + name: '$normalLevel &8Dünner Mann' +killer_rabbit_of_caerbannog: + name: '$eventBossLevel &cKiller-Kaninchen von Caerbannog' +kraken: + name: '$eventBossLevel &3Kraken' +krampus: + name: '$eventBossLevel &1Krampus' + locationMessage: '&cKrampus: $distance blocks away!' + spawnMessage: '&cKrampus has come to punish the naughty!' + deathMessage: '&aKrampus has been sent back to his realm to by $players!.' + escapeMessage: '&4There was nobody to punish!' +large_hopper: + name: '$eventBossLevel &dLarge Hopper' + locationMessage: '&cLarge Hopper: $distance blocks away!' + spawnMessage: '&cA large beast is hopping around!' + deathMessage: '&aThe Large Hopper was stopped by $players!' + escapeMessage: '&4The Large Hopper has jumped out of this world!' +large_hopper_mount: + name: '$eventBossLevel &aHopper' +lightning_fae: + name: '$eventBossLevel &eBlitz Fee' +living_shadow: + name: '$eventBossLevel &7Living Shadow' + locationMessage: '&cLiving Shadow: $distance blocks away!' + spawnMessage: '&cLiving Shadow has appeared! Do not look it in the yes!' + deathMessage: '&aLiving Shadow has been turned into Dead Shadow by $players!.' + escapeMessage: '&4The Living Shadow saw nothing so it left!' +meme_boss: + name: '&2The Maestro' +meme_boss_reinforcement: + name: '&cFan' +merman: + name: '$eventBossLevel &1Merman' + locationMessage: '&cMerman: $distance blocks away!' + spawnMessage: '&cA Merman swims the oceans!' + deathMessage: '&aThe Merman was slain by $players!' + escapeMessage: '&4The Merman has retreated.' +monster_of_the_deep: + name: '$eventBossLevel &bMonster of the Deep' + locationMessage: '&cMonster of the Deep: $distance blocks away!' + spawnMessage: '&cSomething terrible swims the oceans!' + deathMessage: '&aMonster of the Deep has been slain by $players!' + escapeMessage: '&4The oceans are once again safe!' +moon_spider: + name: '$eventBossLevel &fMoon Spider' + locationMessage: '&cMoon Spider: $distance blocks away!' + spawnMessage: '&cA powerful arachnid has been spotted!' + deathMessage: '&aThe Moon Spider was slain by $players!' + escapeMessage: '&4The Moon Spider has left!' +moon_spider_summon: + name: '&fSilk Mender' +necromancer: + name: '$eventBossLevel &7Necromancer' + locationMessage: '&cNecromancer: $distance blocks away!' + spawnMessage: '&cA powerful evil Necromancer has entered this world!' + deathMessage: '&aThe Necromancer is no more thanks to $players!' + escapeMessage: '&4The Necromancer has disappeared.' +necromancer_summon_1: + name: '$eventBossLevel &fFiery Bones' +necromancer_summon_2: + name: '$eventBossLevel &bChilled Bones' +necromancer_summon_3: + name: '$eventBossLevel &8Charred Bones' +necronomicon_skeleton: + name: '$reinforcementLevel &7Beschwörtes Skelett' +necronomicon_zombie: + name: '$reinforcementLevel &7Beschwörter Zombie' +netherite_golem: + name: '$eventBossLevel &8Netherite Golem' + locationMessage: '&cNetherite Golem: $distance blocks away!' + spawnMessage: '&cAn ancient golem has entered this world!' + deathMessage: '&aThe Netherite Golem was slain by $players!' + escapeMessage: '&4The Netherite Golem has left this world!' +nether_escapee: + name: '$eventBossLevel &6Nether Escapee' + locationMessage: '&cNether Escapee: $distance blocks away!' + spawnMessage: '&cA terrible foe has escaped the nether!' + deathMessage: '&aThe Nether Escapee was sent back to the nether by $players!' + escapeMessage: '&4The Nether Escapee has left this place!' +nether_hag: + name: '$eventBossLevel &4Nether Hag' + locationMessage: '&cNether Hag: $distance blocks away!' + spawnMessage: '&cAn evil hag walks the nether!' + deathMessage: '&aThe Nether Hag was slain by $players!' + escapeMessage: '&4The Nether Hag has vanished!' +nether_wasp: + name: '$eventBossLevel &6Nether Wasp' + locationMessage: '&cNether Wasp: $distance blocks away!' + spawnMessage: '&cTry not to get stung, a wasp roams the nether!' + deathMessage: '&aThe Nether Wasp was slain by $players!' + escapeMessage: '&4The Nether Wasp has decided to buzz off!' +nether_wasp_summon_1: + name: '$eventBossLevel &cHive Summoner' +nether_wasp_summon_2: + name: '$eventBossLevel &cHive Wasp' +nightwing: + name: '$eventBossLevel &cNightwing' + locationMessage: '&cNightwing: $distance blocks away!' + spawnMessage: '&cA bird of the night has appeared!' + deathMessage: '&aNightwing was stopped by $players!' + escapeMessage: '&4Nightwing has flown home.' +nightwing_summon: + name: '$eventBossLevel &cSmart Bomb' +nightwing_summon_1: + name: '$eventBossLevel &cSworn Protector' +night_crawler: + name: '$eventBossLevel &4Night Crawler' + locationMessage: '&cNight Crawler: $distance blocks away!' + spawnMessage: '&cSomething awful is crawling about!' + deathMessage: '&aThe Night Crawler has been slain by $players!' + escapeMessage: '&4The Night Crawler Undead has left!' +night_horder: + name: '$eventBossLevel &aNight Horder' + locationMessage: '&cNight Horder: $distance blocks away!' + spawnMessage: '&cA Night Horder has appeared! Slay him to loot his booty!' + deathMessage: '&aThe Night Horder has been plundered by $players!' + escapeMessage: '&4The Night Horder has escaped!' +oasis_10_old_bones: + name: '$normalLevel &fAlte Knochen' +oasis_10_surreptitious_scribe: + name: '$minibossLevel &7Schleichende Schrift' +oasis_12_entombed_tenant: + name: '$normalLevel &7Begrabener Bewohner' +oasis_12_entombed_tenant_p2: + name: '$normalLevel &7Begrabener Bewohner' +oasis_12_sinister_siren: + name: '$minibossLevel &5Unheilvolle Sirene' +oasis_14_gnarly_grimace: + name: '$normalLevel &8Knorrige Grimasse' +oasis_14_undead_drifter: + name: '$normalLevel &1Untoter Herumtreiber' +oasis_16_lesser_sentinel: + name: '$normalLevel &9Geringerer Wächter' +oasis_16_magical_magus: + name: '$normalLevel &3Magischer Magus' +oasis_16_rancid_roamer: + name: '$normalLevel &8Ranziger Streuner' +oasis_18_sly_sharpshooter: + name: '$normalLevel &eSchlitzohriger Scharfschütze' +oasis_18_stout_thaumaturge: + name: '$normalLevel &5Stolzer Thaumaturge' +oasis_18_tricky_treasure_hoarder: + name: '$normalLevel &dTrickreicher Schatzsammeler' +oasis_20_scheming_scribe: + name: '$minibossLevel &7Schemenhafter Schreiber' +oasis_20_septic_scribe: + name: '$minibossLevel &7Septische Schrift' +oasis_20_vampiric_sorcerer: + name: '$bossLevel &cVampirischer Zauberer' +oasis_20_wrapped_wraith: + name: '$normalLevel &8Eingewickeltes Schreckgespenst' +oasis_20_wrapped_wraith_p2: + name: '$normalLevel &8Eingewickeltes Schreckgespenst' +oasis_25_vampiric_warlock: + name: '$bossLevel &4Vampirischer Hexenmeister' +oasis_25_warlocks_spirit_summon: + name: '$reinforcementLevel &cHexenmeistergeist' +oasis_26_adept_sentinel: + name: '$normalLevel &1Versierter Wächter' +oasis_26_grim_grovetender: + name: '$normalLevel &agrimmiger Knecht' +oasis_26_precarious_sniper: + name: '$normalLevel &3Prekärer Scharfschütze' +oasis_26_superior_sharpshooter: + name: '$normalLevel &3Überlegener Scharfschütze' +oasis_28_perilous_prophet: + name: '$normalLevel &3Perlweißer Prophet' +oasis_28_treacherous_treasure_hoarder: + name: '$normalLevel &dHeimtückischer Schatzsammler' +oasis_2_haunted_hauler: + name: '$normalLevel &9Heimgesuchter Schlepper' +oasis_30_forsaken_soul: + name: '$reinforcementLevel &0Verlassene Seele' +oasis_30_lost_soul: + name: '$normalLevel verlorene Seele' +oasis_30_parlous_preist: + name: '$minibossLevel &bUnglücklicher Priester' +oasis_30_seeker_of_the_staid: + name: '$normalLevel &cSucher der Nüchternheit' +oasis_30_wimpy_louse: + name: '$reinforcementLevel &8Abscheuliches Haus' +oasis_32_loathing_louse: + name: '$normalLevel &8Abscheuliches Haus' +oasis_32_skeletal_sniper: + name: '$normalLevel &9Skelettierter Scharfschütze' +oasis_34_grizly_grimace: + name: '$normalLevel &8Knorrige Fratze' +oasis_34_gruesome_grimace: + name: '$normalLevel &8Grässliche Fratze' +oasis_35_ice_eidolon: + name: '$reinforcementLevel &9Eis-Eidolon' +oasis_35_light_of_darkness: + name: '$minibossLevel &9Licht der Finsternis' +oasis_36_cruel_cultist: + name: '$normalLevel &3Grausamer Kultist' +oasis_36_cultists_cretins: + name: '$reinforcementLevel &3Grausamer Kultist' +oasis_36_cultists_cretins_drowned: + name: '$reinforcementLevel &3Grausamer Kultist' +oasis_36_dexterous_sentinel: + name: '$normalLevel &9Geschickter Wächter' +oasis_36_grudging_grovetender: + name: '$normalLevel &aGründlicher Haudegen' +oasis_36_parlous_sniper: + name: '$normalLevel &3Unglücklicher Scharfschütze' +oasis_36_rueful_roamer: + name: '$normalLevel &8Trübsal blasender Wanderer' +oasis_36_spectral_magus: + name: '$normalLevel &3Spektral Magier' +oasis_38_poisonous_perch: + name: '$normalLevel &3Giftiger Barsch' +oasis_38_traitorous_treasure_hoarder: + name: '$normalLevel &Verräterischer Schatzsammler' +oasis_40_chief_cultist: + name: '$minibossLevel &5Anführer-Kultist' +oasis_40_louse_lord: + name: '$minibossLevel &8Läuseherzog' +oasis_40_pharaohs_scribe: + name: '$minibossLevel &7Pharaos Schreiber' +oasis_40_skeletal_stiff: + name: '$normalLevel &9Skelettsteif' +oasis_40_soaked_sacrifice: + name: '$reinforcementLevel &1Getränktes Opfer' +oasis_40_solar_flare: + name: '$reinforcementLevel &eSonneneruption' +oasis_42_hexed_hauler: + name: '$normalLevel &9Verhexter Schlepper' +oasis_42_skeletal_sharpshooter: + name: '$normalLevel &9Skelettierter Scharfschütze' +oasis_42_tyranical_treasure_hoarder: + name: '$normalLevel &dTyranischer Schatz-Sammler' +oasis_42_tyranical_treasure_hoarder_phase_2: + name: '$normalLevel &dTyranischer Schatz-Sammler' +oasis_45_golden_cast_autonomation: + name: '$reinforcementLevel &6Goldener Gussform-Automat' +oasis_45_monumental_monstrosity: + name: '$bossLevel &bMonumentale Monstrosität' +oasis_45_monumental_monstrosity_phase_2: + name: '$bossLevel &bMonumentale Monstrosität' +oasis_45_monumental_monstrosity_phase_3: + name: '$bossLevel &6Monumentale Monstrosität' +oasis_45_monumental_monstrosity_phase_4: + name: '$bossLevel &bMonumentale Monstrosität' +oasis_45_oracle_of_knowledge: + name: '$minibossLevel &0Orakel des Wissens' +oasis_45_shadow_of_knowledge_summon: + name: '$reinforcementLevel &8Schatten des Wissens' +oasis_45_the_beacon: + name: '$minibossLevel &6Das Leuchtfeuer' +oasis_45_the_beacon_phase_2: + name: '$minibossLevel &6Das Leuchtfeuer' +oasis_45_the_beacon_phase_3: + name: '$minibossLevel &6Das Leuchtfeuer' +oasis_45_the_beacon_phase_4: + name: '$minibossLevel &6Das Leuchtfeuer' +oasis_46_pharaohs_sentinel: + name: '$normalLevel &9Pharaoh''s Schildwache' +oasis_4_cursed_desert_dweller: + name: '$normalLevel &eVerfluchter Wüstenbewohner' +oasis_4_grotesque_grimace: + name: '$normalLevel &8Groteske Grimasse' +oasis_4_swamp_rat: + name: '$normalLevel &6Sumpf Ratte' +oasis_50_moneychanger_arrow: + name: '$minibossLevel &6Geldwechsler' +oasis_50_moneychanger_arrow_phase_2: + name: '$minibossLevel &6Geldwechsler' +oasis_50_moneychanger_blindness: + name: '$minibossLevel &6Geldwechsler' +oasis_50_moneychanger_blindness_phase_2: + name: '$minibossLevel &6Geldwechsler' +oasis_50_moneychanger_fire: + name: '$minibossLevel &6Geldwechseler' +oasis_50_moneychanger_fire_phase_2: + name: '$minibossLevel &6Geldwechseler' +oasis_50_moneychanger_freeze: + name: '$minibossLevel &6Geldwechseler' +oasis_50_moneychanger_freeze_phase_2: + name: '$minibossLevel &6Geldwechseler' +oasis_50_moneychanger_knockback: + name: '$minibossLevel &6Geldwechseler' +oasis_50_moneychanger_knockback_phase_2: + name: '$minibossLevel &6Geldwechseler' +oasis_50_moneychanger_poison: + name: '$minibossLevel &6Geldwechseler' +oasis_50_moneychanger_poison_phase_2: + name: '$minibossLevel &6Geldwechseler' +oasis_50_moneychanger_wither: + name: '$minibossLevel &6Geldwechseler' +oasis_50_moneychanger_wither_phase_2: + name: '$minibossLevel &6Geldwechseler' +oasis_50_pharaohs_royal_guard: + name: '$reinforcementLevel &8Pharaos Königliche Garde' +oasis_50_the_foundry: + name: '$bossLevel &4Die Gießerei' +oasis_50_the_foundry_phase_2: + name: '$bossLevel &4Die Gießerei' +oasis_55_pharaoh_of_pestilence: + name: '$bossLevel &0Pharao der Seuche' +oasis_6_dry_bones: + name: '$normalLevel &fTrockene Knochen' +oasis_6_rotten_roamer: + name: '$normalLevel &8Verfaulter Streuner' +oasis_8_mythical_magus: + name: '$normalLevel &3Mystischer Magus' +oasis_8_tough_thaumaturge: + name: '$normalLevel &5Harter Thaumaturge' +oasis_8_troublesome_treasure_hoarder: + name: '$normalLevel &dÄrgerlicher Schatzsammler' +okami: + name: '$eventBossLevel &cOkami' + locationMessage: '&cOkami: $distance blocks away!' + spawnMessage: '&cA god has awakened!' + deathMessage: '&a$players has fought with a god and won!.' + escapeMessage: '&4Okami has left!' +okami_p2: + name: '$eventBossLevel &cOkami' +okami_p3: + name: '$eventBossLevel &cOkami' +omega_wolf: + name: '$reinforcementLevel &7Omegawolf' +pillager_caravan_beast: + name: '$reinforcementLevel &cKarawanenbestie' +pillager_caravan_guard: + name: '$reinforcementLevel &cKarawanwächter' +pillager_caravan_leader: + name: '$eventBossLevel &cPlünderer Karawanenführer' + locationMessage: '&cPillager Karawane: $distance Blöcke entfernt!' + spawnMessage: '&cEine Pillager Karawane wurde gesichtet!' +primis_acolyte_brute: + name: '$normalLevel &bAkolyten Rohling' +primis_acolyte_forest_brute: + name: '$normalLevel &bElfen Bandit Rohling' +primis_acolyte_forest_brute_with_watch: + name: '$normalLevel &bElfen Bandit Rohling' +primis_acolyte_forest_sharpshooter: + name: '$normalLevel &bElfen Bandit Waldläufer' +primis_acolyte_forest_summoner: + name: '$normalLevel &bElfen Banditen Beschwörer' +primis_acolyte_forest_summoner_heirloom_guardian: + name: '$normalLevel &bElfen Banditen Magier' +primis_acolyte_guard_1: + name: '$normalLevel &bAkolyten Wächter' + onDamagedMessages: + - Du kannst nicht eintreten! + - Der Magier lässt das nicht zu! + - Verlasse diesen Ort! + - Der Magier beschützt diesen Ort! + - Torheit! + - Verschwinde! + deathMessage: '[Akolyten Wächter] Du bist blind für die Wahrheit, der Magier des Turms sieht alles!' +primis_acolyte_guard_2: + name: '$normalLevel &bAkolyten Wächter' + onDamagedMessages: + - Du kannst nicht eintreten! + - Der Magier lässt das nicht zu! + - Verlasse diesen Ort! + - Der Magier beschützt diesen Ort! + - Torheit! + - Verschwinde! + deathMessage: '[Akolyten Wächter] Du solltest nicht vorbeigehen, der Magier im Turm wird es nicht zulassen!' +primis_acolyte_sharpshooter: + name: '$normalLevel &bAkolyten Waldläufer' +primis_aggressive_llama: + name: '$normalLevel &6Aggressives Lama' +primis_angry_goat: + name: '$normalLevel &6Wütende Ziege' +primis_beta_feral_wolf: + name: '$reinforcementLevel &8Beta Wilder Wolf' +primis_blood_temple_blood_golem: + name: '$normalLevel &cBlood Golem' +primis_blood_temple_charred_construct: + name: '$normalLevel &cCharred Construct' +primis_blood_temple_conjured_flame: + name: '$normalLevel &cConjured Flame' +primis_blood_temple_eradicator: + name: '$normalLevel &cEradicator' +primis_blood_temple_fire_conjurer: + name: '$normalLevel &cFire Conjurer' +primis_blood_temple_flame_elemental: + name: '$normalLevel &cFlame Elemental' +primis_catacomb_nemus_to_redwood_archer: + name: '$normalLevel &8Katakomben-Bogenschütze' +primis_catacomb_nemus_to_redwood_golem: + name: '$normalLevel &bKatakomben Golem' +primis_catacomb_nemus_to_redwood_necromancer: + name: '$bossLevel &4Katakomben-Nekromant' +primis_catacomb_nemus_to_redwood_necromancer_p1: + name: '$bossLevel &4Katakomben Nekromant' +primis_catacomb_nemus_to_redwood_necromancer_p2: + name: '$bossLevel &4Katakomben Nekromant' +primis_catacomb_nemus_to_redwood_soul_reinforcement: + name: '$reinforcementLevel &0Verlassene Seele' +primis_catacomb_nemus_to_redwood_swordsman: + name: '$normalLevel &8Katakomben Schwertkämpfer' +primis_catacomb_pontis_to_ice_archer: + name: '$normalLevel &8Katakomben Bogenschütze' +primis_catacomb_pontis_to_ice_golem: + name: '$normalLevel &BKatakomben Golem' +primis_catacomb_pontis_to_ice_necromancer_p1: + name: '$bossLevel &4Katakomben Nekromant' +primis_catacomb_pontis_to_ice_necromancer_p2: + name: '$bossLevel &4Katakomben Nekromant' +primis_catacomb_pontis_to_ice_swordsman: + name: '$normalLevel &8Katakomben Schwertkämpfer' +primis_catacomb_trio_archer: + name: '$normalLevel &8Catacomb Archer' +primis_catacomb_trio_golem: + name: '$normalLevel &bCatacomb Golem' +primis_catacomb_trio_necromancer_p1: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_necromancer_p2: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_necromancer_summon: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_swordsman: + name: '$normalLevel &8Catacomb Swordsman' +primis_crazed_rabbit: + name: '$normalLevel &cVerrücktes Kaninchen' +primis_crystaline_summoner_p1: + name: '$normalLevel &3Crystaline Summoner' +primis_crystaline_summoner_p2: + name: '&3Kristallbeschwörer' +primis_earth_temple_golem: + name: '$normalLevel &fAnimated Clay' +primis_emerald_eater: + name: '$normalLevel &aEmerald Eater' +primis_farmstead_lighthouse_keeper: + name: '$bossLevel &6Der Leuchtturmwärter' + questLore: + - Irgendwas stimmt mit meinem Mann absolut nicht. + - Früher war er ein liebevoller und fürsorglicher Ehemann und Vater, + - aber in letzter Zeit konzentriert er sich auf Dokumente, die er im Keller gefunden hat. + - Er sagte, es sei für wichtige Forschung, etwas, das die Welt verändern könnte. + - Ich hätte ihm sagen sollen aufzuhören, als ich sah, wie besessen er wurde. + - Er hat... etwas... mit dem Leuchtturm gemacht - und + - Ich fürchte, der Leuchtturm hat ihm auch etwas angetan. + - Es verwandelte ihn in eine Art Monster. Er erkennt uns nicht mehr, + - und hat uns sogar angegriffen, als wir versuchten, uns ihm zu nähern. + - Nachts können wir wegen der jammernden Geräusche nicht schlafen + - aus dem Keller des &dLeuchtturms&f. + - Er leidet, und wir sind machtlos, ihm zu helfen. + - Ich weiß, es ist viel verlangt, aber denkst du, du könntest uns helfen? + questAcceptDialog: + - '&a[Amavit]&f Vielen Dank, dass Sie unserer Anfrage nachgekommen sind. Ich hoffe von ganzem Herzen, dass Sie erfolgreich sind.' + - '&7&oIch sollte zum &dKeller des Leuchtturms&7&o gehen und den &cLeuchtturmwärter&7&o von seinem Elend befreien.' + questCompleteMessage: + - '&a[Amavit]&f Ich habe es gehört - ist es also fertig? Hat er – nein, vergiss es, ich will es nicht wissen.' + - '&fEs scheint, als habe der Leuchtturm begonnen, ein seltsames Licht zu emittieren, als du dich um das Problem gekümmert hast. Wir müssen sicherstellen, dass dies kein Thema ist.' + - '&7&oOffenbar hat &aAmavit&7&o eine andere Aufgabe für mich. Ich sollte mit ihr reden.' +primis_feral_alpha_wolf: + name: '$normalLevel &8Wilder Alpha Wolf' +primis_feral_wolf: + name: '$normalLevel &8Wilder Alpha Wolf' +primis_feral_wolf_scout: + name: '$normalLevel &8Wilder Wolf Späher' +primis_gladius_admiral: + name: '$normalLevel &fEinfallender Admiral' +primis_gladius_assassin: + name: '$normalLevel &fEinfallender Attentäter' +primis_gladius_barkeep_p1: + name: '$minibossLevel &6Der Gastwirt' +primis_gladius_barkeep_p2: + name: '$minibossLevel &6Der Gastwirt' +primis_gladius_captain: + name: '$normalLevel &fEinfallender Kapitän' +primis_gladius_champion_p1: + name: '$bossLevel &6Gefallener Champion Natus' +primis_gladius_champion_p2: + name: '$bossLevel &6Gefallener Champion Natus' +primis_gladius_gatekeeper_p1: + name: '$minibossLevel &5Der Torwächter' +primis_gladius_gatekeeper_p2: + name: '$minibossLevel &5Der Torwächter' +primis_gladius_gatekeeper_pontis_p1: + name: '$minibossLevel &5Der Torwächter' +primis_gladius_gatekeeper_pontis_p2: + name: '$minibossLevel &5Der Torwächter' +primis_gladius_longbowman: + name: '$normalLevel &fEinfallender Langbogenschütze' +primis_gladius_mariner: + name: '$normalLevel &fEinfallender Marinesoldat' +primis_gladius_mariner_quest: + name: '$normalLevel &fEinfallender Marinesoldat' +primis_gladius_monk_p1: + name: '$minibossLevel &6Der Mönch' +primis_gladius_monk_p2: + name: '$minibossLevel &6Der Mönch' +primis_gladius_raider: + name: '$normalLevel &fEinfallendes Überfallkommando' +primis_gladius_swordsman: + name: '$normalLevel &fEinfallender Schwertkämpfer' +primis_gladius_undead_buccaneer: + name: '$normalLevel &fUntoter Freibeuter' +primis_gladius_undead_captain: + name: '$minibossLevel &fUntoter Kapitän' +primis_gladius_undead_swashbuckler: + name: '$normalLevel &fUntoter Säbelrassler' +primis_gladius_underlord: + name: '$minibossLevel &0Unterfürst' +primis_gladius_villager: + name: '$normalLevel &fUntoter Dorfbewohner' +primis_goblin_fowl_warrior: + name: '$minibossLevel &6Cursed Fowl Goblin' +primis_goblin_grunt: + name: '$normalLevel &6Goblin Grunt' +primis_goblin_king: + name: '$bossLevel &2Goblin King' +primis_goblin_piranah: + name: '$normalLevel &9Goblin Piranah' +primis_goblin_spearman: + name: '$normalLevel &6Goblin Spearman' +primis_goblin_warrior: + name: '$normalLevel &6Goblin Warrior' +primis_ice_mage: + name: '$minibossLevel &9Eismagier' +primis_ice_mage_p2: + name: '$minibossLevel &bEis Magier' + deathMessage: '&8&oDu vernimmst das Geräusch wie eine nahegelegene Eiswand einreißt und bricht...' +primis_ice_village_annoyed_goat: + name: '$normalLevel &bAnnoyed Goat' +primis_ice_village_bell_banger: + name: '$minibossLevel &6Undead' + questLore: + - Siehst du das? Sehen Sie sich diesen Glocken- + - turm im Dorf an. + - Du siehst es auch, oder? Den Kerl da + - der mit dem Kopf gegen die Glocke schlägt. + - Ich bin mir ziemlich sicher, dass es darum geht, + - es sei denn, meine Augen lassen mich im Stich. + - Könntest du mal nachforschen und mir + - berichten, was du gefunden hast. + questAcceptDialog: + - '&a[Eleusium Festus]&f Was ist los...' + - '&7&oIch sollte mir ansehen, was am &d&oEisdorf Glockenturm&7&o passiert.' + questCompleteMessage: + - '&a[Eleusium Festus]&f Du hast einen Untoten gefunden, der ihren Kopf auf der Glocke schlägt...' + - Nun habe ich alles gehört... +primis_ice_village_escaped_prisoner: + name: '$normalLevel &bEntflohener Gefangener' +primis_ice_village_fallen_trial_warrior_summon: + name: '$reinforcementLevel &7Enslaved Soul' +primis_ice_village_frost_fur_ursus: + name: '$normalLevel &9Frost Fell Ursus' +primis_ice_village_frost_simulacrum: + name: '$normalLevel &3Frost Simulacrum' +primis_ice_village_ice_simulacrum: + name: '$reinforcementLevel &3Ice Simulacrum' +primis_ice_village_manifested_nightmare: + name: '$normalLevel &bManifested Nightmare' +primis_ice_village_meek_customer: + name: '$normalLevel &cDemütiger Kunde' +primis_ice_village_naughty_customer: + name: '$normalLevel &cFrecher Kunde' +primis_ice_village_screecher_bomb_summon: + name: '$reinforcementLevel &dScreecher Droppings' +primis_ice_village_sky_screecher: + name: '$normalLevel &bSky Screecher' +primis_ice_village_the_ice_aspect: + name: '$minibossLevel &9Ice Aspect' +primis_ice_village_the_ice_elemental: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_the_ice_elemental_p2: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_the_ice_elemental_p3: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_trial_of_ice_minor_ice_elemental: + name: '$minibossLevel &bMinor Ice Elemental' +primis_ice_village_wolf_summon: + name: '$reinforcementLevel &cTamed Wolf' +primis_minor_ice_elemental: + name: '$bossLevel &1Geringeres Eiselementar' +primis_minor_ice_elemental_p2: + name: '$bossLevel &1Kleines Eiselementar' +primis_mountain_pass_guardian_p1: + name: '$bossLevel &6Der Wächter' +primis_mountain_pass_guardian_p2: + name: '$bossLevel &6Der Wächter' +primis_mountain_pass_healer: + name: '$reinforcementLevel &fMonteuratron' +primis_nasty_worm: + name: '$normalLevel &böser Wurm' +primis_ogre_mines_mite: + name: '$normalLevel &fMinenmilbe' +primis_ogre_mines_ogre_archer: + name: '$minibossLevel &fOger Bogenschütze' +primis_ogre_mines_ogre_magi: + name: '$minibossLevel &fOger Magier' +primis_ogre_mines_ogre_warrior: + name: '$minibossLevel &fOger Krieger' +primis_ogre_mines_undead_archer: + name: '$normalLevel &fUntoter Bogenschütze' +primis_ogre_mines_undead_swordsman: + name: '$normalLevel &fUntoter Schwertkämpfer' +primis_pontis_beast_cod: + name: '$minibossLevel &dBeast Cod Furiosa' +primis_pontis_beast_crawler: + name: '$minibossLevel &dCrawler Beast Megdun' +primis_pontis_beast_impaler: + name: '$minibossLevel &dImpaler Beast Uladzimir' +primis_pontis_counselor_guard_left_1: + name: '$normalLevel &4Korrupte Beratergarde' +primis_pontis_counselor_guard_left_2: + name: '$normalLevel &4Verzerrter Ratgeber-Wächter' + deathMessage: '&5[Counselor Machiavelli]&f Dieser Dummkopf muss es also endlich herausgefunden haben...' +primis_pontis_counselor_guard_left_3: + name: '$normalLevel &4Hochwertiges Experiment' + deathMessage: '&5[Counselor Machiavelli]&f Du bist stärker als ich dachte.' +primis_pontis_counselor_guard_left_4: + name: '$normalLevel &4Abscheulichkeit' + deathMessage: '&5[Counselor Machiavelli]&f Meine Seelenmagie wird mich beschützen!!!' +primis_pontis_counselor_guard_mid: + name: '$normalLevel &4Korrupte Beratergarde' + deathMessage: '&8[Counselor Machiavelli]&f Ich sehe, wir haben Gäste!...' +primis_pontis_counselor_guard_right_1: + name: '$normalLevel &4Korrupte Beratergarde' +primis_pontis_counselor_guard_right_2: + name: '$normalLevel &4Verzerrter Ratgeber-Wächter' +primis_pontis_counselor_guard_right_3: + name: '$normalLevel &4Hochwertiges Experiment' +primis_pontis_counselor_guard_right_4: + name: '$normalLevel &4Abscheulichkeit' +primis_pontis_counselor_twisted_copy: + name: '$reinforcementLevel &4Twisted Copy' +primis_pontis_mille_arena_air_elemental: + name: '$minibossLevel &fAir Elemental' +primis_pontis_mille_arena_human_wave_4: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_6: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_7: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_8: + name: '$normalLevel &4Dominated Human Warrior' +primis_pontis_mille_arena_human_worshiper: + name: '$normalLevel &4Elemental Worshiper' +primis_pontis_mille_arena_minor_air_elemental: + name: '$normalLevel &fMinor Air Elemental' +primis_pontis_mille_arena_minor_earth_elemental: + name: '$normalLevel &7Minor Earth Elemental' +primis_pontis_mille_arena_minor_fire_elemental: + name: '$normalLevel &eMinor Fire Elemental' +primis_pontis_mille_arena_minor_fire_elemental_prime: + name: '$normalLevel &eMinor Fire Elemental' +primis_pontis_mille_arena_minor_water_elemental: + name: '$normalLevel &bMinor Water Elemental' +primis_pontis_mille_arena_primal_air_wisp: + name: '$normalLevel &fPrimal Air Wisp' +primis_pontis_mille_arena_primal_air_wisp_2: + name: '$normalLevel &fPrimal Air Wisp' +primis_pontis_mille_arena_primal_earth_wisp: + name: '$normalLevel &7Primal Earth Wisp' +primis_pontis_mille_arena_primal_earth_wisp_2: + name: '$normalLevel &7Primal Earth Wisp' +primis_pontis_mille_arena_primal_fire_wisp: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_fire_wisp_2: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_fire_wisp_3: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_water_wisp: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_water_wisp_2: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_water_wisp_3: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_wisp: + name: '$normalLevel &5Primal Wisp' +primis_pontis_mille_arena_water_elemental: + name: '$minibossLevel &1Water Elemental' +primis_pontis_mille_counselor_p1: + name: '$minibossLevel &fBerater Machiavelli' +primis_pontis_mille_counselor_p2: + name: '$minibossLevel &fBerater Machiavelli' +primis_pontis_mille_counselor_p3: + name: '$minibossLevel &fBerater Machiavelli' +primis_pontis_mille_fields_babe_razorback: + name: '$normalLevel &2Babe Razorback' +primis_pontis_mille_fields_bird: + name: '$normalLevel &fFeathered Field Rat' +primis_pontis_mille_fields_bird_nightmare: + name: '$normalLevel &dGefederte Alptraum Ratte' +primis_pontis_mille_fields_bubba: + name: '$minibossLevel &cBig ol'' Bubba' +primis_pontis_mille_fields_field_rat: + name: '$normalLevel &fField Rat' +primis_pontis_mille_fields_juvenile_razorback: + name: '$normalLevel &2Jugendlicher Razorback' +primis_pontis_mille_fields_longhorn: + name: '$normalLevel &4Fields Longhorn' +primis_pontis_mille_fields_mature_razorback: + name: '$normalLevel &2Erwachsener Razorback' +primis_pontis_mille_fields_shorthorn: + name: '$normalLevel &6Fields Shorthorn' +primis_pontis_mille_fields_two_legged_terror: + name: '$normalLevel &2Zwei Beine Terror' +primis_pontis_mille_fields_well_fed_rat: + name: '$normalLevel &fWohl gefütterte Ratte' +primis_pontis_mille_rat: + name: '$normalLevel &fRat' +primis_quartz_elemental: + name: '$bossLevel &dQuartz Elementar' +primis_quartz_elemental_p2: + name: '$bossLevel &dQuartz Elementar' +primis_redwood_barracuda: + name: '$normalLevel &3Redwood Barracuda' +primis_redwood_fruity_hound: + name: '$normalLevel &2Fruchtiger Jagdhund' +primis_redwood_rockhound: + name: '$normalLevel &7Redwood Rockhound' +primis_redwood_werewolf_grunt: + name: '$normalLevel &cRedwood Werewolf Grunt' +primis_redwood_werewolf_packleader: + name: '$normalLevel &4Redwood Werewolf Packleader' +primis_river_guardian: + name: '$normalLevel &5Flusswächter' +primis_roofed_forest_cave_spider: + name: '$normalLevel &6Nest Crawler' +primis_roofed_forest_cave_spider_boss: + name: '$bossLevel &eBrood Mother' +primis_roofed_forest_spider: + name: '$normalLevel &6Forest Crawler' +primis_roofed_forest_spider_reinforcement: + name: '$reinforcementLevel &6Nest Brood' +primis_sea_monster: + name: '$bossLevel &dSee Monster' +primis_sewer_noxious_ninja: + name: '$normalLevel &2Schädlicher Ninja' +primis_sewer_spore_spreader: + name: '$normalLevel &4Sporenstreuer' +primis_sewer_the_shredder_p1: + name: '$bossLevel &5The Shredder' +primis_sewer_the_shredder_p2: + name: '$bossLevel &5The Shredder' +primis_storm_temple_axeman: + name: '$normalLevel &dStorm Temple Axeman' +primis_storm_temple_bowman: + name: '$normalLevel &dStorm Temple Bowman' +primis_storm_temple_kuzco: + name: '$normalLevel &6Kuzco' +primis_storm_temple_minor_storm_elemental: + name: '$normalLevel &5Minor Storm Elemental' +primis_storm_temple_storm_elemental: + name: '$bossLevel &1Sturm-Elementar' +primis_storm_temple_storm_elemental_p2: + name: '$bossLevel &1Sturm-Elementar' +primis_storm_temple_storm_elemental_p3: + name: '$bossLevel &1Sturm-Elementar' +primis_storm_temple_summoner: + name: '$normalLevel &5Storm Temple Summoner' +primis_terravilla_alpha_razorback: + name: '$minibossLevel &2Alpha Razorback' +primis_terravilla_alpha_razorback_p2: + name: '$minibossLevel &2Alpha Razorback' +primis_terravilla_bar_brawler: + name: '$normalLevel &6Bar Brawler' + onDamagedMessages: + - That all ya got! + - I did not even feel that! + - Why...you! + - I will show you! + - Who the heck are you! + - TAKE THAT! +primis_terravilla_earth_elemental: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_earth_elemental_p2: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_earth_elemental_p3: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_regular_fish: + name: '$normalLevel &bRegular Fish' +primis_terravilla_robber_gladiator: + name: '$normalLevel &bRobber Gladiator' +primis_terravilla_robber_slugger: + name: '$normalLevel &bSlugger' +primis_undead_archer: + name: '$normalLevel &fUntoter Bogenschütze' +primis_undead_climber: + name: '$normalLevel &0Untoter Kletterer' +primis_undead_grappler: + name: '$normalLevel &3Untoter Greifer' +primis_undead_guardian: + name: '$normalLevel &bUntoter Wächter' +primis_undead_swordsman: + name: '$normalLevel &0Untoter Schwertkämpfer' +pufferfish: + name: '$eventBossLevel &3Pufferfish' + locationMessage: '&cPufferfish: $distance blocks away!' + spawnMessage: '&cA puffed fish is swimming in the oceans!' + deathMessage: '&aThe Pufferfish reign has been ended by $players!' + escapeMessage: '&4The Pufferfish has swam away!' +pufferfish_summon_1: + name: '$eventBossLevel &bPooferfish' +pufferfish_summon_2: + name: '$eventBossLevel &bPooperfish' +pufferfish_summon_3: + name: '$eventBossLevel &bPooderfish' +pufferfish_summon_4: + name: '$eventBossLevel &bPudderfish' +queen_bee: + name: '$eventBossLevel &6Bienenkönigin' +rabbit_wolf_1: + name: '$eventBossLevel &cFlame Wolf' + locationMessage: '&cFlame: $distance blocks away!' + spawnMessage: '&cA powerful duo has come to this world!' + deathMessage: '&aThe Wolf and the Rabbit were stopped by $players!' + escapeMessage: '&4The Wolf and the Rabbit have left this place!' +rabbit_wolf_2: + name: '$eventBossLevel &cLightning Rabbit' + locationMessage: '&cLightning: $distance blocks away!' + deathMessage: '&aThe Wolf and the Rabbit were stopped by $players!' + escapeMessage: '&4The Wolf and the Rabbit have left this place!' +raug: + name: '$reinforcementLevel &4Raug' +regular_hoglin: + name: '$eventBossLevel &4Regular Hoglin' + locationMessage: '&cRegular Hoglin: $distance blocks away!' + spawnMessage: '&cA Regular Hoglin has arrived! Nothing special about this Hoglin!' + deathMessage: '&aRegular Hoglin was slain by $players!.' + escapeMessage: '&4The Regular Hoglin has left!' +rotting_diver: + name: '$eventBossLevel &bRotting Diver' + locationMessage: '&cRotting Diver: $distance blocks away!' + spawnMessage: '&cA foul corpse floats in the waters!' + deathMessage: '&aThe Rotting Diver was sent to the depths by $players!' + escapeMessage: '&4The Rotting Diver floated away!' +salty_corpse: + name: '$eventBossLevel &bSalty Corpse' + locationMessage: '&cSalty Corpse: $distance blocks away!' + spawnMessage: '&cSomething awful has floated up to the surface!' + deathMessage: '&aThe Salty Corpse was sent back to the depths by $players!' + escapeMessage: '&4The Salty Corpse has left!' +skeleton_knight: + name: '$eventBossLevel &fSkeleton Knight' + locationMessage: '&cSkeleton Knight: $distance blocks away!' + spawnMessage: '&cThe undead have sent a Skeleton Knight into the night!' + deathMessage: '&aThe Skeleton Knight was slain by $players!' + escapeMessage: '&4The Skeleton Knight had to retreat!' +sky_archer: + name: '$eventBossLevel &aSky Archer' + locationMessage: '&cSky Archer: $distance blocks away!' + spawnMessage: '&cA Sky Archer has entered this world! Bring your bow!' + deathMessage: '&aThe Sky Archer got sniped by $players!' + escapeMessage: '&4The Sky Archer has flown away!' +sky_archer_mount: + name: '$eventBossLevel &aSky Steed' +smallstack: + name: '$eventBossLevel &bSmallstack Top' + locationMessage: '&cSmallstack: $distance blocks away!' + spawnMessage: '&cA Smallstack is roaming the wilds!' + deathMessage: '&aThe Smallstack was unstacked by $players!' + escapeMessage: '&4The Smallstack has left!' +smallstack_1: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_2: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_3: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_4: + name: '$eventBossLevel &bSmallstack Bottom' +smallstack_5: + name: '$eventBossLevel &bSmallstack Bottom' +smallstack_6: + name: '$eventBossLevel &bSmallstack Carrier' +snoopy: + name: '&6{&4☠&6} &fSnoopy' + onDamageMessages: + - Wuff! + onDamagedMessages: + - Wuff! + spawnMessage: '&aEin extrem seltener Snoopy wurde gesichtet!' +sorcerer_supreme: + name: '$eventBossLevel &5Sorcerer Supreme' + locationMessage: '&cSorcerer Supreme: $distance blocks away!' + spawnMessage: '&cAn almighty Sorcerer has phased into this world!' + deathMessage: '&aThe Sorcerer Supreme was defeated by $players!' + escapeMessage: '&4The Sorcerer Supreme has left this world!' +sorcerer_supreme_summon: + name: '$eventBossLevel &5Eternal Servant' +spider_knight: + name: '$eventBossLevel &aDwarven Knight' + locationMessage: '&cDwarven Knight: $distance blocks away!' + spawnMessage: '&cA Knight has come to challenge the heroes of this place!' + deathMessage: '&aThe Knight was defeated by $players!' + escapeMessage: '&4The Knight has left this place!' +spider_knight_mount: + name: '$eventBossLevel &aFaithful Steed' +summonable_wolf: + name: '$normalLevel Wolfy' + onDamageMessages: + - Wuff! + onDamagedMessages: + - Wuff! +super_mite: + name: '$eventBossLevel &dSuper Mite' + locationMessage: '&cSuper Mite: $distance blocks away!' + spawnMessage: '&cA trouble maker appears!' + deathMessage: '&aThe mite could not handle a fight with $players!.' + escapeMessage: '&4The Super Mite left out of boredom!' +super_mite_summon: + name: '$eventBossLevel &dFriendmite' +suspicious_phantom: + name: '$eventBossLevel &eSuspicious Phantom' + locationMessage: '&cSuspicious Phantom: $distance blocks away!' + spawnMessage: '&cA Suspicious Phantom was sighted in the skies!' + deathMessage: '&aThe Phantom was put to bed by $players!' + escapeMessage: '&4The Suspicious Phantom has left!' +suspicious_phantom_summon: + name: '$eventBossLevel &cFlamer' +suspicious_phantom_summon_1: + name: '$eventBossLevel &cFireballer' +test_boss: + name: '$eventBossLevel &eTest boss' + deathMessages: + - '&e&l---------------------------------------------' + - 'Der Testboss ist fehlerfrei!' + - '&c&l Höchster Schaden: $damager1name &cmit $damager1damage Schaden!' + - '&6&l Zweit höchster Schaden: $damager2name &6mit $damager2damage Schaden!' + - '&e&l Dritt höchster Schaden: $damager3name &emit $damager3damage Schaden!' + - '&aTöter: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Ich habe dich getroffen! + onDamagedMessages: + - Ich wurde getroffen! + locationMessage: 'Test Kreatur: $distance' + spawnMessage: Ein Test Boss wurde erstellt! + deathMessage: Ein test Boss wurde von $players gejagt! + escapeMessage: Ein test Boss ist entkommen! +airship_tier_45_knockback: + name: '$normalLevel &2Bogen-Bogenschütze' +airship_tier_45_witherblind: + name: '$normalLevel &aGefährlicher Bogenschütze' +airship_tier_50_powder_monkeys: + name: '$normalLevel &7PulverAffe' +airship_tier_50_scourge: + name: '$normalLevel &8Säbelrasselnde Geißel' +airship_tier_60_mess_hall_mate: + name: '$normalLevel &bMessehausdiener' +airship_tier_65_boatswain_boss: + name: '$normalLevel &cBootsmann Boss' +airship_tier_65_bodyguard: + name: '$normalLevel &eSeeräuber-Leibwächter' +airship_tier_65_silverfish: + name: '$normalLevel &8Schiffsratte' +airship_tier_65_silverfish_reinforcement: + name: '$reinforcementLevel &8Schiffsmaus' +airship_tier_70_miniboss: + name: '$minibossLevel Quark der Quartiermeister ' +airship_tier_70_miniboss_2: + name: '$minibossLevel &6Lebendiger Kessel' +airship_tier_70_miniboss_wayfinder: + name: '$minibossLevel &3Kai-Wegweiser' +airship_tier_75_boss: + name: '$bossLevel &4Kapitän Davey' + deathMessages: + - '&e&l---------------------------------------------' + - '&9Hauptmann Davey wurde zur Ruhe gesetzt! ... nochmal.' + - '&c&l Höchster Schaden: $damager1name &cmit $damager1damage Schaden!' + - '&6&l Zweit höchster Schaden: $damager2name &6mit $damager2damage Schaden!' + - '&e&l Dritt höchster Schaden: $damager3name &emit $damager3damage Schaden!' + - '&aTöter: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Kapitän Davey: $distance' + spawnMessage: '&4Kapitän Davey sucht auf ein neues die Himmel wieder heim!' + deathMessage: '$players &ahat &4Hauptmann Davey &avon seiner sterblichen Hülle getrennt!' + escapeMessage: '&6Kapitän Davey ist verschwunden, um an einem anderen Tag zu spuken!' +binder_of_worlds_phase_1: + name: '$eventBossLevel &eBinder der Welten' + spawnMessage: '&5Der Binder der Welten nähert sich!' +binder_of_worlds_phase_1_melee_miniboss: + name: '$reinforcementLevel &9Realitäten Entwurzelter' +binder_of_worlds_phase_1_melee_reinforcement: + name: '$reinforcementLevel &8Realitäten Entfallener' +binder_of_worlds_phase_1_parkour_reinforcement: + name: '$reinforcementLevel &2Realitäten Vorbote' +binder_of_worlds_phase_1_ranged_miniboss: + name: '$reinforcementLevel &3Realitäten Ruinierender' +binder_of_worlds_phase_1_ranged_reinforcement: + name: '$reinforcementLevel &6Realitäten Ruinierender' +binder_of_worlds_phase_1_status_miniboss: + name: '$reinforcementLevel &1Realitäten Verdreher' +binder_of_worlds_phase_1_status_reinforcement: + name: '$reinforcementLevel &7Realitäten Reißer' +binder_of_worlds_phase_2: + name: '$eventBossLevel &eBinder der Welten' +binder_of_worlds_phase_3: + name: '$eventBossLevel &eBinder der Welten' +binder_of_worlds_phase_3_shulker_reinforcement: + name: '$reinforcementLevel &5Realitäten Rissmacher' +binder_of_worlds_phase_4: + name: '$eventBossLevel &eBinder der Welten' + deathMessages: + - '&e&l---------------------------------------------' + - '&9Der Binder ist nicht mehr an diese sterbliche Ebene gebunden!' + - '&c&l Höchster Schaden: $damager1name &cmit $damager1damage Schaden!' + - '&6&l Zweit höchster Schaden: $damager2name &6mit $damager2damage Schaden!' + - '&e&l Dritt höchster Schaden: $damager3name &emit $damager3damage Schaden!' + - '&aTöter: $players' + - '&e&l---------------------------------------------' +catacombs_tier_10_miniboss: + name: '$minibossLevel &7Terragog' +catacombs_tier_15_boss: + name: '$bossLevel &6Der Ratterer' + deathMessages: + - '&e&l---------------------------------------------' + - '&9Der Ratterer ratterte weg!' + - '&c&l Höchster Schaden: $damager1name &cmit $damager1damage Schaden!' + - '&6&l Zweit höchster Schaden: $damager2name &6mit $damager2damage Schaden!' + - '&e&l Dritt höchster Schaden: $damager3name &emit $damager3damage Schaden!' + - '&aTöter: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Fühlst du dich.. gerattert? + - Zeigen Sie mir Ihr Skelett! + - Du bist knochig! + - Dein Kalzium ist schwach! + onDamagedMessages: + - Das fühle ich in meinen Knochen! + - Ich habe noch ein Knochen mit dir zu brechen! + - Doot doot Herr Skelett + - Ich brauche Kalzium! + locationMessage: 'Der Ratterer: $distance Blöcke entfernt!' + spawnMessage: '&6Der Ratterer steigt auf!' + deathMessage: '&aDer Ratterer wurde von $players besiegt!' +catacombs_tier_15_mimic_boss: + name: '$bossLevel &6Der Vergessene' +catacombs_tier_15_reinforcement: + name: '$reinforcementLevel &eUnbekehrter' +catacombs_tier_5_evoker_guard_2: + name: '$normalLevel &7Katakombenwächter' + onDamageMessages: + - Kein Zugang! + - Eintritt verboten! +catacombs_tier_5_illusioner_guard_1: + name: '$normalLevel &7Katakombenwächter' + onDamageMessages: + - Kein Zugang! + - Eintritt verboten! +colosseum_tier_70_boss_mount: + name: '$bossLevel &4Gruben-Lord' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Der Grubenfürst ist nicht mehr!' + - '&c&l Höchster Schaden: $damager1name &cmit $damager1damage Schaden!' + - '&6&l Zweit höchster Schaden: $damager2name &6mit $damager2damage Schaden!' + - '&e&l Dritt höchster Schaden: $damager3name &emit $damager3damage Schaden!' + - '&aTöter: $players' + - '&e&l---------------------------------------------' + deathMessage: '&2Der Grubenfürst wurde von $players besiegt!' +colosseum_tier_70_boss_p1: + name: '$bossLevel &cGrubenmeister' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Der Grubenmeister ist gefallen!' + - '&c&l Höchster Schaden: $damager1name &cmit $damager1damage Schaden!' + - '&6&l Zweit höchster Schaden: $damager2name &6mit $damager2damage Schaden!' + - '&e&l Dritt höchster Schaden: $damager3name &emit $damager3damage Schaden!' + - '&aTöter: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Grubenmeister: $distance Blöcke entfernt!' + spawnMessage: '&4Der Grubenmeister startet erneut in den Kampf!' + deathMessage: '&2Der Grubenmeister wurde von $players getötet!' +colosseum_tier_70_boss_p2: + name: '$bossLevel &cGrubenmeister' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Der Grubenmeister ist gefallen!' + - '&c&l Höchster Schaden: $damager1name &cmit $damager1damage Schaden!' + - '&6&l Zweit höchster Schaden: $damager2name &6mit $damager2damage Schaden!' + - '&e&l Dritt höchster Schaden: $damager3name &emit $damager3damage Schaden!' + - '&4Jäger: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Grubenmeister: $distance Blöcke entfernt!' + deathMessage: '&2Der Grubenmeister wurde von $players getötet!' +colosseum_tier_70_boss_reinforcements_p1: + name: '$reinforcementLevel &6Gladiator' +colosseum_tier_70_boss_reinforcements_p2: + name: '$reinforcementLevel &6Gladiator' +colosseum_tier_70_gladiator: + name: '$normalLevel &6Gladiator' +colosseum_tier_70_mount_reinforcements: + name: '$reinforcementLevel &cGrubenbestie' +dark_cathedral_tier_75_boss: + name: '$bossLevel &4Kultist von Cthulhu' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Die Beschwörung wurde unterbrochen!' + - '&c&l Höchster Schaden: $damager1name &cmit $damager1damage Schaden!' + - '&6&l Zweit höchster Schaden: $damager2name &6mit $damager2damage Schaden!' + - '&e&l Dritt höchster Schaden: $damager3name &emit $damager3damage Schaden!' + - '&4Jäger: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Narren! + - Chtulhu R'lyeh! + - Keiner kann Chtulhu bezwingen! + - Starre in den Abgrund... + locationMessage: 'Kultist von Cthulhu: $distance Blöcke entfernt' + spawnMessage: '&cEin dunkler Kultist beschwört Cthulhu!' + deathMessage: '&2Die Beschwörung wurde von $players vereitelt!' + escapeMessage: '&2Der Kultist hat die Beschwörung abgeschlossen!' +dark_cathedral_tier_75_reinforcement: + name: '$reinforcementLevel Anhänger von Cthulhu' + onDamageMessages: + - Cthulhu R'lyeh + onDamagedMessages: + - Cthulhu R'lyeh +darkspire_level_100_berserker_brute: + name: '$normalLevel &7Unterwelt-Berserker' +darkspire_level_100_berserker_reanimated: + name: '$normalLevel &fReanimierter Berserker der Unterwelt' +darkspire_level_100_blacksmith_brute: + name: '$normalLevel &eSchwindelnder Goldschmied' +darkspire_level_100_endermite: + name: '$normalLevel &5Leerenkriecher' +darkspire_level_100_marksman_piglin: + name: '$normalLevel &9Närrischer Schütze' +darkspire_level_100_sentry_brute: + name: '$normalLevel &3Dunkelwachen-Wächter' +darkspire_level_100_summon_blaze: + name: '$reinforcementLevel &cHöllenerscheinung' +darkspire_level_100_summon_evoker: + name: '$reinforcementLevel &cFalscher Höllenbeschwörer' +darkspire_level_100_summon_ghast: + name: '$reinforcementLevel &7Maalkvvhar' +darkspire_level_100_summon_husk: + name: '$reinforcementLevel &cOroxaks Verderbte' +darkspire_level_100_summon_ravager: + name: '$reinforcementLevel &cEerbix der Gefallene' +darkspire_level_100_summon_skeleton: + name: '$reinforcementLevel &cRibling' +darkspire_level_110_berserker_reanimated: + name: '$normalLevel &7Reanimierter Berserker der Unterwelt' +darkspire_level_110_marksman_reanimated: + name: '$normalLevel &9Reanimierter Närrischer Schütze' +darkspire_level_110_necromancer_evoker: + name: '$normalLevel &8Schwarzherziger Verzauberer' +darkspire_level_110_sentry_reanimated: + name: '$normalLevel &3Wiederbelebter Dunkelwachen Wächter' +darkspire_level_110_stationary_stray: + name: '$normalLevel &6Hewn Wachmann' +darkspire_level_120_miniboss_evoker: + name: '$minibossLevel &4Höllenbeschwörer' +darkspire_level_120_miniboss_illusioner: + name: '$minibossLevel &4Maalkv' +darkspire_level_120_miniboss_skeleton: + name: '$minibossLevel &4Krypta Bewahrer' +darkspire_level_120_miniboss_stray: + name: '$minibossLevel &4Nicolas Brustkorb' +darkspire_level_120_miniboss_vindicator: + name: '$minibossLevel &4Zalmur der Zwergenschlächter' +darkspire_level_120_miniboss_wither_skeleton: + name: '$minibossLevel &4Oroxak' +darkspire_level_120_summon_zoglin: + name: '$reinforcementLevel &cArzags Horde' +darkspire_level_130_miniboss_phase_brute: + name: '$bossLevel &4Arzag die Bestie' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Arzag die Bestieninvasion wurde aufgehalten!' + - '&c&l Höchster Schaden: $damager1name &cmit $damager1damage Schaden!' + - '&6&l Zweit höchster Schaden: $damager2name &6mit $damager2damage Schaden!' + - '&e&l Dritt höchster Schaden: $damager3name &emit $damager3damage Schaden!' + - '&4Jäger: $players' + - '&e&l---------------------------------------------' +darkspire_level_130_miniboss_zoglin: + name: '$bossLevel &4Arzag die Bestie' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Arzag die Bestieninvasion wurde aufgehalten!' + - '&c&l Höchster Schaden: $damager1name &cmit $damager1damage Schaden!' + - '&6&l Zweit höchster Schaden: $damager2name &6mit $damager2damage Schaden!' + - '&e&l Dritt höchster Schaden: $damager3name &emit $damager3damage Schaden!' + - '&4Jäger: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Bestie Arzag: $distance Blöcke entfernt' + spawnMessage: '&4Arzag die Bestie bereitet sich auf die Invasion vor!' + escapeMessage: '&cArzag die Bestie wurde geplündert!' +darkspire_level_80_summon_blaze: + name: '$reinforcementLevel &dFalsche Höllenbrut' +fireworks_level_50_boss_phase_1: + name: '$eventBossLevel &cSparky' + spawnMessage: '&eFunken erfüllen den Himmel!' +fireworks_level_50_boss_phase_2: + name: '$eventBossLevel &cSparky' +fireworks_level_50_boss_phase_3: + name: '$eventBossLevel &cSparky' + deathMessages: + - '&e&l---------------------------------------------' + - '&eSparky ist raus, Party vorbei!' + - '&c&l Höchster Schaden: $damager1name &cmit $damager1damage Schaden!' + - '&6&l Zweit höchster Schaden: $damager2name &6mit $damager2damage Schaden!' + - '&e&l Dritt höchster Schaden: $damager3name &emit $damager3damage Schaden!' + - '&aTöter: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&6Sparky kehrt zum Feiern zurück!' +fireworks_phase_2_reinforcement: + name: '$eventBossLevel &cBoomi' +fireworks_phase_3_reinforcement: + name: '$eventBossLevel &cPartygänger' +the_great_weaver: + name: '$eventBossLevel &cThe Great Weaver' + locationMessage: '&cThe Great Weaver: $distance blocks away!' + spawnMessage: '&cAwful creatures have appeared!' + deathMessage: '&aThe Great Weaver and it''s brood have been stopped by $players!' + escapeMessage: '&4The Great Weaver and it''s brood have vanished!' +the_great_weaver_summon: + name: '$eventBossLevel &4Brood Mother' +the_great_weaver_summon_1: + name: '$eventBossLevel &6Brood' +halloween_event_boss_mount: + name: '$minibossLevel Daredevil' +halloween_event_boss_p1: + name: '$bossLevel Dullahan' + locationMessage: '&4Dullahan: $distance Blöcke entfernt!' + spawnMessage: '&4Verliere jetzt nicht den Kopf, der kopflose Reiter wandelt wieder auf der Erde!' + deathMessage: '&4Der kopflose Reiter wurde von $players besiegt!' + escapeMessage: '&4Der kopflose Reiter verschwand um die Träume von jemandem heimzusuchen!' +halloween_event_boss_p2: + name: '$bossLevel Dullahan' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Der kopflose Reiter wurde besiegt!' + - '&c&l Höchster Schaden: $damager1name &cmit $damager1damage Schaden!' + - '&6&l Zweit höchster Schaden: $damager2name &6mit $damager2damage Schaden!' + - '&e&l Dritt höchster Schaden: $damager3name &emit $damager3damage Schaden!' + - '&4Jäger: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Dullahan: $distance Blöcke entfernt!' + deathMessage: '&4Der kopflose Reiter wurde von $players besiegt!' + escapeMessage: '&4Der kopflose Reiter verschwand um die Träume von jemandem heimzusuchen!' +halloween_event_boss_reinforcement: + name: '$normalLevel gruseliges Skelett' +the_hunter: + name: '$eventBossLevel &4The Hunter' + locationMessage: '&cThe Hunter: $distance blocks away!' + spawnMessage: '&cA Hunter is on the prowl!' + deathMessage: '&aThe Hunter was hunted to extinction by $players!' + escapeMessage: '&4The Hunter declares the hunt now over!' +the_hunter_mount: + name: '$eventBossLevel &fTamed Beast' +the_living_dead: + name: '$reinforcementLevel &6Die Lebenden Toten' +northpole_elf: + name: '$normalLevel &2Workshop-Elf' +northpole_elf_summon: + name: '$reinforcementLevel &aSantas Elf' +northpole_jack_frost: + name: '$bossLevel &bJack Frost' +northpole_krampus: + name: '$bossLevel &5Krampus' +northpole_mrs_claus: + name: '$bossLevel &cMrs. Claus' +northpole_santa_claus: + name: '$bossLevel &4Santa Claus' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Jemand hat alle Geschenke von Santa Claus gestohlen!' + - '&c&l Höchster Schaden: $damager1name &cmit $damager1damage Schaden!' + - '&6&l Zweit höchster Schaden: $damager2name &6mit $damager2damage Schaden!' + - '&e&l Dritt höchster Schaden: $damager3name &emit $damager3damage Schaden!' + - '&4Jäger: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Santa Claus: $distance Blöcke entfernt' + spawnMessage: '&4Santa Claus bereitet sich auf Weihnachten vor!!' + escapeMessage: '&cSanta fuhr mit seinem Schlitten los!' +northpole_skeleton_summon: + name: '$reinforcementLevel &dSeele der Unartigen' +northpole_snowy_wraith: + name: '$reinforcementLevel &1Schneegeist' +the_phantom: + name: '$eventBossLevel &7The Phantom' + locationMessage: '&cThe Phantom: $distance blocks away!' + spawnMessage: '&cA Phantom roams in the dark!' + deathMessage: '&aThe Phantom and his evil troupe have been stopped by $players!' + escapeMessage: '&4The Phantom has left!' +the_phantom_summon_1: + name: '&fCave Spider' +the_phantom_summon_2: + name: '&fWItch' +the_phantom_summon_3: + name: '&fZombie' +the_phantom_summon_4: + name: '&fHusk' +the_phantom_summon_5: + name: '&fDrowned' +the_phantom_summon_6: + name: '&fSkeleton' +the_phantom_summon_7: + name: '&fStray' +the_phantom_summon_8: + name: '&fEnderman' +pirate_ship_tier_10: + name: '$normalLevel &cCrewmitglied' + onDamageMessages: + - Yarr! + - Harr! + - Vorsicht Kumpel! + - Alle Hände an Deck! + - Tanzt den Hanftanz! + - Du Mistvieh! + - Zittern wie Eschenlaub! +pirate_ship_tier_15: + name: '$normalLevel &cDeckhand' + onDamageMessages: + - Yarr! + - Harr! + - Vorsicht Kumpel! + - Alle Hände an deck! + - Tanzt den Hanftanz! + - Du Mistvieh! + - Zittern wie Eschenlaub! +pirate_ship_tier_20_melee_1: + name: '$normalLevel &cSchiffskamerad' + onDamageMessages: + - Yarr! + - Harr! + - Vorsicht Kumpel! + - Alle Hände an deck! + - Tanzt den Hanftanz! + - Du Mistvieh! + - Zittern wie Eschenlaub! +pirate_ship_tier_20_melee_2: + name: '$normalLevel &eBetrunkener Rüpel' + onDamageMessages: + - Yarr! + - Harr! + - Vorsicht Kumpel! + - Alle Hände an deck! + - Tanzt den Hanftanz! + - Du Mistvieh! + - Zittern wie Eschenlaub! +pirate_ship_tier_20_miniboss: + name: '$minibossLevel &dCookie der Koch' + onDamageMessages: + - Was machst du in meiner Küche! + - Ich habe Schichten! + - Du wurdest bedient! + - Raus aus meiner Küche! + deathMessage: '&2Cookie der Koch wurde von $players geschnitten und gewürfelt!' +pirate_ship_tier_20_ranged: + name: '$normalLevel &cSchiffskamerad' + onDamageMessages: + - Yarr! + - Harr! + - Vorsicht Kumpel! + - Alle Hände an deck! + - Tanzt den Hanftanz! + - Du Mistvieh! + - Zittern wie Eschenlaub! +pirate_ship_tier_25_miniboss_1: + name: '$miniboss &cCharon der Steuermann' + onDamageMessages: + - Die Narren sind los! + - Würdiger Gegner am Bug! + deathMessage: '&2Charon der Steuermann wurde von $players in die Irre geführt!' +pirate_ship_tier_30_melee: + name: '$normalLevel &cPirat' + onDamageMessages: + - Yarr! + - Harr! + - Vorsicht Kumpel! + - Alle Hände an deck! + - Tanzt den Hanftanz! + - Du Mistvieh! + - Zittern wie Eschenlaub! +pirate_ship_tier_30_miniboss_1: + name: '$minibossLevel &7Cruschy der Zermalmer' + onDamageMessages: + - Yarr! + - Harr! + - Vorsicht Kumpel! + - Alle Hände an Deck! + - Tanzt den Hanftanz! + - Du Mistvieh! + - Zittern wie Eschenlaub! + deathMessage: '&7Cruschy der Zermalmer wurde von $players zermalmt!' +pirate_ship_tier_30_ranged: + name: '$normalLevel &cPirat' + onDamageMessages: + - Yarr! + - Harr! + - Vorsicht Kumpel! + - Alle Hände an Deck! + - Tanzt den Hanftanz! + - Du Mistvieh! + - Zittern wie Eschenlaub! +pirate_ship_tier_35: + name: '$normalLevel &4Piraten Navigator' + onDamageMessages: + - Yarr! + - Harr! + - Vorsicht Kumpel! + - Alle Hände ans Deck! + - Tanzt den Hanftanz! + - Du Mistvieh! + - Zittern wie Eschenlaub! +pirate_ship_tier_35_miniboss_1: + name: '$minibossLevel &cZweiter Kumpel' + onDamageMessages: + - Sie haben hier keinen Zugang! + - Die Quartiere des Kapitäns, kehr um! +pirate_ship_tier_35_miniboss_2: + name: '$minibossLevel &cZweiter Mat' + onDamageMessages: + - Sie haben hier keinen Zugang! + - Die Quartiere des Kapitäns, kehr um! +pirate_ship_tier_40_miniboss_1: + name: '$minibossLevel &4Erste Hand' + onDamageMessages: + - Yarr! + - Harr! + - Vorsicht Kumpel! + - Alle Hände an deck! + - Tanzt den Hanftanz! + - Du Mistvieh! + - Zittern wie Eschenlaub! + deathMessage: '&6Die Erste Hand des Piratenschiffs wurde von $players degradiert!' +pirate_ship_tier_45_boss: + name: '$bossLevel &4Kapitän Schwarzbart' + onDamageMessages: + - Runter von meinem Schiff! + - Arr, Landratten! + spawnMessage: '&4Kapitän Blackbeard führt das Piratenschiff!' + deathMessage: '&2Kapitän Schwarzbarts wurde von $players rasiert!' + escapeMessage: '&2Captain Blackbeard ist mit dem Geplünderten weggelaufen!' +the_returned: + name: '$reinforcementLevel &6The Returned' +ruins_boss_p1: + name: '$eventBossLevel &9Thor' + spawnMessage: '&6Blitz geht vom Himmel hernieder!' +ruins_boss_p2: + name: '$eventBossLevel &9Thor' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Thor wurde zurück nach Asgard geschickt!' + - '&c&l Höchster Schaden: $damager1name &cmit $damager1damage Schaden!' + - '&6&l Zweit höchster Schaden: $damager2name &6mit $damager2damage Schaden!' + - '&e&l Dritt höchster Schaden: $damager3name &emit $damager3damage Schaden!' + - '&aTöter: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&6Blitz geht vom Himmel hernieder!' +ruins_boss_reinforcement: + name: '$eventBossLevel &7Fenrir' +sewer_tier_10: + name: '$normalLevel &fSchleicher' +sewer_tier_15: + name: '$normalLevel &2Kriecher' +sewer_tier_20_dry: + name: '$normalLevel &1Verirrter Wanderer' +sewer_tier_20_gravity_boss: + name: '$minibossLevel &1Funken' +sewer_tier_20_water: + name: '$normalLevel &1Schmuggler' + onDamageMessages: + - Du solltest nicht hier sein! + onDamagedMessages: + - Niemand darf uns im Weg stehen! +sewer_tier_20_water_boss: + name: '$minibossLevel &1Vergessener Held' +sewer_tier_20_wither_boss: + name: '$minibossLevel &2Verwitterter Leichnam' +sewer_tier_30_ice_boss: + name: '$minibossLevel &2Eis Schrecken' +sewer_tier_30_invisibility_boss: + name: '$minibossLevel &2Schattenschütze' +sewer_tier_30_melee: + name: '$normalLevel &5Kanalisationsbestie' +sewer_tier_30_ranged: + name: '$normalLevel &5Geisterflüsterer' + onDamageMessages: + - Ein Fluch über dich! + - Die Pocken über deine Familie! + - Spüren Sie den Zorn der Geister! + onDamagedMessages: + - Du ärgerst mich so! + - Geister, schützt mich! +sewer_tier_40: + name: '$normalLevel &6Trugbild' + onDamageMessages: + - Dein Sieg, eine Lüge + - Deine Quoten, schlimm + - Dein Leben, mein + onDamagedMessages: + - Dieser Schmerz, eine Täuschung + - Das Blut, eine Täuschung + - Diese Schwäche, eine Lüge +sewer_tier_40_darkness_boss: + name: '$minibossLevel &2Schattenmeister' +sewer_tier_40_darkness_boss_reinforcement: + name: '$reinforcementLevel &2Schatten' +sewer_tier_40_fire_boss: + name: '$minibossLevel &2Der Grillmeister' +sewer_tier_40_fire_boss_reinforcement: + name: '$reinforcementLevel &2Flamme' +sewer_tier_40_poison_boss: + name: '$minibossLevel &2Giftiger Gärtner' + onDamageMessages: + - Fühle den Zorn der Natur! + onDamagedMessages: + - Zu mir, Lakaien! +sewer_tier_40_poison_boss_reinforcement: + name: '$reinforcementLevel &2Gefallener Gärtner' +sewer_tier_5: + name: '$normalLevel &7Kanalisationsarbeiter' + onDamageMessages: + - Dieser Bereich ist eingeschränkt! + - Springe nicht in die Behälter! + - | + Du solltest hier nicht sein| + onDamagedMessages: + - Weißt du, was du tust!? + - Dummheit! + - Denk nicht einmal daran! +sewer_tier_50: + name: '$normalLevel &3Kanalisations Piranha' +sewer_tier_50_lightning_boss: + name: '$minibossLevel &2Mjolnir' +sewer_tier_50_ravager_boss: + name: '$minibossLevel &2Kanalisationsmonstrosität' +sewer_tier_50_spider_boss: + name: '$minibossLevel &2Antiker Kriecher' +sewer_tier_50_spider_boss_reinforcement: + name: '$reinforcementLevel &2Spinnenling' +sewer_tier_50_water_boss: + name: '$minibossLevel &2Piranha-König' +sewer_tier_50_water_boss_reinforcement: + name: '$reinforcementLevel &2Piranha Prinz' +sewer_tier_60: + name: '$normalLevel &4Ertrunkene Existenz' +sewer_tier_70_boss: + name: '$bossLevel &4Ertrunkener König' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Der Zombie König wurde besiegt!' + - '&c&l Höchster Schaden: $damager1name &cmit $damager1damage Schaden!' + - '&6&l Zweit höchster Schaden: $damager2name &6mit $damager2damage Schaden!' + - '&e&l Dritt höchster Schaden: $damager3name &emit $damager3damage Schaden!' + - '&4Jäger: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&cDie Kanalisation hallt vom Geschrei eines zurückgekehrten Königs wider...' + deathMessage: '&2Der Zombie König wurde besiegt!' + escapeMessage: '&2Die Kanalisationskanäle werden jetzt ruhig, vorerst...' +sewer_tier_70_boss_reinforcement: + name: '$reinforcementLevel &4Ertrunkene Existenz' +totem_zombie_1: + name: '$eventBossLevel Kopf Zombie' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Das Zombie-Totem wurde getötet!' + - '&c&l Höchster Schaden: $damager1name &cmit $damager1damage Schaden!' + - '&6&l Zweit höchster Schaden: $damager2name &6mit $damager2damage Schaden!' + - '&e&l Dritt höchster Schaden: $damager3name &emit $damager3damage Schaden!' + - '&aTöter: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cZombie Totem: $distance Blöcke entfernt!' + spawnMessage: '&cA Dr. Craftenmine Abomination wurde gesichtet!' + deathMessage: '&aDr. Craftenmines Abscheulichkeit wurde von $players niedergestreckt!' + escapeMessage: '&4Dr. Craftenmines Kreation ist entkommen!' +totem_zombie_2: + name: '$eventBossLevel Totem Zombie' +totem_zombie_3: + name: '$eventBossLevel Totem Zombie' +totem_zombie_4: + name: '$eventBossLevel Totem Zombie' +totem_zombie_5: + name: '$eventBossLevel Totem Zombie' +totem_zombie_6: + name: '$eventBossLevel Totem Zombie' +treasure_goblin: + name: '$eventBossLevel &eSchatz Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eDer Schatz Goblin wurde ausgeraubt!' + - '&c&l Höchster Schaden: $damager1name &cmit $damager1damage Schaden!' + - '&6&l Zweit höchster Schaden: $damager2name &6mit $damager2damage Schaden!' + - '&e&l Dritt höchster Schaden: $damager3name &emit $damager3damage Schaden!' + - '&aTöter: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cSchatz Goblin: $distance Blöcke entfernt!' + spawnMessage: '&cEin Schatz Goblin wurde gesichtet!' + deathMessage: '&aEin Schatz Goblin wurde von $players besiegt!' + escapeMessage: '&4Ein Schatz Goblin ist entkommen!' +tree_defender: + name: '$eventBossLevel &2Tree Defender' +undead_farmer: + name: '$eventBossLevel &aUndead Farmer' + locationMessage: '&cUndead Farmer: $distance blocks away!' + spawnMessage: '&cAn Undead Farmer walks the earth!' + deathMessage: '&aThe Undead Farmer''s career was ended by $players!' + escapeMessage: '&4The Undead Farmer has gone back to rest!' +undead_farmer_summon: + name: '$eventBossLevel &2Farmers Pride' +undead_farmer_summon_1: + name: '$eventBossLevel &2Failed Hog' +undead_horde_summon_1: + name: '$reinforcementLevel &aUndead Horde' +undead_horde_summon_2: + name: '$reinforcementLevel &dUndead Horde' +undead_horde_summon_3: + name: '$reinforcementLevel &eUndead Horde' +unwanted_visitor: + name: '$eventBossLevel &9Unwanted Visitor' + locationMessage: '&cUnwanted Visitor: $distance blocks away!' + spawnMessage: '&cAn Unwanted Visitor has come to the nether to warm up!' + deathMessage: '&aThe Visitor was slain by $players!' + escapeMessage: '&4The Visitor has gone back to his chilly domain!' +unwanted_visitor_summon: + name: '$eventBossLevel &bIce Clone' +vampire_boneman: + name: '$reinforcementLevel &7Entwässerungslinge' +vampire_brute: + name: '$normalLevel &1Vampir Rohling' +vampire_brute_coffin_breaker: + name: '$normalLevel &1Vampir Rohling' +vampire_brute_gargoyle_rush_left: + name: '$normalLevel &3Vampir Rohling' +vampire_brute_gargoyle_rush_left_phase_2: + name: '$normalLevel &3Vampir Rohling' +vampire_brute_gargoyle_rush_right: + name: '$normalLevel &3Vampir Rohling' +vampire_brute_gargoyle_rush_right_phase_2: + name: '$normalLevel &3Vampir Rohling' +vampire_fledgling: + name: '$normalLevel &9Vampir Flammennachwuchs' +vampire_fledgling_coffin_breaker: + name: '$normalLevel &9Vampir Nachwuchs' +vampire_fledgling_gargoyle_overlord: + name: '$normalLevel &9Vampier Küken' +vampire_gargoyle: + name: '$normalLevel &6Vampier Wasserspeier' +vampire_grunt: + name: '$normalLevel &1Vampier Grunzen' +vampire_grunt_coffin_breaker: + name: '$normalLevel &1Vampier Grunzen' +vampire_grunt_gargoyle_rush_left: + name: '$normalLevel &1Vampier Grunzen' +vampire_grunt_gargoyle_rush_left_phase_2: + name: '$normalLevel &1Vampier Grunzen' +vampire_grunt_gargoyle_rush_right: + name: '$normalLevel &1Vampier Grunzen' +vampire_grunt_gargoyle_rush_right_phase_2: + name: '$normalLevel &1Vampir Grunzer' +vampire_hound: + name: '$reinforcmentLevel &bVampier Hetzen' +vampire_king: + name: '$bossLevel &4Vampirkönig' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Der Vampir König wurde getötet!' + - '&c&l Höchster Schaden: $damager1name &cmit $damager1damage Schaden!' + - '&6&l Zweit höchster Schaden: $damager2name &6mit $damager2damage Schaden!' + - '&e&l Dritt höchster Schaden: $damager3name &emit $damager3damage Schaden!' + - '&aTöter: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Vampir König: $distance Blöcke entfernt.' + spawnMessage: '&cDer Vampir König kriecht zurück zu seinem Thron...' + deathMessage: '&2Der Vampir König wurde getötet!' + escapeMessage: '&2Dunkelheit flieht, aber wie lange...' +vampire_king_phase_2: + name: '$bossLevel &4Vampirkönig' +vampire_king_phase_3: + name: '$bossLevel &4Vampirkönig' +vampire_king_phase_4: + name: '$bossLevel &4Vampirkönig' +vampire_king_phase_5: + name: '$bossLevel &4Vampirkönig' +vampire_king_phase_6: + name: '$bossLevel &4Vampirkönig' +vampire_level_120_miniboss_evoker: + name: '$minibossLevel &4Höllenbeschwörers Geist' +vampire_level_120_miniboss_skeleton: + name: '$minibossLevel &4Krypta Bewahrers Geist' +vampire_level_120_miniboss_stray: + name: '$minibossLevel &4Nicolas Brustkorbs Geist' +vampire_level_120_miniboss_wither_skeleton: + name: '$minibossLevel &4Oroxaks Geist' +vampire_necromancer: + name: '$normalLevel &5Vampir Nekromant' +vampire_necromancer_dining_hall: + name: '$normalLevel &5Vampir Nekromant' +vampire_necromancer_entrance: + name: '$normalLevel &5Vampir Nekromant' +vampire_necromancer_foresight_pool: + name: '$normalLevel &5Vampir Nekromant' +vampire_necromancer_gargoyle_rush: + name: '$normalLevel &5Vampir Nekromant' +vampire_necromancer_gargoyle_rush_phase_2: + name: '$normalLevel &5Vampir Nekromant' +vampire_necromancer_left_bedroom: + name: '$normalLevel &5Vampir Nekromant' +vampire_necromancer_right_bedroom: + name: '$normalLevel &5Vampir Nekromant' +vampire_necromancer_supply_room: + name: '$normalLevel &5Vampir Nekromant' +vampire_necromancer_supreme_coffin_breaker: + name: '$minibossLevel &5Vampir Nekromanten Oberster' +vampire_necromancer_supreme_coffin_breaker_phase_2: + name: '$minibossLevel &5Vampir Nekromanten Oberster' +vampire_necromancer_supreme_coffin_breaker_phase_3: + name: '$minibossLevel &5Vampir Nekromanten Oberster' +vampire_necromancer_supreme_coffin_breaker_phase_4: + name: '$minibossLevel &5Vampir Nekromanten Oberster' +vampire_necromancer_supreme_coffin_breaker_phase_5: + name: '$minibossLevel &5Vampir Nekromanten Oberster' +vampire_necromancer_supreme_gargoyle_overlord: + name: '$minibossLevel &5Vampir Nekromanten Oberster' +vampire_necromancer_supreme_gargoyle_overlord_phase_2: + name: '$minibossLevel &5Vampir Nekromanten Oberster' +vampire_necromancer_supreme_gargoyle_overlord_phase_3: + name: '$minibossLevel &2Gargoyle Oberherr' +vampire_sentinel: + name: '$minibossLevel &eVampir''s Schildwache' +vampire_thrall: + name: '$reinforcementLevel &dVampir Thrall' +vampire_wraith: + name: '$minibossLevel &8Ausgesaugte Existenz' +vampire_wraith_phase_2: + name: '$minibossLevel &8Ertrunkene Existenz' +vampire_zombie: + name: '$normalLevel &aleergesaugte Hülle' +vex_top: + name: '$eventBossLevel &eVex Selfish Top' + locationMessage: '&cVex Troublemakers: $distance blocks away!' + spawnMessage: '&cA gang of Vex Troublemakers have appeared!' + deathMessage: '&aThe Vex Troublemakers were slain by $players!' + escapeMessage: '&4The Vex Troublemakers have decided to leave.' +vex_top_mount_1: + name: '$eventBossLevel &6Vex Bottom' +vex_top_mount_2: + name: '$eventBossLevel &6Vex Bottom' +vex_top_mount_3: + name: '$eventBossLevel &6Vex Bottom' +warlock: + name: '$eventBossLevel &dWarlock' + locationMessage: '&cWarlock: $distance blocks away!' + spawnMessage: '&cA demon riding Warlock has appeared!' + deathMessage: '&aThe Warlock was slain by $players!' + escapeMessage: '&4The Warlock ran away on his demon!' +warlock_mount: + name: '$eventBossLevel &dDemon' +wasp_queen: + name: '$eventBossLevel &aWasp Queen' + locationMessage: '&cWasp Queen: $distance blocks away!' + spawnMessage: '&cA wasp swarm has been sighted!' + deathMessage: '&aThe wasp swarm was eliminated by $players!' + escapeMessage: '&4The wasp swarm has flown away.' +wasp_queen_summon: + name: '$eventBossLevel &aWasp' +water_pest: + name: '$eventBossLevel &3Water Pest' + locationMessage: '&cWater Pest: $distance blocks away!' + spawnMessage: '&cAn annoying foe swims the waters!' + deathMessage: '&aThe Water Pest was slain by $players!' + escapeMessage: '&4The waters are clear of all Pests' +weapons_goblin: + name: '$eventBossLevel &cWaffengoblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eDer Waffengoblin wurde geplündert!' + - '&c&l Höchster Schaden: $damager1name &cmit $damager1damage Schaden!' + - '&6&l Zweit höchster Schaden: $damager2name &6mit $damager2damage Schaden!' + - '&e&l Dritt höchster Schaden: $damager3name &emit $damager3damage Schaden!' + - '&aTöter: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cWaffenkoblin: $distance Blöcke weg!' + spawnMessage: '&cEin Waffen-Goblin wurde gesichtet!' + deathMessage: '&aEin Waffengoblin wurde von $players getötet!' + escapeMessage: '&4Ein Waffen Goblin ist entkommen!' +wendigo: + name: '$eventBossLevel &7Wendigo' + locationMessage: '&cWendigo: $distance blocks away!' + spawnMessage: '&cSomething awful has appeared!' + deathMessage: '&aThe Wendigo has been slain $players!.' + escapeMessage: '&4The Wendigo has disappeared!' +wendigo_summon: + name: '$reinforcementLevel &aWindigo' +werehare: + name: '$eventBossLevel &5Alice' + locationMessage: '&cWerehare: $distance blocks away!' + spawnMessage: '&cA bloody roar can be heard! A werehare approaches!' + deathMessage: '&a$players! made sure to end the werehare''s reign!' + escapeMessage: '&4The werehare escaped!' +werehare_p2: + name: '$eventBossLevel &dWerehare' +wild_wolf: + name: '$reinforcementLevel &7Wilder Wolf' +wood_league_wave_10_boss: + name: '$bossLevel &4Böser Hund' +wood_league_wave_10_reinforcement: + name: '$reinforcementLevel &cBöser Welpe' +wood_league_wave_11_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_11_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_12_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_12_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_13_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_13_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_14_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_14_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_15_miniboss: + name: '$bossLevel &4Herr. Oinkers' + onDamagedMessages: + - Oink!? +wood_league_wave_16_melee: + name: '$normalLevel Herr. Oinkers Fan' +wood_league_wave_16_ranged: + name: '$normalLevel Herr. Oinkers Fan' +wood_league_wave_17_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_17_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_18_melee: + name: '$normalLevel &4Fechtklub Enthusiast' +wood_league_wave_19_ranged: + name: '$normalLevel Bogenschießklub Enthusiast' +wood_league_wave_1_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_1_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_20_boss: + name: '$bossLevel &2Zoltan' +wood_league_wave_21_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_21_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_22_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_22_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_23_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_23_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_24_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_24_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_25_miniboss: + name: '$minibossLevel &bAgdluak' +wood_league_wave_26_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_26_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_27_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_27_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_28_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_29_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_2_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_2_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_30_boss: + name: '$bossLevel &2Die Südliche Viper' +wood_league_wave_31_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_31_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_32_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_32_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_33_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_33_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_34_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_34_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_35_miniboss: + name: '$minibossLevel &6Der Narr' +wood_league_wave_36_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_36_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_37_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_37_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_38_melee: + name: '$normalLevel &4Arena Schwertkämpfer' +wood_league_wave_39_ranged: + name: '$normalLevel Arena Bogenschütze' +wood_league_wave_3_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_3_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_40_boss: + name: '$bossLevel &cCrucio der Träger der Flüche' +wood_league_wave_41_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_41_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_42_healer: + name: '$normalLevel Arenaheiler' +wood_league_wave_42_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_42_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_43_healer: + name: '$normalLevel Arenaheiler' +wood_league_wave_43_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_43_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_44_healer: + name: '$normalLevel Arenaheiler' +wood_league_wave_44_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_44_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_45_miniboss: + name: '$minibossLevel &6Tausend Klingen' +wood_league_wave_46_healer: + name: '$normalLevel Arena Heiler' +wood_league_wave_46_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_46_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_47_healer: + name: '$normalLevel Arenaheiler' +wood_league_wave_47_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_47_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_48_healer: + name: '$normalLevel Arenaheiler' +wood_league_wave_48_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_49_healer: + name: '$normalLevel Arenaheiler' +wood_league_wave_49_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_4_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_4_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_50_boss: + name: '$bossLevel &6Uther der Champion' +wood_league_wave_50_boss_p2: + name: '$bossLevel &6Uther der Champion' +wood_league_wave_50_boss_p3: + name: '$bossLevel &6Uther der Champion' +wood_league_wave_50_reinforcement: + name: '$reinforcementLevel &6Uther Stan' +wood_league_wave_5_miniboss: + name: '$minibossLevel &cMerkwürdige Kuh' + onDamagedMessages: + - Wuff! +wood_league_wave_6_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_6_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_7_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_7_ranged: + name: '$normalLevel Arena Armbrustschütze' +wood_league_wave_8_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_9_ranged: + name: '$normalLevel Arena Armbrustschütze' +yeti: + name: '$eventBossLevel &bYeti' + locationMessage: '&cYeti: $distance blocks away!' + spawnMessage: '&cA mighty beast has appeared!' + deathMessage: '&aThe beast is no more thanks to $players!.' + escapeMessage: '&4The beast has escaped!' +yezhi_baba: + name: '$eventBossLevel &cYezhi Baba' + locationMessage: '&cYezhi Baba: $distance blocks away!' + spawnMessage: '&cA foul hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +yezhi_baba_summon: + name: '$reinforcementLevel &4Yezhi Baba' +zombie_friends_friend: + name: '$reinforcementLevel &7Zombie Freund' +zombie_king: + name: '$eventBossLevel &4Zombie König' + locationMessage: '&cZombie König: $distance Blöcke entfernt!' + spawnMessage: '&cDer Zombie König wurde gesichtet!' + deathMessage: '&aDer Zombie König wurde von $players besiegt!' + escapeMessage: '&4Der Zombie König ist entkommen!' +zombie_parents_dad: + name: '$reinforcementLevel &7Zombie Vater' +zombie_parents_mom: + name: '$reinforcementLevel &7Zombie Mutter' +back_teleporter: + name: Hermes + role: + greetings: + - Wilkommen in der\nAbenteurer Gilde! + dialog: + - Musst du zurück? + farewell: + - Sichere Reise, Freund. + noPreviousLocationMessage: '&8[EliteMobs] &cKonnte dich nicht an die letzte Position zurücksenden - keine Position gefunden!' +barkeep: + name: Bartley + role: + greetings: + - Was zu trinken? + - Getränk? + - Durstig? + - Howdy, Partner. + dialog: + - Genießen Sie eine unserer Hausspezialitäten. + - Spezialdrinks, nirgendwo\nsonst zu finden. + - Einmal versucht und du\nwirst immer mehr wollen. + farewell: + - Du bist hier immer willkommen + - '"Hoch die Tassen!"' + - Kampai! + - Salut! + - Brosd! + - Salud! + - À la vôtre ! + - Prost! + - Santi! + - Salute! + - Saúde! + - Cheers! + - 乾杯! +blacksmith: + name: Greg + role: + greetings: + - Wilkommen in unserem Laden! + - Hier kannst du deine Waren verkaufen! + - Frische Waren, nur für dich! + - Hast du etwas zu verkaufen? + - Willst du was gutes kaufen? + - Frische Waren jedes mal! + dialog: + - Gegner mit höherem\n Level lassen besseres fallen! + - Items mit vielen \nVerzauberungen haben mehr Wert! + - Mobs mit höherem Level \nlassen bessere Items fallen! + - Mobs mit höherem Level haben eine\n höhere chance Loot fallen zu lassen! + - + - + - Einige Items haben speziell\nTrank Effekte! + - Einige Items haben\neinzigartige Effekte! + - Die Jäger verzauberung\nlockt Elite Mobs an! + - Spezielle Waffen und Rüstungen\nvon Elite Mobs können\nhier verkauft werden! + - Höhere Gilden Ränge\n erhöhen die qualität von\nElite Mobs Loot! + farewell: + - Vielen dank für Ihren Einkauf! + - Komme bald zurück! + - Du bist hier immer willkommen! + - Empfehle meinen Laden an deine\n Freunde! +combat_instructor: + name: Charles + role: + greetings: + - Willst du mehr übers Kämpfen lernen? + - Brauchst du eine Kampf Lektion? + - Willst du mehr übers Kämpfen lernen? + - Bereit gegen Elite Mobs zu kämpfen? + dialog: + - Die Items die um Eliten schweben\nzeigen welche Kräfte sie haben. + - Umso höher der Level\neines Eliten, umso mehr\nKräfte können sie haben + - Umso höher der Level\neines Eliten, umso besser\ndas Loot das sie fallen lassen + - Eliten mit höherem Level\nhaben höhere chancen\n besseres Loot zu droppen + - Elite Mobs mit schwebenden\npfeilen schiessen Pfeile auf\nSpieler in der nähe + - Elite Mobs mit schwebenden\nEnder Augen blenden dich\n wenn du getroffen wirst + - Elite Mobs mit schwebenden\nZauber Partikel verwirren dich\nwenn sie dich treffen + - Elite Mobs mit schwebenden\nLavaeimern setzen dich in brand\nwenn sie dich treffen + - |- + Elite Mobs mit schwebendem\nFeuerbälle feuern + auf Spieler in der Nähe + - Elite Mobs mit schwebenden\nPackeis frieren dich ein\nwenn sie dich treffen + - Elite Mobs mit schwebenden\nElytra lassen dich schweben\nwenn sie dich treffen + - Elite Mobs mit schwebenden\nSmaragden vergiften dich\nwenn sie dich treffen + - Elite Mobs mit schwebenden\nKolben drücken dich weg\nwenn sie dich treffen + - Elite Mobs mit schwebenden\nTotems schwächen dich\n wenn sie dich treffen + - Elite Mobs mit schwebenden\nNetzen netzen dich ein\n wenn sie dich treffen + - Elite Mobs mit schwebenden\nSchädeln dörren dich aus\n wenn sie dich treffen + - Elite Mobs mit schwebenden\nKisten lassen Bonus Loot fallen\nwenn du sie tötest + - Elite Mobs mit schwebenden\nGold Schuhen sind schneller + - Elite Mobs mit schwebenden\nPlattenspielern verspotten dich\nim Kampf + - Elite Mobs mit schwebenden\nGlasscheiben sind unsichtbar + - Elite Mobs mit schwebenden\nSpektralpfeilen sind Immun\ngegen Pfeile + - Elite Mobs mit schwebenden\nFedern sind Immun\ngegen Fallschaden + - Elite Mobs mit schwebenden\nFlammen sind Immun\ngegen Feuer + - Elite Mobs mit schwebenden\nAmbossen sind schwerer\n als üblich + - Elite Mobs mit schwebenden\nKnochenblocks lassen ihre Leichen\nzurück wenn sie Sterben + - Elite Mobs mit schwebenden\nSchleimblöcken springen höher\nals üblich + - Elite Mobs mit schwebenden\nSchleimblöcken erstelle einen\nVakuum wenn sie sterben + - Elite Mobs mit schwebenden\nLeinen ziehen dich\nwenn sie dich treffen + - Elite Mobs mit schwebenden\nKnochen erstellen Knochenpfeiler\nim Kampf + - Elite Mobs mit schwebenden\nGetränkten Pfeilen schiessen Pfeile die\n dich Verfolgen + - Elite Mobs mit schwebenden\nPilzen werden zu Riesen wenn\nsie getroffen werden + - Elite Mobs mit schwebenden\nSchädeln beschwören verstärkungen\nwenn sie getroffen werden + - Elite Mobs mit schwebenden\nBüchern beschören verstärkungen\nbis du den Beschwörer tötest + - Elite Mobs mit schwebenden\nEiern beschwören verstärkungen\n wenn du sie triffst + - Elite Mobs mit schwebenden\nFeuerwerk beschwören Team Rocket\n wenn du sie triffst +enhancer_config: + name: Tim + role: + greetings: + - Möchten Sie Ihre Items upgraden? + - Hast du Verbesserungs Orbs? + - Upgrade deine Items hier! + - Ahoy! + - Du hast Schrott Sohn? + dialog: + - Deine Items sind läusig,\n erhalte hier ein Upgrade hier! + - Upgrade deine Items hier! + - Hast du einen Upgrade-Orb? + - Dieses Schwert sieht furchtbar aus,\nerhalte es hier upgraden! + - Brauchen Sie ein Upgrade? + farewell: + - Verleugnen Sie sich nicht da draußen! + - Komm zurück, wenn du mehr Orbs hast! + - Hol dir mehr Orbs! +frost_queen_teleporter: + name: Ishard the Frostbitten + role: + greetings: + - '' +guide_0: + name: Dux + role: + greetings: + - Hast du von der AG gehört? + - Waren Sie in der AG? + - Von der Abenteurergilde gehört? + - Kennen Sie die Abenteurergilde? + dialog: + - Hast du von der AG gehört? + - Waren Sie in der AG? + - Hörten sie von der Abenteurergilde? + - Kennen Sie die Abenteurergilde? + farewell: + - Du bist hier immer willkommen + - Ich bin hier, wenn du mich brauchst! + - Ich bin hier in der nähe! + - Auf Wiedersehen! +guide_1: + name: Casus + role: + greetings: + - Brauchst du eine Wegweisung? + - Benötigst du einen Hinweis + - Haben Sie sich verirrt? + - Brauchst du Hilfe? + dialog: + - Ich kenne alles über\ndiesem Ort! + - Möchtest du die anderen Mitglieder\nder Abenteurergilde kennenlernen? + - Möchtest du dich hier\nzurechtfinden? + farewell: + - Du bist hier immer willkommen + - Ich bin hier, wenn du mich brauchst! + - Ich bin da! + - Auf Wiedersehen! +guild_attendant: + name: Gillian + role: + greetings: + - Wilkommen in der\nAbenteurer Gilde! + - Wilkommen! + dialog: + - Sieh dir das Anschlagbrett an\n um aktive Quests zu sehen! + - Du kannst mit mir reden um\ndeinen Gilden Rang zu ändern! + - Du kannst Items and den\nSchmied verkaufen! + - Du kannst mit dem Arena Meister\nreden um in der Arena zu Kämpfen! + - Du kannst Ausrüstung vom\nSchmied kaufen! + - Du kannst mit dem Kampf Experten\nreden um dein Kampf Level zu sehen! + - Wenn du neue Gilden Ränge freischaltest, \nerhöst du deine Maximale HP! + farewell: + - Bis bald! + - Danke fürs vorbeikommen! + - Frohe Jagd! +primis_69ozcanofbepis: + name: '&a69 Unzen Dose von Bepis' + role: '&2Kartograph (Uuuge Gamer)' + dialog: + - Hoffentlich genießt du die Landkarte! + farewell: + - Viel Spaß! +primis_caeruleaum_fisherman: + name: '&3Piscis Erzfeind' + role: '&b' + greetings: + - Hallo!. + dialog: + - Woah! Fast vom Boot gefallen. + - Verdammtes Seeungeheuer! + - Brauche mehr Köder. + farewell: + - Später! + - Viel Glück! +primis_caeruleaum_fletcher: + name: '&6Ventus Artifex' + role: '&e' + greetings: + - Grüße. + dialog: + - Ich war einst ein Abenteurer wie du. + - Willkommen, aussenseiter + - Brauchst du etwas? + - |- + Du bist nicht von hier aus der Gegend oder? + farewell: + - Man sieht sich! + - Komme bald zurück! +primis_caeruleaum_forager: + name: '&5Venator Pabulatus' + role: '&d' + greetings: + - Hallo, Fremder. + dialog: + - Ich war einst ein Abenteurer wie du. + - Willkommen, aussenseiter + - Brauchst du etwas? + - |- + Du bist nicht von hier aus der Gegend oder? + farewell: + - Man sieht sich! + - Komme bald zurück! +primis_caeruleaum_hint_giver: + name: '&fVir Loquax' + role: '&f Weisser Mann' + greetings: + - Hallo! + - Hallo! + - Hey, schön dich zu sehen! + - Grüße! + dialog: + - + - + - + - + - Die Ruinen im Südwesten sind ein so schrecklicher Ort!\n Wer würde jemals dorthin gehen... + - + - + - Ich habe gehört, dass sich ein übler Typ\n vojn Wolf in der Wolfshöhle niedergelassen hat! + farewell: + - Auf wiedersehen! + - Auf Wiedersehen! + - Besuche mich gern nochmal! + - Lebewohl! +primis_caeruleaum_injured_fisherman: + name: '&3Callidus Piscatus' + role: '&b' + greetings: + - Hallo Wanderer. + dialog: + - In letzter Zeit guten Fisch gefangen? + - Willkommen Aussenseiter + - Brauchst du etwas? + - |- + Sie sind nicht aus dieser Gegend, + oder doch? + farewell: + - Wir sehen uns! + - Komme bald zurück! +primis_caeruleaum_jeeves: + name: Jeeves + role: + greetings: + - Einfach reisen! + dialog: + - Just here to sell\nto the shop-keep. + - I'm busy negotiating\nhere. + - Not right now,\ncome back later. + farewell: + - Uhuh... +primis_caeruleaum_leader: + name: '&4Chief Piscis' + role: '&c' + greetings: + - Willkommen im Dorf! + dialog: + - |- + Fragen Sie nicht, was dieses Dorf für Sie tun kann, + fragen Sie, was Sie für dieses Dorf tun können! + - Willkommen, Außenstehender + - Brauchst du etwas? + - |- + Du bist nicht hier aus der Gegend oder? + farewell: + - Ab mit dir! + - Komme bald zurück! +primis_caeruleaum_merchant: + name: Emptor + role: + greetings: + - Hast du etwas zu verkaufen? + dialog: + - Banditen haben meine Waren gestohlen! + - Nichts zu verkaufen, fürchte ich. + - Ich kaufe alles, was du hast! + farewell: + - Sicheres Reisen! +primis_captain: + name: '&4Hauptmann Squalus' + role: '&c' + greetings: + - Also bist du endlich wach! + - Das war eine wilde Fahrt! + - Noch am Leben? + - Lass uns das nicht wieder machen! + dialog: + - Ich habe eine Aufgabe für dich! + - Ich brauche deine Hilfe! + - |- + Gut, das du hier bist, + wir brauchen Hilfe! + farewell: + - Ab mit dir! + - Vergiss mich nicht! + - Komme bald zurück! +primis_deli'o: + name: '&eDéli''O' + role: '&6Kartograph (Gamer)' + dialog: + - Hoffentlich genießt du die Landkarte! + farewell: + - Viel Spaß! +primis_farmstead_son: + name: '&4Filius' + role: '&c' + greetings: + - Woher kommen Sie? + - Sie scheinen von weit her gekommen zu sein. + dialog: + - Gefährliche Zeiten in denen wir leben. + - Hast du meinen Vater gesehen? + - Wie werden die Boote ohne Leuchtturm fahren? + farewell: + - Pass auf deinen Rücken auf! + - Pass auf wo du hintrittst! +primis_farmstead_wife: + name: '&4Amavit' + role: '&c' + greetings: + - Ich habe dich hier vorher noch nicht gesehen! + - Haben Sie Neuigkeiten von Pontis Mille? + dialog: + - Hast du meinen Ehemann gesehen? + - Ich brauche deine Hilfe! + - Gefährliche Zeiten in denen wir leben. + - Etwas stimmt nicht! + farewell: + - Sicheres Reisen! + - Vielen Dank! +primis_first_mate: + name: '&cIracundi' + role: '&c' + greetings: + - Also bist du endlich wach! + - Das war eine wilde Fahrt! + - Noch am Leben? + - Lass uns das nicht wieder machen! + dialog: + - Ich habe eine Aufgabe für dich! + - Ich brauche deine Hilfe! + - |- + Gut, das du hier bist, + wir brauchen Hilfe! + farewell: + - Ab mit dir! + - Vergiss mich nicht! + - Komme bald zurück! +primis_frostcone: + name: '&bFrostkegel' + role: '&9Kartograph (Gamer)' + dialog: + - Hoffentlich genießt du die Landkarte! + - Es ist ein mit Schnee bedeckter Tannenzapfen. + - Ist Primis schon draußen? + farewell: + - Viel Spaß! +primis_gladius_guard_1: + name: '&2Stadtwache' + role: '&a' + greetings: + - Einen Schritt nach dem anderen! + - Verstärkungen? + - Verdammte invasoren! + - Pass auf deinen Rücken auf! + - Seien Sie vorsichtig. +primis_gladius_guard_2: + name: '&2Stadtwache' + role: '&a' + greetings: + - Pass auf wo du hintrittst! + - Verstärkung? + - Verdammte Eindringlinge! + - Pass auf! + - Sei vorsichtig. +primis_gladius_guard_3: + name: '&2Stadtwache' + role: '&a' + greetings: + - Pass auf wo du hintrittst! + - Verstärkung? + - Verdammte Eindringlinge! + - Pass auf! + - Sei vorsichtig. +primis_gladius_guard_4: + name: '&2Stadtwache' + role: '&a' + greetings: + - Pass auf wo du hintrittst! + - Verstärkung? + - Verdammte Eindringlinge! + - Pass auf! + - Sei vorsichtig. +primis_gladius_lord: + name: '&4General Hasta' + role: '&c' + greetings: + - Bist du hier um zu helfen? + - Es ist eine Kriegszone da draußen! + dialog: + - Sie kamen in der Nacht! + - Wir haben sie nie kommen sehen! + - Wo bleiben unsere Verstärkungen? + farewell: + - Pass auf! + - Pass auf wo du hintrittst! +primis_gladius_quartermaster: + name: '&6Cibus' + role: '&c' + greetings: + - Bist du hier um zu helfen? + - Es ist eine Kriegszone da draußen! + dialog: + - Sie kamen in der Nacht! + - Wir haben sie nie kommen sehen! + - Wo bleiben unsere Verstärkungen? + farewell: + - Pass auf! + - Pass auf wo du hintrittst! +primis_gladius_strategist: + name: '&6Belli' + role: '&c' + greetings: + - Bist du hier um zu helfen? + - Es ist eine Kriegszone da draußen! + dialog: + - Sie kamen in der Nacht! + - Wir haben sie nie kommen sehen! + - Wo bleiben unsere Verstärkungen? + farewell: + - Pass auf! + - Pass auf wo du hintrittst! +primis_groves_nemus_leader: + name: '&3König Nemian' + role: '&c' + dialog: + - Was bringt dich unter den Hügel? + - Woher kommst du? + - |- + Hast du unsere + leckeren Glühbeeren probiert? + farewell: + - Bis zum nächsten Mal, dann. +primis_ice_village_fisherman_boat: + name: '&3Theopropides Nero' + role: '&3' + greetings: + - Fischertag! + dialog: + - Ein kühler Tag zum Angeln. + - Sie beißen nicht. + - Nur geduldig sein. + farewell: + - Fallen Sie nicht in\ndas Wasser! +primis_ice_village_friendly_villager: + name: '&7Rutilia Placidus' + role: '&3' + greetings: + - Tach! + dialog: + - Alter\nwird mich nicht verlangsamen! + - Die gute\nStimmung ist wichtig. + - In der Hoffnung, bald\nSchnee zu haben. + farewell: + - Bis bald! +primis_ice_village_generic_npc_1: + name: '&3Albertus Vitalis' + role: '&3' + greetings: + - Wie geht es. + dialog: + - Nichts geht über ein gutes Bier! + farewell: + - Tschüss. +primis_ice_village_generic_npc_10: + name: '&3Trebatia Cornix' + role: '&3' + greetings: + - In Ordnung. + dialog: + - Yep, hab es. + - Ich verstehe... + - Oh! + farewell: + - Ich werde es beim nächsten Mal\nversuchen. +primis_ice_village_generic_npc_11: + name: '&3Albatia Lateranus' + role: '&3' + greetings: + - Violett besuchen? + dialog: + - Keine Schwierigkeiten machen. + farewell: + - Später Fremder. +primis_ice_village_generic_npc_12: + name: '&3Hostilia Carantus' + role: '&3' + greetings: + - Hallo. + dialog: + - Ich war gerade\nam gehen. + farewell: + - Auf Wiedersehen. +primis_ice_village_generic_npc_13: + name: '&3Vagennia Sejanus' + role: '&3' + greetings: + - Hallo. + dialog: + - Was bringt dich\nzu den Docks? + farewell: + - Bis später. +primis_ice_village_generic_npc_14: + name: '&3Dinia Vettonius' + role: '&3' + greetings: + - Hi.. + dialog: + - Ein weiterer Tag... + farewell: + - '...' +primis_ice_village_generic_npc_15: + name: '&3Sceledrus Marcallas' + role: '&3' + greetings: + - Hi.. + dialog: + - Ein weiterer Tag... + farewell: + - '...' +primis_ice_village_generic_npc_16: + name: '&3Fridericus Castinus' + role: '&3' + greetings: + - Hi.. + dialog: + - Ein weiterer Tag... + farewell: + - '...' +primis_ice_village_generic_npc_17: + name: '&3Cario Fimbria' + role: '&3' + greetings: + - Hi.. + dialog: + - Ein weiterer Tag... + farewell: + - '...' +primis_ice_village_generic_npc_18: + name: '&3Piscatores Laevinus' + role: '&3' + greetings: + - Hi.. + dialog: + - Ein weiterer Tag... + farewell: + - '...' +primis_ice_village_generic_npc_19: + name: '&3Monkerius Vitalis' + role: '&3' + greetings: + - Gejagt? + dialog: + - Zeit zum Jagen gehen. + farewell: + - Auf bald. +primis_ice_village_generic_npc_2: + name: '&3Luxuria Tyranus' + role: '&3' + greetings: + - Wie geht es. + dialog: + - Einer mehr! + farewell: + - Auf Wiedersehen. +primis_ice_village_generic_npc_3: + name: '&3Aurelio Nigidius' + role: '&3' + greetings: + - Hey Du. + dialog: + - Was für ein Anblick! + farewell: + - Auf wiedersehen. +primis_ice_village_generic_npc_4: + name: '&3Lysidamus Paratus' + role: '&3' + greetings: + - Für einen Spaziergang draußen? + dialog: + - Ich könnte mir nicht vorstellen,\nirgendwo zu leben\n ohne Schnee. + - Fängt an zu frieren. + farewell: + - Bis später. +primis_ice_village_generic_npc_5: + name: '&3Simo Proceus' + role: '&3' + greetings: + - Was für eine Aussicht! + dialog: + - Ich liebe das Klettern. + - Schaue dir all die Fische an! + farewell: + - Yep. +primis_ice_village_generic_npc_6: + name: '&3Dordalus Marullinus' + role: '&3' + greetings: + - Willkommen in der Kneipe! + dialog: + - Zeit, um\nmeine Finger aufzuwärmen. + - Schön und warm. + farewell: + - Lass dich\nnicht von der Kälte erwischen. +primis_ice_village_generic_npc_7: + name: '&3Tranio Silvanus' + role: '&3' + greetings: + - Irgendwo hier.. + dialog: + - Wo ist es. + farewell: + - Ich war sicher, dass ich es hier\ngelassen habe. +primis_ice_village_generic_npc_8: + name: '&3Milonia Trebellius' + role: '&3' + greetings: + - Willkommen in unserem\nDorf! + dialog: + - Ich bin sicher hungrig. + - Könnte nun\netwas Lachs vertragen. + farewell: + - Auf bald. +primis_ice_village_generic_npc_9: + name: '&3Barria Brocchus' + role: '&3' + greetings: + - Hast du gehört... + dialog: + - Erinnere dich daran\nwenn du das nächste mal\ndein Schwert schwingst. + - Der Schild kann\nmehr sein als Verteidigung. + farewell: + - Verstanden? +primis_ice_village_hunter: + name: '&3Alanus Isatis' + role: '&3' + greetings: + - Hey! + dialog: + - Wir hoffen morgen auf einen guten\nTag. + - Sicher sind einige Razorback\ndraussen in die Saison. + farewell: + - Wir sehen uns. +primis_ice_village_imprisoned_husband: + name: '&3Eleusium Festus' + role: '&3' + greetings: + - '.....' + dialog: + - Ein anderer Tag in einem Käfig... + farewell: + - '.....' +primis_ice_village_jail_caretaker: + name: '&3Philolachen-Triferus' + role: '&3' + greetings: + - Hey Du. + dialog: + - Was noch\nrepariert werden muss. + - Ich sollte\ndie Käfige überprüfen. + farewell: + - Später. +primis_ice_village_jail_guard: + name: '&3Eleusium Festus' + role: '&3' + greetings: + - Auf den\nTurm geklettert, eh. + dialog: + - Alles scheint in Ordnung zu sein. + - Nahezu alles... + farewell: + - Pass auf dich auf. +primis_ice_village_jail_master: + name: '&3Romanus Superbus' + role: '&3' + greetings: + - Willkommen. + dialog: + - Begehen Sie kein Verbrechen, wenn\nsie die Zeit nicht aufbringen können. + - Verbrechen zahlt sich nicht aus. + farewell: + - Bis später. +primis_ice_village_leader: + name: '&3Glacies Prinzipien' + role: '&3' + greetings: + - Hey. + dialog: + - Darn Ice Elemental! + - Zu viele Probleme... + - Wie sollen wir die Versuche\njetzt abschließen. + farewell: + - Auf wiedersehen. +primis_ice_village_lighthouse_keeper: + name: '&3Severinus Martius' + role: '&3' + greetings: + - Well met stranger. + dialog: + - Calm day today. + - Watch out for\nthe Ursus! + farewell: + - Take it easy. +primis_ice_village_missing_daughter: + name: '&3Cornelia Ennodius' + role: '&3' + greetings: + - Hilfe... + dialog: + - Geh weg, geh weg,\nGEH WEG! + - Sie sind nicht\necht... + - Schau einfach\nnicht nach ihnen Cornelia. + farewell: + - Auf Wiedersehen. +primis_ice_village_prisoner: + name: '&3Adrius Calpornius' + role: '&3' + greetings: + - Ich bin unschuldig! + dialog: + - Hier gehöre ich \nnicht hin!!! + farewell: + - Hol' mich hier raus! +primis_ice_village_pubkeeper: + name: '&3Grania Cecilius' + role: '&3' + greetings: + - Welcome! + dialog: + - Coming right up! + - Try our black ale! + - Need a drink? + farewell: + - One coming up! +primis_ice_village_tower_squatter: + name: '&3Modestus Eulogius' + role: '&3' + greetings: + - Die Geräusche! + dialog: + - So viel Geschrei! + - Ich versuche nur\nden Frieden zu genießen. + farewell: + - Auf Wiedersehen. +primis_ice_village_violet: + name: '&5Domina Violet' + role: '&d' + greetings: + - Habe ich\nnach deiner Meinung gefragt? + dialog: + - Fühlt sich gut an,\nes rauszubekommen. + - Sie werden bezahlen, \nwährend ich einnehme. + farewell: + - Nein, das ist es, was ich dachte. +primis_ice_village_worried_father: + name: '&3Sparax Ennodius' + role: '&3' + greetings: + - Ich hoffe, sie ist in Ordnung... + dialog: + - Bitte lass unser Mädchen\nsicher sein. + farewell: + - Auf Wiedersehen. +primis_ice_village_worried_mother: + name: '&3Sparax Ennodius' + role: '&3' + greetings: + - Wohin ging sie. + dialog: + - Hmm, habe die Spur verlor. + farewell: + - Servus. +primis_ice_village_worried_wife: + name: '&3Titia Calenus' + role: '&3' + greetings: + - Hiya! + dialog: + - Schöne und saubere Betten. + - Habe ich etwas verpasst? + - Noch eine Truhe sortiert. + farewell: + - Tschö! +primis_magmaguy: + name: '&4Magmaguy' + role: '&cLeitender Entwickler (Nicht-Spieler)' + dialog: + - Hoffentlich genießen Sie die Karte! + farewell: + - Viel Spaß! +primis_mountain_guide: + name: '&4Petrae' + role: '&c' + greetings: + - Willkommen in unserem Dorf! + dialog: + - |- + Frage nicht, was dieses Dorf für dich tun kann, + frag lieber, was du für dieses Dorf tun kannst! + - Willkommen Aussenseiter + - Brauchst du etwas? + - |- + Du bist nicht hier aus der Gegend oder? + farewell: + - Ab mit dir! + - Komme bald zurück! +primis_mountain_guide_2: + name: '&4Petrae' + role: '&c' + greetings: + - Willkommen in unserem Dorf! + dialog: + - |- + Frage nicht, was dieses Dorf für dich tun kann, + frag lieber, was du für dieses Dorf tun kannst! + - Willkommen Aussenseiter + - Brauchst du etwas? + - |- + Du bist nicht hier aus der Gegend oder? + farewell: + - Ab mit dir! + - Komme bald zurück! +primis_nemus_leader: + name: '&3König Nemian' + role: '&c' + dialog: + - Was bringt dich unter den Hügel? + - Woher kommst du? + - |- + Hast du unsere + leckeren Glühbeeren probiert? + farewell: + - Bis zum nächsten Mal, dann. +primis_ogre_mines_escaped_miner: + name: '&cFugit Fossores' + role: '&c' + greetings: + - Ich kann es nicht glauben! + - Sie sind überall! + - Könntest du mir zur Hand gehen? + dialog: + - Ich habe eine Aufgabe für dich! + - Ich brauche deine Hilfe! + farewell: + - Ab mit dir! + - Sei dort vorsichtig! + - Pass auf dich auf! +primis_ogre_mines_lone_miner: + name: '&cFortis Fossores' + role: '&c' + greetings: + - Endlich, etwas Hilfe! + - Lass sie dich nicht sehen! + - Hilf' mir! + dialog: + - Ich habe eine Aufgabe für dich! + - Ich brauche deine Hilfe! + farewell: + - Ab mit dir! + - Zurück zum Bergbau für mich! + - Pass auf dich auf! +primis_ogre_mines_old_miner: + name: '&cVetus Fossores' + role: '&c' + greetings: + - Hallo, du da! + - Du siehst ein wenig verloren aus! + - Was bringt Sie hierher? + dialog: + - Ich habe eine Aufgabe für dich! + - Ich brauche deine Hilfe! + farewell: + - Ab mit dir! + - Lassen Sie sich nicht von den Milben beißen! + - Passen Sie auf sich auf! +primis_ogre_mines_panicked_miner: + name: '&cMetus' + role: '&c' + greetings: + - Die Mine ist überrannt! + dialog: + - Das sind Oger überall! + - Kannst du mir helfen? + farewell: + - Sei vorsichtig! +primis_pontis_citizen_1: + name: '&7Agorastocles Gorgonius' + role: '&8Pontis Bewohner' + dialog: + - Warst du schon bei der Sternwarte? + - Woher kommst du? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_10: + name: '&7Pardalisca Saunio' + role: '&8Pontis Bewohner' + dialog: + - Warst du schon bei der Sternwarte? + - Woher kommst du? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_11: + name: '&7Sobersides Colias' + role: '&8Pontis Bewohner' + dialog: + - Warst du schon bei der Sternwarte? + - Woher kommst du? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_12: + name: '&7Saturio Caepio' + role: '&8Pontis Bewohner' + dialog: + - Warst du schon bei der Sternwarte? + - Woher kommst du? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Man sieht sich! + - Lebewohl! +primis_pontis_citizen_13: + name: '&7Chrysalus Trebonius' + role: '&8Pontis Bewohner' + dialog: + - Warst du schon bei der Sternwarte? + - Woher kommst du? + - Du siehst nicht aus als wärst du von hier... + - Es ist ein wundervoller Tag. + farewell: + - Man sieht sich! + - Lebe wohl! +primis_pontis_citizen_14: + name: '&7Toxilus-Micon' + role: '&8Pontis Bewohner' + dialog: + - Warst du schon bei der Sternwarte? + - Woher sind sie gekommen? + - Du siehst nicht aus als wärst du von hier... + - Es ist ein wundervoller Tag. + farewell: + - Wir sehen uns! + - Auf bald! +primis_pontis_citizen_15: + name: '&7Phronesium Viridio' + role: '&8Pontis Bewohner' + dialog: + - Warst du schon bei der Sternwarte? + - Woher sind Sie gekommen? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_16: + name: '&7Aurelio Zoilus' + role: '&8Pontis Resident' + dialog: + - Warst du schon bei der Sternwarte? + - Woher sind Sie gekommen? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_17: + name: '&7Diniarchus Nelius' + role: '&8Pontis Resident' + dialog: + - Warst du schon bei der Sternwarte? + - Woher sind Sie gekommen? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_18: + name: '&7Cleostrata Senopius' + role: '&8Pontis Resident' + dialog: + - Warst du schon bei der Sternwarte? + - Woher sind Sie gekommen? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_19: + name: '&7Georgius Sorio' + role: '&8Pontis Resident' + dialog: + - Warst du schon bei der Sternwarte? + - Woher sind Sie gekommen? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_2: + name: '&7Franciscus Crispian' + role: '&8Pontis Resident' + dialog: + - Warst du schon bei der Sternwarte? + - Woher sind Sie gekommen? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_20: + name: '&7Epidicus Silvanus' + role: '&8Pontis Resident' + dialog: + - Warst du schon bei der Sternwarte? + - Woher sind Sie gekommen? + - Du siehst nicht aus als wärst du von hier... + - Es ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_21: + name: '&7Pleusicles Marcellinus' + role: '&8Pontis Bewohner' + dialog: + - Warst du schon bei der Sternwarte? + - Woher sind sie gekommen? + - Du siehst nicht aus als wärst du von hier... + - Es ist ein wundervoller Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_22: + name: '&7Plesidippus Nerva' + role: '&8Pontis Bewohner' + dialog: + - Warst du schon bei der Sternwarte? + - Woher sind sie gekommen? + - Du siehst nicht aus als wärst du von hier... + - Es ist ein wundervoller Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_23: + name: '&7Plesidippus Megellus' + role: '&8Pontis Bewohner' + dialog: + - Warst du schon bei der Sternwarte? + - Woher kommst du? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_24: + name: '&7Fridericus Saloninus' + role: '&8Pontis Bewohner' + dialog: + - Warst du schon bei der Sternwarte? + - Woher kommst du? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_25: + name: '&7Curculio Zosimus' + role: '&8Pontis Bewohner' + dialog: + - Warst du schon bei der Sternwarte? + - Woher kommst du? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_26: + name: '&7Demipho Sylvius' + role: '&8Pontis Bewohner' + dialog: + - Warst du schon bei der Sternwarte? + - Woher kommst du? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_27: + name: '&7Peniculus Nemesius' + role: '&8Pontis Bewohner' + dialog: + - Warst du schon bei der Sternwarte? + - Woher kommst du? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_28: + name: '&7Tyndarus Augustalis' + role: '&8Pontis Bewohner' + dialog: + - Warst du schon bei der Sternwarte? + - Woher kommst du? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_29: + name: '&7Sulpicio Panthera' + role: '&8Pontis Bewohner' + dialog: + - Warst du schon bei der Sternwarte? + - Woher kommst du? + - Du siehst nicht aus als wärst du von hier... + - Es ist ein wundervoller Tag. + farewell: + - Wi sehen uns! + - Bis bald! +primis_pontis_citizen_3: + name: '&7Tycho Sellic' + role: '&8Pontis Bewohner' + dialog: + - Wart du schon bei der Sternwarte? + - Woher sind sie gekommen? + - Du siehst nicht aus als wärst du von hier... + - Es ist ein wundervoller Tag. + farewell: + - Wir sehen uns! + - Bis bald! +primis_pontis_citizen_30: + name: '&7Melaenis Gelasius' + role: '&8on&8Pontis Bewohner' + dialog: + - Warst du schon bei der Sternwarte? + - Woher sind sie gekommen? + - Du siehst nicht aus als wärst du von hier... + - Es ist ein wundervoller tag Heute. + farewell: + - Wir sehen uns! + - Bis bald! +primis_pontis_citizen_31: + name: '&7Tyndarus Columbanus' + role: '&8Pontis Bewohner' + dialog: + - Warst du schon bei der Sternwarte? + - Woher sind sie hergekommen? + - Du siehst nicht aus als wärst du von hier... + - Es ist ein wundervoller Tag. + farewell: + - Wir sehen uns! + - Bis bald! +primis_pontis_citizen_32: + name: '&7Antamonides Cerinthus' + role: '&8Pontis Bewohner' + dialog: + - Wart du schon bei der Sternwarte? + - Woher sind sie gekommen? + - Du siehst nicht aus als wärst du von hier... + - Es ist ein wundervoller Tag. + farewell: + - Wir sehen uns! + - Auf bald! +primis_pontis_citizen_33: + name: '&7Lesbonicus Momus' + role: '&8Pontis Bewohner' + dialog: + - Wart du schon bei der Sternwarte? + - Woher sind sie gekommen? + - Du siehst nicht aus als wärst du von hier... + - Es ist ein wundervoller Tag. + farewell: + - Man sieht sich! + - Auf bald! +primis_pontis_citizen_34: + name: '&7Fridericus Saloninus' + role: '&8Pontis Bewohner' + dialog: + - Wart du schon bei der Sternwarte? + - Woher sind sie gekommen? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_35: + name: '&7Anterastilis Fabricius' + role: '&8Pontis Resident' + dialog: + - Warst du schon bei der Sternwarte? + - Woher kommst du? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_36: + name: '&7Tyndarus Augustalis' + role: '&8Pontis Resident' + dialog: + - Warst du schon bei der Sternwarte? + - Woher kommst du? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_37: + name: '&7Modestus Aper' + role: '&8Pontis Resident' + dialog: + - Warst du schon bei der Sternwarte? + - Woher kommst du? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_38: + name: '&7Henricus Crassus' + role: '&8Pontis Resident' + dialog: + - Warst du schon bei der Sternwarte? + - Woher kommst du? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_39: + name: '&7Franciscus Tancinus' + role: '&8Pontis Resident' + dialog: + - Warst du schon bei der Sternwarte? + - Woher kommst du? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_4: + name: '&7Advocati Micon' + role: '&8Pontis Resident' + dialog: + - Warst du schon bei der Sternwarte? + - Woher kommst du? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_40: + name: '&7Phygia Aurelius' + role: '&8Pontis Resident' + dialog: + - Warst du schon bei der Sternwarte? + - Woher sind Sie gekommen? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_5: + name: '&7Advocati Micon' + role: '&8Pontis Resident' + dialog: + - Warst du schon bei der Sternwarte? + - Woher sind Sie gekommen? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_6: + name: '&7Messenio Rectus' + role: '&8Pontis Resident' + dialog: + - Warst du schon bei der Sternwarte? + - Woher sind Sie gekommen? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_7: + name: '&7Hadrius Donicus' + role: '&8Pontis Resident' + dialog: + - Warst du schon bei der Sternwarte? + - Woher sind Sie gekommen? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_citizen_8: + name: '&7Sulpicio Sejanus' + role: '&8Pontis Resident' + dialog: + - Warst du schon bei der Sternwarte? + - Woher sind Sie gekommen? + - Du siehst nicht aus als wärst du von hier... + - Es ist ein wundervoller Tag. + farewell: + - Wir sehen uns! + - Auf bald! +primis_pontis_citizen_9: + name: '&7Stasimus Mutilus' + role: '&8Pontis Bewohner' + dialog: + - Warst du schon bei der Sternwarte? + - Woher kommst du? + - Du siehst nicht aus als wärst du von hier... + - Heute ist ein großartiger Tag. + farewell: + - Wir sehen uns! + - Auf Bald! +primis_pontis_dockworker_1: + name: '&3Pontis-Schiffskamerad' + role: '&8Dockarbeiter' + dialog: + - Viele Vorräte, die bewegt werden müssen! + - Aufgepasst! + - Kommt durch. + farewell: + - Auf Wiedersehen! +primis_pontis_dockworker_10: + name: '&3Pontis-Schiffskamerad' + role: '&8Dockarbeiter' + dialog: + - Viele Vorräte, die bewegt werden müssen! + - Aufgepasst! + - Kommt durch. + farewell: + - Auf Wiedersehen! +primis_pontis_dockworker_2: + name: '&3Pontis-Schiffskamerad' + role: '&8Dockarbeiter' + dialog: + - Viele Vorräte, die bewegt werden müssen! + - Aufgepasst! + - Kommt durch. + farewell: + - Auf Wiedersehen! +primis_pontis_dockworker_3: + name: '&3Pontis-Schiffskamerad' + role: '&8Dockarbeiter' + dialog: + - Viele Vorräte, die bewegt werden müssen! + - Aufgepasst! + - Kommt durch. + farewell: + - Auf Wiedersehen! +primis_pontis_dockworker_4: + name: '&3Pontis-Schiffskamerad' + role: '&8Dockarbeiter' + dialog: + - Viele Vorräte, die bewegt werden müssen! + - Aufgepasst! + - Kommt durch. + farewell: + - Auf Wiedersehen! +primis_pontis_dockworker_5: + name: '&3Pontis-Schiffskamerad' + role: '&8Dockarbeiter' + dialog: + - Viele Vorräte, die bewegt werden müssen! + - Aufgepasst! + - Kommt durch. + farewell: + - Auf Wiedersehen! +primis_pontis_dockworker_6: + name: '&3Pontis-Schiffskamerad' + role: '&8Dockarbeiter' + dialog: + - Viele Vorräte, die bewegt werden müssen! + - Aufgepasst! + - Kommt durch. + farewell: + - Auf Wiedersehen! +primis_pontis_dockworker_7: + name: '&3Pontis-Schiffskamerad' + role: '&8Dockarbeiter' + dialog: + - Viele Vorräte, die bewegt werden müssen! + - Aufgepasst! + - Kommt durch. + farewell: + - Auf Wiedersehen! +primis_pontis_dockworker_8: + name: '&3Pontis-Schiffskamerad' + role: '&8Dockarbeiter' + dialog: + - Viele Vorräte, die bewegt werden müssen! + - Aufgepasst! + - Kommt durch. + farewell: + - Auf Wiedersehen! +primis_pontis_dockworker_9: + name: '&3Pontis-Schiffskamerad' + role: '&8Dockarbeiter' + dialog: + - Viele Vorräte, die bewegt werden müssen! + - Aufgepasst! + - Kommt durch. + farewell: + - Auf Wiedersehen! +primis_pontis_enhancer: + name: '&7Meliorem' + role: '&8' + greetings: + - Bereit zum Upgrade? + - Hast du Schrott? + - Lass uns upgraden! + dialog: + - Ich werde für Schrott verbessern! + - Bring mir Schrott! + - Verbessere deine Ausrüstung für Schrott! +primis_pontis_gardener_1: + name: '&eGorgines Asina' + role: '&8Gärtner' + dialog: + - Sind die Blumen nicht hübsch? + - Siehe, mein Meisterwerk! + - Die Blumen blühen. + farewell: + - Bitte treten Sie nicht auf die schönen Blumen. + - Sei bitte vorsichtig! +primis_pontis_gardener_2: + name: '&ePiscatores Orissus' + role: '&8Gärtner' + dialog: + - Sind die Blumen nicht hübsch? + - Siehe, mein Meisterwerk! + - Die Blumen blühen. + farewell: + - Bitte treten Sie nicht auf die schönen Blumen. + - Sei bitte vorsichtig! +primis_pontis_gardener_3: + name: '&eAlcesimus Abito' + role: '&8Gärtner' + dialog: + - Sind die Blumen nicht hübsch? + - Siehe, mein Meisterwerk! + - Die Blumen blühen. + farewell: + - Bitte treten Sie nicht auf die schönen Blumen. + - Sei bitte vorsichtig! +primis_pontis_gardener_4: + name: '&ePyrgopolynices Perpenna' + role: '&8Gärtner' + dialog: + - Sind die Blumen nicht hübsch? + - Siehe, mein Meisterwerk! + - Die Blumen blühen. + farewell: + - Bitte treten Sie nicht auf die schönen Blumen. + - Sei bitte vorsichtig! +primis_pontis_gardener_5: + name: '&eLemniselenis Gelasius' + role: '&8Gärtner' + dialog: + - Sind die Blumen nicht hübsch? + - Siehe, mein Meisterwerk! + - Die Blumen blühen. + farewell: + - Bitte treten Sie nicht auf die schönen Blumen. + - Sei bitte vorsichtig! +primis_pontis_gardener_6: + name: '&eLysimachus Sulinus' + role: '&8Gärtner' + dialog: + - Sind diese Blumen nicht hübsch? + - Siehe mein Meisterwerk! + - Die Blumen blühen. + farewell: + - Bitte treten Sie nicht auf die schönen Blumen. + - Sei bitte vorsichtig! +primis_pontis_gardener_7: + name: '&eStrobilus Farus' + role: '&8Gärtner' + dialog: + - Sind die Blumen nicht hübsch? + - Siehe, mein Meisterwerk! + - Die Blumen blühen. + farewell: + - Bitte treten Sie nicht auf die schönen Blumen. + - Sei bitte vorsichtig! +primis_pontis_groves_catacombs_npc: + name: '&7Inaequaliter Hyaena' + role: '&7' + greetings: + - Psssst! + dialog: + - Ich hörte, es gibt einen großen\nSchatz zu erlangen! + - Etwas Wunderbares erwartet dich,\nwenn du eintritst! + - Du solltest dich\nan diesen Ort wagen... + - Warum nicht hineingehen? + - Du solltest hineingehen... + - Keine Sorge, es ist\nvollkommen sicher. + - Keine Gefahr. Ich schwöre! + - Werfen Sie einen Blick hinein. + - Du solltest\ndiesen Ort besuchen! + - He he he he he... + - Was ist, wenn jemand\nda drinnen Hilfe benötigt. + - Gehe hinein, geh nur! + - Sind Sie nicht neugierig? + - Sicher solltest du\neinen Blick hinein werfen. + farewell: + - Hehehe, bis Später! +primis_pontis_groves_generic_npc_1: + name: '&2Sycophanta Mucius' + role: '&2' + greetings: + - Mir geht es gut! + dialog: + - Mach dir keine Sorgen um mich. + - Mein Bruder wird kommen um mich retten. + - Sie werden mich nicht essen. + - Ich versichere Ihnen, dass ich in Ordnung sein werde. + farewell: + - Wir spinnen uns Später! +primis_pontis_groves_generic_npc_10: + name: '&2Hostilia Metunus' + role: '&2' + greetings: + - Hallo. + dialog: + - Ist ihnen auch langweilig? + - Ugh, es muss etwas zu tun geben. + - Vielleicht sollte ich mehr Drinks brauen. + farewell: + - Bis später! +primis_pontis_groves_generic_npc_11: + name: '&2Tortilia Getha' + role: '&2' + greetings: + - Hallo. + dialog: + - Mein Mann macht die besten Torten. + - Willst du ein Scheibe? + - So lecker und saftig! + farewell: + - Auf Wiedersehen! +primis_pontis_groves_generic_npc_12: + name: '&2Consentia Apellinus' + role: '&2' + greetings: + - Oh, hallo. + dialog: + - Hier so gut wie neu! + - Ich muss sichergehen, dass das Licht sie fern hält. + - Eine weitere Laterne wurde repariert... + farewell: + - Lasst die Spinnen nicht beißen! +primis_pontis_groves_generic_npc_13: + name: '&2Novia Senecius' + role: '&2' + greetings: + - Hi! + dialog: + - Oh, habe nicht erwartete, jemanden hier zu sehen. + - Musst nur schnell sein und sie können dich nicht kriegen. + - Die Spinnen halten mich nicht auf. + - Dies ist mein Lieblings-Ruheplatz. + farewell: + - Pass auf dich auf. +primis_pontis_groves_generic_npc_14: + name: '&2Maximia Priscus' + role: '&2' + greetings: + - Pstttt... + dialog: + - Du könntest\nvon den Elfen stehlen... + - Geht wieder in mein\nBesitz, wenn\nsie schlafen. + - Hat es hier durch\ngeschafft. + - Sie haben mich nie\nkommen sehen. + farewell: + - Halten Sie es herunter. +primis_pontis_groves_generic_npc_15: + name: '&2Herennia Exsupereus' + role: '&2' + greetings: + - Hallo. + dialog: + - Gerade aufwachen. + - Es wird ein guter\nTag werden, das spüren ich. + farewell: + - Ciao. +primis_pontis_groves_generic_npc_16: + name: '&2Atria Maursus' + role: '&2' + greetings: + - Grüße. + dialog: + - Nicht sicher, wie der König\nvon mir alles\nerwartet hat... + - So viel Arbeit.. + - Beschäftigt, beschäftigt und beschäftigt. + - Dieser Papierkram\nwird sich nicht von selbst erledigen. + farewell: + - Auf Wiedersehen. +primis_pontis_groves_generic_npc_17: + name: '&2Felicius Surius' + role: '&2' + greetings: + - Grüße! + dialog: + - Wenn du etwas\nbrauchst, sprich mit dem König. + - Entschuldigung, ich bin sehr beschäftigt. + - Keine Zeit für Chat-Chat,\nbitte entschuldige. + farewell: + - Auf wiedersehen. +primis_pontis_groves_generic_npc_2: + name: '&2Sceledrus Fredisius' + role: '&2' + greetings: + - Heya! + dialog: + - Ich fische eigentlich Wanzen. + - Große Wasserwanzen fallen von den Bäumen. + - Ich benutze Baumsäge als Köder. + - Die Wasserwanzen können dem Köder nicht widerstehen! + - Sie sind in der Tat amphibisch. + - Hab sie eingefangen, bevor sie in die Bäume springen. + - Sie sind ziemlich schmackhaft, wenn Sie sie braten. + - Wir hoffen auf einen guten Fang! + farewell: + - Bis Später. +primis_pontis_groves_generic_npc_3: + name: '&2Felicius Surius' + role: '&2' + greetings: + - Hey, wie gehts! + dialog: + - Der Ozean ist so schön. + - Ich könnte hier für Tage stehen. + - Die Spinnen sind sicherlich nervig. + farewell: + - Auf Wiedersehen. +primis_pontis_groves_generic_npc_4: + name: '&2Periplectomenus Burcanius' + role: '&2' + greetings: + - Wilkommen! + dialog: + - Viele Glühbeeren sind übrig. + - Hoffentlich gefällt dir mein kleiner Bauernhof. + - So viele Ranken um die man sich kümmern muss. + farewell: + - Man sieht sich später. +primis_pontis_groves_generic_npc_5: + name: '&2Stephanus Magnus' + role: '&2' + greetings: + - Hey Du! + dialog: + - Haben Sie die Beerenfarm besucht? + - Schöne Zeit für einen Spaziergang. + - Man kann nicht immer nur drinnen sein. + farewell: + - Schönen Tag noch. +primis_pontis_groves_generic_npc_6: + name: '&2Abundantius Rogatus' + role: '&2' + greetings: + - Hallo! + dialog: + - Was bringt dich in unser schönes Loch? + - Du kannst ruhig eine Weile bleiben. + farewell: + - Auf Wiedersehen. +primis_pontis_groves_generic_npc_7: + name: '&2Albanus Ivmarus' + role: '&2' + greetings: + - Immer ruhig... + dialog: + - Was? Ja, mir gehts gut. + - Ich hatte nicht zu viele, niemals. + - Nur eine noch... + - Nur einen Krug noch... + farewell: + - Auf bald. +primis_pontis_groves_generic_npc_8: + name: '&2Bacchis Aventinus' + role: '&2' + greetings: + - Guten Tag oder Abend... + dialog: + - Mir ist gerade so kuschelig. + - Früher gingen wir öfter nach draußen. + - Außerhalb sind dieser Tage zu viele Gefahren. + farewell: + - Gesundheit. +primis_pontis_groves_generic_npc_9: + name: '&2Pasicompsa Getha' + role: '&2' + greetings: + - Komm herein, komm rein! + dialog: + - Willkommen im besten Loch im Hain! + - Baute dieses Loch mit meinen eigenen Händen! + - Ich hoffe, Sie genießen Ihren Aufenthalt! + farewell: + - Komme bald zurück! +primis_pontis_groves_hole_luxuria: + name: '&cLuxuria Gorgonien' + role: '&c' + greetings: + - Hey, wie gehts! + - Hallo! + dialog: + - Im Leben geht es darum, es einfach zu machen. + - Warum Stress. + farewell: + - Besuche uns nochmal! +primis_pontis_groves_hole_phygia: + name: '&cLuxuria Gorgonien' + role: '&c' + greetings: + - Willkommen in meinem Zuhause! + - Hallo! + dialog: + - Wir müssen handeln! + - Zu viele Elfen in unserem Wald. + farewell: + - Besuche uns nochmal! +primis_pontis_groves_lighthouse_generic_npc_1: + name: '&3Eleusium Festus' + role: '&3' + greetings: + - Was bringt Sie hierher? + dialog: + - Gotta stelle sicher, dass der\nLeuchtturm funktioniert. + - Schön, jemanden\nzu sehen. + farewell: + - Auf wiedersehen. +primis_pontis_groves_lighthouse_generic_npc_2: + name: '&3Caelia Zoilus' + role: '&3' + greetings: + - Hey. + dialog: + - Ich hoffe, er wird\nin Ordnung sein. + - Mein Zug, um\nüber das Licht zu sehen. + - Wir haben fast\nnichts mehr was wir essen können. + farewell: + - Tschüssi. +primis_pontis_groves_lighthouse_sick_man: + name: '&3Alanus Secundas' + role: '&c' + dialog: + - Mir geht es nicht so gut + - Hoffentlich erhole ich mich bald. + - Na ja, ich fühle mich ein bisschen besser. + - Wir brauchen mehr Nahrungsmittel. + farewell: + - Auf bald. +primis_pontis_groves_parkour_npc_1: + name: '&3Posuere Hominem' + role: '&c' + dialog: + - Bereit für eine Herausforderung? + - Du glaubst, du hast das bekommen, was es braucht? + - Möchtest du es schwingen lassen? + - Du bist ein verrückter Kerl? + - Kein Schwindel! + farewell: + - Man riecht sich. +primis_pontis_groves_parkour_npc_2: + name: '&cIdoneitatem Hominem' + role: '&3' + dialog: + - Das war beeindruckend! + - Versuchen und schlagen meinen Rekord von 1m 47s. + - Kein Betrug! + farewell: + - Wir sehen Sie später wieder. +primis_pontis_guard: + name: '&cPontis-Wache' + role: '&8' + greetings: + - Möchtest du deine Ausrüstung verbessern? + dialog: + - Verloren? Folgen Sie den Brückenfarben. + - Jeder Brückenweg hat mindestens eine Farbe! + - Bleiben Sie aus den Schwierigkeiten heraus! + - Keine Schwierigkeiten machen! + - Pontis wurde wie ein Labyrinth zur Verteidigung gebaut. + - Die Brückendecken zeigen die Farbe dieses Weges! +primis_pontis_guard_1: + name: '&cPontis-Wache' + role: '&8' + greetings: + - Möchtest du deine Ausrüstung verbessern? + dialog: + - Verlaufen? Folgen Sie den Brückenfarben. + - Jeder Brückenweg hat mindestens eine Farbe! + - Halten sie sich von Schwierigkeiten fern! + - Keine Schwierigkeiten machen! + - Pontis wurde wie ein Labyrinth zur Verteidigung gebaut. + - Die Brückendecken zeigen die Farbe dieses Weges! +primis_pontis_guard_2: + name: '&cPontis-Wache' + role: '&8' + greetings: + - Hallo! + dialog: + - Auf diesem Weg zum Shogun! +primis_pontis_guard_rat: + name: '&cPontis-Wache' + role: '&8' + greetings: + - Verdammte Ratten! + dialog: + - Schmutzige Ratten!!! + - Hold still,\ndarn you! + - Stop dodging\nmy attacks! + - Fast eine erwischt! + - Stirb doch endlich! + - Warum stirbst du nicht endlich!!! + - You can't dodge\nforever! + - Nächster Treffer! + - Du bist so gut wie tot! + - How dare you\ndodge! + - Fast! +primis_pontis_guard_rat_at_wormhole: + name: '&cPontis-Wache' + role: '&8' + greetings: + - Was dauert\nda so lange. + dialog: + - Wir haben das\nunter Kontrolle. + - Machen Sie sich keine Sorgen,\nder Elite-Wächter\nist an dem Fall! +primis_pontis_guard_shogun_1: + name: '&4Königlicher Wächter' + role: '&8' + dialog: + - Nicht in Schwierigkeiten geraten. + - Beachtet mich nicht, ich bewahre nur den Frieden. + - Keine Lustigen Angelegenheiten hier. + - Ich werde dich im Auge behalten, Abenteurer. + - Keine Fragen und niemand wird verletzt! + - Habe keine Zeit für sinnlose Sachen. + farewell: + - Sichere Reisen, Abenteurer. +primis_pontis_guard_shogun_1_cat_quest: + name: '&4Königlicher Wächter' + role: '&8' + dialog: + - Bring uns nicht in Schwierigkeiten. + - Beachtet mich nicht, ich bewahre nur den Frieden. + - Keine Lustigen Angelegenheiten hier. + - Ich werde dich im Auge behalten, Abenteurer. + - Keine Fragen und niemand wird verletzt! + - Habe keine Zeit für sinnlose Sachen. + farewell: + - Sichere Reisen, Abenteurer. +primis_pontis_mille_arena_master_observatory: + name: Stella Hominis + role: + greetings: + - Hallo! + dialog: + - Ich hoffe, viele Sterne zu sehen. + - Solch himmlische Sterne! + - Der Kosmos ruft zu mir. + - Unendliche Möglichkeiten. + - Das uralte Wissen... + - Ich habe Geschichten zu erzählen. + - Wenn Sie nur wüssten... + farewell: + - Mögen die Sterne Sie segnen. +primis_pontis_mille_concerned_shipmate: + name: '&3Delphium Calpurnius' + role: '&8' + dialog: + - Sigh. + - So much for my\nshipments... + farewell: + - Safe travels! +primis_pontis_mille_fields_camp_generic_npc_1: + name: '&cScribonia Ingenvinus' + role: '&c' + dialog: + - Die gefährlichste\nWaffe ist die\nzwischen deinen Ohren. + - Drei Pfeile\nsind alles was ich brauche. + farewell: + - Ich fange sie Später nochmal ab! +primis_pontis_mille_fields_camp_generic_npc_2: + name: '&cValador Lumus' + role: '&c' + dialog: + - Ich habe in\nviele Orte gejagt. + - Reist du auch\nviel? + farewell: + - Möge deine Klinge schnell sein. +primis_pontis_mille_fields_camp_generic_npc_3: + name: '&cPhygia Ahala' + role: '&c' + dialog: + - Es geht nichts besseres wie eine\ngute Jagd! + farewell: + - Pass auf dich auf. +primis_pontis_mille_fields_camp_generic_npc_4: + name: '&cAdrius Paterculus' + role: '&c' + dialog: + - Die Jagd ruft! + farewell: + - Schneller Tod. +primis_pontis_mille_fields_camp_generic_npc_5: + name: '&cCappadox Galerus' + role: '&c' + dialog: + - Schließe dich uns an, Fremder! + farewell: + - Später. +primis_pontis_mille_fields_camp_generic_npc_6: + name: '&cSulpicio Rutilius' + role: '&c' + dialog: + - Hoffnung unser Lager\nbietet dir eine Pause\naus der Wildnis. + farewell: + - Pfiat di. +primis_pontis_mille_fields_camp_generic_npc_7: + name: '&cAquarius Manus' + role: '&c' + dialog: + - Macht mir nichts aus, nur\nholt etwas Wasser. + - Klares blaues Wasser heute. + farewell: + - Tschüsi. +primis_pontis_mille_fields_camp_magmus: + name: '&cMagmus Hypnos' + role: '&4' + dialog: + - Wo ist Volumni... + - Ich hoffe, dass sie nicht mehr in\nSchwierigkeiten ist. + - Ich brauche eine Erholung. + - Wenn es nur mehr\nStunden am Tag gegeben hätte. + - Sprich mit mir, wenn du\nVolumnia gefunden hast. + - So viel Arbeit,\nso wenig Zeit. + - Wieder ein 17 Stunden Tag. + - Ich sorge mich zuviel. + farewell: + - Nie genug Zeit... +primis_pontis_mille_fields_farm_berry_npc: + name: '&9Dordalus Nasica' + role: '&e' + dialog: + - Beeren sind so geschmackvoll! + - Du solltest\nmehr Beeren essen! + - Warum konnten sie\nmeine Beeren stehlen... + farewell: + - Man riecht sich. +primis_pontis_mille_fields_farm_boy_npc: + name: '&9Planesium Victricius' + role: '&e' + dialog: + - So viele Ratten... + - Puh alles\nfertig hier. + - Diese Sache hält besser. + - Noch mehr heben und\nich gehe kaputt. + - Die Aussicht von hier\nist wirklich schön. + - OK, Zurück zur Arbeit! + farewell: + - Probiere einige unserer Beeren aus! +primis_pontis_mille_fields_farm_npc: + name: '&9Milonia Majus' + role: '&e' + dialog: + - Geht weg, verdammte Ratten! + - Hört auf meine Waren zu essen! + - Seufz... + farewell: + - Bis Später. +primis_pontis_mille_fields_farm_well_npc: + name: '&eVolumnia Zoilus' + role: '&c' + dialog: + - Achte auf seine Spucke! + - Sein Speichel ist giftig. + - Bitte hilf mir! + - Ich hoffe, niemand hört\ndavon... + - Ich freue mich, Sie zu sehen! + farewell: + - Wie konnte ich das zulassen. +primis_pontis_mille_fields_windmill_npc_1: + name: '&eDinia Niraemius' + role: '&d' + dialog: + - Viel Weizen zum Verarbeiten! + - Kein Mehl kein Brot. + - Gefällt dir auch Brot? + farewell: + - Bis dann. +primis_pontis_mille_fields_windmill_npc_2: + name: '&eDaemones Maritialis' + role: '&d' + dialog: + - Es ist so schön hier draußen! + - Gefällt dir meine Windmühle? + - Nur hier draussen für eine Pause. + farewell: + - Bis dann. +primis_pontis_mille_fields_windmill_npc_3: + name: '&eAdulescens Lupis' + role: '&d' + dialog: + - Hoffe auf etwas guten Wind! + - Brauchen Sie etwas Mehl? + - Dies ist die beste Windmühle in der Gegend! + farewell: + - Gesundheit. +primis_pontis_mille_general_bromia: + name: '&6Bromkurio' + role: '&6General' + greetings: + - Heil! + dialog: + - Es ist Zeit für Krieg! + farewell: + - Auf wiedersehen! +primis_pontis_mille_general_cylindrus: + name: '&eCylindrus Celatus' + role: '&eGeneral' + greetings: + - Heil! + dialog: + - Es ist nicht genug Zeit! + farewell: + - Auf wiedersehen! +primis_pontis_mille_general_godefridus: + name: '&cGodefridus Novation' + role: '&c' + greetings: + - Grüße! + - Heil! + dialog: + - Jemand muss diese Dokumente\nbringen. + - So viele Kerzen... + farewell: + - Bis dann +primis_pontis_mille_general_rogerius: + name: '&eRogerius Olennius' + role: '&eGeneral' + greetings: + - Heil! + dialog: + - So viel zu tun! + - Ich hoffe, dass diese 4 in Ordnung sind... + farewell: + - Pfiat di! +primis_pontis_mille_lighthouse_man: + name: '&3Hegio Remus' + role: '&c' + dialog: + - Es ist so schön hier oben. + - Die beste Aussicht... + farewell: + - Lebewohl. + - Die Sonnenuntergänge! +primis_pontis_mille_major: + name: '&cFortes Bellator' + role: '&c' + greetings: + - Hallo Reisende! + - Heil! + dialog: + - Diese verdammten Goblins! + farewell: + - Bis bald! +primis_pontis_mille_mew_meowzer: + name: '&aMew Meowzer' + role: '&d' + dialog: + - Meooooww! + - Miau... + - Miiiaaauuuuu... + - Miaauuu. + - MIAU! + farewell: + - Prrr miauu! +primis_pontis_mille_observatory_arena_turn_in: + name: Virgo Dexippus + role: + greetings: + - Servus! + dialog: + - Stella weiß eine Menge. + - Sterne haben so viel zu erzählen. + - Das Licht sagt allen. + farewell: + - Möge der Mond deine Weg beleuchten. +primis_pontis_mille_royal_guard_centurion: + name: '&4Königliches Wach-Zenturion' + role: '&8' + dialog: + - Kein Trödeln! + - Lager einrichten! + - Wo bleiben unsere Verstärkungen? + - Wie viele sind gefallen? + - Wir müssen neu organisieren! + farewell: + - Trete leicht und trage ein großes Schwert. +primis_pontis_mille_scout_1: + name: '&cSyra Ursacius' + role: '&cVerwundeter Späher' + greetings: + - Heil! + dialog: + - Ich kann kaum bleiben... + farewell: + - Tschüssi! +primis_pontis_mille_scout_2: + name: '&cSparax Auxilius' + role: '&cVerwundeter Späher' + greetings: + - Heil! + dialog: + - Diese Schmerz... + farewell: + - Auf Wiedersehen! +primis_pontis_mille_scout_leader: + name: '&cBlepharo Oktavius' + role: '&cAnführer der Späher' + greetings: + - Heil! + dialog: + - Das war zu viel... + farewell: + - Auf Wiedersehen! +primis_pontis_mille_shogun: + name: '&6Navita' + role: '&c' + greetings: + - Ja? + dialog: + - Kann ich euch behilflich sein? + farewell: + - Bewegt euch leise und tragt eine mächtige Waffe bei euch. +primis_pontis_mille_slums_generic_npc_1: + name: '&7Gallicles Rex' + role: '&7' + dialog: + - Es ist nicht viel, aber es ist unser\nkleiner Teil der Stadt + farewell: + - Bis Später. +primis_pontis_mille_slums_generic_npc_2: + name: '&7Gallicles Caelistis' + role: '&7' + dialog: + - Tag für Tag... + farewell: + - '...' +primis_pontis_mille_slums_generic_npc_3: + name: '&7Nicodemus Frontinus' + role: '&7' + dialog: + - Frisches Wasser für\ndas Zuhause. + farewell: + - Der Brunnen dient\nuns gut +primis_pontis_mille_slums_generic_npc_4: + name: '&7Cocus Lucio' + role: '&7' + dialog: + - Hoffentlich hast du\neinen tollen Tag. + farewell: + - Genießen Sie Ihren Aufenthalt. +primis_pontis_mille_slums_generic_npc_5: + name: '&7Cornelia Florius' + role: '&7' + dialog: + - Welchen sollte\nich nehmen... + farewell: + - So viele schöne\nBlumen. +primis_pontis_mille_slums_generic_npc_6: + name: '&7Rutilia Placidus' + role: '&7' + dialog: + - Ich liebe es hier. + - Der Geruch von Heu\nmacht mich glücklich. + - Mein Lieblingsplatz um\nnach einem harten Tag zu entspannen. + farewell: + - Man Stroht sich später! +primis_pontis_mille_slums_npc_1: + name: '&7Lena Lucan' + role: '&7' + dialog: + - Nur ein Laib Brot... + farewell: + - Man wundert sich was der nächste Tag bringt. +primis_pontis_mille_slums_npc_2: + name: '&7Tranio Florens' + role: '&7' + dialog: + - So wie es aussieht ist es okay\nheute eigentlich. + farewell: + - Nacht, sichere dich. +primis_pontis_mille_slums_npc_3: + name: '&7Rufia Tertulus' + role: '&7' + dialog: + - Zumindest etwas\nGutes für\ndie Kinder. + - Nicht viel auf\ndem Markt... + - Ich kann mir das\nnicht leisten. + farewell: + - Bis Später. +primis_pontis_mille_slums_npc_4: + name: '&7Fabia Praetextus' + role: '&7' + dialog: + - Schließe einfach meine Augen\nfür eine Sekunde. + - Werde mir nur kurz vorstellen\nan einem besseren Ort zu sein. + farewell: + - Pfiat di. +primis_pontis_mille_slums_npc_5: + name: '&7Augustina Verrukose' + role: '&7' + dialog: + - So viele Mäuler\nzum füttern. + - Vielleicht ein paar Früchte\nfür die kleinen\nein. + farewell: + - Tschö. +primis_pontis_mines_guard_1: + name: '&cPontis-Wache' + role: '&c' + greetings: + - HÜLFE!!! + dialog: + - Bitte tötet sie! + - Ich habe so Angst. +primis_pontis_mines_guard_2: + name: '&cPontis-Wache' + role: '&c' + greetings: + - SOMEONE BITTE!!! + dialog: + - Ich will nicht sterben! + - Kann nicht mehr halten. +primis_pontis_mines_guard_3: + name: '&cPontis-Wache' + role: '&c' + greetings: + - RETTE MICH!!! + dialog: + - Sind sie verschwunden? + - BRING MICH RAUS HIER! +primis_pontis_outpost_officer: + name: '&4NAME ME' + role: '&8' + dialog: + - I am unfinished! + - There is supposed\nto be an outpost\nhere. + farewell: + - Bye! +primis_pontis_redwoods_injured_lumberjack: + name: '&6Lyco Lupicinus' + role: '&6' + greetings: + - Heyo! + dialog: + - Verdammte Ratten! + - Habe mich nochmal... + farewell: + - Man riecht sich später. +primis_pontis_redwoods_lumberjack: + name: '&6Ligna Crispian' + role: '&6' + greetings: + - Liebe Grüße! + dialog: + - Ich liebe das Aussehen eines gesunden Baums. + - Der braune Baum riecht wirklich sehr. + - |- + Ziemlich sicher, dass ich einen Wolf auf zwei Beinen + gesehen habe, der hier nachts herumschleichte. + farewell: + - Bis zum nächsten Mal, dann. +primis_pontis_redwoods_lumberjack_generic_1: + name: '&6Mulier Proculus' + role: '&6' + greetings: + - Hey-yo! + dialog: + - Ich wünschte, sie würden uns allein lassen. + - 9Perfekt für Plünderung. + farewell: + - Später Tannenzapfen! +primis_pontis_redwoods_lumberjack_generic_10: + name: '&6Piscatores Trenico' + role: '&6' + greetings: + - Gut gemacht! + dialog: + - Haut ab Wölfe! + - Lass mich in Ruhe, verdammtes Fellknäuel! + - Hah! Versuche mich hier oben zu erreichen! + farewell: + - Bis dann! +primis_pontis_redwoods_lumberjack_generic_2: + name: '&6Alanus Hermina' + role: '&6' + greetings: + - Hallo... + dialog: + - Nicht so laut, etwas ruhiger bitte. + - Ich gönne mir nur eine zusätzliche Pause. + - Sag niemanden das ich hier bin. + - Bäume fällen ist so eine anstrengende Arbeit... + farewell: + - Bis Später +primis_pontis_redwoods_lumberjack_generic_3: + name: '&6Lena Triarius' + role: '&6' + greetings: + - Was gibt's! + dialog: + - Stehe hier nur rum und säge! + - Das Betreiben der Säge macht Spaß. + - Pass auf das du dich nicht verletzt. + farewell: + - Ich fange sie Später nochmal ab! +primis_pontis_redwoods_lumberjack_generic_4: + name: '&6Aquila Isatis' + role: '&6' + greetings: + - Wie läuft's! + dialog: + - Verdammte Stämme! + - Nein, nicht so! + - Schwimme besser!!! + - Ja, das wird es tun. + farewell: + - Bis später! +primis_pontis_redwoods_lumberjack_generic_5: + name: '&6Sulpicio Sidonius' + role: '&6' + greetings: + - Hallo! + dialog: + - Nichts geht über ein schönes Feuer! + - Entspanne mich nur nach einem Tag getaner ehrlicher Arbeit. + - Schliess dich uns an! + farewell: + - Bis bald, Freund! +primis_pontis_redwoods_lumberjack_generic_6: + name: '&6Strobilus Clemens' + role: '&6' + greetings: + - Grüße! + dialog: + - Hacken wie ein Biber! + - Die schnellste Axt im Westen. + - Kein Baum ist eine Herausforderung für mich! + farewell: + - Man riecht sich! +primis_pontis_redwoods_lumberjack_generic_7: + name: '&6Candidus Nigellus' + role: '&6' + greetings: + - Grüße! + dialog: + - Schnellste Axt... mein Hintern! + - Nimm sein Geschwafel nicht ernst. + - Herr Große Nummer hat sicherlich einiges zu sagen. + farewell: + - Auf wiedersehen! +primis_pontis_redwoods_lumberjack_generic_8: + name: '&6Strobilus Clemens' + role: '&6' + greetings: + - Ich bin ein bisschen beschäftigt! + dialog: + - Wir müssen die Produktion steigern... + - Wenn wir die Kosten erhöhen... + - Muss mehr Äxte bestellen. + farewell: + - Uh... +primis_pontis_redwoods_lumberjack_generic_9: + name: '&6Martinus Lepontus' + role: '&6' + greetings: + - Oh, hallo! + dialog: + - Du kommst groß runter! + - Ich zeig´s dir! + - Meine Axt, deine Rinde, sie treffen. + - Beginnen Sie mit einem guten Schnitt. + farewell: + - Erschreckte mich... +primis_pontis_redwoods_lumberlord: + name: '&6Magnus Castorea' + role: '&6' + greetings: + - HALLO! + dialog: + - Nichts wie gesundes Holz. + - |- + Für jeden Baum, den wir schneiden, pflanzen einen neuen! + - Große braune Stämme, ja. + farewell: + - WIEDERSEHEN! +primis_pontis_redwoods_reyn: + name: '&6Reynus Protectoris' + role: '&6' + greetings: + - Ich drehe die Hitze auf! + - Hiya! + dialog: + - Stehst du auf Protokolle? + - Ich liebe den Duft von Holzfäller! + farewell: + - Man riecht sich. + - Tschau Tschau! +primis_pontis_scrapper: + name: '&7Fragmentum' + role: '&8' + greetings: + - Hast du etwas zu verschrotten? + - Hast du Schrott? + - Musst du verwerten? + dialog: + - Ich werde alles verschrotten, was du mitbringst! + - Brauchst du Schrott? + - Willst du Schrott? +primis_pontis_smelter: + name: '&7Orbs' + role: '&8' + greetings: + - Möchtest du deine Ausrüstung verbessern? + dialog: + - Brauchst du einen Verbesserungs Orb? + - Ich mache dir Verbesserungsorbs für den Schrott! + - Bring mir Schrott! +primis_sewer_donatello: + name: '&5Donatello' + role: '&dKanalisationsverteidiger' + dialog: + - Was gibt's? + - Wie hast du es geschafft, uns hier unten zu finden? + - Hüte dich vor dem Shredder! + farewell: + - Bis später! +primis_sewer_leonardo: + name: '&1Leonardo' + role: '&9Kanalisationsverteidiger' + dialog: + - Was gibt's? + - Wie hast du es geschafft, uns hier unten zu finden? + - Hüte dich vor dem Shredder! + farewell: + - Bis später! +primis_sewer_michelangelo: + name: '&6Michelangelo' + role: '&eKanalisationsverteidiger' + dialog: + - Was gibt's? + - Wie hast du es geschafft, uns hier unten zu finden? + - Hüte dich vor dem Shredder! + farewell: + - Bis später! +primis_sewer_raphael: + name: '&4Raphael' + role: '&cKanalisationsverteidiger' + dialog: + - Was gibt's? + - Wie hast du es geschafft, uns hier unten zu finden? + - Hüte dich vor dem Shredder! + farewell: + - Bis später! +primis_spa_attendee_1: + name: '&fNatsumi' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_2: + name: '&5Hanako' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_3: + name: '&3Tamika' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_4: + name: '&9Zaphra' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_5: + name: '&4Chie' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_6: + name: '&fKatashi' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_7: + name: '&dAkihiko' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_8: + name: '&6Sheranee' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - Rawr... + - OwO + farewell: + - Have fun! +primis_spa_staff: + name: '&cAozora' + role: '&7' + dialog: + - Enjoy the hot spring! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_staff_2: + name: '&6Rei' + role: '&7' + dialog: + - Enjoy the hot spring! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_terravilla_annoyed_explorer: + name: '&6Dorippa Sarimarcus' + role: '&6' + greetings: + - How's it going. + dialog: + - Not again. + - Stuck once more. + farewell: + - Be seeing you. +primis_terravilla_explorer: + name: '&6Telestis Senna' + role: '&6' + greetings: + - How goes it. + dialog: + - Always so\nbusy. + - Need a bag? + farewell: + - Bye. +primis_terravilla_generic_npc_1: + name: '&6Stephanium Major' + role: '&6' + greetings: + - Welcome to Terravilla! + dialog: + - Watch out for the\nTwo Legged Terrors! + - Here to check out the ruins? + farewell: + - Bye. +primis_terravilla_generic_npc_10: + name: '&6Mallia Galvisius' + role: '&6' + greetings: + - Heyo! + dialog: + - I would rather be in\ndown in the ruins... + - Hog watching to\npass the time. + farewell: + - Laters. +primis_terravilla_generic_npc_11: + name: '&6Papiria Virginius' + role: '&6' + greetings: + - Ok then... + dialog: + - Hit him harder! + - Woah! Good one! + - Yeah! Mess him up! + farewell: + - Yep... +primis_terravilla_generic_npc_12: + name: '&6Umbria Maccalus' + role: '&6' + greetings: + - What! + dialog: + - Is a girl not\nallowed to be\non a rooftop. + - Just try and\nget me down! + farewell: + - Yeah, whatever... +primis_terravilla_generic_npc_2: + name: '&6Delphium Assanius' + role: '&6' + greetings: + - Leave me alone! + dialog: + - What are you\nlooking at. + farewell: + - Scram! +primis_terravilla_generic_npc_3: + name: '&6Stephanium Vopiscus' + role: '&6' + greetings: + - Leave me alone! + dialog: + - What are you\nlooking at. + farewell: + - Scram! +primis_terravilla_generic_npc_4: + name: '&6Simo Clericus' + role: '&6' + greetings: + - Hey! + dialog: + - Heard the hog is on\nthe lift again. + farewell: + - Bye. +primis_terravilla_generic_npc_5: + name: '&6Harpax Colias' + role: '&6' + greetings: + - Ello. + dialog: + - The bo...I mean the\nOverseer is upstairs. + farewell: + - Laters. +primis_terravilla_generic_npc_6: + name: '&6Sulpicio Epolonius' + role: '&6' + greetings: + - Hi there. + dialog: + - I hope the ruins\nopen up again soon. + - I miss artifact\nhunting. + farewell: + - Goodbye. +primis_terravilla_generic_npc_7: + name: '&6Baebia Lucan' + role: '&6' + greetings: + - '...' + dialog: + - Cringe... + farewell: + - '...' +primis_terravilla_generic_npc_8: + name: '&6Novia Longinus' + role: '&6' + greetings: + - '...' + dialog: + - Are you always\nstaring at people? + - How about some\nprivacy? + farewell: + - '...' +primis_terravilla_generic_npc_9: + name: '&6Septimia Baro' + role: '&6' + greetings: + - Oh, hey. + dialog: + - If it opens up again\nthen I gotta go\nget more of these. + - What is this skull\nnfrom hmm... + farewell: + - '...' +primis_terravilla_overseer: + name: '&6Lutum Princeps' + role: '&6' + greetings: + - Yes? + dialog: + - What is it\nnow... + - I need to check\nup on them. + - At least I\nam not bored. + farewell: + - Good luck. +primis_terravilla_researcher: + name: '&6Plautia Suilius' + role: '&6' + greetings: + - Hmm... + dialog: + - Maybe if... + - That can't be right + - Not sure... + farewell: + - Later... +primis_traveler_1: + name: '&6Lysidamus Nolus' + role: '&6' + greetings: + - Hallo, Fremdling! + dialog: + - Ich bin auf dem Rückwegaus dem Dorf. + - Richtung Dorf? + - Viel Glück auf\ndeinen Reisen. + farewell: + - '"Mögen die Götter Euch segnen!".' +primis_traveler_2: + name: '&6Citro Gala' + role: '&6' + greetings: + - Servus! + dialog: + - Ich bin auf dem Rückweg\naus dem Dorf. + - Kommst du von Pontis Mille? + - Viel Glück! + farewell: + - '"Mögen die Götter Euch segnen!".' +primis_traveler_3: + name: '&6Bromia Culleolus' + role: '&6' + greetings: + - Tach! + dialog: + - Gehst du auch ins Dorf? + - Ich habe gehört, dass es dort bei\nim Dorf ziemlich\nkalt ist. + - Puh! Fast geschafft!\nIch muss weitermachen. + farewell: + - '"Mögen die Götter Euch segnen!".' +primis_traveler_4: + name: '&6Demenis Nolus' + role: '&6' + greetings: + - Hallo, Fremdling! + dialog: + - Schön jemanden\nauf der Straße zu sehen. + - Fast das Dorf erreicht. + - Puh! + farewell: + - Straßen segnen dich. +primis_traveler_5: + name: '&6Callipho Classicius' + role: '&6' + greetings: + - Heya! + dialog: + - Ich brauche bessere Schuhe. + - Bald werde ich\nzu Hause sein. + - Gut die\nFelder wieder zu sehen! + farewell: + - Sicheres Reisen! +primis_traveler_6: + name: '&6Rodenus Palis' + role: '&6' + greetings: + - Hey, wie gehts! + dialog: + - Ich bin auf dem Rückweg\naus dem Dorf. + - Gut\nPontis Mille wieder zu sehen. + - Ist mein Bruder wieder verloren gegangen... + - Wo ist er? + farewell: + - Bis Später! +primis_traveler_7: + name: '&6Rodenus Palis' + role: '&6' + greetings: + - Hey... + dialog: + - Schon wieder verlaufen? + - Das ist nicht Pontis Mille. + - Wo bin ich? + - Uhh, das scheint\nnicht wie der\nrichtige Weg auszusehen... + farewell: + - Tschüss. +quest_giver: + name: Qel'Thuzad + role: + greetings: + - Grüsse Abenteurer!\nLust auf einen Quest? + - Du da! Ich habe einen Quest für dich! + - Fühlst du dich... mutig? + dialog: + - Schliesse Quests ab für\ncoole Belohnungen! + - Quests mit höherem Level\ngeben bessere Belohnungen! + - Quests mit höherem Level\nerfordern Mobs mit höherem Level! + - Brauchst du etwas schwierigeres?\nErhöhe deinen Gilden Rang! + - Stelle sicher das du gut ausgerüstet\nbist für diese Quests! + farewell: + - Sichere Reise, Freund. + - Frohe Jagd! + - Lebe lang und in Frieden! + - Komme mit deinem Schild\nzurück, oder auf ihm. + - Leben bevor dem Sterben! + - Stärke bevor der Schwäche! + - Reise bevor dem Ziel! +refiner_config: + name: Ralph + role: + greetings: + - Möchten Sie Ihren Schrott upgraden? + - Hast du Schrott? + - Auf der Suche nach niedrigem Schrott! + - Grüße, haben Sie Schrott? + - Ich werde deinen Schrott recyceln! + dialog: + - Brauchst du deinen Schrott verbessert? + - Verbessere hier deinen Schrott! + - Verbessere 10 Schrott auf ein höheres Level! + - Mach deinen Schrott nützlicher! + - Hast du niedrigen Schrott? + farewell: + - Komm zurück, wenn du\nmehr niedrigstufigen Schrott hast + - Vergiss nicht, den Schrott\nnützlich zu machen! + - Holen sie ihren ersten Schrott! +repairman_config: + name: Reggie + role: + greetings: + - Lass deine Items reparieren! + - Repariere Items für Schrott! + - Verwandle diesen Schrott in Haltbarkeit! + - Brauchen Sie eine Reparatur? + - Haben sie beschädigte Items? + dialog: + - Beste Reparaturen in der Stadt! + - Ich habe dein Fix! + - Brauchst du einen Fix? + - Ich repariere deine Items! + - Brauchst du Elite-Items repariert? + farewell: + - Vergessen Sie nicht, Wartungsarbeiten durchzuführen! + - Ich bin hier, wenn du mich brauchst! + - Rufe mich auf, wenn du mich erreichen möchtest,\n, wenn du die Seite willst, die in Ordnung ist +santa: + name: '&4St. Nick' + role: '&c' + greetings: + - Ho ho ho! + dialog: + - Ich habe einige Geschenke verloren, \nkannst du mir helfen? + - Lieber Reisende, ich habe\neine Anfrage für dich! + - Kannst du einem alten Mann\nin seiner Not helfen? + farewell: + - Ho ho ho! +scrapper_config: + name: Kelly + role: + greetings: + - Willst du Gegenstände loswerden? + - Möchten Sie Recyceln? + - Suchen Sie nach Schrott? + - Es ist Schrott 'o Uhr! + - Schrottzeit! + dialog: + - Schrottige Deals! + - Hol dir deinen Schrott hier! + - 75% Chance zu funktionieren! + - Es gibt keine Rückerstattungen. + - Recycling, Wiederverwendung, reduziert! + farewell: + - Komm zurück, wenn du\nmehr zum Verschrotten hast + - Vergiss nicht, den Schrott\nnützlich zu machen! + - Frohes Abwracken! +smelter: + name: Sam + role: + greetings: + - Hast du Schrott? + - Hast du extra Schrott? + - Ich rieche Schrott bei dir!? + - Bitte ich brauche Schrott! + - Füttere mich mit Schrott! + dialog: + - Ich mache deinen Schrott nützlich! + - Gib mir Schrott und ich\ngib dir Verbesserungs Orbs! + - Schrott ist nutzlos, gib es mir! + farewell: + - Komm zurück, wenn du\nmehr Schrott hast + - Auf zum Upgrader! +special_blacksmith: + name: Grog + role: + greetings: + - Brauchst du etwas? + - Hast du was gutes? + - Wir haben nichts, abgesehen vom besten + - Hast du was zu verkaufen? + - Wir kaufen nur Elite Ausrüstung. + dialog: + - Wir kaufen tief und verkaufen hoch. + - Keine Rückerstattungen. + - Definitf keine Rückerstattungen. + - Es gibt keine Rückerstattungen. + - Keine zurücknahmen. + - Einkäufe sind verbindlich. + farewell: + - Komm zurück wenn du\n mehr Geld hast + - Lass dich nicht umbringen,\nwir wollen das du uns\nmehr Ausrüstung bringst. + - Beim nächsten mal, kauf\netwas teureres. + - Nicht vergessen, keine Rückerstattungen. +test_npc: + name: Test-NPC + role: Überprüfung läuft! + greetings: + - Test Grüße! + dialog: + - Test-Dialog! + farewell: + - Test-Abschied! +travelling_merchant: + name: Jeeves + role: + greetings: + - Hast du etwas zu verkaufen? + - Hast du gerufen? + - Was? + dialog: + - Ich kaufe es am günstigsten! + - Hast du etwas für mich? + - Zeit ist Geld! + farewell: + - Rufe mich jederzeit wieder! + - War das alles? + - Sicheres Reisen! + - Lass dich nicht töten! + - Gute Jagd! +unbinder: + name: Ulfric + role: + greetings: + - Grüße. + - Willkommen. + - Willkommen, mein Freund. + - Ja? + - Darf ich Ihnen helfen? + dialog: + - Ich entbinde deine Items\nfür eine extrem seltene Entbindungs Rolle. + - Ich bin der einzige, der\nzum Entbinden Ihrer Items qualifiziert ist. + - Haben Sie eine Entbindungsrolle? + farewell: + - "Denken Sie daran: \nVerwenden Sie die Entbindungsrolle weise." + - Sichere Reise, Freund. +wood_league_arena_master: + name: Gladius + role: + greetings: + - Willkommen in der\nArena! + dialog: + - Bereit sich der Arena zu stellen? + farewell: + - Kehre mit deinem Schild zurück, oder ähnlichem! +wood_league: + arenaName: Holzliga + arenaMessages: + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - welle=8:Nachricht=&8[Gladius] &fNicht schlecht, aber was ist, wenn jeder Feind ein &cNahkämpfer ist? + - wave=9:message=&8[Gladius] &fNett, nett, aber was ist, wenn sie alle &cFernkämpfer &fsind stattdessen? + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - wave=44:message=&8[Gladius] &fDas funktioniert offensichtlich nicht, lassen Sie sich etwas einfallen... + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +ag_welcome_quest_0: + customObjectives: + Objective1: + dialog: + - '&8[&aCasus&8]&f Welcome to the Adventurer''s Guild Hub, the hub for all things EliteMobs!' + - You can always get back here using &2/ag&f! + - Talk to me again for a quest! + name: '&2Finde die AG!' + questLore: + - + - + questAcceptDialog: + - '&8[Odigos]&f Also, benutzt &2/ag &f oder &2/adventurersguild&f, um euch zum Hub der Abenteurergilde zu begeben!' + - Stellen Sie sicher, dass Sie mit Casus sprechen, wenn Sie dort sind! +ag_welcome_quest_1: + customObjectives: + Objective3: + dialog: + - '&8[&aGreg&8]&f Want to buy or sell something? I''ve got a little of everything!' + Objective4: + dialog: + - '&8[&aCharles&8]&f Want to learn about fighting elites? Just talk to me!' + Objective1: + dialog: + - '&8[&aHermes&8]&f I take you back to where you were before! Just talk to me again!' + Objective2: + dialog: + - '&8[&aBartley&8]&f Need a stiff drink? My drinks pack an extra punch!' + Objective7: + dialog: + - '&8[&aQel''Thuzad&8]&f These Elite monsters, where do they keep coming from?' + - + - + - Just talk to me to get one! + Objective12: + dialog: + - '&8[&aGrog&8]&f Want to buy special items? I''ve got just the thing!' + Objective8: + dialog: + - '&8[&aRalph&8]&f Get more out of your scrap by upgrading it! Just talk to me at any time.' + Objective13: + dialog: + - '&8[&aUlfric&8]&f If you bring me a very special and rare item, I can unbind your Elite items.' + - + - + Objective5: + dialog: + - '&8[&aTim&8]&f Want to upgrade your Elite Items? Just get an upgrade orb from Sam over there!' + Objective10: + dialog: + - '&8[&aKelly&8]&f Got extra Elite items? Don''t know what to do with them? Give them to me, and I''ll turn them into scrap!' + - + - + Objective6: + dialog: + - '&8[&aGillian&8]&f Do you seek power? Do you desire to reach new heights? Talk to me to unlock new guild ranks, and reach levels of power you never thought to be possible!' + Objective11: + dialog: + - '&8[&aSam&8]&f Got extra scrap? I can refine that into Upgrade Orbs, which you can give to Tim to upgrade your Elite items with!' + Objective9: + dialog: + - '&8[&aReggie&8]&f Need your Elite items repaired? Just bring me some scrap, and I''ll make them as good as new!' + - + - + name: '&2Willkommen bei der Abenteuergilde!' + questLore: + - '&aTreffen Sie die Gilden-NPCs der Abenteuergilde!' +primis_caeruleaum_a_can_of_worms: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis] &fPlease tell me you''re the one bringing the bait.' + name: '&2Eine Dose Würmer' + questLore: + - Hier nehmen Sie den Köder und gehen sie. + - Bitte beeil dich! + questAcceptDialog: + - '&a[Callidus Piscatus]&f Mein Freund ist in einem Boot in der Nähe der Docks!' + - '&7&oIch sollte mich beeilen zum Boot zu gelangen.' + questCompleteMessage: + - '&a[Piscis Nemesis]&f Du hast Köder mitgebracht? Perfekt!' + - Der Köder sollte es herauslocken! + - '&7&oIch sollte mit Nemesis sprechen.' +primis_caeruleaum_fishing: + name: '&2Fischköder' + questLore: + - Wir haben ein großes Problem! + - + - + - + - + - aber er kann nichts ohne den richtigen Köder machen! + - Ich sage dir, wo du den &eFischköder &f bekommen kannst, bitte geh und hilf meinem Freund! + - Ich verspreche, dass ich dich belohnen werde! + questAcceptDialog: + - '&a[Callidus Piscatus]&f Die Zeit drängt! Wenn du das Dorf verlässt, findest du auf der rechten Seite einen Haufen &cBig Worms&f!' + - Beschaffe 5 und komme wieder hier her und ich werde sie für den Gebrauch vorbereiten. + - '&7&oIch sollte Fischköder beschaffen.' + questCompleteMessage: + - '&a[Piscis Nemesis]&f Du hast Köder mitgebracht? Perfekt!' + - Ich werde ihn sofort vorbereiten! + - '&7&oIch sollte nochmal mit &aCallidus &7&osprechen und den vorbereiteten Köder sammeln.' +primis_caeruleaum_fishing_2: + name: '&2Monster Köder' + questLore: + - Das war's! Spring ins Wurmloch, ich halte das Boot! + - Lass uns diesem Monster den Zorn eines Fischers zeigen! + questAcceptDialog: + - '&a[Piscis Nemesis]&fSpring rein, ich halte das Boot fest!' + - Vergiss nicht, diesen &eTauchhelm&f aufzusetzen! + - '&7&oIch sollte das Wurmloch betreten und das Meer-Monster besiegen.' + questCompleteMessage: + - '&8[Piscis Nemesis]&f Haha, was für eine Show!' + - '&fNatürlich hatte ich die Situation die ganze Zeit unter Kontrolle, aber du hast ein bisschen geholfen!' + - '&fHier, das kannst haben!' + - '&7&oDas Monster ist tot und das Ufer ist sicher. Sieht aus wie ein gut erledigter Job.' +primis_caeruleaum_fletching: + name: '&2Pfeil Jäger' + questLore: + - Hast du eine Minute, um uns zu helfen? + - Mit all den kürzlichen Überfällen, befinden wir uns jetz leider in der Lage keine &6Greifpfeile&0 mehr zu haben! + - Es ist normalerweise meine Aufgabe, sie zu bekommen, aber die Dinge sind nur eine + - ein bisschen zu gefährlich für mich jetzt, um in den Dungeon zu gehen. + - Wenn du diese &eGrappling Pfeile für mich bekommen könntest + - Ich werde dir beibringen, wie man sie benutzt! + questAcceptDialog: + - '&8[Ventus Artifex]&f Bitte bringe mir 10 &6Greifenpfeile &fvon den Ruinen jenseits des Dorfes.' + - Die untoten Skelette und Ertrunkenen von einst tragen diese meist bei sich. + - '&7&oIch sollte die Skelette und die Ertrunkenen in der Ruine nahe des Dorfes töten um ihre Greifpfeile zu bekommen.' + questCompleteMessage: + - '&8[Ventus Artifex]&f Voll duffte!' + - '&6Greifpfeile &fkönnen an Zielblöcken benutzt werden um an schwer erreichbare Orte zu gelangen.' + - Sie sind ein Muss für den aufstrebenden alten Ruinendieb. + - Hier ist deine Belohnung! + - Wie wäre es, dein Wissen auf die Probe zu stellen? + - '&7&oScheint als hätte Ventus Artifex eine Herausforderung für mich.' +primis_caeruleaum_fletching_2: + name: '&2Schildjäger' + questLore: + - Du hast die Pfeile bekommen? Großartig! + - Benutze diese Pfeile mit einem Bogen, um den Turm zu besteigen! + questAcceptDialog: + - '&8[Ventus Artifex]&f Verwende die Pfeile, die du gerade erhalten hast und gehe mit Ihnen zu den Ruinen um auf die Zielblöcke zu schießen!' + - + - + - + - + - '&7&oIch sollte den Schild innerhalb der Ruinen bekommen, indem ich die Greifpfeile verwende, um die Ziele innerhalb des Gebäudes zu beschießen.' + questCompleteMessage: + - '&8[Ventus Artifex]&f Ausgezeichnet!' + - Wahrlich, du bist ein echter Ruinendieb! + - Hier ist deine Belohnung! + - '&7&oScheint als wären die Greifpfeile sehr nützlich in Zukunft.' +primis_caeruleaum_foraging: + name: '&2Wolfsköder' + questLore: + - Ich hörte, dass Sie hier helfen wollten. + - In der Nähe befindet sich ein &dDen der Wölfe&f + - wirklich behindern meine Nahrungssuche für das Dorf! + questAcceptDialog: + - '&8[Venator Pabulatus]&f Wenn du diese lästigen Wölfe loswerden kannst, werde ich dich belohnen!' + - Ich werde zu alt, um mich mit den wilden Dingen dieser Länder zu beschäftigen... + - '&7&oIch sollte die Wölfe im Südosten des Dorfes töten.' + questCompleteMessage: + - '&8[Venator Pabulatus]&f Ich wusste, dass ich auf dich zählen konnte!' + - Vielen Dank für deine Hilfe! + - Hier ist deine Belohnung wie versprochen. +primis_farmstead_lighthouse_keeper_2: + customObjectives: + Objective1: + dialog: + - "&a[Jeeves]&f &2Amavit&f sent you? What's this about a lighthouse? My, what a discovery!\n&fThis will revolutionize my job as a traveling merchant! Here, have these &eScrolls&f - just call me and I'll be there in a jiffy!\n&7&oSeems like &aJeeves&7&o has something for me. I should talk to him." + name: '&2Die mysteriösen Lichter' + questLore: + - + - + - Mein Vater &aJeeves&f ging nach oben, um zu überprüfen, aber er ist noch nicht zurückgekehrt. + - + - + questAcceptDialog: + - '&8[Amavit]&f Nochmals vielen Dank und viel Glück. Hoffentlich ist es nichts.' + - '&7&oIch sollte auf die Spitze des Leuchtturms gehen, der Sache nachgehen und dann Amavits Vater im ersten Dorf Bericht erstatten.' + questCompleteMessage: + - '&7&oDiese Schriftrollen scheinen sehr nützlich! Ich sollte den Leuchtturm verwenden, um zum Bauernhof zurückzukehren und mich weiterzubewegen.' +primis_gladius_assassins: + name: '&5Wer erschießt die Scharfschützen?' + questLore: + - Die Dächer von &dGladius&f sind mit &cAttentäter&f bedeckt! + - Auf die Straße zu gehen ist ein Todesurteil. Wir müssen uns mit den Scharfschützen befassen! + - + - + questAcceptDialog: + - '&a[Belli] Kümmere dich um diese &cAttentäter&f! Denken Sie daran, die &eGreifpfeile&f! zu verwenden.' + - '&7&oIch sollte diese &cAttentäter&7&o töten.' + questCompleteMessage: + - '&a[Belli]&f Du hast dich mit diesen &cAttentäter&f befasst? Gut! Das gibt Kopfschmerzen...!' +primis_gladius_clear: + name: '&5Erobert die Straßen zurück' + questLore: + - Ich brauche dir nicht zu sagen, dass sie in die Stadt eingedrungen sind, oder? + - Wir bieten denjenigen eine Belohnung an, die bereit sind, die Anzahl der Eindringlinge zu verringern. + - Bist du bereit dafür? + questAcceptDialog: + - '&a[Belli] &fGeht einfach raus und dünnt ihre Zahl aus!' + - '&7&oIch gehe raus und säubere die Straßen von &dGladius&7&o.' + questCompleteMessage: + - '&8[Belli]&f Sieh dir das an, die Götter haben uns in der Zeit der Not einen wahren Krieger geschickt! Ich habe einen Job für jemanden wie dich.' + - '&7&oScheint als hätte &aBelli&7&o einen Plan für mich. Ich sollte mit ihr sprechen..' +primis_gladius_prayer: + name: '&5Glaubenssprung' + questLore: + - Ich werde es nicht beschönigen, die Dinge sehen geradezu düster aus! + - Die Mauern sind gefallen, die Straßen reißen + - mit den &cUntoten&f und mir sind die Getränke ausgegangen. + - In Zeiten wie diesen wenden die Menschen ihre Hoffnung auf + - irgendeine Art göttlicher Fügung! + - Es gibt einen &dPfad&f, beleuchtet von Kerzen, der zu einem + - '&dHeiligtum in den Bergen&f führt.' + - Krieger gehen diesen Weg und besiegen die &cMönche&f welche + - das Heiligtum bewachen um vom Kriegsgott im Kampf gesegnet zu werden. + - Es mag nur ein Aberglaube sein, aber würde es schaden, + - um den Menschen Hoffnung zu geben? + - Die Tatsache, dass du dich bis hier her durchgesetzt hast, zeigt, dass du obere Liga bist, + - gehe den Berg hoch und besiege den &cMönch&f. + - Alle Krieger werden sich besser fühlen, wenn sie wissen, dass sie bewacht werden. + questAcceptDialog: + - '&a[Belli] &fGeh nach oben und folge den Kerzen! Pass auf, dass du nicht fällst, der Weg ist tückisch!' + - '&7&oIch sollte dem &cKerzenpfad&7&o folgen und den &cMönch&7&o besiegen.' + questCompleteMessage: + - '&a[Belli]&f Du hast das Gebet abgeschlossen? Danke, die Soldaten werden sich erleichtert fühlen, davon zu hören.' +primis_gladius_ships: + name: '&5Ein flaues Gefühl' + questLore: + - Hast du sie gesehen? Die Dutzende Schiffe befinden sich außerhalb + - von &dGladius&f? Sie sind für all das verantwortlich. + - Wir haben nie eine Invasion vom &dBluttempel&f erwartet, + - und noch viel weniger durch Belagerungswaffen die auf Booten montiert sind! + - Wir müssen etwas dagegen unternehmen. Töte den &cAdmiral&f + - und einige seiner Truppen, es wird zwar nicht zurückbringen was wir verloren haben, + - aber es wird sich besser anfühlen für uns. + questAcceptDialog: + - '&a[Belli] &fTöte den &cAdmiral&f und einige der Truppen auf den Booten. Seien Sie vorsichtig mit ihrer Wasserüberlegenheit! Ich empfehle die Verwendung von &eGrappling-Pfeilen&f, um sich über die Schiffe zu bewegen.' + - '&7&oIch sollte den &cAdmiral&7&o und einige seiner Truppen auf den Booten &daußerhalb von Gladius&7&o töten.' + questCompleteMessage: + - '&a[Belli]&f Der Admiral ist nicht mehr? Ich fühle mich schon besser!' +primis_gladius_sunken_ship: + name: '&5Versenktes Schiff' + questLore: + - Nun, da du dich um die &cMarine Streitkräfte&f kümmertest, erhielt ich + - eine andere Aufgabe für dich. + - Das &dversenkte Schiff&f sollte jetzt erreichbar sein. + - Du siehst vor einiger Zeit wurde eines unserer Schiffe versenkt, + - leider enthielt es &ewichtige Dokumente an Bord&f. + - Ich brauche dich um das &dversenkte Schiff&f zu erreichen und alle Bedrohungen zu erledigen + - die sich da aufhalten und mir die &eDokumente&f zu bringen. + - Kommen Sie zurück zu mir, nachdem Sie die Aufgabe erledigt haben. + questAcceptDialog: + - '&a[Belli] &fDu findest das Schiff in den Gewässern im Südwesten. Lass die Hölle auf sie niederprasseln!' + - '&7&oIch sollte die &eDokumente&7&o sammeln und jeden &cMariner&7&o in der Nähe des Schiffes töten.' + questCompleteMessage: + - '&a[Belli]&f Bereits zurück? Hervorragende Arbeit! Wir benötigten diese &eDokumente&f.' +primis_gladius_supplies_1: + name: '&cVersorgungsprobleme' + questLore: + - Uns gehen die &eVorräte&f aus! + - '&dGladius&f ist eine Festung, ausgerüstet um eine länger Belagerung auszuhalten' + - ',und das ohne Probleme, aber das hängt davon ab, dass wir' + - zugriff auf das &dWarenhaus&f haben! + - Leider war das &dWarenhaus&f einer der ersten zu Orte die gefallen sind, + - und jetzt verhungern wir langsam zu Tod! + - Wenn du einen Pfad zu &dWarehouse&f löschen kannst und &eSupplies&f erhalten + - das würde große Hilfe in den Kriegsanstrengungen! + questAcceptDialog: + - '&8[Cibus]&f Das &dLager&f ist kaum zu übersehen! Es ist das extra große, wie ein Lagerhaus aussehende Gebäude in der Nähe des Teils, wo die Mauer fiel! Schnapp dir ein paar Vorräte und bring sie hierher zurück!' + - '&7&oIch sollte zum &dLagerhaus&7&o gehen und Vorräte zurückbringen&7&o.' + questCompleteMessage: + - '&8[Cibus]&f Du hast die Vorräte zurückgebracht? Fantastisch! Inzwischen habe ich die perfekte Idee für die Getränke - und es sollte etwas sein, das die Stimmung der Soldaten hebt!' + - '&7&oScheint, als hätte der Cibus einen Plan, ich sollte mit ihm reden.' +primis_gladius_supplies_2: + name: '&cVersorgungsprobleme' + questLore: + - Wir haben Essen, aber wie sieht es mit Getränken aus? + - Einige würden sagen, es ist töricht, in der Mitte betrunken zu werden + - von einem Krieg, aber wenn jetzt, wann dann? + - Der &cBarkeep&f auf der anderen Straßenseite hat alles Gute bewahrt + - Sachen in der &dBasement&f. + - Ich denke, du weißt, worauf ich damit hinaus will! + - Gehe zur &dBasement&f der Taverne auf der anderen Straßenseite und bekomme + - die &eGood Stuff&f. Wenn du die &cBarkeep&f findest, würde ich sie als ein + - persönliche Gunst, wenn Sie ihn von diesem Fluch des Untodes befreien. + - Wir sind ziemlich sicher, dass er in der &dBasement&f war, als der + - invasion ist geschehen, so Chancen sind er immer noch da + - obwohl wahrscheinlich nicht mehr selber. + - Sei vorsichtig! + questAcceptDialog: + - '&8[Cibus]&f Die Taverne liegt auf der anderen Straßenseite und ist kaum zu übersehen! Gehen Sie einfach in den Keller und holen Sie sich das &egute Zeug&f!' + - '&7&oIch sollte in den &dKeller&7&o der Taverne gehen und "&edas gute Zeug&7&o" holen.' + questCompleteMessage: + - '&8[Cibus]&fIhr habt den &cWirt&f besiegt? Ich danke dir, dass du meinen alten Herrn von diesem verfluchten Untod befreit hast. Hier, ich trinke den ersten Schluck mit dir.' +primis_ice_village_all_out_of_chains: + customObjectives: + Objective1: + dialog: + - '&a[Orbis]&f Oh, the Ice Village chain shipment. Yes, it is right in that chest over there.' + - Sorry for not sending it over, but we were quite busy and had no time. + - It's all paid for so feel free to just grab it. + name: '&viele Ketten' + questLore: + - Hey, du kommst von &dPontis Mille&f stimmts? + - Wie möchtest du uns dabei helfen? + - Hier im Gefängnis neigen wir dazu, durch ein + - viele Ketten... + - Vor allem die Ketten halten die Käfige auf. + - Sie rosten viel und dann brechen sie ab. + - wie einer der Häftlinge entkam. Die rostige + - Kette geschlagen, fiel der Käfig und er rannte. + - Wir bezahlten für ein + - '&eVersand von neuen Ketten&f, aber sie' + - sind noch nicht angekommen. Wenn du zu + - '&dPontis Mille&f und holen Sie unsere' + - '&aLieferung von Ketten' + - dann wäre das großartig! + questAcceptDialog: + - '&a[Philolaches Triferus]&f Gehe mit Orbis. Er ist diejenigen, die die Ketten herstellt.' + - '&7&oIch sollte mit &a&oOrbis&7&o sprechen und die &e&von Ketten &7&o zurückbringen.' + questCompleteMessage: + - '&a[Philolaches Triferus]&f Das sind die Ketten! Vielen Dank für das Erhalt, wir brauchten sie wirklich.' +primis_ice_village_catch_me_if_you_can: + name: 'Fang Mich, Wenn du Kannst' + questLore: + - Was für einen Zeitpunkt! Ich habe gerade nach jemandem gesucht, der unsere erobert hat + - '&cFreigegebener Gefangener &f.' + - + - + - + - + - + - + questAcceptDialog: + - '&a[Romanus Superbus]&f Er muss irgendwo in den Bergen sein.' + - '&7&oIch muss den &c&oEntflohenen Gefangenen&7&o finden und ihn zurück ins Gefängnis bringen.' + questCompleteMessage: + - '&a[Romanus Superbus]&f Schön, Schön. Wenn das nicht unser entflohenes Dornröschen ist.' + - Gute Arbeit. Eine gut gemachte Arbeit verdient eine gute Bezahlung, bitteschön. + - '&aRomanus&7 gibt dir einen schweren Beutel Münzen.' +primis_ice_village_get_them_off_my_back: + name: '&2Hol sie von mir runter!' + questLore: + - Lass mich dir sagen, ich bin wirklich froh, dass du hier bist, um zu helfen, haha. + - Unsere Mission hier ist es, &cRazorbacks&f zu jagen und ihre Anzahl in Schach zu halten. + - Es geht auch nicht nur um Bevölkerungskontrolle. + - Sie versorgen uns mit wertvollem Leder, Stosszähnen und Fleisch. + - Bin nicht sicher, ob dieses Dorf ohne sie hier wäre. + - + - + - + - + - + - + - Wir brauchen Sie nur, um die &cBabies&f und die &cjugendlichen Razorbacks&f zu jagen. + - + - + - + - + - Es würde mir viel bedeuten, wenn Sie ihn zurückbringen könnten. + questAcceptDialog: + - '&a[Alanus Isatis]&f Du musst den &cRazorbacks&f auf deinem Weg hierher gesehen haben, also nehme ich an, du weißt wohin du sie findest.' + - '&7&oIch muss die &c&oRazorback&7&o Bevölkerung schlachten und &e&oAlanus'' Dagger&7&o abrufen.' + questCompleteMessage: + - '&a[Alanus Isatis]&f Gut gemachter Freund! Das hat sehr holfen.' + - + - + - Der Dolch ist nichts Besonderes, aber es war ein handgefertigtes Geschenk von meinem verstorbenen Vater. + - Das nächste Mal, wenn du Durst bist, zahle ich dir ein Getränk! +primis_ice_village_gotta_keep_warm: + customObjectives: + Objective1: + dialog: + - '&a[Severinus Martius]&f Ha ha! That should keep me warm for another couple of weeks!' + - Hey friend, you heading for &dCaerullium Village&f by any chance? + name: '&2Gotta keep warm' + questLore: + - We deliver the &aLighthouse Keeper&f some + - of our strong stuff every couple of weeks. + - It keeps him warm during the colder days. + - It's a small gesture of thanks for all his + - hard work. Any chance you could help out + - and bring over the next batch? + questAcceptDialog: + - '&a[Grania Cecilius]&f You can find the lighthouse to the East. Thanks!' + - '&7&oI should go to the &d&oLighthouse&7&o and deliver these to the &a&oLighthouse Keeper&7&o.' + questCompleteMessage: + - '&a[Severinus Martius]&f If you''re heading over there then I would appreciate if you could deliver some of these to my good friend &aJeeves&f.' + - '&7&oSeems like the &a&oLighthouse Keeper&7&o has a quest for me.' +primis_ice_village_gotta_see_jeeves: + customObjectives: + Objective1: + dialog: + - '&a[Jeeves]&f Oh! A gift from my friend Severinus you say.' + - Well, thank you for bringing it over. Was nice seeing you again! + name: '&2Gotta see Jeeves' + questLore: + - Now, now it would be really rude of me to keep + - all of the good stuff to myself! + - If you would bother helping me out friend and + - delivering some of the good stuff + - to my friend &aJeeves&f at &dCaerullium Village&f. + - You can get there quickly by taking the + - '&9lighthouse portal&f.' + questAcceptDialog: + - '&a[Severinus Martius]&f The portal is all the way at the top.' + - '&7&oI should go to &d&oCaerullium Village&7&o and deliver some of the good stuff to &a&oJeeves&7&o.' + questCompleteMessage: + - '&a[Severinus Martius]&f Thank you for delivering some of the strong stuff to Jeeves. I know he likes a good drink here and there ha ha!' +primis_ice_village_living_nightmares: + customObjectives: + Objective1: + dialog: + - '&a[Cornelia Ennodius]&f Are they gone? I was so scared. My parents sent you? Thank goodness.' + - + - + - I couldn't escape. I, I...will be fine, I just need a minute... + name: '&2Lebende Alpträume' + questLore: + - Ich habe ihr den Weg gefolgt, hier Endet er. + - Nicht sicher, wohin sie von hier gegangen wäre. + - Ich fürchte, dass etwas Schlechtes passiert sein könnte. + - Unsere &aMädchen&f nimmt viel nach mir und meinen Spezialmächten. + - Außer dass ihr mächtiger ist, ist sie in der Lage + - mächtige Emotionen manifestieren sich in der realen Welt. + - Uns geht die Zeit zu Ende, wir müssen sie bald finden. + questAcceptDialog: + - '&a[Sestia Ennodius]&f Der Weg ist hier kalt geworden, sie kann nicht so weit weg sein...' + - '&7&oIch muss die &a&overlorene Tochter&7&o finden, bevor ihr etwas passiert.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f Du hast sie gefunden! Schnell, wo ist sie?' + - Vielen Dank Fremder, ich werde zu ihr gehen! +primis_ice_village_make_them_go_ouch: + name: '&2Lass sie ausgehen' + questLore: + - Ich hatte ein paar freche '&cCustomers&f' + - besuchen Sie vor ein paar Tagen. + - Sie haben das wertvollsten gestohlen + - meiner &ePossessions&f. + - Sie müssen sie finden und sicher sein + - um ihnen eine Lektion zu erteilen. + - Vergewissern Sie sich, dass sie das wissen + - '&aViolet&f vergisst nicht zu sammeln.' + questAcceptDialog: + - '&a[Domina Violet]&f Sie gingen nach Osten vorbei an den &9Bäumen&f.' + - '&7&oIch muss sicherstellen, dass die &c&oKunden &7&o nicht mit &a&oViolet&7&o durcheinander kommen. Ich muss auch &e&oVioletts Property&7&o abrufen.' + questCompleteMessage: + - '&a[Domina Violet]&f Ich hoffe, du hast ihnen den Wert des Schmerzes beigebracht.' + - + - +primis_ice_village_objection!: + customObjectives: + Objective3: + dialog: + - '&a[Glacies Princeps]&f What, absolutely not. I don''t know how he convinced you to come here and beg for his release.' + - + - + - He will never be released. Is that understood. + Objective1: + dialog: + - '&a[Romanus Superbus]&f Release him? Not guilty? Are you mad? You''re lucky I don''t throw you in a cage too for suggesting such nonsense.' + Objective2: + dialog: + - '&a[Luxuria Placidus]&f Who? Never heard of him.' + name: '&2Widerspruch!' + questLore: + - Ich gehöre nicht hier her! Das sieht man doch bestimmt? + - Ich habe nichts falsch gemacht! Fremder, wirst du meine Bitte hören. + - Würdest du dieser armen Seele helfen, die in der Falle sitzt? + - hier in diesem schrecklichen Käfig ohne eigenes Verschulden? + - Du musst mit dem reden + - '&aJail Master&f oder die ' + - '&aDorfführer&f.' + - Oder irgendein anderes + - '&aFreundlicher Dorfbewohner&f' + - wer wäre + - bereit zu argumentieren für + - meine Version! + questAcceptDialog: + - '&a[Adrius Calpornius]&f Sprechen Sie mit ihnen! Lass mich heraus!' + - '&7&oIch sollte mit den Leuten auf meiner Liste sprechen.' + questCompleteMessage: + - '&a[Adrius Calpornius]&f WAS?! LÜGEN!!! Ich würde meine Familie nie so schrecklich machen...' + - + - + - '&7Welche Vernunft dieser arme Mann noch übrig hatte, ist jetzt verschwunden...' +primis_ice_village_run_away_daughter: + customObjectives: + Objective1: + dialog: + - '&a[Sestia Ennodius]&f I could sense you coming.' + name: '&2abgehauene Tochter' + questLore: + - Fremder! Würdest du unserer Familie helfen? + - Unser &aTochter&f ist verschwunden. + - Ihr wurde mit besonderem Geschenken geschenkt + - wie ihr &aMutter&f + - Ich fürchte, dass gestern Abend etwas + - schrecklich passiert sein muss um + - lasse sie in der Mitte davonlaufen + - die Nacht + questAcceptDialog: + - '&a[Sparax Ennodius]&f Meine &aFrau&f ist bereits auf der Suche nach ihr.' + - Ich bin sicher, dass sie irgendwo außerhalb des Dorfes ist. Geh und sprich mit ihr. + - '&7&oIch sollte nach einer &a&oBesorgt Mutter&7&o suchen.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f Du wurdest von meinem &aMann&f geschikt, um bei der Suche zu helfen?' + - '&7&oIch sollte nach einer &a&oBesorgt Mutter&7&o suchen.' +primis_ice_village_silence: + name: '&2Lass sie gehen, autsch' + questLore: + - Pssssst! Hörst du das? + - Das nervige Kreischen. + - ARRRR! Ich halte es nicht mehr aus. + - Hören Sie, ich werde gute zahlen + - wenn du die Quelle finden kannst + - das nervige Kreischen + - und lass es aufhören. + questAcceptDialog: + - '&a[Modestus Eulogius]&f Es klingt so, als käme es irgendwo von den Hügeln hinter mir.' + - '&7&oIch sollte den Ursprung des ganzen Lärms finden und ihn stoppen.' + questCompleteMessage: + - '&a[Modestus Eulogius]&f Sowohl mich als auch meine Ohren werden dir danken!' +primis_ice_village_taking_the_bait: + name: '&2Nehme den Köder' + questLore: + - Was ist falsch mit diesen &cFische&f + - Ich bin schon seit Tagen hier im Fischen! + - Kein einzigen gefangen. Wenn ich nur jünger wäre, würde ich es ihnen zeigen! + - + - + - Und wenn wir keine fangen können, dann ist das ein großes Problem. + - Sie müssen dort hinuntergehen und sie sinnlos schlagen. + questAcceptDialog: + - 'Du wolltest helfen, das ist deine Chance!' + - '&7&oIch muss in den See springen und 7 &c&oLachse&7&o töten und sie einsammeln.' + questCompleteMessage: + - '&a[Theopropides Nero]&f Oh! Schau sie dir an! Die sind riesig!.' + - + - +primis_ice_village_treats_for_the_punished: + customObjectives: + Objective1: + dialog: + - '&a[Eleusium Calenus]&f My wife sent you? Oh, are those treats? My favorite too! She''s such a darling.' + - + - + - 'You tell her I am doing just fine and that I love her very much. ' + name: 'Leckereien für die Bestraften' + questLore: + - Wenn es dir nichts ausmacht, könnte ich dich bitten, etwas für mich zu tun? + - Mein lieber &aEhemann&f wurde eingesperrt und ich weiß, dass es hart ist, den ganzen Tag in einem Käfig zu sitzen. + - Also bereitete ich ein paar Leckereien vor, die ich ihm bringen wollte. + - + - + questAcceptDialog: + - '&a[Titia-Calenus]&f Er wird in einem der mittleren Käfige sein.' + - Vergessen Sie nicht, ihm zu sagen, ich liebe ihn. + - '&7&oIch sollte diese Leckereien dem &a&oEhemann&7&o liefern.' + questCompleteMessage: + - '&a[Titia Calenus]&f so schnell zurück! Oh, hat er das wirklich gesagt? Er ist so süß.' +primis_ice_village_wanna_make_a_snowman: + name: '&2Willst du einen Schneemann bauen' + questLore: + - Die Kinder rund um das Dorf haben sich in letzter Zeit ziemlich gelangweilt + - und ich habe gedacht. Es gibt diese + - '&cMagische Kreaturen&f, die die Wälder um diese herum bewohnen' + - Dorf. Das Kreaturenfell wächst &eMagische Eiskristalle&e. + - Wenn du den Schnee diesen &eCrystals&f zufügst, macht es den + - Schnee mischen sich um und erweitern und vergeben. + - Und wenn du einen Schneemann aus diesem überschwemmten Schnee baust + - es sieht so aus, als ob der Schneemann am Leben ist. + - Die Kinder würden es lieben! Also, wollen Sie helfen + - Dieser alte Mann muntert ein paar Kinder auf? + questAcceptDialog: + - '&a[Sparax Ennodius]&f Du wirst die &cCreatur&f in allen Wäldern in der Nähe des Dorfes finden.' + - + - + - '&7&oIch sollte genug &c&oFrost Fur Ursus&7&o töten, um 15 &e&oEiskristalle zu sammeln&7&o.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f Du hast genug Kristalle gesammelt? Wunderbar!' + - Ich kann jetzt anfangen, den Schneemann herzustellen, ich kann es nicht erwarten dass die Kinder ihn sehen! +primis_main_quest_: + name: '&2Goblins in den Minen!' + questLore: + - Dieser Tag verschlimmert sich immer wieder, denn zuerst werden wir von Goblins überflutet. + - Dann ziehen wir uns zurück, nur um festzustellen, dass unsere Armee geteilt ist. Einige sind tot, viele werden vermisst. + - Schlimmer noch, wir fürchten, dass wir den Goblinkönig geweckt haben. + - Einige haben es hoffentlich geschafft. Wir müssen ein Lager aufbauen und uns jetzt wieder erholen. + - Wenn du es wagst, in die Minen zu kommen, bist du auf dich allein gestellt. + - Wir haben versucht, an ihnen vorbei zu schleichen, aber es ging nicht gut. + - Der einzige Weg nach vorn ist das Blutvergießen. + questAcceptDialog: + - '&8[Centurion]&fMust du den Goblin-Minen trotzen? Hüte dich vor dem Goblin-König!' + - '&8[Centurion]&fWir hoffen, dass unsere Pfadfinderpartei an ihm vorbei gekommen ist. Treffe sie, wenn du kannst.' + - '&8&oIch sollte mich in die Minen wagen und den Goblinkönig besiegen.' + questCompleteMessage: + - '&8[Kundschaftertrupp]&fDu hast es geschafft? Ich wünschte fast, du hättest es nicht getan. Sie werden nicht glauben, was vor Ihnen liegt.' + - '&8&oHört sich an das die Pfadfinder schlechte Nachrichten für mich haben.' +primis_main_quest_1: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis] &fOh so you were in the ship that beached a few hours ago?' + - + - + - + - + - + - + - '&7&oI should report to the &aFirst Mate &7&oto see if I should help these people!' + name: '&2Schiffswrack!' + questLore: + - Du bist endlich wach? Gut! Wir brauchen deine Hilfe. + - Das Schiff überstand den Sturms der letzten Nacht. + - Wir sehen ein &dLeuchtturm&fin der Entfernung, also muss es dort ein Dorf geben! + - Geh und sprich mit dem Dorfleiter und schau ob sie uns Hilfe zukommen lassen können! + - Der &aFirst Mate &fging voraus, ist aber noch nicht zurückgekehrt. + - Folgen Sie seinen Anweisungen, wenn du ihn siehst! + questAcceptDialog: + - '&a[Kapitän Squalus]&f Geh in das nahe Dorf und schaue, ob sie uns helfen werden!' + - Seien Sie vorsichtig auf dem Weg dorthin, wir wissen nicht, was in diesen gefilden herumlauert! + - '&7&oIch sollte das nahe Dorf untersuchen und mit ihrem Anführer sprechen.' + questCompleteMessage: + - '&8[Erste Mate Iracundi]&fVerflucht! Wir können heute einfach keine Pause machen! Hier ist es eindeutig zu gefährlich alleine zu gehen, nimm dies!' + - '&7&oScheint als hätte der erste Mat eine Frage an mich...' +primis_main_quest_10: + customObjectives: + Objective2: + dialog: + - "&a[Shogun Navita] &f&dGladius&f calls for our aid?\n&7&oSeems like I should talk to the &aShogun&7&o." + name: '&5Überbrückung der Lücke' + questLore: + - Es ist Zeit, &dPontis Mille&f um Hilfe zu bitten. + - Lassen Sie sie wissen, was hier passiert ist, und sagen Sie ihnen, dass wir zu unseren Gunsten kassieren. + - + - + questAcceptDialog: + - '&a[General Hasta] &fGute Reise, Freund. Denken Sie daran: Töten Sie den &cTorwächter&f und stellen Sie sicher, dass unsere Bitte die Ohren von &aShogun Navita&f erreicht..' + - '&7&oIch sollte den &cTorwächter&7&o an der &dBrücke&7&o töten und mich auf den Weg zu &aShogun Navita&7&o in &dPontis Mille&7&o machen.' + questCompleteMessage: + - '&a[Shogun Navita]&f Die Neuigkeiten, die Ihr mir überbringt, sind wirklich sehr beunruhigend, aber ich fürchte, wir haben bereits vermutet, dass etwas ... Unnatürliches ... vor sich geht.' + - '&7&oScheint so, als ob &aShogun Navita&7&o mit mir sprechen möchte.' +primis_main_quest_11: + customObjectives: + Objective1: + dialog: + - '&a[Major Fortes Bellator]&f Yes, traveler?' + name: '&2Eine Nachricht senden!' + questLore: + - Die Geschichten Ihrer Reise sind höchst überraschend. + - Dass Sie es bis hierher lebend geschafft haben, grenzt an ein Wunder. + - Die Truppen, die in &dGladius&f eindringen, sind unüberwindbar. + - '&dGladius&f wird schließlich unter ihrer Macht zusammenbrechen...' + - Hilfe? ... Ah, ja. Gehen Sie zu &aMajor Fortes Bellator&f. + - Er wird Ihnen weiterhelfen können. + questAcceptDialog: + - '&a[Navita]&f Du findest den &aMajor&f oben auf der Treppe direkt vor dir!' + - '&7&oIch sollte mit dem &aMajor&f sprechen und sehen, ob er helfen kann.' + questCompleteMessage: + - '&a[Major Fortes Bellator]&f Der &aShogun&f versucht, &dGladius&f zu helfen? Ich dachte, er würde nie fragen! Aber zuerst müssen wir uns vorbereiten.' + - '&a[Major Fortes Bellator]&f Der &aShogun&f versucht, &dGladius&f zu helfen? Ich dachte, er würde nie fragen! Aber zuerst müssen wir uns vorbereiten.' +primis_main_quest_12: + customObjectives: + Objective1: + dialog: + - '&a[Centurion]&f Where are our reinforcements?' + name: '&2Minenpfad' + questLore: + - Ich kann nicht glauben, was &dGladius&f widerfuhr. Sie haben es schnell getroffen, + - und sie treffen dort, wo es am meisten wehtut. + - Es ist unsere geschworene Pflicht, unseren Verbündeten zu helfen. Wir sind bei uns gescheitert + - Pflicht, und wir haben unsere Verbündeten im Stich gelassen. + - Der &cCounselor's&f befahl uns, unsere Truppen in mehreren Einheiten zu mobilisieren + - Zonen vor der Invasion. + - Sie sehen, vor kurzem wurde ein ungewöhnlicher und verheerender Sturm gesichtet + - im &dSturm Tempel&f. + - Die Königliche Wache wurde beauftragt, den Sturm und den &aShogun&f zu stillen + - weigert sich, diese Ordnung zu beleidigen. + - Unsere eigenen Wachen sind an anderen Orten, und ich fürchte, wir werden alle brauchen + - dass wir &dGladius&f zurücknehmen müssen. + - Der Weg zum &dSturmtempel&f ist tückisch, da man ihn gehen muss + - durch die &dKoboldminen&f. + - Hilf unserer Wache, die Minen zu räumen und einen Weg zum &dSturmtempel&f zu finden! + questAcceptDialog: + - '&a[Fortes Bellator]&fSeien Sie vorsichtig, die &dGoblinminen&f sind ein gefährlicher Ort. Vielleicht sollten Sie der normalen Wache helfen, bevor Sie der &aKöniglichen Wache&f helfen.' + - Die &dMines&f liegen nördlich der Stadt. Zu seinem Eingang führen Treppen. + - '&7&oIch sollte sehen, womit ich &aFortes Bellator&7&o sonst noch helfen kann, oder ich gehe zum Eingang der &dGoblin-Minen&7&o.' + questCompleteMessage: + - '&a[Centurion]&fEs ist so schön, jemanden zu sehen! Hat &dPontis Mille&f dich geschickt?' + - '&7&oIch sollte hören, was &a&oGlacies&7&o zu sagen hat' +primis_main_quest_13: + name: '&2Goblins in den Minen!' + questLore: + - Dieser Tag verschlimmert sich immer wieder, denn zuerst werden wir von Goblins überrannt. + - Dann ziehen wir uns zurück, nur um zu sehen, dass unsere Armee zerstört ist, einige sind tot, viele fehlen. + - Schlimmer noch, wir fürchten, dass wir den &cGoblin King &f erwachen. + - Einige haben es hoffentlich geschafft. Wir müssen ein Lager aufbauen und uns jetzt wieder erholen. + - Wenn du es wagst, in die Minen zu kommen, bist du auf dich allein gestellt. + - Wir haben versucht, an ihnen vorbei zu schleichen, aber es ging nicht gut. + - Der einzige Weg nach vorn ist das Blutvergießen. + questAcceptDialog: + - '&a[Centurion]&f trotzst du der &dGoblin Mines&f? Achte auf den &cGoblin König&f!' + - fWir hoffen, dass unsere &aPfadfinderpartei&f an ihm vorbei gekommen ist. Treffe sie, wenn du kannst. + - '&7&oIch sollte durch die &dMines&7&o wagen und den &cGoblin König &7&o besiegen.' + questCompleteMessage: + - '&a[Scouting Party]&f Du hast es durchgemacht? Ich wünsche dir fast nicht, du wirst nicht glauben, was vor dir liegt.' + - '&7&oHört sich an das die Pfadfinder schlechte Nachrichten für mich haben.' +primis_main_quest_14: + name: '&2Sturmende' + questLore: + - Es ist schwer zu glauben, dass Sie durch die + - '&dGoblin Mines&f auf eigene Gefahr.' + - Vielleicht werden Sie mit Ihrer Stärke in der Lage sein, sich der bevorstehenden Herausforderung zu stellen. + - Wir versuchten, den &dSturmtempel&f anzugreifen, und erreichten seinen tiefsten Punkt + - die Grenzen zu einem hohen Preis. + - Was wir dort gefunden haben... Es widerspricht Verständnis. + - Das mag schwer zu glauben sein, aber es klingt wie der Sturm + - hat sich als unser Gegner materialisiert. + - Wir wissen nicht einmal, ob er besiegt werden kann, und wir fürchteten uns, dass wir zu unseren Toten geschickt wurden. + - + - + questAcceptDialog: + - '&a[Blepharo]&f Wir haben ihre Kräfte ein wenig geschwächt, aber trotzdem ist dies keine leichte Aufgabe.' + - Der Sturm ist kein gewöhnlicher Gegner. Unterschätze ihn nicht. + - '&7&oIch sollte in den &dSturm Temple&f gehen und &cSturrm&f töten.' + questCompleteMessage: + - '&a[Shogun Navita]&f WAS SIE!?' + - '&cStorm&f? Mir wurde gesagt, das sei unmöglich! Ich meine...' + - '... es macht jetzt keinen Sinn, sich zu verstecken. Ich wusste von der &cSturm&f. Ich wusste von der &dGladius&f-Invasion - ich habe sie sogar unterstützt. Ich tat es für mein Volk - für &dPontis Mille&f.' + - '&cCounselor Machiavelli&f überzeugte mich, dass der &cSturm&f so unaufhaltsam war wie die Natur selbst, und dass der Sturz von &dGladius&f und &dPontis Mille&f eine Unausweichlichkeit war, die wir nur durch Opfer hinauszögern konnten.' + - + - + - '&8&oScheint, als hätte &aShogun Navita&7&o ein Problem, um das ich mich kümmern soll.' +primis_main_quest_15: + name: '&2Abfindung!' + questLore: + - + - + - + - + - + - + - + - + - + - Ich habe uns Zeit gekauft. + - + - + - + - + - Er hat uns in unser Verderben geführt und wäre damit davongekommen, wenn du nicht aufgetaucht wären. + - Jetzt gibt es Hoffnung. + - Ich bitte dich, befreien uns bitte von dem verräterischen &cCounselor&f. + - + - + - + - + - + - + - Ich möchte eine letzte Botschaft durch dich überbringen. + questAcceptDialog: + - '&a[Shogun Navita]&f &cCounselor Machiavelli&f hat sich in sein Quartier in der Unterstadt am Markt zurückgezogen. Seien Sie vorsichtig, hat in seiner Zeit eine treue Anhängerschaft angehäuft und wird nicht kampflos untergehen.' + - '&7&oEs ist Zeit für &cCounselor Machiavelli&f, sich der gerechten Vergeltung zu stellen.' + questCompleteMessage: + - '&a[Shogun Navita]&f Also ist es vollbracht.' + - '&dPontis Mille&f schuldet dir viel, Fremder. Sobald wir die Armee mobilisiert haben, werden wir bereit sein, unser Unrecht zu korrigieren und zu &dGladius''&f Hilfe zu marschieren.' + - '&7&a[Shogun Navita]&2 Wir haben dich gefürchtet. Wir haben dir unsere Verbündeten übergeben. Wir zerstreuten unsere Armeen. Nicht mehr.' + - '&dPontis Mille&2 marschiert in den Krieg, und wir werden nicht allein gehen! Du wirst den Tag bereuen, an dem du unseren Weg gekreuzt hast.' + - '&7' + - '&7&oScheint, als hätte der &aShogun&7&o einen Plan. Ich sollte mit ihm reden.' +primis_main_quest_16: + customObjectives: + Objective3: + dialog: + - '&a[Demenis Nolus]&f Heading to the village, eh. Just keep going East, follow the road and you should be there in no time!' + Objective4: + dialog: + - '&a[Callipho Classicius]&f Directions? Just head down this road that leads to the graveyards.' + Objective1: + dialog: + - '&a[Glacies]&f Welcome to our village traveler! Please tell me, what brings you here friend.' + Objective2: + dialog: + - '&a[Bromia Culleolus]&f Oh, the way to the village. Yes, just take this road that leads to the mountain.' + - Happy to help! + name: '&2Das Eisdorf wartet' + questLore: + - Wir müssen so schnell wie möglich Hilfe nach &dGladius&f schicken. + - Champion, ganz im Süden gibt es ein Dorf mächtiger Krieger. + - Sie sollten dorthin reisen und ihnen mitteilen, dass &dPontis Mille&f + - würde ihre Hilfe suchen, um die Eindringlinge aus dem &dBluttempel&f zurückzudrängen. + - Finde &aGlacies Princeps&f und sag ihnen, dass ich dich geschickt habe. + - Da viele Reisende auf den Straßen unterwegs sind, solltest du anhalten und nach dem Weg fragen. + questAcceptDialog: + - '&a[Shogun Navita]&f Es wird eine lange Reise sein. Stellen Sie sicher, dass Sie sich vorbereiten. Folgen Sie den Straßen, die nach Süden führen.' + - '&7&oIch muss gehen und das &d&oEis Dorf&7&o ganz im Süden finden.' + questCompleteMessage: + - '&a[Glacies Princeps]&f Der Shogun hat dich geschickt, wie ich sehe, es ist gut zu hören, dass &aNavita&f zu seinem alten Selbst zurückgekehrt ist.' + - + - + - Ich will dir etwas sagen. + - '&7&oIch sollte mit &a&oGlacies&7&o sprechen.' +primis_main_quest_17: + customObjectives: + Objective3: + dialog: + - '&a[Theopropides Nero]&f Help? Yes, please!' + Objective1: + dialog: + - '&a[Alanus Isatis]&f Here to help with the &cRazorbacks&f?' + Objective2: + dialog: + - '&a[Domina Violet]&f I hope you are here to help!' + name: '&2Im Norden helfen' + questLore: + - Bevor wir weiter diskutieren über + - den &dBlut Tempel&f. + - + - + - Wenn diese Probleme nicht gelöst werden, würde ich in meinen Pflichten als Dorfvorsteher versagen. + - Es gibt keine Möglichkeit für mich, die Bitte meiner eigenen Leute zu ignorieren und andere an die erste Stelle zu setzen. + - + - + - + - + - + - + - + - + - Sie können Ihnen genauer sagen, was zu tun ist. + questAcceptDialog: + - '&a[Glacies Princeps]&f Wenn du damit fertig bist, ihnen zu helfen. Komm zurück zu mir und wir können reden.' + - '&7&oIch sollte mit den Dorfbewohnern auf meiner Liste sprechen und ihnen bei allen Problemen helfen, die sie haben könnten.' + questCompleteMessage: + - '&a[Romanus Superbus]&f &2Glacies&f hat dich geschickt, verdammt noch mal! Wir haben einen Gefangenen auf freiem Fuß!' + - '&7&oIch sollte mit &a&oRomanus Superbus sprechen&7&o.' +primis_main_quest_18: + name: '&2Die Prüfung des Eises' + questLore: + - Nun, Sie haben mich und den größten Teil des Dorfes sicherlich beeindruckt. + - + - + - die &cEiselementare&f. + - + - + - + - + - '&cMinor Ice Elementals&f im Kampf.' + - + - + - Wenn Sie versagt haben ... dann ... gehörten Ihre Energie und Ihr Wesen den &cEiselementaren&f. + - + - + - Seit damals + - + - + - Mehrere unserer Leute wurden korrumpiert und wir mussten sie zu unserer eigenen Sicherheit einsperren. + - + - + - + - + - Sklaven zu den + - '&cEiselemente&f.' + - Es ist klar, dass unsere alten Traditionen nicht mehr sind. + - Man muss sich mit den &cEiselementaren&f befassen ... + - Ich würde dich bitten, der Letzte zu sein + - verpflichten sich &9Die Eisprobe&f. Erklimmen Sie den Gipfel und stellen Sie sich dem + - '&cKleinere Eiselementare&f und befreie die Seelen derer, die die Prüfung nicht bestanden haben.' + questAcceptDialog: + - '&a[Glacies Princeps]&f Du findest den Beginn des Weges bei &aViolets&f Haus.' + - Folgen Sie den &9Amethyst&f-Blöcken, sie führen dich zum Gipfel. + - '&7&oIch sollte den &9&oAmethyst Blöcken&7&o zum Gipfel des Berges folgen und dann &c&oMinor Eis Elementals&7&o töten.' + questCompleteMessage: + - '&a[Glacies Princeps]&f Du hast es getan? Mögen ihre Seelen jetzt in Frieden ruhen.' + - Lass uns noch einmal reden, Freund. Es gibt noch mehr zu tun. + - '&7&oIch sollte mit &a&oGlacies&7&o sprechen.' +primis_main_quest_19: + name: '&2Entspann dich' + questLore: + - Es ist an der Zeit, uns von diesem Fluch zu befreien. + - Wir hätten uns nie von einer &cElementals&-f Macht abhängig machen sollen. + - Wir werden diesen Fehler hier und jetzt korrigieren. + - Das, was du getötet hast, war nur + - '&cKleine Eiselemente&f, die' + - '&cIce Elemental&f rests in a temple right across from our village.' + - Es war die Hauptursache unserer Macht ... und unserer Dummheit. + - Go forth now and slay the &cIce Elemental&f. + questAcceptDialog: + - '&a[Glacies Princeps]&f You will find a path that leads into the temple at the summit of the village.' + - '&7&oI should go into the temple and slay the &c&oIce Elemental&7&o.' + questCompleteMessage: + - '&a[Glacies Princeps]&f I could feel the energies flowing out, all the way from here.' + - + - + - There is another settlement that might need your help, let's speak. + - '&7&oIch sollte hören, was &a&oGlacies&7&o zu sagen hat.' +primis_main_quest_2: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis]&fYou''ll help us? Thank the seas! This was starting to feel like a sinking ship!' + name: '&2Fremde in Not...' + questLore: + - Also können sie nicht nur nicht helfen, sondern sie wollen unsere Hilfe? Bah! + - Nun, wir haben jetzt nicht groß die Wahl, oder? + - Gut, hilf ihnen, dann mach das sie uns helfen! + questAcceptDialog: + - '&a[Erster Maat Iracundi]&f Gut, helft den Einheimischen, seht, welche Informationen ihr sammeln könnt, und seht, ob ihr sie dazu bringen könnt, uns ebenfalls zu helfen. Ich werde hier sein und verhandeln.' + - Kommen Sie zurück, sobald Sie etwas haben! + - '&7&oIch sollte mit dem &aDorf Chef&f sprechen, um zu sehen, wie man den Einheimischen helfen kann.' + questCompleteMessage: + - '&a[Chief Piscis]&f Jeder im Dorf hat ein Problem, mit dem man sich befassen muss, und ich bin da keine Ausnahme. Meine Anfrage ist ziemlich anspruchsvoll, so vielleicht möchten Sie sich erwärmen und die Lagen des Landes mit einigen der Probleme der anderen Dorfbewohner.' + - + - + - '&7&oIch sollte mit den Einheimischen sprechen und sehen, wer Hilfe braucht, und zurück zum Anführer kommen, wenn ich bereit bin fortzufahren.' +primis_main_quest_20: + customObjectives: + Objective1: + dialog: + - '&a[Lutum Princeps]&f This better be important.' + name: '&2Terravilla' + questLore: + - Some time ago we received a request for aid from a + - a nearby settlement. Years ago a bunch + - of explorers settled on top of this ancient ruin. + - I think they call their little + - settlement &dTerravilla&f. Apparently there is a lot + - of treasure to be had there if you don't mind the risk. + - But I hear that stuff has gone wrong there and they asked + - us if we could spare any help to send their way. To be + - honest, you are the strongest warrior I have ever seen. + - You are the best help we could send. If you would like + - to go of course. + questAcceptDialog: + - '&a[Glacies Princeps]&f You will find &aTerravilla&f straight West of here.' + - + - + - Oh, I almost forgot. The person you want to talk to is &aOverseer Lutum&f. + - '&7&oI should go to &d&oTerravilla&7&o and talk to &a&oOverseer Lutum&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f Came all the way from the &dIce Village&f, eh. Good to see some help arrive.' + - + - + - + - + - '&7&oI should talk to &a&oLutum&7&o.' +primis_main_quest_21: + name: '&2Taking out the trash' + questLore: + - Many years ago some explorers came across this ruin and + - as they investigated it more closely they discovered a + - large underground maze-like structure. In this structure + - there were a lot of ancient artifacts and treasures. But + - also a lot of danger. Not like that stopped anyone from + - going down there. And as the word spread, more and more + - people came here to make their fortunes. Before you + - know it, it turned into a small settlement. Until lately + - everything was fine, but then awful things started + - happening. Before I tell you more, we should start by + - dealing with the simple problems first. A small band of + - '&cRobbers&f has found a foothold in the hills surrounding' + - '&dTerravilla&f. We need them gone. Also, feel free to assist' + - any villagers in &aTerravilla&f that might need help. + questAcceptDialog: + - '&a[Lutum Princeps]&f I am not sure where the &cRobbers&f are exactly. I just know that people have reported seeing them coming from the hills.' + - '&7&oI should deal with the &c&oRobbers&7&o and help any villagers in need if I have the time.' + questCompleteMessage: + - '&a[Lutum Princeps]&f Well that is one issue resolved. Onto the next!' + - Before we move on, I want you to have this blade. + - + - + - '&7&oI should hear out what &a&oLutum&7&o has planned next.' +primis_main_quest_22: + name: '&2Big trouble in little pub' + questLore: + - Before we get to the big problem underground, I would + - like you to do one last thing here in town. There has + - been huge trouble in our little pub. There are certain + - characters in town who keep going to the pub and causing + - a ruckus. Well I heard that this time all of them managed + - to gather at the pub at the same time. And of course now + - there is a huge brawl happening over there. This is a great + - opportunity for us to arrest all of them at once. Go to the + - pub and knock them all out. We will handle the rest. + questAcceptDialog: + - '&a[Lutum Princeps]&f The pub is at the ground level, right across. Don''t let them overwhelm you.' + - I will have a nice reward waiting here for you when you're back. + - '&7&oI need to go to the pub and deal with the &c&oBar Brawlers&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f I hear that the pub is a peaceful place again. Let''s discuss the real issue now.' + - '&7&oI need to talk to &a&oLutum&7&o.' +primis_main_quest_23: + name: '&2Strike the earth' + questLore: + - You see the real reason we asked for help is because of what happened + - at the ruins. There were always dangerous things down there, + - but nothing a seasoned adventurer or explorer could not handle. But then + - something awakened, these ancient constructs started rising out of the + - ground and the walls. Then these quakes started happening, it was weird, + - because you could only feel them if you were down in the ruins. So we shut + - everything down, nobody was allowed access to the ruins anymore. A few days + - ago I gathered some of my best men and sent them down there to find the source + - of it all. They barely made it back. They found an &cEarth Elemental&f high + - above the pillars, on top some sort of platform. It must have been there + - dormant all this time. No clue why it decided to wake up now... + - Your job would be to go down there, navigate through the maze and put the + - '&cEarth Elemental&f into a slumber it will never wake up from.' + questAcceptDialog: + - '&a[Lutum Princeps]&f You can get to the maze by walking down the spiral staircase in the middle of the ruins.' + - + - + - '&7&oI should enter the &d&oRuins Maze&7&o and slay the &c&oEarth Elemental&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f I cannot believe it, you''re back. In one piece too!' + - + - + - + - '&7&oI need to tell &a&oLutum&7&o about my quest and the &d&oBlood Temple&7&o.' +primis_main_quest_24: + customObjectives: + Objective1: + dialog: + - '&a[Navita]&f You have returned! I hope you have good tidings.' + name: '&2There and back again' + questLore: + - We had no idea what was going on... Yes, + - '&dTerravilla&f will be able to pledge some' + - of our forces to your cause. I wonder if the + - '&cEarth Elemental&f awakening had anything' + - to do with the &dBlood Temple&f. We will + - prepare our forces and wait for word from + - '&dPontis Mille&f.' + questAcceptDialog: + - '&a[Lutum Princeps]&f So you are heading off to &dPontis Mille&f, make sure to tell the &aShogun&f that &dTerravilla&f will be ready to assist.' + - '&7&oI should head to &d&oPontis Mille&7&o and speak with &a&oShogun Navita&7&o.' + questCompleteMessage: + - '&a[Navita]&f It is good to hear that the &dIce Village&f has decided to join our cause! But I did not expect that you would manage to convince &dTerravilla&f to pledge to our cause as well.' +primis_main_quest_25: + customObjectives: + Objective1: + dialog: + - '&a[Outpost Officer]&fFILLER TEXT!' + name: '&2To the outpost' + questLore: + - It is so good to see you again friend! + - While you were gone we were preparing our + - forces. We have made an &dOutpost&f + - between the &dBlood Temple&f and &dPontis Mille&f. + - You should go there and report to the + - '&aOutpost Officer&f. They will let you know' + - how we shall proceed with the assault on the + - '&dBlood Temple&f.' + questAcceptDialog: + - '&a[Navita]&f The outpost is to the South of the city. Not too long now, before the additional forces from &dTerravilla&f and the &dIce Village&f arrive.' + - '&7&oI should head to the &d&oOutpost&7&o and speak with the &a&oOutpost Officer&7&o.' + questCompleteMessage: + - '&a[Outpost Officer]&f I GOT NO IDEA WHAT TO SAY CAUSE I AM NOT DONE' +primis_main_quest_3: + name: '&cBanditenlager!' + questLore: + - Ein &dBandit Camp&f in der Nähe wurde kürzlich gesichtet + - und versucht uns unter zu kriegen! + - Sie plündern ständig unsere Vorräte und entführen unsere Dorfbewohner! + - Sie nahmen sogar das Erbestück meines &eGroßvaters &f! + - Wir wissen nicht, was sie wollen, aber wir müssen sie loswerden! + - Finden Sie heraus, was sie tun, behandeln Sie sie und bringen Sie sie mit + - gib mir das Erbstück meines &eGroßvaters&f zurück! + questAcceptDialog: + - '&a[Chief Piscis]&f Das &dBanditenlager&f ist nicht weit entfernt, wenn du der Straße folgst!' + - + - + - Oh, und bringen Sie unbedingt das &eErbstück meines Großvaters mit&f! + - '&7&oIch sollte zum nahe gelegenen Banditenlager gehen und es räumen.' + questCompleteMessage: + - '&a[Stamm Fische]&f Ich sehe, du bist zurück! Bringst du gute Nachrichten?' + - '&7&oDu erzählst &aChief Piscis&7&o von dem Lager und gibst das &eErbstück&7&o ab.' + - + - + - + - + - '&7&Scheint so, als ob der Chief Piscis mir sagen will, wie ich hier rauskomme.' +primis_main_quest_4: + customObjectives: + Objective1: + dialog: + - '&a[Petrae]&f &2Chief Piscis&f sent you? Unfortunately the passage is closed, and the &cElemental&f guards it...' + name: '&9Blauer Blumenpfad!' + questLore: + - Wir müssen unsere Erkenntnisse über das + - '&dBanditen Camp&f zu &dGladius&f!' + - Der Bergpass wird von einem Alten bewacht + - mächtiger &cGolem&f, der um jeden Preis vermieden werden muss! + - Folgen den &eBlauen Blumen&f auf dem Pfad + - sie führen dich zu einer geheimen Passage + - durch die Berge! + - Ein Bergführer wartet am Ende auf dich + - der &9Blauen Blume &fpfad! + questAcceptDialog: + - '&a[Chief Piscis]&f Der Bergpass wird von einem extrem gefährlichen &cGolem&f bewacht, den du wahrscheinlich noch nicht besiegen kannst!' + - + - + - '&7&oIch sollte dem &9&Blauen Blumen &7&Pfad zum Bergführer folgen!' + - '&7&oIch sollte sicherstellen, dass ich alle Geschäfte, die ich noch übrig habe, abschliesse, bevor ich gehe.' + - '&7&oHinweis: Stellen Sie sicher, dass Sie die Quest verfolgen, um Ihr Ziel einfacher zu finden!' + questCompleteMessage: + - '&a[Petrae]&f Bist du sicher, dass du es riskieren möchtest? Ich kann dir helfen...' + - '&7&oScheint so, als hätte &aPetrae&f eine Bitte an mich.' +primis_main_quest_5: + name: '&5Das Kristallelement' + questLore: + - Sie müssen hier durch? Schlechtes Timing, mein Freund. + - Ein &5Kristallelementar &0ist in unsere Passage eingedrungen und hat sie stillgelegt + - und hat es verschlossen. + - Wenn du wirklich den Weg zu Gladius gehen musst, + - ' musst du dies &cElementar&f zuerst besiegen!' + questAcceptDialog: + - '&a[Petrae]&f Ihr wollt das &cKristallelementar&f besiegen? Ich kann dir nur Glück bei deinem Vorhaben wünschen!' + - + - + - '&7&Sieht so aus, als müsste ich den &5Kristallgolem&7&o besiegen.' + questCompleteMessage: + - '&a[Petrae]&f Hervorragend! Ich habe gesehen, wie du den &cKristallgolem&f besiegt hast, du hast eindeutig eine große Zukunft vor dir!' + - Jetzt wo wir auf der anderen Seite sind, lass mich dir den Weg zu &dGladius&f zeigen! +primis_main_quest_6: + customObjectives: + Objective1: + dialog: + - '&a[Filius] &fYou made it through the mountain! You don''t see that every day.' + - + - + - '&7&oSeem like &aFilius&7&o can help me find the way to &dGladius&7&o.' + name: '&5Der Bauernhof' + questLore: + - Der Weg zu &dGladius&f sollte einfach sein, aber mit + - all die Störungen, die wir gesehen haben, vermute ich + - das es ist vielleicht nicht so einfach wird. + - Ich bin mit dem &aEigentümer des Gehöfts&f gut befreundet + - die Straße runter. Wenn du ihnen sagen, dass ich dich geschickt habe, bin ich mir sicher + - Sie werden dir sagen, wie du &dGladius&f sicher erreichen kannst und + - informieren dich über Neuigkeiten aus der Umgebung. + - Viel Glück auf Ihren Reisen und locker bleiben! + questAcceptDialog: + - '&8[Petrae]&f Sagt einfach dem B&aesitzer des Gehöfts&f, dass ich Euch geschickt habe, obwohl ich gehört habe, dass der er schon eine Weile nicht mehr gesehen wurde.' + - + - + - Sicheres Reisen! + - '&7&oIch sollte dem Pfad zu &dFarmstead&7&o folgen und mit &aProprietor&7&o sprechen.' + questCompleteMessage: + - '&8aPetrae]&f Hervorragend! Ich habe gesehen, wie du den &cKristallgolem&f besiegt hast, du hast eindeutig eine große Zukunft vor dir!' + - Jetzt, da wir auf der anderen Seite sind, lass mich dir den Weg zu &dGladius&f! zeigen + - '&7&oIch sollte mit &aFilius&7&o sprechen, um den Weg zu &dGladius&7&o zu lernen und vielleicht sprechen Sie mit seinem &aMother&7&o um zu sehen, wie ich helfen kann.' +primis_main_quest_7: + customObjectives: + Objective4: + dialog: + - '&a[General Hasta] &fI can''t believe you made it past the enemies.' + - You are exactly the kind of help we need right now! + - '&7&oSeems like I should talk to &aGeneral Hasta&7&o.' + name: '&5Der Pfad zu Gladius' + questLore: + - Vor kurzem wurde der Rauch über die Festung von &dGladius&f gesichtet. + - Wir konnten nicht hingehen und sehen, was vor sich geht + - weil ein &dSchiff&f derzeit den Pfad blockiert. + - Wir wurden von einem Haufen untoter Kreaturen angegriffen + - als wir uns der &dSchiff&f näherten, also sind wir weggelaufen. + - Ich fürchte, Sie werden sich durch dieses Thema durchzwingen müssen. + - '&dSchiff&f um &dGladius&f zu erreichen. Ich bin sicher, dass sie es tun werden' + - Belohnen dich, wenn du dabei hilfst, die Zahl der &cUntoten&f auf diesem Schiff zu verringern! + questAcceptDialog: + - '&a[Filius] Sei vorsichtig auf der Straße, offensichtlich ist in &dGladius&f etwas schief gelaufen.' + - + - + - '&7&oIch sollte den Pfad zu &dGladius&7&o gehen und einige &cUntote Seeleute&7&o auf dem Weg dorthin ausschalten.' + questCompleteMessage: + - '&a[Lord Hasta]&f Wurde du als Verstärkung von Pontis Mille geschickt? Wo sind die anderen? Bist du ein Boter?' + - '&7&oIch sollte mit &aLord Hasta&7&o reden.' +primis_main_quest_8: + name: '&5Hoffnung wiederherstellen' + questLore: + - Wir haben diese Invasion nicht kommen sehen. + - Sie kamen in der Nacht der toten, trafen uns hart und schnell. + - Bevor wir es wussten was los ist, war die Hälfte der Stadt überrannt. + - Die Moral ist niedrig. Jeder hier hat jemanden verloren. + - Um unseren Kummer zu trotzen, ziehen unsere eigenen Lieben umher + - durch die Straßen in einer Verhöhnung des Lebens selbst. + - Wir müssen uns versammeln und die Moral stärken + - oder wir werden keine weitere Morgendämmerung sehen! + - Zurück in meinem &dMansion&f, in meinem Schatzamt, liegt ein &eDocument&f + - von größter Bedeutung. Es ist eine schriftliche Zusage mit + - einer der Gründer von &dPontis Mille&f um uns zu versorgen + - Hilfe in der Not. Das ist die Zeit. + - Erhalte das &eDocument&f, bringe es zurück zu mir und + - Ich verspreche dir, in &dPontis Mille&f willkommen zu sein mit + - offene Arme. Soldaten werden bis zu ihren letzten kämpfen + - wenn es diese kleine Hoffnung gibt. + questAcceptDialog: + - '&a[General Hasta] Die Notiz ist in meinem &dMansion&f. Stelle sicher, dass du sie zurückbringst. Meine Männer hier haben auch andere Wünsche rund um die Stadt, bei denen Sie helfen können, wenn möglich.' + - '&7&oIch sollte überprüfen, was die anderen Soldaten brauchen, und zum &dMansion&7&o am Stadtausgang gehen.' + questCompleteMessage: + - '&a[Lord Hasta]&f Ausgezeichnet! Diesen &eDocument&f mitten in einem Krieg wiederherstellen? Hätten wir 10 weitere von euch gehabt, dann wäre die Stadt nie überhaupt genommen worden!' + - Könnten Sie mir, bevor Sie gehen, einen kleinen persönlichen Gefallen tun? + - '&7&oScheint das &aLord Hasta&7&o mit mir sprechen möchte.' +primis_main_quest_9: + name: '&5Gladius'' Champion' + questLore: + - Bevor ich zu &dPontis Mille&f komme, habe ich eine + - persönliche Gefallen zu fragen. + - Unser &cChampion&f wurde zuletzt gesehen gegen eine Horde von + - Feinde in der Nähe des &dStatue&f. + - Wir haben von ihm seit dem Beginn der + - Invasion und in diesem Stadium befürchten wir das Schlimmste. + - Bitte sehen Sie nach ihm. Wenn Sie ihn finden und er ist + - in einen dieser Untoten verwandelt ... bitte befreie ihn von seinem Fluch. + questAcceptDialog: + - '&a[General Hasta] &fGeh zur &dStatue&f. Ich bin sicher, unser &cChampion&f leicht zu finden sein wird.' + - '&7&oIch sollte zur Statue gehen und nachforschen, was mit dem Champion von Gladius passiert ist.' + questCompleteMessage: + - '&a[General Hasta]&f Also... Das Schlimmste ist passiert. Ich werde dafür sorgen, dass diese Bestien für die Ermordung meines Sohnes bezahlen.' + - 7&oScheint, als hätte General Hasta ein paar Abschiedsworte für mich. +primis_ogre_mines_clear: + name: '&2Oger große Probleme' + questLore: + - Unser Bergbaulager wurde überrannt! + - Wir brauchen Hilfe! + - Ich weiß nicht wirklich, was passiert ist, aber wir müssen das klären + - das Lager und sprechen mit &aOld Vetus&f! + questAcceptDialog: + - '&a[Metus]&fIhr wollt helfen? Bitte beeilt euch, das Lager ist gleich hinter uns!' + - '&7&oIch sollte das Lager räumen und mit dem alten Vetus sprechen.' + questCompleteMessage: + - '&a[Vetus Fossores]&fSie sind gekommen, um zu helfen? Fantastisch, wir brauchen jetzt unbedingt Hilfe!' + - Hier ist etwas für deine Hilfe bei der Säuberung des Lagers! +primis_ogre_mines_lost_bretheren: + customObjectives: + Objective1: + dialog: + - '&a[Fortis Fossores] &fWhat do you want? What, &aFugit&f sent you? What for? The mines were overrun? Hah, I didn''t even notice!' + - + - + - + name: '&5Verlorene Brüder' + questLore: + - Die Mine wurde von &cOger&7&o überrannt! + - In der Verwirrung wurde ich von meinem &aBruder&f in den &dMine&f getrennt, + - und ich fürchte um seine Sicherheit! + - Er ist ein etwas exzentrischer Mann, der sich sehr dem Bergbau verschrieben hat. + - Du wirst es wissen, wenn du ihn gesehen hast! + - Bitte bringen ihn hierher zurück oder sagen mir zumindest, ob er in Sicherheit ist. + - Ich werde dafür sorgen, dass es deine Mühe wert ist! + questAcceptDialog: + - '&a[Fugit] &fBitte finden Sie meinen &aBruder&f und vergewissern dich, dass es ihm gut geht!' + - '&7&oIch finde &aFugits Bruder&7&o in den &dMines&7&o, die von &cOgres&7&o überrannt wurden.' + questCompleteMessage: + - '&a[Fugit Fossores]&f Mein &aBruder&f hat was gesagt? Ah, typisch für ihn, zu sehr auf seine Arbeit konzentriert, um zu bemerken, dass der ganze Ort übernommen wurde!' + - Wenn ich ihn das nächste Mal sehe, werde ich ein ernstes Gespräch mit ihm führen! + - + - +primis_ogre_mines_old_miner_quest: + name: '&eGlücksspitzhacke' + questLore: + - Wir haben ein kleines Problem! + - Beim Abbau stießen wir auf eine geheimnisvolle Höhle voller Monster! + - Ich habe meine Lieblings-&eSpitzhacke&f beim Laufen verloren, ich brauche deine Hilfe, um sie zu holen! + - Ich bin sicher, der &cOgre Magi&f hat es für sich selbst aufgehoben. + - Holt meine &eLucky Pickaxe&f von diesem Rohling zurück! + - Ich habe ein paar Schmuckstücke für dich, wenn du zurückkommst. + questAcceptDialog: + - '&a[Vetus Fossores]&f Dieser &cOgre&f sollte nicht weit sein! Sie finden ihn in der Höhle rechts vor dem eingestürzten Bereich.' + - Er sollte die &eSpitzhacke&f haben, &cOgres&f lieben schließlich glänzende Dinge! + - '&8&oIch sollte den &4Ogre Chief&8&o besiegen.' + questCompleteMessage: + - '&8[Vetus Fossores]&f Du hast meine Glückspitzhacke? Hervorragend!' + - Hier ist deine Belohnung! +primis_pontis_groves_acrobatics: + customObjectives: + Objective1: + dialog: + - '&a[Idoneitatem Hominem]&f Congratulations!' + name: '&2Akrobatik' + questLore: + - Denken Sie, Sie haben das Zeug dazu? + - Bist du fit genug, bist du schnell genug, bist du stark genug? + - Plattformen, Weine, gefährliche Höhen. Alles, was du je wollst! + - Die ultimative Herausforderung liegt vor uns! + - OK, OK. Ich und meine &aBruder&f könnten ein bisschen langweilig gewesen sein und + - hat einen ganzen Kurs für Akrobatik gemacht. + - Das Ziel ist es, mit &9Wines&f von Plattform zu Plattform zu kommen und + - '&9Acrobatics&f und erreichen das Ende des Kurses.' + - + - + - Du wirst mit einem sehr schönen &eItem&f belohnt! + questAcceptDialog: + - '&a[Posuere Hominem]&f Sie finden den Kursbeginn am &dEnde des Tunnel&f.' + - + - + - Vergiss nicht, mit meiner &aBruder&f am Ende des Kurses wegen der Belohnung zu fragen! + - '&7&oIch sollte zum Anfang des Kurses gehen.' + questCompleteMessage: + - '&a[Idoneitatem Hominem]&f Gut verdient! Ich hoffe, du hast nicht getäuscht! Versuche meinen Rekord zu schlagen, wenn du kannst.' +primis_pontis_groves_caught in the web: + name: '&2Gefangen im Netz' + questLore: + - "Also haben sie irgendwo einen &dNest&f in der &d\n\nHöle&f." + - Das würde erklären, warum ihre Bevölkerung gewachsen ist. + - + - + - Es wäre großartig, wenn du das &dNest&f finden und ausräumen könntest. + - Wir werden dir ein paar schöne &eSpinnen Stiefel &f als Belohnung machen! + questAcceptDialog: + - '&a[König Nemian]&f Wenn es eine &dNest&f gibt, bin ich sicher, dass es &9umgeben von Spinnenweben&f ist.' + - '&7&oIch sollte das &dSpinnen Nest&7&o finden und es auslöschen.' + questCompleteMessage: + - '&a[König Nemian]&f Hah! Ich wusste, wir konnten auf dich zählen!' + - Hier sind Ihre schönen Stiefel, gut verdient! +primis_pontis_groves_elf_stole_from_my_shelf: + name: '&2Elf gestohlen aus meinem Regal' + questLore: + - Das Unglück hat unser kleines Loch erreicht. + - Vor nicht allzu langer Zeit wurde unser schönes Zuhause von &cElf Bandits&f überfallen. + - Zum Glück waren wir damals nicht zu Hause, so dass niemand verletzt wurde. + - Wir haben es geschafft, die meisten unserer Besitztümer zu ersetzen. + - Das Hotel liegt sehr zentral und trotzdem ruhig. + - Wenn Sie so freundlich sind zu versuchen, es für mich wieder zu bekommen, wäre ich sehr dankbar. + - Ich mache die besten Eintöpfe, ich würde gerne einige mit dir teilen. + questAcceptDialog: + - '&a[Luxuria Gorgonius]&f Das &eErbstück&f ist ziemlich wertvoll, ich bin sicher, dass sie es behalten würden und &9Irgendwo extra sichere&f.' + - '&7&oIch muss das &eErbstück&7&o abrufen.' + questCompleteMessage: + - '&a[Luxuria Gorgonius]&f Oh! Du hast es gefunden!' + - Es gibt nicht genug Dank in der Welt für das, was du gerade für mich getan hast. + - '&7&oDieser Eintopf sollte für eine Weile ernähren.' +primis_pontis_groves_into_the_next_hole: + customObjectives: + Objective1: + dialog: + - '&a[Phygia Gorgonius]&f Time to kick those &cElves&f out for good!' + name: '&2In die nächste Höhle...' + questLore: + - Wenn du noch Zeit hast, hier gibt es noch viel zu tun. + - Wir haben einige ernste &cElfen&f Probleme + - aber ich habe &aPhygia&f gebeten diese Probleme zu lösen. + - Sprechen Sie mit &aPhygia Gorgonius&f in der Höhle neben dieser. + - Sie werden Ihnen mehr sagen können und was zu tun ist. + questAcceptDialog: + - '&a[König Nemian]&f Das Loch direkt neben diesem, kann man nicht verfehlen!' + - '&7&oIch sollte mit &aPhygia Gorgonius&7&o reden.' + questCompleteMessage: + - '&a[Phygia Gorgonius]&f Lass uns reden...' + - '&7&oIch sollte &aPhygia Gorgonius&7&oIch zuhören.' +primis_pontis_groves_lighthouse_1: + customObjectives: + Objective1: + dialog: + - '&a[Alanus Secundas] &fHas the &dGrove&f sent you?' + name: 'Krankenpflege' + questLore: + - Wanderer, könnte ich dich um etwas bitten? + - + - + - Aber seit die Probleme begannen, konnten wir unsere &dWald&f nicht verlassen. + - Würden Sie so freundlich sein, die Familie mit neuer Nahrung zu versorgen? + - Es wäre großartig, wenn Sie sich beeilen könnten, es ist schon eine Weile her seit der letzten Lieferung. + questAcceptDialog: + - '&a[König Nemian]&f Wenn du das Loch verlässt, ist der &dLeuchtturm&f geradeaus und ein bisschen nach links.' + - '&7&oIch sollte zu &dLeuchtturm&7&o gehen.' + questCompleteMessage: + - '&a[Alanus Secundas]&f Ich bin so dankbar! Fast wäre uns das Essen augegangen.' + - Bist du beschäftigt? + - '&7&oScheint das &aAlanus&7&o mit mir sprechen möchte.' +primis_pontis_groves_lighthouse_2: + customObjectives: + Objective1: + dialog: + - '&8[Jeeves]&fOh, hello there again!' + - '&8[Jeeves]&f They do not need the food anymore? I was just about to go shopping.' + - '&8[Jeeves]&f So kind of you to come here and let me know.' + name: '&2Frage Jeeves nicht.' + questLore: + - Äh, bevor du gekommen bist. Jeeves the Travelling Merchant war da. + - Wir haben ihn gefragt, ob er etwas Essen für uns hätte. + - + - + - + - + questAcceptDialog: + - '&8[Alanus Secundas]&f Wenn du die Wohnung verlässt, ist der Leuchtturm geradeaus und ein bisschen nach links.' + - '&8&oIch sollte zum Leuchtturm gehen.' + questCompleteMessage: + - '&8[Alanus]&f Du hast es ihn wissen lassen? Gut, gut!' + - '&8&oScheint, als wäre Alanus ziemlich satt.' +primis_pontis_groves_population_control: + name: '&2Bevölkerungskontrolle!' + questLore: + - Oh, ich bin so glücklich, dass endlich jemand gekommen ist, um uns zu helfen. + - Wir haben ein großes Spinnentier-Problem in unserem kleinen Wäldchen. + - Es gibt so viele Spinnentiere in diesen Tagen, dass du nicht einmal + - nimm einen schönen Abendspaziergang ohne einen der üblen Burschen + - aus dem Schatten auf dich spring. + - Es ist klar, dass ihre Bevölkerungszahlen einer ernsthaften Keulung bedürfen. + - Oh! Bitte bringt mir alle Spinnenbeine, die noch in gutem Zustand sind. + - Wir verwenden sie, um kleine Kräne und Greifer herzustellen. + questAcceptDialog: + - '&8[König Nemian]&f Du wirst sie im Schatten der Bäume finden.' + - '&8&oIch muss Forest Crawlers finden und sie töten' + questCompleteMessage: + - '&8[König Nemian]&fGut das du zurück bist und mit vielen Beinen hast du auch dabei!' + - '&8[König Nemian]&fDu denkst, dass ihr Nest in der Nähe sein könnte? Lassen Sie uns mehr darüber sprechen' +primis_pontis_groves_tree_climbing_elf_bandits: + name: '&2Baumkletternde Elfenbanditen!' + questLore: + - + - + - Nicht, dass die &cSpinnen&f genug wären, + - jetzt haben sich diese schattenliebenden Poop-Nüsse entschieden, sich in unseren Bäumen niederzulassen! + - + - + - + - + - Mit ihrer Überzahl drangen sie ein. + - Nun, sie haben etwas in Ordnung, + - Ein Blick auf dich und ich kann sagen, dass du mit ein paar Steinriesen umgehen kannst! + - Ich bin sicher, einige Elfen werden kein großes Problem für dich sein. + - + - + questAcceptDialog: + - '&a[Phygia Gorgonius]&f Ich bin sicher, Sie werden viele von ihnen finden, wenn Sie einen schattigen Platz finden und einfach nach oben schauen, ihre Baumhäuser sind kaum zu übersehen.' + - '&7&oIch sollte mich um diese &cElves&7&o kümmern, bevor &aPhygia&7&o vor Wut Feuer fängt.' + questCompleteMessage: + - '&a[Phygia Gorgonius]&f Mein Freund! HAHAHA! So schön, dich wieder zu sehen!' + - + - + - '&7&oDie Elfen stören nie wieder &aPhygia&7&o.' +primis_pontis_mille_fields_berry_crazed_wolf: + name: '&2Beere Wölfe verrückt' + questLore: + - Oh gosh, ich habe keine Ahnung, was mit diesen &cRockhounds&f nicht stimmt. + - Sie kommen immer wieder in die &dBeeren Farm&f während ich weg bin oder schlafen. + - Sie würden denken, sie kommen hierher und essen die Beeren, aber nein! + - Sie laden den Mund voll mit ihnen und tragen sie + - irgendwo hin in den tiefen Wald. + - Ich meine, sie sind &cHunde&f! Warum stehlen sie Beeren. + - Nun, ich schätze, es spielt keine Rolle, ich muss dich um einen Gefallen bitten. + - Könntest du das klar machen + - '&9Gebiet hinter dem Berry Farm&f,' + - und bring meine &eGestohlenen Beeren&f zurück. + - Ich muss viele Kuchen backen und die Beeren, die sie gestohlen haben, waren reif und lecker. + questAcceptDialog: + - '&a[Dordalus Nasica]&f Ich sah nur die &cRockhounds&f die Beeren stehlen.' + - '&7&oIch sollte die &c&oRedwood Rockhunds&7&o töten und alle &e&ogestohlenen Berren&7&o sammeln, die sie fallen gelassen haben..' + questCompleteMessage: + - '&a[Dordalus Nasica]&f Krass Alter, du hast es getan. Könnte ich dich um einem weiteren winzigen Gefallen bitten?' + - '&7&o Anscheinend hat &d&oMilonia&7&o mehr Arbeit für mich.' +primis_pontis_mille_fields_camping_hunters: + customObjectives: + Objective1: + dialog: + - '&a[Scribonia Ingenvinus]&f Yes?' + name: '&2Camping Jäger' + questLore: + - Ich hoffe, ich störe dich nicht. Du siehst aus wie jemand, der auf eine Bitte hören würde. + - Wir haben hier im &dSlums&f nicht viel zu tun + - die meisten von uns wandern gerne in den &dFeldern&f, um die Zeit zu verpassen. + - Unglücklicherweise ist das nach einem Haufen gestoppt + - von &cMonsters&f fingen an, durch die &dFields&f zu streifen. + - Wir haben gehört, dass einige Jäger &dCamp&f in der Nähe von den &dFeldern&f gemacht haben. + - Wenn du dorthin gehen und mit ihnen sprechen könntest und sie bitten mit diesen &cMonsters&... + questAcceptDialog: + - '&a[Augustina Verrucosis]&f Ihr &dCamp&f sollte irgendwo nordwestlich von hier sein.' + - '&7&oIch muss zum &d&oJäger Camp&7&o.' + questCompleteMessage: + - '&a[Scribonia Ingenvinus]&f Den &dSlums&f bei ihrem &cMonster&f-Problem helfen?' + - Lass uns mehr darüber sprechen. + - '&7&oIch sollte mit &a&oScribonia&7&o sprechen und hören, was sie zu sagen hat.' +primis_pontis_mille_fields_camp_hunter_three_times_hunter: + name: '&2Jäger dreimal Jäger' + questLore: + - Du hast also &aVolumnia&f gefunden. Danke an die großen Jäger, die sie in Ordnung ist. + - Seit du &aVolumnia&f geholfen und dir eine freundliche Seele bewiesen hast. + - Wie wäre es mit einer freundlichen Herausforderung. Ich wäre bereit, dir ein paar nette Angebote zu unterbreiten + - hochwertige Rüstung sollte man sich der Herausforderung stellen und siegreich zurückkehren. + - Die Herausforderung ist die Jagd + - '&cDrei große Bestien&f verstreut über Pontis.' + - Das &cBeast Cod Furiosa&f, das unter einer Brücke schwimmt, wo zwei Berge stehen. + - '&cBeast Crawler Megdun&f that slumbers on top of a sun covered grove.' + - Tanz zwischen zwei westlichen Gipfeln findet man das + - '&cBeast Impaler Uladzimir' + - + - + questAcceptDialog: + - '&a[Milonia Majus]&f Hier nehmen Sie dieses Gerät, es wird Sie grob zu ihrem Standort führen.' + - '&7&oIch sollte gehen und die &c&oDrei großen Bestien herausfordern &7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f Du bist zurückgekehrt. Und du hast alle drei Elemente mitgebracht, die ich als Beweis angefordert habe.' + - + - + - Nun genug über mich geredet, hier ist deine Belohnung wie versprochen! + - '&7Du übergibst das Bestienverfolgungsgerät zurück.' + - '&a[Milonia Majus]&fI hatte diese Sache fast vergessen, danke!' + - Bis wir uns wieder treffen, große Jäger! +primis_pontis_mille_fields_do_it_yourself: + name: 'Lancez-vous !' + questLore: + - Handel mit &cMonsters&f? Nun, ich kann Ihnen sagen, dass wir das bereits getan haben. + - Es gibt einfach zu viele von ihnen und nicht genug von uns. + - Wir fingen an, sie zu jagen, sobald wir unser &dCamp&f hier aufgeschlagen hatten. + - Aber ihre Zahlen scheinen einfach nicht zu sinken. + - Und das ist noch nicht einmal das Schlimmste. + - Wir haben ein Versteck und ein großes altes &cBest&f entdeckt, das dazugehört! + - Da ihr es heil zu unserem &dCamp&f geschafft habt, + - Ich nehme an, Sie sind selbst ziemlich fähig. + - Wie wäre es mit der Jagd? Hast du Lust? + questAcceptDialog: + - '&a[Scribonia Ingenvinus]&f Ich wusste, dass du ja sagen würdest! Ich sehe, du bist bereits gut ausgerüstet.' + - OK, das ist, was ich möchte, dass du tust. + - + - + - Ich brauche dich, um 5 &cLanghörner&f und 6 &cKurzhörner&f zu töten. + - Verstanden? Gut. Melden mir, wenn Sie fertig sind. + - '&7&oIch sollte &c&oGrosser alter Bubba&7&o töten und 5 &c&oLanghörner&7&o und 6 &c&oKurzhörner&7&o.' + questCompleteMessage: + - '&a[Scribonia Ingenvinus]&f Ich muss sagen, dass ich ziemlich beeindruckt bin.' + - Natürlich bist du weit mehr als nur "fähig". + - Vielen Dank für die Hilfe, den Rest erledigen wir. + - Bis wir uns wieder treffen, große Jäger. +primis_pontis_mille_fields_feeding_the_hungry: + customObjectives: + Objective3: + dialog: + - '&7You hand the over the bread and the flour.' + - '&a[Rufia Tertulus]&f I don''t know what to say. My children will be so happy!' + - '&7The woman bows to you in deep appreciation.' + Objective4: + dialog: + - '&a[Fabia Praetextus]&f I guess fantasies do come true sometimes. I am eternally grateful to you kind sir.' + Objective1: + dialog: + - '&a[Lena Lucan]&f Fresh bread! I cannot thank you enough!' + Objective2: + dialog: + - '&a[Tranio Florens]&f Wow! The day just keeps getting better!' + - Thank you for the flour kind soul. + name: '&2 Die Hungrigen speisen' + questLore: + - Ich kann ein gutes Herz in deiner Brust schlagen fühlen. + - Nicht jeder ist so glücklich wie du und ich. + - In den &dPontis Mille Slums&f leben einige arme Seelen. + - Seit geraumer Zeit arbeite ich an + - Zeit, um überschüssige Brot und Mehl zu produzieren. + - Würdest du bitte diese Säcke Weizen und diese Brotstapeln mitnehmen. + - Dann mit ihnen zu den &dSlums&f reisen und sie an die Bedürftigen verteilen? + - Ich habe das schon eine Weile getan, aber ich habe meinen linken Fuß verletzt, + - so kann ich jetzt nicht viel zu Fuß gehen. + questAcceptDialog: + - '&a[Daemones Maritialis]&f Ich wünschte, es gäbe mehr Leute wie dich in der Welt.' + - Die &dSlums&f sind gerade nördlich von hier, du kannst die Gebäude in der Ferne sehen. + - '&7&oIch sollte zum &dSlums&7&o gehen und das Essen an die Bedürftigen verteilen.' + questCompleteMessage: + - '&a[Augustina Verrucosis]&f &2Daemones&f hat dich hier nicht gesendet.' + - + - + - Vielen Dank an Fremde, meine Familie wird dies nicht vergessen. +primis_pontis_mille_fields_fruity_hound: + name: '&2Fruchthund' + questLore: + - Da du mein NUMMER EINS Beerenrückgewinnungsmittel bist, + - Wir haben nun eine weitere Aufgabe für dich. + - Wie du siehst, züchten wir auf unseren + - kleine &dBeeren Farm&f hier. + - Es gab eine + - '&eSpezialen Beeren &f Wettbewerb.' + - Aber als ich zur &dBeeren Farm&f ging sah ich ein + - '&cFruchtiger Rockhound&f springt mit meiner wertvollen Beere in den Busch.' + - Er schnappte ihn ab und trug ihn weg. + - Seine Kiefer hielten die Beere so am Stiel fest + - es sollte noch in einem Stück sein, hoffe ich. + - Wenn du das Biest tötest und meine + - lieber &eContest Berry&f Ich werde ein schönes haben + - belohnung wartet auf dich. + questAcceptDialog: + - '&a[Dordalus Nasica]&f Ich glaube, ich sah den &cHound&f Kopf in den &dRedwoods&f, Nordwestlich des Bauernhofs.' + - '&7&oIch sollte den &c&oFruity Hound&7&o erlegen und sehen, ob der &e&oContest Berry&7&o noch in einem Stück ist.' + questCompleteMessage: + - '&a[Dordalus Nasica]&f JA! Das ist mein Liebling! Gut und ganz, nicht einmal irgendein Speichel darauf!' + - + - + - + - +primis_pontis_mille_fields_not_on_my_farm: + name: '&2Nicht auf meinem Bauernhof!' + questLore: + - In letzter Zeit haben mich alle diese &cRatten&f verrückt gemacht. + - Sie gehen immer wieder in unsere kleine Farm und essen alle unsere Ernte! + - Hast du eine Lösung um ihre Anzahl zu reduzieren? + - Seien Sie vorsichtig, es gibt so viele von ihnen. + - Oh, ich habe fast vergessen, dir zu sagen. + - Wenn Sie einen großen &cFette Ratte&f sehen, stören Sie sich nicht. + - Sie ist so groß und fett gewachsen, es würde Tage dauern, um es zu töten. + questAcceptDialog: + - '&a[Milonia Majus]&f Ihr habt sicher schon bemerkt, dass sie sich gerne im Wegbereich winden.' + - '&7&oIch sollte die &cRatten&7&o töten, die sich um den Pfad herumtreiben, der zu &dPontis Mille&7&o führt.' + questCompleteMessage: + - '&a[Milonia Majus]&f Vielen Dank! Wir können jetzt wieder auf die Herstellung köstlicher Produkte zurückkommen.' +primis_pontis_mille_fields_surprise_me_with_flour: + customObjectives: + Objective3: + dialog: + - '&a[Adulescens Lupis]&f I heard the farm was having &cRat&f problems. Three sacks of flour coming up, no problem!' + Objective1: + dialog: + - '&a[Dinia Niraemius]&f Flour? Sure, one sack of flour coming up!' + Objective2: + dialog: + - '&a[Daemones Maritialis]&f The farm needs more flour eh? Here ya go, two sacks!' + name: '&2Überraschung mit Mehl' + questLore: + - Wow, du bist ziemlich praktisch. Wenn ich dich mit einer anderen Aufgabe beschäftigen könnte. + - Die &cRatten&f hatte unseren gegenwärtigen Mehlbestand komplett ruiniert. + - Wir brauchen also eine völlig neue Versorgung mit Mehl. + - Die &dWindmühle&f sollten reichlich davon haben. + - Geh und sammle das Mehl und bring es hierher zu mir. + - Ich werde gute Münzen für diesen Service bezahlen! + questAcceptDialog: + - '&a[Milonia Majus]&f Du musst das Mehl von allen drei &dWindmühlen&f sammeln.' + - '&7&oIch muss die drei &dWindmühlen&7&o besuchen und das Mehl einsammeln, das sie produzieren.' + questCompleteMessage: + - '&a[Milonia Majus]&f Dies sollte uns eine ganze Weile dauern!' + - Hoffentlich wird unser Mehltab nicht zu groß, hehe. +primis_pontis_mille_fields_wellness: + name: '&2Wohlbefinden' + questLore: + - Ich freue mich, dich jetzt zu sehen! + - Dang &cNightmare Rat&f überfiel mich, als ich den Brunnen hinunterkletterte. + - Ich habe meinen Arm und die Beine verletzt, als ich fiel. + - Argh, ich habe noch etwas von seiner giftigen Spucke in meinen Augen. + - Glücklicherweise ist es mir gelungen, den Weg hierhin zu kriechen + - Vorsprung, bevor er mich erledigen könnte. + - Wie peinlich, ich bin mir nicht sicher, was gerade mehr schmerzt, mein Körper oder mein Stolz. + - Ich habe eine + - '&eErste Hilfeausrüstung&f' + - in meiner Truhe auf dem &dHunters Camp&f. + - Würdest du es für mich hoilen? Ach, und erzähle es bitte niemanden + - ' ein Wort über das, was du hier gesehen hast.' + - '...fast in einem Brunnen gestorben ... das ist Kapitel meines Lebens, das ich löschen muss...' + questAcceptDialog: + - '&a[Volumnia Zoilus]&f Das &dJägercamp&f liegt direkt im Süden, kann es nicht verfehlen, suche nach Zelten' + - '&7&oIch muss die &e&oErste-Hilfe-Ausrüstung&7&o für &a&oVolumnia&7&o im &d&oHunters Camp&7&o abholen.' + questCompleteMessage: + - '&a[Volumnia Zoilus]&f Bereits zurück? Bring mir die Ausrüstung.' + - Mach dir keine Sorgen um mich, ich werde mich in kürzester Zeit zusammenflicken lassen. + - Danke für alles! Du hast mein Leben gerettet, weißt du! +primis_pontis_mille_field_check: + customObjectives: + Objective1: + dialog: + - '&a[Augustina Verrucosis]&f Oh, this is quite important! I will let the residents know.' + - Thank you for delivering these important documents. + name: '&2Feldüberprüfung' + questLore: + - Wenn ich dich mit einigen Lieferaufgaben beauftragen könnte. + - Ich habe hier einige wichtige Dokumente, die an die + - '&dSlums&f und zu den &dFeldern&f.' + - Der Soldat, der kommen und sie holen sollte, ist noch nicht da. + - Und das ist eine dringende Angelegenheit, auf die wir nicht länger warten können. + - Leider habe ich strenge Anweisungen, meine Post nicht zu verlassen. + - Wenn Sie das für mich tun könnten, würde es uns sehr helfen. + questAcceptDialog: + - '&a[Godefridus Novation]&f Du wirst es tun? Hervorragend!' + - Du kannst dem &9Gelben Pfad&f folgen, um zu den Slums zu gelangen. + - Die &dFelder&f sind rechts über die Slums hinaus, folgen Sie einfach dem Pfad. + - Oh! Achte auf die Feldratten! + - '&7&oIch sollte zu den &d&oSlums&7&o und dann zur &d&oFeldern&7&o fahren.' + questCompleteMessage: + - '&a[Milonia Majus]&f Dokumente? Lass mich sie sehen. Hmmm, sieht offiziell aus.' + - Vielen Dank, dass Sie bis hierher gekommen sind, um diese zu liefern. + - '&7&oScheint das &a&oMilonia&7&o könnte meine Hilfe mit der Ratte...' +primis_pontis_mille_fresh_rats_coming_up: + customObjectives: + Objective1: + dialog: + - '&a[Elite Guard]&f Plenty of rats inside.' + name: '&2Frische Ratten erscheinen' + questLore: + - Kein Katzenfutter, aber ich denke, ich kann dir helfen + - finde etwas noch besser... + - Ich hörte ein paar von + - '&aWächter&f haben sich beschäftigt mit' + - Eine Beeinträchtigung der Ratten in den unteren Teilen der Stadt. + - Gehe runter und vielleicht bekommst du einige + - '&cRatten&f für deinen Katzenfreund.' + questAcceptDialog: + - '&7&oIch sollte sich den unteren Teil der Stadt ansehen und sehen, ob ich die &a&oElite Wachen &7&o finden kann.' + questCompleteMessage: + - '&a[Mew Meowzer]&f Meow. MEOW! Prrrrr.' + - '&7&oIch sollte der Katze das Essen in Ruhe genießen lassen.' + - '&7&oEs scheint etwas fallen gelassen zu haben, hmm...' +primis_pontis_mille_hungry_friend: + customObjectives: + Objective3: + dialog: + - '&a[Melaenis Gelasius]&f Cat food? Where the heck did you manage to find a cat here...' + - No, I don't know where to get any cat food. + Objective4: + dialog: + - '&a[Sulpicio Panthera]&f I wish I could help, sorry.' + Objective1: + dialog: + - '&a[Royal Guard]&f Do I look like someone who keeps track of cat food?...' + Objective2: + dialog: + - '&a[Tyndarus Faustinius]&f Sorry, I have no idea.' + Objective5: + dialog: + - '&a[Tyndarus Columbanus]&f We used to have cat food around here somewhere, but heck knows what happened to it...' + name: '&2Hungriger Freund' + questLore: + - '&7&oWas ist falsch kleine.' + - '&a[Mew Meowzer]&f Miao!' + - 'Bist du hungrig? Will der' + - '&7&okleine mehr Essen haben?' + - '&a[Mew Meowzer]&f MIAUUUU!!!' + - '&7&oLet''s sehen, ob wir können' + - 'Ich habe dir etwas zu essen mitgebracht.' + questAcceptDialog: + - '&7&oIch sollte sehen, ob jemand in der Stadt weiß, wo man Katzenfutter finden kann.' + questCompleteMessage: + - '&a[Modestus Aper]&f Katzenfutter? Ich weiß nicht darüber. Aber...' + - '&7&oAnscheinend wie &a&oModestus&7&o vielleicht etwas weiß...' +primis_pontis_mille_late_delivery: + name: '&2Late delivery' + questLore: + - I ordered some &eFishing Nets&f from + - '&dGladius&f that haven''t arrived yet. I wonder' + - if something might have happened to the + - shipment. If you are willing, I would pay you + - a small fee if you could go see what + - happened to the shipment and get the + - '&eFishing Nets&f for me.' + questAcceptDialog: + - '&a[Delphium Calpurnius]&f Last I heard my shipment of &eFishing Nets&f was supposed to be heading for &dGladius&f.' + - '&7&oI need to go look around &d&oGladius&7&o for &a&oDelphium''s&7&o shipment of &e&oFishing Nets&7&o.' + questCompleteMessage: + - '&a[Delphium Calpurnius]&f Those are the &eFishing Nets&f! Thank you so much!' + - '&a[Delphium Calpurnius]&f I invested a lot of my savings into these! Not sure what I would have done if you hadn''t found them.' +primis_pontis_mille_let_them_know: + customObjectives: + Objective3: + dialog: + - So Fortes sent you? I see. + - Your help would be much appreciated, aid me and my forces will be ready. + Objective1: + dialog: + - So Fortes has decided to take action. + - Help me finish my task, and my forces will be ready. + Objective2: + dialog: + - So Fortes has decided to act. + - If you could assist me with this task, then my forces will be ready. + name: '&2Lassen Sie es wissen!' + questLore: + - I am sorry that we cannot send aid to &dGladius&f right away. + - Ever since that new &cCounselor&f came, our ruler has not been himself. + - If you could reach out to the &aGenerals&f in the city and let them know + - that &dGladius&f needs help we might be able to to do something about it. + - Doch erst einmal befassen wir uns mit den bestehenden Fragen. + - + - + - Sprich mit ihnen und komm dann zurück, um mir mitzuteilen, dass sie die Nachricht erhalten haben. + - Ich möchte dich, für deine Dienste belohnen. + questAcceptDialog: + - '&a[Fortes]&f Follow the &9orange path&f from the main room to find &aGeneral Bromia&f.' + - '&a[Fortes]&f At the end of the &9yellow path&f you will find the &aGeneral Rogerius&f.' + - '&a[Fortes]&f At the end of the &9shorter purple&f path you will find the &aGeneral Cylindrus&f.' + - '&7&oI need to talk to the three &a&oGenerals&7&o.' + questCompleteMessage: + - '&a[Fortes]&f You managed to contact them? Excellent!' + - '&a[Fortes]&f Here is your reward. Don''t spend it all in one place.' +primis_pontis_mille_lighthouse_1: + customObjectives: + Objective1: + dialog: + - '&8[Hegio Remus]&f Another letter? Thank you for bringing it to me.' + name: '&2Eine schnelle Lieferung' + questLore: + - Könnten Sie diesen Brief für mich liefern, bevor Sie irgendwo hingehen? + - Sie können den Herrn finden, zu dem es zu gehen auf dem Leuchtturm. + - Keine Sorge, der Leuchtturm ist direkt hinter mir durch diese Tür. + questAcceptDialog: + - '&8[Fortes]&f Vielen Dank.' + - '&8&oIch sollte mit dem Pontis Mille Leuchtturm Wächter sprechen.' + questCompleteMessage: + - '&8[Hegio Remus]&f Hey, hast du eine Sekunde?' + - 'Sprich mit ihnen und komm dann zurück, um mir mitzuteilen, dass sie die Nachricht erhalten haben.&8&oSieht so aus, als ob Hegio Remus will, dass ich mit ihm rede.' +primis_pontis_mille_lighthouse_2: + customObjectives: + Objective1: + dialog: + - '&a[Jeeves]&f Oh, we meet again. It''s good to see you.' + - You have something for me? Oh, wow...that is quite the shopping list. + - I will have the items sent back to &aHegio&f as soon as possible. + - Thank you for stopping by. Hope we meet again. + - '&7&oI should let &aHegio&7&o know I delivered the note.' + name: '&2Jeeves fragen' + questLore: + - Würdest du das Portal nehmen und meinem guten Freund &aJeeves&f eine Notiz zukommen lassen. + questAcceptDialog: + - '&a[Hegio]&f Sehr geschätzter Freund.' + - '&7&oIch sollte mit &aJeeves&f in &dCaeruleaum Village&7&o sprechen.' + questCompleteMessage: + - '&a[Hegio]&f Sie haben die Notiz geliefert? Hervorragend!' + - Hier kannst du einige dieser &eKarnickeleintöpfe&f haben, die ich in meiner Rückentasche halte. +primis_pontis_mille_mines_goblined_up_in_the_maze: + customObjectives: + Objective3: + dialog: + - '&a[Hurt Guard]&f Am so I happy to see you!' + Objective1: + dialog: + - '&a[Injured Guard]&f Thank the skies!' + Objective2: + dialog: + - '&a[Wounded Guard]&f Finally, the rescue is here!' + name: '&2Goblined oben im Labyrinth' + questLore: + - Wenn ich dich kurz stören dürfte. + - Da du schon in die &dMines&f gehen wirst, ist es + - wäre großartig, wenn du uns helfen könnten, einige Probleme zu lösen. + - Wir vermisse drei &aWachen&f + - in die Minen, um einen &cVerfluchter Kobold&f zu jagen. + - Ich fürchte, dass etwas Schlechtes passiert sein könnte. + - '&cVerfluchte Goblin&f soll sein' + - verstecken sich in irgendeiner Art von &9Labyrinth &f in der &dMines&f. + - Könnten Sie die &aFehlenden Wachen &finden und + - bringe mir den Beweis des &cGoblins&f Todes. + questAcceptDialog: + - '&a[Centurion]&fVersuche dich nicht im &9Labyrinth&f zu verirren.' + - Möge Glück auf deiner Seite Krieger sein! + - '&7&oIch sollte durch die &d&oMines&7&o wagen und den &9&oGoblin König &7&o besiegen.' + questCompleteMessage: + - '&a[Centurion]&f Sie sind lebendig, hervorragend, wir werden einige Soldaten schicken, um sie so schnell wie möglich aus der Welt zu schaffen.' + - Ich sehe, dass du den Beweis für den &cGoblins&f Tod gebracht hast, gut gemacht. + - '&7&oHoffentlich halten sich die Leute in der Zukunft aus dem &9Labyrinth &7&o heraus.' +primis_pontis_mille_serious_sewage: + customObjectives: + Objective3: + dialog: + - '&a[Michelangelo]&f Tell that old man everything is in order!' + Objective4: + dialog: + - '&a[Raphael]&f Tell Rogerius I am alive and doing fine!' + Objective1: + dialog: + - '&a[Donatello]&f You can tell the General I am doing just fine!' + Objective2: + dialog: + - '&a[Leonardo]&f The General should not worry, I am ok!' + name: '&2Seriöse Abwasseranlage' + questLore: + - Wenn du der Aufgabe gewachsen sind, dann könnte ich deine Hilfe benutzen. + - + - + - + - + - Sie haben einen Führer, ich glaube, er nennt sich &cShreepper&f oder so. + - Achten Sie darauf, ihn loszuwerden, eine Schlange ohne den Kopf ist keine Bedrohung. + - Wenn Sie da runtergehen und die Zahl der Viecher und der Störenfriede verringern könnten + - dann würde mir das erlauben, meine Kräfte wichtigeren Aufgaben zuzuweisen ... + - Wir hatten auch &a4 Agenten&f dort unten geschickt, ich habe noch nicht von ihnen gehört. + - + - + - Ich habe auch meine persönlichen &eAbwasserschlüssel &verlegt + - wenn du dir auch finden könntest, wäre das super. + questAcceptDialog: + - '&a[Rogerius]&fSie können zu den &dKanalisationen&f gelangen, indem Sie zum Brunnen gehen und dann ein Stück nach Südosten.' + - + - + - '&7&oIch muss meinen Weg in die &dKanalisation finden&7&o und die Aufgaben erledigen.' + questCompleteMessage: + - '&a[Rogerius]&f Du hast alles erledigt, worum ich gebeten habe? Wenn ich nur noch 10 Männer wie dich hätte...' +primis_pontis_mille_star_gazing: + customObjectives: + Objective1: + dialog: + - '&a[Virgo Dexippus]&f Yes, what is it?' + name: '&2Sterne beobachten' + questLore: + - Du hast so viel für diese Stadt und ihre Menschen getan. + - Nachdem ich den drei &aGenerälen&f assistiert hatte und den Gebieten um &dPontis Mille&f geholfen hatte + - hat einen ernsthaften Teil unserer Kräfte und Ressourcen freigesetzt. + - Wir wären in der Lage, unsere Truppen zu entsenden, um &dGladius&f zu helfen. + - Bevor wir jedoch etwas unternehmen, möchte ich dich bitten, eine letzte Sache zu tun. + - Du solltest mit dem &aSterngucker&f sprechen. + - Es betrifft unsere verlorene Geschichte und die &cElementals&f. + - Die &aSternengucker&f werden dir mehr sagen können, sobald du mit ihnen redet. + - Hier, nimm diese versiegelte Brief und zeige ihn ihnen. + questAcceptDialog: + - '&7[Fortes Bellator]&f Du kannst die &aSternengucker&f unter &dObservatorium&f finden.' + - + - + - '&7&oIch sollte mit den &aSternengucker&7&o unter &dObservatorium&7&o sprechen.' + questCompleteMessage: + - '&a[Virgo Dexippus]&f Der &aMajor&f hat dich geschickt? Das muss wichtig sein.' + - '&7&oIch sollte mit &aVirgo&7&o sprechen.' +primis_pontis_mille_stay_a_while_and_listen: + name: '&2Bleib eine Weile und höre' + questLore: + - Hand mir den Hinweis. Lass mich einen Blick werfen... + - Uns wurde die Erlaubnis erteilt, wichtige Teile zu teilen + - Informationen mit Ihnen über unsere Vergangenheit. + - Sie müssen etwas ganz Wichtiges getan haben. + - Diese Informationen werden normalerweise nur mit den obersten Kreisen geteilt. + - '&aStella&f wird mit dir teilen, was wir aufgedeckt haben.' + questAcceptDialog: + - '&a[Virgo Dexippus]&f Sprechen Sie mit &aStella&f und &9Klicken auf das Schwert&f, um zuzuhören.' + - '&7&oIch sollte mit &aStella&7&o sprechen und die &9Arena Herausforderung &7&o starten.' + questCompleteMessage: + - '&a[Virgo Dexippus]&f Diese Informationen nicht an Dritte weitergeben.' + - '&7&oDas war eine ganze Geschichte.' +primis_pontis_mille_the_groves_call: + customObjectives: + Objective1: + dialog: + - '&a[King Nemian]&f &2General Bromia&a sent you?' + - Excellent, I knew we could count on him. + name: '&2Das Wäldchen ruft!' + questLore: + - Es ist unsere Pflicht, den &dWäldchen&f vor allen Bedrohungen zu schützen. + - '&aKönig Nemian&f von &dWäldchen&f hat einen Hilfeantrag gesendet.' + - Unartige Viecher sind zu &dWäldchen&f und anderen gekommen + - Eindringlinge übernehmen die Bäume. + - Wenn Sie dorthin gehen und diese Fragen klären könnten + - dann können meine Truppen frei zu &dGladius' &f Hilfe kommen + questAcceptDialog: + - '&a[Bromia]&f Das &dWäldchen&f befinden sich nördlich der Stadt.' + - Es gibt einen Weg durch den Berg, unterhalb der Bergwerke. + - '&7&oIch sollte mit &aVirgo&7&o sprechen.' + questCompleteMessage: + - '&a[King Nemian]&f Du bist gerade rechtzeitig angekommen!' +primis_pontis_mille_to_lycan_or_not_to_lycan: + name: '&2Lykanisch oder nicht lykanisch' + questLore: + - Nicht sicher, wie eine einzelne Person das erreichen konnte + - ein ganzes Bataillon kann es nicht. + - Aber wenn dich der &aGeneral&f geschickt hat, wo ich mich dann beschweren? + - Wir haben ihre &dDen&f gefunden, aber der Widerstand ist zu stark. + - Es gab einfach keine Möglichkeit, durch zu kommen. + - Aber wenn du dich gegen den Weg in die &dDen&f kämpfen und ihn ausräumen könntest + - dann könnte die &dRedwoods&f wieder sicher sein. Mindestens sicherer... + - Ihr &dDen&f befindet sich unter einem &9Verdorbenen Redwood Baum&f. + - Wenn es leicht zu erkennen ist, zeichnet es sich unter den gesunden Bäumen aus. + questAcceptDialog: + - '&a[Cylindrus]&f Sei vorsichtig...' + - '&7&oIch muss den &dWehrwolf Den&7&o besiegen.' + questCompleteMessage: + - '&a[Magnus]&f Bei der großen Baumfee, du hast es geschafft!!!' + - Fühlen Sie sich frei, sich in unserem Camp auszuruhen, sind Sie hier immer willkommen. +primis_pontis_mille_where_is_he_now: + customObjectives: + Objective1: + dialog: + - '&a[Gorenus Palis]&f My brother sent you looking for me?' + - Oh, I messed up again...I got real lost this time. + - I hope he isn't too mad. + - When you go back, please tell him I'm safe. + name: '&2Hungriger Freund' + questLore: + - Ich und meine &aBruder&f waren auf dem Weg + - zurück aus dem Dorf. + - Während unserer Reisen musste ich ein wenig Umweg machen, so dass wir getrennt wurden. + - Wir sollten uns hier treffen. + - Aber seit geraumer Zeit keine Spur von ihm. + - Er neigt dazu, sich zu verlaufen ... wirklich verloren. + - Ich bin ziemlich besorgt über ihn. + - Ich wäre bereit, eine hohe Belohnung zu bezahlen + - für jeden, der ihn finden kann. + questAcceptDialog: + - '&a[Rodenus Palis]&f So nett von dir, deine Hilfe anzubieten.' + - Wenn Sie ihn finden, sagen Sie mir, wo er sich gerade befindet. + - '&7&oIch muss &a&oRodenus'' &7&o Bruder finden.' + questCompleteMessage: + - '&a[Rodenus Palis]&f Was! Wie zum Teufel ist er den ganzen Weg dorthin gelandet!' + - Seufz, dann fange ich jetzt besser an zu gehen... + - Vielen Dank für all deine Hilfe. Hier sind die versprochenen Münzen. +primis_pontis_redwoods_big_brown_logs: + customObjectives: + Objective1: + dialog: + - '&a[Magnus]&f Who are you? Oh, you came from &dPontis Mille&f.' + name: '&2Große braune Stämme' + questLore: + - Ich könnte meine Kräfte einsetzen um &dGladius&f zu helfen, wenn du helfen könntest + - wir beschäftigen uns mit der &cWerewolf&f Krise in der &dRedwoods&f. + - Unsere Streitkräfte halten die &cWerwölfe&f seit Wochen zurück. + - Es wäre großartig, wenn du uns helfen könntest. + - Gehe zu &dRedwoods&f und sprich mit &aMagnus Castorea&f. + - Sie werden dich darüber informieren, was getan werden muss, um diese Krise zu beenden. + questAcceptDialog: + - '&a[Cylindrus]&fDie &dRedwoods&f können vom Norden erreicht werden.' + - Fahren Sie nach Norden, bis Sie den &dBahnhaltestelle&f erreichen, und fahren Sie dann nach Westen. + - '&7&oIch muss in die &dRedwoods&7&o gehen und mit &aMagnus&7&o sprechen.' + questCompleteMessage: + - '&a[Magnus]&f Der General hat dich zur Hilfe geschickt?' + - Hmm...Du bist besser als gut. +primis_pontis_redwoods_its_reyn_time: + name: '&2Es ist Reyn-Zeit!' + questLore: + - Meine &eTaschen-Uhren&f war in den Fluss gefallen, als ich einen Baum fällte. + - Es ist eine besondere Uhr, fals due sie finden kannst. Mit Luft gefüllt und recht robust. + - Voll widerstandsfähig gegen schwere Stämme, die auf sie fallen gelassen werden, ja. + - Ich sah, wie einer dieser fiesen &cBandits&f sie aufhob und in seine Tasche steckte. + - Ich bin mir ziemlich sicher, dass ich sie &9mit einem Beil gesehen habe&f. + - + - + - Eine nette Belohnung auch für dich, wenn du zurückkommst! + questAcceptDialog: + - '&8[Reynus]&f Du findest die &cBandits&f direkt am Fluss.' + - '&7&oIch muss den richtigen &cBanditen&7&o töten und die &eTaschenuhr&7&o zurück zu bekommen.' + questCompleteMessage: + - '&a[Reynus]&f Ich werde sicherstellen, dass sie nicht wieder verloren geht!' + - Deine Belohnung mein guter! +primis_pontis_redwoods_nasty_little_bandits: + name: '&2 Böse kleine Banditen!' + questLore: + - Seit sich diese verdammten &cBandits&f auf der anderen Seite des Flusses niedergelassen haben, gibt es keinen Frieden mehr. + - Sie ruinieren immer wieder die Bäume, gestern habe ich einen von ihnen erwischt + - als er versuchen einen dieser riesigen Bäume in Brand zu setzen! + - Und vor nicht allzu langer Zeit wurde ich von einer verrückten Person mit einem Beil gejagt, + - Ich bin mir ziemlich sicher, dass es einer der &cBandits&f war. + - Nicht zu erwähnt werden sie immer wieder versuchen, jemanden zu berauben, der + - hat Geschäfte mit uns gute Leute hier auf der &dSawmill&f. + - Genug ist genug. Ich bin bereit, eine gute Münze zu bezahlen, um diesen Wahnsinn zu beenden. + questAcceptDialog: + - '&a[Ligna Crispian]&f Sie finden sie auf der anderen Seite des Flusses.' + - '&7&oIch sollte zum nahe gelegenen Banditenlager gehen und es vernichten.' + questCompleteMessage: + - '&a[Ligna Crispian]&f Endlich Frieden, danke!' +primis_pontis_redwoods_need_a_smoke: + name: '&2Benötigt Rauch' + questLore: + - Ich habe gehört, dass du dort gut alten &aReynus&f geholfen hast. + - Nun, wie Sie sehen können, habe ich es geschafft, meine Beine wieder mit dieser verdammten Säge zu schneiden. + - Oh, Sorgen Sie sich nicht um mich. Meine Beine werden in kürzester Zeit wieder heilen. + - Sie sehen, das Problem ist, nicht viel zu tun, während ich auf meine Beine zu heilen. + - Das macht mir Lust auf einen guten Papageientaucher. + - Ich habe einige &ePremium Tabak &f für meine Pfeife mitgebracht, + - aber ich musste es verstecken, damit diese &cBandits&f es nicht in die Hände bekommen können. + - Das Problem ist, ich habe völlig vergessen, wo ich es verstecket habe! + - Alles an das ich mich erinnere, ist das ich es &9In der Nähe eines Baumes &f vergraben habe. + - Welcher Baume? Wer weiß! + - Hören Sie zu, ich habe Sie hier ein gutes Angebot bekommen. Finde meinen Tabak und du kannst ihn haben + - alle meine &eGolden Äpfel&f. + questAcceptDialog: + - '&a[Lyco]&f Hoffe es bald wieder zu finden.' + - '&7&oIch sollte nach den &eTabak&7&o suchen.' + questCompleteMessage: + - '&a[Lyco]&f Du hast es gefunden! HAHA! Ich wusste das ich mich auf dich verlassen konnte!' +primis_terravilla_bipedal_examination: + name: '&2Bipedal examination' + questLore: + - I have been studying the &cTwo Legged Terrors&f that roam + - around &dTerravilla&f. Did you know that their population + - used to be much larger just some years ago. In fact it was + - the reason why the first settlers decided to build + - '&dTerravilla&f on top of the ruins and not down on the ground.' + - For some reason their numbers have really decreased. I was + - trying to get some &eSamples&f but trying to kill any of them is + - far beyond my skill. But you look like the sort of type who + - can handle a &cTwo Legged Terror&f or two. Interested in + - helping me out? + questAcceptDialog: + - '&a[Plautia Suilius]&f Six &eSamples&f should do it. Return to me once you have collected the &eSamples&f.' + - '&7&oI need to slay 3 &c&oTwo Legged Terrors&7&o and collect their &e&oSamples&7&o.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Great! Let''s have a look.' + - '&7&oI should hear what &a&oPlautia Suilius&7&o has discovered.' +primis_terravilla_drowning_terror: + name: '&2Drowning terror' + questLore: + - My theory was correct. I dissected the growth and found + - an organism inside. After careful examination I have + - determined that the organism is of aquatic origin. And + - not only that, they are capable of hijacking the host's + - brain. Once ready to hatch they make the host go to the + - nearest water source and drown themselves. The organism + - can then freely hatch and swim away. Whatever is + - infecting the &cTwo Legged Terrors&f must be living in + - a nearby river. You should go there and collect a + - '&ePerfect Sample&f of whatever organism is causing this.' + - I do not know if this is something that can affect humans + - but just in case you should kill a few of the organisms + - to make sure. + questAcceptDialog: + - '&a[Plautia Suilius]&f Come back here once you have collected a &ePerfect Sample&f.' + - '&7&oI need to go to the nearby river and collect a &e&oPerfect Sample&7&o of whatever is causing the infections.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Wow it looks like a fish, but it''s internal organs are different.' + - It must infect other creatures by releasing these tiny worm like meat particles... + - Let me have a look at you. Hmm, you seem fine, no traces... + - + - + - + - + - + - '&7&oI should make sure to stay away from the river...' +primis_terravilla_hog_on_my_porch: + name: '&2Bipedal examination' + questLore: + - He is sitting on the darn lift again! + - I cannot believe it! You there! + - You look like you can handle a large beast. + - I will pay you good money if you can get rid + - of that &cAnnoying Large Hog&f that keeps sitting + - on the lift. How are we supposed to get goods + - up and down this way. + questAcceptDialog: + - '&a[Dorippa Sarimarcus]&f Get rid of that hog right down there, see it?' + - '&7&oI need to slay the &c&oAlpha Razorback&7&o.' + questCompleteMessage: + - '&a[Dorippa Sarimarcus]&f Finally! I can move on with my life now! Thank you!' +primis_terravilla_razorbag: + name: '&2Razorbag' + questLore: + - If you are looking for work I got some for ya. + - I design and make heavy duty bags that I sell + - here at my little shop. So I am in need of + - leather. Thankfully there are plenty of + - '&cRazorbacks&f around these parts. If you are' + - interested I would like to hire you to go hunt + - them for their leather. I would need a considerable + - amount of leather. So this won't be a quick job. + questAcceptDialog: + - '&a[Telestis Senna]&f You will mostly find them roaming around here and towards the fields area.' + - '&7&oI need to go hunt the &c&oMature Razorback&7&o.' + questCompleteMessage: + - '&a[Telestis Senna]&f Yep, that will do it. In pristine condition too! Here is your coin, as promised.' +primis_terravilla_terrifying: + name: '&2Terrifying' + questLore: + - Well that is concerning. The sample you brought shows + - that they are slowly being drained of their nutrients. + - My hypothesis is that there is most likely a parasite + - attached to them that is causing this. You should go + - out there again and see if you can find any large + - '&eGrowths&f on their bodies, and then cut them off' + - and bring them back here. + questAcceptDialog: + - '&a[Plautia Suilius]&f I would only need two &eGrowths&f no more than that.' + - '&7&oI need to slay &c&oTwo Legged Terrors&7&o and collect two &e&oGrowths&7&o.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Excellent, these should do it.' + - '&7&oI should hear what &a&oPlautia Suilius&7&o has managed to find.' +test_quest: + name: Töte den Test-Boss + questLore: + - '&cBeende die Schreckensherrschaft des Testboss!' +xmas_quest_0: + name: '&2Finde verlorene Geschenke!' + questLore: + - + - + - Im Gegenzug darfst du eines davon öffnen! + questAcceptDialog: + - '&8[&cSaint Nick&8]&f Vielen Dank! Ich warte hier auf dich!' + questCompleteMessage: + - '&8[&cSaint Nick&8]&f Vielen Dank für eure Hilfe! Es gibt immer noch einige verlorene Geschenke da draußen, sprich mich wieder an, wenn du mehr helfen willst!' diff --git a/src/main/resources/translations/indonesian.yml b/src/main/resources/translations/indonesian.yml new file mode 100644 index 000000000..2be03a2af --- /dev/null +++ b/src/main/resources/translations/indonesian.yml @@ -0,0 +1,13252 @@ +config: + noArenaPermissionMessage: '[EliteMobs] Kamu tidak memiliki izin masuk ke arena!' +ItemSettings: + itemLoreStructureV2: + - '&7&m&l---------&7<&lInfo Perlengkapan&7>&m&l---------' + - '&7Level Item: &f$itemLevel &7Prestise &6$prestigeLevel' + - '$weaponOrArmorStats' + - '$soulbindInfo' + - '$itemSource' + - '$ifLore&7&m&l-----------&7< &f&lDeskripsi&7 >&m&l-----------' + - '$customLore' + - '$ifEnchantments&7&m&l--------&7<&9&lEnchantments&7>&m&l--------' + - '$enchantments' + - '$eliteEnchantments' + - '$ifCustomEnchantments&7&m&l------&7< &3&lEnchant Kustom&7 >&m&l------' + - '$customEnchantments' + - '$ifPotionEffects&7&m&l----------&7< &5&lEfek&7 >&m&l----------' + - '$potionEffect' + - '&7&l&m-----------------------------' + - '$loreResaleValue' + shopSourceItemLores: '&7Dibeli dari toko' + mobSourceItemLores: '&7Dijarah dari $mob' + loreWorths: '&7Harga $worth $currencyName' + loreResaleValues: '&7Jual seharga $resale $currencyName' + eliteEnchantmentLoreStrings: Elite + noSoulbindLore: '&7Not Soulbound!' + preventEliteItemDisenchantmentMessage: '&c[EliteMobs] Tidak dapat melepas enchant dari item Elite!' + scrapSucceededMessageV2: '&8[EliteMobs] &2Scrapping berhasil dalam $amount kali!' + scrapFailedMessageV2: '&8[EliteMobs] &cScrapping gagal $amount kali!' + lowDurabilityItemDropMessage: '&8[EliteMobs] &cDropped armor due to low durability! &8Repair it at the NPC with scrap to use it!' + lowWeaponItemDropMessage: '&8[EliteMobs] &cDropped weapon due to low durability! &8Repair it at the NPC with scrap to use it!' + simlootMessageSuccess: '&8[EliteMobs] &2Rolled for loot and got $itemName &2!' + simlootMessageFailure: '&8[EliteMobs] &cRolled for loot and got nothing!' + directDropCustomLootMessage: '&8[EliteMobs] &2Memperoleh $itemName &2!' + directDropMinecraftLootMessage: '&8[EliteMobs] &aMemperoleh $itemName &a!' + directDropCoinMessage: '&8[EliteMobs] &aObtained &2$amount $currencyName &a!' + directDropSpecialMessage: '&8[EliteMobs] &aObtained &2$amount $name &a!' + weaponEntry: '&7Elite DPS: &2$EDPS' + armorEntry: '&7Elite Armor: &2$EDEF' +ProceduralItemGenerationSettings: + materialNames: + swordName: Pedang + bowName: Busur + pickaxe: Belencong + spade: Sekop + hoe: Cangkul + axe: Kapak + helmet: Helm + chestplate: Chestplate + leggings: Celana + boots: Boots + shears: Gunting + fishingRod: Tongkat Pancing + shield: Perisai + trident: Trisula + crossbow: Crossbow + nameFormats: + - '$verb $itemType of the $adjective $noun' + - '$itemType of the $adjective $noun' + - '$noun''s $adjective $verb $itemType' + - '$verb $itemType' + - '$adjective $verb $itemType' + - The $verb-er + - The $adjective $verb-er + nouns: + - MagmaGuy + - Dawn + - Sunset + - Heaven + - Hell + - Angel + - Archangel + - Cherub + - Seraph + - Demon + - Fiend + - Kelelawar + - Ayam + - Sapi + - Mooshroom + - Babi + - Kelinci + - Domba + - Cumi-Cumi + - Penduduk desa + - Laba-laba gua + - Enderman + - Beruang Kutub + - Laba-laba + - Zombie Pigman + - Api + - Creeper + - Elder Guardian + - Endermite + - Evoker + - Ghast + - Guardian + - Husk + - Magma Cube + - Shulker + - Silverfish + - Skeleton + - Slime + - Stray + - Vex + - Vindicator + - Witch + - Wither Skeleton + - Zombie + - Donkey + - Horse + - Llama + - Mule + - Ocelot + - Wolf + - Iron Golem + - Snow Golem + - Ender Dragon + - Wither + - Illusioner + - Parrot + - Giant + - Killer Bunny + - Steve + - Wolfbane + - Chaos + - Aeon + - Dragon + - Sphynx + - Minotaur + - Hades + - Oath + - Oathbreaker + - Deserter + - Betrayer + - Jade + - Light + - Darkness + - Oblivion + - Shadow + - Void + - Xeno + - Zealot + - Zenith + - Dusk + - Twilight + - Mob + - Elite Mob + - Urist + - Dwarf + - Elf + - Ork + - Goblin + - Gnome + - Goliath + - Drow + - Human + - Halfling + - Half-Orc + - Beholder + - Mind Flayer + - Owlbear + - Bulette + - Rust Monster + - Hill Giant + - Stone Giant + - Frost Giant + - Fire Giant + - Cloud Giant + - Storm Giant + - Kobold + - Lich + - Ork + - Umber Hulk + - Fighter + - Wizard + - Paladin + - Cleric + - Ranger + - Archer + - Mage + - Tiefling + - Werewolf + - Vampire + - Centaur + - Catfolk + - Half-Giant + - Ogre + - Troll + - Rogue + - Barbarian + - Bard + - Druid + - Monk + - Sorcerer + - Warlock + - Demon Hunter + - Death Knight + - Priest + - Shaman + - Warrior + - Basilisk + - Chimera + - Imp + - Dryad + - Gargoyle + - Djinni + - Efreeti + - Ghost + - Hobgoblin + - Hydra + - Kraken + - Lamia + - Medusa + - Mimic + - Mummy + - Pegasus + - Roc + - Satyr + - Tarrasque + - Abomination + - Ghoul + - Treant + - Unicorn + - Wraith + - Acolyte + - Gladiator + - Knight + - Gryphon + - Raider + - Scout + - Spy + - Thg + - Noble + - Guard + - Veteran + - Wyvern + - Abyssal + - Infernal + - Elemental + - Tauren + - Pandaren + - Sasquatch + - Forsaken + - Yeti + - Banshee + - Arachnid + - Undead + - Night Elf + - Blood Elf + - Draenei + - Worgen + - Warlord + - Witch + - Magi + - Sage + - Thief + - Assassin + - Templar + - Beastmaster + - Berserker + - Inventor + - Luchador + - Pirate + - Vanguard + - Voidblade + - Wisp + - Peasant + - Footman + - Swordsman + - Thrall + - Felhound + - Huntress + - Hunter + - Aarakorcra + - Aboleth + - Deva + - Planetar + - Solar + - Ankheg + - Azer + - Behir + - Death Tyrant + - Blight + - Bugbear + - Hugbear + - Bullywug + - Cambion + - Chuul + - Lich King + - Cockatrice + - Couatl + - Cyclops + - Titan + - Darkmantle + - Ancient One + - Demilich + - Balor + - Barlgura + - Chasme + - Dretch + - Glabrezu + - Goristro + - Hezrou + - Manes + - Marilith + - Nalfeshnee + - Quasit + - Vrock + - Yochlol + - Pit Fiend + - Lemure + - Dracolich + - Doppleganger + - Chromatic Dragon + - Drider + - Air Elemental + - Earth Elemental + - Fire Elemental + - Water Elemental + - Rohirrim + - Gondorian + - Empyrean + - Faerie Dragon + - Ettin + - Flumph + - Fomorian + - Dao + - Gnoll + - Parshendi + - Listener + - Spren + - Stormfather + - Rosharian + - Brightlord + - Highprince + - King + - Emperor + - Shardbearer + - Surgebinder + - Bondsmith + - Golem + - Gorgon + - Hag + - Harpy + - Hippogriff + - Homunculus + - State Alchemist + - Undying Soldier + - Jackalwere + - Nothic + - Oni + - Rakshasa + - Revenant + - Cultist + adjectives: + - Adorable + - Beautiful + - Clean + - Elegant + - Fancy + - Glamorous + - Handsome + - Long + - Magnificent + - Plain + - Quaint + - Sparkling + - Ugliest + - Red + - Orange + - Yellow + - Green + - Blue + - Purple + - Gray + - Black + - White + - Dead + - Odd + - Powerful + - Rich + - Vast + - Zealous + - Deafening + - Faint + - Melodic + - Quiet + - Thundering + - Whispering + - Hissing + - Ancient + - Fast + - Old + - Rapid + - Slow + - Rotten + - Creepy + - Crooked + - Empty + - Heavy + - Abhorrent + - Abnormal + - Absurd + - Acceptable + - Accidental + - Adamant + - Adventurous + - Agonizing + - Alert + - Annoyed + - Annoying + - Anxious + - Aromatic + - Aggressive + - Aloof + - Amazing + - Ambiguous + - Ambitious + - Amused + - Angry + - Arrogant + - Ashamed + - Aspiring + - Astonishing + - Auspicious + - Average + - Awesome + - Awful + - Bad + - Barbarous + - Bashful + - Beffiting + - Belligerent + - Beneficial + - Berserk + - Best + - Bewildered + - Big + - Bitter + - Bizarre + - Bloody + - Boiling + - Boundless + - Brash + - Brave + - Brawny + - Breakable + - Brief + - Bright + - Broken + - Busy + - Calculating + - Callous + - Calm + - Capricious + - Careful + - Careless + - Caring + - Cautious + - Ceaseless + - Certain + - Charming + - Cheap + - Chief + - Chilly + - Chivalrous + - Chunky + - Clear + - Clever + - Cloistered + - Clumsy + - Cloudy + - Classy + - Colossal + - Combative + - Common + - Confused + - Condemned + - Cool + - Courageous + - Cowardly + - Crazy + - Craven + - Cruel + - Cuddly + - Curious + - Cute + - Damaged + - Damaging + - Dangerous + - Dark + - Dashing + - Decisive + - Deep + - Defeated + - Defective + - Defiant + - Delicate + - Delicious + - Delightful + - Demonic + - Delirious + - Deranged + - Descriptive + - Devilish + - Difficult + - Diligent + - Direful + - Dirty + - Disastrous + - Disgusted + - Disgusting + - Disillusioned + - Distinct + - Disturbed + - Draconian + - Dramatic + - Dreary + - Dysfunctional + - Eager + - Elderly + - Electric + - Elite + - Enchanted + - Enchanting + - Energetic + - Enormous + - Entertaining + - Enthusiastic + - Envious + - Erratic + - Ethereal + - Evasive + - Excellent + - Excited + - Exciting + - Exotic + - Exuberant + - Fabulous + - Faded + - Fair + - Faithful + - 'False' + - Familiar + - Famous + - Fanatical + - Fantastic + - Fascinated + - Fat + - Fearful + - Fearless + - Feeble + - Festive + - Fierce + - Filthy + - Fine + - Finicky + - First + - Fixed + - Flashy + - Flawless + - Flimsy + - Flippant + - Flowery + - Fluffy + - Fluttering + - Foamy + - Foolish + - Forgetful + - Fortunate + - Frail + - Fragile + - Frantic + - Free + - Freezing + - Fresh + - Friendly + - Frightening + - Fumbling + - Funny + - Furry + - Furtive + - Fuzzy + - Giant + - Gifted + - Gigantic + - Glistening + - Glorious + - Godly + - Good + - Goofy + - Gorgeous + - Graceful + - Grandiose + - Grateful + - Greasy + - Great + - Greedy + - Grieving + - Groovy + - Grotesque + - Grubby + - Gruesome + - Grumpy + - Guarded + - Guiltless + - Gullible + - Gutsy + - Guttural + - Hallowed + - Hanging + - Hapless + - Happy + - Harmonious + - Hateful + - Healthy + - Heartbreaking + - Heavenly + - Hellish + - Helpful + - Helpless + - Hesitant + - Hideous + - Hilarious + - Hollow + - Homeless + - Honorable + - Horrible + - Hospitable + - Huge + - Hulking + - Humorous + - Hungry + - Hurt + - Hushed + - Hypnotic + - Hysterical + - Icky + - Icy + - Ignorant + - Ill + - Illegal + - Illustrious + - Imaginary + - Immense + - Imminent + - Impartial + - Imperfect + - Impolite + - Important + - Incandescent + - Incompetent + - Industrious + - Incredible + - Inexpensive + - Infamous + - Innocent + - Inquisitive + - Insidious + - Instinctive + - Intelligent + - Interesting + - Invincible + - Irate + - Itchy + - Jaded + - Jagged + - Jealous + - Jolly + - Joyous + - Jumpy + - Juvenile + - Keen + - Kind + - Kindhearted + - Knowing + - Knowledgeable + - Known + - Labored + - Lame + - Large + - Last + - Late + - Laughable + - Lazy + - Lean + - Lethal + - Light + - Little + - Living + - Lonely + - Loud + - Lovely + - Lucky + - Magenta + - Magical + - Majestic + - Malicious + - Marked + - Massive + - Marvelous + - Mean + - Medical + - Melted + - Messy + - Mighty + - Military + - Mindless + - Minor + - Misty + - Mixed + - Modern + - Motionless + - Mysterious + - Naive + - Narrow + - Natural + - Neat + - Necessary + - Needless + - Needy + - Nervous + - New + - Nice + - Normal + - Nostalgic + - Numberless + - Obsolete + - Obtainable + - Oceanic + - Old-fashioned + - Omniscient + - Optimal + - Ordinary + - Organic + - Outstanding + - Oval + - Overrated + - Painful + - Parallel + - Pathetic + - Peaceful + - Penitent + - Perfect + - Periodic + - Petite + - Physical + - Pink + - Plastic + - Pleasant + - Pointless + - Polite + - Poor + - Precious + - Premium + - Present + - Pretty + - Private + - Productive + - Protective + - Public + - Puzzling + - Questionable + - Quick + - Quickest + - Rare + - Ready + - Real + - Rebel + - Regular + - Remarkable + - Responsible + - Romantic + - Round + - Royal + - Sad + - Safe + - Salty + - Satisfying + - Scared + - Scary + - Scientific + - Scrawny + - Screeching + - Second + - Second-hand + - Secret + - Selfish + - Sequacious + - Serious + - Shallow + - Sharp + - Shiny + - Shocking + - Short + - Shy + - Sick + - Silent + - Silky + - Silly + - Simple + - Skinny + - Slim + - Slimy + - Slippery + - Small + - Smart + - Smiling + - Smooth + - Sneaky + - Soft + - Solid + - Special + - Spectacular + - Spicy + - Spiky + - Splendid + - Spooky + - Spotless + - Square + - Staking + - Standing + - Steady + - Sticky + - Strange + - Striped + - Strong + - Successful + - Super + - Supreme + - Sweet + - Talented + - Tall + - Tasty + - Temporary + - Tense + - Terrible + - Terrific + - Tested + - Thankful + - Thick + - Thin + - Haus + - Thoughtful + - Tiny + - Tired + - Tricky + - Troubled + - 'True' + - Ugly + - Ultra + - Unadvised + - Unarmed + - Uncovered + - Unhealthy + - Unique + - Unknown + - Unnatural + - Unused + - Unusual + - Used + - Useful + - Useless + - Valuable + - Violent + - Waiting + - Wandering + - Warm + - Weak + - Wealthy + - Whole + - Wise + - Wonderful + - Wooden + - Worried + - Worthless + - Wrong + - Menacing + - Trusting + - Unassuming + - Threatening + verbs: + - Slashing + - Cutting + - Stabbing + - Scratching + - Killing + - Slaying + - Butchering + - Destroying + - Tickling + - Hugging + - Murdering + - Slapping + - Hissing + - Traveling + - Teleporting + - Blinking + - Destroying + - Wrecking + - Flashing + - Materializing + - Spawning + - Questioning + - Inquiring + - Pleading + - Demanding + - Interrogating + - Querying + - Assaulting + - Striking + - Ambushing + - Assailing + - Rushing + - Storming + - Bombarding + - Barraging + - Smiting + - Charging + - Clobbering + - Battling + - Battering + - Hammering + - Beating + - Combating + - Overwhelming + - Raiding + - Tackling + - Shooting + - Venturing + - Cracking + - Rupturing + - Smashing + - Shattering + - Fracturing + - Splintering + - Pulverizing + - Tearing + - Rending + - Snapping + - Bursting + - Exploding + - Damaging + - Fragmenting + - Splitting + - Fortifying + - Nudging + - Tapping + - Jostling + - Thumping + - Butting + - Clattering + - Striking + - Whacking + - Slamming + - Summoning + - Screaming + - Bellowing + - Roaring + - Shifting + - Transforming + - Modifying + - Twisting + - Mutating + - Distorting + - Blurring + - Adjusting + - Warping + - Altering + - Adapting + - Evolving + - Varying + - Hunting + - Trailing + - Following + - Stalking + - Shadowing + - Hounding + - Casing + - Mounting + - Ascending + - Rising + - Heaving + - Springing + - Cresting + - Gathering + - Corralling + - Hoarding + - Reaping + - Harvesting + - Saving + - Sheltering + - Cloaking + - Shrouding + - Enclosing + - Concealing + - Hiding + - Disguising + - Masking + - Burying + - Smothering + - Clouding + - Shielding + - Shading + - Sealing + - Enveloping + - Veiling + - Obscuring + - Traversing + - Fording + - Gliding + - Howling + - Whimpering + - Screaming + - Shrieking + - Squealing + - Roaring + - Wailing + - Bawling + - Screeching + - Cleaving + - Chopping + - Chipping + - Severing + - Slicing + - Snipping + - Splitting + - Axing + - Slashing + - Rending + - Tearing + - Thinning + - Cropping + - Carving + - Dissecting + - Hacking + - Piercing + - Sawing + - Shaving + - Shearing + - Mining + - Delving + - Excavating + - Burrowing + - Drilling + - Hollowing + - Gouging + - Tunneling + - Invading + - Boarding + - Wandering + - Infiltrating + - Intruding + - Evading + - Fleeing + - Running + - Dodging + - Crashing + - Battling + - Tussling + - Wrestling + - Scuffling + - Dueling + - Brawling + - Jousting + - Sparring + - Clashing + - Warring + - Grappling + - Scrapping + - Attacking + - Feuding + - Skirmishing + - Discovering + - Detecting + - Catching + - Solving + - Revealing + - Unearthing + - Leaping + - Bouncing + - Springing + - Vaulting + - Hopping + - Surging + - Punting + - Booting + - Dropkicking + - Sensing + - Perceiving + - Detecting + - Fading + - Bleeding + - Shrinking + - Weakening + - Abating + - Diminishing + - Forging + - Releasing + - Gathering + - Collecting + - Culling + - Crushing + - Propelling + - Jogging + - Sprinting + - Questing + - Scouting + - Exploring + - Digging + - Trembling + - Rattling + - Parting + - Hacking + - Rupturing + - Carving + - Dividing + - Halving + - Breaking + - Sundering + - Separating + - Rending + - Ripping + - Grazing + - Imprisoning + - Snaring + - Cornering + - Entangling + - Pinning + - Catching + - Restraining + - Binding + - Hooking + - Snagging + - Snatching + - Caging + - Capturing + - Haunting + - Creeping + - Sneaking + - Spying + - Avenging + - Storming + verb-ers (noun): + - World Breaker + - World Shatterer + - Avenger + - Ashbringer + - Windseeker + - Defiler + - Thunderfury + - Slicer + - Slasher + - Cutter + - Stabber + - Scratcher + - Killer + - Slayer + - Destroyer + - Hugger + - Murderer + - Slapper + - Traveller + - Teleporter + - Blinker + - Wrecker + - Materializer + - Spawner + - Demander + - Assaulter + - Striker + - Ambusher + - Rusher + - Stormer + - Bombarder + - Barrager + - Smiter + - Charger + - Battler + - Hammerer + - Beater + - Combater + - Overwhelmer + - Raider + - Tackler + - Shooter + - Venturer + - Cracker + - Smasher + - Shatterer + - Fracturer + - Splinterer + - Pulverizer + - Tearer + - Renderer + - Snapper + - Burster + - Exploder + - Damager + - Fragmenter + - Splitter + - Fortifier + - Nudger + - Tapper + - Thumper + - Butter + - Clatterer + - Striker + - Whacker + - Slammer + - Summoner + - Screamer + - Shifter + - Transformer + - Modifyer + - Twister + - Blurrer + - Warper + - Alterer + - Adapter + - Evolver + - HunterEnchantment + - Trailer + - Follower + - Stalker + - Shadower + - Hounder + - Caser + - Mounter + - Ascender + - Riser + - Springer + - Hoarder + - Reaper + - Harvester + - Saver + - Shelterer + - Cloaker + - Shrouder + - Encloser + - Hider + - Masker + - Buryer + - Clouder + - Shader + - Sealer + - Enveloper + - Veiler + - Traverser + - Forder + - Glider + - Howler + - Whimperer + - Screamer + - Squealer + - Bawler + - Screecher + - Chopper + - Chipper + - Snipper + - Splitter + - Axer + - Slasher + - Renderer + - Tearer + - Thinner + - Cropper + - Carver + - Hacker + - Piercer + - Sawer + - Shaver + - Shearer + - Miner + - Excavater + - Burrower + - Driller + - Tunneler + - Invader + - Boarder + - Wanderer + - Intruder + - Evader + - Runner + - Dodger + - Crasher + - Battler + - Wrestler + - Scuffler + - Dueler + - Brawler + - Clasher + - Grappler + - Scrapper + - Attacker + - Feuder + - Catcher + - Solver + - Revealer + - Leaper + - Bouncer + - Vaulter + - Hopper + - Surger + - Punter + - Dropkicker + - Perceiver + - Fader + - Bleeder + - Weakener + - Forger + - Releaser + - Gatherer + - Crusher + - Propeller + - Jogger + - Sprinter + - Scouter + - Explorer + - Digger + - Trembler + - Parter + - Hacker + - Carver + - Divider + - Halver + - Breaker + - Renderer + - Ripper + - Grazer + - Imprisoner + - Cornerer + - Pinner + - Catcher + - Restrainer + - Binder + - Snagger + - Snatcher + - Cager + - Capturer + - Haunter + - Creeper + - Sneaker + - Binder + - Jailer + - Seducer + - Dancer + - Blasphemer + - Eater + - Snorer + - Thruster + - Slapper +absorption: + name: Absorption +blindness: + name: Blindness +conduit_power: + name: Conduit Power +confusion: + name: Nausea +damage_resistance: + name: Resistance +dolphins_grace: + name: Dolphin's Grace +fast_digging: + name: Haste +fire_resistance: + name: Fire Resistance +glowing: + name: Glowing +harm: + name: Instant Damage +heal: + name: Instant Health +health_boost: + name: Health Boost +hunger: + name: Hunger +increase_damage: + name: Strength +invisibility: + name: Invisibility +jump: + name: Jump Boost +levitation: + name: Levitation +luck: + name: Luck +night_vision: + name: Night Vision +poison: + name: Poison +regeneration: + name: Regeneration +saturation: + name: Saturation +slow: + name: Slowness +slow_digging: + name: Mining Fatigue +slow_falling: + name: Slow Falling +speed: + name: Speed +unluck: + name: Bad Luck +water_breathing: + name: Water Breathing +weakness: + name: Weakness +wither: + name: Wither +translation: + Economy pay message v2: '&2Kamu membayar &2$amount_sent $currency_name &2kepada $receiver&2, mendapatkan $amount_received setelah pajak!' + Economy currency left message: Kammu mempunyai &2$amount_left $currency_name + Economy money from payment message: Kamu mendapatkan&2$amount_received $currency_name &fdari $sender + Economy payment insuficient currency: '&cKamu tidak memiliki $currency_name yang cukup untuk melakukannya!' + Wallet command message: Kamu memiliki &2$balance $currency_name + Tax confirmation message: '&cPengirim pembayaran dikenai biaya $percentage% untuk pajak. &aLakukan &9$command &aUntuk Melanjutkan!' + shopBatchSellItem: '&aYou have sold your items &afor $currency_amount $currency_name!' + Shop buy message: '&aKamu telah membeli $item_name &auntuk $item_value $currency_name!' + Shop current balance message: '&aKamu Memiliki $currency_amount $currency_name.' + Shop insufficient funds message: '&cKamu tidak memiliki $currency_name yang cukup untuk melakukannya!' + Shop item cost message: Item ini memerlukan biaya &c$item_value $currency_name. + Shop sell message: '&aKamu telah membeli $item_name &auntuk $currency_amount $currency_name!' + Shop sale player items warning: '&cKamu tidak dapat menjual barang yang terikat pada dirimu! Ini termasuk item dari tingkatan prestise!' + Shop sale instructions: '&cKamu hanya bisa menjual hasil jarahan di sini! (Armor / weapons hasil jarahan dari elites monster memiliki detail di setiap barang nya)' + Teleport time left: '&7[EM] Berpindah tempat dalam &a$time &7detik...' + Teleport cancelled: '&7[EM] &cBerpindah tempat mengalami gangguan!' + noPendingCommands: '&cSaat ini kamu tidak memiliki perintah yang tertunda!' + trackMessage: Track the $name + chestLowRankMessage: '&7[EM] &cYour guild rank needs to be at least $rank &cin order to open this chest!' + chestCooldownMessage: '&7[EM] &cYou''ve already opened this chest recently! Wait $time!' + insufficientCurrencyForWormholeMessage: '&8[EliteMobs] &cInsufficient currency! You need $amount to use this com.magmaguy.elitemobs.wormhole!' + dismissEMMessage: '&8[EliteMobs] &2/elitemobs &fmenu not working for you? Try &2/elitemobs alt &fto see an alternative version of the menu! &cDon''t want to see this message again? &4/em dismiss' + switchEMStyleMessage: '&8[EliteMobs] &2/elitemobs &fmenu style changed! Check it out!' +EconomySettings: + currencyName: Elite Coins + chatCurrencyShowerMessage: '&7[EM] Kamu mengambil &a$amount $currency_name!' + actionbarCurrencyShowerMessage: '&7[EM] Kamu mengambil &a$amount $currency_name!' + adventurersGuildNotificationMessages: '&7[EM] Butuh Koin? silahkan coba &a/em !' +arrow_damage: + name: Power +arrow_fire: + name: Flame +arrow_infinite: + name: Infinity +arrow_knockback: + name: Punch +binding_curse: + name: Curse of Binding +channeling: + name: Channeling +critical_strikes: + name: Critical Strikes + criticalHitPopup: '&5Critical Hit!' +damage_all: + name: Sharpness +damage_arthropods: + name: Bane of Arthropods +damage_undead: + name: Smite +depth_strider: + name: Depth Strider +dig_speed: + name: Efficiency +drilling: + name: Drilling +durability: + name: Unbreaking +earthquake: + name: Earthquake + earthquakeActivationMessage: '&8[EliteMobs] &aEarthquake triggered! &c2 min cooldown!' + earthquakeAvailableMessage: '&8[EliteMobs] &2Earthquake cooldown over!' +fire_aspect: + name: Fire Aspect +flamethrower: + name: Flamethrower +frost_walker: + name: Frost Walker +grappling_hook: + name: Grappling Hook +hunter: + name: Hunter +ice_breaker: + name: Ice Breaker +impaling: + name: Impaling +knockback: + name: Knockback +lightning: + name: Lightning +loot_bonus_blocks: + name: Fortune +loot_bonus_mobs: + name: Looting +loud_strikes: + name: Loud Strikes +loyalty: + name: Loyalty +lure: + name: Lure +mending: + name: Mending +meteor_shower: + name: Meteor Shower +multishot: + name: Multishot +oxygen: + name: Respiration +piercing: + name: Piercing +plasma_boots: + name: Plasma Boots +protection_environmental: + name: Protection +protection_explosions: + name: Blast Protection +protection_fall: + name: Feather Falling +protection_fire: + name: Fire Protection +protection_projectile: + name: Projectile Protection +quick_charge: + name: Quick Charge +riptide: + name: Riptide +silk_touch: + name: Silk Touch +soulbind: + name: Soulbind + loreStrings: '&7Soulbound to &f$player' + hologramString: '$player&f''s' +summon_merchant: + name: Summon Merchant + message: Jeeves! +summon_wolf: + name: Summon Wolf +sweeping_edge: + name: Sweeping Edge +thorns: + name: Thorns +unbind: + name: Unbind +vanishing_curse: + name: Curse of Vanishing +water_worker: + name: Aqua Affinity +AntiExploit: + AntiExploit message: '&c[EM AntiExploit] &7Nearby elite won''t drop special loot.' +CombatTag: + Combat tag message: '&c[EliteMobs] Combat tag activated!' +AdventurersGuild: + adventurersGuildMenuName: '&6&lAdventurer''s Hub' + Prestige 0 rank 0: '&8Commoner - disables elites!' + Prestige 0 rank 0 short placeholder: '&6&l✧&e0' + Prestige 0 rank 1: '&fRookie' + Prestige 0 rank 1 short placeholder: '&6&l✧&eⅠ' + Prestige 0 rank 2: '&fNovice' + Prestige 0 rank 2 short placeholder: '&6&l✧&eⅠⅠ' + Prestige 0 rank 3: '&fApprentice' + Prestige 0 rank 3 short placeholder: '&6&l✧&eⅠⅠⅠ' + Prestige 0 rank 4: '&2Adventurer' + Prestige 0 rank 4 short placeholder: '&6&l✧&eⅠⅤ' + Prestige 0 rank 5: '&2Journeyman' + Prestige 0 rank 5 short placeholder: '&6&l✧&eⅤ' + Prestige 0 rank 6: '&2Adept' + Prestige 0 rank 6 short placeholder: '&6&l✧&eⅤⅠ' + Prestige 0 rank 7: '&1Veteran' + Prestige 0 rank 7 short placeholder: '&6&l✧&eⅤⅠⅠ' + Prestige 0 rank 8: '&1Elite' + Prestige 0 rank 8 short placeholder: '&6&l✧&eⅤⅠⅠⅠ' + Prestige 0 rank 9: '&lMaster' + Prestige 0 rank 9 short placeholder: '&6&l✧&eⅠⅩ' + Prestige 0 rank 10: '&5Hero' + Prestige 0 rank 10 short placeholder: '&6&l✧&eⅩ' + Prestige 1 rank 0: '&ePrestige 1 &8Commoner' + Prestige 1 rank 0 short placeholder: '&e⚜Ⅰ&6&l✧&e0' + Prestige 1 rank 1: '&ePrestige 1 &fRookie' + Prestige 1 rank 1 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠ' + Prestige 1 rank 2: '&ePrestige 1 &fNovice' + Prestige 1 rank 2 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅠ' + Prestige 1 rank 3: '&ePrestige 1 &fApprentice' + Prestige 1 rank 3 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅠⅠ' + Prestige 1 rank 4: '&ePrestige 1 &2Adventurer' + Prestige 1 rank 4 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅤ' + Prestige 1 rank 5: '&ePrestige 1 &2Journeyman' + Prestige 1 rank 5 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤ' + Prestige 1 rank 6: '&ePrestige 1 &2Adept' + Prestige 1 rank 6 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠ' + Prestige 1 rank 7: '&ePrestige 1 &1Veteran' + Prestige 1 rank 7 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠⅠ' + Prestige 1 rank 8: '&ePrestige 1 &1Elite' + Prestige 1 rank 8 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠⅠⅠ' + Prestige 1 rank 9: '&ePrestige 1 &5Master' + Prestige 1 rank 9 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅩ' + Prestige 1 rank 10 short placeholder: '&e⚜Ⅰ&6&l✧&eⅩ' + Prestige 1 rank 10: '&ePrestige 1 &5Hero' + Prestige 1 rank 11: '&ePrestige 1 &5Legend' + Prestige 1 rank 11 short placeholder: '&e⚜Ⅰ&6&l✧&eⅩⅠ' + Prestige 2 rank 0: '&2Prestige 2 &8Commoner' + Prestige 2 rank 0 short placeholder: '&2⚜ⅠⅠ&6&l✧&e0' + Prestige 2 rank 1: '&2Prestige 2 &fRookie' + Prestige 2 rank 1 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠ' + Prestige 2 rank 2: '&2Prestige 2 &fNovice' + Prestige 2 rank 2 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅠ' + Prestige 2 rank 3: '&2Prestige 2 &fApprentice' + Prestige 2 rank 3 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 2 rank 4: '&2Prestige 2 &2Adventurer' + Prestige 2 rank 4 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅤ' + Prestige 2 rank 5: '&2Prestige 2 &2Journeyman' + Prestige 2 rank 5 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤ' + Prestige 2 rank 6: '&2Prestige 2 &2Adept' + Prestige 2 rank 6 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠ' + Prestige 2 rank 7: '&2Prestige 2 &1Veteran' + Prestige 2 rank 7 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 2 rank 8: '&2Prestige 2 &1Elite' + Prestige 2 rank 8 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 2 rank 9: '&2Prestige 2 &5Master' + Prestige 2 rank 9 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅩ' + Prestige 2 rank 10 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩ' + Prestige 2 rank 10: '&2Prestige 2 &5Hero' + Prestige 2 rank 11: '&2Prestige 2 &5Legend' + Prestige 2 rank 11 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩⅠ' + Prestige 2 rank 12: '&2Prestige 2 &5Myth' + Prestige 2 rank 12 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 3 rank 0: '&aPrestige 3 &8Commoner' + Prestige 3 rank 0 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&e0' + Prestige 3 rank 1: '&aPrestige 3 &fRookie' + Prestige 3 rank 1 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠ' + Prestige 3 rank 2: '&aPrestige 3 &fNovice' + Prestige 3 rank 2 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠ' + Prestige 3 rank 3: '&aPrestige 3 &fApprentice' + Prestige 3 rank 3 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 3 rank 4: '&aPrestige 3 &2Adventurer' + Prestige 3 rank 4 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅤ' + Prestige 3 rank 5: '&aPrestige 3 &2Journeyman' + Prestige 3 rank 5 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤ' + Prestige 3 rank 6: '&aPrestige 3 &2Adept' + Prestige 3 rank 6 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠ' + Prestige 3 rank 7: '&aPrestige 3 &1Veteran' + Prestige 3 rank 7 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 3 rank 8: '&aPrestige 3 &1Elite' + Prestige 3 rank 8 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 3 rank 9: '&aPrestige 3 &5Master' + Prestige 3 rank 9 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅩ' + Prestige 3 rank 10 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩ' + Prestige 3 rank 10: '&aPrestige 3 &5Hero' + Prestige 3 rank 11: '&aPrestige 3 &5Legend' + Prestige 3 rank 11 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠ' + Prestige 3 rank 12: '&aPrestige 3 &5Myth' + Prestige 3 rank 12 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 3 rank 13: '&aPrestige 3 &5Immortal' + Prestige 3 rank 13 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 4 rank 0: '&3Prestige 4 &8Commoner' + Prestige 4 rank 0 short placeholder: '&3⚜ⅠⅤ&6&l✧&e0' + Prestige 4 rank 1: '&3Prestige 4 &fRookie' + Prestige 4 rank 1 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠ' + Prestige 4 rank 2: '&3Prestige 4 &fNovice' + Prestige 4 rank 2 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅠ' + Prestige 4 rank 3: '&3Prestige 4 &fApprentice' + Prestige 4 rank 3 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅠⅠ' + Prestige 4 rank 4: '&3Prestige 4 &2Adventurer' + Prestige 4 rank 4 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅤ' + Prestige 4 rank 5: '&3Prestige 4 &2Journeyman' + Prestige 4 rank 5 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤ' + Prestige 4 rank 6: '&3Prestige 4 &2Adept' + Prestige 4 rank 6 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠ' + Prestige 4 rank 7: '&3Prestige 4 &1Veteran' + Prestige 4 rank 7 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠⅠ' + Prestige 4 rank 8: '&3Prestige 4 &1Elite' + Prestige 4 rank 8 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠⅠⅠ' + Prestige 4 rank 9: '&3Prestige 4 &5Master' + Prestige 4 rank 9 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅩ' + Prestige 4 rank 10 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩ' + Prestige 4 rank 10: '&3Prestige 4 &5Hero' + Prestige 4 rank 11: '&3Prestige 4 &5Legend' + Prestige 4 rank 11 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠ' + Prestige 4 rank 12: '&3Prestige 4 &5Myth' + Prestige 4 rank 12 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅠ' + Prestige 4 rank 13: '&3Prestige 4 &5Immortal' + Prestige 4 rank 13 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅠⅠ' + Prestige 4 rank 14: '&3Prestige 4 &5Chosen' + Prestige 4 rank 14 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅤ' + Prestige 5 rank 0: '&bPrestige 5 &8Commoner' + Prestige 5 rank 0 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 5 rank 1: '&bPrestige 5 &fRookie' + Prestige 5 rank 1 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠ' + Prestige 5 rank 2: '&bPrestige 5 &fNovice' + Prestige 5 rank 2 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅠ' + Prestige 5 rank 3: '&bPrestige 5 &fApprentice' + Prestige 5 rank 3 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅠⅠ' + Prestige 5 rank 4: '&bPrestige 5 &2Adventurer' + Prestige 5 rank 4 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅤ' + Prestige 5 rank 5: '&bPrestige 5 &2Journeyman' + Prestige 5 rank 5 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤ' + Prestige 5 rank 6: '&bPrestige 5 &2Adept' + Prestige 5 rank 6 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠ' + Prestige 5 rank 7: '&bPrestige 5 &1Veteran' + Prestige 5 rank 7 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠⅠ' + Prestige 5 rank 8: '&bPrestige 5 &1Elite' + Prestige 5 rank 8 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠⅠⅠ' + Prestige 5 rank 9: '&bPrestige 5 &5Master' + Prestige 5 rank 9 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅩ' + Prestige 5 rank 10 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩ' + Prestige 5 rank 10: '&bPrestige 5 &5Hero' + Prestige 5 rank 11: '&bPrestige 5 &5Legend' + Prestige 5 rank 11 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠ' + Prestige 5 rank 12: '&bPrestige 5 &5Myth' + Prestige 5 rank 12 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅠ' + Prestige 5 rank 13: '&bPrestige 5 &5Immortal' + Prestige 5 rank 13 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅠⅠ' + Prestige 5 rank 14: '&bPrestige 5 &5Chosen' + Prestige 5 rank 14 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅤ' + Prestige 5 rank 15: '&bPrestige 5 &5Ascendant' + Prestige 5 rank 15 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅤ' + Prestige 6 rank 0: '&4Prestige 6 &8Commoner' + Prestige 6 rank 0 short placeholder: '&4⚜ⅤⅠ&6&l✧&e0' + Prestige 6 rank 1: '&4Prestige 6 &fRookie' + Prestige 6 rank 1 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠ' + Prestige 6 rank 2: '&4Prestige 6 &fNovice' + Prestige 6 rank 2 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅠ' + Prestige 6 rank 3: '&4Prestige 6 &fApprentice' + Prestige 6 rank 3 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅠⅠ' + Prestige 6 rank 4: '&4Prestige 6 &2Adventurer' + Prestige 6 rank 4 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅤ' + Prestige 6 rank 5: '&4Prestige 6 &2Journeyman' + Prestige 6 rank 5 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤ' + Prestige 6 rank 6: '&4Prestige 6 &2Adept' + Prestige 6 rank 6 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠ' + Prestige 6 rank 7: '&4Prestige 6 &1Veteran' + Prestige 6 rank 7 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠⅠ' + Prestige 6 rank 8: '&4Prestige 6 &1Elite' + Prestige 6 rank 8 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 6 rank 9: '&4Prestige 6 &5Master' + Prestige 6 rank 9 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅩ' + Prestige 6 rank 10 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩ' + Prestige 6 rank 10: '&4Prestige 6 &5Hero' + Prestige 6 rank 11: '&4Prestige 6 &5Legend' + Prestige 6 rank 11 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠ' + Prestige 6 rank 12: '&4Prestige 6 &5Myth' + Prestige 6 rank 12 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠ' + Prestige 6 rank 13: '&4Prestige 6 &5Immortal' + Prestige 6 rank 13 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 6 rank 14: '&4Prestige 6 &5Chosen' + Prestige 6 rank 14 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅤ' + Prestige 6 rank 15: '&4Prestige 6 &5Ascendant' + Prestige 6 rank 15 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤ' + Prestige 6 rank 16: '&4Prestige 6 &5Titan' + Prestige 6 rank 16 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤⅠ' + Prestige 7 rank 0: '&cPrestige 7 &8Commoner' + Prestige 7 rank 0 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&e0' + Prestige 7 rank 1: '&cPrestige 7 &fRookie' + Prestige 7 rank 1 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠ' + Prestige 7 rank 2: '&cPrestige 7 &fNovice' + Prestige 7 rank 2 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅠ' + Prestige 7 rank 3: '&cPrestige 7 &fApprentice' + Prestige 7 rank 3 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 7 rank 4: '&cPrestige 7 &2Adventurer' + Prestige 7 rank 4 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅤ' + Prestige 7 rank 5: '&cPrestige 7 &2Journeyman' + Prestige 7 rank 5 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤ' + Prestige 7 rank 6: '&cPrestige 7 &2Adept' + Prestige 7 rank 6 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠ' + Prestige 7 rank 7: '&cPrestige 7 &1Veteran' + Prestige 7 rank 7 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 7 rank 8: '&cPrestige 7 &1Elite' + Prestige 7 rank 8 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 7 rank 9: '&cPrestige 7 &5Master' + Prestige 7 rank 9 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅩ' + Prestige 7 rank 10 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩ' + Prestige 7 rank 10: '&cPrestige 7 &5Hero' + Prestige 7 rank 11: '&cPrestige 7 &5Legend' + Prestige 7 rank 11 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠ' + Prestige 7 rank 12: '&cPrestige 7 &5Myth' + Prestige 7 rank 12 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 7 rank 13: '&cPrestige 7 &5Immortal' + Prestige 7 rank 13 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 7 rank 14: '&cPrestige 7 &5Chosen' + Prestige 7 rank 14 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅤ' + Prestige 7 rank 15: '&cPrestige 7 &5Ascendant' + Prestige 7 rank 15 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤ' + Prestige 7 rank 16: '&cPrestige 7 &5Titan' + Prestige 7 rank 16 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤⅠ' + Prestige 7 rank 17: '&cPrestige 7 &5Demigod' + Prestige 7 rank 17 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤⅠⅠ' + Prestige 8 rank 0: '&9Prestige 8 &8Commoner' + Prestige 8 rank 0 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&e0' + Prestige 8 rank 1: '&9Prestige 8 &fRookie' + Prestige 8 rank 1 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠ' + Prestige 8 rank 2: '&9Prestige 8 &fNovice' + Prestige 8 rank 2 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅠ' + Prestige 8 rank 3: '&9Prestige 8 &fApprentice' + Prestige 8 rank 3 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 8 rank 4: '&9Prestige 8 &2Adventurer' + Prestige 8 rank 4 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅤ' + Prestige 8 rank 5: '&9Prestige 8 &2Journeyman' + Prestige 8 rank 5 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤ' + Prestige 8 rank 6: '&9Prestige 8 &2Adept' + Prestige 8 rank 6 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠ' + Prestige 8 rank 7: '&9Prestige 8 &1Veteran' + Prestige 8 rank 7 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 8 rank 8: '&9Prestige 8 &1Elite' + Prestige 8 rank 8 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 8 rank 9: '&9Prestige 8 &5Master' + Prestige 8 rank 9 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅩ' + Prestige 8 rank 10 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩ' + Prestige 8 rank 10: '&9Prestige 8 &5Hero' + Prestige 8 rank 11: '&9Prestige 8 &5Legend' + Prestige 8 rank 11 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠ' + Prestige 8 rank 12: '&9Prestige 8 &5Myth' + Prestige 8 rank 12 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 8 rank 13: '&9Prestige 8 &5Immortal' + Prestige 8 rank 13 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 8 rank 14: '&9Prestige 8 &5Chosen' + Prestige 8 rank 14 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅤ' + Prestige 8 rank 15: '&9Prestige 8 &5Ascendant' + Prestige 8 rank 15 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤ' + Prestige 8 rank 16: '&9Prestige 8 &5Titan' + Prestige 8 rank 16 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠ' + Prestige 8 rank 17: '&9Prestige 8 &5Demigod' + Prestige 8 rank 17 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠⅠ' + Prestige 8 rank 18: '&9Prestige 8 &5Deity' + Prestige 8 rank 18 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 9 rank 0: '&dPrestige 9 &8Commoner' + Prestige 9 rank 0 short placeholder: '&d⚜ⅠⅩ&6&l✧&e0' + Prestige 9 rank 1: '&dPrestige 9 &fRookie' + Prestige 9 rank 1 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠ' + Prestige 9 rank 2: '&dPrestige 9 &fNovice' + Prestige 9 rank 2 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅠ' + Prestige 9 rank 3: '&dPrestige 9 &fApprentice' + Prestige 9 rank 3 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅠⅠ' + Prestige 9 rank 4: '&dPrestige 9 &2Adventurer' + Prestige 9 rank 4 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅤ' + Prestige 9 rank 5: '&dPrestige 9 &2Journeyman' + Prestige 9 rank 5 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤ' + Prestige 9 rank 6: '&dPrestige 9 &2Adept' + Prestige 9 rank 6 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠ' + Prestige 9 rank 7: '&dPrestige 9 &1Veteran' + Prestige 9 rank 7 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠⅠ' + Prestige 9 rank 8: '&dPrestige 9 &1Elite' + Prestige 9 rank 8 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠⅠⅠ' + Prestige 9 rank 9: '&dPrestige 9 &5Master' + Prestige 9 rank 9 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅩ' + Prestige 9 rank 10 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩ' + Prestige 9 rank 10: '&dPrestige 9 &5Hero' + Prestige 9 rank 11: '&dPrestige 9 &5Legend' + Prestige 9 rank 11 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠ' + Prestige 9 rank 12: '&dPrestige 9 &5Myth' + Prestige 9 rank 12 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅠ' + Prestige 9 rank 13: '&dPrestige 9 &5Immortal' + Prestige 9 rank 13 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅠⅠ' + Prestige 9 rank 14: '&dPrestige 9 &5Chosen' + Prestige 9 rank 14 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅤ' + Prestige 9 rank 15: '&dPrestige 9 &5Ascendant' + Prestige 9 rank 15 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤ' + Prestige 9 rank 16: '&dPrestige 9 &5Titan' + Prestige 9 rank 16 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠ' + Prestige 9 rank 17: '&dPrestige 9 &5Demigod' + Prestige 9 rank 17 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠⅠ' + Prestige 9 rank 18: '&dPrestige 9 &5Deity' + Prestige 9 rank 18 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 9 rank 19: '&dPrestige 9 &5Godhunter' + Prestige 9 rank 19 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅩ' + Prestige 10 rank 0: '&5Prestige 10 &8Commoner' + Prestige 10 rank 0 short placeholder: '&5⚜Ⅹ&6&l✧&e0' + Prestige 10 rank 1: '&5Prestige 10 &fRookie' + Prestige 10 rank 1 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠ' + Prestige 10 rank 2: '&5Prestige 10 &fNovice' + Prestige 10 rank 2 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠ' + Prestige 10 rank 3: '&5Prestige 10 &fApprentice' + Prestige 10 rank 3 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠⅠ' + Prestige 10 rank 4: '&5Prestige 10 &2Adventurer' + Prestige 10 rank 4 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅤ' + Prestige 10 rank 5: '&5Prestige 10 &2Journeyman' + Prestige 10 rank 5 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤ' + Prestige 10 rank 6: '&5Prestige 10 &2Adept' + Prestige 10 rank 6 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠ' + Prestige 10 rank 7: '&5Prestige 10 &1Veteran' + Prestige 10 rank 7 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠ' + Prestige 10 rank 8: '&5Prestige 10 &1Elite' + Prestige 10 rank 8 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠⅠ' + Prestige 10 rank 9: '&5Prestige 10 &5Master' + Prestige 10 rank 9 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅩ' + Prestige 10 rank 10 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩ' + Prestige 10 rank 10: '&5Prestige 10 &5Hero' + Prestige 10 rank 11: '&5Prestige 10 &5Legend' + Prestige 10 rank 11 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠ' + Prestige 10 rank 12: '&5Prestige 10 &5Myth' + Prestige 10 rank 12 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅠ' + Prestige 10 rank 13: '&5Prestige 10 &5Immortal' + Prestige 10 rank 13 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅠⅠ' + Prestige 10 rank 14: '&5Prestige 10 &5Chosen' + Prestige 10 rank 14 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅤ' + Prestige 10 rank 15: '&5Prestige 10 &5Ascendant' + Prestige 10 rank 15 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤ' + Prestige 10 rank 16: '&5Prestige 10 &5Titan' + Prestige 10 rank 16 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠ' + Prestige 10 rank 17: '&5Prestige 10 &5Demigod' + Prestige 10 rank 17 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠⅠ' + Prestige 10 rank 18: '&5Prestige 10 &5Deity' + Prestige 10 rank 18 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 10 rank 19: '&5Prestige 10 &5Godhunter' + Prestige 10 rank 19 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅩ' + Prestige 10 rank 20: '&5Prestige 10 &5Godslayer' + Prestige 10 rank 20 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅩ' + lootLimiterMessage: '&7[EM] &cYou must unlock the next guild rank through /ag to loot better items!' + prestigeUnlockMessageTitle: '$player' + prestigeUnlockMessageSubtitle: '&2has unlocked $tier&2!' +buy_or_sell_menu: + Shop name: '[EM] Beli atau Jual' +custom_quest_screen: + headerTextLines2: | + &a&l『&c&l$questName&a&l』 + acceptTextLines: '&a&l[Accept!]' + acceptHoverLines: "&aClick to \n&aaccept quest!" + acceptedTextLines: '&2&lAccepted! &aTurn in with $npcName &4[Abandon]' + acceptedHoverLines: '&aClick to abandon quest!' + trackTextLines: '&2&l[Track]' + trackHoverLines: '&aClick to track quest!' + untrackTextLines: '&4&l[Untrack]' + untrackHoverLines: '&cClick to untrack quest!' + completedTextLines: '&2&l[Turn in!]' + completedHoverLines: '&aClick to turn quest in!' + turnedInTextLines: '&8[Completed!]' + turnedInHoverLines: '&8Already turned in!' + objectivesLine: '&c&lObjectives:' + killQuestDefaultSummaryLine: '&c➤Kill $name:$color$current&0/$color$target' + fetchQuestDefaultSummaryLine: '&c➤Get $name:$color&$current&0/$color$target' + dialogQuestDefaultSummaryLine: '&c➤Go talk to $name $location' + rewardsLine: '&2&lRewards:' + rewardsDefaultSummaryLine: '&2➤$amountx $rewardName &8($chance%)' +custom_shop_menu: + Shop name: '[EM] Custom Shop' + Full inventory message: '[EliteMobs] &4Tas inventori kamu penuh, kamu tidak membeli, silahkan kosongkan dahulu.' +dynamic_quest_screen: + questName: Membunuh $amount $name + headerTextLines2: |- + &c&lGuild request! + &0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ + defaultLoreTextLines: '&8Slay $amount $name!' + acceptTextLines: '&a&lAccept!' + acceptHoverLines: "&aClick to \n&aaccept quest!" + acceptedTextLines: '&2&lAccepted! &4[Abandon]' + acceptedHoverLines: '&aClick to abandon quest!' + completedTextLines: '&2&l[Turn in!]' + completedHoverLines: '&aClick to turn quest in!' + turnedInTextLines: '&8[Completed!]' + turnedInHoverLines: '&8Already turned in!' + objectivesLine: '&c&lObjectives:' + killQuestDefaultSummaryLine: '&c➤Kill $name:$color$current&0/$color$target' + rewardsLine: '&2&lRewards:' + rewardsDefaultSummaryLine: '&2➤$amountx $rewardName &8($chance%)' +enhancement_menu: + shopName: '[EM] Menu Enhancemant!' +get_loot_menu: + Menu name: '[EM] Getloot menu' + tierTranslation: Level + itemFilterTranslation: Filter by items of this level. +guild_rank_selector_menu: + questTierSelectorMenuTitle: '[EM] Memilih Guild Rank' + lowTierWarning: '&cElites tidak bisa menjatuhkan jarahan yang lebih baik!' + normalTierWarning: '&aElite dapat menjatuhkan jarahan yang lebih baik!' + notEnoughCurrencyMessages: '&7[EliteMobs] &4Kamu tidak memiliki koin yang cukup ($neededAmount $currencyName)! Jual beberapa Elite jarahan kamu [/em shop]! Kamu memiliki $currentAmount $currencyName.' + unlockMessages: "&7[EliteMobs] &aKamu telah mencapai $rankName &auntuk rank $price\\ \\ $currencyName. \n&6Selamat berburu!" + questCompleteBroadcastMessages: '&7[EliteMobs] &a$player &atelah mencapai $rankName &aguild rank!' + failedMessages: '&7[EliteMobs] &cKamu perlu rank sebelum nya untuk membuka!' + spawnRateModifierMessages: '&fElite Mob spawn rate modifier: &c$modifier%' + lootModifierMessages: '&fElite Mob loot modifier: &a$modifier%' + difficultyModifierMessages: '&fElite Mob difficulty modifier: &c$modifier%' + lootTierMessages: '&2Elites dapat menjatuhkan tingkatan $tier jarahan!' + currencyBonusMessages: '&a$amountx coins from drops and quests!' + healthBonusMessages: '&cAdds $amount ❤ maksimum darah' + critBonusMessages: '&eAdds $amount% chance to crit' + dodgeBonusMessages: '&8Adds $amount% chance to dodge' +player_status_screen: + indexTexts0: '&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + indexTexts1: '&5&l/ag &7- &6EliteMobs Hub' + indexHovers1: |- + KLIK UNTUK MEMAKAI + Sebuah tempat diamana kamu dapat mencari + NPC Pemberi Quest, Membeli dan Menjual + dan banyak lagi! + indexTexts2: '&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + indexTexts4: '&6&lIndex' + indexTexts6: '&bp. $statsPage &8- &6Stats' + indexHovers6: Klik untuk Pergi! + indexTexts7: '&bp. $gearPage &8- &6Gear' + indexHovers7: Klik untuk Pergi! + indexTexts8: '&bp. $teleportsPage &8- &6Teleports' + indexHovers8: Klik untuk Pergi! + indexTexts9: '&bp. $commandsPage &8- &6Commands' + indexHovers9: Klik untuk Pergi! + indexTexts10: '&bp. $questsPage &8- &6Melacak Quest' + indexHovers10: Klik untuk Pergi! + indexTexts11: '&bp. $bossTrackingPage &8- &6Melacak Boss' + indexHovers11: Klik untuk Pergi! + statsText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + statsText1: '&5&lPlayer Stats:' + statsText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + statsText4: '&2Money: &a$money' + statsHover4: |- + Kill Elite Mobs to loot currency or + sell their drops in /em shop or + complete quests! + statsText6: '&6Guild Tier: &3$guildtier' + statsHover6: |- + Tingkatan Prestige dan Guild Rank: + Peringkat Guild menentukan seberapa bagus hasil jarahan, mendapatkan bonos dari tingkatan prestige. membuka dan mencpai tingkatan prestige mendapatkan banyak hadiah, seperti menambah maksimum darah, kesempatan menghindar/kritikal, meningkatkan uang hasil jarahan! Kamu dapat membuka tingkatan Prestige dan Guild Rank di /ag! + ⚜ = prestige rank, ✧ = guild rank! + statsText7: '&4Elite Kills: &c$kills' + statsHover7: Jumlah Elite Mobs yang terbunuh. + statsText8: '&4Max Lvl Killed: &c$highestkill' + statsHover8: |- + Level dari Monster Elite tertinggi yang terbunuh. + Level Monster Elite didasarkan pada tingkatan + perlengkapanmu! tingkatan lebih tinggi, lebih tinggi level Monster Elite! + Catatan: hanya pembunuhan non-eksploitasi yang dihitung! + statsText9: '&4Elite Deaths: &c$deaths' + statsHover9: Jumlah Mati. + statsText10: '&5Quest Selesai: &d$quests' + statsHover10: |- + Amount of EliteMobs quests completed. + You can accept quests by talking to NPCs! + statsText12: '&bScore: &3$score' + statsHover12: |- + Skor EliteMobs Anda naik + ketika Anda membunuh dari gerombolan elit, + dan itu turun ketika Anda mati + Monster Elite Tingkat lebih tinggi + memberikan skor lebih. + gearText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + gearText1: '&7&lArmor & Weapons:' + gearText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + gearText3: '&8&lGear Tiers:' + gearText4: ' ☠ - $helmettier' + gearHover4: '$helmet' + gearText5: ' ▼ - $chestplatetier' + gearHover5: '$chestplate' + gearText6: ' Π - $leggingstier' + gearHover6: '$leggings' + gearText7: ' ╯╰ - $bootstier' + gearHover7: '$boots' + gearText8: '{⚔ - $mainhandtier} {⛨ - $offhandtier}' + gearHover8: '{$mainhand}{$offhand}' + gearText10: '{dmg : $damage} {armr: $armor}' + gearHover10: '{Base damage dealt to Elite Mobs}{Damage reduction from Elite Mobs}' + gearText11: 'Threat level: $threat' + gearHover11: | + This determines the level of the + Elite Mobs that spawns near you. + Takes armor, weapon in hand, guild + tier into account. + teleportText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + teleportText1: '&2&lTeleports' + teleportText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + teleportText3: Spawn + teleportHover3: Teleport to spawn! + teleportText4: '&6&lAdventurer''s Hub' + teleportHover4: Teleport to the Adventurer's Guild Hub! + onTeleportsHover: Click to teleport! + commandsText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + commandsText1: '&3&lCommands:' + commandsText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + commandsText4: '&5/ag' + commandsHover4: |- + KLIK UNTUK MEMAKAI + Sebuah tempat diamana kamu dapat mencari + NPC Pemberi Quest, Membeli dan Menjual + dan banyak lagi! + commandsText6: '&5/shareitem' + commandsHover6: |- + CLICK TO USE + Shares the item you're holding + on chat! + questTrackerText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + questTrackerText1: '&6&lQuests:' + questTrackerHover1: Talk to NPCs to accept quests! + questTrackerText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + onQuestTrackHover: Click to abandon! + bossTrackerText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + bossTrackerText1: '&4&lBoss Tracker:' + bossTrackerHover1: Big bosses get displayed here! + bossTrackerText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + onBossTrackHover: Click to track/untrack! + teleportChestMenuName: '&2EliteMobs Teleports' + bossTrackerChestMenuName: '&2EliteMobs Boss Tracking' + indexChestMenuName: '&2EliteMobs Index' + gearChestMenuName: '&2EliteMobs Gear' + statsChestMenuName: '&2EliteMobs Stats' + commandsChestMenuName: '&2EliteMobs Commands' +procedural_shop_menu: + Shop name: '[EM] Procedural Item Shop' + Full inventory message: '&[EliteMobs] &4Tas inventori kamu penuh, kamu tidak membeli, silahkan kosongkan dahulu.' +quest_menu: + menuName: '[EM] Memilih Quest' + cancelQuestMessage1: '&c&l&m&o---------------------------------------------&cKamu hanya dapat memilih satu quest dalam satu waktu! Membatalkan Quest yang berjalan akan mereset quest yang sedang berjalan!' + cancelQuestMessage2: '&2[Klik disini untuk membatalkan quest!]' + cancelQuestMessage3: '&7Kamu dapat melihat status quest kamu dengan perintah &a/em quest status&c&l&m&o---------------------------------------------' + questCancelMessage: '&7[EliteMobs] &cQuest yang sedang berjalan telah dibatalkan!' + questStartTitle: Kamu telah menerima quest! + questStartSubtitle: Membunuh $objectiveAmount $objectiveName + questCompleteTitle: Quest selesai! + questCompleteSubtitle: Kamu telah membunuh $objectiveAmount $objectiveName + bossBarObjective: Membunuh $objectiveAmount $objectiveName + questRewardMessage: '&7[EM] &aQuest selesai! &6Kamu mendapatkan &2$reward $currencyName' + questCompleteBroadcastMessage: '&7[EM] $player &2telah selesai $rank &2quest!' + questStartBroadcastMessage: '&7[EM] $player &2telah menerima a $rank &2quest!' + questStatusMessage: '&7[EM] &aKamu telah membunuh &a$currentAmount &f/ &c$objectiveAmount &a$objectiveName' +refiner_menu: + shopName: '[EM] Place 10 scrap!' +repair_menu: + shopName: '[EM] Repair menu!' +scrapper_menu: + shopName: '[EM] Scrapper' +sell_menu: + shopName: '[EM] Toko Menjual' +smelt_menu: + shopName: '[EM] Place 25 scrap!' +unbind_menu: + shopName: '[EM] Unbind menu!' +taunt: + onDamaged: + - Ow! + - Oi! + - Stop that! + - Why?! + - You fight like a Dairy Farmer! + - You are a pain in the backside! + - En garde! Touche! + - Hacks! + - My health is bugged, unkillable! + - Your hits only make me stronger! + - Sticks and stones... + - '''tis but a flesh wound!' + - Emperor protects! + - Herobrine, aid me! + - Behind you! A creeper! + - I have made a terrible mistake. + - What doesn't kill me... + - Zombies dig scars + - I shall show you my true power! + - Prepare for my ultimate attack! + - My reinforcements are arriving! + - You're going to pay for that! + - That's going to leave a mark! + - An eye for an eye! + - Health insurance will cover that + - I felt that one in my bones + - '''tis but a scratch' + - What was that? A soft breeze? + - You'll never defeat me like that + - Pathetic. + - Weak. + - That didn't even dent my armor! + - This is going to be an easy one + - My grandchildren will feel that + - Are you even trying? + - An admin just fully healed me + - Haxxor! + - Me? Damaged? Hacks! + - I can't be defeated! + - Good thing I'm using hacks! + - Watch out! Herobrine behind you! + - My life for Aiur! + - Your home is getting griefed! + - Why can't we be friends? + - Valhalla! + - Notch save me! + - No retreat! + - Hit me with your best shot! + onDamagedByBow: + - Fight me like a Player! + - Afraid to come up-close? + - I can smell your fear from here! + - Did you forget your sword? + - Coward! Bow are no fair! + - Bows? That's so 2011... + - Bows are for the weak of mind! + - Bows are for the weak of spirit! + - Bows are for the weak of heart! + - I thought we agreed no bows! + - Bows? You'll regret that + - Ow! + - Oi! + - Stop that! + - Why?! + - You fight like a Dairy Farmer! + - You are a pain in the backside! + - En garde! Touche! + - Hacks! + - My health is bugged, unkillable! + - Your hits only make me stronger! + - Sticks and stones... + - '''tis but a flesh wound!' + - Emperor protects! + - Herobrine, aid me! + - Behind you! A creeper! + - I have made a terrible mistake. + - What doesn't kill me... + - Zombies dig scars + - I shall show you my true power! + - Prepare for my ultimate attack! + - My reinforcements are arriving! + - You're going to pay for that! + - That's going to leave a mark! + - An eye for an eye! + - Health insurance will cover that + - I felt that one in my bones + - '''tis but a scratch' + - What was that? A soft breeze? + - You'll never defeat me like that + - Pathetic. + - Weak. + - That didn't even dent my armor! + - This is going to be an easy one + - My grandchildren will feel that + - Are you even trying? + - An admin just fully healed me + - Haxxor! + - Me? Damaged? Hacks! + - I can't be defeated! + - Good thing I'm using hacks! + - Watch out! Herobrine behind you! + - My life for Aiur! + - Your home is getting griefed! + - Why can't we be friends? + - Valhalla! + - Notch save me! + - No retreat! + - Hit me with your best shot! + onDamage: + - A solid hit! + - He shoots, and he scores! + - You'll feel that in the morning! + - Victory approaches! + - Victory shall be mine! + - That was only half of my power! + - You came to the wrong hood! + - You messed with the wrong mob! + - Get ready to get mobbed on! + - This was your last mistake! + - Feel the burn! + - John Cena + - How are you still standing? + - Just give up already! + - Give up! + - I have the high ground! + - I will end you! + - Hope you came prepared for pain! + - The hunter becomes the hunted! + - Blood for the blood throne! + - Skulls for the skull throne! + - A good player is a dead player! + - Git gud! + - Praise the Sun! + - The end draws near! + - You are not prepared. + - Zug zug! + - Hardly worth my time! + - I thought this was a challenge? + - 'Pro tip: don''t get hit' + - Ima firin mah lazer bwooooooooo + - For the Emperor! + - Herobrine shall be pleased! + - This is the end for you! + - Are you even trying? + - Weakling! + - Pathetic. + - Maybe this will wake you up. + - This is just the beggining! + - We're just getting started! + - That was just a warm-up! + - You are no match for me! + - RKO out of nowhere! + - I can do this all night long! + - A fine punching bag! + - I am the night! + - I wonder what will break first + - Revenge for Steve! You monster! + - Join the mob side! + - Too easy, too easy! + - Too easy! + - You can't defeat me! + - Pikachuuuuuu + - Avada kedavra! + - Crucio! + - Jierda! + - A critical hit! + - This is what skills looks like! + - 9001 damage! + - Still standing? + - Face your defeat! + - A taste of pain to come! + - I'll make you endangered! + onDeath: + - Alas, poor Yorick! + - The rest is silence + - I shall return + - Unforgivable + - I live, I die, I live again! + - WITNESS ME + - I ride to valhalla! + - VALHALLA! + - VALHALLA! DELIVERANCE + - You win, this time + - A blight upon your land! + - A pox upon thee! + - You'll join me soon enough! + - This is not over + - Death is but a setback + - Not like this... + - I just wanted to go into space + - We could've been friends + - Your sins crawling on your back + - See you in a bit + - See you later + - I'll be waiting for you + - I will be avenged! + - I won't go gently into the night + - Should've gotten life insurance + - It was my last day on the job + - It was my last day here + - Et tu, Brute? + - RIP + - x.x + - (x.x) + - xox + - Fainted + - GG, WP + - GG + - WP + - GG no RE + - HAX + - Hacker + - Not fair I was lagging + - You win, this time + - You monster... + - Mediocre... + onTarget: + - OI! Get over here! + - What's that I see? A coward? + - Sir, prepare your fisticuffs! + - Let's settle this like cavemen! + - En garde! + - Look out! A creeper, behind you! + - Aren't you a right ugly mug! + - You look delicious. + - Prepare for trouble! + - Let the best click spammer win! + - SPARTAAAAAA + - I am actually level 9001 + - Not an Elite Mob + - Poorly disguised Elite Mob + - Ah, fresh prey! + - The hunter becomes the hunted! + - Killing me crashes the server + - I'm actually a disguised player! + - I'm not going to drop any loot! + - Why can't we be friends? + - Sssssss + - This is my last day on the job! + - Stop right there criminal scum! + - Prepare to die! + - Praise the Sun! + - Git gud + - Alea jacta est! + - Facta, non verba! + - Skulls for the skull throne! + - Blood for the blood throne! + - A sacrifice for Herobrine! + - I shall pierce the heavens! + - Just who do you think I am!? + - A weakling! He's mine. + - Dibs on the weakling! + - Accio player! + - A duel to the death! + - I challenge you to a duel! + - Pika pika! + - Did you just call me an infernal + - What did you just call me? + - I know what you did you monster! + - This is how your story ends! + - Prepare for trouble! + - I've been preparing for this! + - I am prepared. Are you? + - A worthy foe! + - A worthy opponent! + - A newbie! It's my lucky day! + - Your stuff or your life! + - This is a robbery! + - It's you! You monster! + - So hungry, give me your flesh! + - There he is! + - Must've been my imagination + - Hi I'm Mr Meeseeks! + - I'm Mr Meeseeks, look at me! + - Your diamonds or your life! + - For king and country! + - Hit me with your best shot! + - Witness me! + - Witness me blood bag! + - I go all shiny and chrome! +zombie_friends: + friend1Name: 'BFF #1' + friend2Name: 'BFF #2' + friendDeathMessage: + - Noooo! + - Mediocre! + - Zacharias! + - He's deader than before! + - Vengeance! + - Revenge! + - I can't believe you've done this. + originalEntityDialog: + - Let's play ZombieCraft later! + - Feel the power of friendship! + - El pueblo, unido! + - I called my friends over! + - BFF power! + - One for all! + - Get him! + - Screw you guys, I'm going home! + reinforcementDialog: + - Don't mess with our friends! + - We got your back Zach! + - Backup has arrived! + - One for all, one for all! + - This is going to be easy! + - Give up we have the high ground! + - You wanna go bruv? + - Worldstaaaaaaaaar! + - What are you doing to our friend + - Feel the power of friendship! + - Friendship power at 100%! + - Zombies, assemble! + - We got your back mate! + - Together we are better! + - The more the merrier! + - I got you fam! + - All for one! +zombie_necronomicon: + summoningChant: Nor is it to be thought...that man is either the oldest or the last of earth's masters, or that the common bulk of life and substance walks alone. The Old Ones were, the Old Ones are, and the Old Ones shall be. Not in the spaces we know, but between them, they walk serene and primal, undimensioned and to us unseen. Yog-Sothoth knows the gate. Yog-Sothoth is the gate. Yog-Sothoth is the key and guardian of the gate. Past, present, future, all are one in Yog-Sothoth. He knows where the Old Ones broke through of old, and where They shall break through again. He knows where They had trod earth's fields, and where They still tread them, and why no one can behold Them as They tread. By Their smell can men sometimes know Them near, but of Their semblance can no man know, saving only in the features of those They have begotten on mankind; and of those are there many sorts, differing in likeness from man's truest eidolon to that shape without sight or substance which is Them. They walk unseen and foul in lonely places where the Words have been spoken and the Rites howled through at their Seasons. The wind gibbers with Their voices, and the earth mutters with Their consciousness. They bend the forest and crush the city, yet may not forest or city behold the hand that smites. Kadath in the cold waste hath known Them, and what man knows Kadath? The ice desert of the South and the sunken isles of Ocean hold stones whereon Their seal is engraver, but who hath seen the deep frozen city or the sealed tower long garlanded with seaweed and barnacles? Great Cthulhu is Their cousin, yet can he spy Them only dimly. Iä! Shub-Niggurath! As a foulness shall ye know Them. Their hand is at your throats, yet ye see Them not; and Their habitation is even one with your guarded threshold. Yog-Sothoth is the key to the gate, whereby the spheres meet. Man rules now where They ruled once; They shall soon rule where man rules now. After summer is winter, after winter summer. They wait patient and potent, for here shall They reign again. +zombie_parents: + deathMessage: + - You monster! + - My baby! + - What have you done!? + - Revenge! + - Nooooo! + - You will pay for that! + - Eh, he was adopted + - He's dead! Again! + - He's deader than before! + - You broke him! + bossEntityDialog: + - You're embarrassing me! + - He's bullying me! + - He's the one picking on me! + - I can deal with this alone! + - Leave me alone, I got this! + - Stop following me around! + - God this is so embarrassing! + - He took my lunch money! + - He's bullying me! + zombieDad: + - Get away from my son! + - Stand up for yourself son! + - I'll deal with him! + - Stop picking on my son! + - Why are you doing this? + - I'll talk to your parents! + - You go kiddo! + - Show him who's boss kiddo! + - Nice punch kiddo! + zombieMom: + - Hands off my child! + - Are you hurt sweetie? + - Did he hurt you sweetie? + - Let me see that booboo sweetie + - I'll talk to his parents! + - You forgot your jacket sweetie! + - Posture, sweetheart + - Break it up! + - Stop this! + - Did you take out the garbage? +elite_blaze: + name: '&fLvl &2$level &fElite &eBlaze' + deathMessages: + - '$player &cwas lit ablaze by $entity!' +elite_cave_spider: + name: '&fLvl &2$level &fElite &3Cave Spider' + deathMessages: + - '$player &cbecame entangled in $entity''s &cweb!' +elite_creeper: + name: '&fLvl &2$level &fElite &2Creeper' + deathMessages: + - '$player &cwas blasted away by $entity!' + - '$entity &cjust oh man''d $player&c!' +elite_drowned: + name: '&fLvl &2$level &fElite &3Drowned' + deathMessages: + - '$player &chas been brought down to the depths by $entity!' + - '$player &chas been drowned by $entity!' +elite_elder_guardian: + name: '&fLvl &2$level &fElite &3Elder Guardian' + deathMessages: + - '$entity &cprevented $player &cfrom exploring the depths!' +elite_guardian: + name: '&fLvl &2$level &fElite &3Guardian' + deathMessages: + - '$entity &cprevented $player &cfrom exploring the depths!' +elite_enderman: + name: '&fLvl &2$level &fElite &5Enderman' + deathMessages: + - '$entity &csent $player &cinto the void!' + - '$player &clooked at $entity &cwrong!' + - '$player &cand $entity &cbecame best friends!' +elitemob_endermite: + name: '&fLvl &2$level &fElite &7Endermite' + deathMessages: + - '$entity &cis to $player &cwhat David is to Goliath!' +elite_evoker: + name: '&fLvl &2$level &fElite &5Evoker' + deathMessages: + - '$player &cwas enchanted by $entity&c!' +elite_husk: + name: '&fLvl &2$level &fElite &7Husk' + deathMessages: + - '$player &cwas hollowed out by $entity&c!' +elite_illusioner: + name: '&fLvl &2$level &fElite &8Illusioner' + deathMessages: + - '$player&c fell for $entity''s &cillusions!' +elite_iron_golem: + name: '&fLvl &2$level &fElite &fIron Golem' + deathMessages: + - '$player &cmessed with the wrong $entity&c!' + - '$player &chas been taught the way of fist by $entity&c!' +elite_phantom: + name: '&fLvl &2$level &fElite &9Phantom' + deathMessages: + - '$player &cjust had a bad nightmare about $entity&c!' + - '$player &cwill be having nightmares about $entity&c!' + - '$entity &chas taught $player &cthe value of sleep!' +elite_pillager: + name: '&fLvl &2$level &fElite &8Pillager' + deathMessages: + - '$entity &cplundered $player&c!' + - '$entity &cpillaged $player&c!' +elite_polar_bear: + name: '&fLvl &2$level &fElite &fPolar Bear' + deathMessages: + - '$player &cwas clawed to death by $entity&c!' + - '$player &cwas mauled to death by $entity&c!' +elite_ravager: + name: '&fLvl &2$level &fElite &6Ravager' + deathMessages: + - '$entity &cshowed $player &cwho''s in charge!' +elite_silverfish: + name: '&fLvl &2$level &fElite &7Silverfish' + deathMessages: + - '$player &cmistook $entity &cfor a stone block!' +elite_skeleton: + name: '&fLvl &2$level &fElite &fSkeleton' + deathMessages: + - '$player &cbecame $entity''s &cpin cushion!' + - '$entity &cwanted to see $player''s &cbones!' +elite_spider: + name: '&fLvl &2$level &fElite &7Spider' + deathMessages: + - '$player &cbecame entangled in $entity''s &cweb!' + - '$entity &chas devoured $player&c!' +elite_stray: + name: '&fLvl &2$level &fElite &bStray' + deathMessages: + - '$player &cwas led astray by $entity&c!' +elite_vex: + name: '&fLvl &2$level &fElite &bVex' + deathMessages: + - '$entity &chas vexed $player&c!' +elite_vindicator: + name: '&fLvl &2$level &fElite &8Vindicator' + deathMessages: + - '$entity &cvindicated his fighting skills over $player&c!' +elite_witch: + name: '&fLvl &2$level &fElite &5Witch' + deathMessages: + - '$player &cbecame $entity''s &ctest subject!' + - '$player &chas been bewitched by $entity&c!' +elite_wither_skeleton: + name: '&fLvl &2$level &fElite &8Wither Skeleton' + deathMessages: + - '$entity''s &carrows withered away $player&c!' + - '$entity''s &chas withered $player &caway!' +elite_zombie: + name: '&fLvl &2$level &fElite &2Zombie' + deathMessages: + - '$player &cwas devoured by $entity&c!' + - '$entity &cgot to $player''s &cbrains!' +elite_ghast: + name: '&fLvl &2$level &fElite &fGhast' + deathMessages: + - '$player &cdidn''t dodge $entity&c &cfireballs!' + - '$player &cwas blown to bits $entity&c!' + - '$entity &cgot $player''s &cbacon!' +elite_wolf: + name: '[$level] Elite Wolf' + deathMessages: + - '$entity tore $player apart!' + - '$player was torn to shreds by $entity!' +elite_ender_dragon: + name: '&fLvl &2$level &fElite &5Ender Dragon' + deathMessages: + - '$entity &chas ended $player!' +elite_shulker: + name: '&fLvl &2$level &fElite &5Shulker' + deathMessages: + - '$entity &cshowed $player &cnew heights!' +super_chicken: + name: '&2Super Chicken' +super_cow: + name: '&2Super Cow' +super_mushroom_cow: + name: '&2Super Mooshroom Cow' +super_pig: + name: '&dSuper Pig' +super_sheep: + name: Super Sheep +elite_killer_bunny: + name: '&fLvl &2$level &fElite &cKiller Rabbit' + deathMessages: + - '$entity &cmade $player &cgo live in a farm upstate!' + - '$entity &ceducated $player using a stick and not a carrot!' +elite_llama: + name: '&fLvl &2$level &fElite &5Llama' + deathMessages: + - '$player &cwas spit on by $entity&c!' + - '$player &cwas made $entity&c angry!' +elite_warden: + name: '&fLvl &2$level &fElite &3Warden' + deathMessages: + - '$entity &csensed $player &cwas nearby!' +elite_goat: + name: '&fLvl &2$level &fElite &5Goat' + deathMessages: + - '$player &cwas rammed by $entity&c!' + - '$player &cwas run over by $entity&c!' + - '$player &cwas trampled by $entity&c!' + - '$player &cgot $entity&c horns!' +elite_zombified_piglin: + name: '&fLvl &2$level &fElite &6Zombified Piglin' + deathMessages: + - '$player &cwas mobbed to death by $entity&c!' + - '$entity &cgot $player''s &cbacon!' +elite_zoglin: + name: '&fLvl &2$level &fElite &dZoglin' + deathMessages: + - '$player &cmessed with the $entity &cand got the horns!' + - '$entity &cgot $player''s &cbacon!' +elite_piglin: + name: '&fLvl &2$level &fElite &ePiglin' + deathMessages: + - '$entity &cwill fetch a good price for $player''s remains!' + - '$entity &ctaught $player &cthe value of gold!' +elite_hoglin: + name: '&fLvl &2$level &fElite &dHoglin' + deathMessages: + - '$player &cmessed with the $entity &cand got the horns!' + - '$entity &cgot $player''s &cbacon!' +elite_piglin_brute: + name: '&fLvl &2$level &fElite &cPiglin Brute' + deathMessages: + - '$entity &ctenderized $player!' + - '$entity &cbrutalized $player!' +elite_bee: + name: '&fLvl &2$level &fElite &eBee' + deathMessages: + - '$player &cwas stung by $entity!' +MobCombatSettings: + bossLocationMessage: '&7[EM] &2[Click to track!]' + bossKillParticipationMessage: '&eYour damage: &2$playerDamage' + defaultOtherWorldBossLocationMessage: '$name: In different world!' + weakText: '&9&lWeak!' + resistText: '&c&lResist!' + fullHealMessage: '&2FULL HEAL!' +check_tier: + message1: '&7[EM] Tingkatan bertarung anda adalah $tier' + message2: '&7[EM] Tingkatan guild bonus kamu adalah $tier' + message3: '&7[EM] &aTotal tingkatan ancaman adalah $tier' +check_tier_others: + message1: '&7[EM] Tingkatan bertarung $player adalah $tier' + message2: '&7[EM] Tingkatan guild bonus $player adalah $tier' + message3: '&7[EM] &aTotal tingkatan ancaman $player adalah $tier' +ScrapItemSettings: + scrapItemName: '&2Level $level Scrap' + scrapItemLore: + - '&aKumpulkan 25 scrap level yang sama' + - '&aorder to create an item upgrade orb!' + - '&aKamu juga dapan menggunakan scrap untuk memperbaiki barang' + - '&aitems and craft higher level scrap!' + - '&2Silahkan lakukan di Adventurer''s Guild Hub!' + upgradeItemName: '&2Level $level Upgrade Orb' + upgradeItemLore: + - '&aUse at at the Enhancer NPC to upgrade' + - '&aitems up to level $orbLevel!' +Quests: + questJoinMessage: '&aYou have accepted the quest $questName &a!' + questLeaveMessage: '&cYou have abandoned the quest $questName &c!' + questCompleteMessage: '&2You completed the quest $questName &2!' + leaveWhenNoActiveQuestsExist: '&cYou don''t currently have an active quest!' + questLeaveConfirmationMessage: '&cAre you sure you want to abandon your current quest? Do &a/em confirm &c to confirm your choice!' + questStartTitle: '&aQuest Accepted!' + questCompleteTitle: '&2Quest Completed!' + questLeaveTitle: '&cQuest Abandoned!' + killQuestChatProgressionMessage: '&8[EliteMobs]&c➤Kill $name:$color$current&0/$color$target' + fetchQuestChatProgressionMessage: '&8[EliteMobs]&c➤Get $name:$color$current&0/$color$target' + dialogQuestChatProgressionMessage: '&8[EliteMobs]&c➤Talk to $name:$color$current&0/$color$target' + questCapMessage: '&8[EliteMobs] &cYou have reached the maximum amount of active quests (10)! &4Abandon or complete at least one active quest if you want to get more quests!' + killQuestScoreboardProgressionMessage: '&c➤Kill $name:$color$current&0/$color$target' + fetchQuestScoreboardProgressionMessage: '&c➤Get $name:$color$current&0/$color$target' + dialogQuestScoreboardProgressionMessage: '&c➤Talk to $name:$color$current&0/$color$target' + chatTrackMessage: '&8[EliteMobs]&2 Click here to track your quest!' + chatTrackHover: '&2Click to track!' + chatTrackingMessage: '&8[EliteMobs]&9 You are now tracking a quest!' + chatTrackingHover: '&2Click to untrack/track! /em -> Quests to track a different quest!' + noQuestDestinationFound: '[EM] No quest destination found!' + questDestinationInOtherWorld: '[EM] Go to world $world!' + questAlreadyCompletedMessage: '&8[EliteMobs] &cYou already completed this quest!' + questPrerequisitesMissingMessage: '&8[EliteMobs] &cCan''t accept this quest yet!' + lowRankDynamicQuestWarning: '&8[EliteMobs] &cYou can''t take these quests with your current guild rank! Increase your guild rank to accept these quests.' + questTurnInObjective: '&a2Talk to $npcName' +Wormholes: + dungeonNotInstalledMessage: '&8[EliteMobs] &cDungeon $dungeonID &cis not installed! This teleport will not work.' + defaultPortalMissingMessage: '&8[EliteMobs] &cThis portal doesn''t seem to lead anywhere!' +Arenas: + notEnoughPlayersMessage: '&8[EliteMobs] &cYou need at least $amount to start the match!' + startingMessage: '&2Starting!' + startingSubtitle: '&2in $count...' + arenaFullMessage: '&4[EliteMobs] &cArena is full! You can spectate instead while you wait for it to finish!' + arenasOngoingMessage: '&4[EliteMobs] &cCan''t join the arena now - a match is currently happening! You can spectate instead while you wait for it to finish!' + arenaStartHintMessage: '&2[EliteMobs] &aYou can start the arena by doing &2/em start' + arenaQuitHintMessage: '&4[EliteMobs] &cYou can leave the arena by doing &4/em quit' + arenaJoinPlayerMessage: "&2[EliteMobs] &aYou can start the arena by doing &2/em\\ \\ start &aif there are at least &2$count &aplayers in it! \nYou can leave the\\ \\ arena by doing &c/em quit" + arenaJoinSpectatorMessage: '&2[EliteMobs] &aYou can leave the arena at any time using &2/em quit' + waveTitle: '&aWave &2$wave' + victoryTitle: '&2Victory!' + victorySubtitle: '&aCompleted &2$wave &awaves!' + defeatTitle: '&4Defeat!' + defeatSubtitle: '&cReached wave &4$wave&c!' + victoryBroadcast: Arena $arenaName was conquered by $players! + joinPlayerTitle: '&aStart with &2/em start &a!' + joinPlayerSubtitle: '&cLeave with &4/em quit &c!' + joinSpectatorTitle: '&aNow spectating!' + joinSpectatorSubtitle: '&cLeave with &4/em quit &c!' +ancient_corpse_drop_axe: + name: '&eButchers Cleaver' + lore: + - '&aRetrived from the' + - '&aAncient Corpse''s skull...' +animated_armor_drop_axe: + name: '&8Enchanted Axe' + lore: + - '&8This axe was almost the' + - '&8end of you.' +animated_armor_drop_boots: + name: '&8Enchanted Boots' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +animated_armor_drop_chestplate: + name: '&8Enchanted Chestplate' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +animated_armor_drop_helmet: + name: '&8Enchanted Helmet' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +animated_armor_drop_leggings: + name: '&8Enchanted Leggings' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +arachnid_matriarch_drop_boots: + name: '&bSilk Striders' + lore: + - '&bMade out of rare spider silk.' +baba_rhoga_drop_chest: + name: '&aWitches Robes' + lore: + - '&aThe smell should go' + - '&aaway eventually.' +baba_yaga_drop_helmet: + name: '&aWitches Hat' + lore: + - '&aThe smell should go' + - '&aaway eventually.' +balloon_rider_drop_leggings: + name: '&dRoomy Leggings' + lore: + - '&dVery comfortable and spacious leggings.' +banshee_drop_charm: + name: '&8Manifested Sorrow' + lore: + - '&8May this hardened sorrow protect' + - '&8you from grief.' +beast_tamer_drop_axe: + name: '&eGreat Axe' + lore: + - '&eHeavy enough to cleave any beast in two.' +berserker_charm: + name: '&bBerserker Charm' + lore: + - '&aLose yourself in the face of' + - '&aoverwhelming adversity in more' + - '&aways than one...' +bigfoot_drop_chestplate: + name: '&eFur Armor' + lore: + - '&eNice and warm.' +big_bad_wolf_drop_chestplate: + name: '&aBig Bad Wolf Fur' + lore: + - '&aScary!' +bloated_jeffrey_drop_tear: + name: '&bSweet Tear' + lore: + - '&bYou made Jeffrey cry...' +bone_fiend_drop_leggings: + name: '&aBoney Leggings' + lore: + - '&aThe sharp bones attached to these' + - '&aleggings sure do rattle a lot.' +challengers_boots: + name: '&cChallenger''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_chestplate: + name: '&cChallenger''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_helmet: + name: '&cChallenger''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_leggings: + name: '&cChallenger''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_sword: + name: '&cChallenger''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +chameleon_charm: + name: '&bChameleon Charm' + lore: + - '&aThe colorful Chameleon can' + - '&ablend in just about anywhere,' + - '&aslowly creeping around...' +changeling_drop_sword: + name: '&aCrystalline Sword' + lore: + - '&aThe blade shimmers as you gaze upon it.' +cheetah_charm: + name: '&bCheetah Charm' + lore: + - '&aCheetahs can reach speeds of' + - '&a120 km/h... for about 60' + - '&aseconds. Make them count!' +circus_ringmaster_drop_charm: + name: '&dRingmasters Whip' + lore: + - '&dThis was used for terrible punishment.' +craftenmine_terror_drop_trident: + name: '&cGhast Lobotomizer' + lore: + - '&cPerfect for making sure that' + - '&cthe Ghasts stay grounded.' +creeperpede_drop_chestplate: + name: '&dExplosion Proof Vest' + lore: + - '&dMake ''BOOM!'' feel' + - '&dmore like ''boom''.' +crone_drop_axe: + name: '&fWitch Feller' + lore: + - '&fA fine axe that demands a fine hunt.' +depths_seeker: + name: '&2Depths seeker' + lore: + - '&9Come from depths immeasurable' + - '&9and looted from monster most vile,' + - '&9there is no telling what horrors' + - '&9this fishing rod has seen.' +divine_cinder_drop_charm: + name: '&6Divine Fire' + lore: + - '&6Blessed be the fire!' +dwarven_greed: + name: '&4Dwarven Greed' + lore: + - '&cThose who delve too greedily' + - '&cand too deep may wake ancient' + - '&chorrors of shadow and flame' + - '&cbest left undisturbed.' +elephant_charm: + name: '&bElephant Charm' + lore: + - '&aGain the power of an elephant' + - '&astampede, for the cost of the' + - '&aspeed of an elephant stampede!' +enders_drop_chestplate: + name: '&dEnder Shirt' + lore: + - '&dProtective and comfy!' +enders_drop_helmet: + name: '&dEnder Cap' + lore: + - '&dComfy but also quite sturdy.' +enders_drop_leggings: + name: '&dEnder Pants' + lore: + - '&dA bit too long but it will do.' +ender_lapin_drop_boots: + name: '&cDark Star Boots' + lore: + - '&cGives you the courage' + - '&cof running when in danger.' +endless_pursuer_drop_sword: + name: '&7Dark Blood Sword' + lore: + - '&7The sword seems to' + - '&7be weeping blood...' +enraged_snowman_drop_sword: + name: '&9Snowman''s Nose' + lore: + - '&9No wonder that the Snowman''s' + - '&9nose was so pointy...' +xmas_and_gold: + name: '&6and gold!' + lore: + - '&7Everyone wishes for silver' + - '&7and gold!' +xmas_and_goooooold: + name: '&6and goooooold!' + lore: + - '&7Everyone wishes for silver' + - '&7and gold!' +xmas_cornelius_pick: + name: '&bCornelius'' Pick' + lore: + - '&3If you throw it in the air' + - '&3and let it hit the ground,' + - '&3you may just find some' + - '&3peppermint!' +xmas_lost_present: + name: '&2Lost Present' + lore: + - '&2Turn this in for a reward!' +xmas_peppermint: + name: '&cPeppermint' + lore: + - '&fWhat I''ve been searching for all my life!' +xmas_siiiiilver: + name: '&7Siiiiilver' + lore: + - '&6Everyone wishes for silver' + - '&6and gold!' +xmas_silver: + name: '&7Silver' + lore: + - '&6Everyone wishes for silver' + - '&6and gold!' +xmas_substitute_elf_practice: + name: '&8Substitue Elf Practice' + lore: + - '&fThis doll needs its teeth fixed' +xmas_treat: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +xmas_treat_v2: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +evil_undead_drop_sword: + name: '&eTransient Blade' + lore: + - '&eIt will only serve' + - '&eyou for song long.' +fallen_knight_drop_boots: + name: '&e7Ancient Boots' + lore: + - '&7Even though the boots are old they' + - '&7still provide plenty of protection.' +fallen_knight_drop_chestplate: + name: '&e7Ancient Nether-Plate' + lore: + - '&7This armor might look plain to' + - '&7the untrained eye but is clear' + - '%7that anything wishing to penetrate' + - '&7it''s thick plate will need to be' + - '&7swung with considerable force.' +fallen_knight_drop_helmet: + name: '&e7Ancient Headgear' + lore: + - '&7Many swords have left their mark' + - '&7aon this helm but none have' + - '&7managed to break its defense.' +fallen_knight_drop_leggings: + name: '&e7Ancient Leggings' + lore: + - '&7You feel sorry for anyone that tries' + - '&7to strike these leggings.' +fine_swine_drop_sword: + name: '&6Fine Golden Sword' + lore: + - '&6A fine master-crafted golden sword.' + - '&6The molten gold flowing inside' + - '&6the sword makes sure that any damage' + - '&6to the blade is repaired swiftly.' +firefly_charm: + name: '&bFirefly Charm' + lore: + - '&aLight up the night!' +firestarter_drop_helmet: + name: '&eFire Stopper' + lore: + - '&eOnly half the heat!' +fire_conjurer_drop_shield: + name: '&eFlame Touched Shield' + lore: + - '&eProtects against fire and flame.' +fishy_charm: + name: '&bFishy Charm' + lore: + - '&aThere''s just something not' + - '&aquite right with this one...' +fox_king_cold_drop_charm: + name: '&9Magical Snow' + lore: + - '&9You sense impossible energies' + - '&9coming from this snow.' +fulgora_drop_boots: + name: '&bMountain Boots' + lore: + - '&bShould be useful when' + - '&bexploring the mountains.' +goblin_ballista: + name: '&8Goblin Ballista' + lore: + - '&8A treasure among goblins!' +goblin_boots: + name: '&8Goblin Boots' + lore: + - '&8A treasure among goblins!' +goblin_chestplate: + name: '&8Goblin Chestplate' + lore: + - '&8A treasure among goblins!' +goblin_cleaver: + name: '&8Goblin Cleaver' + lore: + - '&8A treasure among goblins!' +goblin_helmet: + name: '&8Goblin Helmet' + lore: + - '&8A treasure among goblins!' +goblin_invasion_drop_chestplate: + name: '&aSmall Chestplate' + lore: + - '&aReally tight...' +goblin_invasion_drop_leggings: + name: '&aSmall Leggings' + lore: + - '&aWell, at least it really' + - '&ashows off your legs.' +goblin_leggings: + name: '&8Goblin Leggings' + lore: + - '&8A treasure among goblins!' +goblin_poker: + name: '&8Goblin Poker' + lore: + - '&8A treasure among goblins!' +goblin_shooter: + name: '&8Goblin Shooter' + lore: + - '&8A treasure among goblins!' +goblin_slasher: + name: '&8Goblin Slasher' + lore: + - '&8A treasure among goblins!' +grappling_arrow: + name: '&6Grappling Arrow' + lore: + - '&eFire at a TARGET BLOCK to grapple!' +greedy_dwarf_drop_pickaxe: + name: '&9Dwarven Need' + lore: + - '&cThose who delve too greedily' + - '&cand too deep may wake ancient' + - '&chorrors of shadow and flame' + - '&cbest left undisturbed.' +grunter_drop_axe: + name: '&cBig Oink' + lore: + - '&cThe axe has a tendency' + - '&cto squeal when swung.' +grunts_boots: + name: '&fGrunt''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_chestplate: + name: '&fGrunt''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_helmet: + name: '&fGrunt''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_leggings: + name: '&fGrunt''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_sword: + name: '&fGrunt''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +harmless_chicken_drop_boots: + name: '&aUseless Boots' + lore: + - '&aAt least they''re explosion proof...' +hog_rider_drop_boots: + name: '&a3.6 Radioactive Boots' + lore: + - '&aNot great, not terrible.' +horde_champion_drop_sword: + name: '&dHorde Eviscerator' + lore: + - '&dWhen you need to take' + - '&dcare of an undead horde.' +horrid_duplicator_drop_arrow: + name: '&aDuped Arrow' + lore: + - '&2Looks and feels' + - '&2like the real thing...' +horrid_duplicator_drop_bow: + name: '&4Fiery Bone Bow' + lore: + - '&4This bow is made out of' + - '&4a single large bone.' +invasion_alien_treat: + name: '&6Alien treats' + lore: + - '&6The taste is out of this planet!' +invasion_cheap_plasma_boots: + name: '&2Cheap Plasma Boots' + lore: + - '&aBlast off!' + - '&cNote: &8Double shift to activate!' +invasion_low_grade_tinfoil_bolt_caster: + name: '&7Low Grade Bolt Caster' + lore: + - '&7Get off my property!' +invasion_low_grade_tinfoil_boots: + name: '&7Low Grade Tinfoil Shoes' + lore: + - '&7Avoids floor radiation!' +invasion_low_grade_tinfoil_chestplate: + name: '&7Low Grade Tinfoil Chestpiece' + lore: + - '&7Prevents 6G from spying on your pacemaker!' +invasion_low_grade_tinfoil_hat: + name: '&7Low Grade Tinfoil Hat' + lore: + - '&7I want to believe!' +invasion_low_grade_tinfoil_leggings: + name: '&7Low Grade Tinfoil Pants' + lore: + - '&7Made for running from aliens!' +invasion_polished_plasma_boots: + name: '&2Polished Plasma Boots' + lore: + - '&aBlast off!' + - '&cNote: &8Double shift to activate!' +invasion_quality_bolt_caster: + name: '&7Quality Bolt Caster' + lore: + - '&7Get off my property!' +invasion_quality_tinfoil_boots: + name: '&7Low Grade Tinfoil Shoes' + lore: + - '&7Avoids floor radiation!' +invasion_quality_tinfoil_chestplate: + name: '&7Quality Tinfoil Chestpiece' + lore: + - '&7Prevents 6G from spying on your pacemaker!' +invasion_quality_tinfoil_hat: + name: '&7Quality Tinfoil Hat' + lore: + - '&7Stay out of my head!' +invasion_quality_tinfoil_leggings: + name: '&7Quality Tinfoil Pants' + lore: + - '&7Made for running from aliens!' +invictus_boots: + name: '&4Invictus Boots' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_chestplate: + name: '&4Invictus Chestplate' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_helmet: + name: '&4Invictus Helmet' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_leggings: + name: '&4Invictus Leggings' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_pickaxe: + name: '&4Invictus Pickaxe' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_shovel: + name: '&4Invictus Shovel' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_sword: + name: '&4Invictus Sword' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +krampus_drop_boots: + name: '&1Snow Boots' + lore: + - '&1Made out of actual snow.' +large_hopper_drop_axe: + name: '&aHeavy Axe' + lore: + - '&aPerfect for chopping off heads.' +living_shadow_drop_boots: + name: '&5Shadow Boots' + lore: + - '&5Falling doesn''t hurt as much.' +lucky_charms: + name: '&bLucky Charms' + lore: + - '&aPart of a complete breakfast!' + - '&cNote: Absolutely not a part of' + - '&ca complete breakfast.' +magmaguys_toothpick: + name: '&4Magmaguy&c''s &2Toothpick' + lore: + - '&aIn nearly mint condition!' +merman_drop_trident: + name: '&1Merman Trident' + lore: + - '&1A Merman''s favorite weapon.' +meteor_shower_scroll: + name: '&7Meteor Shower Scroll' + lore: + - '&4Call forth destruction.' + - '&4Single-use.' +monster_of_the_deep_drop_trident: + name: '&3Bone Trident' + lore: + - '&3Made out of the bones' + - '&3of the Monster of the Deep.' +moon_spider_drop_sword: + name: '&fSilk Spun Sword' + lore: + - '&fRazor sharp silk surrounds' + - '&fthe iron core of this blade.' + - '&fThe blade will serve you,' + - '&ffor now...' +necromancer_drop_helmet: + name: '&cDark Omen Helm' + lore: + - '&cThere is something off' + - '&cabout this helmet.' +netherite_golem_drop_helmet: + name: '&8Ancient Helmet' + lore: + - '&8You''re not sure if you' + - '&8should put this on your' + - '&8head or send it to a museum.' +nether_escapee_drop_charm: + name: '&6Fire Amulet' + lore: + - '&6May the flames not harm you.' +nether_hag_drop_sword: + name: '&7Bewitched Sword' + lore: + - '&7All kinds of curses and' + - '&7enchantments flow through' + - '&7this sword.' +nightwing_drop_crossbow: + name: '&aSky Watcher' + lore: + - '&aKeeping the skies safe.' +night_crawler_drop_shield: + name: '&8Night Shield' + lore: + - '&8Almost unbreakable.' +night_crawler_drop_sword: + name: '&8Night Blade' + lore: + - '&e8The only answer to the' + - '&8threats of the night.' +novices_boots: + name: '&8Novice''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_chestplate: + name: '&8Novice''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_helmet: + name: '&8Novice''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_leggings: + name: '&8Novice''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_sword: + name: '&8Novice''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +oasis_beacons_brigandine: + name: '&8Beacon''s Brigandine' + lore: + - '&fSolid steel can repel' + - '&fmost attacks.' +oasis_chief_cultists_bow: + name: '&5Chief Cultist''s Bow' + lore: + - '&dThe necrotic war bow' + - '&dof the cultist chief.' +oasis_earthquake_boots_10: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_20: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_30: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_40: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_50: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_10: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_20: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_30: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_40: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_50: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_10: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_20: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_30: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_40: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_50: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_10: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_20: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_30: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_40: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_50: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_foundrys_flaming_hammer: + name: '&6Foundry''s Flaming Hammer' + lore: + - '&eThe Hammer of the foundry!' +oasis_foundrys_flux: + name: '&6Foundry''s Flux' + lore: + - '&eThe flux that''s infused in' + - '&eevery forged weapon!' +oasis_mask_of_the_warlock: + name: '&4Mask of the Warlock' + lore: + - '&7The stone is in his mask!' + - '&7The UV light will help him!' +oasis_monumental_lance: + name: '&3Monumental Lance' + lore: + - '&bSpearfishing is my hobby.' +oasis_oracles_shroud: + name: '&3Oracle''s Shroud' + lore: + - '&1Illusion is your weapon!' +oasis_page_of_darkness_I: + name: '&0Page of Darkness I' + lore: + - '&829 paces North' + - '&811 paces West' + - '&816 paces North' + - '&86 paces East' +oasis_page_of_darkness_II: + name: '&0Page of Darkness II' + lore: + - '&87 paces South' + - '&86 paces East' + - '&833 paces North' + - '&812 paces West' +oasis_page_of_darkness_III: + name: '&0Page of Darkness III' + lore: + - '&86 paces North' + - '&83 paces West' + - '&830 paces North' + - '&89 paces East' +oasis_page_of_darkness_index: + name: '&0Page of Darkness Index' + lore: + - '&8Tread carefully in darkness' + - '&8they know youve come.' + - '&8Be weary on the path ahead' + - '&8for balls of fire drum.' +oasis_page_of_darkness_IV: + name: '&0Page of Darkness IV' + lore: + - '&824 paces South' + - '&89 paces East' + - '&836 paces North' + - '&83 paces West' +oasis_page_of_darkness_V: + name: '&0Page of Darkness V' + lore: + - '&89 paces North' + - '&812 paces East' + - '&86 paces South' + - '&86 paces East' +oasis_page_of_darkness_VI: + name: '&0Page of Darkness VI' + lore: + - '&86 paces South' + - '&86 paces East' + - '&812 paces North' + - '&83 paces East' +oasis_page_of_darkness_VII: + name: '&0Page of Darkness VII' + lore: + - '&83 paces North' + - '&86 paces East' + - '&88 paces South' +oasis_page_of_darkness_VIII: + name: '&0Page of Darkness VIII' + lore: + - '&8Out of the shadow comes a light' + - '&8whose robes are dull gray, marred by fight.' + - '&8Of ice and snow, of fire and heat.' + - '&8Axes deflect, but swords defeat.' +oasis_page_of_libraris_I: + name: '&7Page of Libraris I' + lore: + - '&fUnder the bookshelf' + - '&fthat has no reflection' + - '&fwill appear unto you' + - '&fpassage and direction.' +oasis_page_of_libraris_II: + name: '&7Page of Libraris II' + lore: + - '&fThe bookshelf''s reflection' + - '&fholds more knowledge' + - '&f4 shelves more full of books' + - '&fthan its upward image!' +oasis_page_of_libraris_III: + name: '&7Page of Libraris III' + lore: + - '&fBearing slightly west' + - '&fof the bookshelf that holds the best.' + - '&fThe most knowledge does it keep.' + - '&fA favorite for those who reap.' +oasis_page_of_libraris_index: + name: '&7Page of Libraris Index' + lore: + - '&f5 papers to find,' + - '&f3 switches to flip,' + - '&fa door to be opened' + - '&fand in it shall ye slip.' +oasis_page_of_libraris_IV: + name: '&7Page of Libraris IV' + lore: + - '&fThe oracle of knowledge' + - '&fyeilds shocking surprise' + - '&ffrom depths of despair' + - '&fshall lightning bolts arise.' +oasis_page_of_libraris_V: + name: '&7Page of Libraris V' + lore: + - '&fHis last secret' + - '&fhe will try to hide' + - '&fthough use of shadow and puppets' + - '&fto strike you as you stride.' +oasis_page_of_plundering_I: + name: '&6Page of Plundering I' + lore: + - '&eHouses throughout the town' + - '&ehide their secrets up rather than down.' + - '&eGrapple or flight' + - '&ecan aid your plight.' +oasis_page_of_sentris: + name: '&1Page of Sentris' + lore: + - '&bA sentry''s armor is too tough' + - '&bwielding a sword, your fight will be rough.' +oasis_page_of_the_pharaoh_I: + name: '&0Page of the Pharaoh I' + lore: + - '&6A sacrifice on the altar' + - '&6must be made to pursue.' + - '&6But what shall ye offer?' + - '&red sandstone holds this clue.' +oasis_page_of_the_pharaoh_II: + name: '&0Page of the Pharaoh II' + lore: + - '&6The pharaohs halls are lined' + - '&6in the finest gold around.' + - '&6It shall be his undoing' + - '&6for from gold your damage shall abound.' +oasis_page_of_the_pharaoh_III: + name: '&0Page of the Pharaoh III' + lore: + - '&6The pharaohs walls are filled' + - '&6with perils and precious treasures.' + - '&6From the southwest corner of the room with blue windows' + - '&6streams very ominous pressures.' +oasis_page_of_the_pharaoh_index: + name: '&0Page of the Pharaoh Index' + lore: + - '&6The pharaoh is sealed' + - '&6within his tomb.' + - '&6He lies in wait, undisturbed;' + - '&6his traps will be your doom.' + - '&63 pages will help your adventure' + - '&6from being curbed.' +oasis_page_of_the_sewer_I: + name: '&0Page of the Sewer I' + lore: + - '&3There is a louse of unusual size.' + - '&3Its on the prowl, behold its prize.' + - '&3Plenty of treasure to be found' + - '&3all you have to do is swim around.' +oasis_page_of_the_sewer_II: + name: '&0Page of the Sewer II' + lore: + - '&3Activating the gates one by one' + - '&3will allow the water to flow.' + - '&3Swim up once it pours out' + - '&3then down the right tunnel you must go.' +oasis_page_of_the_sewer_index: + name: '&0Page of the Sewer Index' + lore: + - '&3Evil lurks where waters drain' + - '&3Be ever watchful, they''ll eat your brain!' + - '&3You must open 3 gates guarded by creatures' + - '&3lined with red sandstone features.' + - '&32 pages will guide you, do not strain.' +oasis_page_of_vampiris_I: + name: '&4Page of Vampiris I' + lore: + - '&cDozens of weapons have struck the beast' + - '&cand every blow it''s withstood.' + - '&cIt fears not the bite of stone, gold or diamonds in the least' + - '&cbut it trembles before wood.' +oasis_page_of_vampiris_II: + name: '&4Page of Vampiris II' + lore: + - '&cIf the warlock you seek to slight,' + - '&cbe prepared for a tough fight!' + - '&cThe second floor shall test your might,' + - '&cconquering it first is a rite.' +oasis_page_of_vampiris_III: + name: '&4Page of Vampiris III' + lore: + - '&cDown the spire and into the cave' + - '&cis the path of the brave.' + - '&cBeware of those returned from the grave,' + - '&cslay master for what you crave.' +oasis_page_of_vampiris_index: + name: '&4Page of Vampiris Index' + lore: + - '&cWithin the observatory' + - '&cthere lurks a creature' + - '&cwho has never seen the sun.' + - '&cFind 4 pages to help you' + - '&cescape alive!' +oasis_page_of_vampiris_IV: + name: '&4Page of Vampiris IV' + lore: + - '&cTwo chests of loot,' + - '&cDon''t wake the dead!' + - '&cOne under the stair,' + - '&cthe other where books can be read!' +oasis_pharaohs_feast: + name: '&6Pharaohs Feast' + lore: + - '&eA golden reminder' + - '&eof the once golden city' + - '&ecorrupted by the sands of time.' +oasis_pharaohs_flail: + name: '&0Pharaoh''s Flail' + lore: + - '&4The flail of the afterlife.' +oasis_pick_of_darkness: + name: '&1Pick of Darkness' + lore: + - '&bShining bright through' + - '&bthe shadows.' +oasis_sunkiller: + name: '&6Sunkiller' + lore: + - '&eIsnt that rock over there' + - '&ejust big enough for someone' + - '&eto hide behind?' +oasis_tohth: + name: '&8Oingo Boingo Brothers Adventure' + lore: + - '&fMy preminitions are absolute!' + - '&fIt is fate!' +okami_drop_leggings: + name: '&cOkami''s Blessing' + lore: + - '&cSpeed of the wolf.' + - '&cFire protection of a god.' +owl_charm: + name: '&bOwl Charm' + lore: + - '&aBecome the ultimate nocturnal' + - '&apredator!' +primis_artifexs_shield: + name: '&6Artifex''s Shield' + lore: + - '&eAn old relic from a more' + - '&edangerous time. It has been' + - '&erestored to its glory!' +primis_caeruleaums_hope: + name: '&9Caeruleaum''s Hope' + lore: + - '&8A relic of a bygone era, still sharp' + - '&8enough to hurt but rusty enough to' + - '&8belong in a museum!' +primis_catacomb_drop_boots: + name: '&7Dark Bone Footgear' + lore: + - '&7Unnaturally dark bones' + - '&7cover these boots.' +primis_catacomb_drop_boots_2: + name: '&7Dark Bone Footgear' + lore: + - '&7Unnaturally dark bones' + - '&7cover these boots.' +primis_catacomb_drop_chestplate: + name: '&7Dark Bone Armor' + lore: + - '&7Bones as dark as the abyss' + - '&7adorn this armor.' + - '&7The arrows will make quite a' + - '&7noise as they bounce off the bones.' +primis_catacomb_drop_chestplate_2: + name: '&7Dark Bone Armor' + lore: + - '&7Bones as dark as the abyss' + - '&7adorn this armor.' + - '&7The arrows will make quite a' + - '&7noise as they bounce off the bones.' +primis_catacomb_drop_leggings: + name: '&7Dark Bone Leggings' + lore: + - '&7The dark bones covering the' + - '&7leggings will make dangerous' + - '&7falls more survivable.' +primis_catacomb_drop_leggings_2: + name: '&7Dark Bone Leggings' + lore: + - '&7The dark bones covering the' + - '&7leggings will make dangerous' + - '&7falls more survivable.' +primis_catacomb_necromancer_drop_helmet: + name: '&5Dark Bone Cowl' + lore: + - '&5The cowl offers little protection,' + - '&5it only seeks blood and death.' +primis_catacomb_necromancer_drop_helmet_2: + name: '&5Dark Bone Cowl' + lore: + - '&5The cowl offers little protection,' + - '&5it only seeks blood and death.' +primis_catacomb_necromancer_drop_sword: + name: '&5Dark Bone Brand' + lore: + - '&5The unnaturally dark bone-brand' + - '&5glistens in the light' + - '&5ready to part anything' + - '&5that stands in it''s way.' +primis_catacomb_necromancer_drop_sword_2: + name: '&5Dark Bone Brand' + lore: + - '&5The dark bone-brand howls' + - '&5viciously with every swing' + - '&5as the air rushes through' + - '&5it''s hollow cavity.' +primis_cooked_rabbit: + name: '&cCooked Rabbit' + lore: + - Huh, did this rabbit overheat? +primis_diving_helmet: + name: '&1Diving Helmet' + lore: + - An old Diving Helmet. + - Still works just fine. +primis_fish_bait: + name: '&2Fish Bait' + lore: + - '&aLooks like you could reel big fish with these.' +primis_gladius_important_documents: + name: '&2Important Documents' + lore: + - '&aThe documents are sealed.' +primis_gladius_lord_promise: + name: '&5Assistance Agreement' + lore: + - '... hence, for the help lended during these most trying' + - times, Pontis Mille promises to return in kind at Gladius' + - darkest hour. +primis_gladius_supplies: + name: '&2Supplies' + lore: + - '&aFit to keep a soldier fed during a war.' +primis_gladius_sword: + name: '&5Gladius' + lore: + - '&8The very symbol of the Gladius Fortress.' +primis_gladius_the_good_stuff: + name: '&2The Good Stuff' + lore: + - '&aSmells... strong.' +primis_heirloom: + name: '&2Lost Heirloom' + lore: + - '&aSeems old, ancient even.' +primis_ice_village_alanus_dagger: + name: '&eAlanus'' Dagger' + lore: + - '&eA simple dagger with' + - '&erunes covering the handle.' +primis_ice_village_chains_shipment: + name: '&aShipment of Chains' + lore: + - '&aA lot of chains.' +primis_ice_village_escaped_prisoner_body: + name: '&cUnconcious Body' + lore: + - '&cHeavy.' +primis_ice_village_foot_of_mountain_chest_axe: + name: '&1Dull Frost Axe' + lore: + - '&1Freezing to the touch' +primis_ice_village_island_chest_trident: + name: '&3Magma''s Delight' + lore: + - '&3Those who look, shall find.' +primis_ice_village_living_nightmares_reward_chest: + name: '&3Fur Coat' + lore: + - '&3Made out of the' + - '&3toughest fur around.' +primis_ice_village_magical_ice_crystals: + name: '&1Fur Ice Crystal' + lore: + - Having the crystal near + - snow makes it react. +primis_ice_village_make_them_go_ouch_reward_leggings: + name: '&dViolet''s Spare Leggings' + lore: + - '&dMakes you wanna strut down the' + - '&droad and do some punishment.' +primis_ice_village_salmon: + name: '&2Fresh Salmon' + lore: + - You don't think you saw + - larger salmon in your life. +primis_ice_village_silence_reward_helmet: + name: '&aBoomers Helm' + lore: + - '&aShould handle an explosion or two.' +primis_ice_village_taking_the_bait_reward: + name: '&bNorthern Rod' + lore: + - '&bIt''s a well made fishing rod.' +primis_ice_village_violet_boots: + name: '&dViolet''s Leather Boots' + lore: + - '&dFancy leather boots with' + - '&da raised pointy heel.' +primis_ice_village_violet_leggings: + name: '&dViolet''s Fancy Leggings' + lore: + - '&dTight and slightly see-through' + - '&dwith beautiful flower motives.' +primis_ice_village_violet_whip: + name: '&dViolet''s Whip' + lore: + - '&dDelivers exquisite punishment.' +primis_ice_village_wanna_build_a_snowman_reward_boots: + name: '&3Frost Boots' + lore: + - '&3It''s just frost boots.' +primis_invaders_assassins_bow: + name: '&8Assassin''s Bow' + lore: + - '&aThe perfect way to give them' + - '&aa taste of their own medicine.' +primis_invaders_boots: + name: '&4Invader''s boots' + lore: + - '&aThese don''t smell so good.' +primis_invaders_bow: + name: '&8Invader''s Bow' + lore: + - '&aOnce blotted out the Sun.' +primis_invaders_captains_sword: + name: '&4Invader''s Captain Sword' + lore: + - '&aCurved and mean-looking.' +primis_invaders_chestplate: + name: '&4Invader''s chestplate' + lore: + - '&aRusty, ugly and smelly. Lovely!' +primis_invaders_helmet: + name: '&4Invader''s helmet' + lore: + - '&aBeats a concussion!' +primis_invaders_leggings: + name: '&4Invader''s leggings' + lore: + - '&aCould use some oil.' +primis_invaders_sword: + name: '&4Invader''s sword' + lore: + - '&aSuspiciously bloodstained.' +primis_lucky_pickaxe: + name: '&6Lucky Lickaxe' + lore: + - '&eShines bright, even underground.' + - '&eYou see LL engraved in the handle' +primis_monster_slaying_spear: + name: '&8Monster Slaying Spear' + lore: + - Turns Sea Monsters into barbecue. +primis_ogre_boots: + name: '&cOgre''s boots' + lore: + - '&7They''ll keep you nice' + - '&7and toasty.' +primis_ogre_chestplate: + name: '&cOgre''s chestplate' + lore: + - '&7Hot to the touch' +primis_ogre_helmet: + name: '&cOgre''s helmet' + lore: + - '&7You''ll be sweating bullets.' +primis_ogre_leggings: + name: '&cOgre''s leggings' + lore: + - '&7Smoldering slacks.' +primis_ogre_mines_lucky_pickaxe: + name: '&eLucky Pickaxe' + lore: + - '&aLucky, but useless.' +primis_ogre_mines_waterworks_chest_shield: + name: '&aSturdy Door' + lore: + - '&aIt''s just a door.' +primis_old_shield: + name: '&8Old Shield' + lore: + - '&7An old relic from a more' + - '&7dangerous time. It might be' + - '&7able to be mended, though...' +primis_pirate_boots: + name: '&4Pirate''s boots' + lore: + - '&aThese have a few too many' + - '&aholes to be useful.' +primis_pirate_bow: + name: '&8Pirate''s Bow' + lore: + - '&aNot quite a flintlock,' + - '&abut it will do!' +primis_pirate_chestplate: + name: '&4Pirate''s Chestplate' + lore: + - '&aBasically a t-shirt.' +primis_pirate_helmet: + name: '&4Pirate''s Helmet' + lore: + - '&aMissing an eye-patch.' +primis_pirate_leggings: + name: '&4Pirate''s leggings' + lore: + - '&aFeels like sea legs!' +primis_pirate_sword: + name: '&4Pirate''s sword' + lore: + - '&aCurved and mean-looking.' +primis_pointis_groves_heirloom: + name: '&2Valuable Heirloom' + lore: + - '&aThis is the second one of these that you retrieved.' +primis_pointis_mille_chest_dirty_note: + name: Dirty Note + lore: + - '&fThere was a really cool sword' + - '&fin here but it''s gone now.' +primis_pontis_beast_horn: + name: '&2Blood Drenched Horn' + lore: + - '&fOn closer inspection the horn isn''t' + - '&fcovered in blood but seems to' + - '&fbe made out of it.' + - '&fThe crystallized blood is incredibly sharp.' +primis_pontis_beast_scale: + name: '&2Toxic Fish Scale' + lore: + - '&fThe scale is rock hard on the outside.' + - '&fThe inside is covered in' + - '&ftoxic and acidic ooze.' +primis_pontis_beast_silk: + name: '&2Sun Soaked Silk' + lore: + - '&fThe silk is radiating light and warmth.' +primis_pontis_elf_drop_boots: + name: '&7Elf Boots' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_elf_drop_chestplate: + name: '&7Elf Chest-plate' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_elf_drop_crossbow: + name: '&7Elf Dark-bow' + lore: + - '&7The special projectiles that the bow' + - '&7uses are both sharp and blunt.' +primis_pontis_elf_drop_helmet: + name: '&7Elf Helmet' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_elf_drop_leggings: + name: '&7Elf Leggings' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_fields_berry_charm: + name: '&dLarge Berry' + lore: + - '&dThe fresh odor this berry emits' + - '&dcan be smelled from miles away.' + - '&dThe odor seems to have a calming' + - '&deffect on monsters and beasts.' + - '&dIt makes their attacks less vicious.' +primis_pontis_groves_brood_moher_drop_charm: + name: '&aCrawlers Torment' + lore: + - '&aThe silk radiates strong energy.' +primis_pontis_groves_nest_crawler_drop_shield: + name: '&7Magma''s Lure' + lore: + - '&7When the shield is held up' + - '&7it lures monsters into striking it.' +primis_pontis_groves_spider_boots_reward: + name: '&1Spider-legs Boots' + lore: + - '&1Boots made from spider legs and leather.' +primis_pontis_groves_tree_climbing_elf_bandits_reward_leggings: + name: '&aElf Pearl Leggings' + lore: + - '&aProtective leggings' + - '&aadorned with pearls.' +primis_pontis_mille_arena_knowledge: + name: '&2Knowledge' + lore: + - '&aImportant Knowledge.' +primis_pontis_mille_arena_reward_1: + name: '&4Star Touched Shield' + lore: + - '&7An ornate shield with a cosmos motive.' +primis_pontis_mille_arena_reward_2: + name: '&4Star Touched Chestplate' + lore: + - '&7A thousand tiny spiky stars stretch across the Chestplate.' +primis_pontis_mille_arena_reward_3: + name: '&4Star Touched Leggings' + lore: + - '&7The leggings sparkle like the stars in the sky.' +primis_pontis_mille_cat_quest_reward_charm: + name: '&9Cat''s Blessing' + lore: + - '&9If you hold it up all the' + - '&9way to your ear you can' + - '&9hear a slight purr.' +primis_pontis_mille_counselor_sword: + name: '&eStone of Far-speech' + lore: + - '&aYou can sense a presence coming from the stone.' +primis_pontis_mille_fields_beasts_reward_chest: + name: '&eHunters Pride' + lore: + - '&eThose who hunt cannot be the prey.' +primis_pontis_mille_fields_contest_berry: + name: '&dContest Berry' + lore: + - '&dA beautiful and very large berry.' + - '&dTruly a one in a million specimen.' +primis_pontis_mille_fields_do_it_yourself_reward_bow: + name: '&cHunters Bow' + lore: + - '&cA finely crafted bow.' + - '&cArrows fired from this' + - '&cbow will hurt any beast.' +primis_pontis_mille_fields_first_aid: + name: '&2First Aid Equipment' + lore: + - '&fEverything one would need" - "&fto treat serious injuries.' +primis_pontis_mille_fields_rat_drop_helmet: + name: '&fFeathered Rat Cap' + lore: + - '&fYou managed to make a' + - '&fcap out of your prey.' + - '&fHaving extracted the preys' + - '&fblinding properties, you have made' + - '&fit work in your favor.' +primis_pontis_mille_fields_rat_meat: + name: '&cRat Meat' + lore: + - Raw rat meat. No need to cook. +primis_pontis_mille_fields_stolen_berries: + name: '&4Stolen Berries' + lore: + - '&fIt''s the stolen berries' +primis_pontis_mille_fish_nets: + name: '&2Fish Nets' + lore: + - '&aCatching fish made easy!' +primis_pontis_mille_fresh_rat: + name: '&fFresh Rat' + lore: + - The cat will love this. +primis_pontis_mille_mines_goblined_up_in_the_maze_reward_axe: + name: '&aRuned Goblin Axe' + lore: + - '&aThere are runes etched into the axe handle.' + - '&aThey are quite faded by now.' + - '&aSeems like this axe was cursed at one point...' +primis_pontis_mille_mines_goblin_head: + name: '&2Fowl Goblin Feathers' + lore: + - '&aSo soft and prickly.' +primis_pontis_mille_parkour_reward_boots: + name: '&4Diamond Tree Boots' + lore: + - '&7Boots made out of special soft bark.' + - '&7Decorated with gems.' +primis_pontis_mille_reward_boots: + name: '&4Pontis Mille Boots' + lore: + - '&7Traditional Pontis Mille Boots' +primis_pontis_mille_reward_chest: + name: '&4Pontis Mille Chestplate' + lore: + - '&7A traditional Pontis Mille Chestplate' +primis_pontis_mille_reward_helmet: + name: '&4Pontis Mille Helm' + lore: + - '&7A traditional Pontis Mille Helm' +primis_pontis_mille_reward_leggings: + name: '&4Pontis Mille Leggings' + lore: + - '&7Traditional Pontis Mille Leggings' +primis_pontis_mille_reward_shield: + name: '&4Pontis Mille Shield' + lore: + - '&7A traditional Pontis Mille Shield' +primis_pontis_mille_reward_sword: + name: '&4Pontis Mille Katana' + lore: + - '&7Incredibly sharp' +primis_pontis_mille_serious_sewage_reward_helmet: + name: '&2Turtle Shell Helm' + lore: + - '&2Makes you wanna eat some pizza.' +primis_pontis_mille_sewage_keys: + name: '&2Sewage Keys' + lore: + - '&aA key ring with a lot of keys on it.' +primis_pontis_mille_sewers_ninja_drop_chestplate: + name: '&7Ninja Garb Chest-plate' + lore: + - Now you too are a Ninja +primis_pontis_mille_sewers_ninja_drop_leggings: + name: '&7Ninja Garb Leggings' + lore: + - Now you too are a Ninja +primis_pontis_mille_sewers_shredder_drop: + name: '&4Shredding Helmet' + lore: + - Full of small tiny razor blade + - like points on the exterior. +primis_pontis_mille_slums_chest_sword: + name: '&4Dull Pontis Mille Katana' + lore: + - '&7Incredibly sharp' +primis_pontis_mille_to_lycan_or_not_to_lycan_reward: + name: '&aFur Leggings' + lore: + - '&aTough and light' + - '&aMade out of fur and hide.' +primis_pontis_mines_goblin_drop_boots: + name: '&7Goblin Boots' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_chestplate: + name: '&7Goblin Chest-Plate' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_helmet: + name: '&7Goblin Helmet' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_leggings: + name: '&7Goblin Leggings' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_spear: + name: '&7Goblin Spear' + lore: + - '&7A nice and sharp stone at the end.' +primis_pontis_mines_goblin_drop_sword: + name: '&7Goblin Sword' + lore: + - '&7It''''s just a stone club with a handle.' +primis_pontis_redwoods_nasty_little_bandits_reward_boots: + name: '&2Forest Boots' + lore: + - '&2The boots seem to be made' + - '&2out of soft bark, leaves' + - '&2and crystallized tree sap.' +primis_pontis_redwoods_spider_legs: + name: '&2Spider Legs' + lore: + - '&aIt is just spider legs...' +primis_pontis_redwoods_tobacco: + name: '&2Premium Tobacco' + lore: + - '&aSmells amazing...' +primis_pontis_redwoods_watch: + name: '&2Sturdy Pocket Watch' + lore: + - '&aSuprisingly light and sturdy.' +primis_pontis_redwoods_werewolf_drop_chestplate: + name: '&7Fur Chest-Plate' + lore: + - '&7Made out of tough fur and hide.' + - '&7Light, but very tough.' +primis_roughspun_boots: + name: '&5Roughspun Boots' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_roughspun_chestplate: + name: '&5Roughspun Chestplate' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_roughspun_helmet: + name: '&5Roughspun Helmet' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_roughspun_leggings: + name: '&5Roughspun Leggings' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_ruins_bow: + name: '&8Ruined Bow' + lore: + - An old bow. Might've been good at some point. +primis_ruins_diary_entry: + name: Diary page + lore: + - '... I now regret chasing after the treasure in these ruins.' + - Now that I have fallen and broken my legs, it would seem + - as though I am fated to die under the treasure I sought. + - If only I had paid more attention during parkour class! +primis_ruin_relic_boots: + name: '&bRuin Relic Boots' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_ruin_relic_chestplate: + name: '&bRuin Relic Chestplate' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_ruin_relic_helmet: + name: '&bRuin Relic Helmet' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_ruin_relic_leggings: + name: '&bRuin Relic Leggings' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_rusty_mail_boots: + name: '&3Rusty Mail Boots' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_rusty_mail_chestplate: + name: '&3Rusty Mail Chestplate' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_rusty_mail_helmet: + name: '&3Rough Mail Helmet' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_rusty_mail_leggings: + name: '&3Rough Mail Leggings' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_starter_boots: + name: '&4Shipwreck''s Boots' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_chestplate: + name: '&4Shipwreck''s Chestplate' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_helmet: + name: '&4Shipwreck''s Helmet' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_leggings: + name: '&4Shipwreck''s Leggings' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_sword: + name: '&4Shipwreck''s Sword' + lore: + - '&aPossibly improvised from the beached remains of a ship!' +primis_storm_temple_drop_axe: + name: '&bStorm Axe' + lore: + - '&bThe wind shall repel them.' +primis_storm_temple_drop_boots: + name: '&bStorm Boots' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_storm_temple_drop_charm: + name: '&bStorm Necklace' + lore: + - '&bThe power of the storm.' +primis_storm_temple_drop_chestplate: + name: '&bStorm Chest-plate' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_storm_temple_drop_helmet: + name: '&bStorm Helmet' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_storm_temple_drop_leggings: + name: '&bStorm Leggings' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_terravilla_big_trouble_in_little_pub_reward_leggings: + name: '&eEarth''s Blessing' + lore: + - '&eLooks heavy but it is' + - '&esurprisingly light.' + - '&eIt is clear that these' + - '&eleggings are at least a' + - '&efew centuries old.' +primis_terravilla_drowning_terror_reward_charm: + name: '&aFish Charm' + lore: + - '&aFishy.' +primis_terravilla_hog_on_my_porch_reward_helmet: + name: '&6Hog Helmet' + lore: + - '&6Made out of tough Razorback leather.' +primis_terravilla_perfect_sample: + name: '&ePerfect Sample' + lore: + - '&eIt looks like a fish...' + - '&eBut it sure isn''t...' +primis_terravilla_strike_the_earth_reward_sword: + name: '&5Earth Splitter' + lore: + - '&5You pulled this blade out of' + - '&5the Earth Elementals corpse.' + - '&5Unlike it''s dull twin, this' + - '&5blade is in pristine condition.' +primis_terravilla_taking_out_the_trash_reward_sword: + name: '&9Earth Splitter' + lore: + - '&9Looks ancient and dull.' +primis_terravilla_two_legged_terror_growth: + name: '&eTwo Legged Terror Growth' + lore: + - '&eLarge fleshy growth.' +primis_terravilla_two_legged_terror_sample: + name: '&eTwo Legged Terror Sample' + lore: + - '&eIt''s a simple sample.' +primis_wolf_hide_boots: + name: '&5Wolf Hide Slippers' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_wolf_hide_chestplate: + name: '&5Wolf Hide Gambeson' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_wolf_hide_helmet: + name: '&5Wolf Hide Helmet' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_wolf_hide_leggings: + name: '&5Wolf Hide Pants' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +pufferfish_drop_helmet: + name: '&bPuffer Helm' + lore: + - '&bOnce a fish, now a helmet.' +rabbit_charm: + name: '&bRabbit Charm' + lore: + - '&aWith this charm, just about' + - '&aany destination is only a hop,' + - '&askip and a jump away!' +rabbit_wolf_drop_chestplate: + name: '&6Electrically Charged Chestplate' + lore: + - '&6As long as you don''t mind a' + - '&6casual zap here and there.' +rabbit_wolf_drop_leggings: + name: '&6Flame Licked Leggings' + lore: + - '&6Just lightly scorched.' +regular_hoglin_drop_boots: + name: '&eHog Boots' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_chestplate: + name: '&eHog Armor' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_helmet: + name: '&eHog Hood' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_leggings: + name: '&eHog Leggings' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +rod_of_the_depths: + name: '&3Rod of the Depths' + lore: + - '&3You want to hear about where' + - '&3I got this from? Sit down lad,' + - '&3I''ve got a tale for ye...' +rotting_diver_drop_hoe: + name: '&bDivers Hoe' + lore: + - '&bFound on the Rotting Divers corpse.' +salamander_charm: + name: '&bSalamander Charm' + lore: + - '&aAlmost as hot as MagmaGuy''s' + - '&anew mixtape!' +salty_corpse_drop_helmet: + name: '&aStinky Helm' + lore: + - '&aYou''re not sure why' + - '&ayou decided to pull' + - '&athis off of the corpse.' +scorpion_charm: + name: '&bScorpion Charm' + lore: + - '&aFloat like a butterfly,' + - '&asting like a bee,' + - '&apoison like a potato!' +shulker_charm: + name: '&bShulker Charm' + lore: + - '&aI believe I can fly' + - '&aI believe I can touch the sky' + - '&aAnd you''re coming with me!' +skeleton_knight_drop_helmet: + name: '&fKnights Honor' + lore: + - '&fA knights helmet. Made to last.' +sky_archer_drop_bow: + name: '&aSky Bow' + lore: + - '&aGood for keeping phantoms at bay.' +slowpoke_charm: + name: '&bSlowpoke Charm' + lore: + - '&aLet''s just hope it doesn''t hit' + - '&aitself in its confusion...' +spider_knight_drop_helmet: + name: '&aSmall Helmet' + lore: + - '&aA decent helmet. Maybe, a bit tight.' +stacked_bones_drop_helmet: + name: '&6Skull' + lore: + - '&6Large enough to fit your' + - '&6head inside, so why not.' +summon_merchant_scroll: + name: '&6Summon Merchant Scroll' + lore: + - '&aNeed to sell an item?' + - '&aRight-click to activate' + - '&aor yell &9Jeeves!' +summon_wolf_scroll: + name: '&6Summon Wolf Scroll' + lore: + - '&aSummons a good boy' + - '&ato help you bite Elites!' + - '&aMake sure you pet it!' +super_mite_drop_charm: + name: '&dMite Pearl' + lore: + - '&dWas it worth it...' +air_ship_air_buccaneer_boots: + name: '&5Air Bucanneer''s Boots' + lore: + - '&dPerfect for air raids!' +air_ship_air_buccaneer_chestplate: + name: '&5Air Bucanneer''s Chestplate' + lore: + - '&dPerfect for air raids!' +air_ship_air_buccaneer_helmet: + name: '&5Air Bucanneer''s Helmet' + lore: + - '&dPerfect for air raids!' +air_ship_air_buccaneer_leggings: + name: '&5Air Bucanneer''s Leggings' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_boots: + name: '&5Air Pirate''s Boots' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_chestplate: + name: '&5Air Pirate''s Chestplate' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_helmet: + name: '&5Air Pirate''s Helmet' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_leggings: + name: '&5Air Pirate''s Leggings' + lore: + - '&dPerfect for air raids!' +air_ship_bowsmans_bow: + name: '&2Bowsman''s Bow' + lore: + - '&aDropped by the late' + - '&aairship bowsman!' +air_ship_cannon_powder: + name: '&cCannon Powder' + lore: + - '&8How else are you supposed' + - '&8to light the fuse?' +air_ship_daveys_digger: + name: '&4Davey''s Digger' + lore: + - '&cDavey doesn''t desire downtrodden' + - '&cdunderheads displaying his digger.' +air_ship_quartermasters_whip: + name: '&fQuartermaster''s Whip' + lore: + - '&7The quartermaster has a ' + - '&7schedule to keep.' +air_ship_wayfinders_windlass: + name: '&3Wayfinder''s Windlass' + lore: + - '&bUsed to guide ships' + - '&bwith nothing but the stars!' +pirate_ship_sea_feast: + name: '&6Sea feast' + lore: + - '&6A feast for the eyes' + - '&6and the health bar!' +pirate_ship_sea_ration: + name: '&eSea ration' + lore: + - '&eAn apple a day' + - '&ekeep the scurvy away' + - '&cNote: it does not' +catacombs_tier_10_miniboss_boots: + name: '&9Spiderweave boots' + lore: + - '&5As light as air!' +catacombs_tier_10_miniboss_spider_eye: + name: '&7Terragog''s eye' + lore: + - '&7Whispers from nowhere reach' + - '&7your ears while holding this...' +catacombs_tier_15_boss_bone: + name: The Picker + lore: + - '&fYou''ve got a bone to pick!' +catacombs_tier_15_boss_bow: + name: '&6The Bone Shaker' + lore: + - '&fThey''ll feel this one down to' + - '&ftheir bones!' +catacombs_tier_15_boss_shovel: + name: '&8Gravedigger' + lore: + - '&fThey''ll feel this one down to' + - '&ftheir bones!' +catacombs_tier_15_mimic_boss_shield: + name: '&3Shield of the lost Templar' + lore: + - Found in a mysterious chest in a + - secret room of ancient catacombs... +colosseum_pit_breaker: + name: '&4Pit Shatterer' + lore: + - '&4Veni' +colosseum_pit_filler: + name: '&4&lPit Filler' + lore: + - '&4Vici' +colosseum_pit_maker: + name: '&4&lPit Maker' + lore: + - '&4Vidi' +dark_cathedral_tier_75_sword: + name: '&0Cursed Sword' + lore: + - '&0&kChtulhu is the one true God.' + - '&0&kThis world is but a lamb' + - '&0&kto the slaughter' +darkspire_arzags_boots: + name: '&8Arzag''s War Boots' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_chestplate: + name: '&8Arzag''s War Chestplate' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_helmet: + name: '&8Arzag''s War Helmet' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_leggings: + name: '&8Arzag''s War Leggings' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_slicer: + name: '&8Arzag''s Slicer' + lore: + - '&7Once used by the might Arzag!' +darkspire_crypt_keepers_boots: + name: '&4Crypt Keeper''s Boots' + lore: + - '&cFormerly the boots of the' + - '&ccorrupt Crypt Keeper!' +darkspire_hellraisers_battle_armor: + name: '&4Eerbix''s Battle Armor' + lore: + - '&cFormerly the battle' + - '&carmor of the egregious' + - '&cEerbix the Fallen!' +darkspire_maalkvs_bow: + name: '&4Maalkv''s Bow' + lore: + - '&cFormerly the bow of the' + - '&cmischievous Maalkv!' +darkspire_netherite_axe: + name: '&8Void Eviscerator' + lore: + - '&8Shards of the void itself were' + - '&8collected to form the cleaving' + - '&8head of this ancient weapon.' +darkspire_nicolas_ribcages_helmet: + name: '&4Nicolas Ribcage''s Helmet' + lore: + - '&cFormerly the helmet of the' + - '&cnefarious Nicolas Ribcage!' +darkspire_oroxaks_sword: + name: '&4Oroxak''s Sword' + lore: + - '&cFormerly the sword of the' + - '&codious Oroxak!' +darkspire_zalmurs_leggings: + name: '&4Zalmur''s Leggings' + lore: + - '&cFormerly the leggings of' + - '&cthe zealous Zalmur' + - '&cthe Impslayer!' +the_feller: + name: '&2The Feller' + lore: + - '&aEven in your sleep,' + - '&ayou can feel this axe''''s' + - '&asaplust' +the_great_weaver_drop_charm: + name: '&cWeavers Silk' + lore: + - '&cGreat power is imbued into this silk.' +hallosseum_amazing_treat: + name: '&aAmazing Treat!' + lore: + - '&eAn amazing snack!' +hallosseum_axe_of_beheadings: + name: '&cAxe of Beheadings' + lore: + - '&4Famously used to decapitate a' + - '&4certain headless horseman!' +hallosseum_incredible_treat: + name: '&aIncredible Treat!' + lore: + - '&eAn incredible snack!' +hallosseum_treat: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +hallosseum_treat_v2: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +the_hunter_drop_crossbow: + name: '&aHunter''s Friend' + lore: + - '&aLet the hunt begin.' +northpole_amazing_treat: + name: '&aAmazing Treat!' + lore: + - '&eAn amazing snack!' +northpole_coalbringer: + name: '&8Coalbringer' + lore: + - '&cWhatever I touch' + - '&cStarts to melt in my clutch.' + - '&cI''m too much!' +northpole_frostcaster: + name: '&bFrostcaster' + lore: + - '&7Whatever I touch' + - '&7Turns to snow in my clutch!' + - '&7I''m too much' +northpole_incredible_treat: + name: '&aIncredible Treat!' + lore: + - '&eAn incredible snack!' +northpole_naughty_lister: + name: '&4The Naughty Lister' + lore: + - '&cTakes names. Doesn''t ask twice!' + - '&cHave you been naughty this year?' +northpole_treat: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +northpole_treat_v2: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +the_phantom_drop_chestplate: + name: '&dPhantom Gambison' + lore: + - '&dYou would say it is made out of soft' + - '&dand comfy fibrous cloth, but a blade' + - '&dwould not recoil from striking cloth.' +pirate_ship_tier_15_boots: + name: Pirate Sandals + lore: + - Make you want to + - go to the beach! +pirate_ship_tier_15_bow: + name: Pirate shortbow + lore: + - Perfect for boarding parties! +pirate_ship_tier_15_chestplate: + name: Pirate Shirt + lore: + - No shoes, no shirt + - no problem! +pirate_ship_tier_15_helmet: + name: Pirate Bandana + lore: + - No shoes, no shirt + - no problem! +pirate_ship_tier_15_leggings: + name: Pirate Sash + lore: + - These could use a wash! +pirate_ship_tier_15_sword: + name: Pirate marlinspike + lore: + - Loud and deadly! +pirate_ship_tier_20_miniboss_axe: + name: '&5Cookie''s Tenderizer' + lore: + - '&5You''ll feel that tomorrow!' +pirate_ship_tier_20_miniboss_chestplate: + name: '&5Cookie''s apron' + lore: + - '&5Has seen better days!' +pirate_ship_tier_25_boots: + name: '&aPirate shoes' + lore: + - '&aPerfect for thieving!' +pirate_ship_tier_25_bow: + name: '&aPirate musket' + lore: + - '&aCareful where you point it!' +pirate_ship_tier_25_chestplate: + name: '&aPirate vest' + lore: + - '&aProbably illegally obtained!' +pirate_ship_tier_25_helmet: + name: '&aPirate earrings' + lore: + - '&aWorth enough to pay for' + - '&aa funeral!' +pirate_ship_tier_25_leggings: + name: '&aPirate trousers' + lore: + - '&aFull of gold coins!' +pirate_ship_tier_25_miniboss_helmet: + name: '&5Helmsman''s Eyepatch' + lore: + - '&5How can you see better' + - '&5with it on!?' +pirate_ship_tier_25_miniboss_trident: + name: '&5Helmsman''s Trident' + lore: + - '&5Pointy end towards the enemy!' +pirate_ship_tier_25_sword: + name: '&aPirate cutlass' + lore: + - '&aTruly piratey!' +pirate_ship_tier_30_miniboss_axe: + name: '&5Crushy''s Chopper' + lore: + - '&5Step back!' +pirate_ship_tier_30_miniboss_shield: + name: '&5Crushy''s Shoulder' + lore: + - '&5Never skipped shoulder day!' +pirate_ship_tier_35_boots: + name: '&9Pirate boots' + lore: + - '&9Perfect for swashbuckling!' +pirate_ship_tier_35_bow: + name: '&9Pirate handcannon' + lore: + - '&9Blast em away!' +pirate_ship_tier_35_chestplate: + name: '&9Pirate straps' + lore: + - '&9Perfect for looting!' +pirate_ship_tier_35_helmet: + name: '&9Pirate eyepatch' + lore: + - '&9Not perfect for seeing!' +pirate_ship_tier_35_leggings: + name: '&9Pirate greaves' + lore: + - '&9Perfect for looting!' +pirate_ship_tier_35_miniboss_boots: + name: '&9Bodyguard''s boots' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_chestplate: + name: '&5Bodyguard''s straps' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_crossbow: + name: '&5Bodyguard''s handcannon' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_helmet: + name: '&5Bodyguard''s eyepatch' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_leggings: + name: '&5Bodyguard''s greaves' + lore: + - '&9For those with something to defend!' +pirate_ship_tier_35_miniboss_sword: + name: '&5Bodyguard''s cutlass' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_sword: + name: '&9Pirate cutlass' + lore: + - '&9Truly piratey!' +pirate_ship_tier_40_miniboss_crossbow: + name: '&5The Blunderbuss' + lore: + - '&5Spray ''n pray!' +pirate_ship_tier_40_miniboss_leggings: + name: '&5The Zaggers' + lore: + - '&5When they think you''re going!' + - '&5to zig, zag on them!' +pirate_ship_tier_45_boss_helmet: + name: '&5Captain''s eyepatch' + lore: + - '&5I don''t see any issues!' +pirate_ship_tier_45_boss_sword: + name: '&5Captain''s scimitar' + lore: + - '&5En garde, ye scurvy rats!' +the_ruins_boss_loot: + name: '&6Thor''s Axe' + lore: + - Only the pure of heart + - can wield this axe. +sewer_drowned_kings_boots: + name: '&4Drowned King''s Boots' + lore: + - '&cFormerly the boots of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_chestplate: + name: '&4Drowned King''s Chestplate' + lore: + - '&cFormerly the chestplate of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_crown: + name: '&4Drowned King''s Crown' + lore: + - '&cFormerly the crown of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_leggings: + name: '&4Drowned King''s Leggings' + lore: + - '&cFormerly the leggings of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_trident: + name: '&4Drowned King''s Trident' + lore: + - '&cFormerly the trident of the' + - '&cdevilish Drowned King!' +sewer_spelunkers_boots: + name: '&2Sewer Spelunker''s Boots' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential leggings!' +sewer_spelunkers_chestplate: + name: '&2Sewer Spelunker''s Chestplate' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential chestplate!' +sewer_spelunkers_helmet: + name: '&2Sewer Spelunker''s Helmet' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential helmet!' +sewer_spelunkers_leggings: + name: '&2Sewer Spelunker''s Leggings' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential leggings!' +sewer_spelunkers_sword: + name: '&2Sewer Spelunker''s Sword' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential sword!' +the_stinger: + name: '&eThe Stinger' + lore: + - '&aFloat like a butterfly,' + - '&asting like a bee!' +tree_defender_drop_shield: + name: '&7Living Wood Shield' + lore: + - '&7This shield will' + - '&7slowly repair itself.' +unbind_scroll: + name: '&5Unbind Scroll' + lore: + - '&5Allows users to unbind one' + - '&5soulbound item at an anvil!' + - '&5Use wisely!' +undead_farmer_drop_shovel: + name: '&8Manure Master' + lore: + - '&8Perfect for shoveling pig manure.' +unwanted_visitor_drop_bow: + name: '&1Frost Bow' + lore: + - '&9Makes you wanna chill' + - '&9and snipe from afar.' +vampire_manor_gargoyle_granulator: + name: '&8Gargoyle Granulator' + lore: + - '&cLightly dusted in garlic.' +vampire_manor_stake_your_claim: + name: '&4Stake your Claim' + lore: + - '&cLightly dusted in garlic.' +vampiric_charm: + name: '&bVampiric Charm' + lore: + - '&aNo one can remember where this' + - '&acame from, and no one can,' + - '&aforget how dangerous it is...' +veterans_boots: + name: '&6Veteran''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_chestplate: + name: '&6Veteran''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_helmet: + name: '&6Veteran''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_leggings: + name: '&6Veteran''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_sword: + name: '&6Veteran''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +vex_top_drop_boots: + name: '&bVexed Boots' + lore: + - '&bWith mighty boots' + - '&bcomes mighty strength.' +warlock_drop_chestplate: + name: '&dWarlock Robes' + lore: + - '&dOffers good protection from spells.' +warlock_drop_helmet: + name: '&dWarlock Hood' + lore: + - '&dOffers good protection from spells.' +water_pest_drop_shield: + name: '&bWater Logged Shield' + lore: + - '&bIt''s pretty sturdy actually.' +wendigo_drop_sword: + name: '&8Blade of Starving' + lore: + - '&8This blade will always' + - '&8hunger for more blood.' +werehare_drop_charm: + name: '&eWerehare Trophy' + lore: + - '&eLuck and health to' + - 'ðose who carry it.' +werewolf_bone: + name: '&6Werewolf Bone' + lore: + - '&aHaving killed the alpha,' + - '&athis temporarily makes you!' + - '&athe wolves'' new leader' +wolfsbane: + name: '&7Wolfsbane' + lore: + - '&aMade from the remains of' + - '&aan alpha werewolf, all' + - '&awolves cower at the sight of it.' +yeti_drop_leggings: + name: '&eFur Leggings' + lore: + - '&eNice and warm.' +yezhi_baba_drop_boots: + name: '&aWitches Robes' + lore: + - '&aThe smell should go' + - '&aaway eventually.' +zombie_kings_axe: + name: '&4Zombie King''s Axe' + lore: + - The axe of the one Zombies + - call their king. + - The bloodlust is palpable. +airship_minidungeon: + name: '&6The Airship' + customInfo: + - '&fAn awesome airship full of undead pirates!' + - '&6Credits: MagmaGuy, 69OzCanOfBepis' + - '&6and Realm of Lotheridon' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &6An awesome airship full of undead pirates + &6for experienced players! + regionEnterMessage: '&8[EM] &cEntering hostile air zone!' + regionLeaveMessage: '&8[EM] &cLeaving hostile air zone!' +binder_of_worlds_lair: + name: '&5Binder Of Worlds' + customInfo: + - '&5The ultimate challenge. Be prepared!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Nightmare + $bossCount level $highestTier final boss! + &5This is the hardest fight in EliteMobs! + regionEnterMessage: '&8[EM] &5Reality unravels around you. You face the final challenge. &4You are not prepared!' + regionLeaveMessage: '&8[EM] &5You have left the unravelling. Did you find what you sought? Was it worth it?' +catacombs_lair: + name: '&8The Catacombs' + customInfo: + - '&fThe best starter dungeon for players!' + - '&6Credits: Realm of Lotheridon' + playerInfo: |- + Difficulty: &cHard + $bossCount bosses, from tier $lowestTier to $highestTier + &2The best Lair challenge for groups of beginners! + regionEnterMessage: '&8[EM] &8Now entering the Catacombs. Be careful with what dwells below...' + regionLeaveMessage: '&8[EM] &8You have left the Catacombs. Was it worth it?' +colosseum_lair: + name: '&6The Colosseum' + customInfo: + - '&fFeaturing the first true World boss, first' + - '&fmulti-phased battle, first mounted boss,' + - '&ffirst disguised boss... a truly epic fight!' + - '&6Credits: MagmaGuy & Maldini' + playerInfo: |- + Difficulty: &cHard + $bossCount bosses, from level $lowestTier to $highestTier + &cA true challenge for big groups of players! + regionEnterMessage: '&8[EM] &6Champions and challengers prepare! &eProve your worth against the most mighty of foes!' + regionLeaveMessage: '&8[EM] &6Farewell traveller! &eReturn soon to show your might once more!' +dark_cathedral_lair: + name: '&8The Dark Cathedral' + customInfo: + - '&fThe first ever EliteMobs Lair!' + - '&fA classic that all servers need!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &cHard + $bossCount level $highestTier Big Boss! + &cThe original minidungeon, a challenge for + &ca group of players or for veterans! + regionEnterMessage: '&8[EM] &8Welcome to the Dark Cathedral. &4Death awaits inside...' + regionLeaveMessage: '&8[EM] &8Now leaving the Dark Cathedral. &4It awaits your return...' +dark_spire_minidungeon: + name: '&8The Dark Spire' + customInfo: + - '&fThe first ever high level content!' + - '&fMade for those who want a real challenge!' + - '&6Credits: 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &cA vast challenge for advanced players! + regionEnterMessage: '&8[EM] &1An invasion is in progress. &9Stop the insurrection!' + regionLeaveMessage: '&8[EM] &1You managed to hold them back. &9For now...' +fireworks_lair: + name: '&aFireworks' + customInfo: + - '&fThe 2021 4th of July map!' + - '&6Credits: MagmaGuy' + playerInfo: |- + Difficulty: &cHard + $bossCount level $lowestTier Big Boss! + &6An encounter full of explosions! + regionEnterMessage: '&8[EM] &eWelcome to the fireworks show!' + regionLeaveMessage: '&8[EM] &eYou''ve left the party!' +frost_palace_sanctum: + name: Frost Palace + customInfo: + - '&fA 7 phase fight against' + - the queen of ice! + - '&6Credits: MagmaGuy, Delio' + playerInfo: 'Difficulty: &45-man hard content!' + regionEnterMessage: '&bYou are stepping into the Frost Palace! Stay frosty!' + regionLeaveMessage: '&bYou have left the Frost Palace!' +hallosseum_lair: + name: '&cHallosseum' + customInfo: + - '&fThe 2020 spooky halloween encounter!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &chard + $bossCount level $lowestTier Big Boss! + &6A fun Halloween challenge! + regionEnterMessage: '&8[EM] &4Trick or treat! &8Your soul is mine!' + regionLeaveMessage: '&8[EM] &4You''ve escaped with your soul intact.' +invasion_minidungeon: + name: '&2The Invasion' + customInfo: + - '&fThe Halloween Minidungeon!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount aliens, from level $lowestTier to $highestTier + &6Don't get abducted! + regionEnterMessage: '&8[EM] &7Alien invasion in progress! Defeat the Mothership!' + regionLeaveMessage: '&8[EM] &7You have escaped the alien abductions! No one will ever believe you.' +north_pole_minidungeon: + name: '&9The North Pole' + customInfo: + - '&fThe Christmas minidungeon!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &6Christmas in a snow globe! + regionEnterMessage: '&8[EM] &7You have reached the North Pole! &fHave you been naughty this year?' + regionLeaveMessage: '&8[EM] &7Come back and visit. &fThere are plenty of sweets and treats for next time!' +oasis_adventure: + name: '&6The Oasis' + customInfo: + - '&fA massive adventure for beginners!' + - '&6Credits: 69OzCanOfBepis' + playerInfo: |- + Difficulty: &2Solo-able + $bossCount bosses, from level $lowestTier to $highestTier + &6A big adventure for people who know the ropes! + regionEnterMessage: '&8[EM] &6You have arrived at the Oasis!' + regionLeaveMessage: '&8[EM] &6You have left the Oasis!' +pirate_ship_minidungeon: + name: '&6The Pirate Ship' + customInfo: + - '&fA fun, challenging minidungeon full of' + - '&fbosses made for players starting to get good,' + - '&fat EliteMobs!' + - '&6Credits: MagmaGuy & Realm of Lotheridon' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &6One of the best hunting grounds for&6aspiring adventurers! + regionEnterMessage: '&8[EM] &3Now boarding the Pirate Ship! &bPillage and plunder to yer'' hearts content!' + regionLeaveMessage: '&8[EM] &3Player overboard! &bReturn when you''ve earned your sea-legs ye'' landlubber!' +primis_adventure: + name: '&7Primis' + customInfo: + - '&fA tutorial adventure for new players!' + - '&6Credits: 69OzCanOfBepis, MagmaGuy' + playerInfo: |- + Difficulty: &2Easy + $bossCount bosses, from level $lowestTier to $highestTier + &6A tutorial adventure for new players! + regionEnterMessage: '&8[EM] &6Primis awaits, strike the earth!' + regionLeaveMessage: '&8[EM] &6You have left Primis!' +sewers_minidungeon: + name: '&8The Sewers' + customInfo: + - '&fThe biggest minidungeon ever made!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &6A complex dungeon maze with a challenging sections! + regionEnterMessage: '&8[EM] &5This place looks abandoned... &dYet something lurks in these sewers!' + regionLeaveMessage: '&8[EM] &5You managed to stay above water. &dMaybe next time you''ll drown.' +the_ruins: + name: '&6The Ruins' + customInfo: + - '&fA fight against a myth from' + - '&fNorse mythology, be prepared for a smiting!' + - '&6Credits: 69OzCanOfBepis, MagmaGuy' + playerInfo: |- + Difficulty: &cHard + $bossCount level $lowestTier Big Boss! + &cA tough fight against a Norse god! + regionEnterMessage: '&8[EM] &3Those who challenge the myths must be prepared for their downfall!' + regionLeaveMessage: '&8[EM] &3You now know what it takes to make a legend!' +vampire_manor: + name: '&cThe Vampire Manor' + customInfo: + - '&fPrepare to spill blood!' + - '&6Credits: MagmaGuy, 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &6A deadly manor full of blood thristy creatures! + &6Are you ready to face that which haunts the night? + regionEnterMessage: '&8[EM] &cTrespassing on dangerous grounds!!' + regionLeaveMessage: '&8[EM] &cNow leaving haunted land!' +alpha_werewolf_p1: + name: '$eventBossLevel &7Enraged Vindicator' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Alpha Wolf has been put down!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&7Enraged Vindicator: $distance blocks away!' + spawnMessage: '&cThe howls of an Alpha Werewolf are heard!' + deathMessage: '&aThe Alpha Werewolf has been stopped by $players!' + escapeMessage: '&4Dawn breaks, the Alpha Wolf vanishes without a trace!' +alpha_werewolf_p2: + name: '$eventBossLevel &7Alpha Werewolf' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Alpha Wolf has been put down!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&7Alpha Wolf: $distance blocks away!' + spawnMessage: '&cThe howls of an Alpha Werewolf are heard!' + deathMessage: '&aThe Alpha Werewolf has been stopped by $players!' + escapeMessage: '&4Dawn breaks, the Alpha Wolf vanishes without a trace!' +ancient_corpse: + name: '$eventBossLevel &eAncient Corpse' +animated_armor: + name: '$eventBossLevel &8Animated Armor' + locationMessage: '&cAnimated Armor: $distance blocks away!' + spawnMessage: '&cOh no! An Animated Armor has escape from it''s armor stand!' + deathMessage: '&aThe Animated Armor was stopped by $players!' + escapeMessage: '&4The Animated Armor is gone!' +arachnid_matriarch: + name: '$eventBossLevel &cArachnid Matriarch' + locationMessage: '&cArachnid Matriarch: $distance blocks away!' + spawnMessage: '&cA Matriarch has come to spread her brood across the land!' + deathMessage: '&aThe Matriarch and her brood were stopped by $players!' + escapeMessage: '&4The Matriarch has left!' +arachnid_matriarch_summon: + name: '$eventBossLevel &4Broodling' +armor_goblin: + name: '$eventBossLevel &3Armor Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Armor Goblin has been pillaged!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cArmor Goblin: $distance blocks away!' + spawnMessage: '&cAn Armor Goblin has been sighted!' + deathMessage: '&aAn Armor Goblin has been slain by $players!' + escapeMessage: '&4An Armor Goblin has escaped!' +baba_rhoga: + name: '$eventBossLevel &cBaba Rhoga' + locationMessage: '&cBaba Rhoga: $distance blocks away!' + spawnMessage: '&cA wicked hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +baba_rhoga_summon: + name: '$reinforcementLevel &4Baba Rhoga' +baba_yaga: + name: '$eventBossLevel &cBaba Yaga' + locationMessage: '&cBaba Yaga: $distance blocks away!' + spawnMessage: '&cA wicked hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +baba_yaga_summon: + name: '$reinforcementLevel &4Baba Yaga' +balloon_rider: + name: '$eventBossLevel &dBalloon Rider' + locationMessage: '&cBalloon Rider: $distance blocks away!' + spawnMessage: '&cA brave Balloon Rider has come to the Nether!' + deathMessage: '&aThe Balloon Rider has taken his last ride thanks to $players!' + escapeMessage: '&4The Balloon Rider has floated away!' +balloon_rider_mount: + name: '$eventBossLevel &5Ghastly Balloon' +balrog: + name: '$eventBossLevel &4Balrog' +banshee: + name: '$eventBossLevel &cBanshee' + locationMessage: '&cBanshee: $distance blocks away!' + spawnMessage: '&cA Banshee''s wail can be heard!' + deathMessage: '&aThe Banshee was silenced by $players!' + escapeMessage: '&4The Banshee has left!' +banshee_summon: + name: '$eventBossLevel &cGrief' +beast_master: + name: '$eventBossLevel &6Beast Master' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Beast Master has been savaged!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cBeast Master: $distance blocks away!' + spawnMessage: '&cThe Beast Master has been sighted!' + deathMessage: '&aThe Best Master has been slain by $players!' + escapeMessage: '&4The Beast Master has returned to the wilds!' +beast_tamer: + name: '$eventBossLevel &eBeast Tamer' + locationMessage: '&cBeast Tamer: $distance blocks away!' + spawnMessage: '&cA master of beasts roams the world!' + deathMessage: '&aThe Beast Tamer was stopped by $players!' + escapeMessage: '&4The Beast Tamer has left!' +beast_tamer_summon: + name: '$eventBossLevel &6Large Beast' +beast_tamer_summon_1: + name: '$eventBossLevel &6Beast' +beta_wolf: + name: '$reinforcementLevel &7Beta Wolf' +bigfoot: + name: '$eventBossLevel &fBigfoot' + locationMessage: '&cBigfoot: $distance blocks away!' + spawnMessage: '&cA mighty beast has appeared!' + deathMessage: '&aThe beast is no more thanks to $players!.' + escapeMessage: '&4The beast has escaped!' +big_bad_wolf: + name: '$eventBossLevel &fBig Bad Wolf' + locationMessage: '&cBig Bad Wolf: $distance blocks away!' + spawnMessage: '&cAnd he huffed and he puffed!' + deathMessage: '&aThe little piggies are now safe thanks to $players!' + escapeMessage: '&4The Big Bad Wolf has left!' +binder_of_worlds_phase_1_endermite_reinforcement: + name: '$reinforcementLevel &5Koruptor realitas' +binder_of_worlds_phase_3_enderman_reinforcement: + name: '$reinforcementLevel &5Pembunuh Realitas' +binder_of_worlds_phase_3_ghast_reinforcement: + name: '$reinforcementLevel &5Penghancur Realitas' +blayyze: + name: '$eventBossLevel &6Blayyze' + deathMessages: + - '&e&l---------------------------------------------' + - '&6Blayyze telah ditolak!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&6????: $distance block jauhnya' + spawnMessage: '&cSesuatu keluar dari kawah meteorit...' + deathMessage: '&6$player menyelesaikan kontak pertama.' + escapeMessage: '&6Ayyliens telah dibawa ke area 51!' +bloated_jeffrey: + name: '$eventBossLevel &dBloated Jeffrey' + locationMessage: '&cBloated Jeffrey: $distance blocks away!' + spawnMessage: '&cIt''s Jeffrey! They are in the nether! Bring a bow!' + deathMessage: '&aBloated Jeffrey has been slain by $players!' + escapeMessage: '&4Jeffrey and his friends grew bored and they left!' +bloated_jeffrey_summon: + name: '$eventBossLevel &dJeffrey''s Friend' +bone_fiend: + name: '$eventBossLevel &7Bone Fiend' + locationMessage: '&cBone Fiend: $distance blocks away!' + spawnMessage: '&cA creature of bone and bone has appeared!' + deathMessage: '&aThe Bone Fiend was defeated by $players!' + escapeMessage: '&4The Bone Fiend found no bone and left!' +bone_fiend_mount: + name: '$eventBossLevel &8Bone Carrier' +changeling: + name: '$eventBossLevel &4Changeling' + locationMessage: '&cChangeling: $distance blocks away!' + spawnMessage: '&cA shape-shifter has entered this world.' + deathMessage: '&aThe Changeling was stopped by $players!' + escapeMessage: '&4The Changeling has escaped!' +changeling_p2: + name: '$eventBossLevel &4Changeling' +changeling_p3: + name: '$eventBossLevel &4Changeling' +changeling_p4: + name: '$eventBossLevel &4Changeling' +changeling_p5: + name: '$eventBossLevel &4Changeling' +changeling_p6: + name: '$eventBossLevel &4Changeling' +changeling_p7: + name: '$eventBossLevel &4Changeling' +charms_goblin: + name: '$eventBossLevel &2Charms Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Charms Goblin has been pillaged!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cCharms Goblin: $distance blocks away!' + spawnMessage: '&cA Charms Goblin has been sighted!' + deathMessage: '&aA Charms Goblin has been slain by $players!' + escapeMessage: '&4A Charms Goblin has escaped!' +circus_ringmaster: + name: '$eventBossLevel &dRingmaster' + locationMessage: '&cCircus Ringmaster: $distance blocks away!' + spawnMessage: '&cA terrible circus is in town!' + deathMessage: '&a$players has stopped the RIngmasters reign of abuse!' + escapeMessage: '&4The circus has left town!' +circus_ringmaster_summon: + name: '$eventBossLevel &5Tortured Animal' +circus_ringmaster_summon_1: + name: '$eventBossLevel &5Abused Clown' +circus_ringmaster_summon_2: + name: '$eventBossLevel &5Mistreated Balloon' +coins_goblin: + name: '$eventBossLevel &eCoins Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Coins Goblin has been pillaged!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cCoins Goblin: $distance blocks away!' + spawnMessage: '&cA Coins Goblin has been sighted!' + deathMessage: '&aA Coins Goblin has been slain by $players!' + escapeMessage: '&4A Coins Goblin has escaped!' +craftenmine_stacked_bones: + name: '$eventBossLevel &eArmed Skull' + locationMessage: '&cDr. Craftenmine''s Stacked Bones: $distance blocks away!' + spawnMessage: '&cA horrible Dr. Craftenmine creation is out in the wild!' + deathMessage: '&aThe horrible Stacked-Bones creation was slain by $players!' + escapeMessage: '&4Dr. Craftenmines horrible creation has escaped!' +craftenmine_stacked_bones_ankle: + name: '$eventBossLevel &6Armed Ankle' +craftenmine_stacked_bones_backbone: + name: '$eventBossLevel &6Armed Backbone' +craftenmine_stacked_bones_femur: + name: '$eventBossLevel &6Armed Femur' +craftenmine_stacked_bones_spine: + name: '$eventBossLevel &6Armed Spine' +craftenmine_terror: + name: '$eventBossLevel &cLobotimized Ghast' + locationMessage: '&cDr. Craftenmine''s Terror: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine creation is on the loose!' + deathMessage: '&aThe Lobotimized Ghast was slain by $players!' + escapeMessage: '&4The Lobotimized Ghast has left!' +craftenmine_terror_mount: + name: '$eventBossLevel &dGhast Carrier' +creeperpede_1: + name: '$eventBossLevel &5Creeperpede Observer' + locationMessage: '&cCreeperpede: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine experiment is on the loose!' + deathMessage: '&aThe Creeperpede was stopped in its tracks by $players!.' + escapeMessage: '&4AThe Dr. Craftenmine experiment has managed to escape!' +creeperpede_2: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_3: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_4: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_5: + name: '$eventBossLevel &5Creeperpede Carrier' +crone: + name: '$eventBossLevel &aOld Crone' + locationMessage: '&cOld Crone: $distance blocks away!' + spawnMessage: '&cAn Old Crone has wandered into this world!' + deathMessage: '&aThe Crone was vanquished by $players!.' + escapeMessage: '&4The Old Crone has left this world on her broom!' +crone_summon: + name: '$eventBossLevel &fPet Spider' +divine_cinder: + name: '$eventBossLevel &cDivine Cinder' + locationMessage: '&cDivine Cinder: $distance blocks away!' + spawnMessage: '&cA divine blaze has appeared!' + deathMessage: '&aThe Divine Cinder was defeated by $players!' + escapeMessage: '&4The Divine Cinder has smoked away!' +ember: + name: '$reinforcementLevel &cEmber' +enders_1: + name: '$eventBossLevel &dEnderlad' + locationMessage: '&cEnder Clique: $distance blocks away!' + spawnMessage: '&cA group of ender troublemakers have appeared.' + deathMessage: '&aThe Ender Clique was stopped by $players!' + escapeMessage: '&4The Ender Clique have left!' +enders_2: + name: '$eventBossLevel &dEnderchap' + locationMessage: '&cClique Member: $distance blocks away!' +enders_3: + name: '$eventBossLevel &dEnderdude' + locationMessage: '&cClique Member: $distance blocks away!' +ender_lapin: + name: '$eventBossLevel &aEnder Lapin' +endless_pursuer: + name: '$eventBossLevel &dEndless Pursuer' + locationMessage: '&cEndless Pursuer: $distance blocks away!' + spawnMessage: '&cIt will not stop chasing...' + deathMessage: '&aThe chase has stopped thanks to $players!' + escapeMessage: '&4The Pursuer has vanished!' +enraged_snowman: + name: '$eventBossLevel &1Enraged Snowman' + locationMessage: '&cEnraged Snowman: $distance blocks away!' + spawnMessage: '&cAn angry Snowman was sighted!' + deathMessage: '&aThe Enraged Snowman was put to rest by $players!' + escapeMessage: '&4The Enraged Snowman has vanished!' +evil_undead: + name: '$eventBossLevel &cEvil Undead' + locationMessage: '&cEvil Undead: $distance blocks away!' + spawnMessage: '&cAn Evil Undead has appeared!' + deathMessage: '&aThe Evil Undead was put to rest by $players!' + escapeMessage: '&4The Evil Undead has escaped!' +evil_undead_p2: + name: '$eventBossLevel &cEvil Undead' + locationMessage: '&cEvil Undead: $distance blocks away!' + spawnMessage: '&cAn Evil Undead has appeared!' + deathMessage: '&aThe Evil Undead was put to rest by $players!' + escapeMessage: '&4The Evil Undead has escaped!' +fallen_knight: + name: '$eventBossLevel &7Fallen Knight' + locationMessage: '&cFallen Knight: $distance blocks away!' + spawnMessage: '&cA Fallen Knight rises from their grave!' + deathMessage: '&aA Fallen Knight has fallen to $players!.' + escapeMessage: '&4The Fallen Knight goes back to slumber!' +fine_swine: + name: '$eventBossLevel &eFine Swine' +fine_swine_summon: + name: '$eventBossLevel &eMighty Protector' +firestarter: + name: '$eventBossLevel &6Firestarter' + locationMessage: '&cFirestarter: $distance blocks away!' + spawnMessage: '&cA wicked Firestarter has appeared!' + deathMessage: '&aThe Firestarter was slain by $players!' + escapeMessage: '&4The Firestarter has left!' +firestarter_mount: + name: '$eventBossLevel &6Spark' +fire_conjurer: + name: '$eventBossLevel &eFire Conjurer' + locationMessage: '&cFire Conjurer: $distance blocks away!' + spawnMessage: '&cA master of fire and flame walks this world!' + deathMessage: '&aThe Fire Conjurer was extinguished by $players!' + escapeMessage: '&4The Fire Conjurer has vanished!' +fire_conjurer_summon: + name: '$eventBossLevel &6Summoned Flame' +fire_fae: + name: '$eventBossLevel &cFire Fae' +foreign_visitor: + name: '$eventBossLevel &5Foreign Visitor' + locationMessage: '&cForeign Visitor: $distance blocks away!' + spawnMessage: '&cA visitor from a another dimension has arrived!' + deathMessage: '&a$players has made sure to let the visitor know that they are not welcome here.' + escapeMessage: '&4The visitor has gone back home!' +fox_king_cold: + name: '$eventBossLevel &1Fox King Cold' + locationMessage: '&cFox King Cold: $distance blocks away!' + spawnMessage: '&cA magical creature roams the world.' + deathMessage: '&aFox King Cold was defeated by $players!' + escapeMessage: '&4Fox King Cold has left this world.' +frost_palace_frost_queen_p0: + name: '$bossLevel &8Frost Queen' + locationMessage: '&9Frost Queen' + spawnMessage: '&9The wind howls. The Frost Queen rises up to the challenge.' + deathMessage: '&aThe Frost queen is no more, slain by $players!' +frost_palace_frost_queen_p1: + name: '$bossLevel &8Frost Queen phase 1' + locationMessage: '&9Frost Queen phase 1' +frost_palace_frost_queen_p2: + name: '$bossLevel &8Frost Queen phase 2' + locationMessage: '&9Frost Queen phase 2' +frost_palace_frost_queen_p3: + name: '$bossLevel &8Frost Queen phase 3' + locationMessage: '&9Frost Queen phase 3' +frost_palace_frost_queen_p4: + name: '$bossLevel &8Frost Queen phase 4' + locationMessage: '&9Frost Queen phase 4' +frost_palace_frost_queen_p5: + name: '$bossLevel &8Frost Queen phase 5' + locationMessage: '&9Frost Queen phase 5' +frost_palace_frost_queen_p6: + name: '$bossLevel &8Frost Queen phase 6' + locationMessage: '&9Frost Queen phase 6' +frost_palace_frost_queen_p7: + name: '$bossLevel &8Frost Queen phase 7' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Frost Queen was thawed!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&9Frost Queen phase 7' +frost_palace_reinforcement_1: + name: '$reinforcementLevel Spirit of Winter' +frost_palace_reinforcement_2: + name: '$reinforcementLevel Spirit of Spring' +frost_palace_reinforcement_3: + name: '$reinforcementLevel Spirit of Summer' +fulgora: + name: '$eventBossLevel &3Fulgora' + locationMessage: '&cFulgora: $distance blocks away!' + spawnMessage: '&cA mighty thunder goat has come!' + deathMessage: '&aFulgora was stopped by $players!' + escapeMessage: '&4Fulgora has left this place!' +gamma_werewolf: + name: '$reinforcementLevel &7Gamma Werewolf' +goblin_invader: + name: '$eventBossLevel &2Goblin Leader' + locationMessage: '&cGoblin Army: $distance blocks away!' + spawnMessage: '&cA Goblin Army has invaded this realm!' + deathMessage: '&aThe Goblin Army has been vanquished by $players!' + escapeMessage: '&4The Goblin Army is done with this realm!' +goblin_invader_summon_1: + name: '&2Goblin Warrior' +goblin_invader_summon_2: + name: '&2Goblin Fighter' +goblin_invader_summon_3: + name: '&2Goblin Trooper' +goblin_invader_summon_4: + name: '&2Goblin Reinforcements' +greedy_dwarf: + name: '$eventBossLevel &9Greedy Dwarf' + locationMessage: '&cGreedy Dwarf: $distance blocks away!' + spawnMessage: '&cCan you find the Greedy Dwarf digging somewhere underground?!' + deathMessage: '&aThe Greedy Dwarf was released of their curse by $players!' + escapeMessage: '&4The Greedy Dwarf had found their treasure and they left!' +gremlin_1: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + spawnMessage: '&cA Gremlin hoard has invaded this world!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_10: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_2: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_3: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_4: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_5: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_6: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_7: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_8: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_9: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +grunter: + name: '$eventBossLevel &aGrunter' + locationMessage: '&cGrunter: $distance blocks away!' + spawnMessage: '&cA mighty hog roams the lands.' + deathMessage: '&aGrunter was stopped by $players!' + escapeMessage: '&4Grunter has escaped!' +harmless_chicken: + name: '$eventBossLevel &fHarmless Chick' + locationMessage: '&cHarmless Chick: $distance blocks away!' + spawnMessage: '&cBwok!!! Cluck, Cluck! Bawk!' + deathMessage: '&aBaaaawk! Cluck...$players!' + escapeMessage: '&4Harmless Chicken has baaaaaawked away.' +harmless_chicken_summon: + name: '$eventBossLevel &fClucktector' +hog_rider: + name: '$eventBossLevel &6Hog Rider' + locationMessage: '&cHog Rider: $distance blocks away!' + spawnMessage: '&cA mighty Hog Rider has appeared!' + deathMessage: '&aThe Hog Rider and their Hog were vanquished by $players!' + escapeMessage: '&4The Hog Rider has vanished.' +hog_rider_mount: + name: '$eventBossLevel &eLoyal Hog' +hog_rider_p2: + name: '$eventBossLevel &6Hog Rider' + locationMessage: '&cHog Rider: $distance blocks away!' + deathMessage: '&aThe Hog Rider and their Hog were vanquished by $players!' + escapeMessage: '&4The Hog Rider has vanished.' +hog_rider_summon: + name: '$eventBossLevel &eLoyal Zob-Hog' +horde_champion: + name: '$eventBossLevel &cHorde Champion' + locationMessage: '&cUndead Horde Champion: $distance blocks away!' + spawnMessage: '&cAn undead horde approaches!' + deathMessage: '&aThe horde has been stopped by $players!.' + escapeMessage: '&4AThe undead horde has left!' +horrid_duplicator: + name: '$eventBossLevel &dHorrid Duplicator' + locationMessage: '&cHorrid Duplicator: $distance blocks away!' + spawnMessage: '&cAn endless foe has appeared!' + deathMessage: '&aThe Horrid Duplicator was slain by $players!' + escapeMessage: '&4The Horrid Duplicator has left!' +horrid_duplicator_summon: + name: '$eventBossLevel &dHorrid Duplicator' +horrid_duplicator_summon_1: + name: '$eventBossLevel &dHorrid Duplicator' +ice_fae: + name: '$eventBossLevel &bIce Fae' +imperial_bee_guard: + name: '$reinforcementLevel &eImperial Bee Soldier' +invasion_abducted_hoglin_leader: + name: '$normalLevel &8Abducted Hoglin Leader' +invasion_abducted_pillager_leader: + name: '$normalLevel &8Abducted Pillager Leader' +invasion_abducted_silverfish: + name: '$normalLevel &8Abducted Silverfish' +invasion_abducted_silverfish_leader: + name: '$normalLevel &8Abducted Silverfish' +invasion_abducted_zombie: + name: '$normalLevel &8Abducted Zombie' +invasion_abducted_zombie_leader: + name: '$normalLevel &8Abducted Zombie' +invasion_abductor: + name: '$normalLevel &6Abductor' +invasion_abudcted_pillager: + name: '$normalLevel &8Abducted Pillager' +invasion_analytic_thin_man_1: + name: '$normalLevel &8Analytic Thin Man' +invasion_analytic_thin_man_2: + name: '$normalLevel &8Analytic Thin Man' +invasion_analytic_thin_man_3: + name: '$normalLevel &8Analytic Thin Man' +invasion_analytic_thin_man_4: + name: '$normalLevel &8Analytic Thin Man' +invasion_ballistic_construct: + name: '$minibossLevel &fBallistic Construct' +invasion_convert: + name: '$normalLevel &6Convert' +invasion_energy_construct: + name: '$minibossLevel &fEnergy Construct' +invasion_fire_construct: + name: '$minibossLevel &fFire Construct' +invasion_genetically_modified_cow_phase_1: + name: '$minibossLevel &fGenetically Modified Cow' +invasion_genetically_modified_cow_phase_2: + name: '$minibossLevel &fGenetically Modified Cow' +invasion_gray_man_courthouse_phase_1: + name: '$minibossLevel &7Gray Man' +invasion_gray_man_courthouse_phase_2: + name: '$minibossLevel &7Gray Man' +invasion_green_man_hotel_phase_1: + name: '$bossLevel &2Green Man' +invasion_green_man_hotel_phase_2: + name: '$bossLevel &2Green Man' +invasion_green_man_hotel_phase_3: + name: '$bossLevel &2Green Man' + deathMessage: '&4The &2Green Man &4was vanquished by $players! That''s the end for this version of the map, the inside of the UFO is in the full version!' +invasion_green_man_spaceship_phase_1: + name: '$bossLevel &2Green Man' +invasion_green_man_spaceship_phase_2: + name: '$bossLevel &2Green Man' +invasion_green_man_spaceship_phase_3: + name: '$bossLevel &2Green Man' +invasion_green_man_spaceship_phase_4: + name: '$bossLevel &2Green Man' + deathMessages: + - '&e&l---------------------------------------------' + - '&2The Alien menace is no more!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' +invasion_ice_construct: + name: '$minibossLevel &fIce Construct' +invasion_merman: + name: '$normalLevel &6Merman' +invasion_merman_leader: + name: '$normalLevel &6Merman Leader' +invasion_otherwordly_ember: + name: '$normalLevel &6Otherworldly Ember' +invasion_psychic_apparition: + name: '$normalLevel &5Psychic Apparition' +invasion_psychic_clone: + name: '$reinforcementLevel &6Psychic Clone' +invasion_psychic_explosion: + name: '$reinforcementLevel &5Psychic Explosion' +invasion_psychic_summon_gold_boots: + name: '$reinforcementLevel &5Psychic Apparition' +invasion_psychic_summon_gold_pants: + name: '$reinforcementLevel &5Psychic Apparition' +invasion_psychic_summon_leather_hat: + name: '$reinforcementLevel &5Psychic Apparition' +invasion_shrieking_shulker: + name: '$normalLevel &8Shrieking Shulker' +invasion_thin_man: + name: '$normalLevel &8Thin Man' +killer_rabbit_of_caerbannog: + name: '$eventBossLevel &cKiller Rabbit of Caerbannog' +kraken: + name: '$eventBossLevel &3Kraken' +krampus: + name: '$eventBossLevel &1Krampus' + locationMessage: '&cKrampus: $distance blocks away!' + spawnMessage: '&cKrampus has come to punish the naughty!' + deathMessage: '&aKrampus has been sent back to his realm to by $players!.' + escapeMessage: '&4There was nobody to punish!' +large_hopper: + name: '$eventBossLevel &dLarge Hopper' + locationMessage: '&cLarge Hopper: $distance blocks away!' + spawnMessage: '&cA large beast is hopping around!' + deathMessage: '&aThe Large Hopper was stopped by $players!' + escapeMessage: '&4The Large Hopper has jumped out of this world!' +large_hopper_mount: + name: '$eventBossLevel &aHopper' +lightning_fae: + name: '$eventBossLevel &eLightning Fae' +living_shadow: + name: '$eventBossLevel &7Living Shadow' + locationMessage: '&cLiving Shadow: $distance blocks away!' + spawnMessage: '&cLiving Shadow has appeared! Do not look it in the yes!' + deathMessage: '&aLiving Shadow has been turned into Dead Shadow by $players!.' + escapeMessage: '&4The Living Shadow saw nothing so it left!' +meme_boss: + name: '&2The Maestro' +meme_boss_reinforcement: + name: '&cFan' +merman: + name: '$eventBossLevel &1Merman' + locationMessage: '&cMerman: $distance blocks away!' + spawnMessage: '&cA Merman swims the oceans!' + deathMessage: '&aThe Merman was slain by $players!' + escapeMessage: '&4The Merman has retreated.' +monster_of_the_deep: + name: '$eventBossLevel &bMonster of the Deep' + locationMessage: '&cMonster of the Deep: $distance blocks away!' + spawnMessage: '&cSomething terrible swims the oceans!' + deathMessage: '&aMonster of the Deep has been slain by $players!' + escapeMessage: '&4The oceans are once again safe!' +moon_spider: + name: '$eventBossLevel &fMoon Spider' + locationMessage: '&cMoon Spider: $distance blocks away!' + spawnMessage: '&cA powerful arachnid has been spotted!' + deathMessage: '&aThe Moon Spider was slain by $players!' + escapeMessage: '&4The Moon Spider has left!' +moon_spider_summon: + name: '&fSilk Mender' +necromancer: + name: '$eventBossLevel &7Necromancer' + locationMessage: '&cNecromancer: $distance blocks away!' + spawnMessage: '&cA powerful evil Necromancer has entered this world!' + deathMessage: '&aThe Necromancer is no more thanks to $players!' + escapeMessage: '&4The Necromancer has disappeared.' +necromancer_summon_1: + name: '$eventBossLevel &fFiery Bones' +necromancer_summon_2: + name: '$eventBossLevel &bChilled Bones' +necromancer_summon_3: + name: '$eventBossLevel &8Charred Bones' +necronomicon_skeleton: + name: '$reinforcementLevel &7Tengkorak Bangkit' +necronomicon_zombie: + name: '$reinforcementLevel &7Zombie Bangkit' +netherite_golem: + name: '$eventBossLevel &8Netherite Golem' + locationMessage: '&cNetherite Golem: $distance blocks away!' + spawnMessage: '&cAn ancient golem has entered this world!' + deathMessage: '&aThe Netherite Golem was slain by $players!' + escapeMessage: '&4The Netherite Golem has left this world!' +nether_escapee: + name: '$eventBossLevel &6Nether Escapee' + locationMessage: '&cNether Escapee: $distance blocks away!' + spawnMessage: '&cA terrible foe has escaped the nether!' + deathMessage: '&aThe Nether Escapee was sent back to the nether by $players!' + escapeMessage: '&4The Nether Escapee has left this place!' +nether_hag: + name: '$eventBossLevel &4Nether Hag' + locationMessage: '&cNether Hag: $distance blocks away!' + spawnMessage: '&cAn evil hag walks the nether!' + deathMessage: '&aThe Nether Hag was slain by $players!' + escapeMessage: '&4The Nether Hag has vanished!' +nether_wasp: + name: '$eventBossLevel &6Nether Wasp' + locationMessage: '&cNether Wasp: $distance blocks away!' + spawnMessage: '&cTry not to get stung, a wasp roams the nether!' + deathMessage: '&aThe Nether Wasp was slain by $players!' + escapeMessage: '&4The Nether Wasp has decided to buzz off!' +nether_wasp_summon_1: + name: '$eventBossLevel &cHive Summoner' +nether_wasp_summon_2: + name: '$eventBossLevel &cHive Wasp' +nightwing: + name: '$eventBossLevel &cNightwing' + locationMessage: '&cNightwing: $distance blocks away!' + spawnMessage: '&cA bird of the night has appeared!' + deathMessage: '&aNightwing was stopped by $players!' + escapeMessage: '&4Nightwing has flown home.' +nightwing_summon: + name: '$eventBossLevel &cSmart Bomb' +nightwing_summon_1: + name: '$eventBossLevel &cSworn Protector' +night_crawler: + name: '$eventBossLevel &4Night Crawler' + locationMessage: '&cNight Crawler: $distance blocks away!' + spawnMessage: '&cSomething awful is crawling about!' + deathMessage: '&aThe Night Crawler has been slain by $players!' + escapeMessage: '&4The Night Crawler Undead has left!' +night_horder: + name: '$eventBossLevel &aNight Horder' + locationMessage: '&cNight Horder: $distance blocks away!' + spawnMessage: '&cA Night Horder has appeared! Slay him to loot his booty!' + deathMessage: '&aThe Night Horder has been plundered by $players!' + escapeMessage: '&4The Night Horder has escaped!' +oasis_10_old_bones: + name: '$normalLevel &fOld Bones' +oasis_10_surreptitious_scribe: + name: '$minibossLevel &7Surreptitious Scribe' +oasis_12_entombed_tenant: + name: '$normalLevel &7Entombed Tenant' +oasis_12_entombed_tenant_p2: + name: '$normalLevel &7Entombed Tenant' +oasis_12_sinister_siren: + name: '$minibossLevel &5Sinister Siren' +oasis_14_gnarly_grimace: + name: '$normalLevel &8Gnarly Grimace' +oasis_14_undead_drifter: + name: '$normalLevel &1Undead Drifter' +oasis_16_lesser_sentinel: + name: '$normalLevel &9Lesser Sentinel' +oasis_16_magical_magus: + name: '$normalLevel &3Magical Magus' +oasis_16_rancid_roamer: + name: '$normalLevel &8Rancid Roamer' +oasis_18_sly_sharpshooter: + name: '$normalLevel &eSly Sharpshooter' +oasis_18_stout_thaumaturge: + name: '$normalLevel &5Stout Thaumaturge' +oasis_18_tricky_treasure_hoarder: + name: '$normalLevel &dTricky Treasure Hoarder' +oasis_20_scheming_scribe: + name: '$minibossLevel &7Scheming Scribe' +oasis_20_septic_scribe: + name: '$minibossLevel &7Septic Scribe' +oasis_20_vampiric_sorcerer: + name: '$bossLevel &cVampiric Sorcerer' +oasis_20_wrapped_wraith: + name: '$normalLevel &8Wrapped Wraith' +oasis_20_wrapped_wraith_p2: + name: '$normalLevel &8Wrapped Wraith' +oasis_25_vampiric_warlock: + name: '$bossLevel &4Vampiric Warlock' +oasis_25_warlocks_spirit_summon: + name: '$reinforcementLevel &cWarlocks Spirit' +oasis_26_adept_sentinel: + name: '$normalLevel &1Adept Sentinel' +oasis_26_grim_grovetender: + name: '$normalLevel &aGrim Grovetender' +oasis_26_precarious_sniper: + name: '$normalLevel &3Precarious Sniper' +oasis_26_superior_sharpshooter: + name: '$normalLevel &3Superior Sharpshooter' +oasis_28_perilous_prophet: + name: '$normalLevel &3Perlious Prophet' +oasis_28_treacherous_treasure_hoarder: + name: '$normalLevel &dTreacherous Treasure Hoarder' +oasis_2_haunted_hauler: + name: '$normalLevel &9Haunted Hauler' +oasis_30_forsaken_soul: + name: '$reinforcementLevel &0Forsaken Soul' +oasis_30_lost_soul: + name: '$normalLevel Lost Soul' +oasis_30_parlous_preist: + name: '$minibossLevel &bParlous Preist' +oasis_30_seeker_of_the_staid: + name: '$normalLevel &cSeeker of the Staid' +oasis_30_wimpy_louse: + name: '$reinforcementLevel &8Loathing Louse' +oasis_32_loathing_louse: + name: '$normalLevel &8Loathing Louse' +oasis_32_skeletal_sniper: + name: '$normalLevel &9Skeletal Sniper' +oasis_34_grizly_grimace: + name: '$normalLevel &8Gnarly Grimace' +oasis_34_gruesome_grimace: + name: '$normalLevel &8Gruesome Grimace' +oasis_35_ice_eidolon: + name: '$reinforcementLevel &9Ice Eidolon' +oasis_35_light_of_darkness: + name: '$minibossLevel &9Light of Darkness' +oasis_36_cruel_cultist: + name: '$normalLevel &3Cruel Cultist' +oasis_36_cultists_cretins: + name: '$reinforcementLevel &3Cruel Cultist' +oasis_36_cultists_cretins_drowned: + name: '$reinforcementLevel &3Cruel Cultist' +oasis_36_dexterous_sentinel: + name: '$normalLevel &9Dexterous Sentinel' +oasis_36_grudging_grovetender: + name: '$normalLevel &aGrudging Grovetender' +oasis_36_parlous_sniper: + name: '$normalLevel &3Parlous Sniper' +oasis_36_rueful_roamer: + name: '$normalLevel &8Rueful Roamer' +oasis_36_spectral_magus: + name: '$normalLevel &3Spectral Magus' +oasis_38_poisonous_perch: + name: '$normalLevel &3Poisonous Perch' +oasis_38_traitorous_treasure_hoarder: + name: '$normalLevel &dTraitorous Treasure Hoarder' +oasis_40_chief_cultist: + name: '$minibossLevel &5Chief Cultist' +oasis_40_louse_lord: + name: '$minibossLevel &8Louse Lord' +oasis_40_pharaohs_scribe: + name: '$minibossLevel &7Pharaoh''s Scribe' +oasis_40_skeletal_stiff: + name: '$normalLevel &9Skeletal Stiff' +oasis_40_soaked_sacrifice: + name: '$reinforcementLevel &1Soaked Sacrifice' +oasis_40_solar_flare: + name: '$reinforcementLevel &eSolar Flare' +oasis_42_hexed_hauler: + name: '$normalLevel &9Hexed Hauler' +oasis_42_skeletal_sharpshooter: + name: '$normalLevel &9Skeletal Sharpshooter' +oasis_42_tyranical_treasure_hoarder: + name: '$normalLevel &dTyranical Treasure Hoarder' +oasis_42_tyranical_treasure_hoarder_phase_2: + name: '$normalLevel &dTyranical Treasure Hoarder' +oasis_45_golden_cast_autonomation: + name: '$reinforcementLevel &6Golden Cast Autonomation' +oasis_45_monumental_monstrosity: + name: '$bossLevel &bMonumental Monstrosity' +oasis_45_monumental_monstrosity_phase_2: + name: '$bossLevel &bMonumental Monstrosity' +oasis_45_monumental_monstrosity_phase_3: + name: '$bossLevel &6Monumental Monstrosity' +oasis_45_monumental_monstrosity_phase_4: + name: '$bossLevel &bMonumental Monstrosity' +oasis_45_oracle_of_knowledge: + name: '$minibossLevel &0Oracle of Knowledge' +oasis_45_shadow_of_knowledge_summon: + name: '$reinforcementLevel &8Shadow of Knowledge' +oasis_45_the_beacon: + name: '$minibossLevel &6The Beacon' +oasis_45_the_beacon_phase_2: + name: '$minibossLevel &6The Beacon' +oasis_45_the_beacon_phase_3: + name: '$minibossLevel &6The Beacon' +oasis_45_the_beacon_phase_4: + name: '$minibossLevel &6The Beacon' +oasis_46_pharaohs_sentinel: + name: '$normalLevel &9Pharaoh''s Sentinel' +oasis_4_cursed_desert_dweller: + name: '$normalLevel &eCursed Desert Dweller' +oasis_4_grotesque_grimace: + name: '$normalLevel &8Grotesque Grimace' +oasis_4_swamp_rat: + name: '$normalLevel &6Swamp Rat' +oasis_50_moneychanger_arrow: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_arrow_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_blindness: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_blindness_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_fire: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_fire_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_freeze: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_freeze_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_knockback: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_knockback_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_poison: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_poison_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_wither: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_wither_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_pharaohs_royal_guard: + name: '$reinforcementLevel &8Pharaoh''s Royal Guard' +oasis_50_the_foundry: + name: '$bossLevel &4The Foundry' +oasis_50_the_foundry_phase_2: + name: '$bossLevel &4The Foundry' +oasis_55_pharaoh_of_pestilence: + name: '$bossLevel &0Pharaoh of Pestilence' +oasis_6_dry_bones: + name: '$normalLevel &fDry Bones' +oasis_6_rotten_roamer: + name: '$normalLevel &8Rotten Roamer' +oasis_8_mythical_magus: + name: '$normalLevel &3Mythical Magus' +oasis_8_tough_thaumaturge: + name: '$normalLevel &5Tough Thaumaturge' +oasis_8_troublesome_treasure_hoarder: + name: '$normalLevel &dTroublesome Treasure Hoarder' +okami: + name: '$eventBossLevel &cOkami' + locationMessage: '&cOkami: $distance blocks away!' + spawnMessage: '&cA god has awakened!' + deathMessage: '&a$players has fought with a god and won!.' + escapeMessage: '&4Okami has left!' +okami_p2: + name: '$eventBossLevel &cOkami' +okami_p3: + name: '$eventBossLevel &cOkami' +omega_wolf: + name: '$reinforcementLevel &7Omega Wolf' +pillager_caravan_beast: + name: '$reinforcementLevel &cCaravan Beast' +pillager_caravan_guard: + name: '$reinforcementLevel &cCaravan Guard' +pillager_caravan_leader: + name: '$eventBossLevel &cPillager Caravan Leader' + locationMessage: '&cPillager Caravan: $distance blocks away!' + spawnMessage: '&cA pillager caravan has been sighted!' +primis_acolyte_brute: + name: '$normalLevel &bAcolyte Brute' +primis_acolyte_forest_brute: + name: '$normalLevel &bElf Bandit Brute' +primis_acolyte_forest_brute_with_watch: + name: '$normalLevel &bElf Bandit Brute' +primis_acolyte_forest_sharpshooter: + name: '$normalLevel &bElf Bandit Ranger' +primis_acolyte_forest_summoner: + name: '$normalLevel &bElf Bandit Summoner' +primis_acolyte_forest_summoner_heirloom_guardian: + name: '$normalLevel &bElf Bandit Mage' +primis_acolyte_guard_1: + name: '$normalLevel &bAcolyte Guard' + onDamagedMessages: + - You can't enter! + - The mage won't allow this! + - Leave this place! + - The mage protects this place! + - Foolishness! + - Begone! + deathMessage: '[Acolyte Guard] You are blind to the truth, the tower''s mage sees all!' +primis_acolyte_guard_2: + name: '$normalLevel &bAcolyte Guard' + onDamagedMessages: + - You can't enter! + - The mage won't allow this! + - Leave this place! + - The mage protects this place! + - Foolishness! + - Begone! + deathMessage: '[Acolyte Guard] You shall not pass, the mage in the tower will not allow it!' +primis_acolyte_sharpshooter: + name: '$normalLevel &bAcolyte Ranger' +primis_aggressive_llama: + name: '$normalLevel &6Aggressive LLama' +primis_angry_goat: + name: '$normalLevel &6Angry Goat' +primis_beta_feral_wolf: + name: '$reinforcementLevel &8Beta Feral Wolf' +primis_blood_temple_blood_golem: + name: '$normalLevel &cBlood Golem' +primis_blood_temple_charred_construct: + name: '$normalLevel &cCharred Construct' +primis_blood_temple_conjured_flame: + name: '$normalLevel &cConjured Flame' +primis_blood_temple_eradicator: + name: '$normalLevel &cEradicator' +primis_blood_temple_fire_conjurer: + name: '$normalLevel &cFire Conjurer' +primis_blood_temple_flame_elemental: + name: '$normalLevel &cFlame Elemental' +primis_catacomb_nemus_to_redwood_archer: + name: '$normalLevel &8Catacomb Archer' +primis_catacomb_nemus_to_redwood_golem: + name: '$normalLevel &bCatacomb Golem' +primis_catacomb_nemus_to_redwood_necromancer: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_nemus_to_redwood_necromancer_p1: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_nemus_to_redwood_necromancer_p2: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_nemus_to_redwood_soul_reinforcement: + name: '$reinforcementLevel &8Catacomb Soul' +primis_catacomb_nemus_to_redwood_swordsman: + name: '$normalLevel &8Catacomb Swordsman' +primis_catacomb_pontis_to_ice_archer: + name: '$normalLevel &8Catacomb Archer' +primis_catacomb_pontis_to_ice_golem: + name: '$normalLevel &bCatacomb Golem' +primis_catacomb_pontis_to_ice_necromancer_p1: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_pontis_to_ice_necromancer_p2: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_pontis_to_ice_swordsman: + name: '$normalLevel &8Catacomb Swordsman' +primis_catacomb_trio_archer: + name: '$normalLevel &8Catacomb Archer' +primis_catacomb_trio_golem: + name: '$normalLevel &bCatacomb Golem' +primis_catacomb_trio_necromancer_p1: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_necromancer_p2: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_necromancer_summon: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_swordsman: + name: '$normalLevel &8Catacomb Swordsman' +primis_crazed_rabbit: + name: '$normalLevel &cCrazed Rabbit' +primis_crystaline_summoner_p1: + name: '$normalLevel &3Crystaline Summoner' +primis_crystaline_summoner_p2: + name: '&3Crystaline Summoner' +primis_earth_temple_golem: + name: '$normalLevel &fAnimated Clay' +primis_emerald_eater: + name: '$normalLevel &aEmerald Eater' +primis_farmstead_lighthouse_keeper: + name: '$bossLevel &6The Lighthouse Keeper' + questLore: + - Something is deeply wrong with my husband. + - He used to be a loving and caring husband and father, + - but in recent times he has been focusing on documents he found in the basement. + - He said it was for important research, something that could change the world. + - I should've told him to stop when I saw how obsessed he was becoming. + - He did... something... to the lighthouse - and + - I fear the lighthouse has done something to him, too. + - It morphed him into some kind of monster. He no longer recognizes us, + - and has even attacked us when we tried to approach him. + - At night, we can't sleep due to the wailing sounds + - coming from the &dLighthouse's Basement&f. + - He is suffering, and we are powerless to help him. + - I know it's asking a lot, but do you think you could help us? + questAcceptDialog: + - '&a[Amavit]&f Thank you so much for accepting our request. I hope with all my heart you succeed.' + - '&7&oI should go to the &dBasement of the Lighthouse&7&o and put the &cLighthouse Keeper&7&o out of his misery.' + questCompleteMessage: + - '&a[Amavit]&f I heard it - so it is done? Did he suff- no, forget it, I don''t want to know.' + - '&fIt seems like the lighthouse started emitting an odd light when you... dealt with the issue. We need to make sure it is not an issue.' + - '&7&oSeems like &aAmavit&7&o has another task for me. I should talk to her.' +primis_feral_alpha_wolf: + name: '$normalLevel &8Feral Alpha Wolf' +primis_feral_wolf: + name: '$normalLevel &8Feral Wolf' +primis_feral_wolf_scout: + name: '$normalLevel &8Feral Wolf Scout' +primis_gladius_admiral: + name: '$normalLevel &fInvading Admiral' +primis_gladius_assassin: + name: '$normalLevel &fInvading Assassin' +primis_gladius_barkeep_p1: + name: '$minibossLevel &6The Barkeep' +primis_gladius_barkeep_p2: + name: '$minibossLevel &6The Barkeep' +primis_gladius_captain: + name: '$normalLevel &fInvading Captain' +primis_gladius_champion_p1: + name: '$bossLevel &6Fallen Champion Natus' +primis_gladius_champion_p2: + name: '$bossLevel &6Fallen Champion Natus' +primis_gladius_gatekeeper_p1: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_gatekeeper_p2: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_gatekeeper_pontis_p1: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_gatekeeper_pontis_p2: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_longbowman: + name: '$normalLevel &fInvading Longbowman' +primis_gladius_mariner: + name: '$normalLevel &fInvading Mariner' +primis_gladius_mariner_quest: + name: '$normalLevel &fInvading Mariner' +primis_gladius_monk_p1: + name: '$minibossLevel &6The Monk' +primis_gladius_monk_p2: + name: '$minibossLevel &6The Monk' +primis_gladius_raider: + name: '$normalLevel &fInvading Raider' +primis_gladius_swordsman: + name: '$normalLevel &fInvading Swordsman' +primis_gladius_undead_buccaneer: + name: '$normalLevel &fUndead Buccaneer' +primis_gladius_undead_captain: + name: '$minibossLevel &fUndead Captain' +primis_gladius_undead_swashbuckler: + name: '$normalLevel &fUndead Swashbuckler' +primis_gladius_underlord: + name: '$minibossLevel &0Underlord' +primis_gladius_villager: + name: '$normalLevel &fUndead Villager' +primis_goblin_fowl_warrior: + name: '$minibossLevel &6Cursed Fowl Goblin' +primis_goblin_grunt: + name: '$normalLevel &6Goblin Grunt' +primis_goblin_king: + name: '$bossLevel &2Goblin King' +primis_goblin_piranah: + name: '$normalLevel &9Goblin Piranah' +primis_goblin_spearman: + name: '$normalLevel &6Goblin Spearman' +primis_goblin_warrior: + name: '$normalLevel &6Goblin Warrior' +primis_ice_mage: + name: '$minibossLevel &9Ice Mage' +primis_ice_mage_p2: + name: '$minibossLevel &bIce Mage' + deathMessage: '&8&oYou hear the sound of a nearby ice wall cracking and breaking...' +primis_ice_village_annoyed_goat: + name: '$normalLevel &bAnnoyed Goat' +primis_ice_village_bell_banger: + name: '$minibossLevel &6Undead' + questLore: + - Do you see that? There, look at that bell + - tower in the village. + - You see it too, right? The feller there + - banging his head on the bell. + - I am pretty sure that's what's going on, + - unless my vision is failing me. + - Could you go investigate and report back + - to me what you found. + questAcceptDialog: + - '&a[Eleusium Festus]&f What is going on...' + - '&7&oI should go see what is happening at the &d&oIce Village Bell Tower&7&o.' + questCompleteMessage: + - '&a[Eleusium Festus]&f You found an undead banging their head on the bell...' + - Well now I have heard it all... +primis_ice_village_escaped_prisoner: + name: '$normalLevel &bEscaped Prisoner' +primis_ice_village_fallen_trial_warrior_summon: + name: '$reinforcementLevel &7Enslaved Soul' +primis_ice_village_frost_fur_ursus: + name: '$normalLevel &9Frost Fur Ursus' +primis_ice_village_frost_simulacrum: + name: '$normalLevel &3Frost Simulacrum' +primis_ice_village_ice_simulacrum: + name: '$reinforcementLevel &3Ice Simulacrum' +primis_ice_village_manifested_nightmare: + name: '$normalLevel &bManifested Nightmare' +primis_ice_village_meek_customer: + name: '$normalLevel &cMeek Customer' +primis_ice_village_naughty_customer: + name: '$normalLevel &cNaughty Customer' +primis_ice_village_screecher_bomb_summon: + name: '$reinforcementLevel &dScreecher Droppings' +primis_ice_village_sky_screecher: + name: '$normalLevel &bSky Screecher' +primis_ice_village_the_ice_aspect: + name: '$minibossLevel &9Ice Aspect' +primis_ice_village_the_ice_elemental: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_the_ice_elemental_p2: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_the_ice_elemental_p3: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_trial_of_ice_minor_ice_elemental: + name: '$minibossLevel &bMinor Ice Elemental' +primis_ice_village_wolf_summon: + name: '$reinforcementLevel &cTamed Wolf' +primis_minor_ice_elemental: + name: '$bossLevel &1Minor Ice Elemental' +primis_minor_ice_elemental_p2: + name: '$bossLevel &1Minor Ice Elemental' +primis_mountain_pass_guardian_p1: + name: '$bossLevel &6The Guardian' +primis_mountain_pass_guardian_p2: + name: '$bossLevel &6The Guardian' +primis_mountain_pass_healer: + name: '$reinforcementLevel &fRepairtron' +primis_nasty_worm: + name: '$normalLevel &fNasty Worm' +primis_ogre_mines_mite: + name: '$normalLevel &fMine Mite' +primis_ogre_mines_ogre_archer: + name: '$minibossLevel &fOgre Archer' +primis_ogre_mines_ogre_magi: + name: '$minibossLevel &fOgre Magi' +primis_ogre_mines_ogre_warrior: + name: '$minibossLevel &fOgre Warrior' +primis_ogre_mines_undead_archer: + name: '$normalLevel &fUndead Archer' +primis_ogre_mines_undead_swordsman: + name: '$normalLevel &fUndead Swordsman' +primis_pontis_beast_cod: + name: '$minibossLevel &dBeast Cod Furiosa' +primis_pontis_beast_crawler: + name: '$minibossLevel &dCrawler Beast Megdun' +primis_pontis_beast_impaler: + name: '$minibossLevel &dImpaler Beast Uladzimir' +primis_pontis_counselor_guard_left_1: + name: '$normalLevel &4Corrupt Counselor Guard' +primis_pontis_counselor_guard_left_2: + name: '$normalLevel &4Warped Counselor Guard' + deathMessage: '&5[Counselor Machiavelli]&f So that fool must have finally figured it out...' +primis_pontis_counselor_guard_left_3: + name: '$normalLevel &4Uplifted Experiment' + deathMessage: '&5[Counselor Machiavelli]&f You''re stronger than I thought.' +primis_pontis_counselor_guard_left_4: + name: '$normalLevel &4Abomination' + deathMessage: '&5[Counselor Machiavelli]&f My soul magic will protect me!!!' +primis_pontis_counselor_guard_mid: + name: '$normalLevel &4Corrupt Counselor Guard' + deathMessage: '&8[Counselor Machiavelli]&f I see that we have guests!...' +primis_pontis_counselor_guard_right_1: + name: '$normalLevel &4Corrupt Counselor Guard' +primis_pontis_counselor_guard_right_2: + name: '$normalLevel &4Warped Counselor Guard' +primis_pontis_counselor_guard_right_3: + name: '$normalLevel &4Uplifted Experiment' +primis_pontis_counselor_guard_right_4: + name: '$normalLevel &4Abomination' +primis_pontis_counselor_twisted_copy: + name: '$reinforcementLevel &4Twisted Copy' +primis_pontis_mille_arena_air_elemental: + name: '$minibossLevel &fAir Elemental' +primis_pontis_mille_arena_human_wave_4: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_6: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_7: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_8: + name: '$normalLevel &4Dominated Human Warrior' +primis_pontis_mille_arena_human_worshiper: + name: '$normalLevel &4Elemental Worshiper' +primis_pontis_mille_arena_minor_air_elemental: + name: '$normalLevel &fMinor Air Elemental' +primis_pontis_mille_arena_minor_earth_elemental: + name: '$normalLevel &7Minor Earth Elemental' +primis_pontis_mille_arena_minor_fire_elemental: + name: '$normalLevel &eMinor Fire Elemental' +primis_pontis_mille_arena_minor_fire_elemental_prime: + name: '$normalLevel &eMinor Fire Elemental' +primis_pontis_mille_arena_minor_water_elemental: + name: '$normalLevel &bMinor Water Elemental' +primis_pontis_mille_arena_primal_air_wisp: + name: '$normalLevel &fPrimal Air Wisp' +primis_pontis_mille_arena_primal_air_wisp_2: + name: '$normalLevel &fPrimal Air Wisp' +primis_pontis_mille_arena_primal_earth_wisp: + name: '$normalLevel &7Primal Earth Wisp' +primis_pontis_mille_arena_primal_earth_wisp_2: + name: '$normalLevel &7Primal Earth Wisp' +primis_pontis_mille_arena_primal_fire_wisp: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_fire_wisp_2: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_fire_wisp_3: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_water_wisp: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_water_wisp_2: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_water_wisp_3: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_wisp: + name: '$normalLevel &5Primal Wisp' +primis_pontis_mille_arena_water_elemental: + name: '$minibossLevel &1Water Elemental' +primis_pontis_mille_counselor_p1: + name: '$minibossLevel &fCounselor Machiavelli' +primis_pontis_mille_counselor_p2: + name: '$minibossLevel &fCounselor Machiavelli' +primis_pontis_mille_counselor_p3: + name: '$minibossLevel &fCounselor Machiavelli' +primis_pontis_mille_fields_babe_razorback: + name: '$normalLevel &2Babe Razorback' +primis_pontis_mille_fields_bird: + name: '$normalLevel &fFeathered Field Rat' +primis_pontis_mille_fields_bird_nightmare: + name: '$normalLevel &dFeathered Nightmare Rat' +primis_pontis_mille_fields_bubba: + name: '$minibossLevel &cBig ol'' Bubba' +primis_pontis_mille_fields_field_rat: + name: '$normalLevel &fField Rat' +primis_pontis_mille_fields_juvenile_razorback: + name: '$normalLevel &2Juvenile Razorback' +primis_pontis_mille_fields_longhorn: + name: '$normalLevel &4Fields Longhorn' +primis_pontis_mille_fields_mature_razorback: + name: '$normalLevel &2Mature Razorback' +primis_pontis_mille_fields_shorthorn: + name: '$normalLevel &6Fields Shorthorn' +primis_pontis_mille_fields_two_legged_terror: + name: '$normalLevel &2Two Legged Terror' +primis_pontis_mille_fields_well_fed_rat: + name: '$normalLevel &fWell Fed Rat' +primis_pontis_mille_rat: + name: '$normalLevel &fRat' +primis_quartz_elemental: + name: '$bossLevel &dQuartz Elemental' +primis_quartz_elemental_p2: + name: '$bossLevel &dQuartz Elemental' +primis_redwood_barracuda: + name: '$normalLevel &3Redwood Barracuda' +primis_redwood_fruity_hound: + name: '$normalLevel &2Fruity Hound' +primis_redwood_rockhound: + name: '$normalLevel &7Redwood Rockhound' +primis_redwood_werewolf_grunt: + name: '$normalLevel &cRedwood Werewolf Grunt' +primis_redwood_werewolf_packleader: + name: '$normalLevel &4Redwood Werewolf Packleader' +primis_river_guardian: + name: '$normalLevel &5River Guardian' +primis_roofed_forest_cave_spider: + name: '$normalLevel &6Nest Crawler' +primis_roofed_forest_cave_spider_boss: + name: '$bossLevel &eBrood Mother' +primis_roofed_forest_spider: + name: '$normalLevel &6Forest Crawler' +primis_roofed_forest_spider_reinforcement: + name: '$reinforcementLevel &6Nest Brood' +primis_sea_monster: + name: '$bossLevel &dSea Monster' +primis_sewer_noxious_ninja: + name: '$normalLevel &2Noxious Ninja' +primis_sewer_spore_spreader: + name: '$normalLevel &4Spore Spreader' +primis_sewer_the_shredder_p1: + name: '$bossLevel &5The Shredder' +primis_sewer_the_shredder_p2: + name: '$bossLevel &5The Shredder' +primis_storm_temple_axeman: + name: '$normalLevel &dStorm Temple Axeman' +primis_storm_temple_bowman: + name: '$normalLevel &dStorm Temple Bowman' +primis_storm_temple_kuzco: + name: '$normalLevel &6Kuzco' +primis_storm_temple_minor_storm_elemental: + name: '$normalLevel &5Minor Storm Elemental' +primis_storm_temple_storm_elemental: + name: '$bossLevel &1Storm Elemental' +primis_storm_temple_storm_elemental_p2: + name: '$bossLevel &1Storm Elemental' +primis_storm_temple_storm_elemental_p3: + name: '$bossLevel &1Storm Elemental' +primis_storm_temple_summoner: + name: '$normalLevel &5Storm Temple Summoner' +primis_terravilla_alpha_razorback: + name: '$minibossLevel &2Alpha Razorback' +primis_terravilla_alpha_razorback_p2: + name: '$minibossLevel &2Alpha Razorback' +primis_terravilla_bar_brawler: + name: '$normalLevel &6Bar Brawler' + onDamagedMessages: + - That all ya got! + - I did not even feel that! + - Why...you! + - I will show you! + - Who the heck are you! + - TAKE THAT! +primis_terravilla_earth_elemental: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_earth_elemental_p2: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_earth_elemental_p3: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_regular_fish: + name: '$normalLevel &bRegular Fish' +primis_terravilla_robber_gladiator: + name: '$normalLevel &bRobber Gladiator' +primis_terravilla_robber_slugger: + name: '$normalLevel &bSlugger' +primis_undead_archer: + name: '$normalLevel &fUndead Archer' +primis_undead_climber: + name: '$normalLevel &0Undead Climber' +primis_undead_grappler: + name: '$normalLevel &3Undead Grappler' +primis_undead_guardian: + name: '$normalLevel &bUndead Guardian' +primis_undead_swordsman: + name: '$normalLevel &0Undead Swordsman' +pufferfish: + name: '$eventBossLevel &3Pufferfish' + locationMessage: '&cPufferfish: $distance blocks away!' + spawnMessage: '&cA puffed fish is swimming in the oceans!' + deathMessage: '&aThe Pufferfish reign has been ended by $players!' + escapeMessage: '&4The Pufferfish has swam away!' +pufferfish_summon_1: + name: '$eventBossLevel &bPooferfish' +pufferfish_summon_2: + name: '$eventBossLevel &bPooperfish' +pufferfish_summon_3: + name: '$eventBossLevel &bPooderfish' +pufferfish_summon_4: + name: '$eventBossLevel &bPudderfish' +queen_bee: + name: '$eventBossLevel &6Queen Bee' +rabbit_wolf_1: + name: '$eventBossLevel &cFlame Wolf' + locationMessage: '&cFlame: $distance blocks away!' + spawnMessage: '&cA powerful duo has come to this world!' + deathMessage: '&aThe Wolf and the Rabbit were stopped by $players!' + escapeMessage: '&4The Wolf and the Rabbit have left this place!' +rabbit_wolf_2: + name: '$eventBossLevel &cLightning Rabbit' + locationMessage: '&cLightning: $distance blocks away!' + deathMessage: '&aThe Wolf and the Rabbit were stopped by $players!' + escapeMessage: '&4The Wolf and the Rabbit have left this place!' +raug: + name: '$reinforcementLevel &4Raug' +regular_hoglin: + name: '$eventBossLevel &4Regular Hoglin' + locationMessage: '&cRegular Hoglin: $distance blocks away!' + spawnMessage: '&cA Regular Hoglin has arrived! Nothing special about this Hoglin!' + deathMessage: '&aRegular Hoglin was slain by $players!.' + escapeMessage: '&4The Regular Hoglin has left!' +rotting_diver: + name: '$eventBossLevel &bRotting Diver' + locationMessage: '&cRotting Diver: $distance blocks away!' + spawnMessage: '&cA foul corpse floats in the waters!' + deathMessage: '&aThe Rotting Diver was sent to the depths by $players!' + escapeMessage: '&4The Rotting Diver floated away!' +salty_corpse: + name: '$eventBossLevel &bSalty Corpse' + locationMessage: '&cSalty Corpse: $distance blocks away!' + spawnMessage: '&cSomething awful has floated up to the surface!' + deathMessage: '&aThe Salty Corpse was sent back to the depths by $players!' + escapeMessage: '&4The Salty Corpse has left!' +skeleton_knight: + name: '$eventBossLevel &fSkeleton Knight' + locationMessage: '&cSkeleton Knight: $distance blocks away!' + spawnMessage: '&cThe undead have sent a Skeleton Knight into the night!' + deathMessage: '&aThe Skeleton Knight was slain by $players!' + escapeMessage: '&4The Skeleton Knight had to retreat!' +sky_archer: + name: '$eventBossLevel &aSky Archer' + locationMessage: '&cSky Archer: $distance blocks away!' + spawnMessage: '&cA Sky Archer has entered this world! Bring your bow!' + deathMessage: '&aThe Sky Archer got sniped by $players!' + escapeMessage: '&4The Sky Archer has flown away!' +sky_archer_mount: + name: '$eventBossLevel &aSky Steed' +smallstack: + name: '$eventBossLevel &bSmallstack Top' + locationMessage: '&cSmallstack: $distance blocks away!' + spawnMessage: '&cA Smallstack is roaming the wilds!' + deathMessage: '&aThe Smallstack was unstacked by $players!' + escapeMessage: '&4The Smallstack has left!' +smallstack_1: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_2: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_3: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_4: + name: '$eventBossLevel &bSmallstack Bottom' +smallstack_5: + name: '$eventBossLevel &bSmallstack Bottom' +smallstack_6: + name: '$eventBossLevel &bSmallstack Carrier' +snoopy: + name: '&6{&4☠&6} &fSnoopy' + onDamageMessages: + - Woof! + onDamagedMessages: + - Woof! + spawnMessage: '&aSnoopy yang sangat langka telah terlihat!' +sorcerer_supreme: + name: '$eventBossLevel &5Sorcerer Supreme' + locationMessage: '&cSorcerer Supreme: $distance blocks away!' + spawnMessage: '&cAn almighty Sorcerer has phased into this world!' + deathMessage: '&aThe Sorcerer Supreme was defeated by $players!' + escapeMessage: '&4The Sorcerer Supreme has left this world!' +sorcerer_supreme_summon: + name: '$eventBossLevel &5Eternal Servant' +spider_knight: + name: '$eventBossLevel &aDwarven Knight' + locationMessage: '&cDwarven Knight: $distance blocks away!' + spawnMessage: '&cA Knight has come to challenge the heroes of this place!' + deathMessage: '&aThe Knight was defeated by $players!' + escapeMessage: '&4The Knight has left this place!' +spider_knight_mount: + name: '$eventBossLevel &aFaithful Steed' +summonable_wolf: + name: '$normalLevel Wolfy' + onDamageMessages: + - Woof! + onDamagedMessages: + - Woof! +super_mite: + name: '$eventBossLevel &dSuper Mite' + locationMessage: '&cSuper Mite: $distance blocks away!' + spawnMessage: '&cA trouble maker appears!' + deathMessage: '&aThe mite could not handle a fight with $players!.' + escapeMessage: '&4The Super Mite left out of boredom!' +super_mite_summon: + name: '$eventBossLevel &dFriendmite' +suspicious_phantom: + name: '$eventBossLevel &eSuspicious Phantom' + locationMessage: '&cSuspicious Phantom: $distance blocks away!' + spawnMessage: '&cA Suspicious Phantom was sighted in the skies!' + deathMessage: '&aThe Phantom was put to bed by $players!' + escapeMessage: '&4The Suspicious Phantom has left!' +suspicious_phantom_summon: + name: '$eventBossLevel &cFlamer' +suspicious_phantom_summon_1: + name: '$eventBossLevel &cFireballer' +test_boss: + name: '$eventBossLevel &6Test boss' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Test Boss has been debugged!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Aku terpukul olehmu! + onDamagedMessages: + - Aku terkena serangan! + locationMessage: 'Test entity: $distance' + spawnMessage: Boss test telah bangkit! + deathMessage: Boss test telah dibunuh oleh $players! + escapeMessage: Boss test telah pergi! +airship_tier_45_knockback: + name: '$normalLevel &2Bow Bowsman' +airship_tier_45_witherblind: + name: '$normalLevel &aNoxious Bowsman' +airship_tier_50_powder_monkeys: + name: '$normalLevel &7Powder Monkey' +airship_tier_50_scourge: + name: '$normalLevel &8Swashbuckling Scourge' +airship_tier_60_mess_hall_mate: + name: '$normalLevel &bMess Hall Mate' +airship_tier_65_boatswain_boss: + name: '$normalLevel &cBoatswain Boss' +airship_tier_65_bodyguard: + name: '$normalLevel &eBuccaneer Bodyguard' +airship_tier_65_silverfish: + name: '$normalLevel &8Ship Rat' +airship_tier_65_silverfish_reinforcement: + name: '$reinforcementLevel &8Ship Mouse' +airship_tier_70_miniboss: + name: '$minibossLevel Quark the Quartermaster ' +airship_tier_70_miniboss_2: + name: '$minibossLevel &6Living Boiler' +airship_tier_70_miniboss_wayfinder: + name: '$minibossLevel &3Wharf Wayfinder' +airship_tier_75_boss: + name: '$bossLevel &4Captain Davey' + deathMessages: + - '&e&l---------------------------------------------' + - '&9Captain Davey was put to rest! ... again.' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Captain Davey: $distance' + spawnMessage: '&4Captain Davey haunts the skies once more!' + deathMessage: '$players &ahave made &4Captain Davey &ashuffle off his mortal coil!' + escapeMessage: '&6Captain Davey has moved on the haunt another day!' +binder_of_worlds_phase_1: + name: '$eventBossLevel &eBinder of Worlds' + spawnMessage: '&5The binder of worlds approaches!' +binder_of_worlds_phase_1_melee_miniboss: + name: '$reinforcementLevel &9Reality Uprooter' +binder_of_worlds_phase_1_melee_reinforcement: + name: '$reinforcementLevel &8Reality Waster' +binder_of_worlds_phase_1_parkour_reinforcement: + name: '$reinforcementLevel &2Reality Harbinger' +binder_of_worlds_phase_1_ranged_miniboss: + name: '$reinforcementLevel &3Reality Ruiner' +binder_of_worlds_phase_1_ranged_reinforcement: + name: '$reinforcementLevel &6Reality Ruiner' +binder_of_worlds_phase_1_status_miniboss: + name: '$reinforcementLevel &1Reality Wrencher' +binder_of_worlds_phase_1_status_reinforcement: + name: '$reinforcementLevel &7Reality Rupturer' +binder_of_worlds_phase_2: + name: '$eventBossLevel &eBinder of Worlds' +binder_of_worlds_phase_3: + name: '$eventBossLevel &eBinder of Worlds' +binder_of_worlds_phase_3_shulker_reinforcement: + name: '$reinforcementLevel &5Reality Riftrender' +binder_of_worlds_phase_4: + name: '$eventBossLevel &eBinder of Worlds' + deathMessages: + - '&e&l---------------------------------------------' + - '&9The binder is bound to this mortal plane no more!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' +catacombs_tier_10_miniboss: + name: '$minibossLevel &7Terragog' +catacombs_tier_15_boss: + name: '$bossLevel &6The Rattler' + deathMessages: + - '&e&l---------------------------------------------' + - '&9The Rattler rattled away!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Feeling.. rattled? + - Show me your skeleton! + - You're boned! + - Your calcium is weak! + onDamagedMessages: + - I felt that in my bones! + - I've got a bone to pick with you! + - Doot doot mr skeltal + - I need calcium! + locationMessage: 'The Rattler: $distance blocks away!' + spawnMessage: '&6The Rattler rises!' + deathMessage: '&aThe Rattler has been defeated by $players!' +catacombs_tier_15_mimic_boss: + name: '$bossLevel &6The Forgotten' +catacombs_tier_15_reinforcement: + name: '$reinforcementLevel &eUnturned' +catacombs_tier_5_evoker_guard_2: + name: '$normalLevel &7Catacomb Guard' + onDamageMessages: + - No entry! + - Entry is forbidden! +catacombs_tier_5_illusioner_guard_1: + name: '$normalLevel &7Catacomb Guard' + onDamageMessages: + - No entry! + - Entry is forbidden! +colosseum_tier_70_boss_mount: + name: '$bossLevel &4Pit Lord' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Pit Lord is no more!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + deathMessage: '&2The Pit Lord has been vanquished by $players!' +colosseum_tier_70_boss_p1: + name: '$bossLevel &cPit Master' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Pit Master has fallen!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Pit Master: $distance blocks away!' + spawnMessage: '&4The Pit Master charges into battle once more!' + deathMessage: '&2The Pit Master has been slain by $players!' +colosseum_tier_70_boss_p2: + name: '$bossLevel &cPit Master' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Pit Master has fallen!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Pit Master: $distance blocks away!' + deathMessage: '&2The Pit Master has been slain by $players!' +colosseum_tier_70_boss_reinforcements_p1: + name: '$reinforcementLevel &6Gladiator' +colosseum_tier_70_boss_reinforcements_p2: + name: '$reinforcementLevel &6Gladiator' +colosseum_tier_70_gladiator: + name: '$normalLevel &6Gladiator' +colosseum_tier_70_mount_reinforcements: + name: '$reinforcementLevel &cPit Beast' +dark_cathedral_tier_75_boss: + name: '$bossLevel &4Cultist of Cthulhu' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The summoning has been interrupted!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Fools! + - Chtulhu R'lyeh! + - None can defeat Chtulhu! + - Stare into the abyss... + locationMessage: 'Cultist of Cthulhu: $distance blocks away' + spawnMessage: '&cA dark cultist is summoning Cthulhu!' + deathMessage: '&2The summoning has been thwarted $players!' + escapeMessage: '&2The cultist has completed the summoning!' +dark_cathedral_tier_75_reinforcement: + name: '$reinforcementLevel Follower of Cthulhu' + onDamageMessages: + - Cthulhu R'lyeh + onDamagedMessages: + - Cthulhu R'lyeh +darkspire_level_100_berserker_brute: + name: '$normalLevel &7Underworld Berserker' +darkspire_level_100_berserker_reanimated: + name: '$normalLevel &fReanimated Underworld Berserker' +darkspire_level_100_blacksmith_brute: + name: '$normalLevel &eSmoldering Goldsmith' +darkspire_level_100_endermite: + name: '$normalLevel &5Voidcrawler' +darkspire_level_100_marksman_piglin: + name: '$normalLevel &9Foolish Marksman' +darkspire_level_100_sentry_brute: + name: '$normalLevel &3Darkguard Sentry' +darkspire_level_100_summon_blaze: + name: '$reinforcementLevel &cHellspawn' +darkspire_level_100_summon_evoker: + name: '$reinforcementLevel &cFalse Hellraiser' +darkspire_level_100_summon_ghast: + name: '$reinforcementLevel &7Maalkvvhar' +darkspire_level_100_summon_husk: + name: '$reinforcementLevel &cOroxak''s Corrupted' +darkspire_level_100_summon_ravager: + name: '$reinforcementLevel &cEerbix the Fallen' +darkspire_level_100_summon_skeleton: + name: '$reinforcementLevel &cRibling' +darkspire_level_110_berserker_reanimated: + name: '$normalLevel &7Reanimated Underworld Berserker' +darkspire_level_110_marksman_reanimated: + name: '$normalLevel &9Reanimated Foolish Marksman' +darkspire_level_110_necromancer_evoker: + name: '$normalLevel &8Black-Hearted Enchanter' +darkspire_level_110_sentry_reanimated: + name: '$normalLevel &3Reanimated Darkguard Sentry' +darkspire_level_110_stationary_stray: + name: '$normalLevel &6Hewn Watchman' +darkspire_level_120_miniboss_evoker: + name: '$minibossLevel &4Hellraiser' +darkspire_level_120_miniboss_illusioner: + name: '$minibossLevel &4Maalkv' +darkspire_level_120_miniboss_skeleton: + name: '$minibossLevel &4Crypt Keeper' +darkspire_level_120_miniboss_stray: + name: '$minibossLevel &4Nicolas Ribcage' +darkspire_level_120_miniboss_vindicator: + name: '$minibossLevel &4Zalmur the Impslayer' +darkspire_level_120_miniboss_wither_skeleton: + name: '$minibossLevel &4Oroxak' +darkspire_level_120_summon_zoglin: + name: '$reinforcementLevel &cArzags Horde' +darkspire_level_130_miniboss_phase_brute: + name: '$bossLevel &4Arzag the Beast' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Arzag the Beast''s invasion has been stopped!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' +darkspire_level_130_miniboss_zoglin: + name: '$bossLevel &4Arzag the Beast' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Arzag the Beast''s invasion has been stopped!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Arzag the Beast: $distance blocks away' + spawnMessage: '&4Arzag the Beast prepares for the invasion!' + escapeMessage: '&cArzag the Beast is done plundering!' +darkspire_level_80_summon_blaze: + name: '$reinforcementLevel &dFalse Hellspawn' +fireworks_level_50_boss_phase_1: + name: '$eventBossLevel &cSparky' + spawnMessage: '&eSparks fill the sky!' +fireworks_level_50_boss_phase_2: + name: '$eventBossLevel &cSparky' +fireworks_level_50_boss_phase_3: + name: '$eventBossLevel &cSparky' + deathMessages: + - '&e&l---------------------------------------------' + - '&eSparky''s out, party''s over!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&6Sparky returns to celebrate!' +fireworks_phase_2_reinforcement: + name: '$eventBossLevel &cBoomi' +fireworks_phase_3_reinforcement: + name: '$eventBossLevel &cPartygoer' +the_great_weaver: + name: '$eventBossLevel &cThe Great Weaver' + locationMessage: '&cThe Great Weaver: $distance blocks away!' + spawnMessage: '&cAwful creatures have appeared!' + deathMessage: '&aThe Great Weaver and it''s brood have been stopped by $players!' + escapeMessage: '&4The Great Weaver and it''s brood have vanished!' +the_great_weaver_summon: + name: '$eventBossLevel &4Brood Mother' +the_great_weaver_summon_1: + name: '$eventBossLevel &6Brood' +halloween_event_boss_mount: + name: '$minibossLevel Daredevil' +halloween_event_boss_p1: + name: '$bossLevel Dullahan' + locationMessage: '&4Dullahan: $distance blocks away!' + spawnMessage: '&4Don''t lose your head now, the headless horseman walks the earth once again!' + deathMessage: '&4The headless horseman was vanquished by $players!' + escapeMessage: '&4The headless horseman has left to haunt someone''s dreams!' +halloween_event_boss_p2: + name: '$bossLevel Dullahan' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Headless Horseman was vanquished!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Dullahan: $distance blocks away!' + deathMessage: '&4The headless horseman was vanquished by $players!' + escapeMessage: '&4The headless horseman has left to haunt someone''s dreams!' +halloween_event_boss_reinforcement: + name: '$normalLevel Spooky Skeleton' +the_hunter: + name: '$eventBossLevel &4The Hunter' + locationMessage: '&cThe Hunter: $distance blocks away!' + spawnMessage: '&cA Hunter is on the prowl!' + deathMessage: '&aThe Hunter was hunted to extinction by $players!' + escapeMessage: '&4The Hunter declares the hunt now over!' +the_hunter_mount: + name: '$eventBossLevel &fTamed Beast' +the_living_dead: + name: '$reinforcementLevel &6The Living Dead' +northpole_elf: + name: '$normalLevel &2Workshop Elf' +northpole_elf_summon: + name: '$reinforcementLevel &aSanta''s Elf' +northpole_jack_frost: + name: '$bossLevel &bJack Frost' +northpole_krampus: + name: '$bossLevel &5Krampus' +northpole_mrs_claus: + name: '$bossLevel &cMrs. Claus' +northpole_santa_claus: + name: '$bossLevel &4Santa Claus' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Someone stole all of Santa''s presents!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Santa Claus: $distance blocks away' + spawnMessage: '&4Santa Claus is getting ready for Christmas!!' + escapeMessage: '&cSanta set off on his sleigh!' +northpole_skeleton_summon: + name: '$reinforcementLevel &dSoul of the Naughty List' +northpole_snowy_wraith: + name: '$reinforcementLevel &1Snowy Wraith' +the_phantom: + name: '$eventBossLevel &7The Phantom' + locationMessage: '&cThe Phantom: $distance blocks away!' + spawnMessage: '&cA Phantom roams in the dark!' + deathMessage: '&aThe Phantom and his evil troupe have been stopped by $players!' + escapeMessage: '&4The Phantom has left!' +the_phantom_summon_1: + name: '&fCave Spider' +the_phantom_summon_2: + name: '&fWItch' +the_phantom_summon_3: + name: '&fZombie' +the_phantom_summon_4: + name: '&fHusk' +the_phantom_summon_5: + name: '&fDrowned' +the_phantom_summon_6: + name: '&fSkeleton' +the_phantom_summon_7: + name: '&fStray' +the_phantom_summon_8: + name: '&fEnderman' +pirate_ship_tier_10: + name: '$normalLevel &cCrewman' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_15: + name: '$normalLevel &cDeckhand' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_20_melee_1: + name: '$normalLevel &cShipmate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_20_melee_2: + name: '$normalLevel &eDrunken lout' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_20_miniboss: + name: '$minibossLevel &dCookie the Cook' + onDamageMessages: + - Wat're u doin n my kitchen! + - I've got layers! + - You've been served! + - Out me kitchen! + deathMessage: '&2Cookie the Cook''s been sliced and diced by $players!' +pirate_ship_tier_20_ranged: + name: '$normalLevel &cShipmate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_25_miniboss_1: + name: '$miniboss &cCharon the Helmsman' + onDamageMessages: + - Fools ahoy! + - Worthy opponent at prow! + deathMessage: '&2Charon the Helmsman''s been led astray by $players!' +pirate_ship_tier_30_melee: + name: '$normalLevel &cPirate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_30_miniboss_1: + name: '$minibossLevel &7Crushy the Crusher' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! + deathMessage: '&7Crushy the Crusher has been crushed by $players!' +pirate_ship_tier_30_ranged: + name: '$normalLevel &cPirate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_35: + name: '$normalLevel &4Pirate Navigator' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_35_miniboss_1: + name: '$minibossLevel &cSecond Mate' + onDamageMessages: + - You're not allowed here! + - Captain's quarters, back off! +pirate_ship_tier_35_miniboss_2: + name: '$minibossLevel &cSecond Mate' + onDamageMessages: + - You're not allowed here! + - Captain's quarters, back off! +pirate_ship_tier_40_miniboss_1: + name: '$minibossLevel &4First Hand' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! + deathMessage: '&6The Pirate Ship''s First Hand has been demoted by $players!' +pirate_ship_tier_45_boss: + name: '$bossLevel &4Captain Blackbeard' + onDamageMessages: + - Get off me ship! + - Arr, landlubers! + spawnMessage: '&4Captain Blackbeard is leading the Pirate Ship!' + deathMessage: '&2Captain Blackbeard''s beard''s been shaved by $players!' + escapeMessage: '&2Captain Blackbeard has run away with the plunder!' +the_returned: + name: '$reinforcementLevel &6The Returned' +ruins_boss_p1: + name: '$eventBossLevel &9Thor' + spawnMessage: '&6Lightning descends down from the sky!' +ruins_boss_p2: + name: '$eventBossLevel &9Thor' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Thor was sent back to Asgard!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&6Lightning descends down from the sky!' +ruins_boss_reinforcement: + name: '$eventBossLevel &7Fenrir' +sewer_tier_10: + name: '$normalLevel &fLurker' +sewer_tier_15: + name: '$normalLevel &2Crawler' +sewer_tier_20_dry: + name: '$normalLevel &1Lost Wanderer' +sewer_tier_20_gravity_boss: + name: '$minibossLevel &1Spark' +sewer_tier_20_water: + name: '$normalLevel &1Smuggler' + onDamageMessages: + - You shouldn't be here! + onDamagedMessages: + - None shall stand in our way! +sewer_tier_20_water_boss: + name: '$minibossLevel &1Forgotten Hero' +sewer_tier_20_wither_boss: + name: '$minibossLevel &2Withered Corpse' +sewer_tier_30_ice_boss: + name: '$minibossLevel &2Ice Wraith' +sewer_tier_30_invisibility_boss: + name: '$minibossLevel &2Shadow Archer' +sewer_tier_30_melee: + name: '$normalLevel &5Sewer Beast' +sewer_tier_30_ranged: + name: '$normalLevel &5Spirit Whisperer' + onDamageMessages: + - A curse upon you! + - A pox upon your family! + - Feel the wrath of the spirits! + onDamagedMessages: + - You vex me so! + - Spirits, protect me! +sewer_tier_40: + name: '$normalLevel &6Mirage' + onDamageMessages: + - You victory, a lie + - Your odds, grim + - Your life, mine + onDamagedMessages: + - This pain, an illusion + - This blood, a mirage + - This weakness, a lie +sewer_tier_40_darkness_boss: + name: '$minibossLevel &2The Shadowmaster' +sewer_tier_40_darkness_boss_reinforcement: + name: '$reinforcementLevel &2Shadow' +sewer_tier_40_fire_boss: + name: '$minibossLevel &2The Grill Master' +sewer_tier_40_fire_boss_reinforcement: + name: '$reinforcementLevel &2Flame' +sewer_tier_40_poison_boss: + name: '$minibossLevel &2Toxic Gardener' + onDamageMessages: + - Feel nature's wrath! + onDamagedMessages: + - To me, minions! +sewer_tier_40_poison_boss_reinforcement: + name: '$reinforcementLevel &2Fallen Gardener' +sewer_tier_5: + name: '$normalLevel &7Sewer worker' + onDamageMessages: + - This area is restricted! + - Don't jump into the vats! + - | + You're not supposed to be here| + onDamagedMessages: + - Do you know what you're doing!? + - Foolishness! + - Don't you dare! +sewer_tier_50: + name: '$normalLevel &3Sewer Piranha' +sewer_tier_50_lightning_boss: + name: '$minibossLevel &2Mjolnir' +sewer_tier_50_ravager_boss: + name: '$minibossLevel &2Sewer Monstrosity' +sewer_tier_50_spider_boss: + name: '$minibossLevel &2Ancient Crawler' +sewer_tier_50_spider_boss_reinforcement: + name: '$reinforcementLevel &2Spiderling' +sewer_tier_50_water_boss: + name: '$minibossLevel &2Piranha King' +sewer_tier_50_water_boss_reinforcement: + name: '$reinforcementLevel &2Piranha Prince' +sewer_tier_60: + name: '$normalLevel &4Drowned One' +sewer_tier_70_boss: + name: '$bossLevel &4Drowned King' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Drowned King has been slain!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&cThe sewers echo with the clamor of a returned king...' + deathMessage: '&2The Drowned King has been slain!' + escapeMessage: '&2The sewers grow quiet, for now...' +sewer_tier_70_boss_reinforcement: + name: '$reinforcementLevel &4Drowned One' +totem_zombie_1: + name: '$eventBossLevel Head Zombie' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Zombie Totem been slain!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cZombie Totem: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine abomination has been sighted!' + deathMessage: '&aDr. Craftenmine''s abomination been terminated by $players!' + escapeMessage: '&4Dr. Craftenmine''s creation has escaped!' +totem_zombie_2: + name: '$eventBossLevel Totem Zombie' +totem_zombie_3: + name: '$eventBossLevel Totem Zombie' +totem_zombie_4: + name: '$eventBossLevel Totem Zombie' +totem_zombie_5: + name: '$eventBossLevel Totem Zombie' +totem_zombie_6: + name: '$eventBossLevel Totem Zombie' +treasure_goblin: + name: '$eventBossLevel &eTreasure Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Treasure Goblin telah di jarah!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cTreasure Goblin: jarak $distance block!' + spawnMessage: '&cA Treasure Goblin telah terlihat!' + deathMessage: '&aA Treasure Goblin telah di bunuh oleh $players!' + escapeMessage: '&4A Treasure Goblin telah pergi!' +tree_defender: + name: '$eventBossLevel &2Tree Defender' +undead_farmer: + name: '$eventBossLevel &aUndead Farmer' + locationMessage: '&cUndead Farmer: $distance blocks away!' + spawnMessage: '&cAn Undead Farmer walks the earth!' + deathMessage: '&aThe Undead Farmer''s career was ended by $players!' + escapeMessage: '&4The Undead Farmer has gone back to rest!' +undead_farmer_summon: + name: '$eventBossLevel &2Farmers Pride' +undead_farmer_summon_1: + name: '$eventBossLevel &2Failed Hog' +undead_horde_summon_1: + name: '$reinforcementLevel &aUndead Horde' +undead_horde_summon_2: + name: '$reinforcementLevel &dUndead Horde' +undead_horde_summon_3: + name: '$reinforcementLevel &eUndead Horde' +unwanted_visitor: + name: '$eventBossLevel &9Unwanted Visitor' + locationMessage: '&cUnwanted Visitor: $distance blocks away!' + spawnMessage: '&cAn Unwanted Visitor has come to the nether to warm up!' + deathMessage: '&aThe Visitor was slain by $players!' + escapeMessage: '&4The Visitor has gone back to his chilly domain!' +unwanted_visitor_summon: + name: '$eventBossLevel &bIce Clone' +vampire_boneman: + name: '$reinforcementLevel &7Drainlings' +vampire_brute: + name: '$normalLevel &1Vampire Brute' +vampire_brute_coffin_breaker: + name: '$normalLevel &1Vampire Brute' +vampire_brute_gargoyle_rush_left: + name: '$normalLevel &3Vampire Brute' +vampire_brute_gargoyle_rush_left_phase_2: + name: '$normalLevel &3Vampire Brute' +vampire_brute_gargoyle_rush_right: + name: '$normalLevel &3Vampire Brute' +vampire_brute_gargoyle_rush_right_phase_2: + name: '$normalLevel &3Vampire Brute' +vampire_fledgling: + name: '$normalLevel &9Vampire Fledgling' +vampire_fledgling_coffin_breaker: + name: '$normalLevel &9Vampire Fledgling' +vampire_fledgling_gargoyle_overlord: + name: '$normalLevel &9Vampire Fledgling' +vampire_gargoyle: + name: '$normalLevel &6Vampire''s Gargoyle' +vampire_grunt: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_coffin_breaker: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_left: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_left_phase_2: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_right: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_right_phase_2: + name: '$normalLevel &1Vampire Grunt' +vampire_hound: + name: '$reinforcementLevel &bVampire Hound' +vampire_king: + name: '$bossLevel &4Vampire King' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Vampire King has been slain!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Vampire King: $distance blocks away.' + spawnMessage: '&cThe Vampire King crawls back to his throne...' + deathMessage: '&2The Vampire King has been smitten!' + escapeMessage: '&2Darkness flees, but for how long...' +vampire_king_phase_2: + name: '$bossLevel &4Vampire King' +vampire_king_phase_3: + name: '$bossLevel &4Vampire King' +vampire_king_phase_4: + name: '$bossLevel &4Vampire King' +vampire_king_phase_5: + name: '$bossLevel &4Vampire King' +vampire_king_phase_6: + name: '$bossLevel &4Vampire King' +vampire_level_120_miniboss_evoker: + name: '$minibossLevel &4Hellraiser''s Spirit' +vampire_level_120_miniboss_skeleton: + name: '$minibossLevel &4Crypt Keeper''s Spirit' +vampire_level_120_miniboss_stray: + name: '$minibossLevel &4Nicolas Ribcage''s Spirit' +vampire_level_120_miniboss_wither_skeleton: + name: '$minibossLevel &4Oroxak''s Spirit' +vampire_necromancer: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_dining_hall: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_entrance: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_foresight_pool: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_gargoyle_rush: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_gargoyle_rush_phase_2: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_left_bedroom: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_right_bedroom: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_supply_room: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_supreme_coffin_breaker: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_2: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_3: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_4: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_5: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_gargoyle_overlord: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_gargoyle_overlord_phase_2: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_gargoyle_overlord_phase_3: + name: '$minibossLevel &2Gargoyle Overlord' +vampire_sentinel: + name: '$minibossLevel &eVampire''s Sentinel' +vampire_thrall: + name: '$reinforcementLevel &dVampire''s Thrall' +vampire_wraith: + name: '$minibossLevel &8Drained One' +vampire_wraith_phase_2: + name: '$minibossLevel &8Drowned One' +vampire_zombie: + name: '$normalLevel &aDrained Husk' +vex_top: + name: '$eventBossLevel &eVex Selfish Top' + locationMessage: '&cVex Troublemakers: $distance blocks away!' + spawnMessage: '&cA gang of Vex Troublemakers have appeared!' + deathMessage: '&aThe Vex Troublemakers were slain by $players!' + escapeMessage: '&4The Vex Troublemakers have decided to leave.' +vex_top_mount_1: + name: '$eventBossLevel &6Vex Bottom' +vex_top_mount_2: + name: '$eventBossLevel &6Vex Bottom' +vex_top_mount_3: + name: '$eventBossLevel &6Vex Bottom' +warlock: + name: '$eventBossLevel &dWarlock' + locationMessage: '&cWarlock: $distance blocks away!' + spawnMessage: '&cA demon riding Warlock has appeared!' + deathMessage: '&aThe Warlock was slain by $players!' + escapeMessage: '&4The Warlock ran away on his demon!' +warlock_mount: + name: '$eventBossLevel &dDemon' +wasp_queen: + name: '$eventBossLevel &aWasp Queen' + locationMessage: '&cWasp Queen: $distance blocks away!' + spawnMessage: '&cA wasp swarm has been sighted!' + deathMessage: '&aThe wasp swarm was eliminated by $players!' + escapeMessage: '&4The wasp swarm has flown away.' +wasp_queen_summon: + name: '$eventBossLevel &aWasp' +water_pest: + name: '$eventBossLevel &3Water Pest' + locationMessage: '&cWater Pest: $distance blocks away!' + spawnMessage: '&cAn annoying foe swims the waters!' + deathMessage: '&aThe Water Pest was slain by $players!' + escapeMessage: '&4The waters are clear of all Pests' +weapons_goblin: + name: '$eventBossLevel &cWeapons Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Weapons Goblin has been pillaged!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cWeapons Goblin: $distance blocks away!' + spawnMessage: '&cA Weapons Goblin has been sighted!' + deathMessage: '&aA Weapons Goblin has been slain by $players!' + escapeMessage: '&4A Weapons Goblin has escaped!' +wendigo: + name: '$eventBossLevel &7Wendigo' + locationMessage: '&cWendigo: $distance blocks away!' + spawnMessage: '&cSomething awful has appeared!' + deathMessage: '&aThe Wendigo has been slain $players!.' + escapeMessage: '&4The Wendigo has disappeared!' +wendigo_summon: + name: '$reinforcementLevel &aWindigo' +werehare: + name: '$eventBossLevel &5Alice' + locationMessage: '&cWerehare: $distance blocks away!' + spawnMessage: '&cA bloody roar can be heard! A werehare approaches!' + deathMessage: '&a$players! made sure to end the werehare''s reign!' + escapeMessage: '&4The werehare escaped!' +werehare_p2: + name: '$eventBossLevel &dWerehare' +wild_wolf: + name: '$reinforcementLevel &7Wild Wolf' +wood_league_wave_10_boss: + name: '$bossLevel &4Bad Doggo' +wood_league_wave_10_reinforcement: + name: '$reinforcementLevel &cBad Pupper' +wood_league_wave_11_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_11_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_12_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_12_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_13_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_13_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_14_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_14_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_15_miniboss: + name: '$bossLevel &4Mr. Oinkers' + onDamagedMessages: + - Oink!? +wood_league_wave_16_melee: + name: '$normalLevel Mr. Oinkers Fan' +wood_league_wave_16_ranged: + name: '$normalLevel Mr. Oinkers Fan' +wood_league_wave_17_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_17_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_18_melee: + name: '$normalLevel &4Fencing Club Enthusiast' +wood_league_wave_19_ranged: + name: '$normalLevel Archery Club Enthusiast' +wood_league_wave_1_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_1_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_20_boss: + name: '$bossLevel &2Zoltan' +wood_league_wave_21_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_21_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_22_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_22_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_23_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_23_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_24_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_24_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_25_miniboss: + name: '$minibossLevel &bAgdluak' +wood_league_wave_26_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_26_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_27_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_27_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_28_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_29_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_2_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_2_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_30_boss: + name: '$bossLevel &2The Southern Viper' +wood_league_wave_31_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_31_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_32_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_32_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_33_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_33_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_34_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_34_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_35_miniboss: + name: '$minibossLevel &6The Jester' +wood_league_wave_36_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_36_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_37_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_37_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_38_melee: + name: '$normalLevel &4Arena Swordsman' +wood_league_wave_39_ranged: + name: '$normalLevel Arena Archer' +wood_league_wave_3_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_3_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_40_boss: + name: '$bossLevel &cCrucio the Bearer of Curses' +wood_league_wave_41_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_41_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_42_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_42_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_42_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_43_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_43_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_43_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_44_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_44_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_44_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_45_miniboss: + name: '$minibossLevel &6Thousand Blades' +wood_league_wave_46_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_46_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_46_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_47_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_47_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_47_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_48_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_48_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_49_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_49_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_4_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_4_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_50_boss: + name: '$bossLevel &6Uther the Champion' +wood_league_wave_50_boss_p2: + name: '$bossLevel &6Uther the Champion' +wood_league_wave_50_boss_p3: + name: '$bossLevel &6Uther the Champion' +wood_league_wave_50_reinforcement: + name: '$reinforcementLevel &6Uther Stan' +wood_league_wave_5_miniboss: + name: '$minibossLevel &cWeird Cow' + onDamagedMessages: + - Woof! +wood_league_wave_6_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_6_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_7_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_7_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_8_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_9_ranged: + name: '$normalLevel Arena Crossbowman' +yeti: + name: '$eventBossLevel &bYeti' + locationMessage: '&cYeti: $distance blocks away!' + spawnMessage: '&cA mighty beast has appeared!' + deathMessage: '&aThe beast is no more thanks to $players!.' + escapeMessage: '&4The beast has escaped!' +yezhi_baba: + name: '$eventBossLevel &cYezhi Baba' + locationMessage: '&cYezhi Baba: $distance blocks away!' + spawnMessage: '&cA foul hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +yezhi_baba_summon: + name: '$reinforcementLevel &4Yezhi Baba' +zombie_friends_friend: + name: '$reinforcementLevel &7Zombie Friend' +zombie_king: + name: '$eventBossLevel &4Zombie King' + locationMessage: '&cZombie King: jarak $distance block!' + spawnMessage: '&cThe Zombie King telah terlihat!' + deathMessage: '&aThe Zombie King telah di bunuh oleh $players!' + escapeMessage: '&4The Zombie King telah pergi!' +zombie_parents_dad: + name: '$reinforcementLevel &7Zombie Dad' +zombie_parents_mom: + name: '$reinforcementLevel &7Zombie Mom' +back_teleporter: + name: Hermes + role: + greetings: + - Selamat datang di \nAdventurer's Guild Hub! + dialog: + - Ingin kembali? + farewell: + - Perjalanan yang aman, teman. + noPreviousLocationMessage: '&8[EliteMobs] &cTidak dapat mengirim ke lokasi sebelumnya - no lokasi tidak ditemukan!' +barkeep: + name: Bartley + role: + greetings: + - Membutuhkan Minum? + - Mau segelah minuman + - Haus? + - Hallo, kawan. + dialog: + - Memiliki salah satu spesialisasi rumah kami. + - Minuman spesial tidak akan ditemukan\nditempat lain. + - Satu rasa dan akan membuat Anda\nkembali lagi. + farewell: + - Kembalilah hidup-hidup + - Bawah! + - Bersulang! + - Salut! + - Brosd! + - Salud! + - À la vôtre ! + - Prost! + - Santi! + - Salute! + - Saúde! + - Cheers! + - 乾杯! +blacksmith: + name: Greg + role: + greetings: + - Selamat Datang di toko kami! + - Jual barang Anda di sini! + - Barang segar, hanya untuk Anda! + - Punya sesuatu untuk dijual? + - Ingin membeli sesuatu yang bagus? + - Barang segar setiap saat! + dialog: + - Tingkat monster yang lebih tinggi menjatuhkan\nbarang bernilai lebih tinggi! + - Item dengan banyak \nenchant lebih berharga! + - Tingkat monster yang lebih tinggi menjatuhkan\nbarang bernilai lebih tinggi! + - Tingkat monster yang lebih tinggi memiliki\na peluang lebih tinggi untuk menjatuhkan jarahan! + - + - + - Beberapa item memiliki efek\nramuan khusus! + - Beberapa item memiliki efek\nunik! + - Enchanct pemburu\nmenarik monster elit ke\nlokasi Anda! + - Senjata dan baju besi khusus\ndijatuhkan oleh gerombolan elit dapat\ndijual di sini! + - Peringkat guild yang lebih tinggi akan\nmeningkatkan kualitas\njarahan dari gerombolan elit! + farewell: + - Terima kasih atas pengiriman Anda! + - Silahkan Datang Kembali! + - Silahkan Kembali Kapanpun! + - Rekomendasikan toko ini kepada \nteman mu! +combat_instructor: + name: Charles + role: + greetings: + - Ingin belajar tentang pertempuran? + - Butuh pelajaran tempur? + - Ingin tahu lebih banyak tentang pertempuran? + - Siap untuk melawan Elite Mobs? + dialog: + - Item di sekitar Elite Mobs\nmenunjukkan kekuatan apa yang mereka miliki. + - The higher the level \nElite Mob, maka\nmemiliki kekuatan lebih tinggi + - Semakin tinggi level\nElite Mob,\nlebih baik jarahan yang bisa mereka jatuhkan + - Elite Mobs tingkat lebih tinggi\nmemiliki peluang lebih tinggi\nuntuk menjatuhkan item khusus + - Elite Mob dengan\npanah api yang mengambang\nmenyempit ke\npemain di sekitar + - Elite Mob dengan\nmata melayang membutakanmu\nsaat mereka memukulmu + - Elite Mob dengan\npartikel mantra mengambang membingungkan Kamu\nsaat mereka mengenai mu + - Elite Mob dengan\nember lava membuat Kamu terbakar\nketika mereka mengenai mu + - |- + Elite Mobs with floating\nfireballs fire fireballs + at nearby players + - Elite Mobs dengan es\nmembekukan Kamu\nketika mereka mengenai mu + - Elite Mob dengan\nelytra membuatmu melayang\nketika mereka menyerangmu + - Elite Mob dengan\nemeralds meracuni Kamu\nketika mereka mengenai mu + - Elite Mob dengan\npiston mendorong Kamu\nketika mereka mengenai mu + - Elite Mobs with floating\ntotems weaken you\nwhen they hit you + - Elite Mobs with floating\nwebs web you\nwhen they hit you + - Elite Mobs with floating\nskulls wither you\nwhen they hit you + - Elite Mobs with floating\nchests drop bonus loot\nwhen you kill them + - Elite Mobs with floating\ngold boots are faster + - Elite Mobs with floating\njukeboxes taunt you\nduring combat + - Elite Mobs with floating\nglass panes are invisible + - Elite Mobs with floating\nspectral arrows are immune\nto arrows + - Elite Mobs with floating\nfeathers are immune\nto fall damage + - Elite Mobs with floating\nflames are immune\nto fire + - Elite Mobs with floating\nanvils are heavier\nthan usual + - Elite Mobs with floating\nbone blocks leave their\ncorpses behind when killed + - Elite Mobs with floating\nslime blocks jump higher\nthan usual + - Elite Mobs with floating\nslime balls create a vaccum\nupon death + - Elite Mobs with floating\nleads pull you\nwhen they hit you + - Elite Mobs with floating\nbones create bone pillars\nduring combat + - Elite Mobs with floating\ntipped arrows fire tracking\narrows during combat + - Elite Mobs with floating\nmushrooms bloat up to become giants\nwhen hit + - Elite Mobs with floating\nskulls summon reinforcements\nwhen hit + - Elite Mobs with floating\nbooks summon reinforcements\nuntil you kill the summoner + - Elite Mobs with floating\neggs summon reinforcements\nwhen hit + - Elite Mobs with floating\nfireworks summon Team Rocket\nwhen hit +enhancer_config: + name: Tim + role: + greetings: + - Want to uprade yer items? + - Got upgrade orbs? + - Get yer items upgraded here! + - Ahoy! + - Ye got scrap son? + dialog: + - Yer items are lousy,\n get an upgrade here! + - Upgrade yer items here! + - Ye got an upgrade orb? + - That sword looks awful,\nget it upgraded here! + - Need an upgrade? + farewell: + - Don't embarrass yourself out there! + - Come back when you have more orbs! + - Go get more orbs! +frost_queen_teleporter: + name: Ishard the Frostbitten + role: + greetings: + - '' +guide_0: + name: Dux + role: + greetings: + - Heard about the AG? + - Been to the AG? + - Heard of the Adventurer's Guild? + - Know about the Adventurer's Guild? + dialog: + - Heard about the AG? + - Been to the AG? + - Heard of the Adventurer's Guild? + - Know about the Adventurer's Guild? + farewell: + - Kembalilah hidup-hidup + - Saya akan berada di sini jika Kamu membutuhkan saya! + - I'll be around! + - See you later! +guide_1: + name: Casus + role: + greetings: + - Need guidance? + - Need a hint + - Are you lost? + - Need help? + dialog: + - I know everything about\nthis place! + - Want to meet the other members\nof the Adventurer's Guild? + - Need to learn your way around\nthis place? + farewell: + - Kembalilah hidup-hidup + - Saya akan berada di sini jika Kamu membutuhkan saya! + - I'll be around! + - See you later! +guild_attendant: + name: Gillian + role: + greetings: + - Selamat datang di \nAdventurer's Guild Hub! + - Selamat Datang! + dialog: + - Cek list quest untuk \nmelihat quest yang aktiv! + - Kamu dapat berbicara dengan ku untuk\nmengganti Guild Rank kamu! + - Kamu dapat menjual barang di\nblacksmith untuk mendapatkan koin! + - Kamu dapat berbicara dengan arena\nmaster memasuki arena! + - Kamu dapat membeli peralatan dari\nblacksmith! + - Kamu dapat berbicara dengan petarung \nmaster untuk mengetahui kemampuan bertarung mu! + - Mencapai tingkatan guild baru\nmenambah maksimum darah mu! + farewell: + - Sampai Jumpa Kembali! + - Terimakasih telah mampir, selamat tinggal! + - Selamat berburu! +primis_69ozcanofbepis: + name: '&a69OzCanOfBepis' + role: '&2Map Maker (Uuuuge gamer)' + dialog: + - Hope you are enjoying the map! + farewell: + - Have fun! +primis_caeruleaum_fisherman: + name: '&3Piscis Nemesis' + role: '&b' + greetings: + - Hiya!. + dialog: + - Woah! Almost fell off the boat. + - Darn sea monster! + - Need more bait. + farewell: + - Later! + - Good luck! +primis_caeruleaum_fletcher: + name: '&6Ventus Artifex' + role: '&e' + greetings: + - Salam. + dialog: + - I used to be an adventurer like you. + - Welcome, outsider + - Perlu sesuatu? + - |- + You're not from around these parts, + are you? + farewell: + - See you 'round! + - Silahkan Datang Kembali! +primis_caeruleaum_forager: + name: '&5Venator Pabulatus' + role: '&d' + greetings: + - Hello, stranger. + dialog: + - I used to be an adventurer like you. + - Welcome, outsider + - Perlu sesuatu? + - |- + You're not from around these parts, + are you? + farewell: + - See you 'round! + - Silahkan Datang Kembali! +primis_caeruleaum_hint_giver: + name: '&fVir Loquax' + role: '&fWise Man' + greetings: + - Hi there! + - Hello! + - It is good to see you! + - Salam! + dialog: + - + - + - + - + - The ruins in the southwest are such a horrible place!\n Who would ever go there... + - + - + - I heard that a nasty type of\nwolf has settled in the wolf den! + farewell: + - Goodbye! + - See you later! + - Come visit me again! + - Farewell! +primis_caeruleaum_injured_fisherman: + name: '&3Callidus Piscatus' + role: '&b' + greetings: + - Hello, wanderer. + dialog: + - Caught any good fish lately? + - Welcome, outsider + - Perlu sesuatu? + - |- + You're not from around these parts, + are you? + farewell: + - See you 'round! + - Silahkan Datang Kembali! +primis_caeruleaum_jeeves: + name: Jeeves + role: + greetings: + - Just traveling! + dialog: + - Just here to sell\nto the shop-keep. + - I'm busy negotiating\nhere. + - Not right now,\ncome back later. + farewell: + - Uhuh... +primis_caeruleaum_leader: + name: '&4Chief Piscis' + role: '&c' + greetings: + - Welcome to our village! + dialog: + - |- + Ask not what this village can do for you, + ask what you can do for this village! + - Welcome, outsider + - Perlu sesuatu? + - |- + You're not from around these parts, + are you? + farewell: + - Off you go! + - Silahkan Datang Kembali! +primis_caeruleaum_merchant: + name: Emptor + role: + greetings: + - Punya sesuatu untuk dijual? + dialog: + - Bandits stole my wares! + - Got nothing to sell, I'm afraid. + - I'll buy anything you have! + farewell: + - Perjalanan yang aman! +primis_captain: + name: '&4Captain Squalus' + role: '&c' + greetings: + - So you're finally awake! + - That was a wild ride! + - Still alive? + - Let's not do that again! + dialog: + - I've got a task for you! + - I need your help! + - |- + Good thing you're here, + we need some help! + farewell: + - Off you go! + - Don't forget about me! + - Silahkan Datang Kembali! +primis_deli'o: + name: '&eDéli''O' + role: '&6Map Maker (Gamer)' + dialog: + - Hope you are enjoying the map! + farewell: + - Have fun! +primis_farmstead_son: + name: '&4Filius' + role: '&c' + greetings: + - Where do you fare from? + - You seem like you came a long way from here. + dialog: + - Dangerous times we live in. + - Have you seen my father? + - Without a lighthouse, how will boats navigate? + farewell: + - Watch your back! + - Tread lightly! +primis_farmstead_wife: + name: '&4Amavit' + role: '&c' + greetings: + - I haven't seen you before! + - Any news from Pontis Mille? + dialog: + - Have you seen my husband? + - I need your help! + - What dangerous times we live in. + - Something is amiss! + farewell: + - Perjalanan yang aman! + - Thank you! +primis_first_mate: + name: '&cIracundi' + role: '&c' + greetings: + - So you're finally awake! + - That was a wild ride! + - Still alive? + - Let's not do that again! + dialog: + - I've got a task for you! + - I need your help! + - |- + Good thing you're here, + we need some help! + farewell: + - Off you go! + - Don't forget about me! + - Silahkan Datang Kembali! +primis_frostcone: + name: '&bFrostCone' + role: '&9Map Maker (Gamer)' + dialog: + - Hope you are enjoying the map! + - It's a pine-cone covered in snow. + - Is Primis out yet? + farewell: + - Have fun! +primis_gladius_guard_1: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_guard_2: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_guard_3: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_guard_4: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_lord: + name: '&4General Hasta' + role: '&c' + greetings: + - Are you here to help? + - It's a war zone out there! + dialog: + - They came in the night! + - We never saw them coming! + - Where are our reinforcements? + farewell: + - Watch your back! + - Tread lightly! +primis_gladius_quartermaster: + name: '&6Cibus' + role: '&c' + greetings: + - Are you here to help? + - It's a war zone out there! + dialog: + - They came in the night! + - We never saw them coming! + - Where are our reinforcements? + farewell: + - Watch your back! + - Tread lightly! +primis_gladius_strategist: + name: '&6Belli' + role: '&c' + greetings: + - Are you here to help? + - It's a war zone out there! + dialog: + - They came in the night! + - We never saw them coming! + - Where are our reinforcements? + farewell: + - Watch your back! + - Tread lightly! +primis_groves_nemus_leader: + name: '&3King Nemian' + role: '&c' + dialog: + - What brings you under the hill? + - Where are you from? + - |- + Have you tried our + delicious glow berries? + farewell: + - Until next time. +primis_ice_village_fisherman_boat: + name: '&3Theopropides Nero' + role: '&3' + greetings: + - Fishy day! + dialog: + - A chilly day for fishing. + - They aren't biting. + - Just gotta be patient. + farewell: + - Don't fall into\nthe water! +primis_ice_village_friendly_villager: + name: '&3Luxuria Placidus' + role: '&3' + greetings: + - Hellos! + dialog: + - Old age will not\nslow me down! + - Being in a good\nmood is important. + - Hoping for some\nsnow soon. + farewell: + - Farewell! +primis_ice_village_generic_npc_1: + name: '&3Albertus Vitalis' + role: '&3' + greetings: + - How goes it. + dialog: + - Nothing like good ale! + farewell: + - Bye. +primis_ice_village_generic_npc_10: + name: '&3Trebatia Cornix' + role: '&3' + greetings: + - OK. + dialog: + - Yep, got it. + - I see... + - Oh! + farewell: + - I will try that\nnext time. +primis_ice_village_generic_npc_11: + name: '&3Albatia Lateranus' + role: '&3' + greetings: + - Visiting Violet? + dialog: + - Don't cause trouble. + farewell: + - Later stranger. +primis_ice_village_generic_npc_12: + name: '&3Hostilia Carantus' + role: '&3' + greetings: + - Hi. + dialog: + - I was just\nleaving. + farewell: + - Bye. +primis_ice_village_generic_npc_13: + name: '&3Vagennia Sejanus' + role: '&3' + greetings: + - Hiya. + dialog: + - What brings you\nto the docks? + farewell: + - See ya. +primis_ice_village_generic_npc_14: + name: '&3Dinia Vettonius' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_15: + name: '&3Sceledrus Marcallas' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_16: + name: '&3Fridericus Castinus' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_17: + name: '&3Cario Fimbria' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_18: + name: '&3Piscatores Laevinus' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_19: + name: '&3Monkerius Vitalis' + role: '&3' + greetings: + - Been hunting? + dialog: + - Time to go hunting. + farewell: + - Farewell. +primis_ice_village_generic_npc_2: + name: '&3Luxuria Tyranus' + role: '&3' + greetings: + - How goes it. + dialog: + - One more! + farewell: + - Bye. +primis_ice_village_generic_npc_3: + name: '&3Aurelio Nigidius' + role: '&3' + greetings: + - Hey there. + dialog: + - What a sight! + farewell: + - Goodbye. +primis_ice_village_generic_npc_4: + name: '&3Lysidamus Paratus' + role: '&3' + greetings: + - Out for a walk? + dialog: + - I couldn't imagine\nliving somewhere\nwithout snow. + - Starting to get chilly. + farewell: + - Until later. +primis_ice_village_generic_npc_5: + name: '&3Simo Proceus' + role: '&3' + greetings: + - What a view! + dialog: + - I love climbing. + - Look at all the fish! + farewell: + - Yep. +primis_ice_village_generic_npc_6: + name: '&3Dordalus Marullinus' + role: '&3' + greetings: + - Welcome to the pub! + dialog: + - Time to warm up\nmy fingers. + - Nice and warm. + farewell: + - Don't let the\ncold get ya. +primis_ice_village_generic_npc_7: + name: '&3Tranio Silvanus' + role: '&3' + greetings: + - Here somewhere.. + dialog: + - Where is it. + farewell: + - I was sure I\nleft it here. +primis_ice_village_generic_npc_8: + name: '&3Milonia Trebellius' + role: '&3' + greetings: + - Welcome to our\nvillage! + dialog: + - I sure am hungry. + - Could go for\nsome salmon. + farewell: + - Farewell. +primis_ice_village_generic_npc_9: + name: '&3Barria Brocchus' + role: '&3' + greetings: + - Did you hear... + dialog: + - Keep that in mind\nnext time you swing\nyour sword. + - The shield can be\nmore than defense. + farewell: + - Got it? +primis_ice_village_hunter: + name: '&3Alanus Isatis' + role: '&3' + greetings: + - Hey! + dialog: + - Hoping for a good\nday tomorrow. + - Sure are many Razorbacks\nout this season. + farewell: + - Be seeing you. +primis_ice_village_imprisoned_husband: + name: '&3Eleusium Calenus' + role: '&3' + greetings: + - '.....' + dialog: + - Another day in a cage... + farewell: + - '.....' +primis_ice_village_jail_caretaker: + name: '&3Philolaches Triferus' + role: '&3' + greetings: + - Hey there. + dialog: + - What else needs\nfixing. + - I should check up\non the cages. + farewell: + - Later. +primis_ice_village_jail_guard: + name: '&3Eleusium Festus' + role: '&3' + greetings: + - Climbed the\ntower eh. + dialog: + - Everything seems in order. + - Almost everything... + farewell: + - Take care. +primis_ice_village_jail_master: + name: '&3Romanus Superbus' + role: '&3' + greetings: + - Well met. + dialog: + - Don't do the crime if\nyou can't do the time. + - Crime doesn't pay. + farewell: + - Until later. +primis_ice_village_leader: + name: '&3Glacies Princeps' + role: '&3' + greetings: + - Hey. + dialog: + - Darn Ice Elemental! + - Too many problems... + - How are we supposed to\ncomplete the trials now. + farewell: + - Goodbye. +primis_ice_village_lighthouse_keeper: + name: '&3Severinus Martius' + role: '&3' + greetings: + - Well met stranger. + dialog: + - Calm day today. + - Watch out for\nthe Ursus! + farewell: + - Take it easy. +primis_ice_village_missing_daughter: + name: '&3Cornelia Ennodius' + role: '&3' + greetings: + - Help... + dialog: + - Go away, go away,\nGO AWAY! + - They are not\nreal... + - Just don't look\nat them Cornelia. + farewell: + - Bye. +primis_ice_village_prisoner: + name: '&3Adrius Calpornius' + role: '&3' + greetings: + - I am innocent! + dialog: + - This is not where\nI belong!!! + farewell: + - Get me out of here! +primis_ice_village_pubkeeper: + name: '&3Grania Cecilius' + role: '&3' + greetings: + - Welcome! + dialog: + - Coming right up! + - Try our black ale! + - Need a drink? + farewell: + - One coming up! +primis_ice_village_tower_squatter: + name: '&3Modestus Eulogius' + role: '&3' + greetings: + - The noise! + dialog: + - So much screeching! + - Just trying to\nenjoy the peace. + farewell: + - Bye. +primis_ice_village_violet: + name: '&5Domina Violet' + role: '&d' + greetings: + - Did I ask\nyour opinion? + dialog: + - Feels good to\nget it out. + - They're gonna pay\nwhile I collect. + farewell: + - No, that's what I thought. +primis_ice_village_worried_father: + name: '&3Sparax Ennodius' + role: '&3' + greetings: + - I hope she is OK... + dialog: + - Let our girl be\nsafe, please. + farewell: + - Bye. +primis_ice_village_worried_mother: + name: '&3Sestia Ennodius' + role: '&3' + greetings: + - Where did she go. + dialog: + - Hmm, lost the trail. + farewell: + - Bye. +primis_ice_village_worried_wife: + name: '&3Titia Calenus' + role: '&3' + greetings: + - Hiya! + dialog: + - Nice and clean beds. + - Did I miss something? + - Another chest sorted. + farewell: + - Bye! +primis_magmaguy: + name: '&4Magmaguy' + role: '&cLead Developer (Non-gamer)' + dialog: + - Hope you are enjoying the map! + farewell: + - Have fun! +primis_mountain_guide: + name: '&4Petrae' + role: '&c' + greetings: + - Welcome to our village! + dialog: + - |- + Ask not what this village can do for you, + ask what you can do for this village! + - Welcome, outsider + - Perlu sesuatu? + - |- + You're not from around these parts, + are you? + farewell: + - Off you go! + - Silahkan Datang Kembali! +primis_mountain_guide_2: + name: '&4Petrae' + role: '&c' + greetings: + - Welcome to our village! + dialog: + - |- + Ask not what this village can do for you, + ask what you can do for this village! + - Welcome, outsider + - Perlu sesuatu? + - |- + You're not from around these parts, + are you? + farewell: + - Off you go! + - Silahkan Datang Kembali! +primis_nemus_leader: + name: '&3King Nemian' + role: '&c' + dialog: + - What brings you under the hill? + - Where are you from? + - |- + Have you tried our + delicious glow berries? + farewell: + - Until next time. +primis_ogre_mines_escaped_miner: + name: '&cFugit Fossores' + role: '&c' + greetings: + - I can't believe I made it! + - They're everywhere! + - Could you lend a hand? + dialog: + - I've got a task for you! + - I need your help! + farewell: + - Off you go! + - Be careful in there! + - Stay safe! +primis_ogre_mines_lone_miner: + name: '&cFortis Fossores' + role: '&c' + greetings: + - Finally, some help! + - Don't let them see you! + - Help me! + dialog: + - I've got a task for you! + - I need your help! + farewell: + - Off you go! + - Back to mining for me! + - Stay safe! +primis_ogre_mines_old_miner: + name: '&cVetus Fossores' + role: '&c' + greetings: + - Hey there sonny! + - You're lookin' a little lost! + - What brings you over here? + dialog: + - I've got a task for you! + - I need your help! + farewell: + - Off you go! + - Don't let the mine mites bite! + - Stay safe! +primis_ogre_mines_panicked_miner: + name: '&cMetus' + role: '&c' + greetings: + - The mine is overrun! + dialog: + - There's ogres everywhere! + - Can you help us? + farewell: + - Be careful! +primis_pontis_citizen_1: + name: '&7Agorastocles Gorgonius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_10: + name: '&7Pardalisca Saunio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_11: + name: '&7Sobersides Colias' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_12: + name: '&7Saturio Caepio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_13: + name: '&7Chrysalus Trebonius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_14: + name: '&7Toxilus Micon' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_15: + name: '&7Phronesium Viridio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_16: + name: '&7Aurelio Zoilus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_17: + name: '&7Diniarchus Nelius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_18: + name: '&7Cleostrata Senopius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_19: + name: '&7Georgius Sorio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_2: + name: '&7Franciscus Crispian' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_20: + name: '&7Epidicus Silvanus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_21: + name: '&7Pleusicles Marcellinus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_22: + name: '&7Plesidippus Nerva' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_23: + name: '&7Plesidippus Megellus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_24: + name: '&7Fridericus Achaicus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_25: + name: '&7Curculio Zosimus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_26: + name: '&7Demipho Sylvius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_27: + name: '&7Peniculus Nemesius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_28: + name: '&7Tyndarus Faustinius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_29: + name: '&7Sulpicio Panthera' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_3: + name: '&7Tycho Sellic' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_30: + name: '&7Melaenis Gelasius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_31: + name: '&7Tyndarus Columbanus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_32: + name: '&7Antamonides Cerinthus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_33: + name: '&7Lesbonicus Momus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_34: + name: '&7Fridericus Saloninus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_35: + name: '&7Anterastilis Fabricius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_36: + name: '&7Tyndarus Augustalis' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_37: + name: '&7Modestus Aper' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_38: + name: '&7Henricus Crassus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_39: + name: '&7Franciscus Tancinus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_4: + name: '&7Advocati Micon' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_40: + name: '&7Phygia Aurelius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_5: + name: '&7Advocati Micon' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_6: + name: '&7Messenio Rectus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_7: + name: '&7Hadrius Donicus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_8: + name: '&7Sulpicio Sejanus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_9: + name: '&7Stasimus Mutilus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_dockworker_1: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_10: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_2: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_3: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_4: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_5: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_6: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_7: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_8: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_9: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_enhancer: + name: '&7Meliorem' + role: '&8' + greetings: + - Need to upgrade? + - Punya scrap? + - Let's upgrade! + dialog: + - I'll upgrade for scrap! + - Bring me scrap! + - Upgrade your gear for scrap! +primis_pontis_gardener_1: + name: '&eGorgines Asina' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_2: + name: '&ePiscatores Orissus' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_3: + name: '&eAlcesimus Abito' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_4: + name: '&ePyrgopolynices Perpenna' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_5: + name: '&eLemniselenis Gelasius' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_6: + name: '&eLysimachus Sulinus' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_7: + name: '&eStrobilus Farus' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_groves_catacombs_npc: + name: '&7Inaequaliter Hyaena' + role: '&7' + greetings: + - Psssst! + dialog: + - I heard there is great\ntreasure to be had! + - Something wonderful awaits\nyou if you enter! + - You should adventure\ninto this place... + - Why not go in? + - You should go inside... + - Don't worry, it's\ncompletely safe. + - No danger. I swear! + - Take a look inside. + - You should check\nout this place! + - He he he he he... + - What if somebody\ninside needs help. + - Go in, go in! + - Aren't you curious? + - Surely you should\ntake a peek. + farewell: + - He he he, later! +primis_pontis_groves_generic_npc_1: + name: '&2Sycophanta Mucius' + role: '&2' + greetings: + - I'm fine! + dialog: + - Do not worry about me. + - My brother will come rescue me. + - They won't eat me. + - I assure you I will be just fine. + farewell: + - Web ya later! +primis_pontis_groves_generic_npc_10: + name: '&2Hostilia Metunus' + role: '&2' + greetings: + - Hellos. + dialog: + - Are you bored too? + - Ugh, there must be something to do. + - Maybe I should brew more drinks. + farewell: + - See ya! +primis_pontis_groves_generic_npc_11: + name: '&2Tortilia Getha' + role: '&2' + greetings: + - Hi there. + dialog: + - My husband makes the best cakes. + - Want a slice? + - So delicious and moist! + farewell: + - Bye! +primis_pontis_groves_generic_npc_12: + name: '&2Consentia Apellinus' + role: '&2' + greetings: + - Oh, hello. + dialog: + - There, as good as new! + - Have to make sure the light keeps them away. + - Another lantern fixed... + farewell: + - Don't let the spiders bite! +primis_pontis_groves_generic_npc_13: + name: '&2Novia Senecius' + role: '&2' + greetings: + - Hi! + dialog: + - Oh, did not expect to see anyone here. + - Just gotta be quick and they can't get ya. + - The spiders don't stop me. + - This is my favorite resting spot. + farewell: + - Stay safe. +primis_pontis_groves_generic_npc_14: + name: '&2Maximia Priscus' + role: '&2' + greetings: + - Shhhh... + dialog: + - Thought you could\nsteal from me elves... + - Gonna get back my\npossessions when\nthey go sleep. + - Made it here by\ngoing around. + - They never saw\nme coming. + farewell: + - Keep it down. +primis_pontis_groves_generic_npc_15: + name: '&2Herennia Exsupereus' + role: '&2' + greetings: + - Hey there. + dialog: + - Just woke up. + - It's gonna be a good\nday I can feel it. + farewell: + - Bye bye. +primis_pontis_groves_generic_npc_16: + name: '&2Atria Maursus' + role: '&2' + greetings: + - Greetings. + dialog: + - Not sure how the king\nexpects me to do\nall of this... + - So much work.. + - Busy, busy, busy. + - This paperwork\nwon't do itself. + farewell: + - Bye bye. +primis_pontis_groves_generic_npc_17: + name: '&2Felicius Esurpus' + role: '&2' + greetings: + - Greetings! + dialog: + - If you need anything\nspeak to the king. + - Sorry, I am busy. + - No time for chit-chat,\nmy apologies. + farewell: + - Goodbye. +primis_pontis_groves_generic_npc_2: + name: '&2Sceledrus Fredisius' + role: '&2' + greetings: + - Heya! + dialog: + - I am actually fishing for bugs. + - Large aqua-bugs fall from the trees. + - I use tree sap as bait. + - The aqua-bugs cannot resist the bait! + - They are actually amphibious. + - Gotta catch'em before they head for the trees. + - They are quite tasty if you roast them. + - Hoping for a good catch! + farewell: + - Later. +primis_pontis_groves_generic_npc_3: + name: '&2Felicius Surius' + role: '&2' + greetings: + - Hi there! + dialog: + - The ocean is so pretty. + - I could stand here for days. + - The spiders sure are annoying. + farewell: + - Bye. +primis_pontis_groves_generic_npc_4: + name: '&2Periplectomenus Burcanius' + role: '&2' + greetings: + - Welcome! + dialog: + - Plenty of glow berries left. + - Hope you like my little farm. + - So many wines to attend to. + farewell: + - See you later. +primis_pontis_groves_generic_npc_5: + name: '&2Stephanus Magnus' + role: '&2' + greetings: + - Hey there! + dialog: + - Did you check out the berry farm? + - Lovely time for a walk. + - Can't be inside all the time. + farewell: + - Have a good one. +primis_pontis_groves_generic_npc_6: + name: '&2Abundantius Rogatus' + role: '&2' + greetings: + - Hiya! + dialog: + - What brings you into our lovely hole? + - Feel free to stay a while. + farewell: + - Bye. +primis_pontis_groves_generic_npc_7: + name: '&2Albanus Ivmarus' + role: '&2' + greetings: + - Easy there... + dialog: + - What? Yes, I'm doing just fine. + - I did not have too many, nope. + - Just one more... + - One more pint... + farewell: + - Farewell. +primis_pontis_groves_generic_npc_8: + name: '&2Bacchis Aventinus' + role: '&2' + greetings: + - Good day or evening... + dialog: + - I am so cozy right now. + - We used to go outside more often. + - Too many dangers outside these days. + farewell: + - Bless ya. +primis_pontis_groves_generic_npc_9: + name: '&2Pasicompsa Getha' + role: '&2' + greetings: + - Come in, come in! + dialog: + - Welcome to the best hole in the grove! + - Built this hole with my own hands! + - Hope you enjoy your stay! + farewell: + - Come back soon! +primis_pontis_groves_hole_luxuria: + name: '&cLuxuria Gorgonius' + role: '&c' + greetings: + - Hi there! + - Hellos! + dialog: + - Life is all about taking it easy. + - Why stress. + farewell: + - Visit us again! +primis_pontis_groves_hole_phygia: + name: '&cPhygia Gorgonius' + role: '&c' + greetings: + - Welcome to my home! + - Hellos! + dialog: + - We have to take action! + - Too many elves in our grove. + farewell: + - Visit us again! +primis_pontis_groves_lighthouse_generic_npc_1: + name: '&3Eleusium Martius' + role: '&3' + greetings: + - What brings you here? + dialog: + - Gotta make sure the\nlighthouse is working. + - Nice to see someone\ncome visit. + farewell: + - Goodbye. +primis_pontis_groves_lighthouse_generic_npc_2: + name: '&3Caelia Zoilus' + role: '&3' + greetings: + - Hey. + dialog: + - I hope he will\nbe alright. + - My turn to watch\nover the light. + - We almost ran\nout of food. + farewell: + - Bye. +primis_pontis_groves_lighthouse_sick_man: + name: '&3Alanus Secundas' + role: '&c' + dialog: + - I don't feel so good + - Hopefully I recover soon. + - Well, I am feeling a bit better. + - We need more food. + farewell: + - Farewell. +primis_pontis_groves_parkour_npc_1: + name: '&3Posuere Hominem' + role: '&c' + dialog: + - Up for a challenge? + - You think you got what it takes? + - Wanna go swinging? + - You a mad lad? + - No cheating! + farewell: + - See you later. +primis_pontis_groves_parkour_npc_2: + name: '&cIdoneitatem Hominem' + role: '&3' + dialog: + - That was impressive! + - Try and beat my record of 1m 47s. + - No cheating! + farewell: + - See you later. +primis_pontis_guard: + name: '&cPontis Guard' + role: '&8' + greetings: + - Want to upgrade gear? + dialog: + - Lost? Follow the bridge colors. + - Every bridge path has at least one color! + - Stay out of trouble! + - Don't cause any trouble! + - Pontis was built like a maze for defense. + - The bridge ceilings show that path's color! +primis_pontis_guard_1: + name: '&cPontis Guard' + role: '&8' + greetings: + - Want to upgrade gear? + dialog: + - Lost? Follow the bridge colors. + - Every bridge path has at least one color! + - Stay out of trouble! + - Don't cause any trouble! + - Pontis was built like a maze for defense. + - The bridge ceilings show that path's color! +primis_pontis_guard_2: + name: '&cPontis Guard' + role: '&8' + greetings: + - Hello! + dialog: + - This way to the shogun! +primis_pontis_guard_rat: + name: '&cPontis Elite Guard' + role: '&8' + greetings: + - Darn rats! + dialog: + - Filthy rats!!! + - Hold still,\ndarn you! + - Stop dodging\nmy attacks! + - Almost got one! + - Just die! + - Why wont you die!!! + - You can't dodge\nforever! + - Next strike! + - You're dead! + - How dare you\ndodge! + - Almost! +primis_pontis_guard_rat_at_wormhole: + name: '&cPontis Elite Guard' + role: '&8' + greetings: + - What's taking\nso long. + dialog: + - We got this\nunder control. + - Do not worry,\nthe elite guard\nis on the case! +primis_pontis_guard_shogun_1: + name: '&4Royal Guard' + role: '&8' + dialog: + - Don't go getting into trouble. + - Don't mind me, just keeping the peace. + - No funny business here. + - I've got my eye on you, adventurer. + - No questions, and no one gets hurt! + - Ain't got no time for messing around. + farewell: + - Safe travels, adventurer. +primis_pontis_guard_shogun_1_cat_quest: + name: '&4Royal Guard' + role: '&8' + dialog: + - Don't go getting into trouble. + - Don't mind me, just keeping the peace. + - No funny business here. + - I've got my eye on you, adventurer. + - No questions, and no one gets hurt! + - Ain't got no time for messing around. + farewell: + - Safe travels, adventurer. +primis_pontis_mille_arena_master_observatory: + name: Stella Hominis + role: + greetings: + - Hellos! + dialog: + - I hope to see many stars. + - Such heavenly bodies! + - The cosmos calls to me. + - Infinite possibilities. + - The ancient knowledge... + - I have tales to tell. + - If only you knew... + farewell: + - May the stars bless you. +primis_pontis_mille_concerned_shipmate: + name: '&3Delphium Calpurnius' + role: '&8' + dialog: + - Sigh. + - So much for my\nshipments... + farewell: + - Safe travels! +primis_pontis_mille_fields_camp_generic_npc_1: + name: '&cScribonia Ingenvinus' + role: '&c' + dialog: + - The most dangerous\nweapon is the one\nbetween your ears. + - Three arrows\nis all I need. + farewell: + - Catch ya later! +primis_pontis_mille_fields_camp_generic_npc_2: + name: '&cValador Lumus' + role: '&c' + dialog: + - I have hunted in\nmany places. + - Do you travel\na lot too? + farewell: + - May your blade be swift. +primis_pontis_mille_fields_camp_generic_npc_3: + name: '&cPhygia Ahala' + role: '&c' + dialog: + - Nothing like a\ngood hunt! + farewell: + - Stay safe. +primis_pontis_mille_fields_camp_generic_npc_4: + name: '&cAdrius Paterculus' + role: '&c' + dialog: + - The hunt calls! + farewell: + - Swift death. +primis_pontis_mille_fields_camp_generic_npc_5: + name: '&cCappadox Galerus' + role: '&c' + dialog: + - Join us, stranger! + farewell: + - Later. +primis_pontis_mille_fields_camp_generic_npc_6: + name: '&cSulpicio Rutilius' + role: '&c' + dialog: + - Hope our camp\nprovides you respite\nfrom the wild. + farewell: + - Bye. +primis_pontis_mille_fields_camp_generic_npc_7: + name: '&cAquarius Manus' + role: '&c' + dialog: + - Don't mind me just\nfetching some water. + - Clear blue water today. + farewell: + - Bye. +primis_pontis_mille_fields_camp_magmus: + name: '&cMagmus Hypnos' + role: '&4' + dialog: + - Where is Volumnia... + - I hope she isn't in\ntrouble again. + - I need a good rest. + - If only there were more\nhours in the day. + - Speak to me when you\nhave found Volumnia. + - So much work,\nso little time. + - Yet another 17 hour day. + - I worry too much. + farewell: + - Never enough time... +primis_pontis_mille_fields_farm_berry_npc: + name: '&9Dordalus Nasica' + role: '&e' + dialog: + - Berries are so tasty! + - You should eat\nmore berries! + - Why would they\nsteal my berries... + farewell: + - See'd ya later. +primis_pontis_mille_fields_farm_boy_npc: + name: '&9Planesium Victricius' + role: '&e' + dialog: + - So many rats... + - Phew almost\ndone here. + - This thing better hold. + - Any more lifting and\nI'm gonna break. + - The view from here\nis really nice. + - OK, back to work! + farewell: + - Try some our berries! +primis_pontis_mille_fields_farm_npc: + name: '&9Milonia Majus' + role: '&e' + dialog: + - Get away, darn rats! + - Stop eating my goods! + - Sigh... + farewell: + - Later. +primis_pontis_mille_fields_farm_well_npc: + name: '&eVolumnia Zoilus' + role: '&c' + dialog: + - Watch out for its spit! + - Its saliva is toxic. + - Please help! + - I hope nobody hears\nabout this... + - Am I glad to see you! + farewell: + - How could I let this happen. +primis_pontis_mille_fields_windmill_npc_1: + name: '&eDinia Niraemius' + role: '&d' + dialog: + - Plenty of wheat to process! + - No flour no bread. + - Do you like bread too? + farewell: + - See you. +primis_pontis_mille_fields_windmill_npc_2: + name: '&eDaemones Maritialis' + role: '&d' + dialog: + - It's so nice out here! + - Do you like my windmill? + - Just out here on break. + farewell: + - See you. +primis_pontis_mille_fields_windmill_npc_3: + name: '&eAdulescens Lupis' + role: '&d' + dialog: + - Hoping for some good wind! + - Need some flour? + - This one is the best Windmill around! + farewell: + - Bless ya. +primis_pontis_mille_general_bromia: + name: '&6Bromia Curio' + role: '&6General' + greetings: + - Hail! + dialog: + - It's time for war! + farewell: + - Goodbye! +primis_pontis_mille_general_cylindrus: + name: '&eCylindrus Celatus' + role: '&eGeneral' + greetings: + - Hail! + dialog: + - There is not enough time! + farewell: + - Goodbye! +primis_pontis_mille_general_godefridus: + name: '&cGodefridus Novation' + role: '&c' + greetings: + - Greetings! + - Hail! + dialog: + - Someone needs to drop\noff these documents. + - So many candles... + farewell: + - See you +primis_pontis_mille_general_rogerius: + name: '&eRogerius Olennius' + role: '&eGeneral' + greetings: + - Hail! + dialog: + - So much to do! + - I hope those 4 are ok... + farewell: + - Bye! +primis_pontis_mille_lighthouse_man: + name: '&3Hegio Remus' + role: '&c' + dialog: + - It is so beautiful up here. + - The best view... + farewell: + - Farewell. + - The sun sets! +primis_pontis_mille_major: + name: '&cFortes Bellator' + role: '&c' + greetings: + - Hello traveler! + - Hail! + dialog: + - Those darn goblins! + farewell: + - Farewell! +primis_pontis_mille_mew_meowzer: + name: '&aMew Meowzer' + role: '&d' + dialog: + - Meooooww! + - Meow... + - Mreeeooooowww... + - Meowww. + - MEOW! + farewell: + - Prrrr meow! +primis_pontis_mille_observatory_arena_turn_in: + name: Virgo Dexippus + role: + greetings: + - Hi! + dialog: + - Stella knows a lot. + - Stars have so much to tell. + - The light tells all. + farewell: + - May the moon light your way. +primis_pontis_mille_royal_guard_centurion: + name: '&4Royal Guard Centurion' + role: '&8' + dialog: + - No dallying! + - Set up camp! + - Where are our reinforcements? + - How many have fallen? + - We need to reorganize! + farewell: + - Tread lightly and carry a big sword. +primis_pontis_mille_scout_1: + name: '&cSyra Ursacius' + role: '&cWounded Scout' + greetings: + - Hail! + dialog: + - I can barely hold on... + farewell: + - Bye! +primis_pontis_mille_scout_2: + name: '&cSparax Auxilius' + role: '&cWounded Scout' + greetings: + - Hail! + dialog: + - The pain... + farewell: + - Bye! +primis_pontis_mille_scout_leader: + name: '&cBlepharo Octavius' + role: '&cScout Leader' + greetings: + - Hail! + dialog: + - It was too much... + farewell: + - Bye! +primis_pontis_mille_shogun: + name: '&6Navita' + role: '&c' + greetings: + - Yes? + dialog: + - Can I help you? + farewell: + - Walk softly, and carry a big gun. +primis_pontis_mille_slums_generic_npc_1: + name: '&7Gallicles Rex' + role: '&7' + dialog: + - It's not much but its our\nlittle part of town + farewell: + - Later. +primis_pontis_mille_slums_generic_npc_2: + name: '&7Gallicles Caelistis' + role: '&7' + dialog: + - Day by day... + farewell: + - '...' +primis_pontis_mille_slums_generic_npc_3: + name: '&7Nicodemus Frontinus' + role: '&7' + dialog: + - Fresh water for\nthe home. + farewell: + - The well serves\nus well +primis_pontis_mille_slums_generic_npc_4: + name: '&7Cocus Lucio' + role: '&7' + dialog: + - Hope you're having\na great day. + farewell: + - Enjoy your stay. +primis_pontis_mille_slums_generic_npc_5: + name: '&7Cornelia Florius' + role: '&7' + dialog: + - Which one should\nI get... + farewell: + - So many pretty\nflowers. +primis_pontis_mille_slums_generic_npc_6: + name: '&7Rutilia Placidus' + role: '&7' + dialog: + - I love it here. + - The smell of hay\nmakes me happy. + - My favorite place to\nrelax after a hard day. + farewell: + - Hay ya later! +primis_pontis_mille_slums_npc_1: + name: '&7Lena Lucan' + role: '&7' + dialog: + - Just one loaf of bread... + farewell: + - Wonder what tomorrow brings. +primis_pontis_mille_slums_npc_2: + name: '&7Tranio Florens' + role: '&7' + dialog: + - Doing OK today\nactually. + farewell: + - Night save ya. +primis_pontis_mille_slums_npc_3: + name: '&7Rufia Tertulus' + role: '&7' + dialog: + - At least something\ngood for\nthe kids. + - Not much at\nthe market... + - I cannot\nafford that. + farewell: + - Later. +primis_pontis_mille_slums_npc_4: + name: '&7Fabia Praetextus' + role: '&7' + dialog: + - Just close my eyes\nfor a second. + - Gotta imagine I am\nat a better place. + farewell: + - Goodbye. +primis_pontis_mille_slums_npc_5: + name: '&7Augustina Verrucosis' + role: '&7' + dialog: + - So many mouths\nto feed. + - Maybe some fruit\nfor the little\nones. + farewell: + - Bye. +primis_pontis_mines_guard_1: + name: '&cPontis Guard' + role: '&c' + greetings: + - HELP!!! + dialog: + - Please kill them! + - I am so scared. +primis_pontis_mines_guard_2: + name: '&cPontis Guard' + role: '&c' + greetings: + - SOMEONE PLEASE!!! + dialog: + - I don't wanna die! + - Can't hold out any more. +primis_pontis_mines_guard_3: + name: '&cPontis Guard' + role: '&c' + greetings: + - SAVE ME!!! + dialog: + - Are they gone? + - GET ME OUT! +primis_pontis_outpost_officer: + name: '&4NAME ME' + role: '&8' + dialog: + - I am unfinished! + - There is supposed\nto be an outpost\nhere. + farewell: + - Bye! +primis_pontis_redwoods_injured_lumberjack: + name: '&6Lyco Lupicinus' + role: '&6' + greetings: + - Heyo! + dialog: + - Darn saw! + - Got me again... + farewell: + - See you later. +primis_pontis_redwoods_lumberjack: + name: '&6Ligna Crispian' + role: '&6' + greetings: + - Greetings! + dialog: + - I love the look of a healthy tree. + - The brown tree really smells. + - |- + Pretty sure I saw a wolf on two legs + creeping around at night around here. + farewell: + - Until next time. +primis_pontis_redwoods_lumberjack_generic_1: + name: '&6Mulier Proculus' + role: '&6' + greetings: + - Hey-yo! + dialog: + - I wish they would leave us alone. + - Perfect day for logging. + farewell: + - Pinecone ya later! +primis_pontis_redwoods_lumberjack_generic_10: + name: '&6Piscatores Trenico' + role: '&6' + greetings: + - Well met! + dialog: + - Go away wolves! + - Leave me alone, darn fur-balls! + - Hah! Try and reach me up here! + farewell: + - Bye, Bye! +primis_pontis_redwoods_lumberjack_generic_2: + name: '&6Alanus Hermina' + role: '&6' + greetings: + - Hi... + dialog: + - Not so loud, keep it down. + - I am catching an extra break. + - Don't tell em I am here. + - Logging is tough work... + farewell: + - Later +primis_pontis_redwoods_lumberjack_generic_3: + name: '&6Lena Triarius' + role: '&6' + greetings: + - What's up! + dialog: + - Just standing here buzzin! + - Operating the saw is kinda fun. + - Gotta make sure you don't get hurt. + farewell: + - Catch you later! +primis_pontis_redwoods_lumberjack_generic_4: + name: '&6Aquila Isatis' + role: '&6' + greetings: + - How's it going! + dialog: + - Darn logs! + - No, not that way! + - Float better!!! + - Yep, that will do it. + farewell: + - See ya! +primis_pontis_redwoods_lumberjack_generic_5: + name: '&6Sulpicio Sidonius' + role: '&6' + greetings: + - Hi! + dialog: + - Nothing like a nice fire! + - Just relaxing after an honest day of work. + - Join us! + farewell: + - Bye, friend! +primis_pontis_redwoods_lumberjack_generic_6: + name: '&6Strobilus Clemens' + role: '&6' + greetings: + - Salutations! + dialog: + - Chopping like a beaver! + - The fastest axe in the west. + - No tree is a match for me! + farewell: + - Smell ya later! +primis_pontis_redwoods_lumberjack_generic_7: + name: '&6Candidus Nigellus' + role: '&6' + greetings: + - Greetings! + dialog: + - Fastest axe...my bottom! + - Don't take his ramblings seriously. + - Mr. big-shot sure has a lot to say. + farewell: + - Goodbye! +primis_pontis_redwoods_lumberjack_generic_8: + name: '&6Strobilus Clemens' + role: '&6' + greetings: + - I'm a bit busy! + dialog: + - We need to increase production... + - If we raise the cost... + - Need to order more axes. + farewell: + - Uh... +primis_pontis_redwoods_lumberjack_generic_9: + name: '&6Martinus Lepontus' + role: '&6' + greetings: + - Woah, hello! + dialog: + - You're coming down big one! + - I will show you! + - My axe, your bark, they should meet. + - Start off with a good chop. + farewell: + - Scared me... +primis_pontis_redwoods_lumberlord: + name: '&6Magnus Castorea' + role: '&6' + greetings: + - HELLO! + dialog: + - Nothing like healthy wood. + - |- + For every tree we cut, + we plant a new one! + - Big brown logs, yep. + farewell: + - BYE! +primis_pontis_redwoods_reyn: + name: '&6Reynus Protectoris' + role: '&6' + greetings: + - I am turning up the heat! + - Hiya! + dialog: + - Are you into logs? + - I love the smell of lumber! + farewell: + - See you later. + - Bye bye! +primis_pontis_scrapper: + name: '&7Fragmentum' + role: '&8' + greetings: + - Got something to scrap? + - Got trash? + - Need scrappin'? + dialog: + - I'll scrap anything you bring! + - Need scrap? + - Want scrap? +primis_pontis_smelter: + name: '&7Orbis' + role: '&8' + greetings: + - Want to upgrade gear? + dialog: + - Need upgrade orbs? + - I'll make upgrade orbs for scrap! + - Bring me scrap! +primis_sewer_donatello: + name: '&5Donatello' + role: '&dSewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_sewer_leonardo: + name: '&1Leonardo' + role: '&9Sewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_sewer_michelangelo: + name: '&6Michelangelo' + role: '&eSewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_sewer_raphael: + name: '&4Raphael' + role: '&cSewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_spa_attendee_1: + name: '&fNatsumi' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_2: + name: '&5Hanako' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_3: + name: '&3Tamika' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_4: + name: '&9Zaphra' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_5: + name: '&4Chie' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_6: + name: '&fKatashi' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_7: + name: '&dAkihiko' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_8: + name: '&6Sheranee' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - Rawr... + - OwO + farewell: + - Have fun! +primis_spa_staff: + name: '&cAozora' + role: '&7' + dialog: + - Enjoy the hot spring! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_staff_2: + name: '&6Rei' + role: '&7' + dialog: + - Enjoy the hot spring! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_terravilla_annoyed_explorer: + name: '&6Dorippa Sarimarcus' + role: '&6' + greetings: + - How's it going. + dialog: + - Not again. + - Stuck once more. + farewell: + - Be seeing you. +primis_terravilla_explorer: + name: '&6Telestis Senna' + role: '&6' + greetings: + - How goes it. + dialog: + - Always so\nbusy. + - Need a bag? + farewell: + - Bye. +primis_terravilla_generic_npc_1: + name: '&6Stephanium Major' + role: '&6' + greetings: + - Welcome to Terravilla! + dialog: + - Watch out for the\nTwo Legged Terrors! + - Here to check out the ruins? + farewell: + - Bye. +primis_terravilla_generic_npc_10: + name: '&6Mallia Galvisius' + role: '&6' + greetings: + - Heyo! + dialog: + - I would rather be in\ndown in the ruins... + - Hog watching to\npass the time. + farewell: + - Laters. +primis_terravilla_generic_npc_11: + name: '&6Papiria Virginius' + role: '&6' + greetings: + - Ok then... + dialog: + - Hit him harder! + - Woah! Good one! + - Yeah! Mess him up! + farewell: + - Yep... +primis_terravilla_generic_npc_12: + name: '&6Umbria Maccalus' + role: '&6' + greetings: + - What! + dialog: + - Is a girl not\nallowed to be\non a rooftop. + - Just try and\nget me down! + farewell: + - Yeah, whatever... +primis_terravilla_generic_npc_2: + name: '&6Delphium Assanius' + role: '&6' + greetings: + - Leave me alone! + dialog: + - What are you\nlooking at. + farewell: + - Scram! +primis_terravilla_generic_npc_3: + name: '&6Stephanium Vopiscus' + role: '&6' + greetings: + - Leave me alone! + dialog: + - What are you\nlooking at. + farewell: + - Scram! +primis_terravilla_generic_npc_4: + name: '&6Simo Clericus' + role: '&6' + greetings: + - Hey! + dialog: + - Heard the hog is on\nthe lift again. + farewell: + - Bye. +primis_terravilla_generic_npc_5: + name: '&6Harpax Colias' + role: '&6' + greetings: + - Ello. + dialog: + - The bo...I mean the\nOverseer is upstairs. + farewell: + - Laters. +primis_terravilla_generic_npc_6: + name: '&6Sulpicio Epolonius' + role: '&6' + greetings: + - Hi there. + dialog: + - I hope the ruins\nopen up again soon. + - I miss artifact\nhunting. + farewell: + - Goodbye. +primis_terravilla_generic_npc_7: + name: '&6Baebia Lucan' + role: '&6' + greetings: + - '...' + dialog: + - Cringe... + farewell: + - '...' +primis_terravilla_generic_npc_8: + name: '&6Novia Longinus' + role: '&6' + greetings: + - '...' + dialog: + - Are you always\nstaring at people? + - How about some\nprivacy? + farewell: + - '...' +primis_terravilla_generic_npc_9: + name: '&6Septimia Baro' + role: '&6' + greetings: + - Oh, hey. + dialog: + - If it opens up again\nthen I gotta go\nget more of these. + - What is this skull\nnfrom hmm... + farewell: + - '...' +primis_terravilla_overseer: + name: '&6Lutum Princeps' + role: '&6' + greetings: + - Yes? + dialog: + - What is it\nnow... + - I need to check\nup on them. + - At least I\nam not bored. + farewell: + - Good luck. +primis_terravilla_researcher: + name: '&6Plautia Suilius' + role: '&6' + greetings: + - Hmm... + dialog: + - Maybe if... + - That can't be right + - Not sure... + farewell: + - Later... +primis_traveler_1: + name: '&6Lysidamus Nolus' + role: '&6' + greetings: + - Hello stranger! + dialog: + - On my way back from the village. + - Heading to the village? + - Good luck on\nyour travels. + farewell: + - Roads bless you. +primis_traveler_2: + name: '&6Citro Gala' + role: '&6' + greetings: + - Hi! + dialog: + - On my way back\nfrom the village. + - Coming from Pontis Mille or? + - Good luck! + farewell: + - Roads bless you. +primis_traveler_3: + name: '&6Bromia Culleolus' + role: '&6' + greetings: + - Hello! + dialog: + - Are you too going\nto the village? + - I heard it's pretty\ncold there at\nthe village. + - Phew! Almost there!\nI gotta keep going. + farewell: + - Roads bless you. +primis_traveler_4: + name: '&6Demenis Nolus' + role: '&6' + greetings: + - Hello stranger! + dialog: + - Good to see someone\nelse on the road. + - Almost reached the village. + - Phew! + farewell: + - Roads bless you. +primis_traveler_5: + name: '&6Callipho Classicius' + role: '&6' + greetings: + - Heya! + dialog: + - I need better shoes. + - Soon I will\nbe home. + - Good to see the\nfields again! + farewell: + - Safe travels! +primis_traveler_6: + name: '&6Rodenus Palis' + role: '&6' + greetings: + - Hi there! + dialog: + - I am on my way back\nfrom the village. + - Good to see\nPontis Mille again. + - Is my brother lost again... + - Where is he? + farewell: + - Later! +primis_traveler_7: + name: '&6Gorenus Palis' + role: '&6' + greetings: + - Hey... + dialog: + - Am I lost again? + - This isn't Pontis Mille. + - Where am I? + - Uhh, this doesn't\nseem like the\nright way... + farewell: + - Bye. +quest_giver: + name: Qel'Thuzad + role: + greetings: + - Salam, petualang!\nMencari quest? + - Aku punya quest! + - Merasa... suka berpetualang? + dialog: + - Selesaikan quest guild\nuntuk mendapatkan hadiah menarik! + - Tingkatan quest lebih tinggi mendapatkan\nhadiah lebih bagus! + - Tingkatan quest lebih tinggi membuat\nkamu memburu monster lebih tinggi! + - Ingin tantangan lebih sulit?\nTingkatkan guild rank mu! + - Pastikan perlengkapan mu \nuntuk quest ini! + farewell: + - Perjalanan yang aman, teman. + - Selamat berburu! + - Panjang Umur dan sejahtera! + - Silahkan kembali dengan Shiled,\nmu. + - Hiduplah sebelum mati! + - Kekuatan sebelum kelemahan! + - Perjalanan sebelum tujuan! +refiner_config: + name: Ralph + role: + greetings: + - Mau upgrade scrap mu? + - Punya scrap? + - Mencari scrap level rendah! + - Salam, mendapatkan scrap? + - Saya akan mendaur ulang scrap kamu! + dialog: + - Kamu mau upgrade scrap? + - Upgrade your scrap here! + - Tingkatkan10 scrap untuk level lebih tinggi! + - Pakai scrap mu lebih bermanfaat! + - Dapat scrap level rendah? + farewell: + - Silahkan datang kembali ketika kamu\nmemiliki banyak scrap level rendah + - Jangan lupa untuk jadikan\nscrap bermanfaat! + - Go get into a scrap! +repairman_config: + name: Reggie + role: + greetings: + - Perbaiki barang Kamu! + - Perbaiki barang untuk scrap! + - Pakai scrap untuk durability! + - Butuh perbaikan? + - Punya barang rusak? + dialog: + - Perbaikan terbaik di kota! + - Saya dapat perbaiki barang mu! + - Butuh perbaikan? + - Aku dapat memperbaiki barang mu! + - Perlu perbaiki barang elite? + farewell: + - Jangan lupa untuk melakukan perawatan! + - Saya akan berada di sini jika Kamu membutuhkan saya! + - Panggil saya bip jika Kamu ingin menghubungi saya,\njika Kamu tidak ingin menghubungi saya, tidak apa-apa +santa: + name: '&4Saint Nick' + role: '&c' + greetings: + - Ho ho ho! + dialog: + - I have lost some presents, \ncan you help me? + - Dear traveller, I have\na request for you! + - Can you help an old man\nin his time of need? + farewell: + - Ho ho ho! +scrapper_config: + name: Kelly + role: + greetings: + - Ingin menyingkirkan item? + - Ingin mendaur ulang barang? + - Mencari scrap? + - Apakah scrap 'o clock! + - Waktunya Scrap! + dialog: + - Scrappy deals! + - Dapatkan scrap mu disni! + - 75% kesempatan untuk berhasil! + - Tidak ada pengembalian uang. + - Daur ulang, gunakan kembali, kurangi! + farewell: + - Silahkan datang kembali ketika kamu\nmemiliki banyak scrap + - Jangan lupa untuk jadikan\nscrap bermanfaat! + - Happy scrapping! +smelter: + name: Sam + role: + greetings: + - Punya scrap? + - Memiliki scrap banyak? + - Aku mencium bau scrap pada mu!? + - Tolong aku butuh scrap! + - Beri aku scrap! + dialog: + - Aku akan membuat scrap mu lebih bermanfaat! + - Beri aku scrap dan aku\nakan meningkatkan orbs! + - Scrap itu tidak diperlukan, berikan kepadaku! + farewell: + - Silahkan datang kembali ketika kamu\nmemiliki banyak scrap + - Off to the upgrader you go! +special_blacksmith: + name: Grog + role: + greetings: + - Perlu sesuatu? + - Punya sesuatu yang bagus? + - Kami tidak memiliki tapi kami yang terbaik + - Punya sesuatu yang bagus untuk dijual? + - Kami hanya membeli peralatan Elite Mob. + dialog: + - Kami membeli murah dan menjual mahal,. + - Tidak ada kembalian. + - Benar tidak ada kembalian. + - Tidak ada pengembalian uang. + - No taksies backsies. + - Pembelian di toko bersifat fix. + farewell: + - Silahkan datang kembali\njika ingin membeli barang lebih banyak + - Jangan sampai Kamu terbunuh,\nkami ingin Kamu membawakan kami\nlebih banyak perlengkapan. + - Lain waktu silahkan beli\nyang lebih mahal. + - Jangan lupa, tidak ada kembalian. +test_npc: + name: Test NPC + role: Testing! + greetings: + - Test Greeting! + dialog: + - Test Dialog! + farewell: + - Test Farewell! +travelling_merchant: + name: Jeeves + role: + greetings: + - Punya sesuatu untuk dijual? + - Kamu memanggil? + - Huh? + dialog: + - Aku membeli yang murah! + - Punya sesuatu untuk ku? + - Waktu adalah uang! + farewell: + - Silahkan panggil aku lainwaktu! + - Hanya itu saja? + - Perjalanan yang aman! + - Jangan biarkan kamu terbunuh! + - Selamat berburu! +unbinder: + name: Ulfric + role: + greetings: + - Salam. + - Ketemu lagi. + - Hai!, Teman. + - Yes? + - Ada yang bisa ku bantu? + dialog: + - Aku akan melepas ikatan item Kamu\ngunakan gulungan untuk lepas ikatan yang sangat langka. + - Hanya aku satu-satunya yang memenuhi syarat\nuntuk melepaskan ikatan barang Kamu. + - Punya unbind scroll? + farewell: + - "Jangan lupa: Gunakan unbind\nscrolls dengan baik." + - Perjalanan yang aman, teman. +wood_league_arena_master: + name: Gladius + role: + greetings: + - Welcome to the\nArena! + dialog: + - Prepared to face the arena? + farewell: + - Return with your shield, or on it! +wood_league: + arenaName: Wood League + arenaMessages: + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - wave=8:message=&8[Gladius] &fNot bad, but what if every enemy is a &cmelee &fenemy? + - wave=9:message=&8[Gladius] &fNice, nice, but what if they're all &cranged &finstead? + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - wave=44:message=&8[Gladius] &fThis is clearly not working, let me think of something... + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +ag_welcome_quest_0: + customObjectives: + Objective1: + dialog: + - '&8[&aCasus&8]&f Welcome to the Adventurer''s Guild Hub, the hub for all things EliteMobs!' + - You can always get back here using &2/ag&f! + - Talk to me again for a quest! + name: '&2Finding the AG!' + questLore: + - + - + questAcceptDialog: + - '&8[Odigos]&f Alright, make sure you use &2/ag &f or &2/adventurersguild&f to head off to the Adventurer''s Guild Hub!' + - Make sure you talk to Casus when you're there! +ag_welcome_quest_1: + customObjectives: + Objective3: + dialog: + - '&8[&aGreg&8]&f Want to buy or sell something? I''ve got a little of everything!' + Objective4: + dialog: + - '&8[&aCharles&8]&f Want to learn about fighting elites? Just talk to me!' + Objective1: + dialog: + - '&8[&aHermes&8]&f I take you back to where you were before! Just talk to me again!' + Objective2: + dialog: + - '&8[&aBartley&8]&f Need a stiff drink? My drinks pack an extra punch!' + Objective7: + dialog: + - '&8[&aQel''Thuzad&8]&f These Elite monsters, where do they keep coming from?' + - + - + - Just talk to me to get one! + Objective12: + dialog: + - '&8[&aGrog&8]&f Want to buy special items? I''ve got just the thing!' + Objective8: + dialog: + - '&8[&aRalph&8]&f Get more out of your scrap by upgrading it! Just talk to me at any time.' + Objective13: + dialog: + - '&8[&aUlfric&8]&f If you bring me a very special and rare item, I can unbind your Elite items.' + - + - + Objective5: + dialog: + - '&8[&aTim&8]&f Want to upgrade your Elite Items? Just get an upgrade orb from Sam over there!' + Objective10: + dialog: + - '&8[&aKelly&8]&f Got extra Elite items? Don''t know what to do with them? Give them to me, and I''ll turn them into scrap!' + - + - + Objective6: + dialog: + - '&8[&aGillian&8]&f Do you seek power? Do you desire to reach new heights? Talk to me to unlock new guild ranks, and reach levels of power you never thought to be possible!' + Objective11: + dialog: + - '&8[&aSam&8]&f Got extra scrap? I can refine that into Upgrade Orbs, which you can give to Tim to upgrade your Elite items with!' + Objective9: + dialog: + - '&8[&aReggie&8]&f Need your Elite items repaired? Just bring me some scrap, and I''ll make them as good as new!' + - + - + name: '&2Welcome to the AG!' + questLore: + - '&aMeet the Adventurer''s Guild NPCs!' +primis_caeruleaum_a_can_of_worms: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis] &fPlease tell me you''re the one bringing the bait.' + name: '&2A can of worms' + questLore: + - Here, take the bait and go. + - Please hurry! + questAcceptDialog: + - '&a[Callidus Piscatus]&f My friend is in a boat near the docks!' + - '&7&oI should hurry to the boat.' + questCompleteMessage: + - '&a[Piscis Nemesis]&f You brought bait? Perfect!' + - The bait should lure it out! + - '&7&oI should talk with Nemesis.' +primis_caeruleaum_fishing: + name: '&2Fish Bait' + questLore: + - We have a big problem! + - + - + - + - + - but he can't do anything without the right bait! + - I'll tell you where to go get &eFish Bait &f, please go help my friend! + - I promise I'll reward you! + questAcceptDialog: + - '&a[Callidus Piscatus]&f Time is of the essence! There are a bunch of &cBig Worms&f to the right when you leave the village!' + - Get 5 and come back here and I will prepare them for use. + - '&7&oI should go get some Fish Bait.' + questCompleteMessage: + - '&a[Callidus Piscatus]&f You brought bait? Perfect!' + - I'll prepare it right away! + - '&7&oI should talk to &aCallidus &7&oagain and collect the prepared bait.' +primis_caeruleaum_fishing_2: + name: '&2Monster Bait' + questLore: + - That did the trick! Hop into the wormhole, I'll hold the boat! + - Let's show this monster the wrath of a fisherman! + questAcceptDialog: + - '&a[Piscis Nemesis]&f Hop in, I''ll hold the boat!' + - Don't forget to put on that &eDiving Helmet&f! + - '&7&oI should enter the wormhole and defeat the Sea Monster.' + questCompleteMessage: + - '&a[Piscis Nemesis]&f Haha! What a show!' + - '&fOf course, I had the situation under control this entire time, but you sure helped a bit!' + - '&fHere, you can have this!' + - '&7&oThe monster is dead and the shore is safe. Seems like a job well done.' +primis_caeruleaum_fletching: + name: '&2Arrow Hunter' + questLore: + - Got a few minutes to help out? + - With all the recent raids, we have found ourselves out of &eGrappling Arrows&f! + - It is usually my job to get them, but things are just a + - bit too dangerous right now for me to go dungeon delving. + - If you could get these &eGrappling Arrows&f for me, + - I will teach you how to use them! + questAcceptDialog: + - '&a[Ventus Artifex]&f Please bring me 10 &eGrappling Arrows &ffrom the ruins just beyond the village.' + - The &cUndead Skeletons&f and &cDrowned&f from of old usually carry these. + - '&7&oI should go kill &cSkeletons&7&o and &cDrowned&7&o at the ruins near the village for their &eGrappling Arrows&7&o.' + questCompleteMessage: + - '&a[Ventus Artifex]&f Great work!' + - '&eGrappling Arrows &fcan be used on &cTarget Blocks &fto get to hard to reach places.' + - They are a must have for the aspiring ancient ruin delver. + - Here is your reward! + - How about putting your knowledge to the test? + - '&7&oSeems like &aVentus Artifex&7&o has a challenge for me.' +primis_caeruleaum_fletching_2: + name: '&2Shield Hunter' + questLore: + - You got the arrows? Great! + - Use those arrows with a bow to climb the tower! + questAcceptDialog: + - '&a[Ventus Artifex]&f Use the arrows you just received to go to the ruins and shoot the targets with them!' + - + - + - + - + - '&7&oI should go get the &eShield&7&o inside of the ruins, using the &eGrappling Arrows&7&o in order to shoot the targets inside of the building.' + questCompleteMessage: + - '&a[Ventus Artifex]&f Outstanding!' + - Truly you are a real ruins delver! + - Here is your reward! + - '&7&oSeems like Grappling Arrows will be useful in the future.' +primis_caeruleaum_foraging: + name: '&2Wolf Bait' + questLore: + - I heard you were looking to help out around here. + - There is a &dDen of Wolves&f nearby that is + - really impeding my foraging for the village! + questAcceptDialog: + - '&a[Venator Pabulatus]&f If you can get rid of those pesky &cWolves&f, I will reward you handsomely!' + - I am getting too old to be dealing with the wild things of these lands... + - '&7&oI should go kill the &cWolves&7&o in the den to the Southeast of the village.' + questCompleteMessage: + - '&a[Venator Pabulatus]&f I knew I could count on you!' + - Thank you for all of your help! + - Here is your reward as promised. +primis_farmstead_lighthouse_keeper_2: + customObjectives: + Objective1: + dialog: + - "&a[Jeeves]&f &2Amavit&f sent you? What's this about a lighthouse? My, what a discovery!\n&fThis will revolutionize my job as a traveling merchant! Here, have these &eScrolls&f - just call me and I'll be there in a jiffy!\n&7&oSeems like &aJeeves&7&o has something for me. I should talk to him." + name: '&2The Mysterious Lights' + questLore: + - + - + - My father &aJeeves&f went to the top to check but he has not returned yet. + - + - + questAcceptDialog: + - '&a[Amavit]&f Thank you once again, and good luck. Hopefully it''s nothing.' + - '&7&oI should go to the &dTop of the Lighthouse&f, investigate the issue and then report back to &aAmavit''s&f father &aJeeves&f in the village.' + questCompleteMessage: + - '&7&oThese scrolls seem mighty useful! I should use the &dLighthouse&7&o to get back to the &dFarmstead&7&o and keep moving.' +primis_gladius_assassins: + name: '&5Who snipes the snipers?' + questLore: + - The roofs of &dGladius&f are covered in &cAssassins&f! + - Venturing out to the streets is a death sentence. We need to deal with these snipers! + - + - + questAcceptDialog: + - '&a[Belli] Deal with those &cAssassins&f! Remember to use the &eGrappling Arrows&f!.' + - '&7&oI should kill those &cAssassins&7&o.' + questCompleteMessage: + - '&a[Belli]&f You dealt with those &cAssassins&f? Good! That''s one headache dealt with!' +primis_gladius_clear: + name: '&5Taking back the streets' + questLore: + - I don't need to tell you that the town is being invaded, do I? + - We are offering a reward to those willing to put a dent in the amount of &cInvaders&f. + - Are you up for it? + questAcceptDialog: + - '&a[Belli] &fJust go out there and thin their numbers!' + - '&7&oI go out and clear the streets of &dGladius&7&o.' + questCompleteMessage: + - '&a[Belli]&f Look at that, the Gods have provided with a true warrior in our time of need! I have a job for a person like you.' + - '&7&oSeems like &aBelli&7&o has a plan for me. I should talk to her..' +primis_gladius_prayer: + name: '&5Leap of faith' + questLore: + - I am not going to sugarcoat it, things look downright grim! + - The walls have fallen, the streets are teeming + - with the &cUndead&f and I just ran out of drinks. + - At times like these, people turn their hope to + - some kind of divine intervention! + - There is a &dPath&f, lit by candles, that leads to a + - '&dSanctuary in the Mountains&f.' + - Warriors go up this path and defeat the &cMonk&f which guards + - the sanctuary in order to be blessed by the war god in combat. + - It may just be a superstition, but would it hurt + - to give people hope? + - The fact you made your way here shows you are a cut above + - the rest - go up the mountain and defeat the &cMonk&f. + - All warriors will feel better knowing they are being watched over. + questAcceptDialog: + - '&a[Belli] &fGo &dUpstairs&f and follow the candles! Careful not to fall, the path is treacherous!' + - '&7&oI should follow the &dandle Path&7&o and defeat the &cMonk&7&o.' + questCompleteMessage: + - '&a[Belli]&f You completed the prayer? Thank you, the soldiers will feel relieved to hear it.' +primis_gladius_ships: + name: '&5A sinking feeling' + questLore: + - Have you seen them? The dozens of ships just outside + - of &dGladius&f? They are to blame for all of this. + - We never expected an invasion from the &dBlood Temple&f, + - much less one done by siege weapons mounted on boats! + - We must do something about it. Killing the &cAdmiral&f + - and some of the forces won't give us back what we lost, + - but it will sure make us feel better. + questAcceptDialog: + - '&a[Belli] &fKill the &cAdmiral&f and some of the troops on the boats. Be careful about their water superiority! I recommend using &eGrappling Arrows&f to move around the ships.' + - '&7&oI should go slay the &cAdmiral&7&o and some of its troops on the boats just &dOutside of Gladius&7&o.' + questCompleteMessage: + - '&a[Belli]&f The admiral is no more? Why, I feel better already!' +primis_gladius_sunken_ship: + name: '&5Sunken ship' + questLore: + - Now that you took care of the &cMariner Forces&f I got + - another task for you. + - The &dSunken Ship&f should be reachable now. + - You see some time ago one of our ships got sunk, + - unfortunately it was carrying &eImportant DDocuments&f. + - I need you to reach the &dSunken Ship&f and kill any threats + - around and retrieve the &eDocuments&f. + - Come back to me after you have completed the task. + questAcceptDialog: + - '&a[Belli] &fYou will find the ship in the waters to the south-west. Give them hell!' + - '&7&oI should go collect the &eDocuments&7&o and slay any &cMariners&7&o near the ship.' + questCompleteMessage: + - '&a[Belli]&f Back already? Excellent work! We really needed these &eDocuments&f.' +primis_gladius_supplies_1: + name: '&cSupplying problems' + questLore: + - We are running out of &eSupplies&f! + - '&dGladius&f is a fortress equipped to last a long siege' + - without any issues, but that's assuming we have + - access to the &dWarehouse&f! + - Unfortunately the &dWarehouse&f was one of the first places to fall, + - and now we are slowly starving to death! + - If you can clear a path to the &dWarehouse&f and get some &eSupplies&f + - that would greatly aid in the war effort! + questAcceptDialog: + - '&a[Cibus]&f The &dWarehouse&f is hard to miss! It''s the extra large warehouse-looking building near the part where the wall fell! Grab some &eSupplies&f and get them back here!' + - '&7&oI should go to the &dWarehouse&7&o and bring back &eSupplies&7&o.' + questCompleteMessage: + - '&a[Cibus]&f You brought the &eSupplies&f back? Fantastic! Meanwhile I came up with the perfect idea for the drinks - and it should be something that will lift the spirits of the soldiers!' + - '&7&oSeems like the &aCibus&7&o has a plan, I should talk to them.' +primis_gladius_supplies_2: + name: '&cSupplying more problems' + questLore: + - We have food, but what about drinks? + - Some would say it's foolish to get drunk in the middle + - of a war, but if now then when? + - The &cBarkeep&f across the street kept all of the good + - stuff in the &dBasement&f. + - I think you know where I'm going with this! + - Go to the &dBasement&f of the tavern across the street and get + - the &eGood Stuff&f. If you find the &cBarkeep&f, I'd consider it a + - personal favor if you free him from this curse of undeath. + - We are pretty sure that he was in the &dBasement&f when the + - invasion happened so odds are he is still there, + - though probably no longer himself. + - Be careful! + questAcceptDialog: + - '&a[Cibus]&f The &dTavern&f is right across the street, hard to miss! Just head to the &dBasement&f and get the &eGood Stuff&f!' + - '&7&oI should go to the &dBasement&7&o of the tavern and get "the &eGood Stuff&7&o".' + questCompleteMessage: + - '&a[Cibus]&f You defeated the &cBarkeep&f? I thank you for freeing my old man from this accursed undeath. Here, I''ll have the first drink with you.' +primis_ice_village_all_out_of_chains: + customObjectives: + Objective1: + dialog: + - '&a[Orbis]&f Oh, the Ice Village chain shipment. Yes, it is right in that chest over there.' + - Sorry for not sending it over, but we were quite busy and had no time. + - It's all paid for so feel free to just grab it. + name: '&2All out of chains' + questLore: + - Hey, you came from &dPontis Mille&f right? + - How would you like to help us out. + - Here at the jail we tend to go through a + - lot of chains... + - Especially the chains holding up the cages. + - They rust a lot and then they break. That's + - how one of the prisoners escaped. The rusty + - chain snapped, the cage fell and he ran. + - We paid for a + - '&eShipment of new chains&f, but it' + - did not arrive yet. If you could go to + - '&dPontis Mille&f and fetch our' + - '&eShipment of Chains&f' + - then that would be great! + questAcceptDialog: + - '&a[Philolaches Triferus]&f Go talk to Orbis. They are the ones that make the chains.' + - '&7&oI should go talk to &a&oOrbis&7&o and bring back the &e&oShipment of Chains&7&o.' + questCompleteMessage: + - '&a[Philolaches Triferus]&f Those are the chains! Thank you for getting these, we really needed them.' +primis_ice_village_catch_me_if_you_can: + name: '&2Catch me if you can' + questLore: + - What timing! I was just looking for someone to go capture our + - '&cEscaped Prisoner&f.' + - + - + - + - + - + - + questAcceptDialog: + - '&a[Romanus Superbus]&f He must be somewhere in the mountains.' + - '&7&oI need to find the &c&oEscaped Prisoner&7&o and bring him back to the prison.' + questCompleteMessage: + - '&a[Romanus Superbus]&f Well, well, well. If it isn''t our escaped sleeping beauty.' + - Good work. A job well done deserves a good payment, here ya go. + - '&aRomanus&7 hands you a heavy bag of coin.' +primis_ice_village_get_them_off_my_back: + name: '&2Get them off my back!' + questLore: + - Let me tell ya, I sure am glad you are here to help, ha ha. + - Our mission here is to hunt &cRazorbacks&f and keep their numbers in check. + - It's not all about population control either. + - They provide us with valuable leather, tusks and meat. + - Not sure this village would be around without them. + - + - + - + - + - + - + - We only need you to cull the &cBabe&f and the &cJuvenile Razorbacks&f. + - + - + - + - + - Would mean a lot to me if you could retrieve it. + questAcceptDialog: + - '&a[Alanus Isatis]&f You must have seen the &cRazorbacks&f on your way here so I assume you know where to find them.' + - '&7&oI need to cull the &c&oRazorback&7&o population and retrieve &e&oAlanus'' Dagger&7&o.' + questCompleteMessage: + - '&a[Alanus Isatis]&f Well done friend! That should help a lot.' + - + - + - The dagger is nothing special, but it was a handmade gift from my late father. + - Next time you're thirsty, the drinks are on me! +primis_ice_village_gotta_keep_warm: + customObjectives: + Objective1: + dialog: + - '&a[Severinus Martius]&f Ha ha! That should keep me warm for another couple of weeks!' + - Hey friend, you heading for &dCaerullium Village&f by any chance? + name: '&2Gotta keep warm' + questLore: + - We deliver the &aLighthouse Keeper&f some + - of our strong stuff every couple of weeks. + - It keeps him warm during the colder days. + - It's a small gesture of thanks for all his + - hard work. Any chance you could help out + - and bring over the next batch? + questAcceptDialog: + - '&a[Grania Cecilius]&f You can find the lighthouse to the East. Thanks!' + - '&7&oI should go to the &d&oLighthouse&7&o and deliver these to the &a&oLighthouse Keeper&7&o.' + questCompleteMessage: + - '&a[Severinus Martius]&f If you''re heading over there then I would appreciate if you could deliver some of these to my good friend &aJeeves&f.' + - '&7&oSeems like the &a&oLighthouse Keeper&7&o has a quest for me.' +primis_ice_village_gotta_see_jeeves: + customObjectives: + Objective1: + dialog: + - '&a[Jeeves]&f Oh! A gift from my friend Severinus you say.' + - Well, thank you for bringing it over. Was nice seeing you again! + name: '&2Gotta see Jeeves' + questLore: + - Now, now it would be really rude of me to keep + - all of the good stuff to myself! + - If you would bother helping me out friend and + - delivering some of the good stuff + - to my friend &aJeeves&f at &dCaerullium Village&f. + - You can get there quickly by taking the + - '&9lighthouse portal&f.' + questAcceptDialog: + - '&a[Severinus Martius]&f The portal is all the way at the top.' + - '&7&oI should go to &d&oCaerullium Village&7&o and deliver some of the good stuff to &a&oJeeves&7&o.' + questCompleteMessage: + - '&a[Severinus Martius]&f Thank you for delivering some of the strong stuff to Jeeves. I know he likes a good drink here and there ha ha!' +primis_ice_village_living_nightmares: + customObjectives: + Objective1: + dialog: + - '&a[Cornelia Ennodius]&f Are they gone? I was so scared. My parents sent you? Thank goodness.' + - + - + - I couldn't escape. I, I...will be fine, I just need a minute... + name: '&2Living nightmares' + questLore: + - I was following her trail, this is where it ends. + - Not sure where she would have gone from here. + - I fear that something bad might have happened. + - Our &aGirl&f takes a lot after me and my special powers. + - Except that hers are a lot more potent, she is capable + - of making powerful emotions manifest in the real world. + - We are running out of time, we need to find her soon. + questAcceptDialog: + - '&a[Sestia Ennodius]&f The trail went cold here, she cannot be that far away...' + - '&7&oI need to find the &a&oMissing Daughter&7&o before something happens to her.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f You found her! Quickly, where is she?' + - Thank you stranger, I will go to her at once! +primis_ice_village_make_them_go_ouch: + name: '&2Make them go ouch' + questLore: + - I had some naughty '&cCustomers&f' + - come visit some days ago. + - They stole the most valuable + - of my &ePossessions&f. + - You need to find them and make sure + - to teach them a lesson. + - Make sure they know that + - '&aViolet&f does not forget to collect.' + questAcceptDialog: + - '&a[Domina Violet]&f They went East past the &9Trees&f.' + - '&7&oI need to make sure that the &c&oCustomers&7&o know not to mess with &a&oViolet&7&o. I also need to retrieve &e&oViolet''s Property&7&o.' + questCompleteMessage: + - '&a[Domina Violet]&f I hope you taught them the value of pain.' + - + - +primis_ice_village_objection!: + customObjectives: + Objective3: + dialog: + - '&a[Glacies Princeps]&f What, absolutely not. I don''t know how he convinced you to come here and beg for his release.' + - + - + - He will never be released. Is that understood. + Objective1: + dialog: + - '&a[Romanus Superbus]&f Release him? Not guilty? Are you mad? You''re lucky I don''t throw you in a cage too for suggesting such nonsense.' + Objective2: + dialog: + - '&a[Luxuria Placidus]&f Who? Never heard of him.' + name: '&2Objection!' + questLore: + - I do not belong here! Surely you can see that? + - I have done no wrong! Stranger will you hear my plea. + - Would you help this poor soul who has been trapped + - here in this awful cage of no fault of his own? + - You must go talk to the + - '&aJail Master&f or the ' + - '&aVillage Leader&f.' + - Or any other + - '&aFriendly Villager&f' + - who would be + - willing to argue for + - my release! + questAcceptDialog: + - '&a[Adrius Calpornius]&f Go talk to them! Get me out!' + - '&7&oI should go talk to the people on my list.' + questCompleteMessage: + - '&a[Adrius Calpornius]&f WHAT?! LIES!!! I never would do such a horrible thing to my family...' + - + - + - '&7Whatever sanity this poor man still had left, is gone now...' +primis_ice_village_run_away_daughter: + customObjectives: + Objective1: + dialog: + - '&a[Sestia Ennodius]&f I could sense you coming.' + name: '&2Run away daughter' + questLore: + - Stranger! Would you help our family? + - Our &aDaughter&f has gone missing. + - She has been gifted with special + - powers just like her &aMother&f + - I fear that last night something + - terrible must have happened to + - make her run away in the middle of + - the night. + questAcceptDialog: + - '&a[Sparax Ennodius]&f My &aWife&f has already gone looking for her.' + - I am sure she is somewhere outside the village. Go find her and talk to her. + - '&7&oI should go look for the &a&oWorried Mother&7&o.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f You were sent by my &aHusband&f to help with the search?' + - '&7&oI should hear out the &a&oWorried Mother&7&o.' +primis_ice_village_silence: + name: '&2Make them go ouch' + questLore: + - Shhh! Do you hear it? + - The annoying screeching. + - Ugh, I cannot take it anymore! + - Listen, I will pay good coin + - if you can find the source + - of that annoying screeching + - and make it stop. + questAcceptDialog: + - '&a[Modestus Eulogius]&f It sounds like it coming somewhere from the hills behind me.' + - '&7&oI should find the source of all the noise and make it stop.' + questCompleteMessage: + - '&a[Modestus Eulogius]&f Both me and my ears thank you!' +primis_ice_village_taking_the_bait: + name: '&2Taking the bait' + questLore: + - These &cFish&f, what is wrong with them! + - I have been out here fishing for days now! + - Not even a single bite. If only I was younger I would show them! + - + - + - And if we cannot catch any, well that is a big problem. + - You will need to go down there and beat them senseless. + questAcceptDialog: + - '&a[Theopropides Nero]&f You wanted to help so here is your chance!' + - '&7&oI must jump into the lake and kill 7 &c&oChilly Salmon&7&o and collect their bodies.' + questCompleteMessage: + - '&a[Theopropides Nero]&f Oh! Look at them! Such big ones!.' + - + - +primis_ice_village_treats_for_the_punished: + customObjectives: + Objective1: + dialog: + - '&a[Eleusium Calenus]&f My wife sent you? Oh, are those treats? My favorite too! She''s such a darling.' + - + - + - 'You tell her I am doing just fine and that I love her very much. ' + name: '&2Treats for the punished' + questLore: + - If you don't mind, could I ask you to do something for me? + - My dear &aHusband&f has been jailed and I know it's tough living a cage all day. + - So I prepared some treats that I was gonna deliver to him. + - + - + questAcceptDialog: + - '&a[Titia Calenus]&f He will be in one of the middle cages.' + - Do not forget to tell him I love him. + - '&7&oI should deliver these treats to the &a&oHusband&7&o.' + questCompleteMessage: + - '&a[Titia Calenus]&f Back so quick! Oh, did he really say that? He is such a sweetie.' +primis_ice_village_wanna_make_a_snowman: + name: '&2Wanna build a snowman' + questLore: + - The kids around the village have been pretty bored lately + - and I've been thinking. There are these + - '&cMagical Creatures&f that inhabit the woods around this' + - village. The creatures fur grows &eMagical Ice Crystals&e. + - When you infuse snow with these &eCrystals&f it makes the + - snow shuffle around and expand and contract. + - And if you build a snowman out of this infused snow + - it makes it look as if the snowman is alive. + - The kids would love it! So, want to help + - this old man cheer up some kids? + questAcceptDialog: + - '&a[Sparax Ennodius]&f You will find the &cCreatures&f in any woods near the village.' + - + - + - '&7&oI should go slay enough &c&oFrost Fur Ursus&7&o to gather 15 &e&oIce Crystals&7&o.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f You gathered enough crystals? Wonderful!' + - I can start making the snowman now, I cannot wait for the kids to see it! +primis_main_quest_: + name: '&2Goblins in the mines!' + questLore: + - This day just keeps getting worse. First, we get ambushed by goblins. + - The we retreat, only to find our army split. Some are dead, many are missing. + - Worst of all, we fear we might've woken the Goblin King. + - Some, hopefully, made it through. We have to set up camp and recover for now. + - If you dare brave into the mines, you are on your own. + - We tried to sneak past them, and it did not go well. + - The only way forward is through bloodshed. + questAcceptDialog: + - '&8[Centurion]&fAre you braving the Goblin Mines? Beware the Goblin King!' + - '&8[Centurion]&fWe hope our scouting party made it past him. Meet up with them if you can.' + - '&8&oI should venture through the mines and defeat the Goblin King.' + questCompleteMessage: + - '&8[Scouting party]&fYou made it through? I almost wish you hadn''t. You won''t believe what lies ahead.' + - '&8&oSounds like the scouting party has bad news for me.' +primis_main_quest_1: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis] &fOh so you were in the ship that beached a few hours ago?' + - + - + - + - + - + - + - '&7&oI should report to the &aFirst Mate &7&oto see if I should help these people!' + name: '&2Shipwrecked!' + questLore: + - You're finally awake? Good! We need your help. + - The ship beached during last night's storm. + - We see a &dLighthouse &fin the distance, so there must be a village there! + - Go talk to the &aVillage Leader &fand see if they can lend use some help! + - The &aFirst Mate &fwent ahead of you, but hasn't returned yet. + - Follow his instructions if you see him! + questAcceptDialog: + - '&a[Captain Squalus]&f Go to the nearby village and see if they will help us!' + - Be careful on your way there, we don't know what lurks around these parts! + - '&7&oI should investigate the nearby village and talk to their leader.' + questCompleteMessage: + - '&a[First Mate Iracundi]&f Darnation! We just can''t catch a break today! Here, it''s clearly dangerous to go alone, take this!' + - '&7&oSeems like First Mate Iracundi has a request for me...' +primis_main_quest_10: + customObjectives: + Objective2: + dialog: + - "&a[Shogun Navita] &f&dGladius&f calls for our aid?\n&7&oSeems like I should talk to the &aShogun&7&o." + name: '&5Bridging the gap' + questLore: + - It is time to call &dPontis Mille&f for aid. + - Let them know of what happened here and tell them we are cashing in our favor. + - + - + questAcceptDialog: + - '&a[General Hasta] &fSafe travels, friend. Remember: Kill the &cGate Keeper&f and make sure our plea reaches &aShogun Navita''s&f ears..' + - '&7&oI should slay the &cGate Keeper&7&o at the &dBridge&7&o and make my way to &aShogun Navita&7&o in &dPontis Mille&7&o.' + questCompleteMessage: + - '&a[Shogun Navita]&f Truly the news you bring me are most disturbing, but I am afraid we already suspected something... unnatural... was going on.' + - '&7&oSeems like &aShogun Navita&7&o wants to talk to me.' +primis_main_quest_11: + customObjectives: + Objective1: + dialog: + - '&a[Major Fortes Bellator]&f Yes, traveler?' + name: '&2Sending a message!' + questLore: + - The tales of your travel are most surprising. + - That you made it alive to here is nothing short of a miracle. + - The forces invading &dGladius&f are insurmountable. + - '&dGladius&f will eventually crumble under their might...' + - Aid?... Ah, yes. Go see &aMajor Fortes Bellator&f. + - He will be able to assist you. + questAcceptDialog: + - '&a[Navita]&f You can find the &aMajor&f on top of those stairs right ahead!' + - '&7&oI should go talk to the &aMajor&f and see if he can help.' + questCompleteMessage: + - '&a[Major Fortes Bellator]&f The &aShogun&f seeks to aid &dGladius&f? I thought he would never ask! But first, we must prepare.' + - '&7&oSeems like &aFortes Bellator&7&o has work for me.' +primis_main_quest_12: + customObjectives: + Objective1: + dialog: + - '&a[Centurion]&f Where are our reinforcements?' + name: '&2Mine path' + questLore: + - I cannot believe what befell &dGladius&f. They hit it fast, + - and they hit it where it hurts most. + - It is our sworn duty to aid our allies. We have failed our + - duty, and we have failed our allies. + - The &cCounselor's&f ordered us to mobilize our troops in several + - zones before the invasion. + - You see, recently and unusual and devastating storm was spotted + - at the &dStorm Temple&f. + - The Royal Guard was ordered to quiet the storm, and the &aShogun&f + - refuses to belay that order. + - Our own guards are in other places, and I fear we will need all + - that we have to take &dGladius&f back. + - The path to the &dStorm Temple&f is treacherous, as it requires going + - through the &dGoblin Mines&f. + - Help our guard clear the mines and make a path to the &dStorm Temple&f! + questAcceptDialog: + - '&a[Fortes Bellator]&fTread lightly, the &dGoblin Mines&f are a dangerous place. Perhaps you should aid the normal guard before assisting the &aRoyal Guard&f.' + - The &dMines&f are north of the city. There are stairs leading to its entrance. + - '&7&oI should see what else I can aid &aFortes Bellator&7&o with, or I can head to the &dGoblin Mines''&7&o entrance.' + questCompleteMessage: + - '&a[Centurion]&fIt is so good to see someone! Has &dPontis Mille&f sent you?' + - '&7&oI should hear what the &aCenturion&7&o has to say' +primis_main_quest_13: + name: '&2Goblins in the mines!' + questLore: + - This day just keeps getting worse. First, we get ambushed by goblins. + - Then we retreat, only to find our army split. Some are dead, many are missing. + - Worst of all, we fear we might've woken the &cGoblin King&f. + - Some, hopefully, made it through. We have to set up camp and recover for now. + - If you dare brave into the mines, you are on your own. + - We tried to sneak past them, and it did not go well. + - The only way forward is through bloodshed. + questAcceptDialog: + - '&a[Centurion]&f Are you braving the &dGoblin Mines&f? Beware the &cGoblin King&f!' + - We hope our &aScouting Party&f made it past him. Meet up with them if you can. + - '&7&oI should venture through the &dMines&7&o and defeat the &cGoblin King&7&o.' + questCompleteMessage: + - '&a[Scouting Party]&f You made it through? I almost wish you hadn''t. You won''t believe what lies ahead.' + - '&7&oSounds like the scouting party has bad news for me.' +primis_main_quest_14: + name: '&2Storm''s end' + questLore: + - It is hard to believe that you pushed through the + - '&dGoblin Mines&f on your own.' + - Perhaps with your fortitude you will be able to face the challenge ahead. + - We attempted to assault the &dStorm Temple&f, and reached its deepest + - confines at a great cost. + - What we found there... It defies understanding. + - It may be hard to believe, but it sounds like the very storm + - itself has materialized as our opponent. + - We do not even know if it can be defeated. We feared we were sent to our deaths. + - + - + questAcceptDialog: + - '&a[Blepharo]&f We have weakened their forces a little, but still, this is no easy task.' + - The Storm is no ordinary opponent. Do not underestimate it. + - '&7&oI should go into the &dStorm Temple&f and slay the &cStorm&f.' + questCompleteMessage: + - '&a[Shogun Navita]&f You WHAT!?' + - Defeated the &cStorm&f? I was told that was impossible! I mean... + - '... it is no use hiding it now. I knew about the &cStorm&f. I knew about the &dGladius&f invasion - I even facilitated it. I did it for my people - for &dPontis Mille&f.' + - '&cCounselor Machiavelli&f convinced me that the &cStorm&f was as unstoppable as Nature itself, and that the fall of &dGladius&f and &dPontis Mille&f was an inevitability that we could but delay through sacrifice.' + - + - + - '&8&oSeems like &aShogun Navita&7&o has a problem he wants me to deal with.' +primis_main_quest_15: + name: '&2Severance payback!' + questLore: + - + - + - + - + - + - + - + - + - + - I bought us time. + - + - + - + - + - He guided us to our doom, and would've gotten away with it had you not appeared. + - Now, there is hope. + - I ask you, please rid us of the treacherous &cCounselor&f. + - + - + - + - + - + - + - I wish to deliver one last message through them. + questAcceptDialog: + - '&a[Shogun Navita]&f &cCounselor Machiavelli&f has retreated to his quarters in the lower city by the market. Be careful, has has amassed a devoted following in his time, and will not go down without a fight.' + - '&7&oIt is time for &cCounselor Machiavelli&f to face righteous retribution.' + questCompleteMessage: + - '&a[Shogun Navita]&f So it is done.' + - '&dPontis Mille&f owes you a great debt, wanderer. Once we finish mobilizing the army we will be ready to right our wrongs and march to &dGladius''&f aid.' + - '&7&a[Shogun Navita]&2 We feared you. We surrendered our allies to you. We dispersed our armies. No more.' + - '&dPontis Mille&2 marches to war, and we shall not walk alone! You shall rue the day you crossed our path.' + - '&7' + - '&7&oSeems like the &aShogun&7&o has a plan. I should talk to him.' +primis_main_quest_16: + customObjectives: + Objective3: + dialog: + - '&a[Demenis Nolus]&f Heading to the village, eh. Just keep going East, follow the road and you should be there in no time!' + Objective4: + dialog: + - '&a[Callipho Classicius]&f Directions? Just head down this road that leads to the graveyards.' + Objective1: + dialog: + - '&a[Glacies]&f Welcome to our village traveler! Please tell me, what brings you here friend.' + Objective2: + dialog: + - '&a[Bromia Culleolus]&f Oh, the way to the village. Yes, just take this road that leads to the mountain.' + - Happy to help! + name: '&2The ice village awaits' + questLore: + - We must send aid to &dGladius&f as soon as possible. + - Champion, there is a village of mighty warriors to the far south. + - You should travel there and inform them that &dPontis Mille&f + - would seek their aid in pushing back the invaders from the &dBlood Temple&f. + - Find &aGlacies Princeps&f and tell them I sent you. + - There many travelers on the roads, you should stop and ask them for direction. + questAcceptDialog: + - '&a[Shogun Navita]&f It will be a long journey. Make sure you prepare. Follow the roads that lead south.' + - '&7&oI must go and locate the &d&oIce Village&7&o to the far south.' + questCompleteMessage: + - '&a[Glacies Princeps]&f The Shogun sent you, I see, it is good to hear that &aNavita&f is back to his old self.' + - + - + - Let me tell you more... + - '&7&oI should speak to &a&oGlacies&7&o.' +primis_main_quest_17: + customObjectives: + Objective3: + dialog: + - '&a[Theopropides Nero]&f Help? Yes, please!' + Objective1: + dialog: + - '&a[Alanus Isatis]&f Here to help with the &cRazorbacks&f?' + Objective2: + dialog: + - '&a[Domina Violet]&f I hope you are here to help!' + name: '&2Helping the north' + questLore: + - Before we further discuss anything about + - the &dBlood Temple&f. + - + - + - If these issues are not resolved then I would fail in my duties as a village leader. + - There is no way for me to ignore the plea of my own people and put others first. + - + - + - + - + - + - + - + - + - They will be able to tell you in more detail what needs to be done. + questAcceptDialog: + - '&a[Glacies Princeps]&f Once you are done helping them. Come back to me and we can talk.' + - '&7&oI should go talk to the villagers on my list and help them out with any issues they might have.' + questCompleteMessage: + - '&a[Romanus Superbus]&f &2Glacies&f sent you, about darn time! We have a prisoner on the loose!' + - '&7&oI should speak to &a&oRomanus Superbus&7&o.' +primis_main_quest_18: + name: '&2The trial of ice' + questLore: + - Well you have certainly impressed me and most of the village. + - + - + - the &cIce Elementals&f. + - + - + - + - + - '&cMinor Ice Elementals&f in combat.' + - + - + - If you failed...then...your energy and your being belonged to the &cIce Elementals&f. + - + - + - Ever since then + - + - + - Several of our people got corrupted and we had to jail them for our own safety. + - + - + - + - + - Slaves to the + - '&cIce Elementals&f.' + - It is clear that our old traditions are no longer. + - The &cIce Elementals&f must be dealt with... + - I would ask you to be the last one to + - undertake &9The Trial of Ice&f. Climb to the peak and face the + - '&cMinor Ice Elementals&f and release the souls of those who failed the trial.' + questAcceptDialog: + - '&a[Glacies Princeps]&f You can find the start of the path to the trial at &aViolet''s&f house.' + - Follow the &9Amethyst&f blocks, they will guide you to the peak. + - '&7&oI should follow the &9&oAmethyst Blocks&7&o to the peak of the mountain and then slay the &c&oMinor Ice Elementals&7&o.' + questCompleteMessage: + - '&a[Glacies Princeps]&f You have done it? May their souls rest in peace now.' + - Let's speak again friend. There is more to be done. + - '&7&oI should speak to &a&oGlacies&7&o.' +primis_main_quest_19: + name: '&2Chill out' + questLore: + - It is time to free ourselves from this curse. + - We should have never made ourselves dependent on an &cElementals&f power. + - We shall correct that mistake here and now. + - What you have slain were just + - '&cMinor Ice Elementals&f, the' + - '&cIce Elemental&f rests in a temple right across from our village.' + - It was the main source of our power...and foolishness. + - Go forth now and slay the &cIce Elemental&f. + questAcceptDialog: + - '&a[Glacies Princeps]&f You will find a path that leads into the temple at the summit of the village.' + - '&7&oI should go into the temple and slay the &c&oIce Elemental&7&o.' + questCompleteMessage: + - '&a[Glacies Princeps]&f I could feel the energies flowing out, all the way from here.' + - + - + - There is another settlement that might need your help, let's speak. + - '&7&oI should hear what &a&oGlacies&7&o has to say.' +primis_main_quest_2: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis]&fYou''ll help us? Thank the seas! This was starting to feel like a sinking ship!' + name: '&2Strangers in need...' + questLore: + - So not only can they not help, but they want our help? Bah! + - Well, we don't have much choice now, do we? + - Go, help them, then make them help us! + questAcceptDialog: + - '&a[First Mate Iracundi]&f Fine, go help the locals, see what info you can gather and see if you can get them to help us in turn. I will be here, negotiating things.' + - Come back as soon as you have something! + - '&7&oI should talk to the &aVillage Leader&f to see about helping the locals.' + questCompleteMessage: + - '&a[Chief Piscis]&f Everyone in the village has an issue that needs dealing with, and I am no exception. My request is quite challenging, so maybe you want to get warmed up and get the lay of the land with some of the issues from the other villagers.' + - + - + - '&7&oI should talk to the locals and see who needs help, and come back to the leader when I feel ready to continue.' +primis_main_quest_20: + customObjectives: + Objective1: + dialog: + - '&a[Lutum Princeps]&f This better be important.' + name: '&2Terravilla' + questLore: + - Some time ago we received a request for aid from a + - a nearby settlement. Years ago a bunch + - of explorers settled on top of this ancient ruin. + - I think they call their little + - settlement &dTerravilla&f. Apparently there is a lot + - of treasure to be had there if you don't mind the risk. + - But I hear that stuff has gone wrong there and they asked + - us if we could spare any help to send their way. To be + - honest, you are the strongest warrior I have ever seen. + - You are the best help we could send. If you would like + - to go of course. + questAcceptDialog: + - '&a[Glacies Princeps]&f You will find &aTerravilla&f straight West of here.' + - + - + - Oh, I almost forgot. The person you want to talk to is &aOverseer Lutum&f. + - '&7&oI should go to &d&oTerravilla&7&o and talk to &a&oOverseer Lutum&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f Came all the way from the &dIce Village&f, eh. Good to see some help arrive.' + - + - + - + - + - '&7&oI should talk to &a&oLutum&7&o.' +primis_main_quest_21: + name: '&2Taking out the trash' + questLore: + - Many years ago some explorers came across this ruin and + - as they investigated it more closely they discovered a + - large underground maze-like structure. In this structure + - there were a lot of ancient artifacts and treasures. But + - also a lot of danger. Not like that stopped anyone from + - going down there. And as the word spread, more and more + - people came here to make their fortunes. Before you + - know it, it turned into a small settlement. Until lately + - everything was fine, but then awful things started + - happening. Before I tell you more, we should start by + - dealing with the simple problems first. A small band of + - '&cRobbers&f has found a foothold in the hills surrounding' + - '&dTerravilla&f. We need them gone. Also, feel free to assist' + - any villagers in &aTerravilla&f that might need help. + questAcceptDialog: + - '&a[Lutum Princeps]&f I am not sure where the &cRobbers&f are exactly. I just know that people have reported seeing them coming from the hills.' + - '&7&oI should deal with the &c&oRobbers&7&o and help any villagers in need if I have the time.' + questCompleteMessage: + - '&a[Lutum Princeps]&f Well that is one issue resolved. Onto the next!' + - Before we move on, I want you to have this blade. + - + - + - '&7&oI should hear out what &a&oLutum&7&o has planned next.' +primis_main_quest_22: + name: '&2Big trouble in little pub' + questLore: + - Before we get to the big problem underground, I would + - like you to do one last thing here in town. There has + - been huge trouble in our little pub. There are certain + - characters in town who keep going to the pub and causing + - a ruckus. Well I heard that this time all of them managed + - to gather at the pub at the same time. And of course now + - there is a huge brawl happening over there. This is a great + - opportunity for us to arrest all of them at once. Go to the + - pub and knock them all out. We will handle the rest. + questAcceptDialog: + - '&a[Lutum Princeps]&f The pub is at the ground level, right across. Don''t let them overwhelm you.' + - I will have a nice reward waiting here for you when you're back. + - '&7&oI need to go to the pub and deal with the &c&oBar Brawlers&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f I hear that the pub is a peaceful place again. Let''s discuss the real issue now.' + - '&7&oI need to talk to &a&oLutum&7&o.' +primis_main_quest_23: + name: '&2Strike the earth' + questLore: + - You see the real reason we asked for help is because of what happened + - at the ruins. There were always dangerous things down there, + - but nothing a seasoned adventurer or explorer could not handle. But then + - something awakened, these ancient constructs started rising out of the + - ground and the walls. Then these quakes started happening, it was weird, + - because you could only feel them if you were down in the ruins. So we shut + - everything down, nobody was allowed access to the ruins anymore. A few days + - ago I gathered some of my best men and sent them down there to find the source + - of it all. They barely made it back. They found an &cEarth Elemental&f high + - above the pillars, on top some sort of platform. It must have been there + - dormant all this time. No clue why it decided to wake up now... + - Your job would be to go down there, navigate through the maze and put the + - '&cEarth Elemental&f into a slumber it will never wake up from.' + questAcceptDialog: + - '&a[Lutum Princeps]&f You can get to the maze by walking down the spiral staircase in the middle of the ruins.' + - + - + - '&7&oI should enter the &d&oRuins Maze&7&o and slay the &c&oEarth Elemental&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f I cannot believe it, you''re back. In one piece too!' + - + - + - + - '&7&oI need to tell &a&oLutum&7&o about my quest and the &d&oBlood Temple&7&o.' +primis_main_quest_24: + customObjectives: + Objective1: + dialog: + - '&a[Navita]&f You have returned! I hope you have good tidings.' + name: '&2There and back again' + questLore: + - We had no idea what was going on... Yes, + - '&dTerravilla&f will be able to pledge some' + - of our forces to your cause. I wonder if the + - '&cEarth Elemental&f awakening had anything' + - to do with the &dBlood Temple&f. We will + - prepare our forces and wait for word from + - '&dPontis Mille&f.' + questAcceptDialog: + - '&a[Lutum Princeps]&f So you are heading off to &dPontis Mille&f, make sure to tell the &aShogun&f that &dTerravilla&f will be ready to assist.' + - '&7&oI should head to &d&oPontis Mille&7&o and speak with &a&oShogun Navita&7&o.' + questCompleteMessage: + - '&a[Navita]&f It is good to hear that the &dIce Village&f has decided to join our cause! But I did not expect that you would manage to convince &dTerravilla&f to pledge to our cause as well.' +primis_main_quest_25: + customObjectives: + Objective1: + dialog: + - '&a[Outpost Officer]&fFILLER TEXT!' + name: '&2To the outpost' + questLore: + - It is so good to see you again friend! + - While you were gone we were preparing our + - forces. We have made an &dOutpost&f + - between the &dBlood Temple&f and &dPontis Mille&f. + - You should go there and report to the + - '&aOutpost Officer&f. They will let you know' + - how we shall proceed with the assault on the + - '&dBlood Temple&f.' + questAcceptDialog: + - '&a[Navita]&f The outpost is to the South of the city. Not too long now, before the additional forces from &dTerravilla&f and the &dIce Village&f arrive.' + - '&7&oI should head to the &d&oOutpost&7&o and speak with the &a&oOutpost Officer&7&o.' + questCompleteMessage: + - '&a[Outpost Officer]&f I GOT NO IDEA WHAT TO SAY CAUSE I AM NOT DONE' +primis_main_quest_3: + name: '&cBandit Camp!' + questLore: + - A nearby &dBandit Camp&f has recently been sighted + - and is trying to take us under! + - They keep raiding our supplies and kidnapping our villagers! + - They even took my &eGrandfather's Heirloom&f! + - We don't know what they want, but we need them gone! + - Figure out what they are doing, deal with them and bring + - me back my &eGrandfather's Heirloom&f! + questAcceptDialog: + - '&a[Chief Piscis]&f The &dBandit Camp&f isn''t too far away if you follow the road!' + - + - + - Oh, and make sure you bring back my &eGrandfather's Heirloom&f! + - '&7&oI should go to the nearby &dBandit Camp&7&o and clear it out.' + questCompleteMessage: + - '&a[Chief Piscis]&f I see you''re back! Do you bring good news?' + - '&7&oYou tell &aChief Piscis&7&o about the camp and turn the &eHeirloom&7&o in.' + - + - + - + - + - '&7&oSeems like the &aChief Piscis&f is ready to tell me how to get out of here.' +primis_main_quest_4: + customObjectives: + Objective1: + dialog: + - '&a[Petrae]&f &2Chief Piscis&f sent you? Unfortunately the passage is closed, and the &cElemental&f guards it...' + name: '&9Blue flower path!' + questLore: + - We must report our findings about the + - '&dBandit Camp&f to &dGladius&f!' + - The mountain pass is guarded by an ancient, + - powerful &cGolem&f which must be avoided at all costs! + - Follow the &eBlue Flowers&f along the path, + - they will lead you to a secret passage + - through the mountains! + - A mountain guide will be waiting for you at the end + - of the &9Blue Flower &fpath! + questAcceptDialog: + - '&a[Chief Piscis]&f The mountain pass is guarded by an extremely dangerous &cGolem&f, which you are probably not able to defeat right now!' + - + - + - '&7&oI should follow the &9&oBlue Flower &7&opath to the &aMountain Guide&7&o!' + - '&7&oI should make sure to finish any business I got left before I leave.' + - '&7&oHint: Make sure you track the quest to make finding your destination easier!' + questCompleteMessage: + - '&a[Petrae]&f Are you sure you want to risk it? I can help you...' + - '&7&oSeems like &aPetrae&f has a request for me.' +primis_main_quest_5: + name: '&5The Crystal Elemental' + questLore: + - You need to pass through? Ill timing, my friend. + - A &cCrystal Elemental &fhas invaded our passage + - and shut it down. + - If you really must make your way to Gladius, + - you will have to defeat this &cElemental&f first! + questAcceptDialog: + - '&a[Petrae]&f You seek to defeat the &cCrystal Elemental&f? I can but wish you luck in your endeavor!' + - + - + - '&7&oSeems like I must defeat the &cCrystal Elemental&7&o.' + questCompleteMessage: + - '&a[Petrae]&f Outstanding! I saw you defeat the &cCrystal Elemental&f, clearly there''s greatness in your future!' + - Now that we are on the other side, let me tell you the path to &dGladius&f! +primis_main_quest_6: + customObjectives: + Objective1: + dialog: + - '&a[Filius] &fYou made it through the mountain! You don''t see that every day.' + - + - + - '&7&oSeem like &aFilius&7&o can help me find the way to &dGladius&7&o.' + name: '&5The Farmstead' + questLore: + - The path to &dGladius&f should be easy, but with + - all the disturbances we've been seeing I suspect + - it might not be that simple. + - I am good friends with the &aProprietor of the Farmstead&f + - down the road. If you tell them I sent you, I am sure + - they will tell you how to safely reach &dGladius&f and + - give you news about the surrounding area. + - Good luck in your travels and stay safe! + questAcceptDialog: + - '&a[Petrae]&f Just tell the &aProprietor of the Farmstead&f that I sent you, though I have heard that the &aProprietor&f hasn''t been seen in a while.' + - + - + - Perjalanan yang aman! + - '&7&oI should follow the path to the &dFarmstead&7&o and talk to its &aProprietor&7&o.' + questCompleteMessage: + - '&a[Petrae]&f Outstanding! I saw you defeat the &cCrystal Elemental&f, clearly there''s greatness in your future!' + - Now that we are on the other side, let me tell you the path to &dGladius&f! + - '&7&oI should talk to &aFilius&7&o to learn the way to &dGladius&7&o, and possibly talk to his &aMother&7&o to see how I can help.' +primis_main_quest_7: + customObjectives: + Objective4: + dialog: + - '&a[General Hasta] &fI can''t believe you made it past the enemies.' + - You are exactly the kind of help we need right now! + - '&7&oSeems like I should talk to &aGeneral Hasta&7&o.' + name: '&5The path to Gladius' + questLore: + - Recently smoke was sighted over the fortress of &dGladius&f. + - We were unable to go there and see what's happening + - because a &dShip&f is currently blocking the path. + - We got attacked by a bunch of undead-looking creatures + - when we approached the &dShip&f, so we ran away. + - I am afraid you will have to force your way through this + - '&dShip&f in order to reach &dGladius&f. I''m sure that they will' + - reward you if you help thin the number of &cUndead&f on that ship! + questAcceptDialog: + - '&a[Filius] Be careful on the road, clearly something has gone wrong in &dGladius&f.' + - + - + - '&7&oI should go down the path to &dGladius&7&o and clear out some &cUndead Sailors&7&o on the way there.' + questCompleteMessage: + - '&a[Lord Hasta]&f Were you sent as reinforcements from Pontis Mille? Where are the others? Are you a messenger?' + - '&7&oI should talk to &aLord Hasta&7&o.' +primis_main_quest_8: + name: '&5Recovering Hope' + questLore: + - We never saw this invasion coming. + - They came in the dead of night, hit us hard and fast. + - Before we knew it, half the city was overrun. + - Morale is low. Everyone here has lost someone. + - To spite our heartache, our own loved ones parade + - through the streets in a mockery of life itself. + - We need to rally and bolster morale, + - or we won't see another dawn! + - Back in my &dMansion&f, in my treasury, lies a &eDocument&f + - of the utmost importance. It is a written promise with + - one of the founders of &dPontis Mille&f to provide us with + - assistance in a time of dire need. This is the time. + - Retrieve the &eDocument&f, bring it back to me and + - I promise you will be welcomed in &dPontis Mille&f with + - open arms. Soldiers will fight to their last + - if given this small hope. + questAcceptDialog: + - '&a[General Hasta] The note is in my &dMansion&f. Be sure to bring it back. My men here also have other requests around town you can help with, if able.' + - '&7&oI should check what the other soldiers need and head to the &dMansion&7&o at the town exit.' + questCompleteMessage: + - '&a[Lord Hasta]&f Outstanding! Recovering this &eDocument&f in the middle of a war? If we had 10 more of you, the city would never have been taken in the first place!' + - Before you go, do you think you could do me a small personal favor? + - '&7&oSeems like &aLord Hasta&7&o wants to talk to me.' +primis_main_quest_9: + name: '&5Gladius'' Champion' + questLore: + - Before heading to &dPontis Mille&f, I have a + - personal favor to ask. + - Our &cChampion&f was last seen fighting off a horde of + - enemies near the &dStatue&f. + - We have not heard from him since the start of the + - invasion and at this stage we fear the worst. + - Please go check on him. If you find him and he has + - turned into one of these undead... please free him of his curse. + questAcceptDialog: + - '&a[General Hasta] &fMake your way to the &dStatue&f. I am sure our &cChampion&f will be easy to find.' + - '&7&oI should go to the &dStatue&7&o and investigate what happened to the &cChampion of Gladius&7&o.' + questCompleteMessage: + - '&a[General Hasta]&f So... The worst has come to pass. I will make sure these beasts shall pay for slaying my son.' + - 7&oSeems like &aGeneral Hasta&7&o has some parting words for me. +primis_ogre_mines_clear: + name: '&2Ogre-sized problems' + questLore: + - Our mining encampment was overrun! + - We need help! + - I don't really know what happened, but we need to clear + - the encampment and talk to &aOld Vetus&f! + questAcceptDialog: + - '&a[Metus]&f You''re going to help? Please hurry, the encampment is just beyond here!' + - '&7&oI should clear the encampment and talk to &aOld Vetus&7&o.' + questCompleteMessage: + - '&a[Vetus Fossores]&f You came to help? Fantastic, we absolutely need help right now!' + - Here's a little something for your help clearing the encampment! +primis_ogre_mines_lost_bretheren: + customObjectives: + Objective1: + dialog: + - '&a[Fortis Fossores] &fWhat do you want? What, &aFugit&f sent you? What for? The mines were overrun? Hah, I didn''t even notice!' + - + - + - + name: '&5Lost Bretheren' + questLore: + - The mine was overrun by &cOgres&7&o! + - In the confusion I got separated from my &aBrother&f in the &dMines&f, + - and I fear for his safety! + - He's a bit of an eccentric man, very dedicated to mining. + - You'll know if you've seen him! + - Please bring him back up here, or at the very least tell me if he is safe. + - I'll make it worth your trouble! + questAcceptDialog: + - '&a[Fugit] &fPlease find my &aBrother&f and make sure he''s OK!' + - '&7&oI find &aFugit''s Brother&7&o in the &dMines&7&o overrun by &cOgres&7&o.' + questCompleteMessage: + - '&a[Fugit Fossores]&f My &aBrother&f said what? Ah, typical of him, too focused on his work to notice the entire place was taken over!' + - I'll have a serious conversation with him next time I see him! + - + - +primis_ogre_mines_old_miner_quest: + name: '&2Lucky Pickaxe' + questLore: + - We have ourselves a bit of a pickle! + - As we were mining, we came across a mysterious cave full of monsters! + - I dropped my favorite &ePick-axe&f as I ran, I need your help to go get it! + - I'm sure the &cOgre Magi&f picked it up for himself. + - Get my &eLucky Pickaxe&f back from that brute! + - I've got some trinkets for you when you return. + questAcceptDialog: + - '&a[Vetus Fossores]&f That &cOgre&f shouldn''t be far! You can find him in the cave to the right, before the collapsed area.' + - He should have the &ePickaxe&f, &cOgres&f love shiny things after all! + - '&7&oI should defeat the &cOgre Chief&f.' + questCompleteMessage: + - '&aa[Vetus Fossores]&f You got my lucky pick? Excellent!' + - Heres your reward! +primis_pontis_groves_acrobatics: + customObjectives: + Objective1: + dialog: + - '&a[Idoneitatem Hominem]&f Congratulations!' + name: '&2Acrobatics' + questLore: + - So you think you have you what it takes. + - Are you fit enough, are you quick enough, are you strong enough? + - Platforms, wines, dangerous heights. All you could ever want! + - The ultimate challenge lies ahead! + - OK, OK. Me and my &aBrother&f might have been bored a bit and + - made an entire acrobatics course. + - The goal is to to get from platform to platform using &9Wines&f and + - '&9Acrobatics&f and reach the end of the course.' + - + - + - You will be rewarded with a very nice &eItem&f! + questAcceptDialog: + - '&a[Posuere Hominem]&f You can find the start of the course at the &dEnd of that Tunnel&f.' + - + - + - Don't forget to speak to my &aBrother&f at the end of the course for the reward! + - '&7&oI should head to the start of the course.' + questCompleteMessage: + - '&a[Idoneitatem Hominem]&f Well deserved! I hope you did not cheat! Try and beat my record if you can.' +primis_pontis_groves_caught in the web: + name: '&2Caught in the web' + questLore: + - So they have a &dNest&f somewhere in the &dGrove&f. + - That would explain why their population has skyrocketed. + - + - + - It would be great if you could locate the &dNest&f and clear it out. + - We will make you some fine &eSpider Leg Boots&f as a reward! + questAcceptDialog: + - '&a[King Nemian]&f If there is a &dNest&f I am sure it would be &9Surrounded by Cobwebs&f.' + - '&7&oI should find the &dSpiders Nest&7&o and clear it out.' + questCompleteMessage: + - '&a[King Nemian]&f Hah! I knew we could count on you!' + - Here are your fine boots, well deserved! +primis_pontis_groves_elf_stole_from_my_shelf: + name: '&2Elf stole from my shelf' + questLore: + - Disaster has struck our little hole. + - Not too long ago our lovely home got raided by &cElf Bandits&f. + - Thankfully we weren't home at the time so nobody got hurt. + - We managed to replace most of our possessions. + - But they took my &eFamily Heirloom&f that was sitting on the shelf. + - If you would be so kind to go try and get it back for me, I would be most thankful. + - I make the best stews, I would be glad to share some with you as a reward. + questAcceptDialog: + - '&a[Luxuria Gorgonius]&f The &eHeirloom&f is quite valuable I am sure they would keep it &9Somewhere Extra Safe&f.' + - '&7&oI need to go retrieve the &eHeirloom&7&o.' + questCompleteMessage: + - '&a[Luxuria Gorgonius]&f Oh my gosh! You found it!' + - There are not enough thanks in the world for what you just did for me. + - '&7&oThis stew should keep med fed for a while.' +primis_pontis_groves_into_the_next_hole: + customObjectives: + Objective1: + dialog: + - '&a[Phygia Gorgonius]&f Time to kick those &cElves&f out for good!' + name: '&2Into the next hole...' + questLore: + - If you are available there is plenty more work to do around here. + - We have some serious &cElf&f problems, + - but I have assigned &aPhygia&f to handle those issues. + - Go talk to &aPhygia Gorgonius&f in the hole next to this one. + - They will be able to tell you more and what needs to be done. + questAcceptDialog: + - '&a[King Nemian]&f The hole right next to this one one, can''t miss it!' + - '&7&oI should go talk to &aPhygia Gorgonius&7&o.' + questCompleteMessage: + - '&a[Phygia Gorgonius]&f Let''s talk...' + - '&7&oI should hear out &aPhygia Gorgonius&7&o.' +primis_pontis_groves_lighthouse_1: + customObjectives: + Objective1: + dialog: + - '&a[Alanus Secundas] &fHas the &dGrove&f sent you?' + name: '&2Feeding the sick' + questLore: + - Wanderer, could I ask a simple favor of you? + - + - + - But ever since the troubles began we could not leave our &dGrove&f. + - Would you be so kind to bring the family their latest batch of food. + - It would be great if you could hurry, it has been a while since the last delivery. + questAcceptDialog: + - '&a[King Nemian]&f When you exit the hole the &dLighthouse&f is straight forward and a bit to the left.' + - '&7&oI should go to the &dLighthouse&7&o.' + questCompleteMessage: + - '&a[Alanus Secundas]&f I am so thankful! We were just starting to run out of food.' + - Are you busy? + - '&7&oSeems like &aAlanus&7&o wants to talk to me.' +primis_pontis_groves_lighthouse_2: + customObjectives: + Objective1: + dialog: + - '&8[Jeeves]&fOh, hello there again!' + - '&8[Jeeves]&f They do not need the food anymore? I was just about to go shopping.' + - '&8[Jeeves]&f So kind of you to come here and let me know.' + name: '&2Do not ask Jeeves' + questLore: + - Uh, before you came. Jeeves the Travelling Merchant stopped by. + - We asked him if he could go get some food for us. + - + - + - + - + questAcceptDialog: + - '&8[Alanus Secundas]&f When you exit the dwelling the Lighthouse is straight forward and a bit to the left.' + - '&8&oI should go to the Lighthouse.' + questCompleteMessage: + - '&8[Alanus]&f You let him know? Good, good!' + - '&8&oSeems like Alanus is quite fed.' +primis_pontis_groves_population_control: + name: '&2Population control!' + questLore: + - Oh I am so happy that finally someone has arrived to help us out. + - We have a big arachnid problem going on in our little grove. + - There are so many arachnids around these days that you cannot even + - take a nice evening walk without one of the nasty buggers + - jumping at you from the shadows. + - It is clear that their population numbers need a serious culling. + - Oh! Please bring to me any arachnid legs that are still in good contidion. + - We use them to make small cranes and grabbers. + questAcceptDialog: + - '&8[King Nemian]&f You will find them lurking beneath the shadows of the trees.' + - '&8&oI need to find Forest Crawlers and kill them.' + questCompleteMessage: + - '&8[King Nemian]&fGood to see you return, and with plenty of legs too!' + - '&8[King Nemian]&fYou think that their nest might be near? Let''s talk more about this' +primis_pontis_groves_tree_climbing_elf_bandits: + name: '&2Tree climbing elf bandits!' + questLore: + - + - + - Not like the &cSpiders&f were enough, + - now these shadow loving poop nuts have decided to settle in our trees! + - + - + - + - + - Forced their way in with their superior numbers. + - Well they got something coming alright, + - one look at you and I can tell you can handle a couple of stone giants! + - I am sure some elves won't be much of an issue for you. + - + - + questAcceptDialog: + - '&a[Phygia Gorgonius]&f I am sure you will find plenty of them if you find some place with shade and just look up, hard to miss their tree houses.' + - '&7&oI should go take care of these &cElves&7&o before &aPhygia&7&o catches on fire from rage.' + questCompleteMessage: + - '&a[Phygia Gorgonius]&f My friend! HAHA! So good to see you again!' + - + - + - '&7&oThe elves wont be bothering &aPhygia&7&o ever again.' +primis_pontis_mille_fields_berry_crazed_wolf: + name: '&2Berry crazed wolves' + questLore: + - Oh gosh, I have no idea what is wrong with these &cRockhounds&f. + - They keep coming into the &dBerry Farm&f while I am away or sleeping. + - You would think they come here and eat the berries, but no! + - They load their mouths with them and carry them + - off somewhere deep into the forest. + - I mean they are &cHounds&f! Why are they even stealing berries. + - Well I guess it doesn''t matter, I have a favor to ask. + - Could you go clear the + - '&9Area Behind the Berry Farm&f,' + - and bring back my &eStolen Berries&f. + - I have a lot of pies to make and the berries they stole were ripe and ready. + questAcceptDialog: + - '&a[Dordalus Nasica]&f I only saw the &cRockhounds&f steal the berries.' + - '&7&oI should go kill the &c&oRedwood Rockhounds&7&o and collect any &e&oStolen Berries&7&o they drop.' + questCompleteMessage: + - '&a[Dordalus Nasica]&f Oh my, you did it. Could I bother you with one more tiny favor.' + - '&7&o Seems like &d&oMilonia&7&o has more work for me.' +primis_pontis_mille_fields_camping_hunters: + customObjectives: + Objective1: + dialog: + - '&a[Scribonia Ingenvinus]&f Yes?' + name: '&2Camping hunters' + questLore: + - I hope I am not bothering you. You look like a person that would listen to a plea. + - We do not have much to do here in the &dSlums&f, + - most of us like to wander the &dFields&f to pass the time. + - Unfortunately that has come to a stop after a bunch + - of &cMonsters&f started roaming around the &dFields&f. + - We heard that some hunters have made &dCamp&f near the &dFields&f. + - If you could go there and talk to them and ask them to deal with these &cMonsters&f... + questAcceptDialog: + - '&a[Augustina Verrucosis]&f Their &dCamp&f should be somewhere North-West of here.' + - '&7&oI need to head for the &d&oHunters Camp&7&o.' + questCompleteMessage: + - '&a[Scribonia Ingenvinus]&f Help the &dSlums&f with their &cMonster&f issue?' + - Let's talk more about. + - '&7&oI should talk to &a&oScribonia&7&o and hear out what she has to say.' +primis_pontis_mille_fields_camp_hunter_three_times_hunter: + name: '&2Hunter three times hunter' + questLore: + - So you found &aVolumnia&f. Thank the great hunters that she is alright. + - Since you have helped &aVolumnia&f and proven yourself a kind soul. + - How about a friendly challenge. I would be willing to offer you some nice + - quality armor should you face the challenge and return victorious. + - The challenge involves hunting + - '&cThree Great Beasts&f scattered across Pontis.' + - The &cBeast Cod Furiosa&f who swims underneath a bridge where two mountains stand. + - '&cBeast Crawler Megdun&f that slumbers on top of a sun covered grove.' + - Dancing between two western peaks you will find the + - '&cBeast Impaler Uladzimir' + - + - + questAcceptDialog: + - '&a[Milonia Majus]&f Here take this device it will roughly guide you to the their location.' + - '&7&oI should go and challenge the &c&oThree Great Beasts&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f You have returned. And you have brought all three items I requested as proof.' + - + - + - Well enough about me, here is your reward as promised! + - '&7You hand back the beast tracking device.' + - '&a[Milonia Majus]&fI had almost forgotten about that thing, thank you!' + - Until we meet again adventurer! +primis_pontis_mille_fields_do_it_yourself: + name: '&2Do it yourself' + questLore: + - Deal with the &cMonsters&f? Well I can tell you we have already been doing that. + - There is just too many of them and not enough of us. + - We started hunting them as soon as we made our &dCamp&f here. + - But their numbers just don't seem to be going down. + - And that's not even the worst of it. + - We have discovered a lair and a big old &cBeast&f that comes with it! + - Well since you have made it to our &dCamp&f in one piece, + - I assume you are quite capable yourself. + - How about joining the hunt? What say you? + questAcceptDialog: + - '&a[Scribonia Ingenvinus]&f I knew you would say yes! I see you are already well equipped.' + - OK, this is what I want you to do. + - + - + - Second I need you to slay 5 &cLonghorns&f and 6 &cShorthorns&f. + - Understood? Good. Report to me when you're done. + - '&7&oI should slay &c&oBig ol'' Bubba&7&o and kill 5 &c&oLonghorns&7&o and 6 &c&oShorthorns&7&o.' + questCompleteMessage: + - '&a[Scribonia Ingenvinus]&f I must say I am quite impressed.' + - Clearly you are way more than just 'capable'. + - Thank you for the assistance, we will be able to handle the rest. + - Until we meet again, great hunter. +primis_pontis_mille_fields_feeding_the_hungry: + customObjectives: + Objective3: + dialog: + - '&7You hand the over the bread and the flour.' + - '&a[Rufia Tertulus]&f I don''t know what to say. My children will be so happy!' + - '&7The woman bows to you in deep appreciation.' + Objective4: + dialog: + - '&a[Fabia Praetextus]&f I guess fantasies do come true sometimes. I am eternally grateful to you kind sir.' + Objective1: + dialog: + - '&a[Lena Lucan]&f Fresh bread! I cannot thank you enough!' + Objective2: + dialog: + - '&a[Tranio Florens]&f Wow! The day just keeps getting better!' + - Thank you for the flour kind soul. + name: '&2Feeding the hungry' + questLore: + - I can feel a good heart beating in that chest of yours. + - Not everyone is as fortunate as you and I. + - There are some poor souls living in the &dPontis Mille Slums&f. + - For a while now I have been working over + - time to produce surplus bread and flour. + - Would you mind taking these sacks of wheat and these bread stacks. + - Then travel with them to the &dSlums&f and hand them out to those in need? + - I have been doing this for a while now but I injured my left foot, + - so I cannot do much walking right now. + questAcceptDialog: + - '&a[Daemones Maritialis]&f I wish there were more people like you in the world.' + - The &dSlums&f are straight North of here, you can see the buildings in the distance. + - '&7&oI should go to the &dSlums&7&o and hand out the food to those in need.' + questCompleteMessage: + - '&a[Augustina Verrucosis]&f &2Daemones&f sent you here didn''t he.' + - + - + - Thank you stranger, my family won't forget this. +primis_pontis_mille_fields_fruity_hound: + name: '&2Fruity hound' + questLore: + - Since you are my NUMBER ONE berry recovery agent, + - I have another task for you. + - As you can see we grow some very large berries on our + - little &dBerry Farm&f here. + - There was a + - '&eSpecific Berry&f I was growing for a contest.' + - But as I was walking to the &dBerry Farm&f I saw a + - '&cFruity Rockhound&f jump for the bush holding my prized berry.' + - He snapped it off and carried it away. + - Its jaws were holding the berry by its stem so + - it should still be in one piece, I hope. + - If you go slay the beast and bring back my + - dear &eContest Berry&f I will have a nice + - reward waiting for you. + questAcceptDialog: + - '&a[Dordalus Nasica]&f I think I saw the &cHound&f head into the &dRedwoods&f, North-West of the farm.' + - '&7&oI should go slay the &c&oFruity Hound&7&o and see if the &e&oContest Berry&7&o is still in one piece.' + questCompleteMessage: + - '&a[Dordalus Nasica]&f YES! That is my darling! Fine and whole, not even any saliva on it!' + - + - + - + - +primis_pontis_mille_fields_not_on_my_farm: + name: '&2Not on my farm!' + questLore: + - Lately all these &cRats&f have been driving me crazy. + - They keep going into our little farm and eating all our goods! + - Any chance you could go and lower their numbers a bit? + - Be careful, there are so many of them. + - Oh, I almost forgot to tell you. + - If you see a large &cWell Fed Rat&f don't bother with it. + - It has grown so large and fat it would take you days to slay it. + questAcceptDialog: + - '&a[Milonia Majus]&f I am sure that you already noticed that they like to squirm around the path area.' + - '&7&oI should go kill the &cRats&7&o that hang around the path that leads to &dPontis Mille&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f Thank you so much! We can get back to making delicious goods now.' +primis_pontis_mille_fields_surprise_me_with_flour: + customObjectives: + Objective3: + dialog: + - '&a[Adulescens Lupis]&f I heard the farm was having &cRat&f problems. Three sacks of flour coming up, no problem!' + Objective1: + dialog: + - '&a[Dinia Niraemius]&f Flour? Sure, one sack of flour coming up!' + Objective2: + dialog: + - '&a[Daemones Maritialis]&f The farm needs more flour eh? Here ya go, two sacks!' + name: '&2Surprise me with flour' + questLore: + - Wow, you're quite handy. If I could bother you with another task. + - The &cRats&f had completely ruined our current stock of flour. + - So we need to a completely new batch of flour. + - The &dWindmills&f should have plenty of it. + - Go collect the flour and drop it off back here with me. + - I will be paying good coin for this service! + questAcceptDialog: + - '&a[Milonia Majus]&f You will need to collect the flour from all three &dWindmills&f.' + - '&7&oI need to visit the three &dWindmills&7&o and collect the flour they produce.' + questCompleteMessage: + - '&a[Milonia Majus]&f This should last us for quite a while!' + - Hopefully our flour tab won't get too big, hehe. +primis_pontis_mille_fields_wellness: + name: '&2Wellness' + questLore: + - Am I glad to see you right now! + - Dang &cNightmare Rat&f ambushed me while I was climbing down the well. + - I injured my arm and legs when I fell. + - Argh, I still have some of its toxic spit left in my eyes. + - Thankfully I managed to crawl my way onto this little + - ledge before it could come finish me off. + - How embarrassing, not sure what hurts more right now, my body or my pride. + - I have some + - '&eFirst Aid Equipment&f' + - in my chest at the &dHunters Camp&f. + - Would you mind getting it for me? Oh, and make sure not to tell anyone + - there a word about what you saw here. + - '...almost died in a well...this is chapter of my life I will need to erase...' + questAcceptDialog: + - '&a[Volumnia Zoilus]&f The &dHunters Camp&f is straight South, cannot miss it, look for tents.' + - '&7&oI need to go collect the &e&oFirst Aid Equipment&7&o for &a&oVolumnia&7&o at the &d&oHunters Camp&7&o.' + questCompleteMessage: + - '&a[Volumnia Zoilus]&f Already back? Hand me the equipment.' + - Do not worry about me, I will have myself patched up in no time. + - Thank you for everything! You saved my life you know! +primis_pontis_mille_field_check: + customObjectives: + Objective1: + dialog: + - '&a[Augustina Verrucosis]&f Oh, this is quite important! I will let the residents know.' + - Thank you for delivering these important documents. + name: '&2Field check' + questLore: + - If I could bother you with some delivery tasks. + - I have here some important documents that need to be delivered to the + - '&dSlums&f and to the &dFields Farm&f.' + - The soldier that was supposed to come and get them has not arrived yet. + - And this is an urgent matter, we cannot afford to wait any longer. + - Unfortunately I have strict orders to not leave my post. + - If you could do this for me it would help us out a lot. + questAcceptDialog: + - '&a[Godefridus Novation]&f You will do it? Excellent!' + - You can follow the &9Yellow Path&f to get to the slums. + - The &dFields Farm&f is right beyond the slums, just follow the path. + - Oh! And watch out for the field rats! + - '&7&oI should head for the &d&oSlums&7&o and then the &d&oFields Farm&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f Documents? Let me see them. Hmmm, looks official.' + - Thank you for coming all the way here to deliver them. + - '&7&oSeems like &a&oMilonia&7&o could use my help with the rats...' +primis_pontis_mille_fresh_rats_coming_up: + customObjectives: + Objective1: + dialog: + - '&a[Elite Guard]&f Plenty of rats inside.' + name: '&2Fresh rats coming up' + questLore: + - No cat food but I think I can help ya + - find something even better... + - I heard a couple of + - '&aGuards&f have been dealing with' + - a rat infestation in the lower parts of the city. + - Go down there and maybe you can get some + - '&cRats&f for your cat friend.' + questAcceptDialog: + - '&7&oI should check out the lower part of the city and see if I can find the &a&oElite Guards&7&o.' + questCompleteMessage: + - '&a[Mew Meowzer]&f Meow. MEOW! Prrrrr.' + - '&7&oI should let the cat enjoy it''s meal in peace.' + - '&7&oIt seems to have dropped something, hmm...' +primis_pontis_mille_hungry_friend: + customObjectives: + Objective3: + dialog: + - '&a[Melaenis Gelasius]&f Cat food? Where the heck did you manage to find a cat here...' + - No, I don't know where to get any cat food. + Objective4: + dialog: + - '&a[Sulpicio Panthera]&f I wish I could help, sorry.' + Objective1: + dialog: + - '&a[Royal Guard]&f Do I look like someone who keeps track of cat food?...' + Objective2: + dialog: + - '&a[Tyndarus Faustinius]&f Sorry, I have no idea.' + Objective5: + dialog: + - '&a[Tyndarus Columbanus]&f We used to have cat food around here somewhere, but heck knows what happened to it...' + name: '&2Hungry friend' + questLore: + - '&7&oWhat is wrong little one.' + - '&a[Mew Meowzer]&f Meow!' + - '&7&o Are you hungry? Does the' + - '&7&olittle one want some food?' + - '&a[Mew Meowzer]&f MREOOOW!!!' + - '&7&oLet''s see if we can' + - '&7&oget you some food.' + questAcceptDialog: + - '&7&oI should see if anybody in the city knows where to find some cat food.' + questCompleteMessage: + - '&a[Modestus Aper]&f Cat food? I don''t know about that. But...' + - '&7&oSeems like &a&oModestus&7&o might know something...' +primis_pontis_mille_late_delivery: + name: '&2Late delivery' + questLore: + - I ordered some &eFishing Nets&f from + - '&dGladius&f that haven''t arrived yet. I wonder' + - if something might have happened to the + - shipment. If you are willing, I would pay you + - a small fee if you could go see what + - happened to the shipment and get the + - '&eFishing Nets&f for me.' + questAcceptDialog: + - '&a[Delphium Calpurnius]&f Last I heard my shipment of &eFishing Nets&f was supposed to be heading for &dGladius&f.' + - '&7&oI need to go look around &d&oGladius&7&o for &a&oDelphium''s&7&o shipment of &e&oFishing Nets&7&o.' + questCompleteMessage: + - '&a[Delphium Calpurnius]&f Those are the &eFishing Nets&f! Thank you so much!' + - '&a[Delphium Calpurnius]&f I invested a lot of my savings into these! Not sure what I would have done if you hadn''t found them.' +primis_pontis_mille_let_them_know: + customObjectives: + Objective3: + dialog: + - So Fortes sent you? I see. + - Your help would be much appreciated, aid me and my forces will be ready. + Objective1: + dialog: + - So Fortes has decided to take action. + - Help me finish my task, and my forces will be ready. + Objective2: + dialog: + - So Fortes has decided to act. + - If you could assist me with this task, then my forces will be ready. + name: '&2Let them know!' + questLore: + - I am sorry that we cannot send aid to &dGladius&f right away. + - Ever since that new &cCounselor&f came, our ruler has not been himself. + - If you could reach out to the &aGenerals&f in the city and let them know + - that &dGladius&f needs help we might be able to to do something about it. + - But not before we deal with the existing issues first. + - + - + - Go talk to them and then come back to let me know they got the message. + - I will reward you for your time. + questAcceptDialog: + - '&a[Fortes]&f Follow the &9orange path&f from the main room to find &aGeneral Bromia&f.' + - '&a[Fortes]&f At the end of the &9yellow path&f you will find the &aGeneral Rogerius&f.' + - '&a[Fortes]&f At the end of the &9shorter purple&f path you will find the &aGeneral Cylindrus&f.' + - '&7&oI need to talk to the three &a&oGenerals&7&o.' + questCompleteMessage: + - '&a[Fortes]&f You managed to contact them? Excellent!' + - '&a[Fortes]&f Here is your reward. Don''t spend it all in one place.' +primis_pontis_mille_lighthouse_1: + customObjectives: + Objective1: + dialog: + - '&8[Hegio Remus]&f Another letter? Thank you for bringing it to me.' + name: '&2A quick delivery' + questLore: + - Before you go anywhere, could you deliver this letter for me? + - You can find the gentleman it needs to go to on top of the Lighthouse. + - Don't worry the Lighthouse is right behind me through that doorway. + questAcceptDialog: + - '&8[Fortes]&f Thank you.' + - '&8&oI should go talk to the Pontis Mille Lighthouse Keeper.' + questCompleteMessage: + - '&8[Hegio Remus]&f Hey, do you have a second?' + - '&8&oSeems like Hegio Remus needs me to talk to him.' +primis_pontis_mille_lighthouse_2: + customObjectives: + Objective1: + dialog: + - '&a[Jeeves]&f Oh, we meet again. It''s good to see you.' + - You have something for me? Oh, wow...that is quite the shopping list. + - I will have the items sent back to &aHegio&f as soon as possible. + - Thank you for stopping by. Hope we meet again. + - '&7&oI should let &aHegio&7&o know I delivered the note.' + name: '&2Ask Jeeves' + questLore: + - Would you mind taking the portal and delivering a note to my good friend &aJeeves&f. + questAcceptDialog: + - '&a[Hegio]&f Much appreciated friend.' + - '&7&oI should go talk to &aJeeves&f at &dCaeruleaum Village&7&o.' + questCompleteMessage: + - '&a[Hegio]&f You delivered the note? Excellent!' + - Here, you can have some of this &eRabbit Stew&f I keep in my back pocket. +primis_pontis_mille_mines_goblined_up_in_the_maze: + customObjectives: + Objective3: + dialog: + - '&a[Hurt Guard]&f Am so I happy to see you!' + Objective1: + dialog: + - '&a[Injured Guard]&f Thank the skies!' + Objective2: + dialog: + - '&a[Wounded Guard]&f Finally, the rescue is here!' + name: '&2Goblined up in the maze' + questLore: + - If I could bother you for a second. + - Since you will be going into the &dMines&f already, it + - would be great if you could help us resolve some issues. + - We are missing three &aGuards&f that were sent + - into the mines to hunt down a &cCursed Goblin&f. + - I fear that something might have happened to them. + - This &cCursed Goblin&f is supposed to be + - hiding in some sort of &9Maze&f in the &dMines&f. + - Could you locate the &aMissing Guards&f and + - bring me proof of the &cGoblins&f death. + questAcceptDialog: + - '&a[Centurion]&fTry to not get lost in the &9Maze&f.' + - May luck be on your side warrior! + - '&7&oI should venture through the &d&oMines&7&o and locate the &9&oMaze&7&o.' + questCompleteMessage: + - '&a[Centurion]&f They are alive, excellent, we will send some soldiers to get them out as soon as possible.' + - I see you brought proof of the &cGoblins&f death, well done. + - '&7&oHopefully people keep out of the &9Maze&7&o in the future.' +primis_pontis_mille_serious_sewage: + customObjectives: + Objective3: + dialog: + - '&a[Michelangelo]&f Tell that old man everything is in order!' + Objective4: + dialog: + - '&a[Raphael]&f Tell Rogerius I am alive and doing fine!' + Objective1: + dialog: + - '&a[Donatello]&f You can tell the General I am doing just fine!' + Objective2: + dialog: + - '&a[Leonardo]&f The General should not worry, I am ok!' + name: '&2Serious sewage' + questLore: + - If you are up to the task then I could use your help. + - + - + - + - + - They have a leader, I think he calls himself &cShreepper&f or something. + - Make sure to get rid of him, a snake without it's head is not a threat. + - If you could go down there and thin the numbers of critters and the trouble makers + - then that would allow me to assign my forces to more important tasks... + - We had also sent &a4 Agents&f down there, I have not heard from them yet. + - + - + - I also seem to have misplaced my personal &eSewage Keys&f + - if you could retrieve those too, that would be great. + questAcceptDialog: + - '&a[Rogerius]&fYou can get to the &dSewers&f by going to the fountain and then a bit south-east.' + - + - + - '&7&oI need to find my way into the &dSewers&7&o and complete the tasks.' + questCompleteMessage: + - '&a[Rogerius]&f You have completed the all I have asked? If only I had 10 more men like you...' +primis_pontis_mille_star_gazing: + customObjectives: + Objective1: + dialog: + - '&a[Virgo Dexippus]&f Yes, what is it?' + name: '&2Star gazing' + questLore: + - You have done so much for this city and its people. + - Having assisted the three &aGenerals&f and helped the areas around &dPontis Mille&f + - has freed up a serious amount of our forces and resources. + - We would be able to send our forces to aid &dGladius&f now. + - But before we take action there is one last thing I would like you to do. + - You should go speak with the &aStargazers&f. + - It is in regards to our lost history and the &cElementals&f. + - The &aStargazers&f will be able to tell you more once you talk to them. + - Here take this sealed note and show it to them. + questAcceptDialog: + - '&7[Fortes Bellator]&f You can find the &aStargazers&f at the &dObservatory&f.' + - + - + - '&7&oI should talk to the &aStargazers&7&o at the &dObservatory&7&o.' + questCompleteMessage: + - '&a[Virgo Dexippus]&f The &aMajor&f sent you? It must be important then.' + - '&7&oI should talk to &aVirgo&7&o.' +primis_pontis_mille_stay_a_while_and_listen: + name: '&2Stay a while and listen' + questLore: + - Hand me the note. Let me take a look... + - We have been given permission to share important + - information with you regarding our past. + - You must have done something quite important, + - this information is usually only shared with the top brass. + - '&aStella&f will share with you what we have uncovered.' + questAcceptDialog: + - '&a[Virgo Dexippus]&f Talk to &aStella&f and &9Click on the Sword&f to start listening.' + - '&7&oI should talk to &aStella&7&o and start the &9Arena Challenge&7&o.' + questCompleteMessage: + - '&a[Virgo Dexippus]&f Do not share this information with anyone.' + - '&7&oThat was quite a tale.' +primis_pontis_mille_the_groves_call: + customObjectives: + Objective1: + dialog: + - '&a[King Nemian]&f &2General Bromia&a sent you?' + - Excellent, I knew we could count on him. + name: '&2The groves call!' + questLore: + - It is our duty to protect the &dGroves&f from any threats. + - '&aKing Nemian&f of the &dGroves&f has sent a request for aid.' + - Nasty critters have come to the &dGroves&f and other + - invaders are taking over the trees. + - If you could go over there and sort out these issues + - then my forces will be free to come to &dGladius'&f aid + questAcceptDialog: + - '&a[Bromia]&f The &dGroves&f are located North of the city.' + - There is a path through the mountain,, below the mines. + - '&7&oI should talk to &aKing Nemian&7&o.' + questCompleteMessage: + - '&a[King Nemian]&f You have arrived just in time!' +primis_pontis_mille_to_lycan_or_not_to_lycan: + name: '&2To lycan or not to lycan' + questLore: + - Not sure how a single person can accomplish what + - an entire battalion cannot. + - But if the &aGeneral&f has sent you, then who I am to complain. + - We have located their &dDen&f, but the resistance is too strong. + - There was just no way to get through. + - But If you could fight your way into the &dDen&f and clear it out + - then the &dRedwoods&f could be safe yet again. Well safer at least... + - Their &dDen&f is located under a &9Corrupted Redwood Tree&f. + - Should be easy to spot it, it stands out among the healthy trees. + questAcceptDialog: + - '&a[Cylindrus]&f Be careful...' + - '&7&oI need to clear out the &dWerewolf Den&7&o.' + questCompleteMessage: + - '&a[Magnus]&f By the great tree fairy, you''ve done it!!!' + - Feel free to rest at our camp, you are always welcome here. +primis_pontis_mille_where_is_he_now: + customObjectives: + Objective1: + dialog: + - '&a[Gorenus Palis]&f My brother sent you looking for me?' + - Oh, I messed up again...I got real lost this time. + - I hope he isn't too mad. + - When you go back, please tell him I'm safe. + name: '&2Hungry friend' + questLore: + - Me and my &aBrother&f were on our way + - back here from the village. + - During our travels I had to do a little detour, so we got separated. + - We were supposed to meet up here. + - But no trace of him for quite some time now. + - He has a tendency to get lost...real lost. + - I am quite worried about him. + - I would be willing to pay a high reward + - to anyone who can find him. + questAcceptDialog: + - '&a[Rodenus Palis]&f So kind of you to offer your help.' + - Please if you find him come tell me where he is right away. + - '&7&oI need to go find &a&oRodenus''&7&o brother.' + questCompleteMessage: + - '&a[Rodenus Palis]&f What! How the heck did he end up all the way there!' + - Sigh, I better start going now then... + - Thank you for all your help. Here are the coins as promised. +primis_pontis_redwoods_big_brown_logs: + customObjectives: + Objective1: + dialog: + - '&a[Magnus]&f Who are you? Oh, you came from &dPontis Mille&f.' + name: '&2Big brown logs' + questLore: + - I could dedicate my forces to helping &dGladius&f if you could help + - us deal with the &cWerewolf&f crisis in the &dRedwoods&f. + - Our forces have been holding back the &cWerewolves&f for weeks now. + - It would be great if you could assist us. + - Go to the &dRedwoods&f and talk to &aMagnus Castorea&f. + - They will let you know what needs to be done to end this crisis. + questAcceptDialog: + - '&a[Cylindrus]&fThe &dRedwoods&f can be reached by heading North.' + - Head North until you reach the &dRailway Stop&f, then head West. + - '&7&oI need to head into the &dRedwoods&7&o and talk to &aMagnus&7&o.' + questCompleteMessage: + - '&a[Magnus]&f The general has sent you to help?' + - Hmm...you better be good. +primis_pontis_redwoods_its_reyn_time: + name: '&2It is Reyn time!' + questLore: + - My &ePocket-watch&f had fallen into the river when I was cutting down a tree. + - It is a special watch you see. Filled with air and quite robust. + - Fully resilient to heavy logs being dropped on it, yep. + - I saw one of those nasty &cBandits&f scoop it up and put it in their pocket. + - Pretty sure I saw them &9Carrying a Hatchet&f. + - + - + - A nice reward for you too when you get back! + questAcceptDialog: + - '&8[Reynus]&f You can find the &cBandits&f right across the river.' + - '&7&oI need to go slay the correct &cBandit&7&o and collect the &eWatch&7&o.' + questCompleteMessage: + - '&a[Reynus]&f I will make sure not to loose it again!' + - Your reward my good sir! +primis_pontis_redwoods_nasty_little_bandits: + name: '&2Nasty little bandits!' + questLore: + - Ever since these darn &cBandits&f settled across the river there has been no peace. + - They keep ruining the trees, yesterday I caught one of them + - trying to set one of these giant trees on fire! + - And not too long ago I got chased by a crazy person with a hatchet, + - I am quite sure it was one of the &cBandits&f. + - Not too mention they keep trying to rob anyone that + - has business with us good folk here at the &dSawmill&f. + - Enough is enough. I am willing to pay good coin to make this madness end. + questAcceptDialog: + - '&a[Ligna Crispian]&f You will find them across the river.' + - '&8&oI should go to the &dBandit Camp&f and clear it out.' + questCompleteMessage: + - '&a[Ligna Crispian]&f Finally! Some peace, thank you!' +primis_pontis_redwoods_need_a_smoke: + name: '&2Need a smoke' + questLore: + - I heard you helped good old &aReynus&f there. + - Well as you can see, I managed to cut my legs with that darn saw again. + - Oh, don't worry about me. My legs will be healed up again in no time. + - You see, the issue is, not much to do while I wait for my legs to heal. + - This makes me in the mood for some good puffin. + - I brought with me some &ePremium Tobacco&f for my pipe, + - but I had to hide it in case those &cBandits&f got their hands on it. + - The problem is, I completely forgot where I hid it! + - All I remember is burying it &9Near a Tree&f. + - Which tree? Who knows! + - Listen I got you a fine deal here. Find my tobacco and you can have + - all of my &eGolden Apples&f. + questAcceptDialog: + - '&a[Lyco]&f Hope ya find it soon.' + - '&7&oI should go look for the &eTobacco&7&o.' + questCompleteMessage: + - '&a[Lyco]&f You found it! HAHA! Knew I could rely on ya!' +primis_terravilla_bipedal_examination: + name: '&2Bipedal examination' + questLore: + - I have been studying the &cTwo Legged Terrors&f that roam + - around &dTerravilla&f. Did you know that their population + - used to be much larger just some years ago. In fact it was + - the reason why the first settlers decided to build + - '&dTerravilla&f on top of the ruins and not down on the ground.' + - For some reason their numbers have really decreased. I was + - trying to get some &eSamples&f but trying to kill any of them is + - far beyond my skill. But you look like the sort of type who + - can handle a &cTwo Legged Terror&f or two. Interested in + - helping me out? + questAcceptDialog: + - '&a[Plautia Suilius]&f Six &eSamples&f should do it. Return to me once you have collected the &eSamples&f.' + - '&7&oI need to slay 3 &c&oTwo Legged Terrors&7&o and collect their &e&oSamples&7&o.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Great! Let''s have a look.' + - '&7&oI should hear what &a&oPlautia Suilius&7&o has discovered.' +primis_terravilla_drowning_terror: + name: '&2Drowning terror' + questLore: + - My theory was correct. I dissected the growth and found + - an organism inside. After careful examination I have + - determined that the organism is of aquatic origin. And + - not only that, they are capable of hijacking the host's + - brain. Once ready to hatch they make the host go to the + - nearest water source and drown themselves. The organism + - can then freely hatch and swim away. Whatever is + - infecting the &cTwo Legged Terrors&f must be living in + - a nearby river. You should go there and collect a + - '&ePerfect Sample&f of whatever organism is causing this.' + - I do not know if this is something that can affect humans + - but just in case you should kill a few of the organisms + - to make sure. + questAcceptDialog: + - '&a[Plautia Suilius]&f Come back here once you have collected a &ePerfect Sample&f.' + - '&7&oI need to go to the nearby river and collect a &e&oPerfect Sample&7&o of whatever is causing the infections.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Wow it looks like a fish, but it''s internal organs are different.' + - It must infect other creatures by releasing these tiny worm like meat particles... + - Let me have a look at you. Hmm, you seem fine, no traces... + - + - + - + - + - + - '&7&oI should make sure to stay away from the river...' +primis_terravilla_hog_on_my_porch: + name: '&2Bipedal examination' + questLore: + - He is sitting on the darn lift again! + - I cannot believe it! You there! + - You look like you can handle a large beast. + - I will pay you good money if you can get rid + - of that &cAnnoying Large Hog&f that keeps sitting + - on the lift. How are we supposed to get goods + - up and down this way. + questAcceptDialog: + - '&a[Dorippa Sarimarcus]&f Get rid of that hog right down there, see it?' + - '&7&oI need to slay the &c&oAlpha Razorback&7&o.' + questCompleteMessage: + - '&a[Dorippa Sarimarcus]&f Finally! I can move on with my life now! Thank you!' +primis_terravilla_razorbag: + name: '&2Razorbag' + questLore: + - If you are looking for work I got some for ya. + - I design and make heavy duty bags that I sell + - here at my little shop. So I am in need of + - leather. Thankfully there are plenty of + - '&cRazorbacks&f around these parts. If you are' + - interested I would like to hire you to go hunt + - them for their leather. I would need a considerable + - amount of leather. So this won't be a quick job. + questAcceptDialog: + - '&a[Telestis Senna]&f You will mostly find them roaming around here and towards the fields area.' + - '&7&oI need to go hunt the &c&oMature Razorback&7&o.' + questCompleteMessage: + - '&a[Telestis Senna]&f Yep, that will do it. In pristine condition too! Here is your coin, as promised.' +primis_terravilla_terrifying: + name: '&2Terrifying' + questLore: + - Well that is concerning. The sample you brought shows + - that they are slowly being drained of their nutrients. + - My hypothesis is that there is most likely a parasite + - attached to them that is causing this. You should go + - out there again and see if you can find any large + - '&eGrowths&f on their bodies, and then cut them off' + - and bring them back here. + questAcceptDialog: + - '&a[Plautia Suilius]&f I would only need two &eGrowths&f no more than that.' + - '&7&oI need to slay &c&oTwo Legged Terrors&7&o and collect two &e&oGrowths&7&o.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Excellent, these should do it.' + - '&7&oI should hear what &a&oPlautia Suilius&7&o has managed to find.' +test_quest: + name: Kill the Test Boss + questLore: + - '&cEnd the test boss'' reign of terror!' +xmas_quest_0: + name: '&2Find the lost gifts!' + questLore: + - + - + - I will let you open one of them in return! + questAcceptDialog: + - '&8[&cSaint Nick&8]&f Thank you! I will be waiting here for you!' + questCompleteMessage: + - '&8[&cSaint Nick&8]&f Thank you for your help! There are still some lost gifts out there, talk to me again if you want to help out more!' diff --git a/src/main/resources/translations/italian.yml b/src/main/resources/translations/italian.yml new file mode 100644 index 000000000..49322e0fd --- /dev/null +++ b/src/main/resources/translations/italian.yml @@ -0,0 +1,13078 @@ +config: + noArenaPermissionMessage: '[EliteMobs] You don''t have the permission to enter this arena!' +ItemSettings: + itemLoreStructureV2: + - '&7&m&l---------&7<&lEquip Info&7>&m&l---------' + - '&7Item level: &f$itemLevel &7Prestige &6$prestigeLevel' + - '$weaponOrArmorStats' + - '$soulbindInfo' + - '$itemSource' + - '$ifLore&7&m&l-----------&7< &f&lLore&7 >&m&l-----------' + - '$customLore' + - '$ifEnchantments&7&m&l--------&7<&9&lEnchantments&7>&m&l--------' + - '$enchantments' + - '$eliteEnchantments' + - '$ifCustomEnchantments&7&m&l------&7< &3&lCustom Enchants&7 >&m&l------' + - '$customEnchantments' + - '$ifPotionEffects&7&m&l----------&7< &5&lEffects&7 >&m&l----------' + - '$potionEffect' + - '&7&l&m-----------------------------' + - '$loreResaleValue' + shopSourceItemLores: '&7Acquistato da un negozio' + mobSourceItemLores: '&7Saccheggiato da $mob' + loreWorths: '&7Vale $worth $currencyName' + loreResaleValues: '&7Vendi per $resale $currencyName' + eliteEnchantmentLoreStrings: Elite + noSoulbindLore: '&7Non appartiene a nessuno!' + preventEliteItemDisenchantmentMessage: '&c[EliteMobs] Can''t disenchant Elite Items!' + scrapSucceededMessageV2: '&8[EliteMobs] &2Scrapping succeeded $amount times!' + scrapFailedMessageV2: '&8[EliteMobs] &cScrapping failed $amount times!' + lowDurabilityItemDropMessage: '&8[EliteMobs] &cDropped armor due to low durability! &8Repair it at the NPC with scrap to use it!' + lowWeaponItemDropMessage: '&8[EliteMobs] &cDropped weapon due to low durability! &8Repair it at the NPC with scrap to use it!' + simlootMessageSuccess: '&8[EliteMobs] &2Rolled for loot and got $itemName &2!' + simlootMessageFailure: '&8[EliteMobs] &cRolled for loot and got nothing!' + directDropCustomLootMessage: '&8[EliteMobs] &2Obtained $itemName &2!' + directDropMinecraftLootMessage: '&8[EliteMobs] &aObtained $itemName &a!' + directDropCoinMessage: '&8[EliteMobs] &aObtained &2$amount $currencyName &a!' + directDropSpecialMessage: '&8[EliteMobs] &aObtained &2$amount $name &a!' + weaponEntry: '&7Elite DPS: &2$EDPS' + armorEntry: '&7Elite Armor: &2$EDEF' +ProceduralItemGenerationSettings: + materialNames: + swordName: Sword + bowName: Bow + pickaxe: Pickaxe + spade: Spade + hoe: Hoe + axe: Axe + helmet: Helmet + chestplate: Chestplate + leggings: Leggings + boots: Boots + shears: Shears + fishingRod: Fishing Rod + shield: Shield + trident: Trident + crossbow: Crossbow + nameFormats: + - '$verb $itemType del $adjective $noun' + - '$itemType of the $adjective $noun' + - '$noun''s $adjective $verb $itemType' + - '$verb $itemType' + - '$adjective $verb $itemType' + - The $verb-er + - The $adjective $verb-er + nouns: + - MagmaGuy + - Alba + - Tramonto + - Paradiso + - Inferno + - Angelo + - Arcangelo + - Cherubino + - Serafino + - Demone + - Demonio + - Pipistrello + - Pollo + - Mucca + - Mooshroom + - Maiale + - Coniglio + - Pecora + - Calamaro + - Villager + - Ragno delle caverne + - Enderman + - Orso Polare + - Ragno + - Zombie Pigman + - Blaze + - Creeper + - Antico Guardiano + - Endermite + - Evoker + - Ghast + - Guardiano + - Husk + - Cubo di Magma + - Shulker + - Silverfish + - Scheletro + - Slime + - Stray + - Vex + - Vindicator + - Strega + - Scheletro Wither + - Zombie + - Asino + - Cavallo + - Lama + - Mulo + - Ocelot + - Lupo + - Golem di ferro + - Snow Golem + - Ender Dragon + - Wither + - Illusioner + - Parrot + - Gigante + - Killer Bunny + - Steve + - Wolfbane + - Caos + - Aeon + - Drago + - Sphynx + - Minotauro + - Hades + - Oath + - Oathbreaker + - Deserter + - Traditore + - Jade + - Luce + - Oscurità + - Oblio + - Ombra + - Vuoto + - Xeno + - Zealot + - Zenith + - Crepuscolo + - Twilight + - Creature + - Creature Elite + - Urist + - Nano + - Elfo + - Orco + - Goblin + - Gnomo + - Goliath + - Drow + - Umano + - Halfling + - Half-Orc + - Beholder + - Mind Flayer + - Owlbear + - Bulette + - Rust Monster + - Hill Giant + - Gigante di Pietra + - Gigante del Gelo + - Gigante del Fuoco + - Gigante delle Nuvole + - Gigante della Tempesta + - Kobold + - Lich + - Orco + - Umber Hulk + - Lottatore + - Stregone + - Paladino + - Chierico + - Esploratore + - Arciere + - Mago + - Tiefling + - Lupo Mannaro + - Vampiro + - Centauro + - Catfolk + - Half-Giant + - Ogre + - Troll + - Rogue + - Barbaro + - Bardo + - Druido + - Monaco + - Sorcerer + - Warlock + - Demon Hunter + - Death Knight + - Sacerdote + - Shamano + - Guerriero + - Basilisco + - Chimera + - Imp + - Driade + - Gargoyle + - Djinni + - Efreeti + - Ghost + - Hobgoblin + - Hydra + - Kraken + - Lamia + - Medusa + - Mimic + - Mummy + - Pegasus + - Roc + - Satyr + - Tarrasque + - Abomination + - Ghoul + - Treant + - Unicorn + - Wraith + - Acolyte + - Gladiator + - Knight + - Gryphon + - Raider + - Scout + - Spy + - Thg + - Noble + - Guard + - Veteran + - Wyvern + - Abissale + - Infernale + - Elementale + - Tauren + - Pandaren + - Sasquatch + - Forsaken + - Yeti + - Banshee + - Aracnide + - Non morto + - Night Elf + - Blood Elf + - Draenei + - Worgen + - Warlord + - Strega + - Magi + - Saggio + - Ladro + - Assassino + - Templare + - Beastmaster + - Berserker + - Inventore + - Luchador + - Pirata + - Avanguardia + - Lama del vuoto + - Wisp + - Peasant + - Footman + - Swordsman + - Thrall + - Felhound + - Cacciatrice + - Cacciatore + - Aarakorcra + - Aboleth + - Deva + - Planetar + - Solar + - Ankheg + - Azer + - Behir + - Death Tyrant + - Blight + - Bugbear + - Hugbear + - Bullywug + - Cambion + - Chuul + - Lich King + - Cockatrice + - Couatl + - Cyclops + - Titan + - Darkmantle + - Ancient One + - Demilich + - Balor + - Barlgura + - Chasme + - Dretch + - Glabrezu + - Goristro + - Hezrou + - Manes + - Marilith + - Nalfeshnee + - Quasit + - Vrock + - Yochlol + - Pit Fiend + - Lemure + - Dracolich + - Doppleganger + - Chromatic Dragon + - Drider + - Air Elemental + - Earth Elemental + - Fire Elemental + - Water Elemental + - Rohirrim + - Gondorian + - Empyrean + - Faerie Dragon + - Ettin + - Flumph + - Fomorian + - Dao + - Gnoll + - Parshendi + - Listener + - Spren + - Stormfather + - Rosharian + - Brightlord + - Highprince + - King + - Emperor + - Shardbearer + - Surgebinder + - Bondsmith + - Golem + - Gorgon + - Hag + - Harpy + - Hippogriff + - Homunculus + - State Alchemist + - Undying Soldier + - Jackalwere + - Nothic + - Oni + - Rakshasa + - Revenant + - Cultist + adjectives: + - Adorable + - Beautiful + - Clean + - Elegant + - Fancy + - Glamorous + - Handsome + - Long + - Magnificent + - Plain + - Quaint + - Sparkling + - Ugliest + - Red + - Orange + - Yellow + - Green + - Blue + - Purple + - Gray + - Black + - White + - Dead + - Odd + - Powerful + - Rich + - Vast + - Zealous + - Deafening + - Faint + - Melodic + - Quiet + - Thundering + - Whispering + - Hissing + - Ancient + - Fast + - Old + - Rapid + - Slow + - Rotten + - Creepy + - Crooked + - Empty + - Heavy + - Abhorrent + - Abnormal + - Absurd + - Acceptable + - Accidental + - Adamant + - Adventurous + - Agonizing + - Alert + - Annoyed + - Annoying + - Anxious + - Aromatic + - Aggressive + - Aloof + - Amazing + - Ambiguous + - Ambitious + - Amused + - Angry + - Arrogant + - Ashamed + - Aspiring + - Astonishing + - Auspicious + - Average + - Awesome + - Awful + - Bad + - Barbarous + - Bashful + - Beffiting + - Belligerent + - Beneficial + - Berserk + - Best + - Bewildered + - Big + - Bitter + - Bizarre + - Bloody + - Boiling + - Boundless + - Brash + - Brave + - Brawny + - Breakable + - Brief + - Bright + - Broken + - Busy + - Calculating + - Callous + - Calm + - Capricious + - Careful + - Careless + - Caring + - Cautious + - Ceaseless + - Certain + - Charming + - Cheap + - Chief + - Chilly + - Chivalrous + - Chunky + - Clear + - Clever + - Cloistered + - Clumsy + - Cloudy + - Classy + - Colossal + - Combative + - Common + - Confused + - Condemned + - Cool + - Courageous + - Cowardly + - Crazy + - Craven + - Cruel + - Cuddly + - Curious + - Cute + - Damaged + - Damaging + - Dangerous + - Dark + - Dashing + - Decisive + - Deep + - Defeated + - Defective + - Defiant + - Delicate + - Delicious + - Delightful + - Demonic + - Delirious + - Deranged + - Descriptive + - Devilish + - Difficult + - Diligent + - Direful + - Dirty + - Disastrous + - Disgusted + - Disgusting + - Disillusioned + - Distinct + - Disturbed + - Draconian + - Dramatic + - Dreary + - Dysfunctional + - Eager + - Elderly + - Electric + - Elite + - Enchanted + - Enchanting + - Energetic + - Enormous + - Entertaining + - Enthusiastic + - Envious + - Erratic + - Ethereal + - Evasive + - Excellent + - Excited + - Exciting + - Exotic + - Exuberant + - Fabulous + - Faded + - Fair + - Faithful + - 'False' + - Familiar + - Famous + - Fanatical + - Fantastic + - Fascinated + - Fat + - Fearful + - Fearless + - Feeble + - Festive + - Fierce + - Filthy + - Fine + - Finicky + - First + - Fixed + - Flashy + - Flawless + - Flimsy + - Flippant + - Flowery + - Fluffy + - Fluttering + - Foamy + - Foolish + - Forgetful + - Fortunate + - Frail + - Fragile + - Frantic + - Free + - Freezing + - Fresh + - Friendly + - Frightening + - Fumbling + - Funny + - Furry + - Furtive + - Fuzzy + - Gigante + - Gifted + - Gigantic + - Glistening + - Glorious + - Godly + - Good + - Goofy + - Gorgeous + - Graceful + - Grandiose + - Grateful + - Greasy + - Great + - Greedy + - Grieving + - Groovy + - Grotesque + - Grubby + - Gruesome + - Grumpy + - Guarded + - Guiltless + - Gullible + - Gutsy + - Guttural + - Hallowed + - Hanging + - Hapless + - Happy + - Harmonious + - Hateful + - Healthy + - Heartbreaking + - Heavenly + - Hellish + - Helpful + - Helpless + - Hesitant + - Hideous + - Hilarious + - Hollow + - Homeless + - Honorable + - Horrible + - Hospitable + - Huge + - Hulking + - Humorous + - Hungry + - Hurt + - Hushed + - Hypnotic + - Hysterical + - Icky + - Icy + - Ignorant + - Ill + - Illegal + - Illustrious + - Imaginary + - Immense + - Imminent + - Impartial + - Imperfect + - Impolite + - Important + - Incandescent + - Incompetent + - Industrious + - Incredible + - Inexpensive + - Infamous + - Innocent + - Inquisitive + - Insidious + - Instinctive + - Intelligent + - Interesting + - Invincible + - Irate + - Itchy + - Jaded + - Jagged + - Jealous + - Jolly + - Joyous + - Jumpy + - Juvenile + - Keen + - Kind + - Kindhearted + - Knowing + - Knowledgeable + - Known + - Labored + - Lame + - Large + - Last + - Late + - Laughable + - Lazy + - Lean + - Lethal + - Luce + - Little + - Living + - Lonely + - Loud + - Lovely + - Lucky + - Magenta + - Magical + - Majestic + - Malicious + - Marked + - Massive + - Marvelous + - Mean + - Medical + - Melted + - Messy + - Mighty + - Military + - Mindless + - Minor + - Misty + - Mixed + - Modern + - Motionless + - Mysterious + - Naive + - Narrow + - Natural + - Neat + - Necessary + - Needless + - Needy + - Nervous + - New + - Nice + - Normal + - Nostalgic + - Numberless + - Obsolete + - Obtainable + - Oceanic + - Old-fashioned + - Omniscient + - Optimal + - Ordinary + - Organic + - Outstanding + - Oval + - Overrated + - Painful + - Parallel + - Pathetic + - Peaceful + - Penitent + - Perfect + - Periodic + - Petite + - Physical + - Pink + - Plastic + - Pleasant + - Pointless + - Polite + - Poor + - Precious + - Premium + - Present + - Pretty + - Private + - Productive + - Protective + - Public + - Puzzling + - Questionable + - Quick + - Quickest + - Rare + - Ready + - Real + - Rebel + - Regular + - Remarkable + - Responsible + - Romantic + - Round + - Royal + - Sad + - Safe + - Salty + - Satisfying + - Scared + - Scary + - Scientific + - Scrawny + - Screeching + - Second + - Second-hand + - Secret + - Selfish + - Sequacious + - Serious + - Shallow + - Sharp + - Shiny + - Shocking + - Short + - Shy + - Sick + - Silent + - Silky + - Silly + - Simple + - Skinny + - Slim + - Slimy + - Slippery + - Small + - Smart + - Smiling + - Smooth + - Sneaky + - Soft + - Solid + - Special + - Spectacular + - Spicy + - Spiky + - Splendid + - Spooky + - Spotless + - Square + - Staking + - Standing + - Steady + - Sticky + - Strange + - Striped + - Strong + - Successful + - Super + - Supreme + - Sweet + - Talented + - Tall + - Tasty + - Temporary + - Tense + - Terrible + - Terrific + - Tested + - Thankful + - Thick + - Thin + - Assetato + - Thoughtful + - Tiny + - Tired + - Tricky + - Troubled + - 'True' + - Ugly + - Ultra + - Unadvised + - Unarmed + - Uncovered + - Unhealthy + - Unique + - Unknown + - Unnatural + - Unused + - Unusual + - Used + - Useful + - Useless + - Valuable + - Violent + - Waiting + - Wandering + - Warm + - Weak + - Wealthy + - Whole + - Wise + - Wonderful + - Wooden + - Worried + - Worthless + - Wrong + - Menacing + - Trusting + - Unassuming + - Threatening + verbs: + - Slashing + - Cutting + - Stabbing + - Scratching + - Killing + - Slaying + - Butchering + - Destroying + - Tickling + - Hugging + - Murdering + - Slapping + - Hissing + - Traveling + - Teleporting + - Blinking + - Destroying + - Wrecking + - Flashing + - Materializing + - Spawning + - Questioning + - Inquiring + - Pleading + - Demanding + - Interrogating + - Querying + - Assaulting + - Striking + - Ambushing + - Assailing + - Rushing + - Storming + - Bombarding + - Barraging + - Smiting + - Charging + - Clobbering + - Battling + - Battering + - Hammering + - Beating + - Combating + - Overwhelming + - Raiding + - Tackling + - Shooting + - Venturing + - Cracking + - Rupturing + - Smashing + - Shattering + - Fracturing + - Splintering + - Pulverizing + - Tearing + - Rending + - Snapping + - Bursting + - Exploding + - Damaging + - Fragmenting + - Splitting + - Fortifying + - Nudging + - Tapping + - Jostling + - Thumping + - Butting + - Clattering + - Striking + - Whacking + - Slamming + - Summoning + - Screaming + - Bellowing + - Roaring + - Shifting + - Transforming + - Modifying + - Twisting + - Mutating + - Distorting + - Blurring + - Adjusting + - Warping + - Altering + - Adapting + - Evolving + - Varying + - Hunting + - Trailing + - Following + - Stalking + - Shadowing + - Hounding + - Casing + - Mounting + - Ascending + - Rising + - Heaving + - Springing + - Cresting + - Gathering + - Corralling + - Hoarding + - Reaping + - Harvesting + - Saving + - Sheltering + - Cloaking + - Shrouding + - Enclosing + - Concealing + - Hiding + - Disguising + - Masking + - Burying + - Smothering + - Clouding + - Shielding + - Shading + - Sealing + - Enveloping + - Veiling + - Obscuring + - Traversing + - Fording + - Gliding + - Howling + - Whimpering + - Screaming + - Shrieking + - Squealing + - Roaring + - Wailing + - Bawling + - Screeching + - Cleaving + - Chopping + - Chipping + - Severing + - Slicing + - Snipping + - Splitting + - Axing + - Slashing + - Rending + - Tearing + - Thinning + - Cropping + - Carving + - Dissecting + - Hacking + - Piercing + - Sawing + - Shaving + - Shearing + - Mining + - Delving + - Excavating + - Burrowing + - Drilling + - Hollowing + - Gouging + - Tunneling + - Invading + - Boarding + - Wandering + - Infiltrating + - Intruding + - Evading + - Fleeing + - Running + - Dodging + - Crashing + - Battling + - Tussling + - Wrestling + - Scuffling + - Dueling + - Brawling + - Jousting + - Sparring + - Clashing + - Warring + - Grappling + - Scrapping + - Attacking + - Feuding + - Skirmishing + - Discovering + - Detecting + - Catching + - Solving + - Revealing + - Unearthing + - Leaping + - Bouncing + - Springing + - Vaulting + - Hopping + - Surging + - Punting + - Booting + - Dropkicking + - Sensing + - Perceiving + - Detecting + - Fading + - Bleeding + - Shrinking + - Weakening + - Abating + - Diminishing + - Forging + - Releasing + - Gathering + - Collecting + - Culling + - Crushing + - Propelling + - Jogging + - Sprinting + - Questing + - Scouting + - Exploring + - Digging + - Trembling + - Rattling + - Parting + - Hacking + - Rupturing + - Carving + - Dividing + - Halving + - Breaking + - Sundering + - Separating + - Rending + - Ripping + - Grazing + - Imprisoning + - Snaring + - Cornering + - Entangling + - Pinning + - Catching + - Restraining + - Binding + - Hooking + - Snagging + - Snatching + - Caging + - Capturing + - Haunting + - Creeping + - Sneaking + - Spying + - Avenging + - Storming + verb-ers (noun): + - World Breaker + - World Shatterer + - Avenger + - Ashbringer + - Windseeker + - Defiler + - Thunderfury + - Slicer + - Slasher + - Cutter + - Stabber + - Scratcher + - Killer + - Slayer + - Destroyer + - Hugger + - Murderer + - Slapper + - Traveller + - Teleporter + - Blinker + - Wrecker + - Materializer + - Spawner + - Demander + - Assaulter + - Striker + - Ambusher + - Rusher + - Stormer + - Bombarder + - Barrager + - Smiter + - Charger + - Battler + - Hammerer + - Beater + - Combater + - Overwhelmer + - Raider + - Tackler + - Shooter + - Venturer + - Cracker + - Smasher + - Shatterer + - Fracturer + - Splinterer + - Pulverizer + - Tearer + - Renderer + - Snapper + - Burster + - Exploder + - Damager + - Fragmenter + - Splitter + - Fortifier + - Nudger + - Tapper + - Thumper + - Butter + - Clatterer + - Striker + - Whacker + - Slammer + - Summoner + - Screamer + - Shifter + - Transformer + - Modifyer + - Twister + - Blurrer + - Warper + - Alterer + - Adapter + - Evolver + - HunterEnchantment + - Trailer + - Follower + - Stalker + - Shadower + - Hounder + - Caser + - Mounter + - Ascender + - Riser + - Springer + - Hoarder + - Reaper + - Harvester + - Saver + - Shelterer + - Cloaker + - Shrouder + - Encloser + - Hider + - Masker + - Buryer + - Clouder + - Shader + - Sealer + - Enveloper + - Veiler + - Traverser + - Forder + - Glider + - Howler + - Whimperer + - Screamer + - Squealer + - Bawler + - Screecher + - Chopper + - Chipper + - Snipper + - Splitter + - Axer + - Slasher + - Renderer + - Tearer + - Thinner + - Cropper + - Carver + - Hacker + - Piercer + - Sawer + - Shaver + - Shearer + - Miner + - Excavater + - Burrower + - Driller + - Tunneler + - Invader + - Boarder + - Wanderer + - Intruder + - Evader + - Runner + - Dodger + - Crasher + - Battler + - Wrestler + - Scuffler + - Dueler + - Brawler + - Clasher + - Grappler + - Scrapper + - Attacker + - Feuder + - Catcher + - Solver + - Revealer + - Leaper + - Bouncer + - Vaulter + - Hopper + - Surger + - Punter + - Dropkicker + - Perceiver + - Fader + - Bleeder + - Weakener + - Forger + - Releaser + - Gatherer + - Crusher + - Propeller + - Jogger + - Sprinter + - Scouter + - Explorer + - Digger + - Trembler + - Parter + - Hacker + - Carver + - Divider + - Halver + - Breaker + - Renderer + - Ripper + - Grazer + - Imprisoner + - Cornerer + - Pinner + - Catcher + - Restrainer + - Binder + - Snagger + - Snatcher + - Cager + - Capturer + - Haunter + - Creeper + - Sneaker + - Binder + - Jailer + - Seducer + - Dancer + - Blasphemer + - Eater + - Snorer + - Thruster + - Slapper +absorption: + name: Absorption +blindness: + name: Blindness +conduit_power: + name: Conduit Power +confusion: + name: Nausea +damage_resistance: + name: Resistance +dolphins_grace: + name: Dolphin's Grace +fast_digging: + name: Haste +fire_resistance: + name: Fire Resistance +glowing: + name: Glowing +harm: + name: Instant Damage +heal: + name: Instant Health +health_boost: + name: Health Boost +hunger: + name: Hunger +increase_damage: + name: Strength +invisibility: + name: Invisibility +jump: + name: Jump Boost +levitation: + name: Levitation +luck: + name: Luck +night_vision: + name: Night Vision +poison: + name: Poison +regeneration: + name: Regeneration +saturation: + name: Saturation +slow: + name: Slowness +slow_digging: + name: Mining Fatigue +slow_falling: + name: Slow Falling +speed: + name: Speed +unluck: + name: Bad Luck +water_breathing: + name: Water Breathing +weakness: + name: Weakness +wither: + name: Wither +translation: + Economy pay message v2: '&2You have paid &2$amount_sent $currency_name &2to $receiver&2, who got $amount_received after taxes!' + Economy currency left message: You now have &2$amount_left $currency_name + Economy money from payment message: You have received &2$amount_received $currency_name &ffrom $sender + Economy payment insuficient currency: '&cYou don''t have enough $currency_name to do that!' + Wallet command message: You have &2$balance $currency_name + Tax confirmation message: '&cSending a payment will cost $percentage% in taxes. &aDo &9$command &ato proceed!' + shopBatchSellItem: '&aYou have sold your items &afor $currency_amount $currency_name!' + Shop buy message: '&aYou have bought $item_name &afor $item_value $currency_name!' + Shop current balance message: '&aYou have $currency_amount $currency_name.' + Shop insufficient funds message: '&cYou don''t have enough $currency_name!' + Shop item cost message: That item costs &c$item_value $currency_name. + Shop sell message: '&aYou have sold $item_name &afor $currency_amount $currency_name!' + Shop sale player items warning: '&cYou can''t sell items that are not currently soulbound to you! This includes items from other prestige tiers!' + Shop sale instructions: '&cYou can only sell EliteMobs loot here! (Armor / weapons dropped from elites showing a value on their lore)' + Teleport time left: '&7[EM] Teleporting in &a$time &7seconds...' + Teleport cancelled: '&7[EM] &cTeleport interrupted!' + noPendingCommands: '&cYou don''t currently have any pending commands!' + trackMessage: Track the $name + chestLowRankMessage: '&7[EM] &cYour guild rank needs to be at least $rank &cin order to open this chest!' + chestCooldownMessage: '&7[EM] &cYou''ve already opened this chest recently! Wait $time!' + insufficientCurrencyForWormholeMessage: '&8[EliteMobs] &cInsufficient currency! You need $amount to use this com.magmaguy.elitemobs.wormhole!' + dismissEMMessage: '&8[EliteMobs] &2/elitemobs &fmenu not working for you? Try &2/elitemobs alt &fto see an alternative version of the menu! &cDon''t want to see this message again? &4/em dismiss' + switchEMStyleMessage: '&8[EliteMobs] &2/elitemobs &fmenu style changed! Check it out!' +EconomySettings: + currencyName: Monete Elite + chatCurrencyShowerMessage: '&7[EM] Hai raccolto &a$amount $currency_name!' + actionbarCurrencyShowerMessage: '&7[EM] Hai raccolto &a$amount $currency_name!' + adventurersGuildNotificationMessages: '&7[EM] Soldi in più da spendere? Prova &a/em !' +arrow_damage: + name: Power +arrow_fire: + name: Flame +arrow_infinite: + name: Infinity +arrow_knockback: + name: Punch +binding_curse: + name: Curse of Binding +channeling: + name: Channeling +critical_strikes: + name: Critical Strikes + criticalHitPopup: '&5Critical Hit!' +damage_all: + name: Sharpness +damage_arthropods: + name: Bane of Arthropods +damage_undead: + name: Smite +depth_strider: + name: Depth Strider +dig_speed: + name: Efficiency +drilling: + name: Drilling +durability: + name: Unbreaking +earthquake: + name: Earthquake + earthquakeActivationMessage: '&8[EliteMobs] &aEarthquake triggered! &c2 min cooldown!' + earthquakeAvailableMessage: '&8[EliteMobs] &2Earthquake cooldown over!' +fire_aspect: + name: Fire Aspect +flamethrower: + name: Flamethrower +frost_walker: + name: Frost Walker +grappling_hook: + name: Grappling Hook +hunter: + name: Cacciatore +ice_breaker: + name: Ice Breaker +impaling: + name: Impaling +knockback: + name: Knockback +lightning: + name: Lightning +loot_bonus_blocks: + name: Fortune +loot_bonus_mobs: + name: Looting +loud_strikes: + name: Loud Strikes +loyalty: + name: Loyalty +lure: + name: Lure +mending: + name: Mending +meteor_shower: + name: Meteor Shower +multishot: + name: Multishot +oxygen: + name: Respiration +piercing: + name: Piercing +plasma_boots: + name: Plasma Boots +protection_environmental: + name: Protection +protection_explosions: + name: Blast Protection +protection_fall: + name: Feather Falling +protection_fire: + name: Fire Protection +protection_projectile: + name: Projectile Protection +quick_charge: + name: Quick Charge +riptide: + name: Riptide +silk_touch: + name: Silk Touch +soulbind: + name: Soulbind + loreStrings: '&7Soulbound to &f$player' + hologramString: '$player&f''s' +summon_merchant: + name: Summon Merchant + message: Jeeves! +summon_wolf: + name: Summon Wolf +sweeping_edge: + name: Sweeping Edge +thorns: + name: Thorns +unbind: + name: Unbind +vanishing_curse: + name: Curse of Vanishing +water_worker: + name: Aqua Affinity +AntiExploit: + AntiExploit message: '&c[EM AntiExploit] &7L''Elite nelle vicinanze non rilascerà bottini speciali.' +CombatTag: + Combat tag message: '&c[EliteMobs] Tag della battaglia attivata!' +AdventurersGuild: + adventurersGuildMenuName: '&6&lCentro dell''Avventuriero' + Prestige 0 rank 0: '&8Commoner - disables elites!' + Prestige 0 rank 0 short placeholder: '&6&l✧&e0' + Prestige 0 rank 1: '&fRecluta' + Prestige 0 rank 1 short placeholder: '&6&l✧&eⅠ' + Prestige 0 rank 2: '&fNovizio' + Prestige 0 rank 2 short placeholder: '&6&l✧&eⅠⅠ' + Prestige 0 rank 3: '&fApprendista' + Prestige 0 rank 3 short placeholder: '&6&l✧&eⅠⅠⅠ' + Prestige 0 rank 4: '&2Avventuriero' + Prestige 0 rank 4 short placeholder: '&6&l✧&eⅠⅤ' + Prestige 0 rank 5: '&2Viaggiatore' + Prestige 0 rank 5 short placeholder: '&6&l✧&eⅤ' + Prestige 0 rank 6: '&2Adepto' + Prestige 0 rank 6 short placeholder: '&6&l✧&eⅤⅠ' + Prestige 0 rank 7: '&1Veterano' + Prestige 0 rank 7 short placeholder: '&6&l✧&eⅤⅠⅠ' + Prestige 0 rank 8: '&1Elite' + Prestige 0 rank 8 short placeholder: '&6&l✧&eⅤⅠⅠⅠ' + Prestige 0 rank 9: '&lMaestro' + Prestige 0 rank 9 short placeholder: '&6&l✧&eⅠⅩ' + Prestige 0 rank 10: '&5Eroe' + Prestige 0 rank 10 short placeholder: '&6&l✧&eⅩ' + Prestige 1 rank 0: '&ePrestigio 1 &8Plebeo' + Prestige 1 rank 0 short placeholder: '&e⚜Ⅰ&6&l✧&e0' + Prestige 1 rank 1: '&ePrestigio 1 &fRecluta' + Prestige 1 rank 1 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠ' + Prestige 1 rank 2: '&ePrestigio 1 &fNovizio' + Prestige 1 rank 2 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅠ' + Prestige 1 rank 3: '&ePrestigio 1 &fApprendista' + Prestige 1 rank 3 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅠⅠ' + Prestige 1 rank 4: '&ePrestigio 1 &2Avventuriero' + Prestige 1 rank 4 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅤ' + Prestige 1 rank 5: '&ePrestigio 1 &2Viaggiatore' + Prestige 1 rank 5 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤ' + Prestige 1 rank 6: '&ePrestigio 1 &2Adepto' + Prestige 1 rank 6 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠ' + Prestige 1 rank 7: '&ePrestigio 1 &1Veterano' + Prestige 1 rank 7 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠⅠ' + Prestige 1 rank 8: '&ePrestigio 1 &1Elite' + Prestige 1 rank 8 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠⅠⅠ' + Prestige 1 rank 9: '&ePrestigio 1 &5Maestro' + Prestige 1 rank 9 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅩ' + Prestige 1 rank 10 short placeholder: '&e⚜Ⅰ&6&l✧&eⅩ' + Prestige 1 rank 10: '&ePrestigio 1 &5Eroe' + Prestige 1 rank 11: '&ePrestigio 1 &5Leggenda' + Prestige 1 rank 11 short placeholder: '&e⚜Ⅰ&6&l✧&eⅩⅠ' + Prestige 2 rank 0: '&2Prestigio 2 &8Plebeo' + Prestige 2 rank 0 short placeholder: '&2⚜ⅠⅠ&6&l✧&e0' + Prestige 2 rank 1: '&2Prestigio 2 &fRecluta' + Prestige 2 rank 1 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠ' + Prestige 2 rank 2: '&2Prestigio 2 &fNovizio' + Prestige 2 rank 2 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅠ' + Prestige 2 rank 3: '&2Prestigio 2 &fApprendista' + Prestige 2 rank 3 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 2 rank 4: '&2Prestigio 2 &2Avventuriero' + Prestige 2 rank 4 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅤ' + Prestige 2 rank 5: '&2Prestigio 2 &2Viaggiatore' + Prestige 2 rank 5 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤ' + Prestige 2 rank 6: '&2Prestigio 2 &2Adepto' + Prestige 2 rank 6 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠ' + Prestige 2 rank 7: '&2Prestigio 2 &1Veterano' + Prestige 2 rank 7 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 2 rank 8: '&2Prestigio 2 &1Elite' + Prestige 2 rank 8 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 2 rank 9: '&2Prestigio 2 &5Maestro' + Prestige 2 rank 9 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅩ' + Prestige 2 rank 10 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩ' + Prestige 2 rank 10: '&2Prestige 2 &5Eroe' + Prestige 2 rank 11: '&2Prestigio 2 &5Leggenda' + Prestige 2 rank 11 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩⅠ' + Prestige 2 rank 12: '&2Prestigio 2 &5Mito' + Prestige 2 rank 12 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 3 rank 0: '&aPrestigio 3 &8Plebeo' + Prestige 3 rank 0 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&e0' + Prestige 3 rank 1: '&aPrestigio 3 &fRecluta' + Prestige 3 rank 1 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠ' + Prestige 3 rank 2: '&aPrestigio 3 &fNovizio' + Prestige 3 rank 2 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠ' + Prestige 3 rank 3: '&aPrestigio 3 &fApprendista' + Prestige 3 rank 3 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 3 rank 4: '&aPrestigio 3 &2Avventuriero' + Prestige 3 rank 4 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅤ' + Prestige 3 rank 5: '&aPrestigio 3 &2Viaggiatore' + Prestige 3 rank 5 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤ' + Prestige 3 rank 6: '&aPrestigio 3 &2Adepto' + Prestige 3 rank 6 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠ' + Prestige 3 rank 7: '&aPrestigio 3 &1Veterano' + Prestige 3 rank 7 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 3 rank 8: '&aPrestigio 3 &1Elite' + Prestige 3 rank 8 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 3 rank 9: '&aPrestigio 3 &5Maestro' + Prestige 3 rank 9 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅩ' + Prestige 3 rank 10 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩ' + Prestige 3 rank 10: '&aPrestigio 3 &5Eroe' + Prestige 3 rank 11: '&aPrestigio 3 &5Leggenda' + Prestige 3 rank 11 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠ' + Prestige 3 rank 12: '&aPrestigio 3 &5Mito' + Prestige 3 rank 12 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 3 rank 13: '&aPrestigio 3 &5Immortale' + Prestige 3 rank 13 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 4 rank 0: '&3Prestigio 4 &8Plebeo' + Prestige 4 rank 0 short placeholder: '&3⚜ⅠⅤ&6&l✧&e0' + Prestige 4 rank 1: '&3Prestigio 4 &fRecluta' + Prestige 4 rank 1 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠ' + Prestige 4 rank 2: '&3Prestigio 4 &fNovizio' + Prestige 4 rank 2 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅠ' + Prestige 4 rank 3: '&3Prestigio 4 &fApprendista' + Prestige 4 rank 3 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅠⅠ' + Prestige 4 rank 4: '&3Prestigio 4 &2Avventuriero' + Prestige 4 rank 4 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅤ' + Prestige 4 rank 5: '&3Prestigio 4 &2Viaggiatore' + Prestige 4 rank 5 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤ' + Prestige 4 rank 6: '&3Prestigio 4 &2Adepto' + Prestige 4 rank 6 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠ' + Prestige 4 rank 7: '&3Prestigio 4 &1Veterano' + Prestige 4 rank 7 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠⅠ' + Prestige 4 rank 8: '&3Prestigio 4 &1Elite' + Prestige 4 rank 8 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠⅠⅠ' + Prestige 4 rank 9: '&3Prestigio 4 &5Maestro' + Prestige 4 rank 9 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅩ' + Prestige 4 rank 10 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩ' + Prestige 4 rank 10: '&3Prestigio 4 &5Eroe' + Prestige 4 rank 11: '&3Prestigio 4 &5Leggenda' + Prestige 4 rank 11 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠ' + Prestige 4 rank 12: '&3Prestigio 4 &5Mito' + Prestige 4 rank 12 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅠ' + Prestige 4 rank 13: '&3Prestigio 4 &5Immortale' + Prestige 4 rank 13 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅠⅠ' + Prestige 4 rank 14: '&3Prestigio 4 &5Prescelto' + Prestige 4 rank 14 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅤ' + Prestige 5 rank 0: '&bPrestigio 5 &8Plebeo' + Prestige 5 rank 0 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 5 rank 1: '&bPrestigio 5 &fRecluta' + Prestige 5 rank 1 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠ' + Prestige 5 rank 2: '&bPrestigio 5 &fNovizio' + Prestige 5 rank 2 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅠ' + Prestige 5 rank 3: '&bPrestigio 5 &fApprendista' + Prestige 5 rank 3 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅠⅠ' + Prestige 5 rank 4: '&bPrestigio 5 &2Avventuriero' + Prestige 5 rank 4 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅤ' + Prestige 5 rank 5: '&bPrestigio 5 &2Viaggiatore' + Prestige 5 rank 5 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤ' + Prestige 5 rank 6: '&bPrestigio 5 &2Adepto' + Prestige 5 rank 6 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠ' + Prestige 5 rank 7: '&bPrestigio 5 &1Veterano' + Prestige 5 rank 7 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠⅠ' + Prestige 5 rank 8: '&bPrestigio 5 &1Elite' + Prestige 5 rank 8 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠⅠⅠ' + Prestige 5 rank 9: '&bPrestigio 5 &5Maestro' + Prestige 5 rank 9 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅩ' + Prestige 5 rank 10 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩ' + Prestige 5 rank 10: '&bPrestigio 5 &5Eroe' + Prestige 5 rank 11: '&bPrestigio 5 &5Leggenda' + Prestige 5 rank 11 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠ' + Prestige 5 rank 12: '&bPrestigio 5 &5Mito' + Prestige 5 rank 12 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅠ' + Prestige 5 rank 13: '&bPrestigio 5 &5Immortale' + Prestige 5 rank 13 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅠⅠ' + Prestige 5 rank 14: '&bPrestigio 5 &5Prescelto' + Prestige 5 rank 14 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅤ' + Prestige 5 rank 15: '&bPrestigio 5 &5Ascendente' + Prestige 5 rank 15 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅤ' + Prestige 6 rank 0: '&4Prestigio 6 &8Plebeo' + Prestige 6 rank 0 short placeholder: '&4⚜ⅤⅠ&6&l✧&e0' + Prestige 6 rank 1: '&4Prestigio 6 &fRecluta' + Prestige 6 rank 1 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠ' + Prestige 6 rank 2: '&4Prestigio 6 &fNovizio' + Prestige 6 rank 2 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅠ' + Prestige 6 rank 3: '&4Prestigio 6 &fApprendista' + Prestige 6 rank 3 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅠⅠ' + Prestige 6 rank 4: '&4Prestigio 6 &2Avventuriero' + Prestige 6 rank 4 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅤ' + Prestige 6 rank 5: '&4Prestigio 6 &2Viaggiatore' + Prestige 6 rank 5 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤ' + Prestige 6 rank 6: '&4Prestigio 6 &2Adepto' + Prestige 6 rank 6 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠ' + Prestige 6 rank 7: '&4Prestigio 6 &1Veterano' + Prestige 6 rank 7 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠⅠ' + Prestige 6 rank 8: '&4Prestigio 6 &1Elite' + Prestige 6 rank 8 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 6 rank 9: '&4Prestigio 6 &5Maestro' + Prestige 6 rank 9 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅩ' + Prestige 6 rank 10 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩ' + Prestige 6 rank 10: '&4Prestigio 6 &5Eroe' + Prestige 6 rank 11: '&4Prestigio 6 &5Leggenda' + Prestige 6 rank 11 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠ' + Prestige 6 rank 12: '&4Prestigio 6 &5Mito' + Prestige 6 rank 12 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠ' + Prestige 6 rank 13: '&4Prestigio 6 &5Immortale' + Prestige 6 rank 13 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 6 rank 14: '&4Prestigio 6 &5Prescelto' + Prestige 6 rank 14 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅤ' + Prestige 6 rank 15: '&4Prestigio 6 &5Ascendente' + Prestige 6 rank 15 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤ' + Prestige 6 rank 16: '&4Prestigio 6 &5Titano' + Prestige 6 rank 16 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤⅠ' + Prestige 7 rank 0: '&cPrestigio 7 &8Plebeo' + Prestige 7 rank 0 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&e0' + Prestige 7 rank 1: '&cPrestigio 7 &fRecluta' + Prestige 7 rank 1 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠ' + Prestige 7 rank 2: '&cPrestigio 7 &fNovizio' + Prestige 7 rank 2 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅠ' + Prestige 7 rank 3: '&cPrestigio 7 &fApprendista' + Prestige 7 rank 3 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 7 rank 4: '&cPrestigio 7 &2Avventuriero' + Prestige 7 rank 4 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅤ' + Prestige 7 rank 5: '&cPrestigio 7 &2Viaggiatore' + Prestige 7 rank 5 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤ' + Prestige 7 rank 6: '&cPrestigio 7 &2Adepto' + Prestige 7 rank 6 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠ' + Prestige 7 rank 7: '&cPrestigio 7 &1Veterano' + Prestige 7 rank 7 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 7 rank 8: '&cPrestigio 7 &1Elite' + Prestige 7 rank 8 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 7 rank 9: '&cPrestigio 7 &5Maestro' + Prestige 7 rank 9 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅩ' + Prestige 7 rank 10 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩ' + Prestige 7 rank 10: '&cPrestigio 7 &5Eroe' + Prestige 7 rank 11: '&cPrestigio 7 &5Leggenda' + Prestige 7 rank 11 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠ' + Prestige 7 rank 12: '&cPrestigio 7 &5Mito' + Prestige 7 rank 12 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 7 rank 13: '&cPrestigio 7 &5Immortale' + Prestige 7 rank 13 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 7 rank 14: '&cPrestigio 7 &5Prescelto' + Prestige 7 rank 14 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅤ' + Prestige 7 rank 15: '&cPrestigio 7 &5Ascendente' + Prestige 7 rank 15 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤ' + Prestige 7 rank 16: '&cPrestigio 7 &5Titano' + Prestige 7 rank 16 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤⅠ' + Prestige 7 rank 17: '&cPrestigio 7 &5Semidio' + Prestige 7 rank 17 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤⅠⅠ' + Prestige 8 rank 0: '&9Prestigio 8 &8Plebeo' + Prestige 8 rank 0 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&e0' + Prestige 8 rank 1: '&9Prestigio 8 &fRecluta' + Prestige 8 rank 1 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠ' + Prestige 8 rank 2: '&9Prestigio 8 &fNovizio' + Prestige 8 rank 2 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅠ' + Prestige 8 rank 3: '&9Prestigio 8 &fApprendista' + Prestige 8 rank 3 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 8 rank 4: '&9Prestigio 8 &2Avventuriero' + Prestige 8 rank 4 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅤ' + Prestige 8 rank 5: '&9Prestigio 8 &2Viaggiatore' + Prestige 8 rank 5 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤ' + Prestige 8 rank 6: '&9Prestigio 8 &2Adepto' + Prestige 8 rank 6 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠ' + Prestige 8 rank 7: '&9Prestigio 8 &1Veterano' + Prestige 8 rank 7 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 8 rank 8: '&9Prestigio 8 &1Elite' + Prestige 8 rank 8 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 8 rank 9: '&9Prestigio 8 &5Maestro' + Prestige 8 rank 9 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅩ' + Prestige 8 rank 10 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩ' + Prestige 8 rank 10: '&9Prestigio 8 &5Eroe' + Prestige 8 rank 11: '&9Prestigio 8 &5Leggenda' + Prestige 8 rank 11 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠ' + Prestige 8 rank 12: '&9Prestigio 8 &5Mito' + Prestige 8 rank 12 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 8 rank 13: '&9Prestigio 8 &5Immortale' + Prestige 8 rank 13 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 8 rank 14: '&9Prestigio 8 &5Prescelto' + Prestige 8 rank 14 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅤ' + Prestige 8 rank 15: '&9Prestigio 8 &5Ascendente' + Prestige 8 rank 15 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤ' + Prestige 8 rank 16: '&9Prestigio 8 &5Titano' + Prestige 8 rank 16 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠ' + Prestige 8 rank 17: '&9Prestigio 8 &5Semidio' + Prestige 8 rank 17 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠⅠ' + Prestige 8 rank 18: '&9Prestigio 8 &5Divino' + Prestige 8 rank 18 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 9 rank 0: '&dPrestigio 9 &8Plebeo' + Prestige 9 rank 0 short placeholder: '&d⚜ⅠⅩ&6&l✧&e0' + Prestige 9 rank 1: '&dPrestigio 9 &fRecluta' + Prestige 9 rank 1 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠ' + Prestige 9 rank 2: '&dPrestigio 9 &fNovizio' + Prestige 9 rank 2 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅠ' + Prestige 9 rank 3: '&dPrestigio 9 &fApprendista' + Prestige 9 rank 3 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅠⅠ' + Prestige 9 rank 4: '&dPrestigio 9 &2Avventuriero' + Prestige 9 rank 4 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅤ' + Prestige 9 rank 5: '&dPrestigio 9 &2Viaggiatore' + Prestige 9 rank 5 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤ' + Prestige 9 rank 6: '&dPrestigio 9 &2Adepto' + Prestige 9 rank 6 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠ' + Prestige 9 rank 7: '&dPrestigio 9 &1Veterano' + Prestige 9 rank 7 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅠⅠ' + Prestige 9 rank 8: '&dPrestigio 9 &1Elite' + Prestige 9 rank 8 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠⅠⅠ' + Prestige 9 rank 9: '&dPrestigio 9 &5Maestro' + Prestige 9 rank 9 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅩ' + Prestige 9 rank 10 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩ' + Prestige 9 rank 10: '&dPrestigio 9 &5Eroe' + Prestige 9 rank 11: '&dPrestigio 9 &5Leggenda' + Prestige 9 rank 11 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠ' + Prestige 9 rank 12: '&dPrestigio 9 &5Mito' + Prestige 9 rank 12 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅠ' + Prestige 9 rank 13: '&dPrestigio 9 &5Immortale' + Prestige 9 rank 13 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅠⅠ' + Prestige 9 rank 14: '&dPrestigio 9 &5Prescelto' + Prestige 9 rank 14 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅤ' + Prestige 9 rank 15: '&dPrestigio 9 &5Ascendente' + Prestige 9 rank 15 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤ' + Prestige 9 rank 16: '&dPrestigio 9 &5Titano' + Prestige 9 rank 16 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠ' + Prestige 9 rank 17: '&dPrestigio 9 &5Semidio' + Prestige 9 rank 17 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠⅠ' + Prestige 9 rank 18: '&dPrestigio 9 &5Divino' + Prestige 9 rank 18 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 9 rank 19: '&dPrestigio 9 &5Cacciadei' + Prestige 9 rank 19 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠⅠ' + Prestige 10 rank 0: '&5Prestigio 10 &8Plebeo' + Prestige 10 rank 0 short placeholder: '&5⚜Ⅹ&6&l✧&e0' + Prestige 10 rank 1: '&5Prestigio 10 &fRecluta' + Prestige 10 rank 1 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠ' + Prestige 10 rank 2: '&5Prestigio 10 &fNovizio' + Prestige 10 rank 2 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠ' + Prestige 10 rank 3: '&5Prestigio 10 &fApprendista' + Prestige 10 rank 3 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠⅠ' + Prestige 10 rank 4: '&5Prestigio 10 &2Avventuriero' + Prestige 10 rank 4 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅤ' + Prestige 10 rank 5: '&5Prestigio 10 &2Viaggiatore' + Prestige 10 rank 5 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤ' + Prestige 10 rank 6: '&5Prestigio 10 &2Adepto' + Prestige 10 rank 6 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠ' + Prestige 10 rank 7: '&5Prestigio 10 &1Veterano' + Prestige 10 rank 7 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠ' + Prestige 10 rank 8: '&5Prestigio 10 &1Elite' + Prestige 10 rank 8 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠ' + Prestige 10 rank 9: '&5Prestigio 10 &5Maestro' + Prestige 10 rank 9 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅩ' + Prestige 10 rank 10 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩ' + Prestige 10 rank 10: '&5Prestigio 10 &5Eroe' + Prestige 10 rank 11: '&5Prestigio 10 &5Leggenda' + Prestige 10 rank 11 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠ' + Prestige 10 rank 12: '&5Prestigio 10 &5Mito' + Prestige 10 rank 12 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅠ' + Prestige 10 rank 13: '&5Prestigio 10 &5Immortale' + Prestige 10 rank 13 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠⅠ' + Prestige 10 rank 14: '&5Prestigio 10 &5Prescelto' + Prestige 10 rank 14 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅤ' + Prestige 10 rank 15: '&5Prestigio 10 &5Ascendente' + Prestige 10 rank 15 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤ' + Prestige 10 rank 16: '&5Prestigio 10 &5Titano' + Prestige 10 rank 16 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠ' + Prestige 10 rank 17: '&5Prestigio 10 &5Semidio' + Prestige 10 rank 17 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠⅠ' + Prestige 10 rank 18: '&5Prestigio 10 &5Divino' + Prestige 10 rank 18 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 10 rank 19: '&5Prestigio 10 &5Cacciadei' + Prestige 10 rank 19 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅩ' + Prestige 10 rank 20: '&5Prestigio 10 &5Ammazzadei' + Prestige 10 rank 20 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅩ' + lootLimiterMessage: '&7[EM] &cPer ottenere ricompense migliori nella caccia, devi sbloccare il prossimo grado di gilda scrivendo /ag in chat!' + prestigeUnlockMessageTitle: '$player' + prestigeUnlockMessageSubtitle: '&2has unlocked $tier&2!' +buy_or_sell_menu: + Shop name: '[EM] Compra o Vendi' +custom_quest_screen: + headerTextLines2: | + &a&l『&c&l$questName&a&l』 + acceptTextLines: '&a&l[Accept!]' + acceptHoverLines: "&aClick to \n&aaccept quest!" + acceptedTextLines: '&2&lAccepted! &aTurn in with $npcName &4[Abandon]' + acceptedHoverLines: '&aClick to abandon quest!' + trackTextLines: '&2&l[Track]' + trackHoverLines: '&aClick to track quest!' + untrackTextLines: '&4&l[Untrack]' + untrackHoverLines: '&cClick to untrack quest!' + completedTextLines: '&2&l[Turn in!]' + completedHoverLines: '&aClick to turn quest in!' + turnedInTextLines: '&8[Completed!]' + turnedInHoverLines: '&8Already turned in!' + objectivesLine: '&c&lObjectives:' + killQuestDefaultSummaryLine: '&c➤Kill $name:$color$current&0/$color$target' + fetchQuestDefaultSummaryLine: '&c➤Get $name:$color&$current&0/$color$target' + dialogQuestDefaultSummaryLine: '&c➤Go talk to $name $location' + rewardsLine: '&2&lRewards:' + rewardsDefaultSummaryLine: '&2➤$amountx $rewardName &8($chance%)' +custom_shop_menu: + Shop name: '[EM] Custom Shop' + Full inventory message: '[EliteMobs] &4Il tuo inventario è pieno! Non potrai acquistare oggetti fin quando non farai spazio.' +dynamic_quest_screen: + questName: Slay $amount $name + headerTextLines2: |- + &c&lGuild request! + &0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ + defaultLoreTextLines: '&8Slay $amount $name!' + acceptTextLines: '&a&lAccept!' + acceptHoverLines: "&aClick to \n&aaccept quest!" + acceptedTextLines: '&2&lAccepted! &4[Abandon]' + acceptedHoverLines: '&aClick to abandon quest!' + completedTextLines: '&2&l[Turn in!]' + completedHoverLines: '&aClick to turn quest in!' + turnedInTextLines: '&8[Completed!]' + turnedInHoverLines: '&8Already turned in!' + objectivesLine: '&c&lObjectives:' + killQuestDefaultSummaryLine: '&c➤Kill $name:$color$current&0/$color$target' + rewardsLine: '&2&lRewards:' + rewardsDefaultSummaryLine: '&2➤$amountx $rewardName &8($chance%)' +enhancement_menu: + shopName: '[EM] Menu miglioramento!' +get_loot_menu: + Menu name: '[EM] Getloot menu' + tierTranslation: Level + itemFilterTranslation: Filter by items of this level. +guild_rank_selector_menu: + questTierSelectorMenuTitle: '[EM] Guild Rank Selection' + lowTierWarning: '&cElites can''t drop better loot!' + normalTierWarning: '&aElite can drop better loot!' + notEnoughCurrencyMessages: '&7[EliteMobs] &4You don''t have enough Elite Coins ($neededAmount $currencyName)! Sell some Elite Mob loot to [/em shop]! You have $currentAmount $currencyName.' + unlockMessages: "&7[EliteMobs] &aYou have unlocked the $rankName &arank for $price\\ \\ $currencyName. \n&6Happy hunting!" + questCompleteBroadcastMessages: '&7[EliteMobs] &a$player &ahas reached the $rankName &aguild rank!' + failedMessages: '&7[EliteMobs] &cYou need to unlock other ranks first!' + spawnRateModifierMessages: '&fElite Mob spawn rate modifier: &c$modifier%' + lootModifierMessages: '&fElite Mob loot modifier: &a$modifier%' + difficultyModifierMessages: '&fElite Mob difficulty modifier: &c$modifier%' + lootTierMessages: '&2Elites can drop up to tier $tier loot!' + currencyBonusMessages: '&a$amountx coins from drops and quests!' + healthBonusMessages: '&cAdds $amount ❤ of max health' + critBonusMessages: '&eAdds $amount% chance to crit' + dodgeBonusMessages: '&8Adds $amount% chance to dodge' +player_status_screen: + indexTexts0: '&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + indexTexts1: '&5&l/ag &7- &6EliteMobs Hub' + indexHovers1: |- + CLICK TO USE + The place where you can find + NPCs that give quests, buy and + sell items, give advice and more! + indexTexts2: '&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + indexTexts4: '&6&lIndex' + indexTexts6: '&bp. $statsPage &8- &6Stats' + indexHovers6: Click to go! + indexTexts7: '&bp. $gearPage &8- &6Gear' + indexHovers7: Click to go! + indexTexts8: '&bp. $teleportsPage &8- &6Teleports' + indexHovers8: Click to go! + indexTexts9: '&bp. $commandsPage &8- &6Commands' + indexHovers9: Click to go! + indexTexts10: '&bp. $questsPage &8- &6Quest Tracking' + indexHovers10: Click to go! + indexTexts11: '&bp. $bossTrackingPage &8- &6Boss Tracking' + indexHovers11: Click to go! + statsText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + statsText1: '&5&lPlayer Stats:' + statsText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + statsText4: '&2Money: &a$money' + statsHover4: |- + Kill Elite Mobs to loot currency or + sell their drops in /em shop or + complete quests! + statsText6: '&6Livello Gilda: &3$guildtier' + statsHover6: |- + Prestige Tier and Guild Rank: + Guild Rank determines how good your loot can be, sets your bonus from the Prestige Tier, among other things. The Prestige Tier unlocks extremely powerful rewards, like increased max health, chance to dodge/crit, increased currency rewards and more! You can unlock Guild Ranks and Prestige Tiers at /ag! + ⚜ = prestige rank, ✧ = guild rank! + statsText7: '&4Elite Kills: &c$kills' + statsHover7: Amount of Elite Mobs killed. + statsText8: '&4Max Lvl Killed: &c$highestkill' + statsHover8: |- + Level of the highest Elite Mob killed. + Elite Mob levels are based on the tier + of your gear! Higher tiers, higher + Elite Mob levels! + Note: only non-exploity kills get counted! + statsText9: '&4Elite Deaths: &c$deaths' + statsHover9: Times killed by Elite Mobs. + statsText10: '&5Quests Completed: &d$quests' + statsHover10: |- + Amount of EliteMobs quests completed. + You can accept quests by talking to NPCs! + statsText12: '&bScore: &3$score' + statsHover12: |- + Your EliteMobs score. It goes up + when you kill and elite mob, + and it goes down when you die + to an elite. Higher level + elites give more score. + gearText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + gearText1: '&7&lArmor & Weapons:' + gearText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + gearText3: '&8&lGear Tiers:' + gearText4: ' ☠ - $helmettier' + gearHover4: '$helmet' + gearText5: ' ▼ - $chestplatetier' + gearHover5: '$chestplate' + gearText6: ' Π - $leggingstier' + gearHover6: '$leggings' + gearText7: ' ╯╰ - $bootstier' + gearHover7: '$boots' + gearText8: '{⚔ - $mainhandtier} {⛨ - $offhandtier}' + gearHover8: '{$mainhand}{$offhand}' + gearText10: '{dmg : $damage} {armr: $armor}' + gearHover10: '{Base damage dealt to Elite Mobs}{Damage reduction from Elite Mobs}' + gearText11: 'Threat level: $threat' + gearHover11: | + This determines the level of the + Elite Mobs that spawns near you. + Takes armor, weapon in hand, guild + tier into account. + teleportText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + teleportText1: '&2&lTeleports' + teleportText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + teleportText3: Spawn + teleportHover3: Teleport to spawn! + teleportText4: '&6&lCentro dell''Avventuriero' + teleportHover4: Teleport to the Adventurer's Guild Hub! + onTeleportsHover: Click to teleport! + commandsText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + commandsText1: '&3&lCommands:' + commandsText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + commandsText4: '&5/ag' + commandsHover4: |- + CLICK TO USE + The place where you can find + NPCs that give quests, buy and + sell items, give advice and more! + commandsText6: '&5/shareitem' + commandsHover6: |- + CLICK TO USE + Shares the item you're holding + on chat! + questTrackerText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + questTrackerText1: '&6&lQuests:' + questTrackerHover1: Talk to NPCs to accept quests! + questTrackerText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + onQuestTrackHover: Click to abandon! + bossTrackerText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + bossTrackerText1: '&4&lBoss Tracker:' + bossTrackerHover1: Big bosses get displayed here! + bossTrackerText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + onBossTrackHover: Click to track/untrack! + teleportChestMenuName: '&2EliteMobs Teleports' + bossTrackerChestMenuName: '&2EliteMobs Boss Tracking' + indexChestMenuName: '&2EliteMobs Index' + gearChestMenuName: '&2EliteMobs Gear' + statsChestMenuName: '&2EliteMobs Stats' + commandsChestMenuName: '&2EliteMobs Commands' +procedural_shop_menu: + Shop name: '[EM] Procedural Item Shop' + Full inventory message: '&7[EliteMobs] &4Your inventory is full! You can''t buy items until you get some free space.' +quest_menu: + menuName: '[EM] Quest Selection' + cancelQuestMessage1: '&c&l&m&o---------------------------------------------&cYou can only have one quest at a time! Cancelling your ongoing quest will reset quest progress!' + cancelQuestMessage2: '&2[Click here to cancel current quest!]' + cancelQuestMessage3: '&7You can see your quest status with the command &a/em quest status&c&l&m&o---------------------------------------------' + questCancelMessage: '&7[EliteMobs] &cYour ongoing quest has been cancelled!' + questStartTitle: You have accepted a quest! + questStartSubtitle: Slay $objectiveAmount $objectiveName + questCompleteTitle: Quest complete! + questCompleteSubtitle: You have slain $objectiveAmount $objectiveName + bossBarObjective: Slay $objectiveAmount $objectiveName + questRewardMessage: '&7[EM] &aQuest completed! &6Your reward is &2$reward $currencyName' + questCompleteBroadcastMessage: '&7[EM] $player &2has completed a $rank &2quest!' + questStartBroadcastMessage: '&7[EM] $player &2has accepted a $rank &2quest!' + questStatusMessage: '&7[EM] &aYou''ve slain &a$currentAmount &f/ &c$objectiveAmount &a$objectiveName' +refiner_menu: + shopName: '[EM] Place 10 scrap!' +repair_menu: + shopName: '[EM] Repair menu!' +scrapper_menu: + shopName: '[EM] Scrapper' +sell_menu: + shopName: '[EM] Sell Shop' +smelt_menu: + shopName: '[EM] Place 25 scrap!' +unbind_menu: + shopName: '[EM] Unbind menu!' +taunt: + onDamaged: + - Ow! + - Oi! + - Stop that! + - Why?! + - You fight like a Dairy Farmer! + - You are a pain in the backside! + - En garde! Touche! + - Hacks! + - My health is bugged, unkillable! + - Your hits only make me stronger! + - Sticks and stones... + - '''tis but a flesh wound!' + - Emperor protects! + - Herobrine, aid me! + - Behind you! A creeper! + - I have made a terrible mistake. + - What doesn't kill me... + - Zombies dig scars + - I shall show you my true power! + - Prepare for my ultimate attack! + - My reinforcements are arriving! + - You're going to pay for that! + - That's going to leave a mark! + - An eye for an eye! + - Health insurance will cover that + - I felt that one in my bones + - '''tis but a scratch' + - What was that? A soft breeze? + - You'll never defeat me like that + - Pathetic. + - Weak. + - That didn't even dent my armor! + - This is going to be an easy one + - My grandchildren will feel that + - Are you even trying? + - An admin just fully healed me + - Haxxor! + - Me? Damaged? Hacks! + - I can't be defeated! + - Good thing I'm using hacks! + - Watch out! Herobrine behind you! + - My life for Aiur! + - Your home is getting griefed! + - Why can't we be friends? + - Valhalla! + - Notch save me! + - No retreat! + - Hit me with your best shot! + onDamagedByBow: + - Fight me like a Player! + - Afraid to come up-close? + - I can smell your fear from here! + - Did you forget your sword? + - Coward! Bow are no fair! + - Bows? That's so 2011... + - Bows are for the weak of mind! + - Bows are for the weak of spirit! + - Bows are for the weak of heart! + - I thought we agreed no bows! + - Bows? You'll regret that + - Ow! + - Oi! + - Stop that! + - Why?! + - You fight like a Dairy Farmer! + - You are a pain in the backside! + - En garde! Touche! + - Hacks! + - My health is bugged, unkillable! + - Your hits only make me stronger! + - Sticks and stones... + - '''tis but a flesh wound!' + - Emperor protects! + - Herobrine, aid me! + - Behind you! A creeper! + - I have made a terrible mistake. + - What doesn't kill me... + - Zombies dig scars + - I shall show you my true power! + - Prepare for my ultimate attack! + - My reinforcements are arriving! + - You're going to pay for that! + - That's going to leave a mark! + - An eye for an eye! + - Health insurance will cover that + - I felt that one in my bones + - '''tis but a scratch' + - What was that? A soft breeze? + - You'll never defeat me like that + - Pathetic. + - Weak. + - That didn't even dent my armor! + - This is going to be an easy one + - My grandchildren will feel that + - Are you even trying? + - An admin just fully healed me + - Haxxor! + - Me? Damaged? Hacks! + - I can't be defeated! + - Good thing I'm using hacks! + - Watch out! Herobrine behind you! + - My life for Aiur! + - Your home is getting griefed! + - Why can't we be friends? + - Valhalla! + - Notch save me! + - No retreat! + - Hit me with your best shot! + onDamage: + - A solid hit! + - He shoots, and he scores! + - You'll feel that in the morning! + - Victory approaches! + - Victory shall be mine! + - That was only half of my power! + - You came to the wrong hood! + - You messed with the wrong mob! + - Get ready to get mobbed on! + - This was your last mistake! + - Feel the burn! + - John Cena + - How are you still standing? + - Just give up already! + - Give up! + - I have the high ground! + - I will end you! + - Hope you came prepared for pain! + - The hunter becomes the hunted! + - Blood for the blood throne! + - Skulls for the skull throne! + - A good player is a dead player! + - Git gud! + - Praise the Sun! + - The end draws near! + - You are not prepared. + - Zug zug! + - Hardly worth my time! + - I thought this was a challenge? + - 'Pro tip: don''t get hit' + - Ima firin mah lazer bwooooooooo + - For the Emperor! + - Herobrine shall be pleased! + - This is the end for you! + - Are you even trying? + - Weakling! + - Pathetic. + - Maybe this will wake you up. + - This is just the beggining! + - We're just getting started! + - That was just a warm-up! + - You are no match for me! + - RKO out of nowhere! + - I can do this all night long! + - A fine punching bag! + - I am the night! + - I wonder what will break first + - Revenge for Steve! You monster! + - Join the mob side! + - Too easy, too easy! + - Too easy! + - You can't defeat me! + - Pikachuuuuuu + - Avada kedavra! + - Crucio! + - Jierda! + - A critical hit! + - This is what skills looks like! + - 9001 damage! + - Still standing? + - Face your defeat! + - A taste of pain to come! + - I'll make you endangered! + onDeath: + - Alas, poor Yorick! + - The rest is silence + - I shall return + - Unforgivable + - I live, I die, I live again! + - WITNESS ME + - I ride to valhalla! + - VALHALLA! + - VALHALLA! DELIVERANCE + - You win, this time + - A blight upon your land! + - A pox upon thee! + - You'll join me soon enough! + - This is not over + - Death is but a setback + - Not like this... + - I just wanted to go into space + - We could've been friends + - Your sins crawling on your back + - See you in a bit + - See you later + - I'll be waiting for you + - I will be avenged! + - I won't go gently into the night + - Should've gotten life insurance + - It was my last day on the job + - It was my last day here + - Et tu, Brute? + - RIP + - x.x + - (x.x) + - xox + - Fainted + - GG, WP + - GG + - WP + - GG no RE + - HAX + - Hacker + - Not fair I was lagging + - You win, this time + - You monster... + - Mediocre... + onTarget: + - OI! Get over here! + - What's that I see? A coward? + - Sir, prepare your fisticuffs! + - Let's settle this like cavemen! + - En garde! + - Look out! A creeper, behind you! + - Aren't you a right ugly mug! + - You look delicious. + - Prepare for trouble! + - Let the best click spammer win! + - SPARTAAAAAA + - I am actually level 9001 + - Not an Elite Mob + - Poorly disguised Elite Mob + - Ah, fresh prey! + - The hunter becomes the hunted! + - Killing me crashes the server + - I'm actually a disguised player! + - I'm not going to drop any loot! + - Why can't we be friends? + - Sssssss + - This is my last day on the job! + - Stop right there criminal scum! + - Prepare to die! + - Praise the Sun! + - Git gud + - Alea jacta est! + - Facta, non verba! + - Skulls for the skull throne! + - Blood for the blood throne! + - A sacrifice for Herobrine! + - I shall pierce the heavens! + - Just who do you think I am!? + - A weakling! He's mine. + - Dibs on the weakling! + - Accio player! + - A duel to the death! + - I challenge you to a duel! + - Pika pika! + - Did you just call me an infernal + - What did you just call me? + - I know what you did you monster! + - This is how your story ends! + - Prepare for trouble! + - I've been preparing for this! + - I am prepared. Are you? + - A worthy foe! + - A worthy opponent! + - A newbie! It's my lucky day! + - Your stuff or your life! + - This is a robbery! + - It's you! You monster! + - So hungry, give me your flesh! + - There he is! + - Must've been my imagination + - Hi I'm Mr Meeseeks! + - I'm Mr Meeseeks, look at me! + - I tuoi diamanti o la vita! + - For king and country! + - Hit me with your best shot! + - Witness me! + - Witness me blood bag! + - I go all shiny and chrome! +zombie_friends: + friend1Name: 'BFF #1' + friend2Name: 'BFF #2' + friendDeathMessage: + - Noooo! + - Mediocre! + - Zacharias! + - He's deader than before! + - Vengeance! + - Revenge! + - I can't believe you've done this. + originalEntityDialog: + - Let's play ZombieCraft later! + - Feel the power of friendship! + - El pueblo, unido! + - I called my friends over! + - BFF power! + - One for all! + - Get him! + - Screw you guys, I'm going home! + reinforcementDialog: + - Don't mess with our friends! + - We got your back Zach! + - Backup has arrived! + - One for all, one for all! + - This is going to be easy! + - Give up we have the high ground! + - You wanna go bruv? + - Worldstaaaaaaaaar! + - What are you doing to our friend + - Feel the power of friendship! + - Friendship power at 100%! + - Zombies, assemble! + - We got your back mate! + - Together we are better! + - The more the merrier! + - I got you fam! + - All for one! +zombie_necronomicon: + summoningChant: Nor is it to be thought...that man is either the oldest or the last of earth's masters, or that the common bulk of life and substance walks alone. The Old Ones were, the Old Ones are, and the Old Ones shall be. Not in the spaces we know, but between them, they walk serene and primal, undimensioned and to us unseen. Yog-Sothoth knows the gate. Yog-Sothoth is the gate. Yog-Sothoth is the key and guardian of the gate. Past, present, future, all are one in Yog-Sothoth. He knows where the Old Ones broke through of old, and where They shall break through again. He knows where They had trod earth's fields, and where They still tread them, and why no one can behold Them as They tread. By Their smell can men sometimes know Them near, but of Their semblance can no man know, saving only in the features of those They have begotten on mankind; and of those are there many sorts, differing in likeness from man's truest eidolon to that shape without sight or substance which is Them. They walk unseen and foul in lonely places where the Words have been spoken and the Rites howled through at their Seasons. The wind gibbers with Their voices, and the earth mutters with Their consciousness. They bend the forest and crush the city, yet may not forest or city behold the hand that smites. Kadath in the cold waste hath known Them, and what man knows Kadath? The ice desert of the South and the sunken isles of Ocean hold stones whereon Their seal is engraver, but who hath seen the deep frozen city or the sealed tower long garlanded with seaweed and barnacles? Great Cthulhu is Their cousin, yet can he spy Them only dimly. Iä! Shub-Niggurath! As a foulness shall ye know Them. Their hand is at your throats, yet ye see Them not; and Their habitation is even one with your guarded threshold. Yog-Sothoth is the key to the gate, whereby the spheres meet. Man rules now where They ruled once; They shall soon rule where man rules now. After summer is winter, after winter summer. They wait patient and potent, for here shall They reign again. +zombie_parents: + deathMessage: + - You monster! + - My baby! + - What have you done!? + - Revenge! + - Nooooo! + - You will pay for that! + - Eh, he was adopted + - He's dead! Again! + - He's deader than before! + - You broke him! + bossEntityDialog: + - You're embarrassing me! + - He's bullying me! + - He's the one picking on me! + - I can deal with this alone! + - Leave me alone, I got this! + - Stop following me around! + - God this is so embarrassing! + - He took my lunch money! + - He's bullying me! + zombieDad: + - Get away from my son! + - Stand up for yourself son! + - I'll deal with him! + - Stop picking on my son! + - Why are you doing this? + - I'll talk to your parents! + - You go kiddo! + - Show him who's boss kiddo! + - Nice punch kiddo! + zombieMom: + - Hands off my child! + - Are you hurt sweetie? + - Did he hurt you sweetie? + - Let me see that booboo sweetie + - I'll talk to his parents! + - You forgot your jacket sweetie! + - Posture, sweetheart + - Break it up! + - Stop this! + - Did you take out the garbage? +elite_blaze: + name: '&fLvl &2$level &eBlaze &fElite' + deathMessages: + - '$player &cè stato ustionato da $entity!' +elite_cave_spider: + name: '&fLvl &2$level &3Ragno delle caverne &fElite' + deathMessages: + - '$player &cè rimasto impigliato nella &cragnatela del $entity!' +elite_creeper: + name: '&fLvl &2$level &2Creeper &fElite' + deathMessages: + - '$player &cwas blasted away by $entity!' + - '$entity &cjust oh man''d $player&c!' +elite_drowned: + name: '&fLvl &2$level &fElite &3Drowned' + deathMessages: + - '$player &chas been brought down to the depths by $entity!' + - '$player &chas been drowned by $entity!' +elite_elder_guardian: + name: '&fLvl &2$level &fElite &3Elder Guardian' + deathMessages: + - '$entity &cprevented $player &cfrom exploring the depths!' +elite_guardian: + name: '&fLvl &2$level &fElite &3Guardian' + deathMessages: + - '$entity &cprevented $player &cfrom exploring the depths!' +elite_enderman: + name: '&fLvl &2$level &fElite &5Enderman' + deathMessages: + - '$entity &csent $player &cinto the void!' + - '$player &clooked at $entity &cwrong!' + - '$player &cand $entity &cbecame best friends!' +elitemob_endermite: + name: '&fLvl &2$level &fElite &7Endermite' + deathMessages: + - '$entity &cis to $player &cwhat David is to Goliath!' +elite_evoker: + name: '&fLvl &2$level &fElite &5Evoker' + deathMessages: + - '$player &cwas enchanted by $entity&c!' +elite_husk: + name: '&fLvl &2$level &fElite &7Husk' + deathMessages: + - '$player &cwas hollowed out by $entity&c!' +elite_illusioner: + name: '&fLvl &2$level &fElite &8Illusioner' + deathMessages: + - '$player&c fell for $entity''s &cillusions!' +elite_iron_golem: + name: '&fLvl &2$level &fElite &fIron Golem' + deathMessages: + - '$player &cmessed with the wrong $entity&c!' + - '$player &chas been taught the way of fist by $entity&c!' +elite_phantom: + name: '&fLvl &2$level &fElite &9Phantom' + deathMessages: + - '$player &cjust had a bad nightmare about $entity&c!' + - '$player &cwill be having nightmares about $entity&c!' + - '$entity &chas taught $player &cthe value of sleep!' +elite_pillager: + name: '&fLvl &2$level &fElite &8Pillager' + deathMessages: + - '$entity &cplundered $player&c!' + - '$entity &cpillaged $player&c!' +elite_polar_bear: + name: '&fLvl &2$level &fElite &fPolar Bear' + deathMessages: + - '$player &cwas clawed to death by $entity&c!' + - '$player &cwas mauled to death by $entity&c!' +elite_ravager: + name: '&fLvl &2$level &fElite &6Ravager' + deathMessages: + - '$entity &cshowed $player &cwho''s in charge!' +elite_silverfish: + name: '&fLvl &2$level &fElite &7Silverfish' + deathMessages: + - '$player &cmistook $entity &cfor a stone block!' +elite_skeleton: + name: '&fLvl &2$level &fElite &fSkeleton' + deathMessages: + - '$player &cbecame $entity''s &cpin cushion!' + - '$entity &cwanted to see $player''s &cbones!' +elite_spider: + name: '&fLvl &2$level &fElite &7Spider' + deathMessages: + - '$player &cè rimasto impigliato nella &cragnatela del $entity!' + - '$entity &chas devoured $player&c!' +elite_stray: + name: '&fLvl &2$level &fElite &bStray' + deathMessages: + - '$player &cwas led astray by $entity&c!' +elite_vex: + name: '&fLvl &2$level &fElite &bVex' + deathMessages: + - '$entity &chas vexed $player&c!' +elite_vindicator: + name: '&fLvl &2$level &fElite &8Vindicator' + deathMessages: + - '$entity &cvindicated his fighting skills over $player&c!' +elite_witch: + name: '&fLvl &2$level &fElite &5Witch' + deathMessages: + - '$player &cbecame $entity''s &ctest subject!' + - '$player &chas been bewitched by $entity&c!' +elite_wither_skeleton: + name: '&fLvl &2$level &fElite &8Wither Skeleton' + deathMessages: + - '$entity''s &carrows withered away $player&c!' + - '$entity''s &chas withered $player &caway!' +elite_zombie: + name: '&fLvl &2$level &fElite &2Zombie' + deathMessages: + - '$player &cwas devoured by $entity&c!' + - '$entity &cgot to $player''s &cbrains!' +elite_ghast: + name: '&fLvl &2$level &fElite &fGhast' + deathMessages: + - '$player &cdidn''t dodge $entity&c &cfireballs!' + - '$player &cwas blown to bits $entity&c!' + - '$entity &cgot $player''s &cbacon!' +elite_wolf: + name: '[$level] Elite Wolf' + deathMessages: + - '$entity tore $player apart!' + - '$player was torn to shreds by $entity!' +elite_ender_dragon: + name: '&fLvl &2$level &fElite &5Ender Dragon' + deathMessages: + - '$entity &chas ended $player!' +elite_shulker: + name: '&fLvl &2$level &fElite &5Shulker' + deathMessages: + - '$entity &cshowed $player &cnew heights!' +super_chicken: + name: '&2Super Chicken' +super_cow: + name: '&2Super Cow' +super_mushroom_cow: + name: '&2Super Mooshroom Cow' +super_pig: + name: '&dSuper Pig' +super_sheep: + name: Super Sheep +elite_killer_bunny: + name: '&fLvl &2$level &fElite &cKiller Rabbit' + deathMessages: + - '$entity &cmade $player &cgo live in a farm upstate!' + - '$entity &ceducated $player using a stick and not a carrot!' +elite_llama: + name: '&fLvl &2$level &fElite &5Llama' + deathMessages: + - '$player &cwas spit on by $entity&c!' + - '$player &cwas made $entity&c angry!' +elite_warden: + name: '&fLvl &2$level &fElite &3Warden' + deathMessages: + - '$entity &csensed $player &cwas nearby!' +elite_goat: + name: '&fLvl &2$level &fElite &5Goat' + deathMessages: + - '$player &cwas rammed by $entity&c!' + - '$player &cwas run over by $entity&c!' + - '$player &cwas trampled by $entity&c!' + - '$player &cgot $entity&c horns!' +elite_zombified_piglin: + name: '&fLvl &2$level &fElite &6Zombified Piglin' + deathMessages: + - '$player &cwas mobbed to death by $entity&c!' + - '$entity &cgot $player''s &cbacon!' +elite_zoglin: + name: '&fLvl &2$level &fElite &dZoglin' + deathMessages: + - '$player &cmessed with the $entity &cand got the horns!' + - '$entity &cgot $player''s &cbacon!' +elite_piglin: + name: '&fLvl &2$level &fElite &ePiglin' + deathMessages: + - '$entity &cwill fetch a good price for $player''s remains!' + - '$entity &ctaught $player &cthe value of gold!' +elite_hoglin: + name: '&fLvl &2$level &fElite &dHoglin' + deathMessages: + - '$player &cmessed with the $entity &cand got the horns!' + - '$entity &cgot $player''s &cbacon!' +elite_piglin_brute: + name: '&fLvl &2$level &fElite &cPiglin Brute' + deathMessages: + - '$entity &ctenderized $player!' + - '$entity &cbrutalized $player!' +elite_bee: + name: '&fLvl &2$level &eApe &fElite' + deathMessages: + - '$player &cè stato punto da $entity!' +MobCombatSettings: + bossLocationMessage: '&7[EM] &2[Clicca per tracciare!]' + bossKillParticipationMessage: '&eIl tuo danno: &2$playerDamage' + defaultOtherWorldBossLocationMessage: '$name: In un mondo diverso!' + weakText: '&9&lWeak!' + resistText: '&c&lResist!' + fullHealMessage: '&2FULL HEAL!' +check_tier: + message1: '&7[EM] Il tuo livello di combattimento è $tier' + message2: '&7[EM] Il livello bonus della tua gilda è $tier' + message3: '&7[EM] &aIl tuo livello totale di minaccia è $tier' +check_tier_others: + message1: '&7[EM] $player''s combat tier is $tier' + message2: '&7[EM] $player''s guild tier bonus is $tier' + message3: '&7[EM] &a$player''s total threat tier is $tier' +ScrapItemSettings: + scrapItemName: '&2Level $level Scrap' + scrapItemLore: + - '&aGather 25 scrap of the same level in' + - '&aorder to create an item upgrade orb!' + - '&aYou can also use scrap to repair' + - '&aitems and craft higher level scrap!' + - '&2Do this at the Adventurer''s Guild Hub!' + upgradeItemName: '&2Level $level Upgrade Orb' + upgradeItemLore: + - '&aUse at at the Enhancer NPC to upgrade' + - '&aitems up to level $orbLevel!' +Quests: + questJoinMessage: '&aYou have accepted the quest $questName &a!' + questLeaveMessage: '&cYou have abandoned the quest $questName &c!' + questCompleteMessage: '&2You completed the quest $questName &2!' + leaveWhenNoActiveQuestsExist: '&cYou don''t currently have an active quest!' + questLeaveConfirmationMessage: '&cAre you sure you want to abandon your current quest? Do &a/em confirm &c to confirm your choice!' + questStartTitle: '&aQuest Accepted!' + questCompleteTitle: '&2Quest Completed!' + questLeaveTitle: '&cQuest Abandoned!' + killQuestChatProgressionMessage: '&8[EliteMobs]&c➤Kill $name:$color$current&0/$color$target' + fetchQuestChatProgressionMessage: '&8[EliteMobs]&c➤Get $name:$color$current&0/$color$target' + dialogQuestChatProgressionMessage: '&8[EliteMobs]&c➤Talk to $name:$color$current&0/$color$target' + questCapMessage: '&8[EliteMobs] &cYou have reached the maximum amount of active quests (10)! &4Abandon or complete at least one active quest if you want to get more quests!' + killQuestScoreboardProgressionMessage: '&c➤Kill $name:$color$current&0/$color$target' + fetchQuestScoreboardProgressionMessage: '&c➤Get $name:$color$current&0/$color$target' + dialogQuestScoreboardProgressionMessage: '&c➤Talk to $name:$color$current&0/$color$target' + chatTrackMessage: '&8[EliteMobs]&2 Click here to track your quest!' + chatTrackHover: '&2Click to track!' + chatTrackingMessage: '&8[EliteMobs]&9 You are now tracking a quest!' + chatTrackingHover: '&2Click to untrack/track! /em -> Quests to track a different quest!' + noQuestDestinationFound: '[EM] No quest destination found!' + questDestinationInOtherWorld: '[EM] Go to world $world!' + questAlreadyCompletedMessage: '&8[EliteMobs] &cYou already completed this quest!' + questPrerequisitesMissingMessage: '&8[EliteMobs] &cCan''t accept this quest yet!' + lowRankDynamicQuestWarning: '&8[EliteMobs] &cYou can''t take these quests with your current guild rank! Increase your guild rank to accept these quests.' + questTurnInObjective: '&a2Talk to $npcName' +Wormholes: + dungeonNotInstalledMessage: '&8[EliteMobs] &cDungeon $dungeonID &cis not installed! This teleport will not work.' + defaultPortalMissingMessage: '&8[EliteMobs] &cThis portal doesn''t seem to lead anywhere!' +Arenas: + notEnoughPlayersMessage: '&8[EliteMobs] &cYou need at least $amount to start the match!' + startingMessage: '&2Starting!' + startingSubtitle: '&2in $count...' + arenaFullMessage: '&4[EliteMobs] &cArena is full! You can spectate instead while you wait for it to finish!' + arenasOngoingMessage: '&4[EliteMobs] &cCan''t join the arena now - a match is currently happening! You can spectate instead while you wait for it to finish!' + arenaStartHintMessage: '&2[EliteMobs] &aYou can start the arena by doing &2/em start' + arenaQuitHintMessage: '&4[EliteMobs] &cYou can leave the arena by doing &4/em quit' + arenaJoinPlayerMessage: "&2[EliteMobs] &aYou can start the arena by doing &2/em\\ \\ start &aif there are at least &2$count &aplayers in it! \nYou can leave the\\ \\ arena by doing &c/em quit" + arenaJoinSpectatorMessage: '&2[EliteMobs] &aYou can leave the arena at any time using &2/em quit' + waveTitle: '&aWave &2$wave' + victoryTitle: '&2Victory!' + victorySubtitle: '&aCompleted &2$wave &awaves!' + defeatTitle: '&4Defeat!' + defeatSubtitle: '&cReached wave &4$wave&c!' + victoryBroadcast: Arena $arenaName was conquered by $players! + joinPlayerTitle: '&aStart with &2/em start &a!' + joinPlayerSubtitle: '&cLeave with &4/em quit &c!' + joinSpectatorTitle: '&aNow spectating!' + joinSpectatorSubtitle: '&cLeave with &4/em quit &c!' +ancient_corpse_drop_axe: + name: '&eButchers Cleaver' + lore: + - '&aRetrived from the' + - '&aAncient Corpse''s skull...' +animated_armor_drop_axe: + name: '&8Enchanted Axe' + lore: + - '&8This axe was almost the' + - '&8end of you.' +animated_armor_drop_boots: + name: '&8Enchanted Boots' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +animated_armor_drop_chestplate: + name: '&8Enchanted Chestplate' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +animated_armor_drop_helmet: + name: '&8Enchanted Helmet' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +animated_armor_drop_leggings: + name: '&8Enchanted Leggings' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +arachnid_matriarch_drop_boots: + name: '&bSilk Striders' + lore: + - '&bMade out of rare spider silk.' +baba_rhoga_drop_chest: + name: '&aWitches Robes' + lore: + - '&aThe smell should go' + - '&aaway eventually.' +baba_yaga_drop_helmet: + name: '&aWitches Hat' + lore: + - '&aThe smell should go' + - '&aaway eventually.' +balloon_rider_drop_leggings: + name: '&dRoomy Leggings' + lore: + - '&dVery comfortable and spacious leggings.' +banshee_drop_charm: + name: '&8Manifested Sorrow' + lore: + - '&8May this hardened sorrow protect' + - '&8you from grief.' +beast_tamer_drop_axe: + name: '&eGreat Axe' + lore: + - '&eHeavy enough to cleave any beast in two.' +berserker_charm: + name: '&bBerserker Charm' + lore: + - '&aLose yourself in the face of' + - '&aoverwhelming adversity in more' + - '&aways than one...' +bigfoot_drop_chestplate: + name: '&eFur Armor' + lore: + - '&eNice and warm.' +big_bad_wolf_drop_chestplate: + name: '&aBig Bad Wolf Fur' + lore: + - '&aScary!' +bloated_jeffrey_drop_tear: + name: '&bSweet Tear' + lore: + - '&bYou made Jeffrey cry...' +bone_fiend_drop_leggings: + name: '&aBoney Leggings' + lore: + - '&aThe sharp bones attached to these' + - '&aleggings sure do rattle a lot.' +challengers_boots: + name: '&cChallenger''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_chestplate: + name: '&cChallenger''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_helmet: + name: '&cChallenger''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_leggings: + name: '&cChallenger''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_sword: + name: '&cChallenger''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +chameleon_charm: + name: '&bChameleon Charm' + lore: + - '&aThe colorful Chameleon can' + - '&ablend in just about anywhere,' + - '&aslowly creeping around...' +changeling_drop_sword: + name: '&aCrystalline Sword' + lore: + - '&aThe blade shimmers as you gaze upon it.' +cheetah_charm: + name: '&bCheetah Charm' + lore: + - '&aCheetahs can reach speeds of' + - '&a120 km/h... for about 60' + - '&aseconds. Make them count!' +circus_ringmaster_drop_charm: + name: '&dRingmasters Whip' + lore: + - '&dThis was used for terrible punishment.' +craftenmine_terror_drop_trident: + name: '&cGhast Lobotomizer' + lore: + - '&cPerfect for making sure that' + - '&cthe Ghasts stay grounded.' +creeperpede_drop_chestplate: + name: '&dExplosion Proof Vest' + lore: + - '&dMake ''BOOM!'' feel' + - '&dmore like ''boom''.' +crone_drop_axe: + name: '&fWitch Feller' + lore: + - '&fA fine axe that demands a fine hunt.' +depths_seeker: + name: '&2Depths seeker' + lore: + - '&9Come from depths immeasurable' + - '&9and looted from monster most vile,' + - '&9there is no telling what horrors' + - '&9this fishing rod has seen.' +divine_cinder_drop_charm: + name: '&6Divine Fire' + lore: + - '&6Blessed be the fire!' +dwarven_greed: + name: '&4Dwarven Greed' + lore: + - '&cThose who delve too greedily' + - '&cand too deep may wake ancient' + - '&chorrors of shadow and flame' + - '&cbest left undisturbed.' +elephant_charm: + name: '&bElephant Charm' + lore: + - '&aGain the power of an elephant' + - '&astampede, for the cost of the' + - '&aspeed of an elephant stampede!' +enders_drop_chestplate: + name: '&dEnder Shirt' + lore: + - '&dProtective and comfy!' +enders_drop_helmet: + name: '&dEnder Cap' + lore: + - '&dComfy but also quite sturdy.' +enders_drop_leggings: + name: '&dEnder Pants' + lore: + - '&dA bit too long but it will do.' +ender_lapin_drop_boots: + name: '&cDark Star Boots' + lore: + - '&cGives you the courage' + - '&cof running when in danger.' +endless_pursuer_drop_sword: + name: '&7Dark Blood Sword' + lore: + - '&7The sword seems to' + - '&7be weeping blood...' +enraged_snowman_drop_sword: + name: '&9Snowman''s Nose' + lore: + - '&9No wonder that the Snowman''s' + - '&9nose was so pointy...' +xmas_and_gold: + name: '&6and gold!' + lore: + - '&7Everyone wishes for silver' + - '&7and gold!' +xmas_and_goooooold: + name: '&6and goooooold!' + lore: + - '&7Everyone wishes for silver' + - '&7and gold!' +xmas_cornelius_pick: + name: '&bCornelius'' Pick' + lore: + - '&3If you throw it in the air' + - '&3and let it hit the ground,' + - '&3you may just find some' + - '&3peppermint!' +xmas_lost_present: + name: '&2Lost Present' + lore: + - '&2Turn this in for a reward!' +xmas_peppermint: + name: '&cPeppermint' + lore: + - '&fWhat I''ve been searching for all my life!' +xmas_siiiiilver: + name: '&7Siiiiilver' + lore: + - '&6Everyone wishes for silver' + - '&6and gold!' +xmas_silver: + name: '&7Silver' + lore: + - '&6Everyone wishes for silver' + - '&6and gold!' +xmas_substitute_elf_practice: + name: '&8Substitue Elf Practice' + lore: + - '&fThis doll needs its teeth fixed' +xmas_treat: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +xmas_treat_v2: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +evil_undead_drop_sword: + name: '&eTransient Blade' + lore: + - '&eIt will only serve' + - '&eyou for song long.' +fallen_knight_drop_boots: + name: '&e7Ancient Boots' + lore: + - '&7Even though the boots are old they' + - '&7still provide plenty of protection.' +fallen_knight_drop_chestplate: + name: '&e7Ancient Nether-Plate' + lore: + - '&7This armor might look plain to' + - '&7the untrained eye but is clear' + - '%7that anything wishing to penetrate' + - '&7it''s thick plate will need to be' + - '&7swung with considerable force.' +fallen_knight_drop_helmet: + name: '&e7Ancient Headgear' + lore: + - '&7Many swords have left their mark' + - '&7aon this helm but none have' + - '&7managed to break its defense.' +fallen_knight_drop_leggings: + name: '&e7Ancient Leggings' + lore: + - '&7You feel sorry for anyone that tries' + - '&7to strike these leggings.' +fine_swine_drop_sword: + name: '&6Fine Golden Sword' + lore: + - '&6A fine master-crafted golden sword.' + - '&6The molten gold flowing inside' + - '&6the sword makes sure that any damage' + - '&6to the blade is repaired swiftly.' +firefly_charm: + name: '&bFirefly Charm' + lore: + - '&aLight up the night!' +firestarter_drop_helmet: + name: '&eFire Stopper' + lore: + - '&eOnly half the heat!' +fire_conjurer_drop_shield: + name: '&eFlame Touched Shield' + lore: + - '&eProtects against fire and flame.' +fishy_charm: + name: '&bFishy Charm' + lore: + - '&aThere''s just something not' + - '&aquite right with this one...' +fox_king_cold_drop_charm: + name: '&9Magical Snow' + lore: + - '&9You sense impossible energies' + - '&9coming from this snow.' +fulgora_drop_boots: + name: '&bMountain Boots' + lore: + - '&bShould be useful when' + - '&bexploring the mountains.' +goblin_ballista: + name: '&8Goblin Ballista' + lore: + - '&8A treasure among goblins!' +goblin_boots: + name: '&8Goblin Boots' + lore: + - '&8A treasure among goblins!' +goblin_chestplate: + name: '&8Goblin Chestplate' + lore: + - '&8A treasure among goblins!' +goblin_cleaver: + name: '&8Goblin Cleaver' + lore: + - '&8A treasure among goblins!' +goblin_helmet: + name: '&8Goblin Helmet' + lore: + - '&8A treasure among goblins!' +goblin_invasion_drop_chestplate: + name: '&aSmall Chestplate' + lore: + - '&aReally tight...' +goblin_invasion_drop_leggings: + name: '&aSmall Leggings' + lore: + - '&aWell, at least it really' + - '&ashows off your legs.' +goblin_leggings: + name: '&8Goblin Leggings' + lore: + - '&8A treasure among goblins!' +goblin_poker: + name: '&8Goblin Poker' + lore: + - '&8A treasure among goblins!' +goblin_shooter: + name: '&8Goblin Shooter' + lore: + - '&8A treasure among goblins!' +goblin_slasher: + name: '&8Goblin Slasher' + lore: + - '&8A treasure among goblins!' +grappling_arrow: + name: '&6Grappling Arrow' + lore: + - '&eFire at a TARGET BLOCK to grapple!' +greedy_dwarf_drop_pickaxe: + name: '&9Dwarven Need' + lore: + - '&cThose who delve too greedily' + - '&cand too deep may wake ancient' + - '&chorrors of shadow and flame' + - '&cbest left undisturbed.' +grunter_drop_axe: + name: '&cBig Oink' + lore: + - '&cThe axe has a tendency' + - '&cto squeal when swung.' +grunts_boots: + name: '&fGrunt''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_chestplate: + name: '&fGrunt''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_helmet: + name: '&fGrunt''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_leggings: + name: '&fGrunt''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_sword: + name: '&fGrunt''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +harmless_chicken_drop_boots: + name: '&aUseless Boots' + lore: + - '&aAt least they''re explosion proof...' +hog_rider_drop_boots: + name: '&a3.6 Radioactive Boots' + lore: + - '&aNot great, not terrible.' +horde_champion_drop_sword: + name: '&dHorde Eviscerator' + lore: + - '&dWhen you need to take' + - '&dcare of an undead horde.' +horrid_duplicator_drop_arrow: + name: '&aDuped Arrow' + lore: + - '&2Looks and feels' + - '&2like the real thing...' +horrid_duplicator_drop_bow: + name: '&4Fiery Bone Bow' + lore: + - '&4This bow is made out of' + - '&4a single large bone.' +invasion_alien_treat: + name: '&6Alien treats' + lore: + - '&6The taste is out of this planet!' +invasion_cheap_plasma_boots: + name: '&2Cheap Plasma Boots' + lore: + - '&aBlast off!' + - '&cNote: &8Double shift to activate!' +invasion_low_grade_tinfoil_bolt_caster: + name: '&7Low Grade Bolt Caster' + lore: + - '&7Get off my property!' +invasion_low_grade_tinfoil_boots: + name: '&7Low Grade Tinfoil Shoes' + lore: + - '&7Avoids floor radiation!' +invasion_low_grade_tinfoil_chestplate: + name: '&7Low Grade Tinfoil Chestpiece' + lore: + - '&7Prevents 6G from spying on your pacemaker!' +invasion_low_grade_tinfoil_hat: + name: '&7Low Grade Tinfoil Hat' + lore: + - '&7I want to believe!' +invasion_low_grade_tinfoil_leggings: + name: '&7Low Grade Tinfoil Pants' + lore: + - '&7Made for running from aliens!' +invasion_polished_plasma_boots: + name: '&2Polished Plasma Boots' + lore: + - '&aBlast off!' + - '&cNote: &8Double shift to activate!' +invasion_quality_bolt_caster: + name: '&7Quality Bolt Caster' + lore: + - '&7Get off my property!' +invasion_quality_tinfoil_boots: + name: '&7Low Grade Tinfoil Shoes' + lore: + - '&7Avoids floor radiation!' +invasion_quality_tinfoil_chestplate: + name: '&7Quality Tinfoil Chestpiece' + lore: + - '&7Prevents 6G from spying on your pacemaker!' +invasion_quality_tinfoil_hat: + name: '&7Quality Tinfoil Hat' + lore: + - '&7Stay out of my head!' +invasion_quality_tinfoil_leggings: + name: '&7Quality Tinfoil Pants' + lore: + - '&7Made for running from aliens!' +invictus_boots: + name: '&4Invictus Boots' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_chestplate: + name: '&4Invictus Chestplate' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_helmet: + name: '&4Invictus Helmet' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_leggings: + name: '&4Invictus Leggings' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_pickaxe: + name: '&4Invictus Pickaxe' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_shovel: + name: '&4Invictus Shovel' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_sword: + name: '&4Invictus Sword' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +krampus_drop_boots: + name: '&1Snow Boots' + lore: + - '&1Made out of actual snow.' +large_hopper_drop_axe: + name: '&aHeavy Axe' + lore: + - '&aPerfect for chopping off heads.' +living_shadow_drop_boots: + name: '&5Shadow Boots' + lore: + - '&5Falling doesn''t hurt as much.' +lucky_charms: + name: '&bLucky Charms' + lore: + - '&aPart of a complete breakfast!' + - '&cNote: Absolutely not a part of' + - '&ca complete breakfast.' +magmaguys_toothpick: + name: '&4Magmaguy&c''s &2Toothpick' + lore: + - '&aIn nearly mint condition!' +merman_drop_trident: + name: '&1Merman Trident' + lore: + - '&1A Merman''s favorite weapon.' +meteor_shower_scroll: + name: '&7Meteor Shower Scroll' + lore: + - '&4Call forth destruction.' + - '&4Single-use.' +monster_of_the_deep_drop_trident: + name: '&3Bone Trident' + lore: + - '&3Made out of the bones' + - '&3of the Monster of the Deep.' +moon_spider_drop_sword: + name: '&fSilk Spun Sword' + lore: + - '&fRazor sharp silk surrounds' + - '&fthe iron core of this blade.' + - '&fThe blade will serve you,' + - '&ffor now...' +necromancer_drop_helmet: + name: '&cDark Omen Helm' + lore: + - '&cThere is something off' + - '&cabout this helmet.' +netherite_golem_drop_helmet: + name: '&8Ancient Helmet' + lore: + - '&8You''re not sure if you' + - '&8should put this on your' + - '&8head or send it to a museum.' +nether_escapee_drop_charm: + name: '&6Fire Amulet' + lore: + - '&6May the flames not harm you.' +nether_hag_drop_sword: + name: '&7Bewitched Sword' + lore: + - '&7All kinds of curses and' + - '&7enchantments flow through' + - '&7this sword.' +nightwing_drop_crossbow: + name: '&aSky Watcher' + lore: + - '&aKeeping the skies safe.' +night_crawler_drop_shield: + name: '&8Night Shield' + lore: + - '&8Almost unbreakable.' +night_crawler_drop_sword: + name: '&8Night Blade' + lore: + - '&e8The only answer to the' + - '&8threats of the night.' +novices_boots: + name: '&8Novice''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_chestplate: + name: '&8Novice''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_helmet: + name: '&8Novice''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_leggings: + name: '&8Novice''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_sword: + name: '&8Novice''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +oasis_beacons_brigandine: + name: '&8Beacon''s Brigandine' + lore: + - '&fSolid steel can repel' + - '&fmost attacks.' +oasis_chief_cultists_bow: + name: '&5Chief Cultist''s Bow' + lore: + - '&dThe necrotic war bow' + - '&dof the cultist chief.' +oasis_earthquake_boots_10: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_20: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_30: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_40: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_50: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_10: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_20: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_30: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_40: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_50: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_10: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_20: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_30: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_40: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_50: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_10: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_20: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_30: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_40: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_50: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_foundrys_flaming_hammer: + name: '&6Foundry''s Flaming Hammer' + lore: + - '&eThe Hammer of the foundry!' +oasis_foundrys_flux: + name: '&6Foundry''s Flux' + lore: + - '&eThe flux that''s infused in' + - '&eevery forged weapon!' +oasis_mask_of_the_warlock: + name: '&4Mask of the Warlock' + lore: + - '&7The stone is in his mask!' + - '&7The UV light will help him!' +oasis_monumental_lance: + name: '&3Monumental Lance' + lore: + - '&bSpearfishing is my hobby.' +oasis_oracles_shroud: + name: '&3Oracle''s Shroud' + lore: + - '&1Illusion is your weapon!' +oasis_page_of_darkness_I: + name: '&0Page of Darkness I' + lore: + - '&829 paces North' + - '&811 paces West' + - '&816 paces North' + - '&86 paces East' +oasis_page_of_darkness_II: + name: '&0Page of Darkness II' + lore: + - '&87 paces South' + - '&86 paces East' + - '&833 paces North' + - '&812 paces West' +oasis_page_of_darkness_III: + name: '&0Page of Darkness III' + lore: + - '&86 paces North' + - '&83 paces West' + - '&830 paces North' + - '&89 paces East' +oasis_page_of_darkness_index: + name: '&0Page of Darkness Index' + lore: + - '&8Tread carefully in darkness' + - '&8they know youve come.' + - '&8Be weary on the path ahead' + - '&8for balls of fire drum.' +oasis_page_of_darkness_IV: + name: '&0Page of Darkness IV' + lore: + - '&824 paces South' + - '&89 paces East' + - '&836 paces North' + - '&83 paces West' +oasis_page_of_darkness_V: + name: '&0Page of Darkness V' + lore: + - '&89 paces North' + - '&812 paces East' + - '&86 paces South' + - '&86 paces East' +oasis_page_of_darkness_VI: + name: '&0Page of Darkness VI' + lore: + - '&86 paces South' + - '&86 paces East' + - '&812 paces North' + - '&83 paces East' +oasis_page_of_darkness_VII: + name: '&0Page of Darkness VII' + lore: + - '&83 paces North' + - '&86 paces East' + - '&88 paces South' +oasis_page_of_darkness_VIII: + name: '&0Page of Darkness VIII' + lore: + - '&8Out of the shadow comes a light' + - '&8whose robes are dull gray, marred by fight.' + - '&8Of ice and snow, of fire and heat.' + - '&8Axes deflect, but swords defeat.' +oasis_page_of_libraris_I: + name: '&7Page of Libraris I' + lore: + - '&fUnder the bookshelf' + - '&fthat has no reflection' + - '&fwill appear unto you' + - '&fpassage and direction.' +oasis_page_of_libraris_II: + name: '&7Page of Libraris II' + lore: + - '&fThe bookshelf''s reflection' + - '&fholds more knowledge' + - '&f4 shelves more full of books' + - '&fthan its upward image!' +oasis_page_of_libraris_III: + name: '&7Page of Libraris III' + lore: + - '&fBearing slightly west' + - '&fof the bookshelf that holds the best.' + - '&fThe most knowledge does it keep.' + - '&fA favorite for those who reap.' +oasis_page_of_libraris_index: + name: '&7Page of Libraris Index' + lore: + - '&f5 papers to find,' + - '&f3 switches to flip,' + - '&fa door to be opened' + - '&fand in it shall ye slip.' +oasis_page_of_libraris_IV: + name: '&7Page of Libraris IV' + lore: + - '&fThe oracle of knowledge' + - '&fyeilds shocking surprise' + - '&ffrom depths of despair' + - '&fshall lightning bolts arise.' +oasis_page_of_libraris_V: + name: '&7Page of Libraris V' + lore: + - '&fHis last secret' + - '&fhe will try to hide' + - '&fthough use of shadow and puppets' + - '&fto strike you as you stride.' +oasis_page_of_plundering_I: + name: '&6Page of Plundering I' + lore: + - '&eHouses throughout the town' + - '&ehide their secrets up rather than down.' + - '&eGrapple or flight' + - '&ecan aid your plight.' +oasis_page_of_sentris: + name: '&1Page of Sentris' + lore: + - '&bA sentry''s armor is too tough' + - '&bwielding a sword, your fight will be rough.' +oasis_page_of_the_pharaoh_I: + name: '&0Page of the Pharaoh I' + lore: + - '&6A sacrifice on the altar' + - '&6must be made to pursue.' + - '&6But what shall ye offer?' + - '&red sandstone holds this clue.' +oasis_page_of_the_pharaoh_II: + name: '&0Page of the Pharaoh II' + lore: + - '&6The pharaohs halls are lined' + - '&6in the finest gold around.' + - '&6It shall be his undoing' + - '&6for from gold your damage shall abound.' +oasis_page_of_the_pharaoh_III: + name: '&0Page of the Pharaoh III' + lore: + - '&6The pharaohs walls are filled' + - '&6with perils and precious treasures.' + - '&6From the southwest corner of the room with blue windows' + - '&6streams very ominous pressures.' +oasis_page_of_the_pharaoh_index: + name: '&0Page of the Pharaoh Index' + lore: + - '&6The pharaoh is sealed' + - '&6within his tomb.' + - '&6He lies in wait, undisturbed;' + - '&6his traps will be your doom.' + - '&63 pages will help your adventure' + - '&6from being curbed.' +oasis_page_of_the_sewer_I: + name: '&0Page of the Sewer I' + lore: + - '&3There is a louse of unusual size.' + - '&3Its on the prowl, behold its prize.' + - '&3Plenty of treasure to be found' + - '&3all you have to do is swim around.' +oasis_page_of_the_sewer_II: + name: '&0Page of the Sewer II' + lore: + - '&3Activating the gates one by one' + - '&3will allow the water to flow.' + - '&3Swim up once it pours out' + - '&3then down the right tunnel you must go.' +oasis_page_of_the_sewer_index: + name: '&0Page of the Sewer Index' + lore: + - '&3Evil lurks where waters drain' + - '&3Be ever watchful, they''ll eat your brain!' + - '&3You must open 3 gates guarded by creatures' + - '&3lined with red sandstone features.' + - '&32 pages will guide you, do not strain.' +oasis_page_of_vampiris_I: + name: '&4Page of Vampiris I' + lore: + - '&cDozens of weapons have struck the beast' + - '&cand every blow it''s withstood.' + - '&cIt fears not the bite of stone, gold or diamonds in the least' + - '&cbut it trembles before wood.' +oasis_page_of_vampiris_II: + name: '&4Page of Vampiris II' + lore: + - '&cIf the warlock you seek to slight,' + - '&cbe prepared for a tough fight!' + - '&cThe second floor shall test your might,' + - '&cconquering it first is a rite.' +oasis_page_of_vampiris_III: + name: '&4Page of Vampiris III' + lore: + - '&cDown the spire and into the cave' + - '&cis the path of the brave.' + - '&cBeware of those returned from the grave,' + - '&cslay master for what you crave.' +oasis_page_of_vampiris_index: + name: '&4Page of Vampiris Index' + lore: + - '&cWithin the observatory' + - '&cthere lurks a creature' + - '&cwho has never seen the sun.' + - '&cFind 4 pages to help you' + - '&cescape alive!' +oasis_page_of_vampiris_IV: + name: '&4Page of Vampiris IV' + lore: + - '&cTwo chests of loot,' + - '&cDon''t wake the dead!' + - '&cOne under the stair,' + - '&cthe other where books can be read!' +oasis_pharaohs_feast: + name: '&6Pharaohs Feast' + lore: + - '&eA golden reminder' + - '&eof the once golden city' + - '&ecorrupted by the sands of time.' +oasis_pharaohs_flail: + name: '&0Pharaoh''s Flail' + lore: + - '&4The flail of the afterlife.' +oasis_pick_of_darkness: + name: '&1Pick of Darkness' + lore: + - '&bShining bright through' + - '&bthe shadows.' +oasis_sunkiller: + name: '&6Sunkiller' + lore: + - '&eIsnt that rock over there' + - '&ejust big enough for someone' + - '&eto hide behind?' +oasis_tohth: + name: '&8Oingo Boingo Brothers Adventure' + lore: + - '&fMy preminitions are absolute!' + - '&fIt is fate!' +okami_drop_leggings: + name: '&cOkami''s Blessing' + lore: + - '&cSpeed of the wolf.' + - '&cFire protection of a god.' +owl_charm: + name: '&bOwl Charm' + lore: + - '&aBecome the ultimate nocturnal' + - '&apredator!' +primis_artifexs_shield: + name: '&6Artifex''s Shield' + lore: + - '&eAn old relic from a more' + - '&edangerous time. It has been' + - '&erestored to its glory!' +primis_caeruleaums_hope: + name: '&9Caeruleaum''s Hope' + lore: + - '&8A relic of a bygone era, still sharp' + - '&8enough to hurt but rusty enough to' + - '&8belong in a museum!' +primis_catacomb_drop_boots: + name: '&7Dark Bone Footgear' + lore: + - '&7Unnaturally dark bones' + - '&7cover these boots.' +primis_catacomb_drop_boots_2: + name: '&7Dark Bone Footgear' + lore: + - '&7Unnaturally dark bones' + - '&7cover these boots.' +primis_catacomb_drop_chestplate: + name: '&7Dark Bone Armor' + lore: + - '&7Bones as dark as the abyss' + - '&7adorn this armor.' + - '&7The arrows will make quite a' + - '&7noise as they bounce off the bones.' +primis_catacomb_drop_chestplate_2: + name: '&7Dark Bone Armor' + lore: + - '&7Bones as dark as the abyss' + - '&7adorn this armor.' + - '&7The arrows will make quite a' + - '&7noise as they bounce off the bones.' +primis_catacomb_drop_leggings: + name: '&7Dark Bone Leggings' + lore: + - '&7The dark bones covering the' + - '&7leggings will make dangerous' + - '&7falls more survivable.' +primis_catacomb_drop_leggings_2: + name: '&7Dark Bone Leggings' + lore: + - '&7The dark bones covering the' + - '&7leggings will make dangerous' + - '&7falls more survivable.' +primis_catacomb_necromancer_drop_helmet: + name: '&5Dark Bone Cowl' + lore: + - '&5The cowl offers little protection,' + - '&5it only seeks blood and death.' +primis_catacomb_necromancer_drop_helmet_2: + name: '&5Dark Bone Cowl' + lore: + - '&5The cowl offers little protection,' + - '&5it only seeks blood and death.' +primis_catacomb_necromancer_drop_sword: + name: '&5Dark Bone Brand' + lore: + - '&5The unnaturally dark bone-brand' + - '&5glistens in the light' + - '&5ready to part anything' + - '&5that stands in it''s way.' +primis_catacomb_necromancer_drop_sword_2: + name: '&5Dark Bone Brand' + lore: + - '&5The dark bone-brand howls' + - '&5viciously with every swing' + - '&5as the air rushes through' + - '&5it''s hollow cavity.' +primis_cooked_rabbit: + name: '&cCooked Rabbit' + lore: + - Huh, did this rabbit overheat? +primis_diving_helmet: + name: '&1Diving Helmet' + lore: + - An old Diving Helmet. + - Still works just fine. +primis_fish_bait: + name: '&2Fish Bait' + lore: + - '&aLooks like you could reel big fish with these.' +primis_gladius_important_documents: + name: '&2Important Documents' + lore: + - '&aThe documents are sealed.' +primis_gladius_lord_promise: + name: '&5Assistance Agreement' + lore: + - '... hence, for the help lended during these most trying' + - times, Pontis Mille promises to return in kind at Gladius' + - darkest hour. +primis_gladius_supplies: + name: '&2Supplies' + lore: + - '&aFit to keep a soldier fed during a war.' +primis_gladius_sword: + name: '&5Gladius' + lore: + - '&8The very symbol of the Gladius Fortress.' +primis_gladius_the_good_stuff: + name: '&2The Good Stuff' + lore: + - '&aSmells... strong.' +primis_heirloom: + name: '&2Lost Heirloom' + lore: + - '&aSeems old, ancient even.' +primis_ice_village_alanus_dagger: + name: '&eAlanus'' Dagger' + lore: + - '&eA simple dagger with' + - '&erunes covering the handle.' +primis_ice_village_chains_shipment: + name: '&aShipment of Chains' + lore: + - '&aA lot of chains.' +primis_ice_village_escaped_prisoner_body: + name: '&cUnconcious Body' + lore: + - '&cHeavy.' +primis_ice_village_foot_of_mountain_chest_axe: + name: '&1Dull Frost Axe' + lore: + - '&1Freezing to the touch' +primis_ice_village_island_chest_trident: + name: '&3Magma''s Delight' + lore: + - '&3Those who look, shall find.' +primis_ice_village_living_nightmares_reward_chest: + name: '&3Fur Coat' + lore: + - '&3Made out of the' + - '&3toughest fur around.' +primis_ice_village_magical_ice_crystals: + name: '&1Fur Ice Crystal' + lore: + - Having the crystal near + - snow makes it react. +primis_ice_village_make_them_go_ouch_reward_leggings: + name: '&dViolet''s Spare Leggings' + lore: + - '&dMakes you wanna strut down the' + - '&droad and do some punishment.' +primis_ice_village_salmon: + name: '&2Fresh Salmon' + lore: + - You don't think you saw + - larger salmon in your life. +primis_ice_village_silence_reward_helmet: + name: '&aBoomers Helm' + lore: + - '&aShould handle an explosion or two.' +primis_ice_village_taking_the_bait_reward: + name: '&bNorthern Rod' + lore: + - '&bIt''s a well made fishing rod.' +primis_ice_village_violet_boots: + name: '&dViolet''s Leather Boots' + lore: + - '&dFancy leather boots with' + - '&da raised pointy heel.' +primis_ice_village_violet_leggings: + name: '&dViolet''s Fancy Leggings' + lore: + - '&dTight and slightly see-through' + - '&dwith beautiful flower motives.' +primis_ice_village_violet_whip: + name: '&dViolet''s Whip' + lore: + - '&dDelivers exquisite punishment.' +primis_ice_village_wanna_build_a_snowman_reward_boots: + name: '&3Frost Boots' + lore: + - '&3It''s just frost boots.' +primis_invaders_assassins_bow: + name: '&8Assassin''s Bow' + lore: + - '&aThe perfect way to give them' + - '&aa taste of their own medicine.' +primis_invaders_boots: + name: '&4Invader''s boots' + lore: + - '&aThese don''t smell so good.' +primis_invaders_bow: + name: '&8Invader''s Bow' + lore: + - '&aOnce blotted out the Sun.' +primis_invaders_captains_sword: + name: '&4Invader''s Captain Sword' + lore: + - '&aCurved and mean-looking.' +primis_invaders_chestplate: + name: '&4Invader''s chestplate' + lore: + - '&aRusty, ugly and smelly. Lovely!' +primis_invaders_helmet: + name: '&4Invader''s helmet' + lore: + - '&aBeats a concussion!' +primis_invaders_leggings: + name: '&4Invader''s leggings' + lore: + - '&aCould use some oil.' +primis_invaders_sword: + name: '&4Invader''s sword' + lore: + - '&aSuspiciously bloodstained.' +primis_lucky_pickaxe: + name: '&6Lucky Lickaxe' + lore: + - '&eShines bright, even underground.' + - '&eYou see LL engraved in the handle' +primis_monster_slaying_spear: + name: '&8Monster Slaying Spear' + lore: + - Turns Sea Monsters into barbecue. +primis_ogre_boots: + name: '&cOgre''s boots' + lore: + - '&7They''ll keep you nice' + - '&7and toasty.' +primis_ogre_chestplate: + name: '&cOgre''s chestplate' + lore: + - '&7Hot to the touch' +primis_ogre_helmet: + name: '&cOgre''s helmet' + lore: + - '&7You''ll be sweating bullets.' +primis_ogre_leggings: + name: '&cOgre''s leggings' + lore: + - '&7Smoldering slacks.' +primis_ogre_mines_lucky_pickaxe: + name: '&eLucky Pickaxe' + lore: + - '&aLucky, but useless.' +primis_ogre_mines_waterworks_chest_shield: + name: '&aSturdy Door' + lore: + - '&aIt''s just a door.' +primis_old_shield: + name: '&8Old Shield' + lore: + - '&7An old relic from a more' + - '&7dangerous time. It might be' + - '&7able to be mended, though...' +primis_pirate_boots: + name: '&4Pirate''s boots' + lore: + - '&aThese have a few too many' + - '&aholes to be useful.' +primis_pirate_bow: + name: '&8Pirate''s Bow' + lore: + - '&aNot quite a flintlock,' + - '&abut it will do!' +primis_pirate_chestplate: + name: '&4Pirate''s Chestplate' + lore: + - '&aBasically a t-shirt.' +primis_pirate_helmet: + name: '&4Pirate''s Helmet' + lore: + - '&aMissing an eye-patch.' +primis_pirate_leggings: + name: '&4Pirate''s leggings' + lore: + - '&aFeels like sea legs!' +primis_pirate_sword: + name: '&4Pirate''s sword' + lore: + - '&aCurved and mean-looking.' +primis_pointis_groves_heirloom: + name: '&2Valuable Heirloom' + lore: + - '&aThis is the second one of these that you retrieved.' +primis_pointis_mille_chest_dirty_note: + name: Dirty Note + lore: + - '&fThere was a really cool sword' + - '&fin here but it''s gone now.' +primis_pontis_beast_horn: + name: '&2Blood Drenched Horn' + lore: + - '&fOn closer inspection the horn isn''t' + - '&fcovered in blood but seems to' + - '&fbe made out of it.' + - '&fThe crystallized blood is incredibly sharp.' +primis_pontis_beast_scale: + name: '&2Toxic Fish Scale' + lore: + - '&fThe scale is rock hard on the outside.' + - '&fThe inside is covered in' + - '&ftoxic and acidic ooze.' +primis_pontis_beast_silk: + name: '&2Sun Soaked Silk' + lore: + - '&fThe silk is radiating light and warmth.' +primis_pontis_elf_drop_boots: + name: '&7Elf Boots' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_elf_drop_chestplate: + name: '&7Elf Chest-plate' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_elf_drop_crossbow: + name: '&7Elf Dark-bow' + lore: + - '&7The special projectiles that the bow' + - '&7uses are both sharp and blunt.' +primis_pontis_elf_drop_helmet: + name: '&7Elf Helmet' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_elf_drop_leggings: + name: '&7Elf Leggings' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_fields_berry_charm: + name: '&dLarge Berry' + lore: + - '&dThe fresh odor this berry emits' + - '&dcan be smelled from miles away.' + - '&dThe odor seems to have a calming' + - '&deffect on monsters and beasts.' + - '&dIt makes their attacks less vicious.' +primis_pontis_groves_brood_moher_drop_charm: + name: '&aCrawlers Torment' + lore: + - '&aThe silk radiates strong energy.' +primis_pontis_groves_nest_crawler_drop_shield: + name: '&7Magma''s Lure' + lore: + - '&7When the shield is held up' + - '&7it lures monsters into striking it.' +primis_pontis_groves_spider_boots_reward: + name: '&1Spider-legs Boots' + lore: + - '&1Boots made from spider legs and leather.' +primis_pontis_groves_tree_climbing_elf_bandits_reward_leggings: + name: '&aElf Pearl Leggings' + lore: + - '&aProtective leggings' + - '&aadorned with pearls.' +primis_pontis_mille_arena_knowledge: + name: '&2Knowledge' + lore: + - '&aImportant Knowledge.' +primis_pontis_mille_arena_reward_1: + name: '&4Star Touched Shield' + lore: + - '&7An ornate shield with a cosmos motive.' +primis_pontis_mille_arena_reward_2: + name: '&4Star Touched Chestplate' + lore: + - '&7A thousand tiny spiky stars stretch across the Chestplate.' +primis_pontis_mille_arena_reward_3: + name: '&4Star Touched Leggings' + lore: + - '&7The leggings sparkle like the stars in the sky.' +primis_pontis_mille_cat_quest_reward_charm: + name: '&9Cat''s Blessing' + lore: + - '&9If you hold it up all the' + - '&9way to your ear you can' + - '&9hear a slight purr.' +primis_pontis_mille_counselor_sword: + name: '&eStone of Far-speech' + lore: + - '&aYou can sense a presence coming from the stone.' +primis_pontis_mille_fields_beasts_reward_chest: + name: '&eHunters Pride' + lore: + - '&eThose who hunt cannot be the prey.' +primis_pontis_mille_fields_contest_berry: + name: '&dContest Berry' + lore: + - '&dA beautiful and very large berry.' + - '&dTruly a one in a million specimen.' +primis_pontis_mille_fields_do_it_yourself_reward_bow: + name: '&cHunters Bow' + lore: + - '&cA finely crafted bow.' + - '&cArrows fired from this' + - '&cbow will hurt any beast.' +primis_pontis_mille_fields_first_aid: + name: '&2First Aid Equipment' + lore: + - '&fEverything one would need" - "&fto treat serious injuries.' +primis_pontis_mille_fields_rat_drop_helmet: + name: '&fFeathered Rat Cap' + lore: + - '&fYou managed to make a' + - '&fcap out of your prey.' + - '&fHaving extracted the preys' + - '&fblinding properties, you have made' + - '&fit work in your favor.' +primis_pontis_mille_fields_rat_meat: + name: '&cRat Meat' + lore: + - Raw rat meat. No need to cook. +primis_pontis_mille_fields_stolen_berries: + name: '&4Stolen Berries' + lore: + - '&fIt''s the stolen berries' +primis_pontis_mille_fish_nets: + name: '&2Fish Nets' + lore: + - '&aCatching fish made easy!' +primis_pontis_mille_fresh_rat: + name: '&fFresh Rat' + lore: + - The cat will love this. +primis_pontis_mille_mines_goblined_up_in_the_maze_reward_axe: + name: '&aRuned Goblin Axe' + lore: + - '&aThere are runes etched into the axe handle.' + - '&aThey are quite faded by now.' + - '&aSeems like this axe was cursed at one point...' +primis_pontis_mille_mines_goblin_head: + name: '&2Fowl Goblin Feathers' + lore: + - '&aSo soft and prickly.' +primis_pontis_mille_parkour_reward_boots: + name: '&4Diamond Tree Boots' + lore: + - '&7Boots made out of special soft bark.' + - '&7Decorated with gems.' +primis_pontis_mille_reward_boots: + name: '&4Pontis Mille Boots' + lore: + - '&7Traditional Pontis Mille Boots' +primis_pontis_mille_reward_chest: + name: '&4Pontis Mille Chestplate' + lore: + - '&7A traditional Pontis Mille Chestplate' +primis_pontis_mille_reward_helmet: + name: '&4Pontis Mille Helm' + lore: + - '&7A traditional Pontis Mille Helm' +primis_pontis_mille_reward_leggings: + name: '&4Pontis Mille Leggings' + lore: + - '&7Traditional Pontis Mille Leggings' +primis_pontis_mille_reward_shield: + name: '&4Pontis Mille Shield' + lore: + - '&7A traditional Pontis Mille Shield' +primis_pontis_mille_reward_sword: + name: '&4Pontis Mille Katana' + lore: + - '&7Incredibly sharp' +primis_pontis_mille_serious_sewage_reward_helmet: + name: '&2Turtle Shell Helm' + lore: + - '&2Makes you wanna eat some pizza.' +primis_pontis_mille_sewage_keys: + name: '&2Sewage Keys' + lore: + - '&aA key ring with a lot of keys on it.' +primis_pontis_mille_sewers_ninja_drop_chestplate: + name: '&7Ninja Garb Chest-plate' + lore: + - Now you too are a Ninja +primis_pontis_mille_sewers_ninja_drop_leggings: + name: '&7Ninja Garb Leggings' + lore: + - Now you too are a Ninja +primis_pontis_mille_sewers_shredder_drop: + name: '&4Shredding Helmet' + lore: + - Full of small tiny razor blade + - like points on the exterior. +primis_pontis_mille_slums_chest_sword: + name: '&4Dull Pontis Mille Katana' + lore: + - '&7Incredibly sharp' +primis_pontis_mille_to_lycan_or_not_to_lycan_reward: + name: '&aFur Leggings' + lore: + - '&aTough and light' + - '&aMade out of fur and hide.' +primis_pontis_mines_goblin_drop_boots: + name: '&7Goblin Boots' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_chestplate: + name: '&7Goblin Chest-Plate' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_helmet: + name: '&7Goblin Helmet' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_leggings: + name: '&7Goblin Leggings' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_spear: + name: '&7Goblin Spear' + lore: + - '&7A nice and sharp stone at the end.' +primis_pontis_mines_goblin_drop_sword: + name: '&7Goblin Sword' + lore: + - '&7It''''s just a stone club with a handle.' +primis_pontis_redwoods_nasty_little_bandits_reward_boots: + name: '&2Forest Boots' + lore: + - '&2The boots seem to be made' + - '&2out of soft bark, leaves' + - '&2and crystallized tree sap.' +primis_pontis_redwoods_spider_legs: + name: '&2Spider Legs' + lore: + - '&aIt is just spider legs...' +primis_pontis_redwoods_tobacco: + name: '&2Premium Tobacco' + lore: + - '&aSmells amazing...' +primis_pontis_redwoods_watch: + name: '&2Sturdy Pocket Watch' + lore: + - '&aSuprisingly light and sturdy.' +primis_pontis_redwoods_werewolf_drop_chestplate: + name: '&7Fur Chest-Plate' + lore: + - '&7Made out of tough fur and hide.' + - '&7Light, but very tough.' +primis_roughspun_boots: + name: '&5Roughspun Boots' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_roughspun_chestplate: + name: '&5Roughspun Chestplate' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_roughspun_helmet: + name: '&5Roughspun Helmet' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_roughspun_leggings: + name: '&5Roughspun Leggings' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_ruins_bow: + name: '&8Ruined Bow' + lore: + - An old bow. Might've been good at some point. +primis_ruins_diary_entry: + name: Diary page + lore: + - '... I now regret chasing after the treasure in these ruins.' + - Now that I have fallen and broken my legs, it would seem + - as though I am fated to die under the treasure I sought. + - If only I had paid more attention during parkour class! +primis_ruin_relic_boots: + name: '&bRuin Relic Boots' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_ruin_relic_chestplate: + name: '&bRuin Relic Chestplate' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_ruin_relic_helmet: + name: '&bRuin Relic Helmet' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_ruin_relic_leggings: + name: '&bRuin Relic Leggings' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_rusty_mail_boots: + name: '&3Rusty Mail Boots' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_rusty_mail_chestplate: + name: '&3Rusty Mail Chestplate' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_rusty_mail_helmet: + name: '&3Rough Mail Helmet' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_rusty_mail_leggings: + name: '&3Rough Mail Leggings' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_starter_boots: + name: '&4Shipwreck''s Boots' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_chestplate: + name: '&4Shipwreck''s Chestplate' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_helmet: + name: '&4Shipwreck''s Helmet' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_leggings: + name: '&4Shipwreck''s Leggings' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_sword: + name: '&4Shipwreck''s Sword' + lore: + - '&aPossibly improvised from the beached remains of a ship!' +primis_storm_temple_drop_axe: + name: '&bStorm Axe' + lore: + - '&bThe wind shall repel them.' +primis_storm_temple_drop_boots: + name: '&bStorm Boots' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_storm_temple_drop_charm: + name: '&bStorm Necklace' + lore: + - '&bThe power of the storm.' +primis_storm_temple_drop_chestplate: + name: '&bStorm Chest-plate' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_storm_temple_drop_helmet: + name: '&bStorm Helmet' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_storm_temple_drop_leggings: + name: '&bStorm Leggings' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_terravilla_big_trouble_in_little_pub_reward_leggings: + name: '&eEarth''s Blessing' + lore: + - '&eLooks heavy but it is' + - '&esurprisingly light.' + - '&eIt is clear that these' + - '&eleggings are at least a' + - '&efew centuries old.' +primis_terravilla_drowning_terror_reward_charm: + name: '&aFish Charm' + lore: + - '&aFishy.' +primis_terravilla_hog_on_my_porch_reward_helmet: + name: '&6Hog Helmet' + lore: + - '&6Made out of tough Razorback leather.' +primis_terravilla_perfect_sample: + name: '&ePerfect Sample' + lore: + - '&eIt looks like a fish...' + - '&eBut it sure isn''t...' +primis_terravilla_strike_the_earth_reward_sword: + name: '&5Earth Splitter' + lore: + - '&5You pulled this blade out of' + - '&5the Earth Elementals corpse.' + - '&5Unlike it''s dull twin, this' + - '&5blade is in pristine condition.' +primis_terravilla_taking_out_the_trash_reward_sword: + name: '&9Earth Splitter' + lore: + - '&9Looks ancient and dull.' +primis_terravilla_two_legged_terror_growth: + name: '&eTwo Legged Terror Growth' + lore: + - '&eLarge fleshy growth.' +primis_terravilla_two_legged_terror_sample: + name: '&eTwo Legged Terror Sample' + lore: + - '&eIt''s a simple sample.' +primis_wolf_hide_boots: + name: '&5Wolf Hide Slippers' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_wolf_hide_chestplate: + name: '&5Wolf Hide Gambeson' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_wolf_hide_helmet: + name: '&5Wolf Hide Helmet' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_wolf_hide_leggings: + name: '&5Wolf Hide Pants' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +pufferfish_drop_helmet: + name: '&bPuffer Helm' + lore: + - '&bOnce a fish, now a helmet.' +rabbit_charm: + name: '&bRabbit Charm' + lore: + - '&aWith this charm, just about' + - '&aany destination is only a hop,' + - '&askip and a jump away!' +rabbit_wolf_drop_chestplate: + name: '&6Electrically Charged Chestplate' + lore: + - '&6As long as you don''t mind a' + - '&6casual zap here and there.' +rabbit_wolf_drop_leggings: + name: '&6Flame Licked Leggings' + lore: + - '&6Just lightly scorched.' +regular_hoglin_drop_boots: + name: '&eHog Boots' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_chestplate: + name: '&eHog Armor' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_helmet: + name: '&eHog Hood' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_leggings: + name: '&eHog Leggings' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +rod_of_the_depths: + name: '&3Rod of the Depths' + lore: + - '&3You want to hear about where' + - '&3I got this from? Sit down lad,' + - '&3I''ve got a tale for ye...' +rotting_diver_drop_hoe: + name: '&bDivers Hoe' + lore: + - '&bFound on the Rotting Divers corpse.' +salamander_charm: + name: '&bSalamander Charm' + lore: + - '&aAlmost as hot as MagmaGuy''s' + - '&anew mixtape!' +salty_corpse_drop_helmet: + name: '&aStinky Helm' + lore: + - '&aYou''re not sure why' + - '&ayou decided to pull' + - '&athis off of the corpse.' +scorpion_charm: + name: '&bScorpion Charm' + lore: + - '&aFloat like a butterfly,' + - '&asting like a bee,' + - '&apoison like a potato!' +shulker_charm: + name: '&bShulker Charm' + lore: + - '&aI believe I can fly' + - '&aI believe I can touch the sky' + - '&aAnd you''re coming with me!' +skeleton_knight_drop_helmet: + name: '&fKnights Honor' + lore: + - '&fA knights helmet. Made to last.' +sky_archer_drop_bow: + name: '&aSky Bow' + lore: + - '&aGood for keeping phantoms at bay.' +slowpoke_charm: + name: '&bSlowpoke Charm' + lore: + - '&aLet''s just hope it doesn''t hit' + - '&aitself in its confusion...' +spider_knight_drop_helmet: + name: '&aSmall Helmet' + lore: + - '&aA decent helmet. Maybe, a bit tight.' +stacked_bones_drop_helmet: + name: '&6Skull' + lore: + - '&6Large enough to fit your' + - '&6head inside, so why not.' +summon_merchant_scroll: + name: '&6Summon Merchant Scroll' + lore: + - '&aNeed to sell an item?' + - '&aRight-click to activate' + - '&aor yell &9Jeeves!' +summon_wolf_scroll: + name: '&6Summon Wolf Scroll' + lore: + - '&aSummons a good boy' + - '&ato help you bite Elites!' + - '&aMake sure you pet it!' +super_mite_drop_charm: + name: '&dMite Pearl' + lore: + - '&dWas it worth it...' +air_ship_air_buccaneer_boots: + name: '&5Air Bucanneer''s Boots' + lore: + - '&dPerfect for air raids!' +air_ship_air_buccaneer_chestplate: + name: '&5Air Bucanneer''s Chestplate' + lore: + - '&dPerfect for air raids!' +air_ship_air_buccaneer_helmet: + name: '&5Air Bucanneer''s Helmet' + lore: + - '&dPerfect for air raids!' +air_ship_air_buccaneer_leggings: + name: '&5Air Bucanneer''s Leggings' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_boots: + name: '&5Air Pirate''s Boots' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_chestplate: + name: '&5Air Pirate''s Chestplate' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_helmet: + name: '&5Air Pirate''s Helmet' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_leggings: + name: '&5Air Pirate''s Leggings' + lore: + - '&dPerfect for air raids!' +air_ship_bowsmans_bow: + name: '&2Bowsman''s Bow' + lore: + - '&aDropped by the late' + - '&aairship bowsman!' +air_ship_cannon_powder: + name: '&cCannon Powder' + lore: + - '&8How else are you supposed' + - '&8to light the fuse?' +air_ship_daveys_digger: + name: '&4Davey''s Digger' + lore: + - '&cDavey doesn''t desire downtrodden' + - '&cdunderheads displaying his digger.' +air_ship_quartermasters_whip: + name: '&fQuartermaster''s Whip' + lore: + - '&7The quartermaster has a ' + - '&7schedule to keep.' +air_ship_wayfinders_windlass: + name: '&3Wayfinder''s Windlass' + lore: + - '&bUsed to guide ships' + - '&bwith nothing but the stars!' +pirate_ship_sea_feast: + name: '&6Sea feast' + lore: + - '&6A feast for the eyes' + - '&6and the health bar!' +pirate_ship_sea_ration: + name: '&eSea ration' + lore: + - '&eAn apple a day' + - '&ekeep the scurvy away' + - '&cNote: it does not' +catacombs_tier_10_miniboss_boots: + name: '&9Spiderweave boots' + lore: + - '&5As light as air!' +catacombs_tier_10_miniboss_spider_eye: + name: '&7Terragog''s eye' + lore: + - '&7Whispers from nowhere reach' + - '&7your ears while holding this...' +catacombs_tier_15_boss_bone: + name: The Picker + lore: + - '&fYou''ve got a bone to pick!' +catacombs_tier_15_boss_bow: + name: '&6The Bone Shaker' + lore: + - '&fThey''ll feel this one down to' + - '&ftheir bones!' +catacombs_tier_15_boss_shovel: + name: '&8Gravedigger' + lore: + - '&fThey''ll feel this one down to' + - '&ftheir bones!' +catacombs_tier_15_mimic_boss_shield: + name: '&3Shield of the lost Templar' + lore: + - Found in a mysterious chest in a + - secret room of ancient catacombs... +colosseum_pit_breaker: + name: '&4Pit Shatterer' + lore: + - '&4Veni' +colosseum_pit_filler: + name: '&4&lPit Filler' + lore: + - '&4Vici' +colosseum_pit_maker: + name: '&4&lPit Maker' + lore: + - '&4Vidi' +dark_cathedral_tier_75_sword: + name: '&0Cursed Sword' + lore: + - '&0&kChtulhu is the one true God.' + - '&0&kThis world is but a lamb' + - '&0&kto the slaughter' +darkspire_arzags_boots: + name: '&8Arzag''s War Boots' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_chestplate: + name: '&8Arzag''s War Chestplate' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_helmet: + name: '&8Arzag''s War Helmet' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_leggings: + name: '&8Arzag''s War Leggings' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_slicer: + name: '&8Arzag''s Slicer' + lore: + - '&7Once used by the might Arzag!' +darkspire_crypt_keepers_boots: + name: '&4Crypt Keeper''s Boots' + lore: + - '&cFormerly the boots of the' + - '&ccorrupt Crypt Keeper!' +darkspire_hellraisers_battle_armor: + name: '&4Eerbix''s Battle Armor' + lore: + - '&cFormerly the battle' + - '&carmor of the egregious' + - '&cEerbix the Fallen!' +darkspire_maalkvs_bow: + name: '&4Maalkv''s Bow' + lore: + - '&cFormerly the bow of the' + - '&cmischievous Maalkv!' +darkspire_netherite_axe: + name: '&8Void Eviscerator' + lore: + - '&8Shards of the void itself were' + - '&8collected to form the cleaving' + - '&8head of this ancient weapon.' +darkspire_nicolas_ribcages_helmet: + name: '&4Nicolas Ribcage''s Helmet' + lore: + - '&cFormerly the helmet of the' + - '&cnefarious Nicolas Ribcage!' +darkspire_oroxaks_sword: + name: '&4Oroxak''s Sword' + lore: + - '&cFormerly the sword of the' + - '&codious Oroxak!' +darkspire_zalmurs_leggings: + name: '&4Zalmur''s Leggings' + lore: + - '&cFormerly the leggings of' + - '&cthe zealous Zalmur' + - '&cthe Impslayer!' +the_feller: + name: '&2The Feller' + lore: + - '&aEven in your sleep,' + - '&ayou can feel this axe''''s' + - '&asaplust' +the_great_weaver_drop_charm: + name: '&cWeavers Silk' + lore: + - '&cGreat power is imbued into this silk.' +hallosseum_amazing_treat: + name: '&aAmazing Treat!' + lore: + - '&eAn amazing snack!' +hallosseum_axe_of_beheadings: + name: '&cAxe of Beheadings' + lore: + - '&4Famously used to decapitate a' + - '&4certain headless horseman!' +hallosseum_incredible_treat: + name: '&aIncredible Treat!' + lore: + - '&eAn incredible snack!' +hallosseum_treat: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +hallosseum_treat_v2: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +the_hunter_drop_crossbow: + name: '&aHunter''s Friend' + lore: + - '&aLet the hunt begin.' +northpole_amazing_treat: + name: '&aAmazing Treat!' + lore: + - '&eAn amazing snack!' +northpole_coalbringer: + name: '&8Coalbringer' + lore: + - '&cWhatever I touch' + - '&cStarts to melt in my clutch.' + - '&cI''m too much!' +northpole_frostcaster: + name: '&bFrostcaster' + lore: + - '&7Whatever I touch' + - '&7Turns to snow in my clutch!' + - '&7I''m too much' +northpole_incredible_treat: + name: '&aIncredible Treat!' + lore: + - '&eAn incredible snack!' +northpole_naughty_lister: + name: '&4The Naughty Lister' + lore: + - '&cTakes names. Doesn''t ask twice!' + - '&cHave you been naughty this year?' +northpole_treat: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +northpole_treat_v2: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +the_phantom_drop_chestplate: + name: '&dPhantom Gambison' + lore: + - '&dYou would say it is made out of soft' + - '&dand comfy fibrous cloth, but a blade' + - '&dwould not recoil from striking cloth.' +pirate_ship_tier_15_boots: + name: Pirate Sandals + lore: + - Make you want to + - go to the beach! +pirate_ship_tier_15_bow: + name: Pirate shortbow + lore: + - Perfect for boarding parties! +pirate_ship_tier_15_chestplate: + name: Pirate Shirt + lore: + - No shoes, no shirt + - no problem! +pirate_ship_tier_15_helmet: + name: Pirate Bandana + lore: + - No shoes, no shirt + - no problem! +pirate_ship_tier_15_leggings: + name: Pirate Sash + lore: + - These could use a wash! +pirate_ship_tier_15_sword: + name: Pirate marlinspike + lore: + - Loud and deadly! +pirate_ship_tier_20_miniboss_axe: + name: '&5Cookie''s Tenderizer' + lore: + - '&5You''ll feel that tomorrow!' +pirate_ship_tier_20_miniboss_chestplate: + name: '&5Cookie''s apron' + lore: + - '&5Has seen better days!' +pirate_ship_tier_25_boots: + name: '&aPirate shoes' + lore: + - '&aPerfect for thieving!' +pirate_ship_tier_25_bow: + name: '&aPirate musket' + lore: + - '&aCareful where you point it!' +pirate_ship_tier_25_chestplate: + name: '&aPirate vest' + lore: + - '&aProbably illegally obtained!' +pirate_ship_tier_25_helmet: + name: '&aPirate earrings' + lore: + - '&aWorth enough to pay for' + - '&aa funeral!' +pirate_ship_tier_25_leggings: + name: '&aPirate trousers' + lore: + - '&aFull of gold coins!' +pirate_ship_tier_25_miniboss_helmet: + name: '&5Helmsman''s Eyepatch' + lore: + - '&5How can you see better' + - '&5with it on!?' +pirate_ship_tier_25_miniboss_trident: + name: '&5Helmsman''s Trident' + lore: + - '&5Pointy end towards the enemy!' +pirate_ship_tier_25_sword: + name: '&aPirate cutlass' + lore: + - '&aTruly piratey!' +pirate_ship_tier_30_miniboss_axe: + name: '&5Crushy''s Chopper' + lore: + - '&5Step back!' +pirate_ship_tier_30_miniboss_shield: + name: '&5Crushy''s Shoulder' + lore: + - '&5Never skipped shoulder day!' +pirate_ship_tier_35_boots: + name: '&9Pirate boots' + lore: + - '&9Perfect for swashbuckling!' +pirate_ship_tier_35_bow: + name: '&9Pirate handcannon' + lore: + - '&9Blast em away!' +pirate_ship_tier_35_chestplate: + name: '&9Pirate straps' + lore: + - '&9Perfect for looting!' +pirate_ship_tier_35_helmet: + name: '&9Pirate eyepatch' + lore: + - '&9Not perfect for seeing!' +pirate_ship_tier_35_leggings: + name: '&9Pirate greaves' + lore: + - '&9Perfect for looting!' +pirate_ship_tier_35_miniboss_boots: + name: '&9Bodyguard''s boots' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_chestplate: + name: '&5Bodyguard''s straps' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_crossbow: + name: '&5Bodyguard''s handcannon' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_helmet: + name: '&5Bodyguard''s eyepatch' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_leggings: + name: '&5Bodyguard''s greaves' + lore: + - '&9For those with something to defend!' +pirate_ship_tier_35_miniboss_sword: + name: '&5Bodyguard''s cutlass' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_sword: + name: '&9Pirate cutlass' + lore: + - '&9Truly piratey!' +pirate_ship_tier_40_miniboss_crossbow: + name: '&5The Blunderbuss' + lore: + - '&5Spray ''n pray!' +pirate_ship_tier_40_miniboss_leggings: + name: '&5The Zaggers' + lore: + - '&5When they think you''re going!' + - '&5to zig, zag on them!' +pirate_ship_tier_45_boss_helmet: + name: '&5Captain''s eyepatch' + lore: + - '&5I don''t see any issues!' +pirate_ship_tier_45_boss_sword: + name: '&5Captain''s scimitar' + lore: + - '&5En garde, ye scurvy rats!' +the_ruins_boss_loot: + name: '&6Thor''s Axe' + lore: + - Only the pure of heart + - can wield this axe. +sewer_drowned_kings_boots: + name: '&4Drowned King''s Boots' + lore: + - '&cFormerly the boots of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_chestplate: + name: '&4Drowned King''s Chestplate' + lore: + - '&cFormerly the chestplate of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_crown: + name: '&4Drowned King''s Crown' + lore: + - '&cFormerly the crown of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_leggings: + name: '&4Drowned King''s Leggings' + lore: + - '&cFormerly the leggings of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_trident: + name: '&4Drowned King''s Trident' + lore: + - '&cFormerly the trident of the' + - '&cdevilish Drowned King!' +sewer_spelunkers_boots: + name: '&2Sewer Spelunker''s Boots' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential leggings!' +sewer_spelunkers_chestplate: + name: '&2Sewer Spelunker''s Chestplate' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential chestplate!' +sewer_spelunkers_helmet: + name: '&2Sewer Spelunker''s Helmet' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential helmet!' +sewer_spelunkers_leggings: + name: '&2Sewer Spelunker''s Leggings' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential leggings!' +sewer_spelunkers_sword: + name: '&2Sewer Spelunker''s Sword' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential sword!' +the_stinger: + name: '&eThe Stinger' + lore: + - '&aFloat like a butterfly,' + - '&asting like a bee!' +tree_defender_drop_shield: + name: '&7Living Wood Shield' + lore: + - '&7This shield will' + - '&7slowly repair itself.' +unbind_scroll: + name: '&5Unbind Scroll' + lore: + - '&5Allows users to unbind one' + - '&5soulbound item at an anvil!' + - '&5Use wisely!' +undead_farmer_drop_shovel: + name: '&8Manure Master' + lore: + - '&8Perfect for shoveling pig manure.' +unwanted_visitor_drop_bow: + name: '&1Frost Bow' + lore: + - '&9Makes you wanna chill' + - '&9and snipe from afar.' +vampire_manor_gargoyle_granulator: + name: '&8Gargoyle Granulator' + lore: + - '&cLightly dusted in garlic.' +vampire_manor_stake_your_claim: + name: '&4Stake your Claim' + lore: + - '&cLightly dusted in garlic.' +vampiric_charm: + name: '&bVampiric Charm' + lore: + - '&aNo one can remember where this' + - '&acame from, and no one can,' + - '&aforget how dangerous it is...' +veterans_boots: + name: '&6Veteran''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_chestplate: + name: '&6Veteran''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_helmet: + name: '&6Veteran''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_leggings: + name: '&6Veteran''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_sword: + name: '&6Veteran''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +vex_top_drop_boots: + name: '&bVexed Boots' + lore: + - '&bWith mighty boots' + - '&bcomes mighty strength.' +warlock_drop_chestplate: + name: '&dWarlock Robes' + lore: + - '&dOffers good protection from spells.' +warlock_drop_helmet: + name: '&dWarlock Hood' + lore: + - '&dOffers good protection from spells.' +water_pest_drop_shield: + name: '&bWater Logged Shield' + lore: + - '&bIt''s pretty sturdy actually.' +wendigo_drop_sword: + name: '&8Blade of Starving' + lore: + - '&8This blade will always' + - '&8hunger for more blood.' +werehare_drop_charm: + name: '&eWerehare Trophy' + lore: + - '&eLuck and health to' + - 'ðose who carry it.' +werewolf_bone: + name: '&6Werewolf Bone' + lore: + - '&aHaving killed the alpha,' + - '&athis temporarily makes you!' + - '&athe wolves'' new leader' +wolfsbane: + name: '&7Wolfsbane' + lore: + - '&aMade from the remains of' + - '&aan alpha werewolf, all' + - '&awolves cower at the sight of it.' +yeti_drop_leggings: + name: '&eFur Leggings' + lore: + - '&eNice and warm.' +yezhi_baba_drop_boots: + name: '&aWitches Robes' + lore: + - '&aThe smell should go' + - '&aaway eventually.' +zombie_kings_axe: + name: '&4Zombie King''s Axe' + lore: + - The axe of the one Zombies + - call their king. + - The bloodlust is palpable. +airship_minidungeon: + name: '&6The Airship' + customInfo: + - '&fAn awesome airship full of undead pirates!' + - '&6Credits: MagmaGuy, 69OzCanOfBepis' + - '&6and Realm of Lotheridon' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &6An awesome airship full of undead pirates + &6for experienced players! + regionEnterMessage: '&8[EM] &cEntering hostile air zone!' + regionLeaveMessage: '&8[EM] &cLeaving hostile air zone!' +binder_of_worlds_lair: + name: '&5Binder Of Worlds' + customInfo: + - '&5The ultimate challenge. Be prepared!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Nightmare + $bossCount level $highestTier final boss! + &5This is the hardest fight in EliteMobs! + regionEnterMessage: '&8[EM] &5Reality unravels around you. You face the final challenge. &4You are not prepared!' + regionLeaveMessage: '&8[EM] &5You have left the unravelling. Did you find what you sought? Was it worth it?' +catacombs_lair: + name: '&8The Catacombs' + customInfo: + - '&fThe best starter dungeon for players!' + - '&6Credits: Realm of Lotheridon' + playerInfo: |- + Difficulty: &cHard + $bossCount bosses, from tier $lowestTier to $highestTier + &2The best Lair challenge for groups of beginners! + regionEnterMessage: '&8[EM] &8Now entering the Catacombs. Be careful with what dwells below...' + regionLeaveMessage: '&8[EM] &8You have left the Catacombs. Was it worth it?' +colosseum_lair: + name: '&6The Colosseum' + customInfo: + - '&fFeaturing the first true World boss, first' + - '&fmulti-phased battle, first mounted boss,' + - '&ffirst disguised boss... a truly epic fight!' + - '&6Credits: MagmaGuy & Maldini' + playerInfo: |- + Difficulty: &cHard + $bossCount bosses, from level $lowestTier to $highestTier + &cA true challenge for big groups of players! + regionEnterMessage: '&8[EM] &6Champions and challengers prepare! &eProve your worth against the most mighty of foes!' + regionLeaveMessage: '&8[EM] &6Farewell traveller! &eReturn soon to show your might once more!' +dark_cathedral_lair: + name: '&8The Dark Cathedral' + customInfo: + - '&fThe first ever EliteMobs Lair!' + - '&fA classic that all servers need!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &cHard + $bossCount level $highestTier Big Boss! + &cThe original minidungeon, a challenge for + &ca group of players or for veterans! + regionEnterMessage: '&8[EM] &8Welcome to the Dark Cathedral. &4Death awaits inside...' + regionLeaveMessage: '&8[EM] &8Now leaving the Dark Cathedral. &4It awaits your return...' +dark_spire_minidungeon: + name: '&8The Dark Spire' + customInfo: + - '&fThe first ever high level content!' + - '&fMade for those who want a real challenge!' + - '&6Credits: 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &cA vast challenge for advanced players! + regionEnterMessage: '&8[EM] &1An invasion is in progress. &9Stop the insurrection!' + regionLeaveMessage: '&8[EM] &1You managed to hold them back. &9For now...' +fireworks_lair: + name: '&aFireworks' + customInfo: + - '&fThe 2021 4th of July map!' + - '&6Credits: MagmaGuy' + playerInfo: |- + Difficulty: &cHard + $bossCount level $lowestTier Big Boss! + &6An encounter full of explosions! + regionEnterMessage: '&8[EM] &eWelcome to the fireworks show!' + regionLeaveMessage: '&8[EM] &eYou''ve left the party!' +frost_palace_sanctum: + name: Frost Palace + customInfo: + - '&fA 7 phase fight against' + - the queen of ice! + - '&6Credits: MagmaGuy, Delio' + playerInfo: 'Difficulty: &45-man hard content!' + regionEnterMessage: '&bYou are stepping into the Frost Palace! Stay frosty!' + regionLeaveMessage: '&bYou have left the Frost Palace!' +hallosseum_lair: + name: '&cHallosseum' + customInfo: + - '&fThe 2020 spooky halloween encounter!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &chard + $bossCount level $lowestTier Big Boss! + &6A fun Halloween challenge! + regionEnterMessage: '&8[EM] &4Trick or treat! &8Your soul is mine!' + regionLeaveMessage: '&8[EM] &4You''ve escaped with your soul intact.' +invasion_minidungeon: + name: '&2The Invasion' + customInfo: + - '&fThe Halloween Minidungeon!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount aliens, from level $lowestTier to $highestTier + &6Don't get abducted! + regionEnterMessage: '&8[EM] &7Alien invasion in progress! Defeat the Mothership!' + regionLeaveMessage: '&8[EM] &7You have escaped the alien abductions! No one will ever believe you.' +north_pole_minidungeon: + name: '&9The North Pole' + customInfo: + - '&fThe Christmas minidungeon!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &6Christmas in a snow globe! + regionEnterMessage: '&8[EM] &7You have reached the North Pole! &fHave you been naughty this year?' + regionLeaveMessage: '&8[EM] &7Come back and visit. &fThere are plenty of sweets and treats for next time!' +oasis_adventure: + name: '&6The Oasis' + customInfo: + - '&fA massive adventure for beginners!' + - '&6Credits: 69OzCanOfBepis' + playerInfo: |- + Difficulty: &2Solo-able + $bossCount bosses, from level $lowestTier to $highestTier + &6A big adventure for people who know the ropes! + regionEnterMessage: '&8[EM] &6You have arrived at the Oasis!' + regionLeaveMessage: '&8[EM] &6You have left the Oasis!' +pirate_ship_minidungeon: + name: '&6The Pirate Ship' + customInfo: + - '&fA fun, challenging minidungeon full of' + - '&fbosses made for players starting to get good,' + - '&fat EliteMobs!' + - '&6Credits: MagmaGuy & Realm of Lotheridon' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &6One of the best hunting grounds for&6aspiring adventurers! + regionEnterMessage: '&8[EM] &3Now boarding the Pirate Ship! &bPillage and plunder to yer'' hearts content!' + regionLeaveMessage: '&8[EM] &3Player overboard! &bReturn when you''ve earned your sea-legs ye'' landlubber!' +primis_adventure: + name: '&7Primis' + customInfo: + - '&fA tutorial adventure for new players!' + - '&6Credits: 69OzCanOfBepis, MagmaGuy' + playerInfo: |- + Difficulty: &2Easy + $bossCount bosses, from level $lowestTier to $highestTier + &6A tutorial adventure for new players! + regionEnterMessage: '&8[EM] &6Primis awaits, strike the earth!' + regionLeaveMessage: '&8[EM] &6You have left Primis!' +sewers_minidungeon: + name: '&8The Sewers' + customInfo: + - '&fThe biggest minidungeon ever made!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &6A complex dungeon maze with a challenging sections! + regionEnterMessage: '&8[EM] &5This place looks abandoned... &dYet something lurks in these sewers!' + regionLeaveMessage: '&8[EM] &5You managed to stay above water. &dMaybe next time you''ll drown.' +the_ruins: + name: '&6The Ruins' + customInfo: + - '&fA fight against a myth from' + - '&fNorse mythology, be prepared for a smiting!' + - '&6Credits: 69OzCanOfBepis, MagmaGuy' + playerInfo: |- + Difficulty: &cHard + $bossCount level $lowestTier Big Boss! + &cA tough fight against a Norse god! + regionEnterMessage: '&8[EM] &3Those who challenge the myths must be prepared for their downfall!' + regionLeaveMessage: '&8[EM] &3You now know what it takes to make a legend!' +vampire_manor: + name: '&cThe Vampire Manor' + customInfo: + - '&fPrepare to spill blood!' + - '&6Credits: MagmaGuy, 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &6A deadly manor full of blood thristy creatures! + &6Are you ready to face that which haunts the night? + regionEnterMessage: '&8[EM] &cTrespassing on dangerous grounds!!' + regionLeaveMessage: '&8[EM] &cNow leaving haunted land!' +alpha_werewolf_p1: + name: '$eventBossLevel &7Enraged Vindicator' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Alpha Wolf has been put down!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&7Enraged Vindicator: $distance blocks away!' + spawnMessage: '&cThe howls of an Alpha Werewolf are heard!' + deathMessage: '&aThe Alpha Werewolf has been stopped by $players!' + escapeMessage: '&4Dawn breaks, the Alpha Wolf vanishes without a trace!' +alpha_werewolf_p2: + name: '$eventBossLevel &7Alpha Werewolf' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Alpha Wolf has been put down!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&7Alpha Wolf: $distance blocks away!' + spawnMessage: '&cThe howls of an Alpha Werewolf are heard!' + deathMessage: '&aThe Alpha Werewolf has been stopped by $players!' + escapeMessage: '&4Dawn breaks, the Alpha Wolf vanishes without a trace!' +ancient_corpse: + name: '$eventBossLevel &eAncient Corpse' +animated_armor: + name: '$eventBossLevel &8Animated Armor' + locationMessage: '&cAnimated Armor: $distance blocks away!' + spawnMessage: '&cOh no! An Animated Armor has escape from it''s armor stand!' + deathMessage: '&aThe Animated Armor was stopped by $players!' + escapeMessage: '&4The Animated Armor is gone!' +arachnid_matriarch: + name: '$eventBossLevel &cArachnid Matriarch' + locationMessage: '&cArachnid Matriarch: $distance blocks away!' + spawnMessage: '&cA Matriarch has come to spread her brood across the land!' + deathMessage: '&aThe Matriarch and her brood were stopped by $players!' + escapeMessage: '&4The Matriarch has left!' +arachnid_matriarch_summon: + name: '$eventBossLevel &4Broodling' +armor_goblin: + name: '$eventBossLevel &3Armor Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Armor Goblin has been pillaged!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cArmor Goblin: $distance blocks away!' + spawnMessage: '&cAn Armor Goblin has been sighted!' + deathMessage: '&aAn Armor Goblin has been slain by $players!' + escapeMessage: '&4An Armor Goblin has escaped!' +baba_rhoga: + name: '$eventBossLevel &cBaba Rhoga' + locationMessage: '&cBaba Rhoga: $distance blocks away!' + spawnMessage: '&cA wicked hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +baba_rhoga_summon: + name: '$reinforcementLevel &4Baba Rhoga' +baba_yaga: + name: '$eventBossLevel &cBaba Yaga' + locationMessage: '&cBaba Yaga: $distance blocks away!' + spawnMessage: '&cA wicked hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +baba_yaga_summon: + name: '$reinforcementLevel &4Baba Yaga' +balloon_rider: + name: '$eventBossLevel &dBalloon Rider' + locationMessage: '&cBalloon Rider: $distance blocks away!' + spawnMessage: '&cA brave Balloon Rider has come to the Nether!' + deathMessage: '&aThe Balloon Rider has taken his last ride thanks to $players!' + escapeMessage: '&4The Balloon Rider has floated away!' +balloon_rider_mount: + name: '$eventBossLevel &5Ghastly Balloon' +balrog: + name: '$eventBossLevel &4Balrog' +banshee: + name: '$eventBossLevel &cBanshee' + locationMessage: '&cBanshee: $distance blocks away!' + spawnMessage: '&cA Banshee''s wail can be heard!' + deathMessage: '&aThe Banshee was silenced by $players!' + escapeMessage: '&4The Banshee has left!' +banshee_summon: + name: '$eventBossLevel &cGrief' +beast_master: + name: '$eventBossLevel &6Beast Master' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Beast Master has been savaged!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cBeast Master: $distance blocks away!' + spawnMessage: '&cThe Beast Master has been sighted!' + deathMessage: '&aThe Best Master has been slain by $players!' + escapeMessage: '&4The Beast Master has returned to the wilds!' +beast_tamer: + name: '$eventBossLevel &eBeast Tamer' + locationMessage: '&cBeast Tamer: $distance blocks away!' + spawnMessage: '&cA master of beasts roams the world!' + deathMessage: '&aThe Beast Tamer was stopped by $players!' + escapeMessage: '&4The Beast Tamer has left!' +beast_tamer_summon: + name: '$eventBossLevel &6Large Beast' +beast_tamer_summon_1: + name: '$eventBossLevel &6Beast' +beta_wolf: + name: '$reinforcementLevel &7Beta Wolf' +bigfoot: + name: '$eventBossLevel &fBigfoot' + locationMessage: '&cBigfoot: $distance blocks away!' + spawnMessage: '&cA mighty beast has appeared!' + deathMessage: '&aThe beast is no more thanks to $players!.' + escapeMessage: '&4The beast has escaped!' +big_bad_wolf: + name: '$eventBossLevel &fBig Bad Wolf' + locationMessage: '&cBig Bad Wolf: $distance blocks away!' + spawnMessage: '&cAnd he huffed and he puffed!' + deathMessage: '&aThe little piggies are now safe thanks to $players!' + escapeMessage: '&4The Big Bad Wolf has left!' +binder_of_worlds_phase_1_endermite_reinforcement: + name: '$reinforcementLevel &5Reality Corruptor' +binder_of_worlds_phase_3_enderman_reinforcement: + name: '$reinforcementLevel &5Reality Slayer' +binder_of_worlds_phase_3_ghast_reinforcement: + name: '$reinforcementLevel &5Reality Shredder' +blayyze: + name: '$eventBossLevel &6Blayyze' + deathMessages: + - '&e&l---------------------------------------------' + - '&6The Blayyze has been repelled!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&6????: $distance blocks away' + spawnMessage: '&cSomething came out of the meteorite''s crater...' + deathMessage: '&6$players completed first contact.' + escapeMessage: '&6The ayyliens have been taken to area 51!' +bloated_jeffrey: + name: '$eventBossLevel &dBloated Jeffrey' + locationMessage: '&cBloated Jeffrey: $distance blocks away!' + spawnMessage: '&cIt''s Jeffrey! They are in the nether! Bring a bow!' + deathMessage: '&aBloated Jeffrey has been slain by $players!' + escapeMessage: '&4Jeffrey and his friends grew bored and they left!' +bloated_jeffrey_summon: + name: '$eventBossLevel &dJeffrey''s Friend' +bone_fiend: + name: '$eventBossLevel &7Bone Fiend' + locationMessage: '&cBone Fiend: $distance blocks away!' + spawnMessage: '&cA creature of bone and bone has appeared!' + deathMessage: '&aThe Bone Fiend was defeated by $players!' + escapeMessage: '&4The Bone Fiend found no bone and left!' +bone_fiend_mount: + name: '$eventBossLevel &8Bone Carrier' +changeling: + name: '$eventBossLevel &4Changeling' + locationMessage: '&cChangeling: $distance blocks away!' + spawnMessage: '&cA shape-shifter has entered this world.' + deathMessage: '&aThe Changeling was stopped by $players!' + escapeMessage: '&4The Changeling has escaped!' +changeling_p2: + name: '$eventBossLevel &4Changeling' +changeling_p3: + name: '$eventBossLevel &4Changeling' +changeling_p4: + name: '$eventBossLevel &4Changeling' +changeling_p5: + name: '$eventBossLevel &4Changeling' +changeling_p6: + name: '$eventBossLevel &4Changeling' +changeling_p7: + name: '$eventBossLevel &4Changeling' +charms_goblin: + name: '$eventBossLevel &2Charms Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Charms Goblin has been pillaged!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cCharms Goblin: $distance blocks away!' + spawnMessage: '&cA Charms Goblin has been sighted!' + deathMessage: '&aA Charms Goblin has been slain by $players!' + escapeMessage: '&4A Charms Goblin has escaped!' +circus_ringmaster: + name: '$eventBossLevel &dRingmaster' + locationMessage: '&cCircus Ringmaster: $distance blocks away!' + spawnMessage: '&cA terrible circus is in town!' + deathMessage: '&a$players has stopped the RIngmasters reign of abuse!' + escapeMessage: '&4The circus has left town!' +circus_ringmaster_summon: + name: '$eventBossLevel &5Tortured Animal' +circus_ringmaster_summon_1: + name: '$eventBossLevel &5Abused Clown' +circus_ringmaster_summon_2: + name: '$eventBossLevel &5Mistreated Balloon' +coins_goblin: + name: '$eventBossLevel &eCoins Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Coins Goblin has been pillaged!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cCoins Goblin: $distance blocks away!' + spawnMessage: '&cA Coins Goblin has been sighted!' + deathMessage: '&aA Coins Goblin has been slain by $players!' + escapeMessage: '&4A Coins Goblin has escaped!' +craftenmine_stacked_bones: + name: '$eventBossLevel &eArmed Skull' + locationMessage: '&cDr. Craftenmine''s Stacked Bones: $distance blocks away!' + spawnMessage: '&cA horrible Dr. Craftenmine creation is out in the wild!' + deathMessage: '&aThe horrible Stacked-Bones creation was slain by $players!' + escapeMessage: '&4Dr. Craftenmines horrible creation has escaped!' +craftenmine_stacked_bones_ankle: + name: '$eventBossLevel &6Armed Ankle' +craftenmine_stacked_bones_backbone: + name: '$eventBossLevel &6Armed Backbone' +craftenmine_stacked_bones_femur: + name: '$eventBossLevel &6Armed Femur' +craftenmine_stacked_bones_spine: + name: '$eventBossLevel &6Armed Spine' +craftenmine_terror: + name: '$eventBossLevel &cLobotimized Ghast' + locationMessage: '&cDr. Craftenmine''s Terror: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine creation is on the loose!' + deathMessage: '&aThe Lobotimized Ghast was slain by $players!' + escapeMessage: '&4The Lobotimized Ghast has left!' +craftenmine_terror_mount: + name: '$eventBossLevel &dGhast Carrier' +creeperpede_1: + name: '$eventBossLevel &5Creeperpede Observer' + locationMessage: '&cCreeperpede: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine experiment is on the loose!' + deathMessage: '&aThe Creeperpede was stopped in its tracks by $players!.' + escapeMessage: '&4AThe Dr. Craftenmine experiment has managed to escape!' +creeperpede_2: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_3: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_4: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_5: + name: '$eventBossLevel &5Creeperpede Carrier' +crone: + name: '$eventBossLevel &aOld Crone' + locationMessage: '&cOld Crone: $distance blocks away!' + spawnMessage: '&cAn Old Crone has wandered into this world!' + deathMessage: '&aThe Crone was vanquished by $players!.' + escapeMessage: '&4The Old Crone has left this world on her broom!' +crone_summon: + name: '$eventBossLevel &fPet Spider' +divine_cinder: + name: '$eventBossLevel &cDivine Cinder' + locationMessage: '&cDivine Cinder: $distance blocks away!' + spawnMessage: '&cA divine blaze has appeared!' + deathMessage: '&aThe Divine Cinder was defeated by $players!' + escapeMessage: '&4The Divine Cinder has smoked away!' +ember: + name: '$reinforcementLevel &cEmber' +enders_1: + name: '$eventBossLevel &dEnderlad' + locationMessage: '&cEnder Clique: $distance blocks away!' + spawnMessage: '&cA group of ender troublemakers have appeared.' + deathMessage: '&aThe Ender Clique was stopped by $players!' + escapeMessage: '&4The Ender Clique have left!' +enders_2: + name: '$eventBossLevel &dEnderchap' + locationMessage: '&cClique Member: $distance blocks away!' +enders_3: + name: '$eventBossLevel &dEnderdude' + locationMessage: '&cClique Member: $distance blocks away!' +ender_lapin: + name: '$eventBossLevel &aEnder Lapin' +endless_pursuer: + name: '$eventBossLevel &dEndless Pursuer' + locationMessage: '&cEndless Pursuer: $distance blocks away!' + spawnMessage: '&cIt will not stop chasing...' + deathMessage: '&aThe chase has stopped thanks to $players!' + escapeMessage: '&4The Pursuer has vanished!' +enraged_snowman: + name: '$eventBossLevel &1Enraged Snowman' + locationMessage: '&cEnraged Snowman: $distance blocks away!' + spawnMessage: '&cAn angry Snowman was sighted!' + deathMessage: '&aThe Enraged Snowman was put to rest by $players!' + escapeMessage: '&4The Enraged Snowman has vanished!' +evil_undead: + name: '$eventBossLevel &cEvil Undead' + locationMessage: '&cEvil Undead: $distance blocks away!' + spawnMessage: '&cAn Evil Undead has appeared!' + deathMessage: '&aThe Evil Undead was put to rest by $players!' + escapeMessage: '&4The Evil Undead has escaped!' +evil_undead_p2: + name: '$eventBossLevel &cEvil Undead' + locationMessage: '&cEvil Undead: $distance blocks away!' + spawnMessage: '&cAn Evil Undead has appeared!' + deathMessage: '&aThe Evil Undead was put to rest by $players!' + escapeMessage: '&4The Evil Undead has escaped!' +fallen_knight: + name: '$eventBossLevel &7Fallen Knight' + locationMessage: '&cFallen Knight: $distance blocks away!' + spawnMessage: '&cA Fallen Knight rises from their grave!' + deathMessage: '&aA Fallen Knight has fallen to $players!.' + escapeMessage: '&4The Fallen Knight goes back to slumber!' +fine_swine: + name: '$eventBossLevel &eFine Swine' +fine_swine_summon: + name: '$eventBossLevel &eMighty Protector' +firestarter: + name: '$eventBossLevel &6Firestarter' + locationMessage: '&cFirestarter: $distance blocks away!' + spawnMessage: '&cA wicked Firestarter has appeared!' + deathMessage: '&aThe Firestarter was slain by $players!' + escapeMessage: '&4The Firestarter has left!' +firestarter_mount: + name: '$eventBossLevel &6Spark' +fire_conjurer: + name: '$eventBossLevel &eFire Conjurer' + locationMessage: '&cFire Conjurer: $distance blocks away!' + spawnMessage: '&cA master of fire and flame walks this world!' + deathMessage: '&aThe Fire Conjurer was extinguished by $players!' + escapeMessage: '&4The Fire Conjurer has vanished!' +fire_conjurer_summon: + name: '$eventBossLevel &6Summoned Flame' +fire_fae: + name: '$eventBossLevel &cFire Fae' +foreign_visitor: + name: '$eventBossLevel &5Foreign Visitor' + locationMessage: '&cForeign Visitor: $distance blocks away!' + spawnMessage: '&cA visitor from a another dimension has arrived!' + deathMessage: '&a$players has made sure to let the visitor know that they are not welcome here.' + escapeMessage: '&4The visitor has gone back home!' +fox_king_cold: + name: '$eventBossLevel &1Fox King Cold' + locationMessage: '&cFox King Cold: $distance blocks away!' + spawnMessage: '&cA magical creature roams the world.' + deathMessage: '&aFox King Cold was defeated by $players!' + escapeMessage: '&4Fox King Cold has left this world.' +frost_palace_frost_queen_p0: + name: '$bossLevel &8Frost Queen' + locationMessage: '&9Frost Queen' + spawnMessage: '&9The wind howls. The Frost Queen rises up to the challenge.' + deathMessage: '&aThe Frost queen is no more, slain by $players!' +frost_palace_frost_queen_p1: + name: '$bossLevel &8Frost Queen phase 1' + locationMessage: '&9Frost Queen phase 1' +frost_palace_frost_queen_p2: + name: '$bossLevel &8Frost Queen phase 2' + locationMessage: '&9Frost Queen phase 2' +frost_palace_frost_queen_p3: + name: '$bossLevel &8Frost Queen phase 3' + locationMessage: '&9Frost Queen phase 3' +frost_palace_frost_queen_p4: + name: '$bossLevel &8Frost Queen phase 4' + locationMessage: '&9Frost Queen phase 4' +frost_palace_frost_queen_p5: + name: '$bossLevel &8Frost Queen phase 5' + locationMessage: '&9Frost Queen phase 5' +frost_palace_frost_queen_p6: + name: '$bossLevel &8Frost Queen phase 6' + locationMessage: '&9Frost Queen phase 6' +frost_palace_frost_queen_p7: + name: '$bossLevel &8Frost Queen phase 7' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Frost Queen was thawed!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&9Frost Queen phase 7' +frost_palace_reinforcement_1: + name: '$reinforcementLevel Spirit of Winter' +frost_palace_reinforcement_2: + name: '$reinforcementLevel Spirit of Spring' +frost_palace_reinforcement_3: + name: '$reinforcementLevel Spirit of Summer' +fulgora: + name: '$eventBossLevel &3Fulgora' + locationMessage: '&cFulgora: $distance blocks away!' + spawnMessage: '&cA mighty thunder goat has come!' + deathMessage: '&aFulgora was stopped by $players!' + escapeMessage: '&4Fulgora has left this place!' +gamma_werewolf: + name: '$reinforcementLevel &7Gamma Werewolf' +goblin_invader: + name: '$eventBossLevel &2Goblin Leader' + locationMessage: '&cGoblin Army: $distance blocks away!' + spawnMessage: '&cA Goblin Army has invaded this realm!' + deathMessage: '&aThe Goblin Army has been vanquished by $players!' + escapeMessage: '&4The Goblin Army is done with this realm!' +goblin_invader_summon_1: + name: '&2Goblin Warrior' +goblin_invader_summon_2: + name: '&2Goblin Fighter' +goblin_invader_summon_3: + name: '&2Goblin Trooper' +goblin_invader_summon_4: + name: '&2Goblin Reinforcements' +greedy_dwarf: + name: '$eventBossLevel &9Greedy Dwarf' + locationMessage: '&cGreedy Dwarf: $distance blocks away!' + spawnMessage: '&cCan you find the Greedy Dwarf digging somewhere underground?!' + deathMessage: '&aThe Greedy Dwarf was released of their curse by $players!' + escapeMessage: '&4The Greedy Dwarf had found their treasure and they left!' +gremlin_1: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + spawnMessage: '&cA Gremlin hoard has invaded this world!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_10: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_2: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_3: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_4: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_5: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_6: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_7: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_8: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_9: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +grunter: + name: '$eventBossLevel &aGrunter' + locationMessage: '&cGrunter: $distance blocks away!' + spawnMessage: '&cA mighty hog roams the lands.' + deathMessage: '&aGrunter was stopped by $players!' + escapeMessage: '&4Grunter has escaped!' +harmless_chicken: + name: '$eventBossLevel &fHarmless Chick' + locationMessage: '&cHarmless Chick: $distance blocks away!' + spawnMessage: '&cBwok!!! Cluck, Cluck! Bawk!' + deathMessage: '&aBaaaawk! Cluck...$players!' + escapeMessage: '&4Harmless Chicken has baaaaaawked away.' +harmless_chicken_summon: + name: '$eventBossLevel &fClucktector' +hog_rider: + name: '$eventBossLevel &6Hog Rider' + locationMessage: '&cHog Rider: $distance blocks away!' + spawnMessage: '&cA mighty Hog Rider has appeared!' + deathMessage: '&aThe Hog Rider and their Hog were vanquished by $players!' + escapeMessage: '&4The Hog Rider has vanished.' +hog_rider_mount: + name: '$eventBossLevel &eLoyal Hog' +hog_rider_p2: + name: '$eventBossLevel &6Hog Rider' + locationMessage: '&cHog Rider: $distance blocks away!' + deathMessage: '&aThe Hog Rider and their Hog were vanquished by $players!' + escapeMessage: '&4The Hog Rider has vanished.' +hog_rider_summon: + name: '$eventBossLevel &eLoyal Zob-Hog' +horde_champion: + name: '$eventBossLevel &cHorde Champion' + locationMessage: '&cUndead Horde Champion: $distance blocks away!' + spawnMessage: '&cAn undead horde approaches!' + deathMessage: '&aThe horde has been stopped by $players!.' + escapeMessage: '&4AThe undead horde has left!' +horrid_duplicator: + name: '$eventBossLevel &dHorrid Duplicator' + locationMessage: '&cHorrid Duplicator: $distance blocks away!' + spawnMessage: '&cAn endless foe has appeared!' + deathMessage: '&aThe Horrid Duplicator was slain by $players!' + escapeMessage: '&4The Horrid Duplicator has left!' +horrid_duplicator_summon: + name: '$eventBossLevel &dHorrid Duplicator' +horrid_duplicator_summon_1: + name: '$eventBossLevel &dHorrid Duplicator' +ice_fae: + name: '$eventBossLevel &bIce Fae' +imperial_bee_guard: + name: '$reinforcementLevel &eImperial Bee Soldier' +invasion_abducted_hoglin_leader: + name: '$normalLevel &8Abducted Hoglin Leader' +invasion_abducted_pillager_leader: + name: '$normalLevel &8Abducted Pillager Leader' +invasion_abducted_silverfish: + name: '$normalLevel &8Abducted Silverfish' +invasion_abducted_silverfish_leader: + name: '$normalLevel &8Abducted Silverfish' +invasion_abducted_zombie: + name: '$normalLevel &8Abducted Zombie' +invasion_abducted_zombie_leader: + name: '$normalLevel &8Abducted Zombie' +invasion_abductor: + name: '$normalLevel &6Abductor' +invasion_abudcted_pillager: + name: '$normalLevel &8Abducted Pillager' +invasion_analytic_thin_man_1: + name: '$normalLevel &8Analytic Thin Man' +invasion_analytic_thin_man_2: + name: '$normalLevel &8Analytic Thin Man' +invasion_analytic_thin_man_3: + name: '$normalLevel &8Analytic Thin Man' +invasion_analytic_thin_man_4: + name: '$normalLevel &8Analytic Thin Man' +invasion_ballistic_construct: + name: '$minibossLevel &fBallistic Construct' +invasion_convert: + name: '$normalLevel &6Convert' +invasion_energy_construct: + name: '$minibossLevel &fEnergy Construct' +invasion_fire_construct: + name: '$minibossLevel &fFire Construct' +invasion_genetically_modified_cow_phase_1: + name: '$minibossLevel &fGenetically Modified Cow' +invasion_genetically_modified_cow_phase_2: + name: '$minibossLevel &fGenetically Modified Cow' +invasion_gray_man_courthouse_phase_1: + name: '$minibossLevel &7Gray Man' +invasion_gray_man_courthouse_phase_2: + name: '$minibossLevel &7Gray Man' +invasion_green_man_hotel_phase_1: + name: '$bossLevel &2Green Man' +invasion_green_man_hotel_phase_2: + name: '$bossLevel &2Green Man' +invasion_green_man_hotel_phase_3: + name: '$bossLevel &2Green Man' + deathMessage: '&4The &2Green Man &4was vanquished by $players! That''s the end for this version of the map, the inside of the UFO is in the full version!' +invasion_green_man_spaceship_phase_1: + name: '$bossLevel &2Green Man' +invasion_green_man_spaceship_phase_2: + name: '$bossLevel &2Green Man' +invasion_green_man_spaceship_phase_3: + name: '$bossLevel &2Green Man' +invasion_green_man_spaceship_phase_4: + name: '$bossLevel &2Green Man' + deathMessages: + - '&e&l---------------------------------------------' + - '&2The Alien menace is no more!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' +invasion_ice_construct: + name: '$minibossLevel &fIce Construct' +invasion_merman: + name: '$normalLevel &6Merman' +invasion_merman_leader: + name: '$normalLevel &6Merman Leader' +invasion_otherwordly_ember: + name: '$normalLevel &6Otherworldly Ember' +invasion_psychic_apparition: + name: '$normalLevel &5Psychic Apparition' +invasion_psychic_clone: + name: '$reinforcementLevel &6Psychic Clone' +invasion_psychic_explosion: + name: '$reinforcementLevel &5Psychic Explosion' +invasion_psychic_summon_gold_boots: + name: '$reinforcementLevel &5Psychic Apparition' +invasion_psychic_summon_gold_pants: + name: '$reinforcementLevel &5Psychic Apparition' +invasion_psychic_summon_leather_hat: + name: '$reinforcementLevel &5Psychic Apparition' +invasion_shrieking_shulker: + name: '$normalLevel &8Shrieking Shulker' +invasion_thin_man: + name: '$normalLevel &8Thin Man' +killer_rabbit_of_caerbannog: + name: '$eventBossLevel &cKiller Rabbit of Caerbannog' +kraken: + name: '$eventBossLevel &3Kraken' +krampus: + name: '$eventBossLevel &1Krampus' + locationMessage: '&cKrampus: $distance blocks away!' + spawnMessage: '&cKrampus has come to punish the naughty!' + deathMessage: '&aKrampus has been sent back to his realm to by $players!.' + escapeMessage: '&4There was nobody to punish!' +large_hopper: + name: '$eventBossLevel &dLarge Hopper' + locationMessage: '&cLarge Hopper: $distance blocks away!' + spawnMessage: '&cA large beast is hopping around!' + deathMessage: '&aThe Large Hopper was stopped by $players!' + escapeMessage: '&4The Large Hopper has jumped out of this world!' +large_hopper_mount: + name: '$eventBossLevel &aHopper' +lightning_fae: + name: '$eventBossLevel &eLightning Fae' +living_shadow: + name: '$eventBossLevel &7Living Shadow' + locationMessage: '&cLiving Shadow: $distance blocks away!' + spawnMessage: '&cLiving Shadow has appeared! Do not look it in the yes!' + deathMessage: '&aLiving Shadow has been turned into Dead Shadow by $players!.' + escapeMessage: '&4The Living Shadow saw nothing so it left!' +meme_boss: + name: '&2The Maestro' +meme_boss_reinforcement: + name: '&cFan' +merman: + name: '$eventBossLevel &1Merman' + locationMessage: '&cMerman: $distance blocks away!' + spawnMessage: '&cA Merman swims the oceans!' + deathMessage: '&aThe Merman was slain by $players!' + escapeMessage: '&4The Merman has retreated.' +monster_of_the_deep: + name: '$eventBossLevel &bMonster of the Deep' + locationMessage: '&cMonster of the Deep: $distance blocks away!' + spawnMessage: '&cSomething terrible swims the oceans!' + deathMessage: '&aMonster of the Deep has been slain by $players!' + escapeMessage: '&4The oceans are once again safe!' +moon_spider: + name: '$eventBossLevel &fMoon Spider' + locationMessage: '&cMoon Spider: $distance blocks away!' + spawnMessage: '&cA powerful arachnid has been spotted!' + deathMessage: '&aThe Moon Spider was slain by $players!' + escapeMessage: '&4The Moon Spider has left!' +moon_spider_summon: + name: '&fSilk Mender' +necromancer: + name: '$eventBossLevel &7Necromancer' + locationMessage: '&cNecromancer: $distance blocks away!' + spawnMessage: '&cA powerful evil Necromancer has entered this world!' + deathMessage: '&aThe Necromancer is no more thanks to $players!' + escapeMessage: '&4The Necromancer has disappeared.' +necromancer_summon_1: + name: '$eventBossLevel &fFiery Bones' +necromancer_summon_2: + name: '$eventBossLevel &bChilled Bones' +necromancer_summon_3: + name: '$eventBossLevel &8Charred Bones' +necronomicon_skeleton: + name: '$reinforcementLevel &7Summoned Skeleton' +necronomicon_zombie: + name: '$reinforcementLevel &7Summoned Zombie' +netherite_golem: + name: '$eventBossLevel &8Netherite Golem' + locationMessage: '&cNetherite Golem: $distance blocks away!' + spawnMessage: '&cAn ancient golem has entered this world!' + deathMessage: '&aThe Netherite Golem was slain by $players!' + escapeMessage: '&4The Netherite Golem has left this world!' +nether_escapee: + name: '$eventBossLevel &6Nether Escapee' + locationMessage: '&cNether Escapee: $distance blocks away!' + spawnMessage: '&cA terrible foe has escaped the nether!' + deathMessage: '&aThe Nether Escapee was sent back to the nether by $players!' + escapeMessage: '&4The Nether Escapee has left this place!' +nether_hag: + name: '$eventBossLevel &4Nether Hag' + locationMessage: '&cNether Hag: $distance blocks away!' + spawnMessage: '&cAn evil hag walks the nether!' + deathMessage: '&aThe Nether Hag was slain by $players!' + escapeMessage: '&4The Nether Hag has vanished!' +nether_wasp: + name: '$eventBossLevel &6Nether Wasp' + locationMessage: '&cNether Wasp: $distance blocks away!' + spawnMessage: '&cTry not to get stung, a wasp roams the nether!' + deathMessage: '&aThe Nether Wasp was slain by $players!' + escapeMessage: '&4The Nether Wasp has decided to buzz off!' +nether_wasp_summon_1: + name: '$eventBossLevel &cHive Summoner' +nether_wasp_summon_2: + name: '$eventBossLevel &cHive Wasp' +nightwing: + name: '$eventBossLevel &cNightwing' + locationMessage: '&cNightwing: $distance blocks away!' + spawnMessage: '&cA bird of the night has appeared!' + deathMessage: '&aNightwing was stopped by $players!' + escapeMessage: '&4Nightwing has flown home.' +nightwing_summon: + name: '$eventBossLevel &cSmart Bomb' +nightwing_summon_1: + name: '$eventBossLevel &cSworn Protector' +night_crawler: + name: '$eventBossLevel &4Night Crawler' + locationMessage: '&cNight Crawler: $distance blocks away!' + spawnMessage: '&cSomething awful is crawling about!' + deathMessage: '&aThe Night Crawler has been slain by $players!' + escapeMessage: '&4The Night Crawler Undead has left!' +night_horder: + name: '$eventBossLevel &aNight Horder' + locationMessage: '&cNight Horder: $distance blocks away!' + spawnMessage: '&cA Night Horder has appeared! Slay him to loot his booty!' + deathMessage: '&aThe Night Horder has been plundered by $players!' + escapeMessage: '&4The Night Horder has escaped!' +oasis_10_old_bones: + name: '$normalLevel &fOld Bones' +oasis_10_surreptitious_scribe: + name: '$minibossLevel &7Surreptitious Scribe' +oasis_12_entombed_tenant: + name: '$normalLevel &7Entombed Tenant' +oasis_12_entombed_tenant_p2: + name: '$normalLevel &7Entombed Tenant' +oasis_12_sinister_siren: + name: '$minibossLevel &5Sinister Siren' +oasis_14_gnarly_grimace: + name: '$normalLevel &8Gnarly Grimace' +oasis_14_undead_drifter: + name: '$normalLevel &1Undead Drifter' +oasis_16_lesser_sentinel: + name: '$normalLevel &9Lesser Sentinel' +oasis_16_magical_magus: + name: '$normalLevel &3Magical Magus' +oasis_16_rancid_roamer: + name: '$normalLevel &8Rancid Roamer' +oasis_18_sly_sharpshooter: + name: '$normalLevel &eSly Sharpshooter' +oasis_18_stout_thaumaturge: + name: '$normalLevel &5Stout Thaumaturge' +oasis_18_tricky_treasure_hoarder: + name: '$normalLevel &dTricky Treasure Hoarder' +oasis_20_scheming_scribe: + name: '$minibossLevel &7Scheming Scribe' +oasis_20_septic_scribe: + name: '$minibossLevel &7Septic Scribe' +oasis_20_vampiric_sorcerer: + name: '$bossLevel &cVampiric Sorcerer' +oasis_20_wrapped_wraith: + name: '$normalLevel &8Wrapped Wraith' +oasis_20_wrapped_wraith_p2: + name: '$normalLevel &8Wrapped Wraith' +oasis_25_vampiric_warlock: + name: '$bossLevel &4Vampiric Warlock' +oasis_25_warlocks_spirit_summon: + name: '$reinforcementLevel &cWarlocks Spirit' +oasis_26_adept_sentinel: + name: '$normalLevel &1Adept Sentinel' +oasis_26_grim_grovetender: + name: '$normalLevel &aGrim Grovetender' +oasis_26_precarious_sniper: + name: '$normalLevel &3Precarious Sniper' +oasis_26_superior_sharpshooter: + name: '$normalLevel &3Superior Sharpshooter' +oasis_28_perilous_prophet: + name: '$normalLevel &3Perlious Prophet' +oasis_28_treacherous_treasure_hoarder: + name: '$normalLevel &dTreacherous Treasure Hoarder' +oasis_2_haunted_hauler: + name: '$normalLevel &9Haunted Hauler' +oasis_30_forsaken_soul: + name: '$reinforcementLevel &0Forsaken Soul' +oasis_30_lost_soul: + name: '$normalLevel Lost Soul' +oasis_30_parlous_preist: + name: '$minibossLevel &bParlous Preist' +oasis_30_seeker_of_the_staid: + name: '$normalLevel &cSeeker of the Staid' +oasis_30_wimpy_louse: + name: '$reinforcementLevel &8Loathing Louse' +oasis_32_loathing_louse: + name: '$normalLevel &8Loathing Louse' +oasis_32_skeletal_sniper: + name: '$normalLevel &9Skeletal Sniper' +oasis_34_grizly_grimace: + name: '$normalLevel &8Gnarly Grimace' +oasis_34_gruesome_grimace: + name: '$normalLevel &8Gruesome Grimace' +oasis_35_ice_eidolon: + name: '$reinforcementLevel &9Ice Eidolon' +oasis_35_light_of_darkness: + name: '$minibossLevel &9Light of Darkness' +oasis_36_cruel_cultist: + name: '$normalLevel &3Cruel Cultist' +oasis_36_cultists_cretins: + name: '$reinforcementLevel &3Cruel Cultist' +oasis_36_cultists_cretins_drowned: + name: '$reinforcementLevel &3Cruel Cultist' +oasis_36_dexterous_sentinel: + name: '$normalLevel &9Dexterous Sentinel' +oasis_36_grudging_grovetender: + name: '$normalLevel &aGrudging Grovetender' +oasis_36_parlous_sniper: + name: '$normalLevel &3Parlous Sniper' +oasis_36_rueful_roamer: + name: '$normalLevel &8Rueful Roamer' +oasis_36_spectral_magus: + name: '$normalLevel &3Spectral Magus' +oasis_38_poisonous_perch: + name: '$normalLevel &3Poisonous Perch' +oasis_38_traitorous_treasure_hoarder: + name: '$normalLevel &dTraitorous Treasure Hoarder' +oasis_40_chief_cultist: + name: '$minibossLevel &5Chief Cultist' +oasis_40_louse_lord: + name: '$minibossLevel &8Louse Lord' +oasis_40_pharaohs_scribe: + name: '$minibossLevel &7Pharaoh''s Scribe' +oasis_40_skeletal_stiff: + name: '$normalLevel &9Skeletal Stiff' +oasis_40_soaked_sacrifice: + name: '$reinforcementLevel &1Soaked Sacrifice' +oasis_40_solar_flare: + name: '$reinforcementLevel &eSolar Flare' +oasis_42_hexed_hauler: + name: '$normalLevel &9Hexed Hauler' +oasis_42_skeletal_sharpshooter: + name: '$normalLevel &9Skeletal Sharpshooter' +oasis_42_tyranical_treasure_hoarder: + name: '$normalLevel &dTyranical Treasure Hoarder' +oasis_42_tyranical_treasure_hoarder_phase_2: + name: '$normalLevel &dTyranical Treasure Hoarder' +oasis_45_golden_cast_autonomation: + name: '$reinforcementLevel &6Golden Cast Autonomation' +oasis_45_monumental_monstrosity: + name: '$bossLevel &bMonumental Monstrosity' +oasis_45_monumental_monstrosity_phase_2: + name: '$bossLevel &bMonumental Monstrosity' +oasis_45_monumental_monstrosity_phase_3: + name: '$bossLevel &6Monumental Monstrosity' +oasis_45_monumental_monstrosity_phase_4: + name: '$bossLevel &bMonumental Monstrosity' +oasis_45_oracle_of_knowledge: + name: '$minibossLevel &0Oracle of Knowledge' +oasis_45_shadow_of_knowledge_summon: + name: '$reinforcementLevel &8Shadow of Knowledge' +oasis_45_the_beacon: + name: '$minibossLevel &6The Beacon' +oasis_45_the_beacon_phase_2: + name: '$minibossLevel &6The Beacon' +oasis_45_the_beacon_phase_3: + name: '$minibossLevel &6The Beacon' +oasis_45_the_beacon_phase_4: + name: '$minibossLevel &6The Beacon' +oasis_46_pharaohs_sentinel: + name: '$normalLevel &9Pharaoh''s Sentinel' +oasis_4_cursed_desert_dweller: + name: '$normalLevel &eCursed Desert Dweller' +oasis_4_grotesque_grimace: + name: '$normalLevel &8Grotesque Grimace' +oasis_4_swamp_rat: + name: '$normalLevel &6Swamp Rat' +oasis_50_moneychanger_arrow: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_arrow_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_blindness: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_blindness_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_fire: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_fire_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_freeze: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_freeze_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_knockback: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_knockback_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_poison: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_poison_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_wither: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_wither_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_pharaohs_royal_guard: + name: '$reinforcementLevel &8Pharaoh''s Royal Guard' +oasis_50_the_foundry: + name: '$bossLevel &4The Foundry' +oasis_50_the_foundry_phase_2: + name: '$bossLevel &4The Foundry' +oasis_55_pharaoh_of_pestilence: + name: '$bossLevel &0Pharaoh of Pestilence' +oasis_6_dry_bones: + name: '$normalLevel &fDry Bones' +oasis_6_rotten_roamer: + name: '$normalLevel &8Rotten Roamer' +oasis_8_mythical_magus: + name: '$normalLevel &3Mythical Magus' +oasis_8_tough_thaumaturge: + name: '$normalLevel &5Tough Thaumaturge' +oasis_8_troublesome_treasure_hoarder: + name: '$normalLevel &dTroublesome Treasure Hoarder' +okami: + name: '$eventBossLevel &cOkami' + locationMessage: '&cOkami: $distance blocks away!' + spawnMessage: '&cA god has awakened!' + deathMessage: '&a$players has fought with a god and won!.' + escapeMessage: '&4Okami has left!' +okami_p2: + name: '$eventBossLevel &cOkami' +okami_p3: + name: '$eventBossLevel &cOkami' +omega_wolf: + name: '$reinforcementLevel &7Omega Wolf' +pillager_caravan_beast: + name: '$reinforcementLevel &cCaravan Beast' +pillager_caravan_guard: + name: '$reinforcementLevel &cCaravan Guard' +pillager_caravan_leader: + name: '$eventBossLevel &cPillager Caravan Leader' + locationMessage: '&cPillager Caravan: $distance blocks away!' + spawnMessage: '&cA pillager caravan has been sighted!' +primis_acolyte_brute: + name: '$normalLevel &bAcolyte Brute' +primis_acolyte_forest_brute: + name: '$normalLevel &bElf Bandit Brute' +primis_acolyte_forest_brute_with_watch: + name: '$normalLevel &bElf Bandit Brute' +primis_acolyte_forest_sharpshooter: + name: '$normalLevel &bElf Bandit Ranger' +primis_acolyte_forest_summoner: + name: '$normalLevel &bElf Bandit Summoner' +primis_acolyte_forest_summoner_heirloom_guardian: + name: '$normalLevel &bElf Bandit Mage' +primis_acolyte_guard_1: + name: '$normalLevel &bAcolyte Guard' + onDamagedMessages: + - You can't enter! + - The mage won't allow this! + - Leave this place! + - The mage protects this place! + - Foolishness! + - Begone! + deathMessage: '[Acolyte Guard] You are blind to the truth, the tower''s mage sees all!' +primis_acolyte_guard_2: + name: '$normalLevel &bAcolyte Guard' + onDamagedMessages: + - You can't enter! + - The mage won't allow this! + - Leave this place! + - The mage protects this place! + - Foolishness! + - Begone! + deathMessage: '[Acolyte Guard] You shall not pass, the mage in the tower will not allow it!' +primis_acolyte_sharpshooter: + name: '$normalLevel &bAcolyte Ranger' +primis_aggressive_llama: + name: '$normalLevel &6Aggressive LLama' +primis_angry_goat: + name: '$normalLevel &6Angry Goat' +primis_beta_feral_wolf: + name: '$reinforcementLevel &8Beta Feral Wolf' +primis_blood_temple_blood_golem: + name: '$normalLevel &cBlood Golem' +primis_blood_temple_charred_construct: + name: '$normalLevel &cCharred Construct' +primis_blood_temple_conjured_flame: + name: '$normalLevel &cConjured Flame' +primis_blood_temple_eradicator: + name: '$normalLevel &cEradicator' +primis_blood_temple_fire_conjurer: + name: '$normalLevel &cFire Conjurer' +primis_blood_temple_flame_elemental: + name: '$normalLevel &cFlame Elemental' +primis_catacomb_nemus_to_redwood_archer: + name: '$normalLevel &8Catacomb Archer' +primis_catacomb_nemus_to_redwood_golem: + name: '$normalLevel &bCatacomb Golem' +primis_catacomb_nemus_to_redwood_necromancer: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_nemus_to_redwood_necromancer_p1: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_nemus_to_redwood_necromancer_p2: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_nemus_to_redwood_soul_reinforcement: + name: '$reinforcementLevel &8Catacomb Soul' +primis_catacomb_nemus_to_redwood_swordsman: + name: '$normalLevel &8Catacomb Swordsman' +primis_catacomb_pontis_to_ice_archer: + name: '$normalLevel &8Catacomb Archer' +primis_catacomb_pontis_to_ice_golem: + name: '$normalLevel &bCatacomb Golem' +primis_catacomb_pontis_to_ice_necromancer_p1: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_pontis_to_ice_necromancer_p2: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_pontis_to_ice_swordsman: + name: '$normalLevel &8Catacomb Swordsman' +primis_catacomb_trio_archer: + name: '$normalLevel &8Catacomb Archer' +primis_catacomb_trio_golem: + name: '$normalLevel &bCatacomb Golem' +primis_catacomb_trio_necromancer_p1: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_necromancer_p2: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_necromancer_summon: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_swordsman: + name: '$normalLevel &8Catacomb Swordsman' +primis_crazed_rabbit: + name: '$normalLevel &cCrazed Rabbit' +primis_crystaline_summoner_p1: + name: '$normalLevel &3Crystaline Summoner' +primis_crystaline_summoner_p2: + name: '&3Crystaline Summoner' +primis_earth_temple_golem: + name: '$normalLevel &fAnimated Clay' +primis_emerald_eater: + name: '$normalLevel &aEmerald Eater' +primis_farmstead_lighthouse_keeper: + name: '$bossLevel &6The Lighthouse Keeper' + questLore: + - Something is deeply wrong with my husband. + - He used to be a loving and caring husband and father, + - but in recent times he has been focusing on documents he found in the basement. + - He said it was for important research, something that could change the world. + - I should've told him to stop when I saw how obsessed he was becoming. + - He did... something... to the lighthouse - and + - I fear the lighthouse has done something to him, too. + - It morphed him into some kind of monster. He no longer recognizes us, + - and has even attacked us when we tried to approach him. + - At night, we can't sleep due to the wailing sounds + - coming from the &dLighthouse's Basement&f. + - He is suffering, and we are powerless to help him. + - I know it's asking a lot, but do you think you could help us? + questAcceptDialog: + - '&a[Amavit]&f Thank you so much for accepting our request. I hope with all my heart you succeed.' + - '&7&oI should go to the &dBasement of the Lighthouse&7&o and put the &cLighthouse Keeper&7&o out of his misery.' + questCompleteMessage: + - '&a[Amavit]&f I heard it - so it is done? Did he suff- no, forget it, I don''t want to know.' + - '&fIt seems like the lighthouse started emitting an odd light when you... dealt with the issue. We need to make sure it is not an issue.' + - '&7&oSeems like &aAmavit&7&o has another task for me. I should talk to her.' +primis_feral_alpha_wolf: + name: '$normalLevel &8Feral Alpha Wolf' +primis_feral_wolf: + name: '$normalLevel &8Feral Wolf' +primis_feral_wolf_scout: + name: '$normalLevel &8Feral Wolf Scout' +primis_gladius_admiral: + name: '$normalLevel &fInvading Admiral' +primis_gladius_assassin: + name: '$normalLevel &fInvading Assassin' +primis_gladius_barkeep_p1: + name: '$minibossLevel &6The Barkeep' +primis_gladius_barkeep_p2: + name: '$minibossLevel &6The Barkeep' +primis_gladius_captain: + name: '$normalLevel &fInvading Captain' +primis_gladius_champion_p1: + name: '$bossLevel &6Fallen Champion Natus' +primis_gladius_champion_p2: + name: '$bossLevel &6Fallen Champion Natus' +primis_gladius_gatekeeper_p1: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_gatekeeper_p2: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_gatekeeper_pontis_p1: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_gatekeeper_pontis_p2: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_longbowman: + name: '$normalLevel &fInvading Longbowman' +primis_gladius_mariner: + name: '$normalLevel &fInvading Mariner' +primis_gladius_mariner_quest: + name: '$normalLevel &fInvading Mariner' +primis_gladius_monk_p1: + name: '$minibossLevel &6The Monk' +primis_gladius_monk_p2: + name: '$minibossLevel &6The Monk' +primis_gladius_raider: + name: '$normalLevel &fInvading Raider' +primis_gladius_swordsman: + name: '$normalLevel &fInvading Swordsman' +primis_gladius_undead_buccaneer: + name: '$normalLevel &fUndead Buccaneer' +primis_gladius_undead_captain: + name: '$minibossLevel &fUndead Captain' +primis_gladius_undead_swashbuckler: + name: '$normalLevel &fUndead Swashbuckler' +primis_gladius_underlord: + name: '$minibossLevel &0Underlord' +primis_gladius_villager: + name: '$normalLevel &fUndead Villager' +primis_goblin_fowl_warrior: + name: '$minibossLevel &6Cursed Fowl Goblin' +primis_goblin_grunt: + name: '$normalLevel &6Goblin Grunt' +primis_goblin_king: + name: '$bossLevel &2Goblin King' +primis_goblin_piranah: + name: '$normalLevel &9Goblin Piranah' +primis_goblin_spearman: + name: '$normalLevel &6Goblin Spearman' +primis_goblin_warrior: + name: '$normalLevel &6Goblin Warrior' +primis_ice_mage: + name: '$minibossLevel &9Ice Mage' +primis_ice_mage_p2: + name: '$minibossLevel &bIce Mage' + deathMessage: '&8&oYou hear the sound of a nearby ice wall cracking and breaking...' +primis_ice_village_annoyed_goat: + name: '$normalLevel &bAnnoyed Goat' +primis_ice_village_bell_banger: + name: '$minibossLevel &6Undead' + questLore: + - Do you see that? There, look at that bell + - tower in the village. + - You see it too, right? The feller there + - banging his head on the bell. + - I am pretty sure that's what's going on, + - unless my vision is failing me. + - Could you go investigate and report back + - to me what you found. + questAcceptDialog: + - '&a[Eleusium Festus]&f What is going on...' + - '&7&oI should go see what is happening at the &d&oIce Village Bell Tower&7&o.' + questCompleteMessage: + - '&a[Eleusium Festus]&f You found an undead banging their head on the bell...' + - Well now I have heard it all... +primis_ice_village_escaped_prisoner: + name: '$normalLevel &bEscaped Prisoner' +primis_ice_village_fallen_trial_warrior_summon: + name: '$reinforcementLevel &7Enslaved Soul' +primis_ice_village_frost_fur_ursus: + name: '$normalLevel &9Frost Fur Ursus' +primis_ice_village_frost_simulacrum: + name: '$normalLevel &3Frost Simulacrum' +primis_ice_village_ice_simulacrum: + name: '$reinforcementLevel &3Ice Simulacrum' +primis_ice_village_manifested_nightmare: + name: '$normalLevel &bManifested Nightmare' +primis_ice_village_meek_customer: + name: '$normalLevel &cMeek Customer' +primis_ice_village_naughty_customer: + name: '$normalLevel &cNaughty Customer' +primis_ice_village_screecher_bomb_summon: + name: '$reinforcementLevel &dScreecher Droppings' +primis_ice_village_sky_screecher: + name: '$normalLevel &bSky Screecher' +primis_ice_village_the_ice_aspect: + name: '$minibossLevel &9Ice Aspect' +primis_ice_village_the_ice_elemental: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_the_ice_elemental_p2: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_the_ice_elemental_p3: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_trial_of_ice_minor_ice_elemental: + name: '$minibossLevel &bMinor Ice Elemental' +primis_ice_village_wolf_summon: + name: '$reinforcementLevel &cTamed Wolf' +primis_minor_ice_elemental: + name: '$bossLevel &1Minor Ice Elemental' +primis_minor_ice_elemental_p2: + name: '$bossLevel &1Minor Ice Elemental' +primis_mountain_pass_guardian_p1: + name: '$bossLevel &6The Guardian' +primis_mountain_pass_guardian_p2: + name: '$bossLevel &6The Guardian' +primis_mountain_pass_healer: + name: '$reinforcementLevel &fRepairtron' +primis_nasty_worm: + name: '$normalLevel &fNasty Worm' +primis_ogre_mines_mite: + name: '$normalLevel &fMine Mite' +primis_ogre_mines_ogre_archer: + name: '$minibossLevel &fOgre Archer' +primis_ogre_mines_ogre_magi: + name: '$minibossLevel &fOgre Magi' +primis_ogre_mines_ogre_warrior: + name: '$minibossLevel &fOgre Warrior' +primis_ogre_mines_undead_archer: + name: '$normalLevel &fUndead Archer' +primis_ogre_mines_undead_swordsman: + name: '$normalLevel &fUndead Swordsman' +primis_pontis_beast_cod: + name: '$minibossLevel &dBeast Cod Furiosa' +primis_pontis_beast_crawler: + name: '$minibossLevel &dCrawler Beast Megdun' +primis_pontis_beast_impaler: + name: '$minibossLevel &dImpaler Beast Uladzimir' +primis_pontis_counselor_guard_left_1: + name: '$normalLevel &4Corrupt Counselor Guard' +primis_pontis_counselor_guard_left_2: + name: '$normalLevel &4Warped Counselor Guard' + deathMessage: '&5[Counselor Machiavelli]&f So that fool must have finally figured it out...' +primis_pontis_counselor_guard_left_3: + name: '$normalLevel &4Uplifted Experiment' + deathMessage: '&5[Counselor Machiavelli]&f You''re stronger than I thought.' +primis_pontis_counselor_guard_left_4: + name: '$normalLevel &4Abomination' + deathMessage: '&5[Counselor Machiavelli]&f My soul magic will protect me!!!' +primis_pontis_counselor_guard_mid: + name: '$normalLevel &4Corrupt Counselor Guard' + deathMessage: '&8[Counselor Machiavelli]&f I see that we have guests!...' +primis_pontis_counselor_guard_right_1: + name: '$normalLevel &4Corrupt Counselor Guard' +primis_pontis_counselor_guard_right_2: + name: '$normalLevel &4Warped Counselor Guard' +primis_pontis_counselor_guard_right_3: + name: '$normalLevel &4Uplifted Experiment' +primis_pontis_counselor_guard_right_4: + name: '$normalLevel &4Abomination' +primis_pontis_counselor_twisted_copy: + name: '$reinforcementLevel &4Twisted Copy' +primis_pontis_mille_arena_air_elemental: + name: '$minibossLevel &fAir Elemental' +primis_pontis_mille_arena_human_wave_4: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_6: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_7: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_8: + name: '$normalLevel &4Dominated Human Warrior' +primis_pontis_mille_arena_human_worshiper: + name: '$normalLevel &4Elemental Worshiper' +primis_pontis_mille_arena_minor_air_elemental: + name: '$normalLevel &fMinor Air Elemental' +primis_pontis_mille_arena_minor_earth_elemental: + name: '$normalLevel &7Minor Earth Elemental' +primis_pontis_mille_arena_minor_fire_elemental: + name: '$normalLevel &eMinor Fire Elemental' +primis_pontis_mille_arena_minor_fire_elemental_prime: + name: '$normalLevel &eMinor Fire Elemental' +primis_pontis_mille_arena_minor_water_elemental: + name: '$normalLevel &bMinor Water Elemental' +primis_pontis_mille_arena_primal_air_wisp: + name: '$normalLevel &fPrimal Air Wisp' +primis_pontis_mille_arena_primal_air_wisp_2: + name: '$normalLevel &fPrimal Air Wisp' +primis_pontis_mille_arena_primal_earth_wisp: + name: '$normalLevel &7Primal Earth Wisp' +primis_pontis_mille_arena_primal_earth_wisp_2: + name: '$normalLevel &7Primal Earth Wisp' +primis_pontis_mille_arena_primal_fire_wisp: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_fire_wisp_2: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_fire_wisp_3: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_water_wisp: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_water_wisp_2: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_water_wisp_3: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_wisp: + name: '$normalLevel &5Primal Wisp' +primis_pontis_mille_arena_water_elemental: + name: '$minibossLevel &1Water Elemental' +primis_pontis_mille_counselor_p1: + name: '$minibossLevel &fCounselor Machiavelli' +primis_pontis_mille_counselor_p2: + name: '$minibossLevel &fCounselor Machiavelli' +primis_pontis_mille_counselor_p3: + name: '$minibossLevel &fCounselor Machiavelli' +primis_pontis_mille_fields_babe_razorback: + name: '$normalLevel &2Babe Razorback' +primis_pontis_mille_fields_bird: + name: '$normalLevel &fFeathered Field Rat' +primis_pontis_mille_fields_bird_nightmare: + name: '$normalLevel &dFeathered Nightmare Rat' +primis_pontis_mille_fields_bubba: + name: '$minibossLevel &cBig ol'' Bubba' +primis_pontis_mille_fields_field_rat: + name: '$normalLevel &fField Rat' +primis_pontis_mille_fields_juvenile_razorback: + name: '$normalLevel &2Juvenile Razorback' +primis_pontis_mille_fields_longhorn: + name: '$normalLevel &4Fields Longhorn' +primis_pontis_mille_fields_mature_razorback: + name: '$normalLevel &2Mature Razorback' +primis_pontis_mille_fields_shorthorn: + name: '$normalLevel &6Fields Shorthorn' +primis_pontis_mille_fields_two_legged_terror: + name: '$normalLevel &2Two Legged Terror' +primis_pontis_mille_fields_well_fed_rat: + name: '$normalLevel &fWell Fed Rat' +primis_pontis_mille_rat: + name: '$normalLevel &fRat' +primis_quartz_elemental: + name: '$bossLevel &dQuartz Elemental' +primis_quartz_elemental_p2: + name: '$bossLevel &dQuartz Elemental' +primis_redwood_barracuda: + name: '$normalLevel &3Redwood Barracuda' +primis_redwood_fruity_hound: + name: '$normalLevel &2Fruity Hound' +primis_redwood_rockhound: + name: '$normalLevel &7Redwood Rockhound' +primis_redwood_werewolf_grunt: + name: '$normalLevel &cRedwood Werewolf Grunt' +primis_redwood_werewolf_packleader: + name: '$normalLevel &4Redwood Werewolf Packleader' +primis_river_guardian: + name: '$normalLevel &5River Guardian' +primis_roofed_forest_cave_spider: + name: '$normalLevel &6Nest Crawler' +primis_roofed_forest_cave_spider_boss: + name: '$bossLevel &eBrood Mother' +primis_roofed_forest_spider: + name: '$normalLevel &6Forest Crawler' +primis_roofed_forest_spider_reinforcement: + name: '$reinforcementLevel &6Nest Brood' +primis_sea_monster: + name: '$bossLevel &dSea Monster' +primis_sewer_noxious_ninja: + name: '$normalLevel &2Noxious Ninja' +primis_sewer_spore_spreader: + name: '$normalLevel &4Spore Spreader' +primis_sewer_the_shredder_p1: + name: '$bossLevel &5The Shredder' +primis_sewer_the_shredder_p2: + name: '$bossLevel &5The Shredder' +primis_storm_temple_axeman: + name: '$normalLevel &dStorm Temple Axeman' +primis_storm_temple_bowman: + name: '$normalLevel &dStorm Temple Bowman' +primis_storm_temple_kuzco: + name: '$normalLevel &6Kuzco' +primis_storm_temple_minor_storm_elemental: + name: '$normalLevel &5Minor Storm Elemental' +primis_storm_temple_storm_elemental: + name: '$bossLevel &1Storm Elemental' +primis_storm_temple_storm_elemental_p2: + name: '$bossLevel &1Storm Elemental' +primis_storm_temple_storm_elemental_p3: + name: '$bossLevel &1Storm Elemental' +primis_storm_temple_summoner: + name: '$normalLevel &5Storm Temple Summoner' +primis_terravilla_alpha_razorback: + name: '$minibossLevel &2Alpha Razorback' +primis_terravilla_alpha_razorback_p2: + name: '$minibossLevel &2Alpha Razorback' +primis_terravilla_bar_brawler: + name: '$normalLevel &6Bar Brawler' + onDamagedMessages: + - That all ya got! + - I did not even feel that! + - Why...you! + - I will show you! + - Who the heck are you! + - TAKE THAT! +primis_terravilla_earth_elemental: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_earth_elemental_p2: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_earth_elemental_p3: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_regular_fish: + name: '$normalLevel &bRegular Fish' +primis_terravilla_robber_gladiator: + name: '$normalLevel &bRobber Gladiator' +primis_terravilla_robber_slugger: + name: '$normalLevel &bSlugger' +primis_undead_archer: + name: '$normalLevel &fUndead Archer' +primis_undead_climber: + name: '$normalLevel &0Undead Climber' +primis_undead_grappler: + name: '$normalLevel &3Undead Grappler' +primis_undead_guardian: + name: '$normalLevel &bUndead Guardian' +primis_undead_swordsman: + name: '$normalLevel &0Undead Swordsman' +pufferfish: + name: '$eventBossLevel &3Pufferfish' + locationMessage: '&cPufferfish: $distance blocks away!' + spawnMessage: '&cA puffed fish is swimming in the oceans!' + deathMessage: '&aThe Pufferfish reign has been ended by $players!' + escapeMessage: '&4The Pufferfish has swam away!' +pufferfish_summon_1: + name: '$eventBossLevel &bPooferfish' +pufferfish_summon_2: + name: '$eventBossLevel &bPooperfish' +pufferfish_summon_3: + name: '$eventBossLevel &bPooderfish' +pufferfish_summon_4: + name: '$eventBossLevel &bPudderfish' +queen_bee: + name: '$eventBossLevel &6Queen Bee' +rabbit_wolf_1: + name: '$eventBossLevel &cFlame Wolf' + locationMessage: '&cFlame: $distance blocks away!' + spawnMessage: '&cA powerful duo has come to this world!' + deathMessage: '&aThe Wolf and the Rabbit were stopped by $players!' + escapeMessage: '&4The Wolf and the Rabbit have left this place!' +rabbit_wolf_2: + name: '$eventBossLevel &cLightning Rabbit' + locationMessage: '&cLightning: $distance blocks away!' + deathMessage: '&aThe Wolf and the Rabbit were stopped by $players!' + escapeMessage: '&4The Wolf and the Rabbit have left this place!' +raug: + name: '$reinforcementLevel &4Raug' +regular_hoglin: + name: '$eventBossLevel &4Regular Hoglin' + locationMessage: '&cRegular Hoglin: $distance blocks away!' + spawnMessage: '&cA Regular Hoglin has arrived! Nothing special about this Hoglin!' + deathMessage: '&aRegular Hoglin was slain by $players!.' + escapeMessage: '&4The Regular Hoglin has left!' +rotting_diver: + name: '$eventBossLevel &bRotting Diver' + locationMessage: '&cRotting Diver: $distance blocks away!' + spawnMessage: '&cA foul corpse floats in the waters!' + deathMessage: '&aThe Rotting Diver was sent to the depths by $players!' + escapeMessage: '&4The Rotting Diver floated away!' +salty_corpse: + name: '$eventBossLevel &bSalty Corpse' + locationMessage: '&cSalty Corpse: $distance blocks away!' + spawnMessage: '&cSomething awful has floated up to the surface!' + deathMessage: '&aThe Salty Corpse was sent back to the depths by $players!' + escapeMessage: '&4The Salty Corpse has left!' +skeleton_knight: + name: '$eventBossLevel &fSkeleton Knight' + locationMessage: '&cSkeleton Knight: $distance blocks away!' + spawnMessage: '&cThe undead have sent a Skeleton Knight into the night!' + deathMessage: '&aThe Skeleton Knight was slain by $players!' + escapeMessage: '&4The Skeleton Knight had to retreat!' +sky_archer: + name: '$eventBossLevel &aSky Archer' + locationMessage: '&cSky Archer: $distance blocks away!' + spawnMessage: '&cA Sky Archer has entered this world! Bring your bow!' + deathMessage: '&aThe Sky Archer got sniped by $players!' + escapeMessage: '&4The Sky Archer has flown away!' +sky_archer_mount: + name: '$eventBossLevel &aSky Steed' +smallstack: + name: '$eventBossLevel &bSmallstack Top' + locationMessage: '&cSmallstack: $distance blocks away!' + spawnMessage: '&cA Smallstack is roaming the wilds!' + deathMessage: '&aThe Smallstack was unstacked by $players!' + escapeMessage: '&4The Smallstack has left!' +smallstack_1: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_2: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_3: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_4: + name: '$eventBossLevel &bSmallstack Bottom' +smallstack_5: + name: '$eventBossLevel &bSmallstack Bottom' +smallstack_6: + name: '$eventBossLevel &bSmallstack Carrier' +snoopy: + name: '&6{&4☠&6} &fSnoopy' + onDamageMessages: + - Woof! + onDamagedMessages: + - Woof! + spawnMessage: '&aAn extremely rare Snoopy has been sighted!' +sorcerer_supreme: + name: '$eventBossLevel &5Sorcerer Supreme' + locationMessage: '&cSorcerer Supreme: $distance blocks away!' + spawnMessage: '&cAn almighty Sorcerer has phased into this world!' + deathMessage: '&aThe Sorcerer Supreme was defeated by $players!' + escapeMessage: '&4The Sorcerer Supreme has left this world!' +sorcerer_supreme_summon: + name: '$eventBossLevel &5Eternal Servant' +spider_knight: + name: '$eventBossLevel &aDwarven Knight' + locationMessage: '&cDwarven Knight: $distance blocks away!' + spawnMessage: '&cA Knight has come to challenge the heroes of this place!' + deathMessage: '&aThe Knight was defeated by $players!' + escapeMessage: '&4The Knight has left this place!' +spider_knight_mount: + name: '$eventBossLevel &aFaithful Steed' +summonable_wolf: + name: '$normalLevel Wolfy' + onDamageMessages: + - Woof! + onDamagedMessages: + - Woof! +super_mite: + name: '$eventBossLevel &dSuper Mite' + locationMessage: '&cSuper Mite: $distance blocks away!' + spawnMessage: '&cA trouble maker appears!' + deathMessage: '&aThe mite could not handle a fight with $players!.' + escapeMessage: '&4The Super Mite left out of boredom!' +super_mite_summon: + name: '$eventBossLevel &dFriendmite' +suspicious_phantom: + name: '$eventBossLevel &eSuspicious Phantom' + locationMessage: '&cSuspicious Phantom: $distance blocks away!' + spawnMessage: '&cA Suspicious Phantom was sighted in the skies!' + deathMessage: '&aThe Phantom was put to bed by $players!' + escapeMessage: '&4The Suspicious Phantom has left!' +suspicious_phantom_summon: + name: '$eventBossLevel &cFlamer' +suspicious_phantom_summon_1: + name: '$eventBossLevel &cFireballer' +test_boss: + name: '$eventBossLevel &6Test boss' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Test Boss has been debugged!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - I've hit you! + onDamagedMessages: + - I've been hit! + locationMessage: 'Test entity: $distance' + spawnMessage: A test boss has been spawned! + deathMessage: A test boss has been slain by $players! + escapeMessage: A test boss entity has escaped! +airship_tier_45_knockback: + name: '$normalLevel &2Bow Bowsman' +airship_tier_45_witherblind: + name: '$normalLevel &aNoxious Bowsman' +airship_tier_50_powder_monkeys: + name: '$normalLevel &7Powder Monkey' +airship_tier_50_scourge: + name: '$normalLevel &8Swashbuckling Scourge' +airship_tier_60_mess_hall_mate: + name: '$normalLevel &bMess Hall Mate' +airship_tier_65_boatswain_boss: + name: '$normalLevel &cBoatswain Boss' +airship_tier_65_bodyguard: + name: '$normalLevel &eBuccaneer Bodyguard' +airship_tier_65_silverfish: + name: '$normalLevel &8Ship Rat' +airship_tier_65_silverfish_reinforcement: + name: '$reinforcementLevel &8Ship Mouse' +airship_tier_70_miniboss: + name: '$minibossLevel Quark the Quartermaster ' +airship_tier_70_miniboss_2: + name: '$minibossLevel &6Living Boiler' +airship_tier_70_miniboss_wayfinder: + name: '$minibossLevel &3Wharf Wayfinder' +airship_tier_75_boss: + name: '$bossLevel &4Captain Davey' + deathMessages: + - '&e&l---------------------------------------------' + - '&9Captain Davey was put to rest! ... again.' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Captain Davey: $distance' + spawnMessage: '&4Captain Davey haunts the skies once more!' + deathMessage: '$players &ahave made &4Captain Davey &ashuffle off his mortal coil!' + escapeMessage: '&6Captain Davey has moved on the haunt another day!' +binder_of_worlds_phase_1: + name: '$eventBossLevel &eBinder of Worlds' + spawnMessage: '&5The binder of worlds approaches!' +binder_of_worlds_phase_1_melee_miniboss: + name: '$reinforcementLevel &9Reality Uprooter' +binder_of_worlds_phase_1_melee_reinforcement: + name: '$reinforcementLevel &8Reality Waster' +binder_of_worlds_phase_1_parkour_reinforcement: + name: '$reinforcementLevel &2Reality Harbinger' +binder_of_worlds_phase_1_ranged_miniboss: + name: '$reinforcementLevel &3Reality Ruiner' +binder_of_worlds_phase_1_ranged_reinforcement: + name: '$reinforcementLevel &6Reality Ruiner' +binder_of_worlds_phase_1_status_miniboss: + name: '$reinforcementLevel &1Reality Wrencher' +binder_of_worlds_phase_1_status_reinforcement: + name: '$reinforcementLevel &7Reality Rupturer' +binder_of_worlds_phase_2: + name: '$eventBossLevel &eBinder of Worlds' +binder_of_worlds_phase_3: + name: '$eventBossLevel &eBinder of Worlds' +binder_of_worlds_phase_3_shulker_reinforcement: + name: '$reinforcementLevel &5Reality Riftrender' +binder_of_worlds_phase_4: + name: '$eventBossLevel &eBinder of Worlds' + deathMessages: + - '&e&l---------------------------------------------' + - '&9The binder is bound to this mortal plane no more!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' +catacombs_tier_10_miniboss: + name: '$minibossLevel &7Terragog' +catacombs_tier_15_boss: + name: '$bossLevel &6The Rattler' + deathMessages: + - '&e&l---------------------------------------------' + - '&9The Rattler rattled away!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Feeling.. rattled? + - Show me your skeleton! + - You're boned! + - Your calcium is weak! + onDamagedMessages: + - I felt that in my bones! + - I've got a bone to pick with you! + - Doot doot mr skeltal + - I need calcium! + locationMessage: 'The Rattler: $distance blocks away!' + spawnMessage: '&6The Rattler rises!' + deathMessage: '&aThe Rattler has been defeated by $players!' +catacombs_tier_15_mimic_boss: + name: '$bossLevel &6The Forgotten' +catacombs_tier_15_reinforcement: + name: '$reinforcementLevel &eUnturned' +catacombs_tier_5_evoker_guard_2: + name: '$normalLevel &7Catacomb Guard' + onDamageMessages: + - No entry! + - Entry is forbidden! +catacombs_tier_5_illusioner_guard_1: + name: '$normalLevel &7Catacomb Guard' + onDamageMessages: + - No entry! + - Entry is forbidden! +colosseum_tier_70_boss_mount: + name: '$bossLevel &4Pit Lord' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Pit Lord is no more!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + deathMessage: '&2The Pit Lord has been vanquished by $players!' +colosseum_tier_70_boss_p1: + name: '$bossLevel &cPit Master' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Pit Master has fallen!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Pit Master: $distance blocks away!' + spawnMessage: '&4The Pit Master charges into battle once more!' + deathMessage: '&2The Pit Master has been slain by $players!' +colosseum_tier_70_boss_p2: + name: '$bossLevel &cPit Master' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Pit Master has fallen!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Pit Master: $distance blocks away!' + deathMessage: '&2The Pit Master has been slain by $players!' +colosseum_tier_70_boss_reinforcements_p1: + name: '$reinforcementLevel &6Gladiator' +colosseum_tier_70_boss_reinforcements_p2: + name: '$reinforcementLevel &6Gladiator' +colosseum_tier_70_gladiator: + name: '$normalLevel &6Gladiator' +colosseum_tier_70_mount_reinforcements: + name: '$reinforcementLevel &cPit Beast' +dark_cathedral_tier_75_boss: + name: '$bossLevel &4Cultist of Cthulhu' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The summoning has been interrupted!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Fools! + - Chtulhu R'lyeh! + - None can defeat Chtulhu! + - Stare into the abyss... + locationMessage: 'Cultist of Cthulhu: $distance blocks away' + spawnMessage: '&cA dark cultist is summoning Cthulhu!' + deathMessage: '&2The summoning has been thwarted $players!' + escapeMessage: '&2The cultist has completed the summoning!' +dark_cathedral_tier_75_reinforcement: + name: '$reinforcementLevel Follower of Cthulhu' + onDamageMessages: + - Cthulhu R'lyeh + onDamagedMessages: + - Cthulhu R'lyeh +darkspire_level_100_berserker_brute: + name: '$normalLevel &7Underworld Berserker' +darkspire_level_100_berserker_reanimated: + name: '$normalLevel &fReanimated Underworld Berserker' +darkspire_level_100_blacksmith_brute: + name: '$normalLevel &eSmoldering Goldsmith' +darkspire_level_100_endermite: + name: '$normalLevel &5Voidcrawler' +darkspire_level_100_marksman_piglin: + name: '$normalLevel &9Foolish Marksman' +darkspire_level_100_sentry_brute: + name: '$normalLevel &3Darkguard Sentry' +darkspire_level_100_summon_blaze: + name: '$reinforcementLevel &cHellspawn' +darkspire_level_100_summon_evoker: + name: '$reinforcementLevel &cFalse Hellraiser' +darkspire_level_100_summon_ghast: + name: '$reinforcementLevel &7Maalkvvhar' +darkspire_level_100_summon_husk: + name: '$reinforcementLevel &cOroxak''s Corrupted' +darkspire_level_100_summon_ravager: + name: '$reinforcementLevel &cEerbix the Fallen' +darkspire_level_100_summon_skeleton: + name: '$reinforcementLevel &cRibling' +darkspire_level_110_berserker_reanimated: + name: '$normalLevel &7Reanimated Underworld Berserker' +darkspire_level_110_marksman_reanimated: + name: '$normalLevel &9Reanimated Foolish Marksman' +darkspire_level_110_necromancer_evoker: + name: '$normalLevel &8Black-Hearted Enchanter' +darkspire_level_110_sentry_reanimated: + name: '$normalLevel &3Reanimated Darkguard Sentry' +darkspire_level_110_stationary_stray: + name: '$normalLevel &6Hewn Watchman' +darkspire_level_120_miniboss_evoker: + name: '$minibossLevel &4Hellraiser' +darkspire_level_120_miniboss_illusioner: + name: '$minibossLevel &4Maalkv' +darkspire_level_120_miniboss_skeleton: + name: '$minibossLevel &4Crypt Keeper' +darkspire_level_120_miniboss_stray: + name: '$minibossLevel &4Nicolas Ribcage' +darkspire_level_120_miniboss_vindicator: + name: '$minibossLevel &4Zalmur the Impslayer' +darkspire_level_120_miniboss_wither_skeleton: + name: '$minibossLevel &4Oroxak' +darkspire_level_120_summon_zoglin: + name: '$reinforcementLevel &cArzags Horde' +darkspire_level_130_miniboss_phase_brute: + name: '$bossLevel &4Arzag the Beast' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Arzag the Beast''s invasion has been stopped!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' +darkspire_level_130_miniboss_zoglin: + name: '$bossLevel &4Arzag the Beast' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Arzag the Beast''s invasion has been stopped!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Arzag the Beast: $distance blocks away' + spawnMessage: '&4Arzag the Beast prepares for the invasion!' + escapeMessage: '&cArzag the Beast is done plundering!' +darkspire_level_80_summon_blaze: + name: '$reinforcementLevel &dFalse Hellspawn' +fireworks_level_50_boss_phase_1: + name: '$eventBossLevel &cSparky' + spawnMessage: '&eSparks fill the sky!' +fireworks_level_50_boss_phase_2: + name: '$eventBossLevel &cSparky' +fireworks_level_50_boss_phase_3: + name: '$eventBossLevel &cSparky' + deathMessages: + - '&e&l---------------------------------------------' + - '&eSparky''s out, party''s over!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&6Sparky returns to celebrate!' +fireworks_phase_2_reinforcement: + name: '$eventBossLevel &cBoomi' +fireworks_phase_3_reinforcement: + name: '$eventBossLevel &cPartygoer' +the_great_weaver: + name: '$eventBossLevel &cThe Great Weaver' + locationMessage: '&cThe Great Weaver: $distance blocks away!' + spawnMessage: '&cAwful creatures have appeared!' + deathMessage: '&aThe Great Weaver and it''s brood have been stopped by $players!' + escapeMessage: '&4The Great Weaver and it''s brood have vanished!' +the_great_weaver_summon: + name: '$eventBossLevel &4Brood Mother' +the_great_weaver_summon_1: + name: '$eventBossLevel &6Brood' +halloween_event_boss_mount: + name: '$minibossLevel Daredevil' +halloween_event_boss_p1: + name: '$bossLevel Dullahan' + locationMessage: '&4Dullahan: $distance blocks away!' + spawnMessage: '&4Don''t lose your head now, the headless horseman walks the earth once again!' + deathMessage: '&4The headless horseman was vanquished by $players!' + escapeMessage: '&4The headless horseman has left to haunt someone''s dreams!' +halloween_event_boss_p2: + name: '$bossLevel Dullahan' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Headless Horseman was vanquished!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Dullahan: $distance blocks away!' + deathMessage: '&4The headless horseman was vanquished by $players!' + escapeMessage: '&4The headless horseman has left to haunt someone''s dreams!' +halloween_event_boss_reinforcement: + name: '$normalLevel Spooky Skeleton' +the_hunter: + name: '$eventBossLevel &4The Hunter' + locationMessage: '&cThe Hunter: $distance blocks away!' + spawnMessage: '&cA Hunter is on the prowl!' + deathMessage: '&aThe Hunter was hunted to extinction by $players!' + escapeMessage: '&4The Hunter declares the hunt now over!' +the_hunter_mount: + name: '$eventBossLevel &fTamed Beast' +the_living_dead: + name: '$reinforcementLevel &6The Living Dead' +northpole_elf: + name: '$normalLevel &2Workshop Elf' +northpole_elf_summon: + name: '$reinforcementLevel &aSanta''s Elf' +northpole_jack_frost: + name: '$bossLevel &bJack Frost' +northpole_krampus: + name: '$bossLevel &5Krampus' +northpole_mrs_claus: + name: '$bossLevel &cMrs. Claus' +northpole_santa_claus: + name: '$bossLevel &4Santa Claus' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Someone stole all of Santa''s presents!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Santa Claus: $distance blocks away' + spawnMessage: '&4Santa Claus is getting ready for Christmas!!' + escapeMessage: '&cSanta set off on his sleigh!' +northpole_skeleton_summon: + name: '$reinforcementLevel &dSoul of the Naughty List' +northpole_snowy_wraith: + name: '$reinforcementLevel &1Snowy Wraith' +the_phantom: + name: '$eventBossLevel &7The Phantom' + locationMessage: '&cThe Phantom: $distance blocks away!' + spawnMessage: '&cA Phantom roams in the dark!' + deathMessage: '&aThe Phantom and his evil troupe have been stopped by $players!' + escapeMessage: '&4The Phantom has left!' +the_phantom_summon_1: + name: '&fCave Spider' +the_phantom_summon_2: + name: '&fWItch' +the_phantom_summon_3: + name: '&fZombie' +the_phantom_summon_4: + name: '&fHusk' +the_phantom_summon_5: + name: '&fDrowned' +the_phantom_summon_6: + name: '&fSkeleton' +the_phantom_summon_7: + name: '&fStray' +the_phantom_summon_8: + name: '&fEnderman' +pirate_ship_tier_10: + name: '$normalLevel &cCrewman' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_15: + name: '$normalLevel &cDeckhand' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_20_melee_1: + name: '$normalLevel &cShipmate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_20_melee_2: + name: '$normalLevel &eDrunken lout' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_20_miniboss: + name: '$minibossLevel &dCookie the Cook' + onDamageMessages: + - Wat're u doin n my kitchen! + - I've got layers! + - You've been served! + - Out me kitchen! + deathMessage: '&2Cookie the Cook''s been sliced and diced by $players!' +pirate_ship_tier_20_ranged: + name: '$normalLevel &cShipmate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_25_miniboss_1: + name: '$miniboss &cCharon the Helmsman' + onDamageMessages: + - Fools ahoy! + - Worthy opponent at prow! + deathMessage: '&2Charon the Helmsman''s been led astray by $players!' +pirate_ship_tier_30_melee: + name: '$normalLevel &cPirate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_30_miniboss_1: + name: '$minibossLevel &7Crushy the Crusher' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! + deathMessage: '&7Crushy the Crusher has been crushed by $players!' +pirate_ship_tier_30_ranged: + name: '$normalLevel &cPirate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_35: + name: '$normalLevel &4Pirate Navigator' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_35_miniboss_1: + name: '$minibossLevel &cSecond Mate' + onDamageMessages: + - You're not allowed here! + - Captain's quarters, back off! +pirate_ship_tier_35_miniboss_2: + name: '$minibossLevel &cSecond Mate' + onDamageMessages: + - You're not allowed here! + - Captain's quarters, back off! +pirate_ship_tier_40_miniboss_1: + name: '$minibossLevel &4First Hand' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! + deathMessage: '&6The Pirate Ship''s First Hand has been demoted by $players!' +pirate_ship_tier_45_boss: + name: '$bossLevel &4Captain Blackbeard' + onDamageMessages: + - Get off me ship! + - Arr, landlubers! + spawnMessage: '&4Captain Blackbeard is leading the Pirate Ship!' + deathMessage: '&2Captain Blackbeard''s beard''s been shaved by $players!' + escapeMessage: '&2Captain Blackbeard has run away with the plunder!' +the_returned: + name: '$reinforcementLevel &6The Returned' +ruins_boss_p1: + name: '$eventBossLevel &9Thor' + spawnMessage: '&6Lightning descends down from the sky!' +ruins_boss_p2: + name: '$eventBossLevel &9Thor' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Thor was sent back to Asgard!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&6Lightning descends down from the sky!' +ruins_boss_reinforcement: + name: '$eventBossLevel &7Fenrir' +sewer_tier_10: + name: '$normalLevel &fLurker' +sewer_tier_15: + name: '$normalLevel &2Crawler' +sewer_tier_20_dry: + name: '$normalLevel &1Lost Wanderer' +sewer_tier_20_gravity_boss: + name: '$minibossLevel &1Spark' +sewer_tier_20_water: + name: '$normalLevel &1Smuggler' + onDamageMessages: + - You shouldn't be here! + onDamagedMessages: + - None shall stand in our way! +sewer_tier_20_water_boss: + name: '$minibossLevel &1Forgotten Hero' +sewer_tier_20_wither_boss: + name: '$minibossLevel &2Withered Corpse' +sewer_tier_30_ice_boss: + name: '$minibossLevel &2Ice Wraith' +sewer_tier_30_invisibility_boss: + name: '$minibossLevel &2Shadow Archer' +sewer_tier_30_melee: + name: '$normalLevel &5Sewer Beast' +sewer_tier_30_ranged: + name: '$normalLevel &5Spirit Whisperer' + onDamageMessages: + - A curse upon you! + - A pox upon your family! + - Feel the wrath of the spirits! + onDamagedMessages: + - You vex me so! + - Spirits, protect me! +sewer_tier_40: + name: '$normalLevel &6Mirage' + onDamageMessages: + - You victory, a lie + - Your odds, grim + - Your life, mine + onDamagedMessages: + - This pain, an illusion + - This blood, a mirage + - This weakness, a lie +sewer_tier_40_darkness_boss: + name: '$minibossLevel &2The Shadowmaster' +sewer_tier_40_darkness_boss_reinforcement: + name: '$reinforcementLevel &2Shadow' +sewer_tier_40_fire_boss: + name: '$minibossLevel &2The Grill Master' +sewer_tier_40_fire_boss_reinforcement: + name: '$reinforcementLevel &2Flame' +sewer_tier_40_poison_boss: + name: '$minibossLevel &2Toxic Gardener' + onDamageMessages: + - Feel nature's wrath! + onDamagedMessages: + - To me, minions! +sewer_tier_40_poison_boss_reinforcement: + name: '$reinforcementLevel &2Fallen Gardener' +sewer_tier_5: + name: '$normalLevel &7Sewer worker' + onDamageMessages: + - This area is restricted! + - Don't jump into the vats! + - | + You're not supposed to be here| + onDamagedMessages: + - Do you know what you're doing!? + - Foolishness! + - Don't you dare! +sewer_tier_50: + name: '$normalLevel &3Sewer Piranha' +sewer_tier_50_lightning_boss: + name: '$minibossLevel &2Mjolnir' +sewer_tier_50_ravager_boss: + name: '$minibossLevel &2Sewer Monstrosity' +sewer_tier_50_spider_boss: + name: '$minibossLevel &2Ancient Crawler' +sewer_tier_50_spider_boss_reinforcement: + name: '$reinforcementLevel &2Spiderling' +sewer_tier_50_water_boss: + name: '$minibossLevel &2Piranha King' +sewer_tier_50_water_boss_reinforcement: + name: '$reinforcementLevel &2Piranha Prince' +sewer_tier_60: + name: '$normalLevel &4Drowned One' +sewer_tier_70_boss: + name: '$bossLevel &4Drowned King' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Drowned King has been slain!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&cThe sewers echo with the clamor of a returned king...' + deathMessage: '&2The Drowned King has been slain!' + escapeMessage: '&2The sewers grow quiet, for now...' +sewer_tier_70_boss_reinforcement: + name: '$reinforcementLevel &4Drowned One' +totem_zombie_1: + name: '$eventBossLevel Head Zombie' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Zombie Totem been slain!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cZombie Totem: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine abomination has been sighted!' + deathMessage: '&aDr. Craftenmine''s abomination been terminated by $players!' + escapeMessage: '&4Dr. Craftenmine''s creation has escaped!' +totem_zombie_2: + name: '$eventBossLevel Totem Zombie' +totem_zombie_3: + name: '$eventBossLevel Totem Zombie' +totem_zombie_4: + name: '$eventBossLevel Totem Zombie' +totem_zombie_5: + name: '$eventBossLevel Totem Zombie' +totem_zombie_6: + name: '$eventBossLevel Totem Zombie' +treasure_goblin: + name: '$eventBossLevel &eTreasure Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Treasure Goblin has been pillaged!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cTreasure Goblin: $distance blocks away!' + spawnMessage: '&cA Treasure Goblin has been sighted!' + deathMessage: '&aA Treasure Goblin has been slain by $players!' + escapeMessage: '&4A Treasure Goblin has escaped!' +tree_defender: + name: '$eventBossLevel &2Tree Defender' +undead_farmer: + name: '$eventBossLevel &aUndead Farmer' + locationMessage: '&cUndead Farmer: $distance blocks away!' + spawnMessage: '&cAn Undead Farmer walks the earth!' + deathMessage: '&aThe Undead Farmer''s career was ended by $players!' + escapeMessage: '&4The Undead Farmer has gone back to rest!' +undead_farmer_summon: + name: '$eventBossLevel &2Farmers Pride' +undead_farmer_summon_1: + name: '$eventBossLevel &2Failed Hog' +undead_horde_summon_1: + name: '$reinforcementLevel &aUndead Horde' +undead_horde_summon_2: + name: '$reinforcementLevel &dUndead Horde' +undead_horde_summon_3: + name: '$reinforcementLevel &eUndead Horde' +unwanted_visitor: + name: '$eventBossLevel &9Unwanted Visitor' + locationMessage: '&cUnwanted Visitor: $distance blocks away!' + spawnMessage: '&cAn Unwanted Visitor has come to the nether to warm up!' + deathMessage: '&aThe Visitor was slain by $players!' + escapeMessage: '&4The Visitor has gone back to his chilly domain!' +unwanted_visitor_summon: + name: '$eventBossLevel &bIce Clone' +vampire_boneman: + name: '$reinforcementLevel &7Drainlings' +vampire_brute: + name: '$normalLevel &1Vampire Brute' +vampire_brute_coffin_breaker: + name: '$normalLevel &1Vampire Brute' +vampire_brute_gargoyle_rush_left: + name: '$normalLevel &3Vampire Brute' +vampire_brute_gargoyle_rush_left_phase_2: + name: '$normalLevel &3Vampire Brute' +vampire_brute_gargoyle_rush_right: + name: '$normalLevel &3Vampire Brute' +vampire_brute_gargoyle_rush_right_phase_2: + name: '$normalLevel &3Vampire Brute' +vampire_fledgling: + name: '$normalLevel &9Vampire Fledgling' +vampire_fledgling_coffin_breaker: + name: '$normalLevel &9Vampire Fledgling' +vampire_fledgling_gargoyle_overlord: + name: '$normalLevel &9Vampire Fledgling' +vampire_gargoyle: + name: '$normalLevel &6Vampire''s Gargoyle' +vampire_grunt: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_coffin_breaker: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_left: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_left_phase_2: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_right: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_right_phase_2: + name: '$normalLevel &1Vampire Grunt' +vampire_hound: + name: '$reinforcementLevel &bVampire Hound' +vampire_king: + name: '$bossLevel &4Vampire King' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Vampire King has been slain!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Vampire King: $distance blocks away.' + spawnMessage: '&cThe Vampire King crawls back to his throne...' + deathMessage: '&2The Vampire King has been smitten!' + escapeMessage: '&2Darkness flees, but for how long...' +vampire_king_phase_2: + name: '$bossLevel &4Vampire King' +vampire_king_phase_3: + name: '$bossLevel &4Vampire King' +vampire_king_phase_4: + name: '$bossLevel &4Vampire King' +vampire_king_phase_5: + name: '$bossLevel &4Vampire King' +vampire_king_phase_6: + name: '$bossLevel &4Vampire King' +vampire_level_120_miniboss_evoker: + name: '$minibossLevel &4Hellraiser''s Spirit' +vampire_level_120_miniboss_skeleton: + name: '$minibossLevel &4Crypt Keeper''s Spirit' +vampire_level_120_miniboss_stray: + name: '$minibossLevel &4Nicolas Ribcage''s Spirit' +vampire_level_120_miniboss_wither_skeleton: + name: '$minibossLevel &4Oroxak''s Spirit' +vampire_necromancer: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_dining_hall: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_entrance: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_foresight_pool: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_gargoyle_rush: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_gargoyle_rush_phase_2: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_left_bedroom: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_right_bedroom: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_supply_room: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_supreme_coffin_breaker: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_2: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_3: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_4: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_5: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_gargoyle_overlord: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_gargoyle_overlord_phase_2: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_gargoyle_overlord_phase_3: + name: '$minibossLevel &2Gargoyle Overlord' +vampire_sentinel: + name: '$minibossLevel &eVampire''s Sentinel' +vampire_thrall: + name: '$reinforcementLevel &dVampire''s Thrall' +vampire_wraith: + name: '$minibossLevel &8Drained One' +vampire_wraith_phase_2: + name: '$minibossLevel &8Drowned One' +vampire_zombie: + name: '$normalLevel &aDrained Husk' +vex_top: + name: '$eventBossLevel &eVex Selfish Top' + locationMessage: '&cVex Troublemakers: $distance blocks away!' + spawnMessage: '&cA gang of Vex Troublemakers have appeared!' + deathMessage: '&aThe Vex Troublemakers were slain by $players!' + escapeMessage: '&4The Vex Troublemakers have decided to leave.' +vex_top_mount_1: + name: '$eventBossLevel &6Vex Bottom' +vex_top_mount_2: + name: '$eventBossLevel &6Vex Bottom' +vex_top_mount_3: + name: '$eventBossLevel &6Vex Bottom' +warlock: + name: '$eventBossLevel &dWarlock' + locationMessage: '&cWarlock: $distance blocks away!' + spawnMessage: '&cA demon riding Warlock has appeared!' + deathMessage: '&aThe Warlock was slain by $players!' + escapeMessage: '&4The Warlock ran away on his demon!' +warlock_mount: + name: '$eventBossLevel &dDemon' +wasp_queen: + name: '$eventBossLevel &aWasp Queen' + locationMessage: '&cWasp Queen: $distance blocks away!' + spawnMessage: '&cA wasp swarm has been sighted!' + deathMessage: '&aThe wasp swarm was eliminated by $players!' + escapeMessage: '&4The wasp swarm has flown away.' +wasp_queen_summon: + name: '$eventBossLevel &aWasp' +water_pest: + name: '$eventBossLevel &3Water Pest' + locationMessage: '&cWater Pest: $distance blocks away!' + spawnMessage: '&cAn annoying foe swims the waters!' + deathMessage: '&aThe Water Pest was slain by $players!' + escapeMessage: '&4The waters are clear of all Pests' +weapons_goblin: + name: '$eventBossLevel &cWeapons Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Weapons Goblin has been pillaged!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cWeapons Goblin: $distance blocks away!' + spawnMessage: '&cA Weapons Goblin has been sighted!' + deathMessage: '&aA Weapons Goblin has been slain by $players!' + escapeMessage: '&4A Weapons Goblin has escaped!' +wendigo: + name: '$eventBossLevel &7Wendigo' + locationMessage: '&cWendigo: $distance blocks away!' + spawnMessage: '&cSomething awful has appeared!' + deathMessage: '&aThe Wendigo has been slain $players!.' + escapeMessage: '&4The Wendigo has disappeared!' +wendigo_summon: + name: '$reinforcementLevel &aWindigo' +werehare: + name: '$eventBossLevel &5Alice' + locationMessage: '&cWerehare: $distance blocks away!' + spawnMessage: '&cA bloody roar can be heard! A werehare approaches!' + deathMessage: '&a$players! made sure to end the werehare''s reign!' + escapeMessage: '&4The werehare escaped!' +werehare_p2: + name: '$eventBossLevel &dWerehare' +wild_wolf: + name: '$reinforcementLevel &7Wild Wolf' +wood_league_wave_10_boss: + name: '$bossLevel &4Bad Doggo' +wood_league_wave_10_reinforcement: + name: '$reinforcementLevel &cBad Pupper' +wood_league_wave_11_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_11_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_12_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_12_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_13_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_13_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_14_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_14_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_15_miniboss: + name: '$bossLevel &4Mr. Oinkers' + onDamagedMessages: + - Oink!? +wood_league_wave_16_melee: + name: '$normalLevel Mr. Oinkers Fan' +wood_league_wave_16_ranged: + name: '$normalLevel Mr. Oinkers Fan' +wood_league_wave_17_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_17_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_18_melee: + name: '$normalLevel &4Fencing Club Enthusiast' +wood_league_wave_19_ranged: + name: '$normalLevel Archery Club Enthusiast' +wood_league_wave_1_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_1_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_20_boss: + name: '$bossLevel &2Zoltan' +wood_league_wave_21_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_21_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_22_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_22_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_23_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_23_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_24_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_24_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_25_miniboss: + name: '$minibossLevel &bAgdluak' +wood_league_wave_26_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_26_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_27_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_27_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_28_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_29_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_2_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_2_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_30_boss: + name: '$bossLevel &2The Southern Viper' +wood_league_wave_31_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_31_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_32_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_32_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_33_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_33_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_34_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_34_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_35_miniboss: + name: '$minibossLevel &6The Jester' +wood_league_wave_36_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_36_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_37_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_37_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_38_melee: + name: '$normalLevel &4Arena Swordsman' +wood_league_wave_39_ranged: + name: '$normalLevel Arena Archer' +wood_league_wave_3_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_3_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_40_boss: + name: '$bossLevel &cCrucio the Bearer of Curses' +wood_league_wave_41_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_41_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_42_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_42_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_42_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_43_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_43_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_43_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_44_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_44_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_44_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_45_miniboss: + name: '$minibossLevel &6Thousand Blades' +wood_league_wave_46_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_46_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_46_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_47_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_47_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_47_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_48_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_48_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_49_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_49_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_4_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_4_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_50_boss: + name: '$bossLevel &6Uther the Champion' +wood_league_wave_50_boss_p2: + name: '$bossLevel &6Uther the Champion' +wood_league_wave_50_boss_p3: + name: '$bossLevel &6Uther the Champion' +wood_league_wave_50_reinforcement: + name: '$reinforcementLevel &6Uther Stan' +wood_league_wave_5_miniboss: + name: '$minibossLevel &cWeird Cow' + onDamagedMessages: + - Woof! +wood_league_wave_6_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_6_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_7_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_7_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_8_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_9_ranged: + name: '$normalLevel Arena Crossbowman' +yeti: + name: '$eventBossLevel &bYeti' + locationMessage: '&cYeti: $distance blocks away!' + spawnMessage: '&cA mighty beast has appeared!' + deathMessage: '&aThe beast is no more thanks to $players!.' + escapeMessage: '&4The beast has escaped!' +yezhi_baba: + name: '$eventBossLevel &cYezhi Baba' + locationMessage: '&cYezhi Baba: $distance blocks away!' + spawnMessage: '&cA foul hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +yezhi_baba_summon: + name: '$reinforcementLevel &4Yezhi Baba' +zombie_friends_friend: + name: '$reinforcementLevel &7Zombie Friend' +zombie_king: + name: '$eventBossLevel &4Zombie King' + locationMessage: '&cZombie King: $distance blocks away!' + spawnMessage: '&cThe Zombie King has been sighted!' + deathMessage: '&aThe Zombie King has been slain by $players!' + escapeMessage: '&4The Zombie King has escaped!' +zombie_parents_dad: + name: '$reinforcementLevel &7Zombie Dad' +zombie_parents_mom: + name: '$reinforcementLevel &7Zombie Mom' +back_teleporter: + name: Hermes + role: + greetings: + - Benvenuto nel\nCentro della Gilda degli Avventurieri! + dialog: + - Vuoi tornare indietro? + farewell: + - Viaggia sicuro, amico. + noPreviousLocationMessage: '&8[EliteMobs] &cImpossibile rimandarti dove eri prima - nessuna posizione trovata!' +barkeep: + name: Bartley + role: + greetings: + - Cerchi da bere? + - Vuoi bere + - Assetato? + - Howdy, partner. + dialog: + - Prendi la specialità della casa. + - Special drinks won't find them\nanywhere else. + - One taste and will keep you\ncoming back from more. + farewell: + - Torna quando vuoi + - Bottoms up! + - Kampai! + - Salute! + - Brosd! + - Salud! + - À la vôtre ! + - Idiota! + - Santi! + - Salute! + - Saúde! + - Cheers! + - 乾杯! +blacksmith: + name: Greg + role: + greetings: + - Welcome to our shop! + - Sell your goods here! + - Fresh goods, just for you! + - Got something to sell? + - Want to buy something good? + - Fresh goods every time! + dialog: + - Higher level mobs drop\nhigher value items! + - Items with lots of \nenchantments are worth more! + - Higher level mobs drop\nbetter items! + - Higher level mobs have\na higher chance of dropping loot! + - Elite mobs are attracted to\ngood armor, the better the\narmor the higher their level! + - Some items have special\npotion effects! + - Some items have unique\neffects! + - The hunter enchantment\nattracts elite mobs to your\nlocation! + - Special weapons and armor\ndropped by elite mobs can\nbe sold here! + - Higher guild ranks will\nincrease the quality of the\nloot from elite mobs! + farewell: + - Thank you for your business! + - Come back soon! + - Come back any time! + - Recommend this shop to your\nfriends! +combat_instructor: + name: Charles + role: + greetings: + - Want to learn about combat? + - Need a combat lesson? + - Want to know more about combat? + - Ready to fight Elite Mobs? + dialog: + - The items around Elite Mobs\nshow what powers they have. + - The higher the level of\nthe Elite Mob, the\nmore powers they can have + - The higher the level of\nthe Elite Mob, the\nbetter the loot they can drop + - Higher level Elite Mobs\nhave higher chances\nof dropping special items + - Elite Mobs with floating\narrows fire arrows at\nnearby players + - Elite Mobs with floating\nender eyes blind you\nwhen they hit you + - Elite Mobs with floating\nspell particles confuse you\nwhen they hit you + - Elite Mobs with floating\nlava buckets set you on fire\nwhen they hit you + - |- + Elite Mobs with floating\nfireballs fire fireballs + at nearby players + - Elite Mobs with floating\npacked ice freeze you\nwhen they hit you + - Elite Mobs with floating\nelytras make you float\nwhen they hit you + - Elite Mobs with floating\nemeralds poison you\nwhen they hit you + - Elite Mobs with floating\npistons push you\nwhen they hit you + - Elite Mobs with floating\ntotems weaken you\nwhen they hit you + - Elite Mobs with floating\nwebs web you\nwhen they hit you + - Elite Mobs with floating\nskulls wither you\nwhen they hit you + - Elite Mobs with floating\nchests drop bonus loot\nwhen you kill them + - Elite Mobs with floating\ngold boots are faster + - Elite Mobs with floating\njukeboxes taunt you\nduring combat + - Elite Mobs with floating\nglass panes are invisible + - Elite Mobs with floating\nspectral arrows are immune\nto arrows + - Elite Mobs with floating\nfeathers are immune\nto fall damage + - Elite Mobs with floating\nflames are immune\nto fire + - Elite Mobs with floating\nanvils are heavier\nthan usual + - Elite Mobs with floating\nbone blocks leave their\ncorpses behind when killed + - Elite Mobs with floating\nslime blocks jump higher\nthan usual + - Elite Mobs with floating\nslime balls create a vaccum\nupon death + - Elite Mobs with floating\nleads pull you\nwhen they hit you + - Elite Mobs with floating\nbones create bone pillars\nduring combat + - Elite Mobs with floating\ntipped arrows fire tracking\narrows during combat + - Elite Mobs with floating\nmushrooms bloat up to become giants\nwhen hit + - Elite Mobs with floating\nskulls summon reinforcements\nwhen hit + - Elite Mobs with floating\nbooks summon reinforcements\nuntil you kill the summoner + - Elite Mobs with floating\neggs summon reinforcements\nwhen hit + - Elite Mobs with floating\nfireworks summon Team Rocket\nwhen hit +enhancer_config: + name: Tim + role: + greetings: + - Want to uprade yer items? + - Got upgrade orbs? + - Get yer items upgraded here! + - Ahoy! + - Ye got scrap son? + dialog: + - Yer items are lousy,\n get an upgrade here! + - Upgrade yer items here! + - Ye got an upgrade orb? + - That sword looks awful,\nget it upgraded here! + - Need an upgrade? + farewell: + - Don't embarrass yourself out there! + - Come back when you have more orbs! + - Go get more orbs! +frost_queen_teleporter: + name: Ishard the Frostbitten + role: + greetings: + - '' +guide_0: + name: Dux + role: + greetings: + - Heard about the AG? + - Been to the AG? + - Heard of the Adventurer's Guild? + - Know about the Adventurer's Guild? + dialog: + - Heard about the AG? + - Been to the AG? + - Heard of the Adventurer's Guild? + - Know about the Adventurer's Guild? + farewell: + - Torna quando vuoi + - I'll be here if you need me! + - I'll be around! + - See you later! +guide_1: + name: Casus + role: + greetings: + - Need guidance? + - Need a hint + - Are you lost? + - Need help? + dialog: + - I know everything about\nthis place! + - Want to meet the other members\nof the Adventurer's Guild? + - Need to learn your way around\nthis place? + farewell: + - Torna quando vuoi + - I'll be here if you need me! + - I'll be around! + - See you later! +guild_attendant: + name: Gillian + role: + greetings: + - Welcome to the\nAdventurer's Guild! + - Welcome! + dialog: + - Check the questboard to\nsee active quests! + - You can talk to me to\nchange your guild rank! + - You can sell items to the\nblacksmith for coins! + - You can talk to the arena\nmaster to take the arena on! + - You can buy equipment from\nthe blacksmith! + - You can talk to the combat\nmaster to check your combat level! + - Unlocking new guid tiers\nincreases your maximum health! + farewell: + - See you soon! + - Thanks for stopping by! + - Buona caccia! +primis_69ozcanofbepis: + name: '&a69OzCanOfBepis' + role: '&2Map Maker (Uuuuge gamer)' + dialog: + - Hope you are enjoying the map! + farewell: + - Have fun! +primis_caeruleaum_fisherman: + name: '&3Piscis Nemesis' + role: '&b' + greetings: + - Hiya!. + dialog: + - Woah! Almost fell off the boat. + - Darn sea monster! + - Need more bait. + farewell: + - Later! + - Good luck! +primis_caeruleaum_fletcher: + name: '&6Ventus Artifex' + role: '&e' + greetings: + - Greetings. + dialog: + - I used to be an adventurer like you. + - Welcome, outsider + - Need something? + - |- + You're not from around these parts, + are you? + farewell: + - See you 'round! + - Come back soon! +primis_caeruleaum_forager: + name: '&5Venator Pabulatus' + role: '&d' + greetings: + - Hello, stranger. + dialog: + - I used to be an adventurer like you. + - Welcome, outsider + - Need something? + - |- + You're not from around these parts, + are you? + farewell: + - See you 'round! + - Come back soon! +primis_caeruleaum_hint_giver: + name: '&fVir Loquax' + role: '&fWise Man' + greetings: + - Hi there! + - Hello! + - It is good to see you! + - Greetings! + dialog: + - You look strong and mighty. Talk to some \nof the villagers if you want to help us out. + - A long time ago there was a beautiful shrine to\nthe southeast, shame what happened to it. + - The ruins in the southwest are such a horrible place!\n Who would ever go there... + - Met a powerful mage once,\nthey were able to summon a beautiful ice wall.\nToo bad it would break if they fainted. + - I heard that a nasty type of\nwolf has settled in the wolf den! + farewell: + - Goodbye! + - See you later! + - Come visit me again! + - Farewell! +primis_caeruleaum_injured_fisherman: + name: '&3Callidus Piscatus' + role: '&b' + greetings: + - Hello, wanderer. + dialog: + - Caught any good fish lately? + - Welcome, outsider + - Need something? + - |- + You're not from around these parts, + are you? + farewell: + - See you 'round! + - Come back soon! +primis_caeruleaum_jeeves: + name: Jeeves + role: + greetings: + - Just traveling! + dialog: + - Just here to sell\nto the shop-keep. + - I'm busy negotiating\nhere. + - Not right now,\ncome back later. + farewell: + - Uhuh... +primis_caeruleaum_leader: + name: '&4Chief Piscis' + role: '&c' + greetings: + - Welcome to our village! + dialog: + - |- + Ask not what this village can do for you, + ask what you can do for this village! + - Welcome, outsider + - Need something? + - |- + You're not from around these parts, + are you? + farewell: + - Off you go! + - Come back soon! +primis_caeruleaum_merchant: + name: Emptor + role: + greetings: + - Got something to sell? + dialog: + - Bandits stole my wares! + - Got nothing to sell, I'm afraid. + - I'll buy anything you have! + farewell: + - Safe travels! +primis_captain: + name: '&4Captain Squalus' + role: '&c' + greetings: + - So you're finally awake! + - That was a wild ride! + - Still alive? + - Let's not do that again! + dialog: + - I've got a task for you! + - I need your help! + - |- + Good thing you're here, + we need some help! + farewell: + - Off you go! + - Don't forget about me! + - Come back soon! +primis_deli'o: + name: '&eDéli''O' + role: '&6Map Maker (Gamer)' + dialog: + - Hope you are enjoying the map! + farewell: + - Have fun! +primis_farmstead_son: + name: '&4Filius' + role: '&c' + greetings: + - Where do you fare from? + - You seem like you came a long way from here. + dialog: + - Dangerous times we live in. + - Have you seen my father? + - Without a lighthouse, how will boats navigate? + farewell: + - Watch your back! + - Tread lightly! +primis_farmstead_wife: + name: '&4Amavit' + role: '&c' + greetings: + - I haven't seen you before! + - Any news from Pontis Mille? + dialog: + - Have you seen my husband? + - I need your help! + - What dangerous times we live in. + - Something is amiss! + farewell: + - Safe travels! + - Thank you! +primis_first_mate: + name: '&cIracundi' + role: '&c' + greetings: + - So you're finally awake! + - That was a wild ride! + - Still alive? + - Let's not do that again! + dialog: + - I've got a task for you! + - I need your help! + - |- + Good thing you're here, + we need some help! + farewell: + - Off you go! + - Don't forget about me! + - Come back soon! +primis_frostcone: + name: '&bFrostCone' + role: '&9Map Maker (Gamer)' + dialog: + - Hope you are enjoying the map! + - It's a pine-cone covered in snow. + - Is Primis out yet? + farewell: + - Have fun! +primis_gladius_guard_1: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_guard_2: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_guard_3: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_guard_4: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_lord: + name: '&4General Hasta' + role: '&c' + greetings: + - Are you here to help? + - It's a war zone out there! + dialog: + - They came in the night! + - We never saw them coming! + - Where are our reinforcements? + farewell: + - Watch your back! + - Tread lightly! +primis_gladius_quartermaster: + name: '&6Cibus' + role: '&c' + greetings: + - Are you here to help? + - It's a war zone out there! + dialog: + - They came in the night! + - We never saw them coming! + - Where are our reinforcements? + farewell: + - Watch your back! + - Tread lightly! +primis_gladius_strategist: + name: '&6Belli' + role: '&c' + greetings: + - Are you here to help? + - It's a war zone out there! + dialog: + - They came in the night! + - We never saw them coming! + - Where are our reinforcements? + farewell: + - Watch your back! + - Tread lightly! +primis_groves_nemus_leader: + name: '&3King Nemian' + role: '&c' + dialog: + - What brings you under the hill? + - Where are you from? + - |- + Have you tried our + delicious glow berries? + farewell: + - Until next time. +primis_ice_village_fisherman_boat: + name: '&3Theopropides Nero' + role: '&3' + greetings: + - Fishy day! + dialog: + - A chilly day for fishing. + - They aren't biting. + - Just gotta be patient. + farewell: + - Don't fall into\nthe water! +primis_ice_village_friendly_villager: + name: '&3Luxuria Placidus' + role: '&3' + greetings: + - Hellos! + dialog: + - Old age will not\nslow me down! + - Being in a good\nmood is important. + - Hoping for some\nsnow soon. + farewell: + - Farewell! +primis_ice_village_generic_npc_1: + name: '&3Albertus Vitalis' + role: '&3' + greetings: + - How goes it. + dialog: + - Nothing like good ale! + farewell: + - Bye. +primis_ice_village_generic_npc_10: + name: '&3Trebatia Cornix' + role: '&3' + greetings: + - OK. + dialog: + - Yep, got it. + - I see... + - Oh! + farewell: + - I will try that\nnext time. +primis_ice_village_generic_npc_11: + name: '&3Albatia Lateranus' + role: '&3' + greetings: + - Visiting Violet? + dialog: + - Don't cause trouble. + farewell: + - Later stranger. +primis_ice_village_generic_npc_12: + name: '&3Hostilia Carantus' + role: '&3' + greetings: + - Hi. + dialog: + - I was just\nleaving. + farewell: + - Bye. +primis_ice_village_generic_npc_13: + name: '&3Vagennia Sejanus' + role: '&3' + greetings: + - Hiya. + dialog: + - What brings you\nto the docks? + farewell: + - See ya. +primis_ice_village_generic_npc_14: + name: '&3Dinia Vettonius' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_15: + name: '&3Sceledrus Marcallas' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_16: + name: '&3Fridericus Castinus' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_17: + name: '&3Cario Fimbria' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_18: + name: '&3Piscatores Laevinus' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_19: + name: '&3Monkerius Vitalis' + role: '&3' + greetings: + - Been hunting? + dialog: + - Time to go hunting. + farewell: + - Farewell. +primis_ice_village_generic_npc_2: + name: '&3Luxuria Tyranus' + role: '&3' + greetings: + - How goes it. + dialog: + - One more! + farewell: + - Bye. +primis_ice_village_generic_npc_3: + name: '&3Aurelio Nigidius' + role: '&3' + greetings: + - Hey there. + dialog: + - What a sight! + farewell: + - Goodbye. +primis_ice_village_generic_npc_4: + name: '&3Lysidamus Paratus' + role: '&3' + greetings: + - Out for a walk? + dialog: + - I couldn't imagine\nliving somewhere\nwithout snow. + - Starting to get chilly. + farewell: + - Until later. +primis_ice_village_generic_npc_5: + name: '&3Simo Proceus' + role: '&3' + greetings: + - What a view! + dialog: + - I love climbing. + - Look at all the fish! + farewell: + - Yep. +primis_ice_village_generic_npc_6: + name: '&3Dordalus Marullinus' + role: '&3' + greetings: + - Welcome to the pub! + dialog: + - Time to warm up\nmy fingers. + - Nice and warm. + farewell: + - Don't let the\ncold get ya. +primis_ice_village_generic_npc_7: + name: '&3Tranio Silvanus' + role: '&3' + greetings: + - Here somewhere.. + dialog: + - Where is it. + farewell: + - I was sure I\nleft it here. +primis_ice_village_generic_npc_8: + name: '&3Milonia Trebellius' + role: '&3' + greetings: + - Welcome to our\nvillage! + dialog: + - I sure am hungry. + - Could go for\nsome salmon. + farewell: + - Farewell. +primis_ice_village_generic_npc_9: + name: '&3Barria Brocchus' + role: '&3' + greetings: + - Did you hear... + dialog: + - Keep that in mind\nnext time you swing\nyour sword. + - The shield can be\nmore than defense. + farewell: + - Got it? +primis_ice_village_hunter: + name: '&3Alanus Isatis' + role: '&3' + greetings: + - Hey! + dialog: + - Hoping for a good\nday tomorrow. + - Sure are many Razorbacks\nout this season. + farewell: + - Be seeing you. +primis_ice_village_imprisoned_husband: + name: '&3Eleusium Calenus' + role: '&3' + greetings: + - '.....' + dialog: + - Another day in a cage... + farewell: + - '.....' +primis_ice_village_jail_caretaker: + name: '&3Philolaches Triferus' + role: '&3' + greetings: + - Hey there. + dialog: + - What else needs\nfixing. + - I should check up\non the cages. + farewell: + - Later. +primis_ice_village_jail_guard: + name: '&3Eleusium Festus' + role: '&3' + greetings: + - Climbed the\ntower eh. + dialog: + - Everything seems in order. + - Almost everything... + farewell: + - Take care. +primis_ice_village_jail_master: + name: '&3Romanus Superbus' + role: '&3' + greetings: + - Well met. + dialog: + - Don't do the crime if\nyou can't do the time. + - Crime doesn't pay. + farewell: + - Until later. +primis_ice_village_leader: + name: '&3Glacies Princeps' + role: '&3' + greetings: + - Hey. + dialog: + - Darn Ice Elemental! + - Too many problems... + - How are we supposed to\ncomplete the trials now. + farewell: + - Goodbye. +primis_ice_village_lighthouse_keeper: + name: '&3Severinus Martius' + role: '&3' + greetings: + - Well met stranger. + dialog: + - Calm day today. + - Watch out for\nthe Ursus! + farewell: + - Take it easy. +primis_ice_village_missing_daughter: + name: '&3Cornelia Ennodius' + role: '&3' + greetings: + - Help... + dialog: + - Go away, go away,\nGO AWAY! + - They are not\nreal... + - Just don't look\nat them Cornelia. + farewell: + - Bye. +primis_ice_village_prisoner: + name: '&3Adrius Calpornius' + role: '&3' + greetings: + - I am innocent! + dialog: + - This is not where\nI belong!!! + farewell: + - Get me out of here! +primis_ice_village_pubkeeper: + name: '&3Grania Cecilius' + role: '&3' + greetings: + - Welcome! + dialog: + - Coming right up! + - Try our black ale! + - Need a drink? + farewell: + - One coming up! +primis_ice_village_tower_squatter: + name: '&3Modestus Eulogius' + role: '&3' + greetings: + - The noise! + dialog: + - So much screeching! + - Just trying to\nenjoy the peace. + farewell: + - Bye. +primis_ice_village_violet: + name: '&5Domina Violet' + role: '&d' + greetings: + - Did I ask\nyour opinion? + dialog: + - Feels good to\nget it out. + - They're gonna pay\nwhile I collect. + farewell: + - No, that's what I thought. +primis_ice_village_worried_father: + name: '&3Sparax Ennodius' + role: '&3' + greetings: + - I hope she is OK... + dialog: + - Let our girl be\nsafe, please. + farewell: + - Bye. +primis_ice_village_worried_mother: + name: '&3Sestia Ennodius' + role: '&3' + greetings: + - Where did she go. + dialog: + - Hmm, lost the trail. + farewell: + - Bye. +primis_ice_village_worried_wife: + name: '&3Titia Calenus' + role: '&3' + greetings: + - Hiya! + dialog: + - Nice and clean beds. + - Did I miss something? + - Another chest sorted. + farewell: + - Bye! +primis_magmaguy: + name: '&4Magmaguy' + role: '&cLead Developer (Non-gamer)' + dialog: + - Hope you are enjoying the map! + farewell: + - Have fun! +primis_mountain_guide: + name: '&4Petrae' + role: '&c' + greetings: + - Welcome to our village! + dialog: + - |- + Ask not what this village can do for you, + ask what you can do for this village! + - Welcome, outsider + - Need something? + - |- + You're not from around these parts, + are you? + farewell: + - Off you go! + - Come back soon! +primis_mountain_guide_2: + name: '&4Petrae' + role: '&c' + greetings: + - Welcome to our village! + dialog: + - |- + Ask not what this village can do for you, + ask what you can do for this village! + - Welcome, outsider + - Need something? + - |- + You're not from around these parts, + are you? + farewell: + - Off you go! + - Come back soon! +primis_nemus_leader: + name: '&3King Nemian' + role: '&c' + dialog: + - What brings you under the hill? + - Where are you from? + - |- + Have you tried our + delicious glow berries? + farewell: + - Until next time. +primis_ogre_mines_escaped_miner: + name: '&cFugit Fossores' + role: '&c' + greetings: + - I can't believe I made it! + - They're everywhere! + - Could you lend a hand? + dialog: + - I've got a task for you! + - I need your help! + farewell: + - Off you go! + - Be careful in there! + - Stay safe! +primis_ogre_mines_lone_miner: + name: '&cFortis Fossores' + role: '&c' + greetings: + - Finally, some help! + - Don't let them see you! + - Help me! + dialog: + - I've got a task for you! + - I need your help! + farewell: + - Off you go! + - Back to mining for me! + - Stay safe! +primis_ogre_mines_old_miner: + name: '&cVetus Fossores' + role: '&c' + greetings: + - Hey there sonny! + - You're lookin' a little lost! + - What brings you over here? + dialog: + - I've got a task for you! + - I need your help! + farewell: + - Off you go! + - Don't let the mine mites bite! + - Stay safe! +primis_ogre_mines_panicked_miner: + name: '&cMetus' + role: '&c' + greetings: + - The mine is overrun! + dialog: + - There's ogres everywhere! + - Can you help us? + farewell: + - Be careful! +primis_pontis_citizen_1: + name: '&7Agorastocles Gorgonius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_10: + name: '&7Pardalisca Saunio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_11: + name: '&7Sobersides Colias' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_12: + name: '&7Saturio Caepio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_13: + name: '&7Chrysalus Trebonius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_14: + name: '&7Toxilus Micon' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_15: + name: '&7Phronesium Viridio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_16: + name: '&7Aurelio Zoilus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_17: + name: '&7Diniarchus Nelius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_18: + name: '&7Cleostrata Senopius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_19: + name: '&7Georgius Sorio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_2: + name: '&7Franciscus Crispian' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_20: + name: '&7Epidicus Silvanus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_21: + name: '&7Pleusicles Marcellinus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_22: + name: '&7Plesidippus Nerva' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_23: + name: '&7Plesidippus Megellus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_24: + name: '&7Fridericus Achaicus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_25: + name: '&7Curculio Zosimus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_26: + name: '&7Demipho Sylvius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_27: + name: '&7Peniculus Nemesius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_28: + name: '&7Tyndarus Faustinius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_29: + name: '&7Sulpicio Panthera' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_3: + name: '&7Tycho Sellic' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_30: + name: '&7Melaenis Gelasius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_31: + name: '&7Tyndarus Columbanus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_32: + name: '&7Antamonides Cerinthus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_33: + name: '&7Lesbonicus Momus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_34: + name: '&7Fridericus Saloninus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_35: + name: '&7Anterastilis Fabricius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_36: + name: '&7Tyndarus Augustalis' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_37: + name: '&7Modestus Aper' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_38: + name: '&7Henricus Crassus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_39: + name: '&7Franciscus Tancinus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_4: + name: '&7Advocati Micon' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_40: + name: '&7Phygia Aurelius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_5: + name: '&7Advocati Micon' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_6: + name: '&7Messenio Rectus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_7: + name: '&7Hadrius Donicus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_8: + name: '&7Sulpicio Sejanus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_9: + name: '&7Stasimus Mutilus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_dockworker_1: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_10: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_2: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_3: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_4: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_5: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_6: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_7: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_8: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_9: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_enhancer: + name: '&7Meliorem' + role: '&8' + greetings: + - Need to upgrade? + - Got scrap? + - Let's upgrade! + dialog: + - I'll upgrade for scrap! + - Bring me scrap! + - Upgrade your gear for scrap! +primis_pontis_gardener_1: + name: '&eGorgines Asina' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_2: + name: '&ePiscatores Orissus' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_3: + name: '&eAlcesimus Abito' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_4: + name: '&ePyrgopolynices Perpenna' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_5: + name: '&eLemniselenis Gelasius' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_6: + name: '&eLysimachus Sulinus' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_7: + name: '&eStrobilus Farus' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_groves_catacombs_npc: + name: '&7Inaequaliter Hyaena' + role: '&7' + greetings: + - Psssst! + dialog: + - I heard there is great\ntreasure to be had! + - Something wonderful awaits\nyou if you enter! + - You should adventure\ninto this place... + - Why not go in? + - You should go inside... + - Don't worry, it's\ncompletely safe. + - No danger. I swear! + - Take a look inside. + - You should check\nout this place! + - He he he he he... + - What if somebody\ninside needs help. + - Go in, go in! + - Aren't you curious? + - Surely you should\ntake a peek. + farewell: + - He he he, later! +primis_pontis_groves_generic_npc_1: + name: '&2Sycophanta Mucius' + role: '&2' + greetings: + - I'm fine! + dialog: + - Do not worry about me. + - My brother will come rescue me. + - They won't eat me. + - I assure you I will be just fine. + farewell: + - Web ya later! +primis_pontis_groves_generic_npc_10: + name: '&2Hostilia Metunus' + role: '&2' + greetings: + - Hellos. + dialog: + - Are you bored too? + - Ugh, there must be something to do. + - Maybe I should brew more drinks. + farewell: + - See ya! +primis_pontis_groves_generic_npc_11: + name: '&2Tortilia Getha' + role: '&2' + greetings: + - Hi there. + dialog: + - My husband makes the best cakes. + - Want a slice? + - So delicious and moist! + farewell: + - Bye! +primis_pontis_groves_generic_npc_12: + name: '&2Consentia Apellinus' + role: '&2' + greetings: + - Oh, hello. + dialog: + - There, as good as new! + - Have to make sure the light keeps them away. + - Another lantern fixed... + farewell: + - Don't let the spiders bite! +primis_pontis_groves_generic_npc_13: + name: '&2Novia Senecius' + role: '&2' + greetings: + - Hi! + dialog: + - Oh, did not expect to see anyone here. + - Just gotta be quick and they can't get ya. + - The spiders don't stop me. + - This is my favorite resting spot. + farewell: + - Stay safe. +primis_pontis_groves_generic_npc_14: + name: '&2Maximia Priscus' + role: '&2' + greetings: + - Shhhh... + dialog: + - Thought you could\nsteal from me elves... + - Gonna get back my\npossessions when\nthey go sleep. + - Made it here by\ngoing around. + - They never saw\nme coming. + farewell: + - Keep it down. +primis_pontis_groves_generic_npc_15: + name: '&2Herennia Exsupereus' + role: '&2' + greetings: + - Hey there. + dialog: + - Just woke up. + - It's gonna be a good\nday I can feel it. + farewell: + - Bye bye. +primis_pontis_groves_generic_npc_16: + name: '&2Atria Maursus' + role: '&2' + greetings: + - Greetings. + dialog: + - Not sure how the king\nexpects me to do\nall of this... + - So much work.. + - Busy, busy, busy. + - This paperwork\nwon't do itself. + farewell: + - Bye bye. +primis_pontis_groves_generic_npc_17: + name: '&2Felicius Esurpus' + role: '&2' + greetings: + - Greetings! + dialog: + - If you need anything\nspeak to the king. + - Sorry, I am busy. + - No time for chit-chat,\nmy apologies. + farewell: + - Goodbye. +primis_pontis_groves_generic_npc_2: + name: '&2Sceledrus Fredisius' + role: '&2' + greetings: + - Heya! + dialog: + - I am actually fishing for bugs. + - Large aqua-bugs fall from the trees. + - I use tree sap as bait. + - The aqua-bugs cannot resist the bait! + - They are actually amphibious. + - Gotta catch'em before they head for the trees. + - They are quite tasty if you roast them. + - Hoping for a good catch! + farewell: + - Later. +primis_pontis_groves_generic_npc_3: + name: '&2Felicius Surius' + role: '&2' + greetings: + - Hi there! + dialog: + - The ocean is so pretty. + - I could stand here for days. + - The spiders sure are annoying. + farewell: + - Bye. +primis_pontis_groves_generic_npc_4: + name: '&2Periplectomenus Burcanius' + role: '&2' + greetings: + - Welcome! + dialog: + - Plenty of glow berries left. + - Hope you like my little farm. + - So many wines to attend to. + farewell: + - See you later. +primis_pontis_groves_generic_npc_5: + name: '&2Stephanus Magnus' + role: '&2' + greetings: + - Hey there! + dialog: + - Did you check out the berry farm? + - Lovely time for a walk. + - Can't be inside all the time. + farewell: + - Have a good one. +primis_pontis_groves_generic_npc_6: + name: '&2Abundantius Rogatus' + role: '&2' + greetings: + - Hiya! + dialog: + - What brings you into our lovely hole? + - Feel free to stay a while. + farewell: + - Bye. +primis_pontis_groves_generic_npc_7: + name: '&2Albanus Ivmarus' + role: '&2' + greetings: + - Easy there... + dialog: + - What? Yes, I'm doing just fine. + - I did not have too many, nope. + - Just one more... + - One more pint... + farewell: + - Farewell. +primis_pontis_groves_generic_npc_8: + name: '&2Bacchis Aventinus' + role: '&2' + greetings: + - Good day or evening... + dialog: + - I am so cozy right now. + - We used to go outside more often. + - Too many dangers outside these days. + farewell: + - Bless ya. +primis_pontis_groves_generic_npc_9: + name: '&2Pasicompsa Getha' + role: '&2' + greetings: + - Come in, come in! + dialog: + - Welcome to the best hole in the grove! + - Built this hole with my own hands! + - Hope you enjoy your stay! + farewell: + - Come back soon! +primis_pontis_groves_hole_luxuria: + name: '&cLuxuria Gorgonius' + role: '&c' + greetings: + - Hi there! + - Hellos! + dialog: + - Life is all about taking it easy. + - Why stress. + farewell: + - Visit us again! +primis_pontis_groves_hole_phygia: + name: '&cPhygia Gorgonius' + role: '&c' + greetings: + - Welcome to my home! + - Hellos! + dialog: + - We have to take action! + - Too many elves in our grove. + farewell: + - Visit us again! +primis_pontis_groves_lighthouse_generic_npc_1: + name: '&3Eleusium Martius' + role: '&3' + greetings: + - What brings you here? + dialog: + - Gotta make sure the\nlighthouse is working. + - Nice to see someone\ncome visit. + farewell: + - Goodbye. +primis_pontis_groves_lighthouse_generic_npc_2: + name: '&3Caelia Zoilus' + role: '&3' + greetings: + - Hey. + dialog: + - I hope he will\nbe alright. + - My turn to watch\nover the light. + - We almost ran\nout of food. + farewell: + - Bye. +primis_pontis_groves_lighthouse_sick_man: + name: '&3Alanus Secundas' + role: '&c' + dialog: + - I don't feel so good + - Hopefully I recover soon. + - Well, I am feeling a bit better. + - We need more food. + farewell: + - Farewell. +primis_pontis_groves_parkour_npc_1: + name: '&3Posuere Hominem' + role: '&c' + dialog: + - Up for a challenge? + - You think you got what it takes? + - Wanna go swinging? + - You a mad lad? + - No cheating! + farewell: + - See you later. +primis_pontis_groves_parkour_npc_2: + name: '&cIdoneitatem Hominem' + role: '&3' + dialog: + - That was impressive! + - Try and beat my record of 1m 47s. + - No cheating! + farewell: + - See you later. +primis_pontis_guard: + name: '&cPontis Guard' + role: '&8' + greetings: + - Want to upgrade gear? + dialog: + - Lost? Follow the bridge colors. + - Every bridge path has at least one color! + - Stay out of trouble! + - Don't cause any trouble! + - Pontis was built like a maze for defense. + - The bridge ceilings show that path's color! +primis_pontis_guard_1: + name: '&cPontis Guard' + role: '&8' + greetings: + - Want to upgrade gear? + dialog: + - Lost? Follow the bridge colors. + - Every bridge path has at least one color! + - Stay out of trouble! + - Don't cause any trouble! + - Pontis was built like a maze for defense. + - The bridge ceilings show that path's color! +primis_pontis_guard_2: + name: '&cPontis Guard' + role: '&8' + greetings: + - Hello! + dialog: + - This way to the shogun! +primis_pontis_guard_rat: + name: '&cPontis Elite Guard' + role: '&8' + greetings: + - Darn rats! + dialog: + - Filthy rats!!! + - Hold still,\ndarn you! + - Stop dodging\nmy attacks! + - Almost got one! + - Just die! + - Why wont you die!!! + - You can't dodge\nforever! + - Next strike! + - You're dead! + - How dare you\ndodge! + - Almost! +primis_pontis_guard_rat_at_wormhole: + name: '&cPontis Elite Guard' + role: '&8' + greetings: + - What's taking\nso long. + dialog: + - We got this\nunder control. + - Do not worry,\nthe elite guard\nis on the case! +primis_pontis_guard_shogun_1: + name: '&4Royal Guard' + role: '&8' + dialog: + - Don't go getting into trouble. + - Don't mind me, just keeping the peace. + - No funny business here. + - I've got my eye on you, adventurer. + - No questions, and no one gets hurt! + - Ain't got no time for messing around. + farewell: + - Safe travels, adventurer. +primis_pontis_guard_shogun_1_cat_quest: + name: '&4Royal Guard' + role: '&8' + dialog: + - Don't go getting into trouble. + - Don't mind me, just keeping the peace. + - No funny business here. + - I've got my eye on you, adventurer. + - No questions, and no one gets hurt! + - Ain't got no time for messing around. + farewell: + - Safe travels, adventurer. +primis_pontis_mille_arena_master_observatory: + name: Stella Hominis + role: + greetings: + - Hellos! + dialog: + - I hope to see many stars. + - Such heavenly bodies! + - The cosmos calls to me. + - Infinite possibilities. + - The ancient knowledge... + - I have tales to tell. + - If only you knew... + farewell: + - May the stars bless you. +primis_pontis_mille_concerned_shipmate: + name: '&3Delphium Calpurnius' + role: '&8' + dialog: + - Sigh. + - So much for my\nshipments... + farewell: + - Safe travels! +primis_pontis_mille_fields_camp_generic_npc_1: + name: '&cScribonia Ingenvinus' + role: '&c' + dialog: + - The most dangerous\nweapon is the one\nbetween your ears. + - Three arrows\nis all I need. + farewell: + - Catch ya later! +primis_pontis_mille_fields_camp_generic_npc_2: + name: '&cValador Lumus' + role: '&c' + dialog: + - I have hunted in\nmany places. + - Do you travel\na lot too? + farewell: + - May your blade be swift. +primis_pontis_mille_fields_camp_generic_npc_3: + name: '&cPhygia Ahala' + role: '&c' + dialog: + - Nothing like a\ngood hunt! + farewell: + - Stay safe. +primis_pontis_mille_fields_camp_generic_npc_4: + name: '&cAdrius Paterculus' + role: '&c' + dialog: + - The hunt calls! + farewell: + - Swift death. +primis_pontis_mille_fields_camp_generic_npc_5: + name: '&cCappadox Galerus' + role: '&c' + dialog: + - Join us, stranger! + farewell: + - Later. +primis_pontis_mille_fields_camp_generic_npc_6: + name: '&cSulpicio Rutilius' + role: '&c' + dialog: + - Hope our camp\nprovides you respite\nfrom the wild. + farewell: + - Bye. +primis_pontis_mille_fields_camp_generic_npc_7: + name: '&cAquarius Manus' + role: '&c' + dialog: + - Don't mind me just\nfetching some water. + - Clear blue water today. + farewell: + - Bye. +primis_pontis_mille_fields_camp_magmus: + name: '&cMagmus Hypnos' + role: '&4' + dialog: + - Where is Volumnia... + - I hope she isn't in\ntrouble again. + - I need a good rest. + - If only there were more\nhours in the day. + - Speak to me when you\nhave found Volumnia. + - So much work,\nso little time. + - Yet another 17 hour day. + - I worry too much. + farewell: + - Never enough time... +primis_pontis_mille_fields_farm_berry_npc: + name: '&9Dordalus Nasica' + role: '&e' + dialog: + - Berries are so tasty! + - You should eat\nmore berries! + - Why would they\nsteal my berries... + farewell: + - See'd ya later. +primis_pontis_mille_fields_farm_boy_npc: + name: '&9Planesium Victricius' + role: '&e' + dialog: + - So many rats... + - Phew almost\ndone here. + - This thing better hold. + - Any more lifting and\nI'm gonna break. + - The view from here\nis really nice. + - OK, back to work! + farewell: + - Try some our berries! +primis_pontis_mille_fields_farm_npc: + name: '&9Milonia Majus' + role: '&e' + dialog: + - Get away, darn rats! + - Stop eating my goods! + - Sigh... + farewell: + - Later. +primis_pontis_mille_fields_farm_well_npc: + name: '&eVolumnia Zoilus' + role: '&c' + dialog: + - Watch out for its spit! + - Its saliva is toxic. + - Please help! + - I hope nobody hears\nabout this... + - Am I glad to see you! + farewell: + - How could I let this happen. +primis_pontis_mille_fields_windmill_npc_1: + name: '&eDinia Niraemius' + role: '&d' + dialog: + - Plenty of wheat to process! + - No flour no bread. + - Do you like bread too? + farewell: + - See you. +primis_pontis_mille_fields_windmill_npc_2: + name: '&eDaemones Maritialis' + role: '&d' + dialog: + - It's so nice out here! + - Do you like my windmill? + - Just out here on break. + farewell: + - See you. +primis_pontis_mille_fields_windmill_npc_3: + name: '&eAdulescens Lupis' + role: '&d' + dialog: + - Hoping for some good wind! + - Need some flour? + - This one is the best Windmill around! + farewell: + - Bless ya. +primis_pontis_mille_general_bromia: + name: '&6Bromia Curio' + role: '&6General' + greetings: + - Hail! + dialog: + - It's time for war! + farewell: + - Goodbye! +primis_pontis_mille_general_cylindrus: + name: '&eCylindrus Celatus' + role: '&eGeneral' + greetings: + - Hail! + dialog: + - There is not enough time! + farewell: + - Goodbye! +primis_pontis_mille_general_godefridus: + name: '&cGodefridus Novation' + role: '&c' + greetings: + - Greetings! + - Hail! + dialog: + - Someone needs to drop\noff these documents. + - So many candles... + farewell: + - See you +primis_pontis_mille_general_rogerius: + name: '&eRogerius Olennius' + role: '&eGeneral' + greetings: + - Hail! + dialog: + - So much to do! + - I hope those 4 are ok... + farewell: + - Bye! +primis_pontis_mille_lighthouse_man: + name: '&3Hegio Remus' + role: '&c' + dialog: + - It is so beautiful up here. + - The best view... + farewell: + - Farewell. + - The sun sets! +primis_pontis_mille_major: + name: '&cFortes Bellator' + role: '&c' + greetings: + - Hello traveler! + - Hail! + dialog: + - Those darn goblins! + farewell: + - Farewell! +primis_pontis_mille_mew_meowzer: + name: '&aMew Meowzer' + role: '&d' + dialog: + - Meooooww! + - Meow... + - Mreeeooooowww... + - Meowww. + - MEOW! + farewell: + - Prrrr meow! +primis_pontis_mille_observatory_arena_turn_in: + name: Virgo Dexippus + role: + greetings: + - Hi! + dialog: + - Stella knows a lot. + - Stars have so much to tell. + - The light tells all. + farewell: + - May the moon light your way. +primis_pontis_mille_royal_guard_centurion: + name: '&4Royal Guard Centurion' + role: '&8' + dialog: + - No dallying! + - Set up camp! + - Where are our reinforcements? + - How many have fallen? + - We need to reorganize! + farewell: + - Tread lightly and carry a big sword. +primis_pontis_mille_scout_1: + name: '&cSyra Ursacius' + role: '&cWounded Scout' + greetings: + - Hail! + dialog: + - I can barely hold on... + farewell: + - Bye! +primis_pontis_mille_scout_2: + name: '&cSparax Auxilius' + role: '&cWounded Scout' + greetings: + - Hail! + dialog: + - The pain... + farewell: + - Bye! +primis_pontis_mille_scout_leader: + name: '&cBlepharo Octavius' + role: '&cScout Leader' + greetings: + - Hail! + dialog: + - It was too much... + farewell: + - Bye! +primis_pontis_mille_shogun: + name: '&6Navita' + role: '&c' + greetings: + - Yes? + dialog: + - Can I help you? + farewell: + - Walk softly, and carry a big gun. +primis_pontis_mille_slums_generic_npc_1: + name: '&7Gallicles Rex' + role: '&7' + dialog: + - It's not much but its our\nlittle part of town + farewell: + - Later. +primis_pontis_mille_slums_generic_npc_2: + name: '&7Gallicles Caelistis' + role: '&7' + dialog: + - Day by day... + farewell: + - '...' +primis_pontis_mille_slums_generic_npc_3: + name: '&7Nicodemus Frontinus' + role: '&7' + dialog: + - Fresh water for\nthe home. + farewell: + - The well serves\nus well +primis_pontis_mille_slums_generic_npc_4: + name: '&7Cocus Lucio' + role: '&7' + dialog: + - Hope you're having\na great day. + farewell: + - Enjoy your stay. +primis_pontis_mille_slums_generic_npc_5: + name: '&7Cornelia Florius' + role: '&7' + dialog: + - Which one should\nI get... + farewell: + - So many pretty\nflowers. +primis_pontis_mille_slums_generic_npc_6: + name: '&7Rutilia Placidus' + role: '&7' + dialog: + - I love it here. + - The smell of hay\nmakes me happy. + - My favorite place to\nrelax after a hard day. + farewell: + - Hay ya later! +primis_pontis_mille_slums_npc_1: + name: '&7Lena Lucan' + role: '&7' + dialog: + - Just one loaf of bread... + farewell: + - Wonder what tomorrow brings. +primis_pontis_mille_slums_npc_2: + name: '&7Tranio Florens' + role: '&7' + dialog: + - Doing OK today\nactually. + farewell: + - Night save ya. +primis_pontis_mille_slums_npc_3: + name: '&7Rufia Tertulus' + role: '&7' + dialog: + - At least something\ngood for\nthe kids. + - Not much at\nthe market... + - I cannot\nafford that. + farewell: + - Later. +primis_pontis_mille_slums_npc_4: + name: '&7Fabia Praetextus' + role: '&7' + dialog: + - Just close my eyes\nfor a second. + - Gotta imagine I am\nat a better place. + farewell: + - Goodbye. +primis_pontis_mille_slums_npc_5: + name: '&7Augustina Verrucosis' + role: '&7' + dialog: + - So many mouths\nto feed. + - Maybe some fruit\nfor the little\nones. + farewell: + - Bye. +primis_pontis_mines_guard_1: + name: '&cPontis Guard' + role: '&c' + greetings: + - HELP!!! + dialog: + - Please kill them! + - I am so scared. +primis_pontis_mines_guard_2: + name: '&cPontis Guard' + role: '&c' + greetings: + - SOMEONE PLEASE!!! + dialog: + - I don't wanna die! + - Can't hold out any more. +primis_pontis_mines_guard_3: + name: '&cPontis Guard' + role: '&c' + greetings: + - SAVE ME!!! + dialog: + - Are they gone? + - GET ME OUT! +primis_pontis_outpost_officer: + name: '&4NAME ME' + role: '&8' + dialog: + - I am unfinished! + - There is supposed\nto be an outpost\nhere. + farewell: + - Bye! +primis_pontis_redwoods_injured_lumberjack: + name: '&6Lyco Lupicinus' + role: '&6' + greetings: + - Heyo! + dialog: + - Darn saw! + - Got me again... + farewell: + - See you later. +primis_pontis_redwoods_lumberjack: + name: '&6Ligna Crispian' + role: '&6' + greetings: + - Greetings! + dialog: + - I love the look of a healthy tree. + - The brown tree really smells. + - |- + Pretty sure I saw a wolf on two legs + creeping around at night around here. + farewell: + - Until next time. +primis_pontis_redwoods_lumberjack_generic_1: + name: '&6Mulier Proculus' + role: '&6' + greetings: + - Hey-yo! + dialog: + - I wish they would leave us alone. + - Perfect day for logging. + farewell: + - Pinecone ya later! +primis_pontis_redwoods_lumberjack_generic_10: + name: '&6Piscatores Trenico' + role: '&6' + greetings: + - Well met! + dialog: + - Go away wolves! + - Leave me alone, darn fur-balls! + - Hah! Try and reach me up here! + farewell: + - Bye, Bye! +primis_pontis_redwoods_lumberjack_generic_2: + name: '&6Alanus Hermina' + role: '&6' + greetings: + - Hi... + dialog: + - Not so loud, keep it down. + - I am catching an extra break. + - Don't tell em I am here. + - Logging is tough work... + farewell: + - Later +primis_pontis_redwoods_lumberjack_generic_3: + name: '&6Lena Triarius' + role: '&6' + greetings: + - What's up! + dialog: + - Just standing here buzzin! + - Operating the saw is kinda fun. + - Gotta make sure you don't get hurt. + farewell: + - Catch you later! +primis_pontis_redwoods_lumberjack_generic_4: + name: '&6Aquila Isatis' + role: '&6' + greetings: + - How's it going! + dialog: + - Darn logs! + - No, not that way! + - Float better!!! + - Yep, that will do it. + farewell: + - See ya! +primis_pontis_redwoods_lumberjack_generic_5: + name: '&6Sulpicio Sidonius' + role: '&6' + greetings: + - Hi! + dialog: + - Nothing like a nice fire! + - Just relaxing after an honest day of work. + - Join us! + farewell: + - Bye, friend! +primis_pontis_redwoods_lumberjack_generic_6: + name: '&6Strobilus Clemens' + role: '&6' + greetings: + - Salutations! + dialog: + - Chopping like a beaver! + - The fastest axe in the west. + - No tree is a match for me! + farewell: + - Smell ya later! +primis_pontis_redwoods_lumberjack_generic_7: + name: '&6Candidus Nigellus' + role: '&6' + greetings: + - Greetings! + dialog: + - Fastest axe...my bottom! + - Don't take his ramblings seriously. + - Mr. big-shot sure has a lot to say. + farewell: + - Goodbye! +primis_pontis_redwoods_lumberjack_generic_8: + name: '&6Strobilus Clemens' + role: '&6' + greetings: + - I'm a bit busy! + dialog: + - We need to increase production... + - If we raise the cost... + - Need to order more axes. + farewell: + - Uh... +primis_pontis_redwoods_lumberjack_generic_9: + name: '&6Martinus Lepontus' + role: '&6' + greetings: + - Woah, hello! + dialog: + - You're coming down big one! + - I will show you! + - My axe, your bark, they should meet. + - Start off with a good chop. + farewell: + - Scared me... +primis_pontis_redwoods_lumberlord: + name: '&6Magnus Castorea' + role: '&6' + greetings: + - HELLO! + dialog: + - Nothing like healthy wood. + - |- + For every tree we cut, + we plant a new one! + - Big brown logs, yep. + farewell: + - BYE! +primis_pontis_redwoods_reyn: + name: '&6Reynus Protectoris' + role: '&6' + greetings: + - I am turning up the heat! + - Hiya! + dialog: + - Are you into logs? + - I love the smell of lumber! + farewell: + - See you later. + - Bye bye! +primis_pontis_scrapper: + name: '&7Fragmentum' + role: '&8' + greetings: + - Got something to scrap? + - Got trash? + - Need scrappin'? + dialog: + - I'll scrap anything you bring! + - Need scrap? + - Want scrap? +primis_pontis_smelter: + name: '&7Orbis' + role: '&8' + greetings: + - Want to upgrade gear? + dialog: + - Need upgrade orbs? + - I'll make upgrade orbs for scrap! + - Bring me scrap! +primis_sewer_donatello: + name: '&5Donatello' + role: '&dSewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_sewer_leonardo: + name: '&1Leonardo' + role: '&9Sewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_sewer_michelangelo: + name: '&6Michelangelo' + role: '&eSewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_sewer_raphael: + name: '&4Raphael' + role: '&cSewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_spa_attendee_1: + name: '&fNatsumi' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_2: + name: '&5Hanako' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_3: + name: '&3Tamika' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_4: + name: '&9Zaphra' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_5: + name: '&4Chie' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_6: + name: '&fKatashi' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_7: + name: '&dAkihiko' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_8: + name: '&6Sheranee' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - Rawr... + - OwO + farewell: + - Have fun! +primis_spa_staff: + name: '&cAozora' + role: '&7' + dialog: + - Enjoy the hot spring! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_staff_2: + name: '&6Rei' + role: '&7' + dialog: + - Enjoy the hot spring! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_terravilla_annoyed_explorer: + name: '&6Dorippa Sarimarcus' + role: '&6' + greetings: + - How's it going. + dialog: + - Not again. + - Stuck once more. + farewell: + - Be seeing you. +primis_terravilla_explorer: + name: '&6Telestis Senna' + role: '&6' + greetings: + - How goes it. + dialog: + - Always so\nbusy. + - Need a bag? + farewell: + - Bye. +primis_terravilla_generic_npc_1: + name: '&6Stephanium Major' + role: '&6' + greetings: + - Welcome to Terravilla! + dialog: + - Watch out for the\nTwo Legged Terrors! + - Here to check out the ruins? + farewell: + - Bye. +primis_terravilla_generic_npc_10: + name: '&6Mallia Galvisius' + role: '&6' + greetings: + - Heyo! + dialog: + - I would rather be in\ndown in the ruins... + - Hog watching to\npass the time. + farewell: + - Laters. +primis_terravilla_generic_npc_11: + name: '&6Papiria Virginius' + role: '&6' + greetings: + - Ok then... + dialog: + - Hit him harder! + - Woah! Good one! + - Yeah! Mess him up! + farewell: + - Yep... +primis_terravilla_generic_npc_12: + name: '&6Umbria Maccalus' + role: '&6' + greetings: + - What! + dialog: + - Is a girl not\nallowed to be\non a rooftop. + - Just try and\nget me down! + farewell: + - Yeah, whatever... +primis_terravilla_generic_npc_2: + name: '&6Delphium Assanius' + role: '&6' + greetings: + - Leave me alone! + dialog: + - What are you\nlooking at. + farewell: + - Scram! +primis_terravilla_generic_npc_3: + name: '&6Stephanium Vopiscus' + role: '&6' + greetings: + - Leave me alone! + dialog: + - What are you\nlooking at. + farewell: + - Scram! +primis_terravilla_generic_npc_4: + name: '&6Simo Clericus' + role: '&6' + greetings: + - Hey! + dialog: + - Heard the hog is on\nthe lift again. + farewell: + - Bye. +primis_terravilla_generic_npc_5: + name: '&6Harpax Colias' + role: '&6' + greetings: + - Ello. + dialog: + - The bo...I mean the\nOverseer is upstairs. + farewell: + - Laters. +primis_terravilla_generic_npc_6: + name: '&6Sulpicio Epolonius' + role: '&6' + greetings: + - Hi there. + dialog: + - I hope the ruins\nopen up again soon. + - I miss artifact\nhunting. + farewell: + - Goodbye. +primis_terravilla_generic_npc_7: + name: '&6Baebia Lucan' + role: '&6' + greetings: + - '...' + dialog: + - Cringe... + farewell: + - '...' +primis_terravilla_generic_npc_8: + name: '&6Novia Longinus' + role: '&6' + greetings: + - '...' + dialog: + - Are you always\nstaring at people? + - How about some\nprivacy? + farewell: + - '...' +primis_terravilla_generic_npc_9: + name: '&6Septimia Baro' + role: '&6' + greetings: + - Oh, hey. + dialog: + - If it opens up again\nthen I gotta go\nget more of these. + - What is this skull\nnfrom hmm... + farewell: + - '...' +primis_terravilla_overseer: + name: '&6Lutum Princeps' + role: '&6' + greetings: + - Yes? + dialog: + - What is it\nnow... + - I need to check\nup on them. + - At least I\nam not bored. + farewell: + - Good luck. +primis_terravilla_researcher: + name: '&6Plautia Suilius' + role: '&6' + greetings: + - Hmm... + dialog: + - Maybe if... + - That can't be right + - Not sure... + farewell: + - Later... +primis_traveler_1: + name: '&6Lysidamus Nolus' + role: '&6' + greetings: + - Hello stranger! + dialog: + - On my way back from the village. + - Heading to the village? + - Good luck on\nyour travels. + farewell: + - Roads bless you. +primis_traveler_2: + name: '&6Citro Gala' + role: '&6' + greetings: + - Hi! + dialog: + - On my way back\nfrom the village. + - Coming from Pontis Mille or? + - Good luck! + farewell: + - Roads bless you. +primis_traveler_3: + name: '&6Bromia Culleolus' + role: '&6' + greetings: + - Hello! + dialog: + - Are you too going\nto the village? + - I heard it's pretty\ncold there at\nthe village. + - Phew! Almost there!\nI gotta keep going. + farewell: + - Roads bless you. +primis_traveler_4: + name: '&6Demenis Nolus' + role: '&6' + greetings: + - Hello stranger! + dialog: + - Good to see someone\nelse on the road. + - Almost reached the village. + - Phew! + farewell: + - Roads bless you. +primis_traveler_5: + name: '&6Callipho Classicius' + role: '&6' + greetings: + - Heya! + dialog: + - I need better shoes. + - Soon I will\nbe home. + - Good to see the\nfields again! + farewell: + - Safe travels! +primis_traveler_6: + name: '&6Rodenus Palis' + role: '&6' + greetings: + - Hi there! + dialog: + - I am on my way back\nfrom the village. + - Good to see\nPontis Mille again. + - Is my brother lost again... + - Where is he? + farewell: + - Later! +primis_traveler_7: + name: '&6Gorenus Palis' + role: '&6' + greetings: + - Hey... + dialog: + - Am I lost again? + - This isn't Pontis Mille. + - Where am I? + - Uhh, this doesn't\nseem like the\nright way... + farewell: + - Bye. +quest_giver: + name: Qel'Thuzad + role: + greetings: + - Greetings, adventurer!\nFancy a quest? + - You! I've got a quest! + - Feeling... adventurous? + dialog: + - Complete guild quests\nfor cool rewards! + - Higher tier quests have\nbetter rewards! + - Higher tier quests make\nyou hunt higher level mobs! + - Want a harder challenge?\nIncrease your guild rank! + - Make sure you're well equipped\nfor these quests! + farewell: + - Viaggia sicuro, amico. + - Buona caccia! + - Live long and prosper! + - Come back with your shield,\n or on it. + - Life before death! + - Strength before weakness! + - Journey before destination! +refiner_config: + name: Ralph + role: + greetings: + - Want to uprade your scrap? + - Got scrap? + - Looking for low level scrap! + - Greetings, got scrap? + - I'll recycle your scrap! + dialog: + - Need your scrap upgraded? + - Upgrade your scrap here! + - Upgrade 10 scrap to a higher level! + - Make your scrap more useful! + - Got low level scrap? + farewell: + - Come back when you have\nmore to low level scrap + - Don't forget to make that\nscrap useful! + - Go get into a scrap! +repairman_config: + name: Reggie + role: + greetings: + - Get your items repaired! + - Repairing items for scrap! + - Turn that scrap into durability! + - Need a repair? + - Got damaged items? + dialog: + - Best repairs in town! + - I got your fix! + - Need a fix? + - I'll repair your items! + - Need elite items repaired? + farewell: + - Don't forget to do maintenance! + - I'll be here if you need me! + - Call me beep me if you wanna reach me,\nif you wanna page me that's ok +santa: + name: '&4Saint Nick' + role: '&c' + greetings: + - Ho ho ho! + dialog: + - I have lost some presents, \ncan you help me? + - Dear traveller, I have\na request for you! + - Can you help an old man\nin his time of need? + farewell: + - Ho ho ho! +scrapper_config: + name: Kelly + role: + greetings: + - Want to get rid of items? + - Need to recycle items? + - Looking to scrap? + - It's scrap 'o clock! + - Scrap time! + dialog: + - Scrappy deals! + - Get your scrap here! + - 75% chance to work! + - There are no refunds. + - Recycle, reuse, reduce! + farewell: + - Come back when you have\nmore to scrap + - Don't forget to make that\nscrap useful! + - Happy scrapping! +smelter: + name: Sam + role: + greetings: + - Got scrap? + - Got extra scrap? + - I smell scrap on you!? + - Please I need scrap! + - Feed me scrap! + dialog: + - I'll make your scrap useful! + - Give me scrap and I'll\ngive you upgrade orbs! + - Scrap is useless, give it to me! + farewell: + - Come back when you have\nmore scrap + - Off to the upgrader you go! +special_blacksmith: + name: Grog + role: + greetings: + - Need something? + - Got anything good? + - We have nothing but the best + - Got anything worth selling? + - We only buy elite mob gear. + dialog: + - We buy low and sell high. + - No refunds. + - Absolutely no refunds. + - There are no refunds. + - No taksies backsies. + - Shop purchases are final. + farewell: + - Come back when you have\nmore to spend + - Don't get yourself killed,\nwe want you to bring us\nmore gear. + - Next time buy something \nmore expensive. + - Don't forget, no refunds. +test_npc: + name: Test NPC + role: Testing! + greetings: + - Test Greeting! + dialog: + - Test Dialog! + farewell: + - Test Farewell! +travelling_merchant: + name: Jeeves + role: + greetings: + - Got something to sell? + - You called? + - Huh? + dialog: + - I'll buy it on the cheap! + - Got something for me? + - Time is money! + farewell: + - Call me again anytime! + - Was that all? + - Safe travels! + - Don't get yourself killed! + - Good hunting! +unbinder: + name: Ulfric + role: + greetings: + - Greetings. + - Well met. + - Hail, friend. + - Yes? + - May I help you? + dialog: + - I will unbind your items\nfor an extremely rare unbind scroll. + - I am the only one qualified\nto unbind your goods. + - Have an unbind scroll? + farewell: + - "Remember: Use unbind\nscrolls wisely." + - Viaggia sicuro, amico. +wood_league_arena_master: + name: Gladius + role: + greetings: + - Welcome to the\nArena! + dialog: + - Prepared to face the arena? + farewell: + - Return with your shield, or on it! +wood_league: + arenaName: Wood League + arenaMessages: + - wave=1:message=&8[Gladius] &fToday's main event! A legendary fighter came all the way to the arena to test his might against the toughest monsters from all the land! But before that, here's a rookie fighting some zombies. + - wave=2:message=&8[Gladius] &fWould you look at that, they at least know how to wave their arms! That was just the warmup, let's start putting on some pressure! + - wave=3:message=&8[Gladius] &fSo you think you know how to fight? Well this wave will put the &cheat &fon! Ha ha ha ha ha! + - wave=4:message=&8[Gladius] &fAlright I guess they can take the heat! Ladies and gentlemen, strap on, we might be in for a show! + - wave=5:message=&8[Gladius] &fI found this &cweird creature &foutside, and I thought putting it in the arena would be funny! + - wave=6:message=&8[Gladius] &fSeems like you can handle small groups of enemies just fine, &clet's try scaling that up! + - wave=7:message=&8[Gladius] &fSo you think you can truly challenge the arena? We shall see... + - wave=8:message=&8[Gladius] &fNot bad, but what if every enemy is a &cmelee &fenemy? + - wave=9:message=&8[Gladius] &fNice, nice, but what if they're all &cranged &finstead? + - wave=10:message=&8[Gladius] &fCareful now, a &cbad doggo &fseems to have wandered into the arena! Where did it even come from? + - wave=11:message=&8[Gladius] &fAlright folks we got animal control to deal with the bad doggos, we're back in business! + - wave=12:message=&8[Gladius] &fIt seems like the audience is clamoring for &cmore&f! Well, let's give it to them! + - wave=13:message=&8[Gladius] &fSeems like the custodians got bored and gave the arena creatures &2poison&f! Let's see where this goes... + - wave=14:message=&8[Gladius] &fWell that was... boring! Whoever gave those guys poison is fired! Come up with something better next time! + - wave=15:message=&8[Gladius] &fAnd here we have this year's prize-winning &4hog&f! It got first place for ugliness and meanness! Everyone give a round of applause for &4Mr. Oinkers&f! + - wave=16:message=&8[Gladius] &fMr. Oinkers is now bacon! Here comes &cMr. Oinker's fans&f, flooding the arena to get their revenge! + - wave=17:message=&8[Gladius] &fIt would seem as though our arena challenger thinks they have a shot! But can they deal with even more &cpowerful &ffoes? + - wave=18:message=&8[Gladius] &fThe &cfencing club &fand the &carchery club &fare having a contest! Let's see which one does better! + - wave=19:message=&8[Gladius] &fThe fencing club didn't so so hot, let's see what the &carchery club&f has for us! + - wave=20:message=&8[Gladius] &fSeems like the archery club didn't do so hot either! It seems like our challenger has begun attracting the attention of some of our top gladiators! Introducing &2Zoltan, the Pride of the Zombies&f! + - wave=21:message=&8[Gladius] &fUnbelievable! Seems like this rookie defeated Zoltan! Do we have a potential new champion in our hands? + - wave=22:message=&8[Gladius] &fSpectators are starting to place their bets! How far can today's contestant go? + - wave=23:message=&8[Gladius] &fDon't look away now, this wave's enemies all have &cwithering &fattacks! + - wave=24:message=&8[Gladius] &fSeems like some pretty big arena names are starting to arrive to stop this challenger! Stay tuned! + - wave=25:message=&8[Gladius] &fHere comes &bAgdluak&f, the archer from the Great North! Beware of its &bfrost&f! + - wave=26:message=&8[Gladius] &fThat was a pretty cool fight! I am &cswarming &fwith excitement to see what's next! + - wave=27:message=&8[Gladius] &fI've been told the arena grows harder! &cZombies immune to arrows, skeletons that freeze their opponents &f- what will they think of next!? + - wave=28:message=&8[Gladius] &fIt's time to show off those &cfencing &fskills! Remember, it's all about the legwork! + - wave=29:message=&8[Gladius] &fAnd now, let's have some &ctarget practice&f! The challenger is the target! + - wave=30:message=&8[Gladius] &fA true arena champion approaches! The &2Southern Viper &fonce again seeks to &cpoison &ftheir enemies to death with his &cthousand poisons&f! + - wave=31:message=&8[Gladius] &fThe Southern Viper has fallen! The crowd goes wild! What a day, ladies and gentlemen, what a day! + - wave=32:message=&8[Gladius] &fI have been told that the arena custodians are done messing around and are staring to let loose! Can our challenger survive this? + - wave=33:message=&8[Gladius] &fSeems like some enemies got their hands on some of Southern Viper's &cpoisons&f! You do not want to get hit by those, ladies and gentlemen! + - wave=34:message=&8[Gladius] &fBobby, make sure you put 1,000 Elite Coins on these contestants dying for me - no, no, 1,000 Elite Coins - wait was this thing on? I mean, onwards to the next wave! + - wave=35:message=&8[Gladius] &fLadies and gentlemen, what a rare treat! It would seems as the very &aWood League Jester &fhas stepped up to fight! What delightful &2tricks &fdoes he have for us today? + - wave=36:message=&8[Gladius] &fWhat a lovely show ladies and gentlemen, give it up for &aThe Jester&f! + - wave=37:message=&8[Gladius] &fBobby, how is my bet doing? What do you mean 10,000 Elite Coins, I told you to put 1,000 on there! Uh, pump them, &cpump the powers up&f! + - wave=38:message=&8[Gladius] &fBobby you're killing me here! Uh, dump some &cswordsmen &fon there, I need to deal with something real quick... + - wave=39:message=&8[Gladius] &fWhat do you mean no refunds? I didn't even want to - ahem, I mean, a legion of &carchers &fhave come from far to show off their skills! + - wave=40:message=&8[Gladius] &fLadies an gentlemen, for, uh, random reasons, I have invited the strongest fighter I can summon! Meet &4Crucios, the Bearer of Curses&f! + - wave=41:message=&8[Gladius] &fCrucios has been defeated!? What has the world come to? + - wave=42:message=&8[Gladius] &fA wealthy for now patron has decided to throw in free healthcare to arena enemies! Will they do better with &2healing&f? + - wave=43:message=&8[Gladius] &f&cWither&f, &cpoison, &cfire&f throw in everything you have! Do you even know how much is on the line!? + - wave=44:message=&8[Gladius] &fThis is clearly not working, let me think of something... + - wave=45:message=&8[Gladius] &fHere is one of the top gladiators of the Wood League Arena! &cThousand Blades &fapproaches once again with his &cinnumerable projectiles&f! He better win! + - wave=46:message=&8[Gladius] &fThousand Blades has fallen! It just seems like you can't get competent gladiators these days! That's fine, you'll see! You'll all see! &cRelease the swarm! + - wave=47:message=&8[Gladius] &fIf swarms don't work, throw in &cmore powers&f! Throw in all of the powers! + - wave=48:message=&8[Gladius] &fWe are starting to run out of options here! Are these all of the &cswordsmen &fwe have left? + - wave=49:message=&8[Gladius] &fAlright send all we have left, we have no other options! Move forth, &carchers&f! + - wave=50:message=&8[Gladius] &fI guess this is it for me... I have no option but to declare - wait, who is that in the distance? Is that &4Uther, the Champion of the Wood League Arena&f? Ladies and gentlemen, match set and over, our contestant has no chance of winning here! They shall be &csmitten &fby our champion! + - wave=51:message=&8[Gladius the Destitute] &fUnbelievable, Uther has been defeated! We have a new arena champion! I would be incredibly excited if I wasn't so terribly in debt now! +ag_welcome_quest_0: + customObjectives: + Objective1: + dialog: + - '&8[&aCasus&8]&f Welcome to the Adventurer''s Guild Hub, the hub for all things EliteMobs!' + - You can always get back here using &2/ag&f! + - Talk to me again for a quest! + name: '&2Finding the AG!' + questLore: + - Discover the Adventurer's Guild Hub using the command &2/ag &0or &2/adventurersguild ! + questAcceptDialog: + - '&8[Odigos]&f Alright, make sure you use &2/ag &f or &2/adventurersguild&f to head off to the Adventurer''s Guild Hub!' + - Make sure you talk to Casus when you're there! +ag_welcome_quest_1: + customObjectives: + Objective3: + dialog: + - '&8[&aGreg&8]&f Want to buy or sell something? I''ve got a little of everything!' + Objective4: + dialog: + - '&8[&aCharles&8]&f Want to learn about fighting elites? Just talk to me!' + Objective1: + dialog: + - '&8[&aHermes&8]&f I take you back to where you were before! Just talk to me again!' + Objective2: + dialog: + - '&8[&aBartley&8]&f Need a stiff drink? My drinks pack an extra punch!' + Objective7: + dialog: + - '&8[&aQel''Thuzad&8]&f These Elite monsters, where do they keep coming from?' + - Ah, never mind that for now, we are always in need of more people to assist us in slaying quests! + - Just talk to me to get one! + Objective12: + dialog: + - '&8[&aGrog&8]&f Want to buy special items? I''ve got just the thing!' + Objective8: + dialog: + - '&8[&aRalph&8]&f Get more out of your scrap by upgrading it! Just talk to me at any time.' + Objective13: + dialog: + - '&8[&aUlfric&8]&f If you bring me a very special and rare item, I can unbind your Elite items.' + - You don't yet look prepared to take this challenge on, but you can make killing the Binder of Worlds your ultimate goal, if you dare. + Objective5: + dialog: + - '&8[&aTim&8]&f Want to upgrade your Elite Items? Just get an upgrade orb from Sam over there!' + Objective10: + dialog: + - '&8[&aKelly&8]&f Got extra Elite items? Don''t know what to do with them? Give them to me, and I''ll turn them into scrap!' + - You can use scrap to do lots of things, like repairing or upgrading Elite items! + Objective6: + dialog: + - '&8[&aGillian&8]&f Do you seek power? Do you desire to reach new heights? Talk to me to unlock new guild ranks, and reach levels of power you never thought to be possible!' + Objective11: + dialog: + - '&8[&aSam&8]&f Got extra scrap? I can refine that into Upgrade Orbs, which you can give to Tim to upgrade your Elite items with!' + Objective9: + dialog: + - '&8[&aReggie&8]&f Need your Elite items repaired? Just bring me some scrap, and I''ll make them as good as new!' + - Remember, the higher the level of your scrap, the better I can repair you Elite item! + name: '&2Welcome to the AG!' + questLore: + - '&aMeet the Adventurer''s Guild NPCs!' +primis_caeruleaum_a_can_of_worms: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis] &fPlease tell me you''re the one bringing the bait.' + name: '&2A can of worms' + questLore: + - Here, take the bait and go. + - Please hurry! + questAcceptDialog: + - '&a[Callidus Piscatus]&f My friend is in a boat near the docks!' + - '&7&oI should hurry to the boat.' + questCompleteMessage: + - '&a[Piscis Nemesis]&f You brought bait? Perfect!' + - The bait should lure it out! + - '&7&oI should talk with Nemesis.' +primis_caeruleaum_fishing: + name: '&2Fish Bait' + questLore: + - We have a big problem! + - I got wounded by a monstrous &cSea Creature&f that came from a fishy portal to another realm! + - My friend &aPiscis Nemesis&f is still out on the boat, trying to either fight the creature or close the portal, + - but he can't do anything without the right bait! + - I'll tell you where to go get &eFish Bait &f, please go help my friend! + - I promise I'll reward you! + questAcceptDialog: + - '&a[Callidus Piscatus]&f Time is of the essence! There are a bunch of &cBig Worms&f to the right when you leave the village!' + - Get 5 and come back here and I will prepare them for use. + - '&7&oI should go get some Fish Bait.' + questCompleteMessage: + - '&a[Callidus Piscatus]&f You brought bait? Perfect!' + - I'll prepare it right away! + - '&7&oI should talk to &aCallidus &7&oagain and collect the prepared bait.' +primis_caeruleaum_fishing_2: + name: '&2Monster Bait' + questLore: + - That did the trick! Hop into the wormhole, I'll hold the boat! + - Let's show this monster the wrath of a fisherman! + questAcceptDialog: + - '&a[Piscis Nemesis]&f Hop in, I''ll hold the boat!' + - Don't forget to put on that &eDiving Helmet&f! + - '&7&oI should enter the wormhole and defeat the Sea Monster.' + questCompleteMessage: + - '&a[Piscis Nemesis]&f Haha! What a show!' + - '&fOf course, I had the situation under control this entire time, but you sure helped a bit!' + - '&fHere, you can have this!' + - '&7&oThe monster is dead and the shore is safe. Seems like a job well done.' +primis_caeruleaum_fletching: + name: '&2Arrow Hunter' + questLore: + - Got a few minutes to help out? + - With all the recent raids, we have found ourselves out of &eGrappling Arrows&f! + - It is usually my job to get them, but things are just a + - bit too dangerous right now for me to go dungeon delving. + - If you could get these &eGrappling Arrows&f for me, + - I will teach you how to use them! + questAcceptDialog: + - '&a[Ventus Artifex]&f Please bring me 10 &eGrappling Arrows &ffrom the ruins just beyond the village.' + - The &cUndead Skeletons&f and &cDrowned&f from of old usually carry these. + - '&7&oI should go kill &cSkeletons&7&o and &cDrowned&7&o at the ruins near the village for their &eGrappling Arrows&7&o.' + questCompleteMessage: + - '&a[Ventus Artifex]&f Great work!' + - '&eGrappling Arrows &fcan be used on &cTarget Blocks &fto get to hard to reach places.' + - They are a must have for the aspiring ancient ruin delver. + - Here is your reward! + - How about putting your knowledge to the test? + - '&7&oSeems like &aVentus Artifex&7&o has a challenge for me.' +primis_caeruleaum_fletching_2: + name: '&2Shield Hunter' + questLore: + - You got the arrows? Great! + - Use those arrows with a bow to climb the tower! + questAcceptDialog: + - '&a[Ventus Artifex]&f Use the arrows you just received to go to the ruins and shoot the targets with them!' + - Inside of the ruins there are rumors of an ancient chest. Not very useful to anyone... but collectors! + - Go and grab me that &eShield&f, and I will trade it with something more... useful... to you! + - '&7&oI should go get the &eShield&7&o inside of the ruins, using the &eGrappling Arrows&7&o in order to shoot the targets inside of the building.' + questCompleteMessage: + - '&a[Ventus Artifex]&f Outstanding!' + - Truly you are a real ruins delver! + - Here is your reward! + - '&7&oSeems like Grappling Arrows will be useful in the future.' +primis_caeruleaum_foraging: + name: '&2Wolf Bait' + questLore: + - I heard you were looking to help out around here. + - There is a &dDen of Wolves&f nearby that is + - really impeding my foraging for the village! + questAcceptDialog: + - '&a[Venator Pabulatus]&f If you can get rid of those pesky &cWolves&f, I will reward you handsomely!' + - I am getting too old to be dealing with the wild things of these lands... + - '&7&oI should go kill the &cWolves&7&o in the den to the Southeast of the village.' + questCompleteMessage: + - '&a[Venator Pabulatus]&f I knew I could count on you!' + - Thank you for all of your help! + - Here is your reward as promised. +primis_farmstead_lighthouse_keeper_2: + customObjectives: + Objective1: + dialog: + - "&a[Jeeves]&f &2Amavit&f sent you? What's this about a lighthouse? My, what a discovery!\n&fThis will revolutionize my job as a traveling merchant! Here, have these &eScrolls&f - just call me and I'll be there in a jiffy!\n&7&oSeems like &aJeeves&7&o has something for me. I should talk to him." + name: '&2The Mysterious Lights' + questLore: + - A strange light started being emitted from the &dTop of the Lighthouse&f when you... dealt with the issue. + - My father &aJeeves&f went to the top to check but he has not returned yet. + - My heart can not bear to suffer any more, and we already owe you much - but if you could investigate the issue and find my father, I would be eternally grateful. + questAcceptDialog: + - '&a[Amavit]&f Thank you once again, and good luck. Hopefully it''s nothing.' + - '&7&oI should go to the &dTop of the Lighthouse&f, investigate the issue and then report back to &aAmavit''s&f father &aJeeves&f in the village.' + questCompleteMessage: + - '&7&oThese scrolls seem mighty useful! I should use the &dLighthouse&7&o to get back to the &dFarmstead&7&o and keep moving.' +primis_gladius_assassins: + name: '&5Who snipes the snipers?' + questLore: + - The roofs of &dGladius&f are covered in &cAssassins&f! + - Venturing out to the streets is a death sentence. We need to deal with these snipers! + - There are some spots for &eGrappling Arrows&f on the roofs, make good use of them and deal with those snipers! + questAcceptDialog: + - '&a[Belli] Deal with those &cAssassins&f! Remember to use the &eGrappling Arrows&f!.' + - '&7&oI should kill those &cAssassins&7&o.' + questCompleteMessage: + - '&a[Belli]&f You dealt with those &cAssassins&f? Good! That''s one headache dealt with!' +primis_gladius_clear: + name: '&5Taking back the streets' + questLore: + - I don't need to tell you that the town is being invaded, do I? + - We are offering a reward to those willing to put a dent in the amount of &cInvaders&f. + - Are you up for it? + questAcceptDialog: + - '&a[Belli] &fJust go out there and thin their numbers!' + - '&7&oI go out and clear the streets of &dGladius&7&o.' + questCompleteMessage: + - '&a[Belli]&f Look at that, the Gods have provided with a true warrior in our time of need! I have a job for a person like you.' + - '&7&oSeems like &aBelli&7&o has a plan for me. I should talk to her..' +primis_gladius_prayer: + name: '&5Leap of faith' + questLore: + - I am not going to sugarcoat it, things look downright grim! + - The walls have fallen, the streets are teeming + - with the &cUndead&f and I just ran out of drinks. + - At times like these, people turn their hope to + - some kind of divine intervention! + - There is a &dPath&f, lit by candles, that leads to a + - '&dSanctuary in the Mountains&f.' + - Warriors go up this path and defeat the &cMonk&f which guards + - the sanctuary in order to be blessed by the war god in combat. + - It may just be a superstition, but would it hurt + - to give people hope? + - The fact you made your way here shows you are a cut above + - the rest - go up the mountain and defeat the &cMonk&f. + - All warriors will feel better knowing they are being watched over. + questAcceptDialog: + - '&a[Belli] &fGo &dUpstairs&f and follow the candles! Careful not to fall, the path is treacherous!' + - '&7&oI should follow the &dandle Path&7&o and defeat the &cMonk&7&o.' + questCompleteMessage: + - '&a[Belli]&f You completed the prayer? Thank you, the soldiers will feel relieved to hear it.' +primis_gladius_ships: + name: '&5A sinking feeling' + questLore: + - Have you seen them? The dozens of ships just outside + - of &dGladius&f? They are to blame for all of this. + - We never expected an invasion from the &dBlood Temple&f, + - much less one done by siege weapons mounted on boats! + - We must do something about it. Killing the &cAdmiral&f + - and some of the forces won't give us back what we lost, + - but it will sure make us feel better. + questAcceptDialog: + - '&a[Belli] &fKill the &cAdmiral&f and some of the troops on the boats. Be careful about their water superiority! I recommend using &eGrappling Arrows&f to move around the ships.' + - '&7&oI should go slay the &cAdmiral&7&o and some of its troops on the boats just &dOutside of Gladius&7&o.' + questCompleteMessage: + - '&a[Belli]&f The admiral is no more? Why, I feel better already!' +primis_gladius_sunken_ship: + name: '&5Sunken ship' + questLore: + - Now that you took care of the &cMariner Forces&f I got + - another task for you. + - The &dSunken Ship&f should be reachable now. + - You see some time ago one of our ships got sunk, + - unfortunately it was carrying &eImportant DDocuments&f. + - I need you to reach the &dSunken Ship&f and kill any threats + - around and retrieve the &eDocuments&f. + - Come back to me after you have completed the task. + questAcceptDialog: + - '&a[Belli] &fYou will find the ship in the waters to the south-west. Give them hell!' + - '&7&oI should go collect the &eDocuments&7&o and slay any &cMariners&7&o near the ship.' + questCompleteMessage: + - '&a[Belli]&f Back already? Excellent work! We really needed these &eDocuments&f.' +primis_gladius_supplies_1: + name: '&cSupplying problems' + questLore: + - We are running out of &eSupplies&f! + - '&dGladius&f is a fortress equipped to last a long siege' + - without any issues, but that's assuming we have + - access to the &dWarehouse&f! + - Unfortunately the &dWarehouse&f was one of the first places to fall, + - and now we are slowly starving to death! + - If you can clear a path to the &dWarehouse&f and get some &eSupplies&f + - that would greatly aid in the war effort! + questAcceptDialog: + - '&a[Cibus]&f The &dWarehouse&f is hard to miss! It''s the extra large warehouse-looking building near the part where the wall fell! Grab some &eSupplies&f and get them back here!' + - '&7&oI should go to the &dWarehouse&7&o and bring back &eSupplies&7&o.' + questCompleteMessage: + - '&a[Cibus]&f You brought the &eSupplies&f back? Fantastic! Meanwhile I came up with the perfect idea for the drinks - and it should be something that will lift the spirits of the soldiers!' + - '&7&oSeems like the &aCibus&7&o has a plan, I should talk to them.' +primis_gladius_supplies_2: + name: '&cSupplying more problems' + questLore: + - We have food, but what about drinks? + - Some would say it's foolish to get drunk in the middle + - of a war, but if now then when? + - The &cBarkeep&f across the street kept all of the good + - stuff in the &dBasement&f. + - I think you know where I'm going with this! + - Go to the &dBasement&f of the tavern across the street and get + - the &eGood Stuff&f. If you find the &cBarkeep&f, I'd consider it a + - personal favor if you free him from this curse of undeath. + - We are pretty sure that he was in the &dBasement&f when the + - invasion happened so odds are he is still there, + - though probably no longer himself. + - Be careful! + questAcceptDialog: + - '&a[Cibus]&f The &dTavern&f is right across the street, hard to miss! Just head to the &dBasement&f and get the &eGood Stuff&f!' + - '&7&oI should go to the &dBasement&7&o of the tavern and get "the &eGood Stuff&7&o".' + questCompleteMessage: + - '&a[Cibus]&f You defeated the &cBarkeep&f? I thank you for freeing my old man from this accursed undeath. Here, I''ll have the first drink with you.' +primis_ice_village_all_out_of_chains: + customObjectives: + Objective1: + dialog: + - '&a[Orbis]&f Oh, the Ice Village chain shipment. Yes, it is right in that chest over there.' + - Sorry for not sending it over, but we were quite busy and had no time. + - It's all paid for so feel free to just grab it. + name: '&2All out of chains' + questLore: + - Hey, you came from &dPontis Mille&f right? + - How would you like to help us out. + - Here at the jail we tend to go through a + - lot of chains... + - Especially the chains holding up the cages. + - They rust a lot and then they break. That's + - how one of the prisoners escaped. The rusty + - chain snapped, the cage fell and he ran. + - We paid for a + - '&eShipment of new chains&f, but it' + - did not arrive yet. If you could go to + - '&dPontis Mille&f and fetch our' + - '&eShipment of Chains&f' + - then that would be great! + questAcceptDialog: + - '&a[Philolaches Triferus]&f Go talk to Orbis. They are the ones that make the chains.' + - '&7&oI should go talk to &a&oOrbis&7&o and bring back the &e&oShipment of Chains&7&o.' + questCompleteMessage: + - '&a[Philolaches Triferus]&f Those are the chains! Thank you for getting these, we really needed them.' +primis_ice_village_catch_me_if_you_can: + name: '&2Catch me if you can' + questLore: + - What timing! I was just looking for someone to go capture our + - '&cEscaped Prisoner&f.' + - One of our prisoners managed to make the darn cage swing and the rusty chain that holds it cracked under the load. + - He must have gotten pretty hurt during the escape so he cannot have gone that far. + - I need you to bring him back &9alive&f, be careful though, he managed to snag one of our rusty swords before he fled. + questAcceptDialog: + - '&a[Romanus Superbus]&f He must be somewhere in the mountains.' + - '&7&oI need to find the &c&oEscaped Prisoner&7&o and bring him back to the prison.' + questCompleteMessage: + - '&a[Romanus Superbus]&f Well, well, well. If it isn''t our escaped sleeping beauty.' + - Good work. A job well done deserves a good payment, here ya go. + - '&aRomanus&7 hands you a heavy bag of coin.' +primis_ice_village_get_them_off_my_back: + name: '&2Get them off my back!' + questLore: + - Let me tell ya, I sure am glad you are here to help, ha ha. + - Our mission here is to hunt &cRazorbacks&f and keep their numbers in check. + - It's not all about population control either. + - They provide us with valuable leather, tusks and meat. + - Not sure this village would be around without them. + - But this season their numbers have just exploded. We have been struggling with culling their numbers. + - It's all about striking a balance, can't have their numbers be so high that they start becoming a danger again. + - You need to go out there and slay a significant amount of them. Don't bother with hunting any of the &9Mature&f ones. + - We only need you to cull the &cBabe&f and the &cJuvenile Razorbacks&f. + - I also have a personal favor to ask of you. When you're out there could you keep an eye out for my old &eDagger&f. + - I lost it couple of days ago during a hunt. Stuck it in a &cRazorback&f and it just ran off with my dagger still attached... + - Would mean a lot to me if you could retrieve it. + questAcceptDialog: + - '&a[Alanus Isatis]&f You must have seen the &cRazorbacks&f on your way here so I assume you know where to find them.' + - '&7&oI need to cull the &c&oRazorback&7&o population and retrieve &e&oAlanus'' Dagger&7&o.' + questCompleteMessage: + - '&a[Alanus Isatis]&f Well done friend! That should help a lot.' + - We can handle the rest. And you found my dagger too, glad to have it in my hands again. + - The dagger is nothing special, but it was a handmade gift from my late father. + - Next time you're thirsty, the drinks are on me! +primis_ice_village_gotta_keep_warm: + customObjectives: + Objective1: + dialog: + - '&a[Severinus Martius]&f Ha ha! That should keep me warm for another couple of weeks!' + - Hey friend, you heading for &dCaerullium Village&f by any chance? + name: '&2Gotta keep warm' + questLore: + - We deliver the &aLighthouse Keeper&f some + - of our strong stuff every couple of weeks. + - It keeps him warm during the colder days. + - It's a small gesture of thanks for all his + - hard work. Any chance you could help out + - and bring over the next batch? + questAcceptDialog: + - '&a[Grania Cecilius]&f You can find the lighthouse to the East. Thanks!' + - '&7&oI should go to the &d&oLighthouse&7&o and deliver these to the &a&oLighthouse Keeper&7&o.' + questCompleteMessage: + - '&a[Severinus Martius]&f If you''re heading over there then I would appreciate if you could deliver some of these to my good friend &aJeeves&f.' + - '&7&oSeems like the &a&oLighthouse Keeper&7&o has a quest for me.' +primis_ice_village_gotta_see_jeeves: + customObjectives: + Objective1: + dialog: + - '&a[Jeeves]&f Oh! A gift from my friend Severinus you say.' + - Well, thank you for bringing it over. Was nice seeing you again! + name: '&2Gotta see Jeeves' + questLore: + - Now, now it would be really rude of me to keep + - all of the good stuff to myself! + - If you would bother helping me out friend and + - delivering some of the good stuff + - to my friend &aJeeves&f at &dCaerullium Village&f. + - You can get there quickly by taking the + - '&9lighthouse portal&f.' + questAcceptDialog: + - '&a[Severinus Martius]&f The portal is all the way at the top.' + - '&7&oI should go to &d&oCaerullium Village&7&o and deliver some of the good stuff to &a&oJeeves&7&o.' + questCompleteMessage: + - '&a[Severinus Martius]&f Thank you for delivering some of the strong stuff to Jeeves. I know he likes a good drink here and there ha ha!' +primis_ice_village_living_nightmares: + customObjectives: + Objective1: + dialog: + - '&a[Cornelia Ennodius]&f Are they gone? I was so scared. My parents sent you? Thank goodness.' + - I woke up in the night, but the nightmares, they did not end. They were still there, so I ran and ran... + - I couldn't escape. I, I...will be fine, I just need a minute... + name: '&2Living nightmares' + questLore: + - I was following her trail, this is where it ends. + - Not sure where she would have gone from here. + - I fear that something bad might have happened. + - Our &aGirl&f takes a lot after me and my special powers. + - Except that hers are a lot more potent, she is capable + - of making powerful emotions manifest in the real world. + - We are running out of time, we need to find her soon. + questAcceptDialog: + - '&a[Sestia Ennodius]&f The trail went cold here, she cannot be that far away...' + - '&7&oI need to find the &a&oMissing Daughter&7&o before something happens to her.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f You found her! Quickly, where is she?' + - Thank you stranger, I will go to her at once! +primis_ice_village_make_them_go_ouch: + name: '&2Make them go ouch' + questLore: + - I had some naughty '&cCustomers&f' + - come visit some days ago. + - They stole the most valuable + - of my &ePossessions&f. + - You need to find them and make sure + - to teach them a lesson. + - Make sure they know that + - '&aViolet&f does not forget to collect.' + questAcceptDialog: + - '&a[Domina Violet]&f They went East past the &9Trees&f.' + - '&7&oI need to make sure that the &c&oCustomers&7&o know not to mess with &a&oViolet&7&o. I also need to retrieve &e&oViolet''s Property&7&o.' + questCompleteMessage: + - '&a[Domina Violet]&f I hope you taught them the value of pain.' + - A small reward is in order for your hard work. I appreciate people that get it done. +primis_ice_village_objection!: + customObjectives: + Objective3: + dialog: + - '&a[Glacies Princeps]&f What, absolutely not. I don''t know how he convinced you to come here and beg for his release.' + - That man you are trying to help was corrupted by the Ice Elemental. He went mad and slaughtered his entire family. + - He will never be released. Is that understood. + Objective1: + dialog: + - '&a[Romanus Superbus]&f Release him? Not guilty? Are you mad? You''re lucky I don''t throw you in a cage too for suggesting such nonsense.' + Objective2: + dialog: + - '&a[Luxuria Placidus]&f Who? Never heard of him.' + name: '&2Objection!' + questLore: + - I do not belong here! Surely you can see that? + - I have done no wrong! Stranger will you hear my plea. + - Would you help this poor soul who has been trapped + - here in this awful cage of no fault of his own? + - You must go talk to the + - '&aJail Master&f or the ' + - '&aVillage Leader&f.' + - Or any other + - '&aFriendly Villager&f' + - who would be + - willing to argue for + - my release! + questAcceptDialog: + - '&a[Adrius Calpornius]&f Go talk to them! Get me out!' + - '&7&oI should go talk to the people on my list.' + questCompleteMessage: + - '&a[Adrius Calpornius]&f WHAT?! LIES!!! I never would do such a horrible thing to my family...' + - They are right here! Can't you see them, hear them. Here next to me, they want to be free too!!! RELEASE US!!! + - '&7Whatever sanity this poor man still had left, is gone now...' +primis_ice_village_run_away_daughter: + customObjectives: + Objective1: + dialog: + - '&a[Sestia Ennodius]&f I could sense you coming.' + name: '&2Run away daughter' + questLore: + - Stranger! Would you help our family? + - Our &aDaughter&f has gone missing. + - She has been gifted with special + - powers just like her &aMother&f + - I fear that last night something + - terrible must have happened to + - make her run away in the middle of + - the night. + questAcceptDialog: + - '&a[Sparax Ennodius]&f My &aWife&f has already gone looking for her.' + - I am sure she is somewhere outside the village. Go find her and talk to her. + - '&7&oI should go look for the &a&oWorried Mother&7&o.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f You were sent by my &aHusband&f to help with the search?' + - '&7&oI should hear out the &a&oWorried Mother&7&o.' +primis_ice_village_silence: + name: '&2Make them go ouch' + questLore: + - Shhh! Do you hear it? + - The annoying screeching. + - Ugh, I cannot take it anymore! + - Listen, I will pay good coin + - if you can find the source + - of that annoying screeching + - and make it stop. + questAcceptDialog: + - '&a[Modestus Eulogius]&f It sounds like it coming somewhere from the hills behind me.' + - '&7&oI should find the source of all the noise and make it stop.' + questCompleteMessage: + - '&a[Modestus Eulogius]&f Both me and my ears thank you!' +primis_ice_village_taking_the_bait: + name: '&2Taking the bait' + questLore: + - These &cFish&f, what is wrong with them! + - I have been out here fishing for days now! + - Not even a single bite. If only I was younger I would show them! + - Well it sure is good you're here now. Our village gets most of its food from these &cFish&f. + - And if we cannot catch any, well that is a big problem. + - You will need to go down there and beat them senseless. + questAcceptDialog: + - '&a[Theopropides Nero]&f You wanted to help so here is your chance!' + - '&7&oI must jump into the lake and kill 7 &c&oChilly Salmon&7&o and collect their bodies.' + questCompleteMessage: + - '&a[Theopropides Nero]&f Oh! Look at them! Such big ones!.' + - This should keep us fed for a while! Thank you for the assistance, you're a good soul in my book! +primis_ice_village_treats_for_the_punished: + customObjectives: + Objective1: + dialog: + - '&a[Eleusium Calenus]&f My wife sent you? Oh, are those treats? My favorite too! She''s such a darling.' + - She always takes care of me, even in these dark times, she still has a place for me in her heart. + - 'You tell her I am doing just fine and that I love her very much. ' + name: '&2Treats for the punished' + questLore: + - If you don't mind, could I ask you to do something for me? + - My dear &aHusband&f has been jailed and I know it's tough living a cage all day. + - So I prepared some treats that I was gonna deliver to him. + - But I am quite busy right now and I was wondering if maybe you would like to go there and deliver them to him. + questAcceptDialog: + - '&a[Titia Calenus]&f He will be in one of the middle cages.' + - Do not forget to tell him I love him. + - '&7&oI should deliver these treats to the &a&oHusband&7&o.' + questCompleteMessage: + - '&a[Titia Calenus]&f Back so quick! Oh, did he really say that? He is such a sweetie.' +primis_ice_village_wanna_make_a_snowman: + name: '&2Wanna build a snowman' + questLore: + - The kids around the village have been pretty bored lately + - and I've been thinking. There are these + - '&cMagical Creatures&f that inhabit the woods around this' + - village. The creatures fur grows &eMagical Ice Crystals&e. + - When you infuse snow with these &eCrystals&f it makes the + - snow shuffle around and expand and contract. + - And if you build a snowman out of this infused snow + - it makes it look as if the snowman is alive. + - The kids would love it! So, want to help + - this old man cheer up some kids? + questAcceptDialog: + - '&a[Sparax Ennodius]&f You will find the &cCreatures&f in any woods near the village.' + - We will at least need 15 of the &eCrystals&f if we want to have enough to build a snowman. + - '&7&oI should go slay enough &c&oFrost Fur Ursus&7&o to gather 15 &e&oIce Crystals&7&o.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f You gathered enough crystals? Wonderful!' + - I can start making the snowman now, I cannot wait for the kids to see it! +primis_main_quest_: + name: '&2Goblins in the mines!' + questLore: + - This day just keeps getting worse. First, we get ambushed by goblins. + - The we retreat, only to find our army split. Some are dead, many are missing. + - Worst of all, we fear we might've woken the Goblin King. + - Some, hopefully, made it through. We have to set up camp and recover for now. + - If you dare brave into the mines, you are on your own. + - We tried to sneak past them, and it did not go well. + - The only way forward is through bloodshed. + questAcceptDialog: + - '&8[Centurion]&fAre you braving the Goblin Mines? Beware the Goblin King!' + - '&8[Centurion]&fWe hope our scouting party made it past him. Meet up with them if you can.' + - '&8&oI should venture through the mines and defeat the Goblin King.' + questCompleteMessage: + - '&8[Scouting party]&fYou made it through? I almost wish you hadn''t. You won''t believe what lies ahead.' + - '&8&oSounds like the scouting party has bad news for me.' +primis_main_quest_1: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis] &fOh so you were in the ship that beached a few hours ago?' + - I apologize, we would've sent help but I am afraid we are drowning in our own issues right now! + - A nearby &dBandit Camp &fkeeps raiding our supplies, a mysterious &cSea Creature &fkeeps haunting our shores and a &dWolf Den &fis making foraging impossible! + - If you help us out, I will tell you where you might be able to get the supplies you need to repair your ship. + - '&7&oI should report to the &aFirst Mate &7&oto see if I should help these people!' + name: '&2Shipwrecked!' + questLore: + - You're finally awake? Good! We need your help. + - The ship beached during last night's storm. + - We see a &dLighthouse &fin the distance, so there must be a village there! + - Go talk to the &aVillage Leader &fand see if they can lend use some help! + - The &aFirst Mate &fwent ahead of you, but hasn't returned yet. + - Follow his instructions if you see him! + questAcceptDialog: + - '&a[Captain Squalus]&f Go to the nearby village and see if they will help us!' + - Be careful on your way there, we don't know what lurks around these parts! + - '&7&oI should investigate the nearby village and talk to their leader.' + questCompleteMessage: + - '&a[First Mate Iracundi]&f Darnation! We just can''t catch a break today! Here, it''s clearly dangerous to go alone, take this!' + - '&7&oSeems like First Mate Iracundi has a request for me...' +primis_main_quest_10: + customObjectives: + Objective2: + dialog: + - "&a[Shogun Navita] &f&dGladius&f calls for our aid?\n&7&oSeems like I should talk to the &aShogun&7&o." + name: '&5Bridging the gap' + questLore: + - It is time to call &dPontis Mille&f for aid. + - Let them know of what happened here and tell them we are cashing in our favor. + - There is an &cAutomaton&f on the &dBridge&f that leads there. Defeat it and the bridge will lower. + questAcceptDialog: + - '&a[General Hasta] &fSafe travels, friend. Remember: Kill the &cGate Keeper&f and make sure our plea reaches &aShogun Navita''s&f ears..' + - '&7&oI should slay the &cGate Keeper&7&o at the &dBridge&7&o and make my way to &aShogun Navita&7&o in &dPontis Mille&7&o.' + questCompleteMessage: + - '&a[Shogun Navita]&f Truly the news you bring me are most disturbing, but I am afraid we already suspected something... unnatural... was going on.' + - '&7&oSeems like &aShogun Navita&7&o wants to talk to me.' +primis_main_quest_11: + customObjectives: + Objective1: + dialog: + - '&a[Major Fortes Bellator]&f Yes, traveler?' + name: '&2Sending a message!' + questLore: + - The tales of your travel are most surprising. + - That you made it alive to here is nothing short of a miracle. + - The forces invading &dGladius&f are insurmountable. + - '&dGladius&f will eventually crumble under their might...' + - Aid?... Ah, yes. Go see &aMajor Fortes Bellator&f. + - He will be able to assist you. + questAcceptDialog: + - '&a[Navita]&f You can find the &aMajor&f on top of those stairs right ahead!' + - '&7&oI should go talk to the &aMajor&f and see if he can help.' + questCompleteMessage: + - '&a[Major Fortes Bellator]&f The &aShogun&f seeks to aid &dGladius&f? I thought he would never ask! But first, we must prepare.' + - '&7&oSeems like &aFortes Bellator&7&o has work for me.' +primis_main_quest_12: + customObjectives: + Objective1: + dialog: + - '&a[Centurion]&f Where are our reinforcements?' + name: '&2Mine path' + questLore: + - I cannot believe what befell &dGladius&f. They hit it fast, + - and they hit it where it hurts most. + - It is our sworn duty to aid our allies. We have failed our + - duty, and we have failed our allies. + - The &cCounselor's&f ordered us to mobilize our troops in several + - zones before the invasion. + - You see, recently and unusual and devastating storm was spotted + - at the &dStorm Temple&f. + - The Royal Guard was ordered to quiet the storm, and the &aShogun&f + - refuses to belay that order. + - Our own guards are in other places, and I fear we will need all + - that we have to take &dGladius&f back. + - The path to the &dStorm Temple&f is treacherous, as it requires going + - through the &dGoblin Mines&f. + - Help our guard clear the mines and make a path to the &dStorm Temple&f! + questAcceptDialog: + - '&a[Fortes Bellator]&fTread lightly, the &dGoblin Mines&f are a dangerous place. Perhaps you should aid the normal guard before assisting the &aRoyal Guard&f.' + - The &dMines&f are north of the city. There are stairs leading to its entrance. + - '&7&oI should see what else I can aid &aFortes Bellator&7&o with, or I can head to the &dGoblin Mines''&7&o entrance.' + questCompleteMessage: + - '&a[Centurion]&fIt is so good to see someone! Has &dPontis Mille&f sent you?' + - '&7&oI should hear what the &aCenturion&7&o has to say' +primis_main_quest_13: + name: '&2Goblins in the mines!' + questLore: + - This day just keeps getting worse. First, we get ambushed by goblins. + - Then we retreat, only to find our army split. Some are dead, many are missing. + - Worst of all, we fear we might've woken the &cGoblin King&f. + - Some, hopefully, made it through. We have to set up camp and recover for now. + - If you dare brave into the mines, you are on your own. + - We tried to sneak past them, and it did not go well. + - The only way forward is through bloodshed. + questAcceptDialog: + - '&a[Centurion]&f Are you braving the &dGoblin Mines&f? Beware the &cGoblin King&f!' + - We hope our &aScouting Party&f made it past him. Meet up with them if you can. + - '&7&oI should venture through the &dMines&7&o and defeat the &cGoblin King&7&o.' + questCompleteMessage: + - '&a[Scouting Party]&f You made it through? I almost wish you hadn''t. You won''t believe what lies ahead.' + - '&7&oSounds like the scouting party has bad news for me.' +primis_main_quest_14: + name: '&2Storm''s end' + questLore: + - It is hard to believe that you pushed through the + - '&dGoblin Mines&f on your own.' + - Perhaps with your fortitude you will be able to face the challenge ahead. + - We attempted to assault the &dStorm Temple&f, and reached its deepest + - confines at a great cost. + - What we found there... It defies understanding. + - It may be hard to believe, but it sounds like the very storm + - itself has materialized as our opponent. + - We do not even know if it can be defeated. We feared we were sent to our deaths. + - If you truly defeated the &cGoblin King&f, then perhaps you will find a way to slay this storm. + questAcceptDialog: + - '&a[Blepharo]&f We have weakened their forces a little, but still, this is no easy task.' + - The Storm is no ordinary opponent. Do not underestimate it. + - '&7&oI should go into the &dStorm Temple&f and slay the &cStorm&f.' + questCompleteMessage: + - '&a[Shogun Navita]&f You WHAT!?' + - Defeated the &cStorm&f? I was told that was impossible! I mean... + - '... it is no use hiding it now. I knew about the &cStorm&f. I knew about the &dGladius&f invasion - I even facilitated it. I did it for my people - for &dPontis Mille&f.' + - '&cCounselor Machiavelli&f convinced me that the &cStorm&f was as unstoppable as Nature itself, and that the fall of &dGladius&f and &dPontis Mille&f was an inevitability that we could but delay through sacrifice.' + - I see now that that snake poisoned my mind and corrupted my judgment. He must be dealt with posthaste. + - '&8&oSeems like &aShogun Navita&7&o has a problem he wants me to deal with.' +primis_main_quest_15: + name: '&2Severance payback!' + questLore: + - Once upon a time, &cCounselor Machiavelli&f, the wisest among us, foresaw the fall of &dPontis Mille&f. + - Faced with an unprecedented existential threat, he convinced me to keep quiet as to not incite panic. + - I took the only course of action I thought we had left - sacrificing our closest ally to buy us mere weeks. + - I spoke to the entity which resides in the &dBlood Temple&f. I made a deal with the devil. + - + - I bought us time. + - They demanded I send the army away, which I did by mobilizing it to face nearby conflicts. + - I was blind, but now I see. &cCounselor Machiavelli&f was in their pocket the whole time. + - He guided us to our doom, and would've gotten away with it had you not appeared. + - Now, there is hope. + - I ask you, please rid us of the treacherous &cCounselor&f. + - He has locked himself in his quarters, surrounded by those loyal to him and his... pets. + - Be careful. I knew not the reason why he isolated himself, but it is now clear he is expecting retribution. + - Bring me back the &eFar SSpeech Stone&f we used to communicate with the &dBlood Temple&f. + - I wish to deliver one last message through them. + questAcceptDialog: + - '&a[Shogun Navita]&f &cCounselor Machiavelli&f has retreated to his quarters in the lower city by the market. Be careful, has has amassed a devoted following in his time, and will not go down without a fight.' + - '&7&oIt is time for &cCounselor Machiavelli&f to face righteous retribution.' + questCompleteMessage: + - '&a[Shogun Navita]&f So it is done.' + - '&dPontis Mille&f owes you a great debt, wanderer. Once we finish mobilizing the army we will be ready to right our wrongs and march to &dGladius''&f aid.' + - '&7&a[Shogun Navita]&2 We feared you. We surrendered our allies to you. We dispersed our armies. No more.' + - '&dPontis Mille&2 marches to war, and we shall not walk alone! You shall rue the day you crossed our path.' + - '&7' + - '&7&oSeems like the &aShogun&7&o has a plan. I should talk to him.' +primis_main_quest_16: + customObjectives: + Objective3: + dialog: + - '&a[Demenis Nolus]&f Heading to the village, eh. Just keep going East, follow the road and you should be there in no time!' + Objective4: + dialog: + - '&a[Callipho Classicius]&f Directions? Just head down this road that leads to the graveyards.' + Objective1: + dialog: + - '&a[Glacies]&f Welcome to our village traveler! Please tell me, what brings you here friend.' + Objective2: + dialog: + - '&a[Bromia Culleolus]&f Oh, the way to the village. Yes, just take this road that leads to the mountain.' + - Happy to help! + name: '&2The ice village awaits' + questLore: + - We must send aid to &dGladius&f as soon as possible. + - Champion, there is a village of mighty warriors to the far south. + - You should travel there and inform them that &dPontis Mille&f + - would seek their aid in pushing back the invaders from the &dBlood Temple&f. + - Find &aGlacies Princeps&f and tell them I sent you. + - There many travelers on the roads, you should stop and ask them for direction. + questAcceptDialog: + - '&a[Shogun Navita]&f It will be a long journey. Make sure you prepare. Follow the roads that lead south.' + - '&7&oI must go and locate the &d&oIce Village&7&o to the far south.' + questCompleteMessage: + - '&a[Glacies Princeps]&f The Shogun sent you, I see, it is good to hear that &aNavita&f is back to his old self.' + - Before we can act against the &dBlood Temple&f, there are some issues that I would like dealt with first. + - Let me tell you more... + - '&7&oI should speak to &a&oGlacies&7&o.' +primis_main_quest_17: + customObjectives: + Objective3: + dialog: + - '&a[Theopropides Nero]&f Help? Yes, please!' + Objective1: + dialog: + - '&a[Alanus Isatis]&f Here to help with the &cRazorbacks&f?' + Objective2: + dialog: + - '&a[Domina Violet]&f I hope you are here to help!' + name: '&2Helping the north' + questLore: + - Before we further discuss anything about + - the &dBlood Temple&f. + - There are issues that have popped around our village that need to be dealt with as soon as possible. + - If these issues are not resolved then I would fail in my duties as a village leader. + - There is no way for me to ignore the plea of my own people and put others first. + - If you could aid us in resolving these issues then our attention would be all yours. + - We have an escaped prisoner, wildlife problems and even our own villagers stealing from the village. + - I will tell you the names and the locations of the people that came with these issues to me. + - Go talk to them and make sure you help them with any complaints and issues they have. + - They will be able to tell you in more detail what needs to be done. + questAcceptDialog: + - '&a[Glacies Princeps]&f Once you are done helping them. Come back to me and we can talk.' + - '&7&oI should go talk to the villagers on my list and help them out with any issues they might have.' + questCompleteMessage: + - '&a[Romanus Superbus]&f &2Glacies&f sent you, about darn time! We have a prisoner on the loose!' + - '&7&oI should speak to &a&oRomanus Superbus&7&o.' +primis_main_quest_18: + name: '&2The trial of ice' + questLore: + - Well you have certainly impressed me and most of the village. + - I owe you an explanation friend. You see for the longest time we used to draw power from + - the &cIce Elementals&f. + - They would bless us with their power and in return any of us who would want to become a warrior or a hunter had to pass the &9Trial of Ice&f. + - To pass the trial you had to climb the black mountain all the way to its eastern peak. And at the peak you would face the + - '&cMinor Ice Elementals&f in combat.' + - Should you succeed then your claim to become a warrior or a hunter was unquestionably your right. + - If you failed...then...your energy and your being belonged to the &cIce Elementals&f. + - This is how it was for the longest time. Until the &dBlood Temples&f influence grew in power. + - Ever since then + - the &cIce Elementals&f have been emboldened. Drawing power from them was now a risk. + - Several of our people got corrupted and we had to jail them for our own safety. + - And doing the trial became impossible, what faced you at the peak was something no villager could overcome. + - Those who have failed the trial are still there, their souls trapped in the husks of their decaying bodies. + - Slaves to the + - '&cIce Elementals&f.' + - It is clear that our old traditions are no longer. + - The &cIce Elementals&f must be dealt with... + - I would ask you to be the last one to + - undertake &9The Trial of Ice&f. Climb to the peak and face the + - '&cMinor Ice Elementals&f and release the souls of those who failed the trial.' + questAcceptDialog: + - '&a[Glacies Princeps]&f You can find the start of the path to the trial at &aViolet''s&f house.' + - Follow the &9Amethyst&f blocks, they will guide you to the peak. + - '&7&oI should follow the &9&oAmethyst Blocks&7&o to the peak of the mountain and then slay the &c&oMinor Ice Elementals&7&o.' + questCompleteMessage: + - '&a[Glacies Princeps]&f You have done it? May their souls rest in peace now.' + - Let's speak again friend. There is more to be done. + - '&7&oI should speak to &a&oGlacies&7&o.' +primis_main_quest_19: + name: '&2Chill out' + questLore: + - It is time to free ourselves from this curse. + - We should have never made ourselves dependent on an &cElementals&f power. + - We shall correct that mistake here and now. + - What you have slain were just + - '&cMinor Ice Elementals&f, the' + - '&cIce Elemental&f rests in a temple right across from our village.' + - It was the main source of our power...and foolishness. + - Go forth now and slay the &cIce Elemental&f. + questAcceptDialog: + - '&a[Glacies Princeps]&f You will find a path that leads into the temple at the summit of the village.' + - '&7&oI should go into the temple and slay the &c&oIce Elemental&7&o.' + questCompleteMessage: + - '&a[Glacies Princeps]&f I could feel the energies flowing out, all the way from here.' + - You have done us a great favor friend. The &dIce Village&f will provide aid to you and your allies. + - There is another settlement that might need your help, let's speak. + - '&7&oI should hear what &a&oGlacies&7&o has to say.' +primis_main_quest_2: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis]&fYou''ll help us? Thank the seas! This was starting to feel like a sinking ship!' + name: '&2Strangers in need...' + questLore: + - So not only can they not help, but they want our help? Bah! + - Well, we don't have much choice now, do we? + - Go, help them, then make them help us! + questAcceptDialog: + - '&a[First Mate Iracundi]&f Fine, go help the locals, see what info you can gather and see if you can get them to help us in turn. I will be here, negotiating things.' + - Come back as soon as you have something! + - '&7&oI should talk to the &aVillage Leader&f to see about helping the locals.' + questCompleteMessage: + - '&a[Chief Piscis]&f Everyone in the village has an issue that needs dealing with, and I am no exception. My request is quite challenging, so maybe you want to get warmed up and get the lay of the land with some of the issues from the other villagers.' + - Talk to me when you are ready, and I will share with you the secrets kept by us to leaving this valley! + - '&7&oI should talk to the locals and see who needs help, and come back to the leader when I feel ready to continue.' +primis_main_quest_20: + customObjectives: + Objective1: + dialog: + - '&a[Lutum Princeps]&f This better be important.' + name: '&2Terravilla' + questLore: + - Some time ago we received a request for aid from a + - a nearby settlement. Years ago a bunch + - of explorers settled on top of this ancient ruin. + - I think they call their little + - settlement &dTerravilla&f. Apparently there is a lot + - of treasure to be had there if you don't mind the risk. + - But I hear that stuff has gone wrong there and they asked + - us if we could spare any help to send their way. To be + - honest, you are the strongest warrior I have ever seen. + - You are the best help we could send. If you would like + - to go of course. + questAcceptDialog: + - '&a[Glacies Princeps]&f You will find &aTerravilla&f straight West of here.' + - It is located on top of this ancient elemental ruin, you will know it when you see it. + - Oh, I almost forgot. The person you want to talk to is &aOverseer Lutum&f. + - '&7&oI should go to &d&oTerravilla&7&o and talk to &a&oOverseer Lutum&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f Came all the way from the &dIce Village&f, eh. Good to see some help arrive.' + - When I sent that request for aid I wasn't sure if we were gonna get any. I heard the situation over there wasn't that much better. + - We are in quite a pickle over here. We have plenty of work for you if you want it. + - '&7&oI should talk to &a&oLutum&7&o.' +primis_main_quest_21: + name: '&2Taking out the trash' + questLore: + - Many years ago some explorers came across this ruin and + - as they investigated it more closely they discovered a + - large underground maze-like structure. In this structure + - there were a lot of ancient artifacts and treasures. But + - also a lot of danger. Not like that stopped anyone from + - going down there. And as the word spread, more and more + - people came here to make their fortunes. Before you + - know it, it turned into a small settlement. Until lately + - everything was fine, but then awful things started + - happening. Before I tell you more, we should start by + - dealing with the simple problems first. A small band of + - '&cRobbers&f has found a foothold in the hills surrounding' + - '&dTerravilla&f. We need them gone. Also, feel free to assist' + - any villagers in &aTerravilla&f that might need help. + questAcceptDialog: + - '&a[Lutum Princeps]&f I am not sure where the &cRobbers&f are exactly. I just know that people have reported seeing them coming from the hills.' + - '&7&oI should deal with the &c&oRobbers&7&o and help any villagers in need if I have the time.' + questCompleteMessage: + - '&a[Lutum Princeps]&f Well that is one issue resolved. Onto the next!' + - Before we move on, I want you to have this blade. + - It might be old and dull but it's still as good as anything you can get your hands on today. + - '&7&oI should hear out what &a&oLutum&7&o has planned next.' +primis_main_quest_22: + name: '&2Big trouble in little pub' + questLore: + - Before we get to the big problem underground, I would + - like you to do one last thing here in town. There has + - been huge trouble in our little pub. There are certain + - characters in town who keep going to the pub and causing + - a ruckus. Well I heard that this time all of them managed + - to gather at the pub at the same time. And of course now + - there is a huge brawl happening over there. This is a great + - opportunity for us to arrest all of them at once. Go to the + - pub and knock them all out. We will handle the rest. + questAcceptDialog: + - '&a[Lutum Princeps]&f The pub is at the ground level, right across. Don''t let them overwhelm you.' + - I will have a nice reward waiting here for you when you're back. + - '&7&oI need to go to the pub and deal with the &c&oBar Brawlers&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f I hear that the pub is a peaceful place again. Let''s discuss the real issue now.' + - '&7&oI need to talk to &a&oLutum&7&o.' +primis_main_quest_23: + name: '&2Strike the earth' + questLore: + - You see the real reason we asked for help is because of what happened + - at the ruins. There were always dangerous things down there, + - but nothing a seasoned adventurer or explorer could not handle. But then + - something awakened, these ancient constructs started rising out of the + - ground and the walls. Then these quakes started happening, it was weird, + - because you could only feel them if you were down in the ruins. So we shut + - everything down, nobody was allowed access to the ruins anymore. A few days + - ago I gathered some of my best men and sent them down there to find the source + - of it all. They barely made it back. They found an &cEarth Elemental&f high + - above the pillars, on top some sort of platform. It must have been there + - dormant all this time. No clue why it decided to wake up now... + - Your job would be to go down there, navigate through the maze and put the + - '&cEarth Elemental&f into a slumber it will never wake up from.' + questAcceptDialog: + - '&a[Lutum Princeps]&f You can get to the maze by walking down the spiral staircase in the middle of the ruins.' + - Don't get lost in the maze, also make sure to watch out for the constructs. Good luck! + - '&7&oI should enter the &d&oRuins Maze&7&o and slay the &c&oEarth Elemental&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f I cannot believe it, you''re back. In one piece too!' + - I guess you are tougher than you look. What you have done here is incredible it is clear we are in great debt to you. Is there anything Terravilla might be able to do for you. + - '&7&oI need to tell &a&oLutum&7&o about my quest and the &d&oBlood Temple&7&o.' +primis_main_quest_24: + customObjectives: + Objective1: + dialog: + - '&a[Navita]&f You have returned! I hope you have good tidings.' + name: '&2There and back again' + questLore: + - We had no idea what was going on... Yes, + - '&dTerravilla&f will be able to pledge some' + - of our forces to your cause. I wonder if the + - '&cEarth Elemental&f awakening had anything' + - to do with the &dBlood Temple&f. We will + - prepare our forces and wait for word from + - '&dPontis Mille&f.' + questAcceptDialog: + - '&a[Lutum Princeps]&f So you are heading off to &dPontis Mille&f, make sure to tell the &aShogun&f that &dTerravilla&f will be ready to assist.' + - '&7&oI should head to &d&oPontis Mille&7&o and speak with &a&oShogun Navita&7&o.' + questCompleteMessage: + - '&a[Navita]&f It is good to hear that the &dIce Village&f has decided to join our cause! But I did not expect that you would manage to convince &dTerravilla&f to pledge to our cause as well.' +primis_main_quest_25: + customObjectives: + Objective1: + dialog: + - '&a[Outpost Officer]&fFILLER TEXT!' + name: '&2To the outpost' + questLore: + - It is so good to see you again friend! + - While you were gone we were preparing our + - forces. We have made an &dOutpost&f + - between the &dBlood Temple&f and &dPontis Mille&f. + - You should go there and report to the + - '&aOutpost Officer&f. They will let you know' + - how we shall proceed with the assault on the + - '&dBlood Temple&f.' + questAcceptDialog: + - '&a[Navita]&f The outpost is to the South of the city. Not too long now, before the additional forces from &dTerravilla&f and the &dIce Village&f arrive.' + - '&7&oI should head to the &d&oOutpost&7&o and speak with the &a&oOutpost Officer&7&o.' + questCompleteMessage: + - '&a[Outpost Officer]&f I GOT NO IDEA WHAT TO SAY CAUSE I AM NOT DONE' +primis_main_quest_3: + name: '&cBandit Camp!' + questLore: + - A nearby &dBandit Camp&f has recently been sighted + - and is trying to take us under! + - They keep raiding our supplies and kidnapping our villagers! + - They even took my &eGrandfather's Heirloom&f! + - We don't know what they want, but we need them gone! + - Figure out what they are doing, deal with them and bring + - me back my &eGrandfather's Heirloom&f! + questAcceptDialog: + - '&a[Chief Piscis]&f The &dBandit Camp&f isn''t too far away if you follow the road!' + - Be careful on your way there, we don't know what they are up to but it can't be anything good! + - Oh, and make sure you bring back my &eGrandfather's Heirloom&f! + - '&7&oI should go to the nearby &dBandit Camp&7&o and clear it out.' + questCompleteMessage: + - '&a[Chief Piscis]&f I see you''re back! Do you bring good news?' + - '&7&oYou tell &aChief Piscis&7&o about the camp and turn the &eHeirloom&7&o in.' + - What's this? Mages? Elementals? This is an ill omen. You must talk to the &aRuler of Gladius&f to report this incident at once! + - Truly you have served us well! Here, for your efforts, I give you my &eGrandfather's Sword&f! May it serve you as well as it has served our family! + - '&7&oSeems like the &aChief Piscis&f is ready to tell me how to get out of here.' +primis_main_quest_4: + customObjectives: + Objective1: + dialog: + - '&a[Petrae]&f &2Chief Piscis&f sent you? Unfortunately the passage is closed, and the &cElemental&f guards it...' + name: '&9Blue flower path!' + questLore: + - We must report our findings about the + - '&dBandit Camp&f to &dGladius&f!' + - The mountain pass is guarded by an ancient, + - powerful &cGolem&f which must be avoided at all costs! + - Follow the &eBlue Flowers&f along the path, + - they will lead you to a secret passage + - through the mountains! + - A mountain guide will be waiting for you at the end + - of the &9Blue Flower &fpath! + questAcceptDialog: + - '&a[Chief Piscis]&f The mountain pass is guarded by an extremely dangerous &cGolem&f, which you are probably not able to defeat right now!' + - We know of a secret passage in the mountains. Follow the path of &9Blue Flowers &fand talk to the &aMountain Guide&f to get safe passage to Bridgeport! + - '&7&oI should follow the &9&oBlue Flower &7&opath to the &aMountain Guide&7&o!' + - '&7&oI should make sure to finish any business I got left before I leave.' + - '&7&oHint: Make sure you track the quest to make finding your destination easier!' + questCompleteMessage: + - '&a[Petrae]&f Are you sure you want to risk it? I can help you...' + - '&7&oSeems like &aPetrae&f has a request for me.' +primis_main_quest_5: + name: '&5The Crystal Elemental' + questLore: + - You need to pass through? Ill timing, my friend. + - A &cCrystal Elemental &fhas invaded our passage + - and shut it down. + - If you really must make your way to Gladius, + - you will have to defeat this &cElemental&f first! + questAcceptDialog: + - '&a[Petrae]&f You seek to defeat the &cCrystal Elemental&f? I can but wish you luck in your endeavor!' + - I'll follow right after you. If you are successful in your attempt, meet me on the other side of the passage! + - '&7&oSeems like I must defeat the &cCrystal Elemental&7&o.' + questCompleteMessage: + - '&a[Petrae]&f Outstanding! I saw you defeat the &cCrystal Elemental&f, clearly there''s greatness in your future!' + - Now that we are on the other side, let me tell you the path to &dGladius&f! +primis_main_quest_6: + customObjectives: + Objective1: + dialog: + - '&a[Filius] &fYou made it through the mountain! You don''t see that every day.' + - I'm afraid my father is missing, but I can tell you about the path to &dGladius&f. If you want to help us though, talk to my &aMother&f! + - '&7&oSeem like &aFilius&7&o can help me find the way to &dGladius&7&o.' + name: '&5The Farmstead' + questLore: + - The path to &dGladius&f should be easy, but with + - all the disturbances we've been seeing I suspect + - it might not be that simple. + - I am good friends with the &aProprietor of the Farmstead&f + - down the road. If you tell them I sent you, I am sure + - they will tell you how to safely reach &dGladius&f and + - give you news about the surrounding area. + - Good luck in your travels and stay safe! + questAcceptDialog: + - '&a[Petrae]&f Just tell the &aProprietor of the Farmstead&f that I sent you, though I have heard that the &aProprietor&f hasn''t been seen in a while.' + - If they aren't around I am sure their son &aFilius&f will be glad to help you out! + - Safe travels! + - '&7&oI should follow the path to the &dFarmstead&7&o and talk to its &aProprietor&7&o.' + questCompleteMessage: + - '&a[Petrae]&f Outstanding! I saw you defeat the &cCrystal Elemental&f, clearly there''s greatness in your future!' + - Now that we are on the other side, let me tell you the path to &dGladius&f! + - '&7&oI should talk to &aFilius&7&o to learn the way to &dGladius&7&o, and possibly talk to his &aMother&7&o to see how I can help.' +primis_main_quest_7: + customObjectives: + Objective4: + dialog: + - '&a[General Hasta] &fI can''t believe you made it past the enemies.' + - You are exactly the kind of help we need right now! + - '&7&oSeems like I should talk to &aGeneral Hasta&7&o.' + name: '&5The path to Gladius' + questLore: + - Recently smoke was sighted over the fortress of &dGladius&f. + - We were unable to go there and see what's happening + - because a &dShip&f is currently blocking the path. + - We got attacked by a bunch of undead-looking creatures + - when we approached the &dShip&f, so we ran away. + - I am afraid you will have to force your way through this + - '&dShip&f in order to reach &dGladius&f. I''m sure that they will' + - reward you if you help thin the number of &cUndead&f on that ship! + questAcceptDialog: + - '&a[Filius] Be careful on the road, clearly something has gone wrong in &dGladius&f.' + - Once you reach &dGladius&f, the Fortress' lord should either be at his mansion or at the barracks! + - '&7&oI should go down the path to &dGladius&7&o and clear out some &cUndead Sailors&7&o on the way there.' + questCompleteMessage: + - '&a[Lord Hasta]&f Were you sent as reinforcements from Pontis Mille? Where are the others? Are you a messenger?' + - '&7&oI should talk to &aLord Hasta&7&o.' +primis_main_quest_8: + name: '&5Recovering Hope' + questLore: + - We never saw this invasion coming. + - They came in the dead of night, hit us hard and fast. + - Before we knew it, half the city was overrun. + - Morale is low. Everyone here has lost someone. + - To spite our heartache, our own loved ones parade + - through the streets in a mockery of life itself. + - We need to rally and bolster morale, + - or we won't see another dawn! + - Back in my &dMansion&f, in my treasury, lies a &eDocument&f + - of the utmost importance. It is a written promise with + - one of the founders of &dPontis Mille&f to provide us with + - assistance in a time of dire need. This is the time. + - Retrieve the &eDocument&f, bring it back to me and + - I promise you will be welcomed in &dPontis Mille&f with + - open arms. Soldiers will fight to their last + - if given this small hope. + questAcceptDialog: + - '&a[General Hasta] The note is in my &dMansion&f. Be sure to bring it back. My men here also have other requests around town you can help with, if able.' + - '&7&oI should check what the other soldiers need and head to the &dMansion&7&o at the town exit.' + questCompleteMessage: + - '&a[Lord Hasta]&f Outstanding! Recovering this &eDocument&f in the middle of a war? If we had 10 more of you, the city would never have been taken in the first place!' + - Before you go, do you think you could do me a small personal favor? + - '&7&oSeems like &aLord Hasta&7&o wants to talk to me.' +primis_main_quest_9: + name: '&5Gladius'' Champion' + questLore: + - Before heading to &dPontis Mille&f, I have a + - personal favor to ask. + - Our &cChampion&f was last seen fighting off a horde of + - enemies near the &dStatue&f. + - We have not heard from him since the start of the + - invasion and at this stage we fear the worst. + - Please go check on him. If you find him and he has + - turned into one of these undead... please free him of his curse. + questAcceptDialog: + - '&a[General Hasta] &fMake your way to the &dStatue&f. I am sure our &cChampion&f will be easy to find.' + - '&7&oI should go to the &dStatue&7&o and investigate what happened to the &cChampion of Gladius&7&o.' + questCompleteMessage: + - '&a[General Hasta]&f So... The worst has come to pass. I will make sure these beasts shall pay for slaying my son.' + - 7&oSeems like &aGeneral Hasta&7&o has some parting words for me. +primis_ogre_mines_clear: + name: '&2Ogre-sized problems' + questLore: + - Our mining encampment was overrun! + - We need help! + - I don't really know what happened, but we need to clear + - the encampment and talk to &aOld Vetus&f! + questAcceptDialog: + - '&a[Metus]&f You''re going to help? Please hurry, the encampment is just beyond here!' + - '&7&oI should clear the encampment and talk to &aOld Vetus&7&o.' + questCompleteMessage: + - '&a[Vetus Fossores]&f You came to help? Fantastic, we absolutely need help right now!' + - Here's a little something for your help clearing the encampment! +primis_ogre_mines_lost_bretheren: + customObjectives: + Objective1: + dialog: + - '&a[Fortis Fossores] &fWhat do you want? What, &aFugit&f sent you? What for? The mines were overrun? Hah, I didn''t even notice!' + - Let that worrywart brother of mine know that I am fine. Now, begone! I am on the verge of making a big mining discovery. I call it - branch mining! Hehehe, this one will change everything! + name: '&5Lost Bretheren' + questLore: + - The mine was overrun by &cOgres&7&o! + - In the confusion I got separated from my &aBrother&f in the &dMines&f, + - and I fear for his safety! + - He's a bit of an eccentric man, very dedicated to mining. + - You'll know if you've seen him! + - Please bring him back up here, or at the very least tell me if he is safe. + - I'll make it worth your trouble! + questAcceptDialog: + - '&a[Fugit] &fPlease find my &aBrother&f and make sure he''s OK!' + - '&7&oI find &aFugit''s Brother&7&o in the &dMines&7&o overrun by &cOgres&7&o.' + questCompleteMessage: + - '&a[Fugit Fossores]&f My &aBrother&f said what? Ah, typical of him, too focused on his work to notice the entire place was taken over!' + - I'll have a serious conversation with him next time I see him! + - Thank you for your help, you can have my best pick-axe, LL I call her. It doesn't look like I'll be able to get mining any time soon at this rate. +primis_ogre_mines_old_miner_quest: + name: '&2Lucky Pickaxe' + questLore: + - We have ourselves a bit of a pickle! + - As we were mining, we came across a mysterious cave full of monsters! + - I dropped my favorite &ePick-axe&f as I ran, I need your help to go get it! + - I'm sure the &cOgre Magi&f picked it up for himself. + - Get my &eLucky Pickaxe&f back from that brute! + - I've got some trinkets for you when you return. + questAcceptDialog: + - '&a[Vetus Fossores]&f That &cOgre&f shouldn''t be far! You can find him in the cave to the right, before the collapsed area.' + - He should have the &ePickaxe&f, &cOgres&f love shiny things after all! + - '&7&oI should defeat the &cOgre Chief&f.' + questCompleteMessage: + - '&aa[Vetus Fossores]&f You got my lucky pick? Excellent!' + - Heres your reward! +primis_pontis_groves_acrobatics: + customObjectives: + Objective1: + dialog: + - '&a[Idoneitatem Hominem]&f Congratulations!' + name: '&2Acrobatics' + questLore: + - So you think you have you what it takes. + - Are you fit enough, are you quick enough, are you strong enough? + - Platforms, wines, dangerous heights. All you could ever want! + - The ultimate challenge lies ahead! + - OK, OK. Me and my &aBrother&f might have been bored a bit and + - made an entire acrobatics course. + - The goal is to to get from platform to platform using &9Wines&f and + - '&9Acrobatics&f and reach the end of the course.' + - Should you get through the course and reach the end. (Which is a sphere by the way.) + - You will be rewarded with a very nice &eItem&f! + questAcceptDialog: + - '&a[Posuere Hominem]&f You can find the start of the course at the &dEnd of that Tunnel&f.' + - Just swim up to the first wine and keep climbing the wine until you reach the top. + - Don't forget to speak to my &aBrother&f at the end of the course for the reward! + - '&7&oI should head to the start of the course.' + questCompleteMessage: + - '&a[Idoneitatem Hominem]&f Well deserved! I hope you did not cheat! Try and beat my record if you can.' +primis_pontis_groves_caught in the web: + name: '&2Caught in the web' + questLore: + - So they have a &dNest&f somewhere in the &dGrove&f. + - That would explain why their population has skyrocketed. + - We were used to some &cSpiders&f wandering into the &dGrove&f, but this is too much. + - It would be great if you could locate the &dNest&f and clear it out. + - We will make you some fine &eSpider Leg Boots&f as a reward! + questAcceptDialog: + - '&a[King Nemian]&f If there is a &dNest&f I am sure it would be &9Surrounded by Cobwebs&f.' + - '&7&oI should find the &dSpiders Nest&7&o and clear it out.' + questCompleteMessage: + - '&a[King Nemian]&f Hah! I knew we could count on you!' + - Here are your fine boots, well deserved! +primis_pontis_groves_elf_stole_from_my_shelf: + name: '&2Elf stole from my shelf' + questLore: + - Disaster has struck our little hole. + - Not too long ago our lovely home got raided by &cElf Bandits&f. + - Thankfully we weren't home at the time so nobody got hurt. + - We managed to replace most of our possessions. + - But they took my &eFamily Heirloom&f that was sitting on the shelf. + - If you would be so kind to go try and get it back for me, I would be most thankful. + - I make the best stews, I would be glad to share some with you as a reward. + questAcceptDialog: + - '&a[Luxuria Gorgonius]&f The &eHeirloom&f is quite valuable I am sure they would keep it &9Somewhere Extra Safe&f.' + - '&7&oI need to go retrieve the &eHeirloom&7&o.' + questCompleteMessage: + - '&a[Luxuria Gorgonius]&f Oh my gosh! You found it!' + - There are not enough thanks in the world for what you just did for me. + - '&7&oThis stew should keep med fed for a while.' +primis_pontis_groves_into_the_next_hole: + customObjectives: + Objective1: + dialog: + - '&a[Phygia Gorgonius]&f Time to kick those &cElves&f out for good!' + name: '&2Into the next hole...' + questLore: + - If you are available there is plenty more work to do around here. + - We have some serious &cElf&f problems, + - but I have assigned &aPhygia&f to handle those issues. + - Go talk to &aPhygia Gorgonius&f in the hole next to this one. + - They will be able to tell you more and what needs to be done. + questAcceptDialog: + - '&a[King Nemian]&f The hole right next to this one one, can''t miss it!' + - '&7&oI should go talk to &aPhygia Gorgonius&7&o.' + questCompleteMessage: + - '&a[Phygia Gorgonius]&f Let''s talk...' + - '&7&oI should hear out &aPhygia Gorgonius&7&o.' +primis_pontis_groves_lighthouse_1: + customObjectives: + Objective1: + dialog: + - '&a[Alanus Secundas] &fHas the &dGrove&f sent you?' + name: '&2Feeding the sick' + questLore: + - Wanderer, could I ask a simple favor of you? + - There is a nearby &dLighthouse&f. We usually deliver food to the family that lives there. + - But ever since the troubles began we could not leave our &dGrove&f. + - Would you be so kind to bring the family their latest batch of food. + - It would be great if you could hurry, it has been a while since the last delivery. + questAcceptDialog: + - '&a[King Nemian]&f When you exit the hole the &dLighthouse&f is straight forward and a bit to the left.' + - '&7&oI should go to the &dLighthouse&7&o.' + questCompleteMessage: + - '&a[Alanus Secundas]&f I am so thankful! We were just starting to run out of food.' + - Are you busy? + - '&7&oSeems like &aAlanus&7&o wants to talk to me.' +primis_pontis_groves_lighthouse_2: + customObjectives: + Objective1: + dialog: + - '&8[Jeeves]&fOh, hello there again!' + - '&8[Jeeves]&f They do not need the food anymore? I was just about to go shopping.' + - '&8[Jeeves]&f So kind of you to come here and let me know.' + name: '&2Do not ask Jeeves' + questLore: + - Uh, before you came. Jeeves the Travelling Merchant stopped by. + - We asked him if he could go get some food for us. + - Well, that is not necessary anymore so it would be great if you could climb to the top of + - the lighthouse and travel to Caeruleaum Village and tell Jeeves we do not need the food anymore. + questAcceptDialog: + - '&8[Alanus Secundas]&f When you exit the dwelling the Lighthouse is straight forward and a bit to the left.' + - '&8&oI should go to the Lighthouse.' + questCompleteMessage: + - '&8[Alanus]&f You let him know? Good, good!' + - '&8&oSeems like Alanus is quite fed.' +primis_pontis_groves_population_control: + name: '&2Population control!' + questLore: + - Oh I am so happy that finally someone has arrived to help us out. + - We have a big arachnid problem going on in our little grove. + - There are so many arachnids around these days that you cannot even + - take a nice evening walk without one of the nasty buggers + - jumping at you from the shadows. + - It is clear that their population numbers need a serious culling. + - Oh! Please bring to me any arachnid legs that are still in good contidion. + - We use them to make small cranes and grabbers. + questAcceptDialog: + - '&8[King Nemian]&f You will find them lurking beneath the shadows of the trees.' + - '&8&oI need to find Forest Crawlers and kill them.' + questCompleteMessage: + - '&8[King Nemian]&fGood to see you return, and with plenty of legs too!' + - '&8[King Nemian]&fYou think that their nest might be near? Let''s talk more about this' +primis_pontis_groves_tree_climbing_elf_bandits: + name: '&2Tree climbing elf bandits!' + questLore: + - I've had it up here with these gosh darn tree climbing &cElf Bandits&f in our &dGrove&f. + - Not like the &cSpiders&f were enough, + - now these shadow loving poop nuts have decided to settle in our trees! + - They love the dark you see, the light hurts them, makes them all foggy in the head. + - Of course a lot of darkness and shadow in our little &dGrove&f. So they moved right in! + - Forced their way in with their superior numbers. + - Well they got something coming alright, + - one look at you and I can tell you can handle a couple of stone giants! + - I am sure some elves won't be much of an issue for you. + - Go send them a message. The message is clear, THEIR NASTY BUTTS AIN'T WELCOME HERE! + questAcceptDialog: + - '&a[Phygia Gorgonius]&f I am sure you will find plenty of them if you find some place with shade and just look up, hard to miss their tree houses.' + - '&7&oI should go take care of these &cElves&7&o before &aPhygia&7&o catches on fire from rage.' + questCompleteMessage: + - '&a[Phygia Gorgonius]&f My friend! HAHA! So good to see you again!' + - I was watching from a distance. Seeing those fools fall to their death, nothing better! + - '&7&oThe elves wont be bothering &aPhygia&7&o ever again.' +primis_pontis_mille_fields_berry_crazed_wolf: + name: '&2Berry crazed wolves' + questLore: + - Oh gosh, I have no idea what is wrong with these &cRockhounds&f. + - They keep coming into the &dBerry Farm&f while I am away or sleeping. + - You would think they come here and eat the berries, but no! + - They load their mouths with them and carry them + - off somewhere deep into the forest. + - I mean they are &cHounds&f! Why are they even stealing berries. + - Well I guess it doesn''t matter, I have a favor to ask. + - Could you go clear the + - '&9Area Behind the Berry Farm&f,' + - and bring back my &eStolen Berries&f. + - I have a lot of pies to make and the berries they stole were ripe and ready. + questAcceptDialog: + - '&a[Dordalus Nasica]&f I only saw the &cRockhounds&f steal the berries.' + - '&7&oI should go kill the &c&oRedwood Rockhounds&7&o and collect any &e&oStolen Berries&7&o they drop.' + questCompleteMessage: + - '&a[Dordalus Nasica]&f Oh my, you did it. Could I bother you with one more tiny favor.' + - '&7&o Seems like &d&oMilonia&7&o has more work for me.' +primis_pontis_mille_fields_camping_hunters: + customObjectives: + Objective1: + dialog: + - '&a[Scribonia Ingenvinus]&f Yes?' + name: '&2Camping hunters' + questLore: + - I hope I am not bothering you. You look like a person that would listen to a plea. + - We do not have much to do here in the &dSlums&f, + - most of us like to wander the &dFields&f to pass the time. + - Unfortunately that has come to a stop after a bunch + - of &cMonsters&f started roaming around the &dFields&f. + - We heard that some hunters have made &dCamp&f near the &dFields&f. + - If you could go there and talk to them and ask them to deal with these &cMonsters&f... + questAcceptDialog: + - '&a[Augustina Verrucosis]&f Their &dCamp&f should be somewhere North-West of here.' + - '&7&oI need to head for the &d&oHunters Camp&7&o.' + questCompleteMessage: + - '&a[Scribonia Ingenvinus]&f Help the &dSlums&f with their &cMonster&f issue?' + - Let's talk more about. + - '&7&oI should talk to &a&oScribonia&7&o and hear out what she has to say.' +primis_pontis_mille_fields_camp_hunter_three_times_hunter: + name: '&2Hunter three times hunter' + questLore: + - So you found &aVolumnia&f. Thank the great hunters that she is alright. + - Since you have helped &aVolumnia&f and proven yourself a kind soul. + - How about a friendly challenge. I would be willing to offer you some nice + - quality armor should you face the challenge and return victorious. + - The challenge involves hunting + - '&cThree Great Beasts&f scattered across Pontis.' + - The &cBeast Cod Furiosa&f who swims underneath a bridge where two mountains stand. + - '&cBeast Crawler Megdun&f that slumbers on top of a sun covered grove.' + - Dancing between two western peaks you will find the + - '&cBeast Impaler Uladzimir' + - As proof bring me the &eImpaler's Horn&f, the &eCod's Scale&f and the &eCrawler's Silk&f. + questAcceptDialog: + - '&a[Milonia Majus]&f Here take this device it will roughly guide you to the their location.' + - '&7&oI should go and challenge the &c&oThree Great Beasts&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f You have returned. And you have brought all three items I requested as proof.' + - That must have been quite an adventure, reminds me of my younger days when I had more strength and agility. + - Well enough about me, here is your reward as promised! + - '&7You hand back the beast tracking device.' + - '&a[Milonia Majus]&fI had almost forgotten about that thing, thank you!' + - Until we meet again adventurer! +primis_pontis_mille_fields_do_it_yourself: + name: '&2Do it yourself' + questLore: + - Deal with the &cMonsters&f? Well I can tell you we have already been doing that. + - There is just too many of them and not enough of us. + - We started hunting them as soon as we made our &dCamp&f here. + - But their numbers just don't seem to be going down. + - And that's not even the worst of it. + - We have discovered a lair and a big old &cBeast&f that comes with it! + - Well since you have made it to our &dCamp&f in one piece, + - I assume you are quite capable yourself. + - How about joining the hunt? What say you? + questAcceptDialog: + - '&a[Scribonia Ingenvinus]&f I knew you would say yes! I see you are already well equipped.' + - OK, this is what I want you to do. + - We are worried about that large &cBeast&f aka. &cBig ol' Bubba&f so that is priority number one. + - Second I need you to slay 5 &cLonghorns&f and 6 &cShorthorns&f. + - Understood? Good. Report to me when you're done. + - '&7&oI should slay &c&oBig ol'' Bubba&7&o and kill 5 &c&oLonghorns&7&o and 6 &c&oShorthorns&7&o.' + questCompleteMessage: + - '&a[Scribonia Ingenvinus]&f I must say I am quite impressed.' + - Clearly you are way more than just 'capable'. + - Thank you for the assistance, we will be able to handle the rest. + - Until we meet again, great hunter. +primis_pontis_mille_fields_feeding_the_hungry: + customObjectives: + Objective3: + dialog: + - '&7You hand the over the bread and the flour.' + - '&a[Rufia Tertulus]&f I don''t know what to say. My children will be so happy!' + - '&7The woman bows to you in deep appreciation.' + Objective4: + dialog: + - '&a[Fabia Praetextus]&f I guess fantasies do come true sometimes. I am eternally grateful to you kind sir.' + Objective1: + dialog: + - '&a[Lena Lucan]&f Fresh bread! I cannot thank you enough!' + Objective2: + dialog: + - '&a[Tranio Florens]&f Wow! The day just keeps getting better!' + - Thank you for the flour kind soul. + name: '&2Feeding the hungry' + questLore: + - I can feel a good heart beating in that chest of yours. + - Not everyone is as fortunate as you and I. + - There are some poor souls living in the &dPontis Mille Slums&f. + - For a while now I have been working over + - time to produce surplus bread and flour. + - Would you mind taking these sacks of wheat and these bread stacks. + - Then travel with them to the &dSlums&f and hand them out to those in need? + - I have been doing this for a while now but I injured my left foot, + - so I cannot do much walking right now. + questAcceptDialog: + - '&a[Daemones Maritialis]&f I wish there were more people like you in the world.' + - The &dSlums&f are straight North of here, you can see the buildings in the distance. + - '&7&oI should go to the &dSlums&7&o and hand out the food to those in need.' + questCompleteMessage: + - '&a[Augustina Verrucosis]&f &2Daemones&f sent you here didn''t he.' + - He has been coming by every week handing out any food he could spare to make sure we didn't starve... + - Thank you stranger, my family won't forget this. +primis_pontis_mille_fields_fruity_hound: + name: '&2Fruity hound' + questLore: + - Since you are my NUMBER ONE berry recovery agent, + - I have another task for you. + - As you can see we grow some very large berries on our + - little &dBerry Farm&f here. + - There was a + - '&eSpecific Berry&f I was growing for a contest.' + - But as I was walking to the &dBerry Farm&f I saw a + - '&cFruity Rockhound&f jump for the bush holding my prized berry.' + - He snapped it off and carried it away. + - Its jaws were holding the berry by its stem so + - it should still be in one piece, I hope. + - If you go slay the beast and bring back my + - dear &eContest Berry&f I will have a nice + - reward waiting for you. + questAcceptDialog: + - '&a[Dordalus Nasica]&f I think I saw the &cHound&f head into the &dRedwoods&f, North-West of the farm.' + - '&7&oI should go slay the &c&oFruity Hound&7&o and see if the &e&oContest Berry&7&o is still in one piece.' + questCompleteMessage: + - '&a[Dordalus Nasica]&f YES! That is my darling! Fine and whole, not even any saliva on it!' + - As a reward for your work you can have my second largest berry. Be careful not to eat it. + - I know might be tempting to eat it, but believe me it's way more useful if you keep it around. +primis_pontis_mille_fields_not_on_my_farm: + name: '&2Not on my farm!' + questLore: + - Lately all these &cRats&f have been driving me crazy. + - They keep going into our little farm and eating all our goods! + - Any chance you could go and lower their numbers a bit? + - Be careful, there are so many of them. + - Oh, I almost forgot to tell you. + - If you see a large &cWell Fed Rat&f don't bother with it. + - It has grown so large and fat it would take you days to slay it. + questAcceptDialog: + - '&a[Milonia Majus]&f I am sure that you already noticed that they like to squirm around the path area.' + - '&7&oI should go kill the &cRats&7&o that hang around the path that leads to &dPontis Mille&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f Thank you so much! We can get back to making delicious goods now.' +primis_pontis_mille_fields_surprise_me_with_flour: + customObjectives: + Objective3: + dialog: + - '&a[Adulescens Lupis]&f I heard the farm was having &cRat&f problems. Three sacks of flour coming up, no problem!' + Objective1: + dialog: + - '&a[Dinia Niraemius]&f Flour? Sure, one sack of flour coming up!' + Objective2: + dialog: + - '&a[Daemones Maritialis]&f The farm needs more flour eh? Here ya go, two sacks!' + name: '&2Surprise me with flour' + questLore: + - Wow, you're quite handy. If I could bother you with another task. + - The &cRats&f had completely ruined our current stock of flour. + - So we need to a completely new batch of flour. + - The &dWindmills&f should have plenty of it. + - Go collect the flour and drop it off back here with me. + - I will be paying good coin for this service! + questAcceptDialog: + - '&a[Milonia Majus]&f You will need to collect the flour from all three &dWindmills&f.' + - '&7&oI need to visit the three &dWindmills&7&o and collect the flour they produce.' + questCompleteMessage: + - '&a[Milonia Majus]&f This should last us for quite a while!' + - Hopefully our flour tab won't get too big, hehe. +primis_pontis_mille_fields_wellness: + name: '&2Wellness' + questLore: + - Am I glad to see you right now! + - Dang &cNightmare Rat&f ambushed me while I was climbing down the well. + - I injured my arm and legs when I fell. + - Argh, I still have some of its toxic spit left in my eyes. + - Thankfully I managed to crawl my way onto this little + - ledge before it could come finish me off. + - How embarrassing, not sure what hurts more right now, my body or my pride. + - I have some + - '&eFirst Aid Equipment&f' + - in my chest at the &dHunters Camp&f. + - Would you mind getting it for me? Oh, and make sure not to tell anyone + - there a word about what you saw here. + - '...almost died in a well...this is chapter of my life I will need to erase...' + questAcceptDialog: + - '&a[Volumnia Zoilus]&f The &dHunters Camp&f is straight South, cannot miss it, look for tents.' + - '&7&oI need to go collect the &e&oFirst Aid Equipment&7&o for &a&oVolumnia&7&o at the &d&oHunters Camp&7&o.' + questCompleteMessage: + - '&a[Volumnia Zoilus]&f Already back? Hand me the equipment.' + - Do not worry about me, I will have myself patched up in no time. + - Thank you for everything! You saved my life you know! +primis_pontis_mille_field_check: + customObjectives: + Objective1: + dialog: + - '&a[Augustina Verrucosis]&f Oh, this is quite important! I will let the residents know.' + - Thank you for delivering these important documents. + name: '&2Field check' + questLore: + - If I could bother you with some delivery tasks. + - I have here some important documents that need to be delivered to the + - '&dSlums&f and to the &dFields Farm&f.' + - The soldier that was supposed to come and get them has not arrived yet. + - And this is an urgent matter, we cannot afford to wait any longer. + - Unfortunately I have strict orders to not leave my post. + - If you could do this for me it would help us out a lot. + questAcceptDialog: + - '&a[Godefridus Novation]&f You will do it? Excellent!' + - You can follow the &9Yellow Path&f to get to the slums. + - The &dFields Farm&f is right beyond the slums, just follow the path. + - Oh! And watch out for the field rats! + - '&7&oI should head for the &d&oSlums&7&o and then the &d&oFields Farm&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f Documents? Let me see them. Hmmm, looks official.' + - Thank you for coming all the way here to deliver them. + - '&7&oSeems like &a&oMilonia&7&o could use my help with the rats...' +primis_pontis_mille_fresh_rats_coming_up: + customObjectives: + Objective1: + dialog: + - '&a[Elite Guard]&f Plenty of rats inside.' + name: '&2Fresh rats coming up' + questLore: + - No cat food but I think I can help ya + - find something even better... + - I heard a couple of + - '&aGuards&f have been dealing with' + - a rat infestation in the lower parts of the city. + - Go down there and maybe you can get some + - '&cRats&f for your cat friend.' + questAcceptDialog: + - '&7&oI should check out the lower part of the city and see if I can find the &a&oElite Guards&7&o.' + questCompleteMessage: + - '&a[Mew Meowzer]&f Meow. MEOW! Prrrrr.' + - '&7&oI should let the cat enjoy it''s meal in peace.' + - '&7&oIt seems to have dropped something, hmm...' +primis_pontis_mille_hungry_friend: + customObjectives: + Objective3: + dialog: + - '&a[Melaenis Gelasius]&f Cat food? Where the heck did you manage to find a cat here...' + - No, I don't know where to get any cat food. + Objective4: + dialog: + - '&a[Sulpicio Panthera]&f I wish I could help, sorry.' + Objective1: + dialog: + - '&a[Royal Guard]&f Do I look like someone who keeps track of cat food?...' + Objective2: + dialog: + - '&a[Tyndarus Faustinius]&f Sorry, I have no idea.' + Objective5: + dialog: + - '&a[Tyndarus Columbanus]&f We used to have cat food around here somewhere, but heck knows what happened to it...' + name: '&2Hungry friend' + questLore: + - '&7&oWhat is wrong little one.' + - '&a[Mew Meowzer]&f Meow!' + - '&7&o Are you hungry? Does the' + - '&7&olittle one want some food?' + - '&a[Mew Meowzer]&f MREOOOW!!!' + - '&7&oLet''s see if we can' + - '&7&oget you some food.' + questAcceptDialog: + - '&7&oI should see if anybody in the city knows where to find some cat food.' + questCompleteMessage: + - '&a[Modestus Aper]&f Cat food? I don''t know about that. But...' + - '&7&oSeems like &a&oModestus&7&o might know something...' +primis_pontis_mille_late_delivery: + name: '&2Late delivery' + questLore: + - I ordered some &eFishing Nets&f from + - '&dGladius&f that haven''t arrived yet. I wonder' + - if something might have happened to the + - shipment. If you are willing, I would pay you + - a small fee if you could go see what + - happened to the shipment and get the + - '&eFishing Nets&f for me.' + questAcceptDialog: + - '&a[Delphium Calpurnius]&f Last I heard my shipment of &eFishing Nets&f was supposed to be heading for &dGladius&f.' + - '&7&oI need to go look around &d&oGladius&7&o for &a&oDelphium''s&7&o shipment of &e&oFishing Nets&7&o.' + questCompleteMessage: + - '&a[Delphium Calpurnius]&f Those are the &eFishing Nets&f! Thank you so much!' + - '&a[Delphium Calpurnius]&f I invested a lot of my savings into these! Not sure what I would have done if you hadn''t found them.' +primis_pontis_mille_let_them_know: + customObjectives: + Objective3: + dialog: + - So Fortes sent you? I see. + - Your help would be much appreciated, aid me and my forces will be ready. + Objective1: + dialog: + - So Fortes has decided to take action. + - Help me finish my task, and my forces will be ready. + Objective2: + dialog: + - So Fortes has decided to act. + - If you could assist me with this task, then my forces will be ready. + name: '&2Let them know!' + questLore: + - I am sorry that we cannot send aid to &dGladius&f right away. + - Ever since that new &cCounselor&f came, our ruler has not been himself. + - If you could reach out to the &aGenerals&f in the city and let them know + - that &dGladius&f needs help we might be able to to do something about it. + - But not before we deal with the existing issues first. + - I am sure that the &aGenerals&f will be happy to let you help them out with their issues. + - Go talk to them and then come back to let me know they got the message. + - I will reward you for your time. + questAcceptDialog: + - '&a[Fortes]&f Follow the &9orange path&f from the main room to find &aGeneral Bromia&f.' + - '&a[Fortes]&f At the end of the &9yellow path&f you will find the &aGeneral Rogerius&f.' + - '&a[Fortes]&f At the end of the &9shorter purple&f path you will find the &aGeneral Cylindrus&f.' + - '&7&oI need to talk to the three &a&oGenerals&7&o.' + questCompleteMessage: + - '&a[Fortes]&f You managed to contact them? Excellent!' + - '&a[Fortes]&f Here is your reward. Don''t spend it all in one place.' +primis_pontis_mille_lighthouse_1: + customObjectives: + Objective1: + dialog: + - '&8[Hegio Remus]&f Another letter? Thank you for bringing it to me.' + name: '&2A quick delivery' + questLore: + - Before you go anywhere, could you deliver this letter for me? + - You can find the gentleman it needs to go to on top of the Lighthouse. + - Don't worry the Lighthouse is right behind me through that doorway. + questAcceptDialog: + - '&8[Fortes]&f Thank you.' + - '&8&oI should go talk to the Pontis Mille Lighthouse Keeper.' + questCompleteMessage: + - '&8[Hegio Remus]&f Hey, do you have a second?' + - '&8&oSeems like Hegio Remus needs me to talk to him.' +primis_pontis_mille_lighthouse_2: + customObjectives: + Objective1: + dialog: + - '&a[Jeeves]&f Oh, we meet again. It''s good to see you.' + - You have something for me? Oh, wow...that is quite the shopping list. + - I will have the items sent back to &aHegio&f as soon as possible. + - Thank you for stopping by. Hope we meet again. + - '&7&oI should let &aHegio&7&o know I delivered the note.' + name: '&2Ask Jeeves' + questLore: + - Would you mind taking the portal and delivering a note to my good friend &aJeeves&f. + questAcceptDialog: + - '&a[Hegio]&f Much appreciated friend.' + - '&7&oI should go talk to &aJeeves&f at &dCaeruleaum Village&7&o.' + questCompleteMessage: + - '&a[Hegio]&f You delivered the note? Excellent!' + - Here, you can have some of this &eRabbit Stew&f I keep in my back pocket. +primis_pontis_mille_mines_goblined_up_in_the_maze: + customObjectives: + Objective3: + dialog: + - '&a[Hurt Guard]&f Am so I happy to see you!' + Objective1: + dialog: + - '&a[Injured Guard]&f Thank the skies!' + Objective2: + dialog: + - '&a[Wounded Guard]&f Finally, the rescue is here!' + name: '&2Goblined up in the maze' + questLore: + - If I could bother you for a second. + - Since you will be going into the &dMines&f already, it + - would be great if you could help us resolve some issues. + - We are missing three &aGuards&f that were sent + - into the mines to hunt down a &cCursed Goblin&f. + - I fear that something might have happened to them. + - This &cCursed Goblin&f is supposed to be + - hiding in some sort of &9Maze&f in the &dMines&f. + - Could you locate the &aMissing Guards&f and + - bring me proof of the &cGoblins&f death. + questAcceptDialog: + - '&a[Centurion]&fTry to not get lost in the &9Maze&f.' + - May luck be on your side warrior! + - '&7&oI should venture through the &d&oMines&7&o and locate the &9&oMaze&7&o.' + questCompleteMessage: + - '&a[Centurion]&f They are alive, excellent, we will send some soldiers to get them out as soon as possible.' + - I see you brought proof of the &cGoblins&f death, well done. + - '&7&oHopefully people keep out of the &9Maze&7&o in the future.' +primis_pontis_mille_serious_sewage: + customObjectives: + Objective3: + dialog: + - '&a[Michelangelo]&f Tell that old man everything is in order!' + Objective4: + dialog: + - '&a[Raphael]&f Tell Rogerius I am alive and doing fine!' + Objective1: + dialog: + - '&a[Donatello]&f You can tell the General I am doing just fine!' + Objective2: + dialog: + - '&a[Leonardo]&f The General should not worry, I am ok!' + name: '&2Serious sewage' + questLore: + - If you are up to the task then I could use your help. + - The &dSewers&f under the city have become a lair for all sorts of trouble makers and critters. + - The trouble makers call themselves &cNinjas&f...even though they are far from it. + - They have a leader, I think he calls himself &cShreepper&f or something. + - Make sure to get rid of him, a snake without it's head is not a threat. + - If you could go down there and thin the numbers of critters and the trouble makers + - then that would allow me to assign my forces to more important tasks... + - We had also sent &a4 Agents&f down there, I have not heard from them yet. + - It would mean a lot to me if you could check up on them to make sure they are ok. + - I also seem to have misplaced my personal &eSewage Keys&f + - if you could retrieve those too, that would be great. + questAcceptDialog: + - '&a[Rogerius]&fYou can get to the &dSewers&f by going to the fountain and then a bit south-east.' + - You know you are at the right spot when you see a big sewage pipe going into the wall. + - '&7&oI need to find my way into the &dSewers&7&o and complete the tasks.' + questCompleteMessage: + - '&a[Rogerius]&f You have completed the all I have asked? If only I had 10 more men like you...' +primis_pontis_mille_star_gazing: + customObjectives: + Objective1: + dialog: + - '&a[Virgo Dexippus]&f Yes, what is it?' + name: '&2Star gazing' + questLore: + - You have done so much for this city and its people. + - Having assisted the three &aGenerals&f and helped the areas around &dPontis Mille&f + - has freed up a serious amount of our forces and resources. + - We would be able to send our forces to aid &dGladius&f now. + - But before we take action there is one last thing I would like you to do. + - You should go speak with the &aStargazers&f. + - It is in regards to our lost history and the &cElementals&f. + - The &aStargazers&f will be able to tell you more once you talk to them. + - Here take this sealed note and show it to them. + questAcceptDialog: + - '&7[Fortes Bellator]&f You can find the &aStargazers&f at the &dObservatory&f.' + - The &dObservatory&f is located past the &dLighthouse&f. It is a large tower, hard to miss. + - '&7&oI should talk to the &aStargazers&7&o at the &dObservatory&7&o.' + questCompleteMessage: + - '&a[Virgo Dexippus]&f The &aMajor&f sent you? It must be important then.' + - '&7&oI should talk to &aVirgo&7&o.' +primis_pontis_mille_stay_a_while_and_listen: + name: '&2Stay a while and listen' + questLore: + - Hand me the note. Let me take a look... + - We have been given permission to share important + - information with you regarding our past. + - You must have done something quite important, + - this information is usually only shared with the top brass. + - '&aStella&f will share with you what we have uncovered.' + questAcceptDialog: + - '&a[Virgo Dexippus]&f Talk to &aStella&f and &9Click on the Sword&f to start listening.' + - '&7&oI should talk to &aStella&7&o and start the &9Arena Challenge&7&o.' + questCompleteMessage: + - '&a[Virgo Dexippus]&f Do not share this information with anyone.' + - '&7&oThat was quite a tale.' +primis_pontis_mille_the_groves_call: + customObjectives: + Objective1: + dialog: + - '&a[King Nemian]&f &2General Bromia&a sent you?' + - Excellent, I knew we could count on him. + name: '&2The groves call!' + questLore: + - It is our duty to protect the &dGroves&f from any threats. + - '&aKing Nemian&f of the &dGroves&f has sent a request for aid.' + - Nasty critters have come to the &dGroves&f and other + - invaders are taking over the trees. + - If you could go over there and sort out these issues + - then my forces will be free to come to &dGladius'&f aid + questAcceptDialog: + - '&a[Bromia]&f The &dGroves&f are located North of the city.' + - There is a path through the mountain,, below the mines. + - '&7&oI should talk to &aKing Nemian&7&o.' + questCompleteMessage: + - '&a[King Nemian]&f You have arrived just in time!' +primis_pontis_mille_to_lycan_or_not_to_lycan: + name: '&2To lycan or not to lycan' + questLore: + - Not sure how a single person can accomplish what + - an entire battalion cannot. + - But if the &aGeneral&f has sent you, then who I am to complain. + - We have located their &dDen&f, but the resistance is too strong. + - There was just no way to get through. + - But If you could fight your way into the &dDen&f and clear it out + - then the &dRedwoods&f could be safe yet again. Well safer at least... + - Their &dDen&f is located under a &9Corrupted Redwood Tree&f. + - Should be easy to spot it, it stands out among the healthy trees. + questAcceptDialog: + - '&a[Cylindrus]&f Be careful...' + - '&7&oI need to clear out the &dWerewolf Den&7&o.' + questCompleteMessage: + - '&a[Magnus]&f By the great tree fairy, you''ve done it!!!' + - Feel free to rest at our camp, you are always welcome here. +primis_pontis_mille_where_is_he_now: + customObjectives: + Objective1: + dialog: + - '&a[Gorenus Palis]&f My brother sent you looking for me?' + - Oh, I messed up again...I got real lost this time. + - I hope he isn't too mad. + - When you go back, please tell him I'm safe. + name: '&2Hungry friend' + questLore: + - Me and my &aBrother&f were on our way + - back here from the village. + - During our travels I had to do a little detour, so we got separated. + - We were supposed to meet up here. + - But no trace of him for quite some time now. + - He has a tendency to get lost...real lost. + - I am quite worried about him. + - I would be willing to pay a high reward + - to anyone who can find him. + questAcceptDialog: + - '&a[Rodenus Palis]&f So kind of you to offer your help.' + - Please if you find him come tell me where he is right away. + - '&7&oI need to go find &a&oRodenus''&7&o brother.' + questCompleteMessage: + - '&a[Rodenus Palis]&f What! How the heck did he end up all the way there!' + - Sigh, I better start going now then... + - Thank you for all your help. Here are the coins as promised. +primis_pontis_redwoods_big_brown_logs: + customObjectives: + Objective1: + dialog: + - '&a[Magnus]&f Who are you? Oh, you came from &dPontis Mille&f.' + name: '&2Big brown logs' + questLore: + - I could dedicate my forces to helping &dGladius&f if you could help + - us deal with the &cWerewolf&f crisis in the &dRedwoods&f. + - Our forces have been holding back the &cWerewolves&f for weeks now. + - It would be great if you could assist us. + - Go to the &dRedwoods&f and talk to &aMagnus Castorea&f. + - They will let you know what needs to be done to end this crisis. + questAcceptDialog: + - '&a[Cylindrus]&fThe &dRedwoods&f can be reached by heading North.' + - Head North until you reach the &dRailway Stop&f, then head West. + - '&7&oI need to head into the &dRedwoods&7&o and talk to &aMagnus&7&o.' + questCompleteMessage: + - '&a[Magnus]&f The general has sent you to help?' + - Hmm...you better be good. +primis_pontis_redwoods_its_reyn_time: + name: '&2It is Reyn time!' + questLore: + - My &ePocket-watch&f had fallen into the river when I was cutting down a tree. + - It is a special watch you see. Filled with air and quite robust. + - Fully resilient to heavy logs being dropped on it, yep. + - I saw one of those nasty &cBandits&f scoop it up and put it in their pocket. + - Pretty sure I saw them &9Carrying a Hatchet&f. + - If you could go to their camp and get it back for me. That would mean the world to me! + - A nice reward for you too when you get back! + questAcceptDialog: + - '&8[Reynus]&f You can find the &cBandits&f right across the river.' + - '&7&oI need to go slay the correct &cBandit&7&o and collect the &eWatch&7&o.' + questCompleteMessage: + - '&a[Reynus]&f I will make sure not to loose it again!' + - Your reward my good sir! +primis_pontis_redwoods_nasty_little_bandits: + name: '&2Nasty little bandits!' + questLore: + - Ever since these darn &cBandits&f settled across the river there has been no peace. + - They keep ruining the trees, yesterday I caught one of them + - trying to set one of these giant trees on fire! + - And not too long ago I got chased by a crazy person with a hatchet, + - I am quite sure it was one of the &cBandits&f. + - Not too mention they keep trying to rob anyone that + - has business with us good folk here at the &dSawmill&f. + - Enough is enough. I am willing to pay good coin to make this madness end. + questAcceptDialog: + - '&a[Ligna Crispian]&f You will find them across the river.' + - '&8&oI should go to the &dBandit Camp&f and clear it out.' + questCompleteMessage: + - '&a[Ligna Crispian]&f Finally! Some peace, thank you!' +primis_pontis_redwoods_need_a_smoke: + name: '&2Need a smoke' + questLore: + - I heard you helped good old &aReynus&f there. + - Well as you can see, I managed to cut my legs with that darn saw again. + - Oh, don't worry about me. My legs will be healed up again in no time. + - You see, the issue is, not much to do while I wait for my legs to heal. + - This makes me in the mood for some good puffin. + - I brought with me some &ePremium Tobacco&f for my pipe, + - but I had to hide it in case those &cBandits&f got their hands on it. + - The problem is, I completely forgot where I hid it! + - All I remember is burying it &9Near a Tree&f. + - Which tree? Who knows! + - Listen I got you a fine deal here. Find my tobacco and you can have + - all of my &eGolden Apples&f. + questAcceptDialog: + - '&a[Lyco]&f Hope ya find it soon.' + - '&7&oI should go look for the &eTobacco&7&o.' + questCompleteMessage: + - '&a[Lyco]&f You found it! HAHA! Knew I could rely on ya!' +primis_terravilla_bipedal_examination: + name: '&2Bipedal examination' + questLore: + - I have been studying the &cTwo Legged Terrors&f that roam + - around &dTerravilla&f. Did you know that their population + - used to be much larger just some years ago. In fact it was + - the reason why the first settlers decided to build + - '&dTerravilla&f on top of the ruins and not down on the ground.' + - For some reason their numbers have really decreased. I was + - trying to get some &eSamples&f but trying to kill any of them is + - far beyond my skill. But you look like the sort of type who + - can handle a &cTwo Legged Terror&f or two. Interested in + - helping me out? + questAcceptDialog: + - '&a[Plautia Suilius]&f Six &eSamples&f should do it. Return to me once you have collected the &eSamples&f.' + - '&7&oI need to slay 3 &c&oTwo Legged Terrors&7&o and collect their &e&oSamples&7&o.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Great! Let''s have a look.' + - '&7&oI should hear what &a&oPlautia Suilius&7&o has discovered.' +primis_terravilla_drowning_terror: + name: '&2Drowning terror' + questLore: + - My theory was correct. I dissected the growth and found + - an organism inside. After careful examination I have + - determined that the organism is of aquatic origin. And + - not only that, they are capable of hijacking the host's + - brain. Once ready to hatch they make the host go to the + - nearest water source and drown themselves. The organism + - can then freely hatch and swim away. Whatever is + - infecting the &cTwo Legged Terrors&f must be living in + - a nearby river. You should go there and collect a + - '&ePerfect Sample&f of whatever organism is causing this.' + - I do not know if this is something that can affect humans + - but just in case you should kill a few of the organisms + - to make sure. + questAcceptDialog: + - '&a[Plautia Suilius]&f Come back here once you have collected a &ePerfect Sample&f.' + - '&7&oI need to go to the nearby river and collect a &e&oPerfect Sample&7&o of whatever is causing the infections.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Wow it looks like a fish, but it''s internal organs are different.' + - It must infect other creatures by releasing these tiny worm like meat particles... + - Let me have a look at you. Hmm, you seem fine, no traces... + - So it is not affecting us...yet. This is an emergency, I need to collect my stuff and go present my findings to the researchers at &dPontis Mille&f immediately. I need to get approval for extermination, that organism cannot be allowed to evolve. + - Thank you for everything you have done. Here, take this. It's not a lot but at least it's something. + - '&7&oI should make sure to stay away from the river...' +primis_terravilla_hog_on_my_porch: + name: '&2Bipedal examination' + questLore: + - He is sitting on the darn lift again! + - I cannot believe it! You there! + - You look like you can handle a large beast. + - I will pay you good money if you can get rid + - of that &cAnnoying Large Hog&f that keeps sitting + - on the lift. How are we supposed to get goods + - up and down this way. + questAcceptDialog: + - '&a[Dorippa Sarimarcus]&f Get rid of that hog right down there, see it?' + - '&7&oI need to slay the &c&oAlpha Razorback&7&o.' + questCompleteMessage: + - '&a[Dorippa Sarimarcus]&f Finally! I can move on with my life now! Thank you!' +primis_terravilla_razorbag: + name: '&2Razorbag' + questLore: + - If you are looking for work I got some for ya. + - I design and make heavy duty bags that I sell + - here at my little shop. So I am in need of + - leather. Thankfully there are plenty of + - '&cRazorbacks&f around these parts. If you are' + - interested I would like to hire you to go hunt + - them for their leather. I would need a considerable + - amount of leather. So this won't be a quick job. + questAcceptDialog: + - '&a[Telestis Senna]&f You will mostly find them roaming around here and towards the fields area.' + - '&7&oI need to go hunt the &c&oMature Razorback&7&o.' + questCompleteMessage: + - '&a[Telestis Senna]&f Yep, that will do it. In pristine condition too! Here is your coin, as promised.' +primis_terravilla_terrifying: + name: '&2Terrifying' + questLore: + - Well that is concerning. The sample you brought shows + - that they are slowly being drained of their nutrients. + - My hypothesis is that there is most likely a parasite + - attached to them that is causing this. You should go + - out there again and see if you can find any large + - '&eGrowths&f on their bodies, and then cut them off' + - and bring them back here. + questAcceptDialog: + - '&a[Plautia Suilius]&f I would only need two &eGrowths&f no more than that.' + - '&7&oI need to slay &c&oTwo Legged Terrors&7&o and collect two &e&oGrowths&7&o.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Excellent, these should do it.' + - '&7&oI should hear what &a&oPlautia Suilius&7&o has managed to find.' +test_quest: + name: Kill the Test Boss + questLore: + - '&cEnd the test boss'' reign of terror!' +xmas_quest_0: + name: '&2Find the lost gifts!' + questLore: + - I seem to have lost some Christmas gifts along the way, would you help a poor old man find them again? + - I will let you open one of them in return! + questAcceptDialog: + - '&8[&cSaint Nick&8]&f Thank you! I will be waiting here for you!' + questCompleteMessage: + - '&8[&cSaint Nick&8]&f Thank you for your help! There are still some lost gifts out there, talk to me again if you want to help out more!' diff --git a/src/main/resources/translations/japanese.yml b/src/main/resources/translations/japanese.yml new file mode 100644 index 000000000..d84b841a3 --- /dev/null +++ b/src/main/resources/translations/japanese.yml @@ -0,0 +1,13252 @@ +config: + noArenaPermissionMessage: '[EliteMobs] このアリーナに入る権限がありません!' +ItemSettings: + itemLoreStructureV2: + - '&7&m&l---------&7<&l装備情報&7>&m&l---------' + - '&7アイテムレベル: &f$itemLevel &7プレステージ &6$prestigeLevel' + - '$weaponOrArmorStats' + - '$soulbindInfo' + - '$itemSource' + - '$ifLore&7&m&l-----------&7< &f&l伝承&7 >&m&l-----------' + - '$customLore' + - '$ifEnchantments&7&m&l--------&7<&9&lエンチャント&7>&m&l--------' + - '$enchantments' + - '$eliteEnchantments' + - '$ifCustomEnchantments&7&m&l----&7< &3&lカスタムエンチャント&7 >&m&l------' + - '$customEnchantments' + - '$ifPotionEffects&7&m&l----------&7< &5&l効果&7 >&m&l----------' + - '$potionEffect' + - '&7&l&m-----------------------------' + - '$loreResaleValue' + shopSourceItemLores: '&7店頭での購入' + mobSourceItemLores: '&7$mob から略奪した' + loreWorths: '&7Worth $worth $currencyName' + loreResaleValues: '&7売値: $resale $currencyName' + eliteEnchantmentLoreStrings: 上級の + noSoulbindLore: '&7所有者なし!' + preventEliteItemDisenchantmentMessage: '&c[EliteMobs] エリートアイテムを削除できません!' + scrapSucceededMessageV2: '&8[EliteMobs] &2スクラップが $amount 回成功しました!' + scrapFailedMessageV2: '&8[EliteMobs] &cスクラップに $amount 回失敗しました!' + lowDurabilityItemDropMessage: '&8[EliteMobs] &c耐久性が低いためドロップされたアーマー! &8スクラップでNPCに修理して使用しましょう!' + lowWeaponItemDropMessage: '&8[EliteMobs] &c耐久性が低いためドロップされた武器! &8スクラップでNPCに修理して使用しよう!' + simlootMessageSuccess: '&8[EliteMobs] &2戦利品を獲得し、 $itemName &2を獲得しました!' + simlootMessageFailure: '&8[EliteMobs] &c戦利品を手に入れました!' + directDropCustomLootMessage: '&8[EliteMobs] &2 $itemName &2を獲得しました' + directDropMinecraftLootMessage: '&8[EliteMobs] &a $itemName &aを取得しました' + directDropCoinMessage: '&8[EliteMobs] &a&2$amount $currencyName &aを獲得!' + directDropSpecialMessage: '&8[EliteMobs] &a&2$amount $name &aを獲得!' + weaponEntry: '&7エリートDPS: &2$EDPS' + armorEntry: '&7エリート防具: &2$EDEF' +ProceduralItemGenerationSettings: + materialNames: + swordName: 剣 + bowName: 弓 + pickaxe: ツルハシ + spade: シャベル + hoe: クワ + axe: 斧 + helmet: ヘルメット + chestplate: チェストプレート + leggings: レギンス + boots: ブーツ + shears: ハサミ + fishingRod: 釣竿 + shield: 盾 + trident: トライデント + crossbow: クロスボウ + nameFormats: + - '$adjective $noun の $verb $itemType' + - '$adjective $noun の $itemType' + - '$noun の $adjective $verb $itemType' + - '$verb $itemType' + - '$adjective $verb $itemType' + - '$verb-er' + - '$adjective $verb-er' + nouns: + - MagmaGuy + - 夜明け + - 日没 + - 天国 + - ネザー + - 天使 + - 大天使 + - 天使 + - セラフ + - 悪魔 + - 悪党 + - コウモリ + - ニワトリ + - ウシ + - ムーシュルーム + - ブタ + - ウサギ + - ヒツジ + - イカ + - 村人 + - 洞窟グモ + - エンダーマン + - シロクマ + - クモ + - ゾンビピッグマン + - ブレイズ + - クリーパー + - エルダーガーディアン + - エンダーマイト + - エヴォーカー + - ガスト + - ガーディアン + - ハスク + - マグマキューブ + - シュルカー + - シルバーフィッシュ + - スケルトン + - スライム + - ストレイ + - ヴェックス + - ヴィンディケーター + - ウィッチ + - ウィザースケルトン + - ゾンビ + - ロバ + - ウマ + - ラマ + - ラバ + - ヤマネコ + - オオカミ + - アイアンゴーレム + - スノウゴーレム + - エンダードラゴン + - ウィザー + - イリュージョナー + - オウム + - 巨人な + - カルバノグの殺人ウサギ + - スティーブ + - トリカブト + - カオス + - アイオーン + - ドラゴン + - スフィンクス + - ミノタウロス + - ハデス + - オース + - オースブレイカー + - 脱走兵 + - 裏切り者 + - ジェイド + - 明るい + - 暗闇 + - 忘却の世界 + - 影 + - 空虚 + - キセノン + - 熱狂者 + - 天頂 + - 夕暮れ + - 黄昏 + - モブ + - エリートモブ + - ウリスト + - ドワーフ + - エルフ + - オーク + - ゴブリン + - ノーム + - ゴリアテ + - ドラウ + - ヒューマン + - ハーフリング + - ハーフオーク + - コンテナ + - マインドフレア + - オウルベア + - 弾丸 + - ラストモンスター + - 半分巨人 + - 石の巨人 + - 氷の巨人 + - 火の巨人 + - 雲の巨人 + - 嵐の巨人 + - コボルト + - リッチ + - オーク + - アンバーハルク + - ファイター + - ウィザード + - パラディン + - クレリック + - レンジャー + - アーチャー + - メイジ + - ティーフリング + - 人狼 + - ヴァンパイア + - ケンタロウス + - キャットフォーク + - 半分巨人 + - オーガ + - トロール + - ローグ + - バーバリアン + - 吟遊詩人 + - ドルイド + - 修道士 + - 魔術師 + - 魔法使い + - デーモンハンター + - デスナイト + - 聖職者 + - シャーマン + - 戦士 + - バジリスク + - キメラ + - 小鬼 + - ドリュアス + - ガーゴイル + - ジンニ + - エフリーティ + - ゴースト + - ホブゴブリン + - ヒドラ + - クラクケン + - ラミア + - メドゥーサ + - ミミック + - ミイラ + - ペガサス + - ロック + - サテュロス + - タラスク + - アボミネィション + - グール + - ウッドアイズ + - ユニコーン + - レイス + - 侍者 + - グラディエーター + - ナイト + - グリフォン + - レイダー + - スカウト + - スパイ + - スグ + - ノーブル + - ガード + - ネイビーシールズ + - ワイバーン + - アビサル + - インファナル + - エレメンタル + - トーレン + - パンダレン + - サスカッチ + - フォセイクン + - イエティ + - バンシー + - クモ + - アンデッド + - 夜の妖精 + - 血の妖精 + - ドレーネイ + - ウォーゲン + - 武将 + - ウィッチ + - マギ + - セージ + - 盗賊 + - シャドウアサシン + - テンプル騎士団 + - 猛獣使い + - バーサーカー + - 発明者 + - 戦士 + - 海賊 + - 先駆者 + - ボイドブレード + - ウィスプ + - 小作農 + - 従士 + - 剣士 + - 玉座 + - フェルハウンド + - ハンレス + - ハンター + - アーラコク + - アボレス + - デヴァ + - 惑星 + - 太陽 + - アンケグ + - アゼル + - ビーヒア + - 死の暴君 + - ブライト + - バグベア + - ハグベア + - 暴虐 + - カンビオン + - チュル + - リッチキング + - コカトリス + - コアトル + - サイクロプス + - タイタン + - ダークマントル + - 古代の祠 + - デミリッチ + - ベイラー + - バグベラ + - 峡谷 + - ドリッチ + - グラブレズ + - ゴリストロ + - ヘズロウ + - マニズ + - マリリス + - ナルフェシュネー + - クアジット + - ブイロック + - ヨークロル + - ピットフィーンド + - レミュール + - ドラコリッチ + - ドッペルゲンガー + - クロマティックドラゴン + - ドラウ + - 大気の精霊 + - 大地の精霊 + - 火の精霊 + - 水の精霊 + - ローハン + - ゴンドール + - エンピリアン + - フェリードラゴン + - エティン + - ファーン + - フォモール + - ダオ + - グノル + - パルシェンディ + - リスナー + - スプレン + - ストームファザー + - ロシャリアン + - ブライトロード + - ハイプリンス + - キング + - 皇帝 + - シャードベラー + - サージバインダー + - ボンデスマッシュ + - ゴーレム + - ゴーゴン + - ハッグ + - ハーピー + - ヒッポグリフ + - ホムンクリフ + - 錬金術師 + - 死なない戦士 + - ジャッカルウェア + - ノシック + - オニ + - ラクシャーサ + - レヴナント + - カルト主義者 + adjectives: + - アドラブル + - 美しい + - 清潔な + - エレガントな + - ファンシーな + - 魅力的な + - ハンサムな + - 長めの + - 壮大な + - 無地の + - 古風な + - きらめく + - 醜い + - 赤色の + - オレンジ色の + - 黄色の + - 緑色の + - 青色の + - 紫色の + - 灰色の + - 黒色の + - 白色の + - 死んだ + - 異常な + - 強力な + - 豊富な + - 広大な + - 熱心な + - 難聴な + - 気絶した + - 旋律な + - 静かな + - 雷雨の + - ささやく + - シーッ + - 古代の + - 速い + - 古い + - 高速な + - 遅い + - 腐った + - 不気味な + - 曲がった + - 空っぽな + - 重い + - 忌まわしい + - 異常な + - ばかげている + - 許容可能な + - 偶発的な + - 断固な + - 大胆な + - 怨めしい + - 活発な + - 困惑した + - 迷惑な + - 不安な + - 香ばしい + - 積極的な + - よそよそしい + - 素晴らしい + - あいまいな + - 野心的な + - 面白がっている + - 怒りの + - 傲慢な + - 恥じる + - 意欲的な + - 驚異的な + - 縁起の良い + - 平均的な + - 凄い + - 非常に悪い + - 悪い + - 野蛮な + - 恥ずかしがり屋の + - ふさわしい + - 好戦的な + - 有益な + - 荒れた + - 最良な + - うろたえた + - 大きい + - 苦い + - 奇怪な + - 血まみれの + - 沸騰中な + - 境界のない + - 不作法な + - 勇敢な + - たくましい + - 壊れやすい + - 短い + - 明るめの + - 壊れた + - 忙しい + - 計算中の + - 冷淡な + - 穏やかの + - 気まぐれな + - 注意したほうが良い + - 不注意な + - 介護中の + - 慎重な + - 絶え間ない + - 特定の + - 魅力的な + - 安っぽい + - 最高責任者の + - 肌寒い + - 凛々しい + - 分厚い + - 明らか + - 賢い + - 浮世離れした + - 不器用な + - 曇った + - 上品な + - 超巨大な + - 戦闘的な + - ありきたりな + - 混乱している + - 非難された + - クールな + - 勇敢な + - 臆病な + - 気が狂った + - 臆病な + - 残酷な + - かわいい + - 奇妙な + - キュートな + - 破損している + - 破損しています + - 危険な + - 暗めの + - 粋な + - 決断力がある + - 深い + - 負けた + - 欠陥な + - 反抗的な + - 繊細な + - おいしい + - 楽しい + - 悪魔のような + - 陽気な + - 狂った + - 記述的な + - 悪魔的な + - 困難な + - 勤勉な + - 大胆な + - 汚れた + - 悲惨な + - 汚れた + - 気持ち悪い + - 幻滅した + - 明確な + - 邪魔された + - 過酷な + - 劇的な + - 鬱陶しい + - 機能不全な + - 熱心な + - 年配の + - 電気的な + - 上級の + - エンチャントされた + - 魔力付与された + - エネルギッシュな + - 極大な + - エンターテイメントな + - 熱心な + - 嫉妬深い + - 不規則な + - 軽快な + - 回避的な + - 良い + - エキサイトな + - はなやかな + - エキゾチックな + - 溢れている + - 素晴らしい + - 色あせた + - 快晴な + - 忠実な + - '偽の' + - おなじみの + - 有名な + - 狂信的な + - ファンタスティックな + - 魅了された + - デブな + - 恐怖に満ちた + - 勇敢な + - 弱い + - 祝祭の + - 激しい + - 不潔な + - 細い + - 詳しい + - 最初の + - 修正済の + - 派手な + - 完璧ではない + - スリムな + - 怖い + - 花の + - フワフワな + - はためく + - 泡立つ + - 愚かな + - すべて忘れる + - 幸運な + - 虚弱な + - 脆い + - 必死な + - 自由な + - 凍結中の + - 新鮮な + - フレンドリーな + - 恐ろしい + - 不自由な + - 面白い + - ふわふわな + - ひそかな + - 曖昧な + - 巨人な + - 先天的な + - 特大な + - きらめく + - 輝かしい + - 神々しい + - 良い + - おろかな + - ゴージャスな + - 優美な + - 大げさな + - 感謝される + - 脂っこい + - 素晴らしい + - 欲深い + - 嘆く + - イカす + - グロテスクな + - 汚れた + - 恐ろしい + - 不機嫌な + - 守られた + - 無罪の + - だまされやすい + - 根性がある + - がらがらな + - 許された + - ぶら下がっている + - 不幸な + - 幸せな + - 調和的な + - 憎むべき + - 健康的な + - 失恋した + - 天国のような + - 地獄な + - 役に立った + - 無力な + - 躊躇する + - 恐ろしい + - 陽気な + - 中空な + - ホームレスの + - 立派な + - ひどい + - 丁寧な + - 巨大な + - かさばった + - ユーモラスな + - 空腹の + - 痛む + - 静まり返った + - 催眠的な + - ヒステリックな + - 厄介な + - 凍える + - 無知な + - 病気な + - 違法な + - 輝かしい + - 虚数の + - 膨大な + - 切迫な + - 公平な + - 不完全な + - 失礼な + - 重要な + - 白熱な + - 無能な + - 工業用 + - 信じられない + - 安価な + - 悪名高い + - 無実の + - 探究的な + - 陰湿な + - 本能的な + - 知的な + - 関心のある + - 無敵な + - 怒りの + - かゆい + - 翡翠な + - ギザギザした + - 嫉妬深い + - ようきな + - うれしそうな + - びくびくした + - 幼稚な + - 鋭い + - 優しい + - 心のこもった + - 知っている + - 知識のある + - 既知の + - 労働者の + - ダサい + - 大きい + - 最後の + - 遅い + - 可笑しい + - 怠惰な + - 痩せている + - 致命的な + - 明るい + - 小さな + - 生きている + - さみしがり + - うるさい + - 素敵な + - ラッキーな + - 赤紫色 + - マジカルな + - 雄大な + - 悪意のある + - マーク付き + - 多量な + - 素晴らしい + - 平均的な + - 医療用の + - 溶けた + - 散らかった + - 強い + - 軍事的な + - 無頓着な + - 軽微な + - 微かな + - 混合 + - 現代的な + - 動かない + - ミステリアスな + - むじゃきな + - 狭い + - 自然な + - きちんとした + - 必要な + - 不要な + - 必須な + - 神経質な + - 新しい + - まあまあな + - 普通な + - ノスタルジックな + - 無数な + - 廃止された + - 獲得可能な + - 海洋性な + - 古風な + - 博識な + - 最適な + - 普通の + - オーガニックな + - 未決済な + - 楕円の + - 過大評価された + - 痛い + - 平行した + - 情けない + - 平穏な + - 悔い改めた + - ちょうど良い + - 定期的な + - 小さい + - 物理的な + - 桃色の + - プラスチックな + - 愉快な + - 無意味な + - 丁寧な + - 悪い + - 貴重な + - 高級な + - 現行の + - 美しい + - プライベートな + - 生産的な + - 保護的な + - 公開の + - パズル中 + - 質問 + - クイック + - 最も速い + - レア + - 準備完了 + - リアル + - 反逆者 + - 標準 + - 驚くべき + - 責任者 + - ロマンチック + - ラウンド + - ロイヤル + - 悲しい + - 安全 + - 塩辛い + - 満足 + - 怖い + - 恐怖 + - 科学的 + - やせ細った + - '[鳴き声]' + - 秒 + - 秒針(秒針) + - シークレット + - 利己的な + - シーケンシャル + - 深刻な + - 浅い + - 鋭い + - 輝く + - 衝撃的な + - 短い + - シャイな + - 病気的 + - サイレント + - 絹の + - 愚かな + - シンプル + - 痩せている + - スリム + - ぬるぬる + - よく滑る + - 小さい + - スマート + - スマイル + - 滑らか + - 卑劣な + - 柔らかい + - 安定した + - スペシャルな + - 壮大な + - 香辛料のきいた + - 尖った + - 素晴らしい + - 不気味な + - 染みのない + - 正方形の + - 攻撃的な + - 立っている + - 安定した + - ベタベタの + - 奇異な + - 縞模様の + - 強い + - 成功した + - スーパー + - 最高の + - 甘い + - 才能のある + - 背の高い + - おいしい + - 一時的な + - 緊張した + - ひどい + - 素晴らしい + - テスト済みの + - 感謝している + - 濃厚な + - 細い + - 渇いた + - 思慮に富んだ + - 極小 + - 疲れた + - 難しい + - 問題な + - '真の' + - 醜い + - ウルトラ + - 未通知な + - 武装していない + - 覆われていない + - 不健康な + - ユニークな + - 未知の + - 不自然な + - 未使用の + - 独特な + - 使用済み + - 便利な + - 使えない + - 貴重な + - 暴力的な + - 待機中の + - 放浪的な + - 暖かい + - 弱い + - 裕福な + - 全ての + - 賢い + - 面白い + - 木製の + - 心配した + - 価値のない + - 間違いな + - 脅迫中の + - 信頼している + - 仮定しない + - 脅威にある + verbs: + - 斬属性の + - 切断 + - 刺す + - ひっかく + - 殺害 + - 討伐 + - 屠殺 + - 破壊 + - くすぐり + - ハグ + - 殺人 + - 平手打ち + - シーッ + - 旅行 + - テレポート + - 点滅 + - 破壊 + - 破壊 + - 点滅 + - 実体化 + - スポーン + - 質問 + - 問い合わせ + - 主張 + - 要求 + - 尋問 + - 問い合わせ + - 襲撃 + - 衝撃 + - 奇襲 + - 担当 + - ラッシュ + - 嵐 + - 突撃 + - 兵弾 + - 接近 + - 充電 + - 消失 + - 戦闘 + - 破城 + - Hammering + - Beating + - Combating + - Overwhelming + - Raiding + - Tackling + - Shooting + - Venturing + - Cracking + - Rupturing + - Smashing + - 粉々になる + - 骨折 + - 分割 + - 粉砕中 + - 分解 + - レンダリング + - スナップ中 + - バースト中 + - 爆発 + - 破損しています + - フラグメント + - 分割する + - 要塞 + - 軽くつつく + - タップ + - ぶつかる + - 傾斜度 + - 頭で突く + - カタカタ + - 衝撃 + - 殴りつけ + - 打つ + - 召喚中 + - 絶叫中 + - 荒らし中 + - うなる + - シフト中 + - 変形 + - 修正中 + - ねじれている + - ミュート中 + - 歪み + - ぼかし + - 調整 + - ワープ + - 変更 + - 自動 + - 進化 + - 変更中 + - 狩猟 + - 追跡 + - フォロー中 + - ストーキング + - 影の作成 + - しつこい + - ケース管理 + - マウント + - 昇順 + - 上昇 + - 持ち上げる + - Springing + - Crescing + - Gathering + - Corralling + - Hoarding + - Reaping + - Harvesting + - Saving + - Sheltering + - Cloaking + - Shrouding + - Enclosing + - Concealing + - Hiding + - Disguising + - Masking + - Burying + - スマザリング + - 曇り + - シールド + - 表示 + - Transaction + - 包み込む + - ベールリング + - 無視する + - トラバーシング + - 休戦時間 + - グライディング + - 吠えています + - クンクン + - 絶叫中 + - シュレイキング + - 詰めています + - うなる + - 嘆き + - Bawling + - '[鳴き声]' + - Cleaving + - 伐採中 + - チッピング中 + - 切断中 + - Slicing + - Snipping + - 分割する + - Axing + - 斬属性の + - レンダリング + - 分解 + - Thinning + - クロッピング + - Carving + - Dissecting + - Hacking + - 貫通 + - Sawing + - Shaving + - Shearing + - Mining + - Delving + - Excavating + - Burrowing + - 掘削 + - Hollowing + - Gouging + - Tunneling + - Invading + - Boarding + - 放浪的な + - Infiltrating + - Intruding + - Evading + - Fleeing + - Running + - Dodging + - Crashing + - 戦闘 + - Tussling + - Wrestling + - Scuffling + - Dueling + - Brawling + - Jousting + - Sparring + - Clashing + - Warring + - Grappling + - Scrapping + - Attacking + - Feuding + - Skirmishing + - Discovering + - Detecting + - Catching + - Solving + - Revealing + - Unearthing + - Leaping + - Bouncing + - Springing + - Vaulting + - Hopping + - Surging + - Punting + - Booting + - Dropkicking + - Sensing + - Perceiving + - Detecting + - Fading + - Bleeding + - Shrinking + - 弱体化 + - Abating + - Diminishing + - Forging + - Releasing + - Gathering + - Collecting + - Culling + - Crushing + - Propelling + - Jogging + - Sprinting + - Questing + - Scouting + - Exploring + - Digging + - Trembling + - Rattling + - Parting + - Hacking + - Rupturing + - Carving + - Dividing + - Halving + - Breaking + - Sundering + - Separating + - レンダリング + - Ripping + - Grazing + - Imprisoning + - Snaring + - Cornering + - Entangling + - Pinning + - Catching + - Restraining + - Binding + - Hooking + - Snagging + - Snatching + - Caging + - Capturing + - Haunting + - Creeping + - Sneaking + - Spying + - Avenging + - 嵐 + verb-ers (noun): + - World Breaker + - World Shatterer + - Avenger + - Ashbringer + - Windseeker + - Defiler + - Thunderfury + - Slicer + - Slasher + - Cutter + - Stabber + - Scratcher + - Killer + - Slayer + - Destroyer + - Hugger + - Murderer + - Slapper + - Traveller + - Teleporter + - Blinker + - Wrecker + - Materializer + - Spawner + - Demander + - Assaulter + - Striker + - Ambusher + - Rusher + - Stormer + - Bombarder + - Barrager + - Smiter + - Charger + - Battler + - Hammerer + - Beater + - Combater + - Overwhelmer + - レイダー + - Tackler + - Shooter + - Venturer + - Cracker + - Smasher + - Shatterer + - Fracturer + - Splinterer + - Pulverizer + - Tearer + - Renderer + - Snapper + - Burster + - Exploder + - Damager + - Fragmenter + - Splitter + - Fortifier + - Nudger + - Tapper + - Thumper + - Butter + - Clatterer + - Striker + - Whacker + - Slammer + - Summoner + - Screamer + - Shifter + - Transformer + - Modifyer + - Twister + - Blurrer + - Warper + - Alterer + - Adapter + - Evolver + - HunterEnchantment + - Trailer + - Follower + - Stalker + - Shadower + - Hounder + - Caser + - Mounter + - Ascender + - Riser + - Springer + - Hoarder + - Reaper + - Harvester + - Saver + - Shelterer + - Cloaker + - Shrouder + - Encloser + - Hider + - Masker + - Buryer + - Clouder + - Shader + - Sealer + - Enveloper + - Veiler + - Traverser + - Forder + - Glider + - Howler + - Whimperer + - Screamer + - Squealer + - Bawler + - Screecher + - Chopper + - Chipper + - Snipper + - Splitter + - Axer + - Slasher + - Renderer + - Tearer + - Thinner + - Cropper + - Carver + - ハッカー + - Piercer + - Sawer + - Shaver + - Shearer + - Miner + - Excavater + - Burrower + - Driller + - Tunneler + - Invader + - Boarder + - Wanderer + - Intruder + - Evader + - Runner + - Dodger + - Crasher + - Battler + - Wrestler + - Scuffler + - Dueler + - Brawler + - Clasher + - Grappler + - Scrapper + - Attacker + - Feuder + - Catcher + - Solver + - Revealer + - Leaper + - Bouncer + - Vaulter + - Hopper + - Surger + - Punter + - Dropkicker + - Perceiver + - Fader + - Bleeder + - Weakener + - Forger + - Releaser + - Gatherer + - Crusher + - Propeller + - Jogger + - Sprinter + - Scouter + - Explorer + - Digger + - Trembler + - Parter + - ハッカー + - Carver + - Divider + - Halver + - Breaker + - Renderer + - Ripper + - Grazer + - Imprisoner + - Cornerer + - Pinner + - Catcher + - Restrainer + - Binder + - Snagger + - Snatcher + - Cager + - Capturer + - Haunter + - クリーパー + - Sneaker + - Binder + - Jailer + - Seducer + - Dancer + - Blasphemer + - Eater + - Snorer + - Thruster + - Slapper +absorption: + name: 衝撃吸収 +blindness: + name: 盲目 +conduit_power: + name: コンジットパワー +confusion: + name: 吐き気 +damage_resistance: + name: 耐性 +dolphins_grace: + name: イルカの好意 +fast_digging: + name: 採掘速度上昇 +fire_resistance: + name: 火炎耐性 +glowing: + name: 発光 +harm: + name: 即時ダメージ +heal: + name: 即時回復 +health_boost: + name: 体力増強 +hunger: + name: 空腹 +increase_damage: + name: 攻撃力上昇 +invisibility: + name: 透明化 +jump: + name: 跳躍力上昇 +levitation: + name: 浮遊 +luck: + name: Luck +night_vision: + name: 暗視 +poison: + name: 毒 +regeneration: + name: 再生 +saturation: + name: 満腹度回復 +slow: + name: 鈍化 +slow_digging: + name: 採掘速度低下 +slow_falling: + name: 落下速度低下 +speed: + name: 移動速度上昇 +unluck: + name: 不運 +water_breathing: + name: 水中呼吸 +weakness: + name: 弱体化 +wither: + name: ウィザー +translation: + Economy pay message v2: '&2あなたは$receiverに&2$amount_sent $currency_name&2を支払いました。&2税を払って$amount_receivedを受け取りました。' + Economy currency left message: '&2$amount_left $currency_name を持っています' + Economy money from payment message: '&f$senderから&2$amount_received $currency_nameを受け取りました' + Economy payment insuficient currency: '&2それをするための十分な$currency_nameを持っていません。' + Wallet command message: '&2$balance $currency_name を所有しています' + Tax confirmation message: '&c送金するには税金が $percentage%かかります。&a続行するには&9$command&aを実行してください' + shopBatchSellItem: '&aYou have sold your items &afor $currency_amount $currency_name!' + Shop buy message: '&aあなたは$item_name &aを $item_value $currency_nameで購入しました!' + Shop current balance message: '&a$currency_amount $currency_name を所有しています' + Shop insufficient funds message: '&cそれをするための十分な$currency_nameを持っていません。' + Shop item cost message: そのアイテムのコストは &c$item_value $currency_name です。 + Shop sell message: '&aあなたは$item_name &aを $currency_amount $currency_nameで購入しました!' + Shop sale player items warning: '&cあなたにが所有していないアイテムを販売することはできません!これは他のプレステージのアイテムを含みます!' + Shop sale instructions: '&cここにはEliteMobの略奪品のみ販売できます。(エリートからドロップされた装備/武器は、その略奪品の価値を示しています)' + Teleport time left: '&7[EM] &a$time &7秒後にテレポートします...' + Teleport cancelled: '&7[EM] &cテレポートが中断されました!' + noPendingCommands: '&c現在保留中のコマンドはありません!' + trackMessage: Track the $name + chestLowRankMessage: '&7[EM] &cYour guild rank needs to be at least $rank &cin order to open this chest!' + chestCooldownMessage: '&7[EM] &cYou''ve already opened this chest recently! Wait $time!' + insufficientCurrencyForWormholeMessage: '&8[EliteMobs] &cInsufficient currency! You need $amount to use this com.magmaguy.elitemobs.wormhole!' + dismissEMMessage: '&8[EliteMobs] &2/elitemobs &fmenu not working for you? Try &2/elitemobs alt &fto see an alternative version of the menu! &cDon''t want to see this message again? &4/em dismiss' + switchEMStyleMessage: '&8[EliteMobs] &2/elitemobs &fmenu style changed! Check it out!' +EconomySettings: + currencyName: エリートコイン + chatCurrencyShowerMessage: '&7[EM] &a$amount $currency_name を受け取りました!' + actionbarCurrencyShowerMessage: '&7[EM] &a$amount $currency_name を受け取りました!' + adventurersGuildNotificationMessages: '&7[EM] お金が余った?&a/em を使ってみてください!' +arrow_damage: + name: 射撃ダメージ増加 +arrow_fire: + name: フレイム +arrow_infinite: + name: 無限 +arrow_knockback: + name: パンチ +binding_curse: + name: 束縛の呪い +channeling: + name: 召雷 +critical_strikes: + name: クリティカルヒット + criticalHitPopup: '&5クリティカルヒット!' +damage_all: + name: ダメージ増加 +damage_arthropods: + name: 虫特効 +damage_undead: + name: アンデッド特効 +depth_strider: + name: 水中歩行 +dig_speed: + name: 効率強化 +drilling: + name: 掘削 +durability: + name: 耐久力 +earthquake: + name: Earthquake + earthquakeActivationMessage: '&8[EliteMobs] &aEarthquake triggered! &c2 min cooldown!' + earthquakeAvailableMessage: '&8[EliteMobs] &2Earthquake cooldown over!' +fire_aspect: + name: 火属性 +flamethrower: + name: 火炎放射 +frost_walker: + name: 氷渡り +grappling_hook: + name: Grappling Hook +hunter: + name: ハンター +ice_breaker: + name: アイスブレイカー +impaling: + name: 水生特効 +knockback: + name: ノックバック +lightning: + name: Lightning +loot_bonus_blocks: + name: 幸運 +loot_bonus_mobs: + name: ドロップ増加 +loud_strikes: + name: Loud Strikes +loyalty: + name: 忠誠 +lure: + name: 入れ食い +mending: + name: 修繕 +meteor_shower: + name: 流星群 +multishot: + name: 拡散 +oxygen: + name: 水中呼吸 +piercing: + name: 貫通 +plasma_boots: + name: Plasma Boots +protection_environmental: + name: ダメージ軽減 +protection_explosions: + name: 爆発耐性 +protection_fall: + name: 落下耐性 +protection_fire: + name: 火炎耐性 +protection_projectile: + name: 飛び道具耐性 +quick_charge: + name: 高速装填 +riptide: + name: 激流 +silk_touch: + name: シルクタッチ +soulbind: + name: 紐付け + loreStrings: '&7&f$player に紐付け' + hologramString: '$player' +summon_merchant: + name: 商人の召喚 + message: Jeeves! +summon_wolf: + name: 狼の召喚 +sweeping_edge: + name: 範囲ダメージ増加‌ +thorns: + name: 棘の鎧 +unbind: + name: アンバインド +vanishing_curse: + name: 消滅の呪い +water_worker: + name: 水中採掘 +AntiExploit: + AntiExploit message: '&c[EM AntiExploit] &7近くのエリートが特別な戦利品を落とすことはありません' +CombatTag: + Combat tag message: '&c[EliteMobs] 戦闘タグが作動!' +AdventurersGuild: + adventurersGuildMenuName: '&6&lアドベンチャーズハブ' + Prestige 0 rank 0: '&8Commoner - disables elites!' + Prestige 0 rank 0 short placeholder: '&6&l✧&e0' + Prestige 0 rank 1: '&f新人' + Prestige 0 rank 1 short placeholder: '&6&l✧&eⅠ' + Prestige 0 rank 2: '&f初心者' + Prestige 0 rank 2 short placeholder: '&6&l✧&eⅠⅠ' + Prestige 0 rank 3: '&f見習い' + Prestige 0 rank 3 short placeholder: '&6&l✧&eⅠⅠⅠ' + Prestige 0 rank 4: '&2冒険者' + Prestige 0 rank 4 short placeholder: '&6&l✧&eⅠⅤ' + Prestige 0 rank 5: '&2上級者' + Prestige 0 rank 5 short placeholder: '&6&l✧&eⅤ' + Prestige 0 rank 6: '&2熟練者' + Prestige 0 rank 6 short placeholder: '&6&l✧&eⅤⅠ' + Prestige 0 rank 7: '&1ベテラン' + Prestige 0 rank 7 short placeholder: '&6&l✧&eⅤⅠⅠ' + Prestige 0 rank 8: '&1エリート' + Prestige 0 rank 8 short placeholder: '&6&l✧&eⅤⅠⅠⅠ' + Prestige 0 rank 9: '&lマスター' + Prestige 0 rank 9 short placeholder: '&6&l✧&eⅠⅩ' + Prestige 0 rank 10: '&5ヒーロー' + Prestige 0 rank 10 short placeholder: '&6&l✧&eⅩ' + Prestige 1 rank 0: '&eプレステージ 1 &8庶民' + Prestige 1 rank 0 short placeholder: '&e⚜Ⅰ&6&l✧&e0' + Prestige 1 rank 1: '&eプレステージ 1 &f新人' + Prestige 1 rank 1 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠ' + Prestige 1 rank 2: '&eプレステージ 1 &f初心者' + Prestige 1 rank 2 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅠ' + Prestige 1 rank 3: '&eプレステージ 1 &f見習い' + Prestige 1 rank 3 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅠⅠ' + Prestige 1 rank 4: '&eプレステージ 1 &2冒険者' + Prestige 1 rank 4 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅤ' + Prestige 1 rank 5: '&eプレステージ 1 &2上級者' + Prestige 1 rank 5 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤ' + Prestige 1 rank 6: '&eプレステージ 1 &2熟練者' + Prestige 1 rank 6 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠ' + Prestige 1 rank 7: '&eプレステージ 1 &1ベテラン' + Prestige 1 rank 7 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠⅠ' + Prestige 1 rank 8: '&eプレステージ 1 &1エリート' + Prestige 1 rank 8 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠⅠⅠ' + Prestige 1 rank 9: '&eプレステージ 1 &5マスター' + Prestige 1 rank 9 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅩ' + Prestige 1 rank 10 short placeholder: '&e⚜Ⅰ&6&l✧&eⅩ' + Prestige 1 rank 10: '&eプレステージ 1 &5ヒーロー' + Prestige 1 rank 11: '&eプレステージ 1 &5Legend' + Prestige 1 rank 11 short placeholder: '&e⚜Ⅰ&6&l✧&eⅩⅠ' + Prestige 2 rank 0: '&2プレステージ 2 &8庶民' + Prestige 2 rank 0 short placeholder: '&2⚜ⅠⅠ&6&l✧&e0' + Prestige 2 rank 1: '&2プレステージ 2 &f新人' + Prestige 2 rank 1 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠ' + Prestige 2 rank 2: '&2プレステージ 2 &f初心者' + Prestige 2 rank 2 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅠ' + Prestige 2 rank 3: '&2プレステージ 2 &f見習い' + Prestige 2 rank 3 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 2 rank 4: '&2プレステージ 2 &2冒険者' + Prestige 2 rank 4 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅤ' + Prestige 2 rank 5: '&2プレステージ 2 &2上級者' + Prestige 2 rank 5 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤ' + Prestige 2 rank 6: '&2プレステージ 2 &2熟練者' + Prestige 2 rank 6 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠ' + Prestige 2 rank 7: '&2プレステージ 2 &1ベテラン' + Prestige 2 rank 7 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 2 rank 8: '&2プレステージ 2 &1エリート' + Prestige 2 rank 8 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 2 rank 9: '&2プレステージ 2 &5マスター' + Prestige 2 rank 9 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅩ' + Prestige 2 rank 10 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩ' + Prestige 2 rank 10: '&2プレステージ 2 &5ヒーロー' + Prestige 2 rank 11: '&2プレステージ 2 &5Legend' + Prestige 2 rank 11 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩⅠ' + Prestige 2 rank 12: '&2プレステージ 2 &5Myth' + Prestige 2 rank 12 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 3 rank 0: '&aプレステージ 3 &8庶民' + Prestige 3 rank 0 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&e0' + Prestige 3 rank 1: '&aプレステージ 3 &f新人' + Prestige 3 rank 1 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠ' + Prestige 3 rank 2: '&aプレステージ 3 &f初心者' + Prestige 3 rank 2 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠ' + Prestige 3 rank 3: '&aプレステージ 3 &f見習い' + Prestige 3 rank 3 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 3 rank 4: '&aプレステージ 3 &2冒険者' + Prestige 3 rank 4 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅤ' + Prestige 3 rank 5: '&aプレステージ 3 &2上級者' + Prestige 3 rank 5 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤ' + Prestige 3 rank 6: '&aプレステージ 3 &2熟練者' + Prestige 3 rank 6 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠ' + Prestige 3 rank 7: '&aプレステージ 3 &1ベテラン' + Prestige 3 rank 7 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 3 rank 8: '&aプレステージ 3 &1エリート' + Prestige 3 rank 8 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 3 rank 9: '&aプレステージ 3 &5マスター' + Prestige 3 rank 9 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅩ' + Prestige 3 rank 10 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩ' + Prestige 3 rank 10: '&aプレステージ 3 &5ヒーロー' + Prestige 3 rank 11: '&aプレステージ 3 &5Legend' + Prestige 3 rank 11 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠ' + Prestige 3 rank 12: '&aプレステージ 3 &5Myth' + Prestige 3 rank 12 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 3 rank 13: '&aプレステージ 3 &5Immortal' + Prestige 3 rank 13 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 4 rank 0: '&3プレステージ 4 &8庶民' + Prestige 4 rank 0 short placeholder: '&3⚜ⅠⅤ&6&l✧&e0' + Prestige 4 rank 1: '&3プレステージ 4 &f新人' + Prestige 4 rank 1 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠ' + Prestige 4 rank 2: '&3プレステージ 4 &f初心者' + Prestige 4 rank 2 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅠ' + Prestige 4 rank 3: '&3プレステージ 4 &f見習い' + Prestige 4 rank 3 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅠⅠ' + Prestige 4 rank 4: '&3プレステージ 4 &2冒険者' + Prestige 4 rank 4 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅤ' + Prestige 4 rank 5: '&3プレステージ 4 &2上級者' + Prestige 4 rank 5 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤ' + Prestige 4 rank 6: '&3プレステージ 4 &2熟練者' + Prestige 4 rank 6 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠ' + Prestige 4 rank 7: '&3プレステージ 4 &1ベテラン' + Prestige 4 rank 7 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠⅠ' + Prestige 4 rank 8: '&3プレステージ 4 &1エリート' + Prestige 4 rank 8 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠⅠⅠ' + Prestige 4 rank 9: '&3プレステージ 4 &5マスター' + Prestige 4 rank 9 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅩ' + Prestige 4 rank 10 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩ' + Prestige 4 rank 10: '&3プレステージ 4 &5ヒーロー' + Prestige 4 rank 11: '&3プレステージ 4 &5Legend' + Prestige 4 rank 11 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠ' + Prestige 4 rank 12: '&3プレステージ 4 &5Myth' + Prestige 4 rank 12 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅠ' + Prestige 4 rank 13: '&3プレステージ 4 &5Immortal' + Prestige 4 rank 13 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅠⅠ' + Prestige 4 rank 14: '&3プレステージ 4 &5Chosen' + Prestige 4 rank 14 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅤ' + Prestige 5 rank 0: '&bプレステージ 5 &8庶民' + Prestige 5 rank 0 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 5 rank 1: '&bプレステージ 5 &f新人' + Prestige 5 rank 1 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠ' + Prestige 5 rank 2: '&bプレステージ 5 &f初心者' + Prestige 5 rank 2 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅠ' + Prestige 5 rank 3: '&bプレステージ 5 &f見習い' + Prestige 5 rank 3 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅠⅠ' + Prestige 5 rank 4: '&bプレステージ 5 &2冒険者' + Prestige 5 rank 4 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅤ' + Prestige 5 rank 5: '&bプレステージ 5 &2上級者' + Prestige 5 rank 5 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤ' + Prestige 5 rank 6: '&bプレステージ 5 &2熟練者' + Prestige 5 rank 6 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠ' + Prestige 5 rank 7: '&bプレステージ 5 &1ベテラン' + Prestige 5 rank 7 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠⅠ' + Prestige 5 rank 8: '&bプレステージ 5 &1エリート' + Prestige 5 rank 8 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠⅠⅠ' + Prestige 5 rank 9: '&bプレステージ 5 &5マスター' + Prestige 5 rank 9 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅩ' + Prestige 5 rank 10 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩ' + Prestige 5 rank 10: '&bプレステージ 5 &5ヒーロー' + Prestige 5 rank 11: '&bプレステージ 5 &5Legend' + Prestige 5 rank 11 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠ' + Prestige 5 rank 12: '&bプレステージ 5 &5Myth' + Prestige 5 rank 12 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅠ' + Prestige 5 rank 13: '&bプレステージ 5 &5Immortal' + Prestige 5 rank 13 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅠⅠ' + Prestige 5 rank 14: '&bプレステージ 5 &5Chosen' + Prestige 5 rank 14 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅤ' + Prestige 5 rank 15: '&bプレステージ 5 &5Ascendant' + Prestige 5 rank 15 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅤ' + Prestige 6 rank 0: '&4プレステージ 6 &8庶民' + Prestige 6 rank 0 short placeholder: '&4⚜ⅤⅠ&6&l✧&e0' + Prestige 6 rank 1: '&4プレステージ 6 &f新人' + Prestige 6 rank 1 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠ' + Prestige 6 rank 2: '&4プレステージ 6 &f初心者' + Prestige 6 rank 2 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅠ' + Prestige 6 rank 3: '&4プレステージ 6 &f見習い' + Prestige 6 rank 3 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅠⅠ' + Prestige 6 rank 4: '&4プレステージ 6 &2冒険者' + Prestige 6 rank 4 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅤ' + Prestige 6 rank 5: '&4プレステージ 6 &2上級者' + Prestige 6 rank 5 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤ' + Prestige 6 rank 6: '&4プレステージ 6 &2熟練者' + Prestige 6 rank 6 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠ' + Prestige 6 rank 7: '&4プレステージ 6 &1ベテラン' + Prestige 6 rank 7 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠⅠ' + Prestige 6 rank 8: '&4プレステージ 6 &1エリート' + Prestige 6 rank 8 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 6 rank 9: '&4プレステージ 6 &5マスター' + Prestige 6 rank 9 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅩ' + Prestige 6 rank 10 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩ' + Prestige 6 rank 10: '&4プレステージ 6 &5ヒーロー' + Prestige 6 rank 11: '&4プレステージ 6 &5Legend' + Prestige 6 rank 11 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠ' + Prestige 6 rank 12: '&4プレステージ 6 &5Myth' + Prestige 6 rank 12 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠ' + Prestige 6 rank 13: '&4プレステージ 6 &5Immortal' + Prestige 6 rank 13 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 6 rank 14: '&4プレステージ 6 &5Chosen' + Prestige 6 rank 14 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅤ' + Prestige 6 rank 15: '&4プレステージ 6 &5Ascendant' + Prestige 6 rank 15 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤ' + Prestige 6 rank 16: '&4プレステージ 6 &5Titan' + Prestige 6 rank 16 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤⅠ' + Prestige 7 rank 0: '&cプレステージ 7 &8庶民' + Prestige 7 rank 0 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&e0' + Prestige 7 rank 1: '&cプレステージ 7 &f新人' + Prestige 7 rank 1 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠ' + Prestige 7 rank 2: '&cプレステージ 7 &f初心者' + Prestige 7 rank 2 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅠ' + Prestige 7 rank 3: '&cプレステージ 7 &f見習い' + Prestige 7 rank 3 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 7 rank 4: '&cプレステージ 7 &2冒険者' + Prestige 7 rank 4 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅤ' + Prestige 7 rank 5: '&cプレステージ 7 &2上級者' + Prestige 7 rank 5 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤ' + Prestige 7 rank 6: '&cプレステージ 7 &2熟練者' + Prestige 7 rank 6 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠ' + Prestige 7 rank 7: '&cプレステージ 7 &1ベテラン' + Prestige 7 rank 7 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 7 rank 8: '&cプレステージ 7 &1エリート' + Prestige 7 rank 8 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 7 rank 9: '&cプレステージ 7 &5マスター' + Prestige 7 rank 9 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅩ' + Prestige 7 rank 10 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩ' + Prestige 7 rank 10: '&cプレステージ 7 &5ヒーロー' + Prestige 7 rank 11: '&cプレステージ 7 &5Legend' + Prestige 7 rank 11 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠ' + Prestige 7 rank 12: '&cプレステージ 7 &5Myth' + Prestige 7 rank 12 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 7 rank 13: '&cプレステージ 7 &5Immortal' + Prestige 7 rank 13 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 7 rank 14: '&cプレステージ 7 &5Chosen' + Prestige 7 rank 14 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅤ' + Prestige 7 rank 15: '&cプレステージ 7 &5Ascendant' + Prestige 7 rank 15 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤ' + Prestige 7 rank 16: '&cプレステージ 7 &5Titan' + Prestige 7 rank 16 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤⅠ' + Prestige 7 rank 17: '&cプレステージ 7 &5Demigod' + Prestige 7 rank 17 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤⅠⅠ' + Prestige 8 rank 0: '&9プレステージ 8 &8庶民' + Prestige 8 rank 0 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&e0' + Prestige 8 rank 1: '&9プレステージ 8 &f新人' + Prestige 8 rank 1 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠ' + Prestige 8 rank 2: '&9プレステージ 8 &f初心者' + Prestige 8 rank 2 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅠ' + Prestige 8 rank 3: '&9プレステージ 8 &f見習い' + Prestige 8 rank 3 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 8 rank 4: '&9プレステージ 8 &2冒険者' + Prestige 8 rank 4 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅤ' + Prestige 8 rank 5: '&9プレステージ 8 &2上級者' + Prestige 8 rank 5 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤ' + Prestige 8 rank 6: '&9プレステージ 8 &2熟練者' + Prestige 8 rank 6 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠ' + Prestige 8 rank 7: '&9プレステージ 8 &1ベテラン' + Prestige 8 rank 7 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 8 rank 8: '&9プレステージ 8 &1エリート' + Prestige 8 rank 8 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 8 rank 9: '&9プレステージ 8 &5マスター' + Prestige 8 rank 9 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅩ' + Prestige 8 rank 10 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩ' + Prestige 8 rank 10: '&9プレステージ 8 &5ヒーロー' + Prestige 8 rank 11: '&9プレステージ 8 &5Legend' + Prestige 8 rank 11 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠ' + Prestige 8 rank 12: '&9プレステージ 8 &5Myth' + Prestige 8 rank 12 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 8 rank 13: '&9プレステージ 8 &5Immortal' + Prestige 8 rank 13 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 8 rank 14: '&9プレステージ 8 &5Chosen' + Prestige 8 rank 14 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅤ' + Prestige 8 rank 15: '&9プレステージ 8 &5Ascendant' + Prestige 8 rank 15 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤ' + Prestige 8 rank 16: '&9プレステージ 8 &5Titan' + Prestige 8 rank 16 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠ' + Prestige 8 rank 17: '&9プレステージ 8 &5Demigod' + Prestige 8 rank 17 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠⅠ' + Prestige 8 rank 18: '&9プレステージ 8 &5Deity' + Prestige 8 rank 18 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 9 rank 0: '&dプレステージ 9 &8庶民' + Prestige 9 rank 0 short placeholder: '&d⚜ⅠⅩ&6&l✧&e0' + Prestige 9 rank 1: '&dプレステージ 9 &f新人' + Prestige 9 rank 1 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠ' + Prestige 9 rank 2: '&dプレステージ 9 &f初心者' + Prestige 9 rank 2 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅠ' + Prestige 9 rank 3: '&dプレステージ 9 &f見習い' + Prestige 9 rank 3 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅠⅠ' + Prestige 9 rank 4: '&dプレステージ 9 &2冒険者' + Prestige 9 rank 4 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅤ' + Prestige 9 rank 5: '&dプレステージ 9 &2上級者' + Prestige 9 rank 5 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤ' + Prestige 9 rank 6: '&dプレステージ 9 &2熟練者' + Prestige 9 rank 6 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠ' + Prestige 9 rank 7: '&dプレステージ 9 &1ベテラン' + Prestige 9 rank 7 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠⅠ' + Prestige 9 rank 8: '&dプレステージ 9 &1エリート' + Prestige 9 rank 8 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠⅠⅠ' + Prestige 9 rank 9: '&dプレステージ 9 &5マスター' + Prestige 9 rank 9 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅩ' + Prestige 9 rank 10 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩ' + Prestige 9 rank 10: '&dプレステージ 9 &5ヒーロー' + Prestige 9 rank 11: '&dプレステージ 9 &5Legend' + Prestige 9 rank 11 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠ' + Prestige 9 rank 12: '&dプレステージ 9 &5Myth' + Prestige 9 rank 12 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅠ' + Prestige 9 rank 13: '&dプレステージ 9 &5Immortal' + Prestige 9 rank 13 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅠⅠ' + Prestige 9 rank 14: '&dプレステージ 9 &5Chosen' + Prestige 9 rank 14 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅤ' + Prestige 9 rank 15: '&dプレステージ 9 &5Ascendant' + Prestige 9 rank 15 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤ' + Prestige 9 rank 16: '&dプレステージ 9 &5Titan' + Prestige 9 rank 16 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠ' + Prestige 9 rank 17: '&dプレステージ 9 &5Demigod' + Prestige 9 rank 17 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠⅠ' + Prestige 9 rank 18: '&dプレステージ 9 &5Deity' + Prestige 9 rank 18 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 9 rank 19: '&dプレステージ 9 &5Godhunter' + Prestige 9 rank 19 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅩ' + Prestige 10 rank 0: '&5プレステージ 10 &8庶民' + Prestige 10 rank 0 short placeholder: '&5⚜Ⅹ&6&l✧&e0' + Prestige 10 rank 1: '&5プレステージ 10 &f新人' + Prestige 10 rank 1 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠ' + Prestige 10 rank 2: '&5プレステージ 10 &f初心者' + Prestige 10 rank 2 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠ' + Prestige 10 rank 3: '&5プレステージ 10 &f見習い' + Prestige 10 rank 3 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠⅠ' + Prestige 10 rank 4: '&5プレステージ 10 &2冒険者' + Prestige 10 rank 4 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅤ' + Prestige 10 rank 5: '&5プレステージ 10 &2上級者' + Prestige 10 rank 5 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤ' + Prestige 10 rank 6: '&5プレステージ 10 &2熟練者' + Prestige 10 rank 6 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠ' + Prestige 10 rank 7: '&5プレステージ 10 &1ベテラン' + Prestige 10 rank 7 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠ' + Prestige 10 rank 8: '&5プレステージ 10 &1エリート' + Prestige 10 rank 8 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠⅠ' + Prestige 10 rank 9: '&5プレステージ 10 &5マスター' + Prestige 10 rank 9 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅩ' + Prestige 10 rank 10 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩ' + Prestige 10 rank 10: '&5プレステージ 10 &5ヒーロー' + Prestige 10 rank 11: '&5プレステージ 10 &5Legend' + Prestige 10 rank 11 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠ' + Prestige 10 rank 12: '&5プレステージ 10 &5Myth' + Prestige 10 rank 12 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅠ' + Prestige 10 rank 13: '&5プレステージ 10 &5Immortal' + Prestige 10 rank 13 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅠⅠ' + Prestige 10 rank 14: '&5プレステージ 10 &5Chosen' + Prestige 10 rank 14 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅤ' + Prestige 10 rank 15: '&5プレステージ 10 &5Ascendant' + Prestige 10 rank 15 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤ' + Prestige 10 rank 16: '&5プレステージ 10 &5Titan' + Prestige 10 rank 16 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠ' + Prestige 10 rank 17: '&5プレステージ 10 &5Demigod' + Prestige 10 rank 17 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠⅠ' + Prestige 10 rank 18: '&5プレステージ 10 &5Deity' + Prestige 10 rank 18 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 10 rank 19: '&5プレステージ 10 &5Godhunter' + Prestige 10 rank 19 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅩ' + Prestige 10 rank 20: '&5プレステージ 10 &5Godslayer' + Prestige 10 rank 20 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅩ' + lootLimiterMessage: '&7[EM] &cより良いアイテムを手に入れるためには、/agを通じて次のギルドランクをアンロックする必要があります。より良いアイテムを手に入れよう!' + prestigeUnlockMessageTitle: '$player' + prestigeUnlockMessageSubtitle: '&2has unlocked $tier&2!' +buy_or_sell_menu: + Shop name: '[EM] 購入または売却' +custom_quest_screen: + headerTextLines2: | + &a&l『&c&l$questName&a&l』 + acceptTextLines: '&a&l[Accept!]' + acceptHoverLines: "&aClick to \n&aaccept quest!" + acceptedTextLines: '&2&lAccepted! &aTurn in with $npcName &4[Abandon]' + acceptedHoverLines: '&aClick to abandon quest!' + trackTextLines: '&2&l[Track]' + trackHoverLines: '&aClick to track quest!' + untrackTextLines: '&4&l[Untrack]' + untrackHoverLines: '&cClick to untrack quest!' + completedTextLines: '&2&l[Turn in!]' + completedHoverLines: '&aClick to turn quest in!' + turnedInTextLines: '&8[Completed!]' + turnedInHoverLines: '&8Already turned in!' + objectivesLine: '&c&lObjectives:' + killQuestDefaultSummaryLine: '&c➤Kill $name:$color$current&0/$color$target' + fetchQuestDefaultSummaryLine: '&c➤Get $name:$color&$current&0/$color$target' + dialogQuestDefaultSummaryLine: '&c➤Go talk to $name $location' + rewardsLine: '&2&lRewards:' + rewardsDefaultSummaryLine: '&2➤$amountx $rewardName &8($chance%)' +custom_shop_menu: + Shop name: '[EM] Custom Shop' + Full inventory message: '[EliteMobs] &4インベントリがいっぱいです!空き領域を確保するまでアイテムを購入できません。' +dynamic_quest_screen: + questName: 討伐 $amount $name + headerTextLines2: |- + &c&lGuild request! + &0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ + defaultLoreTextLines: '&8Slay $amount $name!' + acceptTextLines: '&a&lAccept!' + acceptHoverLines: "&aClick to \n&aaccept quest!" + acceptedTextLines: '&2&lAccepted! &4[Abandon]' + acceptedHoverLines: '&aClick to abandon quest!' + completedTextLines: '&2&l[Turn in!]' + completedHoverLines: '&aClick to turn quest in!' + turnedInTextLines: '&8[Completed!]' + turnedInHoverLines: '&8Already turned in!' + objectivesLine: '&c&lObjectives:' + killQuestDefaultSummaryLine: '&c➤Kill $name:$color$current&0/$color$target' + rewardsLine: '&2&lRewards:' + rewardsDefaultSummaryLine: '&2➤$amountx $rewardName &8($chance%)' +enhancement_menu: + shopName: '[EM] Enhancement menu!' +get_loot_menu: + Menu name: '[EM] 戦利品メニュー' + tierTranslation: Level + itemFilterTranslation: Filter by items of this level. +guild_rank_selector_menu: + questTierSelectorMenuTitle: '[EM] ギルドランクの選択' + lowTierWarning: '&cエリート達はより良い戦利品をドロップできません!' + normalTierWarning: '&aエリートはより良い戦利品をドロップできます!' + notEnoughCurrencyMessages: '&7[EliteMobs] &4Elite Coinsが不足しています($neededAmount $currencyName)[/em shop] でElite Mobの戦利品を売ってください!あなたは $currentAmount $currencyName を持っています。' + unlockMessages: "&7[EliteMobs] &a$price $currencyNameで$rankNameランクをアンロックしました!\n&6良い狩りを!" + questCompleteBroadcastMessages: '&7[EliteMobs] &a$player &aが $rankName &aランクに達しました!' + failedMessages: '&7[EliteMobs] &c先に他のランクをアンロックする必要があります!' + spawnRateModifierMessages: '&fElite Mob のスポーン率の変更: &c$modifier%' + lootModifierMessages: '&fElite Mob の戦利品の変更: &a$modifier%' + difficultyModifierMessages: '&fElite Mob の難易度の変更: &c$modifier%' + lootTierMessages: '&2エリートはレベル $tier までの戦利品をドロップできます!' + currencyBonusMessages: '&a$amountx coins from drops and quests!' + healthBonusMessages: '&c最大体力を$amount ❤ 追加' + critBonusMessages: '&eクリティカル率を$amount%追加' + dodgeBonusMessages: '&8回避率を$amount%追加' +player_status_screen: + indexTexts0: '&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + indexTexts1: '&5&l/ag &7- &6アドベンチャーズハブ' + indexHovers1: |- + クリックで実行 + クエストを受注したりアイテムを + 売買したりアドバイスをしたりす + るNPCが居る場所です。 + indexTexts2: '&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + indexTexts4: '&6&lメニュー' + indexTexts6: '&bp. $statsPage &8- &6ステータス' + indexHovers6: クリックで飛ぶ! + indexTexts7: '&bp. $gearPage &8- &6装備' + indexHovers7: クリックで飛ぶ! + indexTexts8: '&bp. $teleportsPage &8- &6テレポート' + indexHovers8: クリックで飛ぶ! + indexTexts9: '&bp. $commandsPage &8- &6コマンド' + indexHovers9: クリックで飛ぶ! + indexTexts10: '&bp. $questsPage &8- &6クエスト' + indexHovers10: クリックで飛ぶ! + indexTexts11: '&bp. $bossTrackingPage &8- &6ボス追跡' + indexHovers11: クリックで飛ぶ! + statsText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + statsText1: '&5&lプレイヤーステータス:' + statsText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + statsText4: '&2お金: &a$money' + statsHover4: |- + Kill Elite Mobs to loot currency or + sell their drops in /em shop or + complete quests! + statsText6: '&6ギルドレベル: &3$guildtier' + statsHover6: |- + プレステージ層とギルドランク: + Gビルドランクは、戦利品の品質やプレステージ層のボーナスなどを決定します。プレステージ層では、最大ヘルスの増加、dodge/クリティカルのチャンス、通貨報酬の増加など、非常に強力な報酬がアンロックされます。ギルドランクとプレステージ層のロック解除は、/ag! + ⚜ = プレステージランク, ✧ = ギルドランク! + statsText7: '&4殺したエリート: &c$kills' + statsHover7: 殺されたエリートモブの数 + statsText8: '&4殺した最大レベル: &c$highestkill' + statsHover8: |- + 殺された最高のエリートモブのレベル。 + エリートモブのレベルは、装備のレベルに応じて + エリートモブのレベルは、あなたのギアの 装備のレベルが高いほど + エリートモブのレベルが高くなります。 + エクスポーション以外のキル数もカウントされます。 + statsText9: '&4殺された回数: &c$deaths' + statsHover9: エリートモブに殺された回数 + statsText10: '&5クリアしたクエスト: &d$quests' + statsHover10: |- + Amount of EliteMobs quests completed. + You can accept quests by talking to NPCs! + statsText12: '&bスコア: &3$score' + statsHover12: |- + EliteMobsのスコアです。上昇する + エリート・モブを殺すと上がり + エリートのモブを殺すと上がり、エリートに殺されると + エリートに死んでしまうと下がります。レベルの高い + エリートはより多くのスコアを与えます。 + gearText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + gearText1: '&7&l装備 と 武器:' + gearText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + gearText3: '&8&l装備 レベル:' + gearText4: ' ☠ - $helmettier' + gearHover4: '$helmet' + gearText5: ' ▼ - $chestplatetier' + gearHover5: '$chestplate' + gearText6: ' Π - $leggingstier' + gearHover6: '$leggings' + gearText7: ' ╯╰ - $bootstier' + gearHover7: '$boots' + gearText8: '{⚔ - $mainhandtier} {⛨ - $offhandtier}' + gearHover8: '{$mainhand}{$offhand}' + gearText10: '{攻撃力 : $damage} {防御力: $armor}' + gearHover10: '{エリートMobに与えるベースダメージ}{エリートMobからのダメージ軽減}' + gearText11: '脅威レベル: $threat' + gearHover11: | + エリートモブのレベルを決定します。 + アーマー、手持ちの武器、ギルドのレベルなどが考慮されます。 + ティアを考慮します。 + teleportText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + teleportText1: '&2&lテレポート' + teleportText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + teleportText3: ロビー + teleportHover3: ロビーにテレポート! + teleportText4: '&6&lアドベンチャーズハブ' + teleportHover4: アドベンチャーズハブにテレポート! + onTeleportsHover: クリックでテレポート! + commandsText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + commandsText1: '&3&lコマンド:' + commandsText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + commandsText4: '&5/ag' + commandsHover4: |- + クリックで実行 + クエストを受注したりアイテムを + 売買したりアドバイスをしたりす + るNPCが居る場所です。 + commandsText6: '&5/shareitem' + commandsHover6: |- + クリックで実行 + 持っているアイテムをチャットで + 共有しよう + questTrackerText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + questTrackerText1: '&6&lクエスト:' + questTrackerHover1: Talk to NPCs to accept quests! + questTrackerText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + onQuestTrackHover: クリックで受注解除! + bossTrackerText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + bossTrackerText1: '&4&lボス追跡:' + bossTrackerHover1: ボスに表示されます! + bossTrackerText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + onBossTrackHover: クリックで追跡の 有効化/無効化! + teleportChestMenuName: '&2EliteMobs Teleports' + bossTrackerChestMenuName: '&2EliteMobs Boss Tracking' + indexChestMenuName: '&2EliteMobs Index' + gearChestMenuName: '&2EliteMobs Gear' + statsChestMenuName: '&2EliteMobs Stats' + commandsChestMenuName: '&2EliteMobs Commands' +procedural_shop_menu: + Shop name: '[EM] アイテムショップ' + Full inventory message: '&7[EliteMobs] &4インベントリがいっぱいです。空き容量を確保するまでは買うことができません。' +quest_menu: + menuName: '[EM] クエストの選択' + cancelQuestMessage1: '&c&l&m&o---------------------------------------------&cYou can only have one quest at a time! Cancelling your ongoing quest will reset quest progress!' + cancelQuestMessage2: '&2[Click here to cancel current quest!]' + cancelQuestMessage3: '&7You can see your quest status with the command &a/em quest status&c&l&m&o---------------------------------------------' + questCancelMessage: '&7[EliteMobs] &cYour ongoing quest has been cancelled!' + questStartTitle: クエストを受諾しました! + questStartSubtitle: 討伐 $objectiveAmount $objectiveName + questCompleteTitle: クエスト完了! + questCompleteSubtitle: あなたが討伐したのは $objectiveAmount $objectiveName + bossBarObjective: 討伐 $objectiveAmount $objectiveName + questRewardMessage: '&7[EM] &aQuest 達成! &6報酬:&2$reward $currencyName' + questCompleteBroadcastMessage: '&7[EM] $player &2has 達成 a $rank &2quest!' + questStartBroadcastMessage: '&7[EM] $player &2has accepted a $rank &2quest!' + questStatusMessage: '&7[EM] &a達成度 &a$currentAmount &f/ &c$objectiveAmount &a$objectiveName' +refiner_menu: + shopName: '[EM] Place 10 scrap!' +repair_menu: + shopName: '[EM] Repair menu!' +scrapper_menu: + shopName: '[EM] Scrapper' +sell_menu: + shopName: '[EM] 売却ショップ' +smelt_menu: + shopName: '[EM] Place 25 scrap!' +unbind_menu: + shopName: '[EM] Unbind menu!' +taunt: + onDamaged: + - 痛っ! + - おい! + - やめなさい! + - なぜ? + - 酪農家のように戦います! + - あなたは背中の痛みです! + - ガーデ!触ってみろ! + - ハック! + - 私の体力が盗聴されて、殺せません! + - あなたのヒットは私を強くします! + - スティックと石... + - 'ただの傷だ' + - 皇帝を守る! + - ヒーローブリン、私を助けて! + - 後ろ!クリーパー! + - 私はひどい間違いをした。 + - 私を殺さないのは... + - 大きな怪我をしたゾンビ + - 私はあなたに私の本当の力を見せよう! + - 私の究極の攻撃に備えよ! + - 援軍が到着しました! + - あなたはそれを支払うつもりです! + - それはマークを残すだろう! + - 目には目を! + - 健康保険がそれを補うでしょう + - 骨に入っているものを感じました + - '《ただの傷》' + - それは何ですか?柔らかい風ですか? + - あなたは決して私をそんな風に倒すことはありません + - 情けない。 + - 弱い + - それは私の鎧さえも凹ませんでした! + - これは簡単なものになります + - 私の孫はそれを感じるでしょう + - あなたはまだ試していますか? + - 管理者は私を完全に回復しました。 + - ハッカー + - 私?破損してる?ハッキングだ! + - 私は倒されることはできません! + - 私はハックを使用している良いこと! + - 気をつけて!あなたの後ろにいるHerobrine! + - 私のAiurのための人生! + - あなたの家は悲しんでいます! + - なぜ友達になれないのか? + - ヴァルハラ! + - Notchは私を救う! + - 撤退はありません! + - 最高のショットで私を叩いてください! + onDamagedByBow: + - プレイヤーのように戦ってください! + - 近づいてくるのが怖いですか? + - ここからお前の恐怖の匂いがするぞ! + - 剣を忘れましたか。 + - 臆病者!弓は不公平だ! + - 弓? それはそう 2011... + - 弓は心の弱さのためのものです! + - 弓は霊の弱さのためのものです! + - 弓は心臓の弱さのためのものです! + - 私たちはない弓に同意したと思った! + - 弓?あなたはそれを後悔します + - 痛っ! + - おい! + - やめなさい! + - なぜ? + - 酪農家のように戦います! + - あなたは背中の痛みです! + - ガーデ!触ってみろ! + - ハック! + - 私の体力が盗聴されて、殺せません! + - あなたのヒットは私を強くします! + - スティックと石... + - 'ただの傷だ' + - 皇帝を守る! + - ヒーローブリン、私を助けて! + - 後ろ!クリーパー! + - 私はひどい間違いをした。 + - 私を殺さないのは... + - 大きな怪我をしたゾンビ + - 私はあなたに私の本当の力を見せよう! + - 私の究極の攻撃に備えよ! + - 援軍が到着しました! + - あなたはそれを支払うつもりです! + - それはマークを残すだろう! + - 目には目を! + - 健康保険がそれを補うでしょう + - 骨に入っているものを感じました + - '《ただの傷》' + - それは何ですか?柔らかい風ですか? + - あなたは決して私をそんな風に倒すことはありません + - 情けない。 + - 弱い + - それは私の鎧さえも凹ませんでした! + - これは簡単なものになります + - 私の孫はそれを感じるでしょう + - あなたはまだ試していますか? + - 管理者は私を完全に回復しました。 + - ハッカー + - 私?破損してる?ハッキングだ! + - 私は倒されることはできません! + - 私はハックを使用している良いこと! + - 気をつけて!あなたの後ろにいるHerobrine! + - 私のAiurのための人生! + - あなたの家は悲しんでいます! + - なぜ友達になれないのか? + - ヴァルハラ! + - Notchは私を救う! + - 撤退はありません! + - 最高のショットで私を叩いてください! + onDamage: + - 強力なヒット! + - 彼は撃つ、そして彼はスコア! + - あなたは朝にそれを感じるでしょう! + - 勝利が近づきます! + - 勝利は俺のものだ! + - それは私の力の半分だった! + - あなたは間違ったフードに来た! + - マフィアが間違っています! + - 暴徒を倒す準備をしよう! + - これはあなたの最後の間違いだった! + - 燃焼を感じる! + - ジョン・セナ + - まだどうやって立っているの? + - もう諦めてください! + - あきらめろ! + - 私は高い土地を持っています! + - 私はあなたを終わらせます! + - あなたは痛みのために準備されて来た希望! + - ハンターは狩りになる! + - 血の王位のための血! + - 頭蓋骨の玉座のための頭蓋骨! + - 良いプレーヤーは死んだプレーヤーです! + - 神に行く! + - 太陽を讃えよう! + - 終わりが近づいています! + - 準備ができていません。 + - 電車電車! + - 私の時間の価値はほとんどありません! + - 私はこれが挑戦だと思いましたか? + - 'プロのヒント:ヒットしない' + - でかい口のやつ + - 大帝のために! + - Herobrineを喜ばせてください! + - これがあなた方の終わりです! + - あなたはまだ試していますか? + - 弱い! + - 情けない。 + - たぶんこれはあなたを起こすでしょう。 + - これはまさに始まりです! + - まだ始まったばかりです! + - それはただのウォームアップだった! + - あなたは私にとってマッチしません! + - RKOはどこにもありません! + - 私は一晩中これをすることができます! + - 素敵なパンチバッグ! + - 私は夜です! + - 何が最初に壊れるのだろうか? + - スティーブのために復讐しよう!あなたはモンスターだ! + - Mob 側に参加しましょう! + - 簡単すぎる、簡単すぎる! + - 簡単すぎます! + - 私を倒すことはできません! + - ピカチュウウ + - アブラカタブラ! + - クルーシオ! + - ジエルダ! + - クリティカルヒット! + - これがスキルのように見えます! + - 9001ダメージ! + - まだ立っていますか? + - 敗北に向き合おう! + - 痛みの味が来て! + - 私はあなたを危険にさらします! + onDeath: + - ああ、かわいそうなヨリック! + - 残りは沈黙しています + - 私は戻ります + - 許されないこと + - 私は生き、私は死ぬ、私は再び生きる! + - 私から + - 私はヴァルハラに乗る! + - ヴァルハラ! + - ヴァルハラ!お届け! + - 今回は勝利です + - あなたの土地を汚す! + - あなたへのポックス! + - すぐに合流してくれるよ! + - まだ終わったと思うなよ! + - 死はただの挫折にすぎません + - このようにはなりません。 + - 宇宙に行きたかっただけ + - 友達になれたかもしれません + - あなたの罪は背中に這い上がっています + - お会いしましょう + - また会いましょう! + - お待ちしております + - 私は復讐されるでしょう! + - 私は優しく夜に入りません。 + - 肩の生命保険を得た + - それは私の仕事の最後の日でした + - ここでの最後の日でした + - どうだ ブルート? + - 成仏 + - x.x + - (x.x) + - xox + - 手に負えなかった + - グッドゲームウェルプレイド + - グッドゲーム + - ウェルプレイド + - グッドゲームはありません + - ハッキング + - ハッカー + - 私が遅れていたのは不公平ではありません + - 今回は勝利です + - あなたはモンスターです... + - 平凡... + onTarget: + - おい!こっちに来い! + - 私が見るものは何ですか?臆病者? + - 先生、拳銃を用意してください! + - これを洞窟のように解決しましょう! + - 構えよ! + - 気をつけろ!後ろにクリーパーがいるぞ! + - 正しい醜いマグカップではありません! + - おいしそうだね。 + - トラブルの準備をしてください! + - 最高のクリックスパマーの勝利をしましょう! + - スパルタアアアアア + - 私は実際にレベル9001です + - エリートモブではない + - エリートモブを変装させた + - 新鮮な獲物! + - ハンターは狩りになる! + - 殺害してサーバーをクラッシュさせる + - 私は実際に偽装プレーヤーです! + - 私は任意の戦利品をドロップしません! + - なぜ友達になれないのか? + - スッスッスッ + - これは私の仕事の最後の日です! + - そこに犯罪者のクズを止めなさい! + - 死ぬ準備をしなさい! + - 太陽を讃えよう! + - 神に行く + - アレアが自慢! + - 言葉ではなく行為! + - 頭蓋骨の玉座のための頭蓋骨! + - 血の王位のための血! + - ヒーローブリンのための犠牲! + - 私は天を突き刺します! + - 私を誰だと思ってるの? + - 弱ってる!彼は私のものだ。 + - 弱い上にダイブ! + - 来いプレーヤー! + - 死への決闘! + - 私は決闘に挑戦します! + - ピカピカ! + - 私を地獄と呼んでくれた? + - 私を何と呼んだのですか。 + - 私はあなたが何をしたか知っている! + - これがあなたの物語の終わり方です! + - トラブルの準備をしてください! + - 私はこのために準備してきました! + - 覚悟はできていますか? + - 立派な敵! + - 立派な相手! + - 新入りだ!今日はラッキーだよ! + - あなたのものまたはあなたの人生! + - これは強盗です! + - それはあなたです! あなたはモンスターです! + - お腹が空いてるから、お前の肉をくれ! + - 彼はそこにいる! + - 私の想像力であるべきだったのです + - はい私はミーシークス + - 私はミーシークスさんです、私を見てください! + - ダイヤモンドまたはあなたの人生! + - 王と国のために! + - 最高のショットで私を叩いてください! + - 目撃してください! + - 私の血の袋を目撃! + - 私はすべての光沢とクロムを行く! +zombie_friends: + friend1Name: 'BFF #1' + friend2Name: 'BFF #2' + friendDeathMessage: + - やめろ! + - 平凡! + - ザッカライアス! + - 前よりも死んでる! + - 復讐! + - 復讐! + - あなたがこんなことをしたなんて信じられない。 + originalEntityDialog: + - あとで遊ぼう!ゾンビクラフト + - 友情の力を感じろ! + - 団結した人々! + - 友達を呼んだ! + - BFFパワー! + - 1人はみんなのために! + - やっちまえ! + - お前らくそくらえ、俺は帰るぞ! + reinforcementDialog: + - 私たちの友人と混乱しないでください! + - あなたの背中Zachを手に入れました! + - バックアップが完了しました! + - 1人はみんなのためにみんなは1人のために! + - これは簡単になるでしょう! + - 諦めろ 俺たちは優位に立っている! + - 行きたいか? + - 世界の果てまで! + - 俺たちの友達に何をしているんだ + - 友情の力を感じろ! + - 友情パワー100%! + - ゾンビ、集合! + - 俺たちはお前の味方だ! + - みんなで力を合わせよう + - 多ければ多いほどいい! + - 俺に任せろ! + - みんなで1つになろう! +zombie_necronomicon: + summoningChant: "また、人間が地球上の支配者の中で最も古いものでも最後のものでもなく、生命と物質の共通の塊が単独で歩いているとは考えられません...。\n 人間は地球の支配者の中で最も古いか最後の者であり、生命と物質の共通の大部分は一人で歩いていると考えるべきではありません。旧人は 昔の人がいて、今の人がいて、これからの人がいます。我々が知っている空間ではなく\n 私たちが知っている空間ではなく、その間を、穏やかに、原始的に、次元を超えて、私たちには見えないように歩いているのです。 ヨグ=ソトースはその門を知っている。ヨグ=ソトースはその門を知っている。ヨグ=ソトースは鍵であり\n ゲートの守護者である。過去、現在、未来、すべてがYog-Sothの中で一つになっている。ヨグ=ソトースは 昔、古いものたちがどこを突破したか、またどこを突破しようとしているかを知っている。\n 彼らが地球の野原を踏んでいた場所、そして今も踏んでいる場所、そしてなぜ誰も彼らの姿を見ることができないのかを知っている。 なぜ誰も彼らが歩く姿を見ることができないのかを。人は時々その匂いで彼らを知るが\n しかし,その姿を知る者はなく,ただかれらが人類の上に生んだ者たちの特徴だけである。 彼らが人間の上に生んだものの特徴を除いては、その姿を知ることはできない。 人間の真のエイドロンから、彼らのような視覚も実体もない形まで、様々な種類がある。\n 彼らである。彼らは、言葉が語られ、儀式が行われた寂しい場所で、目に見えない汚いものとして歩きます。 言葉が語られ、その季節に儀式が行われた寂しい場所を、人知れず、汚く歩く。風は彼らの声で叫び\n 地球は彼らの意識でつぶやきます。彼らは森を曲げ、都市を潰す。 しかし、森も街も、叩く手を見ることはできない。寒き荒野のカダスは彼らを知っている。 廃棄物は彼らを知っており、Kadathを知っている人はいない?\n 南の氷の砂漠と 南の氷の砂漠や海の沈んだ島には、彼らの印章が刻まれた石があるが、誰が深氷の都市や封印されたものを見たのか。 しかし、誰が深々と凍った都市や、海藻やフジツボで長い間飾られた封印された塔を見ただろうか?\n 偉大なるクトゥルフは彼らの従兄弟であるが、彼は彼らをおぼろげにしか見ることができない。え! シュブ・ニグラート! 汝らは汚いものとして彼らを知るであろう。彼らの手はあなたの喉にあるが、あなたは彼らを見ない。\n 彼らの居住地は、あなたが守るべき敷居と同じである。ヨグ=ソトースは 球体が出会うための門の鍵である。かつて彼らが支配した場所を、今は人間が支配している。 彼らは、人間が今支配している場所をやがて支配するだろう。夏の後は冬、冬の後は夏。\n 彼らは忍耐強く力強く待っている、ここで彼らは再び支配するだろうから。" +zombie_parents: + deathMessage: + - あなたはモンスターです! + - 私の赤ちゃんが! + - 一体何をしたっていうんだ? + - 復讐! + - いやだ! + - 償ってもらうわよ! + - ええ、養子だよ + - 死んだんだ!またかよ! + - 前よりも死んでる! + - お前が壊したんだよ! + bossEntityDialog: + - 恥ずかしいよ! + - 私をいじめてる! + - 私をいじめているのは彼の方だ! + - 私は一人で対処できる! + - ほっといてくれ、俺が何とかする! + - 私につきまとうな! + - 恥ずかしいじゃないか! + - 昼食代を盗られた! + - 私をいじめてる! + zombieDad: + - 私の息子から離れろ! + - 自分で立ち上がれ息子! + - 俺が相手をする! + - 私の息子をいじめるな! + - なんでこんなことするの? + - お前の親と話してやる! + - 頑張れ息子よ! + - ボスの意地を見せてやれ! + - ナイスパンチ! + zombieMom: + - 私の子供から手を離せ! + - 怪我はないか? + - 彼に傷つけられたの? + - そのおっぱい見せてよ + - 彼の親と話してみる + - 上着を忘れてるわよ + - 姿勢を正せ + - 壊してやれ! + - やめなさい! + - ゴミを出したか? +elite_blaze: + name: '&fLvl &2$level &fエリート &eブレイズ' + deathMessages: + - '$player &cは $entity &cに燃やされた!' +elite_cave_spider: + name: '&fLvl &2$level &fエリート &3洞窟蜘蛛' + deathMessages: + - '$player &cは $entity &cの蜘蛛の巣に引っかかった!' +elite_creeper: + name: '&fLvl &2$level &fエリート &2クリーパー' + deathMessages: + - '$player &cは$entity &cに吹き飛ばされた!' + - '$entity &cが $player&cを発見!' +elite_drowned: + name: '&fLvl &2$level &fエリート &3ドラウンド' + deathMessages: + - '$player &cは $entity によって落とされた!' + - '$player &cは $entity &cによって溺死させられました!' +elite_elder_guardian: + name: '&fLvl &2$level &fエリート &3エルダーガーディアン' + deathMessages: + - '$entity &cは $player &cが深海を探索するのを防ぎました!' +elite_guardian: + name: '&fLvl &2$level &fエリート &3ガーディアン' + deathMessages: + - '$entity &cは $player &cが深海を探索するのを防ぎました!' +elite_enderman: + name: '&fLvl &2$level &fエリート &5エンダーマン' + deathMessages: + - '$entity &cが $player &cを虚空に飛ばしました!' + - '$player &cは間違えて $entity &cを見てしまいました!' + - '$player &cは $entity &cと親友になりました!' +elitemob_endermite: + name: '&fLvl &2$level &fエリート &5エンダーマイト' + deathMessages: + - '$entity &cと $player &cの関係はダビデとゴリアテのようなものです!' +elite_evoker: + name: '&fLvl &2$level &fエリート &5エヴォーカー' + deathMessages: + - '$player &cは $entity&cにエンチャントされました!' +elite_husk: + name: '&fLvl &2$level &fエリート &eハスク' + deathMessages: + - '$player &cは $entity&cによって中身を空洞にされました!' +elite_illusioner: + name: '&fLvl &2$level &fElite &8イリュージョナー' + deathMessages: + - '$player&cは $entity &cの幻想に落ちました!' +elite_iron_golem: + name: '&fLvl &2$level &fElite &fアイアンゴーレム' + deathMessages: + - '$player &cが間違って $entity&cに手を出した!' + - '$player &cは $entity &cによって拳法を教えられた!' +elite_phantom: + name: '&fLvl &2$level &fエリート &9ファントム' + deathMessages: + - '$player &cは $entity&cに悪夢を見せられた!' + - '$player &cは $entity&cについて悪夢を見ました!' + - '$entity &cが $player &cに睡眠の価値を教えました!' +elite_pillager: + name: '&fLvl &2$level &fエリート &8ピリジャー‌' + deathMessages: + - '$entity &cは$player &cを略奪した!' + - '$entity &cは$player &cを暴力によって略奪した!' +elite_polar_bear: + name: '&fLvl &2$level &fエリート &8シロクマ' + deathMessages: + - '$player &cは $entity&cによって引っ掻き回されて死んだ!' + - '$player &cは $entity&cによって襲われて死んだ!' +elite_ravager: + name: '&fLvl &2$level &fエリート &6ラヴェジャー' + deathMessages: + - '$entity &cはリーダーの力を $player &cに見せつけました!' +elite_silverfish: + name: '&fLvl &2$level &fエリート &7シルバーフィッシュ' + deathMessages: + - '$player &cは $entity &cを石ブロックと間違えました!' +elite_skeleton: + name: '&fLvl &2$level &fエリート &fスケルトン' + deathMessages: + - '$player &cは $entityの&cの針山になりました!' + - '$entity &cは $player &cの骨を欲しかった!' +elite_spider: + name: '&fLvl &2$level &fエリート &7クモ' + deathMessages: + - '$player &cは $entity &cの蜘蛛の巣に引っかかった!' + - '$entity &cは$player &cをむさぼり食った!' +elite_stray: + name: '&fLvl &2$level &fエリート &bストレイ' + deathMessages: + - '$player &cは $entity&cに惑わされた!' +elite_vex: + name: '&fLvl &2$level &fエリート &bヴェックス' + deathMessages: + - '$entity &cは $player&cを悩ませた!' +elite_vindicator: + name: '&fLvl &2$level &fエリート &8ヴィンディケーター' + deathMessages: + - '$entity &cは $player&cに戦闘スキルを見せつけました!' +elite_witch: + name: '&fLvl &2$level &fエリート &3ウィッチ' + deathMessages: + - '$player &cは $entityの被験者になりました!' + - '$player &cは $entity &cによって魅了させられました!' +elite_wither_skeleton: + name: '&fLvl &2$level &fエリート &fウィザースケルトン' + deathMessages: + - '$entity &cの矢は $player &cに枯らされた!' + - '$entity &cは$player &cを枯らした!' +elite_zombie: + name: '&fLvl &2$level &fエリート &2ゾンビ' + deathMessages: + - '$player &cは$entity &cをむさぼり食った!' + - '$entity &cが $player &cの脳みそを食べました!' +elite_ghast: + name: '&fLvl &2$level &fエリート &eガスト' + deathMessages: + - '$player &cは $entity&cのファイアボールを回避できませんでした!' + - '$player &cは $entity&cに吹き飛ばされました!' + - '$entity &cが $playerの&cベーコンを作りました!' +elite_wolf: + name: '[$level] エリート狼' + deathMessages: + - '$entity &cは $player &cを引き裂いた!' + - '$player &cは $entity &cに千切りにされた!' +elite_ender_dragon: + name: '&fLv.&2$level &fElite &5エンダードラゴン' + deathMessages: + - '$entity &cは $player&cを追い払った!' +elite_shulker: + name: '&fLvl &2$level &fElite &5Shulker' + deathMessages: + - '$entity &cshowed $player &cnew heights!' +super_chicken: + name: '&2スーパーニワトリ' +super_cow: + name: '&2スーパーウシ' +super_mushroom_cow: + name: '&2スーパームーシュルーム' +super_pig: + name: '&dスーパーブタ' +super_sheep: + name: スーパーヒツジ +elite_killer_bunny: + name: '&fLvl &2$level &fElite &cKiller Rabbit' + deathMessages: + - '$entity &cmade $player &cgo live in a farm upstate!' + - '$entity &ceducated $player using a stick and not a carrot!' +elite_llama: + name: '&fLvl &2$level &fElite &5Llama' + deathMessages: + - '$player &cwas spit on by $entity&c!' + - '$player &cwas made $entity&c angry!' +elite_warden: + name: '&fLvl &2$level &fElite &3Warden' + deathMessages: + - '$entity &csensed $player &cwas nearby!' +elite_goat: + name: '&fLvl &2$level &fElite &5Goat' + deathMessages: + - '$player &cwas rammed by $entity&c!' + - '$player &cwas run over by $entity&c!' + - '$player &cwas trampled by $entity&c!' + - '$player &cgot $entity&c horns!' +elite_zombified_piglin: + name: '&fLvl &2$level &fエリート &3ゾンビピグリン' + deathMessages: + - '$player &cは暴徒化した $entity &cに殺されました!' + - '$entity &cが $playerの&cベーコンを作りました!' +elite_zoglin: + name: '&fLvl &2$level &fエリート &dゾグリン' + deathMessages: + - '$player &cは $entity &cに混乱させられ角を付けました!' + - '$entity &cが $playerの&cベーコンを作りました!' +elite_piglin: + name: '&fLvl &2$level &fエリート &3ピグリン' + deathMessages: + - '$entity &cは$player &cの遺骨を良い値段で売ってくれます!' + - '$entity &cが $player &cに金の価値を教えました!' +elite_hoglin: + name: '&fLvl &2$level &fエリート &3ホグリン' + deathMessages: + - '$player &cは $entity &cに混乱させられ角を付けました!' + - '$entity &cが $playerの&cベーコンを作りました!' +elite_piglin_brute: + name: '&fLvl &2$level &fエリート &cピグリンブルート' + deathMessages: + - '$entity &cは$player &cをマリネにした!' + - '$entity &cは$player &cを残忍な姿にした!' +elite_bee: + name: '&fLvl &2$level &fエリート &eミツバチ' + deathMessages: + - '$player &cは $entity &cに刺された!' +MobCombatSettings: + bossLocationMessage: '&7[EM] &2[クリックで追跡!]' + bossKillParticipationMessage: '&eあなたが与えたダメージ: &2$playerDamage' + defaultOtherWorldBossLocationMessage: '$name: 違うワールド' + weakText: '&9&lWeak!' + resistText: '&c&lResist!' + fullHealMessage: '&2FULL HEAL!' +check_tier: + message1: '&7[EM] あなたの戦闘レベルは $tier です' + message2: '&7[EM] あなたのギルドレベルボーナスは $tier です' + message3: '&7[EM] &a脅威レベルは $tier です' +check_tier_others: + message1: '&7[EM] $player達の戦闘レベルは $tier です' + message2: '&7[EM] $player達のギルドレベルボーナスは $tier です' + message3: '&7[EM] $player達の脅威レベルの合計は $tier です' +ScrapItemSettings: + scrapItemName: '&2レベル $level のスクラップ' + scrapItemLore: + - '&a同じレベルのスクラップを 25 個集めてください' + - '&aでアイテムアップグレードオーブを作成します!' + - '&aスクラップを使用して修理することができます' + - '&aアイテムとより高いレベルのスクラップを作成!' + - 'アドベンチャーズハブにテレポート!' + upgradeItemName: '&2レベル $level のアップグレード オーブ' + upgradeItemLore: + - '&aEnhancer NPC を使用してアップグレードします' + - '&aレベル $orbLevel までのアイテム!' +Quests: + questJoinMessage: '&aYou have accepted the quest $questName &a!' + questLeaveMessage: '&cYou have abandoned the quest $questName &c!' + questCompleteMessage: '&2You completed the quest $questName &2!' + leaveWhenNoActiveQuestsExist: '&cYou don''t currently have an active quest!' + questLeaveConfirmationMessage: '&cAre you sure you want to abandon your current quest? Do &a/em confirm &c to confirm your choice!' + questStartTitle: '&aQuest Accepted!' + questCompleteTitle: '&2Quest Completed!' + questLeaveTitle: '&cQuest Abandoned!' + killQuestChatProgressionMessage: '&8[EliteMobs]&c➤Kill $name:$color$current&0/$color$target' + fetchQuestChatProgressionMessage: '&8[EliteMobs]&c➤Get $name:$color$current&0/$color$target' + dialogQuestChatProgressionMessage: '&8[EliteMobs]&c➤Talk to $name:$color$current&0/$color$target' + questCapMessage: '&8[EliteMobs] &cYou have reached the maximum amount of active quests (10)! &4Abandon or complete at least one active quest if you want to get more quests!' + killQuestScoreboardProgressionMessage: '&c➤Kill $name:$color$current&0/$color$target' + fetchQuestScoreboardProgressionMessage: '&c➤Get $name:$color$current&0/$color$target' + dialogQuestScoreboardProgressionMessage: '&c➤Talk to $name:$color$current&0/$color$target' + chatTrackMessage: '&8[EliteMobs]&2 Click here to track your quest!' + chatTrackHover: '&2Click to track!' + chatTrackingMessage: '&8[EliteMobs]&9 You are now tracking a quest!' + chatTrackingHover: '&2Click to untrack/track! /em -> Quests to track a different quest!' + noQuestDestinationFound: '[EM] No quest destination found!' + questDestinationInOtherWorld: '[EM] Go to world $world!' + questAlreadyCompletedMessage: '&8[EliteMobs] &cYou already completed this quest!' + questPrerequisitesMissingMessage: '&8[EliteMobs] &cCan''t accept this quest yet!' + lowRankDynamicQuestWarning: '&8[EliteMobs] &cYou can''t take these quests with your current guild rank! Increase your guild rank to accept these quests.' + questTurnInObjective: '&a2Talk to $npcName' +Wormholes: + dungeonNotInstalledMessage: '&8[EliteMobs] &cDungeon $dungeonID &cis not installed! This teleport will not work.' + defaultPortalMissingMessage: '&8[EliteMobs] &cThis portal doesn''t seem to lead anywhere!' +Arenas: + notEnoughPlayersMessage: '&8[EliteMobs] &cYou need at least $amount to start the match!' + startingMessage: '&2Starting!' + startingSubtitle: '&2in $count...' + arenaFullMessage: '&4[EliteMobs] &cArena is full! You can spectate instead while you wait for it to finish!' + arenasOngoingMessage: '&4[EliteMobs] &cCan''t join the arena now - a match is currently happening! You can spectate instead while you wait for it to finish!' + arenaStartHintMessage: '&2[EliteMobs] &aYou can start the arena by doing &2/em start' + arenaQuitHintMessage: '&4[EliteMobs] &cYou can leave the arena by doing &4/em quit' + arenaJoinPlayerMessage: "&2[EliteMobs] &aYou can start the arena by doing &2/em\\ \\ start &aif there are at least &2$count &aplayers in it! \nYou can leave the\\ \\ arena by doing &c/em quit" + arenaJoinSpectatorMessage: '&2[EliteMobs] &aYou can leave the arena at any time using &2/em quit' + waveTitle: '&aWave &2$wave' + victoryTitle: '&2Victory!' + victorySubtitle: '&aCompleted &2$wave &awaves!' + defeatTitle: '&4Defeat!' + defeatSubtitle: '&cReached wave &4$wave&c!' + victoryBroadcast: Arena $arenaName was conquered by $players! + joinPlayerTitle: '&aStart with &2/em start &a!' + joinPlayerSubtitle: '&cLeave with &4/em quit &c!' + joinSpectatorTitle: '&aNow spectating!' + joinSpectatorSubtitle: '&cLeave with &4/em quit &c!' +ancient_corpse_drop_axe: + name: '&eButchers Cleaver' + lore: + - '&aRetrived from the' + - '&aAncient Corpse''s skull...' +animated_armor_drop_axe: + name: '&8Enchanted Axe' + lore: + - '&8This axe was almost the' + - '&8end of you.' +animated_armor_drop_boots: + name: '&8Enchanted Boots' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +animated_armor_drop_chestplate: + name: '&8Enchanted Chestplate' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +animated_armor_drop_helmet: + name: '&8Enchanted Helmet' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +animated_armor_drop_leggings: + name: '&8Enchanted Leggings' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +arachnid_matriarch_drop_boots: + name: '&bSilk Striders' + lore: + - '&bMade out of rare spider silk.' +baba_rhoga_drop_chest: + name: '&aWitches Robes' + lore: + - '&aThe smell should go' + - '&aaway eventually.' +baba_yaga_drop_helmet: + name: '&aWitches Hat' + lore: + - '&aThe smell should go' + - '&aaway eventually.' +balloon_rider_drop_leggings: + name: '&dRoomy Leggings' + lore: + - '&dVery comfortable and spacious leggings.' +banshee_drop_charm: + name: '&8Manifested Sorrow' + lore: + - '&8May this hardened sorrow protect' + - '&8you from grief.' +beast_tamer_drop_axe: + name: '&eGreat Axe' + lore: + - '&eHeavy enough to cleave any beast in two.' +berserker_charm: + name: '&bバーサーカーチャーム' + lore: + - '&a圧倒的な逆境に直面して' + - '$a自分を見失ってしまうこと' + - '&aが多々あります...' +bigfoot_drop_chestplate: + name: '&eFur Armor' + lore: + - '&eNice and warm.' +big_bad_wolf_drop_chestplate: + name: '&aBig Bad Wolf Fur' + lore: + - '&aScary!' +bloated_jeffrey_drop_tear: + name: '&bSweet Tear' + lore: + - '&bYou made Jeffrey cry...' +bone_fiend_drop_leggings: + name: '&aBoney Leggings' + lore: + - '&aThe sharp bones attached to these' + - '&aleggings sure do rattle a lot.' +challengers_boots: + name: '&cChallenger''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_chestplate: + name: '&cChallenger''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_helmet: + name: '&cChallenger''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_leggings: + name: '&cChallenger''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_sword: + name: '&cChallenger''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +chameleon_charm: + name: '&bカメレオンチャーム' + lore: + - '&aカラフルなカメレオンは' + - '&aどこにでも溶け込むことができ' + - '&aゆっくりと忍び寄ることができます...' +changeling_drop_sword: + name: '&aCrystalline Sword' + lore: + - '&aThe blade shimmers as you gaze upon it.' +cheetah_charm: + name: '&bチーターチャーム' + lore: + - '&aチーターは時速120kmのスピードで' + - '&a約60秒間走り続けることができます' + - '&a計測してみて!' +circus_ringmaster_drop_charm: + name: '&dRingmasters Whip' + lore: + - '&dThis was used for terrible punishment.' +craftenmine_terror_drop_trident: + name: '&cGhast Lobotomizer' + lore: + - '&cPerfect for making sure that' + - '&cthe Ghasts stay grounded.' +creeperpede_drop_chestplate: + name: '&dExplosion Proof Vest' + lore: + - '&dMake ''BOOM!'' feel' + - '&dmore like ''boom''.' +crone_drop_axe: + name: '&fWitch Feller' + lore: + - '&fA fine axe that demands a fine hunt.' +depths_seeker: + name: '&2深さの探求者' + lore: + - '&9計り知れない深さから来て' + - '&9最も卑劣なモンスターから略奪された' + - '&9この釣り竿がどんな恐怖を見てきたかは' + - '&9分からない' +divine_cinder_drop_charm: + name: '&6Divine Fire' + lore: + - '&6Blessed be the fire!' +dwarven_greed: + name: '&4ドワーフの強欲' + lore: + - '&c貪欲に深みにはまりすぎた者は' + - '&c影と炎の古代の' + - '&cホラーを目覚めさせるかも' + - 'しれない' +elephant_charm: + name: '&bエレファントチャーム' + lore: + - '&a像の大移動は' + - '&aスピードを犠牲にして' + - 'パワーを得ています' +enders_drop_chestplate: + name: '&dEnder Shirt' + lore: + - '&dProtective and comfy!' +enders_drop_helmet: + name: '&dEnder Cap' + lore: + - '&dComfy but also quite sturdy.' +enders_drop_leggings: + name: '&dEnder Pants' + lore: + - '&dA bit too long but it will do.' +ender_lapin_drop_boots: + name: '&cDark Star Boots' + lore: + - '&cGives you the courage' + - '&cof running when in danger.' +endless_pursuer_drop_sword: + name: '&7Dark Blood Sword' + lore: + - '&7The sword seems to' + - '&7be weeping blood...' +enraged_snowman_drop_sword: + name: '&9Snowman''s Nose' + lore: + - '&9No wonder that the Snowman''s' + - '&9nose was so pointy...' +xmas_and_gold: + name: '&6and gold!' + lore: + - '&7Everyone wishes for silver' + - '&7and gold!' +xmas_and_goooooold: + name: '&6and goooooold!' + lore: + - '&7Everyone wishes for silver' + - '&7and gold!' +xmas_cornelius_pick: + name: '&bCornelius'' Pick' + lore: + - '&3If you throw it in the air' + - '&3and let it hit the ground,' + - '&3you may just find some' + - '&3peppermint!' +xmas_lost_present: + name: '&2Lost Present' + lore: + - '&2Turn this in for a reward!' +xmas_peppermint: + name: '&cPeppermint' + lore: + - '&fWhat I''ve been searching for all my life!' +xmas_siiiiilver: + name: '&7Siiiiilver' + lore: + - '&6Everyone wishes for silver' + - '&6and gold!' +xmas_silver: + name: '&7Silver' + lore: + - '&6Everyone wishes for silver' + - '&6and gold!' +xmas_substitute_elf_practice: + name: '&8Substitue Elf Practice' + lore: + - '&fThis doll needs its teeth fixed' +xmas_treat: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +xmas_treat_v2: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +evil_undead_drop_sword: + name: '&eTransient Blade' + lore: + - '&eIt will only serve' + - '&eyou for song long.' +fallen_knight_drop_boots: + name: '&e7Ancient Boots' + lore: + - '&7Even though the boots are old they' + - '&7still provide plenty of protection.' +fallen_knight_drop_chestplate: + name: '&e7Ancient Nether-Plate' + lore: + - '&7This armor might look plain to' + - '&7the untrained eye but is clear' + - '%7that anything wishing to penetrate' + - '&7it''s thick plate will need to be' + - '&7swung with considerable force.' +fallen_knight_drop_helmet: + name: '&e7Ancient Headgear' + lore: + - '&7Many swords have left their mark' + - '&7aon this helm but none have' + - '&7managed to break its defense.' +fallen_knight_drop_leggings: + name: '&e7Ancient Leggings' + lore: + - '&7You feel sorry for anyone that tries' + - '&7to strike these leggings.' +fine_swine_drop_sword: + name: '&6Fine Golden Sword' + lore: + - '&6A fine master-crafted golden sword.' + - '&6The molten gold flowing inside' + - '&6the sword makes sure that any damage' + - '&6to the blade is repaired swiftly.' +firefly_charm: + name: '&bホタルチャーム' + lore: + - '&a夜を照らす!' +firestarter_drop_helmet: + name: '&eFire Stopper' + lore: + - '&eOnly half the heat!' +fire_conjurer_drop_shield: + name: '&eFlame Touched Shield' + lore: + - '&eProtects against fire and flame.' +fishy_charm: + name: '&bフィッシュチャーム' + lore: + - '&aこの作品には' + - '$a何か違和感があります...' +fox_king_cold_drop_charm: + name: '&9Magical Snow' + lore: + - '&9You sense impossible energies' + - '&9coming from this snow.' +fulgora_drop_boots: + name: '&bMountain Boots' + lore: + - '&bShould be useful when' + - '&bexploring the mountains.' +goblin_ballista: + name: '&8Goblin Ballista' + lore: + - '&8A treasure among goblins!' +goblin_boots: + name: '&8Goblin Boots' + lore: + - '&8A treasure among goblins!' +goblin_chestplate: + name: '&8Goblin Chestplate' + lore: + - '&8A treasure among goblins!' +goblin_cleaver: + name: '&8Goblin Cleaver' + lore: + - '&8A treasure among goblins!' +goblin_helmet: + name: '&8Goblin Helmet' + lore: + - '&8A treasure among goblins!' +goblin_invasion_drop_chestplate: + name: '&aSmall Chestplate' + lore: + - '&aReally tight...' +goblin_invasion_drop_leggings: + name: '&aSmall Leggings' + lore: + - '&aWell, at least it really' + - '&ashows off your legs.' +goblin_leggings: + name: '&8Goblin Leggings' + lore: + - '&8A treasure among goblins!' +goblin_poker: + name: '&8Goblin Poker' + lore: + - '&8A treasure among goblins!' +goblin_shooter: + name: '&8Goblin Shooter' + lore: + - '&8A treasure among goblins!' +goblin_slasher: + name: '&8Goblin Slasher' + lore: + - '&8A treasure among goblins!' +grappling_arrow: + name: '&6Grappling Arrow' + lore: + - '&eFire at a TARGET BLOCK to grapple!' +greedy_dwarf_drop_pickaxe: + name: '&9Dwarven Need' + lore: + - '&cThose who delve too greedily' + - '&cand too deep may wake ancient' + - '&chorrors of shadow and flame' + - '&cbest left undisturbed.' +grunter_drop_axe: + name: '&cBig Oink' + lore: + - '&cThe axe has a tendency' + - '&cto squeal when swung.' +grunts_boots: + name: '&fGrunt''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_chestplate: + name: '&fGrunt''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_helmet: + name: '&fGrunt''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_leggings: + name: '&fGrunt''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_sword: + name: '&fGrunt''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +harmless_chicken_drop_boots: + name: '&aUseless Boots' + lore: + - '&aAt least they''re explosion proof...' +hog_rider_drop_boots: + name: '&a3.6 Radioactive Boots' + lore: + - '&aNot great, not terrible.' +horde_champion_drop_sword: + name: '&dHorde Eviscerator' + lore: + - '&dWhen you need to take' + - '&dcare of an undead horde.' +horrid_duplicator_drop_arrow: + name: '&aDuped Arrow' + lore: + - '&2Looks and feels' + - '&2like the real thing...' +horrid_duplicator_drop_bow: + name: '&4Fiery Bone Bow' + lore: + - '&4This bow is made out of' + - '&4a single large bone.' +invasion_alien_treat: + name: '&6Alien treats' + lore: + - '&6The taste is out of this planet!' +invasion_cheap_plasma_boots: + name: '&2Cheap Plasma Boots' + lore: + - '&aBlast off!' + - '&cNote: &8Double shift to activate!' +invasion_low_grade_tinfoil_bolt_caster: + name: '&7Low Grade Bolt Caster' + lore: + - '&7Get off my property!' +invasion_low_grade_tinfoil_boots: + name: '&7Low Grade Tinfoil Shoes' + lore: + - '&7Avoids floor radiation!' +invasion_low_grade_tinfoil_chestplate: + name: '&7Low Grade Tinfoil Chestpiece' + lore: + - '&7Prevents 6G from spying on your pacemaker!' +invasion_low_grade_tinfoil_hat: + name: '&7Low Grade Tinfoil Hat' + lore: + - '&7I want to believe!' +invasion_low_grade_tinfoil_leggings: + name: '&7Low Grade Tinfoil Pants' + lore: + - '&7Made for running from aliens!' +invasion_polished_plasma_boots: + name: '&2Polished Plasma Boots' + lore: + - '&aBlast off!' + - '&cNote: &8Double shift to activate!' +invasion_quality_bolt_caster: + name: '&7Quality Bolt Caster' + lore: + - '&7Get off my property!' +invasion_quality_tinfoil_boots: + name: '&7Low Grade Tinfoil Shoes' + lore: + - '&7Avoids floor radiation!' +invasion_quality_tinfoil_chestplate: + name: '&7Quality Tinfoil Chestpiece' + lore: + - '&7Prevents 6G from spying on your pacemaker!' +invasion_quality_tinfoil_hat: + name: '&7Quality Tinfoil Hat' + lore: + - '&7Stay out of my head!' +invasion_quality_tinfoil_leggings: + name: '&7Quality Tinfoil Pants' + lore: + - '&7Made for running from aliens!' +invictus_boots: + name: '&4Invictus Boots' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_chestplate: + name: '&4Invictus Chestplate' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_helmet: + name: '&4Invictus Helmet' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_leggings: + name: '&4Invictus Leggings' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_pickaxe: + name: '&4Invictus Pickaxe' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_shovel: + name: '&4Invictus Shovel' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_sword: + name: '&4Invictus Sword' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +krampus_drop_boots: + name: '&1Snow Boots' + lore: + - '&1Made out of actual snow.' +large_hopper_drop_axe: + name: '&aHeavy Axe' + lore: + - '&aPerfect for chopping off heads.' +living_shadow_drop_boots: + name: '&5Shadow Boots' + lore: + - '&5Falling doesn''t hurt as much.' +lucky_charms: + name: '&bラッキーチャーム' + lore: + - '&a朝食の一部!' + - '$c注:朝食には絶対に' + - '&c含まれません。' +magmaguys_toothpick: + name: '&4Magmaguy&2の爪楊枝' + lore: + - '&aほぼ新品です!' +merman_drop_trident: + name: '&1Merman Trident' + lore: + - '&1A Merman''s favorite weapon.' +meteor_shower_scroll: + name: '&7流星群の絵巻' + lore: + - '&4破壊を呼び起こす' + - '&4使い捨て' +monster_of_the_deep_drop_trident: + name: '&3Bone Trident' + lore: + - '&3Made out of the bones' + - '&3of the Monster of the Deep.' +moon_spider_drop_sword: + name: '&fSilk Spun Sword' + lore: + - '&fRazor sharp silk surrounds' + - '&fthe iron core of this blade.' + - '&fThe blade will serve you,' + - '&ffor now...' +necromancer_drop_helmet: + name: '&cDark Omen Helm' + lore: + - '&cThere is something off' + - '&cabout this helmet.' +netherite_golem_drop_helmet: + name: '&8Ancient Helmet' + lore: + - '&8You''re not sure if you' + - '&8should put this on your' + - '&8head or send it to a museum.' +nether_escapee_drop_charm: + name: '&6Fire Amulet' + lore: + - '&6May the flames not harm you.' +nether_hag_drop_sword: + name: '&7Bewitched Sword' + lore: + - '&7All kinds of curses and' + - '&7enchantments flow through' + - '&7this sword.' +nightwing_drop_crossbow: + name: '&aSky Watcher' + lore: + - '&aKeeping the skies safe.' +night_crawler_drop_shield: + name: '&8Night Shield' + lore: + - '&8Almost unbreakable.' +night_crawler_drop_sword: + name: '&8Night Blade' + lore: + - '&e8The only answer to the' + - '&8threats of the night.' +novices_boots: + name: '&8Novice''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_chestplate: + name: '&8Novice''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_helmet: + name: '&8Novice''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_leggings: + name: '&8Novice''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_sword: + name: '&8Novice''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +oasis_beacons_brigandine: + name: '&8Beacon''s Brigandine' + lore: + - '&fSolid steel can repel' + - '&fmost attacks.' +oasis_chief_cultists_bow: + name: '&5Chief Cultist''s Bow' + lore: + - '&dThe necrotic war bow' + - '&dof the cultist chief.' +oasis_earthquake_boots_10: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_20: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_30: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_40: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_50: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_10: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_20: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_30: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_40: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_50: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_10: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_20: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_30: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_40: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_50: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_10: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_20: + name: '&2地震レギンス' + lore: + - '&a地面とモブを叩きます!' + - '&c注意: &8ダブルシフトして有効化!' +oasis_earthquake_leggings_30: + name: '&2地震レギンス' + lore: + - '&a地面とモブを叩いてください!' + - '&c注意: &8ダブルシフトで有効化!' +oasis_earthquake_leggings_40: + name: '&2地震レギンス' + lore: + - '&a地面とモブを叩いてください!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_50: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_foundrys_flaming_hammer: + name: '&6Foundry''s Flaming Hammer' + lore: + - '&eThe Hammer of the foundry!' +oasis_foundrys_flux: + name: '&6Foundry''s Flux' + lore: + - '&eThe flux that''s infused in' + - '&eevery forged weapon!' +oasis_mask_of_the_warlock: + name: '&4Mask of the Warlock' + lore: + - '&7The stone is in his mask!' + - '&7The UV light will help him!' +oasis_monumental_lance: + name: '&3Monumental Lance' + lore: + - '&bSpearfishing is my hobby.' +oasis_oracles_shroud: + name: '&3Oracle''s Shroud' + lore: + - '&1Illusion is your weapon!' +oasis_page_of_darkness_I: + name: '&0Page of Darkness I' + lore: + - '&829 paces North' + - '&811 paces West' + - '&816 paces North' + - '&86 paces East' +oasis_page_of_darkness_II: + name: '&0Page of Darkness II' + lore: + - '&87 paces South' + - '&86 paces East' + - '&833 paces North' + - '&812 paces West' +oasis_page_of_darkness_III: + name: '&0Page of Darkness III' + lore: + - '&86 paces North' + - '&83 paces West' + - '&830 paces North' + - '&89 paces East' +oasis_page_of_darkness_index: + name: '&0Page of Darkness Index' + lore: + - '&8Tread carefully in darkness' + - '&8they know youve come.' + - '&8Be weary on the path ahead' + - '&8for balls of fire drum.' +oasis_page_of_darkness_IV: + name: '&0Page of Darkness IV' + lore: + - '&824 paces South' + - '&89 paces East' + - '&836 paces North' + - '&83 paces West' +oasis_page_of_darkness_V: + name: '&0Page of Darkness V' + lore: + - '&89 paces North' + - '&812 paces East' + - '&86 paces South' + - '&86 paces East' +oasis_page_of_darkness_VI: + name: '&0Page of Darkness VI' + lore: + - '&86 paces South' + - '&86 paces East' + - '&812 paces North' + - '&83 paces East' +oasis_page_of_darkness_VII: + name: '&0Page of Darkness VII' + lore: + - '&83 paces North' + - '&86 paces East' + - '&88 paces South' +oasis_page_of_darkness_VIII: + name: '&0Page of Darkness VIII' + lore: + - '&8Out of the shadow comes a light' + - '&8whose robes are dull gray, marred by fight.' + - '&8Of ice and snow, of fire and heat.' + - '&8Axes deflect, but swords defeat.' +oasis_page_of_libraris_I: + name: '&7Page of Libraris I' + lore: + - '&fUnder the bookshelf' + - '&fthat has no reflection' + - '&fwill appear unto you' + - '&fpassage and direction.' +oasis_page_of_libraris_II: + name: '&7Page of Libraris II' + lore: + - '&fThe bookshelf''s reflection' + - '&fholds more knowledge' + - '&f4 shelves more full of books' + - '&fthan its upward image!' +oasis_page_of_libraris_III: + name: '&7Page of Libraris III' + lore: + - '&fBearing slightly west' + - '&fof the bookshelf that holds the best.' + - '&fThe most knowledge does it keep.' + - '&fA favorite for those who reap.' +oasis_page_of_libraris_index: + name: '&7Page of Libraris Index' + lore: + - '&f5 papers to find,' + - '&f3 switches to flip,' + - '&fa door to be opened' + - '&fand in it shall ye slip.' +oasis_page_of_libraris_IV: + name: '&7Page of Libraris IV' + lore: + - '&fThe oracle of knowledge' + - '&fyeilds shocking surprise' + - '&ffrom depths of despair' + - '&fshall lightning bolts arise.' +oasis_page_of_libraris_V: + name: '&7Page of Libraris V' + lore: + - '&fHis last secret' + - '&fhe will try to hide' + - '&fthough use of shadow and puppets' + - '&fto strike you as you stride.' +oasis_page_of_plundering_I: + name: '&6Page of Plundering I' + lore: + - '&eHouses throughout the town' + - '&ehide their secrets up rather than down.' + - '&eGrapple or flight' + - '&ecan aid your plight.' +oasis_page_of_sentris: + name: '&1Page of Sentris' + lore: + - '&bA sentry''s armor is too tough' + - '&bwielding a sword, your fight will be rough.' +oasis_page_of_the_pharaoh_I: + name: '&0Page of the Pharaoh I' + lore: + - '&6A sacrifice on the altar' + - '&6must be made to pursue.' + - '&6But what shall ye offer?' + - '&red sandstone holds this clue.' +oasis_page_of_the_pharaoh_II: + name: '&0Page of the Pharaoh II' + lore: + - '&6The pharaohs halls are lined' + - '&6in the finest gold around.' + - '&6It shall be his undoing' + - '&6for from gold your damage shall abound.' +oasis_page_of_the_pharaoh_III: + name: '&0Page of the Pharaoh III' + lore: + - '&6The pharaohs walls are filled' + - '&6with perils and precious treasures.' + - '&6From the southwest corner of the room with blue windows' + - '&6streams very ominous pressures.' +oasis_page_of_the_pharaoh_index: + name: '&0Page of the Pharaoh Index' + lore: + - '&6The pharaoh is sealed' + - '&6within his tomb.' + - '&6He lies in wait, undisturbed;' + - '&6his traps will be your doom.' + - '&63 pages will help your adventure' + - '&6from being curbed.' +oasis_page_of_the_sewer_I: + name: '&0Page of the Sewer I' + lore: + - '&3There is a louse of unusual size.' + - '&3Its on the prowl, behold its prize.' + - '&3Plenty of treasure to be found' + - '&3all you have to do is swim around.' +oasis_page_of_the_sewer_II: + name: '&0Page of the Sewer II' + lore: + - '&3Activating the gates one by one' + - '&3will allow the water to flow.' + - '&3Swim up once it pours out' + - '&3then down the right tunnel you must go.' +oasis_page_of_the_sewer_index: + name: '&0Page of the Sewer Index' + lore: + - '&3Evil lurks where waters drain' + - '&3Be ever watchful, they''ll eat your brain!' + - '&3You must open 3 gates guarded by creatures' + - '&3lined with red sandstone features.' + - '&32 pages will guide you, do not strain.' +oasis_page_of_vampiris_I: + name: '&4Page of Vampiris I' + lore: + - '&cDozens of weapons have struck the beast' + - '&cand every blow it''s withstood.' + - '&cIt fears not the bite of stone, gold or diamonds in the least' + - '&cbut it trembles before wood.' +oasis_page_of_vampiris_II: + name: '&4Page of Vampiris II' + lore: + - '&cIf the warlock you seek to slight,' + - '&cbe prepared for a tough fight!' + - '&cThe second floor shall test your might,' + - '&cconquering it first is a rite.' +oasis_page_of_vampiris_III: + name: '&4Page of Vampiris III' + lore: + - '&cDown the spire and into the cave' + - '&cis the path of the brave.' + - '&cBeware of those returned from the grave,' + - '&cslay master for what you crave.' +oasis_page_of_vampiris_index: + name: '&4Page of Vampiris Index' + lore: + - '&cWithin the observatory' + - '&cthere lurks a creature' + - '&cwho has never seen the sun.' + - '&cFind 4 pages to help you' + - '&cescape alive!' +oasis_page_of_vampiris_IV: + name: '&4Page of Vampiris IV' + lore: + - '&cTwo chests of loot,' + - '&cDon''t wake the dead!' + - '&cOne under the stair,' + - '&cthe other where books can be read!' +oasis_pharaohs_feast: + name: '&6Pharaohs Feast' + lore: + - '&eA golden reminder' + - '&eof the once golden city' + - '&ecorrupted by the sands of time.' +oasis_pharaohs_flail: + name: '&0Pharaoh''s Flail' + lore: + - '&4The flail of the afterlife.' +oasis_pick_of_darkness: + name: '&1Pick of Darkness' + lore: + - '&bShining bright through' + - '&bthe shadows.' +oasis_sunkiller: + name: '&6Sunkiller' + lore: + - '&eIsnt that rock over there' + - '&ejust big enough for someone' + - '&eto hide behind?' +oasis_tohth: + name: '&8Oingo Boingo Brothers Adventure' + lore: + - '&fMy preminitions are absolute!' + - '&fIt is fate!' +okami_drop_leggings: + name: '&cOkami''s Blessing' + lore: + - '&cSpeed of the wolf.' + - '&cFire protection of a god.' +owl_charm: + name: '&bフクロウチャーム' + lore: + - '&a究極の夜行性の' + - '&a捕食者になる!' +primis_artifexs_shield: + name: '&6Artifex''s Shield' + lore: + - '&eAn old relic from a more' + - '&edangerous time. It has been' + - '&erestored to its glory!' +primis_caeruleaums_hope: + name: '&9Caeruleaum''s Hope' + lore: + - '&8A relic of a bygone era, still sharp' + - '&8enough to hurt but rusty enough to' + - '&8belong in a museum!' +primis_catacomb_drop_boots: + name: '&7Dark Bone Footgear' + lore: + - '&7Unnaturally dark bones' + - '&7cover these boots.' +primis_catacomb_drop_boots_2: + name: '&7Dark Bone Footgear' + lore: + - '&7Unnaturally dark bones' + - '&7cover these boots.' +primis_catacomb_drop_chestplate: + name: '&7Dark Bone Armor' + lore: + - '&7Bones as dark as the abyss' + - '&7adorn this armor.' + - '&7The arrows will make quite a' + - '&7noise as they bounce off the bones.' +primis_catacomb_drop_chestplate_2: + name: '&7Dark Bone Armor' + lore: + - '&7Bones as dark as the abyss' + - '&7adorn this armor.' + - '&7The arrows will make quite a' + - '&7noise as they bounce off the bones.' +primis_catacomb_drop_leggings: + name: '&7Dark Bone Leggings' + lore: + - '&7The dark bones covering the' + - '&7leggings will make dangerous' + - '&7falls more survivable.' +primis_catacomb_drop_leggings_2: + name: '&7Dark Bone Leggings' + lore: + - '&7The dark bones covering the' + - '&7leggings will make dangerous' + - '&7falls more survivable.' +primis_catacomb_necromancer_drop_helmet: + name: '&5Dark Bone Cowl' + lore: + - '&5The cowl offers little protection,' + - '&5it only seeks blood and death.' +primis_catacomb_necromancer_drop_helmet_2: + name: '&5Dark Bone Cowl' + lore: + - '&5The cowl offers little protection,' + - '&5it only seeks blood and death.' +primis_catacomb_necromancer_drop_sword: + name: '&5Dark Bone Brand' + lore: + - '&5The unnaturally dark bone-brand' + - '&5glistens in the light' + - '&5ready to part anything' + - '&5that stands in it''s way.' +primis_catacomb_necromancer_drop_sword_2: + name: '&5Dark Bone Brand' + lore: + - '&5The dark bone-brand howls' + - '&5viciously with every swing' + - '&5as the air rushes through' + - '&5it''s hollow cavity.' +primis_cooked_rabbit: + name: '&cCooked Rabbit' + lore: + - Huh, did this rabbit overheat? +primis_diving_helmet: + name: '&1Diving Helmet' + lore: + - An old Diving Helmet. + - Still works just fine. +primis_fish_bait: + name: '&2Fish Bait' + lore: + - '&aLooks like you could reel big fish with these.' +primis_gladius_important_documents: + name: '&2Important Documents' + lore: + - '&aThe documents are sealed.' +primis_gladius_lord_promise: + name: '&5Assistance Agreement' + lore: + - '... hence, for the help lended during these most trying' + - times, Pontis Mille promises to return in kind at Gladius' + - darkest hour. +primis_gladius_supplies: + name: '&2Supplies' + lore: + - '&aFit to keep a soldier fed during a war.' +primis_gladius_sword: + name: '&5Gladius' + lore: + - '&8The very symbol of the Gladius Fortress.' +primis_gladius_the_good_stuff: + name: '&2The Good Stuff' + lore: + - '&aSmells... strong.' +primis_heirloom: + name: '&2Lost Heirloom' + lore: + - '&aSeems old, ancient even.' +primis_ice_village_alanus_dagger: + name: '&eAlanus'' Dagger' + lore: + - '&eA simple dagger with' + - '&erunes covering the handle.' +primis_ice_village_chains_shipment: + name: '&aShipment of Chains' + lore: + - '&aA lot of chains.' +primis_ice_village_escaped_prisoner_body: + name: '&cUnconcious Body' + lore: + - '&cHeavy.' +primis_ice_village_foot_of_mountain_chest_axe: + name: '&1Dull Frost Axe' + lore: + - '&1Freezing to the touch' +primis_ice_village_island_chest_trident: + name: '&3Magma''s Delight' + lore: + - '&3Those who look, shall find.' +primis_ice_village_living_nightmares_reward_chest: + name: '&3Fur Coat' + lore: + - '&3Made out of the' + - '&3toughest fur around.' +primis_ice_village_magical_ice_crystals: + name: '&1Fur Ice Crystal' + lore: + - Having the crystal near + - snow makes it react. +primis_ice_village_make_them_go_ouch_reward_leggings: + name: '&dViolet''s Spare Leggings' + lore: + - '&dMakes you wanna strut down the' + - '&droad and do some punishment.' +primis_ice_village_salmon: + name: '&2Fresh Salmon' + lore: + - You don't think you saw + - larger salmon in your life. +primis_ice_village_silence_reward_helmet: + name: '&aBoomers Helm' + lore: + - '&aShould handle an explosion or two.' +primis_ice_village_taking_the_bait_reward: + name: '&bNorthern Rod' + lore: + - '&bIt''s a well made fishing rod.' +primis_ice_village_violet_boots: + name: '&dViolet''s Leather Boots' + lore: + - '&dFancy leather boots with' + - '&da raised pointy heel.' +primis_ice_village_violet_leggings: + name: '&dViolet''s Fancy Leggings' + lore: + - '&dTight and slightly see-through' + - '&dwith beautiful flower motives.' +primis_ice_village_violet_whip: + name: '&dViolet''s Whip' + lore: + - '&dDelivers exquisite punishment.' +primis_ice_village_wanna_build_a_snowman_reward_boots: + name: '&3Frost Boots' + lore: + - '&3It''s just frost boots.' +primis_invaders_assassins_bow: + name: '&8Assassin''s Bow' + lore: + - '&aThe perfect way to give them' + - '&aa taste of their own medicine.' +primis_invaders_boots: + name: '&4Invader''s boots' + lore: + - '&aThese don''t smell so good.' +primis_invaders_bow: + name: '&8Invader''s Bow' + lore: + - '&aOnce blotted out the Sun.' +primis_invaders_captains_sword: + name: '&4Invader''s Captain Sword' + lore: + - '&aCurved and mean-looking.' +primis_invaders_chestplate: + name: '&4Invader''s chestplate' + lore: + - '&aRusty, ugly and smelly. Lovely!' +primis_invaders_helmet: + name: '&4Invader''s helmet' + lore: + - '&aBeats a concussion!' +primis_invaders_leggings: + name: '&4Invader''s leggings' + lore: + - '&aCould use some oil.' +primis_invaders_sword: + name: '&4Invader''s sword' + lore: + - '&aSuspiciously bloodstained.' +primis_lucky_pickaxe: + name: '&6Lucky Lickaxe' + lore: + - '&eShines bright, even underground.' + - '&eYou see LL engraved in the handle' +primis_monster_slaying_spear: + name: '&8Monster Slaying Spear' + lore: + - Turns Sea Monsters into barbecue. +primis_ogre_boots: + name: '&cOgre''s boots' + lore: + - '&7They''ll keep you nice' + - '&7and toasty.' +primis_ogre_chestplate: + name: '&cOgre''s chestplate' + lore: + - '&7Hot to the touch' +primis_ogre_helmet: + name: '&cOgre''s helmet' + lore: + - '&7You''ll be sweating bullets.' +primis_ogre_leggings: + name: '&cOgre''s leggings' + lore: + - '&7Smoldering slacks.' +primis_ogre_mines_lucky_pickaxe: + name: '&eLucky Pickaxe' + lore: + - '&aLucky, but useless.' +primis_ogre_mines_waterworks_chest_shield: + name: '&aSturdy Door' + lore: + - '&aIt''s just a door.' +primis_old_shield: + name: '&8Old Shield' + lore: + - '&7An old relic from a more' + - '&7dangerous time. It might be' + - '&7able to be mended, though...' +primis_pirate_boots: + name: '&4Pirate''s boots' + lore: + - '&aThese have a few too many' + - '&aholes to be useful.' +primis_pirate_bow: + name: '&8Pirate''s Bow' + lore: + - '&aNot quite a flintlock,' + - '&abut it will do!' +primis_pirate_chestplate: + name: '&4Pirate''s Chestplate' + lore: + - '&aBasically a t-shirt.' +primis_pirate_helmet: + name: '&4Pirate''s Helmet' + lore: + - '&aMissing an eye-patch.' +primis_pirate_leggings: + name: '&4Pirate''s leggings' + lore: + - '&aFeels like sea legs!' +primis_pirate_sword: + name: '&4Pirate''s sword' + lore: + - '&aCurved and mean-looking.' +primis_pointis_groves_heirloom: + name: '&2Valuable Heirloom' + lore: + - '&aThis is the second one of these that you retrieved.' +primis_pointis_mille_chest_dirty_note: + name: Dirty Note + lore: + - '&fThere was a really cool sword' + - '&fin here but it''s gone now.' +primis_pontis_beast_horn: + name: '&2Blood Drenched Horn' + lore: + - '&fOn closer inspection the horn isn''t' + - '&fcovered in blood but seems to' + - '&fbe made out of it.' + - '&fThe crystallized blood is incredibly sharp.' +primis_pontis_beast_scale: + name: '&2Toxic Fish Scale' + lore: + - '&fThe scale is rock hard on the outside.' + - '&fThe inside is covered in' + - '&ftoxic and acidic ooze.' +primis_pontis_beast_silk: + name: '&2Sun Soaked Silk' + lore: + - '&fThe silk is radiating light and warmth.' +primis_pontis_elf_drop_boots: + name: '&7Elf Boots' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_elf_drop_chestplate: + name: '&7Elf Chest-plate' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_elf_drop_crossbow: + name: '&7Elf Dark-bow' + lore: + - '&7The special projectiles that the bow' + - '&7uses are both sharp and blunt.' +primis_pontis_elf_drop_helmet: + name: '&7Elf Helmet' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_elf_drop_leggings: + name: '&7Elf Leggings' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_fields_berry_charm: + name: '&dLarge Berry' + lore: + - '&dThe fresh odor this berry emits' + - '&dcan be smelled from miles away.' + - '&dThe odor seems to have a calming' + - '&deffect on monsters and beasts.' + - '&dIt makes their attacks less vicious.' +primis_pontis_groves_brood_moher_drop_charm: + name: '&aCrawlers Torment' + lore: + - '&aThe silk radiates strong energy.' +primis_pontis_groves_nest_crawler_drop_shield: + name: '&7Magma''s Lure' + lore: + - '&7When the shield is held up' + - '&7it lures monsters into striking it.' +primis_pontis_groves_spider_boots_reward: + name: '&1Spider-legs Boots' + lore: + - '&1Boots made from spider legs and leather.' +primis_pontis_groves_tree_climbing_elf_bandits_reward_leggings: + name: '&aElf Pearl Leggings' + lore: + - '&aProtective leggings' + - '&aadorned with pearls.' +primis_pontis_mille_arena_knowledge: + name: '&2Knowledge' + lore: + - '&aImportant Knowledge.' +primis_pontis_mille_arena_reward_1: + name: '&4Star Touched Shield' + lore: + - '&7An ornate shield with a cosmos motive.' +primis_pontis_mille_arena_reward_2: + name: '&4Star Touched Chestplate' + lore: + - '&7A thousand tiny spiky stars stretch across the Chestplate.' +primis_pontis_mille_arena_reward_3: + name: '&4Star Touched Leggings' + lore: + - '&7The leggings sparkle like the stars in the sky.' +primis_pontis_mille_cat_quest_reward_charm: + name: '&9Cat''s Blessing' + lore: + - '&9If you hold it up all the' + - '&9way to your ear you can' + - '&9hear a slight purr.' +primis_pontis_mille_counselor_sword: + name: '&eStone of Far-speech' + lore: + - '&aYou can sense a presence coming from the stone.' +primis_pontis_mille_fields_beasts_reward_chest: + name: '&eHunters Pride' + lore: + - '&eThose who hunt cannot be the prey.' +primis_pontis_mille_fields_contest_berry: + name: '&dContest Berry' + lore: + - '&dA beautiful and very large berry.' + - '&dTruly a one in a million specimen.' +primis_pontis_mille_fields_do_it_yourself_reward_bow: + name: '&cHunters Bow' + lore: + - '&cA finely crafted bow.' + - '&cArrows fired from this' + - '&cbow will hurt any beast.' +primis_pontis_mille_fields_first_aid: + name: '&2First Aid Equipment' + lore: + - '&fEverything one would need" - "&fto treat serious injuries.' +primis_pontis_mille_fields_rat_drop_helmet: + name: '&fFeathered Rat Cap' + lore: + - '&fYou managed to make a' + - '&fcap out of your prey.' + - '&fHaving extracted the preys' + - '&fblinding properties, you have made' + - '&fit work in your favor.' +primis_pontis_mille_fields_rat_meat: + name: '&cRat Meat' + lore: + - Raw rat meat. No need to cook. +primis_pontis_mille_fields_stolen_berries: + name: '&4Stolen Berries' + lore: + - '&fIt''s the stolen berries' +primis_pontis_mille_fish_nets: + name: '&2Fish Nets' + lore: + - '&aCatching fish made easy!' +primis_pontis_mille_fresh_rat: + name: '&fFresh Rat' + lore: + - The cat will love this. +primis_pontis_mille_mines_goblined_up_in_the_maze_reward_axe: + name: '&aRuned Goblin Axe' + lore: + - '&aThere are runes etched into the axe handle.' + - '&aThey are quite faded by now.' + - '&aSeems like this axe was cursed at one point...' +primis_pontis_mille_mines_goblin_head: + name: '&2Fowl Goblin Feathers' + lore: + - '&aSo soft and prickly.' +primis_pontis_mille_parkour_reward_boots: + name: '&4Diamond Tree Boots' + lore: + - '&7Boots made out of special soft bark.' + - '&7Decorated with gems.' +primis_pontis_mille_reward_boots: + name: '&4Pontis Mille Boots' + lore: + - '&7Traditional Pontis Mille Boots' +primis_pontis_mille_reward_chest: + name: '&4Pontis Mille Chestplate' + lore: + - '&7A traditional Pontis Mille Chestplate' +primis_pontis_mille_reward_helmet: + name: '&4Pontis Mille Helm' + lore: + - '&7A traditional Pontis Mille Helm' +primis_pontis_mille_reward_leggings: + name: '&4Pontis Mille Leggings' + lore: + - '&7Traditional Pontis Mille Leggings' +primis_pontis_mille_reward_shield: + name: '&4Pontis Mille Shield' + lore: + - '&7A traditional Pontis Mille Shield' +primis_pontis_mille_reward_sword: + name: '&4Pontis Mille Katana' + lore: + - '&7Incredibly sharp' +primis_pontis_mille_serious_sewage_reward_helmet: + name: '&2Turtle Shell Helm' + lore: + - '&2Makes you wanna eat some pizza.' +primis_pontis_mille_sewage_keys: + name: '&2Sewage Keys' + lore: + - '&aA key ring with a lot of keys on it.' +primis_pontis_mille_sewers_ninja_drop_chestplate: + name: '&7Ninja Garb Chest-plate' + lore: + - Now you too are a Ninja +primis_pontis_mille_sewers_ninja_drop_leggings: + name: '&7Ninja Garb Leggings' + lore: + - Now you too are a Ninja +primis_pontis_mille_sewers_shredder_drop: + name: '&4Shredding Helmet' + lore: + - Full of small tiny razor blade + - like points on the exterior. +primis_pontis_mille_slums_chest_sword: + name: '&4Dull Pontis Mille Katana' + lore: + - '&7Incredibly sharp' +primis_pontis_mille_to_lycan_or_not_to_lycan_reward: + name: '&aFur Leggings' + lore: + - '&aTough and light' + - '&aMade out of fur and hide.' +primis_pontis_mines_goblin_drop_boots: + name: '&7Goblin Boots' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_chestplate: + name: '&7Goblin Chest-Plate' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_helmet: + name: '&7Goblin Helmet' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_leggings: + name: '&7Goblin Leggings' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_spear: + name: '&7Goblin Spear' + lore: + - '&7A nice and sharp stone at the end.' +primis_pontis_mines_goblin_drop_sword: + name: '&7Goblin Sword' + lore: + - '&7It''''s just a stone club with a handle.' +primis_pontis_redwoods_nasty_little_bandits_reward_boots: + name: '&2Forest Boots' + lore: + - '&2The boots seem to be made' + - '&2out of soft bark, leaves' + - '&2and crystallized tree sap.' +primis_pontis_redwoods_spider_legs: + name: '&2Spider Legs' + lore: + - '&aIt is just spider legs...' +primis_pontis_redwoods_tobacco: + name: '&2Premium Tobacco' + lore: + - '&aSmells amazing...' +primis_pontis_redwoods_watch: + name: '&2Sturdy Pocket Watch' + lore: + - '&aSuprisingly light and sturdy.' +primis_pontis_redwoods_werewolf_drop_chestplate: + name: '&7Fur Chest-Plate' + lore: + - '&7Made out of tough fur and hide.' + - '&7Light, but very tough.' +primis_roughspun_boots: + name: '&5Roughspun Boots' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_roughspun_chestplate: + name: '&5Roughspun Chestplate' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_roughspun_helmet: + name: '&5Roughspun Helmet' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_roughspun_leggings: + name: '&5Roughspun Leggings' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_ruins_bow: + name: '&8Ruined Bow' + lore: + - An old bow. Might've been good at some point. +primis_ruins_diary_entry: + name: Diary page + lore: + - '... I now regret chasing after the treasure in these ruins.' + - Now that I have fallen and broken my legs, it would seem + - as though I am fated to die under the treasure I sought. + - If only I had paid more attention during parkour class! +primis_ruin_relic_boots: + name: '&bRuin Relic Boots' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_ruin_relic_chestplate: + name: '&bRuin Relic Chestplate' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_ruin_relic_helmet: + name: '&bRuin Relic Helmet' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_ruin_relic_leggings: + name: '&bRuin Relic Leggings' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_rusty_mail_boots: + name: '&3Rusty Mail Boots' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_rusty_mail_chestplate: + name: '&3Rusty Mail Chestplate' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_rusty_mail_helmet: + name: '&3Rough Mail Helmet' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_rusty_mail_leggings: + name: '&3Rough Mail Leggings' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_starter_boots: + name: '&4Shipwreck''s Boots' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_chestplate: + name: '&4Shipwreck''s Chestplate' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_helmet: + name: '&4Shipwreck''s Helmet' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_leggings: + name: '&4Shipwreck''s Leggings' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_sword: + name: '&4Shipwreck''s Sword' + lore: + - '&aPossibly improvised from the beached remains of a ship!' +primis_storm_temple_drop_axe: + name: '&bStorm Axe' + lore: + - '&bThe wind shall repel them.' +primis_storm_temple_drop_boots: + name: '&bStorm Boots' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_storm_temple_drop_charm: + name: '&bStorm Necklace' + lore: + - '&bThe power of the storm.' +primis_storm_temple_drop_chestplate: + name: '&bStorm Chest-plate' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_storm_temple_drop_helmet: + name: '&bStorm Helmet' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_storm_temple_drop_leggings: + name: '&bStorm Leggings' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_terravilla_big_trouble_in_little_pub_reward_leggings: + name: '&eEarth''s Blessing' + lore: + - '&eLooks heavy but it is' + - '&esurprisingly light.' + - '&eIt is clear that these' + - '&eleggings are at least a' + - '&efew centuries old.' +primis_terravilla_drowning_terror_reward_charm: + name: '&aFish Charm' + lore: + - '&aFishy.' +primis_terravilla_hog_on_my_porch_reward_helmet: + name: '&6Hog Helmet' + lore: + - '&6Made out of tough Razorback leather.' +primis_terravilla_perfect_sample: + name: '&ePerfect Sample' + lore: + - '&eIt looks like a fish...' + - '&eBut it sure isn''t...' +primis_terravilla_strike_the_earth_reward_sword: + name: '&5Earth Splitter' + lore: + - '&5You pulled this blade out of' + - '&5the Earth Elementals corpse.' + - '&5Unlike it''s dull twin, this' + - '&5blade is in pristine condition.' +primis_terravilla_taking_out_the_trash_reward_sword: + name: '&9Earth Splitter' + lore: + - '&9Looks ancient and dull.' +primis_terravilla_two_legged_terror_growth: + name: '&eTwo Legged Terror Growth' + lore: + - '&eLarge fleshy growth.' +primis_terravilla_two_legged_terror_sample: + name: '&eTwo Legged Terror Sample' + lore: + - '&eIt''s a simple sample.' +primis_wolf_hide_boots: + name: '&5Wolf Hide Slippers' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_wolf_hide_chestplate: + name: '&5Wolf Hide Gambeson' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_wolf_hide_helmet: + name: '&5Wolf Hide Helmet' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_wolf_hide_leggings: + name: '&5Wolf Hide Pants' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +pufferfish_drop_helmet: + name: '&bPuffer Helm' + lore: + - '&bOnce a fish, now a helmet.' +rabbit_charm: + name: '&bうさぎチャーム' + lore: + - '&aこのチャームがあれば' + - '&aどんな目的地でも' + - '$aすぐに行くことができます!' +rabbit_wolf_drop_chestplate: + name: '&6Electrically Charged Chestplate' + lore: + - '&6As long as you don''t mind a' + - '&6casual zap here and there.' +rabbit_wolf_drop_leggings: + name: '&6Flame Licked Leggings' + lore: + - '&6Just lightly scorched.' +regular_hoglin_drop_boots: + name: '&eHog Boots' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_chestplate: + name: '&eHog Armor' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_helmet: + name: '&eHog Hood' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_leggings: + name: '&eHog Leggings' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +rod_of_the_depths: + name: '&3Rod of the Depths' + lore: + - '&3You want to hear about where' + - '&3I got this from? Sit down lad,' + - '&3I''ve got a tale for ye...' +rotting_diver_drop_hoe: + name: '&bDivers Hoe' + lore: + - '&bFound on the Rotting Divers corpse.' +salamander_charm: + name: '&bサラマンダーチャーム' + lore: + - '&aMagmaGuyの新しいミックステープ' + - '&aと同じくらいホットです!' +salty_corpse_drop_helmet: + name: '&aStinky Helm' + lore: + - '&aYou''re not sure why' + - '&ayou decided to pull' + - '&athis off of the corpse.' +scorpion_charm: + name: '&bスコーピオンチャーム' + lore: + - '&a蝶のように舞い' + - '&a蜂のように刺す' + - '&aじゃがいものような毒!' +shulker_charm: + name: '&bシュルカーチャーム' + lore: + - '&a私は飛べると信じている' + - '&a私は空に触れられると信じています' + - '&aそして、あなたは私と一緒に来る!' +skeleton_knight_drop_helmet: + name: '&fKnights Honor' + lore: + - '&fA knights helmet. Made to last.' +sky_archer_drop_bow: + name: '&aSky Bow' + lore: + - '&aGood for keeping phantoms at bay.' +slowpoke_charm: + name: '&bヤドンチャーム' + lore: + - '&a混乱の中で自滅しないことを' + - '$a祈るばかりだ...' +spider_knight_drop_helmet: + name: '&aSmall Helmet' + lore: + - '&aA decent helmet. Maybe, a bit tight.' +stacked_bones_drop_helmet: + name: '&6Skull' + lore: + - '&6Large enough to fit your' + - '&6head inside, so why not.' +summon_merchant_scroll: + name: '&6商人召喚の絵巻' + lore: + - '&aアイテムを売りたい?' + - '&a右クリックで起動' + - '&aもしくは&9ジーブス!&aと叫んだり' +summon_wolf_scroll: + name: '&6狼召喚の絵巻' + lore: + - '&aいい子を召喚して' + - '&aエリート達を噛ませる' + - '&a必ずペットにしてください!' +super_mite_drop_charm: + name: '&dMite Pearl' + lore: + - '&dWas it worth it...' +air_ship_air_buccaneer_boots: + name: '&5Air Bucanneer''s Boots' + lore: + - '&dPerfect for air raids!' +air_ship_air_buccaneer_chestplate: + name: '&5Air Bucanneer''s Chestplate' + lore: + - '&dPerfect for air raids!' +air_ship_air_buccaneer_helmet: + name: '&5Air Bucanneer''s Helmet' + lore: + - '&dPerfect for air raids!' +air_ship_air_buccaneer_leggings: + name: '&5Air Bucanneer''s Leggings' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_boots: + name: '&5Air Pirate''s Boots' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_chestplate: + name: '&5Air Pirate''s Chestplate' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_helmet: + name: '&5Air Pirate''s Helmet' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_leggings: + name: '&5Air Pirate''s Leggings' + lore: + - '&dPerfect for air raids!' +air_ship_bowsmans_bow: + name: '&2Bowsman''s Bow' + lore: + - '&aDropped by the late' + - '&aairship bowsman!' +air_ship_cannon_powder: + name: '&cCannon Powder' + lore: + - '&8How else are you supposed' + - '&8to light the fuse?' +air_ship_daveys_digger: + name: '&4Davey''s Digger' + lore: + - '&cDavey doesn''t desire downtrodden' + - '&cdunderheads displaying his digger.' +air_ship_quartermasters_whip: + name: '&fQuartermaster''s Whip' + lore: + - '&7The quartermaster has a ' + - '&7schedule to keep.' +air_ship_wayfinders_windlass: + name: '&3Wayfinder''s Windlass' + lore: + - '&bUsed to guide ships' + - '&bwith nothing but the stars!' +pirate_ship_sea_feast: + name: '&6Sea feast' + lore: + - '&6A feast for the eyes' + - '&6and the health bar!' +pirate_ship_sea_ration: + name: '&eSea ration' + lore: + - '&eAn apple a day' + - '&ekeep the scurvy away' + - '&cNote: it does not' +catacombs_tier_10_miniboss_boots: + name: '&9Spiderweave boots' + lore: + - '&5As light as air!' +catacombs_tier_10_miniboss_spider_eye: + name: '&7Terragog''s eye' + lore: + - '&7Whispers from nowhere reach' + - '&7your ears while holding this...' +catacombs_tier_15_boss_bone: + name: The Picker + lore: + - '&fYou''ve got a bone to pick!' +catacombs_tier_15_boss_bow: + name: '&6The Bone Shaker' + lore: + - '&fThey''ll feel this one down to' + - '&ftheir bones!' +catacombs_tier_15_boss_shovel: + name: '&8Gravedigger' + lore: + - '&fThey''ll feel this one down to' + - '&ftheir bones!' +catacombs_tier_15_mimic_boss_shield: + name: '&3Shield of the lost Templar' + lore: + - Found in a mysterious chest in a + - secret room of ancient catacombs... +colosseum_pit_breaker: + name: '&4Pit Shatterer' + lore: + - '&4Veni' +colosseum_pit_filler: + name: '&4&lPit Filler' + lore: + - '&4Vici' +colosseum_pit_maker: + name: '&4&lPit Maker' + lore: + - '&4Vidi' +dark_cathedral_tier_75_sword: + name: '&0Cursed Sword' + lore: + - '&0&kChtulhu is the one true God.' + - '&0&kThis world is but a lamb' + - '&0&kto the slaughter' +darkspire_arzags_boots: + name: '&8Arzag''s War Boots' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_chestplate: + name: '&8Arzag''s War Chestplate' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_helmet: + name: '&8Arzag''s War Helmet' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_leggings: + name: '&8Arzag''s War Leggings' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_slicer: + name: '&8Arzag''s Slicer' + lore: + - '&7Once used by the might Arzag!' +darkspire_crypt_keepers_boots: + name: '&4Crypt Keeper''s Boots' + lore: + - '&cFormerly the boots of the' + - '&ccorrupt Crypt Keeper!' +darkspire_hellraisers_battle_armor: + name: '&4Eerbix''s Battle Armor' + lore: + - '&cFormerly the battle' + - '&carmor of the egregious' + - '&cEerbix the Fallen!' +darkspire_maalkvs_bow: + name: '&4Maalkv''s Bow' + lore: + - '&cFormerly the bow of the' + - '&cmischievous Maalkv!' +darkspire_netherite_axe: + name: '&8Void Eviscerator' + lore: + - '&8Shards of the void itself were' + - '&8collected to form the cleaving' + - '&8head of this ancient weapon.' +darkspire_nicolas_ribcages_helmet: + name: '&4Nicolas Ribcage''s Helmet' + lore: + - '&cFormerly the helmet of the' + - '&cnefarious Nicolas Ribcage!' +darkspire_oroxaks_sword: + name: '&4Oroxak''s Sword' + lore: + - '&cFormerly the sword of the' + - '&codious Oroxak!' +darkspire_zalmurs_leggings: + name: '&4Zalmur''s Leggings' + lore: + - '&cFormerly the leggings of' + - '&cthe zealous Zalmur' + - '&cthe Impslayer!' +the_feller: + name: '&2伐採者' + lore: + - '&a眠っている間にも' + - '&aこの斧の躍動を感じることが' + - '&aできる' +the_great_weaver_drop_charm: + name: '&cWeavers Silk' + lore: + - '&cGreat power is imbued into this silk.' +hallosseum_amazing_treat: + name: '&aAmazing Treat!' + lore: + - '&eAn amazing snack!' +hallosseum_axe_of_beheadings: + name: '&cAxe of Beheadings' + lore: + - '&4Famously used to decapitate a' + - '&4certain headless horseman!' +hallosseum_incredible_treat: + name: '&aIncredible Treat!' + lore: + - '&eAn incredible snack!' +hallosseum_treat: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +hallosseum_treat_v2: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +the_hunter_drop_crossbow: + name: '&aHunter''s Friend' + lore: + - '&aLet the hunt begin.' +northpole_amazing_treat: + name: '&aAmazing Treat!' + lore: + - '&eAn amazing snack!' +northpole_coalbringer: + name: '&8Coalbringer' + lore: + - '&cWhatever I touch' + - '&cStarts to melt in my clutch.' + - '&cI''m too much!' +northpole_frostcaster: + name: '&bFrostcaster' + lore: + - '&7Whatever I touch' + - '&7Turns to snow in my clutch!' + - '&7I''m too much' +northpole_incredible_treat: + name: '&aIncredible Treat!' + lore: + - '&eAn incredible snack!' +northpole_naughty_lister: + name: '&4The Naughty Lister' + lore: + - '&cTakes names. Doesn''t ask twice!' + - '&cHave you been naughty this year?' +northpole_treat: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +northpole_treat_v2: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +the_phantom_drop_chestplate: + name: '&dPhantom Gambison' + lore: + - '&dYou would say it is made out of soft' + - '&dand comfy fibrous cloth, but a blade' + - '&dwould not recoil from striking cloth.' +pirate_ship_tier_15_boots: + name: Pirate Sandals + lore: + - Make you want to + - go to the beach! +pirate_ship_tier_15_bow: + name: Pirate shortbow + lore: + - Perfect for boarding parties! +pirate_ship_tier_15_chestplate: + name: Pirate Shirt + lore: + - No shoes, no shirt + - no problem! +pirate_ship_tier_15_helmet: + name: Pirate Bandana + lore: + - No shoes, no shirt + - no problem! +pirate_ship_tier_15_leggings: + name: Pirate Sash + lore: + - These could use a wash! +pirate_ship_tier_15_sword: + name: Pirate marlinspike + lore: + - Loud and deadly! +pirate_ship_tier_20_miniboss_axe: + name: '&5Cookie''s Tenderizer' + lore: + - '&5You''ll feel that tomorrow!' +pirate_ship_tier_20_miniboss_chestplate: + name: '&5Cookie''s apron' + lore: + - '&5Has seen better days!' +pirate_ship_tier_25_boots: + name: '&aPirate shoes' + lore: + - '&aPerfect for thieving!' +pirate_ship_tier_25_bow: + name: '&aPirate musket' + lore: + - '&aCareful where you point it!' +pirate_ship_tier_25_chestplate: + name: '&aPirate vest' + lore: + - '&aProbably illegally obtained!' +pirate_ship_tier_25_helmet: + name: '&aPirate earrings' + lore: + - '&aWorth enough to pay for' + - '&aa funeral!' +pirate_ship_tier_25_leggings: + name: '&aPirate trousers' + lore: + - '&aFull of gold coins!' +pirate_ship_tier_25_miniboss_helmet: + name: '&5Helmsman''s Eyepatch' + lore: + - '&5How can you see better' + - '&5with it on!?' +pirate_ship_tier_25_miniboss_trident: + name: '&5Helmsman''s Trident' + lore: + - '&5Pointy end towards the enemy!' +pirate_ship_tier_25_sword: + name: '&aPirate cutlass' + lore: + - '&aTruly piratey!' +pirate_ship_tier_30_miniboss_axe: + name: '&5Crushy''s Chopper' + lore: + - '&5Step back!' +pirate_ship_tier_30_miniboss_shield: + name: '&5Crushy''s Shoulder' + lore: + - '&5Never skipped shoulder day!' +pirate_ship_tier_35_boots: + name: '&9Pirate boots' + lore: + - '&9Perfect for swashbuckling!' +pirate_ship_tier_35_bow: + name: '&9Pirate handcannon' + lore: + - '&9Blast em away!' +pirate_ship_tier_35_chestplate: + name: '&9Pirate straps' + lore: + - '&9Perfect for looting!' +pirate_ship_tier_35_helmet: + name: '&9Pirate eyepatch' + lore: + - '&9Not perfect for seeing!' +pirate_ship_tier_35_leggings: + name: '&9Pirate greaves' + lore: + - '&9Perfect for looting!' +pirate_ship_tier_35_miniboss_boots: + name: '&9Bodyguard''s boots' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_chestplate: + name: '&5Bodyguard''s straps' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_crossbow: + name: '&5Bodyguard''s handcannon' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_helmet: + name: '&5Bodyguard''s eyepatch' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_leggings: + name: '&5Bodyguard''s greaves' + lore: + - '&9For those with something to defend!' +pirate_ship_tier_35_miniboss_sword: + name: '&5Bodyguard''s cutlass' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_sword: + name: '&9Pirate cutlass' + lore: + - '&9Truly piratey!' +pirate_ship_tier_40_miniboss_crossbow: + name: '&5The Blunderbuss' + lore: + - '&5Spray ''n pray!' +pirate_ship_tier_40_miniboss_leggings: + name: '&5The Zaggers' + lore: + - '&5When they think you''re going!' + - '&5to zig, zag on them!' +pirate_ship_tier_45_boss_helmet: + name: '&5Captain''s eyepatch' + lore: + - '&5I don''t see any issues!' +pirate_ship_tier_45_boss_sword: + name: '&5Captain''s scimitar' + lore: + - '&5En garde, ye scurvy rats!' +the_ruins_boss_loot: + name: '&6Thor''s Axe' + lore: + - Only the pure of heart + - can wield this axe. +sewer_drowned_kings_boots: + name: '&4Drowned King''s Boots' + lore: + - '&cFormerly the boots of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_chestplate: + name: '&4Drowned King''s Chestplate' + lore: + - '&cFormerly the chestplate of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_crown: + name: '&4Drowned King''s Crown' + lore: + - '&cFormerly the crown of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_leggings: + name: '&4Drowned King''s Leggings' + lore: + - '&cFormerly the leggings of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_trident: + name: '&4Drowned King''s Trident' + lore: + - '&cFormerly the trident of the' + - '&cdevilish Drowned King!' +sewer_spelunkers_boots: + name: '&2Sewer Spelunker''s Boots' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential leggings!' +sewer_spelunkers_chestplate: + name: '&2Sewer Spelunker''s Chestplate' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential chestplate!' +sewer_spelunkers_helmet: + name: '&2Sewer Spelunker''s Helmet' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential helmet!' +sewer_spelunkers_leggings: + name: '&2Sewer Spelunker''s Leggings' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential leggings!' +sewer_spelunkers_sword: + name: '&2Sewer Spelunker''s Sword' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential sword!' +the_stinger: + name: '&eThe Stinger' + lore: + - '&a蝶のように舞い' + - '&asting like a bee!' +tree_defender_drop_shield: + name: '&7Living Wood Shield' + lore: + - '&7This shield will' + - '&7slowly repair itself.' +unbind_scroll: + name: '&5Unbind Scroll' + lore: + - '&5Allows users to unbind one' + - '&5soulbound item at an anvil!' + - '&5Use wisely!' +undead_farmer_drop_shovel: + name: '&8Manure Master' + lore: + - '&8Perfect for shoveling pig manure.' +unwanted_visitor_drop_bow: + name: '&1Frost Bow' + lore: + - '&9Makes you wanna chill' + - '&9and snipe from afar.' +vampire_manor_gargoyle_granulator: + name: '&8Gargoyle Granulator' + lore: + - '&cLightly dusted in garlic.' +vampire_manor_stake_your_claim: + name: '&4Stake your Claim' + lore: + - '&cLightly dusted in garlic.' +vampiric_charm: + name: '&bヴァンパイアチャーム' + lore: + - '&aこれがどこから来たのか' + - '&a誰もその危険性を' + - '&a忘れることはできません' +veterans_boots: + name: '&6Veteran''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_chestplate: + name: '&6Veteran''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_helmet: + name: '&6Veteran''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_leggings: + name: '&6Veteran''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_sword: + name: '&6Veteran''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +vex_top_drop_boots: + name: '&bVexed Boots' + lore: + - '&bWith mighty boots' + - '&bcomes mighty strength.' +warlock_drop_chestplate: + name: '&dWarlock Robes' + lore: + - '&dOffers good protection from spells.' +warlock_drop_helmet: + name: '&dWarlock Hood' + lore: + - '&dOffers good protection from spells.' +water_pest_drop_shield: + name: '&bWater Logged Shield' + lore: + - '&bIt''s pretty sturdy actually.' +wendigo_drop_sword: + name: '&8Blade of Starving' + lore: + - '&8This blade will always' + - '&8hunger for more blood.' +werehare_drop_charm: + name: '&eWerehare Trophy' + lore: + - '&eLuck and health to' + - 'ðose who carry it.' +werewolf_bone: + name: '&6Werewolf Bone' + lore: + - '&aHaving killed the alpha,' + - '&athis temporarily makes you!' + - '&athe wolves'' new leader' +wolfsbane: + name: '&7Wolfsbane' + lore: + - '&aMade from the remains of' + - '&aan alpha werewolf, all' + - '&awolves cower at the sight of it.' +yeti_drop_leggings: + name: '&eFur Leggings' + lore: + - '&eNice and warm.' +yezhi_baba_drop_boots: + name: '&aWitches Robes' + lore: + - '&aThe smell should go' + - '&aaway eventually.' +zombie_kings_axe: + name: '&4ゾンビキングの斧' + lore: + - ゾンビ達がキングと + - 呼ぶ者の斧 + - 血の気が引いている +airship_minidungeon: + name: '&6飛行船' + customInfo: + - '&f不死身の海賊がいっぱいの素晴らしい飛行船!!' + - '$6作成者: MagmaGuy、69OzCanOfBepis' + - '&6Realm of Lotheridon' + playerInfo: |- + 難易度: &6普通 + ボスの数: $bossCount レベル: $lowestTier から $highestTier + 不死身の海賊でいっぱいの素晴らしい飛行船 + 経験豊富なプレーヤー向け + regionEnterMessage: '&8[EM] &c敵の領空に入りました!' + regionLeaveMessage: '&8[EM] &c敵の領空から離れました!' +binder_of_worlds_lair: + name: '&5Binder Of Worlds' + customInfo: + - '&5The ultimate challenge. Be prepared!' + - '&6作成者: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Nightmare + $bossCount level $highestTier final boss! + &5This is the hardest fight in EliteMobs! + regionEnterMessage: '&8[EM] &5Reality unravels around you. You face the final challenge. &4You are not prepared!' + regionLeaveMessage: '&8[EM] &5You have left the unravelling. Did you find what you sought? Was it worth it?' +catacombs_lair: + name: '&8The Catacombs' + customInfo: + - '&fプレイヤーに最適なスターターダンジョンです!' + - '&6作成者: Realm of Lotheridon' + playerInfo: |- + Difficulty: &cHard + $bossCount bosses, from tier $lowestTier to $highestTier + &2The best Lair challenge for groups of beginners! + regionEnterMessage: '&8[EM] &8地下墓地に入ります。下にあるものには注意してください...' + regionLeaveMessage: '&8[EM] &8あなたは地下墓地を去りました。入る価値がありましたか?' +colosseum_lair: + name: '&6コロッセオ' + customInfo: + - '$f初の真のワールドボス' + - '$f初の多段階バトル、初の騎乗ボス' + - '$f初の変装ボスなど、まさに壮絶な戦いが繰り広げられます' + - '&6作成者: MagmaGuy & Maldini' + playerInfo: |- + Difficulty: &cHard + $bossCount bosses, from level $lowestTier to $highestTier + &cA true challenge for big groups of players! + regionEnterMessage: '&8[EM] &6王者と挑戦者は準備せよ!&e強大な敵に自分の価値を証明せよ!' + regionLeaveMessage: '&8[EM] &6さらば旅人よ!&eすぐに戻ってきて、もう一度あなたの力を見せてください!' +dark_cathedral_lair: + name: '&8闇の大聖堂' + customInfo: + - '&f史上初のエリートモブの隠れ家!' + - '&fすべてのサーバーに必要な定番!' + - '&6作成者: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &cHard + $bossCount level $highestTier Big Boss! + &cThe original minidungeon, a challenge for + &ca group of players or for veterans! + regionEnterMessage: '&8[EM] &8闇の大聖堂へようこそ. &4死が待っています...' + regionLeaveMessage: '&8[EM] &8闇の大聖堂を後にした. &4あなたの帰りを待っています...' +dark_spire_minidungeon: + name: '&8闇の尖塔' + customInfo: + - '&f史上初のハイレベルコンテンツ!' + - '&f本当にチャレンジしたい人のために作られました!' + - '&6作成者: 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &cA vast challenge for advanced players! + regionEnterMessage: '&8[EM] &1侵略が進行中です。&9反乱を止めましょう!' + regionLeaveMessage: '&8[EM] &1あなたは彼らを食い止めることができました。&9今のところは...' +fireworks_lair: + name: '&aFireworks' + customInfo: + - '&fThe 2021 4th of July map!' + - '&6Credits: MagmaGuy' + playerInfo: |- + Difficulty: &cHard + $bossCount level $lowestTier Big Boss! + &6An encounter full of explosions! + regionEnterMessage: '&8[EM] &eWelcome to the fireworks show!' + regionLeaveMessage: '&8[EM] &eYou''ve left the party!' +frost_palace_sanctum: + name: Frost Palace + customInfo: + - '&fA 7 phase fight against' + - the queen of ice! + - '&6Credits: MagmaGuy, Delio' + playerInfo: 'Difficulty: &45-man hard content!' + regionEnterMessage: '&bYou are stepping into the Frost Palace! Stay frosty!' + regionLeaveMessage: '&bYou have left the Frost Palace!' +hallosseum_lair: + name: '&cハロウィンコロセウム' + customInfo: + - '&f2020の不気味なハロウィン!' + - '&6作成者: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &chard + $bossCount level $lowestTier Big Boss! + &6A fun Halloween challenge! + regionEnterMessage: '&8[EM] &4トリック・オア・トリート! &8あなたの魂は私のもの!' + regionLeaveMessage: '&8[EM] &4魂を奪われないで脱出した。' +invasion_minidungeon: + name: '&2The Invasion' + customInfo: + - '&fThe Halloween Minidungeon!' + - '&6作成者: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount aliens, from level $lowestTier to $highestTier + &6Don't get abducted! + regionEnterMessage: '&8[EM] &7Alien invasion in progress! Defeat the Mothership!' + regionLeaveMessage: '&8[EM] &7You have escaped the alien abductions! No one will ever believe you.' +north_pole_minidungeon: + name: '&9The North Pole' + customInfo: + - '&fクリスマスミニダンジョン!' + - '&6作成者: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + 難易度: &6普通 + ボスの数: $bossCount レベル: $lowestTier から $highestTier + &6スノードームで過ごすクリスマス! + regionEnterMessage: '&8[EM] &7北極に到着しました! &f今年、あなたはいい子にしていましたか?' + regionLeaveMessage: '&8[EM] &7また遊びに来てくださいね!&f次はたくさんのスイーツやおやつを用意しておきます!' +oasis_adventure: + name: '&6オアシス' + customInfo: + - '&f初心者向けの大冒険!' + - '&6作成者: 69OzCanOfBepis' + playerInfo: |- + Difficulty: &2Solo-able + $bossCount bosses, from level $lowestTier to $highestTier + &6A big adventure for people who know the ropes! + regionEnterMessage: '&8[EM] &6オアシスに着きました!' + regionLeaveMessage: '&8[EM] &6オアシスを離れました!' +pirate_ship_minidungeon: + name: '&6海賊船' + customInfo: + - '&f楽しくてチャレンジングなミニダンジョンに満ちています。' + - '&fエリートモブが得意になってきた' + - '&fプレイヤーのために作られたボス達!' + - '&6作成者: MagmaGuy & Realm of Lotheridon' + playerInfo: |- + 難易度: &6普通 + ボスの数: $bossCount レベル: $lowestTier から $highestTier + &6冒険者のための最高の狩猟場の一つです! + regionEnterMessage: '&8[EM] &3海賊船に乗り込んだ!&b思う存分略奪しよう!' + regionLeaveMessage: '&8[EM] &3船外に出た!&b海の男になったら帰ってきてね!' +primis_adventure: + name: '&7Primis' + customInfo: + - '&fA tutorial adventure for new players!' + - '&6Credits: 69OzCanOfBepis, MagmaGuy' + playerInfo: |- + Difficulty: &2Easy + $bossCount bosses, from level $lowestTier to $highestTier + &6A tutorial adventure for new players! + regionEnterMessage: '&8[EM] &6Primis awaits, strike the earth!' + regionLeaveMessage: '&8[EM] &6You have left Primis!' +sewers_minidungeon: + name: '&8下水道' + customInfo: + - '&f史上最大のミニダンジョンです!' + - '&6作成者: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + 難易度: &6普通 + ボスの数: $bossCount レベル: $lowestTier から $highestTier + &6複雑なダンジョンの迷路に挑戦! + regionEnterMessage: '&8[EM] &5ここは廃墟のようだ... &dしかしこの下水道には何かが潜んでいます!' + regionLeaveMessage: '&8[EM] &5水に浸かるだけで済みましたね. &d次は溺れるかもしれません' +the_ruins: + name: '&6The Ruins' + customInfo: + - '&fA fight against a myth from' + - '&fNorse mythology, be prepared for a smiting!' + - '&6Credits: 69OzCanOfBepis, MagmaGuy' + playerInfo: |- + Difficulty: &cHard + $bossCount level $lowestTier Big Boss! + &cA tough fight against a Norse god! + regionEnterMessage: '&8[EM] &3Those who challenge the myths must be prepared for their downfall!' + regionLeaveMessage: '&8[EM] &3You now know what it takes to make a legend!' +vampire_manor: + name: '&cThe Vampire Manor' + customInfo: + - '&fPrepare to spill blood!' + - '$6作成者: MagmaGuy、69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &6A deadly manor full of blood thristy creatures! + &6Are you ready to face that which haunts the night? + regionEnterMessage: '&8[EM] &cTrespassing on dangerous grounds!!' + regionLeaveMessage: '&8[EM] &cNow leaving haunted land!' +alpha_werewolf_p1: + name: '$eventBossLevel &7Enraged Vindicator' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Alpha Wolf has been put down!' + - '&c&l 1位: $damager1name &c($damager1damage ダメージ)' + - '&6&l 2位: $damager2name &6($damager2damage ダメージ)' + - '&e&l 3位: $damager3name &e($damager3damage ダメージ)' + - '&a倒したプレイヤー: $players' + - '&e&l---------------------------------------------' + locationMessage: '&7Enraged Vindicator: $distance blocks away!' + spawnMessage: '&cThe howls of an Alpha Werewolf are heard!' + deathMessage: '&aThe Alpha Werewolf has been stopped by $players!' + escapeMessage: '&4Dawn breaks, the Alpha Wolf vanishes without a trace!' +alpha_werewolf_p2: + name: '$eventBossLevel &7Alpha Werewolf' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Alpha Wolf has been put down!' + - '&c&l 1位: $damager1name &c($damager1damage ダメージ)' + - '&6&l 2位: $damager2name &6($damager2damage ダメージ)' + - '&e&l 3位: $damager3name &e($damager3damage ダメージ)' + - '&a倒したプレイヤー: $players' + - '&e&l---------------------------------------------' + locationMessage: '&7Alpha Wolf: $distance blocks away!' + spawnMessage: '&cThe howls of an Alpha Werewolf are heard!' + deathMessage: '&aThe Alpha Werewolf has been stopped by $players!' + escapeMessage: '&4Dawn breaks, the Alpha Wolf vanishes without a trace!' +ancient_corpse: + name: '$eventBossLevel &eAncient Corpse' +animated_armor: + name: '$eventBossLevel &8Animated Armor' + locationMessage: '&cAnimated Armor: $distance blocks away!' + spawnMessage: '&cOh no! An Animated Armor has escape from it''s armor stand!' + deathMessage: '&aThe Animated Armor was stopped by $players!' + escapeMessage: '&4The Animated Armor is gone!' +arachnid_matriarch: + name: '$eventBossLevel &cArachnid Matriarch' + locationMessage: '&cArachnid Matriarch: $distance blocks away!' + spawnMessage: '&cA Matriarch has come to spread her brood across the land!' + deathMessage: '&aThe Matriarch and her brood were stopped by $players!' + escapeMessage: '&4The Matriarch has left!' +arachnid_matriarch_summon: + name: '$eventBossLevel &4Broodling' +armor_goblin: + name: '$eventBossLevel &3Armor Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Armor Goblin has been pillaged!' + - '&c&l 1位: $damager1name &c($damager1damage ダメージ)' + - '&6&l 2位: $damager2name &6($damager2damage ダメージ)' + - '&e&l 3位: $damager3name &e($damager3damage ダメージ)' + - '&a倒したプレイヤー: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cArmor Goblin: $distance blocks away!' + spawnMessage: '&cAn Armor Goblin has been sighted!' + deathMessage: '&aAn Armor Goblin has been slain by $players!' + escapeMessage: '&4An Armor Goblin has escaped!' +baba_rhoga: + name: '$eventBossLevel &cBaba Rhoga' + locationMessage: '&cBaba Rhoga: $distance blocks away!' + spawnMessage: '&cA wicked hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +baba_rhoga_summon: + name: '$reinforcementLevel &4Baba Rhoga' +baba_yaga: + name: '$eventBossLevel &cBaba Yaga' + locationMessage: '&cBaba Yaga: $distance blocks away!' + spawnMessage: '&cA wicked hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +baba_yaga_summon: + name: '$reinforcementLevel &4Baba Yaga' +balloon_rider: + name: '$eventBossLevel &dBalloon Rider' + locationMessage: '&cBalloon Rider: $distance blocks away!' + spawnMessage: '&cA brave Balloon Rider has come to the Nether!' + deathMessage: '&aThe Balloon Rider has taken his last ride thanks to $players!' + escapeMessage: '&4The Balloon Rider has floated away!' +balloon_rider_mount: + name: '$eventBossLevel &5Ghastly Balloon' +balrog: + name: '$eventBossLevel &4バルログ' +banshee: + name: '$eventBossLevel &cBanshee' + locationMessage: '&cBanshee: $distance blocks away!' + spawnMessage: '&cA Banshee''s wail can be heard!' + deathMessage: '&aThe Banshee was silenced by $players!' + escapeMessage: '&4The Banshee has left!' +banshee_summon: + name: '$eventBossLevel &cGrief' +beast_master: + name: '$eventBossLevel &6Beast Master' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Beast Master has been savaged!' + - '&c&l 1位: $damager1name &c($damager1damage ダメージ)' + - '&6&l 2位: $damager2name &6($damager2damage ダメージ)' + - '&e&l 3位: $damager3name &e($damager3damage ダメージ)' + - '&a倒したプレイヤー: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cBeast Master: $distance blocks away!' + spawnMessage: '&cThe Beast Master has been sighted!' + deathMessage: '&aThe Best Master has been slain by $players!' + escapeMessage: '&4The Beast Master has returned to the wilds!' +beast_tamer: + name: '$eventBossLevel &eBeast Tamer' + locationMessage: '&cBeast Tamer: $distance blocks away!' + spawnMessage: '&cA master of beasts roams the world!' + deathMessage: '&aThe Beast Tamer was stopped by $players!' + escapeMessage: '&4The Beast Tamer has left!' +beast_tamer_summon: + name: '$eventBossLevel &6Large Beast' +beast_tamer_summon_1: + name: '$eventBossLevel &6Beast' +beta_wolf: + name: '$reinforcementLevel &7Beta Wolf' +bigfoot: + name: '$eventBossLevel &fBigfoot' + locationMessage: '&cBigfoot: $distance blocks away!' + spawnMessage: '&cA mighty beast has appeared!' + deathMessage: '&aThe beast is no more thanks to $players!.' + escapeMessage: '&4The beast has escaped!' +big_bad_wolf: + name: '$eventBossLevel &fBig Bad Wolf' + locationMessage: '&cBig Bad Wolf: $distance blocks away!' + spawnMessage: '&cAnd he huffed and he puffed!' + deathMessage: '&aThe little piggies are now safe thanks to $players!' + escapeMessage: '&4The Big Bad Wolf has left!' +binder_of_worlds_phase_1_endermite_reinforcement: + name: '$reinforcementLevel &5Reality Corruptor' +binder_of_worlds_phase_3_enderman_reinforcement: + name: '$reinforcementLevel &5Realityのスレイヤー' +binder_of_worlds_phase_3_ghast_reinforcement: + name: '$reinforcementLevel &5リアリティシュレッダー' +blayyze: + name: '$eventBossLevel &6ブレイズ' + deathMessages: + - '&e&l---------------------------------------------' + - '&6ブレリィズが撃退されました!' + - '&c&l 1位: $damager1name &c($damager1damage ダメージ)' + - '&6&l 2位: $damager2name &6($damager2damage ダメージ)' + - '&e&l 3位: $damager3name &e($damager3damage ダメージ)' + - '&a倒したプレイヤー: $players' + - '&e&l---------------------------------------------' + locationMessage: '&6????: $distance ブロック離れた場所に' + spawnMessage: '&c隕石のクレーターから何かが出てきました...' + deathMessage: '&6$players が最初の接触をしました。' + escapeMessage: '&6エイリアンはエリア51に連れて行かれました!' +bloated_jeffrey: + name: '$eventBossLevel &dBloated Jeffrey' + locationMessage: '&cBloated Jeffrey: $distance blocks away!' + spawnMessage: '&cIt''s Jeffrey! They are in the nether! Bring a bow!' + deathMessage: '&aBloated Jeffrey has been slain by $players!' + escapeMessage: '&4Jeffrey and his friends grew bored and they left!' +bloated_jeffrey_summon: + name: '$eventBossLevel &dJeffrey''s Friend' +bone_fiend: + name: '$eventBossLevel &7Bone Fiend' + locationMessage: '&cBone Fiend: $distance blocks away!' + spawnMessage: '&cA creature of bone and bone has appeared!' + deathMessage: '&aThe Bone Fiend was defeated by $players!' + escapeMessage: '&4The Bone Fiend found no bone and left!' +bone_fiend_mount: + name: '$eventBossLevel &8Bone Carrier' +changeling: + name: '$eventBossLevel &4Changeling' + locationMessage: '&cChangeling: $distance blocks away!' + spawnMessage: '&cA shape-shifter has entered this world.' + deathMessage: '&aThe Changeling was stopped by $players!' + escapeMessage: '&4The Changeling has escaped!' +changeling_p2: + name: '$eventBossLevel &4Changeling' +changeling_p3: + name: '$eventBossLevel &4Changeling' +changeling_p4: + name: '$eventBossLevel &4Changeling' +changeling_p5: + name: '$eventBossLevel &4Changeling' +changeling_p6: + name: '$eventBossLevel &4Changeling' +changeling_p7: + name: '$eventBossLevel &4Changeling' +charms_goblin: + name: '$eventBossLevel &2Charms Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Charms Goblin has been pillaged!' + - '&c&l 1位: $damager1name &c($damager1damage ダメージ)' + - '&6&l 2位: $damager2name &6($damager2damage ダメージ)' + - '&e&l 3位: $damager3name &e($damager3damage ダメージ)' + - '&a倒したプレイヤー: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cCharms Goblin: $distance blocks away!' + spawnMessage: '&cA Charms Goblin has been sighted!' + deathMessage: '&aA Charms Goblin has been slain by $players!' + escapeMessage: '&4A Charms Goblin has escaped!' +circus_ringmaster: + name: '$eventBossLevel &dRingmaster' + locationMessage: '&cCircus Ringmaster: $distance blocks away!' + spawnMessage: '&cA terrible circus is in town!' + deathMessage: '&a$players has stopped the RIngmasters reign of abuse!' + escapeMessage: '&4The circus has left town!' +circus_ringmaster_summon: + name: '$eventBossLevel &5Tortured Animal' +circus_ringmaster_summon_1: + name: '$eventBossLevel &5Abused Clown' +circus_ringmaster_summon_2: + name: '$eventBossLevel &5Mistreated Balloon' +coins_goblin: + name: '$eventBossLevel &eCoins Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Coins Goblin has been pillaged!' + - '&c&l 1位: $damager1name &c($damager1damage ダメージ)' + - '&6&l 2位: $damager2name &6($damager2damage ダメージ)' + - '&e&l 3位: $damager3name &e($damager3damage ダメージ)' + - '&a倒したプレイヤー: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cCoins Goblin: $distance blocks away!' + spawnMessage: '&cA Coins Goblin has been sighted!' + deathMessage: '&aA Coins Goblin has been slain by $players!' + escapeMessage: '&4A Coins Goblin has escaped!' +craftenmine_stacked_bones: + name: '$eventBossLevel &eArmed Skull' + locationMessage: '&cDr. Craftenmine''s Stacked Bones: $distance blocks away!' + spawnMessage: '&cA horrible Dr. Craftenmine creation is out in the wild!' + deathMessage: '&aThe horrible Stacked-Bones creation was slain by $players!' + escapeMessage: '&4Dr. Craftenmines horrible creation has escaped!' +craftenmine_stacked_bones_ankle: + name: '$eventBossLevel &6Armed Ankle' +craftenmine_stacked_bones_backbone: + name: '$eventBossLevel &6Armed Backbone' +craftenmine_stacked_bones_femur: + name: '$eventBossLevel &6Armed Femur' +craftenmine_stacked_bones_spine: + name: '$eventBossLevel &6Armed Spine' +craftenmine_terror: + name: '$eventBossLevel &cLobotimized Ghast' + locationMessage: '&cDr. Craftenmine''s Terror: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine creation is on the loose!' + deathMessage: '&aThe Lobotimized Ghast was slain by $players!' + escapeMessage: '&4The Lobotimized Ghast has left!' +craftenmine_terror_mount: + name: '$eventBossLevel &dGhast Carrier' +creeperpede_1: + name: '$eventBossLevel &5Creeperpede Observer' + locationMessage: '&cCreeperpede: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine experiment is on the loose!' + deathMessage: '&aThe Creeperpede was stopped in its tracks by $players!.' + escapeMessage: '&4AThe Dr. Craftenmine experiment has managed to escape!' +creeperpede_2: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_3: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_4: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_5: + name: '$eventBossLevel &5Creeperpede Carrier' +crone: + name: '$eventBossLevel &aOld Crone' + locationMessage: '&cOld Crone: $distance blocks away!' + spawnMessage: '&cAn Old Crone has wandered into this world!' + deathMessage: '&aThe Crone was vanquished by $players!.' + escapeMessage: '&4The Old Crone has left this world on her broom!' +crone_summon: + name: '$eventBossLevel &fPet Spider' +divine_cinder: + name: '$eventBossLevel &cDivine Cinder' + locationMessage: '&cDivine Cinder: $distance blocks away!' + spawnMessage: '&cA divine blaze has appeared!' + deathMessage: '&aThe Divine Cinder was defeated by $players!' + escapeMessage: '&4The Divine Cinder has smoked away!' +ember: + name: '$reinforcementLevel &cエンバー' +enders_1: + name: '$eventBossLevel &dEnderlad' + locationMessage: '&cEnder Clique: $distance blocks away!' + spawnMessage: '&cA group of ender troublemakers have appeared.' + deathMessage: '&aThe Ender Clique was stopped by $players!' + escapeMessage: '&4The Ender Clique have left!' +enders_2: + name: '$eventBossLevel &dEnderchap' + locationMessage: '&cClique Member: $distance blocks away!' +enders_3: + name: '$eventBossLevel &dEnderdude' + locationMessage: '&cClique Member: $distance blocks away!' +ender_lapin: + name: '$eventBossLevel &aEnder Lapin' +endless_pursuer: + name: '$eventBossLevel &dEndless Pursuer' + locationMessage: '&cEndless Pursuer: $distance blocks away!' + spawnMessage: '&cIt will not stop chasing...' + deathMessage: '&aThe chase has stopped thanks to $players!' + escapeMessage: '&4The Pursuer has vanished!' +enraged_snowman: + name: '$eventBossLevel &1Enraged Snowman' + locationMessage: '&cEnraged Snowman: $distance blocks away!' + spawnMessage: '&cAn angry Snowman was sighted!' + deathMessage: '&aThe Enraged Snowman was put to rest by $players!' + escapeMessage: '&4The Enraged Snowman has vanished!' +evil_undead: + name: '$eventBossLevel &cEvil Undead' + locationMessage: '&cEvil Undead: $distance blocks away!' + spawnMessage: '&cAn Evil Undead has appeared!' + deathMessage: '&aThe Evil Undead was put to rest by $players!' + escapeMessage: '&4The Evil Undead has escaped!' +evil_undead_p2: + name: '$eventBossLevel &cEvil Undead' + locationMessage: '&cEvil Undead: $distance blocks away!' + spawnMessage: '&cAn Evil Undead has appeared!' + deathMessage: '&aThe Evil Undead was put to rest by $players!' + escapeMessage: '&4The Evil Undead has escaped!' +fallen_knight: + name: '$eventBossLevel &7Fallen Knight' + locationMessage: '&cFallen Knight: $distance blocks away!' + spawnMessage: '&cA Fallen Knight rises from their grave!' + deathMessage: '&aA Fallen Knight has fallen to $players!.' + escapeMessage: '&4The Fallen Knight goes back to slumber!' +fine_swine: + name: '$eventBossLevel &eFine Swine' +fine_swine_summon: + name: '$eventBossLevel &eMighty Protector' +firestarter: + name: '$eventBossLevel &6Firestarter' + locationMessage: '&cFirestarter: $distance blocks away!' + spawnMessage: '&cA wicked Firestarter has appeared!' + deathMessage: '&aThe Firestarter was slain by $players!' + escapeMessage: '&4The Firestarter has left!' +firestarter_mount: + name: '$eventBossLevel &6Spark' +fire_conjurer: + name: '$eventBossLevel &eFire Conjurer' + locationMessage: '&cFire Conjurer: $distance blocks away!' + spawnMessage: '&cA master of fire and flame walks this world!' + deathMessage: '&aThe Fire Conjurer was extinguished by $players!' + escapeMessage: '&4The Fire Conjurer has vanished!' +fire_conjurer_summon: + name: '$eventBossLevel &6Summoned Flame' +fire_fae: + name: '$eventBossLevel &c火の妖精' +foreign_visitor: + name: '$eventBossLevel &5Foreign Visitor' + locationMessage: '&cForeign Visitor: $distance blocks away!' + spawnMessage: '&cA visitor from a another dimension has arrived!' + deathMessage: '&a$players has made sure to let the visitor know that they are not welcome here.' + escapeMessage: '&4The visitor has gone back home!' +fox_king_cold: + name: '$eventBossLevel &1Fox King Cold' + locationMessage: '&cFox King Cold: $distance blocks away!' + spawnMessage: '&cA magical creature roams the world.' + deathMessage: '&aFox King Cold was defeated by $players!' + escapeMessage: '&4Fox King Cold has left this world.' +frost_palace_frost_queen_p0: + name: '$bossLevel &8Frost Queen' + locationMessage: '&9Frost Queen' + spawnMessage: '&9The wind howls. The Frost Queen rises up to the challenge.' + deathMessage: '&aThe Frost queen is no more, slain by $players!' +frost_palace_frost_queen_p1: + name: '$bossLevel &8Frost Queen phase 1' + locationMessage: '&9Frost Queen phase 1' +frost_palace_frost_queen_p2: + name: '$bossLevel &8Frost Queen phase 2' + locationMessage: '&9Frost Queen phase 2' +frost_palace_frost_queen_p3: + name: '$bossLevel &8Frost Queen phase 3' + locationMessage: '&9Frost Queen phase 3' +frost_palace_frost_queen_p4: + name: '$bossLevel &8Frost Queen phase 4' + locationMessage: '&9Frost Queen phase 4' +frost_palace_frost_queen_p5: + name: '$bossLevel &8Frost Queen phase 5' + locationMessage: '&9Frost Queen phase 5' +frost_palace_frost_queen_p6: + name: '$bossLevel &8Frost Queen phase 6' + locationMessage: '&9Frost Queen phase 6' +frost_palace_frost_queen_p7: + name: '$bossLevel &8Frost Queen phase 7' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Frost Queen was thawed!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&9Frost Queen phase 7' +frost_palace_reinforcement_1: + name: '$reinforcementLevel Spirit of Winter' +frost_palace_reinforcement_2: + name: '$reinforcementLevel Spirit of Spring' +frost_palace_reinforcement_3: + name: '$reinforcementLevel Spirit of Summer' +fulgora: + name: '$eventBossLevel &3Fulgora' + locationMessage: '&cFulgora: $distance blocks away!' + spawnMessage: '&cA mighty thunder goat has come!' + deathMessage: '&aFulgora was stopped by $players!' + escapeMessage: '&4Fulgora has left this place!' +gamma_werewolf: + name: '$reinforcementLevel &7Gamma Werewolf' +goblin_invader: + name: '$eventBossLevel &2Goblin Leader' + locationMessage: '&cGoblin Army: $distance blocks away!' + spawnMessage: '&cA Goblin Army has invaded this realm!' + deathMessage: '&aThe Goblin Army has been vanquished by $players!' + escapeMessage: '&4The Goblin Army is done with this realm!' +goblin_invader_summon_1: + name: '&2Goblin Warrior' +goblin_invader_summon_2: + name: '&2Goblin Fighter' +goblin_invader_summon_3: + name: '&2Goblin Trooper' +goblin_invader_summon_4: + name: '&2Goblin Reinforcements' +greedy_dwarf: + name: '$eventBossLevel &9Greedy Dwarf' + locationMessage: '&cGreedy Dwarf: $distance blocks away!' + spawnMessage: '&cCan you find the Greedy Dwarf digging somewhere underground?!' + deathMessage: '&aThe Greedy Dwarf was released of their curse by $players!' + escapeMessage: '&4The Greedy Dwarf had found their treasure and they left!' +gremlin_1: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + spawnMessage: '&cA Gremlin hoard has invaded this world!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_10: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_2: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_3: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_4: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_5: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_6: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_7: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_8: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_9: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +grunter: + name: '$eventBossLevel &aGrunter' + locationMessage: '&cGrunter: $distance blocks away!' + spawnMessage: '&cA mighty hog roams the lands.' + deathMessage: '&aGrunter was stopped by $players!' + escapeMessage: '&4Grunter has escaped!' +harmless_chicken: + name: '$eventBossLevel &fHarmless Chick' + locationMessage: '&cHarmless Chick: $distance blocks away!' + spawnMessage: '&cBwok!!! Cluck, Cluck! Bawk!' + deathMessage: '&aBaaaawk! Cluck...$players!' + escapeMessage: '&4Harmless Chicken has baaaaaawked away.' +harmless_chicken_summon: + name: '$eventBossLevel &fClucktector' +hog_rider: + name: '$eventBossLevel &6Hog Rider' + locationMessage: '&cHog Rider: $distance blocks away!' + spawnMessage: '&cA mighty Hog Rider has appeared!' + deathMessage: '&aThe Hog Rider and their Hog were vanquished by $players!' + escapeMessage: '&4The Hog Rider has vanished.' +hog_rider_mount: + name: '$eventBossLevel &eLoyal Hog' +hog_rider_p2: + name: '$eventBossLevel &6Hog Rider' + locationMessage: '&cHog Rider: $distance blocks away!' + deathMessage: '&aThe Hog Rider and their Hog were vanquished by $players!' + escapeMessage: '&4The Hog Rider has vanished.' +hog_rider_summon: + name: '$eventBossLevel &eLoyal Zob-Hog' +horde_champion: + name: '$eventBossLevel &cHorde Champion' + locationMessage: '&cUndead Horde Champion: $distance blocks away!' + spawnMessage: '&cAn undead horde approaches!' + deathMessage: '&aThe horde has been stopped by $players!.' + escapeMessage: '&4AThe undead horde has left!' +horrid_duplicator: + name: '$eventBossLevel &dHorrid Duplicator' + locationMessage: '&cHorrid Duplicator: $distance blocks away!' + spawnMessage: '&cAn endless foe has appeared!' + deathMessage: '&aThe Horrid Duplicator was slain by $players!' + escapeMessage: '&4The Horrid Duplicator has left!' +horrid_duplicator_summon: + name: '$eventBossLevel &dHorrid Duplicator' +horrid_duplicator_summon_1: + name: '$eventBossLevel &dHorrid Duplicator' +ice_fae: + name: '$eventBossLevel &b氷の妖精' +imperial_bee_guard: + name: '$reinforcementLevel &eImperial Bee Soldier' +invasion_abducted_hoglin_leader: + name: '$normalLevel &8Abducted Hoglin Leader' +invasion_abducted_pillager_leader: + name: '$normalLevel &8Abducted Pillager Leader' +invasion_abducted_silverfish: + name: '$normalLevel &8Abducted Silverfish' +invasion_abducted_silverfish_leader: + name: '$normalLevel &8Abducted Silverfish' +invasion_abducted_zombie: + name: '$normalLevel &8Abducted Zombie' +invasion_abducted_zombie_leader: + name: '$normalLevel &8Abducted Zombie' +invasion_abductor: + name: '$normalLevel &6Abductor' +invasion_abudcted_pillager: + name: '$normalLevel &8Abducted Pillager' +invasion_analytic_thin_man_1: + name: '$normalLevel &8Analytic Thin Man' +invasion_analytic_thin_man_2: + name: '$normalLevel &8Analytic Thin Man' +invasion_analytic_thin_man_3: + name: '$normalLevel &8Analytic Thin Man' +invasion_analytic_thin_man_4: + name: '$normalLevel &8Analytic Thin Man' +invasion_ballistic_construct: + name: '$minibossLevel &fBallistic Construct' +invasion_convert: + name: '$normalLevel &6Convert' +invasion_energy_construct: + name: '$minibossLevel &fEnergy Construct' +invasion_fire_construct: + name: '$minibossLevel &fFire Construct' +invasion_genetically_modified_cow_phase_1: + name: '$minibossLevel &fGenetically Modified Cow' +invasion_genetically_modified_cow_phase_2: + name: '$minibossLevel &fGenetically Modified Cow' +invasion_gray_man_courthouse_phase_1: + name: '$minibossLevel &7Gray Man' +invasion_gray_man_courthouse_phase_2: + name: '$minibossLevel &7Gray Man' +invasion_green_man_hotel_phase_1: + name: '$bossLevel &2Green Man' +invasion_green_man_hotel_phase_2: + name: '$bossLevel &2Green Man' +invasion_green_man_hotel_phase_3: + name: '$bossLevel &2Green Man' + deathMessage: '&4The &2Green Man &4was vanquished by $players! That''s the end for this version of the map, the inside of the UFO is in the full version!' +invasion_green_man_spaceship_phase_1: + name: '$bossLevel &2Green Man' +invasion_green_man_spaceship_phase_2: + name: '$bossLevel &2Green Man' +invasion_green_man_spaceship_phase_3: + name: '$bossLevel &2Green Man' +invasion_green_man_spaceship_phase_4: + name: '$bossLevel &2Green Man' + deathMessages: + - '&e&l---------------------------------------------' + - '&2The Alien menace is no more!' + - '&c&l 1位: $damager1name &c($damager1damage ダメージ)' + - '&6&l 2位: $damager2name &6($damager2damage ダメージ)' + - '&e&l 3位: $damager3name &e($damager3damage ダメージ)' + - '&a倒したプレイヤー: $players' + - '&e&l---------------------------------------------' +invasion_ice_construct: + name: '$minibossLevel &fIce Construct' +invasion_merman: + name: '$normalLevel &6Merman' +invasion_merman_leader: + name: '$normalLevel &6Merman Leader' +invasion_otherwordly_ember: + name: '$normalLevel &6Otherworldly Ember' +invasion_psychic_apparition: + name: '$normalLevel &5Psychic Apparition' +invasion_psychic_clone: + name: '$reinforcementLevel &6Psychic Clone' +invasion_psychic_explosion: + name: '$reinforcementLevel &5Psychic Explosion' +invasion_psychic_summon_gold_boots: + name: '$reinforcementLevel &5Psychic Apparition' +invasion_psychic_summon_gold_pants: + name: '$reinforcementLevel &5Psychic Apparition' +invasion_psychic_summon_leather_hat: + name: '$reinforcementLevel &5Psychic Apparition' +invasion_shrieking_shulker: + name: '$normalLevel &8Shrieking Shulker' +invasion_thin_man: + name: '$normalLevel &8Thin Man' +killer_rabbit_of_caerbannog: + name: '$eventBossLevel &cKiller Rabbit of Caerbannog' +kraken: + name: '$eventBossLevel &3Kraken' +krampus: + name: '$eventBossLevel &1Krampus' + locationMessage: '&cKrampus: $distance blocks away!' + spawnMessage: '&cKrampus has come to punish the naughty!' + deathMessage: '&aKrampus has been sent back to his realm to by $players!.' + escapeMessage: '&4There was nobody to punish!' +large_hopper: + name: '$eventBossLevel &dLarge Hopper' + locationMessage: '&cLarge Hopper: $distance blocks away!' + spawnMessage: '&cA large beast is hopping around!' + deathMessage: '&aThe Large Hopper was stopped by $players!' + escapeMessage: '&4The Large Hopper has jumped out of this world!' +large_hopper_mount: + name: '$eventBossLevel &aHopper' +lightning_fae: + name: '$eventBossLevel &e稲妻の妖精' +living_shadow: + name: '$eventBossLevel &7Living Shadow' + locationMessage: '&cLiving Shadow: $distance blocks away!' + spawnMessage: '&cLiving Shadow has appeared! Do not look it in the yes!' + deathMessage: '&aLiving Shadow has been turned into Dead Shadow by $players!.' + escapeMessage: '&4The Living Shadow saw nothing so it left!' +meme_boss: + name: '&2The Maestro' +meme_boss_reinforcement: + name: '&cFan' +merman: + name: '$eventBossLevel &1Merman' + locationMessage: '&cMerman: $distance blocks away!' + spawnMessage: '&cA Merman swims the oceans!' + deathMessage: '&aThe Merman was slain by $players!' + escapeMessage: '&4The Merman has retreated.' +monster_of_the_deep: + name: '$eventBossLevel &bMonster of the Deep' + locationMessage: '&cMonster of the Deep: $distance blocks away!' + spawnMessage: '&cSomething terrible swims the oceans!' + deathMessage: '&aMonster of the Deep has been slain by $players!' + escapeMessage: '&4The oceans are once again safe!' +moon_spider: + name: '$eventBossLevel &fMoon Spider' + locationMessage: '&cMoon Spider: $distance blocks away!' + spawnMessage: '&cA powerful arachnid has been spotted!' + deathMessage: '&aThe Moon Spider was slain by $players!' + escapeMessage: '&4The Moon Spider has left!' +moon_spider_summon: + name: '&fSilk Mender' +necromancer: + name: '$eventBossLevel &7Necromancer' + locationMessage: '&cNecromancer: $distance blocks away!' + spawnMessage: '&cA powerful evil Necromancer has entered this world!' + deathMessage: '&aThe Necromancer is no more thanks to $players!' + escapeMessage: '&4The Necromancer has disappeared.' +necromancer_summon_1: + name: '$eventBossLevel &fFiery Bones' +necromancer_summon_2: + name: '$eventBossLevel &bChilled Bones' +necromancer_summon_3: + name: '$eventBossLevel &8Charred Bones' +necronomicon_skeleton: + name: '$reinforcementLevel &7召喚されたスケルトン' +necronomicon_zombie: + name: '$reinforcementLevel &7召喚されたゾンビ' +netherite_golem: + name: '$eventBossLevel &8Netherite Golem' + locationMessage: '&cNetherite Golem: $distance blocks away!' + spawnMessage: '&cAn ancient golem has entered this world!' + deathMessage: '&aThe Netherite Golem was slain by $players!' + escapeMessage: '&4The Netherite Golem has left this world!' +nether_escapee: + name: '$eventBossLevel &6Nether Escapee' + locationMessage: '&cNether Escapee: $distance blocks away!' + spawnMessage: '&cA terrible foe has escaped the nether!' + deathMessage: '&aThe Nether Escapee was sent back to the nether by $players!' + escapeMessage: '&4The Nether Escapee has left this place!' +nether_hag: + name: '$eventBossLevel &4Nether Hag' + locationMessage: '&cNether Hag: $distance blocks away!' + spawnMessage: '&cAn evil hag walks the nether!' + deathMessage: '&aThe Nether Hag was slain by $players!' + escapeMessage: '&4The Nether Hag has vanished!' +nether_wasp: + name: '$eventBossLevel &6Nether Wasp' + locationMessage: '&cNether Wasp: $distance blocks away!' + spawnMessage: '&cTry not to get stung, a wasp roams the nether!' + deathMessage: '&aThe Nether Wasp was slain by $players!' + escapeMessage: '&4The Nether Wasp has decided to buzz off!' +nether_wasp_summon_1: + name: '$eventBossLevel &cHive Summoner' +nether_wasp_summon_2: + name: '$eventBossLevel &cHive Wasp' +nightwing: + name: '$eventBossLevel &cNightwing' + locationMessage: '&cNightwing: $distance blocks away!' + spawnMessage: '&cA bird of the night has appeared!' + deathMessage: '&aNightwing was stopped by $players!' + escapeMessage: '&4Nightwing has flown home.' +nightwing_summon: + name: '$eventBossLevel &cSmart Bomb' +nightwing_summon_1: + name: '$eventBossLevel &cSworn Protector' +night_crawler: + name: '$eventBossLevel &4Night Crawler' + locationMessage: '&cNight Crawler: $distance blocks away!' + spawnMessage: '&cSomething awful is crawling about!' + deathMessage: '&aThe Night Crawler has been slain by $players!' + escapeMessage: '&4The Night Crawler Undead has left!' +night_horder: + name: '$eventBossLevel &aNight Horder' + locationMessage: '&cNight Horder: $distance blocks away!' + spawnMessage: '&cA Night Horder has appeared! Slay him to loot his booty!' + deathMessage: '&aThe Night Horder has been plundered by $players!' + escapeMessage: '&4The Night Horder has escaped!' +oasis_10_old_bones: + name: '$normalLevel &fOld Bones' +oasis_10_surreptitious_scribe: + name: '$minibossLevel &7Surreptitious Scribe' +oasis_12_entombed_tenant: + name: '$normalLevel &7Entombed Tenant' +oasis_12_entombed_tenant_p2: + name: '$normalLevel &7Entombed Tenant' +oasis_12_sinister_siren: + name: '$minibossLevel &5Sinister Siren' +oasis_14_gnarly_grimace: + name: '$normalLevel &8Gnarly Grimace' +oasis_14_undead_drifter: + name: '$normalLevel &1Undead Drifter' +oasis_16_lesser_sentinel: + name: '$normalLevel &9Lesser Sentinel' +oasis_16_magical_magus: + name: '$normalLevel &3Magical Magus' +oasis_16_rancid_roamer: + name: '$normalLevel &8Rancid Roamer' +oasis_18_sly_sharpshooter: + name: '$normalLevel &eSly Sharpshooter' +oasis_18_stout_thaumaturge: + name: '$normalLevel &5Stout Thaumaturge' +oasis_18_tricky_treasure_hoarder: + name: '$normalLevel &dTricky Treasure Hoarder' +oasis_20_scheming_scribe: + name: '$minibossLevel &7Scheming Scribe' +oasis_20_septic_scribe: + name: '$minibossLevel &7Septic Scribe' +oasis_20_vampiric_sorcerer: + name: '$bossLevel &cVampiric Sorcerer' +oasis_20_wrapped_wraith: + name: '$normalLevel &8Wrapped Wraith' +oasis_20_wrapped_wraith_p2: + name: '$normalLevel &8Wrapped Wraith' +oasis_25_vampiric_warlock: + name: '$bossLevel &4Vampiric Warlock' +oasis_25_warlocks_spirit_summon: + name: '$reinforcementLevel &cWarlocks Spirit' +oasis_26_adept_sentinel: + name: '$normalLevel &1Adept Sentinel' +oasis_26_grim_grovetender: + name: '$normalLevel &aGrim Grovetender' +oasis_26_precarious_sniper: + name: '$normalLevel &3Precarious Sniper' +oasis_26_superior_sharpshooter: + name: '$normalLevel &3Superior Sharpshooter' +oasis_28_perilous_prophet: + name: '$normalLevel &3Perlious Prophet' +oasis_28_treacherous_treasure_hoarder: + name: '$normalLevel &dTreacherous Treasure Hoarder' +oasis_2_haunted_hauler: + name: '$normalLevel &9Haunted Hauler' +oasis_30_forsaken_soul: + name: '$reinforcementLevel &0Forsaken Soul' +oasis_30_lost_soul: + name: '$normalLevel Lost Soul' +oasis_30_parlous_preist: + name: '$minibossLevel &bParlous Preist' +oasis_30_seeker_of_the_staid: + name: '$normalLevel &cSeeker of the Staid' +oasis_30_wimpy_louse: + name: '$reinforcementLevel &8Loathing Louse' +oasis_32_loathing_louse: + name: '$normalLevel &8Loathing Louse' +oasis_32_skeletal_sniper: + name: '$normalLevel &9Skeletal Sniper' +oasis_34_grizly_grimace: + name: '$normalLevel &8Gnarly Grimace' +oasis_34_gruesome_grimace: + name: '$normalLevel &8Gruesome Grimace' +oasis_35_ice_eidolon: + name: '$reinforcementLevel &9Ice Eidolon' +oasis_35_light_of_darkness: + name: '$minibossLevel &9Light of Darkness' +oasis_36_cruel_cultist: + name: '$normalLevel &3Cruel Cultist' +oasis_36_cultists_cretins: + name: '$reinforcementLevel &3Cruel Cultist' +oasis_36_cultists_cretins_drowned: + name: '$reinforcementLevel &3Cruel Cultist' +oasis_36_dexterous_sentinel: + name: '$normalLevel &9Dexterous Sentinel' +oasis_36_grudging_grovetender: + name: '$normalLevel &aGrudging Grovetender' +oasis_36_parlous_sniper: + name: '$normalLevel &3Parlous Sniper' +oasis_36_rueful_roamer: + name: '$normalLevel &8Rueful Roamer' +oasis_36_spectral_magus: + name: '$normalLevel &3Spectral Magus' +oasis_38_poisonous_perch: + name: '$normalLevel &3Poisonous Perch' +oasis_38_traitorous_treasure_hoarder: + name: '$normalLevel &dTraitorous Treasure Hoarder' +oasis_40_chief_cultist: + name: '$minibossLevel &5Chief Cultist' +oasis_40_louse_lord: + name: '$minibossLevel &8Louse Lord' +oasis_40_pharaohs_scribe: + name: '$minibossLevel &7Pharaoh''s Scribe' +oasis_40_skeletal_stiff: + name: '$normalLevel &9Skeletal Stiff' +oasis_40_soaked_sacrifice: + name: '$reinforcementLevel &1Soaked Sacrifice' +oasis_40_solar_flare: + name: '$reinforcementLevel &eSolar Flare' +oasis_42_hexed_hauler: + name: '$normalLevel &9Hexed Hauler' +oasis_42_skeletal_sharpshooter: + name: '$normalLevel &9Skeletal Sharpshooter' +oasis_42_tyranical_treasure_hoarder: + name: '$normalLevel &dTyranical Treasure Hoarder' +oasis_42_tyranical_treasure_hoarder_phase_2: + name: '$normalLevel &dTyranical Treasure Hoarder' +oasis_45_golden_cast_autonomation: + name: '$reinforcementLevel &6Golden Cast Autonomation' +oasis_45_monumental_monstrosity: + name: '$bossLevel &bMonumental Monstrosity' +oasis_45_monumental_monstrosity_phase_2: + name: '$bossLevel &bMonumental Monstrosity' +oasis_45_monumental_monstrosity_phase_3: + name: '$bossLevel &6Monumental Monstrosity' +oasis_45_monumental_monstrosity_phase_4: + name: '$bossLevel &bMonumental Monstrosity' +oasis_45_oracle_of_knowledge: + name: '$minibossLevel &0Oracle of Knowledge' +oasis_45_shadow_of_knowledge_summon: + name: '$reinforcementLevel &8Shadow of Knowledge' +oasis_45_the_beacon: + name: '$minibossLevel &6The Beacon' +oasis_45_the_beacon_phase_2: + name: '$minibossLevel &6The Beacon' +oasis_45_the_beacon_phase_3: + name: '$minibossLevel &6The Beacon' +oasis_45_the_beacon_phase_4: + name: '$minibossLevel &6The Beacon' +oasis_46_pharaohs_sentinel: + name: '$normalLevel &9Pharaoh''s Sentinel' +oasis_4_cursed_desert_dweller: + name: '$normalLevel &eCursed Desert Dweller' +oasis_4_grotesque_grimace: + name: '$normalLevel &8Grotesque Grimace' +oasis_4_swamp_rat: + name: '$normalLevel &6Swamp Rat' +oasis_50_moneychanger_arrow: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_arrow_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_blindness: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_blindness_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_fire: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_fire_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_freeze: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_freeze_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_knockback: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_knockback_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_poison: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_poison_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_wither: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_wither_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_pharaohs_royal_guard: + name: '$reinforcementLevel &8Pharaoh''s Royal Guard' +oasis_50_the_foundry: + name: '$bossLevel &4The Foundry' +oasis_50_the_foundry_phase_2: + name: '$bossLevel &4The Foundry' +oasis_55_pharaoh_of_pestilence: + name: '$bossLevel &0Pharaoh of Pestilence' +oasis_6_dry_bones: + name: '$normalLevel &fDry Bones' +oasis_6_rotten_roamer: + name: '$normalLevel &8Rotten Roamer' +oasis_8_mythical_magus: + name: '$normalLevel &3Mythical Magus' +oasis_8_tough_thaumaturge: + name: '$normalLevel &5Tough Thaumaturge' +oasis_8_troublesome_treasure_hoarder: + name: '$normalLevel &dTroublesome Treasure Hoarder' +okami: + name: '$eventBossLevel &cOkami' + locationMessage: '&cOkami: $distance blocks away!' + spawnMessage: '&cA god has awakened!' + deathMessage: '&a$players has fought with a god and won!.' + escapeMessage: '&4Okami has left!' +okami_p2: + name: '$eventBossLevel &cOkami' +okami_p3: + name: '$eventBossLevel &cOkami' +omega_wolf: + name: '$reinforcementLevel &7Omega Wolf' +pillager_caravan_beast: + name: '$reinforcementLevel &cCaravan Beast' +pillager_caravan_guard: + name: '$reinforcementLevel &cCaravan Guard' +pillager_caravan_leader: + name: '$eventBossLevel &cPillager Caravan Leader' + locationMessage: '&cPillager Caravan: $distance blocks away!' + spawnMessage: '&cA pillager caravan has been sighted!' +primis_acolyte_brute: + name: '$normalLevel &bAcolyte Brute' +primis_acolyte_forest_brute: + name: '$normalLevel &bElf Bandit Brute' +primis_acolyte_forest_brute_with_watch: + name: '$normalLevel &bElf Bandit Brute' +primis_acolyte_forest_sharpshooter: + name: '$normalLevel &bElf Bandit Ranger' +primis_acolyte_forest_summoner: + name: '$normalLevel &bElf Bandit Summoner' +primis_acolyte_forest_summoner_heirloom_guardian: + name: '$normalLevel &bElf Bandit Mage' +primis_acolyte_guard_1: + name: '$normalLevel &bAcolyte Guard' + onDamagedMessages: + - You can't enter! + - The mage won't allow this! + - Leave this place! + - The mage protects this place! + - Foolishness! + - Begone! + deathMessage: '[Acolyte Guard] You are blind to the truth, the tower''s mage sees all!' +primis_acolyte_guard_2: + name: '$normalLevel &bAcolyte Guard' + onDamagedMessages: + - You can't enter! + - The mage won't allow this! + - Leave this place! + - The mage protects this place! + - Foolishness! + - Begone! + deathMessage: '[Acolyte Guard] You shall not pass, the mage in the tower will not allow it!' +primis_acolyte_sharpshooter: + name: '$normalLevel &bAcolyte Ranger' +primis_aggressive_llama: + name: '$normalLevel &6Aggressive LLama' +primis_angry_goat: + name: '$normalLevel &6Angry Goat' +primis_beta_feral_wolf: + name: '$reinforcementLevel &8Beta Feral Wolf' +primis_blood_temple_blood_golem: + name: '$normalLevel &cBlood Golem' +primis_blood_temple_charred_construct: + name: '$normalLevel &cCharred Construct' +primis_blood_temple_conjured_flame: + name: '$normalLevel &cConjured Flame' +primis_blood_temple_eradicator: + name: '$normalLevel &cEradicator' +primis_blood_temple_fire_conjurer: + name: '$normalLevel &cFire Conjurer' +primis_blood_temple_flame_elemental: + name: '$normalLevel &cFlame Elemental' +primis_catacomb_nemus_to_redwood_archer: + name: '$normalLevel &8Catacomb Archer' +primis_catacomb_nemus_to_redwood_golem: + name: '$normalLevel &bCatacomb Golem' +primis_catacomb_nemus_to_redwood_necromancer: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_nemus_to_redwood_necromancer_p1: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_nemus_to_redwood_necromancer_p2: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_nemus_to_redwood_soul_reinforcement: + name: '$reinforcementLevel &8Catacomb Soul' +primis_catacomb_nemus_to_redwood_swordsman: + name: '$normalLevel &8Catacomb Swordsman' +primis_catacomb_pontis_to_ice_archer: + name: '$normalLevel &8Catacomb Archer' +primis_catacomb_pontis_to_ice_golem: + name: '$normalLevel &bCatacomb Golem' +primis_catacomb_pontis_to_ice_necromancer_p1: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_pontis_to_ice_necromancer_p2: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_pontis_to_ice_swordsman: + name: '$normalLevel &8Catacomb Swordsman' +primis_catacomb_trio_archer: + name: '$normalLevel &8Catacomb Archer' +primis_catacomb_trio_golem: + name: '$normalLevel &bCatacomb Golem' +primis_catacomb_trio_necromancer_p1: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_necromancer_p2: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_necromancer_summon: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_swordsman: + name: '$normalLevel &8Catacomb Swordsman' +primis_crazed_rabbit: + name: '$normalLevel &cCrazed Rabbit' +primis_crystaline_summoner_p1: + name: '$normalLevel &3Crystaline Summoner' +primis_crystaline_summoner_p2: + name: '&3Crystaline Summoner' +primis_earth_temple_golem: + name: '$normalLevel &fAnimated Clay' +primis_emerald_eater: + name: '$normalLevel &aEmerald Eater' +primis_farmstead_lighthouse_keeper: + name: '$bossLevel &6The Lighthouse Keeper' + questLore: + - Something is deeply wrong with my husband. + - He used to be a loving and caring husband and father, + - but in recent times he has been focusing on documents he found in the basement. + - He said it was for important research, something that could change the world. + - I should've told him to stop when I saw how obsessed he was becoming. + - He did... something... to the lighthouse - and + - I fear the lighthouse has done something to him, too. + - It morphed him into some kind of monster. He no longer recognizes us, + - and has even attacked us when we tried to approach him. + - At night, we can't sleep due to the wailing sounds + - coming from the &dLighthouse's Basement&f. + - He is suffering, and we are powerless to help him. + - I know it's asking a lot, but do you think you could help us? + questAcceptDialog: + - '&a[Amavit]&f Thank you so much for accepting our request. I hope with all my heart you succeed.' + - '&7&oI should go to the &dBasement of the Lighthouse&7&o and put the &cLighthouse Keeper&7&o out of his misery.' + questCompleteMessage: + - '&a[Amavit]&f I heard it - so it is done? Did he suff- no, forget it, I don''t want to know.' + - '&fIt seems like the lighthouse started emitting an odd light when you... dealt with the issue. We need to make sure it is not an issue.' + - '&7&oSeems like &aAmavit&7&o has another task for me. I should talk to her.' +primis_feral_alpha_wolf: + name: '$normalLevel &8Feral Alpha Wolf' +primis_feral_wolf: + name: '$normalLevel &8Feral Wolf' +primis_feral_wolf_scout: + name: '$normalLevel &8Feral Wolf Scout' +primis_gladius_admiral: + name: '$normalLevel &fInvading Admiral' +primis_gladius_assassin: + name: '$normalLevel &fInvading Assassin' +primis_gladius_barkeep_p1: + name: '$minibossLevel &6The Barkeep' +primis_gladius_barkeep_p2: + name: '$minibossLevel &6The Barkeep' +primis_gladius_captain: + name: '$normalLevel &fInvading Captain' +primis_gladius_champion_p1: + name: '$bossLevel &6Fallen Champion Natus' +primis_gladius_champion_p2: + name: '$bossLevel &6Fallen Champion Natus' +primis_gladius_gatekeeper_p1: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_gatekeeper_p2: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_gatekeeper_pontis_p1: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_gatekeeper_pontis_p2: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_longbowman: + name: '$normalLevel &fInvading Longbowman' +primis_gladius_mariner: + name: '$normalLevel &fInvading Mariner' +primis_gladius_mariner_quest: + name: '$normalLevel &fInvading Mariner' +primis_gladius_monk_p1: + name: '$minibossLevel &6The Monk' +primis_gladius_monk_p2: + name: '$minibossLevel &6The Monk' +primis_gladius_raider: + name: '$normalLevel &fInvading Raider' +primis_gladius_swordsman: + name: '$normalLevel &fInvading Swordsman' +primis_gladius_undead_buccaneer: + name: '$normalLevel &fUndead Buccaneer' +primis_gladius_undead_captain: + name: '$minibossLevel &fUndead Captain' +primis_gladius_undead_swashbuckler: + name: '$normalLevel &fUndead Swashbuckler' +primis_gladius_underlord: + name: '$minibossLevel &0Underlord' +primis_gladius_villager: + name: '$normalLevel &fUndead Villager' +primis_goblin_fowl_warrior: + name: '$minibossLevel &6Cursed Fowl Goblin' +primis_goblin_grunt: + name: '$normalLevel &6Goblin Grunt' +primis_goblin_king: + name: '$bossLevel &2Goblin King' +primis_goblin_piranah: + name: '$normalLevel &9Goblin Piranah' +primis_goblin_spearman: + name: '$normalLevel &6Goblin Spearman' +primis_goblin_warrior: + name: '$normalLevel &6Goblin Warrior' +primis_ice_mage: + name: '$minibossLevel &9Ice Mage' +primis_ice_mage_p2: + name: '$minibossLevel &bIce Mage' + deathMessage: '&8&oYou hear the sound of a nearby ice wall cracking and breaking...' +primis_ice_village_annoyed_goat: + name: '$normalLevel &bAnnoyed Goat' +primis_ice_village_bell_banger: + name: '$minibossLevel &6Undead' + questLore: + - Do you see that? There, look at that bell + - tower in the village. + - You see it too, right? The feller there + - banging his head on the bell. + - I am pretty sure that's what's going on, + - unless my vision is failing me. + - Could you go investigate and report back + - to me what you found. + questAcceptDialog: + - '&a[Eleusium Festus]&f What is going on...' + - '&7&oI should go see what is happening at the &d&oIce Village Bell Tower&7&o.' + questCompleteMessage: + - '&a[Eleusium Festus]&f You found an undead banging their head on the bell...' + - Well now I have heard it all... +primis_ice_village_escaped_prisoner: + name: '$normalLevel &bEscaped Prisoner' +primis_ice_village_fallen_trial_warrior_summon: + name: '$reinforcementLevel &7Enslaved Soul' +primis_ice_village_frost_fur_ursus: + name: '$normalLevel &9Frost Fur Ursus' +primis_ice_village_frost_simulacrum: + name: '$normalLevel &3Frost Simulacrum' +primis_ice_village_ice_simulacrum: + name: '$reinforcementLevel &3Ice Simulacrum' +primis_ice_village_manifested_nightmare: + name: '$normalLevel &bManifested Nightmare' +primis_ice_village_meek_customer: + name: '$normalLevel &cMeek Customer' +primis_ice_village_naughty_customer: + name: '$normalLevel &cNaughty Customer' +primis_ice_village_screecher_bomb_summon: + name: '$reinforcementLevel &dScreecher Droppings' +primis_ice_village_sky_screecher: + name: '$normalLevel &bSky Screecher' +primis_ice_village_the_ice_aspect: + name: '$minibossLevel &9Ice Aspect' +primis_ice_village_the_ice_elemental: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_the_ice_elemental_p2: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_the_ice_elemental_p3: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_trial_of_ice_minor_ice_elemental: + name: '$minibossLevel &bMinor Ice Elemental' +primis_ice_village_wolf_summon: + name: '$reinforcementLevel &cTamed Wolf' +primis_minor_ice_elemental: + name: '$bossLevel &1Minor Ice Elemental' +primis_minor_ice_elemental_p2: + name: '$bossLevel &1Minor Ice Elemental' +primis_mountain_pass_guardian_p1: + name: '$bossLevel &6The Guardian' +primis_mountain_pass_guardian_p2: + name: '$bossLevel &6The Guardian' +primis_mountain_pass_healer: + name: '$reinforcementLevel &fRepairtron' +primis_nasty_worm: + name: '$normalLevel &fNasty Worm' +primis_ogre_mines_mite: + name: '$normalLevel &fMine Mite' +primis_ogre_mines_ogre_archer: + name: '$minibossLevel &fOgre Archer' +primis_ogre_mines_ogre_magi: + name: '$minibossLevel &fOgre Magi' +primis_ogre_mines_ogre_warrior: + name: '$minibossLevel &fOgre Warrior' +primis_ogre_mines_undead_archer: + name: '$normalLevel &fUndead Archer' +primis_ogre_mines_undead_swordsman: + name: '$normalLevel &fUndead Swordsman' +primis_pontis_beast_cod: + name: '$minibossLevel &dBeast Cod Furiosa' +primis_pontis_beast_crawler: + name: '$minibossLevel &dCrawler Beast Megdun' +primis_pontis_beast_impaler: + name: '$minibossLevel &dImpaler Beast Uladzimir' +primis_pontis_counselor_guard_left_1: + name: '$normalLevel &4Corrupt Counselor Guard' +primis_pontis_counselor_guard_left_2: + name: '$normalLevel &4Warped Counselor Guard' + deathMessage: '&5[Counselor Machiavelli]&f So that fool must have finally figured it out...' +primis_pontis_counselor_guard_left_3: + name: '$normalLevel &4Uplifted Experiment' + deathMessage: '&5[Counselor Machiavelli]&f You''re stronger than I thought.' +primis_pontis_counselor_guard_left_4: + name: '$normalLevel &4Abomination' + deathMessage: '&5[Counselor Machiavelli]&f My soul magic will protect me!!!' +primis_pontis_counselor_guard_mid: + name: '$normalLevel &4Corrupt Counselor Guard' + deathMessage: '&8[Counselor Machiavelli]&f I see that we have guests!...' +primis_pontis_counselor_guard_right_1: + name: '$normalLevel &4Corrupt Counselor Guard' +primis_pontis_counselor_guard_right_2: + name: '$normalLevel &4Warped Counselor Guard' +primis_pontis_counselor_guard_right_3: + name: '$normalLevel &4Uplifted Experiment' +primis_pontis_counselor_guard_right_4: + name: '$normalLevel &4Abomination' +primis_pontis_counselor_twisted_copy: + name: '$reinforcementLevel &4Twisted Copy' +primis_pontis_mille_arena_air_elemental: + name: '$minibossLevel &fAir Elemental' +primis_pontis_mille_arena_human_wave_4: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_6: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_7: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_8: + name: '$normalLevel &4Dominated Human Warrior' +primis_pontis_mille_arena_human_worshiper: + name: '$normalLevel &4Elemental Worshiper' +primis_pontis_mille_arena_minor_air_elemental: + name: '$normalLevel &fMinor Air Elemental' +primis_pontis_mille_arena_minor_earth_elemental: + name: '$normalLevel &7Minor Earth Elemental' +primis_pontis_mille_arena_minor_fire_elemental: + name: '$normalLevel &eMinor Fire Elemental' +primis_pontis_mille_arena_minor_fire_elemental_prime: + name: '$normalLevel &eMinor Fire Elemental' +primis_pontis_mille_arena_minor_water_elemental: + name: '$normalLevel &bMinor Water Elemental' +primis_pontis_mille_arena_primal_air_wisp: + name: '$normalLevel &fPrimal Air Wisp' +primis_pontis_mille_arena_primal_air_wisp_2: + name: '$normalLevel &fPrimal Air Wisp' +primis_pontis_mille_arena_primal_earth_wisp: + name: '$normalLevel &7Primal Earth Wisp' +primis_pontis_mille_arena_primal_earth_wisp_2: + name: '$normalLevel &7Primal Earth Wisp' +primis_pontis_mille_arena_primal_fire_wisp: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_fire_wisp_2: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_fire_wisp_3: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_water_wisp: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_water_wisp_2: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_water_wisp_3: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_wisp: + name: '$normalLevel &5Primal Wisp' +primis_pontis_mille_arena_water_elemental: + name: '$minibossLevel &1Water Elemental' +primis_pontis_mille_counselor_p1: + name: '$minibossLevel &fCounselor Machiavelli' +primis_pontis_mille_counselor_p2: + name: '$minibossLevel &fCounselor Machiavelli' +primis_pontis_mille_counselor_p3: + name: '$minibossLevel &fCounselor Machiavelli' +primis_pontis_mille_fields_babe_razorback: + name: '$normalLevel &2Babe Razorback' +primis_pontis_mille_fields_bird: + name: '$normalLevel &fFeathered Field Rat' +primis_pontis_mille_fields_bird_nightmare: + name: '$normalLevel &dFeathered Nightmare Rat' +primis_pontis_mille_fields_bubba: + name: '$minibossLevel &cBig ol'' Bubba' +primis_pontis_mille_fields_field_rat: + name: '$normalLevel &fField Rat' +primis_pontis_mille_fields_juvenile_razorback: + name: '$normalLevel &2Juvenile Razorback' +primis_pontis_mille_fields_longhorn: + name: '$normalLevel &4Fields Longhorn' +primis_pontis_mille_fields_mature_razorback: + name: '$normalLevel &2Mature Razorback' +primis_pontis_mille_fields_shorthorn: + name: '$normalLevel &6Fields Shorthorn' +primis_pontis_mille_fields_two_legged_terror: + name: '$normalLevel &2Two Legged Terror' +primis_pontis_mille_fields_well_fed_rat: + name: '$normalLevel &fWell Fed Rat' +primis_pontis_mille_rat: + name: '$normalLevel &fRat' +primis_quartz_elemental: + name: '$bossLevel &dQuartz Elemental' +primis_quartz_elemental_p2: + name: '$bossLevel &dQuartz Elemental' +primis_redwood_barracuda: + name: '$normalLevel &3Redwood Barracuda' +primis_redwood_fruity_hound: + name: '$normalLevel &2Fruity Hound' +primis_redwood_rockhound: + name: '$normalLevel &7Redwood Rockhound' +primis_redwood_werewolf_grunt: + name: '$normalLevel &cRedwood Werewolf Grunt' +primis_redwood_werewolf_packleader: + name: '$normalLevel &4Redwood Werewolf Packleader' +primis_river_guardian: + name: '$normalLevel &5River Guardian' +primis_roofed_forest_cave_spider: + name: '$normalLevel &6Nest Crawler' +primis_roofed_forest_cave_spider_boss: + name: '$bossLevel &eBrood Mother' +primis_roofed_forest_spider: + name: '$normalLevel &6Forest Crawler' +primis_roofed_forest_spider_reinforcement: + name: '$reinforcementLevel &6Nest Brood' +primis_sea_monster: + name: '$bossLevel &dSea Monster' +primis_sewer_noxious_ninja: + name: '$normalLevel &2Noxious Ninja' +primis_sewer_spore_spreader: + name: '$normalLevel &4Spore Spreader' +primis_sewer_the_shredder_p1: + name: '$bossLevel &5The Shredder' +primis_sewer_the_shredder_p2: + name: '$bossLevel &5The Shredder' +primis_storm_temple_axeman: + name: '$normalLevel &dStorm Temple Axeman' +primis_storm_temple_bowman: + name: '$normalLevel &dStorm Temple Bowman' +primis_storm_temple_kuzco: + name: '$normalLevel &6Kuzco' +primis_storm_temple_minor_storm_elemental: + name: '$normalLevel &5Minor Storm Elemental' +primis_storm_temple_storm_elemental: + name: '$bossLevel &1Storm Elemental' +primis_storm_temple_storm_elemental_p2: + name: '$bossLevel &1Storm Elemental' +primis_storm_temple_storm_elemental_p3: + name: '$bossLevel &1Storm Elemental' +primis_storm_temple_summoner: + name: '$normalLevel &5Storm Temple Summoner' +primis_terravilla_alpha_razorback: + name: '$minibossLevel &2Alpha Razorback' +primis_terravilla_alpha_razorback_p2: + name: '$minibossLevel &2Alpha Razorback' +primis_terravilla_bar_brawler: + name: '$normalLevel &6Bar Brawler' + onDamagedMessages: + - That all ya got! + - I did not even feel that! + - Why...you! + - I will show you! + - Who the heck are you! + - TAKE THAT! +primis_terravilla_earth_elemental: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_earth_elemental_p2: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_earth_elemental_p3: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_regular_fish: + name: '$normalLevel &bRegular Fish' +primis_terravilla_robber_gladiator: + name: '$normalLevel &bRobber Gladiator' +primis_terravilla_robber_slugger: + name: '$normalLevel &bSlugger' +primis_undead_archer: + name: '$normalLevel &fUndead Archer' +primis_undead_climber: + name: '$normalLevel &0Undead Climber' +primis_undead_grappler: + name: '$normalLevel &3Undead Grappler' +primis_undead_guardian: + name: '$normalLevel &bUndead Guardian' +primis_undead_swordsman: + name: '$normalLevel &0Undead Swordsman' +pufferfish: + name: '$eventBossLevel &3Pufferfish' + locationMessage: '&cPufferfish: $distance blocks away!' + spawnMessage: '&cA puffed fish is swimming in the oceans!' + deathMessage: '&aThe Pufferfish reign has been ended by $players!' + escapeMessage: '&4The Pufferfish has swam away!' +pufferfish_summon_1: + name: '$eventBossLevel &bPooferfish' +pufferfish_summon_2: + name: '$eventBossLevel &bPooperfish' +pufferfish_summon_3: + name: '$eventBossLevel &bPooderfish' +pufferfish_summon_4: + name: '$eventBossLevel &bPudderfish' +queen_bee: + name: '$eventBossLevel &6Queen Bee' +rabbit_wolf_1: + name: '$eventBossLevel &cFlame Wolf' + locationMessage: '&cFlame: $distance blocks away!' + spawnMessage: '&cA powerful duo has come to this world!' + deathMessage: '&aThe Wolf and the Rabbit were stopped by $players!' + escapeMessage: '&4The Wolf and the Rabbit have left this place!' +rabbit_wolf_2: + name: '$eventBossLevel &cLightning Rabbit' + locationMessage: '&cLightning: $distance blocks away!' + deathMessage: '&aThe Wolf and the Rabbit were stopped by $players!' + escapeMessage: '&4The Wolf and the Rabbit have left this place!' +raug: + name: '$reinforcementLevel &4ラウグ' +regular_hoglin: + name: '$eventBossLevel &4Regular Hoglin' + locationMessage: '&cRegular Hoglin: $distance blocks away!' + spawnMessage: '&cA Regular Hoglin has arrived! Nothing special about this Hoglin!' + deathMessage: '&aRegular Hoglin was slain by $players!.' + escapeMessage: '&4The Regular Hoglin has left!' +rotting_diver: + name: '$eventBossLevel &bRotting Diver' + locationMessage: '&cRotting Diver: $distance blocks away!' + spawnMessage: '&cA foul corpse floats in the waters!' + deathMessage: '&aThe Rotting Diver was sent to the depths by $players!' + escapeMessage: '&4The Rotting Diver floated away!' +salty_corpse: + name: '$eventBossLevel &bSalty Corpse' + locationMessage: '&cSalty Corpse: $distance blocks away!' + spawnMessage: '&cSomething awful has floated up to the surface!' + deathMessage: '&aThe Salty Corpse was sent back to the depths by $players!' + escapeMessage: '&4The Salty Corpse has left!' +skeleton_knight: + name: '$eventBossLevel &fSkeleton Knight' + locationMessage: '&cSkeleton Knight: $distance blocks away!' + spawnMessage: '&cThe undead have sent a Skeleton Knight into the night!' + deathMessage: '&aThe Skeleton Knight was slain by $players!' + escapeMessage: '&4The Skeleton Knight had to retreat!' +sky_archer: + name: '$eventBossLevel &aSky Archer' + locationMessage: '&cSky Archer: $distance blocks away!' + spawnMessage: '&cA Sky Archer has entered this world! Bring your bow!' + deathMessage: '&aThe Sky Archer got sniped by $players!' + escapeMessage: '&4The Sky Archer has flown away!' +sky_archer_mount: + name: '$eventBossLevel &aSky Steed' +smallstack: + name: '$eventBossLevel &bSmallstack Top' + locationMessage: '&cSmallstack: $distance blocks away!' + spawnMessage: '&cA Smallstack is roaming the wilds!' + deathMessage: '&aThe Smallstack was unstacked by $players!' + escapeMessage: '&4The Smallstack has left!' +smallstack_1: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_2: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_3: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_4: + name: '$eventBossLevel &bSmallstack Bottom' +smallstack_5: + name: '$eventBossLevel &bSmallstack Bottom' +smallstack_6: + name: '$eventBossLevel &bSmallstack Carrier' +snoopy: + name: '&6{&4☠&6} &fスヌーピー' + onDamageMessages: + - ワン! + onDamagedMessages: + - ワン! + spawnMessage: '&a極めて稀なスヌーピーが目撃されました!' +sorcerer_supreme: + name: '$eventBossLevel &5Sorcerer Supreme' + locationMessage: '&cSorcerer Supreme: $distance blocks away!' + spawnMessage: '&cAn almighty Sorcerer has phased into this world!' + deathMessage: '&aThe Sorcerer Supreme was defeated by $players!' + escapeMessage: '&4The Sorcerer Supreme has left this world!' +sorcerer_supreme_summon: + name: '$eventBossLevel &5Eternal Servant' +spider_knight: + name: '$eventBossLevel &aDwarven Knight' + locationMessage: '&cDwarven Knight: $distance blocks away!' + spawnMessage: '&cA Knight has come to challenge the heroes of this place!' + deathMessage: '&aThe Knight was defeated by $players!' + escapeMessage: '&4The Knight has left this place!' +spider_knight_mount: + name: '$eventBossLevel &aFaithful Steed' +summonable_wolf: + name: '$normalLevel ウォルフィ' + onDamageMessages: + - ワン! + onDamagedMessages: + - ワン! +super_mite: + name: '$eventBossLevel &dSuper Mite' + locationMessage: '&cSuper Mite: $distance blocks away!' + spawnMessage: '&cA trouble maker appears!' + deathMessage: '&aThe mite could not handle a fight with $players!.' + escapeMessage: '&4The Super Mite left out of boredom!' +super_mite_summon: + name: '$eventBossLevel &dFriendmite' +suspicious_phantom: + name: '$eventBossLevel &eSuspicious Phantom' + locationMessage: '&cSuspicious Phantom: $distance blocks away!' + spawnMessage: '&cA Suspicious Phantom was sighted in the skies!' + deathMessage: '&aThe Phantom was put to bed by $players!' + escapeMessage: '&4The Suspicious Phantom has left!' +suspicious_phantom_summon: + name: '$eventBossLevel &cFlamer' +suspicious_phantom_summon_1: + name: '$eventBossLevel &cFireballer' +test_boss: + name: '$eventBossLevel &6Test boss' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Test Boss has been debugged!' + - '&c&l 1位: $damager1name &c($damager1damage ダメージ)' + - '&6&l 2位: $damager2name &6($damager2damage ダメージ)' + - '&e&l 3位: $damager3name &e($damager3damage ダメージ)' + - '&a倒したプレイヤー: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - ヒットしました! + onDamagedMessages: + - ヒットしました! + locationMessage: 'テストエンティティ: $distance' + spawnMessage: テストボスがスポーンしました! + deathMessage: テストボスが $players に倒された! + escapeMessage: テストボスエンティティが逃げました! +airship_tier_45_knockback: + name: '$normalLevel &2Bow Bowsman' +airship_tier_45_witherblind: + name: '$normalLevel &aNoxious Bowsman' +airship_tier_50_powder_monkeys: + name: '$normalLevel &7Powder Monkey' +airship_tier_50_scourge: + name: '$normalLevel &8Swashbuckling Scourge' +airship_tier_60_mess_hall_mate: + name: '$normalLevel &bMess Hall Mate' +airship_tier_65_boatswain_boss: + name: '$normalLevel &cBoatswain Boss' +airship_tier_65_bodyguard: + name: '$normalLevel &eBuccaneer Bodyguard' +airship_tier_65_silverfish: + name: '$normalLevel &8Ship Rat' +airship_tier_65_silverfish_reinforcement: + name: '$reinforcementLevel &8Ship Mouse' +airship_tier_70_miniboss: + name: '$minibossLevel Quark the Quartermaster ' +airship_tier_70_miniboss_2: + name: '$minibossLevel &6Living Boiler' +airship_tier_70_miniboss_wayfinder: + name: '$minibossLevel &3Wharf Wayfinder' +airship_tier_75_boss: + name: '$bossLevel &4Captain Davey' + deathMessages: + - '&e&l---------------------------------------------' + - '&9Captain Davey was put to rest! ... again.' + - '&c&l 1位: $damager1name &c($damager1damage ダメージ)' + - '&6&l 2位: $damager2name &6($damager2damage ダメージ)' + - '&e&l 3位: $damager3name &e($damager3damage ダメージ)' + - '&a倒したプレイヤー: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Captain Davey: $distance' + spawnMessage: '&4Captain Davey haunts the skies once more!' + deathMessage: '$players &ahave made &4Captain Davey &ashuffle off his mortal coil!' + escapeMessage: '&6Captain Davey has moved on the haunt another day!' +binder_of_worlds_phase_1: + name: '$eventBossLevel &eBinder of Worlds' + spawnMessage: '&5The binder of worlds approaches!' +binder_of_worlds_phase_1_melee_miniboss: + name: '$reinforcementLevel &9Reality Uprooter' +binder_of_worlds_phase_1_melee_reinforcement: + name: '$reinforcementLevel &8Reality Waster' +binder_of_worlds_phase_1_parkour_reinforcement: + name: '$reinforcementLevel &2Reality Harbinger' +binder_of_worlds_phase_1_ranged_miniboss: + name: '$reinforcementLevel &3Reality Ruiner' +binder_of_worlds_phase_1_ranged_reinforcement: + name: '$reinforcementLevel &6Reality Ruiner' +binder_of_worlds_phase_1_status_miniboss: + name: '$reinforcementLevel &1Reality Wrencher' +binder_of_worlds_phase_1_status_reinforcement: + name: '$reinforcementLevel &7Reality Rupturer' +binder_of_worlds_phase_2: + name: '$eventBossLevel &eBinder of Worlds' +binder_of_worlds_phase_3: + name: '$eventBossLevel &eBinder of Worlds' +binder_of_worlds_phase_3_shulker_reinforcement: + name: '$reinforcementLevel &5Reality Riftrender' +binder_of_worlds_phase_4: + name: '$eventBossLevel &eBinder of Worlds' + deathMessages: + - '&e&l---------------------------------------------' + - '&9The binder is bound to this mortal plane no more!' + - '&c&l 1位: $damager1name &c($damager1damage ダメージ)' + - '&6&l 2位: $damager2name &6($damager2damage ダメージ)' + - '&e&l 3位: $damager3name &e($damager3damage ダメージ)' + - '&a倒したプレイヤー: $players' + - '&e&l---------------------------------------------' +catacombs_tier_10_miniboss: + name: '$minibossLevel &7Terragog' +catacombs_tier_15_boss: + name: '$bossLevel &6The Rattler' + deathMessages: + - '&e&l---------------------------------------------' + - '&9The Rattler rattled away!' + - '&c&l 1位: $damager1name &c($damager1damage ダメージ)' + - '&6&l 2位: $damager2name &6($damager2damage ダメージ)' + - '&e&l 3位: $damager3name &e($damager3damage ダメージ)' + - '&a倒したプレイヤー: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Feeling.. rattled? + - Show me your skeleton! + - You're boned! + - Your calcium is weak! + onDamagedMessages: + - I felt that in my bones! + - I've got a bone to pick with you! + - Doot doot mr skeltal + - I need calcium! + locationMessage: 'The Rattler: $distance blocks away!' + spawnMessage: '&6The Rattler rises!' + deathMessage: '&aThe Rattler has been defeated by $players!' +catacombs_tier_15_mimic_boss: + name: '$bossLevel &6The Forgotten' +catacombs_tier_15_reinforcement: + name: '$reinforcementLevel &eUnturned' +catacombs_tier_5_evoker_guard_2: + name: '$normalLevel &7Catacomb Guard' + onDamageMessages: + - No entry! + - Entry is forbidden! +catacombs_tier_5_illusioner_guard_1: + name: '$normalLevel &7Catacomb Guard' + onDamageMessages: + - No entry! + - Entry is forbidden! +colosseum_tier_70_boss_mount: + name: '$bossLevel &4Pit Lord' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Pit Lord is no more!' + - '&c&l 1位: $damager1name &c($damager1damage ダメージ)' + - '&6&l 2位: $damager2name &6($damager2damage ダメージ)' + - '&e&l 3位: $damager3name &e($damager3damage ダメージ)' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + deathMessage: '&2The Pit Lord has been vanquished by $players!' +colosseum_tier_70_boss_p1: + name: '$bossLevel &cPit Master' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Pit Master has fallen!' + - '&c&l 1位: $damager1name &c($damager1damage ダメージ)' + - '&6&l 2位: $damager2name &6($damager2damage ダメージ)' + - '&e&l 3位: $damager3name &e($damager3damage ダメージ)' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Pit Master: $distance blocks away!' + spawnMessage: '&4The Pit Master charges into battle once more!' + deathMessage: '&2The Pit Master has been slain by $players!' +colosseum_tier_70_boss_p2: + name: '$bossLevel &cPit Master' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Pit Master has fallen!' + - '&c&l 1位: $damager1name &c($damager1damage ダメージ)' + - '&6&l 2位: $damager2name &6($damager2damage ダメージ)' + - '&e&l 3位: $damager3name &e($damager3damage ダメージ)' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Pit Master: $distance blocks away!' + deathMessage: '&2The Pit Master has been slain by $players!' +colosseum_tier_70_boss_reinforcements_p1: + name: '$reinforcementLevel &6Gladiator' +colosseum_tier_70_boss_reinforcements_p2: + name: '$reinforcementLevel &6Gladiator' +colosseum_tier_70_gladiator: + name: '$normalLevel &6Gladiator' +colosseum_tier_70_mount_reinforcements: + name: '$reinforcementLevel &cPit Beast' +dark_cathedral_tier_75_boss: + name: '$bossLevel &4Cultist of Cthulhu' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The summoning has been interrupted!' + - '&c&l 1位: $damager1name &c($damager1damage ダメージ)' + - '&6&l 2位: $damager2name &6($damager2damage ダメージ)' + - '&e&l 3位: $damager3name &e($damager3damage ダメージ)' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Fools! + - Chtulhu R'lyeh! + - None can defeat Chtulhu! + - Stare into the abyss... + locationMessage: 'Cultist of Cthulhu: $distance blocks away' + spawnMessage: '&cA dark cultist is summoning Cthulhu!' + deathMessage: '&2The summoning has been thwarted $players!' + escapeMessage: '&2The cultist has completed the summoning!' +dark_cathedral_tier_75_reinforcement: + name: '$reinforcementLevel Follower of Cthulhu' + onDamageMessages: + - Cthulhu R'lyeh + onDamagedMessages: + - Cthulhu R'lyeh +darkspire_level_100_berserker_brute: + name: '$normalLevel &7Underworld Berserker' +darkspire_level_100_berserker_reanimated: + name: '$normalLevel &fReanimated Underworld Berserker' +darkspire_level_100_blacksmith_brute: + name: '$normalLevel &eSmoldering Goldsmith' +darkspire_level_100_endermite: + name: '$normalLevel &5Voidcrawler' +darkspire_level_100_marksman_piglin: + name: '$normalLevel &9Foolish Marksman' +darkspire_level_100_sentry_brute: + name: '$normalLevel &3Darkguard Sentry' +darkspire_level_100_summon_blaze: + name: '$reinforcementLevel &cHellspawn' +darkspire_level_100_summon_evoker: + name: '$reinforcementLevel &cFalse Hellraiser' +darkspire_level_100_summon_ghast: + name: '$reinforcementLevel &7Maalkvvhar' +darkspire_level_100_summon_husk: + name: '$reinforcementLevel &cOroxak''s Corrupted' +darkspire_level_100_summon_ravager: + name: '$reinforcementLevel &cEerbix the Fallen' +darkspire_level_100_summon_skeleton: + name: '$reinforcementLevel &cRibling' +darkspire_level_110_berserker_reanimated: + name: '$normalLevel &7Reanimated Underworld Berserker' +darkspire_level_110_marksman_reanimated: + name: '$normalLevel &9Reanimated Foolish Marksman' +darkspire_level_110_necromancer_evoker: + name: '$normalLevel &8Black-Hearted Enchanter' +darkspire_level_110_sentry_reanimated: + name: '$normalLevel &3Reanimated Darkguard Sentry' +darkspire_level_110_stationary_stray: + name: '$normalLevel &6Hewn Watchman' +darkspire_level_120_miniboss_evoker: + name: '$minibossLevel &4Hellraiser' +darkspire_level_120_miniboss_illusioner: + name: '$minibossLevel &4Maalkv' +darkspire_level_120_miniboss_skeleton: + name: '$minibossLevel &4Crypt Keeper' +darkspire_level_120_miniboss_stray: + name: '$minibossLevel &4Nicolas Ribcage' +darkspire_level_120_miniboss_vindicator: + name: '$minibossLevel &4Zalmur the Impslayer' +darkspire_level_120_miniboss_wither_skeleton: + name: '$minibossLevel &4Oroxak' +darkspire_level_120_summon_zoglin: + name: '$reinforcementLevel &cArzags Horde' +darkspire_level_130_miniboss_phase_brute: + name: '$bossLevel &4Arzag the Beast' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Arzag the Beast''s invasion has been stopped!' + - '&c&l 1位: $damager1name &c($damager1damage ダメージ)' + - '&6&l 2位: $damager2name &6($damager2damage ダメージ)' + - '&e&l 3位: $damager3name &e($damager3damage ダメージ)' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' +darkspire_level_130_miniboss_zoglin: + name: '$bossLevel &4Arzag the Beast' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Arzag the Beast''s invasion has been stopped!' + - '&c&l 1位: $damager1name &c($damager1damage ダメージ)' + - '&6&l 2位: $damager2name &6($damager2damage ダメージ)' + - '&e&l 3位: $damager3name &e($damager3damage ダメージ)' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Arzag the Beast: $distance blocks away' + spawnMessage: '&4Arzag the Beast prepares for the invasion!' + escapeMessage: '&cArzag the Beast is done plundering!' +darkspire_level_80_summon_blaze: + name: '$reinforcementLevel &dFalse Hellspawn' +fireworks_level_50_boss_phase_1: + name: '$eventBossLevel &cSparky' + spawnMessage: '&eSparks fill the sky!' +fireworks_level_50_boss_phase_2: + name: '$eventBossLevel &cSparky' +fireworks_level_50_boss_phase_3: + name: '$eventBossLevel &cSparky' + deathMessages: + - '&e&l---------------------------------------------' + - '&eSparky''s out, party''s over!' + - '&c&l 1位: $damager1name &c($damager1damage ダメージ)' + - '&6&l 2位: $damager2name &6($damager2damage ダメージ)' + - '&e&l 3位: $damager3name &e($damager3damage ダメージ)' + - '&a倒したプレイヤー: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&6Sparky returns to celebrate!' +fireworks_phase_2_reinforcement: + name: '$eventBossLevel &cBoomi' +fireworks_phase_3_reinforcement: + name: '$eventBossLevel &cPartygoer' +the_great_weaver: + name: '$eventBossLevel &cThe Great Weaver' + locationMessage: '&cThe Great Weaver: $distance blocks away!' + spawnMessage: '&cAwful creatures have appeared!' + deathMessage: '&aThe Great Weaver and it''s brood have been stopped by $players!' + escapeMessage: '&4The Great Weaver and it''s brood have vanished!' +the_great_weaver_summon: + name: '$eventBossLevel &4Brood Mother' +the_great_weaver_summon_1: + name: '$eventBossLevel &6Brood' +halloween_event_boss_mount: + name: '$minibossLevel Daredevil' +halloween_event_boss_p1: + name: '$bossLevel Dullahan' + locationMessage: '&4Dullahan: $distance blocks away!' + spawnMessage: '&4Don''t lose your head now, the headless horseman walks the earth once again!' + deathMessage: '&4The headless horseman was vanquished by $players!' + escapeMessage: '&4The headless horseman has left to haunt someone''s dreams!' +halloween_event_boss_p2: + name: '$bossLevel Dullahan' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Headless Horseman was vanquished!' + - '&c&l 1位: $damager1name &c($damager1damage ダメージ)' + - '&6&l 2位: $damager2name &6($damager2damage ダメージ)' + - '&e&l 3位: $damager3name &e($damager3damage ダメージ)' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Dullahan: $distance blocks away!' + deathMessage: '&4The headless horseman was vanquished by $players!' + escapeMessage: '&4The headless horseman has left to haunt someone''s dreams!' +halloween_event_boss_reinforcement: + name: '$normalLevel Spooky Skeleton' +the_hunter: + name: '$eventBossLevel &4The Hunter' + locationMessage: '&cThe Hunter: $distance blocks away!' + spawnMessage: '&cA Hunter is on the prowl!' + deathMessage: '&aThe Hunter was hunted to extinction by $players!' + escapeMessage: '&4The Hunter declares the hunt now over!' +the_hunter_mount: + name: '$eventBossLevel &fTamed Beast' +the_living_dead: + name: '$reinforcementLevel &6The Living Dead' +northpole_elf: + name: '$normalLevel &2Workshop Elf' +northpole_elf_summon: + name: '$reinforcementLevel &aSanta''s Elf' +northpole_jack_frost: + name: '$bossLevel &bJack Frost' +northpole_krampus: + name: '$bossLevel &5Krampus' +northpole_mrs_claus: + name: '$bossLevel &cMrs. Claus' +northpole_santa_claus: + name: '$bossLevel &4Santa Claus' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Someone stole all of Santa''s presents!' + - '&c&l 1位: $damager1name &c($damager1damage ダメージ)' + - '&6&l 2位: $damager2name &6($damager2damage ダメージ)' + - '&e&l 3位: $damager3name &e($damager3damage ダメージ)' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Santa Claus: $distance blocks away' + spawnMessage: '&4Santa Claus is getting ready for Christmas!!' + escapeMessage: '&cSanta set off on his sleigh!' +northpole_skeleton_summon: + name: '$reinforcementLevel &dSoul of the Naughty List' +northpole_snowy_wraith: + name: '$reinforcementLevel &1Snowy Wraith' +the_phantom: + name: '$eventBossLevel &7The Phantom' + locationMessage: '&cThe Phantom: $distance blocks away!' + spawnMessage: '&cA Phantom roams in the dark!' + deathMessage: '&aThe Phantom and his evil troupe have been stopped by $players!' + escapeMessage: '&4The Phantom has left!' +the_phantom_summon_1: + name: '&fCave Spider' +the_phantom_summon_2: + name: '&fWItch' +the_phantom_summon_3: + name: '&fZombie' +the_phantom_summon_4: + name: '&fHusk' +the_phantom_summon_5: + name: '&fDrowned' +the_phantom_summon_6: + name: '&fSkeleton' +the_phantom_summon_7: + name: '&fStray' +the_phantom_summon_8: + name: '&fEnderman' +pirate_ship_tier_10: + name: '$normalLevel &cCrewman' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_15: + name: '$normalLevel &cDeckhand' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_20_melee_1: + name: '$normalLevel &cShipmate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_20_melee_2: + name: '$normalLevel &eDrunken lout' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_20_miniboss: + name: '$minibossLevel &dCookie the Cook' + onDamageMessages: + - Wat're u doin n my kitchen! + - I've got layers! + - You've been served! + - Out me kitchen! + deathMessage: '&2Cookie the Cook''s been sliced and diced by $players!' +pirate_ship_tier_20_ranged: + name: '$normalLevel &cShipmate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_25_miniboss_1: + name: '$miniboss &cCharon the Helmsman' + onDamageMessages: + - Fools ahoy! + - Worthy opponent at prow! + deathMessage: '&2Charon the Helmsman''s been led astray by $players!' +pirate_ship_tier_30_melee: + name: '$normalLevel &cPirate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_30_miniboss_1: + name: '$minibossLevel &7Crushy the Crusher' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! + deathMessage: '&7Crushy the Crusher has been crushed by $players!' +pirate_ship_tier_30_ranged: + name: '$normalLevel &cPirate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_35: + name: '$normalLevel &4Pirate Navigator' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_35_miniboss_1: + name: '$minibossLevel &cSecond Mate' + onDamageMessages: + - You're not allowed here! + - Captain's quarters, back off! +pirate_ship_tier_35_miniboss_2: + name: '$minibossLevel &cSecond Mate' + onDamageMessages: + - You're not allowed here! + - Captain's quarters, back off! +pirate_ship_tier_40_miniboss_1: + name: '$minibossLevel &4First Hand' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! + deathMessage: '&6The Pirate Ship''s First Hand has been demoted by $players!' +pirate_ship_tier_45_boss: + name: '$bossLevel &4Captain Blackbeard' + onDamageMessages: + - Get off me ship! + - Arr, landlubers! + spawnMessage: '&4Captain Blackbeard is leading the Pirate Ship!' + deathMessage: '&2Captain Blackbeard''s beard''s been shaved by $players!' + escapeMessage: '&2Captain Blackbeard has run away with the plunder!' +the_returned: + name: '$reinforcementLevel &6帰還者' +ruins_boss_p1: + name: '$eventBossLevel &9Thor' + spawnMessage: '&6Lightning descends down from the sky!' +ruins_boss_p2: + name: '$eventBossLevel &9Thor' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Thor was sent back to Asgard!' + - '&c&l 1位: $damager1name &c($damager1damage ダメージ)' + - '&6&l 2位: $damager2name &6($damager2damage ダメージ)' + - '&e&l 3位: $damager3name &e($damager3damage ダメージ)' + - '&a倒したプレイヤー: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&6Lightning descends down from the sky!' +ruins_boss_reinforcement: + name: '$eventBossLevel &7Fenrir' +sewer_tier_10: + name: '$normalLevel &fLurker' +sewer_tier_15: + name: '$normalLevel &2Crawler' +sewer_tier_20_dry: + name: '$normalLevel &1Lost Wanderer' +sewer_tier_20_gravity_boss: + name: '$minibossLevel &1Spark' +sewer_tier_20_water: + name: '$normalLevel &1Smuggler' + onDamageMessages: + - You shouldn't be here! + onDamagedMessages: + - None shall stand in our way! +sewer_tier_20_water_boss: + name: '$minibossLevel &1Forgotten Hero' +sewer_tier_20_wither_boss: + name: '$minibossLevel &2Withered Corpse' +sewer_tier_30_ice_boss: + name: '$minibossLevel &2Ice Wraith' +sewer_tier_30_invisibility_boss: + name: '$minibossLevel &2Shadow Archer' +sewer_tier_30_melee: + name: '$normalLevel &5Sewer Beast' +sewer_tier_30_ranged: + name: '$normalLevel &5Spirit Whisperer' + onDamageMessages: + - A curse upon you! + - A pox upon your family! + - Feel the wrath of the spirits! + onDamagedMessages: + - You vex me so! + - Spirits, protect me! +sewer_tier_40: + name: '$normalLevel &6Mirage' + onDamageMessages: + - You victory, a lie + - Your odds, grim + - Your life, mine + onDamagedMessages: + - This pain, an illusion + - This blood, a mirage + - This weakness, a lie +sewer_tier_40_darkness_boss: + name: '$minibossLevel &2The Shadowmaster' +sewer_tier_40_darkness_boss_reinforcement: + name: '$reinforcementLevel &2Shadow' +sewer_tier_40_fire_boss: + name: '$minibossLevel &2The Grill Master' +sewer_tier_40_fire_boss_reinforcement: + name: '$reinforcementLevel &2Flame' +sewer_tier_40_poison_boss: + name: '$minibossLevel &2Toxic Gardener' + onDamageMessages: + - Feel nature's wrath! + onDamagedMessages: + - To me, minions! +sewer_tier_40_poison_boss_reinforcement: + name: '$reinforcementLevel &2Fallen Gardener' +sewer_tier_5: + name: '$normalLevel &7Sewer worker' + onDamageMessages: + - This area is restricted! + - Don't jump into the vats! + - | + You're not supposed to be here| + onDamagedMessages: + - Do you know what you're doing!? + - Foolishness! + - Don't you dare! +sewer_tier_50: + name: '$normalLevel &3Sewer Piranha' +sewer_tier_50_lightning_boss: + name: '$minibossLevel &2Mjolnir' +sewer_tier_50_ravager_boss: + name: '$minibossLevel &2Sewer Monstrosity' +sewer_tier_50_spider_boss: + name: '$minibossLevel &2Ancient Crawler' +sewer_tier_50_spider_boss_reinforcement: + name: '$reinforcementLevel &2Spiderling' +sewer_tier_50_water_boss: + name: '$minibossLevel &2Piranha King' +sewer_tier_50_water_boss_reinforcement: + name: '$reinforcementLevel &2Piranha Prince' +sewer_tier_60: + name: '$normalLevel &4Drowned One' +sewer_tier_70_boss: + name: '$bossLevel &4Drowned King' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Drowned King has been slain!' + - '&c&l 1位: $damager1name &c($damager1damage ダメージ)' + - '&6&l 2位: $damager2name &6($damager2damage ダメージ)' + - '&e&l 3位: $damager3name &e($damager3damage ダメージ)' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&cThe sewers echo with the clamor of a returned king...' + deathMessage: '&2The Drowned King has been slain!' + escapeMessage: '&2The sewers grow quiet, for now...' +sewer_tier_70_boss_reinforcement: + name: '$reinforcementLevel &4Drowned One' +totem_zombie_1: + name: '$eventBossLevel Head Zombie' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Zombie Totem been slain!' + - '&c&l 1位: $damager1name &c($damager1damage ダメージ)' + - '&6&l 2位: $damager2name &6($damager2damage ダメージ)' + - '&e&l 3位: $damager3name &e($damager3damage ダメージ)' + - '&a倒したプレイヤー: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cZombie Totem: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine abomination has been sighted!' + deathMessage: '&aDr. Craftenmine''s abomination been terminated by $players!' + escapeMessage: '&4Dr. Craftenmine''s creation has escaped!' +totem_zombie_2: + name: '$eventBossLevel Totem Zombie' +totem_zombie_3: + name: '$eventBossLevel Totem Zombie' +totem_zombie_4: + name: '$eventBossLevel Totem Zombie' +totem_zombie_5: + name: '$eventBossLevel Totem Zombie' +totem_zombie_6: + name: '$eventBossLevel Totem Zombie' +treasure_goblin: + name: '$eventBossLevel &eトレジャーゴブリン' + deathMessages: + - '&e&l---------------------------------------------' + - '&eトレジャーゴブリンが略奪されました!' + - '&c&l 1位: $damager1name &c($damager1damage ダメージ)' + - '&6&l 2位: $damager2name &6($damager2damage ダメージ)' + - '&e&l 3位: $damager3name &e($damager3damage ダメージ)' + - '&a倒したプレイヤー: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cトレジャーゴブリン: $distance ブロック離れた場所にいます。' + spawnMessage: '&cトレジャーゴブリンが目撃されています!' + deathMessage: '&aトレジャーゴブリンが $players に倒された!' + escapeMessage: '&4トレジャーゴブリンが逃げただした!' +tree_defender: + name: '$eventBossLevel &2Tree Defender' +undead_farmer: + name: '$eventBossLevel &aUndead Farmer' + locationMessage: '&cUndead Farmer: $distance blocks away!' + spawnMessage: '&cAn Undead Farmer walks the earth!' + deathMessage: '&aThe Undead Farmer''s career was ended by $players!' + escapeMessage: '&4The Undead Farmer has gone back to rest!' +undead_farmer_summon: + name: '$eventBossLevel &2Farmers Pride' +undead_farmer_summon_1: + name: '$eventBossLevel &2Failed Hog' +undead_horde_summon_1: + name: '$reinforcementLevel &aUndead Horde' +undead_horde_summon_2: + name: '$reinforcementLevel &dUndead Horde' +undead_horde_summon_3: + name: '$reinforcementLevel &eUndead Horde' +unwanted_visitor: + name: '$eventBossLevel &9Unwanted Visitor' + locationMessage: '&cUnwanted Visitor: $distance blocks away!' + spawnMessage: '&cAn Unwanted Visitor has come to the nether to warm up!' + deathMessage: '&aThe Visitor was slain by $players!' + escapeMessage: '&4The Visitor has gone back to his chilly domain!' +unwanted_visitor_summon: + name: '$eventBossLevel &bIce Clone' +vampire_boneman: + name: '$reinforcementLevel &7Drainlings' +vampire_brute: + name: '$normalLevel &1Vampire Brute' +vampire_brute_coffin_breaker: + name: '$normalLevel &1Vampire Brute' +vampire_brute_gargoyle_rush_left: + name: '$normalLevel &3Vampire Brute' +vampire_brute_gargoyle_rush_left_phase_2: + name: '$normalLevel &3Vampire Brute' +vampire_brute_gargoyle_rush_right: + name: '$normalLevel &3Vampire Brute' +vampire_brute_gargoyle_rush_right_phase_2: + name: '$normalLevel &3Vampire Brute' +vampire_fledgling: + name: '$normalLevel &9Vampire Fledgling' +vampire_fledgling_coffin_breaker: + name: '$normalLevel &9Vampire Fledgling' +vampire_fledgling_gargoyle_overlord: + name: '$normalLevel &9Vampire Fledgling' +vampire_gargoyle: + name: '$normalLevel &6Vampire''s Gargoyle' +vampire_grunt: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_coffin_breaker: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_left: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_left_phase_2: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_right: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_right_phase_2: + name: '$normalLevel &1Vampire Grunt' +vampire_hound: + name: '$reinforcementLevel &bVampire Hound' +vampire_king: + name: '$bossLevel &4Vampire King' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Vampire King has been slain!' + - '&c&l 1位: $damager1name &c($damager1damage ダメージ)' + - '&6&l 2位: $damager2name &6($damager2damage ダメージ)' + - '&e&l 3位: $damager3name &e($damager3damage ダメージ)' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Vampire King: $distance blocks away.' + spawnMessage: '&cThe Vampire King crawls back to his throne...' + deathMessage: '&2The Vampire King has been smitten!' + escapeMessage: '&2Darkness flees, but for how long...' +vampire_king_phase_2: + name: '$bossLevel &4Vampire King' +vampire_king_phase_3: + name: '$bossLevel &4Vampire King' +vampire_king_phase_4: + name: '$bossLevel &4Vampire King' +vampire_king_phase_5: + name: '$bossLevel &4Vampire King' +vampire_king_phase_6: + name: '$bossLevel &4Vampire King' +vampire_level_120_miniboss_evoker: + name: '$minibossLevel &4Hellraiser''s Spirit' +vampire_level_120_miniboss_skeleton: + name: '$minibossLevel &4Crypt Keeper''s Spirit' +vampire_level_120_miniboss_stray: + name: '$minibossLevel &4Nicolas Ribcage''s Spirit' +vampire_level_120_miniboss_wither_skeleton: + name: '$minibossLevel &4Oroxak''s Spirit' +vampire_necromancer: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_dining_hall: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_entrance: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_foresight_pool: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_gargoyle_rush: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_gargoyle_rush_phase_2: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_left_bedroom: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_right_bedroom: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_supply_room: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_supreme_coffin_breaker: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_2: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_3: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_4: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_5: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_gargoyle_overlord: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_gargoyle_overlord_phase_2: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_gargoyle_overlord_phase_3: + name: '$minibossLevel &2Gargoyle Overlord' +vampire_sentinel: + name: '$minibossLevel &eVampire''s Sentinel' +vampire_thrall: + name: '$reinforcementLevel &dVampire''s Thrall' +vampire_wraith: + name: '$minibossLevel &8Drained One' +vampire_wraith_phase_2: + name: '$minibossLevel &8Drowned One' +vampire_zombie: + name: '$normalLevel &aDrained Husk' +vex_top: + name: '$eventBossLevel &eVex Selfish Top' + locationMessage: '&cVex Troublemakers: $distance blocks away!' + spawnMessage: '&cA gang of Vex Troublemakers have appeared!' + deathMessage: '&aThe Vex Troublemakers were slain by $players!' + escapeMessage: '&4The Vex Troublemakers have decided to leave.' +vex_top_mount_1: + name: '$eventBossLevel &6Vex Bottom' +vex_top_mount_2: + name: '$eventBossLevel &6Vex Bottom' +vex_top_mount_3: + name: '$eventBossLevel &6Vex Bottom' +warlock: + name: '$eventBossLevel &dWarlock' + locationMessage: '&cWarlock: $distance blocks away!' + spawnMessage: '&cA demon riding Warlock has appeared!' + deathMessage: '&aThe Warlock was slain by $players!' + escapeMessage: '&4The Warlock ran away on his demon!' +warlock_mount: + name: '$eventBossLevel &dDemon' +wasp_queen: + name: '$eventBossLevel &aWasp Queen' + locationMessage: '&cWasp Queen: $distance blocks away!' + spawnMessage: '&cA wasp swarm has been sighted!' + deathMessage: '&aThe wasp swarm was eliminated by $players!' + escapeMessage: '&4The wasp swarm has flown away.' +wasp_queen_summon: + name: '$eventBossLevel &aWasp' +water_pest: + name: '$eventBossLevel &3Water Pest' + locationMessage: '&cWater Pest: $distance blocks away!' + spawnMessage: '&cAn annoying foe swims the waters!' + deathMessage: '&aThe Water Pest was slain by $players!' + escapeMessage: '&4The waters are clear of all Pests' +weapons_goblin: + name: '$eventBossLevel &cWeapons Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Weapons Goblin has been pillaged!' + - '&c&l 1位: $damager1name &c($damager1damage ダメージ)' + - '&6&l 2位: $damager2name &6($damager2damage ダメージ)' + - '&e&l 3位: $damager3name &e($damager3damage ダメージ)' + - '&a倒したプレイヤー: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cWeapons Goblin: $distance blocks away!' + spawnMessage: '&cA Weapons Goblin has been sighted!' + deathMessage: '&aA Weapons Goblin has been slain by $players!' + escapeMessage: '&4A Weapons Goblin has escaped!' +wendigo: + name: '$eventBossLevel &7Wendigo' + locationMessage: '&cWendigo: $distance blocks away!' + spawnMessage: '&cSomething awful has appeared!' + deathMessage: '&aThe Wendigo has been slain $players!.' + escapeMessage: '&4The Wendigo has disappeared!' +wendigo_summon: + name: '$reinforcementLevel &aWindigo' +werehare: + name: '$eventBossLevel &5Alice' + locationMessage: '&cWerehare: $distance blocks away!' + spawnMessage: '&cA bloody roar can be heard! A werehare approaches!' + deathMessage: '&a$players! made sure to end the werehare''s reign!' + escapeMessage: '&4The werehare escaped!' +werehare_p2: + name: '$eventBossLevel &dWerehare' +wild_wolf: + name: '$reinforcementLevel &7Wild Wolf' +wood_league_wave_10_boss: + name: '$bossLevel &4Bad Doggo' +wood_league_wave_10_reinforcement: + name: '$reinforcementLevel &cBad Pupper' +wood_league_wave_11_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_11_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_12_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_12_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_13_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_13_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_14_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_14_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_15_miniboss: + name: '$bossLevel &4Mr. Oinkers' + onDamagedMessages: + - Oink!? +wood_league_wave_16_melee: + name: '$normalLevel Mr. Oinkers Fan' +wood_league_wave_16_ranged: + name: '$normalLevel Mr. Oinkers Fan' +wood_league_wave_17_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_17_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_18_melee: + name: '$normalLevel &4Fencing Club Enthusiast' +wood_league_wave_19_ranged: + name: '$normalLevel Archery Club Enthusiast' +wood_league_wave_1_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_1_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_20_boss: + name: '$bossLevel &2Zoltan' +wood_league_wave_21_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_21_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_22_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_22_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_23_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_23_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_24_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_24_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_25_miniboss: + name: '$minibossLevel &bAgdluak' +wood_league_wave_26_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_26_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_27_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_27_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_28_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_29_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_2_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_2_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_30_boss: + name: '$bossLevel &2The Southern Viper' +wood_league_wave_31_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_31_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_32_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_32_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_33_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_33_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_34_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_34_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_35_miniboss: + name: '$minibossLevel &6The Jester' +wood_league_wave_36_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_36_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_37_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_37_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_38_melee: + name: '$normalLevel &4Arena Swordsman' +wood_league_wave_39_ranged: + name: '$normalLevel Arena Archer' +wood_league_wave_3_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_3_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_40_boss: + name: '$bossLevel &cCrucio the Bearer of Curses' +wood_league_wave_41_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_41_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_42_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_42_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_42_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_43_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_43_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_43_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_44_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_44_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_44_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_45_miniboss: + name: '$minibossLevel &6Thousand Blades' +wood_league_wave_46_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_46_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_46_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_47_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_47_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_47_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_48_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_48_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_49_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_49_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_4_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_4_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_50_boss: + name: '$bossLevel &6Uther the Champion' +wood_league_wave_50_boss_p2: + name: '$bossLevel &6Uther the Champion' +wood_league_wave_50_boss_p3: + name: '$bossLevel &6Uther the Champion' +wood_league_wave_50_reinforcement: + name: '$reinforcementLevel &6Uther Stan' +wood_league_wave_5_miniboss: + name: '$minibossLevel &cWeird Cow' + onDamagedMessages: + - ワン! +wood_league_wave_6_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_6_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_7_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_7_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_8_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_9_ranged: + name: '$normalLevel Arena Crossbowman' +yeti: + name: '$eventBossLevel &bYeti' + locationMessage: '&cYeti: $distance blocks away!' + spawnMessage: '&cA mighty beast has appeared!' + deathMessage: '&aThe beast is no more thanks to $players!.' + escapeMessage: '&4The beast has escaped!' +yezhi_baba: + name: '$eventBossLevel &cYezhi Baba' + locationMessage: '&cYezhi Baba: $distance blocks away!' + spawnMessage: '&cA foul hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +yezhi_baba_summon: + name: '$reinforcementLevel &4Yezhi Baba' +zombie_friends_friend: + name: '$reinforcementLevel &7ゾンビフレンド' +zombie_king: + name: '$eventBossLevel &4ゾンビキング' + locationMessage: '&cキングゾンビ: $distance ブロック離れた場所にいます。' + spawnMessage: '&cゾンビキングが目撃されました!' + deathMessage: '&aキングゾンビが $players に倒された!' + escapeMessage: '&4ゾンビキングが逃げ出した!' +zombie_parents_dad: + name: '$reinforcementLevel &7ゾンビのお父さん' +zombie_parents_mom: + name: '$reinforcementLevel &7ゾンビのお母さん' +back_teleporter: + name: エルメス + role: <輸送者> + greetings: + - ようこそ\nアドベンチャーズハブへ! + dialog: + - 元の世界に帰りたい? + farewell: + - 友よ、安全な旅行へ + noPreviousLocationMessage: '&8[EliteMobs] &c以前の場所に戻すことができませんでした。' +barkeep: + name: バートリー + role: <バーテンダー> + greetings: + - 飲み物が必要ですか? + - 飲みたいですか? + - のどが渇いた? + - こんにちは、パートナー。 + dialog: + - 当店のオススメワインをどうぞ。 + - 他の店では\nこんな味は味わえない + - 一度飲む忘れられなくなる味\nまた来たくなります。 + farewell: + - またいつでもどうぞ + - ぐいっと飲んで! + - Kampai! + - Salut! + - Brosd! + - Salud! + - À la vôtre ! + - Prost! + - Santi! + - Salute! + - Saúde! + - Cheers! + - 乾杯! +blacksmith: + name: グレッグ + role: <鍛冶屋> + greetings: + - 私たちの店へようこそ! + - ここで商品を売ろう! + - 良い商品を売ってるよ! + - 売りたいものはないかい? + - 良いものを買いたい? + - いつでも新鮮な商品を! + dialog: + - 高レベルのmobは\n価値の高いものを落とします! + - エンチャントが\n多いアイテムは価値が高いです! + - 高レベルのmobほど\nエンチャントの多いアイテムを落とします! + - 高レベルのmobは\n高い確率でアイテムを落とします! + - + - + - 一部のアイテムには\n特別なポーション効果があります! + - アイテムによっては\nユニークな効果を発揮するものもあります! + - ハンターエンチャント\nは自分の周りに\nエリートmobがスポーンしやすくなります! + - エリートmobが落とす\n特殊な武器や防具も\nここで販売されています! + - ギルドのランクが上がると\nエリートmobが落とすアイテムの\n質が向上します + farewell: + - ご利用ありがとうございました! + - また来てください! + - いつでも戻って来てください! + - 友達にも勧めてみてください! +combat_instructor: + name: チャールズ + role: <戦闘インストラクター> + greetings: + - 戦闘について知りたいですか? + - 戦闘レッスンが必要ですか? + - 戦闘についてもっと知りたいですか? + - エリートモブと戦う準備はできていますか? + dialog: + - エリートモブ\nの周りのアイテムは、彼らが持っている力を示しています。 + - エリートモブの\nレベルが高いほど、\nより多くの能力を持つことができます。 + - エリートモブの\nレベルが高いほど、\n入手できる戦利品が入手できます + - より高いレベルのエリートモブ\nは特殊アイテムを\n落とす確率が高いです + - 矢をまとっているエリートモブは\n近くのプレイヤーに矢を放ちます。 + - エンダーパールをまとっているエリートモブは\n殴られた時にあなたを盲目にします。 + - 呪文の粒子をまとっているエリートモブは\n殴られた時にあなたを混乱させます。 + - 溶岩のバケツをまとっているエリートモブは\n殴った時にあなたに火をつけます + - |- + Elite Mobs with floating\nfireballs fire fireballs + at nearby players + - 氷をまとっているエリートモブは\n殴られた時にあなたを凍らせます。 + - エリトラをまとっているエリートモブは\n殴られた時にあなたを浮かせます。 + - エメラルドをまとっているエリートモブは\n殴られた時にあなたを毒にします。 + - ピストンをまとっているエリートモブは\n殴られた時にあなたを押します。 + - トーテムをまとっているエリートモブは\n殴られた時にあなたを弱体化します。 + - クモの巣をまとっているエリートモブは\n殴られた時にあなたをクモの巣にかけます。 + - 頭蓋骨をまとっているエリートモブは\n殴られた時にあなたを衰弱させます。 + - チェストをまとっているエリートモブは\n倒された時にボーナス戦利品をドロップします。 + - 金のブーツをまとっているエリートモブは\n足が早いです。 + - ジュークボックスをまとっているエリートモブは\n戦闘時にあなたを挑発します。 + - 板ガラスをまとっているエリートモブは\n透明化しています。 + - 光の矢をまとっているエリートモブは\n矢に耐性があります。 + - 羽をまとっているエリートモブは\n落下ダメージを受けません。 + - 炎をまとっているエリートモブは\n火に耐性があります。 + - 金床をまとっているエリートモブは\n重いです。 + - 骨ブロックまとっているエリートモブは\n倒されたときにあなたの後ろに死体を残します。 + - スライムブロックをまとっているエリートモブは\nジャンプ力が高いです。 + - スライムボールをまとっているエリートモブは\n倒されたときに真空を作ります。 + - リードをまとっているエリートモブは\n殴られた時にあなたを引き寄せます。 + - 骨をまとっているエリートモブは\n戦闘時に骨の柱を建てます。 + - 効能付きの矢をまとっているエリートモブは\n戦闘時に追尾矢を放ちます。 + - キノコをまとっているエリートモブは\n殴られた時に巨大化します。 + - 頭蓋骨をまとっているエリートモブは\n殴られた時に援軍を召喚します。 + - 本まとっているエリートモブは\n倒されるまで援軍を召喚し続けます。 + - 卵をまとっているエリートモブは\n殴られた時に援軍を召喚します。 + - 花火をまとっているエリートモブは\n殴られた時にロケット団を召喚します。 +enhancer_config: + name: ティム + role: + greetings: + - アイテムをアップグレードしますか? + - オーブをアップグレードしますか? + - アイテムのアップグレードはこちらから! + - オーーーイ! + - スクラップの活用法しらないの? + dialog: + - そんなアイテムじゃダメだね。\n ここでアップグレードしていかないか? + - アイテムのアップグレードはここだよ! + - アップグレードオーブを手に入れたかい? + - なんてひどい剣だ。\nここでアップグレードしてやるよ! + - アップグレードするかい? + farewell: + - 恥をかかせるなよ! + - もっとオーブを手に入れたらまたおいで! + - もっとオーブをゲットしよう! +frost_queen_teleporter: + name: Ishard the Frostbitten + role: + greetings: + - '' +guide_0: + name: Dux + role: + greetings: + - Heard about the AG? + - Been to the AG? + - Heard of the Adventurer's Guild? + - Know about the Adventurer's Guild? + dialog: + - Heard about the AG? + - Been to the AG? + - Heard of the Adventurer's Guild? + - Know about the Adventurer's Guild? + farewell: + - またいつでもどうぞ + - 修理が必要ならここにおいで! + - I'll be around! + - See you later! +guide_1: + name: Casus + role: + greetings: + - Need guidance? + - Need a hint + - Are you lost? + - Need help? + dialog: + - I know everything about\nthis place! + - Want to meet the other members\nof the Adventurer's Guild? + - Need to learn your way around\nthis place? + farewell: + - またいつでもどうぞ + - 修理が必要ならここにおいで! + - I'll be around! + - See you later! +guild_attendant: + name: ジリアン + role: <ギルドマスター> + greetings: + - ようこそ\nアドベンチャーズギルドへ! + - ようこそ! + dialog: + - エストボードをチェックして\nアクティブなクエストを確認しよう + - ギルドランクの変更は\n私に相談してください。 + - アイテムを鍛冶屋に売ると\nコインがもらえます! + - アリーナマスターと話すことで、\nアリーナをオンにすることができます! + - 装備品は\n鍛冶屋から買えます! + - 戦闘インストラクターと話すと戦闘レベルを確認できます! + - ギルドランクをあげると\n最大体力をアップさせることができます! + farewell: + - また近いうちにお会いしましょう​​! + - お立ち寄りいただきありがとうございます! + - 狩りを楽しんでください! +primis_69ozcanofbepis: + name: '&a69OzCanOfBepis' + role: '&2Map Maker (Uuuuge gamer)' + dialog: + - Hope you are enjoying the map! + farewell: + - Have fun! +primis_caeruleaum_fisherman: + name: '&3Piscis Nemesis' + role: '&b' + greetings: + - Hiya!. + dialog: + - Woah! Almost fell off the boat. + - Darn sea monster! + - Need more bait. + farewell: + - Later! + - Good luck! +primis_caeruleaum_fletcher: + name: '&6Ventus Artifex' + role: '&e' + greetings: + - Greetings. + dialog: + - I used to be an adventurer like you. + - Welcome, outsider + - 何か必要ですか? + - |- + You're not from around these parts, + are you? + farewell: + - See you 'round! + - また来てください! +primis_caeruleaum_forager: + name: '&5Venator Pabulatus' + role: '&d' + greetings: + - Hello, stranger. + dialog: + - I used to be an adventurer like you. + - Welcome, outsider + - 何か必要ですか? + - |- + You're not from around these parts, + are you? + farewell: + - See you 'round! + - また来てください! +primis_caeruleaum_hint_giver: + name: '&fVir Loquax' + role: '&fWise Man' + greetings: + - Hi there! + - Hello! + - It is good to see you! + - Greetings! + dialog: + - + - + - + - + - The ruins in the southwest are such a horrible place!\n Who would ever go there... + - + - + - I heard that a nasty type of\nwolf has settled in the wolf den! + farewell: + - Goodbye! + - See you later! + - Come visit me again! + - Farewell! +primis_caeruleaum_injured_fisherman: + name: '&3Callidus Piscatus' + role: '&b' + greetings: + - Hello, wanderer. + dialog: + - Caught any good fish lately? + - Welcome, outsider + - 何か必要ですか? + - |- + You're not from around these parts, + are you? + farewell: + - See you 'round! + - また来てください! +primis_caeruleaum_jeeves: + name: ジーブス + role: + greetings: + - Just traveling! + dialog: + - Just here to sell\nto the shop-keep. + - I'm busy negotiating\nhere. + - Not right now,\ncome back later. + farewell: + - Uhuh... +primis_caeruleaum_leader: + name: '&4Chief Piscis' + role: '&c' + greetings: + - Welcome to our village! + dialog: + - |- + Ask not what this village can do for you, + ask what you can do for this village! + - Welcome, outsider + - 何か必要ですか? + - |- + You're not from around these parts, + are you? + farewell: + - Off you go! + - また来てください! +primis_caeruleaum_merchant: + name: Emptor + role: + greetings: + - 売りたいものはないかい? + dialog: + - Bandits stole my wares! + - Got nothing to sell, I'm afraid. + - I'll buy anything you have! + farewell: + - 安全な旅を! +primis_captain: + name: '&4Captain Squalus' + role: '&c' + greetings: + - So you're finally awake! + - That was a wild ride! + - Still alive? + - Let's not do that again! + dialog: + - I've got a task for you! + - I need your help! + - |- + Good thing you're here, + we need some help! + farewell: + - Off you go! + - Don't forget about me! + - また来てください! +primis_deli'o: + name: '&eDéli''O' + role: '&6Map Maker (Gamer)' + dialog: + - Hope you are enjoying the map! + farewell: + - Have fun! +primis_farmstead_son: + name: '&4Filius' + role: '&c' + greetings: + - Where do you fare from? + - You seem like you came a long way from here. + dialog: + - Dangerous times we live in. + - Have you seen my father? + - Without a lighthouse, how will boats navigate? + farewell: + - Watch your back! + - Tread lightly! +primis_farmstead_wife: + name: '&4Amavit' + role: '&c' + greetings: + - I haven't seen you before! + - Any news from Pontis Mille? + dialog: + - Have you seen my husband? + - I need your help! + - What dangerous times we live in. + - Something is amiss! + farewell: + - 安全な旅を! + - Thank you! +primis_first_mate: + name: '&cIracundi' + role: '&c' + greetings: + - So you're finally awake! + - That was a wild ride! + - Still alive? + - Let's not do that again! + dialog: + - I've got a task for you! + - I need your help! + - |- + Good thing you're here, + we need some help! + farewell: + - Off you go! + - Don't forget about me! + - また来てください! +primis_frostcone: + name: '&bFrostCone' + role: '&9Map Maker (Gamer)' + dialog: + - Hope you are enjoying the map! + - It's a pine-cone covered in snow. + - Is Primis out yet? + farewell: + - Have fun! +primis_gladius_guard_1: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_guard_2: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_guard_3: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_guard_4: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_lord: + name: '&4General Hasta' + role: '&c' + greetings: + - Are you here to help? + - It's a war zone out there! + dialog: + - They came in the night! + - We never saw them coming! + - Where are our reinforcements? + farewell: + - Watch your back! + - Tread lightly! +primis_gladius_quartermaster: + name: '&6Cibus' + role: '&c' + greetings: + - Are you here to help? + - It's a war zone out there! + dialog: + - They came in the night! + - We never saw them coming! + - Where are our reinforcements? + farewell: + - Watch your back! + - Tread lightly! +primis_gladius_strategist: + name: '&6Belli' + role: '&c' + greetings: + - Are you here to help? + - It's a war zone out there! + dialog: + - They came in the night! + - We never saw them coming! + - Where are our reinforcements? + farewell: + - Watch your back! + - Tread lightly! +primis_groves_nemus_leader: + name: '&3King Nemian' + role: '&c' + dialog: + - What brings you under the hill? + - Where are you from? + - |- + Have you tried our + delicious glow berries? + farewell: + - Until next time. +primis_ice_village_fisherman_boat: + name: '&3Theopropides Nero' + role: '&3' + greetings: + - Fishy day! + dialog: + - A chilly day for fishing. + - They aren't biting. + - Just gotta be patient. + farewell: + - Don't fall into\nthe water! +primis_ice_village_friendly_villager: + name: '&3Luxuria Placidus' + role: '&3' + greetings: + - Hellos! + dialog: + - Old age will not\nslow me down! + - Being in a good\nmood is important. + - Hoping for some\nsnow soon. + farewell: + - Farewell! +primis_ice_village_generic_npc_1: + name: '&3Albertus Vitalis' + role: '&3' + greetings: + - How goes it. + dialog: + - Nothing like good ale! + farewell: + - Bye. +primis_ice_village_generic_npc_10: + name: '&3Trebatia Cornix' + role: '&3' + greetings: + - OK. + dialog: + - Yep, got it. + - I see... + - Oh! + farewell: + - I will try that\nnext time. +primis_ice_village_generic_npc_11: + name: '&3Albatia Lateranus' + role: '&3' + greetings: + - Visiting Violet? + dialog: + - Don't cause trouble. + farewell: + - Later stranger. +primis_ice_village_generic_npc_12: + name: '&3Hostilia Carantus' + role: '&3' + greetings: + - Hi. + dialog: + - I was just\nleaving. + farewell: + - Bye. +primis_ice_village_generic_npc_13: + name: '&3Vagennia Sejanus' + role: '&3' + greetings: + - Hiya. + dialog: + - What brings you\nto the docks? + farewell: + - See ya. +primis_ice_village_generic_npc_14: + name: '&3Dinia Vettonius' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_15: + name: '&3Sceledrus Marcallas' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_16: + name: '&3Fridericus Castinus' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_17: + name: '&3Cario Fimbria' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_18: + name: '&3Piscatores Laevinus' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_19: + name: '&3Monkerius Vitalis' + role: '&3' + greetings: + - Been hunting? + dialog: + - Time to go hunting. + farewell: + - Farewell. +primis_ice_village_generic_npc_2: + name: '&3Luxuria Tyranus' + role: '&3' + greetings: + - How goes it. + dialog: + - One more! + farewell: + - Bye. +primis_ice_village_generic_npc_3: + name: '&3Aurelio Nigidius' + role: '&3' + greetings: + - Hey there. + dialog: + - What a sight! + farewell: + - Goodbye. +primis_ice_village_generic_npc_4: + name: '&3Lysidamus Paratus' + role: '&3' + greetings: + - Out for a walk? + dialog: + - I couldn't imagine\nliving somewhere\nwithout snow. + - Starting to get chilly. + farewell: + - Until later. +primis_ice_village_generic_npc_5: + name: '&3Simo Proceus' + role: '&3' + greetings: + - What a view! + dialog: + - I love climbing. + - Look at all the fish! + farewell: + - Yep. +primis_ice_village_generic_npc_6: + name: '&3Dordalus Marullinus' + role: '&3' + greetings: + - Welcome to the pub! + dialog: + - Time to warm up\nmy fingers. + - Nice and warm. + farewell: + - Don't let the\ncold get ya. +primis_ice_village_generic_npc_7: + name: '&3Tranio Silvanus' + role: '&3' + greetings: + - Here somewhere.. + dialog: + - Where is it. + farewell: + - I was sure I\nleft it here. +primis_ice_village_generic_npc_8: + name: '&3Milonia Trebellius' + role: '&3' + greetings: + - Welcome to our\nvillage! + dialog: + - I sure am hungry. + - Could go for\nsome salmon. + farewell: + - Farewell. +primis_ice_village_generic_npc_9: + name: '&3Barria Brocchus' + role: '&3' + greetings: + - Did you hear... + dialog: + - Keep that in mind\nnext time you swing\nyour sword. + - The shield can be\nmore than defense. + farewell: + - Got it? +primis_ice_village_hunter: + name: '&3Alanus Isatis' + role: '&3' + greetings: + - Hey! + dialog: + - Hoping for a good\nday tomorrow. + - Sure are many Razorbacks\nout this season. + farewell: + - Be seeing you. +primis_ice_village_imprisoned_husband: + name: '&3Eleusium Calenus' + role: '&3' + greetings: + - '.....' + dialog: + - Another day in a cage... + farewell: + - '.....' +primis_ice_village_jail_caretaker: + name: '&3Philolaches Triferus' + role: '&3' + greetings: + - Hey there. + dialog: + - What else needs\nfixing. + - I should check up\non the cages. + farewell: + - Later. +primis_ice_village_jail_guard: + name: '&3Eleusium Festus' + role: '&3' + greetings: + - Climbed the\ntower eh. + dialog: + - Everything seems in order. + - Almost everything... + farewell: + - Take care. +primis_ice_village_jail_master: + name: '&3Romanus Superbus' + role: '&3' + greetings: + - Well met. + dialog: + - Don't do the crime if\nyou can't do the time. + - Crime doesn't pay. + farewell: + - Until later. +primis_ice_village_leader: + name: '&3Glacies Princeps' + role: '&3' + greetings: + - Hey. + dialog: + - Darn Ice Elemental! + - Too many problems... + - How are we supposed to\ncomplete the trials now. + farewell: + - Goodbye. +primis_ice_village_lighthouse_keeper: + name: '&3Severinus Martius' + role: '&3' + greetings: + - Well met stranger. + dialog: + - Calm day today. + - Watch out for\nthe Ursus! + farewell: + - Take it easy. +primis_ice_village_missing_daughter: + name: '&3Cornelia Ennodius' + role: '&3' + greetings: + - Help... + dialog: + - Go away, go away,\nGO AWAY! + - They are not\nreal... + - Just don't look\nat them Cornelia. + farewell: + - Bye. +primis_ice_village_prisoner: + name: '&3Adrius Calpornius' + role: '&3' + greetings: + - I am innocent! + dialog: + - This is not where\nI belong!!! + farewell: + - Get me out of here! +primis_ice_village_pubkeeper: + name: '&3Grania Cecilius' + role: '&3' + greetings: + - Welcome! + dialog: + - Coming right up! + - Try our black ale! + - Need a drink? + farewell: + - One coming up! +primis_ice_village_tower_squatter: + name: '&3Modestus Eulogius' + role: '&3' + greetings: + - The noise! + dialog: + - So much screeching! + - Just trying to\nenjoy the peace. + farewell: + - Bye. +primis_ice_village_violet: + name: '&5Domina Violet' + role: '&d' + greetings: + - Did I ask\nyour opinion? + dialog: + - Feels good to\nget it out. + - They're gonna pay\nwhile I collect. + farewell: + - No, that's what I thought. +primis_ice_village_worried_father: + name: '&3Sparax Ennodius' + role: '&3' + greetings: + - I hope she is OK... + dialog: + - Let our girl be\nsafe, please. + farewell: + - Bye. +primis_ice_village_worried_mother: + name: '&3Sestia Ennodius' + role: '&3' + greetings: + - Where did she go. + dialog: + - Hmm, lost the trail. + farewell: + - Bye. +primis_ice_village_worried_wife: + name: '&3Titia Calenus' + role: '&3' + greetings: + - Hiya! + dialog: + - Nice and clean beds. + - Did I miss something? + - Another chest sorted. + farewell: + - Bye! +primis_magmaguy: + name: '&4Magmaguy' + role: '&cLead Developer (Non-gamer)' + dialog: + - Hope you are enjoying the map! + farewell: + - Have fun! +primis_mountain_guide: + name: '&4Petrae' + role: '&c' + greetings: + - Welcome to our village! + dialog: + - |- + Ask not what this village can do for you, + ask what you can do for this village! + - Welcome, outsider + - 何か必要ですか? + - |- + You're not from around these parts, + are you? + farewell: + - Off you go! + - また来てください! +primis_mountain_guide_2: + name: '&4Petrae' + role: '&c' + greetings: + - Welcome to our village! + dialog: + - |- + Ask not what this village can do for you, + ask what you can do for this village! + - Welcome, outsider + - 何か必要ですか? + - |- + You're not from around these parts, + are you? + farewell: + - Off you go! + - また来てください! +primis_nemus_leader: + name: '&3King Nemian' + role: '&c' + dialog: + - What brings you under the hill? + - Where are you from? + - |- + Have you tried our + delicious glow berries? + farewell: + - Until next time. +primis_ogre_mines_escaped_miner: + name: '&cFugit Fossores' + role: '&c' + greetings: + - I can't believe I made it! + - They're everywhere! + - Could you lend a hand? + dialog: + - I've got a task for you! + - I need your help! + farewell: + - Off you go! + - Be careful in there! + - Stay safe! +primis_ogre_mines_lone_miner: + name: '&cFortis Fossores' + role: '&c' + greetings: + - Finally, some help! + - Don't let them see you! + - Help me! + dialog: + - I've got a task for you! + - I need your help! + farewell: + - Off you go! + - Back to mining for me! + - Stay safe! +primis_ogre_mines_old_miner: + name: '&cVetus Fossores' + role: '&c' + greetings: + - Hey there sonny! + - You're lookin' a little lost! + - What brings you over here? + dialog: + - I've got a task for you! + - I need your help! + farewell: + - Off you go! + - Don't let the mine mites bite! + - Stay safe! +primis_ogre_mines_panicked_miner: + name: '&cMetus' + role: '&c' + greetings: + - The mine is overrun! + dialog: + - There's ogres everywhere! + - Can you help us? + farewell: + - Be careful! +primis_pontis_citizen_1: + name: '&7Agorastocles Gorgonius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_10: + name: '&7Pardalisca Saunio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_11: + name: '&7Sobersides Colias' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_12: + name: '&7Saturio Caepio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_13: + name: '&7Chrysalus Trebonius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_14: + name: '&7Toxilus Micon' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_15: + name: '&7Phronesium Viridio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_16: + name: '&7Aurelio Zoilus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_17: + name: '&7Diniarchus Nelius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_18: + name: '&7Cleostrata Senopius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_19: + name: '&7Georgius Sorio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_2: + name: '&7Franciscus Crispian' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_20: + name: '&7Epidicus Silvanus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_21: + name: '&7Pleusicles Marcellinus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_22: + name: '&7Plesidippus Nerva' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_23: + name: '&7Plesidippus Megellus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_24: + name: '&7Fridericus Achaicus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_25: + name: '&7Curculio Zosimus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_26: + name: '&7Demipho Sylvius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_27: + name: '&7Peniculus Nemesius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_28: + name: '&7Tyndarus Faustinius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_29: + name: '&7Sulpicio Panthera' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_3: + name: '&7Tycho Sellic' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_30: + name: '&7Melaenis Gelasius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_31: + name: '&7Tyndarus Columbanus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_32: + name: '&7Antamonides Cerinthus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_33: + name: '&7Lesbonicus Momus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_34: + name: '&7Fridericus Saloninus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_35: + name: '&7Anterastilis Fabricius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_36: + name: '&7Tyndarus Augustalis' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_37: + name: '&7Modestus Aper' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_38: + name: '&7Henricus Crassus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_39: + name: '&7Franciscus Tancinus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_4: + name: '&7Advocati Micon' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_40: + name: '&7Phygia Aurelius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_5: + name: '&7Advocati Micon' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_6: + name: '&7Messenio Rectus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_7: + name: '&7Hadrius Donicus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_8: + name: '&7Sulpicio Sejanus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_9: + name: '&7Stasimus Mutilus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_dockworker_1: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_10: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_2: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_3: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_4: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_5: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_6: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_7: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_8: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_9: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_enhancer: + name: '&7Meliorem' + role: '&8' + greetings: + - Need to upgrade? + - スクラップをお持ちですか? + - Let's upgrade! + dialog: + - I'll upgrade for scrap! + - Bring me scrap! + - Upgrade your gear for scrap! +primis_pontis_gardener_1: + name: '&eGorgines Asina' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_2: + name: '&ePiscatores Orissus' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_3: + name: '&eAlcesimus Abito' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_4: + name: '&ePyrgopolynices Perpenna' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_5: + name: '&eLemniselenis Gelasius' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_6: + name: '&eLysimachus Sulinus' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_7: + name: '&eStrobilus Farus' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_groves_catacombs_npc: + name: '&7Inaequaliter Hyaena' + role: '&7' + greetings: + - Psssst! + dialog: + - I heard there is great\ntreasure to be had! + - Something wonderful awaits\nyou if you enter! + - You should adventure\ninto this place... + - Why not go in? + - You should go inside... + - Don't worry, it's\ncompletely safe. + - No danger. I swear! + - Take a look inside. + - You should check\nout this place! + - He he he he he... + - What if somebody\ninside needs help. + - Go in, go in! + - Aren't you curious? + - Surely you should\ntake a peek. + farewell: + - He he he, later! +primis_pontis_groves_generic_npc_1: + name: '&2Sycophanta Mucius' + role: '&2' + greetings: + - I'm fine! + dialog: + - Do not worry about me. + - My brother will come rescue me. + - They won't eat me. + - I assure you I will be just fine. + farewell: + - Web ya later! +primis_pontis_groves_generic_npc_10: + name: '&2Hostilia Metunus' + role: '&2' + greetings: + - Hellos. + dialog: + - Are you bored too? + - Ugh, there must be something to do. + - Maybe I should brew more drinks. + farewell: + - See ya! +primis_pontis_groves_generic_npc_11: + name: '&2Tortilia Getha' + role: '&2' + greetings: + - Hi there. + dialog: + - My husband makes the best cakes. + - Want a slice? + - So delicious and moist! + farewell: + - Bye! +primis_pontis_groves_generic_npc_12: + name: '&2Consentia Apellinus' + role: '&2' + greetings: + - Oh, hello. + dialog: + - There, as good as new! + - Have to make sure the light keeps them away. + - Another lantern fixed... + farewell: + - Don't let the spiders bite! +primis_pontis_groves_generic_npc_13: + name: '&2Novia Senecius' + role: '&2' + greetings: + - Hi! + dialog: + - Oh, did not expect to see anyone here. + - Just gotta be quick and they can't get ya. + - The spiders don't stop me. + - This is my favorite resting spot. + farewell: + - Stay safe. +primis_pontis_groves_generic_npc_14: + name: '&2Maximia Priscus' + role: '&2' + greetings: + - Shhhh... + dialog: + - Thought you could\nsteal from me elves... + - Gonna get back my\npossessions when\nthey go sleep. + - Made it here by\ngoing around. + - They never saw\nme coming. + farewell: + - Keep it down. +primis_pontis_groves_generic_npc_15: + name: '&2Herennia Exsupereus' + role: '&2' + greetings: + - Hey there. + dialog: + - Just woke up. + - It's gonna be a good\nday I can feel it. + farewell: + - Bye bye. +primis_pontis_groves_generic_npc_16: + name: '&2Atria Maursus' + role: '&2' + greetings: + - Greetings. + dialog: + - Not sure how the king\nexpects me to do\nall of this... + - So much work.. + - Busy, busy, busy. + - This paperwork\nwon't do itself. + farewell: + - Bye bye. +primis_pontis_groves_generic_npc_17: + name: '&2Felicius Esurpus' + role: '&2' + greetings: + - Greetings! + dialog: + - If you need anything\nspeak to the king. + - Sorry, I am busy. + - No time for chit-chat,\nmy apologies. + farewell: + - Goodbye. +primis_pontis_groves_generic_npc_2: + name: '&2Sceledrus Fredisius' + role: '&2' + greetings: + - Heya! + dialog: + - I am actually fishing for bugs. + - Large aqua-bugs fall from the trees. + - I use tree sap as bait. + - The aqua-bugs cannot resist the bait! + - They are actually amphibious. + - Gotta catch'em before they head for the trees. + - They are quite tasty if you roast them. + - Hoping for a good catch! + farewell: + - Later. +primis_pontis_groves_generic_npc_3: + name: '&2Felicius Surius' + role: '&2' + greetings: + - Hi there! + dialog: + - The ocean is so pretty. + - I could stand here for days. + - The spiders sure are annoying. + farewell: + - Bye. +primis_pontis_groves_generic_npc_4: + name: '&2Periplectomenus Burcanius' + role: '&2' + greetings: + - Welcome! + dialog: + - Plenty of glow berries left. + - Hope you like my little farm. + - So many wines to attend to. + farewell: + - See you later. +primis_pontis_groves_generic_npc_5: + name: '&2Stephanus Magnus' + role: '&2' + greetings: + - Hey there! + dialog: + - Did you check out the berry farm? + - Lovely time for a walk. + - Can't be inside all the time. + farewell: + - Have a good one. +primis_pontis_groves_generic_npc_6: + name: '&2Abundantius Rogatus' + role: '&2' + greetings: + - Hiya! + dialog: + - What brings you into our lovely hole? + - Feel free to stay a while. + farewell: + - Bye. +primis_pontis_groves_generic_npc_7: + name: '&2Albanus Ivmarus' + role: '&2' + greetings: + - Easy there... + dialog: + - What? Yes, I'm doing just fine. + - I did not have too many, nope. + - Just one more... + - One more pint... + farewell: + - Farewell. +primis_pontis_groves_generic_npc_8: + name: '&2Bacchis Aventinus' + role: '&2' + greetings: + - Good day or evening... + dialog: + - I am so cozy right now. + - We used to go outside more often. + - Too many dangers outside these days. + farewell: + - Bless ya. +primis_pontis_groves_generic_npc_9: + name: '&2Pasicompsa Getha' + role: '&2' + greetings: + - Come in, come in! + dialog: + - Welcome to the best hole in the grove! + - Built this hole with my own hands! + - Hope you enjoy your stay! + farewell: + - Come back soon! +primis_pontis_groves_hole_luxuria: + name: '&cLuxuria Gorgonius' + role: '&c' + greetings: + - Hi there! + - Hellos! + dialog: + - Life is all about taking it easy. + - Why stress. + farewell: + - Visit us again! +primis_pontis_groves_hole_phygia: + name: '&cPhygia Gorgonius' + role: '&c' + greetings: + - Welcome to my home! + - Hellos! + dialog: + - We have to take action! + - Too many elves in our grove. + farewell: + - Visit us again! +primis_pontis_groves_lighthouse_generic_npc_1: + name: '&3Eleusium Martius' + role: '&3' + greetings: + - What brings you here? + dialog: + - Gotta make sure the\nlighthouse is working. + - Nice to see someone\ncome visit. + farewell: + - Goodbye. +primis_pontis_groves_lighthouse_generic_npc_2: + name: '&3Caelia Zoilus' + role: '&3' + greetings: + - Hey. + dialog: + - I hope he will\nbe alright. + - My turn to watch\nover the light. + - We almost ran\nout of food. + farewell: + - Bye. +primis_pontis_groves_lighthouse_sick_man: + name: '&3Alanus Secundas' + role: '&c' + dialog: + - I don't feel so good + - Hopefully I recover soon. + - Well, I am feeling a bit better. + - We need more food. + farewell: + - Farewell. +primis_pontis_groves_parkour_npc_1: + name: '&3Posuere Hominem' + role: '&c' + dialog: + - Up for a challenge? + - You think you got what it takes? + - Wanna go swinging? + - You a mad lad? + - No cheating! + farewell: + - See you later. +primis_pontis_groves_parkour_npc_2: + name: '&cIdoneitatem Hominem' + role: '&3' + dialog: + - That was impressive! + - Try and beat my record of 1m 47s. + - No cheating! + farewell: + - See you later. +primis_pontis_guard: + name: '&cPontis Guard' + role: '&8' + greetings: + - Want to upgrade gear? + dialog: + - Lost? Follow the bridge colors. + - Every bridge path has at least one color! + - Stay out of trouble! + - Don't cause any trouble! + - Pontis was built like a maze for defense. + - The bridge ceilings show that path's color! +primis_pontis_guard_1: + name: '&cPontis Guard' + role: '&8' + greetings: + - Want to upgrade gear? + dialog: + - Lost? Follow the bridge colors. + - Every bridge path has at least one color! + - Stay out of trouble! + - Don't cause any trouble! + - Pontis was built like a maze for defense. + - The bridge ceilings show that path's color! +primis_pontis_guard_2: + name: '&cPontis Guard' + role: '&8' + greetings: + - Hello! + dialog: + - This way to the shogun! +primis_pontis_guard_rat: + name: '&cPontis Elite Guard' + role: '&8' + greetings: + - Darn rats! + dialog: + - Filthy rats!!! + - Hold still,\ndarn you! + - Stop dodging\nmy attacks! + - Almost got one! + - Just die! + - Why wont you die!!! + - You can't dodge\nforever! + - Next strike! + - You're dead! + - How dare you\ndodge! + - Almost! +primis_pontis_guard_rat_at_wormhole: + name: '&cPontis Elite Guard' + role: '&8' + greetings: + - What's taking\nso long. + dialog: + - We got this\nunder control. + - Do not worry,\nthe elite guard\nis on the case! +primis_pontis_guard_shogun_1: + name: '&4Royal Guard' + role: '&8' + dialog: + - Don't go getting into trouble. + - Don't mind me, just keeping the peace. + - No funny business here. + - I've got my eye on you, adventurer. + - No questions, and no one gets hurt! + - Ain't got no time for messing around. + farewell: + - Safe travels, adventurer. +primis_pontis_guard_shogun_1_cat_quest: + name: '&4Royal Guard' + role: '&8' + dialog: + - Don't go getting into trouble. + - Don't mind me, just keeping the peace. + - No funny business here. + - I've got my eye on you, adventurer. + - No questions, and no one gets hurt! + - Ain't got no time for messing around. + farewell: + - Safe travels, adventurer. +primis_pontis_mille_arena_master_observatory: + name: Stella Hominis + role: + greetings: + - Hellos! + dialog: + - I hope to see many stars. + - Such heavenly bodies! + - The cosmos calls to me. + - Infinite possibilities. + - The ancient knowledge... + - I have tales to tell. + - If only you knew... + farewell: + - May the stars bless you. +primis_pontis_mille_concerned_shipmate: + name: '&3Delphium Calpurnius' + role: '&8' + dialog: + - Sigh. + - So much for my\nshipments... + farewell: + - Safe travels! +primis_pontis_mille_fields_camp_generic_npc_1: + name: '&cScribonia Ingenvinus' + role: '&c' + dialog: + - The most dangerous\nweapon is the one\nbetween your ears. + - Three arrows\nis all I need. + farewell: + - Catch ya later! +primis_pontis_mille_fields_camp_generic_npc_2: + name: '&cValador Lumus' + role: '&c' + dialog: + - I have hunted in\nmany places. + - Do you travel\na lot too? + farewell: + - May your blade be swift. +primis_pontis_mille_fields_camp_generic_npc_3: + name: '&cPhygia Ahala' + role: '&c' + dialog: + - Nothing like a\ngood hunt! + farewell: + - Stay safe. +primis_pontis_mille_fields_camp_generic_npc_4: + name: '&cAdrius Paterculus' + role: '&c' + dialog: + - The hunt calls! + farewell: + - Swift death. +primis_pontis_mille_fields_camp_generic_npc_5: + name: '&cCappadox Galerus' + role: '&c' + dialog: + - Join us, stranger! + farewell: + - Later. +primis_pontis_mille_fields_camp_generic_npc_6: + name: '&cSulpicio Rutilius' + role: '&c' + dialog: + - Hope our camp\nprovides you respite\nfrom the wild. + farewell: + - Bye. +primis_pontis_mille_fields_camp_generic_npc_7: + name: '&cAquarius Manus' + role: '&c' + dialog: + - Don't mind me just\nfetching some water. + - Clear blue water today. + farewell: + - Bye. +primis_pontis_mille_fields_camp_magmus: + name: '&cMagmus Hypnos' + role: '&4' + dialog: + - Where is Volumnia... + - I hope she isn't in\ntrouble again. + - I need a good rest. + - If only there were more\nhours in the day. + - Speak to me when you\nhave found Volumnia. + - So much work,\nso little time. + - Yet another 17 hour day. + - I worry too much. + farewell: + - Never enough time... +primis_pontis_mille_fields_farm_berry_npc: + name: '&9Dordalus Nasica' + role: '&e' + dialog: + - Berries are so tasty! + - You should eat\nmore berries! + - Why would they\nsteal my berries... + farewell: + - See'd ya later. +primis_pontis_mille_fields_farm_boy_npc: + name: '&9Planesium Victricius' + role: '&e' + dialog: + - So many rats... + - Phew almost\ndone here. + - This thing better hold. + - Any more lifting and\nI'm gonna break. + - The view from here\nis really nice. + - OK, back to work! + farewell: + - Try some our berries! +primis_pontis_mille_fields_farm_npc: + name: '&9Milonia Majus' + role: '&e' + dialog: + - Get away, darn rats! + - Stop eating my goods! + - Sigh... + farewell: + - Later. +primis_pontis_mille_fields_farm_well_npc: + name: '&eVolumnia Zoilus' + role: '&c' + dialog: + - Watch out for its spit! + - Its saliva is toxic. + - Please help! + - I hope nobody hears\nabout this... + - Am I glad to see you! + farewell: + - How could I let this happen. +primis_pontis_mille_fields_windmill_npc_1: + name: '&eDinia Niraemius' + role: '&d' + dialog: + - Plenty of wheat to process! + - No flour no bread. + - Do you like bread too? + farewell: + - See you. +primis_pontis_mille_fields_windmill_npc_2: + name: '&eDaemones Maritialis' + role: '&d' + dialog: + - It's so nice out here! + - Do you like my windmill? + - Just out here on break. + farewell: + - See you. +primis_pontis_mille_fields_windmill_npc_3: + name: '&eAdulescens Lupis' + role: '&d' + dialog: + - Hoping for some good wind! + - Need some flour? + - This one is the best Windmill around! + farewell: + - Bless ya. +primis_pontis_mille_general_bromia: + name: '&6Bromia Curio' + role: '&6General' + greetings: + - Hail! + dialog: + - It's time for war! + farewell: + - Goodbye! +primis_pontis_mille_general_cylindrus: + name: '&eCylindrus Celatus' + role: '&eGeneral' + greetings: + - Hail! + dialog: + - There is not enough time! + farewell: + - Goodbye! +primis_pontis_mille_general_godefridus: + name: '&cGodefridus Novation' + role: '&c' + greetings: + - Greetings! + - Hail! + dialog: + - Someone needs to drop\noff these documents. + - So many candles... + farewell: + - See you +primis_pontis_mille_general_rogerius: + name: '&eRogerius Olennius' + role: '&eGeneral' + greetings: + - Hail! + dialog: + - So much to do! + - I hope those 4 are ok... + farewell: + - Bye! +primis_pontis_mille_lighthouse_man: + name: '&3Hegio Remus' + role: '&c' + dialog: + - It is so beautiful up here. + - The best view... + farewell: + - Farewell. + - The sun sets! +primis_pontis_mille_major: + name: '&cFortes Bellator' + role: '&c' + greetings: + - Hello traveler! + - Hail! + dialog: + - Those darn goblins! + farewell: + - Farewell! +primis_pontis_mille_mew_meowzer: + name: '&aMew Meowzer' + role: '&d' + dialog: + - Meooooww! + - Meow... + - Mreeeooooowww... + - Meowww. + - MEOW! + farewell: + - Prrrr meow! +primis_pontis_mille_observatory_arena_turn_in: + name: Virgo Dexippus + role: + greetings: + - Hi! + dialog: + - Stella knows a lot. + - Stars have so much to tell. + - The light tells all. + farewell: + - May the moon light your way. +primis_pontis_mille_royal_guard_centurion: + name: '&4Royal Guard Centurion' + role: '&8' + dialog: + - No dallying! + - Set up camp! + - Where are our reinforcements? + - How many have fallen? + - We need to reorganize! + farewell: + - Tread lightly and carry a big sword. +primis_pontis_mille_scout_1: + name: '&cSyra Ursacius' + role: '&cWounded Scout' + greetings: + - Hail! + dialog: + - I can barely hold on... + farewell: + - Bye! +primis_pontis_mille_scout_2: + name: '&cSparax Auxilius' + role: '&cWounded Scout' + greetings: + - Hail! + dialog: + - The pain... + farewell: + - Bye! +primis_pontis_mille_scout_leader: + name: '&cBlepharo Octavius' + role: '&cScout Leader' + greetings: + - Hail! + dialog: + - It was too much... + farewell: + - Bye! +primis_pontis_mille_shogun: + name: '&6Navita' + role: '&c' + greetings: + - Yes? + dialog: + - Can I help you? + farewell: + - Walk softly, and carry a big gun. +primis_pontis_mille_slums_generic_npc_1: + name: '&7Gallicles Rex' + role: '&7' + dialog: + - It's not much but its our\nlittle part of town + farewell: + - Later. +primis_pontis_mille_slums_generic_npc_2: + name: '&7Gallicles Caelistis' + role: '&7' + dialog: + - Day by day... + farewell: + - '...' +primis_pontis_mille_slums_generic_npc_3: + name: '&7Nicodemus Frontinus' + role: '&7' + dialog: + - Fresh water for\nthe home. + farewell: + - The well serves\nus well +primis_pontis_mille_slums_generic_npc_4: + name: '&7Cocus Lucio' + role: '&7' + dialog: + - Hope you're having\na great day. + farewell: + - Enjoy your stay. +primis_pontis_mille_slums_generic_npc_5: + name: '&7Cornelia Florius' + role: '&7' + dialog: + - Which one should\nI get... + farewell: + - So many pretty\nflowers. +primis_pontis_mille_slums_generic_npc_6: + name: '&7Rutilia Placidus' + role: '&7' + dialog: + - I love it here. + - The smell of hay\nmakes me happy. + - My favorite place to\nrelax after a hard day. + farewell: + - Hay ya later! +primis_pontis_mille_slums_npc_1: + name: '&7Lena Lucan' + role: '&7' + dialog: + - Just one loaf of bread... + farewell: + - Wonder what tomorrow brings. +primis_pontis_mille_slums_npc_2: + name: '&7Tranio Florens' + role: '&7' + dialog: + - Doing OK today\nactually. + farewell: + - Night save ya. +primis_pontis_mille_slums_npc_3: + name: '&7Rufia Tertulus' + role: '&7' + dialog: + - At least something\ngood for\nthe kids. + - Not much at\nthe market... + - I cannot\nafford that. + farewell: + - Later. +primis_pontis_mille_slums_npc_4: + name: '&7Fabia Praetextus' + role: '&7' + dialog: + - Just close my eyes\nfor a second. + - Gotta imagine I am\nat a better place. + farewell: + - Goodbye. +primis_pontis_mille_slums_npc_5: + name: '&7Augustina Verrucosis' + role: '&7' + dialog: + - So many mouths\nto feed. + - Maybe some fruit\nfor the little\nones. + farewell: + - Bye. +primis_pontis_mines_guard_1: + name: '&cPontis Guard' + role: '&c' + greetings: + - HELP!!! + dialog: + - Please kill them! + - I am so scared. +primis_pontis_mines_guard_2: + name: '&cPontis Guard' + role: '&c' + greetings: + - SOMEONE PLEASE!!! + dialog: + - I don't wanna die! + - Can't hold out any more. +primis_pontis_mines_guard_3: + name: '&cPontis Guard' + role: '&c' + greetings: + - SAVE ME!!! + dialog: + - Are they gone? + - GET ME OUT! +primis_pontis_outpost_officer: + name: '&4NAME ME' + role: '&8' + dialog: + - I am unfinished! + - There is supposed\nto be an outpost\nhere. + farewell: + - Bye! +primis_pontis_redwoods_injured_lumberjack: + name: '&6Lyco Lupicinus' + role: '&6' + greetings: + - Heyo! + dialog: + - Darn saw! + - Got me again... + farewell: + - See you later. +primis_pontis_redwoods_lumberjack: + name: '&6Ligna Crispian' + role: '&6' + greetings: + - Greetings! + dialog: + - I love the look of a healthy tree. + - The brown tree really smells. + - |- + Pretty sure I saw a wolf on two legs + creeping around at night around here. + farewell: + - Until next time. +primis_pontis_redwoods_lumberjack_generic_1: + name: '&6Mulier Proculus' + role: '&6' + greetings: + - Hey-yo! + dialog: + - I wish they would leave us alone. + - Perfect day for logging. + farewell: + - Pinecone ya later! +primis_pontis_redwoods_lumberjack_generic_10: + name: '&6Piscatores Trenico' + role: '&6' + greetings: + - Well met! + dialog: + - Go away wolves! + - Leave me alone, darn fur-balls! + - Hah! Try and reach me up here! + farewell: + - Bye, Bye! +primis_pontis_redwoods_lumberjack_generic_2: + name: '&6Alanus Hermina' + role: '&6' + greetings: + - Hi... + dialog: + - Not so loud, keep it down. + - I am catching an extra break. + - Don't tell em I am here. + - Logging is tough work... + farewell: + - Later +primis_pontis_redwoods_lumberjack_generic_3: + name: '&6Lena Triarius' + role: '&6' + greetings: + - What's up! + dialog: + - Just standing here buzzin! + - Operating the saw is kinda fun. + - Gotta make sure you don't get hurt. + farewell: + - Catch you later! +primis_pontis_redwoods_lumberjack_generic_4: + name: '&6Aquila Isatis' + role: '&6' + greetings: + - How's it going! + dialog: + - Darn logs! + - No, not that way! + - Float better!!! + - Yep, that will do it. + farewell: + - See ya! +primis_pontis_redwoods_lumberjack_generic_5: + name: '&6Sulpicio Sidonius' + role: '&6' + greetings: + - Hi! + dialog: + - Nothing like a nice fire! + - Just relaxing after an honest day of work. + - Join us! + farewell: + - Bye, friend! +primis_pontis_redwoods_lumberjack_generic_6: + name: '&6Strobilus Clemens' + role: '&6' + greetings: + - Salutations! + dialog: + - Chopping like a beaver! + - The fastest axe in the west. + - No tree is a match for me! + farewell: + - Smell ya later! +primis_pontis_redwoods_lumberjack_generic_7: + name: '&6Candidus Nigellus' + role: '&6' + greetings: + - Greetings! + dialog: + - Fastest axe...my bottom! + - Don't take his ramblings seriously. + - Mr. big-shot sure has a lot to say. + farewell: + - Goodbye! +primis_pontis_redwoods_lumberjack_generic_8: + name: '&6Strobilus Clemens' + role: '&6' + greetings: + - I'm a bit busy! + dialog: + - We need to increase production... + - If we raise the cost... + - Need to order more axes. + farewell: + - Uh... +primis_pontis_redwoods_lumberjack_generic_9: + name: '&6Martinus Lepontus' + role: '&6' + greetings: + - Woah, hello! + dialog: + - You're coming down big one! + - I will show you! + - My axe, your bark, they should meet. + - Start off with a good chop. + farewell: + - Scared me... +primis_pontis_redwoods_lumberlord: + name: '&6Magnus Castorea' + role: '&6' + greetings: + - HELLO! + dialog: + - Nothing like healthy wood. + - |- + For every tree we cut, + we plant a new one! + - Big brown logs, yep. + farewell: + - BYE! +primis_pontis_redwoods_reyn: + name: '&6Reynus Protectoris' + role: '&6' + greetings: + - I am turning up the heat! + - Hiya! + dialog: + - Are you into logs? + - I love the smell of lumber! + farewell: + - See you later. + - Bye bye! +primis_pontis_scrapper: + name: '&7Fragmentum' + role: '&8' + greetings: + - Got something to scrap? + - Got trash? + - Need scrappin'? + dialog: + - I'll scrap anything you bring! + - Need scrap? + - Want scrap? +primis_pontis_smelter: + name: '&7Orbis' + role: '&8' + greetings: + - Want to upgrade gear? + dialog: + - Need upgrade orbs? + - I'll make upgrade orbs for scrap! + - Bring me scrap! +primis_sewer_donatello: + name: '&5Donatello' + role: '&dSewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_sewer_leonardo: + name: '&1Leonardo' + role: '&9Sewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_sewer_michelangelo: + name: '&6Michelangelo' + role: '&eSewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_sewer_raphael: + name: '&4Raphael' + role: '&cSewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_spa_attendee_1: + name: '&fNatsumi' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_2: + name: '&5Hanako' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_3: + name: '&3Tamika' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_4: + name: '&9Zaphra' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_5: + name: '&4Chie' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_6: + name: '&fKatashi' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_7: + name: '&dAkihiko' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_8: + name: '&6Sheranee' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - Rawr... + - OwO + farewell: + - Have fun! +primis_spa_staff: + name: '&cAozora' + role: '&7' + dialog: + - Enjoy the hot spring! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_staff_2: + name: '&6Rei' + role: '&7' + dialog: + - Enjoy the hot spring! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_terravilla_annoyed_explorer: + name: '&6Dorippa Sarimarcus' + role: '&6' + greetings: + - How's it going. + dialog: + - Not again. + - Stuck once more. + farewell: + - Be seeing you. +primis_terravilla_explorer: + name: '&6Telestis Senna' + role: '&6' + greetings: + - How goes it. + dialog: + - Always so\nbusy. + - Need a bag? + farewell: + - Bye. +primis_terravilla_generic_npc_1: + name: '&6Stephanium Major' + role: '&6' + greetings: + - Welcome to Terravilla! + dialog: + - Watch out for the\nTwo Legged Terrors! + - Here to check out the ruins? + farewell: + - Bye. +primis_terravilla_generic_npc_10: + name: '&6Mallia Galvisius' + role: '&6' + greetings: + - Heyo! + dialog: + - I would rather be in\ndown in the ruins... + - Hog watching to\npass the time. + farewell: + - Laters. +primis_terravilla_generic_npc_11: + name: '&6Papiria Virginius' + role: '&6' + greetings: + - Ok then... + dialog: + - Hit him harder! + - Woah! Good one! + - Yeah! Mess him up! + farewell: + - Yep... +primis_terravilla_generic_npc_12: + name: '&6Umbria Maccalus' + role: '&6' + greetings: + - What! + dialog: + - Is a girl not\nallowed to be\non a rooftop. + - Just try and\nget me down! + farewell: + - Yeah, whatever... +primis_terravilla_generic_npc_2: + name: '&6Delphium Assanius' + role: '&6' + greetings: + - Leave me alone! + dialog: + - What are you\nlooking at. + farewell: + - Scram! +primis_terravilla_generic_npc_3: + name: '&6Stephanium Vopiscus' + role: '&6' + greetings: + - Leave me alone! + dialog: + - What are you\nlooking at. + farewell: + - Scram! +primis_terravilla_generic_npc_4: + name: '&6Simo Clericus' + role: '&6' + greetings: + - Hey! + dialog: + - Heard the hog is on\nthe lift again. + farewell: + - Bye. +primis_terravilla_generic_npc_5: + name: '&6Harpax Colias' + role: '&6' + greetings: + - Ello. + dialog: + - The bo...I mean the\nOverseer is upstairs. + farewell: + - Laters. +primis_terravilla_generic_npc_6: + name: '&6Sulpicio Epolonius' + role: '&6' + greetings: + - Hi there. + dialog: + - I hope the ruins\nopen up again soon. + - I miss artifact\nhunting. + farewell: + - Goodbye. +primis_terravilla_generic_npc_7: + name: '&6Baebia Lucan' + role: '&6' + greetings: + - '...' + dialog: + - Cringe... + farewell: + - '...' +primis_terravilla_generic_npc_8: + name: '&6Novia Longinus' + role: '&6' + greetings: + - '...' + dialog: + - Are you always\nstaring at people? + - How about some\nprivacy? + farewell: + - '...' +primis_terravilla_generic_npc_9: + name: '&6Septimia Baro' + role: '&6' + greetings: + - Oh, hey. + dialog: + - If it opens up again\nthen I gotta go\nget more of these. + - What is this skull\nnfrom hmm... + farewell: + - '...' +primis_terravilla_overseer: + name: '&6Lutum Princeps' + role: '&6' + greetings: + - Yes? + dialog: + - What is it\nnow... + - I need to check\nup on them. + - At least I\nam not bored. + farewell: + - Good luck. +primis_terravilla_researcher: + name: '&6Plautia Suilius' + role: '&6' + greetings: + - Hmm... + dialog: + - Maybe if... + - That can't be right + - Not sure... + farewell: + - Later... +primis_traveler_1: + name: '&6Lysidamus Nolus' + role: '&6' + greetings: + - Hello stranger! + dialog: + - On my way back from the village. + - Heading to the village? + - Good luck on\nyour travels. + farewell: + - Roads bless you. +primis_traveler_2: + name: '&6Citro Gala' + role: '&6' + greetings: + - Hi! + dialog: + - On my way back\nfrom the village. + - Coming from Pontis Mille or? + - Good luck! + farewell: + - Roads bless you. +primis_traveler_3: + name: '&6Bromia Culleolus' + role: '&6' + greetings: + - Hello! + dialog: + - Are you too going\nto the village? + - I heard it's pretty\ncold there at\nthe village. + - Phew! Almost there!\nI gotta keep going. + farewell: + - Roads bless you. +primis_traveler_4: + name: '&6Demenis Nolus' + role: '&6' + greetings: + - Hello stranger! + dialog: + - Good to see someone\nelse on the road. + - Almost reached the village. + - Phew! + farewell: + - Roads bless you. +primis_traveler_5: + name: '&6Callipho Classicius' + role: '&6' + greetings: + - Heya! + dialog: + - I need better shoes. + - Soon I will\nbe home. + - Good to see the\nfields again! + farewell: + - Safe travels! +primis_traveler_6: + name: '&6Rodenus Palis' + role: '&6' + greetings: + - Hi there! + dialog: + - I am on my way back\nfrom the village. + - Good to see\nPontis Mille again. + - Is my brother lost again... + - Where is he? + farewell: + - Later! +primis_traveler_7: + name: '&6Gorenus Palis' + role: '&6' + greetings: + - Hey... + dialog: + - Am I lost again? + - This isn't Pontis Mille. + - Where am I? + - Uhh, this doesn't\nseem like the\nright way... + farewell: + - Bye. +quest_giver: + name: ケルスザード + role: <クエスト依頼人> + greetings: + - 冒険者の皆さん、こんにちは!\nクエストはいかがですか? + - そこのあなた!いいクエストがあります! + - 冒険を感じていますか? + dialog: + - ギルドクエストをクリアして\n素敵な報酬を手に入れよう。 + - より高いレベルのクエストには\nより多くの報酬が用意されています。 + - より高いレベルのクエストでは\nより高いレベルのモブを狩ることができます。 + - 難しいことに挑戦したいなら\nギルドのランクを上げよう。 + - 充実した装備で臨みましょう。 + farewell: + - 友よ、安全な旅行へ + - 狩りを楽しんでください! + - 長生きし、繁栄! + - あなたの盾を持って戻ってきてください\nまたはその上に乗って。 + - 死ぬ前の人生! + - 弱点前の強さ! + - 目的地までの旅! +refiner_config: + name: ラルフ + role: + greetings: + - スクラップをアップグレードしませんか? + - スクラップをお持ちですか? + - 低レベルのスクラップを探しています! + - こんにちは、スクラップがありますか? + - スクラップをリサイクルしますよ! + dialog: + - スクラップのアップグレードが必要ですか? + - Upgrade your scrap here! + - スクラップを 10 個でより高いレベルにアップグレードできますよ! + - スクラップを有効活用しませんか! + - 低レベルのスクラップはありませんか? + farewell: + - \n個スクラップを手に入れたらまたおいで。 + - \nスクラップの活用をお忘れなく! + - もっとスクラップを探してきて! +repairman_config: + name: レジー + role: 修理工 + greetings: + - ここでアイテムを修理できるぜ! + - アイテムをスクラップ用に修理できるぜ! + - スクラップで耐久値を回復できるんだぜ! + - 修理するかい? + - 壊れちゃったのかい? + dialog: + - この街で最高の修理屋さ! + - 任せとけって! + - 修理していかないか? + - アイテムを修理できるよ! + - エリートアイテムの修理が必要なんだろ? + farewell: + - メンテナンスをお忘れなく! + - 修理が必要ならここにおいで! + - 修理が必要な時は\nページ目を選んでくれよな。 +santa: + name: '&4Saint Nick' + role: '&c' + greetings: + - Ho ho ho! + dialog: + - I have lost some presents, \ncan you help me? + - Dear traveller, I have\na request for you! + - Can you help an old man\nin his time of need? + farewell: + - Ho ho ho! +scrapper_config: + name: Kelly + role: + greetings: + - Want to get rid of items? + - Need to recycle items? + - Looking to scrap? + - It's scrap 'o clock! + - Scrap time! + dialog: + - Scrappy deals! + - Get your scrap here! + - 75% chance to work! + - 返金はありません。 + - Recycle, reuse, reduce! + farewell: + - Come back when you have\nmore to scrap + - \nスクラップの活用をお忘れなく! + - Happy scrapping! +smelter: + name: サム + role: 製錬工 + greetings: + - スクラップをお持ちですか? + - 不要なスクラップをお持ちですか? + - スクラップの匂いがするぞ!? + - スクラップが欲しい! + - スクラップをよこせ! + dialog: + - 君のスクラップを役立たせてあげよう! + - スクラップをくれたら、\nオーブをあげるから! + - そのスクラップは使い物にならないだろ!よこせ! + farewell: + - \n個スクラップを手に入れたらまたおいで。 + - 今すぐアップグレードをやめて去れ!! +special_blacksmith: + name: グレッグ + role: <特別な鍛冶屋> + greetings: + - 何か必要ですか? + - なにか欲しい物はありますか? + - いい商品しか売っていません + - 何か売りませんか? + - エリートmobの装備を売ってください。 + dialog: + - 安く買って高く売る。 + - 返金不可。 + - 絶対に返金はしません。 + - 返金はありません。 + - 取り消しはできません。 + - よく考えて買ってください。 + farewell: + - もっと使えるようになったら\nまた来てね。 + - 自殺するな。\nあと装備を持ってきてほしい。 + - 次はもっと高いものを\n買ってください。 + - 忘れないでください、返金はありません。 +test_npc: + name: Test NPC + role: Testing! + greetings: + - Test Greeting! + dialog: + - Test Dialog! + farewell: + - Test Farewell! +travelling_merchant: + name: ジーブス + role: <旅する商人> + greetings: + - 売りたいものはないかい? + - 呼びましたか? + - ん? + dialog: + - 私は安いのでそれを購入します! + - 何かご用ですか? + - 時は金なり! + farewell: + - いつでも呼んでください! + - これで終わりですか? + - 安全な旅を! + - 殺されないで! + - 狩りを楽しんで! +unbinder: + name: Ulfric + role: + greetings: + - Greetings. + - Well met. + - Hail, friend. + - Yes? + - May I help you? + dialog: + - I will unbind your items\nfor an extremely rare unbind scroll. + - I am the only one qualified\nto unbind your goods. + - Have an unbind scroll? + farewell: + - "Remember: Use unbind\nscrolls wisely." + - 友よ、安全な旅行へ +wood_league_arena_master: + name: Gladius + role: + greetings: + - Welcome to the\nArena! + dialog: + - Prepared to face the arena? + farewell: + - Return with your shield, or on it! +wood_league: + arenaName: Wood League + arenaMessages: + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - wave=8:message=&8[Gladius] &fNot bad, but what if every enemy is a &cmelee &fenemy? + - wave=9:message=&8[Gladius] &fNice, nice, but what if they're all &cranged &finstead? + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - wave=44:message=&8[Gladius] &fThis is clearly not working, let me think of something... + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +ag_welcome_quest_0: + customObjectives: + Objective1: + dialog: + - '&8[&aCasus&8]&f Welcome to the Adventurer''s Guild Hub, the hub for all things EliteMobs!' + - You can always get back here using &2/ag&f! + - Talk to me again for a quest! + name: '&2Finding the AG!' + questLore: + - + - + questAcceptDialog: + - '&8[Odigos]&f Alright, make sure you use &2/ag &f or &2/adventurersguild&f to head off to the Adventurer''s Guild Hub!' + - Make sure you talk to Casus when you're there! +ag_welcome_quest_1: + customObjectives: + Objective3: + dialog: + - '&8[&aGreg&8]&f Want to buy or sell something? I''ve got a little of everything!' + Objective4: + dialog: + - '&8[&aCharles&8]&f Want to learn about fighting elites? Just talk to me!' + Objective1: + dialog: + - '&8[&aHermes&8]&f I take you back to where you were before! Just talk to me again!' + Objective2: + dialog: + - '&8[&aBartley&8]&f Need a stiff drink? My drinks pack an extra punch!' + Objective7: + dialog: + - '&8[&aQel''Thuzad&8]&f These Elite monsters, where do they keep coming from?' + - + - + - Just talk to me to get one! + Objective12: + dialog: + - '&8[&aGrog&8]&f Want to buy special items? I''ve got just the thing!' + Objective8: + dialog: + - '&8[&aRalph&8]&f Get more out of your scrap by upgrading it! Just talk to me at any time.' + Objective13: + dialog: + - '&8[&aUlfric&8]&f If you bring me a very special and rare item, I can unbind your Elite items.' + - + - + Objective5: + dialog: + - '&8[&aTim&8]&f Want to upgrade your Elite Items? Just get an upgrade orb from Sam over there!' + Objective10: + dialog: + - '&8[&aKelly&8]&f Got extra Elite items? Don''t know what to do with them? Give them to me, and I''ll turn them into scrap!' + - + - + Objective6: + dialog: + - '&8[&aGillian&8]&f Do you seek power? Do you desire to reach new heights? Talk to me to unlock new guild ranks, and reach levels of power you never thought to be possible!' + Objective11: + dialog: + - '&8[&aSam&8]&f Got extra scrap? I can refine that into Upgrade Orbs, which you can give to Tim to upgrade your Elite items with!' + Objective9: + dialog: + - '&8[&aReggie&8]&f Need your Elite items repaired? Just bring me some scrap, and I''ll make them as good as new!' + - + - + name: '&2Welcome to the AG!' + questLore: + - '&aMeet the Adventurer''s Guild NPCs!' +primis_caeruleaum_a_can_of_worms: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis] &fPlease tell me you''re the one bringing the bait.' + name: '&2A can of worms' + questLore: + - Here, take the bait and go. + - Please hurry! + questAcceptDialog: + - '&a[Callidus Piscatus]&f My friend is in a boat near the docks!' + - '&7&oI should hurry to the boat.' + questCompleteMessage: + - '&a[Piscis Nemesis]&f You brought bait? Perfect!' + - The bait should lure it out! + - '&7&oI should talk with Nemesis.' +primis_caeruleaum_fishing: + name: '&2Fish Bait' + questLore: + - We have a big problem! + - + - + - + - + - but he can't do anything without the right bait! + - I'll tell you where to go get &eFish Bait &f, please go help my friend! + - I promise I'll reward you! + questAcceptDialog: + - '&a[Callidus Piscatus]&f Time is of the essence! There are a bunch of &cBig Worms&f to the right when you leave the village!' + - Get 5 and come back here and I will prepare them for use. + - '&7&oI should go get some Fish Bait.' + questCompleteMessage: + - '&a[Callidus Piscatus]&f You brought bait? Perfect!' + - I'll prepare it right away! + - '&7&oI should talk to &aCallidus &7&oagain and collect the prepared bait.' +primis_caeruleaum_fishing_2: + name: '&2Monster Bait' + questLore: + - That did the trick! Hop into the wormhole, I'll hold the boat! + - Let's show this monster the wrath of a fisherman! + questAcceptDialog: + - '&a[Piscis Nemesis]&f Hop in, I''ll hold the boat!' + - Don't forget to put on that &eDiving Helmet&f! + - '&7&oI should enter the wormhole and defeat the Sea Monster.' + questCompleteMessage: + - '&a[Piscis Nemesis]&f Haha! What a show!' + - '&fOf course, I had the situation under control this entire time, but you sure helped a bit!' + - '&fHere, you can have this!' + - '&7&oThe monster is dead and the shore is safe. Seems like a job well done.' +primis_caeruleaum_fletching: + name: '&2Arrow Hunter' + questLore: + - Got a few minutes to help out? + - With all the recent raids, we have found ourselves out of &eGrappling Arrows&f! + - It is usually my job to get them, but things are just a + - bit too dangerous right now for me to go dungeon delving. + - If you could get these &eGrappling Arrows&f for me, + - I will teach you how to use them! + questAcceptDialog: + - '&a[Ventus Artifex]&f Please bring me 10 &eGrappling Arrows &ffrom the ruins just beyond the village.' + - The &cUndead Skeletons&f and &cDrowned&f from of old usually carry these. + - '&7&oI should go kill &cSkeletons&7&o and &cDrowned&7&o at the ruins near the village for their &eGrappling Arrows&7&o.' + questCompleteMessage: + - '&a[Ventus Artifex]&f Great work!' + - '&eGrappling Arrows &fcan be used on &cTarget Blocks &fto get to hard to reach places.' + - They are a must have for the aspiring ancient ruin delver. + - Here is your reward! + - How about putting your knowledge to the test? + - '&7&oSeems like &aVentus Artifex&7&o has a challenge for me.' +primis_caeruleaum_fletching_2: + name: '&2Shield Hunter' + questLore: + - You got the arrows? Great! + - Use those arrows with a bow to climb the tower! + questAcceptDialog: + - '&a[Ventus Artifex]&f Use the arrows you just received to go to the ruins and shoot the targets with them!' + - + - + - + - + - '&7&oI should go get the &eShield&7&o inside of the ruins, using the &eGrappling Arrows&7&o in order to shoot the targets inside of the building.' + questCompleteMessage: + - '&a[Ventus Artifex]&f Outstanding!' + - Truly you are a real ruins delver! + - Here is your reward! + - '&7&oSeems like Grappling Arrows will be useful in the future.' +primis_caeruleaum_foraging: + name: '&2Wolf Bait' + questLore: + - I heard you were looking to help out around here. + - There is a &dDen of Wolves&f nearby that is + - really impeding my foraging for the village! + questAcceptDialog: + - '&a[Venator Pabulatus]&f If you can get rid of those pesky &cWolves&f, I will reward you handsomely!' + - I am getting too old to be dealing with the wild things of these lands... + - '&7&oI should go kill the &cWolves&7&o in the den to the Southeast of the village.' + questCompleteMessage: + - '&a[Venator Pabulatus]&f I knew I could count on you!' + - Thank you for all of your help! + - Here is your reward as promised. +primis_farmstead_lighthouse_keeper_2: + customObjectives: + Objective1: + dialog: + - "&a[Jeeves]&f &2Amavit&f sent you? What's this about a lighthouse? My, what a discovery!\n&fThis will revolutionize my job as a traveling merchant! Here, have these &eScrolls&f - just call me and I'll be there in a jiffy!\n&7&oSeems like &aJeeves&7&o has something for me. I should talk to him." + name: '&2The Mysterious Lights' + questLore: + - + - + - My father &aJeeves&f went to the top to check but he has not returned yet. + - + - + questAcceptDialog: + - '&a[Amavit]&f Thank you once again, and good luck. Hopefully it''s nothing.' + - '&7&oI should go to the &dTop of the Lighthouse&f, investigate the issue and then report back to &aAmavit''s&f father &aJeeves&f in the village.' + questCompleteMessage: + - '&7&oThese scrolls seem mighty useful! I should use the &dLighthouse&7&o to get back to the &dFarmstead&7&o and keep moving.' +primis_gladius_assassins: + name: '&5Who snipes the snipers?' + questLore: + - The roofs of &dGladius&f are covered in &cAssassins&f! + - Venturing out to the streets is a death sentence. We need to deal with these snipers! + - + - + questAcceptDialog: + - '&a[Belli] Deal with those &cAssassins&f! Remember to use the &eGrappling Arrows&f!.' + - '&7&oI should kill those &cAssassins&7&o.' + questCompleteMessage: + - '&a[Belli]&f You dealt with those &cAssassins&f? Good! That''s one headache dealt with!' +primis_gladius_clear: + name: '&5Taking back the streets' + questLore: + - I don't need to tell you that the town is being invaded, do I? + - We are offering a reward to those willing to put a dent in the amount of &cInvaders&f. + - Are you up for it? + questAcceptDialog: + - '&a[Belli] &fJust go out there and thin their numbers!' + - '&7&oI go out and clear the streets of &dGladius&7&o.' + questCompleteMessage: + - '&a[Belli]&f Look at that, the Gods have provided with a true warrior in our time of need! I have a job for a person like you.' + - '&7&oSeems like &aBelli&7&o has a plan for me. I should talk to her..' +primis_gladius_prayer: + name: '&5Leap of faith' + questLore: + - I am not going to sugarcoat it, things look downright grim! + - The walls have fallen, the streets are teeming + - with the &cUndead&f and I just ran out of drinks. + - At times like these, people turn their hope to + - some kind of divine intervention! + - There is a &dPath&f, lit by candles, that leads to a + - '&dSanctuary in the Mountains&f.' + - Warriors go up this path and defeat the &cMonk&f which guards + - the sanctuary in order to be blessed by the war god in combat. + - It may just be a superstition, but would it hurt + - to give people hope? + - The fact you made your way here shows you are a cut above + - the rest - go up the mountain and defeat the &cMonk&f. + - All warriors will feel better knowing they are being watched over. + questAcceptDialog: + - '&a[Belli] &fGo &dUpstairs&f and follow the candles! Careful not to fall, the path is treacherous!' + - '&7&oI should follow the &dandle Path&7&o and defeat the &cMonk&7&o.' + questCompleteMessage: + - '&a[Belli]&f You completed the prayer? Thank you, the soldiers will feel relieved to hear it.' +primis_gladius_ships: + name: '&5A sinking feeling' + questLore: + - Have you seen them? The dozens of ships just outside + - of &dGladius&f? They are to blame for all of this. + - We never expected an invasion from the &dBlood Temple&f, + - much less one done by siege weapons mounted on boats! + - We must do something about it. Killing the &cAdmiral&f + - and some of the forces won't give us back what we lost, + - but it will sure make us feel better. + questAcceptDialog: + - '&a[Belli] &fKill the &cAdmiral&f and some of the troops on the boats. Be careful about their water superiority! I recommend using &eGrappling Arrows&f to move around the ships.' + - '&7&oI should go slay the &cAdmiral&7&o and some of its troops on the boats just &dOutside of Gladius&7&o.' + questCompleteMessage: + - '&a[Belli]&f The admiral is no more? Why, I feel better already!' +primis_gladius_sunken_ship: + name: '&5Sunken ship' + questLore: + - Now that you took care of the &cMariner Forces&f I got + - another task for you. + - The &dSunken Ship&f should be reachable now. + - You see some time ago one of our ships got sunk, + - unfortunately it was carrying &eImportant DDocuments&f. + - I need you to reach the &dSunken Ship&f and kill any threats + - around and retrieve the &eDocuments&f. + - Come back to me after you have completed the task. + questAcceptDialog: + - '&a[Belli] &fYou will find the ship in the waters to the south-west. Give them hell!' + - '&7&oI should go collect the &eDocuments&7&o and slay any &cMariners&7&o near the ship.' + questCompleteMessage: + - '&a[Belli]&f Back already? Excellent work! We really needed these &eDocuments&f.' +primis_gladius_supplies_1: + name: '&cSupplying problems' + questLore: + - We are running out of &eSupplies&f! + - '&dGladius&f is a fortress equipped to last a long siege' + - without any issues, but that's assuming we have + - access to the &dWarehouse&f! + - Unfortunately the &dWarehouse&f was one of the first places to fall, + - and now we are slowly starving to death! + - If you can clear a path to the &dWarehouse&f and get some &eSupplies&f + - that would greatly aid in the war effort! + questAcceptDialog: + - '&a[Cibus]&f The &dWarehouse&f is hard to miss! It''s the extra large warehouse-looking building near the part where the wall fell! Grab some &eSupplies&f and get them back here!' + - '&7&oI should go to the &dWarehouse&7&o and bring back &eSupplies&7&o.' + questCompleteMessage: + - '&a[Cibus]&f You brought the &eSupplies&f back? Fantastic! Meanwhile I came up with the perfect idea for the drinks - and it should be something that will lift the spirits of the soldiers!' + - '&7&oSeems like the &aCibus&7&o has a plan, I should talk to them.' +primis_gladius_supplies_2: + name: '&cSupplying more problems' + questLore: + - We have food, but what about drinks? + - Some would say it's foolish to get drunk in the middle + - of a war, but if now then when? + - The &cBarkeep&f across the street kept all of the good + - stuff in the &dBasement&f. + - I think you know where I'm going with this! + - Go to the &dBasement&f of the tavern across the street and get + - the &eGood Stuff&f. If you find the &cBarkeep&f, I'd consider it a + - personal favor if you free him from this curse of undeath. + - We are pretty sure that he was in the &dBasement&f when the + - invasion happened so odds are he is still there, + - though probably no longer himself. + - Be careful! + questAcceptDialog: + - '&a[Cibus]&f The &dTavern&f is right across the street, hard to miss! Just head to the &dBasement&f and get the &eGood Stuff&f!' + - '&7&oI should go to the &dBasement&7&o of the tavern and get "the &eGood Stuff&7&o".' + questCompleteMessage: + - '&a[Cibus]&f You defeated the &cBarkeep&f? I thank you for freeing my old man from this accursed undeath. Here, I''ll have the first drink with you.' +primis_ice_village_all_out_of_chains: + customObjectives: + Objective1: + dialog: + - '&a[Orbis]&f Oh, the Ice Village chain shipment. Yes, it is right in that chest over there.' + - Sorry for not sending it over, but we were quite busy and had no time. + - It's all paid for so feel free to just grab it. + name: '&2All out of chains' + questLore: + - Hey, you came from &dPontis Mille&f right? + - How would you like to help us out. + - Here at the jail we tend to go through a + - lot of chains... + - Especially the chains holding up the cages. + - They rust a lot and then they break. That's + - how one of the prisoners escaped. The rusty + - chain snapped, the cage fell and he ran. + - We paid for a + - '&eShipment of new chains&f, but it' + - did not arrive yet. If you could go to + - '&dPontis Mille&f and fetch our' + - '&eShipment of Chains&f' + - then that would be great! + questAcceptDialog: + - '&a[Philolaches Triferus]&f Go talk to Orbis. They are the ones that make the chains.' + - '&7&oI should go talk to &a&oOrbis&7&o and bring back the &e&oShipment of Chains&7&o.' + questCompleteMessage: + - '&a[Philolaches Triferus]&f Those are the chains! Thank you for getting these, we really needed them.' +primis_ice_village_catch_me_if_you_can: + name: '&2Catch me if you can' + questLore: + - What timing! I was just looking for someone to go capture our + - '&cEscaped Prisoner&f.' + - + - + - + - + - + - + questAcceptDialog: + - '&a[Romanus Superbus]&f He must be somewhere in the mountains.' + - '&7&oI need to find the &c&oEscaped Prisoner&7&o and bring him back to the prison.' + questCompleteMessage: + - '&a[Romanus Superbus]&f Well, well, well. If it isn''t our escaped sleeping beauty.' + - Good work. A job well done deserves a good payment, here ya go. + - '&aRomanus&7 hands you a heavy bag of coin.' +primis_ice_village_get_them_off_my_back: + name: '&2Get them off my back!' + questLore: + - Let me tell ya, I sure am glad you are here to help, ha ha. + - Our mission here is to hunt &cRazorbacks&f and keep their numbers in check. + - It's not all about population control either. + - They provide us with valuable leather, tusks and meat. + - Not sure this village would be around without them. + - + - + - + - + - + - + - We only need you to cull the &cBabe&f and the &cJuvenile Razorbacks&f. + - + - + - + - + - Would mean a lot to me if you could retrieve it. + questAcceptDialog: + - '&a[Alanus Isatis]&f You must have seen the &cRazorbacks&f on your way here so I assume you know where to find them.' + - '&7&oI need to cull the &c&oRazorback&7&o population and retrieve &e&oAlanus'' Dagger&7&o.' + questCompleteMessage: + - '&a[Alanus Isatis]&f Well done friend! That should help a lot.' + - + - + - The dagger is nothing special, but it was a handmade gift from my late father. + - Next time you're thirsty, the drinks are on me! +primis_ice_village_gotta_keep_warm: + customObjectives: + Objective1: + dialog: + - '&a[Severinus Martius]&f Ha ha! That should keep me warm for another couple of weeks!' + - Hey friend, you heading for &dCaerullium Village&f by any chance? + name: '&2Gotta keep warm' + questLore: + - We deliver the &aLighthouse Keeper&f some + - of our strong stuff every couple of weeks. + - It keeps him warm during the colder days. + - It's a small gesture of thanks for all his + - hard work. Any chance you could help out + - and bring over the next batch? + questAcceptDialog: + - '&a[Grania Cecilius]&f You can find the lighthouse to the East. Thanks!' + - '&7&oI should go to the &d&oLighthouse&7&o and deliver these to the &a&oLighthouse Keeper&7&o.' + questCompleteMessage: + - '&a[Severinus Martius]&f If you''re heading over there then I would appreciate if you could deliver some of these to my good friend &aJeeves&f.' + - '&7&oSeems like the &a&oLighthouse Keeper&7&o has a quest for me.' +primis_ice_village_gotta_see_jeeves: + customObjectives: + Objective1: + dialog: + - '&a[Jeeves]&f Oh! A gift from my friend Severinus you say.' + - Well, thank you for bringing it over. Was nice seeing you again! + name: '&2Gotta see Jeeves' + questLore: + - Now, now it would be really rude of me to keep + - all of the good stuff to myself! + - If you would bother helping me out friend and + - delivering some of the good stuff + - to my friend &aJeeves&f at &dCaerullium Village&f. + - You can get there quickly by taking the + - '&9lighthouse portal&f.' + questAcceptDialog: + - '&a[Severinus Martius]&f The portal is all the way at the top.' + - '&7&oI should go to &d&oCaerullium Village&7&o and deliver some of the good stuff to &a&oJeeves&7&o.' + questCompleteMessage: + - '&a[Severinus Martius]&f Thank you for delivering some of the strong stuff to Jeeves. I know he likes a good drink here and there ha ha!' +primis_ice_village_living_nightmares: + customObjectives: + Objective1: + dialog: + - '&a[Cornelia Ennodius]&f Are they gone? I was so scared. My parents sent you? Thank goodness.' + - + - + - I couldn't escape. I, I...will be fine, I just need a minute... + name: '&2Living nightmares' + questLore: + - I was following her trail, this is where it ends. + - Not sure where she would have gone from here. + - I fear that something bad might have happened. + - Our &aGirl&f takes a lot after me and my special powers. + - Except that hers are a lot more potent, she is capable + - of making powerful emotions manifest in the real world. + - We are running out of time, we need to find her soon. + questAcceptDialog: + - '&a[Sestia Ennodius]&f The trail went cold here, she cannot be that far away...' + - '&7&oI need to find the &a&oMissing Daughter&7&o before something happens to her.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f You found her! Quickly, where is she?' + - Thank you stranger, I will go to her at once! +primis_ice_village_make_them_go_ouch: + name: '&2Make them go ouch' + questLore: + - I had some naughty '&cCustomers&f' + - come visit some days ago. + - They stole the most valuable + - of my &ePossessions&f. + - You need to find them and make sure + - to teach them a lesson. + - Make sure they know that + - '&aViolet&f does not forget to collect.' + questAcceptDialog: + - '&a[Domina Violet]&f They went East past the &9Trees&f.' + - '&7&oI need to make sure that the &c&oCustomers&7&o know not to mess with &a&oViolet&7&o. I also need to retrieve &e&oViolet''s Property&7&o.' + questCompleteMessage: + - '&a[Domina Violet]&f I hope you taught them the value of pain.' + - + - +primis_ice_village_objection!: + customObjectives: + Objective3: + dialog: + - '&a[Glacies Princeps]&f What, absolutely not. I don''t know how he convinced you to come here and beg for his release.' + - + - + - He will never be released. Is that understood. + Objective1: + dialog: + - '&a[Romanus Superbus]&f Release him? Not guilty? Are you mad? You''re lucky I don''t throw you in a cage too for suggesting such nonsense.' + Objective2: + dialog: + - '&a[Luxuria Placidus]&f Who? Never heard of him.' + name: '&2Objection!' + questLore: + - I do not belong here! Surely you can see that? + - I have done no wrong! Stranger will you hear my plea. + - Would you help this poor soul who has been trapped + - here in this awful cage of no fault of his own? + - You must go talk to the + - '&aJail Master&f or the ' + - '&aVillage Leader&f.' + - Or any other + - '&aFriendly Villager&f' + - who would be + - willing to argue for + - my release! + questAcceptDialog: + - '&a[Adrius Calpornius]&f Go talk to them! Get me out!' + - '&7&oI should go talk to the people on my list.' + questCompleteMessage: + - '&a[Adrius Calpornius]&f WHAT?! LIES!!! I never would do such a horrible thing to my family...' + - + - + - '&7Whatever sanity this poor man still had left, is gone now...' +primis_ice_village_run_away_daughter: + customObjectives: + Objective1: + dialog: + - '&a[Sestia Ennodius]&f I could sense you coming.' + name: '&2Run away daughter' + questLore: + - Stranger! Would you help our family? + - Our &aDaughter&f has gone missing. + - She has been gifted with special + - powers just like her &aMother&f + - I fear that last night something + - terrible must have happened to + - make her run away in the middle of + - the night. + questAcceptDialog: + - '&a[Sparax Ennodius]&f My &aWife&f has already gone looking for her.' + - I am sure she is somewhere outside the village. Go find her and talk to her. + - '&7&oI should go look for the &a&oWorried Mother&7&o.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f You were sent by my &aHusband&f to help with the search?' + - '&7&oI should hear out the &a&oWorried Mother&7&o.' +primis_ice_village_silence: + name: '&2Make them go ouch' + questLore: + - Shhh! Do you hear it? + - The annoying screeching. + - Ugh, I cannot take it anymore! + - Listen, I will pay good coin + - if you can find the source + - of that annoying screeching + - and make it stop. + questAcceptDialog: + - '&a[Modestus Eulogius]&f It sounds like it coming somewhere from the hills behind me.' + - '&7&oI should find the source of all the noise and make it stop.' + questCompleteMessage: + - '&a[Modestus Eulogius]&f Both me and my ears thank you!' +primis_ice_village_taking_the_bait: + name: '&2Taking the bait' + questLore: + - These &cFish&f, what is wrong with them! + - I have been out here fishing for days now! + - Not even a single bite. If only I was younger I would show them! + - + - + - And if we cannot catch any, well that is a big problem. + - You will need to go down there and beat them senseless. + questAcceptDialog: + - '&a[Theopropides Nero]&f You wanted to help so here is your chance!' + - '&7&oI must jump into the lake and kill 7 &c&oChilly Salmon&7&o and collect their bodies.' + questCompleteMessage: + - '&a[Theopropides Nero]&f Oh! Look at them! Such big ones!.' + - + - +primis_ice_village_treats_for_the_punished: + customObjectives: + Objective1: + dialog: + - '&a[Eleusium Calenus]&f My wife sent you? Oh, are those treats? My favorite too! She''s such a darling.' + - + - + - 'You tell her I am doing just fine and that I love her very much. ' + name: '&2Treats for the punished' + questLore: + - If you don't mind, could I ask you to do something for me? + - My dear &aHusband&f has been jailed and I know it's tough living a cage all day. + - So I prepared some treats that I was gonna deliver to him. + - + - + questAcceptDialog: + - '&a[Titia Calenus]&f He will be in one of the middle cages.' + - Do not forget to tell him I love him. + - '&7&oI should deliver these treats to the &a&oHusband&7&o.' + questCompleteMessage: + - '&a[Titia Calenus]&f Back so quick! Oh, did he really say that? He is such a sweetie.' +primis_ice_village_wanna_make_a_snowman: + name: '&2Wanna build a snowman' + questLore: + - The kids around the village have been pretty bored lately + - and I've been thinking. There are these + - '&cMagical Creatures&f that inhabit the woods around this' + - village. The creatures fur grows &eMagical Ice Crystals&e. + - When you infuse snow with these &eCrystals&f it makes the + - snow shuffle around and expand and contract. + - And if you build a snowman out of this infused snow + - it makes it look as if the snowman is alive. + - The kids would love it! So, want to help + - this old man cheer up some kids? + questAcceptDialog: + - '&a[Sparax Ennodius]&f You will find the &cCreatures&f in any woods near the village.' + - + - + - '&7&oI should go slay enough &c&oFrost Fur Ursus&7&o to gather 15 &e&oIce Crystals&7&o.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f You gathered enough crystals? Wonderful!' + - I can start making the snowman now, I cannot wait for the kids to see it! +primis_main_quest_: + name: '&2Goblins in the mines!' + questLore: + - This day just keeps getting worse. First, we get ambushed by goblins. + - The we retreat, only to find our army split. Some are dead, many are missing. + - Worst of all, we fear we might've woken the Goblin King. + - Some, hopefully, made it through. We have to set up camp and recover for now. + - If you dare brave into the mines, you are on your own. + - We tried to sneak past them, and it did not go well. + - The only way forward is through bloodshed. + questAcceptDialog: + - '&8[Centurion]&fAre you braving the Goblin Mines? Beware the Goblin King!' + - '&8[Centurion]&fWe hope our scouting party made it past him. Meet up with them if you can.' + - '&8&oI should venture through the mines and defeat the Goblin King.' + questCompleteMessage: + - '&8[Scouting party]&fYou made it through? I almost wish you hadn''t. You won''t believe what lies ahead.' + - '&8&oSounds like the scouting party has bad news for me.' +primis_main_quest_1: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis] &fOh so you were in the ship that beached a few hours ago?' + - + - + - + - + - + - + - '&7&oI should report to the &aFirst Mate &7&oto see if I should help these people!' + name: '&2Shipwrecked!' + questLore: + - You're finally awake? Good! We need your help. + - The ship beached during last night's storm. + - We see a &dLighthouse &fin the distance, so there must be a village there! + - Go talk to the &aVillage Leader &fand see if they can lend use some help! + - The &aFirst Mate &fwent ahead of you, but hasn't returned yet. + - Follow his instructions if you see him! + questAcceptDialog: + - '&a[Captain Squalus]&f Go to the nearby village and see if they will help us!' + - Be careful on your way there, we don't know what lurks around these parts! + - '&7&oI should investigate the nearby village and talk to their leader.' + questCompleteMessage: + - '&a[First Mate Iracundi]&f Darnation! We just can''t catch a break today! Here, it''s clearly dangerous to go alone, take this!' + - '&7&oSeems like First Mate Iracundi has a request for me...' +primis_main_quest_10: + customObjectives: + Objective2: + dialog: + - "&a[Shogun Navita] &f&dGladius&f calls for our aid?\n&7&oSeems like I should talk to the &aShogun&7&o." + name: '&5Bridging the gap' + questLore: + - It is time to call &dPontis Mille&f for aid. + - Let them know of what happened here and tell them we are cashing in our favor. + - + - + questAcceptDialog: + - '&a[General Hasta] &fSafe travels, friend. Remember: Kill the &cGate Keeper&f and make sure our plea reaches &aShogun Navita''s&f ears..' + - '&7&oI should slay the &cGate Keeper&7&o at the &dBridge&7&o and make my way to &aShogun Navita&7&o in &dPontis Mille&7&o.' + questCompleteMessage: + - '&a[Shogun Navita]&f Truly the news you bring me are most disturbing, but I am afraid we already suspected something... unnatural... was going on.' + - '&7&oSeems like &aShogun Navita&7&o wants to talk to me.' +primis_main_quest_11: + customObjectives: + Objective1: + dialog: + - '&a[Major Fortes Bellator]&f Yes, traveler?' + name: '&2Sending a message!' + questLore: + - The tales of your travel are most surprising. + - That you made it alive to here is nothing short of a miracle. + - The forces invading &dGladius&f are insurmountable. + - '&dGladius&f will eventually crumble under their might...' + - Aid?... Ah, yes. Go see &aMajor Fortes Bellator&f. + - He will be able to assist you. + questAcceptDialog: + - '&a[Navita]&f You can find the &aMajor&f on top of those stairs right ahead!' + - '&7&oI should go talk to the &aMajor&f and see if he can help.' + questCompleteMessage: + - '&a[Major Fortes Bellator]&f The &aShogun&f seeks to aid &dGladius&f? I thought he would never ask! But first, we must prepare.' + - '&7&oSeems like &aFortes Bellator&7&o has work for me.' +primis_main_quest_12: + customObjectives: + Objective1: + dialog: + - '&a[Centurion]&f Where are our reinforcements?' + name: '&2Mine path' + questLore: + - I cannot believe what befell &dGladius&f. They hit it fast, + - and they hit it where it hurts most. + - It is our sworn duty to aid our allies. We have failed our + - duty, and we have failed our allies. + - The &cCounselor's&f ordered us to mobilize our troops in several + - zones before the invasion. + - You see, recently and unusual and devastating storm was spotted + - at the &dStorm Temple&f. + - The Royal Guard was ordered to quiet the storm, and the &aShogun&f + - refuses to belay that order. + - Our own guards are in other places, and I fear we will need all + - that we have to take &dGladius&f back. + - The path to the &dStorm Temple&f is treacherous, as it requires going + - through the &dGoblin Mines&f. + - Help our guard clear the mines and make a path to the &dStorm Temple&f! + questAcceptDialog: + - '&a[Fortes Bellator]&fTread lightly, the &dGoblin Mines&f are a dangerous place. Perhaps you should aid the normal guard before assisting the &aRoyal Guard&f.' + - The &dMines&f are north of the city. There are stairs leading to its entrance. + - '&7&oI should see what else I can aid &aFortes Bellator&7&o with, or I can head to the &dGoblin Mines''&7&o entrance.' + questCompleteMessage: + - '&a[Centurion]&fIt is so good to see someone! Has &dPontis Mille&f sent you?' + - '&7&oI should hear what the &aCenturion&7&o has to say' +primis_main_quest_13: + name: '&2Goblins in the mines!' + questLore: + - This day just keeps getting worse. First, we get ambushed by goblins. + - Then we retreat, only to find our army split. Some are dead, many are missing. + - Worst of all, we fear we might've woken the &cGoblin King&f. + - Some, hopefully, made it through. We have to set up camp and recover for now. + - If you dare brave into the mines, you are on your own. + - We tried to sneak past them, and it did not go well. + - The only way forward is through bloodshed. + questAcceptDialog: + - '&a[Centurion]&f Are you braving the &dGoblin Mines&f? Beware the &cGoblin King&f!' + - We hope our &aScouting Party&f made it past him. Meet up with them if you can. + - '&7&oI should venture through the &dMines&7&o and defeat the &cGoblin King&7&o.' + questCompleteMessage: + - '&a[Scouting Party]&f You made it through? I almost wish you hadn''t. You won''t believe what lies ahead.' + - '&7&oSounds like the scouting party has bad news for me.' +primis_main_quest_14: + name: '&2Storm''s end' + questLore: + - It is hard to believe that you pushed through the + - '&dGoblin Mines&f on your own.' + - Perhaps with your fortitude you will be able to face the challenge ahead. + - We attempted to assault the &dStorm Temple&f, and reached its deepest + - confines at a great cost. + - What we found there... It defies understanding. + - It may be hard to believe, but it sounds like the very storm + - itself has materialized as our opponent. + - We do not even know if it can be defeated. We feared we were sent to our deaths. + - + - + questAcceptDialog: + - '&a[Blepharo]&f We have weakened their forces a little, but still, this is no easy task.' + - The Storm is no ordinary opponent. Do not underestimate it. + - '&7&oI should go into the &dStorm Temple&f and slay the &cStorm&f.' + questCompleteMessage: + - '&a[Shogun Navita]&f You WHAT!?' + - Defeated the &cStorm&f? I was told that was impossible! I mean... + - '... it is no use hiding it now. I knew about the &cStorm&f. I knew about the &dGladius&f invasion - I even facilitated it. I did it for my people - for &dPontis Mille&f.' + - '&cCounselor Machiavelli&f convinced me that the &cStorm&f was as unstoppable as Nature itself, and that the fall of &dGladius&f and &dPontis Mille&f was an inevitability that we could but delay through sacrifice.' + - + - + - '&8&oSeems like &aShogun Navita&7&o has a problem he wants me to deal with.' +primis_main_quest_15: + name: '&2Severance payback!' + questLore: + - + - + - + - + - + - + - + - + - + - I bought us time. + - + - + - + - + - He guided us to our doom, and would've gotten away with it had you not appeared. + - Now, there is hope. + - I ask you, please rid us of the treacherous &cCounselor&f. + - + - + - + - + - + - + - I wish to deliver one last message through them. + questAcceptDialog: + - '&a[Shogun Navita]&f &cCounselor Machiavelli&f has retreated to his quarters in the lower city by the market. Be careful, has has amassed a devoted following in his time, and will not go down without a fight.' + - '&7&oIt is time for &cCounselor Machiavelli&f to face righteous retribution.' + questCompleteMessage: + - '&a[Shogun Navita]&f So it is done.' + - '&dPontis Mille&f owes you a great debt, wanderer. Once we finish mobilizing the army we will be ready to right our wrongs and march to &dGladius''&f aid.' + - '&7&a[Shogun Navita]&2 We feared you. We surrendered our allies to you. We dispersed our armies. No more.' + - '&dPontis Mille&2 marches to war, and we shall not walk alone! You shall rue the day you crossed our path.' + - '&7' + - '&7&oSeems like the &aShogun&7&o has a plan. I should talk to him.' +primis_main_quest_16: + customObjectives: + Objective3: + dialog: + - '&a[Demenis Nolus]&f Heading to the village, eh. Just keep going East, follow the road and you should be there in no time!' + Objective4: + dialog: + - '&a[Callipho Classicius]&f Directions? Just head down this road that leads to the graveyards.' + Objective1: + dialog: + - '&a[Glacies]&f Welcome to our village traveler! Please tell me, what brings you here friend.' + Objective2: + dialog: + - '&a[Bromia Culleolus]&f Oh, the way to the village. Yes, just take this road that leads to the mountain.' + - Happy to help! + name: '&2The ice village awaits' + questLore: + - We must send aid to &dGladius&f as soon as possible. + - Champion, there is a village of mighty warriors to the far south. + - You should travel there and inform them that &dPontis Mille&f + - would seek their aid in pushing back the invaders from the &dBlood Temple&f. + - Find &aGlacies Princeps&f and tell them I sent you. + - There many travelers on the roads, you should stop and ask them for direction. + questAcceptDialog: + - '&a[Shogun Navita]&f It will be a long journey. Make sure you prepare. Follow the roads that lead south.' + - '&7&oI must go and locate the &d&oIce Village&7&o to the far south.' + questCompleteMessage: + - '&a[Glacies Princeps]&f The Shogun sent you, I see, it is good to hear that &aNavita&f is back to his old self.' + - + - + - Let me tell you more... + - '&7&oI should speak to &a&oGlacies&7&o.' +primis_main_quest_17: + customObjectives: + Objective3: + dialog: + - '&a[Theopropides Nero]&f Help? Yes, please!' + Objective1: + dialog: + - '&a[Alanus Isatis]&f Here to help with the &cRazorbacks&f?' + Objective2: + dialog: + - '&a[Domina Violet]&f I hope you are here to help!' + name: '&2Helping the north' + questLore: + - Before we further discuss anything about + - the &dBlood Temple&f. + - + - + - If these issues are not resolved then I would fail in my duties as a village leader. + - There is no way for me to ignore the plea of my own people and put others first. + - + - + - + - + - + - + - + - + - They will be able to tell you in more detail what needs to be done. + questAcceptDialog: + - '&a[Glacies Princeps]&f Once you are done helping them. Come back to me and we can talk.' + - '&7&oI should go talk to the villagers on my list and help them out with any issues they might have.' + questCompleteMessage: + - '&a[Romanus Superbus]&f &2Glacies&f sent you, about darn time! We have a prisoner on the loose!' + - '&7&oI should speak to &a&oRomanus Superbus&7&o.' +primis_main_quest_18: + name: '&2The trial of ice' + questLore: + - Well you have certainly impressed me and most of the village. + - + - + - the &cIce Elementals&f. + - + - + - + - + - '&cMinor Ice Elementals&f in combat.' + - + - + - If you failed...then...your energy and your being belonged to the &cIce Elementals&f. + - + - + - Ever since then + - + - + - Several of our people got corrupted and we had to jail them for our own safety. + - + - + - + - + - Slaves to the + - '&cIce Elementals&f.' + - It is clear that our old traditions are no longer. + - The &cIce Elementals&f must be dealt with... + - I would ask you to be the last one to + - undertake &9The Trial of Ice&f. Climb to the peak and face the + - '&cMinor Ice Elementals&f and release the souls of those who failed the trial.' + questAcceptDialog: + - '&a[Glacies Princeps]&f You can find the start of the path to the trial at &aViolet''s&f house.' + - Follow the &9Amethyst&f blocks, they will guide you to the peak. + - '&7&oI should follow the &9&oAmethyst Blocks&7&o to the peak of the mountain and then slay the &c&oMinor Ice Elementals&7&o.' + questCompleteMessage: + - '&a[Glacies Princeps]&f You have done it? May their souls rest in peace now.' + - Let's speak again friend. There is more to be done. + - '&7&oI should speak to &a&oGlacies&7&o.' +primis_main_quest_19: + name: '&2Chill out' + questLore: + - It is time to free ourselves from this curse. + - We should have never made ourselves dependent on an &cElementals&f power. + - We shall correct that mistake here and now. + - What you have slain were just + - '&cMinor Ice Elementals&f, the' + - '&cIce Elemental&f rests in a temple right across from our village.' + - It was the main source of our power...and foolishness. + - Go forth now and slay the &cIce Elemental&f. + questAcceptDialog: + - '&a[Glacies Princeps]&f You will find a path that leads into the temple at the summit of the village.' + - '&7&oI should go into the temple and slay the &c&oIce Elemental&7&o.' + questCompleteMessage: + - '&a[Glacies Princeps]&f I could feel the energies flowing out, all the way from here.' + - + - + - There is another settlement that might need your help, let's speak. + - '&7&oI should hear what &a&oGlacies&7&o has to say.' +primis_main_quest_2: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis]&fYou''ll help us? Thank the seas! This was starting to feel like a sinking ship!' + name: '&2Strangers in need...' + questLore: + - So not only can they not help, but they want our help? Bah! + - Well, we don't have much choice now, do we? + - Go, help them, then make them help us! + questAcceptDialog: + - '&a[First Mate Iracundi]&f Fine, go help the locals, see what info you can gather and see if you can get them to help us in turn. I will be here, negotiating things.' + - Come back as soon as you have something! + - '&7&oI should talk to the &aVillage Leader&f to see about helping the locals.' + questCompleteMessage: + - '&a[Chief Piscis]&f Everyone in the village has an issue that needs dealing with, and I am no exception. My request is quite challenging, so maybe you want to get warmed up and get the lay of the land with some of the issues from the other villagers.' + - + - + - '&7&oI should talk to the locals and see who needs help, and come back to the leader when I feel ready to continue.' +primis_main_quest_20: + customObjectives: + Objective1: + dialog: + - '&a[Lutum Princeps]&f This better be important.' + name: '&2Terravilla' + questLore: + - Some time ago we received a request for aid from a + - a nearby settlement. Years ago a bunch + - of explorers settled on top of this ancient ruin. + - I think they call their little + - settlement &dTerravilla&f. Apparently there is a lot + - of treasure to be had there if you don't mind the risk. + - But I hear that stuff has gone wrong there and they asked + - us if we could spare any help to send their way. To be + - honest, you are the strongest warrior I have ever seen. + - You are the best help we could send. If you would like + - to go of course. + questAcceptDialog: + - '&a[Glacies Princeps]&f You will find &aTerravilla&f straight West of here.' + - + - + - Oh, I almost forgot. The person you want to talk to is &aOverseer Lutum&f. + - '&7&oI should go to &d&oTerravilla&7&o and talk to &a&oOverseer Lutum&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f Came all the way from the &dIce Village&f, eh. Good to see some help arrive.' + - + - + - + - + - '&7&oI should talk to &a&oLutum&7&o.' +primis_main_quest_21: + name: '&2Taking out the trash' + questLore: + - Many years ago some explorers came across this ruin and + - as they investigated it more closely they discovered a + - large underground maze-like structure. In this structure + - there were a lot of ancient artifacts and treasures. But + - also a lot of danger. Not like that stopped anyone from + - going down there. And as the word spread, more and more + - people came here to make their fortunes. Before you + - know it, it turned into a small settlement. Until lately + - everything was fine, but then awful things started + - happening. Before I tell you more, we should start by + - dealing with the simple problems first. A small band of + - '&cRobbers&f has found a foothold in the hills surrounding' + - '&dTerravilla&f. We need them gone. Also, feel free to assist' + - any villagers in &aTerravilla&f that might need help. + questAcceptDialog: + - '&a[Lutum Princeps]&f I am not sure where the &cRobbers&f are exactly. I just know that people have reported seeing them coming from the hills.' + - '&7&oI should deal with the &c&oRobbers&7&o and help any villagers in need if I have the time.' + questCompleteMessage: + - '&a[Lutum Princeps]&f Well that is one issue resolved. Onto the next!' + - Before we move on, I want you to have this blade. + - + - + - '&7&oI should hear out what &a&oLutum&7&o has planned next.' +primis_main_quest_22: + name: '&2Big trouble in little pub' + questLore: + - Before we get to the big problem underground, I would + - like you to do one last thing here in town. There has + - been huge trouble in our little pub. There are certain + - characters in town who keep going to the pub and causing + - a ruckus. Well I heard that this time all of them managed + - to gather at the pub at the same time. And of course now + - there is a huge brawl happening over there. This is a great + - opportunity for us to arrest all of them at once. Go to the + - pub and knock them all out. We will handle the rest. + questAcceptDialog: + - '&a[Lutum Princeps]&f The pub is at the ground level, right across. Don''t let them overwhelm you.' + - I will have a nice reward waiting here for you when you're back. + - '&7&oI need to go to the pub and deal with the &c&oBar Brawlers&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f I hear that the pub is a peaceful place again. Let''s discuss the real issue now.' + - '&7&oI need to talk to &a&oLutum&7&o.' +primis_main_quest_23: + name: '&2Strike the earth' + questLore: + - You see the real reason we asked for help is because of what happened + - at the ruins. There were always dangerous things down there, + - but nothing a seasoned adventurer or explorer could not handle. But then + - something awakened, these ancient constructs started rising out of the + - ground and the walls. Then these quakes started happening, it was weird, + - because you could only feel them if you were down in the ruins. So we shut + - everything down, nobody was allowed access to the ruins anymore. A few days + - ago I gathered some of my best men and sent them down there to find the source + - of it all. They barely made it back. They found an &cEarth Elemental&f high + - above the pillars, on top some sort of platform. It must have been there + - dormant all this time. No clue why it decided to wake up now... + - Your job would be to go down there, navigate through the maze and put the + - '&cEarth Elemental&f into a slumber it will never wake up from.' + questAcceptDialog: + - '&a[Lutum Princeps]&f You can get to the maze by walking down the spiral staircase in the middle of the ruins.' + - + - + - '&7&oI should enter the &d&oRuins Maze&7&o and slay the &c&oEarth Elemental&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f I cannot believe it, you''re back. In one piece too!' + - + - + - + - '&7&oI need to tell &a&oLutum&7&o about my quest and the &d&oBlood Temple&7&o.' +primis_main_quest_24: + customObjectives: + Objective1: + dialog: + - '&a[Navita]&f You have returned! I hope you have good tidings.' + name: '&2There and back again' + questLore: + - We had no idea what was going on... Yes, + - '&dTerravilla&f will be able to pledge some' + - of our forces to your cause. I wonder if the + - '&cEarth Elemental&f awakening had anything' + - to do with the &dBlood Temple&f. We will + - prepare our forces and wait for word from + - '&dPontis Mille&f.' + questAcceptDialog: + - '&a[Lutum Princeps]&f So you are heading off to &dPontis Mille&f, make sure to tell the &aShogun&f that &dTerravilla&f will be ready to assist.' + - '&7&oI should head to &d&oPontis Mille&7&o and speak with &a&oShogun Navita&7&o.' + questCompleteMessage: + - '&a[Navita]&f It is good to hear that the &dIce Village&f has decided to join our cause! But I did not expect that you would manage to convince &dTerravilla&f to pledge to our cause as well.' +primis_main_quest_25: + customObjectives: + Objective1: + dialog: + - '&a[Outpost Officer]&fFILLER TEXT!' + name: '&2To the outpost' + questLore: + - It is so good to see you again friend! + - While you were gone we were preparing our + - forces. We have made an &dOutpost&f + - between the &dBlood Temple&f and &dPontis Mille&f. + - You should go there and report to the + - '&aOutpost Officer&f. They will let you know' + - how we shall proceed with the assault on the + - '&dBlood Temple&f.' + questAcceptDialog: + - '&a[Navita]&f The outpost is to the South of the city. Not too long now, before the additional forces from &dTerravilla&f and the &dIce Village&f arrive.' + - '&7&oI should head to the &d&oOutpost&7&o and speak with the &a&oOutpost Officer&7&o.' + questCompleteMessage: + - '&a[Outpost Officer]&f I GOT NO IDEA WHAT TO SAY CAUSE I AM NOT DONE' +primis_main_quest_3: + name: '&cBandit Camp!' + questLore: + - A nearby &dBandit Camp&f has recently been sighted + - and is trying to take us under! + - They keep raiding our supplies and kidnapping our villagers! + - They even took my &eGrandfather's Heirloom&f! + - We don't know what they want, but we need them gone! + - Figure out what they are doing, deal with them and bring + - me back my &eGrandfather's Heirloom&f! + questAcceptDialog: + - '&a[Chief Piscis]&f The &dBandit Camp&f isn''t too far away if you follow the road!' + - + - + - Oh, and make sure you bring back my &eGrandfather's Heirloom&f! + - '&7&oI should go to the nearby &dBandit Camp&7&o and clear it out.' + questCompleteMessage: + - '&a[Chief Piscis]&f I see you''re back! Do you bring good news?' + - '&7&oYou tell &aChief Piscis&7&o about the camp and turn the &eHeirloom&7&o in.' + - + - + - + - + - '&7&oSeems like the &aChief Piscis&f is ready to tell me how to get out of here.' +primis_main_quest_4: + customObjectives: + Objective1: + dialog: + - '&a[Petrae]&f &2Chief Piscis&f sent you? Unfortunately the passage is closed, and the &cElemental&f guards it...' + name: '&9Blue flower path!' + questLore: + - We must report our findings about the + - '&dBandit Camp&f to &dGladius&f!' + - The mountain pass is guarded by an ancient, + - powerful &cGolem&f which must be avoided at all costs! + - Follow the &eBlue Flowers&f along the path, + - they will lead you to a secret passage + - through the mountains! + - A mountain guide will be waiting for you at the end + - of the &9Blue Flower &fpath! + questAcceptDialog: + - '&a[Chief Piscis]&f The mountain pass is guarded by an extremely dangerous &cGolem&f, which you are probably not able to defeat right now!' + - + - + - '&7&oI should follow the &9&oBlue Flower &7&opath to the &aMountain Guide&7&o!' + - '&7&oI should make sure to finish any business I got left before I leave.' + - '&7&oHint: Make sure you track the quest to make finding your destination easier!' + questCompleteMessage: + - '&a[Petrae]&f Are you sure you want to risk it? I can help you...' + - '&7&oSeems like &aPetrae&f has a request for me.' +primis_main_quest_5: + name: '&5The Crystal Elemental' + questLore: + - You need to pass through? Ill timing, my friend. + - A &cCrystal Elemental &fhas invaded our passage + - and shut it down. + - If you really must make your way to Gladius, + - you will have to defeat this &cElemental&f first! + questAcceptDialog: + - '&a[Petrae]&f You seek to defeat the &cCrystal Elemental&f? I can but wish you luck in your endeavor!' + - + - + - '&7&oSeems like I must defeat the &cCrystal Elemental&7&o.' + questCompleteMessage: + - '&a[Petrae]&f Outstanding! I saw you defeat the &cCrystal Elemental&f, clearly there''s greatness in your future!' + - Now that we are on the other side, let me tell you the path to &dGladius&f! +primis_main_quest_6: + customObjectives: + Objective1: + dialog: + - '&a[Filius] &fYou made it through the mountain! You don''t see that every day.' + - + - + - '&7&oSeem like &aFilius&7&o can help me find the way to &dGladius&7&o.' + name: '&5The Farmstead' + questLore: + - The path to &dGladius&f should be easy, but with + - all the disturbances we've been seeing I suspect + - it might not be that simple. + - I am good friends with the &aProprietor of the Farmstead&f + - down the road. If you tell them I sent you, I am sure + - they will tell you how to safely reach &dGladius&f and + - give you news about the surrounding area. + - Good luck in your travels and stay safe! + questAcceptDialog: + - '&a[Petrae]&f Just tell the &aProprietor of the Farmstead&f that I sent you, though I have heard that the &aProprietor&f hasn''t been seen in a while.' + - + - + - 安全な旅を! + - '&7&oI should follow the path to the &dFarmstead&7&o and talk to its &aProprietor&7&o.' + questCompleteMessage: + - '&a[Petrae]&f Outstanding! I saw you defeat the &cCrystal Elemental&f, clearly there''s greatness in your future!' + - Now that we are on the other side, let me tell you the path to &dGladius&f! + - '&7&oI should talk to &aFilius&7&o to learn the way to &dGladius&7&o, and possibly talk to his &aMother&7&o to see how I can help.' +primis_main_quest_7: + customObjectives: + Objective4: + dialog: + - '&a[General Hasta] &fI can''t believe you made it past the enemies.' + - You are exactly the kind of help we need right now! + - '&7&oSeems like I should talk to &aGeneral Hasta&7&o.' + name: '&5The path to Gladius' + questLore: + - Recently smoke was sighted over the fortress of &dGladius&f. + - We were unable to go there and see what's happening + - because a &dShip&f is currently blocking the path. + - We got attacked by a bunch of undead-looking creatures + - when we approached the &dShip&f, so we ran away. + - I am afraid you will have to force your way through this + - '&dShip&f in order to reach &dGladius&f. I''m sure that they will' + - reward you if you help thin the number of &cUndead&f on that ship! + questAcceptDialog: + - '&a[Filius] Be careful on the road, clearly something has gone wrong in &dGladius&f.' + - + - + - '&7&oI should go down the path to &dGladius&7&o and clear out some &cUndead Sailors&7&o on the way there.' + questCompleteMessage: + - '&a[Lord Hasta]&f Were you sent as reinforcements from Pontis Mille? Where are the others? Are you a messenger?' + - '&7&oI should talk to &aLord Hasta&7&o.' +primis_main_quest_8: + name: '&5Recovering Hope' + questLore: + - We never saw this invasion coming. + - They came in the dead of night, hit us hard and fast. + - Before we knew it, half the city was overrun. + - Morale is low. Everyone here has lost someone. + - To spite our heartache, our own loved ones parade + - through the streets in a mockery of life itself. + - We need to rally and bolster morale, + - or we won't see another dawn! + - Back in my &dMansion&f, in my treasury, lies a &eDocument&f + - of the utmost importance. It is a written promise with + - one of the founders of &dPontis Mille&f to provide us with + - assistance in a time of dire need. This is the time. + - Retrieve the &eDocument&f, bring it back to me and + - I promise you will be welcomed in &dPontis Mille&f with + - open arms. Soldiers will fight to their last + - if given this small hope. + questAcceptDialog: + - '&a[General Hasta] The note is in my &dMansion&f. Be sure to bring it back. My men here also have other requests around town you can help with, if able.' + - '&7&oI should check what the other soldiers need and head to the &dMansion&7&o at the town exit.' + questCompleteMessage: + - '&a[Lord Hasta]&f Outstanding! Recovering this &eDocument&f in the middle of a war? If we had 10 more of you, the city would never have been taken in the first place!' + - Before you go, do you think you could do me a small personal favor? + - '&7&oSeems like &aLord Hasta&7&o wants to talk to me.' +primis_main_quest_9: + name: '&5Gladius'' Champion' + questLore: + - Before heading to &dPontis Mille&f, I have a + - personal favor to ask. + - Our &cChampion&f was last seen fighting off a horde of + - enemies near the &dStatue&f. + - We have not heard from him since the start of the + - invasion and at this stage we fear the worst. + - Please go check on him. If you find him and he has + - turned into one of these undead... please free him of his curse. + questAcceptDialog: + - '&a[General Hasta] &fMake your way to the &dStatue&f. I am sure our &cChampion&f will be easy to find.' + - '&7&oI should go to the &dStatue&7&o and investigate what happened to the &cChampion of Gladius&7&o.' + questCompleteMessage: + - '&a[General Hasta]&f So... The worst has come to pass. I will make sure these beasts shall pay for slaying my son.' + - 7&oSeems like &aGeneral Hasta&7&o has some parting words for me. +primis_ogre_mines_clear: + name: '&2Ogre-sized problems' + questLore: + - Our mining encampment was overrun! + - We need help! + - I don't really know what happened, but we need to clear + - the encampment and talk to &aOld Vetus&f! + questAcceptDialog: + - '&a[Metus]&f You''re going to help? Please hurry, the encampment is just beyond here!' + - '&7&oI should clear the encampment and talk to &aOld Vetus&7&o.' + questCompleteMessage: + - '&a[Vetus Fossores]&f You came to help? Fantastic, we absolutely need help right now!' + - Here's a little something for your help clearing the encampment! +primis_ogre_mines_lost_bretheren: + customObjectives: + Objective1: + dialog: + - '&a[Fortis Fossores] &fWhat do you want? What, &aFugit&f sent you? What for? The mines were overrun? Hah, I didn''t even notice!' + - + - + - + name: '&5Lost Bretheren' + questLore: + - The mine was overrun by &cOgres&7&o! + - In the confusion I got separated from my &aBrother&f in the &dMines&f, + - and I fear for his safety! + - He's a bit of an eccentric man, very dedicated to mining. + - You'll know if you've seen him! + - Please bring him back up here, or at the very least tell me if he is safe. + - I'll make it worth your trouble! + questAcceptDialog: + - '&a[Fugit] &fPlease find my &aBrother&f and make sure he''s OK!' + - '&7&oI find &aFugit''s Brother&7&o in the &dMines&7&o overrun by &cOgres&7&o.' + questCompleteMessage: + - '&a[Fugit Fossores]&f My &aBrother&f said what? Ah, typical of him, too focused on his work to notice the entire place was taken over!' + - I'll have a serious conversation with him next time I see him! + - + - +primis_ogre_mines_old_miner_quest: + name: '&2Lucky Pickaxe' + questLore: + - We have ourselves a bit of a pickle! + - As we were mining, we came across a mysterious cave full of monsters! + - I dropped my favorite &ePick-axe&f as I ran, I need your help to go get it! + - I'm sure the &cOgre Magi&f picked it up for himself. + - Get my &eLucky Pickaxe&f back from that brute! + - I've got some trinkets for you when you return. + questAcceptDialog: + - '&a[Vetus Fossores]&f That &cOgre&f shouldn''t be far! You can find him in the cave to the right, before the collapsed area.' + - He should have the &ePickaxe&f, &cOgres&f love shiny things after all! + - '&7&oI should defeat the &cOgre Chief&f.' + questCompleteMessage: + - '&aa[Vetus Fossores]&f You got my lucky pick? Excellent!' + - Heres your reward! +primis_pontis_groves_acrobatics: + customObjectives: + Objective1: + dialog: + - '&a[Idoneitatem Hominem]&f Congratulations!' + name: '&2Acrobatics' + questLore: + - So you think you have you what it takes. + - Are you fit enough, are you quick enough, are you strong enough? + - Platforms, wines, dangerous heights. All you could ever want! + - The ultimate challenge lies ahead! + - OK, OK. Me and my &aBrother&f might have been bored a bit and + - made an entire acrobatics course. + - The goal is to to get from platform to platform using &9Wines&f and + - '&9Acrobatics&f and reach the end of the course.' + - + - + - You will be rewarded with a very nice &eItem&f! + questAcceptDialog: + - '&a[Posuere Hominem]&f You can find the start of the course at the &dEnd of that Tunnel&f.' + - + - + - Don't forget to speak to my &aBrother&f at the end of the course for the reward! + - '&7&oI should head to the start of the course.' + questCompleteMessage: + - '&a[Idoneitatem Hominem]&f Well deserved! I hope you did not cheat! Try and beat my record if you can.' +primis_pontis_groves_caught in the web: + name: '&2Caught in the web' + questLore: + - So they have a &dNest&f somewhere in the &dGrove&f. + - That would explain why their population has skyrocketed. + - + - + - It would be great if you could locate the &dNest&f and clear it out. + - We will make you some fine &eSpider Leg Boots&f as a reward! + questAcceptDialog: + - '&a[King Nemian]&f If there is a &dNest&f I am sure it would be &9Surrounded by Cobwebs&f.' + - '&7&oI should find the &dSpiders Nest&7&o and clear it out.' + questCompleteMessage: + - '&a[King Nemian]&f Hah! I knew we could count on you!' + - Here are your fine boots, well deserved! +primis_pontis_groves_elf_stole_from_my_shelf: + name: '&2Elf stole from my shelf' + questLore: + - Disaster has struck our little hole. + - Not too long ago our lovely home got raided by &cElf Bandits&f. + - Thankfully we weren't home at the time so nobody got hurt. + - We managed to replace most of our possessions. + - But they took my &eFamily Heirloom&f that was sitting on the shelf. + - If you would be so kind to go try and get it back for me, I would be most thankful. + - I make the best stews, I would be glad to share some with you as a reward. + questAcceptDialog: + - '&a[Luxuria Gorgonius]&f The &eHeirloom&f is quite valuable I am sure they would keep it &9Somewhere Extra Safe&f.' + - '&7&oI need to go retrieve the &eHeirloom&7&o.' + questCompleteMessage: + - '&a[Luxuria Gorgonius]&f Oh my gosh! You found it!' + - There are not enough thanks in the world for what you just did for me. + - '&7&oThis stew should keep med fed for a while.' +primis_pontis_groves_into_the_next_hole: + customObjectives: + Objective1: + dialog: + - '&a[Phygia Gorgonius]&f Time to kick those &cElves&f out for good!' + name: '&2Into the next hole...' + questLore: + - If you are available there is plenty more work to do around here. + - We have some serious &cElf&f problems, + - but I have assigned &aPhygia&f to handle those issues. + - Go talk to &aPhygia Gorgonius&f in the hole next to this one. + - They will be able to tell you more and what needs to be done. + questAcceptDialog: + - '&a[King Nemian]&f The hole right next to this one one, can''t miss it!' + - '&7&oI should go talk to &aPhygia Gorgonius&7&o.' + questCompleteMessage: + - '&a[Phygia Gorgonius]&f Let''s talk...' + - '&7&oI should hear out &aPhygia Gorgonius&7&o.' +primis_pontis_groves_lighthouse_1: + customObjectives: + Objective1: + dialog: + - '&a[Alanus Secundas] &fHas the &dGrove&f sent you?' + name: '&2Feeding the sick' + questLore: + - Wanderer, could I ask a simple favor of you? + - + - + - But ever since the troubles began we could not leave our &dGrove&f. + - Would you be so kind to bring the family their latest batch of food. + - It would be great if you could hurry, it has been a while since the last delivery. + questAcceptDialog: + - '&a[King Nemian]&f When you exit the hole the &dLighthouse&f is straight forward and a bit to the left.' + - '&7&oI should go to the &dLighthouse&7&o.' + questCompleteMessage: + - '&a[Alanus Secundas]&f I am so thankful! We were just starting to run out of food.' + - Are you busy? + - '&7&oSeems like &aAlanus&7&o wants to talk to me.' +primis_pontis_groves_lighthouse_2: + customObjectives: + Objective1: + dialog: + - '&8[Jeeves]&fOh, hello there again!' + - '&8[Jeeves]&f They do not need the food anymore? I was just about to go shopping.' + - '&8[Jeeves]&f So kind of you to come here and let me know.' + name: '&2Do not ask Jeeves' + questLore: + - Uh, before you came. Jeeves the Travelling Merchant stopped by. + - We asked him if he could go get some food for us. + - + - + - + - + questAcceptDialog: + - '&8[Alanus Secundas]&f When you exit the dwelling the Lighthouse is straight forward and a bit to the left.' + - '&8&oI should go to the Lighthouse.' + questCompleteMessage: + - '&8[Alanus]&f You let him know? Good, good!' + - '&8&oSeems like Alanus is quite fed.' +primis_pontis_groves_population_control: + name: '&2Population control!' + questLore: + - Oh I am so happy that finally someone has arrived to help us out. + - We have a big arachnid problem going on in our little grove. + - There are so many arachnids around these days that you cannot even + - take a nice evening walk without one of the nasty buggers + - jumping at you from the shadows. + - It is clear that their population numbers need a serious culling. + - Oh! Please bring to me any arachnid legs that are still in good contidion. + - We use them to make small cranes and grabbers. + questAcceptDialog: + - '&8[King Nemian]&f You will find them lurking beneath the shadows of the trees.' + - '&8&oI need to find Forest Crawlers and kill them.' + questCompleteMessage: + - '&8[King Nemian]&fGood to see you return, and with plenty of legs too!' + - '&8[King Nemian]&fYou think that their nest might be near? Let''s talk more about this' +primis_pontis_groves_tree_climbing_elf_bandits: + name: '&2Tree climbing elf bandits!' + questLore: + - + - + - Not like the &cSpiders&f were enough, + - now these shadow loving poop nuts have decided to settle in our trees! + - + - + - + - + - Forced their way in with their superior numbers. + - Well they got something coming alright, + - one look at you and I can tell you can handle a couple of stone giants! + - I am sure some elves won't be much of an issue for you. + - + - + questAcceptDialog: + - '&a[Phygia Gorgonius]&f I am sure you will find plenty of them if you find some place with shade and just look up, hard to miss their tree houses.' + - '&7&oI should go take care of these &cElves&7&o before &aPhygia&7&o catches on fire from rage.' + questCompleteMessage: + - '&a[Phygia Gorgonius]&f My friend! HAHA! So good to see you again!' + - + - + - '&7&oThe elves wont be bothering &aPhygia&7&o ever again.' +primis_pontis_mille_fields_berry_crazed_wolf: + name: '&2Berry crazed wolves' + questLore: + - Oh gosh, I have no idea what is wrong with these &cRockhounds&f. + - They keep coming into the &dBerry Farm&f while I am away or sleeping. + - You would think they come here and eat the berries, but no! + - They load their mouths with them and carry them + - off somewhere deep into the forest. + - I mean they are &cHounds&f! Why are they even stealing berries. + - Well I guess it doesn''t matter, I have a favor to ask. + - Could you go clear the + - '&9Area Behind the Berry Farm&f,' + - and bring back my &eStolen Berries&f. + - I have a lot of pies to make and the berries they stole were ripe and ready. + questAcceptDialog: + - '&a[Dordalus Nasica]&f I only saw the &cRockhounds&f steal the berries.' + - '&7&oI should go kill the &c&oRedwood Rockhounds&7&o and collect any &e&oStolen Berries&7&o they drop.' + questCompleteMessage: + - '&a[Dordalus Nasica]&f Oh my, you did it. Could I bother you with one more tiny favor.' + - '&7&o Seems like &d&oMilonia&7&o has more work for me.' +primis_pontis_mille_fields_camping_hunters: + customObjectives: + Objective1: + dialog: + - '&a[Scribonia Ingenvinus]&f Yes?' + name: '&2Camping hunters' + questLore: + - I hope I am not bothering you. You look like a person that would listen to a plea. + - We do not have much to do here in the &dSlums&f, + - most of us like to wander the &dFields&f to pass the time. + - Unfortunately that has come to a stop after a bunch + - of &cMonsters&f started roaming around the &dFields&f. + - We heard that some hunters have made &dCamp&f near the &dFields&f. + - If you could go there and talk to them and ask them to deal with these &cMonsters&f... + questAcceptDialog: + - '&a[Augustina Verrucosis]&f Their &dCamp&f should be somewhere North-West of here.' + - '&7&oI need to head for the &d&oHunters Camp&7&o.' + questCompleteMessage: + - '&a[Scribonia Ingenvinus]&f Help the &dSlums&f with their &cMonster&f issue?' + - Let's talk more about. + - '&7&oI should talk to &a&oScribonia&7&o and hear out what she has to say.' +primis_pontis_mille_fields_camp_hunter_three_times_hunter: + name: '&2Hunter three times hunter' + questLore: + - So you found &aVolumnia&f. Thank the great hunters that she is alright. + - Since you have helped &aVolumnia&f and proven yourself a kind soul. + - How about a friendly challenge. I would be willing to offer you some nice + - quality armor should you face the challenge and return victorious. + - The challenge involves hunting + - '&cThree Great Beasts&f scattered across Pontis.' + - The &cBeast Cod Furiosa&f who swims underneath a bridge where two mountains stand. + - '&cBeast Crawler Megdun&f that slumbers on top of a sun covered grove.' + - Dancing between two western peaks you will find the + - '&cBeast Impaler Uladzimir' + - + - + questAcceptDialog: + - '&a[Milonia Majus]&f Here take this device it will roughly guide you to the their location.' + - '&7&oI should go and challenge the &c&oThree Great Beasts&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f You have returned. And you have brought all three items I requested as proof.' + - + - + - Well enough about me, here is your reward as promised! + - '&7You hand back the beast tracking device.' + - '&a[Milonia Majus]&fI had almost forgotten about that thing, thank you!' + - Until we meet again adventurer! +primis_pontis_mille_fields_do_it_yourself: + name: '&2Do it yourself' + questLore: + - Deal with the &cMonsters&f? Well I can tell you we have already been doing that. + - There is just too many of them and not enough of us. + - We started hunting them as soon as we made our &dCamp&f here. + - But their numbers just don't seem to be going down. + - And that's not even the worst of it. + - We have discovered a lair and a big old &cBeast&f that comes with it! + - Well since you have made it to our &dCamp&f in one piece, + - I assume you are quite capable yourself. + - How about joining the hunt? What say you? + questAcceptDialog: + - '&a[Scribonia Ingenvinus]&f I knew you would say yes! I see you are already well equipped.' + - OK, this is what I want you to do. + - + - + - Second I need you to slay 5 &cLonghorns&f and 6 &cShorthorns&f. + - Understood? Good. Report to me when you're done. + - '&7&oI should slay &c&oBig ol'' Bubba&7&o and kill 5 &c&oLonghorns&7&o and 6 &c&oShorthorns&7&o.' + questCompleteMessage: + - '&a[Scribonia Ingenvinus]&f I must say I am quite impressed.' + - Clearly you are way more than just 'capable'. + - Thank you for the assistance, we will be able to handle the rest. + - Until we meet again, great hunter. +primis_pontis_mille_fields_feeding_the_hungry: + customObjectives: + Objective3: + dialog: + - '&7You hand the over the bread and the flour.' + - '&a[Rufia Tertulus]&f I don''t know what to say. My children will be so happy!' + - '&7The woman bows to you in deep appreciation.' + Objective4: + dialog: + - '&a[Fabia Praetextus]&f I guess fantasies do come true sometimes. I am eternally grateful to you kind sir.' + Objective1: + dialog: + - '&a[Lena Lucan]&f Fresh bread! I cannot thank you enough!' + Objective2: + dialog: + - '&a[Tranio Florens]&f Wow! The day just keeps getting better!' + - Thank you for the flour kind soul. + name: '&2Feeding the hungry' + questLore: + - I can feel a good heart beating in that chest of yours. + - Not everyone is as fortunate as you and I. + - There are some poor souls living in the &dPontis Mille Slums&f. + - For a while now I have been working over + - time to produce surplus bread and flour. + - Would you mind taking these sacks of wheat and these bread stacks. + - Then travel with them to the &dSlums&f and hand them out to those in need? + - I have been doing this for a while now but I injured my left foot, + - so I cannot do much walking right now. + questAcceptDialog: + - '&a[Daemones Maritialis]&f I wish there were more people like you in the world.' + - The &dSlums&f are straight North of here, you can see the buildings in the distance. + - '&7&oI should go to the &dSlums&7&o and hand out the food to those in need.' + questCompleteMessage: + - '&a[Augustina Verrucosis]&f &2Daemones&f sent you here didn''t he.' + - + - + - Thank you stranger, my family won't forget this. +primis_pontis_mille_fields_fruity_hound: + name: '&2Fruity hound' + questLore: + - Since you are my NUMBER ONE berry recovery agent, + - I have another task for you. + - As you can see we grow some very large berries on our + - little &dBerry Farm&f here. + - There was a + - '&eSpecific Berry&f I was growing for a contest.' + - But as I was walking to the &dBerry Farm&f I saw a + - '&cFruity Rockhound&f jump for the bush holding my prized berry.' + - He snapped it off and carried it away. + - Its jaws were holding the berry by its stem so + - it should still be in one piece, I hope. + - If you go slay the beast and bring back my + - dear &eContest Berry&f I will have a nice + - reward waiting for you. + questAcceptDialog: + - '&a[Dordalus Nasica]&f I think I saw the &cHound&f head into the &dRedwoods&f, North-West of the farm.' + - '&7&oI should go slay the &c&oFruity Hound&7&o and see if the &e&oContest Berry&7&o is still in one piece.' + questCompleteMessage: + - '&a[Dordalus Nasica]&f YES! That is my darling! Fine and whole, not even any saliva on it!' + - + - + - + - +primis_pontis_mille_fields_not_on_my_farm: + name: '&2Not on my farm!' + questLore: + - Lately all these &cRats&f have been driving me crazy. + - They keep going into our little farm and eating all our goods! + - Any chance you could go and lower their numbers a bit? + - Be careful, there are so many of them. + - Oh, I almost forgot to tell you. + - If you see a large &cWell Fed Rat&f don't bother with it. + - It has grown so large and fat it would take you days to slay it. + questAcceptDialog: + - '&a[Milonia Majus]&f I am sure that you already noticed that they like to squirm around the path area.' + - '&7&oI should go kill the &cRats&7&o that hang around the path that leads to &dPontis Mille&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f Thank you so much! We can get back to making delicious goods now.' +primis_pontis_mille_fields_surprise_me_with_flour: + customObjectives: + Objective3: + dialog: + - '&a[Adulescens Lupis]&f I heard the farm was having &cRat&f problems. Three sacks of flour coming up, no problem!' + Objective1: + dialog: + - '&a[Dinia Niraemius]&f Flour? Sure, one sack of flour coming up!' + Objective2: + dialog: + - '&a[Daemones Maritialis]&f The farm needs more flour eh? Here ya go, two sacks!' + name: '&2Surprise me with flour' + questLore: + - Wow, you're quite handy. If I could bother you with another task. + - The &cRats&f had completely ruined our current stock of flour. + - So we need to a completely new batch of flour. + - The &dWindmills&f should have plenty of it. + - Go collect the flour and drop it off back here with me. + - I will be paying good coin for this service! + questAcceptDialog: + - '&a[Milonia Majus]&f You will need to collect the flour from all three &dWindmills&f.' + - '&7&oI need to visit the three &dWindmills&7&o and collect the flour they produce.' + questCompleteMessage: + - '&a[Milonia Majus]&f This should last us for quite a while!' + - Hopefully our flour tab won't get too big, hehe. +primis_pontis_mille_fields_wellness: + name: '&2Wellness' + questLore: + - Am I glad to see you right now! + - Dang &cNightmare Rat&f ambushed me while I was climbing down the well. + - I injured my arm and legs when I fell. + - Argh, I still have some of its toxic spit left in my eyes. + - Thankfully I managed to crawl my way onto this little + - ledge before it could come finish me off. + - How embarrassing, not sure what hurts more right now, my body or my pride. + - I have some + - '&eFirst Aid Equipment&f' + - in my chest at the &dHunters Camp&f. + - Would you mind getting it for me? Oh, and make sure not to tell anyone + - there a word about what you saw here. + - '...almost died in a well...this is chapter of my life I will need to erase...' + questAcceptDialog: + - '&a[Volumnia Zoilus]&f The &dHunters Camp&f is straight South, cannot miss it, look for tents.' + - '&7&oI need to go collect the &e&oFirst Aid Equipment&7&o for &a&oVolumnia&7&o at the &d&oHunters Camp&7&o.' + questCompleteMessage: + - '&a[Volumnia Zoilus]&f Already back? Hand me the equipment.' + - Do not worry about me, I will have myself patched up in no time. + - Thank you for everything! You saved my life you know! +primis_pontis_mille_field_check: + customObjectives: + Objective1: + dialog: + - '&a[Augustina Verrucosis]&f Oh, this is quite important! I will let the residents know.' + - Thank you for delivering these important documents. + name: '&2Field check' + questLore: + - If I could bother you with some delivery tasks. + - I have here some important documents that need to be delivered to the + - '&dSlums&f and to the &dFields Farm&f.' + - The soldier that was supposed to come and get them has not arrived yet. + - And this is an urgent matter, we cannot afford to wait any longer. + - Unfortunately I have strict orders to not leave my post. + - If you could do this for me it would help us out a lot. + questAcceptDialog: + - '&a[Godefridus Novation]&f You will do it? Excellent!' + - You can follow the &9Yellow Path&f to get to the slums. + - The &dFields Farm&f is right beyond the slums, just follow the path. + - Oh! And watch out for the field rats! + - '&7&oI should head for the &d&oSlums&7&o and then the &d&oFields Farm&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f Documents? Let me see them. Hmmm, looks official.' + - Thank you for coming all the way here to deliver them. + - '&7&oSeems like &a&oMilonia&7&o could use my help with the rats...' +primis_pontis_mille_fresh_rats_coming_up: + customObjectives: + Objective1: + dialog: + - '&a[Elite Guard]&f Plenty of rats inside.' + name: '&2Fresh rats coming up' + questLore: + - No cat food but I think I can help ya + - find something even better... + - I heard a couple of + - '&aGuards&f have been dealing with' + - a rat infestation in the lower parts of the city. + - Go down there and maybe you can get some + - '&cRats&f for your cat friend.' + questAcceptDialog: + - '&7&oI should check out the lower part of the city and see if I can find the &a&oElite Guards&7&o.' + questCompleteMessage: + - '&a[Mew Meowzer]&f Meow. MEOW! Prrrrr.' + - '&7&oI should let the cat enjoy it''s meal in peace.' + - '&7&oIt seems to have dropped something, hmm...' +primis_pontis_mille_hungry_friend: + customObjectives: + Objective3: + dialog: + - '&a[Melaenis Gelasius]&f Cat food? Where the heck did you manage to find a cat here...' + - No, I don't know where to get any cat food. + Objective4: + dialog: + - '&a[Sulpicio Panthera]&f I wish I could help, sorry.' + Objective1: + dialog: + - '&a[Royal Guard]&f Do I look like someone who keeps track of cat food?...' + Objective2: + dialog: + - '&a[Tyndarus Faustinius]&f Sorry, I have no idea.' + Objective5: + dialog: + - '&a[Tyndarus Columbanus]&f We used to have cat food around here somewhere, but heck knows what happened to it...' + name: '&2Hungry friend' + questLore: + - '&7&oWhat is wrong little one.' + - '&a[Mew Meowzer]&f Meow!' + - '&7&o Are you hungry? Does the' + - '&7&olittle one want some food?' + - '&a[Mew Meowzer]&f MREOOOW!!!' + - '&7&oLet''s see if we can' + - '&7&oget you some food.' + questAcceptDialog: + - '&7&oI should see if anybody in the city knows where to find some cat food.' + questCompleteMessage: + - '&a[Modestus Aper]&f Cat food? I don''t know about that. But...' + - '&7&oSeems like &a&oModestus&7&o might know something...' +primis_pontis_mille_late_delivery: + name: '&2Late delivery' + questLore: + - I ordered some &eFishing Nets&f from + - '&dGladius&f that haven''t arrived yet. I wonder' + - if something might have happened to the + - shipment. If you are willing, I would pay you + - a small fee if you could go see what + - happened to the shipment and get the + - '&eFishing Nets&f for me.' + questAcceptDialog: + - '&a[Delphium Calpurnius]&f Last I heard my shipment of &eFishing Nets&f was supposed to be heading for &dGladius&f.' + - '&7&oI need to go look around &d&oGladius&7&o for &a&oDelphium''s&7&o shipment of &e&oFishing Nets&7&o.' + questCompleteMessage: + - '&a[Delphium Calpurnius]&f Those are the &eFishing Nets&f! Thank you so much!' + - '&a[Delphium Calpurnius]&f I invested a lot of my savings into these! Not sure what I would have done if you hadn''t found them.' +primis_pontis_mille_let_them_know: + customObjectives: + Objective3: + dialog: + - So Fortes sent you? I see. + - Your help would be much appreciated, aid me and my forces will be ready. + Objective1: + dialog: + - So Fortes has decided to take action. + - Help me finish my task, and my forces will be ready. + Objective2: + dialog: + - So Fortes has decided to act. + - If you could assist me with this task, then my forces will be ready. + name: '&2Let them know!' + questLore: + - I am sorry that we cannot send aid to &dGladius&f right away. + - Ever since that new &cCounselor&f came, our ruler has not been himself. + - If you could reach out to the &aGenerals&f in the city and let them know + - that &dGladius&f needs help we might be able to to do something about it. + - But not before we deal with the existing issues first. + - + - + - Go talk to them and then come back to let me know they got the message. + - I will reward you for your time. + questAcceptDialog: + - '&a[Fortes]&f Follow the &9orange path&f from the main room to find &aGeneral Bromia&f.' + - '&a[Fortes]&f At the end of the &9yellow path&f you will find the &aGeneral Rogerius&f.' + - '&a[Fortes]&f At the end of the &9shorter purple&f path you will find the &aGeneral Cylindrus&f.' + - '&7&oI need to talk to the three &a&oGenerals&7&o.' + questCompleteMessage: + - '&a[Fortes]&f You managed to contact them? Excellent!' + - '&a[Fortes]&f Here is your reward. Don''t spend it all in one place.' +primis_pontis_mille_lighthouse_1: + customObjectives: + Objective1: + dialog: + - '&8[Hegio Remus]&f Another letter? Thank you for bringing it to me.' + name: '&2A quick delivery' + questLore: + - Before you go anywhere, could you deliver this letter for me? + - You can find the gentleman it needs to go to on top of the Lighthouse. + - Don't worry the Lighthouse is right behind me through that doorway. + questAcceptDialog: + - '&8[Fortes]&f Thank you.' + - '&8&oI should go talk to the Pontis Mille Lighthouse Keeper.' + questCompleteMessage: + - '&8[Hegio Remus]&f Hey, do you have a second?' + - '&8&oSeems like Hegio Remus needs me to talk to him.' +primis_pontis_mille_lighthouse_2: + customObjectives: + Objective1: + dialog: + - '&a[Jeeves]&f Oh, we meet again. It''s good to see you.' + - You have something for me? Oh, wow...that is quite the shopping list. + - I will have the items sent back to &aHegio&f as soon as possible. + - Thank you for stopping by. Hope we meet again. + - '&7&oI should let &aHegio&7&o know I delivered the note.' + name: '&2Ask Jeeves' + questLore: + - Would you mind taking the portal and delivering a note to my good friend &aJeeves&f. + questAcceptDialog: + - '&a[Hegio]&f Much appreciated friend.' + - '&7&oI should go talk to &aJeeves&f at &dCaeruleaum Village&7&o.' + questCompleteMessage: + - '&a[Hegio]&f You delivered the note? Excellent!' + - Here, you can have some of this &eRabbit Stew&f I keep in my back pocket. +primis_pontis_mille_mines_goblined_up_in_the_maze: + customObjectives: + Objective3: + dialog: + - '&a[Hurt Guard]&f Am so I happy to see you!' + Objective1: + dialog: + - '&a[Injured Guard]&f Thank the skies!' + Objective2: + dialog: + - '&a[Wounded Guard]&f Finally, the rescue is here!' + name: '&2Goblined up in the maze' + questLore: + - If I could bother you for a second. + - Since you will be going into the &dMines&f already, it + - would be great if you could help us resolve some issues. + - We are missing three &aGuards&f that were sent + - into the mines to hunt down a &cCursed Goblin&f. + - I fear that something might have happened to them. + - This &cCursed Goblin&f is supposed to be + - hiding in some sort of &9Maze&f in the &dMines&f. + - Could you locate the &aMissing Guards&f and + - bring me proof of the &cGoblins&f death. + questAcceptDialog: + - '&a[Centurion]&fTry to not get lost in the &9Maze&f.' + - May luck be on your side warrior! + - '&7&oI should venture through the &d&oMines&7&o and locate the &9&oMaze&7&o.' + questCompleteMessage: + - '&a[Centurion]&f They are alive, excellent, we will send some soldiers to get them out as soon as possible.' + - I see you brought proof of the &cGoblins&f death, well done. + - '&7&oHopefully people keep out of the &9Maze&7&o in the future.' +primis_pontis_mille_serious_sewage: + customObjectives: + Objective3: + dialog: + - '&a[Michelangelo]&f Tell that old man everything is in order!' + Objective4: + dialog: + - '&a[Raphael]&f Tell Rogerius I am alive and doing fine!' + Objective1: + dialog: + - '&a[Donatello]&f You can tell the General I am doing just fine!' + Objective2: + dialog: + - '&a[Leonardo]&f The General should not worry, I am ok!' + name: '&2Serious sewage' + questLore: + - If you are up to the task then I could use your help. + - + - + - + - + - They have a leader, I think he calls himself &cShreepper&f or something. + - Make sure to get rid of him, a snake without it's head is not a threat. + - If you could go down there and thin the numbers of critters and the trouble makers + - then that would allow me to assign my forces to more important tasks... + - We had also sent &a4 Agents&f down there, I have not heard from them yet. + - + - + - I also seem to have misplaced my personal &eSewage Keys&f + - if you could retrieve those too, that would be great. + questAcceptDialog: + - '&a[Rogerius]&fYou can get to the &dSewers&f by going to the fountain and then a bit south-east.' + - + - + - '&7&oI need to find my way into the &dSewers&7&o and complete the tasks.' + questCompleteMessage: + - '&a[Rogerius]&f You have completed the all I have asked? If only I had 10 more men like you...' +primis_pontis_mille_star_gazing: + customObjectives: + Objective1: + dialog: + - '&a[Virgo Dexippus]&f Yes, what is it?' + name: '&2Star gazing' + questLore: + - You have done so much for this city and its people. + - Having assisted the three &aGenerals&f and helped the areas around &dPontis Mille&f + - has freed up a serious amount of our forces and resources. + - We would be able to send our forces to aid &dGladius&f now. + - But before we take action there is one last thing I would like you to do. + - You should go speak with the &aStargazers&f. + - It is in regards to our lost history and the &cElementals&f. + - The &aStargazers&f will be able to tell you more once you talk to them. + - Here take this sealed note and show it to them. + questAcceptDialog: + - '&7[Fortes Bellator]&f You can find the &aStargazers&f at the &dObservatory&f.' + - + - + - '&7&oI should talk to the &aStargazers&7&o at the &dObservatory&7&o.' + questCompleteMessage: + - '&a[Virgo Dexippus]&f The &aMajor&f sent you? It must be important then.' + - '&7&oI should talk to &aVirgo&7&o.' +primis_pontis_mille_stay_a_while_and_listen: + name: '&2Stay a while and listen' + questLore: + - Hand me the note. Let me take a look... + - We have been given permission to share important + - information with you regarding our past. + - You must have done something quite important, + - this information is usually only shared with the top brass. + - '&aStella&f will share with you what we have uncovered.' + questAcceptDialog: + - '&a[Virgo Dexippus]&f Talk to &aStella&f and &9Click on the Sword&f to start listening.' + - '&7&oI should talk to &aStella&7&o and start the &9Arena Challenge&7&o.' + questCompleteMessage: + - '&a[Virgo Dexippus]&f Do not share this information with anyone.' + - '&7&oThat was quite a tale.' +primis_pontis_mille_the_groves_call: + customObjectives: + Objective1: + dialog: + - '&a[King Nemian]&f &2General Bromia&a sent you?' + - Excellent, I knew we could count on him. + name: '&2The groves call!' + questLore: + - It is our duty to protect the &dGroves&f from any threats. + - '&aKing Nemian&f of the &dGroves&f has sent a request for aid.' + - Nasty critters have come to the &dGroves&f and other + - invaders are taking over the trees. + - If you could go over there and sort out these issues + - then my forces will be free to come to &dGladius'&f aid + questAcceptDialog: + - '&a[Bromia]&f The &dGroves&f are located North of the city.' + - There is a path through the mountain,, below the mines. + - '&7&oI should talk to &aKing Nemian&7&o.' + questCompleteMessage: + - '&a[King Nemian]&f You have arrived just in time!' +primis_pontis_mille_to_lycan_or_not_to_lycan: + name: '&2To lycan or not to lycan' + questLore: + - Not sure how a single person can accomplish what + - an entire battalion cannot. + - But if the &aGeneral&f has sent you, then who I am to complain. + - We have located their &dDen&f, but the resistance is too strong. + - There was just no way to get through. + - But If you could fight your way into the &dDen&f and clear it out + - then the &dRedwoods&f could be safe yet again. Well safer at least... + - Their &dDen&f is located under a &9Corrupted Redwood Tree&f. + - Should be easy to spot it, it stands out among the healthy trees. + questAcceptDialog: + - '&a[Cylindrus]&f Be careful...' + - '&7&oI need to clear out the &dWerewolf Den&7&o.' + questCompleteMessage: + - '&a[Magnus]&f By the great tree fairy, you''ve done it!!!' + - Feel free to rest at our camp, you are always welcome here. +primis_pontis_mille_where_is_he_now: + customObjectives: + Objective1: + dialog: + - '&a[Gorenus Palis]&f My brother sent you looking for me?' + - Oh, I messed up again...I got real lost this time. + - I hope he isn't too mad. + - When you go back, please tell him I'm safe. + name: '&2Hungry friend' + questLore: + - Me and my &aBrother&f were on our way + - back here from the village. + - During our travels I had to do a little detour, so we got separated. + - We were supposed to meet up here. + - But no trace of him for quite some time now. + - He has a tendency to get lost...real lost. + - I am quite worried about him. + - I would be willing to pay a high reward + - to anyone who can find him. + questAcceptDialog: + - '&a[Rodenus Palis]&f So kind of you to offer your help.' + - Please if you find him come tell me where he is right away. + - '&7&oI need to go find &a&oRodenus''&7&o brother.' + questCompleteMessage: + - '&a[Rodenus Palis]&f What! How the heck did he end up all the way there!' + - Sigh, I better start going now then... + - Thank you for all your help. Here are the coins as promised. +primis_pontis_redwoods_big_brown_logs: + customObjectives: + Objective1: + dialog: + - '&a[Magnus]&f Who are you? Oh, you came from &dPontis Mille&f.' + name: '&2Big brown logs' + questLore: + - I could dedicate my forces to helping &dGladius&f if you could help + - us deal with the &cWerewolf&f crisis in the &dRedwoods&f. + - Our forces have been holding back the &cWerewolves&f for weeks now. + - It would be great if you could assist us. + - Go to the &dRedwoods&f and talk to &aMagnus Castorea&f. + - They will let you know what needs to be done to end this crisis. + questAcceptDialog: + - '&a[Cylindrus]&fThe &dRedwoods&f can be reached by heading North.' + - Head North until you reach the &dRailway Stop&f, then head West. + - '&7&oI need to head into the &dRedwoods&7&o and talk to &aMagnus&7&o.' + questCompleteMessage: + - '&a[Magnus]&f The general has sent you to help?' + - Hmm...you better be good. +primis_pontis_redwoods_its_reyn_time: + name: '&2It is Reyn time!' + questLore: + - My &ePocket-watch&f had fallen into the river when I was cutting down a tree. + - It is a special watch you see. Filled with air and quite robust. + - Fully resilient to heavy logs being dropped on it, yep. + - I saw one of those nasty &cBandits&f scoop it up and put it in their pocket. + - Pretty sure I saw them &9Carrying a Hatchet&f. + - + - + - A nice reward for you too when you get back! + questAcceptDialog: + - '&8[Reynus]&f You can find the &cBandits&f right across the river.' + - '&7&oI need to go slay the correct &cBandit&7&o and collect the &eWatch&7&o.' + questCompleteMessage: + - '&a[Reynus]&f I will make sure not to loose it again!' + - Your reward my good sir! +primis_pontis_redwoods_nasty_little_bandits: + name: '&2Nasty little bandits!' + questLore: + - Ever since these darn &cBandits&f settled across the river there has been no peace. + - They keep ruining the trees, yesterday I caught one of them + - trying to set one of these giant trees on fire! + - And not too long ago I got chased by a crazy person with a hatchet, + - I am quite sure it was one of the &cBandits&f. + - Not too mention they keep trying to rob anyone that + - has business with us good folk here at the &dSawmill&f. + - Enough is enough. I am willing to pay good coin to make this madness end. + questAcceptDialog: + - '&a[Ligna Crispian]&f You will find them across the river.' + - '&8&oI should go to the &dBandit Camp&f and clear it out.' + questCompleteMessage: + - '&a[Ligna Crispian]&f Finally! Some peace, thank you!' +primis_pontis_redwoods_need_a_smoke: + name: '&2Need a smoke' + questLore: + - I heard you helped good old &aReynus&f there. + - Well as you can see, I managed to cut my legs with that darn saw again. + - Oh, don't worry about me. My legs will be healed up again in no time. + - You see, the issue is, not much to do while I wait for my legs to heal. + - This makes me in the mood for some good puffin. + - I brought with me some &ePremium Tobacco&f for my pipe, + - but I had to hide it in case those &cBandits&f got their hands on it. + - The problem is, I completely forgot where I hid it! + - All I remember is burying it &9Near a Tree&f. + - Which tree? Who knows! + - Listen I got you a fine deal here. Find my tobacco and you can have + - all of my &eGolden Apples&f. + questAcceptDialog: + - '&a[Lyco]&f Hope ya find it soon.' + - '&7&oI should go look for the &eTobacco&7&o.' + questCompleteMessage: + - '&a[Lyco]&f You found it! HAHA! Knew I could rely on ya!' +primis_terravilla_bipedal_examination: + name: '&2Bipedal examination' + questLore: + - I have been studying the &cTwo Legged Terrors&f that roam + - around &dTerravilla&f. Did you know that their population + - used to be much larger just some years ago. In fact it was + - the reason why the first settlers decided to build + - '&dTerravilla&f on top of the ruins and not down on the ground.' + - For some reason their numbers have really decreased. I was + - trying to get some &eSamples&f but trying to kill any of them is + - far beyond my skill. But you look like the sort of type who + - can handle a &cTwo Legged Terror&f or two. Interested in + - helping me out? + questAcceptDialog: + - '&a[Plautia Suilius]&f Six &eSamples&f should do it. Return to me once you have collected the &eSamples&f.' + - '&7&oI need to slay 3 &c&oTwo Legged Terrors&7&o and collect their &e&oSamples&7&o.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Great! Let''s have a look.' + - '&7&oI should hear what &a&oPlautia Suilius&7&o has discovered.' +primis_terravilla_drowning_terror: + name: '&2Drowning terror' + questLore: + - My theory was correct. I dissected the growth and found + - an organism inside. After careful examination I have + - determined that the organism is of aquatic origin. And + - not only that, they are capable of hijacking the host's + - brain. Once ready to hatch they make the host go to the + - nearest water source and drown themselves. The organism + - can then freely hatch and swim away. Whatever is + - infecting the &cTwo Legged Terrors&f must be living in + - a nearby river. You should go there and collect a + - '&ePerfect Sample&f of whatever organism is causing this.' + - I do not know if this is something that can affect humans + - but just in case you should kill a few of the organisms + - to make sure. + questAcceptDialog: + - '&a[Plautia Suilius]&f Come back here once you have collected a &ePerfect Sample&f.' + - '&7&oI need to go to the nearby river and collect a &e&oPerfect Sample&7&o of whatever is causing the infections.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Wow it looks like a fish, but it''s internal organs are different.' + - It must infect other creatures by releasing these tiny worm like meat particles... + - Let me have a look at you. Hmm, you seem fine, no traces... + - + - + - + - + - + - '&7&oI should make sure to stay away from the river...' +primis_terravilla_hog_on_my_porch: + name: '&2Bipedal examination' + questLore: + - He is sitting on the darn lift again! + - I cannot believe it! You there! + - You look like you can handle a large beast. + - I will pay you good money if you can get rid + - of that &cAnnoying Large Hog&f that keeps sitting + - on the lift. How are we supposed to get goods + - up and down this way. + questAcceptDialog: + - '&a[Dorippa Sarimarcus]&f Get rid of that hog right down there, see it?' + - '&7&oI need to slay the &c&oAlpha Razorback&7&o.' + questCompleteMessage: + - '&a[Dorippa Sarimarcus]&f Finally! I can move on with my life now! Thank you!' +primis_terravilla_razorbag: + name: '&2Razorbag' + questLore: + - If you are looking for work I got some for ya. + - I design and make heavy duty bags that I sell + - here at my little shop. So I am in need of + - leather. Thankfully there are plenty of + - '&cRazorbacks&f around these parts. If you are' + - interested I would like to hire you to go hunt + - them for their leather. I would need a considerable + - amount of leather. So this won't be a quick job. + questAcceptDialog: + - '&a[Telestis Senna]&f You will mostly find them roaming around here and towards the fields area.' + - '&7&oI need to go hunt the &c&oMature Razorback&7&o.' + questCompleteMessage: + - '&a[Telestis Senna]&f Yep, that will do it. In pristine condition too! Here is your coin, as promised.' +primis_terravilla_terrifying: + name: '&2Terrifying' + questLore: + - Well that is concerning. The sample you brought shows + - that they are slowly being drained of their nutrients. + - My hypothesis is that there is most likely a parasite + - attached to them that is causing this. You should go + - out there again and see if you can find any large + - '&eGrowths&f on their bodies, and then cut them off' + - and bring them back here. + questAcceptDialog: + - '&a[Plautia Suilius]&f I would only need two &eGrowths&f no more than that.' + - '&7&oI need to slay &c&oTwo Legged Terrors&7&o and collect two &e&oGrowths&7&o.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Excellent, these should do it.' + - '&7&oI should hear what &a&oPlautia Suilius&7&o has managed to find.' +test_quest: + name: Kill the Test Boss + questLore: + - '&cEnd the test boss'' reign of terror!' +xmas_quest_0: + name: '&2Find the lost gifts!' + questLore: + - + - + - I will let you open one of them in return! + questAcceptDialog: + - '&8[&cSaint Nick&8]&f Thank you! I will be waiting here for you!' + questCompleteMessage: + - '&8[&cSaint Nick&8]&f Thank you for your help! There are still some lost gifts out there, talk to me again if you want to help out more!' diff --git a/src/main/resources/translations/korean.yml b/src/main/resources/translations/korean.yml new file mode 100644 index 000000000..b9c39b1fc --- /dev/null +++ b/src/main/resources/translations/korean.yml @@ -0,0 +1,13078 @@ +config: + noArenaPermissionMessage: '[EliteMobs] 아레나에 입장할 권한이 없습니다!' +ItemSettings: + itemLoreStructureV2: + - '&7&m&l---------&7<&l장비 정보&7>&m&l---------' + - '&7아이템 레벨: &f$itemLevel &7등급 &6$prestigeLevel' + - '$weaponOrArmorStats' + - '$soulbindInfo' + - '$itemSource' + - '$ifLore&7&m&l-----------&7< &f&l설명&7 >&m&l-----------' + - '$customLore' + - '$ifEnchantments&7&m&l--------&7<&9&l인챈트&7>&m&l--------' + - '$enchantments' + - '$eliteEnchantments' + - '$ifCustomEnchantments&7&m&l------&7< &3&l커스텀 인챈트&7 >&m&l------' + - '$customEnchantments' + - '$ifPotionEffects&7&m&l----------&7< &5&l효과&7 >&m&l----------' + - '$potionEffect' + - '&7&l&m-----------------------------' + - '$loreResaleValue' + shopSourceItemLores: '&7Purchased from a store' + mobSourceItemLores: '&7Looted from $mob' + loreWorths: '&7가치: $worth $currencyName' + loreResaleValues: '&7판매 가격: $resale $currencyName' + eliteEnchantmentLoreStrings: 엘리트 + noSoulbindLore: '&7귀속되지 않음!' + preventEliteItemDisenchantmentMessage: '&c[EliteMobs] Can''t disenchant Elite Items!' + scrapSucceededMessageV2: '&8[EliteMobs] &2Scrapping succeeded $amount times!' + scrapFailedMessageV2: '&8[EliteMobs] &cScrapping failed $amount times!' + lowDurabilityItemDropMessage: '&8[EliteMobs] &c내구도가 낮아져서 방어구가 드랍되었습니다! &8사용하고 싶으면 NPC에게 가져가 조각을 사용해 수리하세요!' + lowWeaponItemDropMessage: '&8[EliteMobs] &c내구도가 낮아져서 무기가 드랍되었습니다! &8사용하고 싶으면 NPC에게 가져가 조각을 사용해 수리하세요!' + simlootMessageSuccess: '&8[EliteMobs] &2전리품 주사위를 굴려 $itemName &2을 획득했습니다!' + simlootMessageFailure: '&8[EliteMobs] &c전리품 주사위를 굴렸으나 아무것도 획득하지 못했습니다!' + directDropCustomLootMessage: '&8[EliteMobs] &2Obtained $itemName &2!' + directDropMinecraftLootMessage: '&8[EliteMobs] &aObtained $itemName &a!' + directDropCoinMessage: '&8[EliteMobs] &aObtained &2$amount $currencyName &a!' + directDropSpecialMessage: '&8[EliteMobs] &aObtained &2$amount $name &a!' + weaponEntry: '&7Elite DPS: &2$EDPS' + armorEntry: '&7Elite Armor: &2$EDEF' +ProceduralItemGenerationSettings: + materialNames: + swordName: 검 + bowName: 활 + pickaxe: 곡괭이 + spade: 삽 + hoe: 괭이 + axe: 도끼 + helmet: 헬멧 + chestplate: 흉갑 + leggings: 레깅스 + boots: 부츠 + shears: 가위 + fishingRod: 낚싯대 + shield: 방패 + trident: 삼지창 + crossbow: 쇠뇌 + nameFormats: + - '$adjective $noun의 $verb $itemType' + - '$adjective $noun의 $itemType' + - '$noun의 $adjective $verb $itemType' + - '$verb $itemType' + - '$adjective $verb $itemType' + - '$verb' + - '$adjective $verb' + nouns: + - MagmaGuy + - 새벽 + - 일몰 + - 천국 + - 지옥 + - 천사 + - 대천사 + - 아기 천사 + - 치천사 + - 악마 + - 마족 + - 박쥐 + - 닭 + - 소 + - 버섯소 + - 돼지 + - 토끼 + - 양 + - 오징어 + - 주민 + - 동굴 거미 + - 엔더맨 + - 북극곰 + - 거미 + - 좀비 피그맨 + - 블레이즈 + - 크리퍼 + - 엘더 가디언 + - 엔더 진드기 + - 소환사 + - 가스트 + - 가디언 + - 허스크 + - 마그마 큐브 + - 셜커 + - 좀벌레 + - 스켈레톤 + - 슬라임 + - 야생동물 + - 벡스 + - 변명자 + - 마녀 + - 위더 스켈레톤 + - 좀비 + - 당나귀 + - 말 + - 라마 + - 노새 + - 오셀롯 + - 늑대 + - 철 골렘 + - 눈사람 + - 엔더드래곤 + - 시듦 + - 환영술사 + - 앵무새 + - 거인의 + - 살인 토끼 + - 스티브 + - 울프반 + - 혼돈 + - 이온 + - 드래곤 + - 스핑크스 + - 미노타우로스 + - 하데스 + - 맹세 + - 변절자 + - 탈영병 + - 배반자 + - 비취 + - 밝은 + - 어둠 + - 망각 + - 그림자 + - 공허 + - 제노 + - 광전사 + - 천정 + - 새벽 + - 황혼 + - 몹 + - 엘리트몹 + - 우리스트 + - 드워프 + - 엘프 + - 오크 + - 고블린 + - 노움 + - 골리앗 + - 드로우 + - 인간 + - 하플링 + - 반오크 + - 감시자 + - 마인드 플레어 + - 올빼미곰 + - 불레트 + - 부식된 괴물 + - 언덕 거인 + - 바위 거인 + - 얼음 거인 + - 화염 거인 + - 구름 거인 + - 폭풍 거인 + - 코볼트 + - 리치 + - 오크 + - 엄버 헐크 + - 투사 + - 마법사 + - 성기사 + - 성직자 + - 궁병 + - 궁수 + - 마법사 + - 티플링 + - 늑대인간 + - 흡혈귀 + - 켄타우로스 + - 캣포크 + - 반거인 + - 오우거 + - 트롤 + - 도적 + - 바바리안 + - 음유시인 + - 드루이드 + - 수도승 + - 주술사 + - 흑마법사 + - 악마사냥꾼 + - 죽음의 기사 + - 사제 + - 주술사 + - 전사 + - 바실리스크 + - 키메라 + - 임프 + - 드리아드 + - 가고일 + - 드지니 + - 에프리티 + - 유령 + - 홉고블린 + - 히드라 + - 크라켄 + - 라미아 + - 메두사 + - 미믹 + - 미라 + - 페가수스 + - 락 + - 사티로스 + - 타라스크 + - 혐오자 + - 구울 + - 나무정령 + - 유니콘 + - 망령 + - 시종 + - 검투사 + - 기사 + - 그리폰 + - 약탈자 + - 정찰병 + - 스파이 + - 티그 + - 귀족 + - 보초 + - 베테랑 + - 와이번 + - 심연 + - 지옥 + - 정령 + - 타우렌 + - 판다렌 + - 빅풋 + - 포세이큰 + - 설인 + - 밴시 + - 거미 + - 망자 + - 나이트 엘프 + - 블러드 엘프 + - 드레나이 + - 늑대인간 + - 전쟁군주 + - 마녀 + - 마기 + - 현자 + - 도둑 + - 암살자 + - 기사 + - 야수 전문가 + - 광전사 + - 인벤터 + - 투사 + - 해적 + - 선봉대 + - 공허날 + - 위습 + - 소작농 + - 보병 + - 검사 + - 노예 + - 펠하운드 + - 여성 사냥꾼 + - 사냥꾼 + - 아라코르크라 + - 아볼레스 + - 데바 + - 플라네타 + - 태양 + - 앙케그 + - 아제르 + - 베히르 + - 죽음폭군 + - 병충해 + - 버그베어 + - 허그베어 + - 불리우그 + - 캠비온 + - 추울 + - 리치 왕 + - 코카트리스 + - 쿠아틀 + - 사이클롭스 + - 타이탄 + - 다크맨틀 + - 에인션트 원 + - 데미리치 + - 발로르 + - 발구라 + - 깊은 틈 + - 드레치 + - 글라브레주 + - 고리스트로 + - 헤즈로 + - 마네스 + - 마릴리스 + - 날페쉬니 + - 퀘싯 + - 브이락 + - 요클롤 + - 핏 파인드 + - 레무어 + - 드라콜리치 + - 도플갱어 + - 크로마틱 드래곤 + - 드라이더 + - 공기의 정령 + - 대지의 정령 + - 불의 정령 + - 물의 정령 + - 로히림 + - 곤도리아인 + - 엠피리언 + - 페어리 드래곤 + - 에틴 + - 플럼프 + - 포모리안 + - 다오 + - 그놀 + - 파센디 + - 리스너 + - 스프렌 + - 폭풍부 + - 로샤리안 + - 브라이트로드 + - 고위 왕자 + - 왕 + - 황제 + - 조각 전달자 + - 서지 바인더 + - 끈 세공인 + - 골렘 + - 고르곤 + - 해그 + - 하피 + - 히포그리프 + - 호문쿨루스 + - 국영 연금술사 + - 죽지 않는 병사 + - 자칼웨어 + - 노딕 + - 오니 + - 락샤사 + - 망자 + - 광신자 + adjectives: + - 사랑스러운 + - 아름다운 + - 깨끗한 + - 우아한 + - 고급스러운 + - 매력적인 + - 멋진 + - 긴 + - 웅대한 + - 일반 + - 예스러운 + - 반짝이는 + - 가장 못생긴 + - 붉은 + - 주황색 + - 노란 + - 녹색 + - 파란 + - 자주색 + - 회색 + - 검은 + - 흰 + - 죽은 + - 이상한 + - 강력한 + - 부유한 + - 어마어마한 + - 헌신적인 + - 먹먹한 + - 기절한 + - 선율적인 + - 조용한 + - 뇌성의 + - 속삭이는 + - 위협 + - 고대 + - 빠른 + - 오래된 + - 고속의 + - 느린 + - 부패된 + - 징그러운 + - 구부러진 + - 비어 있는 + - 무거운 + - 혐오스러운 + - 비정상적인 + - 어리석은 + - 만족스러운 + - 우발적인 + - 단호한 + - 모험적인 + - 괴로운 + - 활발한 + - 짜증이 난 + - 짜증나는 + - 불안해 하는 + - 향이 좋은 + - 공격적인 + - 냉담한 + - 엄청난 + - 모호한 + - 야심찬 + - 재미있는 + - 화난 + - 오만한 + - 부끄러운 + - 야망하는 + - 놀라운 + - 상서로운 + - 보통 + - 끝내주는 + - 끔찍한 + - 나쁜 + - 야만적인 + - 부끄러운 + - 어울리는 + - 호전적인 + - 유익한 + - 거친 + - 최고의 + - 당황한 + - 큰 + - 쓴 + - 기묘한 + - 피투성이 + - 끓는 + - 경계 없는 + - 경솔한 + - 용감한 + - 늠름한 + - 깨지기 쉬운 + - 짧은 + - 밝은 + - 망가진 + - 바쁜 + - 계산중인 + - 냉담한 + - 고요한 + - 변덕스러운 + - 조심하는 + - 부주의한 + - 배려하는 + - 신중한 + - 끊임없는 + - 확실한 + - 매력적인 + - 저렴한 + - 족장의 + - 차가운 + - 기사도적인 + - 두꺼운 + - 분명한 + - 똑똑한 + - 속세에서 벗어난 + - 서투른 + - 흐린 + - 고상한 + - 초거대한 + - 전투적인 + - 평범한 + - 혼란스러운 + - 비난받은 + - 쿨한 + - 용감한 + - 겁에 질린 + - 정신나간 + - 비겁한 + - 잔인한 + - 껴안고 싶은 + - 의문의 + - 귀여운 + - 손상된 + - 손상 + - 위험한 + - 어두운 + - 근사한 + - 결단력 있는 + - 깊은 + - 패배한 + - 결함있는 + - 반항하는 + - 섬세한 + - 맛있는 + - 유쾌한 + - 악마의 + - 어지러운 + - 정신나간 + - 기술적인 + - 사악한 + - 어려운 + - 부지런한 + - 지독한 + - 더러운 + - 형편없는 + - 역겨운 + - 기분 나쁜 + - 환멸스러운 + - 뚜렷한 + - 방해받은 + - 엄격한 + - 극적인 + - 음산한 + - 고장난 + - 열렬한 + - 노년의 + - 전기의 + - 엘리트 + - 강화된 + - 마법 부여된 + - 활동적인 + - 막대한 + - 재미있는 + - 열정적인 + - 질투하는 + - 불규칙한 + - 천상의 + - 얼버무리는 + - 훌륭한 + - 신나는 + - 흥미진진한 + - 이국적인 + - 활기 넘치는 + - 굉장한 + - 시든 + - 공평한 + - 충실한 + - '틀린' + - 익숙한 + - 유명한 + - 광신적인 + - 환상적인 + - 매혹적인 + - 뚱뚱한 + - 끔찍한 + - 겁없는 + - 허약한 + - 축제 + - 사나운 + - 추잡한 + - 질 높은 + - 까다로운 + - 첫 번째 + - 고정된 + - 호화로운 + - 흠잡을 데 없는 + - 조잡한 + - 경솔한 + - 꽃무늬 + - 보송보송한 + - 펄럭이는 + - 거품 같은 + - 어리석은 + - 잘 잊어버리는 + - 운 좋은 + - 노쇠한 + - 연약한 + - 두려운 + - 자유로운 + - 얼어붙은 + - 신선한 + - 친근한 + - 겁나는 + - 어설픈 + - 우스운 + - 털로 덮인 + - 은밀한 + - 애매한 + - 거인의 + - 선천적인 + - 거대한 + - 반짝거리는 + - 영광스러운 + - 신들린 + - 좋은 + - 바보 같은 + - 화려한 + - 우아한 + - 거창한 + - 감사하는 + - 기름투성이 + - 우수한 + - 욕심 많은 + - 비통한 + - 근사한 + - 기괴한 + - 지저분한 + - 섬뜩한 + - 심술난 + - 조심스러운 + - 결백한 + - 속이기 쉬운 + - 대담한 + - 텅 빈 + - 소중한 + - 매달린 + - 불운한 + - 행복한 + - 조화로운 + - 혐오스러운 + - 건강한 + - 실연한 + - 천상의 + - 지옥의 + - 도움이 된 + - 도움 되지 않는 + - 망설이는 + - 흉측한 + - 쾌활한 + - 속이 빈 + - 노숙자의 + - 고결한 + - 끔찍한 + - 친절한 + - 거대한 + - 부피가 큰 + - 유머러스한 + - 배고픈 + - 아픈 + - 숨죽인 + - 최면의 + - 발작적인 + - 기분 나쁜 + - 얼어버린 + - 무식한 + - 병든 + - 불법적인 + - 저명한 + - 상상속의 + - 엄청난 + - 일촉즉발의 + - 공정한 + - 불완전한 + - 무례한 + - 중요한 + - 백열의 + - 무능한 + - 산업용 + - 믿을 수 없는 + - 비싸지 않은 + - 악명 높은 + - 무고한 + - 탐구적인 + - 서서히 퍼지는 + - 본능적인 + - 총명한 + - 흥미로운 + - 무적의 + - 성난 + - 가려운 + - 싫증난 + - 뾰족한 + - 질투하는 + - 유쾌한 + - 기쁜 + - 조마조마한 + - 유치한 + - 예리한 + - 친절한 + - 인정 많은 + - 꿰뚫어보는 + - 아는 것이 많은 + - 유명한 + - 부자연스러운 + - 변변찮은 + - 큰 + - 마지막 + - 늦은 + - 웃긴 + - 게으른 + - 야윈 + - 치명적인 + - 밝은 + - 작은 + - 살아있는 + - 외로운 + - 시끄러운 + - 사랑스러운 + - 행운의 + - 자홍색 + - 마법 + - 장엄한 + - 악의적인 + - 표시된 + - 초대형 + - 신기한 + - 심술궂은 + - 의료용 + - 녹은 + - 지저분한 + - 강력한 + - 전투 + - 생각 없는 + - 경미한 + - 희미한 + - 섞인 + - 현대 + - 움직이지 않는 + - 신비한 + - 소박한 + - 좁은 + - 자연의 + - 산뜻한 + - 필요한 + - 불필요한 + - 굶주린 + - 걱정 많은 + - 새 + - 좋은 + - 일반 + - 향수의 + - 수많은 + - 구식 + - 흭득 가능한 + - 바다 + - 옛날식 + - 박식한 + - 최적의 + - 평범한 + - 유기농 + - 뛰어난 + - 타원형 + - 고평가된 + - 고통의 + - 평행한 + - 한심한 + - 평화로운 + - 화살받이 + - 완벽한 + - 주기적인 + - 자그마한 + - 물질적인 + - 분홍색 + - 플라스틱 + - 편안한 + - 무의미한 + - 정중한 + - 미흡한 + - 귀중한 + - 프리미엄 + - 선물받은 + - 예쁜 + - 개인 + - 생산적인 + - 방어적인 + - 공용 + - 헷갈리는 + - 의구심이 드는 + - 신속한 + - 가장 빠른 + - 희귀한 + - 준비된 + - 진짜 + - 반역자 + - 일반 + - 주목할 만한 + - 책임 있는 + - 낭만적인 + - 둥근 + - 왕족 + - 슬픈 + - 안전한 + - 짭짤한 + - 만족스러운 + - 겁먹은 + - 무서운 + - 과학적인 + - 말라빠진 + - 언성 + - 두번째 + - 중고 + - 비밀 + - 이기적인 + - 순종하는 + - 진지한 + - 얕은 + - 날카로운 + - 빛나는 + - 충격적인 + - 짧은 + - 수줍은 + - 병에 걸린 + - 침묵의 + - 부드러운 + - 바보 같은 + - 간단한 + - 마른 + - 날씬한 + - 끈적한 + - 미끄러운 + - 작은 + - 똑똑한 + - 미소 짓는 + - 매끄러운 + - 은밀한 + - 부드러운 + - 단단한 + - 특별 + - 화려한 + - 매운 + - 뾰족한 + - 인상적인 + - 으스스한 + - 티끌 하나 없는 + - 사각 + - 공격적인 + - 서 있는 + - 꾸준한 + - 끈적끈적한 + - 낮선 + - 줄무늬 + - 강한 + - 성공적인 + - 슈퍼 + - 우월한 + - 달콤한 + - 재능 있는 + - 키 큰 + - 맛좋은 + - 임시 + - 긴장한 + - 끔찍한 + - 멋진 + - 시험된 + - 감사하는 + - 두꺼운 + - 얇은 + - 목 마른 + - 사려 깊은 + - 아주 작은 + - 피곤한 + - 까다로운 + - 문제의 + - '진실의' + - 추한 + - 울트라 + - 경솔한 + - 비무장 + - 덮여 있지 않는 + - 건강에 해로운 + - 고유 + - 알 수 없는 + - 부자연스러운 + - 사용되지 않은 + - 특이한 + - 사용된 + - 유용한 + - 쓸모없는 + - 귀중한 + - 폭력적인 + - 기다리는 + - 방랑 + - 따뜻한 + - 약한 + - 부유한 + - 온전한 + - 현명한 + - 경이로운 + - 목재 + - 걱정하는 + - 무가치한 + - 틀린 + - 위협 + - 신뢰 + - 잘난 척 하지 않는 + - 위협 + verbs: + - 참격 + - 절단 + - 난도 + - 스크래칭 + - 살인 + - 토벌 + - 도축 + - 파괴 + - 간지럼 + - 포옹 + - 살해 + - 싸대기 + - 위협 + - 여행용 + - 순간이동 + - 깜박임 + - 파괴 + - 난파 + - 점멸 + - 구체화 + - 생성 + - 질문 + - 문의 + - 답변 + - 요구 + - 심문 + - 의문 + - 돌격 + - 획기적 + - 매복 + - 공격적 + - 돌격 + - 폭풍 + - 폭격기 + - 세례 + - 강타 + - 충전 + - 처벌 + - 전투 + - 구타 + - 망치질 + - 고동 + - 전투 + - 압도 + - 습격 + - 방해 + - 사격 + - 모험 + - 금 + - 파열 + - 박살 + - 산산조각 + - 골절 + - 분열 + - 분쇄 + - 티어링 + - 렌딩 + - 스냅핑 + - 버스트 + - 폭발 + - 손상 + - 조각 + - 분리 + - 요새화 + - 쿡쿡 + - 두드림 + - 밀당 + - 쿵쾅 + - 박치기 + - 달그락 + - 획기적 + - 후려치기 + - 슬래밍 + - 소환 + - 외침 + - 고함 + - 포효 + - 교대 + - 변환 + - 수정 + - 트위스팅 + - 변이 + - 왜곡 + - 흐림 + - 조정 + - 워프 + - 변경 + - 적응 + - 진화 + - 다양함 + - 사냥 + - 추적 + - 추종 + - 스토킹 + - 그림자 + - 집요 + - 새장 + - 탑승 + - 순차 + - 상승 + - 들뜸 + - 도약 + - 정상 + - 채집 + - 울타리 + - 비축 + - 절단 + - 수확 + - 절약 + - 피난처 + - 클로킹 + - 슈라우드 + - 동봉 + - 은폐 + - 은신 + - 위장 + - 복면 + - 매장 + - 질식 + - 구름 + - 방패 + - 음영 + - 봉인 + - 봉투 + - 베일 + - 무명 + - 순회 + - 도섭 + - 글라이딩 + - 하울링 + - 훌쩍거림 + - 외침 + - 비명 + - 큰 소리 + - 포효 + - 통곡 + - 고함 + - 언성 + - 절단 + - 토막 + - 치핑 + - 심각 + - 슬라이싱 + - 저격 + - 분리 + - 도끼질 + - 참격 + - 렌딩 + - 티어링 + - 얇아진 + - 다듬기 + - 조각품 + - 해부 + - 해킹 + - 관통 + - 톱질 + - 면도 + - 양털 깎기 + - 채굴 + - 탐색 + - 발굴 + - 굴착 + - 심층 채굴 + - 울음소리 + - 구멍뚫기 + - 터널링 + - 공습 + - 승선 + - 방랑 + - 잠입 + - 방해 + - 회피 + - 도주 + - 달리기 + - 회피 + - 충돌 + - 전투 + - 몸싸움 + - 레슬링 + - 휙휙 + - 결투 + - 싸움 + - 마상 시합 + - 스파링 + - 격돌 + - 전쟁 + - 그래플링 + - 분해 + - 공격 + - 불화 + - 소규모 전투 + - 탐색 + - 추적 + - 포획 + - 해결 + - 노출 + - 발굴 + - 도약 + - 통통 + - 도약 + - 금고 + - 깡충깡충 + - 급증 + - 도박 + - 가동 + - 드롭킥 + - 감지 + - 인지 + - 추적 + - 희미함 + - 출혈 + - 축소 + - 약화 + - 약화 + - 절감 + - 제련 + - 발행 + - 채집 + - 수집 + - 선택 + - 분쇄 + - 추진 + - 조깅 + - 스프린팅 + - 퀘스트 + - 정찰 + - 탐험 + - 채굴 + - 떨림 + - 덜그럭 + - 이별 + - 해킹 + - 파열 + - 조각품 + - 디바이딩 + - 반감 + - 파괴 + - 선더링 + - 분리 + - 렌딩 + - 리핑 + - 방목 + - 수감 + - 덫 + - 코너링 + - 교란 + - 핀 + - 포획 + - 억제 + - 바인딩 + - 후킹 + - 문제 + - 스내칭 + - 새장 + - 점령 + - 유령 + - 소름 + - 매복 + - 첩보 + - 복수 + - 폭풍 + verb-ers (noun): + - 세계 파괴자 + - 세계 분쇄자 + - 심판자 + - 재를 가져오는 자 + - 윈드시커 + - 디파일러 + - 천둥 분노 + - 슬라이서 + - 칼잡이 + - 절단기 + - 자객 + - 위조자 + - 킬러 + - 학살자 + - 파괴자 + - 포옹자 + - 살인자 + - 슬래퍼 + - 여행자 + - 순간이동자 + - 맹인 + - 파괴자 + - 실현자 + - 생성자 + - 요구자 + - 강습병 + - 스트라이커 + - 매복자 + - 돌격자 + - 급습자 + - 폭격기 + - 포화기 + - 강타자 + - 차저 + - 싸움꾼 + - 망치꾼 + - 몰이꾼 + - 전투가 + - 압도자 + - 약탈자 + - 태클러 + - 사수 + - 투기자 + - 크래커 + - 타격자 + - 분쇄자 + - 골절가 + - 분열자 + - 분쇄자 + - 티어러 + - 렌더러 + - 사진 기자 + - 작약 + - 폭발자 + - 손상자 + - 조각가 + - 스플리터 + - 축성가 + - 주의자 + - 딱따구리 + - 썸퍼 + - 버터 + - 수다쟁이 + - 스트라이커 + - 목장주 + - 교도소 + - 소환사 + - 비명 지르는 자 + - 변화자 + - 변환자 + - 수정자 + - 회오리 + - 블러러 + - 와퍼 + - 변화자 + - 적응자 + - 진화자 + - 사냥꾼 마법 부여 + - 트레일러 + - 추종자 + - 탐식자 + - 그림자 조종사 + - 사냥개 주인 + - 케이서 + - 마운터 + - 승천자 + - 깨어난 자 + - 스프링거 + - 수집가 + - 사신 + - 수확자 + - 절약자 + - 피난자 + - 클로커 + - 슈라우더 + - 동봉자 + - 숨은 자 + - 복면가 + - 부리에르 + - 구름가 + - 셰이더 + - 봉인자 + - 인벨로퍼 + - 경매자 + - 천차대 + - 도섭가 + - 글라이더 + - 우는 자 + - 울고 있는 자 + - 비명 지르는 자 + - 소리 지르는 자 + - 고함 치는 자 + - 스크리처 + - 도축업자 + - 목재파쇄기 + - 저격수 + - 스플리터 + - 도끼 전사 + - 칼잡이 + - 렌더러 + - 티어러 + - 박약자 + - 농부 + - 조각가 + - 해커 + - 꿰뚫는 자 + - 톱꾼 + - 면도가 + - 면도가 + - 광부 + - 발굴자 + - 잠입동물 + - 드릴러 + - 터널러 + - 침입자 + - 하숙인 + - 방랑자 + - 불청객 + - 회피자 + - 러너 + - 닷저 + - 충격자 + - 싸움꾼 + - 레슬러 + - 스커플러 + - 결투사 + - 전투광 + - 충돌자 + - 그래플러 + - 고철상 + - 공격자 + - 봉건자 + - 포획자 + - 해결사 + - 계시자 + - 곡예사 + - 바운서 + - 도약자 + - 호퍼 + - 서저 + - 도박꾼 + - 드롭키커 + - 퍼시버 + - 페이더 + - 블리더 + - 약화자 + - 위조범 + - 발행인 + - 채집가 + - 분쇄기 + - 프로펠러 + - 조거 + - 스프린터 + - 스카우터 + - 탐험가 + - 발굴꾼 + - 트렘블러 + - 동료 + - 해커 + - 조각가 + - 디바이더 + - 할버 + - 브레이커 + - 렌더러 + - 리퍼 + - 방목자 + - 수감자 + - 매점자 + - 피너 + - 포획자 + - 억제자 + - 바인더 + - 스내거 + - 스내쳐 + - 케이저 + - 점령자 + - 유령 + - 크리퍼 + - 첩보원 + - 바인더 + - 교도관 + - 매혹꾼 + - 춤꾼 + - 비방자 + - 식객 + - 코골이 + - 추진기 + - 슬래퍼 +absorption: + name: 흡수 +blindness: + name: 실명 +conduit_power: + name: 전달체의 힘 +confusion: + name: 멀미 +damage_resistance: + name: 저항 +dolphins_grace: + name: 돌고래의 가호 +fast_digging: + name: 성급함 +fire_resistance: + name: 화염 저항 +glowing: + name: 발광 +harm: + name: 즉시 피해 +heal: + name: 즉시 치유 +health_boost: + name: 생명력 강화 +hunger: + name: 허기 +increase_damage: + name: 힘 +invisibility: + name: 투명 +jump: + name: 점프 강화 +levitation: + name: 공중 부양 +luck: + name: Luck +night_vision: + name: 야간 투시 +poison: + name: 독 +regeneration: + name: 재생 +saturation: + name: 포화 +slow: + name: 속도 감소 +slow_digging: + name: 채굴 피로 +slow_falling: + name: 느린 낙하 +speed: + name: 속도 증가 +unluck: + name: 불운 +water_breathing: + name: 수중 호흡 +weakness: + name: 나약함 +wither: + name: 시듦 +translation: + Economy pay message v2: '&2$receiver&e에게 &2$amount_sent $currency_name &2을 지불하고, 세금 제외 $amount_received 을 받았습니다!' + Economy currency left message: '&2$amount_left $currency_name(을)를 소지하고 있습니다.' + Economy money from payment message: '$sender&f에게 &2$amount_received $currency_name&f(을)를 받았습니다.' + Economy payment insuficient currency: '&c그것을 살 만큼 $currency_name(이)가 충분하지 않습니다!' + Wallet command message: '&2$balance $currency_name&f(을)를 소지하고 있습니다.' + Tax confirmation message: '&c송금을 할 때 $percentage%의 세금이 붙을 것입니다. &9$command&a(을)를 입력해서 계속 진행하세요!' + shopBatchSellItem: '&aYou have sold your items &afor $currency_amount $currency_name!' + Shop buy message: '$item_name&a(을)를 $item_value $currency_name&a에 구입했습니다!' + Shop current balance message: '$currency_amount $currency_name(을)를 소지하고 있습니다.' + Shop insufficient funds message: '&c$currency_name(을)를 살 돈이 충분하지 않습니다!' + Shop item cost message: '&c이 아이템의 가격은 $item_value $currency_name 입니다.' + Shop sell message: '$item_name&a(을)를 $currency_amount $currency_name&a에 판매했습니다!' + Shop sale player items warning: '&c다른 사람에게 귀속되었거나 프레스티지 등급이 다른 아이템은 판매할 수 없습니다!' + Shop sale instructions: '&c여기에선 엘리트에게 얻은 아이템만 판매할 수 있습니다!' + Teleport time left: '&7[EM] &a$time&7초 뒤에 텔레포트합니다...' + Teleport cancelled: '&7[EM] &c텔레포트가 중단되었습니다!' + noPendingCommands: '&c현재 보류 중인 명령어는 없습니다!' + trackMessage: Track the $name + chestLowRankMessage: '&7[EM] &cYour guild rank needs to be at least $rank &cin order to open this chest!' + chestCooldownMessage: '&7[EM] &cYou''ve already opened this chest recently! Wait $time!' + insufficientCurrencyForWormholeMessage: '&8[EliteMobs] &cInsufficient currency! You need $amount to use this com.magmaguy.elitemobs.wormhole!' + dismissEMMessage: '&8[EliteMobs] &2/elitemobs &fmenu not working for you? Try &2/elitemobs alt &fto see an alternative version of the menu! &cDon''t want to see this message again? &4/em dismiss' + switchEMStyleMessage: '&8[EliteMobs] &2/elitemobs &fmenu style changed! Check it out!' +EconomySettings: + currencyName: 엘리트 코인 + chatCurrencyShowerMessage: '&7[EM] &a$amount $currency_name&f(을)를 주웠습니다!' + actionbarCurrencyShowerMessage: '&7[EM] &a$amount $currency_name&f(을)를 주웠습니다!' + adventurersGuildNotificationMessages: '&7[EM] 여윳돈이 있으신가요? &a/em&7을 사용해 보세요!' +arrow_damage: + name: 힘 +arrow_fire: + name: 화염 +arrow_infinite: + name: 무한 +arrow_knockback: + name: 밀어내기 +binding_curse: + name: 귀속 저주 +channeling: + name: 집전 +critical_strikes: + name: 치명타 + criticalHitPopup: '&5치명타!' +damage_all: + name: 날카로움 +damage_arthropods: + name: 살충 +damage_undead: + name: 강타 +depth_strider: + name: 물갈퀴 +dig_speed: + name: 효율 +drilling: + name: 심층 채굴 +durability: + name: 내구성 +earthquake: + name: Earthquake + earthquakeActivationMessage: '&8[EliteMobs] &aEarthquake triggered! &c2 min cooldown!' + earthquakeAvailableMessage: '&8[EliteMobs] &2Earthquake cooldown over!' +fire_aspect: + name: 발화 +flamethrower: + name: 화염 방사 +frost_walker: + name: 차가운 걸음 +grappling_hook: + name: Grappling Hook +hunter: + name: 사냥꾼 +ice_breaker: + name: 얼음 분쇄 +impaling: + name: 찌르기 +knockback: + name: 밀치기 +lightning: + name: Lightning +loot_bonus_blocks: + name: 행운 +loot_bonus_mobs: + name: 약탈 +loud_strikes: + name: Loud Strikes +loyalty: + name: 충성 +lure: + name: 미끼 +mending: + name: 수선 +meteor_shower: + name: 유성우 +multishot: + name: 다중 발사 +oxygen: + name: 호흡 +piercing: + name: 관통 +plasma_boots: + name: Plasma Boots +protection_environmental: + name: 보호 +protection_explosions: + name: 폭발로부터 보호 +protection_fall: + name: 가벼운 착지 +protection_fire: + name: 화염으로부터 보호 +protection_projectile: + name: 발사체로부터 보호 +quick_charge: + name: 빠른 장전 +riptide: + name: 급류 +silk_touch: + name: 섬세한 손길 +soulbind: + name: 귀속 + loreStrings: '&f$player&7에게 귀속됨' + hologramString: '$player&f의' +summon_merchant: + name: 상인 소환 + message: Jeeves! +summon_wolf: + name: 늑대 소환 +sweeping_edge: + name: 휩쓸기 +thorns: + name: 가시 +unbind: + name: 귀속 해제 +vanishing_curse: + name: 소실 저주 +water_worker: + name: 친수성 +AntiExploit: + AntiExploit message: '&c[EM AntiExploit] &7근처의 엘리트는 특별 아이템을 주지 않을 것입니다.' +CombatTag: + Combat tag message: '&c[EliteMobs] 전투 태그 활성화됨!' +AdventurersGuild: + adventurersGuildMenuName: '&6&l모험가의 허브' + Prestige 0 rank 0: '&8Commoner - disables elites!' + Prestige 0 rank 0 short placeholder: '&6&l✧&e0' + Prestige 0 rank 1: '&f신참' + Prestige 0 rank 1 short placeholder: '&6&l✧&eⅠ' + Prestige 0 rank 2: '&f초보' + Prestige 0 rank 2 short placeholder: '&6&l✧&eⅠⅠ' + Prestige 0 rank 3: '&f견습생' + Prestige 0 rank 3 short placeholder: '&6&l✧&eⅠⅠⅠ' + Prestige 0 rank 4: '&2모험가' + Prestige 0 rank 4 short placeholder: '&6&l✧&eⅠⅤ' + Prestige 0 rank 5: '&2탐험가' + Prestige 0 rank 5 short placeholder: '&6&l✧&eⅤ' + Prestige 0 rank 6: '&2숙련자' + Prestige 0 rank 6 short placeholder: '&6&l✧&eⅤⅠ' + Prestige 0 rank 7: '&1베테랑' + Prestige 0 rank 7 short placeholder: '&6&l✧&eⅤⅠⅠ' + Prestige 0 rank 8: '&1엘리트' + Prestige 0 rank 8 short placeholder: '&6&l✧&eⅤⅠⅠⅠ' + Prestige 0 rank 9: '&l전문가' + Prestige 0 rank 9 short placeholder: '&6&l✧&eⅠⅩ' + Prestige 0 rank 10: '&5영웅' + Prestige 0 rank 10 short placeholder: '&6&l✧&eⅩ' + Prestige 1 rank 0: '&e프레스티지 1 &8평민' + Prestige 1 rank 0 short placeholder: '&e⚜Ⅰ&6&l✧&e0' + Prestige 1 rank 1: '&e프레스티지 1 &f신참' + Prestige 1 rank 1 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠ' + Prestige 1 rank 2: '&e프레스티지 1 &f초보' + Prestige 1 rank 2 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅠ' + Prestige 1 rank 3: '&e프레스티지 1 &f견습생' + Prestige 1 rank 3 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅠⅠ' + Prestige 1 rank 4: '&e프레스티지 1 &2모험가' + Prestige 1 rank 4 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅤ' + Prestige 1 rank 5: '&e프레스티지 1 &2탐험가' + Prestige 1 rank 5 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤ' + Prestige 1 rank 6: '&e프레스티지 1 &2숙련자' + Prestige 1 rank 6 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠ' + Prestige 1 rank 7: '&e프레스티지 1 &1베테랑' + Prestige 1 rank 7 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠⅠ' + Prestige 1 rank 8: '&e프레스티지 1 &1엘리트' + Prestige 1 rank 8 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠⅠⅠ' + Prestige 1 rank 9: '&e프레스티지 1 &5마스터' + Prestige 1 rank 9 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅩ' + Prestige 1 rank 10 short placeholder: '&e⚜Ⅰ&6&l✧&eⅩ' + Prestige 1 rank 10: '&e프레스티지 1 &5영웅' + Prestige 1 rank 11: '&e프레스티지 1 &5전설' + Prestige 1 rank 11 short placeholder: '&e⚜Ⅰ&6&l✧&eⅩⅠ' + Prestige 2 rank 0: '&2프레스티지 2 &8평민' + Prestige 2 rank 0 short placeholder: '&2⚜ⅠⅠ&6&l✧&e0' + Prestige 2 rank 1: '&2프레스티지 2 &f신참' + Prestige 2 rank 1 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠ' + Prestige 2 rank 2: '&2프레스티지 2 &f초보' + Prestige 2 rank 2 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅠ' + Prestige 2 rank 3: '&2프레스티지 2 &f견습생' + Prestige 2 rank 3 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 2 rank 4: '&2프레스티지 2 &2모험가' + Prestige 2 rank 4 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅤ' + Prestige 2 rank 5: '&2프레스티지 2 &2탐험가' + Prestige 2 rank 5 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤ' + Prestige 2 rank 6: '&2프레스티지 2 &2숙련자' + Prestige 2 rank 6 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠ' + Prestige 2 rank 7: '&2프레스티지 2 &1베테랑' + Prestige 2 rank 7 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 2 rank 8: '&2프레스티지 2 &1엘리트' + Prestige 2 rank 8 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 2 rank 9: '&2프레스티지 2 &5마스터' + Prestige 2 rank 9 short placeholder: '&2프레스티지 2 &5Master' + Prestige 2 rank 10 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩ' + Prestige 2 rank 10: '&2프레스티지 2 &5영웅' + Prestige 2 rank 11: '&2프레스티지 2 &5전설' + Prestige 2 rank 11 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩⅠ' + Prestige 2 rank 12: '&2프레스티지 2 &5신화' + Prestige 2 rank 12 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 3 rank 0: '&a프레스티지 3 &8평민' + Prestige 3 rank 0 short placeholder: '&a프레스티지 3 &8Commoner' + Prestige 3 rank 1: '&a프레스티지 3 &f신참' + Prestige 3 rank 1 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠ' + Prestige 3 rank 2: '&a프레스티지 3 &f초보' + Prestige 3 rank 2 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠ' + Prestige 3 rank 3: '&a프레스티지 3 &f견습생' + Prestige 3 rank 3 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 3 rank 4: '&a프레스티지 3 &2모험가' + Prestige 3 rank 4 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅤ' + Prestige 3 rank 5: '&a프레스티지 3 &2탐험가' + Prestige 3 rank 5 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤ' + Prestige 3 rank 6: '&a프레스티지 3 &2숙련자' + Prestige 3 rank 6 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠ' + Prestige 3 rank 7: '&a프레스티지 3 &1베테랑' + Prestige 3 rank 7 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 3 rank 8: '&a프레스티지 3 &1엘리트' + Prestige 3 rank 8 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 3 rank 9: '&a프레스티지 3 &5마스터' + Prestige 3 rank 9 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅩ' + Prestige 3 rank 10 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩ' + Prestige 3 rank 10: '&a프레스티지 3 &5영웅' + Prestige 3 rank 11: '&a프레스티지 3 &5전설' + Prestige 3 rank 11 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠ' + Prestige 3 rank 12: '&a프레스티지 3 &5신화' + Prestige 3 rank 12 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 3 rank 13: '&a프레스티지 3 &5불멸' + Prestige 3 rank 13 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 4 rank 0: '&3프레스티지 4 &8평민' + Prestige 4 rank 0 short placeholder: '&3⚜ⅠⅤ&6&l✧&e0' + Prestige 4 rank 1: '&3프레스티지 4 &f신참' + Prestige 4 rank 1 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠ' + Prestige 4 rank 2: '&3프레스티지 4 &f초보' + Prestige 4 rank 2 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅠ' + Prestige 4 rank 3: '&3프레스티지 4 &f견습생' + Prestige 4 rank 3 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅠⅠ' + Prestige 4 rank 4: '&3프레스티지 4 &2모험가' + Prestige 4 rank 4 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅤ' + Prestige 4 rank 5: '&3프레스티지 4 &2탐험가' + Prestige 4 rank 5 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤ' + Prestige 4 rank 6: '&3프레스티지 4 &2숙련자' + Prestige 4 rank 6 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠ' + Prestige 4 rank 7: '&3프레스티지 4 &1베테랑' + Prestige 4 rank 7 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠⅠ' + Prestige 4 rank 8: '&3프레스티지 4 &1엘리트' + Prestige 4 rank 8 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠⅠⅠ' + Prestige 4 rank 9: '&3프레스티지 4 &5마스터' + Prestige 4 rank 9 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅩ' + Prestige 4 rank 10 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩ' + Prestige 4 rank 10: '&3프레스티지 4 &5영웅' + Prestige 4 rank 11: '&3프레스티지 4 &5전설' + Prestige 4 rank 11 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠ' + Prestige 4 rank 12: '&3프레스티지 4 &5신화' + Prestige 4 rank 12 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅠ' + Prestige 4 rank 13: '&3프레스티지 4 &5불멸' + Prestige 4 rank 13 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅠⅠ' + Prestige 4 rank 14: '&3프레스티지 4 &5선택받은 자' + Prestige 4 rank 14 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅤ' + Prestige 5 rank 0: '&b프레스티지 5 &8평민' + Prestige 5 rank 0 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 5 rank 1: '&b프레스티지 5 &f신참' + Prestige 5 rank 1 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠ' + Prestige 5 rank 2: '&b프레스티지 5 &f초보' + Prestige 5 rank 2 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅠ' + Prestige 5 rank 3: '&b프레스티지 5 &f견습생' + Prestige 5 rank 3 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅠⅠ' + Prestige 5 rank 4: '&b프레스티지 5 &2모험가' + Prestige 5 rank 4 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅤ' + Prestige 5 rank 5: '&b프레스티지 5 &2탐험가' + Prestige 5 rank 5 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤ' + Prestige 5 rank 6: '&b프레스티지 5 &2숙련자' + Prestige 5 rank 6 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠ' + Prestige 5 rank 7: '&b프레스티지 5 &1베테랑' + Prestige 5 rank 7 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠⅠ' + Prestige 5 rank 8: '&b프레스티지 5 &1엘리트' + Prestige 5 rank 8 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠⅠⅠ' + Prestige 5 rank 9: '&b프레스티지 5 &5마스터' + Prestige 5 rank 9 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅩ' + Prestige 5 rank 10 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩ' + Prestige 5 rank 10: '&b프레스티지 5 &5영웅' + Prestige 5 rank 11: '&b프레스티지 5 &5전설' + Prestige 5 rank 11 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠ' + Prestige 5 rank 12: '&b프레스티지 5 &5신화' + Prestige 5 rank 12 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅠ' + Prestige 5 rank 13: '&b프레스티지 5 &5불멸' + Prestige 5 rank 13 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅠⅠ' + Prestige 5 rank 14: '&b프레스티지 5 &5선택받은 자' + Prestige 5 rank 14 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅤ' + Prestige 5 rank 15: '&b프레스티지 5 &5지배자' + Prestige 5 rank 15 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅤ' + Prestige 6 rank 0: '&4프레스티지 6 &8평민' + Prestige 6 rank 0 short placeholder: '&4⚜ⅤⅠ&6&l✧&e0' + Prestige 6 rank 1: '&4프레스티지 6 &f신참' + Prestige 6 rank 1 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠ' + Prestige 6 rank 2: '&4프레스티지 6 &f초보' + Prestige 6 rank 2 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅠ' + Prestige 6 rank 3: '&4프레스티지 6 &f견습생' + Prestige 6 rank 3 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅠⅠ' + Prestige 6 rank 4: '&4프레스티지 6 &2모험가' + Prestige 6 rank 4 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅤ' + Prestige 6 rank 5: '&4프레스티지 6 &2탐험가' + Prestige 6 rank 5 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤ' + Prestige 6 rank 6: '&4프레스티지 6 &2숙련자' + Prestige 6 rank 6 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠ' + Prestige 6 rank 7: '&4프레스티지 6 &1베테랑' + Prestige 6 rank 7 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠⅠ' + Prestige 6 rank 8: '&4프레스티지 6 &1엘리트' + Prestige 6 rank 8 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 6 rank 9: '&4프레스티지 6 &5마스터' + Prestige 6 rank 9 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅩ' + Prestige 6 rank 10 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩ' + Prestige 6 rank 10: '&4프레스티지 6 &5영웅' + Prestige 6 rank 11: '&4프레스티지 6 &5전설' + Prestige 6 rank 11 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠ' + Prestige 6 rank 12: '&4프레스티지 6 &5신화' + Prestige 6 rank 12 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠ' + Prestige 6 rank 13: '&4프레스티지 6 &5불멸' + Prestige 6 rank 13 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 6 rank 14: '&4프레스티지 6 &5선택받은 자' + Prestige 6 rank 14 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅤ' + Prestige 6 rank 15: '&4프레스티지 6 &5지배자' + Prestige 6 rank 15 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤ' + Prestige 6 rank 16: '&4프레스티지 6 &5거신' + Prestige 6 rank 16 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤⅠ' + Prestige 7 rank 0: '&c프레스티지 7 &8평민' + Prestige 7 rank 0 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&e0' + Prestige 7 rank 1: '&c프레스티지 7 &f신참' + Prestige 7 rank 1 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠ' + Prestige 7 rank 2: '&c프레스티지 7 &f초보' + Prestige 7 rank 2 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅠ' + Prestige 7 rank 3: '&c프레스티지 7 &f견습생' + Prestige 7 rank 3 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 7 rank 4: '&c프레스티지 7 &2모험가' + Prestige 7 rank 4 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅤ' + Prestige 7 rank 5: '&c프레스티지 7 &2탐험가' + Prestige 7 rank 5 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤ' + Prestige 7 rank 6: '&c프레스티지 7 &2숙련자' + Prestige 7 rank 6 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠ' + Prestige 7 rank 7: '&c프레스티지 7 &1베테랑' + Prestige 7 rank 7 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 7 rank 8: '&c프레스티지 7 &1엘리트' + Prestige 7 rank 8 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 7 rank 9: '&c프레스티지 7 &5마스터' + Prestige 7 rank 9 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅩ' + Prestige 7 rank 10 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩ' + Prestige 7 rank 10: '&c프레스티지 7 &5영웅' + Prestige 7 rank 11: '&c프레스티지 7 &5전설' + Prestige 7 rank 11 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠ' + Prestige 7 rank 12: '&c프레스티지 7 &5신화' + Prestige 7 rank 12 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 7 rank 13: '&c프레스티지 7 &5불멸' + Prestige 7 rank 13 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 7 rank 14: '&c프레스티지 7 &5선택받은 자' + Prestige 7 rank 14 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅤ' + Prestige 7 rank 15: '&c프레스티지 7 &5지배자' + Prestige 7 rank 15 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤ' + Prestige 7 rank 16: '&c프레스티지 7 &5거신' + Prestige 7 rank 16 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤⅠ' + Prestige 7 rank 17: '&c프레스티지 7 &5반신' + Prestige 7 rank 17 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤⅠⅠ' + Prestige 8 rank 0: '&9프레스티지 8 &8평민' + Prestige 8 rank 0 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&e0' + Prestige 8 rank 1: '&9프레스티지 8 &f신참' + Prestige 8 rank 1 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠ' + Prestige 8 rank 2: '&9프레스티지 8 &f초보' + Prestige 8 rank 2 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅠ' + Prestige 8 rank 3: '&9프레스티지 8 &f견습생' + Prestige 8 rank 3 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 8 rank 4: '&9프레스티지 8 &2모험가' + Prestige 8 rank 4 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅤ' + Prestige 8 rank 5: '&9프레스티지 8 &2탐험가' + Prestige 8 rank 5 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤ' + Prestige 8 rank 6: '&9프레스티지 8 &2숙련자' + Prestige 8 rank 6 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠ' + Prestige 8 rank 7: '&9프레스티지 8 &1베테랑' + Prestige 8 rank 7 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 8 rank 8: '&9프레스티지 8 &1엘리트' + Prestige 8 rank 8 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 8 rank 9: '&9프레스티지 8 &5마스터' + Prestige 8 rank 9 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅩ' + Prestige 8 rank 10 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩ' + Prestige 8 rank 10: '&9프레스티지 8 &5영웅' + Prestige 8 rank 11: '&9프레스티지 8 &5전설' + Prestige 8 rank 11 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠ' + Prestige 8 rank 12: '&9프레스티지 8 &5신화' + Prestige 8 rank 12 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 8 rank 13: '&9프레스티지 8 &5불멸' + Prestige 8 rank 13 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 8 rank 14: '&9프레스티지 8 &5선택받은 자' + Prestige 8 rank 14 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅤ' + Prestige 8 rank 15: '&9프레스티지 8 &5지배자' + Prestige 8 rank 15 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤ' + Prestige 8 rank 16: '&9프레스티지 8 &5거신' + Prestige 8 rank 16 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠ' + Prestige 8 rank 17: '&9프레스티지 8 &5반신' + Prestige 8 rank 17 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠⅠ' + Prestige 8 rank 18: '&9프레스티지 8 &5신' + Prestige 8 rank 18 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 9 rank 0: '&d프레스티지 9 &8평민' + Prestige 9 rank 0 short placeholder: '&d⚜ⅠⅩ&6&l✧&e0' + Prestige 9 rank 1: '&d프레스티지 9 &f신참' + Prestige 9 rank 1 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠ' + Prestige 9 rank 2: '&d프레스티지 9 &f초보' + Prestige 9 rank 2 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅠ' + Prestige 9 rank 3: '&d프레스티지 9 &f견습생' + Prestige 9 rank 3 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅠⅠ' + Prestige 9 rank 4: '&d프레스티지 9 &2모험가' + Prestige 9 rank 4 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅤ' + Prestige 9 rank 5: '&d프레스티지 9 &2탐험가' + Prestige 9 rank 5 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤ' + Prestige 9 rank 6: '&d프레스티지 9 &2숙련자' + Prestige 9 rank 6 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠ' + Prestige 9 rank 7: '&d프레스티지 9 &1베테랑' + Prestige 9 rank 7 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠⅠ' + Prestige 9 rank 8: '&d프레스티지 9 &1엘리트' + Prestige 9 rank 8 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠⅠⅠ' + Prestige 9 rank 9: '&d프레스티지 9 &5마스터' + Prestige 9 rank 9 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅩ' + Prestige 9 rank 10 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩ' + Prestige 9 rank 10: '&d프레스티지 9 &5영웅' + Prestige 9 rank 11: '&d프레스티지 9 &5전설' + Prestige 9 rank 11 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠ' + Prestige 9 rank 12: '&d프레스티지 9 &5신화' + Prestige 9 rank 12 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅠ' + Prestige 9 rank 13: '&d프레스티지 9 &5불멸' + Prestige 9 rank 13 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅠⅠ' + Prestige 9 rank 14: '&d프레스티지 9 &5선택받은 자' + Prestige 9 rank 14 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅤ' + Prestige 9 rank 15: '&d프레스티지 9 &5지배자' + Prestige 9 rank 15 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤ' + Prestige 9 rank 16: '&d프레스티지 9 &5거신' + Prestige 9 rank 16 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠ' + Prestige 9 rank 17: '&d프레스티지 9 &5반신' + Prestige 9 rank 17 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠⅠ' + Prestige 9 rank 18: '&d프레스티지 9 &5신' + Prestige 9 rank 18 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 9 rank 19: '&d프레스티지 9 &5신 학살자' + Prestige 9 rank 19 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅩ' + Prestige 10 rank 0: '&5프레스티지 10 &8평민' + Prestige 10 rank 0 short placeholder: '&5⚜Ⅹ&6&l✧&e0' + Prestige 10 rank 1: '&5프레스티지 10 &f신참' + Prestige 10 rank 1 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠ' + Prestige 10 rank 2: '&5프레스티지 10 &f초보' + Prestige 10 rank 2 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠ' + Prestige 10 rank 3: '&5프레스티지 10 &f견습생' + Prestige 10 rank 3 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠⅠ' + Prestige 10 rank 4: '&5프레스티지 10 &2모험가' + Prestige 10 rank 4 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅤ' + Prestige 10 rank 5: '&5프레스티지 10 &2탐험가' + Prestige 10 rank 5 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤ' + Prestige 10 rank 6: '&5프레스티지 10 &2숙련자' + Prestige 10 rank 6 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠ' + Prestige 10 rank 7: '&5프레스티지 10 &1베테랑' + Prestige 10 rank 7 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠ' + Prestige 10 rank 8: '&5프레스티지 10 &1엘리트' + Prestige 10 rank 8 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠⅠ' + Prestige 10 rank 9: '&5프레스티지 10 &5마스터' + Prestige 10 rank 9 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅩ' + Prestige 10 rank 10 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩ' + Prestige 10 rank 10: '&5프레스티지 10 &5영웅' + Prestige 10 rank 11: '&5프레스티지 10 &5전설' + Prestige 10 rank 11 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠ' + Prestige 10 rank 12: '&5프레스티지 10 &5신화' + Prestige 10 rank 12 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅠ' + Prestige 10 rank 13: '&5프레스티지 10 &5불멸' + Prestige 10 rank 13 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅠⅠ' + Prestige 10 rank 14: '&5프레스티지 10 &5선택받은 자' + Prestige 10 rank 14 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅤ' + Prestige 10 rank 15: '&5프레스티지 10 &5지배자' + Prestige 10 rank 15 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤ' + Prestige 10 rank 16: '&5프레스티지 10 &5거신' + Prestige 10 rank 16 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠ' + Prestige 10 rank 17: '&5프레스티지 10 &5반신' + Prestige 10 rank 17 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠⅠ' + Prestige 10 rank 18: '&5프레스티지 10 &5신' + Prestige 10 rank 18 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 10 rank 19: '&5프레스티지 10 &5유일신' + Prestige 10 rank 19 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅩ' + Prestige 10 rank 20: '&5프레스티지 10 &5신 학살자' + Prestige 10 rank 20 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅩ' + lootLimiterMessage: '&7[EM] &c더 나은 아이템을 얻으려면 /ag를 통해 다음 길드 랭크를 잠금 해제해야합니다.' + prestigeUnlockMessageTitle: '$player' + prestigeUnlockMessageSubtitle: '&2has unlocked $tier&2!' +buy_or_sell_menu: + Shop name: '[EM] 구입/판매' +custom_quest_screen: + headerTextLines2: | + &a&l『&c&l$questName&a&l』 + acceptTextLines: '&a&l[Accept!]' + acceptHoverLines: "&aClick to \n&aaccept quest!" + acceptedTextLines: '&2&lAccepted! &aTurn in with $npcName &4[Abandon]' + acceptedHoverLines: '&aClick to abandon quest!' + trackTextLines: '&2&l[Track]' + trackHoverLines: '&aClick to track quest!' + untrackTextLines: '&4&l[Untrack]' + untrackHoverLines: '&cClick to untrack quest!' + completedTextLines: '&2&l[Turn in!]' + completedHoverLines: '&aClick to turn quest in!' + turnedInTextLines: '&8[Completed!]' + turnedInHoverLines: '&8Already turned in!' + objectivesLine: '&c&lObjectives:' + killQuestDefaultSummaryLine: '&c➤Kill $name:$color$current&0/$color$target' + fetchQuestDefaultSummaryLine: '&c➤Get $name:$color&$current&0/$color$target' + dialogQuestDefaultSummaryLine: '&c➤Go talk to $name $location' + rewardsLine: '&2&lRewards:' + rewardsDefaultSummaryLine: '&2➤$amountx $rewardName &8($chance%)' +custom_shop_menu: + Shop name: '[EM] Custom Shop' + Full inventory message: '[EliteMobs] &4인벤토리가 가득 차 구매할 수 없습니다.' +dynamic_quest_screen: + questName: '$name(을)를 $amount번 사냥' + headerTextLines2: |- + &c&lGuild request! + &0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ + defaultLoreTextLines: '&8Slay $amount $name!' + acceptTextLines: '&a&lAccept!' + acceptHoverLines: "&aClick to \n&aaccept quest!" + acceptedTextLines: '&2&lAccepted! &4[Abandon]' + acceptedHoverLines: '&aClick to abandon quest!' + completedTextLines: '&2&l[Turn in!]' + completedHoverLines: '&aClick to turn quest in!' + turnedInTextLines: '&8[Completed!]' + turnedInHoverLines: '&8Already turned in!' + objectivesLine: '&c&lObjectives:' + killQuestDefaultSummaryLine: '&c➤Kill $name:$color$current&0/$color$target' + rewardsLine: '&2&lRewards:' + rewardsDefaultSummaryLine: '&2➤$amountx $rewardName &8($chance%)' +enhancement_menu: + shopName: '[EM] 강화 메뉴!' +get_loot_menu: + Menu name: '[EM] 전리품 메뉴' + tierTranslation: Level + itemFilterTranslation: Filter by items of this level. +guild_rank_selector_menu: + questTierSelectorMenuTitle: '[EM] 길드 등급 선택' + lowTierWarning: '&c엘리트가 좋은 전리품을 주지 않습니다!' + normalTierWarning: '&c엘리트가 더 좋은 전리품을 줍니다!' + notEnoughCurrencyMessages: '&7[EliteMobs] &4엘리트 코인이 ($neededAmount $currencyName) 부족합니다! [/em shop]을 입력해 엘리트 몬스터의 전리품을 판매해 보세요! 당신은 지금 $currentAmount $currencyName(을)를 소지하고 있습니다.' + unlockMessages: "&7[EliteMobs] &a$rankName &arank(을)를 $price\\ \\ $currencyName에 잠금 해제하였습니다. &6즐거운 사냥 되세요!" + questCompleteBroadcastMessages: '&7[EliteMobs] &a$player&a님의 길드 등급이 $rankName&a에 도달하였습니다!' + failedMessages: '&7[EliteMobs] &c먼저 다른 등급을 잠금 해제하세요!' + spawnRateModifierMessages: '&f엘리트 몬스터의 스폰률 변경: &c$modifier%' + lootModifierMessages: '&f엘리트 몬스터의 전리품 흭득률 변경: &a$modifier%' + difficultyModifierMessages: '&f엘리트 몬스터의 난이도 변경: &c$modifier%' + lootTierMessages: '&2엘리트에게 레벨 $tier까지의 전리품을 얻을 수 있습니다!' + currencyBonusMessages: '&a$amountx coins from drops and quests!' + healthBonusMessages: '&c최대 체력이 $amount ❤ 상승합니다!' + critBonusMessages: '&e치명타 확률이 $amount% 상승합니다!' + dodgeBonusMessages: '&8회피 확률이 $amount% 상승합니다!' +player_status_screen: + indexTexts0: '&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + indexTexts1: '&5&l/ag &7- &6모험가의 허브' + indexHovers1: |- + 클릭하여 사용 + 퀘스트를 주거나, + 물건을 구입/판매하고, + 여러가지 조언을 주는 + NPC들이 모인 장소입니다. + indexTexts2: '&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + indexTexts4: '&6&l목차' + indexTexts6: '&bp. $statsPage &8- &6스테이터스' + indexHovers6: 클릭하여 이동! + indexTexts7: '&bp. $gearPage &8- &6장비' + indexHovers7: 클릭하여 이동! + indexTexts8: '&bp. $teleportsPage &8- &6텔레포트' + indexHovers8: 클릭하여 이동! + indexTexts9: '&bp. $commandsPage &8- &6명령어' + indexHovers9: 클릭하여 이동! + indexTexts10: '&bp. $questsPage &8- &6퀘스트 추적' + indexHovers10: 클릭하여 이동! + indexTexts11: '&bp. $bossTrackingPage &8- &6보스 추적' + indexHovers11: 클릭하여 이동! + statsText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + statsText1: '&5&l플레이어 스테이터스:' + statsText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + statsText4: '&2소지금: &a$money' + statsHover4: |- + Kill Elite Mobs to loot currency or + sell their drops in /em shop or + complete quests! + statsText6: '&6길드 등급: &3$guildtier' + statsHover6: |- + 프레스티지 등급과 길드 등급: + 길드 등급은 전리품이 얼마나 좋을지를 결정하며, 프레스티지 등급에서 보너스를 받을 수 있습니다. 프레스티지 등급은 최대 체력 증가, 회피/치명타율, 코인 흭득 증가 등과 같은 엄청난 보상을 제공합니다! 길드 등급 및 프레스티지 등급은 /ag에서 잠금 해제할 수 있습니다! + ⚜ = 프레스티지 등급, ✧ = 길드 등급! + statsText7: '&4사냥한 엘리트: &c$kills' + statsHover7: 엘리트를 사냥한 횟수입니다. + statsText8: '&4사냥한 최대 레벨: &c$highestkill' + statsHover8: |- + 사냥했던 엘리트 몬스터의 가장 높은 레벨입니다. + 엘리트 몬스터 레벨은 당신의 등급과 장비를 기반으로 합니다! + 더 높은 등급을 달성하여 더 높은 레벨의 몬스터를 사냥해 보세요! + 추신: 꼼수를 이용한 사냥은 인정되지 않습니다! + statsText9: '&4죽은 횟수: &c$deaths' + statsHover9: 엘리트 몬스터에게 죽은 횟수입니다. + statsText10: '&5퀘스트 완료: &d$quests' + statsHover10: |- + Amount of EliteMobs quests completed. + You can accept quests by talking to NPCs! + statsText12: '&b점수: &3$score' + statsHover12: |- + 당신의 EliteMobs 점수입니다. + 엘리트 몬스터를 사냥할 때 올라가며, + 엘리트 몬스터에게 죽었을 때 내려갑니다. + 높은 레벨의 엘리트 몬스터는 더 높은 점수를 줍니다. + gearText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + gearText1: '&7&l장비 & 무기:' + gearText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + gearText3: '&8&l장비 등급:' + gearText4: ' ☠ - $helmettier' + gearHover4: '$helmet' + gearText5: ' ▼ - $chestplatetier' + gearHover5: '$chestplate' + gearText6: ' Π - $leggingstier' + gearHover6: '$leggings' + gearText7: ' ╯╰ - $bootstier' + gearHover7: '$boots' + gearText8: '{⚔ - $mainhandtier} {⛨ - $offhandtier}' + gearHover8: '{$mainhand}{$offhand}' + gearText10: '{공격력: $damage} {방어력: $armor}' + gearHover10: '{엘리트 몬스터에게 가하는 기본 피해량}{엘리트 몬스터에게서 절감되는 피해량}' + gearText11: '위협 레벨: $threat' + gearHover11: | + 이 레벨이 당신 주변에 스폰되는 + 엘리트 몬스터의 레벨을 결정합니다. + 현재 장비, 손에 든 무기, + 길드 등급으로 책정합니다. + teleportText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + teleportText1: '&2&l텔레포트' + teleportText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + teleportText3: 스폰 + teleportHover3: 스폰 장소로 텔레포트합니다! + teleportText4: '&6&l모험가의 허브' + teleportHover4: 모험가의 길드 허브로 텔레포트합니다! + onTeleportsHover: 클릭하여 텔레포트! + commandsText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + commandsText1: '&3&l명령어:' + commandsText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + commandsText4: '&5/ag' + commandsHover4: |- + 클릭하여 사용 + 퀘스트를 주거나, + 물건을 구입/판매하고, + 여러가지 조언을 주는 + NPC들이 모인 장소입니다. + commandsText6: '&5/shareitem' + commandsHover6: |- + 클릭하여 사용 + 현재 손에 들고있는 아이템을 + 채팅으로 공유할 수 있습니다! + questTrackerText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + questTrackerText1: '&6&l퀘스트:' + questTrackerHover1: Talk to NPCs to accept quests! + questTrackerText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + onQuestTrackHover: 클릭하여 파기! + bossTrackerText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + bossTrackerText1: '&4&l보스 추적:' + bossTrackerHover1: 보스가 이곳에 표시됩니다! + bossTrackerText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + onBossTrackHover: 클릭하여 추적 활성화/비활성화! + teleportChestMenuName: '&2EliteMobs Teleports' + bossTrackerChestMenuName: '&2EliteMobs Boss Tracking' + indexChestMenuName: '&2EliteMobs Index' + gearChestMenuName: '&2EliteMobs Gear' + statsChestMenuName: '&2EliteMobs Stats' + commandsChestMenuName: '&2EliteMobs Commands' +procedural_shop_menu: + Shop name: '[EM] 아이템 상점' + Full inventory message: '&7[EliteMobs] &4인벤토리가 가득 차 구매할 수 없습니다!' +quest_menu: + menuName: '[EM] 퀘스트 선택' + cancelQuestMessage1: '&c&l&m&o---------------------------------------------&c한 번에 한 가지 퀘스트만 가질 수 있씁니다! 진행중인 퀘스트를 취소하면 진행도를 모두 잃습니다!' + cancelQuestMessage2: '&2[클릭하여 현재 퀘스트 취소]' + cancelQuestMessage3: '&7현재 퀘스트 상태를 &a/em quest status&7로 확인할 수 있습니다.&c&l&m&o---------------------------------------------' + questCancelMessage: '&7[EliteMobs] &c진행중인 퀘스트가 취소되었습니다!' + questStartTitle: 퀘스트를 수락하였습니다! + questStartSubtitle: '$objectiveName(을)를 $objectiveAmount번 사냥' + questCompleteTitle: 퀘스트 완료! + questCompleteSubtitle: '$objectiveName(을)를 $objectiveAmount번 사냥했습니다.' + bossBarObjective: '$objectiveName(을)를 $objectiveAmount번 사냥' + questRewardMessage: '&7[EM] &a퀘스트 완료! &6보상으로 &2$reward $currencyName&6(을)를 받았습니다.' + questCompleteBroadcastMessage: '&7[EM] $player&2님이 $rank &2퀘스트를 완료했습니다!' + questStartBroadcastMessage: '&7[EM] $player&2님이 $rank &2퀘스트를 수락했습니다!' + questStatusMessage: '&7[EM] &a$objectiveName(을)를 &a$currentAmount &f/ &c$objectiveAmount &a만큼 사냥하였습니다.' +refiner_menu: + shopName: '[EM] Place 10 scrap!' +repair_menu: + shopName: '[EM] Repair menu!' +scrapper_menu: + shopName: '[EM] Scrapper' +sell_menu: + shopName: '[EM] 판매 상점' +smelt_menu: + shopName: '[EM] Place 25 scrap!' +unbind_menu: + shopName: '[EM] Unbind menu!' +taunt: + onDamaged: + - Ow! + - Oi! + - Stop that! + - Why?! + - You fight like a Dairy Farmer! + - You are a pain in the backside! + - En garde! Touche! + - Hacks! + - My health is bugged, unkillable! + - Your hits only make me stronger! + - Sticks and stones... + - '''tis but a flesh wound!' + - Emperor protects! + - Herobrine, aid me! + - Behind you! A creeper! + - I have made a terrible mistake. + - What doesn't kill me... + - Zombies dig scars + - I shall show you my true power! + - Prepare for my ultimate attack! + - My reinforcements are arriving! + - You're going to pay for that! + - That's going to leave a mark! + - An eye for an eye! + - Health insurance will cover that + - I felt that one in my bones + - '''tis but a scratch' + - What was that? A soft breeze? + - You'll never defeat me like that + - 한심한. + - 약한. + - That didn't even dent my armor! + - This is going to be an easy one + - My grandchildren will feel that + - Are you even trying? + - An admin just fully healed me + - Haxxor! + - Me? Damaged? Hacks! + - I can't be defeated! + - Good thing I'm using hacks! + - Watch out! Herobrine behind you! + - My life for Aiur! + - Your home is getting griefed! + - Why can't we be friends? + - Valhalla! + - Notch save me! + - No retreat! + - Hit me with your best shot! + onDamagedByBow: + - Fight me like a Player! + - Afraid to come up-close? + - I can smell your fear from here! + - Did you forget your sword? + - Coward! Bow are no fair! + - Bows? That's so 2011... + - Bows are for the weak of mind! + - Bows are for the weak of spirit! + - Bows are for the weak of heart! + - I thought we agreed no bows! + - Bows? You'll regret that + - Ow! + - Oi! + - Stop that! + - Why?! + - You fight like a Dairy Farmer! + - You are a pain in the backside! + - En garde! Touche! + - Hacks! + - My health is bugged, unkillable! + - Your hits only make me stronger! + - Sticks and stones... + - '''tis but a flesh wound!' + - Emperor protects! + - Herobrine, aid me! + - Behind you! A creeper! + - I have made a terrible mistake. + - What doesn't kill me... + - Zombies dig scars + - I shall show you my true power! + - Prepare for my ultimate attack! + - My reinforcements are arriving! + - You're going to pay for that! + - That's going to leave a mark! + - An eye for an eye! + - Health insurance will cover that + - I felt that one in my bones + - '''tis but a scratch' + - What was that? A soft breeze? + - You'll never defeat me like that + - 한심한. + - 약한. + - That didn't even dent my armor! + - This is going to be an easy one + - My grandchildren will feel that + - Are you even trying? + - An admin just fully healed me + - Haxxor! + - Me? Damaged? Hacks! + - I can't be defeated! + - Good thing I'm using hacks! + - Watch out! Herobrine behind you! + - My life for Aiur! + - Your home is getting griefed! + - Why can't we be friends? + - Valhalla! + - Notch save me! + - No retreat! + - Hit me with your best shot! + onDamage: + - A solid hit! + - He shoots, and he scores! + - You'll feel that in the morning! + - Victory approaches! + - Victory shall be mine! + - That was only half of my power! + - You came to the wrong hood! + - You messed with the wrong mob! + - Get ready to get mobbed on! + - This was your last mistake! + - Feel the burn! + - John Cena + - How are you still standing? + - Just give up already! + - Give up! + - I have the high ground! + - I will end you! + - Hope you came prepared for pain! + - The hunter becomes the hunted! + - Blood for the blood throne! + - Skulls for the skull throne! + - A good player is a dead player! + - Git gud! + - Praise the Sun! + - The end draws near! + - You are not prepared. + - Zug zug! + - Hardly worth my time! + - I thought this was a challenge? + - 'Pro tip: don''t get hit' + - Ima firin mah lazer bwooooooooo + - For the Emperor! + - Herobrine shall be pleased! + - This is the end for you! + - Are you even trying? + - Weakling! + - 한심한. + - Maybe this will wake you up. + - This is just the beggining! + - We're just getting started! + - That was just a warm-up! + - You are no match for me! + - RKO out of nowhere! + - I can do this all night long! + - A fine punching bag! + - I am the night! + - I wonder what will break first + - Revenge for Steve! You monster! + - Join the mob side! + - Too easy, too easy! + - Too easy! + - You can't defeat me! + - Pikachuuuuuu + - Avada kedavra! + - Crucio! + - Jierda! + - A critical hit! + - This is what skills looks like! + - 9001 damage! + - Still standing? + - Face your defeat! + - A taste of pain to come! + - I'll make you endangered! + onDeath: + - Alas, poor Yorick! + - The rest is silence + - I shall return + - Unforgivable + - I live, I die, I live again! + - WITNESS ME + - I ride to valhalla! + - VALHALLA! + - VALHALLA! DELIVERANCE + - You win, this time + - A blight upon your land! + - A pox upon thee! + - You'll join me soon enough! + - This is not over + - Death is but a setback + - Not like this... + - I just wanted to go into space + - We could've been friends + - Your sins crawling on your back + - See you in a bit + - See you later + - I'll be waiting for you + - I will be avenged! + - I won't go gently into the night + - Should've gotten life insurance + - It was my last day on the job + - It was my last day here + - Et tu, Brute? + - RIP + - x.x + - (x.x) + - xox + - Fainted + - GG, WP + - GG + - WP + - GG no RE + - HAX + - 해커 + - Not fair I was lagging + - You win, this time + - You monster... + - Mediocre... + onTarget: + - OI! Get over here! + - What's that I see? A coward? + - Sir, prepare your fisticuffs! + - Let's settle this like cavemen! + - En garde! + - Look out! A creeper, behind you! + - Aren't you a right ugly mug! + - You look delicious. + - Prepare for trouble! + - Let the best click spammer win! + - SPARTAAAAAA + - I am actually level 9001 + - Not an Elite Mob + - Poorly disguised Elite Mob + - Ah, fresh prey! + - The hunter becomes the hunted! + - Killing me crashes the server + - I'm actually a disguised player! + - I'm not going to drop any loot! + - Why can't we be friends? + - Sssssss + - This is my last day on the job! + - Stop right there criminal scum! + - Prepare to die! + - Praise the Sun! + - Git gud + - Alea jacta est! + - Facta, non verba! + - Skulls for the skull throne! + - Blood for the blood throne! + - A sacrifice for Herobrine! + - I shall pierce the heavens! + - Just who do you think I am!? + - A weakling! He's mine. + - Dibs on the weakling! + - Accio player! + - A duel to the death! + - I challenge you to a duel! + - Pika pika! + - Did you just call me an infernal + - What did you just call me? + - I know what you did you monster! + - This is how your story ends! + - Prepare for trouble! + - I've been preparing for this! + - I am prepared. Are you? + - A worthy foe! + - A worthy opponent! + - A newbie! It's my lucky day! + - Your stuff or your life! + - This is a robbery! + - It's you! You monster! + - So hungry, give me your flesh! + - There he is! + - Must've been my imagination + - Hi I'm Mr Meeseeks! + - I'm Mr Meeseeks, look at me! + - Your diamonds or your life! + - For king and country! + - Hit me with your best shot! + - Witness me! + - Witness me blood bag! + - I go all shiny and chrome! +zombie_friends: + friend1Name: 'BFF #1' + friend2Name: 'BFF #2' + friendDeathMessage: + - Noooo! + - Mediocre! + - Zacharias! + - He's deader than before! + - Vengeance! + - Revenge! + - I can't believe you've done this. + originalEntityDialog: + - Let's play ZombieCraft later! + - Feel the power of friendship! + - El pueblo, unido! + - I called my friends over! + - BFF power! + - One for all! + - Get him! + - Screw you guys, I'm going home! + reinforcementDialog: + - Don't mess with our friends! + - We got your back Zach! + - Backup has arrived! + - One for all, one for all! + - This is going to be easy! + - Give up we have the high ground! + - You wanna go bruv? + - Worldstaaaaaaaaar! + - What are you doing to our friend + - Feel the power of friendship! + - Friendship power at 100%! + - Zombies, assemble! + - We got your back mate! + - Together we are better! + - The more the merrier! + - I got you fam! + - All for one! +zombie_necronomicon: + summoningChant: Nor is it to be thought...that man is either the oldest or the last of earth's masters, or that the common bulk of life and substance walks alone. The Old Ones were, the Old Ones are, and the Old Ones shall be. Not in the spaces we know, but between them, they walk serene and primal, undimensioned and to us unseen. Yog-Sothoth knows the gate. Yog-Sothoth is the gate. Yog-Sothoth is the key and guardian of the gate. Past, present, future, all are one in Yog-Sothoth. He knows where the Old Ones broke through of old, and where They shall break through again. He knows where They had trod earth's fields, and where They still tread them, and why no one can behold Them as They tread. By Their smell can men sometimes know Them near, but of Their semblance can no man know, saving only in the features of those They have begotten on mankind; and of those are there many sorts, differing in likeness from man's truest eidolon to that shape without sight or substance which is Them. They walk unseen and foul in lonely places where the Words have been spoken and the Rites howled through at their Seasons. The wind gibbers with Their voices, and the earth mutters with Their consciousness. They bend the forest and crush the city, yet may not forest or city behold the hand that smites. Kadath in the cold waste hath known Them, and what man knows Kadath? The ice desert of the South and the sunken isles of Ocean hold stones whereon Their seal is engraver, but who hath seen the deep frozen city or the sealed tower long garlanded with seaweed and barnacles? Great Cthulhu is Their cousin, yet can he spy Them only dimly. Iä! Shub-Niggurath! As a foulness shall ye know Them. Their hand is at your throats, yet ye see Them not; and Their habitation is even one with your guarded threshold. Yog-Sothoth is the key to the gate, whereby the spheres meet. Man rules now where They ruled once; They shall soon rule where man rules now. After summer is winter, after winter summer. They wait patient and potent, for here shall They reign again. +zombie_parents: + deathMessage: + - You monster! + - My baby! + - What have you done!? + - Revenge! + - Nooooo! + - You will pay for that! + - Eh, he was adopted + - He's dead! Again! + - He's deader than before! + - You broke him! + bossEntityDialog: + - You're embarrassing me! + - He's bullying me! + - He's the one picking on me! + - I can deal with this alone! + - Leave me alone, I got this! + - Stop following me around! + - God this is so embarrassing! + - He took my lunch money! + - He's bullying me! + zombieDad: + - Get away from my son! + - Stand up for yourself son! + - I'll deal with him! + - Stop picking on my son! + - Why are you doing this? + - I'll talk to your parents! + - You go kiddo! + - Show him who's boss kiddo! + - Nice punch kiddo! + zombieMom: + - Hands off my child! + - Are you hurt sweetie? + - Did he hurt you sweetie? + - Let me see that booboo sweetie + - I'll talk to his parents! + - You forgot your jacket sweetie! + - Posture, sweetheart + - Break it up! + - Stop this! + - Did you take out the garbage? +elite_blaze: + name: '&fLvl &2$level &f엘리트 &e블레이즈' + deathMessages: + - '$player&c님이 $entity&c에게 불타 죽었습니다!' +elite_cave_spider: + name: '&fLvl &2$level &f엘리트 &3동굴 거미' + deathMessages: + - '$player&c님이 $entity&c의 거미줄에 꽁꽁 묶였습니다!' +elite_creeper: + name: '&fLvl &2$level &f엘리트 &2크리퍼' + deathMessages: + - '$player&c님이 $entity&c에게 폭파당했습니다!' + - '$player&c: $entity&c? 오우 맨!' +elite_drowned: + name: '&fLvl &2$level &f엘리트 &3드라운드' + deathMessages: + - '$player&c님이 $entity&c에게 심해로 끌려갔습니다!' + - '$player&c님이 $entity&c에게 익사당했습니다!' +elite_elder_guardian: + name: '&fLvl &2$level &fElite &3Elder Guardian' + deathMessages: + - '$entity &cprevented $player &cfrom exploring the depths!' +elite_guardian: + name: '&fLvl &2$level &fElite &3Guardian' + deathMessages: + - '$entity &cprevented $player &cfrom exploring the depths!' +elite_enderman: + name: '&fLvl &2$level &fElite &5Enderman' + deathMessages: + - '$entity &csent $player &cinto the void!' + - '$player &clooked at $entity &cwrong!' + - '$player &cand $entity &cbecame best friends!' +elitemob_endermite: + name: '&fLvl &2$level &fElite &7Endermite' + deathMessages: + - '$entity &cis to $player &cwhat David is to Goliath!' +elite_evoker: + name: '&fLvl &2$level &fElite &5Evoker' + deathMessages: + - '$player &cwas enchanted by $entity&c!' +elite_husk: + name: '&fLvl &2$level &fElite &7Husk' + deathMessages: + - '$player &cwas hollowed out by $entity&c!' +elite_illusioner: + name: '&fLvl &2$level &fElite &8Illusioner' + deathMessages: + - '$player&c fell for $entity''s &cillusions!' +elite_iron_golem: + name: '&fLvl &2$level &fElite &fIron Golem' + deathMessages: + - '$player &cmessed with the wrong $entity&c!' + - '$player &chas been taught the way of fist by $entity&c!' +elite_phantom: + name: '&fLvl &2$level &fElite &9Phantom' + deathMessages: + - '$player &cjust had a bad nightmare about $entity&c!' + - '$player &cwill be having nightmares about $entity&c!' + - '$entity &chas taught $player &cthe value of sleep!' +elite_pillager: + name: '&fLvl &2$level &fElite &8Pillager' + deathMessages: + - '$entity &cplundered $player&c!' + - '$entity &cpillaged $player&c!' +elite_polar_bear: + name: '&fLvl &2$level &fElite &fPolar Bear' + deathMessages: + - '$player &cwas clawed to death by $entity&c!' + - '$player &cwas mauled to death by $entity&c!' +elite_ravager: + name: '&fLvl &2$level &fElite &6Ravager' + deathMessages: + - '$entity &cshowed $player &cwho''s in charge!' +elite_silverfish: + name: '&fLvl &2$level &fElite &7Silverfish' + deathMessages: + - '$player &cmistook $entity &cfor a stone block!' +elite_skeleton: + name: '&fLvl &2$level &fElite &fSkeleton' + deathMessages: + - '$player &cbecame $entity''s &cpin cushion!' + - '$entity &cwanted to see $player''s &cbones!' +elite_spider: + name: '&fLvl &2$level &fElite &7Spider' + deathMessages: + - '$player&c님이 $entity&c의 거미줄에 꽁꽁 묶였습니다!' + - '$entity &chas devoured $player&c!' +elite_stray: + name: '&fLvl &2$level &fElite &bStray' + deathMessages: + - '$player &cwas led astray by $entity&c!' +elite_vex: + name: '&fLvl &2$level &fElite &bVex' + deathMessages: + - '$entity &chas vexed $player&c!' +elite_vindicator: + name: '&fLvl &2$level &fElite &8Vindicator' + deathMessages: + - '$entity &cvindicated his fighting skills over $player&c!' +elite_witch: + name: '&fLvl &2$level &fElite &5Witch' + deathMessages: + - '$player &cbecame $entity''s &ctest subject!' + - '$player &chas been bewitched by $entity&c!' +elite_wither_skeleton: + name: '&fLvl &2$level &fElite &8Wither Skeleton' + deathMessages: + - '$entity''s &carrows withered away $player&c!' + - '$entity''s &chas withered $player &caway!' +elite_zombie: + name: '&fLvl &2$level &fElite &2Zombie' + deathMessages: + - '$player &cwas devoured by $entity&c!' + - '$entity &cgot to $player''s &cbrains!' +elite_ghast: + name: '&fLvl &2$level &fElite &fGhast' + deathMessages: + - '$player &cdidn''t dodge $entity&c &cfireballs!' + - '$player &cwas blown to bits $entity&c!' + - '$entity &cgot $player''s &cbacon!' +elite_wolf: + name: '[$level] Elite Wolf' + deathMessages: + - '$entity tore $player apart!' + - '$player was torn to shreds by $entity!' +elite_ender_dragon: + name: '&fLvl &2$level &fElite &5Ender Dragon' + deathMessages: + - '$entity &chas ended $player!' +elite_shulker: + name: '&fLvl &2$level &fElite &5Shulker' + deathMessages: + - '$entity &cshowed $player &cnew heights!' +super_chicken: + name: '&2Super Chicken' +super_cow: + name: '&2Super Cow' +super_mushroom_cow: + name: '&2Super Mooshroom Cow' +super_pig: + name: '&dSuper Pig' +super_sheep: + name: Super Sheep +elite_killer_bunny: + name: '&fLvl &2$level &fElite &cKiller Rabbit' + deathMessages: + - '$entity &cmade $player &cgo live in a farm upstate!' + - '$entity &ceducated $player using a stick and not a carrot!' +elite_llama: + name: '&fLvl &2$level &fElite &5Llama' + deathMessages: + - '$player &cwas spit on by $entity&c!' + - '$player &cwas made $entity&c angry!' +elite_warden: + name: '&fLvl &2$level &fElite &3Warden' + deathMessages: + - '$entity &csensed $player &cwas nearby!' +elite_goat: + name: '&fLvl &2$level &fElite &5Goat' + deathMessages: + - '$player &cwas rammed by $entity&c!' + - '$player &cwas run over by $entity&c!' + - '$player &cwas trampled by $entity&c!' + - '$player &cgot $entity&c horns!' +elite_zombified_piglin: + name: '&fLvl &2$level &fElite &6Zombified Piglin' + deathMessages: + - '$player &cwas mobbed to death by $entity&c!' + - '$entity &cgot $player''s &cbacon!' +elite_zoglin: + name: '&fLvl &2$level &fElite &dZoglin' + deathMessages: + - '$player &cmessed with the $entity &cand got the horns!' + - '$entity &cgot $player''s &cbacon!' +elite_piglin: + name: '&fLvl &2$level &fElite &ePiglin' + deathMessages: + - '$entity &cwill fetch a good price for $player''s remains!' + - '$entity &ctaught $player &cthe value of gold!' +elite_hoglin: + name: '&fLvl &2$level &fElite &dHoglin' + deathMessages: + - '$player &cmessed with the $entity &cand got the horns!' + - '$entity &cgot $player''s &cbacon!' +elite_piglin_brute: + name: '&fLvl &2$level &fElite &cPiglin Brute' + deathMessages: + - '$entity &ctenderized $player!' + - '$entity &cbrutalized $player!' +elite_bee: + name: '&fLvl &2$level &f엘리트 &e꿀벌' + deathMessages: + - '$player&c님이 $entity&c에게 쏘였습니다!' +MobCombatSettings: + bossLocationMessage: '&7[EM] &2[클릭하여 추적]' + bossKillParticipationMessage: '&e당신이 가한 대미지: &2$playerDamage' + defaultOtherWorldBossLocationMessage: '$name: 다른 월드에 있습니다!' + weakText: '&9&lWeak!' + resistText: '&c&lResist!' + fullHealMessage: '&2FULL HEAL!' +check_tier: + message1: '&7[EM] 당신의 전투 등급은 $tier입니다.' + message2: '&7[EM] 당신의 길드 등급 보너스는 $tier입니다.' + message3: '&7[EM] &a총 위협 등급은 $tier입니다.' +check_tier_others: + message1: '&7[EM] $player의 전투 등급은 $tier입니다.' + message2: '&7[EM] $player의 길드 등급 보너스는 $tier입니다.' + message3: '&7[EM] &a$player의 총 위협 등급은 $tier입니다.' +ScrapItemSettings: + scrapItemName: '&2레벨 $level 조각' + scrapItemLore: + - '&a같은 레벨의 조각을 25개 모아서' + - '&a아이템 업그레이드 오브를 제작하세요!' + - '&a또한 아이템을 수리할 때나' + - '&a더 높은 레벨의 조각을 제작할 때 사용할 수도 있습니다!' + - '&2모험가의 길드 허브에서 시도해 보세요!' + upgradeItemName: '&2레벨 $level 업그레이드 오브' + upgradeItemLore: + - '&a강화 NPC에게 사용해 아이템을' + - '&a레벨 $orbLevel으로 올리세요!' +Quests: + questJoinMessage: '&aYou have accepted the quest $questName &a!' + questLeaveMessage: '&cYou have abandoned the quest $questName &c!' + questCompleteMessage: '&2You completed the quest $questName &2!' + leaveWhenNoActiveQuestsExist: '&cYou don''t currently have an active quest!' + questLeaveConfirmationMessage: '&cAre you sure you want to abandon your current quest? Do &a/em confirm &c to confirm your choice!' + questStartTitle: '&aQuest Accepted!' + questCompleteTitle: '&2Quest Completed!' + questLeaveTitle: '&cQuest Abandoned!' + killQuestChatProgressionMessage: '&8[EliteMobs]&c➤Kill $name:$color$current&0/$color$target' + fetchQuestChatProgressionMessage: '&8[EliteMobs]&c➤Get $name:$color$current&0/$color$target' + dialogQuestChatProgressionMessage: '&8[EliteMobs]&c➤Talk to $name:$color$current&0/$color$target' + questCapMessage: '&8[EliteMobs] &cYou have reached the maximum amount of active quests (10)! &4Abandon or complete at least one active quest if you want to get more quests!' + killQuestScoreboardProgressionMessage: '&c➤Kill $name:$color$current&0/$color$target' + fetchQuestScoreboardProgressionMessage: '&c➤Get $name:$color$current&0/$color$target' + dialogQuestScoreboardProgressionMessage: '&c➤Talk to $name:$color$current&0/$color$target' + chatTrackMessage: '&8[EliteMobs]&2 Click here to track your quest!' + chatTrackHover: '&2Click to track!' + chatTrackingMessage: '&8[EliteMobs]&9 You are now tracking a quest!' + chatTrackingHover: '&2Click to untrack/track! /em -> Quests to track a different quest!' + noQuestDestinationFound: '[EM] No quest destination found!' + questDestinationInOtherWorld: '[EM] Go to world $world!' + questAlreadyCompletedMessage: '&8[EliteMobs] &cYou already completed this quest!' + questPrerequisitesMissingMessage: '&8[EliteMobs] &cCan''t accept this quest yet!' + lowRankDynamicQuestWarning: '&8[EliteMobs] &cYou can''t take these quests with your current guild rank! Increase your guild rank to accept these quests.' + questTurnInObjective: '&a2Talk to $npcName' +Wormholes: + dungeonNotInstalledMessage: '&8[EliteMobs] &cDungeon $dungeonID &cis not installed! This teleport will not work.' + defaultPortalMissingMessage: '&8[EliteMobs] &cThis portal doesn''t seem to lead anywhere!' +Arenas: + notEnoughPlayersMessage: '&8[EliteMobs] &cYou need at least $amount to start the match!' + startingMessage: '&2Starting!' + startingSubtitle: '&2in $count...' + arenaFullMessage: '&4[EliteMobs] &cArena is full! You can spectate instead while you wait for it to finish!' + arenasOngoingMessage: '&4[EliteMobs] &cCan''t join the arena now - a match is currently happening! You can spectate instead while you wait for it to finish!' + arenaStartHintMessage: '&2[EliteMobs] &aYou can start the arena by doing &2/em start' + arenaQuitHintMessage: '&4[EliteMobs] &cYou can leave the arena by doing &4/em quit' + arenaJoinPlayerMessage: "&2[EliteMobs] &aYou can start the arena by doing &2/em\\ \\ start &aif there are at least &2$count &aplayers in it! \nYou can leave the\\ \\ arena by doing &c/em quit" + arenaJoinSpectatorMessage: '&2[EliteMobs] &aYou can leave the arena at any time using &2/em quit' + waveTitle: '&aWave &2$wave' + victoryTitle: '&2Victory!' + victorySubtitle: '&aCompleted &2$wave &awaves!' + defeatTitle: '&4Defeat!' + defeatSubtitle: '&cReached wave &4$wave&c!' + victoryBroadcast: Arena $arenaName was conquered by $players! + joinPlayerTitle: '&aStart with &2/em start &a!' + joinPlayerSubtitle: '&cLeave with &4/em quit &c!' + joinSpectatorTitle: '&aNow spectating!' + joinSpectatorSubtitle: '&cLeave with &4/em quit &c!' +ancient_corpse_drop_axe: + name: '&eButchers Cleaver' + lore: + - '&aRetrived from the' + - '&aAncient Corpse''s skull...' +animated_armor_drop_axe: + name: '&8Enchanted Axe' + lore: + - '&8This axe was almost the' + - '&8end of you.' +animated_armor_drop_boots: + name: '&8Enchanted Boots' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +animated_armor_drop_chestplate: + name: '&8Enchanted Chestplate' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +animated_armor_drop_helmet: + name: '&8Enchanted Helmet' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +animated_armor_drop_leggings: + name: '&8Enchanted Leggings' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +arachnid_matriarch_drop_boots: + name: '&bSilk Striders' + lore: + - '&bMade out of rare spider silk.' +baba_rhoga_drop_chest: + name: '&aWitches Robes' + lore: + - '&aThe smell should go' + - '&aaway eventually.' +baba_yaga_drop_helmet: + name: '&aWitches Hat' + lore: + - '&aThe smell should go' + - '&aaway eventually.' +balloon_rider_drop_leggings: + name: '&dRoomy Leggings' + lore: + - '&dVery comfortable and spacious leggings.' +banshee_drop_charm: + name: '&8Manifested Sorrow' + lore: + - '&8May this hardened sorrow protect' + - '&8you from grief.' +beast_tamer_drop_axe: + name: '&eGreat Axe' + lore: + - '&eHeavy enough to cleave any beast in two.' +berserker_charm: + name: '&bBerserker Charm' + lore: + - '&aLose yourself in the face of' + - '&aoverwhelming adversity in more' + - '&aways than one...' +bigfoot_drop_chestplate: + name: '&eFur Armor' + lore: + - '&eNice and warm.' +big_bad_wolf_drop_chestplate: + name: '&aBig Bad Wolf Fur' + lore: + - '&aScary!' +bloated_jeffrey_drop_tear: + name: '&bSweet Tear' + lore: + - '&bYou made Jeffrey cry...' +bone_fiend_drop_leggings: + name: '&aBoney Leggings' + lore: + - '&aThe sharp bones attached to these' + - '&aleggings sure do rattle a lot.' +challengers_boots: + name: '&cChallenger''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_chestplate: + name: '&cChallenger''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_helmet: + name: '&cChallenger''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_leggings: + name: '&cChallenger''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_sword: + name: '&cChallenger''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +chameleon_charm: + name: '&bChameleon Charm' + lore: + - '&aThe colorful Chameleon can' + - '&ablend in just about anywhere,' + - '&aslowly creeping around...' +changeling_drop_sword: + name: '&aCrystalline Sword' + lore: + - '&aThe blade shimmers as you gaze upon it.' +cheetah_charm: + name: '&bCheetah Charm' + lore: + - '&aCheetahs can reach speeds of' + - '&a120 km/h... for about 60' + - '&aseconds. Make them count!' +circus_ringmaster_drop_charm: + name: '&dRingmasters Whip' + lore: + - '&dThis was used for terrible punishment.' +craftenmine_terror_drop_trident: + name: '&cGhast Lobotomizer' + lore: + - '&cPerfect for making sure that' + - '&cthe Ghasts stay grounded.' +creeperpede_drop_chestplate: + name: '&dExplosion Proof Vest' + lore: + - '&dMake ''BOOM!'' feel' + - '&dmore like ''boom''.' +crone_drop_axe: + name: '&fWitch Feller' + lore: + - '&fA fine axe that demands a fine hunt.' +depths_seeker: + name: '&2Depths seeker' + lore: + - '&9Come from depths immeasurable' + - '&9and looted from monster most vile,' + - '&9there is no telling what horrors' + - '&9this fishing rod has seen.' +divine_cinder_drop_charm: + name: '&6Divine Fire' + lore: + - '&6Blessed be the fire!' +dwarven_greed: + name: '&4Dwarven Greed' + lore: + - '&cThose who delve too greedily' + - '&cand too deep may wake ancient' + - '&chorrors of shadow and flame' + - '&cbest left undisturbed.' +elephant_charm: + name: '&bElephant Charm' + lore: + - '&aGain the power of an elephant' + - '&astampede, for the cost of the' + - '&aspeed of an elephant stampede!' +enders_drop_chestplate: + name: '&dEnder Shirt' + lore: + - '&dProtective and comfy!' +enders_drop_helmet: + name: '&dEnder Cap' + lore: + - '&dComfy but also quite sturdy.' +enders_drop_leggings: + name: '&dEnder Pants' + lore: + - '&dA bit too long but it will do.' +ender_lapin_drop_boots: + name: '&cDark Star Boots' + lore: + - '&cGives you the courage' + - '&cof running when in danger.' +endless_pursuer_drop_sword: + name: '&7Dark Blood Sword' + lore: + - '&7The sword seems to' + - '&7be weeping blood...' +enraged_snowman_drop_sword: + name: '&9Snowman''s Nose' + lore: + - '&9No wonder that the Snowman''s' + - '&9nose was so pointy...' +xmas_and_gold: + name: '&6and gold!' + lore: + - '&7Everyone wishes for silver' + - '&7and gold!' +xmas_and_goooooold: + name: '&6and goooooold!' + lore: + - '&7Everyone wishes for silver' + - '&7and gold!' +xmas_cornelius_pick: + name: '&bCornelius'' Pick' + lore: + - '&3If you throw it in the air' + - '&3and let it hit the ground,' + - '&3you may just find some' + - '&3peppermint!' +xmas_lost_present: + name: '&2Lost Present' + lore: + - '&2Turn this in for a reward!' +xmas_peppermint: + name: '&cPeppermint' + lore: + - '&fWhat I''ve been searching for all my life!' +xmas_siiiiilver: + name: '&7Siiiiilver' + lore: + - '&6Everyone wishes for silver' + - '&6and gold!' +xmas_silver: + name: '&7Silver' + lore: + - '&6Everyone wishes for silver' + - '&6and gold!' +xmas_substitute_elf_practice: + name: '&8Substitue Elf Practice' + lore: + - '&fThis doll needs its teeth fixed' +xmas_treat: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +xmas_treat_v2: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +evil_undead_drop_sword: + name: '&eTransient Blade' + lore: + - '&eIt will only serve' + - '&eyou for song long.' +fallen_knight_drop_boots: + name: '&e7Ancient Boots' + lore: + - '&7Even though the boots are old they' + - '&7still provide plenty of protection.' +fallen_knight_drop_chestplate: + name: '&e7Ancient Nether-Plate' + lore: + - '&7This armor might look plain to' + - '&7the untrained eye but is clear' + - '%7that anything wishing to penetrate' + - '&7it''s thick plate will need to be' + - '&7swung with considerable force.' +fallen_knight_drop_helmet: + name: '&e7Ancient Headgear' + lore: + - '&7Many swords have left their mark' + - '&7aon this helm but none have' + - '&7managed to break its defense.' +fallen_knight_drop_leggings: + name: '&e7Ancient Leggings' + lore: + - '&7You feel sorry for anyone that tries' + - '&7to strike these leggings.' +fine_swine_drop_sword: + name: '&6Fine Golden Sword' + lore: + - '&6A fine master-crafted golden sword.' + - '&6The molten gold flowing inside' + - '&6the sword makes sure that any damage' + - '&6to the blade is repaired swiftly.' +firefly_charm: + name: '&bFirefly Charm' + lore: + - '&aLight up the night!' +firestarter_drop_helmet: + name: '&eFire Stopper' + lore: + - '&eOnly half the heat!' +fire_conjurer_drop_shield: + name: '&eFlame Touched Shield' + lore: + - '&eProtects against fire and flame.' +fishy_charm: + name: '&bFishy Charm' + lore: + - '&aThere''s just something not' + - '&aquite right with this one...' +fox_king_cold_drop_charm: + name: '&9Magical Snow' + lore: + - '&9You sense impossible energies' + - '&9coming from this snow.' +fulgora_drop_boots: + name: '&bMountain Boots' + lore: + - '&bShould be useful when' + - '&bexploring the mountains.' +goblin_ballista: + name: '&8Goblin Ballista' + lore: + - '&8A treasure among goblins!' +goblin_boots: + name: '&8Goblin Boots' + lore: + - '&8A treasure among goblins!' +goblin_chestplate: + name: '&8Goblin Chestplate' + lore: + - '&8A treasure among goblins!' +goblin_cleaver: + name: '&8Goblin Cleaver' + lore: + - '&8A treasure among goblins!' +goblin_helmet: + name: '&8Goblin Helmet' + lore: + - '&8A treasure among goblins!' +goblin_invasion_drop_chestplate: + name: '&aSmall Chestplate' + lore: + - '&aReally tight...' +goblin_invasion_drop_leggings: + name: '&aSmall Leggings' + lore: + - '&aWell, at least it really' + - '&ashows off your legs.' +goblin_leggings: + name: '&8Goblin Leggings' + lore: + - '&8A treasure among goblins!' +goblin_poker: + name: '&8Goblin Poker' + lore: + - '&8A treasure among goblins!' +goblin_shooter: + name: '&8Goblin Shooter' + lore: + - '&8A treasure among goblins!' +goblin_slasher: + name: '&8Goblin Slasher' + lore: + - '&8A treasure among goblins!' +grappling_arrow: + name: '&6Grappling Arrow' + lore: + - '&eFire at a TARGET BLOCK to grapple!' +greedy_dwarf_drop_pickaxe: + name: '&9Dwarven Need' + lore: + - '&cThose who delve too greedily' + - '&cand too deep may wake ancient' + - '&chorrors of shadow and flame' + - '&cbest left undisturbed.' +grunter_drop_axe: + name: '&cBig Oink' + lore: + - '&cThe axe has a tendency' + - '&cto squeal when swung.' +grunts_boots: + name: '&fGrunt''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_chestplate: + name: '&fGrunt''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_helmet: + name: '&fGrunt''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_leggings: + name: '&fGrunt''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_sword: + name: '&fGrunt''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +harmless_chicken_drop_boots: + name: '&aUseless Boots' + lore: + - '&aAt least they''re explosion proof...' +hog_rider_drop_boots: + name: '&a3.6 Radioactive Boots' + lore: + - '&aNot great, not terrible.' +horde_champion_drop_sword: + name: '&dHorde Eviscerator' + lore: + - '&dWhen you need to take' + - '&dcare of an undead horde.' +horrid_duplicator_drop_arrow: + name: '&aDuped Arrow' + lore: + - '&2Looks and feels' + - '&2like the real thing...' +horrid_duplicator_drop_bow: + name: '&4Fiery Bone Bow' + lore: + - '&4This bow is made out of' + - '&4a single large bone.' +invasion_alien_treat: + name: '&6Alien treats' + lore: + - '&6The taste is out of this planet!' +invasion_cheap_plasma_boots: + name: '&2Cheap Plasma Boots' + lore: + - '&aBlast off!' + - '&cNote: &8Double shift to activate!' +invasion_low_grade_tinfoil_bolt_caster: + name: '&7Low Grade Bolt Caster' + lore: + - '&7Get off my property!' +invasion_low_grade_tinfoil_boots: + name: '&7Low Grade Tinfoil Shoes' + lore: + - '&7Avoids floor radiation!' +invasion_low_grade_tinfoil_chestplate: + name: '&7Low Grade Tinfoil Chestpiece' + lore: + - '&7Prevents 6G from spying on your pacemaker!' +invasion_low_grade_tinfoil_hat: + name: '&7Low Grade Tinfoil Hat' + lore: + - '&7I want to believe!' +invasion_low_grade_tinfoil_leggings: + name: '&7Low Grade Tinfoil Pants' + lore: + - '&7Made for running from aliens!' +invasion_polished_plasma_boots: + name: '&2Polished Plasma Boots' + lore: + - '&aBlast off!' + - '&cNote: &8Double shift to activate!' +invasion_quality_bolt_caster: + name: '&7Quality Bolt Caster' + lore: + - '&7Get off my property!' +invasion_quality_tinfoil_boots: + name: '&7Low Grade Tinfoil Shoes' + lore: + - '&7Avoids floor radiation!' +invasion_quality_tinfoil_chestplate: + name: '&7Quality Tinfoil Chestpiece' + lore: + - '&7Prevents 6G from spying on your pacemaker!' +invasion_quality_tinfoil_hat: + name: '&7Quality Tinfoil Hat' + lore: + - '&7Stay out of my head!' +invasion_quality_tinfoil_leggings: + name: '&7Quality Tinfoil Pants' + lore: + - '&7Made for running from aliens!' +invictus_boots: + name: '&4Invictus Boots' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_chestplate: + name: '&4Invictus Chestplate' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_helmet: + name: '&4Invictus Helmet' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_leggings: + name: '&4Invictus Leggings' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_pickaxe: + name: '&4Invictus Pickaxe' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_shovel: + name: '&4Invictus Shovel' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_sword: + name: '&4Invictus Sword' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +krampus_drop_boots: + name: '&1Snow Boots' + lore: + - '&1Made out of actual snow.' +large_hopper_drop_axe: + name: '&aHeavy Axe' + lore: + - '&aPerfect for chopping off heads.' +living_shadow_drop_boots: + name: '&5Shadow Boots' + lore: + - '&5Falling doesn''t hurt as much.' +lucky_charms: + name: '&bLucky Charms' + lore: + - '&aPart of a complete breakfast!' + - '&cNote: Absolutely not a part of' + - '&ca complete breakfast.' +magmaguys_toothpick: + name: '&4Magmaguy&c''s &2Toothpick' + lore: + - '&aIn nearly mint condition!' +merman_drop_trident: + name: '&1Merman Trident' + lore: + - '&1A Merman''s favorite weapon.' +meteor_shower_scroll: + name: '&7Meteor Shower Scroll' + lore: + - '&4Call forth destruction.' + - '&4Single-use.' +monster_of_the_deep_drop_trident: + name: '&3Bone Trident' + lore: + - '&3Made out of the bones' + - '&3of the Monster of the Deep.' +moon_spider_drop_sword: + name: '&fSilk Spun Sword' + lore: + - '&fRazor sharp silk surrounds' + - '&fthe iron core of this blade.' + - '&fThe blade will serve you,' + - '&ffor now...' +necromancer_drop_helmet: + name: '&cDark Omen Helm' + lore: + - '&cThere is something off' + - '&cabout this helmet.' +netherite_golem_drop_helmet: + name: '&8Ancient Helmet' + lore: + - '&8You''re not sure if you' + - '&8should put this on your' + - '&8head or send it to a museum.' +nether_escapee_drop_charm: + name: '&6Fire Amulet' + lore: + - '&6May the flames not harm you.' +nether_hag_drop_sword: + name: '&7Bewitched Sword' + lore: + - '&7All kinds of curses and' + - '&7enchantments flow through' + - '&7this sword.' +nightwing_drop_crossbow: + name: '&aSky Watcher' + lore: + - '&aKeeping the skies safe.' +night_crawler_drop_shield: + name: '&8Night Shield' + lore: + - '&8Almost unbreakable.' +night_crawler_drop_sword: + name: '&8Night Blade' + lore: + - '&e8The only answer to the' + - '&8threats of the night.' +novices_boots: + name: '&8Novice''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_chestplate: + name: '&8Novice''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_helmet: + name: '&8Novice''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_leggings: + name: '&8Novice''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_sword: + name: '&8Novice''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +oasis_beacons_brigandine: + name: '&8Beacon''s Brigandine' + lore: + - '&fSolid steel can repel' + - '&fmost attacks.' +oasis_chief_cultists_bow: + name: '&5Chief Cultist''s Bow' + lore: + - '&dThe necrotic war bow' + - '&dof the cultist chief.' +oasis_earthquake_boots_10: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_20: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_30: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_40: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_50: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_10: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_20: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_30: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_40: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_50: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_10: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_20: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_30: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_40: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_50: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_10: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_20: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_30: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_40: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_50: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_foundrys_flaming_hammer: + name: '&6Foundry''s Flaming Hammer' + lore: + - '&eThe Hammer of the foundry!' +oasis_foundrys_flux: + name: '&6Foundry''s Flux' + lore: + - '&eThe flux that''s infused in' + - '&eevery forged weapon!' +oasis_mask_of_the_warlock: + name: '&4Mask of the Warlock' + lore: + - '&7The stone is in his mask!' + - '&7The UV light will help him!' +oasis_monumental_lance: + name: '&3Monumental Lance' + lore: + - '&bSpearfishing is my hobby.' +oasis_oracles_shroud: + name: '&3Oracle''s Shroud' + lore: + - '&1Illusion is your weapon!' +oasis_page_of_darkness_I: + name: '&0Page of Darkness I' + lore: + - '&829 paces North' + - '&811 paces West' + - '&816 paces North' + - '&86 paces East' +oasis_page_of_darkness_II: + name: '&0Page of Darkness II' + lore: + - '&87 paces South' + - '&86 paces East' + - '&833 paces North' + - '&812 paces West' +oasis_page_of_darkness_III: + name: '&0Page of Darkness III' + lore: + - '&86 paces North' + - '&83 paces West' + - '&830 paces North' + - '&89 paces East' +oasis_page_of_darkness_index: + name: '&0Page of Darkness Index' + lore: + - '&8Tread carefully in darkness' + - '&8they know youve come.' + - '&8Be weary on the path ahead' + - '&8for balls of fire drum.' +oasis_page_of_darkness_IV: + name: '&0Page of Darkness IV' + lore: + - '&824 paces South' + - '&89 paces East' + - '&836 paces North' + - '&83 paces West' +oasis_page_of_darkness_V: + name: '&0Page of Darkness V' + lore: + - '&89 paces North' + - '&812 paces East' + - '&86 paces South' + - '&86 paces East' +oasis_page_of_darkness_VI: + name: '&0Page of Darkness VI' + lore: + - '&86 paces South' + - '&86 paces East' + - '&812 paces North' + - '&83 paces East' +oasis_page_of_darkness_VII: + name: '&0Page of Darkness VII' + lore: + - '&83 paces North' + - '&86 paces East' + - '&88 paces South' +oasis_page_of_darkness_VIII: + name: '&0Page of Darkness VIII' + lore: + - '&8Out of the shadow comes a light' + - '&8whose robes are dull gray, marred by fight.' + - '&8Of ice and snow, of fire and heat.' + - '&8Axes deflect, but swords defeat.' +oasis_page_of_libraris_I: + name: '&7Page of Libraris I' + lore: + - '&fUnder the bookshelf' + - '&fthat has no reflection' + - '&fwill appear unto you' + - '&fpassage and direction.' +oasis_page_of_libraris_II: + name: '&7Page of Libraris II' + lore: + - '&fThe bookshelf''s reflection' + - '&fholds more knowledge' + - '&f4 shelves more full of books' + - '&fthan its upward image!' +oasis_page_of_libraris_III: + name: '&7Page of Libraris III' + lore: + - '&fBearing slightly west' + - '&fof the bookshelf that holds the best.' + - '&fThe most knowledge does it keep.' + - '&fA favorite for those who reap.' +oasis_page_of_libraris_index: + name: '&7Page of Libraris Index' + lore: + - '&f5 papers to find,' + - '&f3 switches to flip,' + - '&fa door to be opened' + - '&fand in it shall ye slip.' +oasis_page_of_libraris_IV: + name: '&7Page of Libraris IV' + lore: + - '&fThe oracle of knowledge' + - '&fyeilds shocking surprise' + - '&ffrom depths of despair' + - '&fshall lightning bolts arise.' +oasis_page_of_libraris_V: + name: '&7Page of Libraris V' + lore: + - '&fHis last secret' + - '&fhe will try to hide' + - '&fthough use of shadow and puppets' + - '&fto strike you as you stride.' +oasis_page_of_plundering_I: + name: '&6Page of Plundering I' + lore: + - '&eHouses throughout the town' + - '&ehide their secrets up rather than down.' + - '&eGrapple or flight' + - '&ecan aid your plight.' +oasis_page_of_sentris: + name: '&1Page of Sentris' + lore: + - '&bA sentry''s armor is too tough' + - '&bwielding a sword, your fight will be rough.' +oasis_page_of_the_pharaoh_I: + name: '&0Page of the Pharaoh I' + lore: + - '&6A sacrifice on the altar' + - '&6must be made to pursue.' + - '&6But what shall ye offer?' + - '&red sandstone holds this clue.' +oasis_page_of_the_pharaoh_II: + name: '&0Page of the Pharaoh II' + lore: + - '&6The pharaohs halls are lined' + - '&6in the finest gold around.' + - '&6It shall be his undoing' + - '&6for from gold your damage shall abound.' +oasis_page_of_the_pharaoh_III: + name: '&0Page of the Pharaoh III' + lore: + - '&6The pharaohs walls are filled' + - '&6with perils and precious treasures.' + - '&6From the southwest corner of the room with blue windows' + - '&6streams very ominous pressures.' +oasis_page_of_the_pharaoh_index: + name: '&0Page of the Pharaoh Index' + lore: + - '&6The pharaoh is sealed' + - '&6within his tomb.' + - '&6He lies in wait, undisturbed;' + - '&6his traps will be your doom.' + - '&63 pages will help your adventure' + - '&6from being curbed.' +oasis_page_of_the_sewer_I: + name: '&0Page of the Sewer I' + lore: + - '&3There is a louse of unusual size.' + - '&3Its on the prowl, behold its prize.' + - '&3Plenty of treasure to be found' + - '&3all you have to do is swim around.' +oasis_page_of_the_sewer_II: + name: '&0Page of the Sewer II' + lore: + - '&3Activating the gates one by one' + - '&3will allow the water to flow.' + - '&3Swim up once it pours out' + - '&3then down the right tunnel you must go.' +oasis_page_of_the_sewer_index: + name: '&0Page of the Sewer Index' + lore: + - '&3Evil lurks where waters drain' + - '&3Be ever watchful, they''ll eat your brain!' + - '&3You must open 3 gates guarded by creatures' + - '&3lined with red sandstone features.' + - '&32 pages will guide you, do not strain.' +oasis_page_of_vampiris_I: + name: '&4Page of Vampiris I' + lore: + - '&cDozens of weapons have struck the beast' + - '&cand every blow it''s withstood.' + - '&cIt fears not the bite of stone, gold or diamonds in the least' + - '&cbut it trembles before wood.' +oasis_page_of_vampiris_II: + name: '&4Page of Vampiris II' + lore: + - '&cIf the warlock you seek to slight,' + - '&cbe prepared for a tough fight!' + - '&cThe second floor shall test your might,' + - '&cconquering it first is a rite.' +oasis_page_of_vampiris_III: + name: '&4Page of Vampiris III' + lore: + - '&cDown the spire and into the cave' + - '&cis the path of the brave.' + - '&cBeware of those returned from the grave,' + - '&cslay master for what you crave.' +oasis_page_of_vampiris_index: + name: '&4Page of Vampiris Index' + lore: + - '&cWithin the observatory' + - '&cthere lurks a creature' + - '&cwho has never seen the sun.' + - '&cFind 4 pages to help you' + - '&cescape alive!' +oasis_page_of_vampiris_IV: + name: '&4Page of Vampiris IV' + lore: + - '&cTwo chests of loot,' + - '&cDon''t wake the dead!' + - '&cOne under the stair,' + - '&cthe other where books can be read!' +oasis_pharaohs_feast: + name: '&6Pharaohs Feast' + lore: + - '&eA golden reminder' + - '&eof the once golden city' + - '&ecorrupted by the sands of time.' +oasis_pharaohs_flail: + name: '&0Pharaoh''s Flail' + lore: + - '&4The flail of the afterlife.' +oasis_pick_of_darkness: + name: '&1Pick of Darkness' + lore: + - '&bShining bright through' + - '&bthe shadows.' +oasis_sunkiller: + name: '&6Sunkiller' + lore: + - '&eIsnt that rock over there' + - '&ejust big enough for someone' + - '&eto hide behind?' +oasis_tohth: + name: '&8Oingo Boingo Brothers Adventure' + lore: + - '&fMy preminitions are absolute!' + - '&fIt is fate!' +okami_drop_leggings: + name: '&cOkami''s Blessing' + lore: + - '&cSpeed of the wolf.' + - '&cFire protection of a god.' +owl_charm: + name: '&bOwl Charm' + lore: + - '&aBecome the ultimate nocturnal' + - '&apredator!' +primis_artifexs_shield: + name: '&6Artifex''s Shield' + lore: + - '&eAn old relic from a more' + - '&edangerous time. It has been' + - '&erestored to its glory!' +primis_caeruleaums_hope: + name: '&9Caeruleaum''s Hope' + lore: + - '&8A relic of a bygone era, still sharp' + - '&8enough to hurt but rusty enough to' + - '&8belong in a museum!' +primis_catacomb_drop_boots: + name: '&7Dark Bone Footgear' + lore: + - '&7Unnaturally dark bones' + - '&7cover these boots.' +primis_catacomb_drop_boots_2: + name: '&7Dark Bone Footgear' + lore: + - '&7Unnaturally dark bones' + - '&7cover these boots.' +primis_catacomb_drop_chestplate: + name: '&7Dark Bone Armor' + lore: + - '&7Bones as dark as the abyss' + - '&7adorn this armor.' + - '&7The arrows will make quite a' + - '&7noise as they bounce off the bones.' +primis_catacomb_drop_chestplate_2: + name: '&7Dark Bone Armor' + lore: + - '&7Bones as dark as the abyss' + - '&7adorn this armor.' + - '&7The arrows will make quite a' + - '&7noise as they bounce off the bones.' +primis_catacomb_drop_leggings: + name: '&7Dark Bone Leggings' + lore: + - '&7The dark bones covering the' + - '&7leggings will make dangerous' + - '&7falls more survivable.' +primis_catacomb_drop_leggings_2: + name: '&7Dark Bone Leggings' + lore: + - '&7The dark bones covering the' + - '&7leggings will make dangerous' + - '&7falls more survivable.' +primis_catacomb_necromancer_drop_helmet: + name: '&5Dark Bone Cowl' + lore: + - '&5The cowl offers little protection,' + - '&5it only seeks blood and death.' +primis_catacomb_necromancer_drop_helmet_2: + name: '&5Dark Bone Cowl' + lore: + - '&5The cowl offers little protection,' + - '&5it only seeks blood and death.' +primis_catacomb_necromancer_drop_sword: + name: '&5Dark Bone Brand' + lore: + - '&5The unnaturally dark bone-brand' + - '&5glistens in the light' + - '&5ready to part anything' + - '&5that stands in it''s way.' +primis_catacomb_necromancer_drop_sword_2: + name: '&5Dark Bone Brand' + lore: + - '&5The dark bone-brand howls' + - '&5viciously with every swing' + - '&5as the air rushes through' + - '&5it''s hollow cavity.' +primis_cooked_rabbit: + name: '&cCooked Rabbit' + lore: + - Huh, did this rabbit overheat? +primis_diving_helmet: + name: '&1Diving Helmet' + lore: + - An old Diving Helmet. + - Still works just fine. +primis_fish_bait: + name: '&2Fish Bait' + lore: + - '&aLooks like you could reel big fish with these.' +primis_gladius_important_documents: + name: '&2Important Documents' + lore: + - '&aThe documents are sealed.' +primis_gladius_lord_promise: + name: '&5Assistance Agreement' + lore: + - '... hence, for the help lended during these most trying' + - times, Pontis Mille promises to return in kind at Gladius' + - darkest hour. +primis_gladius_supplies: + name: '&2Supplies' + lore: + - '&aFit to keep a soldier fed during a war.' +primis_gladius_sword: + name: '&5Gladius' + lore: + - '&8The very symbol of the Gladius Fortress.' +primis_gladius_the_good_stuff: + name: '&2The Good Stuff' + lore: + - '&aSmells... strong.' +primis_heirloom: + name: '&2Lost Heirloom' + lore: + - '&aSeems old, ancient even.' +primis_ice_village_alanus_dagger: + name: '&eAlanus'' Dagger' + lore: + - '&eA simple dagger with' + - '&erunes covering the handle.' +primis_ice_village_chains_shipment: + name: '&aShipment of Chains' + lore: + - '&aA lot of chains.' +primis_ice_village_escaped_prisoner_body: + name: '&cUnconcious Body' + lore: + - '&cHeavy.' +primis_ice_village_foot_of_mountain_chest_axe: + name: '&1Dull Frost Axe' + lore: + - '&1Freezing to the touch' +primis_ice_village_island_chest_trident: + name: '&3Magma''s Delight' + lore: + - '&3Those who look, shall find.' +primis_ice_village_living_nightmares_reward_chest: + name: '&3Fur Coat' + lore: + - '&3Made out of the' + - '&3toughest fur around.' +primis_ice_village_magical_ice_crystals: + name: '&1Fur Ice Crystal' + lore: + - Having the crystal near + - snow makes it react. +primis_ice_village_make_them_go_ouch_reward_leggings: + name: '&dViolet''s Spare Leggings' + lore: + - '&dMakes you wanna strut down the' + - '&droad and do some punishment.' +primis_ice_village_salmon: + name: '&2Fresh Salmon' + lore: + - You don't think you saw + - larger salmon in your life. +primis_ice_village_silence_reward_helmet: + name: '&aBoomers Helm' + lore: + - '&aShould handle an explosion or two.' +primis_ice_village_taking_the_bait_reward: + name: '&bNorthern Rod' + lore: + - '&bIt''s a well made fishing rod.' +primis_ice_village_violet_boots: + name: '&dViolet''s Leather Boots' + lore: + - '&dFancy leather boots with' + - '&da raised pointy heel.' +primis_ice_village_violet_leggings: + name: '&dViolet''s Fancy Leggings' + lore: + - '&dTight and slightly see-through' + - '&dwith beautiful flower motives.' +primis_ice_village_violet_whip: + name: '&dViolet''s Whip' + lore: + - '&dDelivers exquisite punishment.' +primis_ice_village_wanna_build_a_snowman_reward_boots: + name: '&3Frost Boots' + lore: + - '&3It''s just frost boots.' +primis_invaders_assassins_bow: + name: '&8Assassin''s Bow' + lore: + - '&aThe perfect way to give them' + - '&aa taste of their own medicine.' +primis_invaders_boots: + name: '&4Invader''s boots' + lore: + - '&aThese don''t smell so good.' +primis_invaders_bow: + name: '&8Invader''s Bow' + lore: + - '&aOnce blotted out the Sun.' +primis_invaders_captains_sword: + name: '&4Invader''s Captain Sword' + lore: + - '&aCurved and mean-looking.' +primis_invaders_chestplate: + name: '&4Invader''s chestplate' + lore: + - '&aRusty, ugly and smelly. Lovely!' +primis_invaders_helmet: + name: '&4Invader''s helmet' + lore: + - '&aBeats a concussion!' +primis_invaders_leggings: + name: '&4Invader''s leggings' + lore: + - '&aCould use some oil.' +primis_invaders_sword: + name: '&4Invader''s sword' + lore: + - '&aSuspiciously bloodstained.' +primis_lucky_pickaxe: + name: '&6Lucky Lickaxe' + lore: + - '&eShines bright, even underground.' + - '&eYou see LL engraved in the handle' +primis_monster_slaying_spear: + name: '&8Monster Slaying Spear' + lore: + - Turns Sea Monsters into barbecue. +primis_ogre_boots: + name: '&cOgre''s boots' + lore: + - '&7They''ll keep you nice' + - '&7and toasty.' +primis_ogre_chestplate: + name: '&cOgre''s chestplate' + lore: + - '&7Hot to the touch' +primis_ogre_helmet: + name: '&cOgre''s helmet' + lore: + - '&7You''ll be sweating bullets.' +primis_ogre_leggings: + name: '&cOgre''s leggings' + lore: + - '&7Smoldering slacks.' +primis_ogre_mines_lucky_pickaxe: + name: '&eLucky Pickaxe' + lore: + - '&aLucky, but useless.' +primis_ogre_mines_waterworks_chest_shield: + name: '&aSturdy Door' + lore: + - '&aIt''s just a door.' +primis_old_shield: + name: '&8Old Shield' + lore: + - '&7An old relic from a more' + - '&7dangerous time. It might be' + - '&7able to be mended, though...' +primis_pirate_boots: + name: '&4Pirate''s boots' + lore: + - '&aThese have a few too many' + - '&aholes to be useful.' +primis_pirate_bow: + name: '&8Pirate''s Bow' + lore: + - '&aNot quite a flintlock,' + - '&abut it will do!' +primis_pirate_chestplate: + name: '&4Pirate''s Chestplate' + lore: + - '&aBasically a t-shirt.' +primis_pirate_helmet: + name: '&4Pirate''s Helmet' + lore: + - '&aMissing an eye-patch.' +primis_pirate_leggings: + name: '&4Pirate''s leggings' + lore: + - '&aFeels like sea legs!' +primis_pirate_sword: + name: '&4Pirate''s sword' + lore: + - '&aCurved and mean-looking.' +primis_pointis_groves_heirloom: + name: '&2Valuable Heirloom' + lore: + - '&aThis is the second one of these that you retrieved.' +primis_pointis_mille_chest_dirty_note: + name: Dirty Note + lore: + - '&fThere was a really cool sword' + - '&fin here but it''s gone now.' +primis_pontis_beast_horn: + name: '&2Blood Drenched Horn' + lore: + - '&fOn closer inspection the horn isn''t' + - '&fcovered in blood but seems to' + - '&fbe made out of it.' + - '&fThe crystallized blood is incredibly sharp.' +primis_pontis_beast_scale: + name: '&2Toxic Fish Scale' + lore: + - '&fThe scale is rock hard on the outside.' + - '&fThe inside is covered in' + - '&ftoxic and acidic ooze.' +primis_pontis_beast_silk: + name: '&2Sun Soaked Silk' + lore: + - '&fThe silk is radiating light and warmth.' +primis_pontis_elf_drop_boots: + name: '&7Elf Boots' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_elf_drop_chestplate: + name: '&7Elf Chest-plate' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_elf_drop_crossbow: + name: '&7Elf Dark-bow' + lore: + - '&7The special projectiles that the bow' + - '&7uses are both sharp and blunt.' +primis_pontis_elf_drop_helmet: + name: '&7Elf Helmet' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_elf_drop_leggings: + name: '&7Elf Leggings' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_fields_berry_charm: + name: '&dLarge Berry' + lore: + - '&dThe fresh odor this berry emits' + - '&dcan be smelled from miles away.' + - '&dThe odor seems to have a calming' + - '&deffect on monsters and beasts.' + - '&dIt makes their attacks less vicious.' +primis_pontis_groves_brood_moher_drop_charm: + name: '&aCrawlers Torment' + lore: + - '&aThe silk radiates strong energy.' +primis_pontis_groves_nest_crawler_drop_shield: + name: '&7Magma''s Lure' + lore: + - '&7When the shield is held up' + - '&7it lures monsters into striking it.' +primis_pontis_groves_spider_boots_reward: + name: '&1Spider-legs Boots' + lore: + - '&1Boots made from spider legs and leather.' +primis_pontis_groves_tree_climbing_elf_bandits_reward_leggings: + name: '&aElf Pearl Leggings' + lore: + - '&aProtective leggings' + - '&aadorned with pearls.' +primis_pontis_mille_arena_knowledge: + name: '&2Knowledge' + lore: + - '&aImportant Knowledge.' +primis_pontis_mille_arena_reward_1: + name: '&4Star Touched Shield' + lore: + - '&7An ornate shield with a cosmos motive.' +primis_pontis_mille_arena_reward_2: + name: '&4Star Touched Chestplate' + lore: + - '&7A thousand tiny spiky stars stretch across the Chestplate.' +primis_pontis_mille_arena_reward_3: + name: '&4Star Touched Leggings' + lore: + - '&7The leggings sparkle like the stars in the sky.' +primis_pontis_mille_cat_quest_reward_charm: + name: '&9Cat''s Blessing' + lore: + - '&9If you hold it up all the' + - '&9way to your ear you can' + - '&9hear a slight purr.' +primis_pontis_mille_counselor_sword: + name: '&eStone of Far-speech' + lore: + - '&aYou can sense a presence coming from the stone.' +primis_pontis_mille_fields_beasts_reward_chest: + name: '&eHunters Pride' + lore: + - '&eThose who hunt cannot be the prey.' +primis_pontis_mille_fields_contest_berry: + name: '&dContest Berry' + lore: + - '&dA beautiful and very large berry.' + - '&dTruly a one in a million specimen.' +primis_pontis_mille_fields_do_it_yourself_reward_bow: + name: '&cHunters Bow' + lore: + - '&cA finely crafted bow.' + - '&cArrows fired from this' + - '&cbow will hurt any beast.' +primis_pontis_mille_fields_first_aid: + name: '&2First Aid Equipment' + lore: + - '&fEverything one would need" - "&fto treat serious injuries.' +primis_pontis_mille_fields_rat_drop_helmet: + name: '&fFeathered Rat Cap' + lore: + - '&fYou managed to make a' + - '&fcap out of your prey.' + - '&fHaving extracted the preys' + - '&fblinding properties, you have made' + - '&fit work in your favor.' +primis_pontis_mille_fields_rat_meat: + name: '&cRat Meat' + lore: + - Raw rat meat. No need to cook. +primis_pontis_mille_fields_stolen_berries: + name: '&4Stolen Berries' + lore: + - '&fIt''s the stolen berries' +primis_pontis_mille_fish_nets: + name: '&2Fish Nets' + lore: + - '&aCatching fish made easy!' +primis_pontis_mille_fresh_rat: + name: '&fFresh Rat' + lore: + - The cat will love this. +primis_pontis_mille_mines_goblined_up_in_the_maze_reward_axe: + name: '&aRuned Goblin Axe' + lore: + - '&aThere are runes etched into the axe handle.' + - '&aThey are quite faded by now.' + - '&aSeems like this axe was cursed at one point...' +primis_pontis_mille_mines_goblin_head: + name: '&2Fowl Goblin Feathers' + lore: + - '&aSo soft and prickly.' +primis_pontis_mille_parkour_reward_boots: + name: '&4Diamond Tree Boots' + lore: + - '&7Boots made out of special soft bark.' + - '&7Decorated with gems.' +primis_pontis_mille_reward_boots: + name: '&4Pontis Mille Boots' + lore: + - '&7Traditional Pontis Mille Boots' +primis_pontis_mille_reward_chest: + name: '&4Pontis Mille Chestplate' + lore: + - '&7A traditional Pontis Mille Chestplate' +primis_pontis_mille_reward_helmet: + name: '&4Pontis Mille Helm' + lore: + - '&7A traditional Pontis Mille Helm' +primis_pontis_mille_reward_leggings: + name: '&4Pontis Mille Leggings' + lore: + - '&7Traditional Pontis Mille Leggings' +primis_pontis_mille_reward_shield: + name: '&4Pontis Mille Shield' + lore: + - '&7A traditional Pontis Mille Shield' +primis_pontis_mille_reward_sword: + name: '&4Pontis Mille Katana' + lore: + - '&7Incredibly sharp' +primis_pontis_mille_serious_sewage_reward_helmet: + name: '&2Turtle Shell Helm' + lore: + - '&2Makes you wanna eat some pizza.' +primis_pontis_mille_sewage_keys: + name: '&2Sewage Keys' + lore: + - '&aA key ring with a lot of keys on it.' +primis_pontis_mille_sewers_ninja_drop_chestplate: + name: '&7Ninja Garb Chest-plate' + lore: + - Now you too are a Ninja +primis_pontis_mille_sewers_ninja_drop_leggings: + name: '&7Ninja Garb Leggings' + lore: + - Now you too are a Ninja +primis_pontis_mille_sewers_shredder_drop: + name: '&4Shredding Helmet' + lore: + - Full of small tiny razor blade + - like points on the exterior. +primis_pontis_mille_slums_chest_sword: + name: '&4Dull Pontis Mille Katana' + lore: + - '&7Incredibly sharp' +primis_pontis_mille_to_lycan_or_not_to_lycan_reward: + name: '&aFur Leggings' + lore: + - '&aTough and light' + - '&aMade out of fur and hide.' +primis_pontis_mines_goblin_drop_boots: + name: '&7Goblin Boots' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_chestplate: + name: '&7Goblin Chest-Plate' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_helmet: + name: '&7Goblin Helmet' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_leggings: + name: '&7Goblin Leggings' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_spear: + name: '&7Goblin Spear' + lore: + - '&7A nice and sharp stone at the end.' +primis_pontis_mines_goblin_drop_sword: + name: '&7Goblin Sword' + lore: + - '&7It''''s just a stone club with a handle.' +primis_pontis_redwoods_nasty_little_bandits_reward_boots: + name: '&2Forest Boots' + lore: + - '&2The boots seem to be made' + - '&2out of soft bark, leaves' + - '&2and crystallized tree sap.' +primis_pontis_redwoods_spider_legs: + name: '&2Spider Legs' + lore: + - '&aIt is just spider legs...' +primis_pontis_redwoods_tobacco: + name: '&2Premium Tobacco' + lore: + - '&aSmells amazing...' +primis_pontis_redwoods_watch: + name: '&2Sturdy Pocket Watch' + lore: + - '&aSuprisingly light and sturdy.' +primis_pontis_redwoods_werewolf_drop_chestplate: + name: '&7Fur Chest-Plate' + lore: + - '&7Made out of tough fur and hide.' + - '&7Light, but very tough.' +primis_roughspun_boots: + name: '&5Roughspun Boots' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_roughspun_chestplate: + name: '&5Roughspun Chestplate' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_roughspun_helmet: + name: '&5Roughspun Helmet' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_roughspun_leggings: + name: '&5Roughspun Leggings' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_ruins_bow: + name: '&8Ruined Bow' + lore: + - An old bow. Might've been good at some point. +primis_ruins_diary_entry: + name: Diary page + lore: + - '... I now regret chasing after the treasure in these ruins.' + - Now that I have fallen and broken my legs, it would seem + - as though I am fated to die under the treasure I sought. + - If only I had paid more attention during parkour class! +primis_ruin_relic_boots: + name: '&bRuin Relic Boots' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_ruin_relic_chestplate: + name: '&bRuin Relic Chestplate' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_ruin_relic_helmet: + name: '&bRuin Relic Helmet' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_ruin_relic_leggings: + name: '&bRuin Relic Leggings' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_rusty_mail_boots: + name: '&3Rusty Mail Boots' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_rusty_mail_chestplate: + name: '&3Rusty Mail Chestplate' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_rusty_mail_helmet: + name: '&3Rough Mail Helmet' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_rusty_mail_leggings: + name: '&3Rough Mail Leggings' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_starter_boots: + name: '&4Shipwreck''s Boots' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_chestplate: + name: '&4Shipwreck''s Chestplate' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_helmet: + name: '&4Shipwreck''s Helmet' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_leggings: + name: '&4Shipwreck''s Leggings' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_sword: + name: '&4Shipwreck''s Sword' + lore: + - '&aPossibly improvised from the beached remains of a ship!' +primis_storm_temple_drop_axe: + name: '&bStorm Axe' + lore: + - '&bThe wind shall repel them.' +primis_storm_temple_drop_boots: + name: '&bStorm Boots' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_storm_temple_drop_charm: + name: '&bStorm Necklace' + lore: + - '&bThe power of the storm.' +primis_storm_temple_drop_chestplate: + name: '&bStorm Chest-plate' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_storm_temple_drop_helmet: + name: '&bStorm Helmet' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_storm_temple_drop_leggings: + name: '&bStorm Leggings' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_terravilla_big_trouble_in_little_pub_reward_leggings: + name: '&eEarth''s Blessing' + lore: + - '&eLooks heavy but it is' + - '&esurprisingly light.' + - '&eIt is clear that these' + - '&eleggings are at least a' + - '&efew centuries old.' +primis_terravilla_drowning_terror_reward_charm: + name: '&aFish Charm' + lore: + - '&aFishy.' +primis_terravilla_hog_on_my_porch_reward_helmet: + name: '&6Hog Helmet' + lore: + - '&6Made out of tough Razorback leather.' +primis_terravilla_perfect_sample: + name: '&ePerfect Sample' + lore: + - '&eIt looks like a fish...' + - '&eBut it sure isn''t...' +primis_terravilla_strike_the_earth_reward_sword: + name: '&5Earth Splitter' + lore: + - '&5You pulled this blade out of' + - '&5the Earth Elementals corpse.' + - '&5Unlike it''s dull twin, this' + - '&5blade is in pristine condition.' +primis_terravilla_taking_out_the_trash_reward_sword: + name: '&9Earth Splitter' + lore: + - '&9Looks ancient and dull.' +primis_terravilla_two_legged_terror_growth: + name: '&eTwo Legged Terror Growth' + lore: + - '&eLarge fleshy growth.' +primis_terravilla_two_legged_terror_sample: + name: '&eTwo Legged Terror Sample' + lore: + - '&eIt''s a simple sample.' +primis_wolf_hide_boots: + name: '&5Wolf Hide Slippers' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_wolf_hide_chestplate: + name: '&5Wolf Hide Gambeson' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_wolf_hide_helmet: + name: '&5Wolf Hide Helmet' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_wolf_hide_leggings: + name: '&5Wolf Hide Pants' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +pufferfish_drop_helmet: + name: '&bPuffer Helm' + lore: + - '&bOnce a fish, now a helmet.' +rabbit_charm: + name: '&bRabbit Charm' + lore: + - '&aWith this charm, just about' + - '&aany destination is only a hop,' + - '&askip and a jump away!' +rabbit_wolf_drop_chestplate: + name: '&6Electrically Charged Chestplate' + lore: + - '&6As long as you don''t mind a' + - '&6casual zap here and there.' +rabbit_wolf_drop_leggings: + name: '&6Flame Licked Leggings' + lore: + - '&6Just lightly scorched.' +regular_hoglin_drop_boots: + name: '&eHog Boots' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_chestplate: + name: '&eHog Armor' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_helmet: + name: '&eHog Hood' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_leggings: + name: '&eHog Leggings' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +rod_of_the_depths: + name: '&3Rod of the Depths' + lore: + - '&3You want to hear about where' + - '&3I got this from? Sit down lad,' + - '&3I''ve got a tale for ye...' +rotting_diver_drop_hoe: + name: '&bDivers Hoe' + lore: + - '&bFound on the Rotting Divers corpse.' +salamander_charm: + name: '&bSalamander Charm' + lore: + - '&aAlmost as hot as MagmaGuy''s' + - '&anew mixtape!' +salty_corpse_drop_helmet: + name: '&aStinky Helm' + lore: + - '&aYou''re not sure why' + - '&ayou decided to pull' + - '&athis off of the corpse.' +scorpion_charm: + name: '&bScorpion Charm' + lore: + - '&aFloat like a butterfly,' + - '&asting like a bee,' + - '&apoison like a potato!' +shulker_charm: + name: '&bShulker Charm' + lore: + - '&aI believe I can fly' + - '&aI believe I can touch the sky' + - '&aAnd you''re coming with me!' +skeleton_knight_drop_helmet: + name: '&fKnights Honor' + lore: + - '&fA knights helmet. Made to last.' +sky_archer_drop_bow: + name: '&aSky Bow' + lore: + - '&aGood for keeping phantoms at bay.' +slowpoke_charm: + name: '&bSlowpoke Charm' + lore: + - '&aLet''s just hope it doesn''t hit' + - '&aitself in its confusion...' +spider_knight_drop_helmet: + name: '&aSmall Helmet' + lore: + - '&aA decent helmet. Maybe, a bit tight.' +stacked_bones_drop_helmet: + name: '&6Skull' + lore: + - '&6Large enough to fit your' + - '&6head inside, so why not.' +summon_merchant_scroll: + name: '&6Summon Merchant Scroll' + lore: + - '&aNeed to sell an item?' + - '&aRight-click to activate' + - '&aor yell &9Jeeves!' +summon_wolf_scroll: + name: '&6Summon Wolf Scroll' + lore: + - '&aSummons a good boy' + - '&ato help you bite Elites!' + - '&aMake sure you pet it!' +super_mite_drop_charm: + name: '&dMite Pearl' + lore: + - '&dWas it worth it...' +air_ship_air_buccaneer_boots: + name: '&5Air Bucanneer''s Boots' + lore: + - '&dPerfect for air raids!' +air_ship_air_buccaneer_chestplate: + name: '&5Air Bucanneer''s Chestplate' + lore: + - '&dPerfect for air raids!' +air_ship_air_buccaneer_helmet: + name: '&5Air Bucanneer''s Helmet' + lore: + - '&dPerfect for air raids!' +air_ship_air_buccaneer_leggings: + name: '&5Air Bucanneer''s Leggings' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_boots: + name: '&5Air Pirate''s Boots' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_chestplate: + name: '&5Air Pirate''s Chestplate' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_helmet: + name: '&5Air Pirate''s Helmet' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_leggings: + name: '&5Air Pirate''s Leggings' + lore: + - '&dPerfect for air raids!' +air_ship_bowsmans_bow: + name: '&2Bowsman''s Bow' + lore: + - '&aDropped by the late' + - '&aairship bowsman!' +air_ship_cannon_powder: + name: '&cCannon Powder' + lore: + - '&8How else are you supposed' + - '&8to light the fuse?' +air_ship_daveys_digger: + name: '&4Davey''s Digger' + lore: + - '&cDavey doesn''t desire downtrodden' + - '&cdunderheads displaying his digger.' +air_ship_quartermasters_whip: + name: '&fQuartermaster''s Whip' + lore: + - '&7The quartermaster has a ' + - '&7schedule to keep.' +air_ship_wayfinders_windlass: + name: '&3Wayfinder''s Windlass' + lore: + - '&bUsed to guide ships' + - '&bwith nothing but the stars!' +pirate_ship_sea_feast: + name: '&6Sea feast' + lore: + - '&6A feast for the eyes' + - '&6and the health bar!' +pirate_ship_sea_ration: + name: '&eSea ration' + lore: + - '&eAn apple a day' + - '&ekeep the scurvy away' + - '&cNote: it does not' +catacombs_tier_10_miniboss_boots: + name: '&9Spiderweave boots' + lore: + - '&5As light as air!' +catacombs_tier_10_miniboss_spider_eye: + name: '&7Terragog''s eye' + lore: + - '&7Whispers from nowhere reach' + - '&7your ears while holding this...' +catacombs_tier_15_boss_bone: + name: The Picker + lore: + - '&fYou''ve got a bone to pick!' +catacombs_tier_15_boss_bow: + name: '&6The Bone Shaker' + lore: + - '&fThey''ll feel this one down to' + - '&ftheir bones!' +catacombs_tier_15_boss_shovel: + name: '&8Gravedigger' + lore: + - '&fThey''ll feel this one down to' + - '&ftheir bones!' +catacombs_tier_15_mimic_boss_shield: + name: '&3Shield of the lost Templar' + lore: + - Found in a mysterious chest in a + - secret room of ancient catacombs... +colosseum_pit_breaker: + name: '&4Pit Shatterer' + lore: + - '&4Veni' +colosseum_pit_filler: + name: '&4&lPit Filler' + lore: + - '&4Vici' +colosseum_pit_maker: + name: '&4&lPit Maker' + lore: + - '&4Vidi' +dark_cathedral_tier_75_sword: + name: '&0Cursed Sword' + lore: + - '&0&kChtulhu is the one true God.' + - '&0&kThis world is but a lamb' + - '&0&kto the slaughter' +darkspire_arzags_boots: + name: '&8Arzag''s War Boots' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_chestplate: + name: '&8Arzag''s War Chestplate' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_helmet: + name: '&8Arzag''s War Helmet' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_leggings: + name: '&8Arzag''s War Leggings' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_slicer: + name: '&8Arzag''s Slicer' + lore: + - '&7Once used by the might Arzag!' +darkspire_crypt_keepers_boots: + name: '&4Crypt Keeper''s Boots' + lore: + - '&cFormerly the boots of the' + - '&ccorrupt Crypt Keeper!' +darkspire_hellraisers_battle_armor: + name: '&4Eerbix''s Battle Armor' + lore: + - '&cFormerly the battle' + - '&carmor of the egregious' + - '&cEerbix the Fallen!' +darkspire_maalkvs_bow: + name: '&4Maalkv''s Bow' + lore: + - '&cFormerly the bow of the' + - '&cmischievous Maalkv!' +darkspire_netherite_axe: + name: '&8Void Eviscerator' + lore: + - '&8Shards of the void itself were' + - '&8collected to form the cleaving' + - '&8head of this ancient weapon.' +darkspire_nicolas_ribcages_helmet: + name: '&4Nicolas Ribcage''s Helmet' + lore: + - '&cFormerly the helmet of the' + - '&cnefarious Nicolas Ribcage!' +darkspire_oroxaks_sword: + name: '&4Oroxak''s Sword' + lore: + - '&cFormerly the sword of the' + - '&codious Oroxak!' +darkspire_zalmurs_leggings: + name: '&4Zalmur''s Leggings' + lore: + - '&cFormerly the leggings of' + - '&cthe zealous Zalmur' + - '&cthe Impslayer!' +the_feller: + name: '&2The Feller' + lore: + - '&aEven in your sleep,' + - '&ayou can feel this axe''''s' + - '&asaplust' +the_great_weaver_drop_charm: + name: '&cWeavers Silk' + lore: + - '&cGreat power is imbued into this silk.' +hallosseum_amazing_treat: + name: '&aAmazing Treat!' + lore: + - '&eAn amazing snack!' +hallosseum_axe_of_beheadings: + name: '&cAxe of Beheadings' + lore: + - '&4Famously used to decapitate a' + - '&4certain headless horseman!' +hallosseum_incredible_treat: + name: '&aIncredible Treat!' + lore: + - '&eAn incredible snack!' +hallosseum_treat: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +hallosseum_treat_v2: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +the_hunter_drop_crossbow: + name: '&aHunter''s Friend' + lore: + - '&aLet the hunt begin.' +northpole_amazing_treat: + name: '&aAmazing Treat!' + lore: + - '&eAn amazing snack!' +northpole_coalbringer: + name: '&8Coalbringer' + lore: + - '&cWhatever I touch' + - '&cStarts to melt in my clutch.' + - '&cI''m too much!' +northpole_frostcaster: + name: '&bFrostcaster' + lore: + - '&7Whatever I touch' + - '&7Turns to snow in my clutch!' + - '&7I''m too much' +northpole_incredible_treat: + name: '&aIncredible Treat!' + lore: + - '&eAn incredible snack!' +northpole_naughty_lister: + name: '&4The Naughty Lister' + lore: + - '&cTakes names. Doesn''t ask twice!' + - '&cHave you been naughty this year?' +northpole_treat: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +northpole_treat_v2: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +the_phantom_drop_chestplate: + name: '&dPhantom Gambison' + lore: + - '&dYou would say it is made out of soft' + - '&dand comfy fibrous cloth, but a blade' + - '&dwould not recoil from striking cloth.' +pirate_ship_tier_15_boots: + name: Pirate Sandals + lore: + - Make you want to + - go to the beach! +pirate_ship_tier_15_bow: + name: Pirate shortbow + lore: + - Perfect for boarding parties! +pirate_ship_tier_15_chestplate: + name: Pirate Shirt + lore: + - No shoes, no shirt + - no problem! +pirate_ship_tier_15_helmet: + name: Pirate Bandana + lore: + - No shoes, no shirt + - no problem! +pirate_ship_tier_15_leggings: + name: Pirate Sash + lore: + - These could use a wash! +pirate_ship_tier_15_sword: + name: Pirate marlinspike + lore: + - Loud and deadly! +pirate_ship_tier_20_miniboss_axe: + name: '&5Cookie''s Tenderizer' + lore: + - '&5You''ll feel that tomorrow!' +pirate_ship_tier_20_miniboss_chestplate: + name: '&5Cookie''s apron' + lore: + - '&5Has seen better days!' +pirate_ship_tier_25_boots: + name: '&aPirate shoes' + lore: + - '&aPerfect for thieving!' +pirate_ship_tier_25_bow: + name: '&aPirate musket' + lore: + - '&aCareful where you point it!' +pirate_ship_tier_25_chestplate: + name: '&aPirate vest' + lore: + - '&aProbably illegally obtained!' +pirate_ship_tier_25_helmet: + name: '&aPirate earrings' + lore: + - '&aWorth enough to pay for' + - '&aa funeral!' +pirate_ship_tier_25_leggings: + name: '&aPirate trousers' + lore: + - '&aFull of gold coins!' +pirate_ship_tier_25_miniboss_helmet: + name: '&5Helmsman''s Eyepatch' + lore: + - '&5How can you see better' + - '&5with it on!?' +pirate_ship_tier_25_miniboss_trident: + name: '&5Helmsman''s Trident' + lore: + - '&5Pointy end towards the enemy!' +pirate_ship_tier_25_sword: + name: '&aPirate cutlass' + lore: + - '&aTruly piratey!' +pirate_ship_tier_30_miniboss_axe: + name: '&5Crushy''s Chopper' + lore: + - '&5Step back!' +pirate_ship_tier_30_miniboss_shield: + name: '&5Crushy''s Shoulder' + lore: + - '&5Never skipped shoulder day!' +pirate_ship_tier_35_boots: + name: '&9Pirate boots' + lore: + - '&9Perfect for swashbuckling!' +pirate_ship_tier_35_bow: + name: '&9Pirate handcannon' + lore: + - '&9Blast em away!' +pirate_ship_tier_35_chestplate: + name: '&9Pirate straps' + lore: + - '&9Perfect for looting!' +pirate_ship_tier_35_helmet: + name: '&9Pirate eyepatch' + lore: + - '&9Not perfect for seeing!' +pirate_ship_tier_35_leggings: + name: '&9Pirate greaves' + lore: + - '&9Perfect for looting!' +pirate_ship_tier_35_miniboss_boots: + name: '&9Bodyguard''s boots' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_chestplate: + name: '&5Bodyguard''s straps' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_crossbow: + name: '&5Bodyguard''s handcannon' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_helmet: + name: '&5Bodyguard''s eyepatch' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_leggings: + name: '&5Bodyguard''s greaves' + lore: + - '&9For those with something to defend!' +pirate_ship_tier_35_miniboss_sword: + name: '&5Bodyguard''s cutlass' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_sword: + name: '&9Pirate cutlass' + lore: + - '&9Truly piratey!' +pirate_ship_tier_40_miniboss_crossbow: + name: '&5The Blunderbuss' + lore: + - '&5Spray ''n pray!' +pirate_ship_tier_40_miniboss_leggings: + name: '&5The Zaggers' + lore: + - '&5When they think you''re going!' + - '&5to zig, zag on them!' +pirate_ship_tier_45_boss_helmet: + name: '&5Captain''s eyepatch' + lore: + - '&5I don''t see any issues!' +pirate_ship_tier_45_boss_sword: + name: '&5Captain''s scimitar' + lore: + - '&5En garde, ye scurvy rats!' +the_ruins_boss_loot: + name: '&6Thor''s Axe' + lore: + - Only the pure of heart + - can wield this axe. +sewer_drowned_kings_boots: + name: '&4Drowned King''s Boots' + lore: + - '&cFormerly the boots of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_chestplate: + name: '&4Drowned King''s Chestplate' + lore: + - '&cFormerly the chestplate of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_crown: + name: '&4Drowned King''s Crown' + lore: + - '&cFormerly the crown of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_leggings: + name: '&4Drowned King''s Leggings' + lore: + - '&cFormerly the leggings of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_trident: + name: '&4Drowned King''s Trident' + lore: + - '&cFormerly the trident of the' + - '&cdevilish Drowned King!' +sewer_spelunkers_boots: + name: '&2Sewer Spelunker''s Boots' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential leggings!' +sewer_spelunkers_chestplate: + name: '&2Sewer Spelunker''s Chestplate' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential chestplate!' +sewer_spelunkers_helmet: + name: '&2Sewer Spelunker''s Helmet' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential helmet!' +sewer_spelunkers_leggings: + name: '&2Sewer Spelunker''s Leggings' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential leggings!' +sewer_spelunkers_sword: + name: '&2Sewer Spelunker''s Sword' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential sword!' +the_stinger: + name: '&eThe Stinger' + lore: + - '&aFloat like a butterfly,' + - '&asting like a bee!' +tree_defender_drop_shield: + name: '&7Living Wood Shield' + lore: + - '&7This shield will' + - '&7slowly repair itself.' +unbind_scroll: + name: '&5Unbind Scroll' + lore: + - '&5Allows users to unbind one' + - '&5soulbound item at an anvil!' + - '&5Use wisely!' +undead_farmer_drop_shovel: + name: '&8Manure Master' + lore: + - '&8Perfect for shoveling pig manure.' +unwanted_visitor_drop_bow: + name: '&1Frost Bow' + lore: + - '&9Makes you wanna chill' + - '&9and snipe from afar.' +vampire_manor_gargoyle_granulator: + name: '&8Gargoyle Granulator' + lore: + - '&cLightly dusted in garlic.' +vampire_manor_stake_your_claim: + name: '&4Stake your Claim' + lore: + - '&cLightly dusted in garlic.' +vampiric_charm: + name: '&bVampiric Charm' + lore: + - '&aNo one can remember where this' + - '&acame from, and no one can,' + - '&aforget how dangerous it is...' +veterans_boots: + name: '&6Veteran''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_chestplate: + name: '&6Veteran''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_helmet: + name: '&6Veteran''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_leggings: + name: '&6Veteran''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_sword: + name: '&6Veteran''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +vex_top_drop_boots: + name: '&bVexed Boots' + lore: + - '&bWith mighty boots' + - '&bcomes mighty strength.' +warlock_drop_chestplate: + name: '&dWarlock Robes' + lore: + - '&dOffers good protection from spells.' +warlock_drop_helmet: + name: '&dWarlock Hood' + lore: + - '&dOffers good protection from spells.' +water_pest_drop_shield: + name: '&bWater Logged Shield' + lore: + - '&bIt''s pretty sturdy actually.' +wendigo_drop_sword: + name: '&8Blade of Starving' + lore: + - '&8This blade will always' + - '&8hunger for more blood.' +werehare_drop_charm: + name: '&eWerehare Trophy' + lore: + - '&eLuck and health to' + - 'ðose who carry it.' +werewolf_bone: + name: '&6Werewolf Bone' + lore: + - '&aHaving killed the alpha,' + - '&athis temporarily makes you!' + - '&athe wolves'' new leader' +wolfsbane: + name: '&7Wolfsbane' + lore: + - '&aMade from the remains of' + - '&aan alpha werewolf, all' + - '&awolves cower at the sight of it.' +yeti_drop_leggings: + name: '&eFur Leggings' + lore: + - '&eNice and warm.' +yezhi_baba_drop_boots: + name: '&aWitches Robes' + lore: + - '&aThe smell should go' + - '&aaway eventually.' +zombie_kings_axe: + name: '&4Zombie King''s Axe' + lore: + - The axe of the one Zombies + - call their king. + - The bloodlust is palpable. +airship_minidungeon: + name: '&6비행선' + customInfo: + - '&f죽지 않는 해적들로 가득한 멋진 비행선입니다!' + - '&6제작: MagmaGuy, 69OzCanOfBepis' + - '&6그리고 Realm of Lotheridon' + playerInfo: |- + 난이도: &6중간 + $bossCount개의 보스, 레벨 $lowestTier ~ $highestTier + &6죽지 않는 해적들로 가득한 멋진 비행선 + &6숙련된 플레이어 전용! + regionEnterMessage: '&8[EM] &c적대 비행 구역에 진입하였습니다!' + regionLeaveMessage: '&8[EM] &c적대 비행 구역에서 나갔습니다!' +binder_of_worlds_lair: + name: '&5Binder Of Worlds' + customInfo: + - '&5최후의 도전이 될 것입니다. 각오하세요!' + - '&6제작: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + 난이도: &6악몽 + $bossCount개의 레벨 $highestTier 마지막 보스! + &5EliteMobs의 가장 어려운 보스입니다! + regionEnterMessage: '&8[EM] &5현실이 당신을 중심으로 흐트러지기 시작합니다. 당신은 마지막 도전에 직면했습니다. &4넌 아직 준비가 안됐다!' + regionLeaveMessage: '&8[EM] &5당신은 흐트러지는 구역을 떠났습니다. 당신이 원하던 것을 찾아냈나요? 그만한 가치가 있었습니까?' +catacombs_lair: + name: '&8The Catacombs' + customInfo: + - '&f새로 시작하는 플레이어를 위한 최고의 던전입니다!' + - '&6제작: Realm of Lotheridon' + playerInfo: |- + Difficulty: &cHard + $bossCount bosses, from tier $lowestTier to $highestTier + &2The best Lair challenge for groups of beginners! + regionEnterMessage: '&8[EM] &8지하 무덤에 입장합니다. 안속의 생물들을 조심하세요...' + regionLeaveMessage: '&8[EM] &8지하 무덤에서 빠져나왔습니다. 그럴만한 가치가 있었나요?' +colosseum_lair: + name: '&6콜로세움' + customInfo: + - '&f처음 선보이는 멀티 페이즈 전투,' + - '&f탑승하고 있는 보스, 변장한 보스입니다.' + - '&f진정한 월드 보스를 만나 엄청난 싸움을 경험해 보세요!' + - '&6제작: MagmaGuy & Maldini' + playerInfo: |- + Difficulty: &cHard + $bossCount bosses, from level $lowestTier to $highestTier + &cA true challenge for big groups of players! + regionEnterMessage: '&8[EM] &6챔피언과 도전자 여러분, 준비하세요! &e가장 강력한 적들을 만나 여러분의 가치를 증명해 내세요!' + regionLeaveMessage: '&8[EM] &6안녕히 가세요, 여행자여! &e다시 찾아와 제대로 힘을 발휘해 보세요!' +dark_cathedral_lair: + name: '&8어둠의 대성당' + customInfo: + - '&f처음으로 만든 EliteMobs 둥지입니다!' + - '&f모든 서버가 필요로 하는 걸작입니다!' + - '&6제작: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &cHard + $bossCount level $highestTier Big Boss! + &cThe original minidungeon, a challenge for + &ca group of players or for veterans! + regionEnterMessage: '&8[EM] &8어둠의 대성당에 온것을 환영합니다. &4안에서 죽음이 기다리고 있습니다...' + regionLeaveMessage: '&8[EM] &8어둠의 대성당에서 빠져나갑니다. &4당신의 귀환을 기다리고 있습니다...' +dark_spire_minidungeon: + name: '&8어둠의 첨탑' + customInfo: + - '&f처음으로 만든 고레벨 컨텐츠입니다!' + - '&f진짜 도전을 원하는 분들을 위해 만들었습니다!' + - '&6제작: 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &cA vast challenge for advanced players! + regionEnterMessage: '&8[EM] &1공습이 진행중입니다. &9반란을 막아내십시오!' + regionLeaveMessage: '&8[EM] &1그들을 간신히 저지해냈습니다. &9일단은 말이죠...' +fireworks_lair: + name: '&aFireworks' + customInfo: + - '&fThe 2021 4th of July map!' + - '&6Credits: MagmaGuy' + playerInfo: |- + Difficulty: &cHard + $bossCount level $lowestTier Big Boss! + &6An encounter full of explosions! + regionEnterMessage: '&8[EM] &eWelcome to the fireworks show!' + regionLeaveMessage: '&8[EM] &eYou''ve left the party!' +frost_palace_sanctum: + name: Frost Palace + customInfo: + - '&fA 7 phase fight against' + - the queen of ice! + - '&6Credits: MagmaGuy, Delio' + playerInfo: 'Difficulty: &45-man hard content!' + regionEnterMessage: '&bYou are stepping into the Frost Palace! Stay frosty!' + regionLeaveMessage: '&bYou have left the Frost Palace!' +hallosseum_lair: + name: '&c할로세움' + customInfo: + - '&f2020년에 나온 으스스한 할로윈 던전입니다!' + - '&6제작: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &chard + $bossCount level $lowestTier Big Boss! + &6A fun Halloween challenge! + regionEnterMessage: '&8[EM] &4트릭 오어 트리트! &8네 영혼은 내 것이다!' + regionLeaveMessage: '&8[EM] &4당신은 다행히 영혼이 온전한 채로 탈출하였습니다.' +invasion_minidungeon: + name: '&2The Invasion' + customInfo: + - '&fThe Halloween Minidungeon!' + - '&6제작: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount aliens, from level $lowestTier to $highestTier + &6Don't get abducted! + regionEnterMessage: '&8[EM] &7Alien invasion in progress! Defeat the Mothership!' + regionLeaveMessage: '&8[EM] &7You have escaped the alien abductions! No one will ever believe you.' +north_pole_minidungeon: + name: '&9The North Pole' + customInfo: + - '&f크리스마스 미니 던전입니다!' + - '&6제작: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + 난이도: &6중간 + $bossCount개의 보스, 레벨 $lowestTier ~ $highestTier + &6스노우 글로브 속의 크리스마스! + regionEnterMessage: '&8[EM] &7북극에 도착하였습니다! &f올해에는 나쁜 짓을 했던 적이 있나요?' + regionLeaveMessage: '&8[EM] &7나중에 또 놀러오세요. &f다음 번엔 달콤한 사탕과 간식들이 있을 거에요!' +oasis_adventure: + name: '&6오아시스' + customInfo: + - '&f입문자를 위한 거대한 여정입니다!' + - '&6제작: 69OzCanOfBepis' + playerInfo: |- + Difficulty: &2Solo-able + $bossCount bosses, from level $lowestTier to $highestTier + &6A big adventure for people who know the ropes! + regionEnterMessage: '&8[EM] &6오아시스에 도착하였습니다!' + regionLeaveMessage: '&8[EM] &6오아시스에서 나갔습니다!' +pirate_ship_minidungeon: + name: '&6해적선' + customInfo: + - '&f플레이어들이 다양하고 좋은 아이템을 얻을 수 있는' + - '&f보스들로 가득한' + - '&f재미있고 도전적인 미니 던전입니다!' + - '&6제작: MagmaGuy & Realm of Lotheridon' + playerInfo: |- + 난이도: &6중간 + $bossCount개의 보스, 레벨 $lowestTier ~ $highestTier + &6모험을 꿈꾸는 사람들에게 최고의 사냥터입니다! + regionEnterMessage: '&8[EM] &3곧 해적선에 탑승합니다! &b마음껏 죽이고 약탈하세요!' + regionLeaveMessage: '&8[EM] &3플레이어가 떠납니다! &b뱃멀미가 멎으면 다시 돌아오세요!' +primis_adventure: + name: '&7Primis' + customInfo: + - '&fA tutorial adventure for new players!' + - '&6Credits: 69OzCanOfBepis, MagmaGuy' + playerInfo: |- + Difficulty: &2Easy + $bossCount bosses, from level $lowestTier to $highestTier + &6A tutorial adventure for new players! + regionEnterMessage: '&8[EM] &6Primis awaits, strike the earth!' + regionLeaveMessage: '&8[EM] &6You have left Primis!' +sewers_minidungeon: + name: '&8하수도' + customInfo: + - '&f지금까지 만든 미니 던전 중 가장 큽니다!' + - '&6제작: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + 난이도: &6중간 + $bossCount개의 보스, 레벨 $lowestTier ~ $highestTier + &6도전적인 구역들이 있는 복잡한 미궁 던전입니다! + regionEnterMessage: '&8[EM] &5이곳은 버려진 장소 같습니다만... &d뭔가 하수도 안에 숨어있군요!' + regionLeaveMessage: '&8[EM] &5당신은 물 밖으로 빠져나왔습니다. &d다음엔 이곳에서 익사할 수도 있겠군요.' +the_ruins: + name: '&6The Ruins' + customInfo: + - '&fA fight against a myth from' + - '&fNorse mythology, be prepared for a smiting!' + - '&6Credits: 69OzCanOfBepis, MagmaGuy' + playerInfo: |- + Difficulty: &cHard + $bossCount level $lowestTier Big Boss! + &cA tough fight against a Norse god! + regionEnterMessage: '&8[EM] &3Those who challenge the myths must be prepared for their downfall!' + regionLeaveMessage: '&8[EM] &3You now know what it takes to make a legend!' +vampire_manor: + name: '&cThe Vampire Manor' + customInfo: + - '&fPrepare to spill blood!' + - '&6제작: MagmaGuy, 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &6A deadly manor full of blood thristy creatures! + &6Are you ready to face that which haunts the night? + regionEnterMessage: '&8[EM] &cTrespassing on dangerous grounds!!' + regionLeaveMessage: '&8[EM] &cNow leaving haunted land!' +alpha_werewolf_p1: + name: '$eventBossLevel &7Enraged Vindicator' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Alpha Wolf has been put down!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&7Enraged Vindicator: $distance blocks away!' + spawnMessage: '&cThe howls of an Alpha Werewolf are heard!' + deathMessage: '&aThe Alpha Werewolf has been stopped by $players!' + escapeMessage: '&4Dawn breaks, the Alpha Wolf vanishes without a trace!' +alpha_werewolf_p2: + name: '$eventBossLevel &7Alpha Werewolf' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Alpha Wolf has been put down!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&7Alpha Wolf: $distance blocks away!' + spawnMessage: '&cThe howls of an Alpha Werewolf are heard!' + deathMessage: '&aThe Alpha Werewolf has been stopped by $players!' + escapeMessage: '&4Dawn breaks, the Alpha Wolf vanishes without a trace!' +ancient_corpse: + name: '$eventBossLevel &eAncient Corpse' +animated_armor: + name: '$eventBossLevel &8Animated Armor' + locationMessage: '&cAnimated Armor: $distance blocks away!' + spawnMessage: '&cOh no! An Animated Armor has escape from it''s armor stand!' + deathMessage: '&aThe Animated Armor was stopped by $players!' + escapeMessage: '&4The Animated Armor is gone!' +arachnid_matriarch: + name: '$eventBossLevel &cArachnid Matriarch' + locationMessage: '&cArachnid Matriarch: $distance blocks away!' + spawnMessage: '&cA Matriarch has come to spread her brood across the land!' + deathMessage: '&aThe Matriarch and her brood were stopped by $players!' + escapeMessage: '&4The Matriarch has left!' +arachnid_matriarch_summon: + name: '$eventBossLevel &4Broodling' +armor_goblin: + name: '$eventBossLevel &3Armor Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Armor Goblin has been pillaged!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cArmor Goblin: $distance blocks away!' + spawnMessage: '&cAn Armor Goblin has been sighted!' + deathMessage: '&aAn Armor Goblin has been slain by $players!' + escapeMessage: '&4An Armor Goblin has escaped!' +baba_rhoga: + name: '$eventBossLevel &cBaba Rhoga' + locationMessage: '&cBaba Rhoga: $distance blocks away!' + spawnMessage: '&cA wicked hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +baba_rhoga_summon: + name: '$reinforcementLevel &4Baba Rhoga' +baba_yaga: + name: '$eventBossLevel &cBaba Yaga' + locationMessage: '&cBaba Yaga: $distance blocks away!' + spawnMessage: '&cA wicked hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +baba_yaga_summon: + name: '$reinforcementLevel &4Baba Yaga' +balloon_rider: + name: '$eventBossLevel &dBalloon Rider' + locationMessage: '&cBalloon Rider: $distance blocks away!' + spawnMessage: '&cA brave Balloon Rider has come to the Nether!' + deathMessage: '&aThe Balloon Rider has taken his last ride thanks to $players!' + escapeMessage: '&4The Balloon Rider has floated away!' +balloon_rider_mount: + name: '$eventBossLevel &5Ghastly Balloon' +balrog: + name: '$eventBossLevel &4Balrog' +banshee: + name: '$eventBossLevel &cBanshee' + locationMessage: '&cBanshee: $distance blocks away!' + spawnMessage: '&cA Banshee''s wail can be heard!' + deathMessage: '&aThe Banshee was silenced by $players!' + escapeMessage: '&4The Banshee has left!' +banshee_summon: + name: '$eventBossLevel &cGrief' +beast_master: + name: '$eventBossLevel &6Beast Master' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Beast Master has been savaged!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cBeast Master: $distance blocks away!' + spawnMessage: '&cThe Beast Master has been sighted!' + deathMessage: '&aThe Best Master has been slain by $players!' + escapeMessage: '&4The Beast Master has returned to the wilds!' +beast_tamer: + name: '$eventBossLevel &eBeast Tamer' + locationMessage: '&cBeast Tamer: $distance blocks away!' + spawnMessage: '&cA master of beasts roams the world!' + deathMessage: '&aThe Beast Tamer was stopped by $players!' + escapeMessage: '&4The Beast Tamer has left!' +beast_tamer_summon: + name: '$eventBossLevel &6Large Beast' +beast_tamer_summon_1: + name: '$eventBossLevel &6Beast' +beta_wolf: + name: '$reinforcementLevel &7Beta Wolf' +bigfoot: + name: '$eventBossLevel &fBigfoot' + locationMessage: '&cBigfoot: $distance blocks away!' + spawnMessage: '&cA mighty beast has appeared!' + deathMessage: '&aThe beast is no more thanks to $players!.' + escapeMessage: '&4The beast has escaped!' +big_bad_wolf: + name: '$eventBossLevel &fBig Bad Wolf' + locationMessage: '&cBig Bad Wolf: $distance blocks away!' + spawnMessage: '&cAnd he huffed and he puffed!' + deathMessage: '&aThe little piggies are now safe thanks to $players!' + escapeMessage: '&4The Big Bad Wolf has left!' +binder_of_worlds_phase_1_endermite_reinforcement: + name: '$reinforcementLevel &5Reality Corruptor' +binder_of_worlds_phase_3_enderman_reinforcement: + name: '$reinforcementLevel &5Reality Slayer' +binder_of_worlds_phase_3_ghast_reinforcement: + name: '$reinforcementLevel &5Reality Shredder' +blayyze: + name: '$eventBossLevel &6Blayyze' + deathMessages: + - '&e&l---------------------------------------------' + - '&6The Blayyze has been repelled!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&6????: $distance blocks away' + spawnMessage: '&cSomething came out of the meteorite''s crater...' + deathMessage: '&6$players completed first contact.' + escapeMessage: '&6The ayyliens have been taken to area 51!' +bloated_jeffrey: + name: '$eventBossLevel &dBloated Jeffrey' + locationMessage: '&cBloated Jeffrey: $distance blocks away!' + spawnMessage: '&cIt''s Jeffrey! They are in the nether! Bring a bow!' + deathMessage: '&aBloated Jeffrey has been slain by $players!' + escapeMessage: '&4Jeffrey and his friends grew bored and they left!' +bloated_jeffrey_summon: + name: '$eventBossLevel &dJeffrey''s Friend' +bone_fiend: + name: '$eventBossLevel &7Bone Fiend' + locationMessage: '&cBone Fiend: $distance blocks away!' + spawnMessage: '&cA creature of bone and bone has appeared!' + deathMessage: '&aThe Bone Fiend was defeated by $players!' + escapeMessage: '&4The Bone Fiend found no bone and left!' +bone_fiend_mount: + name: '$eventBossLevel &8Bone Carrier' +changeling: + name: '$eventBossLevel &4Changeling' + locationMessage: '&cChangeling: $distance blocks away!' + spawnMessage: '&cA shape-shifter has entered this world.' + deathMessage: '&aThe Changeling was stopped by $players!' + escapeMessage: '&4The Changeling has escaped!' +changeling_p2: + name: '$eventBossLevel &4Changeling' +changeling_p3: + name: '$eventBossLevel &4Changeling' +changeling_p4: + name: '$eventBossLevel &4Changeling' +changeling_p5: + name: '$eventBossLevel &4Changeling' +changeling_p6: + name: '$eventBossLevel &4Changeling' +changeling_p7: + name: '$eventBossLevel &4Changeling' +charms_goblin: + name: '$eventBossLevel &2Charms Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Charms Goblin has been pillaged!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cCharms Goblin: $distance blocks away!' + spawnMessage: '&cA Charms Goblin has been sighted!' + deathMessage: '&aA Charms Goblin has been slain by $players!' + escapeMessage: '&4A Charms Goblin has escaped!' +circus_ringmaster: + name: '$eventBossLevel &dRingmaster' + locationMessage: '&cCircus Ringmaster: $distance blocks away!' + spawnMessage: '&cA terrible circus is in town!' + deathMessage: '&a$players has stopped the RIngmasters reign of abuse!' + escapeMessage: '&4The circus has left town!' +circus_ringmaster_summon: + name: '$eventBossLevel &5Tortured Animal' +circus_ringmaster_summon_1: + name: '$eventBossLevel &5Abused Clown' +circus_ringmaster_summon_2: + name: '$eventBossLevel &5Mistreated Balloon' +coins_goblin: + name: '$eventBossLevel &eCoins Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Coins Goblin has been pillaged!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cCoins Goblin: $distance blocks away!' + spawnMessage: '&cA Coins Goblin has been sighted!' + deathMessage: '&aA Coins Goblin has been slain by $players!' + escapeMessage: '&4A Coins Goblin has escaped!' +craftenmine_stacked_bones: + name: '$eventBossLevel &eArmed Skull' + locationMessage: '&cDr. Craftenmine''s Stacked Bones: $distance blocks away!' + spawnMessage: '&cA horrible Dr. Craftenmine creation is out in the wild!' + deathMessage: '&aThe horrible Stacked-Bones creation was slain by $players!' + escapeMessage: '&4Dr. Craftenmines horrible creation has escaped!' +craftenmine_stacked_bones_ankle: + name: '$eventBossLevel &6Armed Ankle' +craftenmine_stacked_bones_backbone: + name: '$eventBossLevel &6Armed Backbone' +craftenmine_stacked_bones_femur: + name: '$eventBossLevel &6Armed Femur' +craftenmine_stacked_bones_spine: + name: '$eventBossLevel &6Armed Spine' +craftenmine_terror: + name: '$eventBossLevel &cLobotimized Ghast' + locationMessage: '&cDr. Craftenmine''s Terror: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine creation is on the loose!' + deathMessage: '&aThe Lobotimized Ghast was slain by $players!' + escapeMessage: '&4The Lobotimized Ghast has left!' +craftenmine_terror_mount: + name: '$eventBossLevel &dGhast Carrier' +creeperpede_1: + name: '$eventBossLevel &5Creeperpede Observer' + locationMessage: '&cCreeperpede: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine experiment is on the loose!' + deathMessage: '&aThe Creeperpede was stopped in its tracks by $players!.' + escapeMessage: '&4AThe Dr. Craftenmine experiment has managed to escape!' +creeperpede_2: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_3: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_4: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_5: + name: '$eventBossLevel &5Creeperpede Carrier' +crone: + name: '$eventBossLevel &aOld Crone' + locationMessage: '&cOld Crone: $distance blocks away!' + spawnMessage: '&cAn Old Crone has wandered into this world!' + deathMessage: '&aThe Crone was vanquished by $players!.' + escapeMessage: '&4The Old Crone has left this world on her broom!' +crone_summon: + name: '$eventBossLevel &fPet Spider' +divine_cinder: + name: '$eventBossLevel &cDivine Cinder' + locationMessage: '&cDivine Cinder: $distance blocks away!' + spawnMessage: '&cA divine blaze has appeared!' + deathMessage: '&aThe Divine Cinder was defeated by $players!' + escapeMessage: '&4The Divine Cinder has smoked away!' +ember: + name: '$reinforcementLevel &cEmber' +enders_1: + name: '$eventBossLevel &dEnderlad' + locationMessage: '&cEnder Clique: $distance blocks away!' + spawnMessage: '&cA group of ender troublemakers have appeared.' + deathMessage: '&aThe Ender Clique was stopped by $players!' + escapeMessage: '&4The Ender Clique have left!' +enders_2: + name: '$eventBossLevel &dEnderchap' + locationMessage: '&cClique Member: $distance blocks away!' +enders_3: + name: '$eventBossLevel &dEnderdude' + locationMessage: '&cClique Member: $distance blocks away!' +ender_lapin: + name: '$eventBossLevel &aEnder Lapin' +endless_pursuer: + name: '$eventBossLevel &dEndless Pursuer' + locationMessage: '&cEndless Pursuer: $distance blocks away!' + spawnMessage: '&cIt will not stop chasing...' + deathMessage: '&aThe chase has stopped thanks to $players!' + escapeMessage: '&4The Pursuer has vanished!' +enraged_snowman: + name: '$eventBossLevel &1Enraged Snowman' + locationMessage: '&cEnraged Snowman: $distance blocks away!' + spawnMessage: '&cAn angry Snowman was sighted!' + deathMessage: '&aThe Enraged Snowman was put to rest by $players!' + escapeMessage: '&4The Enraged Snowman has vanished!' +evil_undead: + name: '$eventBossLevel &cEvil Undead' + locationMessage: '&cEvil Undead: $distance blocks away!' + spawnMessage: '&cAn Evil Undead has appeared!' + deathMessage: '&aThe Evil Undead was put to rest by $players!' + escapeMessage: '&4The Evil Undead has escaped!' +evil_undead_p2: + name: '$eventBossLevel &cEvil Undead' + locationMessage: '&cEvil Undead: $distance blocks away!' + spawnMessage: '&cAn Evil Undead has appeared!' + deathMessage: '&aThe Evil Undead was put to rest by $players!' + escapeMessage: '&4The Evil Undead has escaped!' +fallen_knight: + name: '$eventBossLevel &7Fallen Knight' + locationMessage: '&cFallen Knight: $distance blocks away!' + spawnMessage: '&cA Fallen Knight rises from their grave!' + deathMessage: '&aA Fallen Knight has fallen to $players!.' + escapeMessage: '&4The Fallen Knight goes back to slumber!' +fine_swine: + name: '$eventBossLevel &eFine Swine' +fine_swine_summon: + name: '$eventBossLevel &eMighty Protector' +firestarter: + name: '$eventBossLevel &6Firestarter' + locationMessage: '&cFirestarter: $distance blocks away!' + spawnMessage: '&cA wicked Firestarter has appeared!' + deathMessage: '&aThe Firestarter was slain by $players!' + escapeMessage: '&4The Firestarter has left!' +firestarter_mount: + name: '$eventBossLevel &6Spark' +fire_conjurer: + name: '$eventBossLevel &eFire Conjurer' + locationMessage: '&cFire Conjurer: $distance blocks away!' + spawnMessage: '&cA master of fire and flame walks this world!' + deathMessage: '&aThe Fire Conjurer was extinguished by $players!' + escapeMessage: '&4The Fire Conjurer has vanished!' +fire_conjurer_summon: + name: '$eventBossLevel &6Summoned Flame' +fire_fae: + name: '$eventBossLevel &cFire Fae' +foreign_visitor: + name: '$eventBossLevel &5Foreign Visitor' + locationMessage: '&cForeign Visitor: $distance blocks away!' + spawnMessage: '&cA visitor from a another dimension has arrived!' + deathMessage: '&a$players has made sure to let the visitor know that they are not welcome here.' + escapeMessage: '&4The visitor has gone back home!' +fox_king_cold: + name: '$eventBossLevel &1Fox King Cold' + locationMessage: '&cFox King Cold: $distance blocks away!' + spawnMessage: '&cA magical creature roams the world.' + deathMessage: '&aFox King Cold was defeated by $players!' + escapeMessage: '&4Fox King Cold has left this world.' +frost_palace_frost_queen_p0: + name: '$bossLevel &8Frost Queen' + locationMessage: '&9Frost Queen' + spawnMessage: '&9The wind howls. The Frost Queen rises up to the challenge.' + deathMessage: '&aThe Frost queen is no more, slain by $players!' +frost_palace_frost_queen_p1: + name: '$bossLevel &8Frost Queen phase 1' + locationMessage: '&9Frost Queen phase 1' +frost_palace_frost_queen_p2: + name: '$bossLevel &8Frost Queen phase 2' + locationMessage: '&9Frost Queen phase 2' +frost_palace_frost_queen_p3: + name: '$bossLevel &8Frost Queen phase 3' + locationMessage: '&9Frost Queen phase 3' +frost_palace_frost_queen_p4: + name: '$bossLevel &8Frost Queen phase 4' + locationMessage: '&9Frost Queen phase 4' +frost_palace_frost_queen_p5: + name: '$bossLevel &8Frost Queen phase 5' + locationMessage: '&9Frost Queen phase 5' +frost_palace_frost_queen_p6: + name: '$bossLevel &8Frost Queen phase 6' + locationMessage: '&9Frost Queen phase 6' +frost_palace_frost_queen_p7: + name: '$bossLevel &8Frost Queen phase 7' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Frost Queen was thawed!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&9Frost Queen phase 7' +frost_palace_reinforcement_1: + name: '$reinforcementLevel Spirit of Winter' +frost_palace_reinforcement_2: + name: '$reinforcementLevel Spirit of Spring' +frost_palace_reinforcement_3: + name: '$reinforcementLevel Spirit of Summer' +fulgora: + name: '$eventBossLevel &3Fulgora' + locationMessage: '&cFulgora: $distance blocks away!' + spawnMessage: '&cA mighty thunder goat has come!' + deathMessage: '&aFulgora was stopped by $players!' + escapeMessage: '&4Fulgora has left this place!' +gamma_werewolf: + name: '$reinforcementLevel &7Gamma Werewolf' +goblin_invader: + name: '$eventBossLevel &2Goblin Leader' + locationMessage: '&cGoblin Army: $distance blocks away!' + spawnMessage: '&cA Goblin Army has invaded this realm!' + deathMessage: '&aThe Goblin Army has been vanquished by $players!' + escapeMessage: '&4The Goblin Army is done with this realm!' +goblin_invader_summon_1: + name: '&2Goblin Warrior' +goblin_invader_summon_2: + name: '&2Goblin Fighter' +goblin_invader_summon_3: + name: '&2Goblin Trooper' +goblin_invader_summon_4: + name: '&2Goblin Reinforcements' +greedy_dwarf: + name: '$eventBossLevel &9Greedy Dwarf' + locationMessage: '&cGreedy Dwarf: $distance blocks away!' + spawnMessage: '&cCan you find the Greedy Dwarf digging somewhere underground?!' + deathMessage: '&aThe Greedy Dwarf was released of their curse by $players!' + escapeMessage: '&4The Greedy Dwarf had found their treasure and they left!' +gremlin_1: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + spawnMessage: '&cA Gremlin hoard has invaded this world!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_10: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_2: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_3: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_4: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_5: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_6: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_7: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_8: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_9: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +grunter: + name: '$eventBossLevel &aGrunter' + locationMessage: '&cGrunter: $distance blocks away!' + spawnMessage: '&cA mighty hog roams the lands.' + deathMessage: '&aGrunter was stopped by $players!' + escapeMessage: '&4Grunter has escaped!' +harmless_chicken: + name: '$eventBossLevel &fHarmless Chick' + locationMessage: '&cHarmless Chick: $distance blocks away!' + spawnMessage: '&cBwok!!! Cluck, Cluck! Bawk!' + deathMessage: '&aBaaaawk! Cluck...$players!' + escapeMessage: '&4Harmless Chicken has baaaaaawked away.' +harmless_chicken_summon: + name: '$eventBossLevel &fClucktector' +hog_rider: + name: '$eventBossLevel &6Hog Rider' + locationMessage: '&cHog Rider: $distance blocks away!' + spawnMessage: '&cA mighty Hog Rider has appeared!' + deathMessage: '&aThe Hog Rider and their Hog were vanquished by $players!' + escapeMessage: '&4The Hog Rider has vanished.' +hog_rider_mount: + name: '$eventBossLevel &eLoyal Hog' +hog_rider_p2: + name: '$eventBossLevel &6Hog Rider' + locationMessage: '&cHog Rider: $distance blocks away!' + deathMessage: '&aThe Hog Rider and their Hog were vanquished by $players!' + escapeMessage: '&4The Hog Rider has vanished.' +hog_rider_summon: + name: '$eventBossLevel &eLoyal Zob-Hog' +horde_champion: + name: '$eventBossLevel &cHorde Champion' + locationMessage: '&cUndead Horde Champion: $distance blocks away!' + spawnMessage: '&cAn undead horde approaches!' + deathMessage: '&aThe horde has been stopped by $players!.' + escapeMessage: '&4AThe undead horde has left!' +horrid_duplicator: + name: '$eventBossLevel &dHorrid Duplicator' + locationMessage: '&cHorrid Duplicator: $distance blocks away!' + spawnMessage: '&cAn endless foe has appeared!' + deathMessage: '&aThe Horrid Duplicator was slain by $players!' + escapeMessage: '&4The Horrid Duplicator has left!' +horrid_duplicator_summon: + name: '$eventBossLevel &dHorrid Duplicator' +horrid_duplicator_summon_1: + name: '$eventBossLevel &dHorrid Duplicator' +ice_fae: + name: '$eventBossLevel &bIce Fae' +imperial_bee_guard: + name: '$reinforcementLevel &eImperial Bee Soldier' +invasion_abducted_hoglin_leader: + name: '$normalLevel &8Abducted Hoglin Leader' +invasion_abducted_pillager_leader: + name: '$normalLevel &8Abducted Pillager Leader' +invasion_abducted_silverfish: + name: '$normalLevel &8Abducted Silverfish' +invasion_abducted_silverfish_leader: + name: '$normalLevel &8Abducted Silverfish' +invasion_abducted_zombie: + name: '$normalLevel &8Abducted Zombie' +invasion_abducted_zombie_leader: + name: '$normalLevel &8Abducted Zombie' +invasion_abductor: + name: '$normalLevel &6Abductor' +invasion_abudcted_pillager: + name: '$normalLevel &8Abducted Pillager' +invasion_analytic_thin_man_1: + name: '$normalLevel &8Analytic Thin Man' +invasion_analytic_thin_man_2: + name: '$normalLevel &8Analytic Thin Man' +invasion_analytic_thin_man_3: + name: '$normalLevel &8Analytic Thin Man' +invasion_analytic_thin_man_4: + name: '$normalLevel &8Analytic Thin Man' +invasion_ballistic_construct: + name: '$minibossLevel &fBallistic Construct' +invasion_convert: + name: '$normalLevel &6Convert' +invasion_energy_construct: + name: '$minibossLevel &fEnergy Construct' +invasion_fire_construct: + name: '$minibossLevel &fFire Construct' +invasion_genetically_modified_cow_phase_1: + name: '$minibossLevel &fGenetically Modified Cow' +invasion_genetically_modified_cow_phase_2: + name: '$minibossLevel &fGenetically Modified Cow' +invasion_gray_man_courthouse_phase_1: + name: '$minibossLevel &7Gray Man' +invasion_gray_man_courthouse_phase_2: + name: '$minibossLevel &7Gray Man' +invasion_green_man_hotel_phase_1: + name: '$bossLevel &2Green Man' +invasion_green_man_hotel_phase_2: + name: '$bossLevel &2Green Man' +invasion_green_man_hotel_phase_3: + name: '$bossLevel &2Green Man' + deathMessage: '&4The &2Green Man &4was vanquished by $players! That''s the end for this version of the map, the inside of the UFO is in the full version!' +invasion_green_man_spaceship_phase_1: + name: '$bossLevel &2Green Man' +invasion_green_man_spaceship_phase_2: + name: '$bossLevel &2Green Man' +invasion_green_man_spaceship_phase_3: + name: '$bossLevel &2Green Man' +invasion_green_man_spaceship_phase_4: + name: '$bossLevel &2Green Man' + deathMessages: + - '&e&l---------------------------------------------' + - '&2The Alien menace is no more!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' +invasion_ice_construct: + name: '$minibossLevel &fIce Construct' +invasion_merman: + name: '$normalLevel &6Merman' +invasion_merman_leader: + name: '$normalLevel &6Merman Leader' +invasion_otherwordly_ember: + name: '$normalLevel &6Otherworldly Ember' +invasion_psychic_apparition: + name: '$normalLevel &5Psychic Apparition' +invasion_psychic_clone: + name: '$reinforcementLevel &6Psychic Clone' +invasion_psychic_explosion: + name: '$reinforcementLevel &5Psychic Explosion' +invasion_psychic_summon_gold_boots: + name: '$reinforcementLevel &5Psychic Apparition' +invasion_psychic_summon_gold_pants: + name: '$reinforcementLevel &5Psychic Apparition' +invasion_psychic_summon_leather_hat: + name: '$reinforcementLevel &5Psychic Apparition' +invasion_shrieking_shulker: + name: '$normalLevel &8Shrieking Shulker' +invasion_thin_man: + name: '$normalLevel &8Thin Man' +killer_rabbit_of_caerbannog: + name: '$eventBossLevel &cKiller Rabbit of Caerbannog' +kraken: + name: '$eventBossLevel &3Kraken' +krampus: + name: '$eventBossLevel &1Krampus' + locationMessage: '&cKrampus: $distance blocks away!' + spawnMessage: '&cKrampus has come to punish the naughty!' + deathMessage: '&aKrampus has been sent back to his realm to by $players!.' + escapeMessage: '&4There was nobody to punish!' +large_hopper: + name: '$eventBossLevel &dLarge Hopper' + locationMessage: '&cLarge Hopper: $distance blocks away!' + spawnMessage: '&cA large beast is hopping around!' + deathMessage: '&aThe Large Hopper was stopped by $players!' + escapeMessage: '&4The Large Hopper has jumped out of this world!' +large_hopper_mount: + name: '$eventBossLevel &aHopper' +lightning_fae: + name: '$eventBossLevel &eLightning Fae' +living_shadow: + name: '$eventBossLevel &7Living Shadow' + locationMessage: '&cLiving Shadow: $distance blocks away!' + spawnMessage: '&cLiving Shadow has appeared! Do not look it in the yes!' + deathMessage: '&aLiving Shadow has been turned into Dead Shadow by $players!.' + escapeMessage: '&4The Living Shadow saw nothing so it left!' +meme_boss: + name: '&2The Maestro' +meme_boss_reinforcement: + name: '&cFan' +merman: + name: '$eventBossLevel &1Merman' + locationMessage: '&cMerman: $distance blocks away!' + spawnMessage: '&cA Merman swims the oceans!' + deathMessage: '&aThe Merman was slain by $players!' + escapeMessage: '&4The Merman has retreated.' +monster_of_the_deep: + name: '$eventBossLevel &bMonster of the Deep' + locationMessage: '&cMonster of the Deep: $distance blocks away!' + spawnMessage: '&cSomething terrible swims the oceans!' + deathMessage: '&aMonster of the Deep has been slain by $players!' + escapeMessage: '&4The oceans are once again safe!' +moon_spider: + name: '$eventBossLevel &fMoon Spider' + locationMessage: '&cMoon Spider: $distance blocks away!' + spawnMessage: '&cA powerful arachnid has been spotted!' + deathMessage: '&aThe Moon Spider was slain by $players!' + escapeMessage: '&4The Moon Spider has left!' +moon_spider_summon: + name: '&fSilk Mender' +necromancer: + name: '$eventBossLevel &7Necromancer' + locationMessage: '&cNecromancer: $distance blocks away!' + spawnMessage: '&cA powerful evil Necromancer has entered this world!' + deathMessage: '&aThe Necromancer is no more thanks to $players!' + escapeMessage: '&4The Necromancer has disappeared.' +necromancer_summon_1: + name: '$eventBossLevel &fFiery Bones' +necromancer_summon_2: + name: '$eventBossLevel &bChilled Bones' +necromancer_summon_3: + name: '$eventBossLevel &8Charred Bones' +necronomicon_skeleton: + name: '$reinforcementLevel &7Summoned Skeleton' +necronomicon_zombie: + name: '$reinforcementLevel &7Summoned Zombie' +netherite_golem: + name: '$eventBossLevel &8Netherite Golem' + locationMessage: '&cNetherite Golem: $distance blocks away!' + spawnMessage: '&cAn ancient golem has entered this world!' + deathMessage: '&aThe Netherite Golem was slain by $players!' + escapeMessage: '&4The Netherite Golem has left this world!' +nether_escapee: + name: '$eventBossLevel &6Nether Escapee' + locationMessage: '&cNether Escapee: $distance blocks away!' + spawnMessage: '&cA terrible foe has escaped the nether!' + deathMessage: '&aThe Nether Escapee was sent back to the nether by $players!' + escapeMessage: '&4The Nether Escapee has left this place!' +nether_hag: + name: '$eventBossLevel &4Nether Hag' + locationMessage: '&cNether Hag: $distance blocks away!' + spawnMessage: '&cAn evil hag walks the nether!' + deathMessage: '&aThe Nether Hag was slain by $players!' + escapeMessage: '&4The Nether Hag has vanished!' +nether_wasp: + name: '$eventBossLevel &6Nether Wasp' + locationMessage: '&cNether Wasp: $distance blocks away!' + spawnMessage: '&cTry not to get stung, a wasp roams the nether!' + deathMessage: '&aThe Nether Wasp was slain by $players!' + escapeMessage: '&4The Nether Wasp has decided to buzz off!' +nether_wasp_summon_1: + name: '$eventBossLevel &cHive Summoner' +nether_wasp_summon_2: + name: '$eventBossLevel &cHive Wasp' +nightwing: + name: '$eventBossLevel &cNightwing' + locationMessage: '&cNightwing: $distance blocks away!' + spawnMessage: '&cA bird of the night has appeared!' + deathMessage: '&aNightwing was stopped by $players!' + escapeMessage: '&4Nightwing has flown home.' +nightwing_summon: + name: '$eventBossLevel &cSmart Bomb' +nightwing_summon_1: + name: '$eventBossLevel &cSworn Protector' +night_crawler: + name: '$eventBossLevel &4Night Crawler' + locationMessage: '&cNight Crawler: $distance blocks away!' + spawnMessage: '&cSomething awful is crawling about!' + deathMessage: '&aThe Night Crawler has been slain by $players!' + escapeMessage: '&4The Night Crawler Undead has left!' +night_horder: + name: '$eventBossLevel &aNight Horder' + locationMessage: '&cNight Horder: $distance blocks away!' + spawnMessage: '&cA Night Horder has appeared! Slay him to loot his booty!' + deathMessage: '&aThe Night Horder has been plundered by $players!' + escapeMessage: '&4The Night Horder has escaped!' +oasis_10_old_bones: + name: '$normalLevel &fOld Bones' +oasis_10_surreptitious_scribe: + name: '$minibossLevel &7Surreptitious Scribe' +oasis_12_entombed_tenant: + name: '$normalLevel &7Entombed Tenant' +oasis_12_entombed_tenant_p2: + name: '$normalLevel &7Entombed Tenant' +oasis_12_sinister_siren: + name: '$minibossLevel &5Sinister Siren' +oasis_14_gnarly_grimace: + name: '$normalLevel &8Gnarly Grimace' +oasis_14_undead_drifter: + name: '$normalLevel &1Undead Drifter' +oasis_16_lesser_sentinel: + name: '$normalLevel &9Lesser Sentinel' +oasis_16_magical_magus: + name: '$normalLevel &3Magical Magus' +oasis_16_rancid_roamer: + name: '$normalLevel &8Rancid Roamer' +oasis_18_sly_sharpshooter: + name: '$normalLevel &eSly Sharpshooter' +oasis_18_stout_thaumaturge: + name: '$normalLevel &5Stout Thaumaturge' +oasis_18_tricky_treasure_hoarder: + name: '$normalLevel &dTricky Treasure Hoarder' +oasis_20_scheming_scribe: + name: '$minibossLevel &7Scheming Scribe' +oasis_20_septic_scribe: + name: '$minibossLevel &7Septic Scribe' +oasis_20_vampiric_sorcerer: + name: '$bossLevel &cVampiric Sorcerer' +oasis_20_wrapped_wraith: + name: '$normalLevel &8Wrapped Wraith' +oasis_20_wrapped_wraith_p2: + name: '$normalLevel &8Wrapped Wraith' +oasis_25_vampiric_warlock: + name: '$bossLevel &4Vampiric Warlock' +oasis_25_warlocks_spirit_summon: + name: '$reinforcementLevel &cWarlocks Spirit' +oasis_26_adept_sentinel: + name: '$normalLevel &1Adept Sentinel' +oasis_26_grim_grovetender: + name: '$normalLevel &aGrim Grovetender' +oasis_26_precarious_sniper: + name: '$normalLevel &3Precarious Sniper' +oasis_26_superior_sharpshooter: + name: '$normalLevel &3Superior Sharpshooter' +oasis_28_perilous_prophet: + name: '$normalLevel &3Perlious Prophet' +oasis_28_treacherous_treasure_hoarder: + name: '$normalLevel &dTreacherous Treasure Hoarder' +oasis_2_haunted_hauler: + name: '$normalLevel &9Haunted Hauler' +oasis_30_forsaken_soul: + name: '$reinforcementLevel &0Forsaken Soul' +oasis_30_lost_soul: + name: '$normalLevel Lost Soul' +oasis_30_parlous_preist: + name: '$minibossLevel &bParlous Preist' +oasis_30_seeker_of_the_staid: + name: '$normalLevel &cSeeker of the Staid' +oasis_30_wimpy_louse: + name: '$reinforcementLevel &8Loathing Louse' +oasis_32_loathing_louse: + name: '$normalLevel &8Loathing Louse' +oasis_32_skeletal_sniper: + name: '$normalLevel &9Skeletal Sniper' +oasis_34_grizly_grimace: + name: '$normalLevel &8Gnarly Grimace' +oasis_34_gruesome_grimace: + name: '$normalLevel &8Gruesome Grimace' +oasis_35_ice_eidolon: + name: '$reinforcementLevel &9Ice Eidolon' +oasis_35_light_of_darkness: + name: '$minibossLevel &9Light of Darkness' +oasis_36_cruel_cultist: + name: '$normalLevel &3Cruel Cultist' +oasis_36_cultists_cretins: + name: '$reinforcementLevel &3Cruel Cultist' +oasis_36_cultists_cretins_drowned: + name: '$reinforcementLevel &3Cruel Cultist' +oasis_36_dexterous_sentinel: + name: '$normalLevel &9Dexterous Sentinel' +oasis_36_grudging_grovetender: + name: '$normalLevel &aGrudging Grovetender' +oasis_36_parlous_sniper: + name: '$normalLevel &3Parlous Sniper' +oasis_36_rueful_roamer: + name: '$normalLevel &8Rueful Roamer' +oasis_36_spectral_magus: + name: '$normalLevel &3Spectral Magus' +oasis_38_poisonous_perch: + name: '$normalLevel &3Poisonous Perch' +oasis_38_traitorous_treasure_hoarder: + name: '$normalLevel &dTraitorous Treasure Hoarder' +oasis_40_chief_cultist: + name: '$minibossLevel &5Chief Cultist' +oasis_40_louse_lord: + name: '$minibossLevel &8Louse Lord' +oasis_40_pharaohs_scribe: + name: '$minibossLevel &7Pharaoh''s Scribe' +oasis_40_skeletal_stiff: + name: '$normalLevel &9Skeletal Stiff' +oasis_40_soaked_sacrifice: + name: '$reinforcementLevel &1Soaked Sacrifice' +oasis_40_solar_flare: + name: '$reinforcementLevel &eSolar Flare' +oasis_42_hexed_hauler: + name: '$normalLevel &9Hexed Hauler' +oasis_42_skeletal_sharpshooter: + name: '$normalLevel &9Skeletal Sharpshooter' +oasis_42_tyranical_treasure_hoarder: + name: '$normalLevel &dTyranical Treasure Hoarder' +oasis_42_tyranical_treasure_hoarder_phase_2: + name: '$normalLevel &dTyranical Treasure Hoarder' +oasis_45_golden_cast_autonomation: + name: '$reinforcementLevel &6Golden Cast Autonomation' +oasis_45_monumental_monstrosity: + name: '$bossLevel &bMonumental Monstrosity' +oasis_45_monumental_monstrosity_phase_2: + name: '$bossLevel &bMonumental Monstrosity' +oasis_45_monumental_monstrosity_phase_3: + name: '$bossLevel &6Monumental Monstrosity' +oasis_45_monumental_monstrosity_phase_4: + name: '$bossLevel &bMonumental Monstrosity' +oasis_45_oracle_of_knowledge: + name: '$minibossLevel &0Oracle of Knowledge' +oasis_45_shadow_of_knowledge_summon: + name: '$reinforcementLevel &8Shadow of Knowledge' +oasis_45_the_beacon: + name: '$minibossLevel &6The Beacon' +oasis_45_the_beacon_phase_2: + name: '$minibossLevel &6The Beacon' +oasis_45_the_beacon_phase_3: + name: '$minibossLevel &6The Beacon' +oasis_45_the_beacon_phase_4: + name: '$minibossLevel &6The Beacon' +oasis_46_pharaohs_sentinel: + name: '$normalLevel &9Pharaoh''s Sentinel' +oasis_4_cursed_desert_dweller: + name: '$normalLevel &eCursed Desert Dweller' +oasis_4_grotesque_grimace: + name: '$normalLevel &8Grotesque Grimace' +oasis_4_swamp_rat: + name: '$normalLevel &6Swamp Rat' +oasis_50_moneychanger_arrow: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_arrow_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_blindness: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_blindness_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_fire: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_fire_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_freeze: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_freeze_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_knockback: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_knockback_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_poison: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_poison_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_wither: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_wither_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_pharaohs_royal_guard: + name: '$reinforcementLevel &8Pharaoh''s Royal Guard' +oasis_50_the_foundry: + name: '$bossLevel &4The Foundry' +oasis_50_the_foundry_phase_2: + name: '$bossLevel &4The Foundry' +oasis_55_pharaoh_of_pestilence: + name: '$bossLevel &0Pharaoh of Pestilence' +oasis_6_dry_bones: + name: '$normalLevel &fDry Bones' +oasis_6_rotten_roamer: + name: '$normalLevel &8Rotten Roamer' +oasis_8_mythical_magus: + name: '$normalLevel &3Mythical Magus' +oasis_8_tough_thaumaturge: + name: '$normalLevel &5Tough Thaumaturge' +oasis_8_troublesome_treasure_hoarder: + name: '$normalLevel &dTroublesome Treasure Hoarder' +okami: + name: '$eventBossLevel &cOkami' + locationMessage: '&cOkami: $distance blocks away!' + spawnMessage: '&cA god has awakened!' + deathMessage: '&a$players has fought with a god and won!.' + escapeMessage: '&4Okami has left!' +okami_p2: + name: '$eventBossLevel &cOkami' +okami_p3: + name: '$eventBossLevel &cOkami' +omega_wolf: + name: '$reinforcementLevel &7Omega Wolf' +pillager_caravan_beast: + name: '$reinforcementLevel &cCaravan Beast' +pillager_caravan_guard: + name: '$reinforcementLevel &cCaravan Guard' +pillager_caravan_leader: + name: '$eventBossLevel &cPillager Caravan Leader' + locationMessage: '&cPillager Caravan: $distance blocks away!' + spawnMessage: '&cA pillager caravan has been sighted!' +primis_acolyte_brute: + name: '$normalLevel &bAcolyte Brute' +primis_acolyte_forest_brute: + name: '$normalLevel &bElf Bandit Brute' +primis_acolyte_forest_brute_with_watch: + name: '$normalLevel &bElf Bandit Brute' +primis_acolyte_forest_sharpshooter: + name: '$normalLevel &bElf Bandit Ranger' +primis_acolyte_forest_summoner: + name: '$normalLevel &bElf Bandit Summoner' +primis_acolyte_forest_summoner_heirloom_guardian: + name: '$normalLevel &bElf Bandit Mage' +primis_acolyte_guard_1: + name: '$normalLevel &bAcolyte Guard' + onDamagedMessages: + - You can't enter! + - The mage won't allow this! + - Leave this place! + - The mage protects this place! + - Foolishness! + - Begone! + deathMessage: '[Acolyte Guard] You are blind to the truth, the tower''s mage sees all!' +primis_acolyte_guard_2: + name: '$normalLevel &bAcolyte Guard' + onDamagedMessages: + - You can't enter! + - The mage won't allow this! + - Leave this place! + - The mage protects this place! + - Foolishness! + - Begone! + deathMessage: '[Acolyte Guard] You shall not pass, the mage in the tower will not allow it!' +primis_acolyte_sharpshooter: + name: '$normalLevel &bAcolyte Ranger' +primis_aggressive_llama: + name: '$normalLevel &6Aggressive LLama' +primis_angry_goat: + name: '$normalLevel &6Angry Goat' +primis_beta_feral_wolf: + name: '$reinforcementLevel &8Beta Feral Wolf' +primis_blood_temple_blood_golem: + name: '$normalLevel &cBlood Golem' +primis_blood_temple_charred_construct: + name: '$normalLevel &cCharred Construct' +primis_blood_temple_conjured_flame: + name: '$normalLevel &cConjured Flame' +primis_blood_temple_eradicator: + name: '$normalLevel &cEradicator' +primis_blood_temple_fire_conjurer: + name: '$normalLevel &cFire Conjurer' +primis_blood_temple_flame_elemental: + name: '$normalLevel &cFlame Elemental' +primis_catacomb_nemus_to_redwood_archer: + name: '$normalLevel &8Catacomb Archer' +primis_catacomb_nemus_to_redwood_golem: + name: '$normalLevel &bCatacomb Golem' +primis_catacomb_nemus_to_redwood_necromancer: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_nemus_to_redwood_necromancer_p1: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_nemus_to_redwood_necromancer_p2: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_nemus_to_redwood_soul_reinforcement: + name: '$reinforcementLevel &8Catacomb Soul' +primis_catacomb_nemus_to_redwood_swordsman: + name: '$normalLevel &8Catacomb Swordsman' +primis_catacomb_pontis_to_ice_archer: + name: '$normalLevel &8Catacomb Archer' +primis_catacomb_pontis_to_ice_golem: + name: '$normalLevel &bCatacomb Golem' +primis_catacomb_pontis_to_ice_necromancer_p1: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_pontis_to_ice_necromancer_p2: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_pontis_to_ice_swordsman: + name: '$normalLevel &8Catacomb Swordsman' +primis_catacomb_trio_archer: + name: '$normalLevel &8Catacomb Archer' +primis_catacomb_trio_golem: + name: '$normalLevel &bCatacomb Golem' +primis_catacomb_trio_necromancer_p1: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_necromancer_p2: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_necromancer_summon: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_swordsman: + name: '$normalLevel &8Catacomb Swordsman' +primis_crazed_rabbit: + name: '$normalLevel &cCrazed Rabbit' +primis_crystaline_summoner_p1: + name: '$normalLevel &3Crystaline Summoner' +primis_crystaline_summoner_p2: + name: '&3Crystaline Summoner' +primis_earth_temple_golem: + name: '$normalLevel &fAnimated Clay' +primis_emerald_eater: + name: '$normalLevel &aEmerald Eater' +primis_farmstead_lighthouse_keeper: + name: '$bossLevel &6The Lighthouse Keeper' + questLore: + - Something is deeply wrong with my husband. + - He used to be a loving and caring husband and father, + - but in recent times he has been focusing on documents he found in the basement. + - He said it was for important research, something that could change the world. + - I should've told him to stop when I saw how obsessed he was becoming. + - He did... something... to the lighthouse - and + - I fear the lighthouse has done something to him, too. + - It morphed him into some kind of monster. He no longer recognizes us, + - and has even attacked us when we tried to approach him. + - At night, we can't sleep due to the wailing sounds + - coming from the &dLighthouse's Basement&f. + - He is suffering, and we are powerless to help him. + - I know it's asking a lot, but do you think you could help us? + questAcceptDialog: + - '&a[Amavit]&f Thank you so much for accepting our request. I hope with all my heart you succeed.' + - '&7&oI should go to the &dBasement of the Lighthouse&7&o and put the &cLighthouse Keeper&7&o out of his misery.' + questCompleteMessage: + - '&a[Amavit]&f I heard it - so it is done? Did he suff- no, forget it, I don''t want to know.' + - '&fIt seems like the lighthouse started emitting an odd light when you... dealt with the issue. We need to make sure it is not an issue.' + - '&7&oSeems like &aAmavit&7&o has another task for me. I should talk to her.' +primis_feral_alpha_wolf: + name: '$normalLevel &8Feral Alpha Wolf' +primis_feral_wolf: + name: '$normalLevel &8Feral Wolf' +primis_feral_wolf_scout: + name: '$normalLevel &8Feral Wolf Scout' +primis_gladius_admiral: + name: '$normalLevel &fInvading Admiral' +primis_gladius_assassin: + name: '$normalLevel &fInvading Assassin' +primis_gladius_barkeep_p1: + name: '$minibossLevel &6The Barkeep' +primis_gladius_barkeep_p2: + name: '$minibossLevel &6The Barkeep' +primis_gladius_captain: + name: '$normalLevel &fInvading Captain' +primis_gladius_champion_p1: + name: '$bossLevel &6Fallen Champion Natus' +primis_gladius_champion_p2: + name: '$bossLevel &6Fallen Champion Natus' +primis_gladius_gatekeeper_p1: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_gatekeeper_p2: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_gatekeeper_pontis_p1: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_gatekeeper_pontis_p2: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_longbowman: + name: '$normalLevel &fInvading Longbowman' +primis_gladius_mariner: + name: '$normalLevel &fInvading Mariner' +primis_gladius_mariner_quest: + name: '$normalLevel &fInvading Mariner' +primis_gladius_monk_p1: + name: '$minibossLevel &6The Monk' +primis_gladius_monk_p2: + name: '$minibossLevel &6The Monk' +primis_gladius_raider: + name: '$normalLevel &fInvading Raider' +primis_gladius_swordsman: + name: '$normalLevel &fInvading Swordsman' +primis_gladius_undead_buccaneer: + name: '$normalLevel &fUndead Buccaneer' +primis_gladius_undead_captain: + name: '$minibossLevel &fUndead Captain' +primis_gladius_undead_swashbuckler: + name: '$normalLevel &fUndead Swashbuckler' +primis_gladius_underlord: + name: '$minibossLevel &0Underlord' +primis_gladius_villager: + name: '$normalLevel &fUndead Villager' +primis_goblin_fowl_warrior: + name: '$minibossLevel &6Cursed Fowl Goblin' +primis_goblin_grunt: + name: '$normalLevel &6Goblin Grunt' +primis_goblin_king: + name: '$bossLevel &2Goblin King' +primis_goblin_piranah: + name: '$normalLevel &9Goblin Piranah' +primis_goblin_spearman: + name: '$normalLevel &6Goblin Spearman' +primis_goblin_warrior: + name: '$normalLevel &6Goblin Warrior' +primis_ice_mage: + name: '$minibossLevel &9Ice Mage' +primis_ice_mage_p2: + name: '$minibossLevel &bIce Mage' + deathMessage: '&8&oYou hear the sound of a nearby ice wall cracking and breaking...' +primis_ice_village_annoyed_goat: + name: '$normalLevel &bAnnoyed Goat' +primis_ice_village_bell_banger: + name: '$minibossLevel &6Undead' + questLore: + - Do you see that? There, look at that bell + - tower in the village. + - You see it too, right? The feller there + - banging his head on the bell. + - I am pretty sure that's what's going on, + - unless my vision is failing me. + - Could you go investigate and report back + - to me what you found. + questAcceptDialog: + - '&a[Eleusium Festus]&f What is going on...' + - '&7&oI should go see what is happening at the &d&oIce Village Bell Tower&7&o.' + questCompleteMessage: + - '&a[Eleusium Festus]&f You found an undead banging their head on the bell...' + - Well now I have heard it all... +primis_ice_village_escaped_prisoner: + name: '$normalLevel &bEscaped Prisoner' +primis_ice_village_fallen_trial_warrior_summon: + name: '$reinforcementLevel &7Enslaved Soul' +primis_ice_village_frost_fur_ursus: + name: '$normalLevel &9Frost Fur Ursus' +primis_ice_village_frost_simulacrum: + name: '$normalLevel &3Frost Simulacrum' +primis_ice_village_ice_simulacrum: + name: '$reinforcementLevel &3Ice Simulacrum' +primis_ice_village_manifested_nightmare: + name: '$normalLevel &bManifested Nightmare' +primis_ice_village_meek_customer: + name: '$normalLevel &cMeek Customer' +primis_ice_village_naughty_customer: + name: '$normalLevel &cNaughty Customer' +primis_ice_village_screecher_bomb_summon: + name: '$reinforcementLevel &dScreecher Droppings' +primis_ice_village_sky_screecher: + name: '$normalLevel &bSky Screecher' +primis_ice_village_the_ice_aspect: + name: '$minibossLevel &9Ice Aspect' +primis_ice_village_the_ice_elemental: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_the_ice_elemental_p2: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_the_ice_elemental_p3: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_trial_of_ice_minor_ice_elemental: + name: '$minibossLevel &bMinor Ice Elemental' +primis_ice_village_wolf_summon: + name: '$reinforcementLevel &cTamed Wolf' +primis_minor_ice_elemental: + name: '$bossLevel &1Minor Ice Elemental' +primis_minor_ice_elemental_p2: + name: '$bossLevel &1Minor Ice Elemental' +primis_mountain_pass_guardian_p1: + name: '$bossLevel &6The Guardian' +primis_mountain_pass_guardian_p2: + name: '$bossLevel &6The Guardian' +primis_mountain_pass_healer: + name: '$reinforcementLevel &fRepairtron' +primis_nasty_worm: + name: '$normalLevel &fNasty Worm' +primis_ogre_mines_mite: + name: '$normalLevel &fMine Mite' +primis_ogre_mines_ogre_archer: + name: '$minibossLevel &fOgre Archer' +primis_ogre_mines_ogre_magi: + name: '$minibossLevel &fOgre Magi' +primis_ogre_mines_ogre_warrior: + name: '$minibossLevel &fOgre Warrior' +primis_ogre_mines_undead_archer: + name: '$normalLevel &fUndead Archer' +primis_ogre_mines_undead_swordsman: + name: '$normalLevel &fUndead Swordsman' +primis_pontis_beast_cod: + name: '$minibossLevel &dBeast Cod Furiosa' +primis_pontis_beast_crawler: + name: '$minibossLevel &dCrawler Beast Megdun' +primis_pontis_beast_impaler: + name: '$minibossLevel &dImpaler Beast Uladzimir' +primis_pontis_counselor_guard_left_1: + name: '$normalLevel &4Corrupt Counselor Guard' +primis_pontis_counselor_guard_left_2: + name: '$normalLevel &4Warped Counselor Guard' + deathMessage: '&5[Counselor Machiavelli]&f So that fool must have finally figured it out...' +primis_pontis_counselor_guard_left_3: + name: '$normalLevel &4Uplifted Experiment' + deathMessage: '&5[Counselor Machiavelli]&f You''re stronger than I thought.' +primis_pontis_counselor_guard_left_4: + name: '$normalLevel &4Abomination' + deathMessage: '&5[Counselor Machiavelli]&f My soul magic will protect me!!!' +primis_pontis_counselor_guard_mid: + name: '$normalLevel &4Corrupt Counselor Guard' + deathMessage: '&8[Counselor Machiavelli]&f I see that we have guests!...' +primis_pontis_counselor_guard_right_1: + name: '$normalLevel &4Corrupt Counselor Guard' +primis_pontis_counselor_guard_right_2: + name: '$normalLevel &4Warped Counselor Guard' +primis_pontis_counselor_guard_right_3: + name: '$normalLevel &4Uplifted Experiment' +primis_pontis_counselor_guard_right_4: + name: '$normalLevel &4Abomination' +primis_pontis_counselor_twisted_copy: + name: '$reinforcementLevel &4Twisted Copy' +primis_pontis_mille_arena_air_elemental: + name: '$minibossLevel &fAir Elemental' +primis_pontis_mille_arena_human_wave_4: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_6: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_7: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_8: + name: '$normalLevel &4Dominated Human Warrior' +primis_pontis_mille_arena_human_worshiper: + name: '$normalLevel &4Elemental Worshiper' +primis_pontis_mille_arena_minor_air_elemental: + name: '$normalLevel &fMinor Air Elemental' +primis_pontis_mille_arena_minor_earth_elemental: + name: '$normalLevel &7Minor Earth Elemental' +primis_pontis_mille_arena_minor_fire_elemental: + name: '$normalLevel &eMinor Fire Elemental' +primis_pontis_mille_arena_minor_fire_elemental_prime: + name: '$normalLevel &eMinor Fire Elemental' +primis_pontis_mille_arena_minor_water_elemental: + name: '$normalLevel &bMinor Water Elemental' +primis_pontis_mille_arena_primal_air_wisp: + name: '$normalLevel &fPrimal Air Wisp' +primis_pontis_mille_arena_primal_air_wisp_2: + name: '$normalLevel &fPrimal Air Wisp' +primis_pontis_mille_arena_primal_earth_wisp: + name: '$normalLevel &7Primal Earth Wisp' +primis_pontis_mille_arena_primal_earth_wisp_2: + name: '$normalLevel &7Primal Earth Wisp' +primis_pontis_mille_arena_primal_fire_wisp: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_fire_wisp_2: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_fire_wisp_3: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_water_wisp: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_water_wisp_2: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_water_wisp_3: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_wisp: + name: '$normalLevel &5Primal Wisp' +primis_pontis_mille_arena_water_elemental: + name: '$minibossLevel &1Water Elemental' +primis_pontis_mille_counselor_p1: + name: '$minibossLevel &fCounselor Machiavelli' +primis_pontis_mille_counselor_p2: + name: '$minibossLevel &fCounselor Machiavelli' +primis_pontis_mille_counselor_p3: + name: '$minibossLevel &fCounselor Machiavelli' +primis_pontis_mille_fields_babe_razorback: + name: '$normalLevel &2Babe Razorback' +primis_pontis_mille_fields_bird: + name: '$normalLevel &fFeathered Field Rat' +primis_pontis_mille_fields_bird_nightmare: + name: '$normalLevel &dFeathered Nightmare Rat' +primis_pontis_mille_fields_bubba: + name: '$minibossLevel &cBig ol'' Bubba' +primis_pontis_mille_fields_field_rat: + name: '$normalLevel &fField Rat' +primis_pontis_mille_fields_juvenile_razorback: + name: '$normalLevel &2Juvenile Razorback' +primis_pontis_mille_fields_longhorn: + name: '$normalLevel &4Fields Longhorn' +primis_pontis_mille_fields_mature_razorback: + name: '$normalLevel &2Mature Razorback' +primis_pontis_mille_fields_shorthorn: + name: '$normalLevel &6Fields Shorthorn' +primis_pontis_mille_fields_two_legged_terror: + name: '$normalLevel &2Two Legged Terror' +primis_pontis_mille_fields_well_fed_rat: + name: '$normalLevel &fWell Fed Rat' +primis_pontis_mille_rat: + name: '$normalLevel &fRat' +primis_quartz_elemental: + name: '$bossLevel &dQuartz Elemental' +primis_quartz_elemental_p2: + name: '$bossLevel &dQuartz Elemental' +primis_redwood_barracuda: + name: '$normalLevel &3Redwood Barracuda' +primis_redwood_fruity_hound: + name: '$normalLevel &2Fruity Hound' +primis_redwood_rockhound: + name: '$normalLevel &7Redwood Rockhound' +primis_redwood_werewolf_grunt: + name: '$normalLevel &cRedwood Werewolf Grunt' +primis_redwood_werewolf_packleader: + name: '$normalLevel &4Redwood Werewolf Packleader' +primis_river_guardian: + name: '$normalLevel &5River Guardian' +primis_roofed_forest_cave_spider: + name: '$normalLevel &6Nest Crawler' +primis_roofed_forest_cave_spider_boss: + name: '$bossLevel &eBrood Mother' +primis_roofed_forest_spider: + name: '$normalLevel &6Forest Crawler' +primis_roofed_forest_spider_reinforcement: + name: '$reinforcementLevel &6Nest Brood' +primis_sea_monster: + name: '$bossLevel &dSea Monster' +primis_sewer_noxious_ninja: + name: '$normalLevel &2Noxious Ninja' +primis_sewer_spore_spreader: + name: '$normalLevel &4Spore Spreader' +primis_sewer_the_shredder_p1: + name: '$bossLevel &5The Shredder' +primis_sewer_the_shredder_p2: + name: '$bossLevel &5The Shredder' +primis_storm_temple_axeman: + name: '$normalLevel &dStorm Temple Axeman' +primis_storm_temple_bowman: + name: '$normalLevel &dStorm Temple Bowman' +primis_storm_temple_kuzco: + name: '$normalLevel &6Kuzco' +primis_storm_temple_minor_storm_elemental: + name: '$normalLevel &5Minor Storm Elemental' +primis_storm_temple_storm_elemental: + name: '$bossLevel &1Storm Elemental' +primis_storm_temple_storm_elemental_p2: + name: '$bossLevel &1Storm Elemental' +primis_storm_temple_storm_elemental_p3: + name: '$bossLevel &1Storm Elemental' +primis_storm_temple_summoner: + name: '$normalLevel &5Storm Temple Summoner' +primis_terravilla_alpha_razorback: + name: '$minibossLevel &2Alpha Razorback' +primis_terravilla_alpha_razorback_p2: + name: '$minibossLevel &2Alpha Razorback' +primis_terravilla_bar_brawler: + name: '$normalLevel &6Bar Brawler' + onDamagedMessages: + - That all ya got! + - I did not even feel that! + - Why...you! + - I will show you! + - Who the heck are you! + - TAKE THAT! +primis_terravilla_earth_elemental: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_earth_elemental_p2: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_earth_elemental_p3: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_regular_fish: + name: '$normalLevel &bRegular Fish' +primis_terravilla_robber_gladiator: + name: '$normalLevel &bRobber Gladiator' +primis_terravilla_robber_slugger: + name: '$normalLevel &bSlugger' +primis_undead_archer: + name: '$normalLevel &fUndead Archer' +primis_undead_climber: + name: '$normalLevel &0Undead Climber' +primis_undead_grappler: + name: '$normalLevel &3Undead Grappler' +primis_undead_guardian: + name: '$normalLevel &bUndead Guardian' +primis_undead_swordsman: + name: '$normalLevel &0Undead Swordsman' +pufferfish: + name: '$eventBossLevel &3Pufferfish' + locationMessage: '&cPufferfish: $distance blocks away!' + spawnMessage: '&cA puffed fish is swimming in the oceans!' + deathMessage: '&aThe Pufferfish reign has been ended by $players!' + escapeMessage: '&4The Pufferfish has swam away!' +pufferfish_summon_1: + name: '$eventBossLevel &bPooferfish' +pufferfish_summon_2: + name: '$eventBossLevel &bPooperfish' +pufferfish_summon_3: + name: '$eventBossLevel &bPooderfish' +pufferfish_summon_4: + name: '$eventBossLevel &bPudderfish' +queen_bee: + name: '$eventBossLevel &6Queen Bee' +rabbit_wolf_1: + name: '$eventBossLevel &cFlame Wolf' + locationMessage: '&cFlame: $distance blocks away!' + spawnMessage: '&cA powerful duo has come to this world!' + deathMessage: '&aThe Wolf and the Rabbit were stopped by $players!' + escapeMessage: '&4The Wolf and the Rabbit have left this place!' +rabbit_wolf_2: + name: '$eventBossLevel &cLightning Rabbit' + locationMessage: '&cLightning: $distance blocks away!' + deathMessage: '&aThe Wolf and the Rabbit were stopped by $players!' + escapeMessage: '&4The Wolf and the Rabbit have left this place!' +raug: + name: '$reinforcementLevel &4Raug' +regular_hoglin: + name: '$eventBossLevel &4Regular Hoglin' + locationMessage: '&cRegular Hoglin: $distance blocks away!' + spawnMessage: '&cA Regular Hoglin has arrived! Nothing special about this Hoglin!' + deathMessage: '&aRegular Hoglin was slain by $players!.' + escapeMessage: '&4The Regular Hoglin has left!' +rotting_diver: + name: '$eventBossLevel &bRotting Diver' + locationMessage: '&cRotting Diver: $distance blocks away!' + spawnMessage: '&cA foul corpse floats in the waters!' + deathMessage: '&aThe Rotting Diver was sent to the depths by $players!' + escapeMessage: '&4The Rotting Diver floated away!' +salty_corpse: + name: '$eventBossLevel &bSalty Corpse' + locationMessage: '&cSalty Corpse: $distance blocks away!' + spawnMessage: '&cSomething awful has floated up to the surface!' + deathMessage: '&aThe Salty Corpse was sent back to the depths by $players!' + escapeMessage: '&4The Salty Corpse has left!' +skeleton_knight: + name: '$eventBossLevel &fSkeleton Knight' + locationMessage: '&cSkeleton Knight: $distance blocks away!' + spawnMessage: '&cThe undead have sent a Skeleton Knight into the night!' + deathMessage: '&aThe Skeleton Knight was slain by $players!' + escapeMessage: '&4The Skeleton Knight had to retreat!' +sky_archer: + name: '$eventBossLevel &aSky Archer' + locationMessage: '&cSky Archer: $distance blocks away!' + spawnMessage: '&cA Sky Archer has entered this world! Bring your bow!' + deathMessage: '&aThe Sky Archer got sniped by $players!' + escapeMessage: '&4The Sky Archer has flown away!' +sky_archer_mount: + name: '$eventBossLevel &aSky Steed' +smallstack: + name: '$eventBossLevel &bSmallstack Top' + locationMessage: '&cSmallstack: $distance blocks away!' + spawnMessage: '&cA Smallstack is roaming the wilds!' + deathMessage: '&aThe Smallstack was unstacked by $players!' + escapeMessage: '&4The Smallstack has left!' +smallstack_1: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_2: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_3: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_4: + name: '$eventBossLevel &bSmallstack Bottom' +smallstack_5: + name: '$eventBossLevel &bSmallstack Bottom' +smallstack_6: + name: '$eventBossLevel &bSmallstack Carrier' +snoopy: + name: '&6{&4☠&6} &fSnoopy' + onDamageMessages: + - Woof! + onDamagedMessages: + - Woof! + spawnMessage: '&aAn extremely rare Snoopy has been sighted!' +sorcerer_supreme: + name: '$eventBossLevel &5Sorcerer Supreme' + locationMessage: '&cSorcerer Supreme: $distance blocks away!' + spawnMessage: '&cAn almighty Sorcerer has phased into this world!' + deathMessage: '&aThe Sorcerer Supreme was defeated by $players!' + escapeMessage: '&4The Sorcerer Supreme has left this world!' +sorcerer_supreme_summon: + name: '$eventBossLevel &5Eternal Servant' +spider_knight: + name: '$eventBossLevel &aDwarven Knight' + locationMessage: '&cDwarven Knight: $distance blocks away!' + spawnMessage: '&cA Knight has come to challenge the heroes of this place!' + deathMessage: '&aThe Knight was defeated by $players!' + escapeMessage: '&4The Knight has left this place!' +spider_knight_mount: + name: '$eventBossLevel &aFaithful Steed' +summonable_wolf: + name: '$normalLevel Wolfy' + onDamageMessages: + - Woof! + onDamagedMessages: + - Woof! +super_mite: + name: '$eventBossLevel &dSuper Mite' + locationMessage: '&cSuper Mite: $distance blocks away!' + spawnMessage: '&cA trouble maker appears!' + deathMessage: '&aThe mite could not handle a fight with $players!.' + escapeMessage: '&4The Super Mite left out of boredom!' +super_mite_summon: + name: '$eventBossLevel &dFriendmite' +suspicious_phantom: + name: '$eventBossLevel &eSuspicious Phantom' + locationMessage: '&cSuspicious Phantom: $distance blocks away!' + spawnMessage: '&cA Suspicious Phantom was sighted in the skies!' + deathMessage: '&aThe Phantom was put to bed by $players!' + escapeMessage: '&4The Suspicious Phantom has left!' +suspicious_phantom_summon: + name: '$eventBossLevel &cFlamer' +suspicious_phantom_summon_1: + name: '$eventBossLevel &cFireballer' +test_boss: + name: '$eventBossLevel &6Test boss' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Test Boss has been debugged!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - I've hit you! + onDamagedMessages: + - I've been hit! + locationMessage: 'Test entity: $distance' + spawnMessage: A test boss has been spawned! + deathMessage: A test boss has been slain by $players! + escapeMessage: A test boss entity has escaped! +airship_tier_45_knockback: + name: '$normalLevel &2Bow Bowsman' +airship_tier_45_witherblind: + name: '$normalLevel &aNoxious Bowsman' +airship_tier_50_powder_monkeys: + name: '$normalLevel &7Powder Monkey' +airship_tier_50_scourge: + name: '$normalLevel &8Swashbuckling Scourge' +airship_tier_60_mess_hall_mate: + name: '$normalLevel &bMess Hall Mate' +airship_tier_65_boatswain_boss: + name: '$normalLevel &cBoatswain Boss' +airship_tier_65_bodyguard: + name: '$normalLevel &eBuccaneer Bodyguard' +airship_tier_65_silverfish: + name: '$normalLevel &8Ship Rat' +airship_tier_65_silverfish_reinforcement: + name: '$reinforcementLevel &8Ship Mouse' +airship_tier_70_miniboss: + name: '$minibossLevel Quark the Quartermaster ' +airship_tier_70_miniboss_2: + name: '$minibossLevel &6Living Boiler' +airship_tier_70_miniboss_wayfinder: + name: '$minibossLevel &3Wharf Wayfinder' +airship_tier_75_boss: + name: '$bossLevel &4Captain Davey' + deathMessages: + - '&e&l---------------------------------------------' + - '&9Captain Davey was put to rest! ... again.' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Captain Davey: $distance' + spawnMessage: '&4Captain Davey haunts the skies once more!' + deathMessage: '$players &ahave made &4Captain Davey &ashuffle off his mortal coil!' + escapeMessage: '&6Captain Davey has moved on the haunt another day!' +binder_of_worlds_phase_1: + name: '$eventBossLevel &eBinder of Worlds' + spawnMessage: '&5The binder of worlds approaches!' +binder_of_worlds_phase_1_melee_miniboss: + name: '$reinforcementLevel &9Reality Uprooter' +binder_of_worlds_phase_1_melee_reinforcement: + name: '$reinforcementLevel &8Reality Waster' +binder_of_worlds_phase_1_parkour_reinforcement: + name: '$reinforcementLevel &2Reality Harbinger' +binder_of_worlds_phase_1_ranged_miniboss: + name: '$reinforcementLevel &3Reality Ruiner' +binder_of_worlds_phase_1_ranged_reinforcement: + name: '$reinforcementLevel &6Reality Ruiner' +binder_of_worlds_phase_1_status_miniboss: + name: '$reinforcementLevel &1Reality Wrencher' +binder_of_worlds_phase_1_status_reinforcement: + name: '$reinforcementLevel &7Reality Rupturer' +binder_of_worlds_phase_2: + name: '$eventBossLevel &eBinder of Worlds' +binder_of_worlds_phase_3: + name: '$eventBossLevel &eBinder of Worlds' +binder_of_worlds_phase_3_shulker_reinforcement: + name: '$reinforcementLevel &5Reality Riftrender' +binder_of_worlds_phase_4: + name: '$eventBossLevel &eBinder of Worlds' + deathMessages: + - '&e&l---------------------------------------------' + - '&9The binder is bound to this mortal plane no more!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' +catacombs_tier_10_miniboss: + name: '$minibossLevel &7Terragog' +catacombs_tier_15_boss: + name: '$bossLevel &6The Rattler' + deathMessages: + - '&e&l---------------------------------------------' + - '&9The Rattler rattled away!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Feeling.. rattled? + - Show me your skeleton! + - You're boned! + - Your calcium is weak! + onDamagedMessages: + - I felt that in my bones! + - I've got a bone to pick with you! + - Doot doot mr skeltal + - I need calcium! + locationMessage: 'The Rattler: $distance blocks away!' + spawnMessage: '&6The Rattler rises!' + deathMessage: '&aThe Rattler has been defeated by $players!' +catacombs_tier_15_mimic_boss: + name: '$bossLevel &6The Forgotten' +catacombs_tier_15_reinforcement: + name: '$reinforcementLevel &eUnturned' +catacombs_tier_5_evoker_guard_2: + name: '$normalLevel &7Catacomb Guard' + onDamageMessages: + - No entry! + - Entry is forbidden! +catacombs_tier_5_illusioner_guard_1: + name: '$normalLevel &7Catacomb Guard' + onDamageMessages: + - No entry! + - Entry is forbidden! +colosseum_tier_70_boss_mount: + name: '$bossLevel &4Pit Lord' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Pit Lord is no more!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + deathMessage: '&2The Pit Lord has been vanquished by $players!' +colosseum_tier_70_boss_p1: + name: '$bossLevel &cPit Master' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Pit Master has fallen!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Pit Master: $distance blocks away!' + spawnMessage: '&4The Pit Master charges into battle once more!' + deathMessage: '&2The Pit Master has been slain by $players!' +colosseum_tier_70_boss_p2: + name: '$bossLevel &cPit Master' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Pit Master has fallen!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Pit Master: $distance blocks away!' + deathMessage: '&2The Pit Master has been slain by $players!' +colosseum_tier_70_boss_reinforcements_p1: + name: '$reinforcementLevel &6Gladiator' +colosseum_tier_70_boss_reinforcements_p2: + name: '$reinforcementLevel &6Gladiator' +colosseum_tier_70_gladiator: + name: '$normalLevel &6Gladiator' +colosseum_tier_70_mount_reinforcements: + name: '$reinforcementLevel &cPit Beast' +dark_cathedral_tier_75_boss: + name: '$bossLevel &4Cultist of Cthulhu' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The summoning has been interrupted!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Fools! + - Chtulhu R'lyeh! + - None can defeat Chtulhu! + - Stare into the abyss... + locationMessage: 'Cultist of Cthulhu: $distance blocks away' + spawnMessage: '&cA dark cultist is summoning Cthulhu!' + deathMessage: '&2The summoning has been thwarted $players!' + escapeMessage: '&2The cultist has completed the summoning!' +dark_cathedral_tier_75_reinforcement: + name: '$reinforcementLevel Follower of Cthulhu' + onDamageMessages: + - Cthulhu R'lyeh + onDamagedMessages: + - Cthulhu R'lyeh +darkspire_level_100_berserker_brute: + name: '$normalLevel &7Underworld Berserker' +darkspire_level_100_berserker_reanimated: + name: '$normalLevel &fReanimated Underworld Berserker' +darkspire_level_100_blacksmith_brute: + name: '$normalLevel &eSmoldering Goldsmith' +darkspire_level_100_endermite: + name: '$normalLevel &5Voidcrawler' +darkspire_level_100_marksman_piglin: + name: '$normalLevel &9Foolish Marksman' +darkspire_level_100_sentry_brute: + name: '$normalLevel &3Darkguard Sentry' +darkspire_level_100_summon_blaze: + name: '$reinforcementLevel &cHellspawn' +darkspire_level_100_summon_evoker: + name: '$reinforcementLevel &cFalse Hellraiser' +darkspire_level_100_summon_ghast: + name: '$reinforcementLevel &7Maalkvvhar' +darkspire_level_100_summon_husk: + name: '$reinforcementLevel &cOroxak''s Corrupted' +darkspire_level_100_summon_ravager: + name: '$reinforcementLevel &cEerbix the Fallen' +darkspire_level_100_summon_skeleton: + name: '$reinforcementLevel &cRibling' +darkspire_level_110_berserker_reanimated: + name: '$normalLevel &7Reanimated Underworld Berserker' +darkspire_level_110_marksman_reanimated: + name: '$normalLevel &9Reanimated Foolish Marksman' +darkspire_level_110_necromancer_evoker: + name: '$normalLevel &8Black-Hearted Enchanter' +darkspire_level_110_sentry_reanimated: + name: '$normalLevel &3Reanimated Darkguard Sentry' +darkspire_level_110_stationary_stray: + name: '$normalLevel &6Hewn Watchman' +darkspire_level_120_miniboss_evoker: + name: '$minibossLevel &4Hellraiser' +darkspire_level_120_miniboss_illusioner: + name: '$minibossLevel &4Maalkv' +darkspire_level_120_miniboss_skeleton: + name: '$minibossLevel &4Crypt Keeper' +darkspire_level_120_miniboss_stray: + name: '$minibossLevel &4Nicolas Ribcage' +darkspire_level_120_miniboss_vindicator: + name: '$minibossLevel &4Zalmur the Impslayer' +darkspire_level_120_miniboss_wither_skeleton: + name: '$minibossLevel &4Oroxak' +darkspire_level_120_summon_zoglin: + name: '$reinforcementLevel &cArzags Horde' +darkspire_level_130_miniboss_phase_brute: + name: '$bossLevel &4Arzag the Beast' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Arzag the Beast''s invasion has been stopped!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' +darkspire_level_130_miniboss_zoglin: + name: '$bossLevel &4Arzag the Beast' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Arzag the Beast''s invasion has been stopped!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Arzag the Beast: $distance blocks away' + spawnMessage: '&4Arzag the Beast prepares for the invasion!' + escapeMessage: '&cArzag the Beast is done plundering!' +darkspire_level_80_summon_blaze: + name: '$reinforcementLevel &dFalse Hellspawn' +fireworks_level_50_boss_phase_1: + name: '$eventBossLevel &cSparky' + spawnMessage: '&eSparks fill the sky!' +fireworks_level_50_boss_phase_2: + name: '$eventBossLevel &cSparky' +fireworks_level_50_boss_phase_3: + name: '$eventBossLevel &cSparky' + deathMessages: + - '&e&l---------------------------------------------' + - '&eSparky''s out, party''s over!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&6Sparky returns to celebrate!' +fireworks_phase_2_reinforcement: + name: '$eventBossLevel &cBoomi' +fireworks_phase_3_reinforcement: + name: '$eventBossLevel &cPartygoer' +the_great_weaver: + name: '$eventBossLevel &cThe Great Weaver' + locationMessage: '&cThe Great Weaver: $distance blocks away!' + spawnMessage: '&cAwful creatures have appeared!' + deathMessage: '&aThe Great Weaver and it''s brood have been stopped by $players!' + escapeMessage: '&4The Great Weaver and it''s brood have vanished!' +the_great_weaver_summon: + name: '$eventBossLevel &4Brood Mother' +the_great_weaver_summon_1: + name: '$eventBossLevel &6Brood' +halloween_event_boss_mount: + name: '$minibossLevel Daredevil' +halloween_event_boss_p1: + name: '$bossLevel Dullahan' + locationMessage: '&4Dullahan: $distance blocks away!' + spawnMessage: '&4Don''t lose your head now, the headless horseman walks the earth once again!' + deathMessage: '&4The headless horseman was vanquished by $players!' + escapeMessage: '&4The headless horseman has left to haunt someone''s dreams!' +halloween_event_boss_p2: + name: '$bossLevel Dullahan' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Headless Horseman was vanquished!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Dullahan: $distance blocks away!' + deathMessage: '&4The headless horseman was vanquished by $players!' + escapeMessage: '&4The headless horseman has left to haunt someone''s dreams!' +halloween_event_boss_reinforcement: + name: '$normalLevel Spooky Skeleton' +the_hunter: + name: '$eventBossLevel &4The Hunter' + locationMessage: '&cThe Hunter: $distance blocks away!' + spawnMessage: '&cA Hunter is on the prowl!' + deathMessage: '&aThe Hunter was hunted to extinction by $players!' + escapeMessage: '&4The Hunter declares the hunt now over!' +the_hunter_mount: + name: '$eventBossLevel &fTamed Beast' +the_living_dead: + name: '$reinforcementLevel &6The Living Dead' +northpole_elf: + name: '$normalLevel &2Workshop Elf' +northpole_elf_summon: + name: '$reinforcementLevel &aSanta''s Elf' +northpole_jack_frost: + name: '$bossLevel &bJack Frost' +northpole_krampus: + name: '$bossLevel &5Krampus' +northpole_mrs_claus: + name: '$bossLevel &cMrs. Claus' +northpole_santa_claus: + name: '$bossLevel &4Santa Claus' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Someone stole all of Santa''s presents!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Santa Claus: $distance blocks away' + spawnMessage: '&4Santa Claus is getting ready for Christmas!!' + escapeMessage: '&cSanta set off on his sleigh!' +northpole_skeleton_summon: + name: '$reinforcementLevel &dSoul of the Naughty List' +northpole_snowy_wraith: + name: '$reinforcementLevel &1Snowy Wraith' +the_phantom: + name: '$eventBossLevel &7The Phantom' + locationMessage: '&cThe Phantom: $distance blocks away!' + spawnMessage: '&cA Phantom roams in the dark!' + deathMessage: '&aThe Phantom and his evil troupe have been stopped by $players!' + escapeMessage: '&4The Phantom has left!' +the_phantom_summon_1: + name: '&fCave Spider' +the_phantom_summon_2: + name: '&fWItch' +the_phantom_summon_3: + name: '&fZombie' +the_phantom_summon_4: + name: '&fHusk' +the_phantom_summon_5: + name: '&fDrowned' +the_phantom_summon_6: + name: '&fSkeleton' +the_phantom_summon_7: + name: '&fStray' +the_phantom_summon_8: + name: '&fEnderman' +pirate_ship_tier_10: + name: '$normalLevel &cCrewman' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_15: + name: '$normalLevel &cDeckhand' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_20_melee_1: + name: '$normalLevel &cShipmate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_20_melee_2: + name: '$normalLevel &eDrunken lout' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_20_miniboss: + name: '$minibossLevel &dCookie the Cook' + onDamageMessages: + - Wat're u doin n my kitchen! + - I've got layers! + - You've been served! + - Out me kitchen! + deathMessage: '&2Cookie the Cook''s been sliced and diced by $players!' +pirate_ship_tier_20_ranged: + name: '$normalLevel &cShipmate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_25_miniboss_1: + name: '$miniboss &cCharon the Helmsman' + onDamageMessages: + - Fools ahoy! + - Worthy opponent at prow! + deathMessage: '&2Charon the Helmsman''s been led astray by $players!' +pirate_ship_tier_30_melee: + name: '$normalLevel &cPirate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_30_miniboss_1: + name: '$minibossLevel &7Crushy the Crusher' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! + deathMessage: '&7Crushy the Crusher has been crushed by $players!' +pirate_ship_tier_30_ranged: + name: '$normalLevel &cPirate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_35: + name: '$normalLevel &4Pirate Navigator' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_35_miniboss_1: + name: '$minibossLevel &cSecond Mate' + onDamageMessages: + - You're not allowed here! + - Captain's quarters, back off! +pirate_ship_tier_35_miniboss_2: + name: '$minibossLevel &cSecond Mate' + onDamageMessages: + - You're not allowed here! + - Captain's quarters, back off! +pirate_ship_tier_40_miniboss_1: + name: '$minibossLevel &4First Hand' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! + deathMessage: '&6The Pirate Ship''s First Hand has been demoted by $players!' +pirate_ship_tier_45_boss: + name: '$bossLevel &4Captain Blackbeard' + onDamageMessages: + - Get off me ship! + - Arr, landlubers! + spawnMessage: '&4Captain Blackbeard is leading the Pirate Ship!' + deathMessage: '&2Captain Blackbeard''s beard''s been shaved by $players!' + escapeMessage: '&2Captain Blackbeard has run away with the plunder!' +the_returned: + name: '$reinforcementLevel &6The Returned' +ruins_boss_p1: + name: '$eventBossLevel &9Thor' + spawnMessage: '&6Lightning descends down from the sky!' +ruins_boss_p2: + name: '$eventBossLevel &9Thor' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Thor was sent back to Asgard!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&6Lightning descends down from the sky!' +ruins_boss_reinforcement: + name: '$eventBossLevel &7Fenrir' +sewer_tier_10: + name: '$normalLevel &fLurker' +sewer_tier_15: + name: '$normalLevel &2Crawler' +sewer_tier_20_dry: + name: '$normalLevel &1Lost Wanderer' +sewer_tier_20_gravity_boss: + name: '$minibossLevel &1Spark' +sewer_tier_20_water: + name: '$normalLevel &1Smuggler' + onDamageMessages: + - You shouldn't be here! + onDamagedMessages: + - None shall stand in our way! +sewer_tier_20_water_boss: + name: '$minibossLevel &1Forgotten Hero' +sewer_tier_20_wither_boss: + name: '$minibossLevel &2Withered Corpse' +sewer_tier_30_ice_boss: + name: '$minibossLevel &2Ice Wraith' +sewer_tier_30_invisibility_boss: + name: '$minibossLevel &2Shadow Archer' +sewer_tier_30_melee: + name: '$normalLevel &5Sewer Beast' +sewer_tier_30_ranged: + name: '$normalLevel &5Spirit Whisperer' + onDamageMessages: + - A curse upon you! + - A pox upon your family! + - Feel the wrath of the spirits! + onDamagedMessages: + - You vex me so! + - Spirits, protect me! +sewer_tier_40: + name: '$normalLevel &6Mirage' + onDamageMessages: + - You victory, a lie + - Your odds, grim + - Your life, mine + onDamagedMessages: + - This pain, an illusion + - This blood, a mirage + - This weakness, a lie +sewer_tier_40_darkness_boss: + name: '$minibossLevel &2The Shadowmaster' +sewer_tier_40_darkness_boss_reinforcement: + name: '$reinforcementLevel &2Shadow' +sewer_tier_40_fire_boss: + name: '$minibossLevel &2The Grill Master' +sewer_tier_40_fire_boss_reinforcement: + name: '$reinforcementLevel &2Flame' +sewer_tier_40_poison_boss: + name: '$minibossLevel &2Toxic Gardener' + onDamageMessages: + - Feel nature's wrath! + onDamagedMessages: + - To me, minions! +sewer_tier_40_poison_boss_reinforcement: + name: '$reinforcementLevel &2Fallen Gardener' +sewer_tier_5: + name: '$normalLevel &7Sewer worker' + onDamageMessages: + - This area is restricted! + - Don't jump into the vats! + - | + You're not supposed to be here| + onDamagedMessages: + - Do you know what you're doing!? + - Foolishness! + - Don't you dare! +sewer_tier_50: + name: '$normalLevel &3Sewer Piranha' +sewer_tier_50_lightning_boss: + name: '$minibossLevel &2Mjolnir' +sewer_tier_50_ravager_boss: + name: '$minibossLevel &2Sewer Monstrosity' +sewer_tier_50_spider_boss: + name: '$minibossLevel &2Ancient Crawler' +sewer_tier_50_spider_boss_reinforcement: + name: '$reinforcementLevel &2Spiderling' +sewer_tier_50_water_boss: + name: '$minibossLevel &2Piranha King' +sewer_tier_50_water_boss_reinforcement: + name: '$reinforcementLevel &2Piranha Prince' +sewer_tier_60: + name: '$normalLevel &4Drowned One' +sewer_tier_70_boss: + name: '$bossLevel &4Drowned King' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Drowned King has been slain!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&cThe sewers echo with the clamor of a returned king...' + deathMessage: '&2The Drowned King has been slain!' + escapeMessage: '&2The sewers grow quiet, for now...' +sewer_tier_70_boss_reinforcement: + name: '$reinforcementLevel &4Drowned One' +totem_zombie_1: + name: '$eventBossLevel Head Zombie' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Zombie Totem been slain!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cZombie Totem: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine abomination has been sighted!' + deathMessage: '&aDr. Craftenmine''s abomination been terminated by $players!' + escapeMessage: '&4Dr. Craftenmine''s creation has escaped!' +totem_zombie_2: + name: '$eventBossLevel Totem Zombie' +totem_zombie_3: + name: '$eventBossLevel Totem Zombie' +totem_zombie_4: + name: '$eventBossLevel Totem Zombie' +totem_zombie_5: + name: '$eventBossLevel Totem Zombie' +totem_zombie_6: + name: '$eventBossLevel Totem Zombie' +treasure_goblin: + name: '$eventBossLevel &eTreasure Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Treasure Goblin has been pillaged!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cTreasure Goblin: $distance blocks away!' + spawnMessage: '&cA Treasure Goblin has been sighted!' + deathMessage: '&aA Treasure Goblin has been slain by $players!' + escapeMessage: '&4A Treasure Goblin has escaped!' +tree_defender: + name: '$eventBossLevel &2Tree Defender' +undead_farmer: + name: '$eventBossLevel &aUndead Farmer' + locationMessage: '&cUndead Farmer: $distance blocks away!' + spawnMessage: '&cAn Undead Farmer walks the earth!' + deathMessage: '&aThe Undead Farmer''s career was ended by $players!' + escapeMessage: '&4The Undead Farmer has gone back to rest!' +undead_farmer_summon: + name: '$eventBossLevel &2Farmers Pride' +undead_farmer_summon_1: + name: '$eventBossLevel &2Failed Hog' +undead_horde_summon_1: + name: '$reinforcementLevel &aUndead Horde' +undead_horde_summon_2: + name: '$reinforcementLevel &dUndead Horde' +undead_horde_summon_3: + name: '$reinforcementLevel &eUndead Horde' +unwanted_visitor: + name: '$eventBossLevel &9Unwanted Visitor' + locationMessage: '&cUnwanted Visitor: $distance blocks away!' + spawnMessage: '&cAn Unwanted Visitor has come to the nether to warm up!' + deathMessage: '&aThe Visitor was slain by $players!' + escapeMessage: '&4The Visitor has gone back to his chilly domain!' +unwanted_visitor_summon: + name: '$eventBossLevel &bIce Clone' +vampire_boneman: + name: '$reinforcementLevel &7Drainlings' +vampire_brute: + name: '$normalLevel &1Vampire Brute' +vampire_brute_coffin_breaker: + name: '$normalLevel &1Vampire Brute' +vampire_brute_gargoyle_rush_left: + name: '$normalLevel &3Vampire Brute' +vampire_brute_gargoyle_rush_left_phase_2: + name: '$normalLevel &3Vampire Brute' +vampire_brute_gargoyle_rush_right: + name: '$normalLevel &3Vampire Brute' +vampire_brute_gargoyle_rush_right_phase_2: + name: '$normalLevel &3Vampire Brute' +vampire_fledgling: + name: '$normalLevel &9Vampire Fledgling' +vampire_fledgling_coffin_breaker: + name: '$normalLevel &9Vampire Fledgling' +vampire_fledgling_gargoyle_overlord: + name: '$normalLevel &9Vampire Fledgling' +vampire_gargoyle: + name: '$normalLevel &6Vampire''s Gargoyle' +vampire_grunt: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_coffin_breaker: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_left: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_left_phase_2: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_right: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_right_phase_2: + name: '$normalLevel &1Vampire Grunt' +vampire_hound: + name: '$reinforcementLevel &bVampire Hound' +vampire_king: + name: '$bossLevel &4Vampire King' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Vampire King has been slain!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Vampire King: $distance blocks away.' + spawnMessage: '&cThe Vampire King crawls back to his throne...' + deathMessage: '&2The Vampire King has been smitten!' + escapeMessage: '&2Darkness flees, but for how long...' +vampire_king_phase_2: + name: '$bossLevel &4Vampire King' +vampire_king_phase_3: + name: '$bossLevel &4Vampire King' +vampire_king_phase_4: + name: '$bossLevel &4Vampire King' +vampire_king_phase_5: + name: '$bossLevel &4Vampire King' +vampire_king_phase_6: + name: '$bossLevel &4Vampire King' +vampire_level_120_miniboss_evoker: + name: '$minibossLevel &4Hellraiser''s Spirit' +vampire_level_120_miniboss_skeleton: + name: '$minibossLevel &4Crypt Keeper''s Spirit' +vampire_level_120_miniboss_stray: + name: '$minibossLevel &4Nicolas Ribcage''s Spirit' +vampire_level_120_miniboss_wither_skeleton: + name: '$minibossLevel &4Oroxak''s Spirit' +vampire_necromancer: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_dining_hall: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_entrance: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_foresight_pool: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_gargoyle_rush: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_gargoyle_rush_phase_2: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_left_bedroom: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_right_bedroom: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_supply_room: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_supreme_coffin_breaker: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_2: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_3: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_4: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_5: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_gargoyle_overlord: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_gargoyle_overlord_phase_2: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_gargoyle_overlord_phase_3: + name: '$minibossLevel &2Gargoyle Overlord' +vampire_sentinel: + name: '$minibossLevel &eVampire''s Sentinel' +vampire_thrall: + name: '$reinforcementLevel &dVampire''s Thrall' +vampire_wraith: + name: '$minibossLevel &8Drained One' +vampire_wraith_phase_2: + name: '$minibossLevel &8Drowned One' +vampire_zombie: + name: '$normalLevel &aDrained Husk' +vex_top: + name: '$eventBossLevel &eVex Selfish Top' + locationMessage: '&cVex Troublemakers: $distance blocks away!' + spawnMessage: '&cA gang of Vex Troublemakers have appeared!' + deathMessage: '&aThe Vex Troublemakers were slain by $players!' + escapeMessage: '&4The Vex Troublemakers have decided to leave.' +vex_top_mount_1: + name: '$eventBossLevel &6Vex Bottom' +vex_top_mount_2: + name: '$eventBossLevel &6Vex Bottom' +vex_top_mount_3: + name: '$eventBossLevel &6Vex Bottom' +warlock: + name: '$eventBossLevel &dWarlock' + locationMessage: '&cWarlock: $distance blocks away!' + spawnMessage: '&cA demon riding Warlock has appeared!' + deathMessage: '&aThe Warlock was slain by $players!' + escapeMessage: '&4The Warlock ran away on his demon!' +warlock_mount: + name: '$eventBossLevel &dDemon' +wasp_queen: + name: '$eventBossLevel &aWasp Queen' + locationMessage: '&cWasp Queen: $distance blocks away!' + spawnMessage: '&cA wasp swarm has been sighted!' + deathMessage: '&aThe wasp swarm was eliminated by $players!' + escapeMessage: '&4The wasp swarm has flown away.' +wasp_queen_summon: + name: '$eventBossLevel &aWasp' +water_pest: + name: '$eventBossLevel &3Water Pest' + locationMessage: '&cWater Pest: $distance blocks away!' + spawnMessage: '&cAn annoying foe swims the waters!' + deathMessage: '&aThe Water Pest was slain by $players!' + escapeMessage: '&4The waters are clear of all Pests' +weapons_goblin: + name: '$eventBossLevel &cWeapons Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Weapons Goblin has been pillaged!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cWeapons Goblin: $distance blocks away!' + spawnMessage: '&cA Weapons Goblin has been sighted!' + deathMessage: '&aA Weapons Goblin has been slain by $players!' + escapeMessage: '&4A Weapons Goblin has escaped!' +wendigo: + name: '$eventBossLevel &7Wendigo' + locationMessage: '&cWendigo: $distance blocks away!' + spawnMessage: '&cSomething awful has appeared!' + deathMessage: '&aThe Wendigo has been slain $players!.' + escapeMessage: '&4The Wendigo has disappeared!' +wendigo_summon: + name: '$reinforcementLevel &aWindigo' +werehare: + name: '$eventBossLevel &5Alice' + locationMessage: '&cWerehare: $distance blocks away!' + spawnMessage: '&cA bloody roar can be heard! A werehare approaches!' + deathMessage: '&a$players! made sure to end the werehare''s reign!' + escapeMessage: '&4The werehare escaped!' +werehare_p2: + name: '$eventBossLevel &dWerehare' +wild_wolf: + name: '$reinforcementLevel &7Wild Wolf' +wood_league_wave_10_boss: + name: '$bossLevel &4Bad Doggo' +wood_league_wave_10_reinforcement: + name: '$reinforcementLevel &cBad Pupper' +wood_league_wave_11_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_11_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_12_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_12_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_13_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_13_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_14_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_14_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_15_miniboss: + name: '$bossLevel &4Mr. Oinkers' + onDamagedMessages: + - Oink!? +wood_league_wave_16_melee: + name: '$normalLevel Mr. Oinkers Fan' +wood_league_wave_16_ranged: + name: '$normalLevel Mr. Oinkers Fan' +wood_league_wave_17_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_17_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_18_melee: + name: '$normalLevel &4Fencing Club Enthusiast' +wood_league_wave_19_ranged: + name: '$normalLevel Archery Club Enthusiast' +wood_league_wave_1_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_1_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_20_boss: + name: '$bossLevel &2Zoltan' +wood_league_wave_21_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_21_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_22_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_22_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_23_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_23_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_24_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_24_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_25_miniboss: + name: '$minibossLevel &bAgdluak' +wood_league_wave_26_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_26_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_27_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_27_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_28_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_29_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_2_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_2_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_30_boss: + name: '$bossLevel &2The Southern Viper' +wood_league_wave_31_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_31_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_32_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_32_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_33_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_33_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_34_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_34_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_35_miniboss: + name: '$minibossLevel &6The Jester' +wood_league_wave_36_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_36_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_37_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_37_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_38_melee: + name: '$normalLevel &4Arena Swordsman' +wood_league_wave_39_ranged: + name: '$normalLevel Arena Archer' +wood_league_wave_3_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_3_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_40_boss: + name: '$bossLevel &cCrucio the Bearer of Curses' +wood_league_wave_41_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_41_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_42_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_42_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_42_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_43_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_43_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_43_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_44_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_44_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_44_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_45_miniboss: + name: '$minibossLevel &6Thousand Blades' +wood_league_wave_46_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_46_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_46_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_47_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_47_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_47_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_48_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_48_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_49_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_49_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_4_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_4_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_50_boss: + name: '$bossLevel &6Uther the Champion' +wood_league_wave_50_boss_p2: + name: '$bossLevel &6Uther the Champion' +wood_league_wave_50_boss_p3: + name: '$bossLevel &6Uther the Champion' +wood_league_wave_50_reinforcement: + name: '$reinforcementLevel &6Uther Stan' +wood_league_wave_5_miniboss: + name: '$minibossLevel &cWeird Cow' + onDamagedMessages: + - Woof! +wood_league_wave_6_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_6_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_7_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_7_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_8_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_9_ranged: + name: '$normalLevel Arena Crossbowman' +yeti: + name: '$eventBossLevel &bYeti' + locationMessage: '&cYeti: $distance blocks away!' + spawnMessage: '&cA mighty beast has appeared!' + deathMessage: '&aThe beast is no more thanks to $players!.' + escapeMessage: '&4The beast has escaped!' +yezhi_baba: + name: '$eventBossLevel &cYezhi Baba' + locationMessage: '&cYezhi Baba: $distance blocks away!' + spawnMessage: '&cA foul hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +yezhi_baba_summon: + name: '$reinforcementLevel &4Yezhi Baba' +zombie_friends_friend: + name: '$reinforcementLevel &7Zombie Friend' +zombie_king: + name: '$eventBossLevel &4Zombie King' + locationMessage: '&cZombie King: $distance blocks away!' + spawnMessage: '&cThe Zombie King has been sighted!' + deathMessage: '&aThe Zombie King has been slain by $players!' + escapeMessage: '&4The Zombie King has escaped!' +zombie_parents_dad: + name: '$reinforcementLevel &7Zombie Dad' +zombie_parents_mom: + name: '$reinforcementLevel &7Zombie Mom' +back_teleporter: + name: 헤르메스 + role: <수송자> + greetings: + - \n모험가 길드 허브에 오신 것을 환영합니다! + dialog: + - 다시 돌아가야 해? + farewell: + - 안전한 여행, 친구. + noPreviousLocationMessage: '&8[EliteMobs] &c이전 위치로 다시 보낼 수 없습니다. 위치 - 이전 위치를 찾을 수 없습니다!' +barkeep: + name: Bartley + role: + greetings: + - Need a drink? + - Want a drink + - 목 마른? + - Howdy, partner. + dialog: + - Have one of our house specialties. + - Special drinks won't find them\nanywhere else. + - One taste and will keep you\ncoming back from more. + farewell: + - Come back anytime + - Bottoms up! + - Kampai! + - Salut! + - Brosd! + - Salud! + - À la vôtre ! + - Prost! + - Santi! + - Salute! + - Saúde! + - Cheers! + - 乾杯! +blacksmith: + name: 그레그 + role: <대장장이> + greetings: + - 저희 가게에 오신 것을 환영합니다. + - 여기서 물건을 팔아라! + - 당신을 위한, 신상입니다! + - 뭐 팔거 있어? + - 뮈 사고 싶은 상품 있어? + - 매번 신상품! + dialog: + - 더 높은 수준의 몹들이 \n더 높은 가치의 아이템을 떨어뜨려! + - \n인챈트가 많은 아이템은 더 가치가 있습니다! + - 더 높은 레벨의 몹이 \n더 좋은 아이템을 떨어트립니다! + - 더 높은 레벨의 몹이 전리품을 떨어트릴 확률이 \n높아집니다! + - Elite몹들은 \n좋은 갑옷 끌립니다, \n갑옷이 좋을수록 레벨이 높아집니다. + - 어떠한 아이템들은 특별한 \n효과를 가지고 있습니다! + - 어떤 아이템은 특별한 \n효과가 있습니다! + - 사냥꾼의 마법은 엘리트 군중을 여러분의 \n위치로 \n끌어당깁니다! + - 엘리트 몹들이 \n떨어트린 특수 무기와 갑옷은 여기서 \n팔 수 있습니다! + - 길드의 랭크가 높을 수록 더 엘리트 몹으로 얻을 수 있는 \n전리품의 질이 높아집니다! + farewell: + - 이용해 주셔서 감사합니다! + - 곧 다시 돌아올게! + - 언제라도 다시 오세요! + - \n친구들에게 이 가게를 추천하세요! +combat_instructor: + name: Charles + role: + greetings: + - Want to learn about combat? + - Need a combat lesson? + - Want to know more about combat? + - Ready to fight Elite Mobs? + dialog: + - The items around Elite Mobs\nshow what powers they have. + - The higher the level of\nthe Elite Mob, the\nmore powers they can have + - The higher the level of\nthe Elite Mob, the\nbetter the loot they can drop + - Higher level Elite Mobs\nhave higher chances\nof dropping special items + - Elite Mobs with floating\narrows fire arrows at\nnearby players + - Elite Mobs with floating\nender eyes blind you\nwhen they hit you + - Elite Mobs with floating\nspell particles confuse you\nwhen they hit you + - Elite Mobs with floating\nlava buckets set you on fire\nwhen they hit you + - |- + Elite Mobs with floating\nfireballs fire fireballs + at nearby players + - Elite Mobs with floating\npacked ice freeze you\nwhen they hit you + - Elite Mobs with floating\nelytras make you float\nwhen they hit you + - Elite Mobs with floating\nemeralds poison you\nwhen they hit you + - Elite Mobs with floating\npistons push you\nwhen they hit you + - Elite Mobs with floating\ntotems weaken you\nwhen they hit you + - Elite Mobs with floating\nwebs web you\nwhen they hit you + - Elite Mobs with floating\nskulls wither you\nwhen they hit you + - Elite Mobs with floating\nchests drop bonus loot\nwhen you kill them + - Elite Mobs with floating\ngold boots are faster + - Elite Mobs with floating\njukeboxes taunt you\nduring combat + - Elite Mobs with floating\nglass panes are invisible + - Elite Mobs with floating\nspectral arrows are immune\nto arrows + - Elite Mobs with floating\nfeathers are immune\nto fall damage + - Elite Mobs with floating\nflames are immune\nto fire + - Elite Mobs with floating\nanvils are heavier\nthan usual + - Elite Mobs with floating\nbone blocks leave their\ncorpses behind when killed + - Elite Mobs with floating\nslime blocks jump higher\nthan usual + - Elite Mobs with floating\nslime balls create a vaccum\nupon death + - Elite Mobs with floating\nleads pull you\nwhen they hit you + - Elite Mobs with floating\nbones create bone pillars\nduring combat + - Elite Mobs with floating\ntipped arrows fire tracking\narrows during combat + - Elite Mobs with floating\nmushrooms bloat up to become giants\nwhen hit + - Elite Mobs with floating\nskulls summon reinforcements\nwhen hit + - Elite Mobs with floating\nbooks summon reinforcements\nuntil you kill the summoner + - Elite Mobs with floating\neggs summon reinforcements\nwhen hit + - Elite Mobs with floating\nfireworks summon Team Rocket\nwhen hit +enhancer_config: + name: 팀 + role: <강화 대장장이> + greetings: + - 아이템을 업그레이드하시겠습니까? + - 업그레이드된 오브를 가지고 있나요? + - 여기서 아이템을 업그레이드하십시오! + - 야! + - 스크랩 아들 있어요? + dialog: + - 아이템이 형편없습니다.\n 여기서 업그레이드하십시오! + - 여기서 항목을 업그레이드하십시오! + - 업그레이드 된 거 있어? + - 그 검이 끔찍해 보이는데, \n여기서 업그레이드해! + - 업그레이드가 필요하십니까? + farewell: + - 창피해 하지 마! + - 오브가 더 생기면 다시 와! + - 오브를 더 가져와! +frost_queen_teleporter: + name: Ishard the Frostbitten + role: + greetings: + - '' +guide_0: + name: Dux + role: + greetings: + - Heard about the AG? + - Been to the AG? + - Heard of the Adventurer's Guild? + - Know about the Adventurer's Guild? + dialog: + - Heard about the AG? + - Been to the AG? + - Heard of the Adventurer's Guild? + - Know about the Adventurer's Guild? + farewell: + - Come back anytime + - 내가 필요하면 여기 있을게! + - I'll be around! + - See you later! +guide_1: + name: Casus + role: + greetings: + - Need guidance? + - Need a hint + - Are you lost? + - Need help? + dialog: + - I know everything about\nthis place! + - Want to meet the other members\nof the Adventurer's Guild? + - Need to learn your way around\nthis place? + farewell: + - Come back anytime + - 내가 필요하면 여기 있을게! + - I'll be around! + - See you later! +guild_attendant: + name: 질리언 + role: <길드 안내원> + greetings: + - \n모험가 길드에 오신 것을 환영합니다! + - 환영합니다! + dialog: + - 현재 진행 중인 퀘스트를 보려면 퀘스트 보드를 확인하십시오. + - \n길드 순위를 바꾸기 위해 저와 대화할 수 있습니다! + - 당신은 코인을 위해 물건을 \n대장장이에게 팔 수 있습니다! + - \n아레나 마스터와 상의하여 아레나에 도전할 수 있습니다! + - \n대장장이에게서 장비를 살 수 있습니다! + - \n전투원과 대화하여 전투 수준을 확인할 수 있습니다. + - 새 길드 등급 잠금 해제로 최대 체력 \n증가! + farewell: + - 또 만나요! + - 들러주셔서 감사합니다. + - 즐거운 사냥 되세요! +primis_69ozcanofbepis: + name: '&a69OzCanOfBepis' + role: '&2Map Maker (Uuuuge gamer)' + dialog: + - Hope you are enjoying the map! + farewell: + - Have fun! +primis_caeruleaum_fisherman: + name: '&3Piscis Nemesis' + role: '&b' + greetings: + - Hiya!. + dialog: + - Woah! Almost fell off the boat. + - Darn sea monster! + - Need more bait. + farewell: + - Later! + - Good luck! +primis_caeruleaum_fletcher: + name: '&6Ventus Artifex' + role: '&e' + greetings: + - 안녕하세요. + dialog: + - I used to be an adventurer like you. + - Welcome, outsider + - 필요한거 있니? + - |- + You're not from around these parts, + are you? + farewell: + - See you 'round! + - 곧 다시 돌아올게! +primis_caeruleaum_forager: + name: '&5Venator Pabulatus' + role: '&d' + greetings: + - Hello, stranger. + dialog: + - I used to be an adventurer like you. + - Welcome, outsider + - 필요한거 있니? + - |- + You're not from around these parts, + are you? + farewell: + - See you 'round! + - 곧 다시 돌아올게! +primis_caeruleaum_hint_giver: + name: '&fVir Loquax' + role: '&fWise Man' + greetings: + - Hi there! + - Hello! + - It is good to see you! + - 안녕하세요! + dialog: + - You look strong and mighty. Talk to some \nof the villagers if you want to help us out. + - A long time ago there was a beautiful shrine to\nthe southeast, shame what happened to it. + - The ruins in the southwest are such a horrible place!\n Who would ever go there... + - Met a powerful mage once,\nthey were able to summon a beautiful ice wall.\nToo bad it would break if they fainted. + - I heard that a nasty type of\nwolf has settled in the wolf den! + farewell: + - Goodbye! + - See you later! + - Come visit me again! + - Farewell! +primis_caeruleaum_injured_fisherman: + name: '&3Callidus Piscatus' + role: '&b' + greetings: + - Hello, wanderer. + dialog: + - Caught any good fish lately? + - Welcome, outsider + - 필요한거 있니? + - |- + You're not from around these parts, + are you? + farewell: + - See you 'round! + - 곧 다시 돌아올게! +primis_caeruleaum_jeeves: + name: Jeeves + role: + greetings: + - Just traveling! + dialog: + - Just here to sell\nto the shop-keep. + - I'm busy negotiating\nhere. + - Not right now,\ncome back later. + farewell: + - Uhuh... +primis_caeruleaum_leader: + name: '&4Chief Piscis' + role: '&c' + greetings: + - Welcome to our village! + dialog: + - |- + Ask not what this village can do for you, + ask what you can do for this village! + - Welcome, outsider + - 필요한거 있니? + - |- + You're not from around these parts, + are you? + farewell: + - Off you go! + - 곧 다시 돌아올게! +primis_caeruleaum_merchant: + name: Emptor + role: + greetings: + - 뭐 팔거 있어? + dialog: + - Bandits stole my wares! + - Got nothing to sell, I'm afraid. + - I'll buy anything you have! + farewell: + - Safe travels! +primis_captain: + name: '&4Captain Squalus' + role: '&c' + greetings: + - So you're finally awake! + - That was a wild ride! + - Still alive? + - Let's not do that again! + dialog: + - I've got a task for you! + - I need your help! + - |- + Good thing you're here, + we need some help! + farewell: + - Off you go! + - Don't forget about me! + - 곧 다시 돌아올게! +primis_deli'o: + name: '&eDéli''O' + role: '&6Map Maker (Gamer)' + dialog: + - Hope you are enjoying the map! + farewell: + - Have fun! +primis_farmstead_son: + name: '&4Filius' + role: '&c' + greetings: + - Where do you fare from? + - You seem like you came a long way from here. + dialog: + - Dangerous times we live in. + - Have you seen my father? + - Without a lighthouse, how will boats navigate? + farewell: + - Watch your back! + - Tread lightly! +primis_farmstead_wife: + name: '&4Amavit' + role: '&c' + greetings: + - I haven't seen you before! + - Any news from Pontis Mille? + dialog: + - Have you seen my husband? + - I need your help! + - What dangerous times we live in. + - Something is amiss! + farewell: + - Safe travels! + - Thank you! +primis_first_mate: + name: '&cIracundi' + role: '&c' + greetings: + - So you're finally awake! + - That was a wild ride! + - Still alive? + - Let's not do that again! + dialog: + - I've got a task for you! + - I need your help! + - |- + Good thing you're here, + we need some help! + farewell: + - Off you go! + - Don't forget about me! + - 곧 다시 돌아올게! +primis_frostcone: + name: '&bFrostCone' + role: '&9Map Maker (Gamer)' + dialog: + - Hope you are enjoying the map! + - It's a pine-cone covered in snow. + - Is Primis out yet? + farewell: + - Have fun! +primis_gladius_guard_1: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_guard_2: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_guard_3: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_guard_4: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_lord: + name: '&4General Hasta' + role: '&c' + greetings: + - Are you here to help? + - It's a war zone out there! + dialog: + - They came in the night! + - We never saw them coming! + - Where are our reinforcements? + farewell: + - Watch your back! + - Tread lightly! +primis_gladius_quartermaster: + name: '&6Cibus' + role: '&c' + greetings: + - Are you here to help? + - It's a war zone out there! + dialog: + - They came in the night! + - We never saw them coming! + - Where are our reinforcements? + farewell: + - Watch your back! + - Tread lightly! +primis_gladius_strategist: + name: '&6Belli' + role: '&c' + greetings: + - Are you here to help? + - It's a war zone out there! + dialog: + - They came in the night! + - We never saw them coming! + - Where are our reinforcements? + farewell: + - Watch your back! + - Tread lightly! +primis_groves_nemus_leader: + name: '&3King Nemian' + role: '&c' + dialog: + - What brings you under the hill? + - Where are you from? + - |- + Have you tried our + delicious glow berries? + farewell: + - Until next time. +primis_ice_village_fisherman_boat: + name: '&3Theopropides Nero' + role: '&3' + greetings: + - Fishy day! + dialog: + - A chilly day for fishing. + - They aren't biting. + - Just gotta be patient. + farewell: + - Don't fall into\nthe water! +primis_ice_village_friendly_villager: + name: '&3Luxuria Placidus' + role: '&3' + greetings: + - Hellos! + dialog: + - Old age will not\nslow me down! + - Being in a good\nmood is important. + - Hoping for some\nsnow soon. + farewell: + - Farewell! +primis_ice_village_generic_npc_1: + name: '&3Albertus Vitalis' + role: '&3' + greetings: + - How goes it. + dialog: + - Nothing like good ale! + farewell: + - Bye. +primis_ice_village_generic_npc_10: + name: '&3Trebatia Cornix' + role: '&3' + greetings: + - OK. + dialog: + - Yep, got it. + - I see... + - Oh! + farewell: + - I will try that\nnext time. +primis_ice_village_generic_npc_11: + name: '&3Albatia Lateranus' + role: '&3' + greetings: + - Visiting Violet? + dialog: + - Don't cause trouble. + farewell: + - Later stranger. +primis_ice_village_generic_npc_12: + name: '&3Hostilia Carantus' + role: '&3' + greetings: + - Hi. + dialog: + - I was just\nleaving. + farewell: + - Bye. +primis_ice_village_generic_npc_13: + name: '&3Vagennia Sejanus' + role: '&3' + greetings: + - Hiya. + dialog: + - What brings you\nto the docks? + farewell: + - See ya. +primis_ice_village_generic_npc_14: + name: '&3Dinia Vettonius' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_15: + name: '&3Sceledrus Marcallas' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_16: + name: '&3Fridericus Castinus' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_17: + name: '&3Cario Fimbria' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_18: + name: '&3Piscatores Laevinus' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_19: + name: '&3Monkerius Vitalis' + role: '&3' + greetings: + - Been hunting? + dialog: + - Time to go hunting. + farewell: + - Farewell. +primis_ice_village_generic_npc_2: + name: '&3Luxuria Tyranus' + role: '&3' + greetings: + - How goes it. + dialog: + - One more! + farewell: + - Bye. +primis_ice_village_generic_npc_3: + name: '&3Aurelio Nigidius' + role: '&3' + greetings: + - Hey there. + dialog: + - What a sight! + farewell: + - Goodbye. +primis_ice_village_generic_npc_4: + name: '&3Lysidamus Paratus' + role: '&3' + greetings: + - Out for a walk? + dialog: + - I couldn't imagine\nliving somewhere\nwithout snow. + - Starting to get chilly. + farewell: + - Until later. +primis_ice_village_generic_npc_5: + name: '&3Simo Proceus' + role: '&3' + greetings: + - What a view! + dialog: + - I love climbing. + - Look at all the fish! + farewell: + - Yep. +primis_ice_village_generic_npc_6: + name: '&3Dordalus Marullinus' + role: '&3' + greetings: + - Welcome to the pub! + dialog: + - Time to warm up\nmy fingers. + - Nice and warm. + farewell: + - Don't let the\ncold get ya. +primis_ice_village_generic_npc_7: + name: '&3Tranio Silvanus' + role: '&3' + greetings: + - Here somewhere.. + dialog: + - Where is it. + farewell: + - I was sure I\nleft it here. +primis_ice_village_generic_npc_8: + name: '&3Milonia Trebellius' + role: '&3' + greetings: + - Welcome to our\nvillage! + dialog: + - I sure am hungry. + - Could go for\nsome salmon. + farewell: + - Farewell. +primis_ice_village_generic_npc_9: + name: '&3Barria Brocchus' + role: '&3' + greetings: + - Did you hear... + dialog: + - Keep that in mind\nnext time you swing\nyour sword. + - The shield can be\nmore than defense. + farewell: + - Got it? +primis_ice_village_hunter: + name: '&3Alanus Isatis' + role: '&3' + greetings: + - Hey! + dialog: + - Hoping for a good\nday tomorrow. + - Sure are many Razorbacks\nout this season. + farewell: + - Be seeing you. +primis_ice_village_imprisoned_husband: + name: '&3Eleusium Calenus' + role: '&3' + greetings: + - '.....' + dialog: + - Another day in a cage... + farewell: + - '.....' +primis_ice_village_jail_caretaker: + name: '&3Philolaches Triferus' + role: '&3' + greetings: + - Hey there. + dialog: + - What else needs\nfixing. + - I should check up\non the cages. + farewell: + - Later. +primis_ice_village_jail_guard: + name: '&3Eleusium Festus' + role: '&3' + greetings: + - Climbed the\ntower eh. + dialog: + - Everything seems in order. + - Almost everything... + farewell: + - Take care. +primis_ice_village_jail_master: + name: '&3Romanus Superbus' + role: '&3' + greetings: + - Well met. + dialog: + - Don't do the crime if\nyou can't do the time. + - Crime doesn't pay. + farewell: + - Until later. +primis_ice_village_leader: + name: '&3Glacies Princeps' + role: '&3' + greetings: + - Hey. + dialog: + - Darn Ice Elemental! + - Too many problems... + - How are we supposed to\ncomplete the trials now. + farewell: + - Goodbye. +primis_ice_village_lighthouse_keeper: + name: '&3Severinus Martius' + role: '&3' + greetings: + - Well met stranger. + dialog: + - Calm day today. + - Watch out for\nthe Ursus! + farewell: + - Take it easy. +primis_ice_village_missing_daughter: + name: '&3Cornelia Ennodius' + role: '&3' + greetings: + - Help... + dialog: + - Go away, go away,\nGO AWAY! + - They are not\nreal... + - Just don't look\nat them Cornelia. + farewell: + - Bye. +primis_ice_village_prisoner: + name: '&3Adrius Calpornius' + role: '&3' + greetings: + - I am innocent! + dialog: + - This is not where\nI belong!!! + farewell: + - Get me out of here! +primis_ice_village_pubkeeper: + name: '&3Grania Cecilius' + role: '&3' + greetings: + - Welcome! + dialog: + - Coming right up! + - Try our black ale! + - Need a drink? + farewell: + - One coming up! +primis_ice_village_tower_squatter: + name: '&3Modestus Eulogius' + role: '&3' + greetings: + - The noise! + dialog: + - So much screeching! + - Just trying to\nenjoy the peace. + farewell: + - Bye. +primis_ice_village_violet: + name: '&5Domina Violet' + role: '&d' + greetings: + - Did I ask\nyour opinion? + dialog: + - Feels good to\nget it out. + - They're gonna pay\nwhile I collect. + farewell: + - No, that's what I thought. +primis_ice_village_worried_father: + name: '&3Sparax Ennodius' + role: '&3' + greetings: + - I hope she is OK... + dialog: + - Let our girl be\nsafe, please. + farewell: + - Bye. +primis_ice_village_worried_mother: + name: '&3Sestia Ennodius' + role: '&3' + greetings: + - Where did she go. + dialog: + - Hmm, lost the trail. + farewell: + - Bye. +primis_ice_village_worried_wife: + name: '&3Titia Calenus' + role: '&3' + greetings: + - Hiya! + dialog: + - Nice and clean beds. + - Did I miss something? + - Another chest sorted. + farewell: + - Bye! +primis_magmaguy: + name: '&4Magmaguy' + role: '&cLead Developer (Non-gamer)' + dialog: + - Hope you are enjoying the map! + farewell: + - Have fun! +primis_mountain_guide: + name: '&4Petrae' + role: '&c' + greetings: + - Welcome to our village! + dialog: + - |- + Ask not what this village can do for you, + ask what you can do for this village! + - Welcome, outsider + - 필요한거 있니? + - |- + You're not from around these parts, + are you? + farewell: + - Off you go! + - 곧 다시 돌아올게! +primis_mountain_guide_2: + name: '&4Petrae' + role: '&c' + greetings: + - Welcome to our village! + dialog: + - |- + Ask not what this village can do for you, + ask what you can do for this village! + - Welcome, outsider + - 필요한거 있니? + - |- + You're not from around these parts, + are you? + farewell: + - Off you go! + - 곧 다시 돌아올게! +primis_nemus_leader: + name: '&3King Nemian' + role: '&c' + dialog: + - What brings you under the hill? + - Where are you from? + - |- + Have you tried our + delicious glow berries? + farewell: + - Until next time. +primis_ogre_mines_escaped_miner: + name: '&cFugit Fossores' + role: '&c' + greetings: + - I can't believe I made it! + - They're everywhere! + - Could you lend a hand? + dialog: + - I've got a task for you! + - I need your help! + farewell: + - Off you go! + - Be careful in there! + - Stay safe! +primis_ogre_mines_lone_miner: + name: '&cFortis Fossores' + role: '&c' + greetings: + - Finally, some help! + - Don't let them see you! + - Help me! + dialog: + - I've got a task for you! + - I need your help! + farewell: + - Off you go! + - Back to mining for me! + - Stay safe! +primis_ogre_mines_old_miner: + name: '&cVetus Fossores' + role: '&c' + greetings: + - Hey there sonny! + - You're lookin' a little lost! + - What brings you over here? + dialog: + - I've got a task for you! + - I need your help! + farewell: + - Off you go! + - Don't let the mine mites bite! + - Stay safe! +primis_ogre_mines_panicked_miner: + name: '&cMetus' + role: '&c' + greetings: + - The mine is overrun! + dialog: + - There's ogres everywhere! + - Can you help us? + farewell: + - Be careful! +primis_pontis_citizen_1: + name: '&7Agorastocles Gorgonius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_10: + name: '&7Pardalisca Saunio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_11: + name: '&7Sobersides Colias' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_12: + name: '&7Saturio Caepio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_13: + name: '&7Chrysalus Trebonius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_14: + name: '&7Toxilus Micon' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_15: + name: '&7Phronesium Viridio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_16: + name: '&7Aurelio Zoilus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_17: + name: '&7Diniarchus Nelius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_18: + name: '&7Cleostrata Senopius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_19: + name: '&7Georgius Sorio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_2: + name: '&7Franciscus Crispian' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_20: + name: '&7Epidicus Silvanus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_21: + name: '&7Pleusicles Marcellinus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_22: + name: '&7Plesidippus Nerva' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_23: + name: '&7Plesidippus Megellus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_24: + name: '&7Fridericus Achaicus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_25: + name: '&7Curculio Zosimus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_26: + name: '&7Demipho Sylvius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_27: + name: '&7Peniculus Nemesius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_28: + name: '&7Tyndarus Faustinius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_29: + name: '&7Sulpicio Panthera' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_3: + name: '&7Tycho Sellic' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_30: + name: '&7Melaenis Gelasius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_31: + name: '&7Tyndarus Columbanus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_32: + name: '&7Antamonides Cerinthus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_33: + name: '&7Lesbonicus Momus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_34: + name: '&7Fridericus Saloninus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_35: + name: '&7Anterastilis Fabricius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_36: + name: '&7Tyndarus Augustalis' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_37: + name: '&7Modestus Aper' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_38: + name: '&7Henricus Crassus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_39: + name: '&7Franciscus Tancinus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_4: + name: '&7Advocati Micon' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_40: + name: '&7Phygia Aurelius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_5: + name: '&7Advocati Micon' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_6: + name: '&7Messenio Rectus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_7: + name: '&7Hadrius Donicus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_8: + name: '&7Sulpicio Sejanus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_9: + name: '&7Stasimus Mutilus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_dockworker_1: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_10: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_2: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_3: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_4: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_5: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_6: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_7: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_8: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_9: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_enhancer: + name: '&7Meliorem' + role: '&8' + greetings: + - Need to upgrade? + - 조각 가지고 있니? + - Let's upgrade! + dialog: + - I'll upgrade for scrap! + - Bring me scrap! + - Upgrade your gear for scrap! +primis_pontis_gardener_1: + name: '&eGorgines Asina' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_2: + name: '&ePiscatores Orissus' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_3: + name: '&eAlcesimus Abito' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_4: + name: '&ePyrgopolynices Perpenna' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_5: + name: '&eLemniselenis Gelasius' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_6: + name: '&eLysimachus Sulinus' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_7: + name: '&eStrobilus Farus' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_groves_catacombs_npc: + name: '&7Inaequaliter Hyaena' + role: '&7' + greetings: + - Psssst! + dialog: + - I heard there is great\ntreasure to be had! + - Something wonderful awaits\nyou if you enter! + - You should adventure\ninto this place... + - Why not go in? + - You should go inside... + - Don't worry, it's\ncompletely safe. + - No danger. I swear! + - Take a look inside. + - You should check\nout this place! + - He he he he he... + - What if somebody\ninside needs help. + - Go in, go in! + - Aren't you curious? + - Surely you should\ntake a peek. + farewell: + - He he he, later! +primis_pontis_groves_generic_npc_1: + name: '&2Sycophanta Mucius' + role: '&2' + greetings: + - I'm fine! + dialog: + - Do not worry about me. + - My brother will come rescue me. + - They won't eat me. + - I assure you I will be just fine. + farewell: + - Web ya later! +primis_pontis_groves_generic_npc_10: + name: '&2Hostilia Metunus' + role: '&2' + greetings: + - Hellos. + dialog: + - Are you bored too? + - Ugh, there must be something to do. + - Maybe I should brew more drinks. + farewell: + - See ya! +primis_pontis_groves_generic_npc_11: + name: '&2Tortilia Getha' + role: '&2' + greetings: + - Hi there. + dialog: + - My husband makes the best cakes. + - Want a slice? + - So delicious and moist! + farewell: + - Bye! +primis_pontis_groves_generic_npc_12: + name: '&2Consentia Apellinus' + role: '&2' + greetings: + - Oh, hello. + dialog: + - There, as good as new! + - Have to make sure the light keeps them away. + - Another lantern fixed... + farewell: + - Don't let the spiders bite! +primis_pontis_groves_generic_npc_13: + name: '&2Novia Senecius' + role: '&2' + greetings: + - Hi! + dialog: + - Oh, did not expect to see anyone here. + - Just gotta be quick and they can't get ya. + - The spiders don't stop me. + - This is my favorite resting spot. + farewell: + - Stay safe. +primis_pontis_groves_generic_npc_14: + name: '&2Maximia Priscus' + role: '&2' + greetings: + - Shhhh... + dialog: + - Thought you could\nsteal from me elves... + - Gonna get back my\npossessions when\nthey go sleep. + - Made it here by\ngoing around. + - They never saw\nme coming. + farewell: + - Keep it down. +primis_pontis_groves_generic_npc_15: + name: '&2Herennia Exsupereus' + role: '&2' + greetings: + - Hey there. + dialog: + - Just woke up. + - It's gonna be a good\nday I can feel it. + farewell: + - Bye bye. +primis_pontis_groves_generic_npc_16: + name: '&2Atria Maursus' + role: '&2' + greetings: + - Greetings. + dialog: + - Not sure how the king\nexpects me to do\nall of this... + - So much work.. + - Busy, busy, busy. + - This paperwork\nwon't do itself. + farewell: + - Bye bye. +primis_pontis_groves_generic_npc_17: + name: '&2Felicius Esurpus' + role: '&2' + greetings: + - Greetings! + dialog: + - If you need anything\nspeak to the king. + - Sorry, I am busy. + - No time for chit-chat,\nmy apologies. + farewell: + - Goodbye. +primis_pontis_groves_generic_npc_2: + name: '&2Sceledrus Fredisius' + role: '&2' + greetings: + - Heya! + dialog: + - I am actually fishing for bugs. + - Large aqua-bugs fall from the trees. + - I use tree sap as bait. + - The aqua-bugs cannot resist the bait! + - They are actually amphibious. + - Gotta catch'em before they head for the trees. + - They are quite tasty if you roast them. + - Hoping for a good catch! + farewell: + - Later. +primis_pontis_groves_generic_npc_3: + name: '&2Felicius Surius' + role: '&2' + greetings: + - Hi there! + dialog: + - The ocean is so pretty. + - I could stand here for days. + - The spiders sure are annoying. + farewell: + - Bye. +primis_pontis_groves_generic_npc_4: + name: '&2Periplectomenus Burcanius' + role: '&2' + greetings: + - Welcome! + dialog: + - Plenty of glow berries left. + - Hope you like my little farm. + - So many wines to attend to. + farewell: + - See you later. +primis_pontis_groves_generic_npc_5: + name: '&2Stephanus Magnus' + role: '&2' + greetings: + - Hey there! + dialog: + - Did you check out the berry farm? + - Lovely time for a walk. + - Can't be inside all the time. + farewell: + - Have a good one. +primis_pontis_groves_generic_npc_6: + name: '&2Abundantius Rogatus' + role: '&2' + greetings: + - Hiya! + dialog: + - What brings you into our lovely hole? + - Feel free to stay a while. + farewell: + - Bye. +primis_pontis_groves_generic_npc_7: + name: '&2Albanus Ivmarus' + role: '&2' + greetings: + - Easy there... + dialog: + - What? Yes, I'm doing just fine. + - I did not have too many, nope. + - Just one more... + - One more pint... + farewell: + - Farewell. +primis_pontis_groves_generic_npc_8: + name: '&2Bacchis Aventinus' + role: '&2' + greetings: + - Good day or evening... + dialog: + - I am so cozy right now. + - We used to go outside more often. + - Too many dangers outside these days. + farewell: + - Bless ya. +primis_pontis_groves_generic_npc_9: + name: '&2Pasicompsa Getha' + role: '&2' + greetings: + - Come in, come in! + dialog: + - Welcome to the best hole in the grove! + - Built this hole with my own hands! + - Hope you enjoy your stay! + farewell: + - Come back soon! +primis_pontis_groves_hole_luxuria: + name: '&cLuxuria Gorgonius' + role: '&c' + greetings: + - Hi there! + - Hellos! + dialog: + - Life is all about taking it easy. + - Why stress. + farewell: + - Visit us again! +primis_pontis_groves_hole_phygia: + name: '&cPhygia Gorgonius' + role: '&c' + greetings: + - Welcome to my home! + - Hellos! + dialog: + - We have to take action! + - Too many elves in our grove. + farewell: + - Visit us again! +primis_pontis_groves_lighthouse_generic_npc_1: + name: '&3Eleusium Martius' + role: '&3' + greetings: + - What brings you here? + dialog: + - Gotta make sure the\nlighthouse is working. + - Nice to see someone\ncome visit. + farewell: + - Goodbye. +primis_pontis_groves_lighthouse_generic_npc_2: + name: '&3Caelia Zoilus' + role: '&3' + greetings: + - Hey. + dialog: + - I hope he will\nbe alright. + - My turn to watch\nover the light. + - We almost ran\nout of food. + farewell: + - Bye. +primis_pontis_groves_lighthouse_sick_man: + name: '&3Alanus Secundas' + role: '&c' + dialog: + - I don't feel so good + - Hopefully I recover soon. + - Well, I am feeling a bit better. + - We need more food. + farewell: + - Farewell. +primis_pontis_groves_parkour_npc_1: + name: '&3Posuere Hominem' + role: '&c' + dialog: + - Up for a challenge? + - You think you got what it takes? + - Wanna go swinging? + - You a mad lad? + - No cheating! + farewell: + - See you later. +primis_pontis_groves_parkour_npc_2: + name: '&cIdoneitatem Hominem' + role: '&3' + dialog: + - That was impressive! + - Try and beat my record of 1m 47s. + - No cheating! + farewell: + - See you later. +primis_pontis_guard: + name: '&cPontis Guard' + role: '&8' + greetings: + - Want to upgrade gear? + dialog: + - Lost? Follow the bridge colors. + - Every bridge path has at least one color! + - Stay out of trouble! + - Don't cause any trouble! + - Pontis was built like a maze for defense. + - The bridge ceilings show that path's color! +primis_pontis_guard_1: + name: '&cPontis Guard' + role: '&8' + greetings: + - Want to upgrade gear? + dialog: + - Lost? Follow the bridge colors. + - Every bridge path has at least one color! + - Stay out of trouble! + - Don't cause any trouble! + - Pontis was built like a maze for defense. + - The bridge ceilings show that path's color! +primis_pontis_guard_2: + name: '&cPontis Guard' + role: '&8' + greetings: + - Hello! + dialog: + - This way to the shogun! +primis_pontis_guard_rat: + name: '&cPontis Elite Guard' + role: '&8' + greetings: + - Darn rats! + dialog: + - Filthy rats!!! + - Hold still,\ndarn you! + - Stop dodging\nmy attacks! + - Almost got one! + - Just die! + - Why wont you die!!! + - You can't dodge\nforever! + - Next strike! + - You're dead! + - How dare you\ndodge! + - Almost! +primis_pontis_guard_rat_at_wormhole: + name: '&cPontis Elite Guard' + role: '&8' + greetings: + - What's taking\nso long. + dialog: + - We got this\nunder control. + - Do not worry,\nthe elite guard\nis on the case! +primis_pontis_guard_shogun_1: + name: '&4Royal Guard' + role: '&8' + dialog: + - Don't go getting into trouble. + - Don't mind me, just keeping the peace. + - No funny business here. + - I've got my eye on you, adventurer. + - No questions, and no one gets hurt! + - Ain't got no time for messing around. + farewell: + - Safe travels, adventurer. +primis_pontis_guard_shogun_1_cat_quest: + name: '&4Royal Guard' + role: '&8' + dialog: + - Don't go getting into trouble. + - Don't mind me, just keeping the peace. + - No funny business here. + - I've got my eye on you, adventurer. + - No questions, and no one gets hurt! + - Ain't got no time for messing around. + farewell: + - Safe travels, adventurer. +primis_pontis_mille_arena_master_observatory: + name: Stella Hominis + role: + greetings: + - Hellos! + dialog: + - I hope to see many stars. + - Such heavenly bodies! + - The cosmos calls to me. + - Infinite possibilities. + - The ancient knowledge... + - I have tales to tell. + - If only you knew... + farewell: + - May the stars bless you. +primis_pontis_mille_concerned_shipmate: + name: '&3Delphium Calpurnius' + role: '&8' + dialog: + - Sigh. + - So much for my\nshipments... + farewell: + - Safe travels! +primis_pontis_mille_fields_camp_generic_npc_1: + name: '&cScribonia Ingenvinus' + role: '&c' + dialog: + - The most dangerous\nweapon is the one\nbetween your ears. + - Three arrows\nis all I need. + farewell: + - Catch ya later! +primis_pontis_mille_fields_camp_generic_npc_2: + name: '&cValador Lumus' + role: '&c' + dialog: + - I have hunted in\nmany places. + - Do you travel\na lot too? + farewell: + - May your blade be swift. +primis_pontis_mille_fields_camp_generic_npc_3: + name: '&cPhygia Ahala' + role: '&c' + dialog: + - Nothing like a\ngood hunt! + farewell: + - Stay safe. +primis_pontis_mille_fields_camp_generic_npc_4: + name: '&cAdrius Paterculus' + role: '&c' + dialog: + - The hunt calls! + farewell: + - Swift death. +primis_pontis_mille_fields_camp_generic_npc_5: + name: '&cCappadox Galerus' + role: '&c' + dialog: + - Join us, stranger! + farewell: + - Later. +primis_pontis_mille_fields_camp_generic_npc_6: + name: '&cSulpicio Rutilius' + role: '&c' + dialog: + - Hope our camp\nprovides you respite\nfrom the wild. + farewell: + - Bye. +primis_pontis_mille_fields_camp_generic_npc_7: + name: '&cAquarius Manus' + role: '&c' + dialog: + - Don't mind me just\nfetching some water. + - Clear blue water today. + farewell: + - Bye. +primis_pontis_mille_fields_camp_magmus: + name: '&cMagmus Hypnos' + role: '&4' + dialog: + - Where is Volumnia... + - I hope she isn't in\ntrouble again. + - I need a good rest. + - If only there were more\nhours in the day. + - Speak to me when you\nhave found Volumnia. + - So much work,\nso little time. + - Yet another 17 hour day. + - I worry too much. + farewell: + - Never enough time... +primis_pontis_mille_fields_farm_berry_npc: + name: '&9Dordalus Nasica' + role: '&e' + dialog: + - Berries are so tasty! + - You should eat\nmore berries! + - Why would they\nsteal my berries... + farewell: + - See'd ya later. +primis_pontis_mille_fields_farm_boy_npc: + name: '&9Planesium Victricius' + role: '&e' + dialog: + - So many rats... + - Phew almost\ndone here. + - This thing better hold. + - Any more lifting and\nI'm gonna break. + - The view from here\nis really nice. + - OK, back to work! + farewell: + - Try some our berries! +primis_pontis_mille_fields_farm_npc: + name: '&9Milonia Majus' + role: '&e' + dialog: + - Get away, darn rats! + - Stop eating my goods! + - Sigh... + farewell: + - Later. +primis_pontis_mille_fields_farm_well_npc: + name: '&eVolumnia Zoilus' + role: '&c' + dialog: + - Watch out for its spit! + - Its saliva is toxic. + - Please help! + - I hope nobody hears\nabout this... + - Am I glad to see you! + farewell: + - How could I let this happen. +primis_pontis_mille_fields_windmill_npc_1: + name: '&eDinia Niraemius' + role: '&d' + dialog: + - Plenty of wheat to process! + - No flour no bread. + - Do you like bread too? + farewell: + - See you. +primis_pontis_mille_fields_windmill_npc_2: + name: '&eDaemones Maritialis' + role: '&d' + dialog: + - It's so nice out here! + - Do you like my windmill? + - Just out here on break. + farewell: + - See you. +primis_pontis_mille_fields_windmill_npc_3: + name: '&eAdulescens Lupis' + role: '&d' + dialog: + - Hoping for some good wind! + - Need some flour? + - This one is the best Windmill around! + farewell: + - Bless ya. +primis_pontis_mille_general_bromia: + name: '&6Bromia Curio' + role: '&6General' + greetings: + - Hail! + dialog: + - It's time for war! + farewell: + - Goodbye! +primis_pontis_mille_general_cylindrus: + name: '&eCylindrus Celatus' + role: '&eGeneral' + greetings: + - Hail! + dialog: + - There is not enough time! + farewell: + - Goodbye! +primis_pontis_mille_general_godefridus: + name: '&cGodefridus Novation' + role: '&c' + greetings: + - Greetings! + - Hail! + dialog: + - Someone needs to drop\noff these documents. + - So many candles... + farewell: + - See you +primis_pontis_mille_general_rogerius: + name: '&eRogerius Olennius' + role: '&eGeneral' + greetings: + - Hail! + dialog: + - So much to do! + - I hope those 4 are ok... + farewell: + - Bye! +primis_pontis_mille_lighthouse_man: + name: '&3Hegio Remus' + role: '&c' + dialog: + - It is so beautiful up here. + - The best view... + farewell: + - Farewell. + - The sun sets! +primis_pontis_mille_major: + name: '&cFortes Bellator' + role: '&c' + greetings: + - Hello traveler! + - Hail! + dialog: + - Those darn goblins! + farewell: + - Farewell! +primis_pontis_mille_mew_meowzer: + name: '&aMew Meowzer' + role: '&d' + dialog: + - Meooooww! + - Meow... + - Mreeeooooowww... + - Meowww. + - MEOW! + farewell: + - Prrrr meow! +primis_pontis_mille_observatory_arena_turn_in: + name: Virgo Dexippus + role: + greetings: + - Hi! + dialog: + - Stella knows a lot. + - Stars have so much to tell. + - The light tells all. + farewell: + - May the moon light your way. +primis_pontis_mille_royal_guard_centurion: + name: '&4Royal Guard Centurion' + role: '&8' + dialog: + - No dallying! + - Set up camp! + - Where are our reinforcements? + - How many have fallen? + - We need to reorganize! + farewell: + - Tread lightly and carry a big sword. +primis_pontis_mille_scout_1: + name: '&cSyra Ursacius' + role: '&cWounded Scout' + greetings: + - Hail! + dialog: + - I can barely hold on... + farewell: + - Bye! +primis_pontis_mille_scout_2: + name: '&cSparax Auxilius' + role: '&cWounded Scout' + greetings: + - Hail! + dialog: + - The pain... + farewell: + - Bye! +primis_pontis_mille_scout_leader: + name: '&cBlepharo Octavius' + role: '&cScout Leader' + greetings: + - Hail! + dialog: + - It was too much... + farewell: + - Bye! +primis_pontis_mille_shogun: + name: '&6Navita' + role: '&c' + greetings: + - 네? + dialog: + - Can I help you? + farewell: + - Walk softly, and carry a big gun. +primis_pontis_mille_slums_generic_npc_1: + name: '&7Gallicles Rex' + role: '&7' + dialog: + - It's not much but its our\nlittle part of town + farewell: + - Later. +primis_pontis_mille_slums_generic_npc_2: + name: '&7Gallicles Caelistis' + role: '&7' + dialog: + - Day by day... + farewell: + - '...' +primis_pontis_mille_slums_generic_npc_3: + name: '&7Nicodemus Frontinus' + role: '&7' + dialog: + - Fresh water for\nthe home. + farewell: + - The well serves\nus well +primis_pontis_mille_slums_generic_npc_4: + name: '&7Cocus Lucio' + role: '&7' + dialog: + - Hope you're having\na great day. + farewell: + - Enjoy your stay. +primis_pontis_mille_slums_generic_npc_5: + name: '&7Cornelia Florius' + role: '&7' + dialog: + - Which one should\nI get... + farewell: + - So many pretty\nflowers. +primis_pontis_mille_slums_generic_npc_6: + name: '&7Rutilia Placidus' + role: '&7' + dialog: + - I love it here. + - The smell of hay\nmakes me happy. + - My favorite place to\nrelax after a hard day. + farewell: + - Hay ya later! +primis_pontis_mille_slums_npc_1: + name: '&7Lena Lucan' + role: '&7' + dialog: + - Just one loaf of bread... + farewell: + - Wonder what tomorrow brings. +primis_pontis_mille_slums_npc_2: + name: '&7Tranio Florens' + role: '&7' + dialog: + - Doing OK today\nactually. + farewell: + - Night save ya. +primis_pontis_mille_slums_npc_3: + name: '&7Rufia Tertulus' + role: '&7' + dialog: + - At least something\ngood for\nthe kids. + - Not much at\nthe market... + - I cannot\nafford that. + farewell: + - Later. +primis_pontis_mille_slums_npc_4: + name: '&7Fabia Praetextus' + role: '&7' + dialog: + - Just close my eyes\nfor a second. + - Gotta imagine I am\nat a better place. + farewell: + - Goodbye. +primis_pontis_mille_slums_npc_5: + name: '&7Augustina Verrucosis' + role: '&7' + dialog: + - So many mouths\nto feed. + - Maybe some fruit\nfor the little\nones. + farewell: + - Bye. +primis_pontis_mines_guard_1: + name: '&cPontis Guard' + role: '&c' + greetings: + - HELP!!! + dialog: + - Please kill them! + - I am so scared. +primis_pontis_mines_guard_2: + name: '&cPontis Guard' + role: '&c' + greetings: + - SOMEONE PLEASE!!! + dialog: + - I don't wanna die! + - Can't hold out any more. +primis_pontis_mines_guard_3: + name: '&cPontis Guard' + role: '&c' + greetings: + - SAVE ME!!! + dialog: + - Are they gone? + - GET ME OUT! +primis_pontis_outpost_officer: + name: '&4NAME ME' + role: '&8' + dialog: + - I am unfinished! + - There is supposed\nto be an outpost\nhere. + farewell: + - Bye! +primis_pontis_redwoods_injured_lumberjack: + name: '&6Lyco Lupicinus' + role: '&6' + greetings: + - Heyo! + dialog: + - Darn saw! + - Got me again... + farewell: + - See you later. +primis_pontis_redwoods_lumberjack: + name: '&6Ligna Crispian' + role: '&6' + greetings: + - Greetings! + dialog: + - I love the look of a healthy tree. + - The brown tree really smells. + - |- + Pretty sure I saw a wolf on two legs + creeping around at night around here. + farewell: + - Until next time. +primis_pontis_redwoods_lumberjack_generic_1: + name: '&6Mulier Proculus' + role: '&6' + greetings: + - Hey-yo! + dialog: + - I wish they would leave us alone. + - Perfect day for logging. + farewell: + - Pinecone ya later! +primis_pontis_redwoods_lumberjack_generic_10: + name: '&6Piscatores Trenico' + role: '&6' + greetings: + - Well met! + dialog: + - Go away wolves! + - Leave me alone, darn fur-balls! + - Hah! Try and reach me up here! + farewell: + - Bye, Bye! +primis_pontis_redwoods_lumberjack_generic_2: + name: '&6Alanus Hermina' + role: '&6' + greetings: + - Hi... + dialog: + - Not so loud, keep it down. + - I am catching an extra break. + - Don't tell em I am here. + - Logging is tough work... + farewell: + - Later +primis_pontis_redwoods_lumberjack_generic_3: + name: '&6Lena Triarius' + role: '&6' + greetings: + - What's up! + dialog: + - Just standing here buzzin! + - Operating the saw is kinda fun. + - Gotta make sure you don't get hurt. + farewell: + - Catch you later! +primis_pontis_redwoods_lumberjack_generic_4: + name: '&6Aquila Isatis' + role: '&6' + greetings: + - How's it going! + dialog: + - Darn logs! + - No, not that way! + - Float better!!! + - Yep, that will do it. + farewell: + - See ya! +primis_pontis_redwoods_lumberjack_generic_5: + name: '&6Sulpicio Sidonius' + role: '&6' + greetings: + - Hi! + dialog: + - Nothing like a nice fire! + - Just relaxing after an honest day of work. + - Join us! + farewell: + - Bye, friend! +primis_pontis_redwoods_lumberjack_generic_6: + name: '&6Strobilus Clemens' + role: '&6' + greetings: + - Salutations! + dialog: + - Chopping like a beaver! + - The fastest axe in the west. + - No tree is a match for me! + farewell: + - Smell ya later! +primis_pontis_redwoods_lumberjack_generic_7: + name: '&6Candidus Nigellus' + role: '&6' + greetings: + - Greetings! + dialog: + - Fastest axe...my bottom! + - Don't take his ramblings seriously. + - Mr. big-shot sure has a lot to say. + farewell: + - Goodbye! +primis_pontis_redwoods_lumberjack_generic_8: + name: '&6Strobilus Clemens' + role: '&6' + greetings: + - I'm a bit busy! + dialog: + - We need to increase production... + - If we raise the cost... + - Need to order more axes. + farewell: + - Uh... +primis_pontis_redwoods_lumberjack_generic_9: + name: '&6Martinus Lepontus' + role: '&6' + greetings: + - Woah, hello! + dialog: + - You're coming down big one! + - I will show you! + - My axe, your bark, they should meet. + - Start off with a good chop. + farewell: + - Scared me... +primis_pontis_redwoods_lumberlord: + name: '&6Magnus Castorea' + role: '&6' + greetings: + - HELLO! + dialog: + - Nothing like healthy wood. + - |- + For every tree we cut, + we plant a new one! + - Big brown logs, yep. + farewell: + - BYE! +primis_pontis_redwoods_reyn: + name: '&6Reynus Protectoris' + role: '&6' + greetings: + - I am turning up the heat! + - Hiya! + dialog: + - Are you into logs? + - I love the smell of lumber! + farewell: + - See you later. + - Bye bye! +primis_pontis_scrapper: + name: '&7Fragmentum' + role: '&8' + greetings: + - Got something to scrap? + - Got trash? + - Need scrappin'? + dialog: + - I'll scrap anything you bring! + - Need scrap? + - Want scrap? +primis_pontis_smelter: + name: '&7Orbis' + role: '&8' + greetings: + - Want to upgrade gear? + dialog: + - Need upgrade orbs? + - I'll make upgrade orbs for scrap! + - Bring me scrap! +primis_sewer_donatello: + name: '&5Donatello' + role: '&dSewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_sewer_leonardo: + name: '&1Leonardo' + role: '&9Sewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_sewer_michelangelo: + name: '&6Michelangelo' + role: '&eSewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_sewer_raphael: + name: '&4Raphael' + role: '&cSewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_spa_attendee_1: + name: '&fNatsumi' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_2: + name: '&5Hanako' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_3: + name: '&3Tamika' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_4: + name: '&9Zaphra' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_5: + name: '&4Chie' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_6: + name: '&fKatashi' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_7: + name: '&dAkihiko' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_8: + name: '&6Sheranee' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - Rawr... + - OwO + farewell: + - Have fun! +primis_spa_staff: + name: '&cAozora' + role: '&7' + dialog: + - Enjoy the hot spring! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_staff_2: + name: '&6Rei' + role: '&7' + dialog: + - Enjoy the hot spring! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_terravilla_annoyed_explorer: + name: '&6Dorippa Sarimarcus' + role: '&6' + greetings: + - How's it going. + dialog: + - Not again. + - Stuck once more. + farewell: + - Be seeing you. +primis_terravilla_explorer: + name: '&6Telestis Senna' + role: '&6' + greetings: + - How goes it. + dialog: + - Always so\nbusy. + - Need a bag? + farewell: + - Bye. +primis_terravilla_generic_npc_1: + name: '&6Stephanium Major' + role: '&6' + greetings: + - Welcome to Terravilla! + dialog: + - Watch out for the\nTwo Legged Terrors! + - Here to check out the ruins? + farewell: + - Bye. +primis_terravilla_generic_npc_10: + name: '&6Mallia Galvisius' + role: '&6' + greetings: + - Heyo! + dialog: + - I would rather be in\ndown in the ruins... + - Hog watching to\npass the time. + farewell: + - Laters. +primis_terravilla_generic_npc_11: + name: '&6Papiria Virginius' + role: '&6' + greetings: + - Ok then... + dialog: + - Hit him harder! + - Woah! Good one! + - Yeah! Mess him up! + farewell: + - Yep... +primis_terravilla_generic_npc_12: + name: '&6Umbria Maccalus' + role: '&6' + greetings: + - What! + dialog: + - Is a girl not\nallowed to be\non a rooftop. + - Just try and\nget me down! + farewell: + - Yeah, whatever... +primis_terravilla_generic_npc_2: + name: '&6Delphium Assanius' + role: '&6' + greetings: + - Leave me alone! + dialog: + - What are you\nlooking at. + farewell: + - Scram! +primis_terravilla_generic_npc_3: + name: '&6Stephanium Vopiscus' + role: '&6' + greetings: + - Leave me alone! + dialog: + - What are you\nlooking at. + farewell: + - Scram! +primis_terravilla_generic_npc_4: + name: '&6Simo Clericus' + role: '&6' + greetings: + - Hey! + dialog: + - Heard the hog is on\nthe lift again. + farewell: + - Bye. +primis_terravilla_generic_npc_5: + name: '&6Harpax Colias' + role: '&6' + greetings: + - Ello. + dialog: + - The bo...I mean the\nOverseer is upstairs. + farewell: + - Laters. +primis_terravilla_generic_npc_6: + name: '&6Sulpicio Epolonius' + role: '&6' + greetings: + - Hi there. + dialog: + - I hope the ruins\nopen up again soon. + - I miss artifact\nhunting. + farewell: + - Goodbye. +primis_terravilla_generic_npc_7: + name: '&6Baebia Lucan' + role: '&6' + greetings: + - '...' + dialog: + - Cringe... + farewell: + - '...' +primis_terravilla_generic_npc_8: + name: '&6Novia Longinus' + role: '&6' + greetings: + - '...' + dialog: + - Are you always\nstaring at people? + - How about some\nprivacy? + farewell: + - '...' +primis_terravilla_generic_npc_9: + name: '&6Septimia Baro' + role: '&6' + greetings: + - Oh, hey. + dialog: + - If it opens up again\nthen I gotta go\nget more of these. + - What is this skull\nnfrom hmm... + farewell: + - '...' +primis_terravilla_overseer: + name: '&6Lutum Princeps' + role: '&6' + greetings: + - Yes? + dialog: + - What is it\nnow... + - I need to check\nup on them. + - At least I\nam not bored. + farewell: + - Good luck. +primis_terravilla_researcher: + name: '&6Plautia Suilius' + role: '&6' + greetings: + - Hmm... + dialog: + - Maybe if... + - That can't be right + - Not sure... + farewell: + - Later... +primis_traveler_1: + name: '&6Lysidamus Nolus' + role: '&6' + greetings: + - Hello stranger! + dialog: + - On my way back from the village. + - Heading to the village? + - Good luck on\nyour travels. + farewell: + - Roads bless you. +primis_traveler_2: + name: '&6Citro Gala' + role: '&6' + greetings: + - Hi! + dialog: + - On my way back\nfrom the village. + - Coming from Pontis Mille or? + - Good luck! + farewell: + - Roads bless you. +primis_traveler_3: + name: '&6Bromia Culleolus' + role: '&6' + greetings: + - Hello! + dialog: + - Are you too going\nto the village? + - I heard it's pretty\ncold there at\nthe village. + - Phew! Almost there!\nI gotta keep going. + farewell: + - Roads bless you. +primis_traveler_4: + name: '&6Demenis Nolus' + role: '&6' + greetings: + - Hello stranger! + dialog: + - Good to see someone\nelse on the road. + - Almost reached the village. + - Phew! + farewell: + - Roads bless you. +primis_traveler_5: + name: '&6Callipho Classicius' + role: '&6' + greetings: + - Heya! + dialog: + - I need better shoes. + - Soon I will\nbe home. + - Good to see the\nfields again! + farewell: + - Safe travels! +primis_traveler_6: + name: '&6Rodenus Palis' + role: '&6' + greetings: + - Hi there! + dialog: + - I am on my way back\nfrom the village. + - Good to see\nPontis Mille again. + - Is my brother lost again... + - Where is he? + farewell: + - Later! +primis_traveler_7: + name: '&6Gorenus Palis' + role: '&6' + greetings: + - Hey... + dialog: + - Am I lost again? + - This isn't Pontis Mille. + - Where am I? + - Uhh, this doesn't\nseem like the\nright way... + farewell: + - Bye. +quest_giver: + name: Qel'Thuzad + role: + greetings: + - Greetings, adventurer!\nFancy a quest? + - You! I've got a quest! + - Feeling... adventurous? + dialog: + - Complete guild quests\nfor cool rewards! + - Higher tier quests have\nbetter rewards! + - Higher tier quests make\nyou hunt higher level mobs! + - Want a harder challenge?\nIncrease your guild rank! + - Make sure you're well equipped\nfor these quests! + farewell: + - 안전한 여행, 친구. + - 즐거운 사냥 되세요! + - Live long and prosper! + - Come back with your shield,\n or on it. + - Life before death! + - Strength before weakness! + - Journey before destination! +refiner_config: + name: 랠프 + role: <정제가> + greetings: + - 너의 조각을 업그레이드 하고 싶니? + - 조각 가지고 있니? + - 낮은 레벨의 조각을 찾고 있습니다! + - 만나서 반가워요, 조각을 가지고 있나요? + - 네 조각을 재활용해 줄게! + dialog: + - 조각 업그레이드가 필요하신가? + - Upgrade your scrap here! + - 조각 10개를 더 높을 레벨로 업그레이드 해줄게! + - 너의 조각을 더 유용하게 만드세요! + - 낮은 레벨의 조각 가지고 있니? + farewell: + - \n더 낮은 레벨의 조각이 있을 때 다시 오세요! + - \n그 조각을 유용하게 만드는 것을 잊지 마세요! + - 가서 조각 더 구해와! +repairman_config: + name: 레지 + role: <수리공> + greetings: + - 당신의 아이템을 수리하세요! + - 스크랩을 통해 아이템을 수리하세요! + - 그 고철을 내구성으로 바꿔라! + - 수리가 필요하니? + - 손상된 아이템이 있습니까? + dialog: + - 마을에서 가장 좋은 수리! + - 내가 알아서 해. + - 수리 필요해? + - 내가 너의 아이템을 수리해줄게! + - 엘리트 아이템을 수리해야 합니까? + farewell: + - 유지 보수하는 것을 잊지 마세요! + - 내가 필요하면 여기 있을게! + - 나에게 연락을 하고 싶다면 연락해 줘, \n전화를 걸고 싶다면 괜찮아 +santa: + name: '&4Saint Nick' + role: '&c' + greetings: + - Ho ho ho! + dialog: + - I have lost some presents, \ncan you help me? + - Dear traveller, I have\na request for you! + - Can you help an old man\nin his time of need? + farewell: + - Ho ho ho! +scrapper_config: + name: 켈리 + role: <아이템 분해> + greetings: + - 아이템을 없애고 싶으신가요? + - 재활용이 필요한가요? + - 조각을 보고 있나요? + - 시계 조각! + - 조각 시간! + dialog: + - 말도 안 되는 거래 + - 여기서 조각을 얻으세요! + - 75% 확률로 획득! + - 환불은 안됩니다. + - 재활용, 재사용, 감소! + farewell: + - 폐기할 것이 \n더 있을 때 다시 오세요. + - \n그 조각을 유용하게 만드는 것을 잊지 마세요! + - 즐거운 조각! +smelter: + name: 샘 + role: <제련 대장장이> + greetings: + - 조각 가지고 있니? + - 조각 더 있어? + - 너한테서 조각 냄새가 나! + - 네 제발 조각 좀 줘! + - 조각 좀 줘! + dialog: + - 내가 너의 조각을 유용하게 만들게! + - 조각을 \n주면 오브를 업그레이드를 해줄게! + - 조각은 쓸모 없어, 이리 줘!! + farewell: + - \n더 많은 조각이 있을 때 다시 오세요! + - 업그레이드로 이동합니다! +special_blacksmith: + name: 그로그 + role: <특별한 대장장이> + greetings: + - 필요한거 있니? + - 괜찮은 물품 있니? + - 우리는 가장 좋은 것 외에는 아무것도 없다. + - 뭐 팔 만한 거 있니? + - 우리는 오직 Elite몹 무기만 구매가능해. + dialog: + - 우리는 싸게 사서 비싸게 판다. + - 환불은 불가능해. + - 절대로 환불되지 않어. + - 환불은 안됩니다. + - 너 뭐 무르기 없기다. + - 상점의 구매는 최종입니다. + farewell: + - \n 더 쓸일 있으면 와 + - 자신을 죽이지 마세요,\n 우리는 당신이 우리에게 \n더 많은 장비를 가져다 주시기를 바랍니다. + - 다음번에는 \n좀 더 비싼 것을 구매해주세요. + - 잊지 마세요, 환불은 안됩니다. +test_npc: + name: Test NPC + role: Testing! + greetings: + - Test Greeting! + dialog: + - Test Dialog! + farewell: + - Test Farewell! +travelling_merchant: + name: Jeeves + role: + greetings: + - 뭐 팔거 있어? + - You called? + - Huh? + dialog: + - I'll buy it on the cheap! + - Got something for me? + - Time is money! + farewell: + - Call me again anytime! + - Was that all? + - Safe travels! + - Don't get yourself killed! + - Good hunting! +unbinder: + name: 울프릭 + role: <언바인더> + greetings: + - 안녕하세요. + - 만나서 반가위요. + - 안녕, 친구. + - 네? + - 도울 일 있나요? + dialog: + - \n매우 희귀한 언바인드 스크롤을 위해 당신의 아이템을 언바인드 해드리겠습니다. + - 나는 당신의 물건을 \n풀 수 있는 유일한 사람입니다. + - 언바이든 스크롤 가지고 있니? + farewell: + - 'Remember: 언바인드 스크롤을 현명하게 사용해.' + - 안전한 여행, 친구. +wood_league_arena_master: + name: Gladius + role: + greetings: + - Welcome to the\nArena! + dialog: + - Prepared to face the arena? + farewell: + - Return with your shield, or on it! +wood_league: + arenaName: Wood League + arenaMessages: + - wave=1:message=&8[Gladius] &fToday's main event! A legendary fighter came all the way to the arena to test his might against the toughest monsters from all the land! But before that, here's a rookie fighting some zombies. + - wave=2:message=&8[Gladius] &fWould you look at that, they at least know how to wave their arms! That was just the warmup, let's start putting on some pressure! + - wave=3:message=&8[Gladius] &fSo you think you know how to fight? Well this wave will put the &cheat &fon! Ha ha ha ha ha! + - wave=4:message=&8[Gladius] &fAlright I guess they can take the heat! Ladies and gentlemen, strap on, we might be in for a show! + - wave=5:message=&8[Gladius] &fI found this &cweird creature &foutside, and I thought putting it in the arena would be funny! + - wave=6:message=&8[Gladius] &fSeems like you can handle small groups of enemies just fine, &clet's try scaling that up! + - wave=7:message=&8[Gladius] &fSo you think you can truly challenge the arena? We shall see... + - wave=8:message=&8[Gladius] &fNot bad, but what if every enemy is a &cmelee &fenemy? + - wave=9:message=&8[Gladius] &fNice, nice, but what if they're all &cranged &finstead? + - wave=10:message=&8[Gladius] &fCareful now, a &cbad doggo &fseems to have wandered into the arena! Where did it even come from? + - wave=11:message=&8[Gladius] &fAlright folks we got animal control to deal with the bad doggos, we're back in business! + - wave=12:message=&8[Gladius] &fIt seems like the audience is clamoring for &cmore&f! Well, let's give it to them! + - wave=13:message=&8[Gladius] &fSeems like the custodians got bored and gave the arena creatures &2poison&f! Let's see where this goes... + - wave=14:message=&8[Gladius] &fWell that was... boring! Whoever gave those guys poison is fired! Come up with something better next time! + - wave=15:message=&8[Gladius] &fAnd here we have this year's prize-winning &4hog&f! It got first place for ugliness and meanness! Everyone give a round of applause for &4Mr. Oinkers&f! + - wave=16:message=&8[Gladius] &fMr. Oinkers is now bacon! Here comes &cMr. Oinker's fans&f, flooding the arena to get their revenge! + - wave=17:message=&8[Gladius] &fIt would seem as though our arena challenger thinks they have a shot! But can they deal with even more &cpowerful &ffoes? + - wave=18:message=&8[Gladius] &fThe &cfencing club &fand the &carchery club &fare having a contest! Let's see which one does better! + - wave=19:message=&8[Gladius] &fThe fencing club didn't so so hot, let's see what the &carchery club&f has for us! + - wave=20:message=&8[Gladius] &fSeems like the archery club didn't do so hot either! It seems like our challenger has begun attracting the attention of some of our top gladiators! Introducing &2Zoltan, the Pride of the Zombies&f! + - wave=21:message=&8[Gladius] &fUnbelievable! Seems like this rookie defeated Zoltan! Do we have a potential new champion in our hands? + - wave=22:message=&8[Gladius] &fSpectators are starting to place their bets! How far can today's contestant go? + - wave=23:message=&8[Gladius] &fDon't look away now, this wave's enemies all have &cwithering &fattacks! + - wave=24:message=&8[Gladius] &fSeems like some pretty big arena names are starting to arrive to stop this challenger! Stay tuned! + - wave=25:message=&8[Gladius] &fHere comes &bAgdluak&f, the archer from the Great North! Beware of its &bfrost&f! + - wave=26:message=&8[Gladius] &fThat was a pretty cool fight! I am &cswarming &fwith excitement to see what's next! + - wave=27:message=&8[Gladius] &fI've been told the arena grows harder! &cZombies immune to arrows, skeletons that freeze their opponents &f- what will they think of next!? + - wave=28:message=&8[Gladius] &fIt's time to show off those &cfencing &fskills! Remember, it's all about the legwork! + - wave=29:message=&8[Gladius] &fAnd now, let's have some &ctarget practice&f! The challenger is the target! + - wave=30:message=&8[Gladius] &fA true arena champion approaches! The &2Southern Viper &fonce again seeks to &cpoison &ftheir enemies to death with his &cthousand poisons&f! + - wave=31:message=&8[Gladius] &fThe Southern Viper has fallen! The crowd goes wild! What a day, ladies and gentlemen, what a day! + - wave=32:message=&8[Gladius] &fI have been told that the arena custodians are done messing around and are staring to let loose! Can our challenger survive this? + - wave=33:message=&8[Gladius] &fSeems like some enemies got their hands on some of Southern Viper's &cpoisons&f! You do not want to get hit by those, ladies and gentlemen! + - wave=34:message=&8[Gladius] &fBobby, make sure you put 1,000 Elite Coins on these contestants dying for me - no, no, 1,000 Elite Coins - wait was this thing on? I mean, onwards to the next wave! + - wave=35:message=&8[Gladius] &fLadies and gentlemen, what a rare treat! It would seems as the very &aWood League Jester &fhas stepped up to fight! What delightful &2tricks &fdoes he have for us today? + - wave=36:message=&8[Gladius] &fWhat a lovely show ladies and gentlemen, give it up for &aThe Jester&f! + - wave=37:message=&8[Gladius] &fBobby, how is my bet doing? What do you mean 10,000 Elite Coins, I told you to put 1,000 on there! Uh, pump them, &cpump the powers up&f! + - wave=38:message=&8[Gladius] &fBobby you're killing me here! Uh, dump some &cswordsmen &fon there, I need to deal with something real quick... + - wave=39:message=&8[Gladius] &fWhat do you mean no refunds? I didn't even want to - ahem, I mean, a legion of &carchers &fhave come from far to show off their skills! + - wave=40:message=&8[Gladius] &fLadies an gentlemen, for, uh, random reasons, I have invited the strongest fighter I can summon! Meet &4Crucios, the Bearer of Curses&f! + - wave=41:message=&8[Gladius] &fCrucios has been defeated!? What has the world come to? + - wave=42:message=&8[Gladius] &fA wealthy for now patron has decided to throw in free healthcare to arena enemies! Will they do better with &2healing&f? + - wave=43:message=&8[Gladius] &f&cWither&f, &cpoison, &cfire&f throw in everything you have! Do you even know how much is on the line!? + - wave=44:message=&8[Gladius] &fThis is clearly not working, let me think of something... + - wave=45:message=&8[Gladius] &fHere is one of the top gladiators of the Wood League Arena! &cThousand Blades &fapproaches once again with his &cinnumerable projectiles&f! He better win! + - wave=46:message=&8[Gladius] &fThousand Blades has fallen! It just seems like you can't get competent gladiators these days! That's fine, you'll see! You'll all see! &cRelease the swarm! + - wave=47:message=&8[Gladius] &fIf swarms don't work, throw in &cmore powers&f! Throw in all of the powers! + - wave=48:message=&8[Gladius] &fWe are starting to run out of options here! Are these all of the &cswordsmen &fwe have left? + - wave=49:message=&8[Gladius] &fAlright send all we have left, we have no other options! Move forth, &carchers&f! + - wave=50:message=&8[Gladius] &fI guess this is it for me... I have no option but to declare - wait, who is that in the distance? Is that &4Uther, the Champion of the Wood League Arena&f? Ladies and gentlemen, match set and over, our contestant has no chance of winning here! They shall be &csmitten &fby our champion! + - wave=51:message=&8[Gladius the Destitute] &fUnbelievable, Uther has been defeated! We have a new arena champion! I would be incredibly excited if I wasn't so terribly in debt now! +ag_welcome_quest_0: + customObjectives: + Objective1: + dialog: + - '&8[&aCasus&8]&f Welcome to the Adventurer''s Guild Hub, the hub for all things EliteMobs!' + - You can always get back here using &2/ag&f! + - Talk to me again for a quest! + name: '&2Finding the AG!' + questLore: + - Discover the Adventurer's Guild Hub using the command &2/ag &0or &2/adventurersguild ! + questAcceptDialog: + - '&8[Odigos]&f Alright, make sure you use &2/ag &f or &2/adventurersguild&f to head off to the Adventurer''s Guild Hub!' + - Make sure you talk to Casus when you're there! +ag_welcome_quest_1: + customObjectives: + Objective3: + dialog: + - '&8[&aGreg&8]&f Want to buy or sell something? I''ve got a little of everything!' + Objective4: + dialog: + - '&8[&aCharles&8]&f Want to learn about fighting elites? Just talk to me!' + Objective1: + dialog: + - '&8[&aHermes&8]&f I take you back to where you were before! Just talk to me again!' + Objective2: + dialog: + - '&8[&aBartley&8]&f Need a stiff drink? My drinks pack an extra punch!' + Objective7: + dialog: + - '&8[&aQel''Thuzad&8]&f These Elite monsters, where do they keep coming from?' + - Ah, never mind that for now, we are always in need of more people to assist us in slaying quests! + - Just talk to me to get one! + Objective12: + dialog: + - '&8[&aGrog&8]&f Want to buy special items? I''ve got just the thing!' + Objective8: + dialog: + - '&8[&aRalph&8]&f Get more out of your scrap by upgrading it! Just talk to me at any time.' + Objective13: + dialog: + - '&8[&aUlfric&8]&f If you bring me a very special and rare item, I can unbind your Elite items.' + - You don't yet look prepared to take this challenge on, but you can make killing the Binder of Worlds your ultimate goal, if you dare. + Objective5: + dialog: + - '&8[&aTim&8]&f Want to upgrade your Elite Items? Just get an upgrade orb from Sam over there!' + Objective10: + dialog: + - '&8[&aKelly&8]&f Got extra Elite items? Don''t know what to do with them? Give them to me, and I''ll turn them into scrap!' + - You can use scrap to do lots of things, like repairing or upgrading Elite items! + Objective6: + dialog: + - '&8[&aGillian&8]&f Do you seek power? Do you desire to reach new heights? Talk to me to unlock new guild ranks, and reach levels of power you never thought to be possible!' + Objective11: + dialog: + - '&8[&aSam&8]&f Got extra scrap? I can refine that into Upgrade Orbs, which you can give to Tim to upgrade your Elite items with!' + Objective9: + dialog: + - '&8[&aReggie&8]&f Need your Elite items repaired? Just bring me some scrap, and I''ll make them as good as new!' + - Remember, the higher the level of your scrap, the better I can repair you Elite item! + name: '&2Welcome to the AG!' + questLore: + - '&aMeet the Adventurer''s Guild NPCs!' +primis_caeruleaum_a_can_of_worms: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis] &fPlease tell me you''re the one bringing the bait.' + name: '&2A can of worms' + questLore: + - Here, take the bait and go. + - Please hurry! + questAcceptDialog: + - '&a[Callidus Piscatus]&f My friend is in a boat near the docks!' + - '&7&oI should hurry to the boat.' + questCompleteMessage: + - '&a[Piscis Nemesis]&f You brought bait? Perfect!' + - The bait should lure it out! + - '&7&oI should talk with Nemesis.' +primis_caeruleaum_fishing: + name: '&2Fish Bait' + questLore: + - We have a big problem! + - I got wounded by a monstrous &cSea Creature&f that came from a fishy portal to another realm! + - My friend &aPiscis Nemesis&f is still out on the boat, trying to either fight the creature or close the portal, + - but he can't do anything without the right bait! + - I'll tell you where to go get &eFish Bait &f, please go help my friend! + - I promise I'll reward you! + questAcceptDialog: + - '&a[Callidus Piscatus]&f Time is of the essence! There are a bunch of &cBig Worms&f to the right when you leave the village!' + - Get 5 and come back here and I will prepare them for use. + - '&7&oI should go get some Fish Bait.' + questCompleteMessage: + - '&a[Callidus Piscatus]&f You brought bait? Perfect!' + - I'll prepare it right away! + - '&7&oI should talk to &aCallidus &7&oagain and collect the prepared bait.' +primis_caeruleaum_fishing_2: + name: '&2Monster Bait' + questLore: + - That did the trick! Hop into the wormhole, I'll hold the boat! + - Let's show this monster the wrath of a fisherman! + questAcceptDialog: + - '&a[Piscis Nemesis]&f Hop in, I''ll hold the boat!' + - Don't forget to put on that &eDiving Helmet&f! + - '&7&oI should enter the wormhole and defeat the Sea Monster.' + questCompleteMessage: + - '&a[Piscis Nemesis]&f Haha! What a show!' + - '&fOf course, I had the situation under control this entire time, but you sure helped a bit!' + - '&fHere, you can have this!' + - '&7&oThe monster is dead and the shore is safe. Seems like a job well done.' +primis_caeruleaum_fletching: + name: '&2Arrow Hunter' + questLore: + - Got a few minutes to help out? + - With all the recent raids, we have found ourselves out of &eGrappling Arrows&f! + - It is usually my job to get them, but things are just a + - bit too dangerous right now for me to go dungeon delving. + - If you could get these &eGrappling Arrows&f for me, + - I will teach you how to use them! + questAcceptDialog: + - '&a[Ventus Artifex]&f Please bring me 10 &eGrappling Arrows &ffrom the ruins just beyond the village.' + - The &cUndead Skeletons&f and &cDrowned&f from of old usually carry these. + - '&7&oI should go kill &cSkeletons&7&o and &cDrowned&7&o at the ruins near the village for their &eGrappling Arrows&7&o.' + questCompleteMessage: + - '&a[Ventus Artifex]&f Great work!' + - '&eGrappling Arrows &fcan be used on &cTarget Blocks &fto get to hard to reach places.' + - They are a must have for the aspiring ancient ruin delver. + - Here is your reward! + - How about putting your knowledge to the test? + - '&7&oSeems like &aVentus Artifex&7&o has a challenge for me.' +primis_caeruleaum_fletching_2: + name: '&2Shield Hunter' + questLore: + - You got the arrows? Great! + - Use those arrows with a bow to climb the tower! + questAcceptDialog: + - '&a[Ventus Artifex]&f Use the arrows you just received to go to the ruins and shoot the targets with them!' + - Inside of the ruins there are rumors of an ancient chest. Not very useful to anyone... but collectors! + - Go and grab me that &eShield&f, and I will trade it with something more... useful... to you! + - '&7&oI should go get the &eShield&7&o inside of the ruins, using the &eGrappling Arrows&7&o in order to shoot the targets inside of the building.' + questCompleteMessage: + - '&a[Ventus Artifex]&f Outstanding!' + - Truly you are a real ruins delver! + - Here is your reward! + - '&7&oSeems like Grappling Arrows will be useful in the future.' +primis_caeruleaum_foraging: + name: '&2Wolf Bait' + questLore: + - I heard you were looking to help out around here. + - There is a &dDen of Wolves&f nearby that is + - really impeding my foraging for the village! + questAcceptDialog: + - '&a[Venator Pabulatus]&f If you can get rid of those pesky &cWolves&f, I will reward you handsomely!' + - I am getting too old to be dealing with the wild things of these lands... + - '&7&oI should go kill the &cWolves&7&o in the den to the Southeast of the village.' + questCompleteMessage: + - '&a[Venator Pabulatus]&f I knew I could count on you!' + - Thank you for all of your help! + - Here is your reward as promised. +primis_farmstead_lighthouse_keeper_2: + customObjectives: + Objective1: + dialog: + - "&a[Jeeves]&f &2Amavit&f sent you? What's this about a lighthouse? My, what a discovery!\n&fThis will revolutionize my job as a traveling merchant! Here, have these &eScrolls&f - just call me and I'll be there in a jiffy!\n&7&oSeems like &aJeeves&7&o has something for me. I should talk to him." + name: '&2The Mysterious Lights' + questLore: + - A strange light started being emitted from the &dTop of the Lighthouse&f when you... dealt with the issue. + - My father &aJeeves&f went to the top to check but he has not returned yet. + - My heart can not bear to suffer any more, and we already owe you much - but if you could investigate the issue and find my father, I would be eternally grateful. + questAcceptDialog: + - '&a[Amavit]&f Thank you once again, and good luck. Hopefully it''s nothing.' + - '&7&oI should go to the &dTop of the Lighthouse&f, investigate the issue and then report back to &aAmavit''s&f father &aJeeves&f in the village.' + questCompleteMessage: + - '&7&oThese scrolls seem mighty useful! I should use the &dLighthouse&7&o to get back to the &dFarmstead&7&o and keep moving.' +primis_gladius_assassins: + name: '&5Who snipes the snipers?' + questLore: + - The roofs of &dGladius&f are covered in &cAssassins&f! + - Venturing out to the streets is a death sentence. We need to deal with these snipers! + - There are some spots for &eGrappling Arrows&f on the roofs, make good use of them and deal with those snipers! + questAcceptDialog: + - '&a[Belli] Deal with those &cAssassins&f! Remember to use the &eGrappling Arrows&f!.' + - '&7&oI should kill those &cAssassins&7&o.' + questCompleteMessage: + - '&a[Belli]&f You dealt with those &cAssassins&f? Good! That''s one headache dealt with!' +primis_gladius_clear: + name: '&5Taking back the streets' + questLore: + - I don't need to tell you that the town is being invaded, do I? + - We are offering a reward to those willing to put a dent in the amount of &cInvaders&f. + - Are you up for it? + questAcceptDialog: + - '&a[Belli] &fJust go out there and thin their numbers!' + - '&7&oI go out and clear the streets of &dGladius&7&o.' + questCompleteMessage: + - '&a[Belli]&f Look at that, the Gods have provided with a true warrior in our time of need! I have a job for a person like you.' + - '&7&oSeems like &aBelli&7&o has a plan for me. I should talk to her..' +primis_gladius_prayer: + name: '&5Leap of faith' + questLore: + - I am not going to sugarcoat it, things look downright grim! + - The walls have fallen, the streets are teeming + - with the &cUndead&f and I just ran out of drinks. + - At times like these, people turn their hope to + - some kind of divine intervention! + - There is a &dPath&f, lit by candles, that leads to a + - '&dSanctuary in the Mountains&f.' + - Warriors go up this path and defeat the &cMonk&f which guards + - the sanctuary in order to be blessed by the war god in combat. + - It may just be a superstition, but would it hurt + - to give people hope? + - The fact you made your way here shows you are a cut above + - the rest - go up the mountain and defeat the &cMonk&f. + - All warriors will feel better knowing they are being watched over. + questAcceptDialog: + - '&a[Belli] &fGo &dUpstairs&f and follow the candles! Careful not to fall, the path is treacherous!' + - '&7&oI should follow the &dandle Path&7&o and defeat the &cMonk&7&o.' + questCompleteMessage: + - '&a[Belli]&f You completed the prayer? Thank you, the soldiers will feel relieved to hear it.' +primis_gladius_ships: + name: '&5A sinking feeling' + questLore: + - Have you seen them? The dozens of ships just outside + - of &dGladius&f? They are to blame for all of this. + - We never expected an invasion from the &dBlood Temple&f, + - much less one done by siege weapons mounted on boats! + - We must do something about it. Killing the &cAdmiral&f + - and some of the forces won't give us back what we lost, + - but it will sure make us feel better. + questAcceptDialog: + - '&a[Belli] &fKill the &cAdmiral&f and some of the troops on the boats. Be careful about their water superiority! I recommend using &eGrappling Arrows&f to move around the ships.' + - '&7&oI should go slay the &cAdmiral&7&o and some of its troops on the boats just &dOutside of Gladius&7&o.' + questCompleteMessage: + - '&a[Belli]&f The admiral is no more? Why, I feel better already!' +primis_gladius_sunken_ship: + name: '&5Sunken ship' + questLore: + - Now that you took care of the &cMariner Forces&f I got + - another task for you. + - The &dSunken Ship&f should be reachable now. + - You see some time ago one of our ships got sunk, + - unfortunately it was carrying &eImportant DDocuments&f. + - I need you to reach the &dSunken Ship&f and kill any threats + - around and retrieve the &eDocuments&f. + - Come back to me after you have completed the task. + questAcceptDialog: + - '&a[Belli] &fYou will find the ship in the waters to the south-west. Give them hell!' + - '&7&oI should go collect the &eDocuments&7&o and slay any &cMariners&7&o near the ship.' + questCompleteMessage: + - '&a[Belli]&f Back already? Excellent work! We really needed these &eDocuments&f.' +primis_gladius_supplies_1: + name: '&cSupplying problems' + questLore: + - We are running out of &eSupplies&f! + - '&dGladius&f is a fortress equipped to last a long siege' + - without any issues, but that's assuming we have + - access to the &dWarehouse&f! + - Unfortunately the &dWarehouse&f was one of the first places to fall, + - and now we are slowly starving to death! + - If you can clear a path to the &dWarehouse&f and get some &eSupplies&f + - that would greatly aid in the war effort! + questAcceptDialog: + - '&a[Cibus]&f The &dWarehouse&f is hard to miss! It''s the extra large warehouse-looking building near the part where the wall fell! Grab some &eSupplies&f and get them back here!' + - '&7&oI should go to the &dWarehouse&7&o and bring back &eSupplies&7&o.' + questCompleteMessage: + - '&a[Cibus]&f You brought the &eSupplies&f back? Fantastic! Meanwhile I came up with the perfect idea for the drinks - and it should be something that will lift the spirits of the soldiers!' + - '&7&oSeems like the &aCibus&7&o has a plan, I should talk to them.' +primis_gladius_supplies_2: + name: '&cSupplying more problems' + questLore: + - We have food, but what about drinks? + - Some would say it's foolish to get drunk in the middle + - of a war, but if now then when? + - The &cBarkeep&f across the street kept all of the good + - stuff in the &dBasement&f. + - I think you know where I'm going with this! + - Go to the &dBasement&f of the tavern across the street and get + - the &eGood Stuff&f. If you find the &cBarkeep&f, I'd consider it a + - personal favor if you free him from this curse of undeath. + - We are pretty sure that he was in the &dBasement&f when the + - invasion happened so odds are he is still there, + - though probably no longer himself. + - Be careful! + questAcceptDialog: + - '&a[Cibus]&f The &dTavern&f is right across the street, hard to miss! Just head to the &dBasement&f and get the &eGood Stuff&f!' + - '&7&oI should go to the &dBasement&7&o of the tavern and get "the &eGood Stuff&7&o".' + questCompleteMessage: + - '&a[Cibus]&f You defeated the &cBarkeep&f? I thank you for freeing my old man from this accursed undeath. Here, I''ll have the first drink with you.' +primis_ice_village_all_out_of_chains: + customObjectives: + Objective1: + dialog: + - '&a[Orbis]&f Oh, the Ice Village chain shipment. Yes, it is right in that chest over there.' + - Sorry for not sending it over, but we were quite busy and had no time. + - It's all paid for so feel free to just grab it. + name: '&2All out of chains' + questLore: + - Hey, you came from &dPontis Mille&f right? + - How would you like to help us out. + - Here at the jail we tend to go through a + - lot of chains... + - Especially the chains holding up the cages. + - They rust a lot and then they break. That's + - how one of the prisoners escaped. The rusty + - chain snapped, the cage fell and he ran. + - We paid for a + - '&eShipment of new chains&f, but it' + - did not arrive yet. If you could go to + - '&dPontis Mille&f and fetch our' + - '&eShipment of Chains&f' + - then that would be great! + questAcceptDialog: + - '&a[Philolaches Triferus]&f Go talk to Orbis. They are the ones that make the chains.' + - '&7&oI should go talk to &a&oOrbis&7&o and bring back the &e&oShipment of Chains&7&o.' + questCompleteMessage: + - '&a[Philolaches Triferus]&f Those are the chains! Thank you for getting these, we really needed them.' +primis_ice_village_catch_me_if_you_can: + name: '&2Catch me if you can' + questLore: + - What timing! I was just looking for someone to go capture our + - '&cEscaped Prisoner&f.' + - One of our prisoners managed to make the darn cage swing and the rusty chain that holds it cracked under the load. + - He must have gotten pretty hurt during the escape so he cannot have gone that far. + - I need you to bring him back &9alive&f, be careful though, he managed to snag one of our rusty swords before he fled. + questAcceptDialog: + - '&a[Romanus Superbus]&f He must be somewhere in the mountains.' + - '&7&oI need to find the &c&oEscaped Prisoner&7&o and bring him back to the prison.' + questCompleteMessage: + - '&a[Romanus Superbus]&f Well, well, well. If it isn''t our escaped sleeping beauty.' + - Good work. A job well done deserves a good payment, here ya go. + - '&aRomanus&7 hands you a heavy bag of coin.' +primis_ice_village_get_them_off_my_back: + name: '&2Get them off my back!' + questLore: + - Let me tell ya, I sure am glad you are here to help, ha ha. + - Our mission here is to hunt &cRazorbacks&f and keep their numbers in check. + - It's not all about population control either. + - They provide us with valuable leather, tusks and meat. + - Not sure this village would be around without them. + - But this season their numbers have just exploded. We have been struggling with culling their numbers. + - It's all about striking a balance, can't have their numbers be so high that they start becoming a danger again. + - You need to go out there and slay a significant amount of them. Don't bother with hunting any of the &9Mature&f ones. + - We only need you to cull the &cBabe&f and the &cJuvenile Razorbacks&f. + - I also have a personal favor to ask of you. When you're out there could you keep an eye out for my old &eDagger&f. + - I lost it couple of days ago during a hunt. Stuck it in a &cRazorback&f and it just ran off with my dagger still attached... + - Would mean a lot to me if you could retrieve it. + questAcceptDialog: + - '&a[Alanus Isatis]&f You must have seen the &cRazorbacks&f on your way here so I assume you know where to find them.' + - '&7&oI need to cull the &c&oRazorback&7&o population and retrieve &e&oAlanus'' Dagger&7&o.' + questCompleteMessage: + - '&a[Alanus Isatis]&f Well done friend! That should help a lot.' + - We can handle the rest. And you found my dagger too, glad to have it in my hands again. + - The dagger is nothing special, but it was a handmade gift from my late father. + - Next time you're thirsty, the drinks are on me! +primis_ice_village_gotta_keep_warm: + customObjectives: + Objective1: + dialog: + - '&a[Severinus Martius]&f Ha ha! That should keep me warm for another couple of weeks!' + - Hey friend, you heading for &dCaerullium Village&f by any chance? + name: '&2Gotta keep warm' + questLore: + - We deliver the &aLighthouse Keeper&f some + - of our strong stuff every couple of weeks. + - It keeps him warm during the colder days. + - It's a small gesture of thanks for all his + - hard work. Any chance you could help out + - and bring over the next batch? + questAcceptDialog: + - '&a[Grania Cecilius]&f You can find the lighthouse to the East. Thanks!' + - '&7&oI should go to the &d&oLighthouse&7&o and deliver these to the &a&oLighthouse Keeper&7&o.' + questCompleteMessage: + - '&a[Severinus Martius]&f If you''re heading over there then I would appreciate if you could deliver some of these to my good friend &aJeeves&f.' + - '&7&oSeems like the &a&oLighthouse Keeper&7&o has a quest for me.' +primis_ice_village_gotta_see_jeeves: + customObjectives: + Objective1: + dialog: + - '&a[Jeeves]&f Oh! A gift from my friend Severinus you say.' + - Well, thank you for bringing it over. Was nice seeing you again! + name: '&2Gotta see Jeeves' + questLore: + - Now, now it would be really rude of me to keep + - all of the good stuff to myself! + - If you would bother helping me out friend and + - delivering some of the good stuff + - to my friend &aJeeves&f at &dCaerullium Village&f. + - You can get there quickly by taking the + - '&9lighthouse portal&f.' + questAcceptDialog: + - '&a[Severinus Martius]&f The portal is all the way at the top.' + - '&7&oI should go to &d&oCaerullium Village&7&o and deliver some of the good stuff to &a&oJeeves&7&o.' + questCompleteMessage: + - '&a[Severinus Martius]&f Thank you for delivering some of the strong stuff to Jeeves. I know he likes a good drink here and there ha ha!' +primis_ice_village_living_nightmares: + customObjectives: + Objective1: + dialog: + - '&a[Cornelia Ennodius]&f Are they gone? I was so scared. My parents sent you? Thank goodness.' + - I woke up in the night, but the nightmares, they did not end. They were still there, so I ran and ran... + - I couldn't escape. I, I...will be fine, I just need a minute... + name: '&2Living nightmares' + questLore: + - I was following her trail, this is where it ends. + - Not sure where she would have gone from here. + - I fear that something bad might have happened. + - Our &aGirl&f takes a lot after me and my special powers. + - Except that hers are a lot more potent, she is capable + - of making powerful emotions manifest in the real world. + - We are running out of time, we need to find her soon. + questAcceptDialog: + - '&a[Sestia Ennodius]&f The trail went cold here, she cannot be that far away...' + - '&7&oI need to find the &a&oMissing Daughter&7&o before something happens to her.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f You found her! Quickly, where is she?' + - Thank you stranger, I will go to her at once! +primis_ice_village_make_them_go_ouch: + name: '&2Make them go ouch' + questLore: + - I had some naughty '&cCustomers&f' + - come visit some days ago. + - They stole the most valuable + - of my &ePossessions&f. + - You need to find them and make sure + - to teach them a lesson. + - Make sure they know that + - '&aViolet&f does not forget to collect.' + questAcceptDialog: + - '&a[Domina Violet]&f They went East past the &9Trees&f.' + - '&7&oI need to make sure that the &c&oCustomers&7&o know not to mess with &a&oViolet&7&o. I also need to retrieve &e&oViolet''s Property&7&o.' + questCompleteMessage: + - '&a[Domina Violet]&f I hope you taught them the value of pain.' + - A small reward is in order for your hard work. I appreciate people that get it done. +primis_ice_village_objection!: + customObjectives: + Objective3: + dialog: + - '&a[Glacies Princeps]&f What, absolutely not. I don''t know how he convinced you to come here and beg for his release.' + - That man you are trying to help was corrupted by the Ice Elemental. He went mad and slaughtered his entire family. + - He will never be released. Is that understood. + Objective1: + dialog: + - '&a[Romanus Superbus]&f Release him? Not guilty? Are you mad? You''re lucky I don''t throw you in a cage too for suggesting such nonsense.' + Objective2: + dialog: + - '&a[Luxuria Placidus]&f Who? Never heard of him.' + name: '&2Objection!' + questLore: + - I do not belong here! Surely you can see that? + - I have done no wrong! Stranger will you hear my plea. + - Would you help this poor soul who has been trapped + - here in this awful cage of no fault of his own? + - You must go talk to the + - '&aJail Master&f or the ' + - '&aVillage Leader&f.' + - Or any other + - '&aFriendly Villager&f' + - who would be + - willing to argue for + - my release! + questAcceptDialog: + - '&a[Adrius Calpornius]&f Go talk to them! Get me out!' + - '&7&oI should go talk to the people on my list.' + questCompleteMessage: + - '&a[Adrius Calpornius]&f WHAT?! LIES!!! I never would do such a horrible thing to my family...' + - They are right here! Can't you see them, hear them. Here next to me, they want to be free too!!! RELEASE US!!! + - '&7Whatever sanity this poor man still had left, is gone now...' +primis_ice_village_run_away_daughter: + customObjectives: + Objective1: + dialog: + - '&a[Sestia Ennodius]&f I could sense you coming.' + name: '&2Run away daughter' + questLore: + - Stranger! Would you help our family? + - Our &aDaughter&f has gone missing. + - She has been gifted with special + - powers just like her &aMother&f + - I fear that last night something + - terrible must have happened to + - make her run away in the middle of + - the night. + questAcceptDialog: + - '&a[Sparax Ennodius]&f My &aWife&f has already gone looking for her.' + - I am sure she is somewhere outside the village. Go find her and talk to her. + - '&7&oI should go look for the &a&oWorried Mother&7&o.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f You were sent by my &aHusband&f to help with the search?' + - '&7&oI should hear out the &a&oWorried Mother&7&o.' +primis_ice_village_silence: + name: '&2Make them go ouch' + questLore: + - Shhh! Do you hear it? + - The annoying screeching. + - Ugh, I cannot take it anymore! + - Listen, I will pay good coin + - if you can find the source + - of that annoying screeching + - and make it stop. + questAcceptDialog: + - '&a[Modestus Eulogius]&f It sounds like it coming somewhere from the hills behind me.' + - '&7&oI should find the source of all the noise and make it stop.' + questCompleteMessage: + - '&a[Modestus Eulogius]&f Both me and my ears thank you!' +primis_ice_village_taking_the_bait: + name: '&2Taking the bait' + questLore: + - These &cFish&f, what is wrong with them! + - I have been out here fishing for days now! + - Not even a single bite. If only I was younger I would show them! + - Well it sure is good you're here now. Our village gets most of its food from these &cFish&f. + - And if we cannot catch any, well that is a big problem. + - You will need to go down there and beat them senseless. + questAcceptDialog: + - '&a[Theopropides Nero]&f You wanted to help so here is your chance!' + - '&7&oI must jump into the lake and kill 7 &c&oChilly Salmon&7&o and collect their bodies.' + questCompleteMessage: + - '&a[Theopropides Nero]&f Oh! Look at them! Such big ones!.' + - This should keep us fed for a while! Thank you for the assistance, you're a good soul in my book! +primis_ice_village_treats_for_the_punished: + customObjectives: + Objective1: + dialog: + - '&a[Eleusium Calenus]&f My wife sent you? Oh, are those treats? My favorite too! She''s such a darling.' + - She always takes care of me, even in these dark times, she still has a place for me in her heart. + - 'You tell her I am doing just fine and that I love her very much. ' + name: '&2Treats for the punished' + questLore: + - If you don't mind, could I ask you to do something for me? + - My dear &aHusband&f has been jailed and I know it's tough living a cage all day. + - So I prepared some treats that I was gonna deliver to him. + - But I am quite busy right now and I was wondering if maybe you would like to go there and deliver them to him. + questAcceptDialog: + - '&a[Titia Calenus]&f He will be in one of the middle cages.' + - Do not forget to tell him I love him. + - '&7&oI should deliver these treats to the &a&oHusband&7&o.' + questCompleteMessage: + - '&a[Titia Calenus]&f Back so quick! Oh, did he really say that? He is such a sweetie.' +primis_ice_village_wanna_make_a_snowman: + name: '&2Wanna build a snowman' + questLore: + - The kids around the village have been pretty bored lately + - and I've been thinking. There are these + - '&cMagical Creatures&f that inhabit the woods around this' + - village. The creatures fur grows &eMagical Ice Crystals&e. + - When you infuse snow with these &eCrystals&f it makes the + - snow shuffle around and expand and contract. + - And if you build a snowman out of this infused snow + - it makes it look as if the snowman is alive. + - The kids would love it! So, want to help + - this old man cheer up some kids? + questAcceptDialog: + - '&a[Sparax Ennodius]&f You will find the &cCreatures&f in any woods near the village.' + - We will at least need 15 of the &eCrystals&f if we want to have enough to build a snowman. + - '&7&oI should go slay enough &c&oFrost Fur Ursus&7&o to gather 15 &e&oIce Crystals&7&o.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f You gathered enough crystals? Wonderful!' + - I can start making the snowman now, I cannot wait for the kids to see it! +primis_main_quest_: + name: '&2Goblins in the mines!' + questLore: + - This day just keeps getting worse. First, we get ambushed by goblins. + - The we retreat, only to find our army split. Some are dead, many are missing. + - Worst of all, we fear we might've woken the Goblin King. + - Some, hopefully, made it through. We have to set up camp and recover for now. + - If you dare brave into the mines, you are on your own. + - We tried to sneak past them, and it did not go well. + - The only way forward is through bloodshed. + questAcceptDialog: + - '&8[Centurion]&fAre you braving the Goblin Mines? Beware the Goblin King!' + - '&8[Centurion]&fWe hope our scouting party made it past him. Meet up with them if you can.' + - '&8&oI should venture through the mines and defeat the Goblin King.' + questCompleteMessage: + - '&8[Scouting party]&fYou made it through? I almost wish you hadn''t. You won''t believe what lies ahead.' + - '&8&oSounds like the scouting party has bad news for me.' +primis_main_quest_1: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis] &fOh so you were in the ship that beached a few hours ago?' + - I apologize, we would've sent help but I am afraid we are drowning in our own issues right now! + - A nearby &dBandit Camp &fkeeps raiding our supplies, a mysterious &cSea Creature &fkeeps haunting our shores and a &dWolf Den &fis making foraging impossible! + - If you help us out, I will tell you where you might be able to get the supplies you need to repair your ship. + - '&7&oI should report to the &aFirst Mate &7&oto see if I should help these people!' + name: '&2Shipwrecked!' + questLore: + - You're finally awake? Good! We need your help. + - The ship beached during last night's storm. + - We see a &dLighthouse &fin the distance, so there must be a village there! + - Go talk to the &aVillage Leader &fand see if they can lend use some help! + - The &aFirst Mate &fwent ahead of you, but hasn't returned yet. + - Follow his instructions if you see him! + questAcceptDialog: + - '&a[Captain Squalus]&f Go to the nearby village and see if they will help us!' + - Be careful on your way there, we don't know what lurks around these parts! + - '&7&oI should investigate the nearby village and talk to their leader.' + questCompleteMessage: + - '&a[First Mate Iracundi]&f Darnation! We just can''t catch a break today! Here, it''s clearly dangerous to go alone, take this!' + - '&7&oSeems like First Mate Iracundi has a request for me...' +primis_main_quest_10: + customObjectives: + Objective2: + dialog: + - "&a[Shogun Navita] &f&dGladius&f calls for our aid?\n&7&oSeems like I should talk to the &aShogun&7&o." + name: '&5Bridging the gap' + questLore: + - It is time to call &dPontis Mille&f for aid. + - Let them know of what happened here and tell them we are cashing in our favor. + - There is an &cAutomaton&f on the &dBridge&f that leads there. Defeat it and the bridge will lower. + questAcceptDialog: + - '&a[General Hasta] &fSafe travels, friend. Remember: Kill the &cGate Keeper&f and make sure our plea reaches &aShogun Navita''s&f ears..' + - '&7&oI should slay the &cGate Keeper&7&o at the &dBridge&7&o and make my way to &aShogun Navita&7&o in &dPontis Mille&7&o.' + questCompleteMessage: + - '&a[Shogun Navita]&f Truly the news you bring me are most disturbing, but I am afraid we already suspected something... unnatural... was going on.' + - '&7&oSeems like &aShogun Navita&7&o wants to talk to me.' +primis_main_quest_11: + customObjectives: + Objective1: + dialog: + - '&a[Major Fortes Bellator]&f Yes, traveler?' + name: '&2Sending a message!' + questLore: + - The tales of your travel are most surprising. + - That you made it alive to here is nothing short of a miracle. + - The forces invading &dGladius&f are insurmountable. + - '&dGladius&f will eventually crumble under their might...' + - Aid?... Ah, yes. Go see &aMajor Fortes Bellator&f. + - He will be able to assist you. + questAcceptDialog: + - '&a[Navita]&f You can find the &aMajor&f on top of those stairs right ahead!' + - '&7&oI should go talk to the &aMajor&f and see if he can help.' + questCompleteMessage: + - '&a[Major Fortes Bellator]&f The &aShogun&f seeks to aid &dGladius&f? I thought he would never ask! But first, we must prepare.' + - '&7&oSeems like &aFortes Bellator&7&o has work for me.' +primis_main_quest_12: + customObjectives: + Objective1: + dialog: + - '&a[Centurion]&f Where are our reinforcements?' + name: '&2Mine path' + questLore: + - I cannot believe what befell &dGladius&f. They hit it fast, + - and they hit it where it hurts most. + - It is our sworn duty to aid our allies. We have failed our + - duty, and we have failed our allies. + - The &cCounselor's&f ordered us to mobilize our troops in several + - zones before the invasion. + - You see, recently and unusual and devastating storm was spotted + - at the &dStorm Temple&f. + - The Royal Guard was ordered to quiet the storm, and the &aShogun&f + - refuses to belay that order. + - Our own guards are in other places, and I fear we will need all + - that we have to take &dGladius&f back. + - The path to the &dStorm Temple&f is treacherous, as it requires going + - through the &dGoblin Mines&f. + - Help our guard clear the mines and make a path to the &dStorm Temple&f! + questAcceptDialog: + - '&a[Fortes Bellator]&fTread lightly, the &dGoblin Mines&f are a dangerous place. Perhaps you should aid the normal guard before assisting the &aRoyal Guard&f.' + - The &dMines&f are north of the city. There are stairs leading to its entrance. + - '&7&oI should see what else I can aid &aFortes Bellator&7&o with, or I can head to the &dGoblin Mines''&7&o entrance.' + questCompleteMessage: + - '&a[Centurion]&fIt is so good to see someone! Has &dPontis Mille&f sent you?' + - '&7&oI should hear what the &aCenturion&7&o has to say' +primis_main_quest_13: + name: '&2Goblins in the mines!' + questLore: + - This day just keeps getting worse. First, we get ambushed by goblins. + - Then we retreat, only to find our army split. Some are dead, many are missing. + - Worst of all, we fear we might've woken the &cGoblin King&f. + - Some, hopefully, made it through. We have to set up camp and recover for now. + - If you dare brave into the mines, you are on your own. + - We tried to sneak past them, and it did not go well. + - The only way forward is through bloodshed. + questAcceptDialog: + - '&a[Centurion]&f Are you braving the &dGoblin Mines&f? Beware the &cGoblin King&f!' + - We hope our &aScouting Party&f made it past him. Meet up with them if you can. + - '&7&oI should venture through the &dMines&7&o and defeat the &cGoblin King&7&o.' + questCompleteMessage: + - '&a[Scouting Party]&f You made it through? I almost wish you hadn''t. You won''t believe what lies ahead.' + - '&7&oSounds like the scouting party has bad news for me.' +primis_main_quest_14: + name: '&2Storm''s end' + questLore: + - It is hard to believe that you pushed through the + - '&dGoblin Mines&f on your own.' + - Perhaps with your fortitude you will be able to face the challenge ahead. + - We attempted to assault the &dStorm Temple&f, and reached its deepest + - confines at a great cost. + - What we found there... It defies understanding. + - It may be hard to believe, but it sounds like the very storm + - itself has materialized as our opponent. + - We do not even know if it can be defeated. We feared we were sent to our deaths. + - If you truly defeated the &cGoblin King&f, then perhaps you will find a way to slay this storm. + questAcceptDialog: + - '&a[Blepharo]&f We have weakened their forces a little, but still, this is no easy task.' + - The Storm is no ordinary opponent. Do not underestimate it. + - '&7&oI should go into the &dStorm Temple&f and slay the &cStorm&f.' + questCompleteMessage: + - '&a[Shogun Navita]&f You WHAT!?' + - Defeated the &cStorm&f? I was told that was impossible! I mean... + - '... it is no use hiding it now. I knew about the &cStorm&f. I knew about the &dGladius&f invasion - I even facilitated it. I did it for my people - for &dPontis Mille&f.' + - '&cCounselor Machiavelli&f convinced me that the &cStorm&f was as unstoppable as Nature itself, and that the fall of &dGladius&f and &dPontis Mille&f was an inevitability that we could but delay through sacrifice.' + - I see now that that snake poisoned my mind and corrupted my judgment. He must be dealt with posthaste. + - '&8&oSeems like &aShogun Navita&7&o has a problem he wants me to deal with.' +primis_main_quest_15: + name: '&2Severance payback!' + questLore: + - Once upon a time, &cCounselor Machiavelli&f, the wisest among us, foresaw the fall of &dPontis Mille&f. + - Faced with an unprecedented existential threat, he convinced me to keep quiet as to not incite panic. + - I took the only course of action I thought we had left - sacrificing our closest ally to buy us mere weeks. + - I spoke to the entity which resides in the &dBlood Temple&f. I made a deal with the devil. + - + - I bought us time. + - They demanded I send the army away, which I did by mobilizing it to face nearby conflicts. + - I was blind, but now I see. &cCounselor Machiavelli&f was in their pocket the whole time. + - He guided us to our doom, and would've gotten away with it had you not appeared. + - Now, there is hope. + - I ask you, please rid us of the treacherous &cCounselor&f. + - He has locked himself in his quarters, surrounded by those loyal to him and his... pets. + - Be careful. I knew not the reason why he isolated himself, but it is now clear he is expecting retribution. + - Bring me back the &eFar SSpeech Stone&f we used to communicate with the &dBlood Temple&f. + - I wish to deliver one last message through them. + questAcceptDialog: + - '&a[Shogun Navita]&f &cCounselor Machiavelli&f has retreated to his quarters in the lower city by the market. Be careful, has has amassed a devoted following in his time, and will not go down without a fight.' + - '&7&oIt is time for &cCounselor Machiavelli&f to face righteous retribution.' + questCompleteMessage: + - '&a[Shogun Navita]&f So it is done.' + - '&dPontis Mille&f owes you a great debt, wanderer. Once we finish mobilizing the army we will be ready to right our wrongs and march to &dGladius''&f aid.' + - '&7&a[Shogun Navita]&2 We feared you. We surrendered our allies to you. We dispersed our armies. No more.' + - '&dPontis Mille&2 marches to war, and we shall not walk alone! You shall rue the day you crossed our path.' + - '&7' + - '&7&oSeems like the &aShogun&7&o has a plan. I should talk to him.' +primis_main_quest_16: + customObjectives: + Objective3: + dialog: + - '&a[Demenis Nolus]&f Heading to the village, eh. Just keep going East, follow the road and you should be there in no time!' + Objective4: + dialog: + - '&a[Callipho Classicius]&f Directions? Just head down this road that leads to the graveyards.' + Objective1: + dialog: + - '&a[Glacies]&f Welcome to our village traveler! Please tell me, what brings you here friend.' + Objective2: + dialog: + - '&a[Bromia Culleolus]&f Oh, the way to the village. Yes, just take this road that leads to the mountain.' + - Happy to help! + name: '&2The ice village awaits' + questLore: + - We must send aid to &dGladius&f as soon as possible. + - Champion, there is a village of mighty warriors to the far south. + - You should travel there and inform them that &dPontis Mille&f + - would seek their aid in pushing back the invaders from the &dBlood Temple&f. + - Find &aGlacies Princeps&f and tell them I sent you. + - There many travelers on the roads, you should stop and ask them for direction. + questAcceptDialog: + - '&a[Shogun Navita]&f It will be a long journey. Make sure you prepare. Follow the roads that lead south.' + - '&7&oI must go and locate the &d&oIce Village&7&o to the far south.' + questCompleteMessage: + - '&a[Glacies Princeps]&f The Shogun sent you, I see, it is good to hear that &aNavita&f is back to his old self.' + - Before we can act against the &dBlood Temple&f, there are some issues that I would like dealt with first. + - Let me tell you more... + - '&7&oI should speak to &a&oGlacies&7&o.' +primis_main_quest_17: + customObjectives: + Objective3: + dialog: + - '&a[Theopropides Nero]&f Help? Yes, please!' + Objective1: + dialog: + - '&a[Alanus Isatis]&f Here to help with the &cRazorbacks&f?' + Objective2: + dialog: + - '&a[Domina Violet]&f I hope you are here to help!' + name: '&2Helping the north' + questLore: + - Before we further discuss anything about + - the &dBlood Temple&f. + - There are issues that have popped around our village that need to be dealt with as soon as possible. + - If these issues are not resolved then I would fail in my duties as a village leader. + - There is no way for me to ignore the plea of my own people and put others first. + - If you could aid us in resolving these issues then our attention would be all yours. + - We have an escaped prisoner, wildlife problems and even our own villagers stealing from the village. + - I will tell you the names and the locations of the people that came with these issues to me. + - Go talk to them and make sure you help them with any complaints and issues they have. + - They will be able to tell you in more detail what needs to be done. + questAcceptDialog: + - '&a[Glacies Princeps]&f Once you are done helping them. Come back to me and we can talk.' + - '&7&oI should go talk to the villagers on my list and help them out with any issues they might have.' + questCompleteMessage: + - '&a[Romanus Superbus]&f &2Glacies&f sent you, about darn time! We have a prisoner on the loose!' + - '&7&oI should speak to &a&oRomanus Superbus&7&o.' +primis_main_quest_18: + name: '&2The trial of ice' + questLore: + - Well you have certainly impressed me and most of the village. + - I owe you an explanation friend. You see for the longest time we used to draw power from + - the &cIce Elementals&f. + - They would bless us with their power and in return any of us who would want to become a warrior or a hunter had to pass the &9Trial of Ice&f. + - To pass the trial you had to climb the black mountain all the way to its eastern peak. And at the peak you would face the + - '&cMinor Ice Elementals&f in combat.' + - Should you succeed then your claim to become a warrior or a hunter was unquestionably your right. + - If you failed...then...your energy and your being belonged to the &cIce Elementals&f. + - This is how it was for the longest time. Until the &dBlood Temples&f influence grew in power. + - Ever since then + - the &cIce Elementals&f have been emboldened. Drawing power from them was now a risk. + - Several of our people got corrupted and we had to jail them for our own safety. + - And doing the trial became impossible, what faced you at the peak was something no villager could overcome. + - Those who have failed the trial are still there, their souls trapped in the husks of their decaying bodies. + - Slaves to the + - '&cIce Elementals&f.' + - It is clear that our old traditions are no longer. + - The &cIce Elementals&f must be dealt with... + - I would ask you to be the last one to + - undertake &9The Trial of Ice&f. Climb to the peak and face the + - '&cMinor Ice Elementals&f and release the souls of those who failed the trial.' + questAcceptDialog: + - '&a[Glacies Princeps]&f You can find the start of the path to the trial at &aViolet''s&f house.' + - Follow the &9Amethyst&f blocks, they will guide you to the peak. + - '&7&oI should follow the &9&oAmethyst Blocks&7&o to the peak of the mountain and then slay the &c&oMinor Ice Elementals&7&o.' + questCompleteMessage: + - '&a[Glacies Princeps]&f You have done it? May their souls rest in peace now.' + - Let's speak again friend. There is more to be done. + - '&7&oI should speak to &a&oGlacies&7&o.' +primis_main_quest_19: + name: '&2Chill out' + questLore: + - It is time to free ourselves from this curse. + - We should have never made ourselves dependent on an &cElementals&f power. + - We shall correct that mistake here and now. + - What you have slain were just + - '&cMinor Ice Elementals&f, the' + - '&cIce Elemental&f rests in a temple right across from our village.' + - It was the main source of our power...and foolishness. + - Go forth now and slay the &cIce Elemental&f. + questAcceptDialog: + - '&a[Glacies Princeps]&f You will find a path that leads into the temple at the summit of the village.' + - '&7&oI should go into the temple and slay the &c&oIce Elemental&7&o.' + questCompleteMessage: + - '&a[Glacies Princeps]&f I could feel the energies flowing out, all the way from here.' + - You have done us a great favor friend. The &dIce Village&f will provide aid to you and your allies. + - There is another settlement that might need your help, let's speak. + - '&7&oI should hear what &a&oGlacies&7&o has to say.' +primis_main_quest_2: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis]&fYou''ll help us? Thank the seas! This was starting to feel like a sinking ship!' + name: '&2Strangers in need...' + questLore: + - So not only can they not help, but they want our help? Bah! + - Well, we don't have much choice now, do we? + - Go, help them, then make them help us! + questAcceptDialog: + - '&a[First Mate Iracundi]&f Fine, go help the locals, see what info you can gather and see if you can get them to help us in turn. I will be here, negotiating things.' + - Come back as soon as you have something! + - '&7&oI should talk to the &aVillage Leader&f to see about helping the locals.' + questCompleteMessage: + - '&a[Chief Piscis]&f Everyone in the village has an issue that needs dealing with, and I am no exception. My request is quite challenging, so maybe you want to get warmed up and get the lay of the land with some of the issues from the other villagers.' + - Talk to me when you are ready, and I will share with you the secrets kept by us to leaving this valley! + - '&7&oI should talk to the locals and see who needs help, and come back to the leader when I feel ready to continue.' +primis_main_quest_20: + customObjectives: + Objective1: + dialog: + - '&a[Lutum Princeps]&f This better be important.' + name: '&2Terravilla' + questLore: + - Some time ago we received a request for aid from a + - a nearby settlement. Years ago a bunch + - of explorers settled on top of this ancient ruin. + - I think they call their little + - settlement &dTerravilla&f. Apparently there is a lot + - of treasure to be had there if you don't mind the risk. + - But I hear that stuff has gone wrong there and they asked + - us if we could spare any help to send their way. To be + - honest, you are the strongest warrior I have ever seen. + - You are the best help we could send. If you would like + - to go of course. + questAcceptDialog: + - '&a[Glacies Princeps]&f You will find &aTerravilla&f straight West of here.' + - It is located on top of this ancient elemental ruin, you will know it when you see it. + - Oh, I almost forgot. The person you want to talk to is &aOverseer Lutum&f. + - '&7&oI should go to &d&oTerravilla&7&o and talk to &a&oOverseer Lutum&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f Came all the way from the &dIce Village&f, eh. Good to see some help arrive.' + - When I sent that request for aid I wasn't sure if we were gonna get any. I heard the situation over there wasn't that much better. + - We are in quite a pickle over here. We have plenty of work for you if you want it. + - '&7&oI should talk to &a&oLutum&7&o.' +primis_main_quest_21: + name: '&2Taking out the trash' + questLore: + - Many years ago some explorers came across this ruin and + - as they investigated it more closely they discovered a + - large underground maze-like structure. In this structure + - there were a lot of ancient artifacts and treasures. But + - also a lot of danger. Not like that stopped anyone from + - going down there. And as the word spread, more and more + - people came here to make their fortunes. Before you + - know it, it turned into a small settlement. Until lately + - everything was fine, but then awful things started + - happening. Before I tell you more, we should start by + - dealing with the simple problems first. A small band of + - '&cRobbers&f has found a foothold in the hills surrounding' + - '&dTerravilla&f. We need them gone. Also, feel free to assist' + - any villagers in &aTerravilla&f that might need help. + questAcceptDialog: + - '&a[Lutum Princeps]&f I am not sure where the &cRobbers&f are exactly. I just know that people have reported seeing them coming from the hills.' + - '&7&oI should deal with the &c&oRobbers&7&o and help any villagers in need if I have the time.' + questCompleteMessage: + - '&a[Lutum Princeps]&f Well that is one issue resolved. Onto the next!' + - Before we move on, I want you to have this blade. + - It might be old and dull but it's still as good as anything you can get your hands on today. + - '&7&oI should hear out what &a&oLutum&7&o has planned next.' +primis_main_quest_22: + name: '&2Big trouble in little pub' + questLore: + - Before we get to the big problem underground, I would + - like you to do one last thing here in town. There has + - been huge trouble in our little pub. There are certain + - characters in town who keep going to the pub and causing + - a ruckus. Well I heard that this time all of them managed + - to gather at the pub at the same time. And of course now + - there is a huge brawl happening over there. This is a great + - opportunity for us to arrest all of them at once. Go to the + - pub and knock them all out. We will handle the rest. + questAcceptDialog: + - '&a[Lutum Princeps]&f The pub is at the ground level, right across. Don''t let them overwhelm you.' + - I will have a nice reward waiting here for you when you're back. + - '&7&oI need to go to the pub and deal with the &c&oBar Brawlers&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f I hear that the pub is a peaceful place again. Let''s discuss the real issue now.' + - '&7&oI need to talk to &a&oLutum&7&o.' +primis_main_quest_23: + name: '&2Strike the earth' + questLore: + - You see the real reason we asked for help is because of what happened + - at the ruins. There were always dangerous things down there, + - but nothing a seasoned adventurer or explorer could not handle. But then + - something awakened, these ancient constructs started rising out of the + - ground and the walls. Then these quakes started happening, it was weird, + - because you could only feel them if you were down in the ruins. So we shut + - everything down, nobody was allowed access to the ruins anymore. A few days + - ago I gathered some of my best men and sent them down there to find the source + - of it all. They barely made it back. They found an &cEarth Elemental&f high + - above the pillars, on top some sort of platform. It must have been there + - dormant all this time. No clue why it decided to wake up now... + - Your job would be to go down there, navigate through the maze and put the + - '&cEarth Elemental&f into a slumber it will never wake up from.' + questAcceptDialog: + - '&a[Lutum Princeps]&f You can get to the maze by walking down the spiral staircase in the middle of the ruins.' + - Don't get lost in the maze, also make sure to watch out for the constructs. Good luck! + - '&7&oI should enter the &d&oRuins Maze&7&o and slay the &c&oEarth Elemental&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f I cannot believe it, you''re back. In one piece too!' + - I guess you are tougher than you look. What you have done here is incredible it is clear we are in great debt to you. Is there anything Terravilla might be able to do for you. + - '&7&oI need to tell &a&oLutum&7&o about my quest and the &d&oBlood Temple&7&o.' +primis_main_quest_24: + customObjectives: + Objective1: + dialog: + - '&a[Navita]&f You have returned! I hope you have good tidings.' + name: '&2There and back again' + questLore: + - We had no idea what was going on... Yes, + - '&dTerravilla&f will be able to pledge some' + - of our forces to your cause. I wonder if the + - '&cEarth Elemental&f awakening had anything' + - to do with the &dBlood Temple&f. We will + - prepare our forces and wait for word from + - '&dPontis Mille&f.' + questAcceptDialog: + - '&a[Lutum Princeps]&f So you are heading off to &dPontis Mille&f, make sure to tell the &aShogun&f that &dTerravilla&f will be ready to assist.' + - '&7&oI should head to &d&oPontis Mille&7&o and speak with &a&oShogun Navita&7&o.' + questCompleteMessage: + - '&a[Navita]&f It is good to hear that the &dIce Village&f has decided to join our cause! But I did not expect that you would manage to convince &dTerravilla&f to pledge to our cause as well.' +primis_main_quest_25: + customObjectives: + Objective1: + dialog: + - '&a[Outpost Officer]&fFILLER TEXT!' + name: '&2To the outpost' + questLore: + - It is so good to see you again friend! + - While you were gone we were preparing our + - forces. We have made an &dOutpost&f + - between the &dBlood Temple&f and &dPontis Mille&f. + - You should go there and report to the + - '&aOutpost Officer&f. They will let you know' + - how we shall proceed with the assault on the + - '&dBlood Temple&f.' + questAcceptDialog: + - '&a[Navita]&f The outpost is to the South of the city. Not too long now, before the additional forces from &dTerravilla&f and the &dIce Village&f arrive.' + - '&7&oI should head to the &d&oOutpost&7&o and speak with the &a&oOutpost Officer&7&o.' + questCompleteMessage: + - '&a[Outpost Officer]&f I GOT NO IDEA WHAT TO SAY CAUSE I AM NOT DONE' +primis_main_quest_3: + name: '&cBandit Camp!' + questLore: + - A nearby &dBandit Camp&f has recently been sighted + - and is trying to take us under! + - They keep raiding our supplies and kidnapping our villagers! + - They even took my &eGrandfather's Heirloom&f! + - We don't know what they want, but we need them gone! + - Figure out what they are doing, deal with them and bring + - me back my &eGrandfather's Heirloom&f! + questAcceptDialog: + - '&a[Chief Piscis]&f The &dBandit Camp&f isn''t too far away if you follow the road!' + - Be careful on your way there, we don't know what they are up to but it can't be anything good! + - Oh, and make sure you bring back my &eGrandfather's Heirloom&f! + - '&7&oI should go to the nearby &dBandit Camp&7&o and clear it out.' + questCompleteMessage: + - '&a[Chief Piscis]&f I see you''re back! Do you bring good news?' + - '&7&oYou tell &aChief Piscis&7&o about the camp and turn the &eHeirloom&7&o in.' + - What's this? Mages? Elementals? This is an ill omen. You must talk to the &aRuler of Gladius&f to report this incident at once! + - Truly you have served us well! Here, for your efforts, I give you my &eGrandfather's Sword&f! May it serve you as well as it has served our family! + - '&7&oSeems like the &aChief Piscis&f is ready to tell me how to get out of here.' +primis_main_quest_4: + customObjectives: + Objective1: + dialog: + - '&a[Petrae]&f &2Chief Piscis&f sent you? Unfortunately the passage is closed, and the &cElemental&f guards it...' + name: '&9Blue flower path!' + questLore: + - We must report our findings about the + - '&dBandit Camp&f to &dGladius&f!' + - The mountain pass is guarded by an ancient, + - powerful &cGolem&f which must be avoided at all costs! + - Follow the &eBlue Flowers&f along the path, + - they will lead you to a secret passage + - through the mountains! + - A mountain guide will be waiting for you at the end + - of the &9Blue Flower &fpath! + questAcceptDialog: + - '&a[Chief Piscis]&f The mountain pass is guarded by an extremely dangerous &cGolem&f, which you are probably not able to defeat right now!' + - We know of a secret passage in the mountains. Follow the path of &9Blue Flowers &fand talk to the &aMountain Guide&f to get safe passage to Bridgeport! + - '&7&oI should follow the &9&oBlue Flower &7&opath to the &aMountain Guide&7&o!' + - '&7&oI should make sure to finish any business I got left before I leave.' + - '&7&oHint: Make sure you track the quest to make finding your destination easier!' + questCompleteMessage: + - '&a[Petrae]&f Are you sure you want to risk it? I can help you...' + - '&7&oSeems like &aPetrae&f has a request for me.' +primis_main_quest_5: + name: '&5The Crystal Elemental' + questLore: + - You need to pass through? Ill timing, my friend. + - A &cCrystal Elemental &fhas invaded our passage + - and shut it down. + - If you really must make your way to Gladius, + - you will have to defeat this &cElemental&f first! + questAcceptDialog: + - '&a[Petrae]&f You seek to defeat the &cCrystal Elemental&f? I can but wish you luck in your endeavor!' + - I'll follow right after you. If you are successful in your attempt, meet me on the other side of the passage! + - '&7&oSeems like I must defeat the &cCrystal Elemental&7&o.' + questCompleteMessage: + - '&a[Petrae]&f Outstanding! I saw you defeat the &cCrystal Elemental&f, clearly there''s greatness in your future!' + - Now that we are on the other side, let me tell you the path to &dGladius&f! +primis_main_quest_6: + customObjectives: + Objective1: + dialog: + - '&a[Filius] &fYou made it through the mountain! You don''t see that every day.' + - I'm afraid my father is missing, but I can tell you about the path to &dGladius&f. If you want to help us though, talk to my &aMother&f! + - '&7&oSeem like &aFilius&7&o can help me find the way to &dGladius&7&o.' + name: '&5The Farmstead' + questLore: + - The path to &dGladius&f should be easy, but with + - all the disturbances we've been seeing I suspect + - it might not be that simple. + - I am good friends with the &aProprietor of the Farmstead&f + - down the road. If you tell them I sent you, I am sure + - they will tell you how to safely reach &dGladius&f and + - give you news about the surrounding area. + - Good luck in your travels and stay safe! + questAcceptDialog: + - '&a[Petrae]&f Just tell the &aProprietor of the Farmstead&f that I sent you, though I have heard that the &aProprietor&f hasn''t been seen in a while.' + - If they aren't around I am sure their son &aFilius&f will be glad to help you out! + - Safe travels! + - '&7&oI should follow the path to the &dFarmstead&7&o and talk to its &aProprietor&7&o.' + questCompleteMessage: + - '&a[Petrae]&f Outstanding! I saw you defeat the &cCrystal Elemental&f, clearly there''s greatness in your future!' + - Now that we are on the other side, let me tell you the path to &dGladius&f! + - '&7&oI should talk to &aFilius&7&o to learn the way to &dGladius&7&o, and possibly talk to his &aMother&7&o to see how I can help.' +primis_main_quest_7: + customObjectives: + Objective4: + dialog: + - '&a[General Hasta] &fI can''t believe you made it past the enemies.' + - You are exactly the kind of help we need right now! + - '&7&oSeems like I should talk to &aGeneral Hasta&7&o.' + name: '&5The path to Gladius' + questLore: + - Recently smoke was sighted over the fortress of &dGladius&f. + - We were unable to go there and see what's happening + - because a &dShip&f is currently blocking the path. + - We got attacked by a bunch of undead-looking creatures + - when we approached the &dShip&f, so we ran away. + - I am afraid you will have to force your way through this + - '&dShip&f in order to reach &dGladius&f. I''m sure that they will' + - reward you if you help thin the number of &cUndead&f on that ship! + questAcceptDialog: + - '&a[Filius] Be careful on the road, clearly something has gone wrong in &dGladius&f.' + - Once you reach &dGladius&f, the Fortress' lord should either be at his mansion or at the barracks! + - '&7&oI should go down the path to &dGladius&7&o and clear out some &cUndead Sailors&7&o on the way there.' + questCompleteMessage: + - '&a[Lord Hasta]&f Were you sent as reinforcements from Pontis Mille? Where are the others? Are you a messenger?' + - '&7&oI should talk to &aLord Hasta&7&o.' +primis_main_quest_8: + name: '&5Recovering Hope' + questLore: + - We never saw this invasion coming. + - They came in the dead of night, hit us hard and fast. + - Before we knew it, half the city was overrun. + - Morale is low. Everyone here has lost someone. + - To spite our heartache, our own loved ones parade + - through the streets in a mockery of life itself. + - We need to rally and bolster morale, + - or we won't see another dawn! + - Back in my &dMansion&f, in my treasury, lies a &eDocument&f + - of the utmost importance. It is a written promise with + - one of the founders of &dPontis Mille&f to provide us with + - assistance in a time of dire need. This is the time. + - Retrieve the &eDocument&f, bring it back to me and + - I promise you will be welcomed in &dPontis Mille&f with + - open arms. Soldiers will fight to their last + - if given this small hope. + questAcceptDialog: + - '&a[General Hasta] The note is in my &dMansion&f. Be sure to bring it back. My men here also have other requests around town you can help with, if able.' + - '&7&oI should check what the other soldiers need and head to the &dMansion&7&o at the town exit.' + questCompleteMessage: + - '&a[Lord Hasta]&f Outstanding! Recovering this &eDocument&f in the middle of a war? If we had 10 more of you, the city would never have been taken in the first place!' + - Before you go, do you think you could do me a small personal favor? + - '&7&oSeems like &aLord Hasta&7&o wants to talk to me.' +primis_main_quest_9: + name: '&5Gladius'' Champion' + questLore: + - Before heading to &dPontis Mille&f, I have a + - personal favor to ask. + - Our &cChampion&f was last seen fighting off a horde of + - enemies near the &dStatue&f. + - We have not heard from him since the start of the + - invasion and at this stage we fear the worst. + - Please go check on him. If you find him and he has + - turned into one of these undead... please free him of his curse. + questAcceptDialog: + - '&a[General Hasta] &fMake your way to the &dStatue&f. I am sure our &cChampion&f will be easy to find.' + - '&7&oI should go to the &dStatue&7&o and investigate what happened to the &cChampion of Gladius&7&o.' + questCompleteMessage: + - '&a[General Hasta]&f So... The worst has come to pass. I will make sure these beasts shall pay for slaying my son.' + - 7&oSeems like &aGeneral Hasta&7&o has some parting words for me. +primis_ogre_mines_clear: + name: '&2Ogre-sized problems' + questLore: + - Our mining encampment was overrun! + - We need help! + - I don't really know what happened, but we need to clear + - the encampment and talk to &aOld Vetus&f! + questAcceptDialog: + - '&a[Metus]&f You''re going to help? Please hurry, the encampment is just beyond here!' + - '&7&oI should clear the encampment and talk to &aOld Vetus&7&o.' + questCompleteMessage: + - '&a[Vetus Fossores]&f You came to help? Fantastic, we absolutely need help right now!' + - Here's a little something for your help clearing the encampment! +primis_ogre_mines_lost_bretheren: + customObjectives: + Objective1: + dialog: + - '&a[Fortis Fossores] &fWhat do you want? What, &aFugit&f sent you? What for? The mines were overrun? Hah, I didn''t even notice!' + - Let that worrywart brother of mine know that I am fine. Now, begone! I am on the verge of making a big mining discovery. I call it - branch mining! Hehehe, this one will change everything! + name: '&5Lost Bretheren' + questLore: + - The mine was overrun by &cOgres&7&o! + - In the confusion I got separated from my &aBrother&f in the &dMines&f, + - and I fear for his safety! + - He's a bit of an eccentric man, very dedicated to mining. + - You'll know if you've seen him! + - Please bring him back up here, or at the very least tell me if he is safe. + - I'll make it worth your trouble! + questAcceptDialog: + - '&a[Fugit] &fPlease find my &aBrother&f and make sure he''s OK!' + - '&7&oI find &aFugit''s Brother&7&o in the &dMines&7&o overrun by &cOgres&7&o.' + questCompleteMessage: + - '&a[Fugit Fossores]&f My &aBrother&f said what? Ah, typical of him, too focused on his work to notice the entire place was taken over!' + - I'll have a serious conversation with him next time I see him! + - Thank you for your help, you can have my best pick-axe, LL I call her. It doesn't look like I'll be able to get mining any time soon at this rate. +primis_ogre_mines_old_miner_quest: + name: '&2Lucky Pickaxe' + questLore: + - We have ourselves a bit of a pickle! + - As we were mining, we came across a mysterious cave full of monsters! + - I dropped my favorite &ePick-axe&f as I ran, I need your help to go get it! + - I'm sure the &cOgre Magi&f picked it up for himself. + - Get my &eLucky Pickaxe&f back from that brute! + - I've got some trinkets for you when you return. + questAcceptDialog: + - '&a[Vetus Fossores]&f That &cOgre&f shouldn''t be far! You can find him in the cave to the right, before the collapsed area.' + - He should have the &ePickaxe&f, &cOgres&f love shiny things after all! + - '&7&oI should defeat the &cOgre Chief&f.' + questCompleteMessage: + - '&aa[Vetus Fossores]&f You got my lucky pick? Excellent!' + - Heres your reward! +primis_pontis_groves_acrobatics: + customObjectives: + Objective1: + dialog: + - '&a[Idoneitatem Hominem]&f Congratulations!' + name: '&2Acrobatics' + questLore: + - So you think you have you what it takes. + - Are you fit enough, are you quick enough, are you strong enough? + - Platforms, wines, dangerous heights. All you could ever want! + - The ultimate challenge lies ahead! + - OK, OK. Me and my &aBrother&f might have been bored a bit and + - made an entire acrobatics course. + - The goal is to to get from platform to platform using &9Wines&f and + - '&9Acrobatics&f and reach the end of the course.' + - Should you get through the course and reach the end. (Which is a sphere by the way.) + - You will be rewarded with a very nice &eItem&f! + questAcceptDialog: + - '&a[Posuere Hominem]&f You can find the start of the course at the &dEnd of that Tunnel&f.' + - Just swim up to the first wine and keep climbing the wine until you reach the top. + - Don't forget to speak to my &aBrother&f at the end of the course for the reward! + - '&7&oI should head to the start of the course.' + questCompleteMessage: + - '&a[Idoneitatem Hominem]&f Well deserved! I hope you did not cheat! Try and beat my record if you can.' +primis_pontis_groves_caught in the web: + name: '&2Caught in the web' + questLore: + - So they have a &dNest&f somewhere in the &dGrove&f. + - That would explain why their population has skyrocketed. + - We were used to some &cSpiders&f wandering into the &dGrove&f, but this is too much. + - It would be great if you could locate the &dNest&f and clear it out. + - We will make you some fine &eSpider Leg Boots&f as a reward! + questAcceptDialog: + - '&a[King Nemian]&f If there is a &dNest&f I am sure it would be &9Surrounded by Cobwebs&f.' + - '&7&oI should find the &dSpiders Nest&7&o and clear it out.' + questCompleteMessage: + - '&a[King Nemian]&f Hah! I knew we could count on you!' + - Here are your fine boots, well deserved! +primis_pontis_groves_elf_stole_from_my_shelf: + name: '&2Elf stole from my shelf' + questLore: + - Disaster has struck our little hole. + - Not too long ago our lovely home got raided by &cElf Bandits&f. + - Thankfully we weren't home at the time so nobody got hurt. + - We managed to replace most of our possessions. + - But they took my &eFamily Heirloom&f that was sitting on the shelf. + - If you would be so kind to go try and get it back for me, I would be most thankful. + - I make the best stews, I would be glad to share some with you as a reward. + questAcceptDialog: + - '&a[Luxuria Gorgonius]&f The &eHeirloom&f is quite valuable I am sure they would keep it &9Somewhere Extra Safe&f.' + - '&7&oI need to go retrieve the &eHeirloom&7&o.' + questCompleteMessage: + - '&a[Luxuria Gorgonius]&f Oh my gosh! You found it!' + - There are not enough thanks in the world for what you just did for me. + - '&7&oThis stew should keep med fed for a while.' +primis_pontis_groves_into_the_next_hole: + customObjectives: + Objective1: + dialog: + - '&a[Phygia Gorgonius]&f Time to kick those &cElves&f out for good!' + name: '&2Into the next hole...' + questLore: + - If you are available there is plenty more work to do around here. + - We have some serious &cElf&f problems, + - but I have assigned &aPhygia&f to handle those issues. + - Go talk to &aPhygia Gorgonius&f in the hole next to this one. + - They will be able to tell you more and what needs to be done. + questAcceptDialog: + - '&a[King Nemian]&f The hole right next to this one one, can''t miss it!' + - '&7&oI should go talk to &aPhygia Gorgonius&7&o.' + questCompleteMessage: + - '&a[Phygia Gorgonius]&f Let''s talk...' + - '&7&oI should hear out &aPhygia Gorgonius&7&o.' +primis_pontis_groves_lighthouse_1: + customObjectives: + Objective1: + dialog: + - '&a[Alanus Secundas] &fHas the &dGrove&f sent you?' + name: '&2Feeding the sick' + questLore: + - Wanderer, could I ask a simple favor of you? + - There is a nearby &dLighthouse&f. We usually deliver food to the family that lives there. + - But ever since the troubles began we could not leave our &dGrove&f. + - Would you be so kind to bring the family their latest batch of food. + - It would be great if you could hurry, it has been a while since the last delivery. + questAcceptDialog: + - '&a[King Nemian]&f When you exit the hole the &dLighthouse&f is straight forward and a bit to the left.' + - '&7&oI should go to the &dLighthouse&7&o.' + questCompleteMessage: + - '&a[Alanus Secundas]&f I am so thankful! We were just starting to run out of food.' + - Are you busy? + - '&7&oSeems like &aAlanus&7&o wants to talk to me.' +primis_pontis_groves_lighthouse_2: + customObjectives: + Objective1: + dialog: + - '&8[Jeeves]&fOh, hello there again!' + - '&8[Jeeves]&f They do not need the food anymore? I was just about to go shopping.' + - '&8[Jeeves]&f So kind of you to come here and let me know.' + name: '&2Do not ask Jeeves' + questLore: + - Uh, before you came. Jeeves the Travelling Merchant stopped by. + - We asked him if he could go get some food for us. + - Well, that is not necessary anymore so it would be great if you could climb to the top of + - the lighthouse and travel to Caeruleaum Village and tell Jeeves we do not need the food anymore. + questAcceptDialog: + - '&8[Alanus Secundas]&f When you exit the dwelling the Lighthouse is straight forward and a bit to the left.' + - '&8&oI should go to the Lighthouse.' + questCompleteMessage: + - '&8[Alanus]&f You let him know? Good, good!' + - '&8&oSeems like Alanus is quite fed.' +primis_pontis_groves_population_control: + name: '&2Population control!' + questLore: + - Oh I am so happy that finally someone has arrived to help us out. + - We have a big arachnid problem going on in our little grove. + - There are so many arachnids around these days that you cannot even + - take a nice evening walk without one of the nasty buggers + - jumping at you from the shadows. + - It is clear that their population numbers need a serious culling. + - Oh! Please bring to me any arachnid legs that are still in good contidion. + - We use them to make small cranes and grabbers. + questAcceptDialog: + - '&8[King Nemian]&f You will find them lurking beneath the shadows of the trees.' + - '&8&oI need to find Forest Crawlers and kill them.' + questCompleteMessage: + - '&8[King Nemian]&fGood to see you return, and with plenty of legs too!' + - '&8[King Nemian]&fYou think that their nest might be near? Let''s talk more about this' +primis_pontis_groves_tree_climbing_elf_bandits: + name: '&2Tree climbing elf bandits!' + questLore: + - I've had it up here with these gosh darn tree climbing &cElf Bandits&f in our &dGrove&f. + - Not like the &cSpiders&f were enough, + - now these shadow loving poop nuts have decided to settle in our trees! + - They love the dark you see, the light hurts them, makes them all foggy in the head. + - Of course a lot of darkness and shadow in our little &dGrove&f. So they moved right in! + - Forced their way in with their superior numbers. + - Well they got something coming alright, + - one look at you and I can tell you can handle a couple of stone giants! + - I am sure some elves won't be much of an issue for you. + - Go send them a message. The message is clear, THEIR NASTY BUTTS AIN'T WELCOME HERE! + questAcceptDialog: + - '&a[Phygia Gorgonius]&f I am sure you will find plenty of them if you find some place with shade and just look up, hard to miss their tree houses.' + - '&7&oI should go take care of these &cElves&7&o before &aPhygia&7&o catches on fire from rage.' + questCompleteMessage: + - '&a[Phygia Gorgonius]&f My friend! HAHA! So good to see you again!' + - I was watching from a distance. Seeing those fools fall to their death, nothing better! + - '&7&oThe elves wont be bothering &aPhygia&7&o ever again.' +primis_pontis_mille_fields_berry_crazed_wolf: + name: '&2Berry crazed wolves' + questLore: + - Oh gosh, I have no idea what is wrong with these &cRockhounds&f. + - They keep coming into the &dBerry Farm&f while I am away or sleeping. + - You would think they come here and eat the berries, but no! + - They load their mouths with them and carry them + - off somewhere deep into the forest. + - I mean they are &cHounds&f! Why are they even stealing berries. + - Well I guess it doesn''t matter, I have a favor to ask. + - Could you go clear the + - '&9Area Behind the Berry Farm&f,' + - and bring back my &eStolen Berries&f. + - I have a lot of pies to make and the berries they stole were ripe and ready. + questAcceptDialog: + - '&a[Dordalus Nasica]&f I only saw the &cRockhounds&f steal the berries.' + - '&7&oI should go kill the &c&oRedwood Rockhounds&7&o and collect any &e&oStolen Berries&7&o they drop.' + questCompleteMessage: + - '&a[Dordalus Nasica]&f Oh my, you did it. Could I bother you with one more tiny favor.' + - '&7&o Seems like &d&oMilonia&7&o has more work for me.' +primis_pontis_mille_fields_camping_hunters: + customObjectives: + Objective1: + dialog: + - '&a[Scribonia Ingenvinus]&f Yes?' + name: '&2Camping hunters' + questLore: + - I hope I am not bothering you. You look like a person that would listen to a plea. + - We do not have much to do here in the &dSlums&f, + - most of us like to wander the &dFields&f to pass the time. + - Unfortunately that has come to a stop after a bunch + - of &cMonsters&f started roaming around the &dFields&f. + - We heard that some hunters have made &dCamp&f near the &dFields&f. + - If you could go there and talk to them and ask them to deal with these &cMonsters&f... + questAcceptDialog: + - '&a[Augustina Verrucosis]&f Their &dCamp&f should be somewhere North-West of here.' + - '&7&oI need to head for the &d&oHunters Camp&7&o.' + questCompleteMessage: + - '&a[Scribonia Ingenvinus]&f Help the &dSlums&f with their &cMonster&f issue?' + - Let's talk more about. + - '&7&oI should talk to &a&oScribonia&7&o and hear out what she has to say.' +primis_pontis_mille_fields_camp_hunter_three_times_hunter: + name: '&2Hunter three times hunter' + questLore: + - So you found &aVolumnia&f. Thank the great hunters that she is alright. + - Since you have helped &aVolumnia&f and proven yourself a kind soul. + - How about a friendly challenge. I would be willing to offer you some nice + - quality armor should you face the challenge and return victorious. + - The challenge involves hunting + - '&cThree Great Beasts&f scattered across Pontis.' + - The &cBeast Cod Furiosa&f who swims underneath a bridge where two mountains stand. + - '&cBeast Crawler Megdun&f that slumbers on top of a sun covered grove.' + - Dancing between two western peaks you will find the + - '&cBeast Impaler Uladzimir' + - As proof bring me the &eImpaler's Horn&f, the &eCod's Scale&f and the &eCrawler's Silk&f. + questAcceptDialog: + - '&a[Milonia Majus]&f Here take this device it will roughly guide you to the their location.' + - '&7&oI should go and challenge the &c&oThree Great Beasts&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f You have returned. And you have brought all three items I requested as proof.' + - That must have been quite an adventure, reminds me of my younger days when I had more strength and agility. + - Well enough about me, here is your reward as promised! + - '&7You hand back the beast tracking device.' + - '&a[Milonia Majus]&fI had almost forgotten about that thing, thank you!' + - Until we meet again adventurer! +primis_pontis_mille_fields_do_it_yourself: + name: '&2Do it yourself' + questLore: + - Deal with the &cMonsters&f? Well I can tell you we have already been doing that. + - There is just too many of them and not enough of us. + - We started hunting them as soon as we made our &dCamp&f here. + - But their numbers just don't seem to be going down. + - And that's not even the worst of it. + - We have discovered a lair and a big old &cBeast&f that comes with it! + - Well since you have made it to our &dCamp&f in one piece, + - I assume you are quite capable yourself. + - How about joining the hunt? What say you? + questAcceptDialog: + - '&a[Scribonia Ingenvinus]&f I knew you would say yes! I see you are already well equipped.' + - OK, this is what I want you to do. + - We are worried about that large &cBeast&f aka. &cBig ol' Bubba&f so that is priority number one. + - Second I need you to slay 5 &cLonghorns&f and 6 &cShorthorns&f. + - Understood? Good. Report to me when you're done. + - '&7&oI should slay &c&oBig ol'' Bubba&7&o and kill 5 &c&oLonghorns&7&o and 6 &c&oShorthorns&7&o.' + questCompleteMessage: + - '&a[Scribonia Ingenvinus]&f I must say I am quite impressed.' + - Clearly you are way more than just 'capable'. + - Thank you for the assistance, we will be able to handle the rest. + - Until we meet again, great hunter. +primis_pontis_mille_fields_feeding_the_hungry: + customObjectives: + Objective3: + dialog: + - '&7You hand the over the bread and the flour.' + - '&a[Rufia Tertulus]&f I don''t know what to say. My children will be so happy!' + - '&7The woman bows to you in deep appreciation.' + Objective4: + dialog: + - '&a[Fabia Praetextus]&f I guess fantasies do come true sometimes. I am eternally grateful to you kind sir.' + Objective1: + dialog: + - '&a[Lena Lucan]&f Fresh bread! I cannot thank you enough!' + Objective2: + dialog: + - '&a[Tranio Florens]&f Wow! The day just keeps getting better!' + - Thank you for the flour kind soul. + name: '&2Feeding the hungry' + questLore: + - I can feel a good heart beating in that chest of yours. + - Not everyone is as fortunate as you and I. + - There are some poor souls living in the &dPontis Mille Slums&f. + - For a while now I have been working over + - time to produce surplus bread and flour. + - Would you mind taking these sacks of wheat and these bread stacks. + - Then travel with them to the &dSlums&f and hand them out to those in need? + - I have been doing this for a while now but I injured my left foot, + - so I cannot do much walking right now. + questAcceptDialog: + - '&a[Daemones Maritialis]&f I wish there were more people like you in the world.' + - The &dSlums&f are straight North of here, you can see the buildings in the distance. + - '&7&oI should go to the &dSlums&7&o and hand out the food to those in need.' + questCompleteMessage: + - '&a[Augustina Verrucosis]&f &2Daemones&f sent you here didn''t he.' + - He has been coming by every week handing out any food he could spare to make sure we didn't starve... + - Thank you stranger, my family won't forget this. +primis_pontis_mille_fields_fruity_hound: + name: '&2Fruity hound' + questLore: + - Since you are my NUMBER ONE berry recovery agent, + - I have another task for you. + - As you can see we grow some very large berries on our + - little &dBerry Farm&f here. + - There was a + - '&eSpecific Berry&f I was growing for a contest.' + - But as I was walking to the &dBerry Farm&f I saw a + - '&cFruity Rockhound&f jump for the bush holding my prized berry.' + - He snapped it off and carried it away. + - Its jaws were holding the berry by its stem so + - it should still be in one piece, I hope. + - If you go slay the beast and bring back my + - dear &eContest Berry&f I will have a nice + - reward waiting for you. + questAcceptDialog: + - '&a[Dordalus Nasica]&f I think I saw the &cHound&f head into the &dRedwoods&f, North-West of the farm.' + - '&7&oI should go slay the &c&oFruity Hound&7&o and see if the &e&oContest Berry&7&o is still in one piece.' + questCompleteMessage: + - '&a[Dordalus Nasica]&f YES! That is my darling! Fine and whole, not even any saliva on it!' + - As a reward for your work you can have my second largest berry. Be careful not to eat it. + - I know might be tempting to eat it, but believe me it's way more useful if you keep it around. +primis_pontis_mille_fields_not_on_my_farm: + name: '&2Not on my farm!' + questLore: + - Lately all these &cRats&f have been driving me crazy. + - They keep going into our little farm and eating all our goods! + - Any chance you could go and lower their numbers a bit? + - Be careful, there are so many of them. + - Oh, I almost forgot to tell you. + - If you see a large &cWell Fed Rat&f don't bother with it. + - It has grown so large and fat it would take you days to slay it. + questAcceptDialog: + - '&a[Milonia Majus]&f I am sure that you already noticed that they like to squirm around the path area.' + - '&7&oI should go kill the &cRats&7&o that hang around the path that leads to &dPontis Mille&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f Thank you so much! We can get back to making delicious goods now.' +primis_pontis_mille_fields_surprise_me_with_flour: + customObjectives: + Objective3: + dialog: + - '&a[Adulescens Lupis]&f I heard the farm was having &cRat&f problems. Three sacks of flour coming up, no problem!' + Objective1: + dialog: + - '&a[Dinia Niraemius]&f Flour? Sure, one sack of flour coming up!' + Objective2: + dialog: + - '&a[Daemones Maritialis]&f The farm needs more flour eh? Here ya go, two sacks!' + name: '&2Surprise me with flour' + questLore: + - Wow, you're quite handy. If I could bother you with another task. + - The &cRats&f had completely ruined our current stock of flour. + - So we need to a completely new batch of flour. + - The &dWindmills&f should have plenty of it. + - Go collect the flour and drop it off back here with me. + - I will be paying good coin for this service! + questAcceptDialog: + - '&a[Milonia Majus]&f You will need to collect the flour from all three &dWindmills&f.' + - '&7&oI need to visit the three &dWindmills&7&o and collect the flour they produce.' + questCompleteMessage: + - '&a[Milonia Majus]&f This should last us for quite a while!' + - Hopefully our flour tab won't get too big, hehe. +primis_pontis_mille_fields_wellness: + name: '&2Wellness' + questLore: + - Am I glad to see you right now! + - Dang &cNightmare Rat&f ambushed me while I was climbing down the well. + - I injured my arm and legs when I fell. + - Argh, I still have some of its toxic spit left in my eyes. + - Thankfully I managed to crawl my way onto this little + - ledge before it could come finish me off. + - How embarrassing, not sure what hurts more right now, my body or my pride. + - I have some + - '&eFirst Aid Equipment&f' + - in my chest at the &dHunters Camp&f. + - Would you mind getting it for me? Oh, and make sure not to tell anyone + - there a word about what you saw here. + - '...almost died in a well...this is chapter of my life I will need to erase...' + questAcceptDialog: + - '&a[Volumnia Zoilus]&f The &dHunters Camp&f is straight South, cannot miss it, look for tents.' + - '&7&oI need to go collect the &e&oFirst Aid Equipment&7&o for &a&oVolumnia&7&o at the &d&oHunters Camp&7&o.' + questCompleteMessage: + - '&a[Volumnia Zoilus]&f Already back? Hand me the equipment.' + - Do not worry about me, I will have myself patched up in no time. + - Thank you for everything! You saved my life you know! +primis_pontis_mille_field_check: + customObjectives: + Objective1: + dialog: + - '&a[Augustina Verrucosis]&f Oh, this is quite important! I will let the residents know.' + - Thank you for delivering these important documents. + name: '&2Field check' + questLore: + - If I could bother you with some delivery tasks. + - I have here some important documents that need to be delivered to the + - '&dSlums&f and to the &dFields Farm&f.' + - The soldier that was supposed to come and get them has not arrived yet. + - And this is an urgent matter, we cannot afford to wait any longer. + - Unfortunately I have strict orders to not leave my post. + - If you could do this for me it would help us out a lot. + questAcceptDialog: + - '&a[Godefridus Novation]&f You will do it? Excellent!' + - You can follow the &9Yellow Path&f to get to the slums. + - The &dFields Farm&f is right beyond the slums, just follow the path. + - Oh! And watch out for the field rats! + - '&7&oI should head for the &d&oSlums&7&o and then the &d&oFields Farm&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f Documents? Let me see them. Hmmm, looks official.' + - Thank you for coming all the way here to deliver them. + - '&7&oSeems like &a&oMilonia&7&o could use my help with the rats...' +primis_pontis_mille_fresh_rats_coming_up: + customObjectives: + Objective1: + dialog: + - '&a[Elite Guard]&f Plenty of rats inside.' + name: '&2Fresh rats coming up' + questLore: + - No cat food but I think I can help ya + - find something even better... + - I heard a couple of + - '&aGuards&f have been dealing with' + - a rat infestation in the lower parts of the city. + - Go down there and maybe you can get some + - '&cRats&f for your cat friend.' + questAcceptDialog: + - '&7&oI should check out the lower part of the city and see if I can find the &a&oElite Guards&7&o.' + questCompleteMessage: + - '&a[Mew Meowzer]&f Meow. MEOW! Prrrrr.' + - '&7&oI should let the cat enjoy it''s meal in peace.' + - '&7&oIt seems to have dropped something, hmm...' +primis_pontis_mille_hungry_friend: + customObjectives: + Objective3: + dialog: + - '&a[Melaenis Gelasius]&f Cat food? Where the heck did you manage to find a cat here...' + - No, I don't know where to get any cat food. + Objective4: + dialog: + - '&a[Sulpicio Panthera]&f I wish I could help, sorry.' + Objective1: + dialog: + - '&a[Royal Guard]&f Do I look like someone who keeps track of cat food?...' + Objective2: + dialog: + - '&a[Tyndarus Faustinius]&f Sorry, I have no idea.' + Objective5: + dialog: + - '&a[Tyndarus Columbanus]&f We used to have cat food around here somewhere, but heck knows what happened to it...' + name: '&2Hungry friend' + questLore: + - '&7&oWhat is wrong little one.' + - '&a[Mew Meowzer]&f Meow!' + - '&7&o Are you hungry? Does the' + - '&7&olittle one want some food?' + - '&a[Mew Meowzer]&f MREOOOW!!!' + - '&7&oLet''s see if we can' + - '&7&oget you some food.' + questAcceptDialog: + - '&7&oI should see if anybody in the city knows where to find some cat food.' + questCompleteMessage: + - '&a[Modestus Aper]&f Cat food? I don''t know about that. But...' + - '&7&oSeems like &a&oModestus&7&o might know something...' +primis_pontis_mille_late_delivery: + name: '&2Late delivery' + questLore: + - I ordered some &eFishing Nets&f from + - '&dGladius&f that haven''t arrived yet. I wonder' + - if something might have happened to the + - shipment. If you are willing, I would pay you + - a small fee if you could go see what + - happened to the shipment and get the + - '&eFishing Nets&f for me.' + questAcceptDialog: + - '&a[Delphium Calpurnius]&f Last I heard my shipment of &eFishing Nets&f was supposed to be heading for &dGladius&f.' + - '&7&oI need to go look around &d&oGladius&7&o for &a&oDelphium''s&7&o shipment of &e&oFishing Nets&7&o.' + questCompleteMessage: + - '&a[Delphium Calpurnius]&f Those are the &eFishing Nets&f! Thank you so much!' + - '&a[Delphium Calpurnius]&f I invested a lot of my savings into these! Not sure what I would have done if you hadn''t found them.' +primis_pontis_mille_let_them_know: + customObjectives: + Objective3: + dialog: + - So Fortes sent you? I see. + - Your help would be much appreciated, aid me and my forces will be ready. + Objective1: + dialog: + - So Fortes has decided to take action. + - Help me finish my task, and my forces will be ready. + Objective2: + dialog: + - So Fortes has decided to act. + - If you could assist me with this task, then my forces will be ready. + name: '&2Let them know!' + questLore: + - I am sorry that we cannot send aid to &dGladius&f right away. + - Ever since that new &cCounselor&f came, our ruler has not been himself. + - If you could reach out to the &aGenerals&f in the city and let them know + - that &dGladius&f needs help we might be able to to do something about it. + - But not before we deal with the existing issues first. + - I am sure that the &aGenerals&f will be happy to let you help them out with their issues. + - Go talk to them and then come back to let me know they got the message. + - I will reward you for your time. + questAcceptDialog: + - '&a[Fortes]&f Follow the &9orange path&f from the main room to find &aGeneral Bromia&f.' + - '&a[Fortes]&f At the end of the &9yellow path&f you will find the &aGeneral Rogerius&f.' + - '&a[Fortes]&f At the end of the &9shorter purple&f path you will find the &aGeneral Cylindrus&f.' + - '&7&oI need to talk to the three &a&oGenerals&7&o.' + questCompleteMessage: + - '&a[Fortes]&f You managed to contact them? Excellent!' + - '&a[Fortes]&f Here is your reward. Don''t spend it all in one place.' +primis_pontis_mille_lighthouse_1: + customObjectives: + Objective1: + dialog: + - '&8[Hegio Remus]&f Another letter? Thank you for bringing it to me.' + name: '&2A quick delivery' + questLore: + - Before you go anywhere, could you deliver this letter for me? + - You can find the gentleman it needs to go to on top of the Lighthouse. + - Don't worry the Lighthouse is right behind me through that doorway. + questAcceptDialog: + - '&8[Fortes]&f Thank you.' + - '&8&oI should go talk to the Pontis Mille Lighthouse Keeper.' + questCompleteMessage: + - '&8[Hegio Remus]&f Hey, do you have a second?' + - '&8&oSeems like Hegio Remus needs me to talk to him.' +primis_pontis_mille_lighthouse_2: + customObjectives: + Objective1: + dialog: + - '&a[Jeeves]&f Oh, we meet again. It''s good to see you.' + - You have something for me? Oh, wow...that is quite the shopping list. + - I will have the items sent back to &aHegio&f as soon as possible. + - Thank you for stopping by. Hope we meet again. + - '&7&oI should let &aHegio&7&o know I delivered the note.' + name: '&2Ask Jeeves' + questLore: + - Would you mind taking the portal and delivering a note to my good friend &aJeeves&f. + questAcceptDialog: + - '&a[Hegio]&f Much appreciated friend.' + - '&7&oI should go talk to &aJeeves&f at &dCaeruleaum Village&7&o.' + questCompleteMessage: + - '&a[Hegio]&f You delivered the note? Excellent!' + - Here, you can have some of this &eRabbit Stew&f I keep in my back pocket. +primis_pontis_mille_mines_goblined_up_in_the_maze: + customObjectives: + Objective3: + dialog: + - '&a[Hurt Guard]&f Am so I happy to see you!' + Objective1: + dialog: + - '&a[Injured Guard]&f Thank the skies!' + Objective2: + dialog: + - '&a[Wounded Guard]&f Finally, the rescue is here!' + name: '&2Goblined up in the maze' + questLore: + - If I could bother you for a second. + - Since you will be going into the &dMines&f already, it + - would be great if you could help us resolve some issues. + - We are missing three &aGuards&f that were sent + - into the mines to hunt down a &cCursed Goblin&f. + - I fear that something might have happened to them. + - This &cCursed Goblin&f is supposed to be + - hiding in some sort of &9Maze&f in the &dMines&f. + - Could you locate the &aMissing Guards&f and + - bring me proof of the &cGoblins&f death. + questAcceptDialog: + - '&a[Centurion]&fTry to not get lost in the &9Maze&f.' + - May luck be on your side warrior! + - '&7&oI should venture through the &d&oMines&7&o and locate the &9&oMaze&7&o.' + questCompleteMessage: + - '&a[Centurion]&f They are alive, excellent, we will send some soldiers to get them out as soon as possible.' + - I see you brought proof of the &cGoblins&f death, well done. + - '&7&oHopefully people keep out of the &9Maze&7&o in the future.' +primis_pontis_mille_serious_sewage: + customObjectives: + Objective3: + dialog: + - '&a[Michelangelo]&f Tell that old man everything is in order!' + Objective4: + dialog: + - '&a[Raphael]&f Tell Rogerius I am alive and doing fine!' + Objective1: + dialog: + - '&a[Donatello]&f You can tell the General I am doing just fine!' + Objective2: + dialog: + - '&a[Leonardo]&f The General should not worry, I am ok!' + name: '&2Serious sewage' + questLore: + - If you are up to the task then I could use your help. + - The &dSewers&f under the city have become a lair for all sorts of trouble makers and critters. + - The trouble makers call themselves &cNinjas&f...even though they are far from it. + - They have a leader, I think he calls himself &cShreepper&f or something. + - Make sure to get rid of him, a snake without it's head is not a threat. + - If you could go down there and thin the numbers of critters and the trouble makers + - then that would allow me to assign my forces to more important tasks... + - We had also sent &a4 Agents&f down there, I have not heard from them yet. + - It would mean a lot to me if you could check up on them to make sure they are ok. + - I also seem to have misplaced my personal &eSewage Keys&f + - if you could retrieve those too, that would be great. + questAcceptDialog: + - '&a[Rogerius]&fYou can get to the &dSewers&f by going to the fountain and then a bit south-east.' + - You know you are at the right spot when you see a big sewage pipe going into the wall. + - '&7&oI need to find my way into the &dSewers&7&o and complete the tasks.' + questCompleteMessage: + - '&a[Rogerius]&f You have completed the all I have asked? If only I had 10 more men like you...' +primis_pontis_mille_star_gazing: + customObjectives: + Objective1: + dialog: + - '&a[Virgo Dexippus]&f Yes, what is it?' + name: '&2Star gazing' + questLore: + - You have done so much for this city and its people. + - Having assisted the three &aGenerals&f and helped the areas around &dPontis Mille&f + - has freed up a serious amount of our forces and resources. + - We would be able to send our forces to aid &dGladius&f now. + - But before we take action there is one last thing I would like you to do. + - You should go speak with the &aStargazers&f. + - It is in regards to our lost history and the &cElementals&f. + - The &aStargazers&f will be able to tell you more once you talk to them. + - Here take this sealed note and show it to them. + questAcceptDialog: + - '&7[Fortes Bellator]&f You can find the &aStargazers&f at the &dObservatory&f.' + - The &dObservatory&f is located past the &dLighthouse&f. It is a large tower, hard to miss. + - '&7&oI should talk to the &aStargazers&7&o at the &dObservatory&7&o.' + questCompleteMessage: + - '&a[Virgo Dexippus]&f The &aMajor&f sent you? It must be important then.' + - '&7&oI should talk to &aVirgo&7&o.' +primis_pontis_mille_stay_a_while_and_listen: + name: '&2Stay a while and listen' + questLore: + - Hand me the note. Let me take a look... + - We have been given permission to share important + - information with you regarding our past. + - You must have done something quite important, + - this information is usually only shared with the top brass. + - '&aStella&f will share with you what we have uncovered.' + questAcceptDialog: + - '&a[Virgo Dexippus]&f Talk to &aStella&f and &9Click on the Sword&f to start listening.' + - '&7&oI should talk to &aStella&7&o and start the &9Arena Challenge&7&o.' + questCompleteMessage: + - '&a[Virgo Dexippus]&f Do not share this information with anyone.' + - '&7&oThat was quite a tale.' +primis_pontis_mille_the_groves_call: + customObjectives: + Objective1: + dialog: + - '&a[King Nemian]&f &2General Bromia&a sent you?' + - Excellent, I knew we could count on him. + name: '&2The groves call!' + questLore: + - It is our duty to protect the &dGroves&f from any threats. + - '&aKing Nemian&f of the &dGroves&f has sent a request for aid.' + - Nasty critters have come to the &dGroves&f and other + - invaders are taking over the trees. + - If you could go over there and sort out these issues + - then my forces will be free to come to &dGladius'&f aid + questAcceptDialog: + - '&a[Bromia]&f The &dGroves&f are located North of the city.' + - There is a path through the mountain,, below the mines. + - '&7&oI should talk to &aKing Nemian&7&o.' + questCompleteMessage: + - '&a[King Nemian]&f You have arrived just in time!' +primis_pontis_mille_to_lycan_or_not_to_lycan: + name: '&2To lycan or not to lycan' + questLore: + - Not sure how a single person can accomplish what + - an entire battalion cannot. + - But if the &aGeneral&f has sent you, then who I am to complain. + - We have located their &dDen&f, but the resistance is too strong. + - There was just no way to get through. + - But If you could fight your way into the &dDen&f and clear it out + - then the &dRedwoods&f could be safe yet again. Well safer at least... + - Their &dDen&f is located under a &9Corrupted Redwood Tree&f. + - Should be easy to spot it, it stands out among the healthy trees. + questAcceptDialog: + - '&a[Cylindrus]&f Be careful...' + - '&7&oI need to clear out the &dWerewolf Den&7&o.' + questCompleteMessage: + - '&a[Magnus]&f By the great tree fairy, you''ve done it!!!' + - Feel free to rest at our camp, you are always welcome here. +primis_pontis_mille_where_is_he_now: + customObjectives: + Objective1: + dialog: + - '&a[Gorenus Palis]&f My brother sent you looking for me?' + - Oh, I messed up again...I got real lost this time. + - I hope he isn't too mad. + - When you go back, please tell him I'm safe. + name: '&2Hungry friend' + questLore: + - Me and my &aBrother&f were on our way + - back here from the village. + - During our travels I had to do a little detour, so we got separated. + - We were supposed to meet up here. + - But no trace of him for quite some time now. + - He has a tendency to get lost...real lost. + - I am quite worried about him. + - I would be willing to pay a high reward + - to anyone who can find him. + questAcceptDialog: + - '&a[Rodenus Palis]&f So kind of you to offer your help.' + - Please if you find him come tell me where he is right away. + - '&7&oI need to go find &a&oRodenus''&7&o brother.' + questCompleteMessage: + - '&a[Rodenus Palis]&f What! How the heck did he end up all the way there!' + - Sigh, I better start going now then... + - Thank you for all your help. Here are the coins as promised. +primis_pontis_redwoods_big_brown_logs: + customObjectives: + Objective1: + dialog: + - '&a[Magnus]&f Who are you? Oh, you came from &dPontis Mille&f.' + name: '&2Big brown logs' + questLore: + - I could dedicate my forces to helping &dGladius&f if you could help + - us deal with the &cWerewolf&f crisis in the &dRedwoods&f. + - Our forces have been holding back the &cWerewolves&f for weeks now. + - It would be great if you could assist us. + - Go to the &dRedwoods&f and talk to &aMagnus Castorea&f. + - They will let you know what needs to be done to end this crisis. + questAcceptDialog: + - '&a[Cylindrus]&fThe &dRedwoods&f can be reached by heading North.' + - Head North until you reach the &dRailway Stop&f, then head West. + - '&7&oI need to head into the &dRedwoods&7&o and talk to &aMagnus&7&o.' + questCompleteMessage: + - '&a[Magnus]&f The general has sent you to help?' + - Hmm...you better be good. +primis_pontis_redwoods_its_reyn_time: + name: '&2It is Reyn time!' + questLore: + - My &ePocket-watch&f had fallen into the river when I was cutting down a tree. + - It is a special watch you see. Filled with air and quite robust. + - Fully resilient to heavy logs being dropped on it, yep. + - I saw one of those nasty &cBandits&f scoop it up and put it in their pocket. + - Pretty sure I saw them &9Carrying a Hatchet&f. + - If you could go to their camp and get it back for me. That would mean the world to me! + - A nice reward for you too when you get back! + questAcceptDialog: + - '&8[Reynus]&f You can find the &cBandits&f right across the river.' + - '&7&oI need to go slay the correct &cBandit&7&o and collect the &eWatch&7&o.' + questCompleteMessage: + - '&a[Reynus]&f I will make sure not to loose it again!' + - Your reward my good sir! +primis_pontis_redwoods_nasty_little_bandits: + name: '&2Nasty little bandits!' + questLore: + - Ever since these darn &cBandits&f settled across the river there has been no peace. + - They keep ruining the trees, yesterday I caught one of them + - trying to set one of these giant trees on fire! + - And not too long ago I got chased by a crazy person with a hatchet, + - I am quite sure it was one of the &cBandits&f. + - Not too mention they keep trying to rob anyone that + - has business with us good folk here at the &dSawmill&f. + - Enough is enough. I am willing to pay good coin to make this madness end. + questAcceptDialog: + - '&a[Ligna Crispian]&f You will find them across the river.' + - '&8&oI should go to the &dBandit Camp&f and clear it out.' + questCompleteMessage: + - '&a[Ligna Crispian]&f Finally! Some peace, thank you!' +primis_pontis_redwoods_need_a_smoke: + name: '&2Need a smoke' + questLore: + - I heard you helped good old &aReynus&f there. + - Well as you can see, I managed to cut my legs with that darn saw again. + - Oh, don't worry about me. My legs will be healed up again in no time. + - You see, the issue is, not much to do while I wait for my legs to heal. + - This makes me in the mood for some good puffin. + - I brought with me some &ePremium Tobacco&f for my pipe, + - but I had to hide it in case those &cBandits&f got their hands on it. + - The problem is, I completely forgot where I hid it! + - All I remember is burying it &9Near a Tree&f. + - Which tree? Who knows! + - Listen I got you a fine deal here. Find my tobacco and you can have + - all of my &eGolden Apples&f. + questAcceptDialog: + - '&a[Lyco]&f Hope ya find it soon.' + - '&7&oI should go look for the &eTobacco&7&o.' + questCompleteMessage: + - '&a[Lyco]&f You found it! HAHA! Knew I could rely on ya!' +primis_terravilla_bipedal_examination: + name: '&2Bipedal examination' + questLore: + - I have been studying the &cTwo Legged Terrors&f that roam + - around &dTerravilla&f. Did you know that their population + - used to be much larger just some years ago. In fact it was + - the reason why the first settlers decided to build + - '&dTerravilla&f on top of the ruins and not down on the ground.' + - For some reason their numbers have really decreased. I was + - trying to get some &eSamples&f but trying to kill any of them is + - far beyond my skill. But you look like the sort of type who + - can handle a &cTwo Legged Terror&f or two. Interested in + - helping me out? + questAcceptDialog: + - '&a[Plautia Suilius]&f Six &eSamples&f should do it. Return to me once you have collected the &eSamples&f.' + - '&7&oI need to slay 3 &c&oTwo Legged Terrors&7&o and collect their &e&oSamples&7&o.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Great! Let''s have a look.' + - '&7&oI should hear what &a&oPlautia Suilius&7&o has discovered.' +primis_terravilla_drowning_terror: + name: '&2Drowning terror' + questLore: + - My theory was correct. I dissected the growth and found + - an organism inside. After careful examination I have + - determined that the organism is of aquatic origin. And + - not only that, they are capable of hijacking the host's + - brain. Once ready to hatch they make the host go to the + - nearest water source and drown themselves. The organism + - can then freely hatch and swim away. Whatever is + - infecting the &cTwo Legged Terrors&f must be living in + - a nearby river. You should go there and collect a + - '&ePerfect Sample&f of whatever organism is causing this.' + - I do not know if this is something that can affect humans + - but just in case you should kill a few of the organisms + - to make sure. + questAcceptDialog: + - '&a[Plautia Suilius]&f Come back here once you have collected a &ePerfect Sample&f.' + - '&7&oI need to go to the nearby river and collect a &e&oPerfect Sample&7&o of whatever is causing the infections.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Wow it looks like a fish, but it''s internal organs are different.' + - It must infect other creatures by releasing these tiny worm like meat particles... + - Let me have a look at you. Hmm, you seem fine, no traces... + - So it is not affecting us...yet. This is an emergency, I need to collect my stuff and go present my findings to the researchers at &dPontis Mille&f immediately. I need to get approval for extermination, that organism cannot be allowed to evolve. + - Thank you for everything you have done. Here, take this. It's not a lot but at least it's something. + - '&7&oI should make sure to stay away from the river...' +primis_terravilla_hog_on_my_porch: + name: '&2Bipedal examination' + questLore: + - He is sitting on the darn lift again! + - I cannot believe it! You there! + - You look like you can handle a large beast. + - I will pay you good money if you can get rid + - of that &cAnnoying Large Hog&f that keeps sitting + - on the lift. How are we supposed to get goods + - up and down this way. + questAcceptDialog: + - '&a[Dorippa Sarimarcus]&f Get rid of that hog right down there, see it?' + - '&7&oI need to slay the &c&oAlpha Razorback&7&o.' + questCompleteMessage: + - '&a[Dorippa Sarimarcus]&f Finally! I can move on with my life now! Thank you!' +primis_terravilla_razorbag: + name: '&2Razorbag' + questLore: + - If you are looking for work I got some for ya. + - I design and make heavy duty bags that I sell + - here at my little shop. So I am in need of + - leather. Thankfully there are plenty of + - '&cRazorbacks&f around these parts. If you are' + - interested I would like to hire you to go hunt + - them for their leather. I would need a considerable + - amount of leather. So this won't be a quick job. + questAcceptDialog: + - '&a[Telestis Senna]&f You will mostly find them roaming around here and towards the fields area.' + - '&7&oI need to go hunt the &c&oMature Razorback&7&o.' + questCompleteMessage: + - '&a[Telestis Senna]&f Yep, that will do it. In pristine condition too! Here is your coin, as promised.' +primis_terravilla_terrifying: + name: '&2Terrifying' + questLore: + - Well that is concerning. The sample you brought shows + - that they are slowly being drained of their nutrients. + - My hypothesis is that there is most likely a parasite + - attached to them that is causing this. You should go + - out there again and see if you can find any large + - '&eGrowths&f on their bodies, and then cut them off' + - and bring them back here. + questAcceptDialog: + - '&a[Plautia Suilius]&f I would only need two &eGrowths&f no more than that.' + - '&7&oI need to slay &c&oTwo Legged Terrors&7&o and collect two &e&oGrowths&7&o.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Excellent, these should do it.' + - '&7&oI should hear what &a&oPlautia Suilius&7&o has managed to find.' +test_quest: + name: Kill the Test Boss + questLore: + - '&cEnd the test boss'' reign of terror!' +xmas_quest_0: + name: '&2Find the lost gifts!' + questLore: + - I seem to have lost some Christmas gifts along the way, would you help a poor old man find them again? + - I will let you open one of them in return! + questAcceptDialog: + - '&8[&cSaint Nick&8]&f Thank you! I will be waiting here for you!' + questCompleteMessage: + - '&8[&cSaint Nick&8]&f Thank you for your help! There are still some lost gifts out there, talk to me again if you want to help out more!' diff --git a/src/main/resources/translations/polish.yml b/src/main/resources/translations/polish.yml new file mode 100644 index 000000000..de721c49c --- /dev/null +++ b/src/main/resources/translations/polish.yml @@ -0,0 +1,13078 @@ +config: + noArenaPermissionMessage: '[EliteMobs] Nie masz uprawnień do wejścia na tę arenę!' +ItemSettings: + itemLoreStructureV2: + - '&7&m&l---------&7<&lInformacje o wyposażeniu&7>&m&l---------' + - '&7Poziom Przedmiotu: §f$itemLevel §7Prestiż §6$prestigeLevel' + - '$weaponOrArmorStats' + - '$soulbindInfo' + - '$itemSource' + - '$ifLore&7&m&l-----------&7< &f&lOpis&7 >&m&l-----------' + - '$customLore' + - '$ifEnchantments&7&m&l--------&7<&9&lEnchanty&7>&m&l--------' + - '$enchantments' + - '$eliteEnchantments' + - '$ifCustomEnchantments&7&m&l------&7< &3&lNiestandardowe Enchanty&7 >&m&l------' + - '$customEnchantments' + - '$ifPotionEffects&7&m&l----------&7< &5&lEfekty&7 >&m&l----------' + - '$potionEffect' + - '&7&l&m-----------------------------' + - '$loreResaleValue' + shopSourceItemLores: '&7Zakupione w sklepie' + mobSourceItemLores: '&7Zdobyte z $mob' + loreWorths: '&7Wartość $worth $currencyName' + loreResaleValues: '&7Sprzedaż za $resale $currencyName' + eliteEnchantmentLoreStrings: Elitarny + noSoulbindLore: '&7Niesprzedawalny!' + preventEliteItemDisenchantmentMessage: '&c[EliteMobs] Nie można odczarować Elitarnych Przedmiotów!' + scrapSucceededMessageV2: '&8[EliteMobs] &2Złomowanie udało się $amount razy!' + scrapFailedMessageV2: '&8[EliteMobs] &cZłomowanie nie powiodło się $amount razy!' + lowDurabilityItemDropMessage: '&8[EliteMobs] &cUpuszczono zbroję ze względu na niską wytrzymałość! &8Napraw ją u NPC za pomocą złomu, aby ją ponownie użyć!' + lowWeaponItemDropMessage: '&8[EliteMobs] &cUpuszczono broń ze względu na niską wytrzymałość! &8Napraw ją u NPC za pomocą złomu, aby ją ponownie użyć!' + simlootMessageSuccess: '&8[EliteMobs] &2Losowano loot i uzyskano $itemName &2!' + simlootMessageFailure: '&8[EliteMobs] &cLosowano loot i nic nie uzyskano!' + directDropCustomLootMessage: '&8[EliteMobs] &2Zdobyto $itemName &2!' + directDropMinecraftLootMessage: '&8[EliteMobs] &aZdobyto $itemName &a!' + directDropCoinMessage: '&8[EliteMobs] &aZdobyto &2$amount $currencyName &a!' + directDropSpecialMessage: '&8[EliteMobs] &aZdobyto &2$amount $name &a!' + weaponEntry: '&7Elitarny DPS: &2$EDPS' + armorEntry: '&7Elitarny Pancerz: &2$EDEF' +ProceduralItemGenerationSettings: + materialNames: + swordName: Miecz + bowName: Łuk + pickaxe: Kilof + spade: Szpadel + hoe: Motyka + axe: Topór + helmet: 'Pancerz: Hełm' + chestplate: 'Pancerz: Napierśnik' + leggings: 'Pancerz: Nogawice' + boots: 'Pancerz: Buty' + shears: Nożyce + fishingRod: Wędka + shield: Tarcza + trident: Trójząb + crossbow: Kusza + nameFormats: + - '$adjective $itemType $noun' + - '$adjective $itemType' + - '$adjective $itemType $verb $noun' + - '$itemType $noun' + - '$itemType $verb $noun' + - '$verb-er' + - '$adjective $verb-er' + nouns: + - MagmaGuya + - Wschodu Słońca + - Zachodu Słońca + - Nieba + - Piekła + - Anioła + - Archanioła + - Aniołka + - Serafina + - Demona + - Diabła + - Nietoperza + - Kurczaka + - Krowy + - Grzyba + - Świni + - Królika + - Owcy + - Kałamarnicy + - Wieśniaka + - Pająka Jaskiniowego + - Endermana + - Niedźwiedzia Polarnego + - Pająka + - Zombie Pigmana + - Płomyka + - Creepera + - Prastrażnika + - Endermita + - Przywoływacza + - Ghasta + - Strażnika + - Husk + - Magmowej Kostki + - Shulkera + - Rybika Cukrowego + - Szkieleta + - Szlamu + - Tułacza + - Vexa + - Windykatora + - Wiedźmy + - Witherowego szkieleta + - Zombiaka + - Osła + - Konia + - Lamy + - Muła + - Ocelota + - Wilka + - Żelaznego Golema + - Śnieżnego golema + - Smoka kresu + - Withera + - Iluzjonisty + - Papugi + - Giganta + - Zabójczego Królika + - Steve'a + - Zmory Wilka + - Chaosu + - Wieczności + - Smoka + - Sfinksa + - Minotaura + - Hadesa + - Przysięgi + - Łamacza Przysięgi + - Pustynnika + - Zdrajcy + - Nefryty + - Światła + - Ciemności + - Zapomnienia + - Cienia + - Pustkowca + - Ksenonu + - Gorliwca + - Zenitu + - Mroku + - Zmierzchu + - Stwora + - Elitarnego Stwora + - Urysa + - Krasnoluda + - Elfa + - Orka + - Goblina + - Gnoma + - Goliata + - Topielca + - Człowieka + - Niziołka + - Półorka + - Obserwatora + - Łupieżcy umysłów + - Włócznika + - Pocisku + - Zardzewiałego Potwora + - Górskiego Olbrzyma + - Kamiennego Olbrzyma + - Lodowego Olbrzyma + - Ognistego Olbrzyma + - Pochmurnego Giganta + - Burzowego Giganta + - Kransoludka + - Licza + - Orka + - Umbrowego Kolosa + - Wojownika + - Czarodzieja + - Paladyna + - Kapłana + - Zwiadowcy + - Łucznika + - Maga + - Diabelstwa + - Wilkołaka + - Wampira + - Centaura + - Koto-człowieka + - Pół-Olbrzyma + - Ogra + - Trolla + - Łotra + - Barbarzyńcy + - Barda + - Druida + - Mnicha + - Czarownika + - Czarnoksiężnika + - Łowcy Demonów + - Rycerza Śmierci + - Kapłan + - Szamana + - Wojownika + - Bazyliszka + - Chimery + - Chochlika + - Driada + - Gargulca + - Dżina + - Efreeti + - Ducha + - Straszydła + - Hydry + - Krakena + - Lamii + - Meduzy + - Mimika + - Mumii + - Pegaza + - Ruka + - Satyr + - Tarrasqua + - Dziwadła + - Upiora + - Enta + - Jednorożca + - Widma + - Akolita + - Gladiatora + - Rycerza + - Gryfa + - Jeźdźca + - Zwiadowcy + - Szpiega + - Thyga + - Szlachcica + - Strażnika + - Weterana + - Wiwerny + - Niezgłębionego + - Piekielnego + - Żywiołaka + - Taureni + - Pandarena + - Wielkiej Stopy + - Opuszczonego + - Yeti + - Banshee + - Pajęczaka + - Nieumarłego + - Nocnego Elfa + - Krwawego Elfa + - Draenei + - Worgeni + - Gubernatora Wojskowego + - Wiedźmy + - Magi + - Mędrca + - Złodzieja + - Assasina + - Templariusza + - Mistrza Bestii + - Berserka + - Wynalazcy + - Luchadora + - Pirata + - Awangardzisty + - Ostrza Pustki + - Błędnego Ognika + - Chłopa + - Piechura + - Szermierza + - Niewolnika + - Złocica + - Łowczyni + - Łowcy + - Aarakorcra + - Aboletha + - Devy + - Planetarnego + - Solarnego + - Ankhega + - Azera + - Behiry + - Tyrana Śmierci + - Żmii + - Orklina + - Niedźwiedzia + - Żabich Wojowników + - Kambiona + - Chuula + - Króla Lisz + - Bazyliszka + - Couatla + - Cyklopa + - Tytana + - Ciemnego Płaszcza + - Przedwiecznego + - Demilisza + - Balora + - Barlgura + - Latającego Demona + - Dretcha + - Glabrezu + - Goristra + - Hezrou + - Duch Przodków + - Marilitha + - Nalfeshnee + - Quasita + - Vroka + - Yochlola + - Demona Otchłani + - Lemura + - Dracolicha + - Sobowtóra + - Chromatycznego Smoka + - Kosarza + - Żywiołaka Powietrza + - Żywiołaka Ziemi + - Żywiołak Ognia + - Żywiołak Wody + - Rohirrima + - Gondoriana + - Empyreanina + - Baśniowego Smoka + - Ettina + - Flumpa + - Fomorianina + - Dao + - Gnolla + - Parshendianina + - Nasłuchiwacza + - Szprena + - Ojca burzy + - Rosharianina + - Władcy Jasności + - Arcyksięcia + - Króla + - Cesarza + - Posiadacza Odłamka Mocy + - Spoiwa Burzy + - Wspólnoty Kowali + - Golema + - Gorgona + - Wiedźmy + - Harpii + - Hippogriffa + - Homunkulusa + - Alchemika państwowego + - Nieumarłego Żołnierza + - Zmiennokształtnego Szakala + - Notica + - Oni + - Rakshasa + - Zjawy + - Kultysty + adjectives: + - Uroczy + - Piękny + - Czysty + - Elegancka + - Fantazyjny + - Czarujący + - Przystojny + - Długi + - Wspaniały + - Zwykły + - Osobliwy + - Musujący + - Najbrzydszy + - Czerwony + - Pomarańczowy + - Żółty + - Zielony + - Niebieski + - Fioletowy + - Szary + - Czarny + - Biały + - Martwy + - Dziwaczny + - Potężny + - Wzbogacony + - Rozległy + - Gorliwy + - Ogłuszający + - Święty + - Melodyczny + - Cichy + - Grzmiący + - Szeptliwy + - Syczący + - Starożytny + - Szybki + - Stary + - Nagły + - Wolny + - Zgniły + - Straszliwy + - Krzywy + - Pusty + - Ciężki + - Odrażający + - Nieprawidłowy + - Absurdalny + - Akceptowalny + - Przypadkowy + - Nieugięty + - Ryzykowny + - Erodujący + - Alarmowy + - Zirytowany + - Denerwujący + - Szkodliwy + - Aromatyczny + - Agresywny + - Odległy + - Niesamowity + - Zagadkowy + - Ambitny + - Rozbawiający + - Zły + - Arogancki + - Zawstydzony + - Aspirujący + - Zadziwiający + - Pomyślny + - Przeciętny + - Wspaniały + - Straszny + - Kiepski + - Barbarzyński + - Nieśmiały + - Pasujący + - Wojujący + - Korzystny + - Pełny Szału + - Najlepszy + - Oszałamiający + - Duży + - Gorzki + - Kuriozalny + - Krwawy + - Gotujący się + - Bezgraniczny + - Zuchwały + - Odważny + - Krzepki + - Łamiący się + - Krótki + - Jasny + - Zepsuty + - Zajęty + - Obliczający + - Bezduszny + - Spokojny + - Kapryśny + - Ostrożny + - Niedbały + - Opiekuńczy + - Ostrożny + - Nieustanny + - Pewny + - Czarujący + - Tani + - Naczelny + - Chłodny + - Rycerski + - Masywny + - Czysty + - Sprytny + - Klasztorny + - Nieporęczny + - Pochmurny + - Klasyczny + - Kolosalny + - Wojenny + - Pospolity + - Zmieszany + - Potępiony + - Fajny + - Odważny + - Tchórzliwy + - Szalony + - Tchórzliwy + - Okrutny + - Wygodny + - Ciekawy + - Uroczy + - Uszkodzony + - Uszkadzający się + - Niebezpieczny + - Ciemny + - Wyślizgujący się + - Decydujący + - Głęboki + - Uszkodzony + - Wadliwy + - Odporny + - Delikatny + - Przepyszny + - Świetny + - Demoniczny + - Bredzący + - Obłąkany + - Opisowy + - Diabelski + - Trudny + - Staranny + - Okropnie Demoniczny + - Brudny + - Fatalny + - Oburzony + - Obrzydliwy + - Rozczarowany + - Odrębny + - Burzliwy + - Drakoński + - Dramatyczny + - Ponury + - Dysfunkcjonalny + - Żądny + - Podstarzały + - Elektryczny + - Elitarny + - Zaczarowany + - Zaklęty + - Energiczny + - Ogromny + - Rozrywkowy + - Entuzjastyczny + - Zawistny + - Nierówny + - Eteryczny + - Wykrętny + - Doskonały + - Podekscytowany + - Ekscytujący + - Egzotyczny + - Żywiołowy + - Wspaniały + - Wyblakły + - Niezły + - Oddany + - 'Fałszywy' + - Znajomy + - Znany + - Fanatyczny + - Fantastyczny + - Zafascynowany + - Gruby + - Straszliwy + - Nieustraszony + - Kiepski + - Uroczysty + - Dziki + - Brudny + - Porządny + - Wybredny + - Pierwszy + - Stały + - Błyszczący + - Idealny + - Łamliwy + - Nonszalancki + - Kwiecisty + - Puszysty + - Trzepotliwy + - Pienisty + - Nierozsądny + - Zapominalski + - Fortunny + - Wątły + - Kruchy + - Wściekły + - Darmowy + - Zamrażający + - Świeży + - Przyjazny + - Przerażający + - Niedbały + - Zabawny + - Futrzany + - Ukradkowy + - Zamazany + - Gigantyczny + - Utalentowany + - Gigantyczny + - Lśniący + - Wspaniały + - Boski + - Dobry + - Niezdarny + - Przepiękny + - Wdzięczny + - Majestatyczny + - Pełny Wdzięku + - Obtłuszczony + - Świetny + - Chciwy + - Żałobny + - Fajny + - Groteskowy + - Brudny + - Makabryczny + - Zrzędliwy + - Zabezpieczony + - Niewinny + - Łatwowierny + - Pełen Odwagi + - Gardłowy + - Uświęcony + - Wiszący + - Feralny + - Szczęśliwy + - Harmoniczny + - Nienawistny + - Zdrowy + - Niszczący Serce + - Niebiański + - Piekielny + - Pomocny + - Bezradny + - Niezdecydowany + - Ohydny + - Zabawny + - Dziurawy + - Tułaczy + - Honorowy + - Okropny + - Gościnny + - Ogromny + - Niezdarny + - Humorystyczny + - Złakniony + - Zraniony + - Uciszony + - Hipnotyczny + - Histeryczny + - Bardzo Kleisty + - Lodowy + - Ignorancki + - Chory + - Nielegalny + - Znakomity + - Wyimaginowany + - Niezmierny + - Groźny + - Bezstronny + - Niedoskonały + - Nieuprzejmy + - Ważny + - Rozżarzony + - Niefachowy + - Industrialny + - Nieprawdopodobny + - Niedrogi + - Niesławny + - Niewinny + - Ciekawy + - Podstępny + - Instynktowny + - Inteligentny + - Interesujący + - Niezwyciężony + - Wzburzony + - Nieporęczny + - Sterany + - Wyszczerbiony + - Zazdrosny + - Szczęśliwy + - Radosny + - Gniewny + - Młodociany + - Gorliwy + - Życzliwy + - Miły + - Wiedzący + - Bywały + - Znany + - Pracowniczy + - Kiepski + - Duży + - Ostatni + - Późny + - Śmieszny + - Leniwy + - Wątły + - Zabójczy + - Świetlisty + - Mały + - Żyjący + - Samotny + - Głośny + - Uroczy + - Przynoszący Szczęście + - Karmazynowy + - Magiczny + - Majestatyczny + - Złośliwy + - Oznaczony + - Masywny + - Niesamowity + - Wredny + - Medyczny + - Stopiony + - Niechlujny + - Potężny + - Wojskowy + - Bezmyślny + - Drobny + - Mglisty + - Zmieszany Z Różnych Komponentów + - Nowoczesny + - Nieruchliwy + - Tajemniczy + - Naiwny + - Wąski + - Naturalny + - Zgrabny + - Niezbędny + - Zbędny + - Ubogi + - Nerwowy + - Nowy + - Fajny + - Normalny + - Nostalgiczny + - Niezliczony + - Archaiczny + - Łatwy do Nabycia + - Oceaniczny + - Przestarzały + - Wszechwiedzący + - Optymalny + - Przeciętny + - Organiczny + - Wybitny + - Owalny + - Przereklamowany + - Bolesny + - Równoległy + - Żałosny + - Pokojowy + - Skruszony + - Perfekcyjny + - Periodyczny + - Młody Drobny + - Fizyczny + - Różowy + - Plastikowy + - Przyjemny + - Bezsensowny + - Uprzejmy + - Biedny + - Cenny + - Premium + - Pochodzący z Teraźniejszości + - Ładny + - Prywatny + - Produktywny + - Ochronny + - Pulbiczny + - Zagadkowy + - Wątpliwego pochodzenia + - Szybko + - Najszybszy + - Rzadki + - Gotowy + - Standardowy + - Należący do Buntowników + - Regularny + - Nadzwyczajny + - Odpowiedzialny za Wiele Walk + - Romantyczny + - Okrągły + - Królewski + - Smutny + - Bezpieczny + - Słonawy + - Satysfakcjonująco Wykonany + - Przestraszony + - Straszny + - Naukowy + - Wąski i Porysowany + - Skrzeczący + - Drugi + - Używany + - Sekretny + - Samolubny + - Sekwencyjny + - Poważny + - Płytki + - Ostry + - Błyszczący + - Porażający + - Krótki + - Nieśmiały + - Chory + - Cichy + - Jedwabisty + - Głupi + - Prosty + - Chudy + - Szczupły + - Oślizgły + - Śliski + - Mały + - Mądry + - Uśmiechający się Śmierci w Oczy + - Gładki + - Podstępny + - Łagodny + - Solidny + - Specjalny + - Spektakularny + - Ostry + - Kolczasty + - Znakomity + - Straszny + - Nieskazitelny + - Kwadratowy + - Ostro Zakończony + - Solidnie Utrzymany + - Równy + - Klejący się + - Osobliwy + - Pręgowany + - Silny + - Sukcesywny + - Super + - Najwyższy + - Słodki + - Utalentowany + - Wysoki + - Smaczny + - Tymczasowy + - Napięty + - Okropny + - Przerażający + - Przetestowany + - Wdzięczny + - Gruby + - Cienki + - Spragniony + - Roztropny + - Malutki + - Zmęczony + - Zdradliwy + - Problematyczny + - 'Prawdziwy' + - Brzydki + - Ultra + - Niepolecany + - Niezręczny + - Niekryty + - Niezdrowy + - Unikalny + - Nieznany + - Nienaturalny + - Nieużywany + - Nietypowy + - Używany + - Użyteczny + - Bezużyteczny + - Wartościowy + - Agresywny + - Oczekujący Na Walkę + - Wędrowny + - Ciepły + - Słaby + - Bogaty + - W Pełni Wykończony + - Mądry + - Wspaniały + - Drewniany + - Niepokojący + - Bezcenny + - Błędny + - Groźny + - Godny Zaufania + - Niepozorny + - Niebezpieczny + verbs: + - Miażdżącego + - Tnącego + - Dźgającego + - Przeszywającego Skórę + - Zabójczego + - Pogrążającego Wrogów + - Ubijającego + - Siejącego Zniszczenie + - Łaskoczącego + - Przytulnego + - Mordującego + - Uderzającego + - Syczącego + - Podróżującego + - Teleportującego się + - Migoczącego + - Niszczącego Przeciwników + - Dobijającego + - Błyskającego + - Materializującego się + - Rodzącego Siłę + - Pytającego + - Poszukującego Wrogów + - Obronnego + - Wymagającego + - Przesłuchującego Wrogów + - Kwestionującego + - Atakującego + - Uderzającego + - Czającego się + - Napastującego + - Gwałtownego + - Szturmującego + - Bombardującego + - Szturmującego + - Porażającego + - Ładującego się + - Uderzającego + - Prowadzącego Bitwę + - Zadającego Cierpienie + - Kującego Ból Przeciwników + - Bijącego + - Walczącego + - Przytłaczającego + - Rajdującego + - Rozwiązującego Problemy + - Strzelającego + - Odważnego + - Pękającego + - Zerwanego + - Druzgocącego + - Przygniatającego + - Szczelinowatego + - Rozbijającego + - Sproszkowanego + - Rozdartego + - Rozdzierającego + - Przyciągającego + - Pękającego + - Eksplodującego + - Uszkodzonego + - Fragmentującego się + - Rozdzielającego się + - Umocnionego + - Strąconego + - Stukającego + - Potrąconego + - Bębniącego + - Wtrącającego się + - Łomoczącego + - Uderzającgo + - Kolosalnego + - Strzaskanego + - Przywołanego + - Krzykliwego + - Wyczącego + - Ryczącego + - Zmiennokształtnego + - Zmieniającego Formę + - Zmodyfikowanego Alchemicznie + - Pokrętnego + - Zmutowanego + - Zniekształconego + - Niewyraźnego + - Nieregularnego + - Wypaczonego + - Przemienionego + - Zaadaptowanego + - Ewoluującego + - Różnego + - Polującego + - Końcowego + - Podążającego + - Stalkującego + - Cieniowego + - Tropiącego + - Obudowanego + - Zaadaptowanego + - Unoszącego się + - Wschodzącego + - Falującego + - Skaczącego + - Wystrojonego + - Zbierającego + - Zaganiającego + - Zgromadzonego + - Zbierającego Żniwa + - Zbierającego Żniwa + - Oszczędzającego + - Chroniącego się + - Zakamuflowanego + - Okrywającego się Całunem + - Ograniczonego + - Ukrywającego się + - Chowającego się + - Przebranego + - Zamaskowanego + - Zakopanego + - Uduszonego + - Zachmurzonego + - Chronionego + - Cieniowanego + - Opieczętowanego + - Opakowanego + - Ciernistego + - Przyćmionego + - Przejeżdżającego + - Ubrudzonego + - Szybującego + - Wyjącego + - Skomlącego + - Krzyczącego + - Roniącego Łzy Bólu + - Piszczącego + - Ryczącego + - Zawiedzionego + - Wrzeszczącego + - Skrzeczącego + - Rozszczepiającego + - Okazałego + - Poobijanego + - Rozciętego + - Pokrajanego + - Wyciętego + - Rozdzielającego się + - Ściętego + - Zjadliwego + - Rozdzierającego + - Rozdartego + - Przerzedzonego + - Przycinanie + - Wyrzeźbionego + - Odkrytego + - Zhackowanego + - Przeszytego + - Przepiłowanego + - Ogolonego + - Ostrzyżonego + - Kopiącego + - Zagłębionego + - Wydobytego + - Wyrytego + - Wiercącego + - Drążącego + - Żłobionego + - Kopiącego Tunele + - Najeżdżającego + - Abordażującego + - Wędrownego + - Infiltrującego + - Będącego Intruzem + - Unikającego + - Uciekającego + - Biegnącego + - Unikającego + - Rozbitego + - Prowadzącego Bitwę + - Bojówkowego + - Zapaśniczego + - Przepychającego + - Pojedynkującego się + - Potyczkującego się + - Potyczkującego się + - Sparingowego + - Zderzającego się + - Wojennego + - Zaczepnego + - Zezłomowanego + - Atakującego + - Kłótliwego + - Potyczkującego się + - Odkrywczego + - Wykrytego + - Złapanego + - Rozwiązującego + - Ujawniającego się + - Odgrzebanego + - Wędrownego + - Odbijającego się + - Skaczącego + - Sklepionego + - Skaczącego + - Wzmocnionego + - Płynącego + - Uruchomionego + - Wyrzucającego + - Wyczutego + - Świadomego + - Wykrytego + - Zanikającego + - Krwawiącego + - Kurczącego się + - Słabnącego + - Słabnącego + - Malejącego + - Wykutego + - Wypuszczonego + - Zebranego + - Zbierającego + - Nazwanego + - Skruszonego + - Napędzonego + - Ćwiczącego + - Biegnącego + - Zleconego + - Zwiadowczego + - Eksplorującego + - Wykopanego + - Drżącego + - Porywistego + - Rozstanego + - Zhackowanego + - Zerwanego + - Wyrzeźbionego + - Podzielonego + - Przepołowionego + - Zniszczonego + - Rozbitego + - Rozsadzający + - Rozdzierającego + - Rozerwanego + - Pasącego się + - Uwięzionego + - Złapanego + - Odpartego + - Oplątanego + - Przypiętego + - Złapanego + - Ograniczonego + - Połączonego + - Zaczepionego + - Rozjeżdżającego + - Zrywanego + - Umieszczonego w Klatce + - Przechwyconego + - Natarczywego + - Skradającego się + - Zakradającego się + - Szpiegującego + - Pomszczonego + - Burzowego + verb-ers (noun): + - Niszczyciel Światów + - Rozbijacz Światów + - Mściciel + - Spopielacz + - Poszukiwacz Wiatru + - Złoczyńca + - Władca Gromów + - Przekrajacz + - Siekacz + - Ucinak + - Dźgacz + - Drapacz + - Zabójca + - Pogromca + - Niszczyciel + - Przytulacz + - Morderca + - Uderzacz + - Podróżnik + - Teleporter + - Mrugacz + - Rozbijacz + - Materializator + - Przywoływacz + - Wymagający + - Napastnik + - Napastnik + - Czatownik + - Biegacz + - Burzyciel + - Bombarder + - Gradobójca + - Gromowładny + - Ładowacz + - Wojownik + - Młotnik + - Trzepak + - Wojownik + - Przytłaczacz + - Jeździec + - Rozwalacz + - Strzelec + - Przedsiębiorca + - Łamacz + - Miażdżyciel + - Rozbijacz + - Łamacz + - Rozdzielacz + - Rozpryskiwacz + - Rozrywacz + - Renderowacz + - Przyciągacz + - Spalacz + - Eksplodator + - Uszkadzacz + - Fragmenter + - Rozdzielacz + - Wzmacniacz + - Szturchacz + - Pukacz + - Kolos + - Okrasacz + - Łomotacz + - Napastnik + - Niszczyciel + - Więziciel + - Przywoływacz + - Krzykacz + - Zmiennokształtny + - Transformator + - Modyfikator + - Skręcacz + - Rozmywacz + - Wypaczacz + - Zmieniacz + - Adapter + - Zewoluowany + - Urok Łowcy + - Tropiciel + - Naśladowca + - Prześladowca + - Nośnik Cienia + - Ogar + - Skrywacz + - Burzyciel + - Wspinacz + - Powstaniec + - Skoczek + - Zbieracz Żniw + - Żniwiarz + - Zbieracz + - Wygaszacz + - Schroniciel + - Kamuflujący + - Całun + - Powiększacz + - Chowacz + - Maskowator + - Grabarz + - Chmurnik + - Cieniownik + - Uszczelniacz + - Pokrywacz + - Przysłaniacz + - Wędrowca + - Strażnik Porządku + - Szybowiec + - Wyjec + - Skomlarz + - Krzykacz + - Donosiciel + - Wrzeszczot + - Wampir + - Siekacz + - Roznosiciel Radości + - Snajper + - Rozdzielacz + - Topornik + - Siekacz + - Renderowacz + - Rozrywacz + - Rozcieńczalnik + - Żniwiarz + - Rzeźbiarz + - Haker + - Przebijacz + - Piłownik + - Golarz + - Kombajn + - Górnik + - Ekskawator + - Spalacz + - Wiertacz + - Wydrążacz Tuneli + - Najeźdźca + - Zarządca + - Wędrowiec + - Intruz + - Wykręcacz + - Goniec + - Cwaniak + - Zgniatacz + - Wojownik + - Zapaśnik + - Szamotacz + - Pojedynkator + - Awanturnik + - Zderzacz + - Chwytak + - Zgarniacz + - Agresor + - Łapacz + - Łowca + - Inteligent + - Ujawniacz + - Skoczek + - Odbijacz + - Wędrownik + - Lej + - Chirurg + - Punktator + - Dropkicker + - Odbiorca + - Suwak + - Wykrwawiacz + - Osłabiacz + - Wykuwacz + - Wydawca + - Zbieracz + - Kruszarz + - Śmigło + - Jogger + - Sprinter + - Scuter + - Odkrywca + - Kopacz + - Drżyciel + - Rozdzielacz na Części + - Haker + - Rzeźbiarz + - Separator + - Przepoławiacz + - Niszczyciel + - Renderowacz + - Rozpruwacz + - Pasowacz + - Uwięziacz + - Rogowiec + - Pinarz + - Łowca + - Ogranicznik + - Łącznik + - Szperacz + - Porywacz + - Zamykacz + - Zdobywca + - Łowca + - Czychacz + - Skradacz + - Łącznik + - Zniewalacz + - Uwodziciel + - Tancerz + - Bluźnierca + - Zjadacz + - Chrapacz + - Przyśpieszacz + - Uderzacz +absorption: + name: Absorbcja +blindness: + name: Oślepienie +conduit_power: + name: Moc Przewodni +confusion: + name: Mdłości +damage_resistance: + name: Odporność +dolphins_grace: + name: Łaska Delfinów +fast_digging: + name: Pośpiech +fire_resistance: + name: Odporność na Ogień +glowing: + name: Blask +harm: + name: Natychmiastowe Obrażenia +heal: + name: Natychmiastowe Leczenie +health_boost: + name: Zwiększenie Zdrowia +hunger: + name: Głód +increase_damage: + name: Siła +invisibility: + name: Niewidzialność +jump: + name: Zwiększony Skok +levitation: + name: Lewitacja +luck: + name: Szczęście +night_vision: + name: Noktowizja +poison: + name: Zatrucie +regeneration: + name: Regeneracja +saturation: + name: Nasycenie +slow: + name: Spowolnienie +slow_digging: + name: Wyczerpanie +slow_falling: + name: Powolne Opadanie +speed: + name: Szybkość +unluck: + name: Pech +water_breathing: + name: Oddychanie pod Wodą +weakness: + name: Słabość +wither: + name: Obumarcie +translation: + Economy pay message v2: '&2Zapłaciłeś &2$amount_sent $currency_name dla $receiver&2, dostał on $amount_received pieniędzy po opodatkowaniu!' + Economy currency left message: Masz teraz &2$amount_left $currency_name. + Economy money from payment message: Otrzymałeś &2$amount_received $currency_name za sprzedasz $sender + Economy payment insuficient currency: '&cNie masz wystarczająco $currency_name aby to zrobić!' + Wallet command message: Masz obecnie &2$balance $currency_name + Tax confirmation message: '&cWysłanie płatności będzie kosztować $percentage% podatku. &aWpisz &9$command&at, aby potwierdzić!' + shopBatchSellItem: '&aSprzedałeś swoje przedmioty &aza $currency_amount $currency_name!' + Shop buy message: '&aZakupiłeś $item_name &aza $item_value $currency_name!' + Shop current balance message: '&aMasz obecnie $currency_amount $currency_name.' + Shop insufficient funds message: '&cMasz niewystarczająco $currency_name!' + Shop item cost message: Ten przedmiot kosztuje &c$item_value $currency_name. + Shop sell message: '&aSprzedałeś $item_name &aza $currency_amount $currency_name!' + Shop sale player items warning: '&cNie możesz sprzedać przedmiotów które nie są obecnie do ciebie przypisane! Obejmuje to również przedmioty o innych poziomach prestiżu!' + Shop sale instructions: '&cMożesz sprzedawać tutaj jedynie przedmioty zdobyte z EliteMobów! (Zbroje / bronie upuszczone z elitarnych potworów mają swój opis oraz wartość)' + Teleport time left: '&7[EM] Zostaniesz przeteleportowany za &a$time &7sekund...' + Teleport cancelled: '&7[EM] &cTeleportacja przerwana!' + noPendingCommands: '&cNie masz obecnie żadnych oczekujących komend!' + trackMessage: Śledź $name + chestLowRankMessage: '&7[EM] &cTwoja ranga gildii musi być co najmniej na poziomie - $rank - &cin abyś mógł otworzyć tę skrzynię!' + chestCooldownMessage: '&7[EM] &cJuż niedawno otworzyłeś tę skrzynię! Poczekaj $time by móc otworzyć ją ponownie!' + insufficientCurrencyForWormholeMessage: '&8[EliteMobs] &cNiewystarczająca ilość waluty! Potrzebujesz $amount aby skorzystać z tego com.maguy.elitemobs.wormhole!' + dismissEMMessage: '&8[EliteMobs] &2/elitemobs &fmenu u ciebie nie działa? Spróbuj &2/elitemobs alt &faby zobaczyć alternatywną wersję menu! &cNie chcesz ponownie zobaczyć tej wiadomości? &4/em dismiss' + switchEMStyleMessage: '&8[EliteMobs] &2/elitemobs &fmenu styl został zmieniony! Zobacz jak wygląda teraz!' +EconomySettings: + currencyName: Elitarne monety + chatCurrencyShowerMessage: '&7[EM] Podniesiono &a$amount $currency_name!' + actionbarCurrencyShowerMessage: '&7[EM] Podniesiono &a$amount $currency_name!' + adventurersGuildNotificationMessages: '&7[EM] Masz pieniądze do wydania? Wypróbuj &a/em i zobacz co możesz kupić!' +arrow_damage: + name: Moc +arrow_fire: + name: Płomień +arrow_infinite: + name: Nieskończoność +arrow_knockback: + name: Odrzut +binding_curse: + name: Klątwa Uwiązania +channeling: + name: Porażenie +critical_strikes: + name: Trafienie Krytyczne + criticalHitPopup: '&5Cios krytyczny!' +damage_all: + name: Ostrość +damage_arthropods: + name: Zmora Stawonogów +damage_undead: + name: Pogromca nieumarłych +depth_strider: + name: Głębinowy Wędrowiec +dig_speed: + name: Wydajność +drilling: + name: Wiercenie +durability: + name: Niezniszczalność +earthquake: + name: Trzęsienie ziemi + earthquakeActivationMessage: '&8[EliteMobs] &aZaklęcie "Trzęsienie ziemi" zostało rzucone! &c2 min odnowienia!' + earthquakeAvailableMessage: '&8[EliteMobs] &2Czas odnowienia zaklęcia trzęsienia ziemi minął!' +fire_aspect: + name: Zaklęty Ogień +flamethrower: + name: Miotacz ognia +frost_walker: + name: Mroźny Piechur +grappling_hook: + name: Harpun Wspinaczkowy +hunter: + name: Łowca +ice_breaker: + name: Niszczyciel Lodu +impaling: + name: Przebicie +knockback: + name: Odrzut +lightning: + name: Błyskawice +loot_bonus_blocks: + name: Fortuna +loot_bonus_mobs: + name: Grabież +loud_strikes: + name: Głośne Uderzenia +loyalty: + name: Lojalność +lure: + name: Przynęta +mending: + name: Naprawa +meteor_shower: + name: Deszcz Meteorytów +multishot: + name: Wielostrzał +oxygen: + name: Oddychanie +piercing: + name: Przeszycie +plasma_boots: + name: Buty plazmowe +protection_environmental: + name: Ochrona +protection_explosions: + name: Ochrona przed wybuchem +protection_fall: + name: Powolne opadanie +protection_fire: + name: Ochrona przed ogniem +protection_projectile: + name: Ochrona przed pociskami +quick_charge: + name: Szybkie ładowanie +riptide: + name: Torpeda +silk_touch: + name: Jedwabny dotyk +soulbind: + name: Przypisanie do Duszy + loreStrings: '&7Przypisane do duszy gracza &f$player' + hologramString: '$player&f' +summon_merchant: + name: Przyzwanie Handlarza + message: Jeeves! +summon_wolf: + name: Przywołaj Wilka +sweeping_edge: + name: Szerokie Ostrze +thorns: + name: Ciernie +unbind: + name: Rozwiązanie +vanishing_curse: + name: Klątwa znikania +water_worker: + name: Wydajność pod wodą +AntiExploit: + AntiExploit message: '&c[EM AntiExploit] &7Bliski Ciebie Elitarny Mob nie da żadnego łupu.' +CombatTag: + Combat tag message: '&c[EliteMobs] Znacznik bojowy aktywowany!' +AdventurersGuild: + adventurersGuildMenuName: '&6&lSiedziba Poszukiwaczy Przygód' + Prestige 0 rank 0: '&8Pospolity Gracz - wyłącza elitarne potwory!' + Prestige 0 rank 0 short placeholder: '&6&l✧&e0' + Prestige 0 rank 1: '&fPoczątkujący' + Prestige 0 rank 1 short placeholder: '&6&l✧&eⅠ' + Prestige 0 rank 2: '&fNowicjusz' + Prestige 0 rank 2 short placeholder: '&6&l✧&eⅠⅠ' + Prestige 0 rank 3: '&fUczeń' + Prestige 0 rank 3 short placeholder: '&6&l✧&eⅠⅠⅠ' + Prestige 0 rank 4: '&2Poszukiwacz Przygód' + Prestige 0 rank 4 short placeholder: '&6&l✧&eⅠⅤ' + Prestige 0 rank 5: '&2Czeladnik' + Prestige 0 rank 5 short placeholder: '&6&l✧&eⅤ' + Prestige 0 rank 6: '&2Adept' + Prestige 0 rank 6 short placeholder: '&6&l✧&eⅤⅠ' + Prestige 0 rank 7: '&1Weteran' + Prestige 0 rank 7 short placeholder: '&6&l✧&eⅤⅠⅠ' + Prestige 0 rank 8: '&1Elitarny Wojownik' + Prestige 0 rank 8 short placeholder: '&6&l✧&eⅤⅠⅠⅠ' + Prestige 0 rank 9: '&lMistrz' + Prestige 0 rank 9 short placeholder: '&6&l✧&eⅠⅩ' + Prestige 0 rank 10: '&5Bohater' + Prestige 0 rank 10 short placeholder: '&6&l✧&eⅩ' + Prestige 1 rank 0: '&ePrestiż 1 &8Świerzak' + Prestige 1 rank 0 short placeholder: '&e⚜Ⅰ&6&l✧&e0' + Prestige 1 rank 1: '&ePrestiż 1 &fPoczątkujący' + Prestige 1 rank 1 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠ' + Prestige 1 rank 2: '&ePrestiż 1 &fNowicjusz' + Prestige 1 rank 2 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅠ' + Prestige 1 rank 3: '&ePrestige 1 &fUczeń' + Prestige 1 rank 3 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅠⅠ' + Prestige 1 rank 4: '&ePrestiż 1 &2Poszukiwacz Przygód' + Prestige 1 rank 4 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅤ' + Prestige 1 rank 5: '&ePrestiż 1 &2Poszukiwacz Przygód' + Prestige 1 rank 5 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤ' + Prestige 1 rank 6: '&ePrestiż 1 &2Adept' + Prestige 1 rank 6 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠ' + Prestige 1 rank 7: '&ePrestiż 1 &1Weteran' + Prestige 1 rank 7 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠⅠ' + Prestige 1 rank 8: '&ePrestiż 1 &1Elitarny Wojownik' + Prestige 1 rank 8 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠⅠⅠ' + Prestige 1 rank 9: '&ePrestiż 1 &5Mistrz' + Prestige 1 rank 9 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅩ' + Prestige 1 rank 10 short placeholder: '&e⚜Ⅰ&6&l✧&eⅩ' + Prestige 1 rank 10: '&ePrestiż 1 &5Bohater' + Prestige 1 rank 11: '&ePrestiż 1 &5Legenda' + Prestige 1 rank 11 short placeholder: '&e⚜Ⅰ&6&l✧&eⅩⅠ' + Prestige 2 rank 0: '&2Prestiż 2 &8Świerzak' + Prestige 2 rank 0 short placeholder: '&2⚜ⅠⅠ&6&l✧&e0' + Prestige 2 rank 1: '&2Prestige 2 &fŚwierzak' + Prestige 2 rank 1 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠ' + Prestige 2 rank 2: '&2Prestiż 2 &fNowicjusz' + Prestige 2 rank 2 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅠ' + Prestige 2 rank 3: '&2Prestige 2 &fUczeń' + Prestige 2 rank 3 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 2 rank 4: '&2Prestiż 2 &2Poszukiwacz Przygód' + Prestige 2 rank 4 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅤ' + Prestige 2 rank 5: '&2Prestiż 2 &2Czeladnik' + Prestige 2 rank 5 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤ' + Prestige 2 rank 6: '&2Prestiż 2 &2Adept' + Prestige 2 rank 6 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠ' + Prestige 2 rank 7: '&2Prestiż 2 &1Weteran' + Prestige 2 rank 7 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 2 rank 8: '&2Prestiż 2 &1Elitarny Wojownik' + Prestige 2 rank 8 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 2 rank 9: '&2Prestiż 2 &5Mistrz' + Prestige 2 rank 9 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅩ' + Prestige 2 rank 10 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩ' + Prestige 2 rank 10: '&2Prestiż 2 &5Bohater' + Prestige 2 rank 11: '&2Prestiż 2 &5Legenda' + Prestige 2 rank 11 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩⅠ' + Prestige 2 rank 12: '&2Prestiż 2 &5Mityczny' + Prestige 2 rank 12 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 3 rank 0: '&aPrestiż 3 &8Świerzak' + Prestige 3 rank 0 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&e0' + Prestige 3 rank 1: '&aPrestiż 3 &fPoczątkujący' + Prestige 3 rank 1 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠ' + Prestige 3 rank 2: '&aPrestiż 3 &fNowicjusz' + Prestige 3 rank 2 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠ' + Prestige 3 rank 3: '&aPrestige 3 &fUczeń' + Prestige 3 rank 3 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 3 rank 4: '&aPrestiż 3 &2Poszukiwacz Przygód' + Prestige 3 rank 4 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅤ' + Prestige 3 rank 5: '&aPrestiż 3 &2Czeladnik' + Prestige 3 rank 5 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤ' + Prestige 3 rank 6: '&aPrestiż 3 &2Adept' + Prestige 3 rank 6 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠ' + Prestige 3 rank 7: '&aPrestiż 3 &1Weteran' + Prestige 3 rank 7 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 3 rank 8: '&aPrestiż 3 &1Elitarny Wojownik' + Prestige 3 rank 8 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 3 rank 9: '&aPrestiż 3 &5Mistrz' + Prestige 3 rank 9 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅩ' + Prestige 3 rank 10 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩ' + Prestige 3 rank 10: '&aPrestiż 3 &5Bohater' + Prestige 3 rank 11: '&aPrestiż 3 &5Legenda' + Prestige 3 rank 11 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠ' + Prestige 3 rank 12: '&aPrestiż 3 &5Mityczny Wojownik' + Prestige 3 rank 12 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 3 rank 13: '&aPrestiż 3 &5Nieśmiertelny Bohater' + Prestige 3 rank 13 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 4 rank 0: '&3Prestiż 4 &8Świerzak' + Prestige 4 rank 0 short placeholder: '&3⚜ⅠⅤ&6&l✧&e0' + Prestige 4 rank 1: '&3Prestiż 4 &fPoczątkujący' + Prestige 4 rank 1 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠ' + Prestige 4 rank 2: '&3Prestiż 4 &fNowicjusz' + Prestige 4 rank 2 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅠ' + Prestige 4 rank 3: '&3Prestiż 4 &fUczeń' + Prestige 4 rank 3 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅠⅠ' + Prestige 4 rank 4: '&3Prestiż 4 &2Poszukiwacz Przygód' + Prestige 4 rank 4 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅤ' + Prestige 4 rank 5: '&3Prestiż 4 &2Czeladnik' + Prestige 4 rank 5 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤ' + Prestige 4 rank 6: '&3Prestiż 4 &2Adept' + Prestige 4 rank 6 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠ' + Prestige 4 rank 7: '&3Prestiż 4 &1Weteran' + Prestige 4 rank 7 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠⅠ' + Prestige 4 rank 8: '&3Prestiż 4 &1Elitarny Wojownik' + Prestige 4 rank 8 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠⅠⅠ' + Prestige 4 rank 9: '&3Prestiż 4 &5Mistrz' + Prestige 4 rank 9 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅩ' + Prestige 4 rank 10 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩ' + Prestige 4 rank 10: '&3Prestiż 4 &5Bohater' + Prestige 4 rank 11: '&3Prestiż 4 &5Legenda' + Prestige 4 rank 11 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠ' + Prestige 4 rank 12: '&3Prestiż 4 &5Mityczny Wojownik' + Prestige 4 rank 12 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅠ' + Prestige 4 rank 13: '&3Prestiż 4 &5Nieśmiertelny Bohater' + Prestige 4 rank 13 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅠⅠ' + Prestige 4 rank 14: '&3Prestiż 4 &5Wybraniec Bogów' + Prestige 4 rank 14 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅤ' + Prestige 5 rank 0: '&bPrestiż 5 &8Świerzak' + Prestige 5 rank 0 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 5 rank 1: '&bPrestiż 5 &fPoczątkujący' + Prestige 5 rank 1 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠ' + Prestige 5 rank 2: '&bPrestiż 5 &fNowicjusz' + Prestige 5 rank 2 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅠ' + Prestige 5 rank 3: '&bPrestiż 5 &fUczeń' + Prestige 5 rank 3 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅠⅠ' + Prestige 5 rank 4: '&bPrestiż 5 &2Poszukiwacz Przygód' + Prestige 5 rank 4 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅤ' + Prestige 5 rank 5: '&bPrestiż 5 &2Czeladnik' + Prestige 5 rank 5 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤ' + Prestige 5 rank 6: '&bPrestiż 5 &2Adept' + Prestige 5 rank 6 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠ' + Prestige 5 rank 7: '&bPrestiż 5 &1Weteran' + Prestige 5 rank 7 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠⅠ' + Prestige 5 rank 8: '&bPrestiż 5 &1Elitarny Wojownik' + Prestige 5 rank 8 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠⅠⅠ' + Prestige 5 rank 9: '&bPrestiż 5 &5Mistrz' + Prestige 5 rank 9 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅩ' + Prestige 5 rank 10 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩ' + Prestige 5 rank 10: '&bPrestiż 5 &5Bohater' + Prestige 5 rank 11: '&bPrestiż 5 &5Legenda' + Prestige 5 rank 11 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠ' + Prestige 5 rank 12: '&bPrestiż 5 &5Mityczny Wojownik' + Prestige 5 rank 12 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅠ' + Prestige 5 rank 13: '&bPrestiż 5 &5Nieśmiertelny Bohater' + Prestige 5 rank 13 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅠⅠ' + Prestige 5 rank 14: '&bPrestiż 5 &5Wybraniec Bogów' + Prestige 5 rank 14 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅤ' + Prestige 5 rank 15: '&bPrestige 5 &5Heros' + Prestige 5 rank 15 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅤ' + Prestige 6 rank 0: '&4Prestiż 6 &8Świerzak' + Prestige 6 rank 0 short placeholder: '&4⚜ⅤⅠ&6&l✧&e0' + Prestige 6 rank 1: '&4Prestiż 6 &fPoczątkujący' + Prestige 6 rank 1 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠ' + Prestige 6 rank 2: '&4Prestiż 6 &fNowicjusz' + Prestige 6 rank 2 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅠ' + Prestige 6 rank 3: '&4Prestige 6 &fUczeń' + Prestige 6 rank 3 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅠⅠ' + Prestige 6 rank 4: '&4Prestiż 6 &2Poszukiwacz Przygód' + Prestige 6 rank 4 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅤ' + Prestige 6 rank 5: '&4Prestiż 6 &2Czeladnik' + Prestige 6 rank 5 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤ' + Prestige 6 rank 6: '&4Prestiż 6 &2Adept' + Prestige 6 rank 6 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠ' + Prestige 6 rank 7: '&4Prestiż 6 &1Weteran' + Prestige 6 rank 7 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅠⅠ' + Prestige 6 rank 8: '&4Prestiż 6 &1Elitarny Wojownik' + Prestige 6 rank 8 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 6 rank 9: '&4Prestiż 6 &5Mistrz' + Prestige 6 rank 9 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅩ' + Prestige 6 rank 10 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩ' + Prestige 6 rank 10: '&4Prestiż 6 &5Bohater' + Prestige 6 rank 11: '&4Prestiż 6 &5Legenda' + Prestige 6 rank 11 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠ' + Prestige 6 rank 12: '&4Prestiż 6 &5Mityczny Wojownik' + Prestige 6 rank 12 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠ' + Prestige 6 rank 13: '&4Prestiż 6 &5Nieśmiertelny Bohater' + Prestige 6 rank 13 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 6 rank 14: '&4Prestiż 6 &5Wybraniec Bogów' + Prestige 6 rank 14 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅤ' + Prestige 6 rank 15: '&4Prestige 6 &5Heros' + Prestige 6 rank 15 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤ' + Prestige 6 rank 16: '&4Prestiż 6 &5Tytan' + Prestige 6 rank 16 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤⅠ' + Prestige 7 rank 0: '&cPrestiż 7 &8Świerzak' + Prestige 7 rank 0 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&e0' + Prestige 7 rank 1: '&cPrestiż 7 &fPoczątkujący' + Prestige 7 rank 1 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠ' + Prestige 7 rank 2: '&cPrestiż 7 &fNowicjusz' + Prestige 7 rank 2 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅠ' + Prestige 7 rank 3: '&cPrestiż 7 &fUczeń' + Prestige 7 rank 3 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 7 rank 4: '&cPrestiż 7 &2Poszukiwacz Przygód' + Prestige 7 rank 4 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅤ' + Prestige 7 rank 5: '&cPrestiż 7 &2Czeladnik' + Prestige 7 rank 5 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤ' + Prestige 7 rank 6: '&cPrestiż 7 &2Adept' + Prestige 7 rank 6 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠ' + Prestige 7 rank 7: '&cPrestiż 7 &1Weteran' + Prestige 7 rank 7 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 7 rank 8: '&cPrestiż 7 &1Elitarny Wojownik' + Prestige 7 rank 8 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 7 rank 9: '&cPrestiż 7 &5Mistrz' + Prestige 7 rank 9 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅩ' + Prestige 7 rank 10 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩ' + Prestige 7 rank 10: '&cPrestiż 7 &5Bohater' + Prestige 7 rank 11: '&cPrestiż 7 &5Legenda' + Prestige 7 rank 11 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠ' + Prestige 7 rank 12: '&cPrestiż 7 &5Mityczny Wojownik' + Prestige 7 rank 12 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 7 rank 13: '&cPrestiż 7 &5Nieśmiertelny Bohater' + Prestige 7 rank 13 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 7 rank 14: '&cPrestiż 7 &5Wybraniec Bogów' + Prestige 7 rank 14 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅤ' + Prestige 7 rank 15: '&cPrestige 7 &5Heros' + Prestige 7 rank 15 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤ' + Prestige 7 rank 16: '&cPrestiż 7 &5Tytan' + Prestige 7 rank 16 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤⅠ' + Prestige 7 rank 17: '&cPrestiż 7 &5PółBóg' + Prestige 7 rank 17 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤⅠⅠ' + Prestige 8 rank 0: '&9Prestiż 8 &8Świerzak' + Prestige 8 rank 0 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&e0' + Prestige 8 rank 1: '&9Prestiż 8 &fPoczątkujący' + Prestige 8 rank 1 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠ' + Prestige 8 rank 2: '&9Prestiż 8 &fNowicjusz' + Prestige 8 rank 2 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅠ' + Prestige 8 rank 3: '&9Prestige 8 &fUczeń' + Prestige 8 rank 3 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 8 rank 4: '&9Prestiż 8 &2Poszukiwacz Przygód' + Prestige 8 rank 4 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅤ' + Prestige 8 rank 5: '&9Prestiż 8 &2Czeladnik' + Prestige 8 rank 5 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤ' + Prestige 8 rank 6: '&9Prestiż 8 &2Adept' + Prestige 8 rank 6 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠ' + Prestige 8 rank 7: '&9Prestiż 8 &1Weteran' + Prestige 8 rank 7 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 8 rank 8: '&ePrestiż 8 &1Elitarny Wojownik' + Prestige 8 rank 8 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 8 rank 9: '&ePrestiż 8 &5Mistrz' + Prestige 8 rank 9 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅩ' + Prestige 8 rank 10 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩ' + Prestige 8 rank 10: '&9Prestiż 8 &5Bohater' + Prestige 8 rank 11: '&9Prestiż 8 &5Legenda' + Prestige 8 rank 11 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠ' + Prestige 8 rank 12: '&9Prestiż 8 &5Mityczny Wojownik' + Prestige 8 rank 12 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 8 rank 13: '&3Prestiż 8 &5Nieśmiertelny Bohater' + Prestige 8 rank 13 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 8 rank 14: '&9Prestiż 8 &5Wybraniec Bogów' + Prestige 8 rank 14 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅤ' + Prestige 8 rank 15: '&9Prestiż 8 &5Heros' + Prestige 8 rank 15 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤ' + Prestige 8 rank 16: '&9Prestiż 8 &5Tytan' + Prestige 8 rank 16 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠ' + Prestige 8 rank 17: '&9Prestiż 8 &5PółBóg' + Prestige 8 rank 17 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠⅠ' + Prestige 8 rank 18: '&9Prestiż 8 &5Bóstwo' + Prestige 8 rank 18 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 9 rank 0: '&dPrestiż 9 &8Świerzak' + Prestige 9 rank 0 short placeholder: '&d⚜ⅠⅩ&6&l✧&e0' + Prestige 9 rank 1: '&dPrestiż 9 &fPoczątkujący' + Prestige 9 rank 1 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠ' + Prestige 9 rank 2: '&dPrestiż 9 &fNowicjusz' + Prestige 9 rank 2 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅠ' + Prestige 9 rank 3: '&dPrestiż 9 &fUczeń' + Prestige 9 rank 3 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅠⅠ' + Prestige 9 rank 4: '&dPrestiż 9 &2Poszukiwacz Przygód' + Prestige 9 rank 4 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅤ' + Prestige 9 rank 5: '&dPrestiż 9 &2Czeladnik' + Prestige 9 rank 5 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤ' + Prestige 9 rank 6: '&dPrestiż 9 &2Adept' + Prestige 9 rank 6 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠ' + Prestige 9 rank 7: '&dPrestiż 9 &1Weteran' + Prestige 9 rank 7 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠⅠ' + Prestige 9 rank 8: '&dPrestiż 9 &1Elitarny Wojownik' + Prestige 9 rank 8 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠⅠⅠ' + Prestige 9 rank 9: '&dPrestiż 9 &5Mistrz' + Prestige 9 rank 9 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅩ' + Prestige 9 rank 10 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩ' + Prestige 9 rank 10: '&dPrestiż 9 &5Bohater' + Prestige 9 rank 11: '&dPrestiż 9 &5Legenda' + Prestige 9 rank 11 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠ' + Prestige 9 rank 12: '&dPrestiż 9 &5Mityczny Wojownik' + Prestige 9 rank 12 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅠ' + Prestige 9 rank 13: '&dPrestiż 9 &5Nieśmiertelny Bohater' + Prestige 9 rank 13 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅠⅠ' + Prestige 9 rank 14: '&dPrestiż 9 &5Wybraniec Bogów' + Prestige 9 rank 14 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅤ' + Prestige 9 rank 15: '&dPrestige 9 &5Heros' + Prestige 9 rank 15 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤ' + Prestige 9 rank 16: '&dPrestiż 9 &5Tytan' + Prestige 9 rank 16 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠ' + Prestige 9 rank 17: '&dPrestiż 9 &5PółBóg' + Prestige 9 rank 17 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠⅠ' + Prestige 9 rank 18: '&dPrestiż 9 &5Bóstwo' + Prestige 9 rank 18 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 9 rank 19: '&dPrestiż 9 &5ŁowcaBogów' + Prestige 9 rank 19 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅩ' + Prestige 10 rank 0: '&5Prestiż 10 &8Świerzak' + Prestige 10 rank 0 short placeholder: '&5⚜Ⅹ&6&l✧&e0' + Prestige 10 rank 1: '&5Prestiż 10 &fPoczątkujący' + Prestige 10 rank 1 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠ' + Prestige 10 rank 2: '&5Prestiż 10 &fNowicjusz' + Prestige 10 rank 2 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠ' + Prestige 10 rank 3: '&5Prestiż 10 &fUczeń' + Prestige 10 rank 3 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠⅠ' + Prestige 10 rank 4: '&5Prestiż 10 &2Poszukiwacz Przygód' + Prestige 10 rank 4 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅤ' + Prestige 10 rank 5: '&5Prestiż 10 &2Czeladnik' + Prestige 10 rank 5 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤ' + Prestige 10 rank 6: '&5Prestiż 10 &2Adept' + Prestige 10 rank 6 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠ' + Prestige 10 rank 7: '&5Prestiż 10 &1Weteran' + Prestige 10 rank 7 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠ' + Prestige 10 rank 8: '&5Prestiż 10 &1Elitarny Wojownik' + Prestige 10 rank 8 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠⅠ' + Prestige 10 rank 9: '&5Prestiż 10 &5Mistrz' + Prestige 10 rank 9 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅩ' + Prestige 10 rank 10 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩ' + Prestige 10 rank 10: '&5Prestiż 10 &5Bohater' + Prestige 10 rank 11: '&5Prestiż 10 &5Legenda' + Prestige 10 rank 11 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠ' + Prestige 10 rank 12: '&5Prestiż 10 &5Mityczny Wojownik' + Prestige 10 rank 12 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅠ' + Prestige 10 rank 13: '&5Prestiż 10 &5Nieśmiertelny Bohater' + Prestige 10 rank 13 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅠⅠ' + Prestige 10 rank 14: '&5Prestiż 10 &5Wybraniec Bogów' + Prestige 10 rank 14 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅤ' + Prestige 10 rank 15: '&5Prestige 10 &5Heros' + Prestige 10 rank 15 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤ' + Prestige 10 rank 16: '&5Prestiż 10 &5Tytan' + Prestige 10 rank 16 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠ' + Prestige 10 rank 17: '&5Prestiż 10 &5PółBóg' + Prestige 10 rank 17 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠⅠ' + Prestige 10 rank 18: '&5Prestiż 10 &5Bóstwo' + Prestige 10 rank 18 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 10 rank 19: '&5Prestiż 10 &5ŁowcaBogów' + Prestige 10 rank 19 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅩ' + Prestige 10 rank 20: '&5Prestiż 10 &5PogromcaBogów' + Prestige 10 rank 20 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅩ' + lootLimiterMessage: '&7[EM] &cMusisz odblokować następną rangę gildii, aby zdobywać lepsze itemy! Wpisz /ag, aby to zrobić!' + prestigeUnlockMessageTitle: '$player' + prestigeUnlockMessageSubtitle: '&2odblokował $tier&2!' +buy_or_sell_menu: + Shop name: '[EM] Kup lub Sprzedaj' +custom_quest_screen: + headerTextLines2: | + &a&l『&c&l$questName&a&l』 + acceptTextLines: '&a&l[Akceptuj!]' + acceptHoverLines: "&aKliknij, aby \n&azaakceptować zadanie!" + acceptedTextLines: '&2&lZaakceptowano! &aUkończ i odbierz nagrody u $npcName &4[Abandon]' + acceptedHoverLines: '&aKliknij, aby &azrezygnować z zadania!' + trackTextLines: '&2&l[Śledź Zadanie]' + trackHoverLines: '&aKliknij, aby śledzić zadanie!' + untrackTextLines: '&4&l[Wyłącz Śledzenie]' + untrackHoverLines: '&aKliknij, aby przestać śledzić zadanie!' + completedTextLines: '&2&l[Zakończ zadanie!]' + completedHoverLines: '&aKliknij, aby zakończyć zadanie i zebrać nagrody!' + turnedInTextLines: '&8[Ukończono!]' + turnedInHoverLines: '&8Zadanie jest już ukończone!' + objectivesLine: '&c&lLista Celów:' + killQuestDefaultSummaryLine: '&c➤Zabij $name:$color$current&0/$color$target' + fetchQuestDefaultSummaryLine: '&c➤Zdobądź $name:$color&$current&0/$color$target' + dialogQuestDefaultSummaryLine: '&c➤Porozmawiaj z $name $location' + rewardsLine: '&2&lNagrody:' + rewardsDefaultSummaryLine: '&2➤$amountx $rewardName &8($chance%)' +custom_shop_menu: + Shop name: '[EM] Sklep' + Full inventory message: '[EliteMobs] &4Twój ekwipunek jest pełny! Nie możesz kupować przedmiotów, dopóki nie zrobisz wolnego miejsca.' +dynamic_quest_screen: + questName: Zabij $amount $name + headerTextLines2: |- + &c&lZadanie od Gildii! + &0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ + defaultLoreTextLines: '&8Zabij $amount $name!' + acceptTextLines: '&a&lZaakceptuj!' + acceptHoverLines: "&aKliknij, aby \n&azaakceptować zadanie!" + acceptedTextLines: '&2&lZaakceptowano! &4[Zrezygnuj]' + acceptedHoverLines: '&aKliknij, aby zrezygnować z zadania!' + completedTextLines: '&2&l[Zakończ zadanie!]' + completedHoverLines: '&aKliknij, aby zakończyć zadanie i zebrać nagrody!' + turnedInTextLines: '&8[Ukończono!]' + turnedInHoverLines: '&8Zadanie jest już ukończone!' + objectivesLine: '&c&lLista Celów:' + killQuestDefaultSummaryLine: '&c➤Zabij $name:$color$current&0/$color$target' + rewardsLine: '&2&lNagrody:' + rewardsDefaultSummaryLine: '&2➤$amountx $rewardName &8($chance%)' +enhancement_menu: + shopName: '[EM] Menu Ulepszeń!' +get_loot_menu: + Menu name: '[EM] Menu zbierania nagród' + tierTranslation: Poziom + itemFilterTranslation: Filtruj według przedmiotów o tym poziomie. +guild_rank_selector_menu: + questTierSelectorMenuTitle: '[EM] Wybór Rangi Gildii' + lowTierWarning: '&cElitarne Potwory nie mogą upuszczać lepszych łupów!' + normalTierWarning: '&aElitarne Potwory mogą upuszczać lepszy łup!' + notEnoughCurrencyMessages: '&7[EliteMobs] &4Nie masz wystarczającej ilości Elitarnych Monet ($neededAmount $currencyName)! Sprzedaj jakiś łup z Elitarnych mobów w sklepie [/em shop]! Masz $currentAmount $currencyName.' + unlockMessages: "&7[EliteMobs] &aOdblokowano rangę $rankName &aza $price\\ \\ $currencyName. \n&6Sczęśliwego polowania!" + questCompleteBroadcastMessages: '&7[EliteMobs] &a$player &aosiągnął/ęła rangę gildii &a$rankName!' + failedMessages: '&7[EliteMobs] &cNajpierw musisz odblokować inne rangi!' + spawnRateModifierMessages: '&fModyfikator pojawiania się elitarnych mobów: &c$modifier%' + lootModifierMessages: '&fModyfikator łupów elitarnych mobów: &a$modifier%' + difficultyModifierMessages: '&fModyfikator trudności elitarnych mobów: &c$modifier%' + lootTierMessages: '&2Elitarne moby mogą dropnąć łupy poziomu $tier!' + currencyBonusMessages: '&a$amountx monet z mobów i questów!' + healthBonusMessages: '&cDodaje $amount ❤ maksymalnego zdrowia' + critBonusMessages: '&eDodaje $amount% szansy na cios krytyczny' + dodgeBonusMessages: '&8Dodaje $amount% szansy na unik' +player_status_screen: + indexTexts0: '&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + indexTexts1: '&5&l/ag &7- &6Lobby EliteMobs' + indexHovers1: |- + KLIKNIJ, ABY UŻYĆ + Miejsce, w którym znajdziesz NPC + dający zadania, kupujący i sprzedający + przedmioty, dający porady i więcej! + indexTexts2: '&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + indexTexts4: '&6&lIndeks' + indexTexts6: '&bp. $statsPage &8- &6Statystyki' + indexHovers6: Kliknij, aby przejść! + indexTexts7: '&bp. $gearPage &8- &6Sprzęt' + indexHovers7: Kliknij, aby przejść! + indexTexts8: '&bp. $teleportsPage &8- &6Teleportacje' + indexHovers8: Kliknij, aby przejść! + indexTexts9: '&bp. $commandsPage &8- &6Komendy' + indexHovers9: Kliknij, aby przejść! + indexTexts10: '&bp. $questsPage &8- &6Śledzenie Zadań' + indexHovers10: Kliknij, aby przejść! + indexTexts11: '&bp. $bossTrackingPage &8- &6Śledzenie Bossa' + indexHovers11: Kliknij, aby przejść! + statsText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + statsText1: '&5Statystyki gracza:' + statsText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + statsText4: '&2Pieniądze: &a$money' + statsHover4: |- + Zabij Elitarne Moby aby zdobywać walutę + albo sprzedaj swoje łupy w /em shop lub + wykonywuj zadania w /em quest! + statsText6: '&6Tier gildii: &3$guildtier' + statsHover6: |- + Poziom Prestiżu i Ranga Gildii: + Ranga Gildii określa, jak dobry może być twój łup z Prestiżu, między innymi ustawia bonus z poziomu Prestiżu. Poziom Prestiżu odblokowuje niezwykle potężne nagrody, takie jak zwiększenie maksymalnego stanu zdrowia, szansa na unik/cios krytyczny, zwiększona ilość elitarnych monet za zabójstwa i więcej! Możesz odblokować Rangi Gildii i Poziomy Prestiżu na /ag! + ⚜ = ranga prestiżu, ✧ = ranga gildii! + statsText7: '&4Elitarne Zabójstwa: &c$kills' + statsHover7: Ilość zabitych Elitarnych Mobów. + statsText8: '&4Max Lvl Zabitego Potwora: &c$highestkill' + statsHover8: |- + Poziom najwyższego zabitego Elitarnego moba. + Elitarne poziomy mobów są oparte na poziomie + twojego wyposażenia! Wyższe poziomy, wyższe + Elitarne moby! + Uwaga: liczone są tylko zabójstwa bez exploitów! + statsText9: '&4Ilość śmierci: &c$deaths' + statsHover9: Ilość razy jakie zostałeś zabity przez Elitarnego Moba. + statsText10: '&5Ukończone Zadania: &d$quests' + statsHover10: |- + Ilość ukończonych zadań EliteMobs + Możesz wykonywać zadania rozmawiając z NPC! + statsText12: '&bWynik: &3$score' + statsHover12: |- + Twój wynik z EliteMobs. Zwiększa się + kiedy zabijasz elitarnego moba, + i spada kiedy zginiesz + w walce z nim. Potwory o wyższym poziomie + dają większy wynik. + gearText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + gearText1: '&7&lPancerz i Broń:' + gearText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + gearText3: '&8&lTier Wyposażenia:' + gearText4: ' ☠ - $helmettier' + gearHover4: '$helmet' + gearText5: ' ▼ - $chestplatetier' + gearHover5: '$chestplate' + gearText6: ' Π - $leggingstier' + gearHover6: '$leggings' + gearText7: ' ╯╰ - $bootstier' + gearHover7: '$boots' + gearText8: '{⚔ - $mainhandtier} {⛨ - $offhandtier}' + gearHover8: '{$mainhand}{$offhand}' + gearText10: '{obrażenia : $damage} {pancerz: $armor}' + gearHover10: '{Bazowe obrażenia zadawane Elitarnym Potworom}{Redukcja obrażeń otrzymywanych od Elitarnych Potworów}' + gearText11: 'Poziom zagrożenia: $threat' + gearHover11: | + Określa poziom Elitarnych + mobów, które pojawiają się w pobliżu. + Pancerz, broń ręczna i twój tier w gildii + określają poziom zagrożenia. + teleportText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + teleportText1: '&2&lTeleporty' + teleportText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + teleportText3: Spawn + teleportHover3: Teleportuj do spawnu! + teleportText4: '&6&lSiedziba Gildii Wojowników' + teleportHover4: Teleportuj się do Centrum Gildii Wojowników! + onTeleportsHover: Kliknij, aby teleportować! + commandsText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + commandsText1: '&3&lKomendy:' + commandsText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + commandsText4: '&5/ag' + commandsHover4: |- + KLIKNIJ, ABY UŻYĆ + Miejsce, w którym znajdziesz NPC + dające zadania, kupujące i sprzedające + przedmioty, dające porady i więcej! + commandsText6: '&5/shareitem' + commandsHover6: |- + KLIKNIJ, ABY UŻYĆ + Udostępnia przedmiot, który + trzymasz na czacie! + questTrackerText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + questTrackerText1: '&6&lZadania:' + questTrackerHover1: Porozmawiaj z NPC, aby zaakceptować zadania! + questTrackerText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + onQuestTrackHover: Kliknij, aby zrezygnować! + bossTrackerText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + bossTrackerText1: '&4&lŚledzenie Bossa:' + bossTrackerHover1: Duże Bossy są tutaj wyświetlane! + bossTrackerText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + onBossTrackHover: Kliknij, aby śledzić/przestać śledzić! + teleportChestMenuName: '&2Teleporty EliteMobs' + bossTrackerChestMenuName: '&2Śledzenie Bossa EliteMobs' + indexChestMenuName: '&2Indeks EliteMobs' + gearChestMenuName: '&2Wyposażenie EliteMobs' + statsChestMenuName: '&2Statystyki EliteMobs' + commandsChestMenuName: '&2Komendy EliteMobs' +procedural_shop_menu: + Shop name: '[EM] Proceduralny sklep przedmiotów' + Full inventory message: '&[EliteMobs] &4Twój ekwipunek jest pełny! Nie możesz kupować przedmiotów, dopóki nie zrobisz wolnego miejsca.' +quest_menu: + menuName: '[EM] Wybór Zadań' + cancelQuestMessage1: '&c&l&m&o-----------------------------&cMożesz mieć tylko jedno zadanie na raz! Anulowanie bieżącego zadania zresetuje aktualny postęp tego zadania!' + cancelQuestMessage2: '&2[Kliknij tutaj, aby anulować aktualne zadanie!]' + cancelQuestMessage3: '&7Możesz zobaczyć status zadania komendą &a/em quest status&c&l&m&o---------------------------------------------' + questCancelMessage: '&7[EliteMobs] &cTwoje aktualne zadanie zostało anulowane!' + questStartTitle: Przyjęto zadanie! + questStartSubtitle: Zabij $objectiveAmount $objectiveName + questCompleteTitle: Zadanie zakończone! + questCompleteSubtitle: Zabito $objectiveAmount $objectiveName + bossBarObjective: Zabij $objectiveAmount $objectiveName + questRewardMessage: '&7[EM] &aZadanie zakończone! &6Twoja nagroda to &2$reward $currencyName' + questCompleteBroadcastMessage: '&7[EM] $player &2zakończył zadanie $rank &2!' + questStartBroadcastMessage: '&7[EM] $player &2zaakceptował/a zadanie $rank &2!' + questStatusMessage: '&7[EM] &aZabiłeś/aś &a$currentAmount &f/ &c$objectiveAmount &a$objectiveName' +refiner_menu: + shopName: '[EM] Umieść 10 kawałków złomu!' +repair_menu: + shopName: '[EM] Menu naprawy!' +scrapper_menu: + shopName: '[EM] Złomiarz' +sell_menu: + shopName: '[EM] Sklep Sprzedaży' +smelt_menu: + shopName: '[EM] Umieść 25 kawałków złomu!' +unbind_menu: + shopName: '[EM] Menu rozłączania itemów od duszy!' +taunt: + onDamaged: + - Ow! + - Oi! + - Przestań! + - Dlaczego?! + - Walczysz jak Rolnik! + - Jesteś wrzodem na tyłku! + - Przyjąć postawę szermierczą! Trafienie! + - Cheatujesz! + - Moje zdrowie jest zbugowane, jestem nieśmiertelny! + - Twoje trafienia sprawiają, że jestem silniejszy! + - Patyki i kamienie... + - 'To tylko rana cielesna!' + - Cesarz nas chroni! + - Herobrine, pomóż mi! + - Za Tobą! Creeper! + - Popełniłem straszliwy błąd. + - Co mnie nie zabije... + - Zombie nie mają blizn + - Pokażę ci moją prawdziwą moc! + - Przygotuj się do mojego ostatecznego ataku! + - Moje posiłki nadchodzą! + - Zapłacisz mi za to! + - To zostawi ślad! + - Oko za oko! + - Ubezpieczenie zdrowotne pokryje następujące koszty + - Poczułem to w kościach + - 'To tylko draśnięcie' + - Co to było? Łagodna bryza? + - Nigdy mnie nie pokonasz w ten sposób + - Żałosne. + - Słabo. + - To nawet nie zarysowało mojej zbroi! + - To będzie takie łatwe + - Moje wnuki poczują to + - Czy ty chociaż próbujesz? + - Administrator właśnie w pełni mnie wyleczył + - Haxxor! + - Ja? Ranny? Cheaty! + - Nie mogę zostać pokonany! + - Dobrze, że używam cheatów! + - Uważaj! Herobrine za Tobą! + - Moje życie dla Aiura! + - Twój dom zostaje zgriefowany! + - Dlaczego nie możemy być przyjaciółmi? + - Valhalla! + - Notch oszczędź mnie! + - Nie wycofuj się! + - Uderz mnie swoim najlepszym strzałem! + onDamagedByBow: + - Walcz ze mną jak Gracz! + - Boisz się podejść? + - Czuję Twój strach stąd! + - Zapomniałeś/aś swojego miecza? + - Tchórz! Łuk nie jest uczciwy! + - Łuki? To było modne w 2011... + - Łuki są dla słabych umysłów! + - Łuki są dla słabych dusz! + - Łuki są dla słabych serc! + - Myślałem, że nie uzgodniliśmy żadnych łuków! + - Łuki? Pożałujesz tego + - Ow! + - Oi! + - Przestań! + - Dlaczego?! + - Walczysz jak Rolnik! + - Jesteś bólem na tyle! + - Na straży! Dotknij! + - Haki! + - Moje zdrowie jest błędne, nieśmiertelne! + - Twoje trafienia sprawiają, że jestem silniejszy! + - Patyki i kamienie... + - 'To tylko rana cielesna!' + - Cesarz chroni! + - Herobrine, pomóż mi! + - Za Tobą! Creeper! + - Popełniłem straszliwy błąd. + - Co mnie nie zabije... + - Zombie nie mają blizn + - Pokażę ci moją prawdziwą moc! + - Przygotuj się do mojego ostatecznego ataku! + - Moje posiłki nadchodzą! + - Zapłacisz mi za to! + - To zostawi ślad! + - Oko za oko! + - Ubezpieczenie zdrowotne pokryje następujące koszty + - Poczułem to w kościach + - 'To tylko draśnięcie' + - Co to było? Łagodna bryza? + - Nigdy mnie nie pokonasz w ten sposób + - Żałosny. + - Słaby. + - To nawet nie zarysowało mojej zbroi! + - To będzie takie łatwe + - Moje wnuki poczują to + - Czy ty chociaż próbujesz? + - Administrator właśnie w pełni mnie wyleczył + - Haxxor! + - Ja? Ranny? Haki! + - Nie mogę zostać pokonany! + - Dobrze, że używam haków! + - Uważaj! Herobrine za Tobą! + - Moje życie dla Aiura! + - Twój dom zostaje zgriefowany! + - Dlaczego nie możemy być przyjaciółmi? + - Valhalla! + - Notch oszczędź mnie! + - Nie wycofuj się! + - Uderz mnie swoim najlepszym strzałem! + onDamage: + - Solidne trafienie! + - Strzela i trafia! + - Poczuj to rankiem! + - Moje zwycięstwo się zbliża! + - Zwycięstwo należy do mnie! + - To była tylko połowa mojej mocy! + - Trafiłeś do złej dzielnicy! + - Zadarłeś/aś z niewłaściwym mobem! + - Przygotuj się na mobbing! + - To był Twój ostatni błąd! + - Poczuj poparzenie! + - John Cena + - Jakim cudem jeszcze żyjesz? + - Umrzyj wreszcie! + - Poddaj się! + - Don't try it! I have the high ground! + - Skończę z Tobą! + - Mamy nadzieję, że jesteś przygotowany na ból! + - Łowca staje się ofiarą! + - Krew za Tron Krwi! + - Czaszki na tron czaszek! + - Dobry gracz to martwy gracz! + - Git gud! + - Chwała słońcu! + - Koniec jest bliski! + - Nie jesteś gotowy na starcie ze mną. + - Zug zug! + - Niewarte mojego czasu! + - Myślałem, że to jest wyzwanie? + - 'Wskazówka: nie zostań trafiony' + - Ima firin mah lazer bwooooooooo + - Za Cesarza! + - Herobrine będzie zadowolony! + - To jest koniec dla Ciebie! + - Czy ty chociaż próbujesz? + - Osłabienie! + - Żałosne. + - Może to Cię obudzi. + - A to dopiero początek! + - Dopiero zaczynam! + - To była tylko rozgrzewka! + - Jesteś na za niskim poziomie dla mnie! + - RKO z dala od nigdzie! + - Mogę tak robić przez całą noc! + - Stanowisz doskonały worek treningowy! + - Jestem nocą! + - Zastanawiam się, co najpierw w tobie się złamie + - Zemsta dla Steve! Potworze! + - Dołącz do strony mobów! + - Zbyt łatwe, zbyt proste! + - Za łatwe! + - Nie możesz mnie pokonać! + - Pikachuuuuuu + - Avada kedavra! + - Crucio! + - Jierda! + - Cios krytyczny! + - Tak wyglądają umiejętności! + - 9001 obrażeń! + - Nadal żyjesz? + - Zaakceptuj swoją porażkę! + - Smak bólu! + - Narażę Cię na niebezpieczeństwo! + onDeath: + - Niestety, biedny Yorick! + - Reszta to milczenie + - Niedługo wrócę + - Niewybaczalne + - Żyję, umieram, żyję ponownie! + - OŚWIADCZ SIĘ + - Jadę do valhalli! + - VALHALLA! + - VALHALLA! PRZESYŁKA + - Wygrywasz, tym razem + - Zaraza na Twojej ziemii! + - Ospa na nich! + - Wkrótce dołączysz do mnie! + - To nie koniec + - Śmierć to tylko porażka + - Nie podoba mi się to... + - Chciałem tylko polecieć w kosmos + - Mogliśmy być przyjaciółmi + - Twoje grzechy się za Tobą ciągną + - Widzimy się niedługo + - Do zobaczenia później + - Będę na Ciebie czekał + - Zostanę pomszczony! + - Nie będę cicho chodzić w nocy + - Powinienem był wykupić ubezpieczenie na życie + - To mój ostatni dzień w pracy + - To był mój ostatni dzień tutaj + - Et tu, Brute? + - RIP + - x.x + - (x.x) + - xox + - Zaraz zemdleję + - GG WP + - GG + - WP + - GG bez RE + - HAX + - Cheater + - Nie fair, miałem lagi! + - Wygrywasz, tym razem + - Ty potworze... + - Średni... + onTarget: + - OJ! Wejdź tutaj! + - Co to widzę? Tchórz? + - Panie, Przygotuj swoje pięści! + - Rozwiążmy to jak jaskiniowcy! + - Na straż! + - Spójrz! Creeper za Tobą! + - Czy nie jesteś brzydkim kubkiem! + - Wyglądasz pysznie. + - Przygotuj się na problemy! + - Niech wygra lepszy spammer kliknięć! + - SPARTAAAAAA + - Jestem na poziomie 9001 + - Nie jestem Elitarnym mobem + - Źle zamaskowany Elitarny Mob + - Ach, świeża ofiara! + - Łowca staje się ofiarą! + - Zabicie mnie zawiesza serwer + - Jestem tak naprawdę przebranym graczem! + - Nie zamierzam wyrzucać żadnego łupu! + - Dlaczego nie możemy być przyjaciółmi? + - Sssss + - To mój ostatni dzień w pracy! + - Zatrzymaj się złoczyńco! + - Przygotuj się na śmierć! + - Chwała słońcu! + - Git gud + - Alea jacta est! + - Czyny, nie słowa! + - Czaszki na tron czaszek! + - Krew za Tron Krwi! + - Poświęcenie dla Herobrine! + - Przebiję niebiosa! + - Jak myślisz, kim jestem!? + - Słabeusz! On jest mój. + - Forsa słabeuszy! + - Gracz Accio! + - Pojedynek na śmierć! + - Wyzywam cię do pojedynku! + - Pika pika! + - Czy właśnie nazwałeś/aś mnie piekłem + - Jak mnie właśnie nazwałeś/aś? + - Wiem, co zrobiłeś potworze! + - Tak właśnie kończy się twoja opowieść! + - Przygotuj się na problemy! + - Przygotowuję się do tego! + - Jestem gotowy. A ty? + - Wartościowy przeciwnik! + - Godny przeciwnik! + - Nowy gracz! To mój szczęśliwy dzień! + - Twój diament lub Twoje życie! + - To jest rabunek! + - To ty! Potworze! + - Ja być głodny, daj mi trochę twojego ciała! + - Tam jest! + - To musiała być moja wyobraźnia + - Siema Jestem Mr Meeseeks! + - Siema Jestem Mr Meeseeks, spójrz na mnie! + - Twoje diamenty lub Twoje życie! + - Dla króla i kraju! + - Uderz mnie swoim najlepszym strzałem! + - Patrz na to! + - Widzisz mnie ty worku krwi! + - Idę cały błyszczący i chromowany! +zombie_friends: + friend1Name: 'BFF #1' + friend2Name: 'BFF #2' + friendDeathMessage: + - Nieee! + - Średni! + - Zachariaty! + - On jest bardziej martwy niż wcześniej! + - Zemsta! + - Rewanż! + - Nie mogę uwierzyć, że to zrobiłeś/aś. + originalEntityDialog: + - Zagrajmy w ZombieCraft później! + - Poczuj potęgę przyjaźni! + - El pueblo, unido! + - Zadzwoniłem do moich znajomych! + - Siła BFFF! + - Jeden za wszystkich! + - Bierz go! + - Odczepcie się, idę do domu! + reinforcementDialog: + - Nie zadzieraj z naszymi przyjaciółmi! + - Osłaniamy cię Zach! + - Kopia zapasowa przybyła! + - Jeden za wszystkich, wszyscy za jednego! + - To będzie takie łatwe! + - Podziel się z nami najwyższą pozycją! + - Chcesz pójść bruv? + - Gwiaaaaaaaaaaaaazda! + - Co robisz naszemu przyjacielowi + - Poczuj potęgę przyjaźni! + - Moc przyjaźni na 100%! + - Zombie, zgromadzenie! + - Osłaniamy cię kumplu! + - Razem jesteśmy lepsi! + - Im więcej, tym lepiej! + - Mam Cię fam! + - Wszyscy za jednego! +zombie_necronomicon: + summoningChant: Nie należy też sądzić... że człowiek jest albo najstarszym albo ostatnim z władców ziemi, albo że większość życia i substancji krąży samotnie. Przedwieczni byli, Przedwieczni są i Przedwieczni będą. Nie w przestrzeniach, które znamy, ale między nimi kroczą pogodne i pierwotne, niewymiarowe i dla nas niewidoczne. Yog-Sothoth zna bramę. Yog-Sothoth jest bramą. Yog-Sothoth jest kluczem i strażnikiem bramy. Przeszłość, teraźniejszość i przyszłość są jednym w Yog-Sothoth. On wie, gdzie Przedwieczni przedarli się przez stare i gdzie znowu się przebiją. On wie, gdzie stąpali po ziemskich polach i gdzie nadal po nich depczą, i dlaczego nikt nie może ich zobaczyć, jak oni stąpają. Po Ich zapachu ludzie mogą czasami poznać Ich blisko, ale nikt nie może wiedzieć o Ich podobieństwie, zachowując tylko cechy tych, których zrodzili na ludzkości; a jest ich wiele, różniących się podobieństwem od najprawdziwszego eidolona człowieka do kształtu pozbawionego wzroku i substancji, którym są Oni. Chodzą niezauważeni i obrzydliwi w odludnych miejscach, gdzie wypowiadano Słowa, a Rytuały wyły w ich Pór roku. Wiatr szemrze Ich głosami, a ziemia szemrze Ich świadomością. Nachylają las i miażdżą miasto, ale las ani miasto nie mogą ujrzeć ręki, która uderza. Kadath w zimnych pustkowiach poznał Ich, a jaki człowiek zna Kadath? Lodowa pustynia na południu i zatopione wyspy Oceanu trzymają kamienie, na których jest grawerowana ich pieczęć, ale kto widział głęboko zamarznięte miasto lub zapieczętowaną wieżę, ozdobioną wodorostami i pąkli? Wielki Cthulhu jest ich kuzynem, ale może ich szpiegować tylko słabo. Iä! Shub-Niggurath! Jak plugastwo ich poznacie. Ich ręka jest na waszych gardłach, a wy ich nie widzicie; a ich mieszkanie jest nawet z twoim strzeżonym progiem. Yog-Sothoth jest kluczem do bramy, przez którą spotykają się kule. Człowiek rządzi teraz tam, gdzie kiedyś rządzili; Wkrótce będą rządzić tam, gdzie teraz rządzi człowiek. Po lecie jest zima, po zimowym lecie. Czekają cierpliwie i potężnie, bo tutaj znowu będą królować. +zombie_parents: + deathMessage: + - Jesteś potworem! + - Moje dziecko! + - I po co ci to było!? + - Rewanż! + - Nooooo! + - Zapłacisz mi za to! + - Eh, był adoptowany + - On nie żyje! Znowu! + - On jest bardziej martwy niż wcześniej! + - Złamałeś/aś go! + bossEntityDialog: + - Żenujesz mnie! + - On mnie nęka! + - On wybiera mnie! + - Mogę sobie z tym poradzić sam! + - Zostaw mnie, zrozumiałem/am! + - Przestań mnie obserwować! + - Boże to jest tak żenujące! + - Zabrał moje pieniądze na lunch! + - On mnie nęka! + zombieDad: + - Odwal się od mojego syna! + - Powstań dla siebie synu! + - Poradzę sobie z nim! + - Przestań czepiać się mojego syna! + - Dlaczego to robisz? + - Porozmawiam z Twoimi rodzicami! + - Idziesz dziecko! + - Pokaż mu, kto jest szefem dziecko! + - Niezłe uderzenie dziecko! + zombieMom: + - Łapy precz od mojego dziecka! + - Jesteś ranny, cukierku? + - Zranił/a Cię cukierku? + - Pozwól kochanie mi to zobaczyć + - Porozmawiam z jego rodzicami! + - Zapomniałeś swojej kurtki cukierku! + - Postawa, kochanie + - Zniszcz to! + - Przestań! + - Wyniosłeś śmieci? +elite_blaze: + name: '&fPoziom &2$level &fElitarny &ePłomyk' + deathMessages: + - '$player &czostał/a zapalony/a przez $entity!' +elite_cave_spider: + name: '&fPoziom &2$level &fElitarny &eJaskiniowy Pająk' + deathMessages: + - '$player &czostał/a zaplątany/a w sieci przez $entity!' +elite_creeper: + name: '&fPoziom &2$level &fElitarny &2Creeper' + deathMessages: + - '$player &czostał/a wyrzucony/a w powietrzę przez $entity!' + - '$entity &cwłaśnie zabił $player&c!' +elite_drowned: + name: '&fPoziom &2$level &fElitarny &2Utopiec' + deathMessages: + - '$player &czostał/a sprowadzony/a w głębiny przez $entity!' + - '$player &cutonął/ęła przez $entity!' +elite_elder_guardian: + name: '&fPoziom &2$level &fElitarny &eStarszy Strażnik' + deathMessages: + - '$entity &cuniemożliwił $player &ceksplorowanie głębin!' +elite_guardian: + name: '&fPoziom &2$level &fElitarny &eStrażnik' + deathMessages: + - '$entity &cuniemożliwił $player &ceksplorowanie głębin!' +elite_enderman: + name: '&fPoziom &2$level &fElitarny &2Enderman' + deathMessages: + - '$entity &cwysłał $player &cdo pustki!' + - '$player &cspojrzał/a na $entity &cw zły sposób!' + - '$player &ci $entity &czostali najlepszymi znajomymi!' +elitemob_endermite: + name: '&fPoziom &2$level &fElitarny &2Endermit' + deathMessages: + - '$entity jest dla $player tym, czym Dawid dla Goliata!' +elite_evoker: + name: '&fPoziom &2$level &fElitarny &2Przywoływacz' + deathMessages: + - '$player &czostał/a zaklęty/a przez $entity&c!' +elite_husk: + name: '&fPoziom &2$level &fElitarny &ePosuch' + deathMessages: + - '$player &czostał/a wydrążony/a przez $entity&c!' +elite_illusioner: + name: '&fPoziom &2$level &fElitarny &2Iluzjoner' + deathMessages: + - '$player&c nabrał się na iluzję $entity!' +elite_iron_golem: + name: '&fPoziom &2$level &fElitarny &2Żelazny Golem' + deathMessages: + - '$player &czadzierał/a z niewłaściwym $entity&c!' + - '$player &czostał/a pouczony/a przez $entity&c!' +elite_phantom: + name: '&fPoziom &2$level &fElitarny &eFantom' + deathMessages: + - '$player &cpo prostu miał/a koszmar związany z $entity&c!' + - '$player &cbędzie mieć koszmary o $entity&c!' + - '$entity &cnauczył $player &cważność snu w życiu!' +elite_pillager: + name: '&fPoziom &2$level &fElitarny &eRozbójnik' + deathMessages: + - '$entity &csplądrował $player&c!' + - '$entity &csplądrował $player&c!' +elite_polar_bear: + name: '&fPoziom &2$level &fElitarny &eNiedźwiedź Polarny' + deathMessages: + - '$player &czostał/a zadrapany/a na śmierć przez $entity&c!' + - '$player &czostał/a poturbowany/a na śmierć przez $entity&c!' +elite_ravager: + name: '&fPoziom &2$level &fElitarny &eDewastator' + deathMessages: + - '$entity &cpokazał $player &ckto tu rządzi!' +elite_silverfish: + name: '&fPoziom &2$level &fElitarny &2Rybik Cukrowy' + deathMessages: + - '$player &cpomylił/a $entity &cz kamieniem!' +elite_skeleton: + name: '&fPoziom &2$level &fElitarny &eSzkielet' + deathMessages: + - '$player &czostał/a poduszką na szpilki $entity!' + - '$entity &cchciał zobaczyć kości $player!' +elite_spider: + name: '&fPoziom &2$level &fElitarny &2Pająk' + deathMessages: + - '$player &czostał/a zaplątany/a w sieci przez $entity!' + - '$entity &cpożarł $player&c!' +elite_stray: + name: '&fPoziom &2$level &fElitarny &2Tułacz' + deathMessages: + - '$player &czostał/a zabłąkany/a przez $entity&c!' +elite_vex: + name: '&fPoziom &2$level &fElitarny &2Dręczyciel' + deathMessages: + - '$entity &czadręczył $player&c na śmierć!' +elite_vindicator: + name: '&fPoziom &2$level &fElitarny &eObrońca' + deathMessages: + - '$entity &cwykazał swoje umiejętności waleczne na $player&c!' +elite_witch: + name: '&fPoziom &2$level &fElitarna &5Wiedźma' + deathMessages: + - '$player &czostał/a obiektem testów $entity!' + - '$player &czostał/a zaczarowany/a przez $entity!' +elite_wither_skeleton: + name: '&fPoziom &2$level &fElitarny &eMroczny Szkielet' + deathMessages: + - '&cStrzały $entity &cobumarły $player&c!' + - '$entity &czwiędnął $player&c na śmierć!' +elite_zombie: + name: '&fPoziom &2$level &fElitarny &eZombie' + deathMessages: + - '$player &czostał/a pożarty/a przez $entity&c!' + - '$entity &cdostał mózg $player!' +elite_ghast: + name: '&fPoziom &2$level &fElitarny &eGhast' + deathMessages: + - '$player &cnie uniknął/ęła kuli ognia $entity&c!' + - '$player &czostał/a wysadzony/a na bajty przez $entity&c!' + - '$entity &cdostał bekon z $player!' +elite_wolf: + name: '[$level] Elitarny Wilk' + deathMessages: + - '$entity rozerwał $player na strzępy!' + - '$player został/a rozerwany/a przez $entity!' +elite_ender_dragon: + name: '&fPoziom &2$level &fElitarny &2Smok Kresu' + deathMessages: + - '$entity &czakończył $player!' +elite_shulker: + name: '&fLvl &2$level &fElitarny &5Shulker' + deathMessages: + - '$entity &cpokazał $player &cnową wysokość!' +super_chicken: + name: '&2Super Kurczak' +super_cow: + name: '&2Super Krowa' +super_mushroom_cow: + name: '&2Super Grzybowa Krowa' +super_pig: + name: '&dSuper Świnia' +super_sheep: + name: Super Owca +elite_killer_bunny: + name: '&fLvl &2$level &fElitarny &cKrólik Zabójca' + deathMessages: + - '$entity &cwysłał $player &cna farmę!' + - '$entity &cnauczył $player używać kija zamiast marchewki!' +elite_llama: + name: '&fLvl &2$level &fElitarna &5Lama' + deathMessages: + - '$player &czostał/a opluty/a przez $entity&c!' + - '$player &cwas rozgniewał $entity&c!' +elite_warden: + name: '&fLvl &2$level &fElitarny &3Strażnik' + deathMessages: + - '$entity &cwyczuł, że $player &cbył/a w pobliżu!' +elite_goat: + name: '&fLvl &2$level &fElitarna &5Koza' + deathMessages: + - '$player &czostał/a staranowany/a przez $entity&c!' + - '$player &czostał zdeptany/a przez $entity&c!' + - '$player &czostał/a staranowany/a przez $entity&c!' + - '$player &cnadział się na rogi $entity&c!' +elite_zombified_piglin: + name: '&fPoziom &2$level &fElitarny &eZzombifikowany Piglin' + deathMessages: + - '$player &czostał/a poturbowany/a na śmierć przez $entity&c!' + - '$entity &cdostał bekon $player!' +elite_zoglin: + name: '&fPoziom &2$level &fElitarny &eZoglin' + deathMessages: + - '$player &czadzierał/a z $entity &ci dostał/a rogami!' + - '$entity &cdostał bekon $player!' +elite_piglin: + name: '&fPoziom &2$level &fElitarny &ePiglin' + deathMessages: + - '$entity &czdobędzie dobrą cenę za pozostałości $player!' + - '$entity &nauczył $player &cwartość złota!' +elite_hoglin: + name: '&fPoziom &2$level &fElitarny &eHoglin' + deathMessages: + - '$player &czadzierał/a z $entity &ci dostał/a rogami!' + - '$entity &cdostał bekon $player!' +elite_piglin_brute: + name: '&fPoziom &2$level &fElitarny &ePiglin Okrutnik' + deathMessages: + - '$entity &czmiękczył $player!' + - '$entity &cwyżył się na $player!' +elite_bee: + name: '&fPoziom &2$level &fElitarna &ePszczoła' + deathMessages: + - '$player &czostał/a ukąszony/a przez $entity!' +MobCombatSettings: + bossLocationMessage: '&7[EM] &2[Kliknij, aby śledzić!]' + bossKillParticipationMessage: '&eTwoje obrażenia: &2$playerDamage' + defaultOtherWorldBossLocationMessage: '$name: W innym świecie!' + weakText: '&9&lSłabo!' + resistText: '&c&lOdporność!' + fullHealMessage: '&2PEŁNE WYLECZENIE!' +check_tier: + message1: '&7[EM] Twój poziom walki to $tier' + message2: '&7[EM] Bonus dla twojego poziomu w gildii to $tier' + message3: '&7[EM] &aTwój łączny poziom zagrożenia to $tier' +check_tier_others: + message1: '&7[EM] Poziom walki gracza: $player to $tier' + message2: '&7[EM] Poziom bonusu w gildii wojowników gracza: $player to $tier' + message3: '&7[EM] Poziom zagrożenia gracza: $player to $tier' +ScrapItemSettings: + scrapItemName: '&2Złom poziomu $level' + scrapItemLore: + - '&aZbierz 25 złomu tego samego poziomu,' + - '&aaby stworzyć kulę ulepszeń przedmiotu!' + - '&aMożesz również użyć złomu do naprawy' + - '&aprzedmiotów i wytworzyć złom wyższego poziomu!' + - '&2Zrób to w Gildii Wojowników!' + upgradeItemName: '&2Ulepszenie Kuli do $level Poziomu' + upgradeItemLore: + - '&aUżyj u NPC Ulepszacza, aby ulepszyć' + - '&aprzedmioty do poziomu $orbLevel!' +Quests: + questJoinMessage: '&aZaakceptowałeś zadanie - $questName &a!' + questLeaveMessage: '&cPorzuciłeś zadanie - $questName &c!' + questCompleteMessage: '&2Zakończyłeś zadanie $questName &2!' + leaveWhenNoActiveQuestsExist: '&cNie masz obecnie aktywnego zadania!' + questLeaveConfirmationMessage: '&cCzy na pewno chcesz porzucić swoje bieżące zadanie? Wpisz &a/em confirm &c, aby potwierdzić swój wybór!' + questStartTitle: '&aZadanie zaakceptowane!' + questCompleteTitle: '&2Zadanie ukończone!' + questLeaveTitle: '&cZadanie porzucone!' + killQuestChatProgressionMessage: '&8[EliteMobs]&c➤Zabij $name:$color$current&0/$color$target' + fetchQuestChatProgressionMessage: '&8[EliteMobs]&c➤Zdobądź $name:$color$current&0/$color$target' + dialogQuestChatProgressionMessage: '&8[EliteMobs]&c➤Porozmawiaj z $name:$color$current&0/$color$target' + questCapMessage: '&8[EliteMobs] &cOsiągnąłeś maksymalną liczbę aktywnych zadań (10)! &4Porzuć lub ukończ co najmniej jedno aktywne zadanie, jeśli chcesz zdobyć więcej zadań!' + killQuestScoreboardProgressionMessage: '&c➤Zabij $name:$color$current&0/$color$target' + fetchQuestScoreboardProgressionMessage: '&c➤Zdobądź $name:$color$current&0/$color$target' + dialogQuestScoreboardProgressionMessage: '&c➤Porozmawiaj z $name:$color$current&0/$color$target' + chatTrackMessage: '&8[EliteMobs]&2 Kliknij tutaj, aby śledzić swoje zadanie!' + chatTrackHover: '&2Kliknij aby śledzić!' + chatTrackingMessage: '&8[EliteMobs]&9 Teraz śledzisz zadanie!' + chatTrackingHover: '&2Kliknij, aby przestać śledzić/zacząć śledzić! /em -> Zadania, aby śledzić inne zadanie!' + noQuestDestinationFound: '[EM] Nie znaleziono miejsca docelowego zadania!' + questDestinationInOtherWorld: '[EM] Przejdź do świata $world!' + questAlreadyCompletedMessage: '&8[EliteMobs] &cJuż ukończyłeś to zadanie!' + questPrerequisitesMissingMessage: '&8[EliteMobs] &cNie można jeszcze zaakceptować tego zadania!' + lowRankDynamicQuestWarning: '&8[EliteMobs] &cNie możesz wykonać tych zadań z aktualną rangą gildii! Zwiększ rangę gildii, by zaakceptować te zadania.' + questTurnInObjective: '&a2Porozmawiaj z $npcName' +Wormholes: + dungeonNotInstalledMessage: '&8[EliteMobs] &cDungeon $dungeonID &cnie jest zainstalowany! Ten teleport nie zadziała.' + defaultPortalMissingMessage: '&8[EliteMobs] &cTen portal donikąd nie prowadzi!' +Arenas: + notEnoughPlayersMessage: '&8[EliteMobs] &cPotrzebujesz co najmniej $amount aby rozpocząć rozgrywkę!' + startingMessage: '&2Rozpoczynanie!' + startingSubtitle: '&2za $count...' + arenaFullMessage: '&4[EliteMobs] &cArena jest pełna! Ale możesz obserwować, czekając aż rozgrywka się skończy!' + arenasOngoingMessage: '&4[EliteMobs] &cNie można teraz dołączyć do areny - rozgrywka się obecnie odbywa! Możesz obserwować podczas oczekiwania na zakończenie!' + arenaStartHintMessage: '&2[EliteMobs] &aMożesz wystartować arenę wpisując &2/em start' + arenaQuitHintMessage: '&4[EliteMobs] &cMożesz opuścić arenę wykonując &4/em quit' + arenaJoinPlayerMessage: "&2[EliteMobs] &aMożesz wystartować arenę wpisując &2/em\\ \\ start &ajeżeli jest w niej co najmniej &2$count &agraczy! \nMożesz wyjść z\\ \\ areny wpisując &c/em quit" + arenaJoinSpectatorMessage: '&2[EliteMobs] &aMożesz wyjść z areny w każdej chwili wpisując &2/em quit' + waveTitle: '&aFala &2$wave' + victoryTitle: '&2Zwycięstwo!' + victorySubtitle: '&aUkończono &2$wave &afal!' + defeatTitle: '&4Porażka!' + defeatSubtitle: '&cOsiągnięto falę &4$wave&c!' + victoryBroadcast: Arena $arenaName została podbita przez $players! + joinPlayerTitle: '&aWystartuj wpisując &2/em start &a!' + joinPlayerSubtitle: '&cOpuść wpisując &4/em quit &c!' + joinSpectatorTitle: '&aJesteś teraz obserwatorem!' + joinSpectatorSubtitle: '&cOpuść wpisując &4/em quit &c!' +ancient_corpse_drop_axe: + name: 'Tasak Rzeźnika' + lore: + - '&aOdzyskane z' + - '&aStarożytna trupa czaszka...' +animated_armor_drop_axe: + name: 'Zaczarowany topór' + lore: + - '&8Ten topór był prawie' + - '&8twoim końcem.' +animated_armor_drop_boots: + name: '&8Enchanted Buty' + lore: + - '&8Walczyłeś dokładnie z tym' + - '&8kwałakiem zbroi.' +animated_armor_drop_chestplate: + name: '&8Zaklęty Napierśnik' + lore: + - '&8Walczyłeś dokładnie z tym' + - '&8kwałakiem zbroi.' +animated_armor_drop_helmet: + name: '&8Zaklęty Hełm' + lore: + - '&8Walczyłeś dokładnie z tym' + - '&8kwałakiem zbroi.' +animated_armor_drop_leggings: + name: '&8Zaczarowane Legginsy' + lore: + - '&8Walczyłeś dokładnie z tym' + - '&8kwałakiem zbroi.' +arachnid_matriarch_drop_boots: + name: '&bJedawbny Magołaz' + lore: + - '&bWykonane z rzadkiego jedwabiu pająka.' +baba_rhoga_drop_chest: + name: '&aSzaty Wiedźmy' + lore: + - '&aTen zapach powinien' + - '&aewentualnie zniknąć.' +baba_yaga_drop_helmet: + name: '&aKapelusz Wiedźmy' + lore: + - '&aTen zapach powinien' + - '&aewentualnie zniknąć.' +balloon_rider_drop_leggings: + name: '&dWygodne Legginsy' + lore: + - '&dBardzo wygodne i przewiewne legginsy.' +banshee_drop_charm: + name: '&8Ucieleśnienie Smutku' + lore: + - '&8Oby ten utwierdzone cierpienie cię strzeże' + - '&8przed żalem.' +beast_tamer_drop_axe: + name: '&eWielki Topór' + lore: + - '&eWystarczająco ciężki aby przepołowyć jakąkolwiek bestie na pół.' +berserker_charm: + name: '&bAmulet Berserkera' + lore: + - '&aZatrać się w kontakcie z' + - '&aPrzytłaczającą niedolą w' + - '&awięcej niż jeden sposób...' +bigfoot_drop_chestplate: + name: '&eFutrzana Zbroja' + lore: + - '&eWygodna i ciepła.' +big_bad_wolf_drop_chestplate: + name: '&aFutro z Big Bad Wolf' + lore: + - '&aBrrY!' +bloated_jeffrey_drop_tear: + name: '&bSweet Tear' + lore: + - '&bDoprowadziłem Jeffa do płaczu...' +bone_fiend_drop_leggings: + name: '&aKościane Legginsy' + lore: + - '&aDzięki nim twój tył będzie nieźle wyglądał' + - '&aleggings naprawdę zwracają sporo uwagi.' +challengers_boots: + name: '&cButy Pretendenta' + lore: + - '&2Przyznawane tym, którzy zmierzą się z' + - '&2Areną Drewnianej Ligii!' +challengers_chestplate: + name: '&cNapierśnik Pretendenta' + lore: + - '&2Przyznawane tym, którzy zmierzą się z' + - '&2Areną Drewnianej Ligii!' +challengers_helmet: + name: '&cHełm Pretendenta' + lore: + - '&2Przyznawane tym, którzy zmierzą się z' + - '&2Areną Drewnianej Ligii!' +challengers_leggings: + name: '&cSpodnie Pretendenta' + lore: + - '&2Przyznawane tym, którzy zmierzą się z' + - '&2Areną Drewnianej Ligii!' +challengers_sword: + name: '&cMiecz Pretendenta' + lore: + - '&2Przyznawane tym, którzy zmierzą się z' + - '&2Areną Drewnianej Ligii!' +chameleon_charm: + name: '&bTalizman Kameleona' + lore: + - '&aKolorowy Kameleon może' + - '&awtopić w otoczenie w każdym miejscu,' + - '&askradając się powolnie po okolicy...' +changeling_drop_sword: + name: '&aCrystalline Sword' + lore: + - '&aWydaje się, że migocze przy każdym spojrzeniu.' +cheetah_charm: + name: '&bTalizman Geparda' + lore: + - '&aGepard może osiągać prędkość' + - '&a120 km/h... na około 60' + - '&asekund. Nie zmarnuj ich!' +circus_ringmaster_drop_charm: + name: '&dBicz Kierownika Cyrku' + lore: + - '&dBył urzywany do wymierzania straszliwych tortur.' +craftenmine_terror_drop_trident: + name: '&cGhast Lobotomizer' + lore: + - '&cPerfect for making sure that' + - '&cthe Ghasts stay grounded.' +creeperpede_drop_chestplate: + name: '&dExplosion Proof Vest' + lore: + - '&dMake ''BOOM!'' feel' + - '&dmore like ''boom''.' +crone_drop_axe: + name: '&fWitch Feller' + lore: + - '&fA fine axe that demands a fine hunt.' +depths_seeker: + name: '&2Przeszukiwacz głębin' + lore: + - '&9Pochodząca z najczarniejszych czeluści ' + - '&9i złupiona od najgorszego potwora,' + - '&9Nie ma informacji o okrucieństwach' + - '&9Widzianych przez tą wędkę.' +divine_cinder_drop_charm: + name: '&6Divine Fire' + lore: + - '&6Blessed be the fire!' +dwarven_greed: + name: '&4Chciwość Krasnoluda' + lore: + - '&cCi którzy kopią zbyt chciwie' + - '&coraz zbyt głęboko, mogą obudzić starożytne' + - '&cstwory cienia i płomieni' + - '&cktóre lepiej zostawić w spoczynku.' +elephant_charm: + name: '&bTalizm słonia' + lore: + - '&aZdobądź siłę słonia' + - '&asiej popłoch, za niewielki koszt' + - '&aszybkości aby niewzruszenie szarżować jak słoń!' +enders_drop_chestplate: + name: '&dEnder Shirt' + lore: + - '&dProtective and comfy!' +enders_drop_helmet: + name: '&dEnder Cap' + lore: + - '&dComfy but also quite sturdy.' +enders_drop_leggings: + name: '&dEnder Pants' + lore: + - '&dA bit too long but it will do.' +ender_lapin_drop_boots: + name: '&cDark Star Boots' + lore: + - '&cGives you the courage' + - '&cof running when in danger.' +endless_pursuer_drop_sword: + name: '&7Dark Blood Sword' + lore: + - '&7The sword seems to' + - '&7be weeping blood...' +enraged_snowman_drop_sword: + name: '&9Snowman''s Nose' + lore: + - '&9No wonder that the Snowman''s' + - '&9nose was so pointy...' +xmas_and_gold: + name: '&6i złoto!' + lore: + - '&7Wszyscy życzą srebra' + - '&7i złota!' +xmas_and_goooooold: + name: '&6oraz złotooooooooooo!' + lore: + - '&7Wszyscy życzą srebra' + - '&7i złota!' +xmas_cornelius_pick: + name: '&bWybór Korneliusza' + lore: + - '&3Jeśli rzucisz to w powietrze' + - '&3 i pozwolisz temu uderzyć w ziemię,' + - '&3możesz znaleźć trochę' + - '&3mięty!' +xmas_lost_present: + name: '&2Zagubiony prezent' + lore: + - '&2Oddaj to, by otrzymać nagrodę!' +xmas_peppermint: + name: '&cMięta' + lore: + - '&fTo, co szukałem przez całe moje życie!' +xmas_siiiiilver: + name: '&7Srebrooooo' + lore: + - '&6Każdy życzy srebra' + - '&6i złota!' +xmas_silver: + name: '&7Srebro' + lore: + - '&6Każdy życzy srebra' + - '&6i złota!' +xmas_substitute_elf_practice: + name: '&8Zastępcza Praktyka Elfów' + lore: + - '&fTa lalka potrzebuje naprawienia zębów' +xmas_treat: + name: '&aPoczęstunek!' + lore: + - '&ePrzepyszna przekąska!' +xmas_treat_v2: + name: '&aPoczęstunek!' + lore: + - '&ePrzepyszna przekąska!' +evil_undead_drop_sword: + name: '&eTransient Blade' + lore: + - '&eIt will only serve' + - '&eyou for song long.' +fallen_knight_drop_boots: + name: '&e7Ancient Boots' + lore: + - '&7Even though the boots are old they' + - '&7still provide plenty of protection.' +fallen_knight_drop_chestplate: + name: '&e7Ancient Nether-Plate' + lore: + - '&7This armor might look plain to' + - '&7the untrained eye but is clear' + - '%7that anything wishing to penetrate' + - '&7it''s thick plate will need to be' + - '&7swung with considerable force.' +fallen_knight_drop_helmet: + name: '&e7Ancient Headgear' + lore: + - '&7Many swords have left their mark' + - '&7aon this helm but none have' + - '&7managed to break its defense.' +fallen_knight_drop_leggings: + name: '&e7Ancient Leggings' + lore: + - '&7You feel sorry for anyone that tries' + - '&7to strike these leggings.' +fine_swine_drop_sword: + name: '&6Fine Golden Sword' + lore: + - '&6A fine master-crafted golden sword.' + - '&6The molten gold flowing inside' + - '&6the sword makes sure that any damage' + - '&6to the blade is repaired swiftly.' +firefly_charm: + name: '&bTalizman Świetlika' + lore: + - '&aRozświeć noc!' +firestarter_drop_helmet: + name: '&eFire Stopper' + lore: + - '&eTylko połowe ciepła!' +fire_conjurer_drop_shield: + name: '&ePłomień Dotknięta Tarczą' + lore: + - '&eDaję ochronę przed płomieńmi i ogniem.' +fishy_charm: + name: '&bRybny Amulet' + lore: + - '&aNie wiem co, ale' + - '&ato jest jakieś niepokojące...' +fox_king_cold_drop_charm: + name: '&9Magiczny Śnieg' + lore: + - '&9Wyczuwasz wrogą energię' + - '&9emanującą od tego śniego.' +fulgora_drop_boots: + name: '&bButy Górskie' + lore: + - '&bPowinno być użyteczne w' + - '&bwędrówkach górskich.' +goblin_ballista: + name: '&8Balista Goblinów' + lore: + - '&8Skarb pośród goblinów!' +goblin_boots: + name: '&8Buty Goblina' + lore: + - '&8Skarb pośród goblinów!' +goblin_chestplate: + name: '&8Napierśnik Goblina' + lore: + - '&8Skarb pośród goblinów!' +goblin_cleaver: + name: '&8Tasak Goblina' + lore: + - '&8Skarb pośród goblinów!' +goblin_helmet: + name: '&8Hełm Goblina' + lore: + - '&8Skarb pośród goblinów!' +goblin_invasion_drop_chestplate: + name: '&aMały Napierśnik' + lore: + - '&aNaprawdę ciasny...' +goblin_invasion_drop_leggings: + name: '&aCiasne Legginsy' + lore: + - '&aCóż, przynajmniej pokazują' + - '&ato co ważne.' +goblin_leggings: + name: '&8Spodnie Goblina' + lore: + - '&8Skarb pośród goblinów!' +goblin_poker: + name: '&8Berło Goblina' + lore: + - '&8Skarb pośród goblinów!' +goblin_shooter: + name: '&8Łucznik Goblin' + lore: + - '&8Skarb pośród goblinów!' +goblin_slasher: + name: '&8Tnący Goblin' + lore: + - '&8Skarb pośród goblinów!' +grappling_arrow: + name: '&6Strzała Przyciągająca' + lore: + - '&eWystrzel w TARCZĘ by się przyciągnąć!' +greedy_dwarf_drop_pickaxe: + name: '&9Krasnoludzka Potrzeba' + lore: + - '&cCi którzy kopią zbyt chciwie' + - '&coraz zbyt głęboko, mogą obudzić starożytne' + - '&cstwory cienia i płomieni' + - '&cktóre lepiej zostawić w spoczynku.' +grunter_drop_axe: + name: '&cBig Oink' + lore: + - '&cTopór ma tendencję' + - '&cdo kwiczenia przy zamachu.' +grunts_boots: + name: '&fButy Grunta' + lore: + - '&2Przyznawane tym, którzy zmierzą się z' + - '&2Areną Drewnianej Ligii!' +grunts_chestplate: + name: '&fNapierśnik Grunta' + lore: + - '&2Przyznawane tym, którzy zmierzą się z' + - '&2Areną Drewnianej Ligii!' +grunts_helmet: + name: '&fHełm Grunta' + lore: + - '&2Przyznawane tym, którzy zmierzą się z' + - '&2Areną Drewnianej Ligii!' +grunts_leggings: + name: '&fSpodnie Grunta' + lore: + - '&2Przyznawane tym, którzy zmierzą się z' + - '&2Areną Drewnianej Ligii!' +grunts_sword: + name: '&fMiecz Grunta' + lore: + - '&2Przyznawane tym, którzy zmierzą się z' + - '&2Areną Drewnianej Ligii!' +harmless_chicken_drop_boots: + name: '&aBezużyteczne Buty' + lore: + - '&aPrzynajmniej są odporne na eksplozję...' +hog_rider_drop_boots: + name: '&a3.6 Radioaktywne Buty' + lore: + - '&aWygodne... Choć przyciasne.' +horde_champion_drop_sword: + name: '&dHorde Eviscerator' + lore: + - '&dKiedy musisz zająć się' + - '&dhordą nieumarłych.' +horrid_duplicator_drop_arrow: + name: '&aFelerna Strzała' + lore: + - '&2Działa prawie jak' + - '&2prawdziwa...' +horrid_duplicator_drop_bow: + name: '&4Ognisty Kościany Łuk' + lore: + - '&4Ten łuk wykonany jest z' + - '&4pojedynczej dużej kości.' +invasion_alien_treat: + name: '&6Smakołyki Kosmitów' + lore: + - '&6Smak nie z tej ziemi!' +invasion_cheap_plasma_boots: + name: '&2Tanie Buty Plazmowe' + lore: + - '&aOdbij się!' + - '&cUwaga: &8Kliknij shift dwa razy, aby aktywować!' +invasion_low_grade_tinfoil_bolt_caster: + name: '&7Wystrzeliwacz Piorunów Niskiej Jakości' + lore: + - '&7Wyjdź z mojej posiadłości!' +invasion_low_grade_tinfoil_boots: + name: '&7Buty Z Folii Aluminiowej Niskiej Klasy' + lore: + - '&7Unika promieniowania podłogowego!' +invasion_low_grade_tinfoil_chestplate: + name: '&7Napierśnik Z Folii Aluminiowej Niskiej Klasy' + lore: + - '&7Zapobiega szpiegowaniu 6G na twoim rozruszniku serca!' +invasion_low_grade_tinfoil_hat: + name: '&7Czapka Z Folii Aluminiowej Niskiej Klasy' + lore: + - '&7Chciałbym wierzyć!' +invasion_low_grade_tinfoil_leggings: + name: '&7Spodnie Z Folii Aluminiowej Niskiej Klasy' + lore: + - '&7Wykonane do uciekania przed kosmitami!' +invasion_polished_plasma_boots: + name: '&2Polerowane Buty Plazmowe' + lore: + - '&aOdbij się!' + - '&cUwaga: &8Kliknij shift dwa razy, aby aktywować!' +invasion_quality_bolt_caster: + name: '&7Porządny Wystrzeliwacz Piorunów' + lore: + - '&7Wyjdź z mojej posiadłości!' +invasion_quality_tinfoil_boots: + name: '&7Buty Z Folii Aluminiowej Z Dolnej Pułki' + lore: + - '&7Unika promieniowania podłogowego!' +invasion_quality_tinfoil_chestplate: + name: '&7Porządny Napierśnik Z Folii Aluminiowej' + lore: + - '&7Zapobiega szpiegowaniu 6G na twoim rozruszniku serca!' +invasion_quality_tinfoil_hat: + name: '&7Porządna Czapka Z Folii Aluminiowej' + lore: + - '&7Pozostań poza moją głową!' +invasion_quality_tinfoil_leggings: + name: '&7Porządne Spodnie Z Folii Aluminiowej' + lore: + - '&7Wykonane do uciekania przed kosmitami!' +invictus_boots: + name: '&4Niezwyciężone Buty' + lore: + - '&2Przyznawane mistrzom' + - '&2Areny Drewnianej Ligii!' +invictus_chestplate: + name: '&4Niezwyciężony Napierśnik' + lore: + - '&2Przyznawane mistrzom' + - '&2Areny Drewnianej Ligii!' +invictus_helmet: + name: '&4Niezwyciężony Hełm' + lore: + - '&2Przyznawane mistrzom' + - '&2Areny Drewnianej Ligii!' +invictus_leggings: + name: '&4Niezwyciężone Spodnie' + lore: + - '&2Przyznawane mistrzom' + - '&2Areny Drewnianej Ligii!' +invictus_pickaxe: + name: '&4Niezwyciężony Kilof' + lore: + - '&2Przyznawane mistrzom' + - '&2Areny Drewnianej Ligii!' +invictus_shovel: + name: '&4Niezwyciężona Łopata' + lore: + - '&2Przyznawane mistrzom' + - '&2Areny Drewnianej Ligii!' +invictus_sword: + name: '&4Niezwyciężony Miecz' + lore: + - '&2Przyznawane mistrzom' + - '&2Areny Drewnianej Ligii!' +krampus_drop_boots: + name: '&1Śnieżne Buty' + lore: + - '&1Wykonano 100% ze śniegu.' +large_hopper_drop_axe: + name: '&aCiężki Topór' + lore: + - '&aPosiada atest obcinania głów.' +living_shadow_drop_boots: + name: '&5Buty Cienia' + lore: + - '&5Spadanie już nie boli tak bardzo.' +lucky_charms: + name: '&bOstatnie Ciastko' + lore: + - '&aCzęść kompletnego śniadania!' + - '&aCIASTKO TO ŚWIAT!' + - '&aCIASTKO TO ŻYCIE!' +magmaguys_toothpick: + name: ' &2Wykałaczka &4Magmaguya' + lore: + - '&aPrawie nieużywana!' +merman_drop_trident: + name: '&1Trójząb Syrena' + lore: + - '&1Ulubiona broń wśród Syren.' +meteor_shower_scroll: + name: '&7Zwój Przyzywający Deszcz Meteorytów' + lore: + - '&4Przyzwij Destrukcje!' + - '&4Jednorazowego Użytku.' +monster_of_the_deep_drop_trident: + name: '&3Kościany Trójząb' + lore: + - '&3Wykonane z kości' + - '&3Potwora z Głębin.' +moon_spider_drop_sword: + name: '&fSilk Spun Sword' + lore: + - '&fRazor sharp silk surrounds' + - '&fthe iron core of this blade.' + - '&fThe blade will serve you,' + - '&ffor now...' +necromancer_drop_helmet: + name: '&cDark Omen Helm' + lore: + - '&cThere is something off' + - '&cabout this helmet.' +netherite_golem_drop_helmet: + name: '&8Ancient Helmet' + lore: + - '&8You''re not sure if you' + - '&8should put this on your' + - '&8head or send it to a museum.' +nether_escapee_drop_charm: + name: '&6Fire Amulet' + lore: + - '&6May the flames not harm you.' +nether_hag_drop_sword: + name: '&7Bewitched Sword' + lore: + - '&7All kinds of curses and' + - '&7enchantments flow through' + - '&7this sword.' +nightwing_drop_crossbow: + name: '&aSky Watcher' + lore: + - '&aKeeping the skies safe.' +night_crawler_drop_shield: + name: '&8Night Shield' + lore: + - '&8Almost unbreakable.' +night_crawler_drop_sword: + name: '&8Night Blade' + lore: + - '&e8The only answer to the' + - '&8threats of the night.' +novices_boots: + name: '&8Buty Nowicjusza' + lore: + - '&2Przyznawane tym, którzy zmierzą się z' + - '&2Areną Drewnianej Ligii!' +novices_chestplate: + name: '&8Napierśnik Nowicjusza' + lore: + - '&2Przyznawane tym, którzy zmierzą się z' + - '&2Areną Drewnianej Ligii!' +novices_helmet: + name: '&8Hełm Nowicjusza' + lore: + - '&2Przyznawane tym, którzy zmierzą się z' + - '&2Areną Drewnianej Ligii!' +novices_leggings: + name: '&8Spodnie Nowicjusza' + lore: + - '&2Przyznawane tym, którzy zmierzą się z' + - '&2Areną Drewnianej Ligii!' +novices_sword: + name: '&8Miecz Nowicjusza' + lore: + - '&2Przyznawane tym, którzy zmierzą się z' + - '&2Areną Drewnianej Ligii!' +oasis_beacons_brigandine: + name: '&8Brygantyna Beacona' + lore: + - '&fPorządna stal może odeprzeć' + - '&fwiększość ataków.' +oasis_chief_cultists_bow: + name: '&5Łuk Naczelnego Kultysty' + lore: + - '&dNekrotyczny łuk wojenny' + - '&dnależący do wodza okultystów.' +oasis_earthquake_boots_10: + name: '&2Buty Trzęsienia Ziemi' + lore: + - '&aZatrzęś ziemią i potworami!' + - '&cUwaga: &8Kliknij shift dwa razy, aby aktywować!' +oasis_earthquake_boots_20: + name: '&2Buty Trzęsienia Ziemi' + lore: + - '&aZatrzęś ziemią i potworami!' + - '&cUwaga: &8Kliknij shift dwa razy, aby aktywować!' +oasis_earthquake_boots_30: + name: '&2Buty Trzęsienia Ziemi' + lore: + - '&aZatrzęś ziemią i potworami!' + - '&cUwaga: &8Kliknij shift dwa razy, aby aktywować!' +oasis_earthquake_boots_40: + name: '&2Buty Trzęsienia Ziemi' + lore: + - '&aZatrzęś ziemią i potworami!' + - '&cUwaga: &8Kliknij shift dwa razy, aby aktywować!' +oasis_earthquake_boots_50: + name: '&2Buty Trzęsienia Ziemi' + lore: + - '&aZatrzęś ziemią i potworami!' + - '&cUwaga: &8Kliknij shift dwa razy, aby aktywować!' +oasis_earthquake_chestplate_10: + name: '&2Napierśnik Trzęsienia Ziemi' + lore: + - '&aZatrzęś ziemią i potworami!' + - '&cUwaga: &8Kliknij shift dwa razy, aby aktywować!' +oasis_earthquake_chestplate_20: + name: '&2Napierśnik Trzęsienia Ziemi' + lore: + - '&aZatrzęś ziemią i potworami!' + - '&cUwaga: &8Kliknij shift dwa razy, aby aktywować!' +oasis_earthquake_chestplate_30: + name: '&2Napierśnik Trzęsienia Ziemi' + lore: + - '&aZatrzęś ziemią i potworami!' + - '&cUwaga: &8Kliknij shift dwa razy, aby aktywować!' +oasis_earthquake_chestplate_40: + name: '&2Napierśnik Trzęsienia Ziemi' + lore: + - '&aZatrzęś ziemią i potworami!' + - '&cUwaga: &8Kliknij shift dwa razy, aby aktywować!' +oasis_earthquake_chestplate_50: + name: '&2Napierśnik Trzęsienia Ziemi' + lore: + - '&aZatrzęś ziemią i potworami!' + - '&cUwaga: &8Kliknij shift dwa razy, aby aktywować!' +oasis_earthquake_helmet_10: + name: '&2Hełm Trzęsienia Ziemi' + lore: + - '&aZatrzęś ziemią i potworami!' + - '&cUwaga: &8Kliknij shift dwa razy, aby aktywować!' +oasis_earthquake_helmet_20: + name: '&2Hełm Trzęsienia Ziemi' + lore: + - '&aZatrzęś ziemią i potworami!' + - '&cUwaga: &8Kliknij shift dwa razy, aby aktywować!' +oasis_earthquake_helmet_30: + name: '&2Hełm Trzęsienia Ziemi' + lore: + - '&aZatrzęś ziemią i potworami!' + - '&cUwaga: &8Kliknij shift dwa razy, aby aktywować!' +oasis_earthquake_helmet_40: + name: '&2Hełm Trzęsienia Ziemi' + lore: + - '&aZatrzęś ziemią i potworami!' + - '&cUwaga: &8Kliknij shift dwa razy, aby aktywować!' +oasis_earthquake_helmet_50: + name: '&2Hełm Trzęsienia Ziemi' + lore: + - '&aZatrzęś ziemią i potworami!' + - '&cUwaga: &8Kliknij shift dwa razy, aby aktywować!' +oasis_earthquake_leggings_10: + name: '&2Spodnie Trzęsienia Ziemi' + lore: + - '&aZatrzęś ziemią i potworami!' + - '&cUwaga: &8Kliknij shift dwa razy, aby aktywować!' +oasis_earthquake_leggings_20: + name: '&2Spodnie Trzęsienia Ziemi' + lore: + - '&aZatrzęś ziemią i potworami!' + - '&cUwaga: &8Kliknij shift dwa razy, aby aktywować!' +oasis_earthquake_leggings_30: + name: '&2Spodnie Trzęsienia Ziemi' + lore: + - '&aZatrzęś ziemią i potworami!' + - '&cUwaga: &8Kliknij shift dwa razy, aby aktywować!' +oasis_earthquake_leggings_40: + name: '&2Spodnie Trzęsienia Ziemi' + lore: + - '&aZatrzęś ziemią i potworami!' + - '&cUwaga: &8Kliknij shift dwa razy, aby aktywować!' +oasis_earthquake_leggings_50: + name: '&2Spodnie Trzęsienia Ziemi' + lore: + - '&aZatrzęś ziemią i potworami!' + - '&cUwaga: &8Kliknij shift dwa razy, aby aktywować!' +oasis_foundrys_flaming_hammer: + name: '&6Odlewniczy Młot Płonący' + lore: + - '&eMłot z odlewni!' +oasis_foundrys_flux: + name: '&6Odlewniczy Flux' + lore: + - '&eFlux, który został wzmocniony' + - '&ekażdą wykutą bronią!' +oasis_mask_of_the_warlock: + name: '&4Maska Czarnoksiężnika' + lore: + - '&7Kamień znajduje się w jego masce!' + - '&7Światło UV mu pomoże!' +oasis_monumental_lance: + name: '&3Monumentalna Lanca' + lore: + - '&bŁowiectwo podwodne to moje hobby.' +oasis_oracles_shroud: + name: '&3Całun Wyroczni' + lore: + - '&1Iluzja to twoja broń!' +oasis_page_of_darkness_I: + name: '&0Strona Ciemności I' + lore: + - '&829 kroków na Północ' + - '&811 kroków na Zachód' + - '&816 kroków na Północ' + - '&86 kroków na Wschód' +oasis_page_of_darkness_II: + name: '&0Strona Ciemności II' + lore: + - '&87 kroków na Południe' + - '&86 kroków na Wschód' + - '&833 kroki na Północ' + - '&812 kroków na Zachód' +oasis_page_of_darkness_III: + name: '&0Strona Ciemności III' + lore: + - '&86 kroków na Północ' + - '&83 kroki na Zachód' + - '&830 kroków na Północ' + - '&89 kroków na Wschód' +oasis_page_of_darkness_index: + name: '&0Strona Ciemności Indeks' + lore: + - '&8Przeczytaj uważnie w ciemności' + - '&8wiedzą, że przyszedłeś.' + - '&8Bądź znużony na ścieże przed tobą' + - '&8dla kul ognistego bębna.' +oasis_page_of_darkness_IV: + name: '&0Strona Ciemności IV' + lore: + - '&824 kroki na Południe' + - '&89 kroków na Wschód' + - '&836 kroków na Północ' + - '&83 kroki na Zachód' +oasis_page_of_darkness_V: + name: '&0Strona Ciemności V' + lore: + - '&89 kroków na Północ' + - '&812 kroków na Wschód' + - '&86 kroków na Południe' + - '&86 kroków na Wschód' +oasis_page_of_darkness_VI: + name: '&0Strona Ciemności VI' + lore: + - '&86 kroków na Południe' + - '&86 kroków na Wschód' + - '&812 kroków na Północ' + - '&83 kroki na Wschód' +oasis_page_of_darkness_VII: + name: '&0Strona Ciemności VII' + lore: + - '&83 kroki na Północ' + - '&86 kroków na Wschód' + - '&88 kroków na Południe' +oasis_page_of_darkness_VIII: + name: '&0Strona Ciemności VIII' + lore: + - '&8Z cienia wyłania się światło' + - '&8którego szaty są matowoszare, zniszczone walką.' + - '&8Z lodu i śniegu, ognia i ciepła.' + - '&8Topory wyginają się, a miecze ponoszą klęskę.' +oasis_page_of_libraris_I: + name: '&7Strona Biblioteki I' + lore: + - '&fPod półką książek' + - '&fktóra nie ma odblasków' + - '&fpokaże ci się' + - '&fprzejście i kierunek.' +oasis_page_of_libraris_II: + name: '&7Strona Biblioteki II' + lore: + - '&fOdbicie regałów' + - '&fprzechowujących więcej wiedzy' + - '&f4 półki pełniejsze książki' + - '&fniż ich obraz skierowany ku górze!' +oasis_page_of_libraris_III: + name: '&7Strona Biblioteki III' + lore: + - '&fIdąc trochę na zachód' + - '&fod półki, która przechowuje najlepsze.' + - '&fNajwiększa wiedza jest w tym miejscu.' + - '&fUlubione miejsce tych, którzy zbierają żniwa.' +oasis_page_of_libraris_index: + name: '&7Strona Biblioteki Indeks' + lore: + - '&f5 arkuszy do znalezienia,' + - '&f3 przełączniki do przełączenia,' + - '&fdrzwi, które zostaną otwarte' + - '&fa w ich głąb powinniśmy podążyć.' +oasis_page_of_libraris_IV: + name: '&7Strona Biblioteki IV' + lore: + - '&fWyrocznia wiedzy' + - '&fskrywa szokującą niespodziankę' + - '&fz odmętów rozpaczy' + - '&fpowinna powstać błyskawica.' +oasis_page_of_libraris_V: + name: '&7Strona Biblioteki V' + lore: + - '&fJego ostatni sekret' + - '&fon spróbuje ukryć' + - '&fpomimo użycia cienia i marionetek' + - '&faby cię uderzyć jak będziesz kroczył.' +oasis_page_of_plundering_I: + name: '&6Strona Grabieży I' + lore: + - '&eDomy w całym mieście' + - '&eskrywają swoje sekrety raczej ku górze niż w dół.' + - '&eStrzały zaczepne lub lot' + - '&emogą ci pomóc w tej trudnej sytuacji.' +oasis_page_of_sentris: + name: '&1Strona Wartowników' + lore: + - '&bZbroja strażników jest zbyt twarda' + - '&bdzierżąc miecz twoja walka będzie ciężka.' +oasis_page_of_the_pharaoh_I: + name: '&0Strona Faraona I' + lore: + - '&6Ofiara na ołtarzu' + - '&6musi zostać złożona.' + - '&6Ale co powinieneś zaoferować?' + - '&Czerwony piaskowiec da ci wskazówkę.' +oasis_page_of_the_pharaoh_II: + name: '&0Strona Faraona II' + lore: + - '&6Sale faraonów są wyłożone' + - '&6najwspanialszym złotem.' + - '&6To będzie jego zgubą' + - '&6bo ze złota twoje obrażenia obfite będą.' +oasis_page_of_the_pharaoh_III: + name: '&0Strona Faraona III' + lore: + - '&6Ściany Faraonów są wypełnione' + - '&6niebezpieczeństwami i cennymi skarbami.' + - '&6Z południowo-zachodniego rogu pokoju z niebieskimi oknami' + - '&6płyną niesłychanie złowieszcze naciski.' +oasis_page_of_the_pharaoh_index: + name: '&0Strona Faraona Indeks' + lore: + - '&6Faraon jest zapieczętowany' + - '&6w swoim grobie.' + - '&6On leży w oczekiwaniu, bez zakłóceń;' + - '&6jego pułapki będą twoją zgubą.' + - '&63 strony pomogą ci' + - '&6uniknąć przygód.' +oasis_page_of_the_sewer_I: + name: '&0Strona Ścieków I' + lore: + - '&3Istnieje wesz o nietypowym rozmiarze.' + - '&3Jest na celowniku, zobacz swoją nagrodę.' + - '&3Wiele skarbów do znalezienia' + - '&3wszystko, co musisz zrobić, to popływać.' +oasis_page_of_the_sewer_II: + name: '&0Strona Ścieków II' + lore: + - '&3Aktywacja bram jedna po drugiej' + - '&3umożliwi przepływ wody.' + - '&3Płyń w górę, gdy będzie się lać' + - '&3następnie w dół prawidłowego tunelu, musisz się udać.' +oasis_page_of_the_sewer_index: + name: '&0Strona Ścieków Indeks' + lore: + - '&3Zło czai się, gdzie wody odpływają' + - '&3Bądź zawsze czujny, bo chcą zjeść twój mózg!' + - '&3Musisz otworzyć 3 bramy strzeżone przez stworzenia' + - '&3wyłożone czerwonym piaskowcem.' + - '&32 strony poprowadzą cię, nie bój się.' +oasis_page_of_vampiris_I: + name: '&4Strona Wampirów I' + lore: + - '&cDziesiątki broni uderzyły w bestie' + - '&ci każdy cios wytrzymała.' + - '&cNie boi się uderzenia kamienia, złota lub diamentów w najmniejszym stopniu' + - '&cale drży przed drewnem.' +oasis_page_of_vampiris_II: + name: '&4Strona Wampirów II' + lore: + - '&cJeżeli pragniesz zlekceważyć czarnoksiężnika' + - '&cto szykuj się na ciężką walkę!' + - '&cDrugie piętro sprawdzi jak potężny jesteś,' + - '&ca zdobycie go jako pierwsze jest rytuałem.' +oasis_page_of_vampiris_III: + name: '&4Strona Wampirów III' + lore: + - '&cW dół iglicy i do jaskini' + - '&cjest ścieżką odwagi.' + - '&cUważaj na tych, którzy wrócili z grobu,' + - '&czabicie mistrza to rzecz, której potrzebujesz.' +oasis_page_of_vampiris_index: + name: '&4Strona Wampirów Indeks' + lore: + - '&cW obserwatorium' + - '&cczai się stworzenie' + - '&cktóre nigdy nie widziało słońca.' + - '&cZnajdź 4 strony, aby Ci pomogły' + - '&cprzeżyć tą podróż!' +oasis_page_of_vampiris_IV: + name: '&4Strona Wampirów IV' + lore: + - '&cDwie skrzynie łupu,' + - '&ctylko nie obudź zmarłych!' + - '&cJedna pod schodkiem,' + - '&cdruga, gdzie książki mogą być odczytane!' +oasis_pharaohs_feast: + name: '&6Uczta Faraonów' + lore: + - '&eZłote przypomnienie' + - '&eo niegdyś złotym mieście' + - '&euszkodzonym przez piaski czasu.' +oasis_pharaohs_flail: + name: '&0Włócznia Faraona' + lore: + - '&4Włócznia życia pozagrobowego.' +oasis_pick_of_darkness: + name: '&1Wybór Ciemności' + lore: + - '&bŚwieci jasno' + - '&bw cieniach.' +oasis_sunkiller: + name: '&6Zabójca Słońca' + lore: + - '&eCzy ta skała tam' + - '&enie jest czasem dość duża' + - '&eaby się za nią ukryć?' +oasis_tohth: + name: '&8Przygoda Bractwa Oingo Boingo' + lore: + - '&fMoje warunki wstępne są bezwzględne!' + - '&fTo jest los!' +okami_drop_leggings: + name: '&cOkami''s Blessing' + lore: + - '&cSpeed of the wolf.' + - '&cFire protection of a god.' +owl_charm: + name: '&bSowie Skrzydła' + lore: + - '&aZostań jednym z najlepszych' + - '&anocnych predatorów!' +primis_artifexs_shield: + name: '&6Tarcza Artifexa' + lore: + - '&eStary relikt z bardzo' + - '&eniebezpiecznych czasów. Została' + - '&eona przywrócona do swojej chwały!' +primis_caeruleaums_hope: + name: '&9Nadzieja Caeruleauma' + lore: + - '&8Relikt minionej epoki, wciąż wystarzająco' + - '&8ostry by ranić, ale na tyle zardzewiały' + - '&8by trafić do muzeum!' +primis_catacomb_drop_boots: + name: '&7Dark Bone Footgear' + lore: + - '&7Unnaturally dark bones' + - '&7cover these boots.' +primis_catacomb_drop_boots_2: + name: '&7Dark Bone Footgear' + lore: + - '&7Unnaturally dark bones' + - '&7cover these boots.' +primis_catacomb_drop_chestplate: + name: '&7Dark Bone Armor' + lore: + - '&7Bones as dark as the abyss' + - '&7adorn this armor.' + - '&7The arrows will make quite a' + - '&7noise as they bounce off the bones.' +primis_catacomb_drop_chestplate_2: + name: '&7Dark Bone Armor' + lore: + - '&7Bones as dark as the abyss' + - '&7adorn this armor.' + - '&7The arrows will make quite a' + - '&7noise as they bounce off the bones.' +primis_catacomb_drop_leggings: + name: '&7Dark Bone Leggings' + lore: + - '&7The dark bones covering the' + - '&7leggings will make dangerous' + - '&7falls more survivable.' +primis_catacomb_drop_leggings_2: + name: '&7Dark Bone Leggings' + lore: + - '&7The dark bones covering the' + - '&7leggings will make dangerous' + - '&7falls more survivable.' +primis_catacomb_necromancer_drop_helmet: + name: '&5Dark Bone Cowl' + lore: + - '&5The cowl offers little protection,' + - '&5it only seeks blood and death.' +primis_catacomb_necromancer_drop_helmet_2: + name: '&5Dark Bone Cowl' + lore: + - '&5The cowl offers little protection,' + - '&5it only seeks blood and death.' +primis_catacomb_necromancer_drop_sword: + name: '&5Dark Bone Brand' + lore: + - '&5The unnaturally dark bone-brand' + - '&5glistens in the light' + - '&5ready to part anything' + - '&5that stands in it''s way.' +primis_catacomb_necromancer_drop_sword_2: + name: '&5Dark Bone Brand' + lore: + - '&5The dark bone-brand howls' + - '&5viciously with every swing' + - '&5as the air rushes through' + - '&5it''s hollow cavity.' +primis_cooked_rabbit: + name: '&cUpieczony Królik' + lore: + - Huh, czy ten królik się przegrzał? +primis_diving_helmet: + name: '&1Hełm do nurkowania' + lore: + - An old Diving Helmet. + - Still works just fine. +primis_fish_bait: + name: '&2Przynęta na ryby' + lore: + - '&aWygląda na to, że możesz dzięki temu złowić duże ryby.' +primis_gladius_important_documents: + name: '&2Important Documents' + lore: + - '&aThe documents are sealed.' +primis_gladius_lord_promise: + name: '&5Umowa o udzielenie pomocy' + lore: + - '... stąd za pomoc udzieloną podczas tych najcięższych' + - czasów, Pontis Mille obiecuje się odwdzięczyć, gdy Gladius + - będzie się mierzyło z najciemniejszą godziną. +primis_gladius_supplies: + name: '&2Zaopatrzenie' + lore: + - '&aNadaje się do wyżywienia żołnierza podczas wojny.' +primis_gladius_sword: + name: '&5Gladius' + lore: + - '&8Sam symbol Fortecy Gladiusa.' +primis_gladius_the_good_stuff: + name: '&2Dobra Rzecz' + lore: + - '&aPachnie... mocno.' +primis_heirloom: + name: '&2Utracona Pamiątka' + lore: + - '&aWygląda na stare, wręcz starożytne.' +primis_ice_village_alanus_dagger: + name: '&eAlanus'' Dagger' + lore: + - '&eA simple dagger with' + - '&erunes covering the handle.' +primis_ice_village_chains_shipment: + name: '&aShipment of Chains' + lore: + - '&aA lot of chains.' +primis_ice_village_escaped_prisoner_body: + name: '&cUnconcious Body' + lore: + - '&cHeavy.' +primis_ice_village_foot_of_mountain_chest_axe: + name: '&1Dull Frost Axe' + lore: + - '&1Freezing to the touch' +primis_ice_village_island_chest_trident: + name: '&3Magma''s Delight' + lore: + - '&3Those who look, shall find.' +primis_ice_village_living_nightmares_reward_chest: + name: '&3Fur Coat' + lore: + - '&3Made out of the' + - '&3toughest fur around.' +primis_ice_village_magical_ice_crystals: + name: '&1Fur Ice Crystal' + lore: + - Having the crystal near + - snow makes it react. +primis_ice_village_make_them_go_ouch_reward_leggings: + name: '&dViolet''s Spare Leggings' + lore: + - '&dMakes you wanna strut down the' + - '&droad and do some punishment.' +primis_ice_village_salmon: + name: '&2Fresh Salmon' + lore: + - You don't think you saw + - larger salmon in your life. +primis_ice_village_silence_reward_helmet: + name: '&aBoomers Helm' + lore: + - '&aShould handle an explosion or two.' +primis_ice_village_taking_the_bait_reward: + name: '&bNorthern Rod' + lore: + - '&bIt''s a well made fishing rod.' +primis_ice_village_violet_boots: + name: '&dViolet''s Leather Boots' + lore: + - '&dFancy leather boots with' + - '&da raised pointy heel.' +primis_ice_village_violet_leggings: + name: '&dViolet''s Fancy Leggings' + lore: + - '&dTight and slightly see-through' + - '&dwith beautiful flower motives.' +primis_ice_village_violet_whip: + name: '&dViolet''s Whip' + lore: + - '&dDelivers exquisite punishment.' +primis_ice_village_wanna_build_a_snowman_reward_boots: + name: '&3Frost Boots' + lore: + - '&3It''s just frost boots.' +primis_invaders_assassins_bow: + name: '&8Łuk Asassina' + lore: + - '&aDoskonały sposób, aby dać im' + - '&askosztować własnej broni.' +primis_invaders_boots: + name: '&4Buty Najeźdźcy' + lore: + - '&aOne nie pachną zbyt dobrze.' +primis_invaders_bow: + name: '&8Łuk Najeźdźcy' + lore: + - '&aKiedyś zgasił samo Słońce.' +primis_invaders_captains_sword: + name: '&4Miecz Kapitana Najeźdźców' + lore: + - '&aZakrzywiony i źle wyglądający.' +primis_invaders_chestplate: + name: '&4Napierśnik Najeźdźcy' + lore: + - '&aZardzewiały, brzydki i śmierdzący. Świetnie!' +primis_invaders_helmet: + name: '&4Hełm Najeźdźcy' + lore: + - '&aChroni przed wstrząsem mózgu!' +primis_invaders_leggings: + name: '&4Spodnie Najeźdźcy' + lore: + - '&aMożna by je trochę naoliwić.' +primis_invaders_sword: + name: '&4Miecz Najeźdźcy' + lore: + - '&aPodejrzanie ubrudzony krwią.' +primis_lucky_pickaxe: + name: '&6Kilof Pełen Szczęścia' + lore: + - '&eŚwieci jasno, nawet pod ziemią.' + - '&eWidzisz wygrawerowany LL w uchwycie' +primis_monster_slaying_spear: + name: '&8Włócznia Pokonująca Potwory' + lore: + - Zamienia potwory morskie w barbecue. +primis_ogre_boots: + name: '&cButy Ogra' + lore: + - '&7Będzie ci w nich wygodnie' + - '&7i cieplutko.' +primis_ogre_chestplate: + name: '&cNapierśnik Ogra' + lore: + - 'Gorący w dotyku' +primis_ogre_helmet: + name: '&cHełm Ogra' + lore: + - '&7Będziesz pocić się nie kroplami, lecz kulami.' +primis_ogre_leggings: + name: '&cNogawice Ogra' + lore: + - '&7Bardzo luźne.' +primis_ogre_mines_lucky_pickaxe: + name: '&eSzczęśliwy Kilof' + lore: + - '&aSzczęśliwy, ale bezużyteczny.' +primis_ogre_mines_waterworks_chest_shield: + name: '&aSturdy Door' + lore: + - '&aIt''s just a door.' +primis_old_shield: + name: '&8Stara tarcza' + lore: + - '&7Stary relikt z bardzo' + - '&7niebezpiecznych czasów. Ale może zostać' + - '&7chociaż naprawiona...' +primis_pirate_boots: + name: '&4Buty Pirata' + lore: + - '&aTo ma trochę za dużo' + - '&adziur...' +primis_pirate_bow: + name: '&8Łuk Pirata' + lore: + - '&aMoże nie jest pirackim pistoletem, ale' + - '&asię nada!' +primis_pirate_chestplate: + name: '&4Pirate''s Chestplate' + lore: + - '&aZasadniczo zwykła koszulka.' +primis_pirate_helmet: + name: '&4Pirate''s Helmet' + lore: + - '&aMissing an eye-patch.' +primis_pirate_leggings: + name: '&4Spodnie Pirata' + lore: + - '&aFeels like sea legs!' +primis_pirate_sword: + name: '&4Miecz Pirata' + lore: + - '&aZakrzywiony i źle wyglądający.' +primis_pointis_groves_heirloom: + name: '&2Valuable Heirloom' + lore: + - '&aThis is the second one of these that you retrieved.' +primis_pointis_mille_chest_dirty_note: + name: Dirty Note + lore: + - '&fThere was a really cool sword' + - '&fin here but it''s gone now.' +primis_pontis_beast_horn: + name: '&2Blood Drenched Horn' + lore: + - '&fOn closer inspection the horn isn''t' + - '&fcovered in blood but seems to' + - '&fbe made out of it.' + - '&fThe crystallized blood is incredibly sharp.' +primis_pontis_beast_scale: + name: '&2Toxic Fish Scale' + lore: + - '&fThe scale is rock hard on the outside.' + - '&fThe inside is covered in' + - '&ftoxic and acidic ooze.' +primis_pontis_beast_silk: + name: '&2Sun Soaked Silk' + lore: + - '&fThe silk is radiating light and warmth.' +primis_pontis_elf_drop_boots: + name: '&7Elf Boots' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_elf_drop_chestplate: + name: '&7Elf Chest-plate' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_elf_drop_crossbow: + name: '&7Elf Dark-bow' + lore: + - '&7The special projectiles that the bow' + - '&7uses are both sharp and blunt.' +primis_pontis_elf_drop_helmet: + name: '&7Elf Helmet' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_elf_drop_leggings: + name: '&7Elf Leggings' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_fields_berry_charm: + name: '&dLarge Berry' + lore: + - '&dThe fresh odor this berry emits' + - '&dcan be smelled from miles away.' + - '&dThe odor seems to have a calming' + - '&deffect on monsters and beasts.' + - '&dIt makes their attacks less vicious.' +primis_pontis_groves_brood_moher_drop_charm: + name: '&aCrawlers Torment' + lore: + - '&aThe silk radiates strong energy.' +primis_pontis_groves_nest_crawler_drop_shield: + name: '&7Magma''s Lure' + lore: + - '&7When the shield is held up' + - '&7it lures monsters into striking it.' +primis_pontis_groves_spider_boots_reward: + name: '&1Spider-legs Boots' + lore: + - '&1Boots made from spider legs and leather.' +primis_pontis_groves_tree_climbing_elf_bandits_reward_leggings: + name: '&aElf Pearl Leggings' + lore: + - '&aProtective leggings' + - '&aadorned with pearls.' +primis_pontis_mille_arena_knowledge: + name: '&2Knowledge' + lore: + - '&aImportant Knowledge.' +primis_pontis_mille_arena_reward_1: + name: '&4Star Touched Shield' + lore: + - '&7An ornate shield with a cosmos motive.' +primis_pontis_mille_arena_reward_2: + name: '&4Star Touched Chestplate' + lore: + - '&7A thousand tiny spiky stars stretch across the Chestplate.' +primis_pontis_mille_arena_reward_3: + name: '&4Star Touched Leggings' + lore: + - '&7The leggings sparkle like the stars in the sky.' +primis_pontis_mille_cat_quest_reward_charm: + name: '&9Cat''s Blessing' + lore: + - '&9If you hold it up all the' + - '&9way to your ear you can' + - '&9hear a slight purr.' +primis_pontis_mille_counselor_sword: + name: '&eStone of Far-speech' + lore: + - '&aYou can sense a presence coming from the stone.' +primis_pontis_mille_fields_beasts_reward_chest: + name: '&eHunters Pride' + lore: + - '&eThose who hunt cannot be the prey.' +primis_pontis_mille_fields_contest_berry: + name: '&dContest Berry' + lore: + - '&dA beautiful and very large berry.' + - '&dTruly a one in a million specimen.' +primis_pontis_mille_fields_do_it_yourself_reward_bow: + name: '&cHunters Bow' + lore: + - '&cA finely crafted bow.' + - '&cArrows fired from this' + - '&cbow will hurt any beast.' +primis_pontis_mille_fields_first_aid: + name: '&2First Aid Equipment' + lore: + - '&fEverything one would need" - "&fto treat serious injuries.' +primis_pontis_mille_fields_rat_drop_helmet: + name: '&fFeathered Rat Cap' + lore: + - '&fYou managed to make a' + - '&fcap out of your prey.' + - '&fHaving extracted the preys' + - '&fblinding properties, you have made' + - '&fit work in your favor.' +primis_pontis_mille_fields_rat_meat: + name: '&cRat Meat' + lore: + - Raw rat meat. No need to cook. +primis_pontis_mille_fields_stolen_berries: + name: '&4Stolen Berries' + lore: + - '&fIt''s the stolen berries' +primis_pontis_mille_fish_nets: + name: '&2Fish Nets' + lore: + - '&aCatching fish made easy!' +primis_pontis_mille_fresh_rat: + name: '&fFresh Rat' + lore: + - The cat will love this. +primis_pontis_mille_mines_goblined_up_in_the_maze_reward_axe: + name: '&aRuned Goblin Axe' + lore: + - '&aThere are runes etched into the axe handle.' + - '&aThey are quite faded by now.' + - '&aSeems like this axe was cursed at one point...' +primis_pontis_mille_mines_goblin_head: + name: '&2Fowl Goblin Feathers' + lore: + - '&aSo soft and prickly.' +primis_pontis_mille_parkour_reward_boots: + name: '&4Diamond Tree Boots' + lore: + - '&7Boots made out of special soft bark.' + - '&7Decorated with gems.' +primis_pontis_mille_reward_boots: + name: '&4Pontis Mille Boots' + lore: + - '&7Traditional Pontis Mille Boots' +primis_pontis_mille_reward_chest: + name: '&4Pontis Mille Chestplate' + lore: + - '&7A traditional Pontis Mille Chestplate' +primis_pontis_mille_reward_helmet: + name: '&4Pontis Mille Helm' + lore: + - '&7A traditional Pontis Mille Helm' +primis_pontis_mille_reward_leggings: + name: '&4Pontis Mille Leggings' + lore: + - '&7Traditional Pontis Mille Leggings' +primis_pontis_mille_reward_shield: + name: '&4Pontis Mille Shield' + lore: + - '&7A traditional Pontis Mille Shield' +primis_pontis_mille_reward_sword: + name: '&4Pontis Mille Katana' + lore: + - '&7Incredibly sharp' +primis_pontis_mille_serious_sewage_reward_helmet: + name: '&2Turtle Shell Helm' + lore: + - '&2Makes you wanna eat some pizza.' +primis_pontis_mille_sewage_keys: + name: '&2Sewage Keys' + lore: + - '&aA key ring with a lot of keys on it.' +primis_pontis_mille_sewers_ninja_drop_chestplate: + name: '&7Ninja Garb Chest-plate' + lore: + - Now you too are a Ninja +primis_pontis_mille_sewers_ninja_drop_leggings: + name: '&7Ninja Garb Leggings' + lore: + - Now you too are a Ninja +primis_pontis_mille_sewers_shredder_drop: + name: '&4Shredding Helmet' + lore: + - Full of small tiny razor blade + - like points on the exterior. +primis_pontis_mille_slums_chest_sword: + name: '&4Dull Pontis Mille Katana' + lore: + - '&7Incredibly sharp' +primis_pontis_mille_to_lycan_or_not_to_lycan_reward: + name: '&aFur Leggings' + lore: + - '&aTough and light' + - '&aMade out of fur and hide.' +primis_pontis_mines_goblin_drop_boots: + name: '&7Goblin Boots' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_chestplate: + name: '&7Goblin Chest-Plate' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_helmet: + name: '&7Goblin Helmet' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_leggings: + name: '&7Goblin Leggings' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_spear: + name: '&7Goblin Spear' + lore: + - '&7A nice and sharp stone at the end.' +primis_pontis_mines_goblin_drop_sword: + name: '&7Goblin Sword' + lore: + - '&7It''''s just a stone club with a handle.' +primis_pontis_redwoods_nasty_little_bandits_reward_boots: + name: '&2Forest Boots' + lore: + - '&2The boots seem to be made' + - '&2out of soft bark, leaves' + - '&2and crystallized tree sap.' +primis_pontis_redwoods_spider_legs: + name: '&2Spider Legs' + lore: + - '&aIt is just spider legs...' +primis_pontis_redwoods_tobacco: + name: '&2Premium Tobacco' + lore: + - '&aSmells amazing...' +primis_pontis_redwoods_watch: + name: '&2Sturdy Pocket Watch' + lore: + - '&aSuprisingly light and sturdy.' +primis_pontis_redwoods_werewolf_drop_chestplate: + name: '&7Fur Chest-Plate' + lore: + - '&7Made out of tough fur and hide.' + - '&7Light, but very tough.' +primis_roughspun_boots: + name: '&5Szorstkie Buty' + lore: + - '&dZchodzone i zniszczone, nie' + - '&dkonkurują z żadną zbroją!' +primis_roughspun_chestplate: + name: '&5Szorstki Napierśnik' + lore: + - '&dZchodzone i zniszczone, nie' + - '&dkonkurują z żadną zbroją!' +primis_roughspun_helmet: + name: '&5Szorstki Hełm' + lore: + - '&dZchodzone i zniszczone, nie' + - '&dkonkurują z żadną zbroją!' +primis_roughspun_leggings: + name: '&5Szorstkie Spodnie' + lore: + - '&dZchodzone i zniszczone, nie' + - '&dkonkurują z żadną zbroją!' +primis_ruins_bow: + name: '&8Zniszczony łuk' + lore: + - Stary łuk. Może kiedyś był dobry. +primis_ruins_diary_entry: + name: Strona z Dziennika + lore: + - '... Żałuję, że szukałem skarbu w tych ruinach.' + - Teraz, kiedy upadłem i złamałem nogi, wydawałoby się, że + - moim przeznaczeniem jest umrzeć pod skarbem, którego szukałem. + - Gdybym tylko poświęcił więcej uwagi podczas zajęć z parkoura! +primis_ruin_relic_boots: + name: '&bButy Relicznych Ruin' + lore: + - '&6Zakopane w ruinach.' + - '&6Natchnięte starożytną potęgą.' +primis_ruin_relic_chestplate: + name: '&bNapierśnik Relicznych Ruin' + lore: + - '&6Zakopane w ruinach.' + - '&6Natchnięte starożytną potęgą.' +primis_ruin_relic_helmet: + name: '&bHełm Relicznych Ruin' + lore: + - '&6Zakopane w ruinach.' + - '&6Natchnięte starożytną potęgą.' +primis_ruin_relic_leggings: + name: '&bNogawice Relicznych Ruin' + lore: + - '&6Zakopane w ruinach.' + - '&6Natchnięte starożytną potęgą.' +primis_rusty_mail_boots: + name: '&3Zardzewiałe Buty z Kolczugi' + lore: + - '&9Zardzewiałe, ale trwałe i lepsze' + - '&9niż skórzane szmaty!' +primis_rusty_mail_chestplate: + name: '&3Zardzewiały Napierśnik z Kolczugi' + lore: + - '&9Zardzewiałe, ale trwałe i lepsze' + - '&9niż skórzane szmaty!' +primis_rusty_mail_helmet: + name: '&3Prosty Hełm z Kolczugi' + lore: + - '&9Zardzewiałe, ale trwałe i lepsze' + - '&9niż skórzane szmaty!' +primis_rusty_mail_leggings: + name: '&5Proste Spodnie z Kolczugi' + lore: + - '&9Zardzewiałe, ale trwałe i lepsze' + - '&9niż skórzane szmaty!' +primis_starter_boots: + name: '&4Shipwreck''s Boots' + lore: + - '&aTe skórzane skrawki prawie nie liczą się jako zbroja.' +primis_starter_chestplate: + name: '&4Shipwreck''s Chestplate' + lore: + - '&aTe skórzane skrawki prawie nie liczą się jako zbroja.' +primis_starter_helmet: + name: '&4Shipwreck''s Helmet' + lore: + - '&aTe skórzane skrawki prawie nie liczą się jako zbroja.' +primis_starter_leggings: + name: '&4Shipwreck''s Leggings' + lore: + - '&aTe skórzane skrawki prawie nie liczą się jako zbroja.' +primis_starter_sword: + name: '&4Shipwreck''s Sword' + lore: + - '&aPrawdopodobnie zrobiony z plażowych resztek statku!' +primis_storm_temple_drop_axe: + name: '&bStorm Axe' + lore: + - '&bThe wind shall repel them.' +primis_storm_temple_drop_boots: + name: '&bStorm Boots' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_storm_temple_drop_charm: + name: '&bStorm Necklace' + lore: + - '&bThe power of the storm.' +primis_storm_temple_drop_chestplate: + name: '&bStorm Chest-plate' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_storm_temple_drop_helmet: + name: '&bStorm Helmet' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_storm_temple_drop_leggings: + name: '&bStorm Leggings' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_terravilla_big_trouble_in_little_pub_reward_leggings: + name: '&eEarth''s Blessing' + lore: + - '&eLooks heavy but it is' + - '&esurprisingly light.' + - '&eIt is clear that these' + - '&eleggings are at least a' + - '&efew centuries old.' +primis_terravilla_drowning_terror_reward_charm: + name: '&aFish Charm' + lore: + - '&aFishy.' +primis_terravilla_hog_on_my_porch_reward_helmet: + name: '&6Hog Helmet' + lore: + - '&6Made out of tough Razorback leather.' +primis_terravilla_perfect_sample: + name: '&ePerfect Sample' + lore: + - '&eIt looks like a fish...' + - '&eBut it sure isn''t...' +primis_terravilla_strike_the_earth_reward_sword: + name: '&5Earth Splitter' + lore: + - '&5You pulled this blade out of' + - '&5the Earth Elementals corpse.' + - '&5Unlike it''s dull twin, this' + - '&5blade is in pristine condition.' +primis_terravilla_taking_out_the_trash_reward_sword: + name: '&9Earth Splitter' + lore: + - '&9Looks ancient and dull.' +primis_terravilla_two_legged_terror_growth: + name: '&eTwo Legged Terror Growth' + lore: + - '&eLarge fleshy growth.' +primis_terravilla_two_legged_terror_sample: + name: '&eTwo Legged Terror Sample' + lore: + - '&eIt''s a simple sample.' +primis_wolf_hide_boots: + name: '&5Kapcie ze Skóry Wilka' + lore: + - '&dSchodzone i zniszczone, nie' + - '&dkonkurują z żadną zbroją!' +primis_wolf_hide_chestplate: + name: '&5Przeszywanica ze Skóry Wilka' + lore: + - '&dSchodzone i zniszczone, nie' + - '&dkonkurują z żadną zbroją!' +primis_wolf_hide_helmet: + name: '&5Czapka ze Skóry Wilka' + lore: + - '&dSchodzone i zniszczone, nie' + - '&dkonkurują z żadną zbroją!' +primis_wolf_hide_leggings: + name: '&5Spodnie ze Skóry Wilka' + lore: + - '&dSchodzone i zniszczone, nie' + - '&dkonkurują z żadną zbroją!' +pufferfish_drop_helmet: + name: '&bPuffer Helm' + lore: + - '&bOnce a fish, now a helmet.' +rabbit_charm: + name: '&bKrólicza Łapka' + lore: + - 'Dzięki temu talizmanowi' + - '&a każdy cel jest tylko o skok stąd,' + - '&apodrygaj i podskakuj dowoli!' +rabbit_wolf_drop_chestplate: + name: '&6Electrically Charged Chestplate' + lore: + - '&6As long as you don''t mind a' + - '&6casual zap here and there.' +rabbit_wolf_drop_leggings: + name: '&6Flame Licked Leggings' + lore: + - '&6Just lightly scorched.' +regular_hoglin_drop_boots: + name: '&eHog Boots' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_chestplate: + name: '&eHog Armor' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_helmet: + name: '&eHog Hood' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_leggings: + name: '&eHog Leggings' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +rod_of_the_depths: + name: '&3Wędka Głębin' + lore: + - '&3Chcesz dowiedzieć się, skąd' + - '&3 to dostałem? Usiądź młodzieńcze,' + - '&3Mam dla Ciebie opowieść...' +rotting_diver_drop_hoe: + name: '&bDivers Hoe' + lore: + - '&bFound on the Rotting Divers corpse.' +salamander_charm: + name: '&bTalizman Salamandry' + lore: + - 'Prawie tak gorący jak MagmaGuy' + - '&aNowa składanka!' +salty_corpse_drop_helmet: + name: '&aStinky Helm' + lore: + - '&aYou''re not sure why' + - '&ayou decided to pull' + - '&athis off of the corpse.' +scorpion_charm: + name: '&bMedalion Skorpiona' + lore: + - 'Unosi się jak jak motylek,' + - 'Żądlacy jak pszczoła,' + - '&aToksyczny jak ziemniak!' +shulker_charm: + name: '&bAmulet Shulkera' + lore: + - '&aI believe I can fly' + - '&aI believe I can touch the sky' + - 'A ty lecisz ze mną!' +skeleton_knight_drop_helmet: + name: '&fKnights Honor' + lore: + - '&fA knights helmet. Made to last.' +sky_archer_drop_bow: + name: '&aSky Bow' + lore: + - '&aGood for keeping phantoms at bay.' +slowpoke_charm: + name: '&bAmulet Ślamazary' + lore: + - '&aMiejmy nadzieję że nie uderzy' + - '&asamego siebie w zamieszaniu...' +spider_knight_drop_helmet: + name: '&aSmall Helmet' + lore: + - '&aA decent helmet. Maybe, a bit tight.' +stacked_bones_drop_helmet: + name: '&6Skull' + lore: + - '&6Large enough to fit your' + - '&6head inside, so why not.' +summon_merchant_scroll: + name: '&6Zwój Przyzwania Kupca' + lore: + - '&aPokaż mi swoje towary.' + - '&aKliknij prawym przyciskiem myszy aby wejść w interakcje' + - '&aalbo krzyknij &9Jeeves!' +summon_wolf_scroll: + name: '&6Zwój Przyzwania Wilka' + lore: + - '&aPrzyzwij dobrego chłopca' + - '&aktóry pomoże zagryźć ci te Elitarne Potwory!' + - '&aPamiętaj żeby go głaskać!' +super_mite_drop_charm: + name: '&dMite Pearl' + lore: + - '&dWas it worth it...' +air_ship_air_buccaneer_boots: + name: '&5Buty Powietrznego Rozbójnika' + lore: + - '&dPerfekcyjne do nalotów!' +air_ship_air_buccaneer_chestplate: + name: '&5Napierśnik Powietrznego Rozbójnika' + lore: + - '&dPerfekcyjne do nalotów!' +air_ship_air_buccaneer_helmet: + name: '&5Hełm Powietrznego Rozbójnika' + lore: + - '&dPerfekcyjne do nalotów!' +air_ship_air_buccaneer_leggings: + name: '&5Nogawice Powietrznego Rozbójnika' + lore: + - '&dPerfekcyjne do nalotów!' +air_ship_air_pirates_boots: + name: '&5Buty Powietrznego Pirata' + lore: + - '&dPerfekcyjne do nalotów!' +air_ship_air_pirates_chestplate: + name: '&5Napierśnik Powietrznego Pirata' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_helmet: + name: '&5Air Pirate''s Helmet' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_leggings: + name: '&5Air Pirate''s Leggings' + lore: + - '&dPerfect for air raids!' +air_ship_bowsmans_bow: + name: '&2Bowsman''s Bow' + lore: + - '&aDropped by the late' + - '&aairship bowsman!' +air_ship_cannon_powder: + name: '&cCannon Powder' + lore: + - '&8How else are you supposed' + - '&8to light the fuse?' +air_ship_daveys_digger: + name: '&4Davey''s Digger' + lore: + - '&cDavey doesn''t desire downtrodden' + - '&cdunderheads displaying his digger.' +air_ship_quartermasters_whip: + name: '&fQuartermaster''s Whip' + lore: + - '&7The quartermaster has a ' + - '&7schedule to keep.' +air_ship_wayfinders_windlass: + name: '&3Wayfinder''s Windlass' + lore: + - '&bUsed to guide ships' + - '&bwith nothing but the stars!' +pirate_ship_sea_feast: + name: '&6Sea feast' + lore: + - '&6A feast for the eyes' + - '&6and the health bar!' +pirate_ship_sea_ration: + name: '&eSea ration' + lore: + - '&eAn apple a day' + - '&ekeep the scurvy away' + - '&cNote: it does not' +catacombs_tier_10_miniboss_boots: + name: '&9Spiderweave boots' + lore: + - '&5As light as air!' +catacombs_tier_10_miniboss_spider_eye: + name: '&7Terragog''s eye' + lore: + - '&7Whispers from nowhere reach' + - '&7your ears while holding this...' +catacombs_tier_15_boss_bone: + name: The Picker + lore: + - '&fYou''ve got a bone to pick!' +catacombs_tier_15_boss_bow: + name: '&6The Bone Shaker' + lore: + - '&fThey''ll feel this one down to' + - '&ftheir bones!' +catacombs_tier_15_boss_shovel: + name: '&8Gravedigger' + lore: + - '&fThey''ll feel this one down to' + - '&ftheir bones!' +catacombs_tier_15_mimic_boss_shield: + name: '&3Shield of the lost Templar' + lore: + - Found in a mysterious chest in a + - secret room of ancient catacombs... +colosseum_pit_breaker: + name: '&4Pit Shatterer' + lore: + - '&4Veni' +colosseum_pit_filler: + name: '&4&lPit Filler' + lore: + - '&4Vici' +colosseum_pit_maker: + name: '&4&lPit Maker' + lore: + - '&4Vidi' +dark_cathedral_tier_75_sword: + name: '&0Cursed Sword' + lore: + - '&0&kChtulhu is the one true God.' + - '&0&kThis world is but a lamb' + - '&0&kto the slaughter' +darkspire_arzags_boots: + name: '&8Arzag''s War Boots' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_chestplate: + name: '&8Arzag''s War Chestplate' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_helmet: + name: '&8Arzag''s War Helmet' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_leggings: + name: '&8Arzag''s War Leggings' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_slicer: + name: '&8Arzag''s Slicer' + lore: + - '&7Once used by the might Arzag!' +darkspire_crypt_keepers_boots: + name: '&4Crypt Keeper''s Boots' + lore: + - '&cFormerly the boots of the' + - '&ccorrupt Crypt Keeper!' +darkspire_hellraisers_battle_armor: + name: '&4Eerbix''s Battle Armor' + lore: + - '&cFormerly the battle' + - '&carmor of the egregious' + - '&cEerbix the Fallen!' +darkspire_maalkvs_bow: + name: '&4Maalkv''s Bow' + lore: + - '&cFormerly the bow of the' + - '&cmischievous Maalkv!' +darkspire_netherite_axe: + name: '&8Patroszarka Pustki' + lore: + - '&8Odłamki samej pustki były' + - 'zebrane w celu uformowania rozszczepu' + - '&8head of this ancient weapon.' +darkspire_nicolas_ribcages_helmet: + name: '&4Nicolas Ribcage''s Helmet' + lore: + - '&cFormerly the helmet of the' + - '&cnefarious Nicolas Ribcage!' +darkspire_oroxaks_sword: + name: '&4Oroxak''s Sword' + lore: + - '&cFormerly the sword of the' + - '&codious Oroxak!' +darkspire_zalmurs_leggings: + name: '&4Zalmur''s Leggings' + lore: + - '&cFormerly the leggings of' + - '&cthe zealous Zalmur' + - '&cthe Impslayer!' +the_feller: + name: '&2Ziomeczek' + lore: + - '&aNawet gdy śpisz' + - '&amożesz poczuć' + - '&apodniecienie tej siekiery' +the_great_weaver_drop_charm: + name: '&cWeavers Silk' + lore: + - '&cGreat power is imbued into this silk.' +hallosseum_amazing_treat: + name: '&aAmazing Treat!' + lore: + - '&eAn amazing snack!' +hallosseum_axe_of_beheadings: + name: '&cAxe of Beheadings' + lore: + - '&4Famously used to decapitate a' + - '&4certain headless horseman!' +hallosseum_incredible_treat: + name: '&aIncredible Treat!' + lore: + - '&eAn incredible snack!' +hallosseum_treat: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +hallosseum_treat_v2: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +the_hunter_drop_crossbow: + name: '&aHunter''s Friend' + lore: + - '&aLet the hunt begin.' +northpole_amazing_treat: + name: '&aAmazing Treat!' + lore: + - '&eAn amazing snack!' +northpole_coalbringer: + name: '&8Coalbringer' + lore: + - '&cWhatever I touch' + - '&cStarts to melt in my clutch.' + - '&cI''m too much!' +northpole_frostcaster: + name: '&bFrostcaster' + lore: + - '&7Whatever I touch' + - '&7Turns to snow in my clutch!' + - '&7I''m too much' +northpole_incredible_treat: + name: '&aIncredible Treat!' + lore: + - '&eAn incredible snack!' +northpole_naughty_lister: + name: '&4The Naughty Lister' + lore: + - '&cTakes names. Doesn''t ask twice!' + - '&cHave you been naughty this year?' +northpole_treat: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +northpole_treat_v2: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +the_phantom_drop_chestplate: + name: '&dPhantom Gambison' + lore: + - '&dYou would say it is made out of soft' + - '&dand comfy fibrous cloth, but a blade' + - '&dwould not recoil from striking cloth.' +pirate_ship_tier_15_boots: + name: Pirate Sandals + lore: + - Make you want to + - go to the beach! +pirate_ship_tier_15_bow: + name: Pirate shortbow + lore: + - Perfect for boarding parties! +pirate_ship_tier_15_chestplate: + name: Pirate Shirt + lore: + - No shoes, no shirt + - no problem! +pirate_ship_tier_15_helmet: + name: Pirate Bandana + lore: + - No shoes, no shirt + - no problem! +pirate_ship_tier_15_leggings: + name: Pirate Sash + lore: + - These could use a wash! +pirate_ship_tier_15_sword: + name: Pirate marlinspike + lore: + - Loud and deadly! +pirate_ship_tier_20_miniboss_axe: + name: '&5Cookie''s Tenderizer' + lore: + - '&5You''ll feel that tomorrow!' +pirate_ship_tier_20_miniboss_chestplate: + name: '&5Cookie''s apron' + lore: + - '&5Has seen better days!' +pirate_ship_tier_25_boots: + name: '&aPirate shoes' + lore: + - '&aPerfect for thieving!' +pirate_ship_tier_25_bow: + name: '&aPirate musket' + lore: + - '&aCareful where you point it!' +pirate_ship_tier_25_chestplate: + name: '&aPirate vest' + lore: + - '&aProbably illegally obtained!' +pirate_ship_tier_25_helmet: + name: '&aPirate earrings' + lore: + - '&aWorth enough to pay for' + - '&aa funeral!' +pirate_ship_tier_25_leggings: + name: '&aPirate trousers' + lore: + - '&aFull of gold coins!' +pirate_ship_tier_25_miniboss_helmet: + name: '&5Helmsman''s Eyepatch' + lore: + - '&5How can you see better' + - '&5with it on!?' +pirate_ship_tier_25_miniboss_trident: + name: '&5Helmsman''s Trident' + lore: + - '&5Pointy end towards the enemy!' +pirate_ship_tier_25_sword: + name: '&aPirate cutlass' + lore: + - '&aTruly piratey!' +pirate_ship_tier_30_miniboss_axe: + name: '&5Crushy''s Chopper' + lore: + - '&5Step back!' +pirate_ship_tier_30_miniboss_shield: + name: '&5Crushy''s Shoulder' + lore: + - '&5Never skipped shoulder day!' +pirate_ship_tier_35_boots: + name: '&9Pirate boots' + lore: + - '&9Perfect for swashbuckling!' +pirate_ship_tier_35_bow: + name: '&9Pirate handcannon' + lore: + - '&9Blast em away!' +pirate_ship_tier_35_chestplate: + name: '&9Pirate straps' + lore: + - '&9Perfect for looting!' +pirate_ship_tier_35_helmet: + name: '&9Pirate eyepatch' + lore: + - '&9Not perfect for seeing!' +pirate_ship_tier_35_leggings: + name: '&9Pirate greaves' + lore: + - '&9Perfect for looting!' +pirate_ship_tier_35_miniboss_boots: + name: '&9Bodyguard''s boots' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_chestplate: + name: '&5Bodyguard''s straps' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_crossbow: + name: '&5Bodyguard''s handcannon' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_helmet: + name: '&5Bodyguard''s eyepatch' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_leggings: + name: '&5Bodyguard''s greaves' + lore: + - '&9For those with something to defend!' +pirate_ship_tier_35_miniboss_sword: + name: '&5Bodyguard''s cutlass' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_sword: + name: '&9Pirate cutlass' + lore: + - '&9Truly piratey!' +pirate_ship_tier_40_miniboss_crossbow: + name: '&5The Blunderbuss' + lore: + - '&5Spray ''n pray!' +pirate_ship_tier_40_miniboss_leggings: + name: '&5The Zaggers' + lore: + - '&5When they think you''re going!' + - '&5to zig, zag on them!' +pirate_ship_tier_45_boss_helmet: + name: '&5Captain''s eyepatch' + lore: + - '&5I don''t see any issues!' +pirate_ship_tier_45_boss_sword: + name: '&5Captain''s scimitar' + lore: + - '&5En garde, ye scurvy rats!' +the_ruins_boss_loot: + name: '&6Thor''s Axe' + lore: + - Only the pure of heart + - can wield this axe. +sewer_drowned_kings_boots: + name: '&4Drowned King''s Boots' + lore: + - '&cFormerly the boots of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_chestplate: + name: '&4Drowned King''s Chestplate' + lore: + - '&cFormerly the chestplate of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_crown: + name: '&4Drowned King''s Crown' + lore: + - '&cFormerly the crown of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_leggings: + name: '&4Drowned King''s Leggings' + lore: + - '&cFormerly the leggings of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_trident: + name: '&4Drowned King''s Trident' + lore: + - '&cFormerly the trident of the' + - '&cdevilish Drowned King!' +sewer_spelunkers_boots: + name: '&2Sewer Spelunker''s Boots' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential leggings!' +sewer_spelunkers_chestplate: + name: '&2Sewer Spelunker''s Chestplate' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential chestplate!' +sewer_spelunkers_helmet: + name: '&2Sewer Spelunker''s Helmet' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential helmet!' +sewer_spelunkers_leggings: + name: '&2Sewer Spelunker''s Leggings' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential leggings!' +sewer_spelunkers_sword: + name: '&2Sewer Spelunker''s Sword' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential sword!' +the_stinger: + name: '&eThe Stinger' + lore: + - 'Unosi się jak jak motylek,' + - '&asting like a bee!' +tree_defender_drop_shield: + name: '&7Living Wood Shield' + lore: + - '&7This shield will' + - '&7slowly repair itself.' +unbind_scroll: + name: '&5Zwój rozłączenia' + lore: + - '&5Pozwala użytkownikom odłączyć jeden' + - '&5przedmiot związany z duchem w kowadle!' + - '&5Użyj rozsądnie!' +undead_farmer_drop_shovel: + name: '&8Manure Master' + lore: + - '&8Perfect for shoveling pig manure.' +unwanted_visitor_drop_bow: + name: '&1Frost Bow' + lore: + - '&9Makes you wanna chill' + - '&9and snipe from afar.' +vampire_manor_gargoyle_granulator: + name: '&8Gargoyle Granulator' + lore: + - '&cLightly dusted in garlic.' +vampire_manor_stake_your_claim: + name: '&4Stake your Claim' + lore: + - '&cLightly dusted in garlic.' +vampiric_charm: + name: '&bWampirzy talizman' + lore: + - '&aNikt nie wie gdzie' + - '&azostał znaleziony, lecz nikt' + - '&azapomina o tym jaki jest groźny...' +veterans_boots: + name: '&6Veteran''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_chestplate: + name: '&6Veteran''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_helmet: + name: '&6Veteran''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_leggings: + name: '&6Veteran''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_sword: + name: '&6Veteran''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +vex_top_drop_boots: + name: '&bVexed Boots' + lore: + - '&bWith mighty boots' + - '&bcomes mighty strength.' +warlock_drop_chestplate: + name: '&dWarlock Robes' + lore: + - '&dOffers good protection from spells.' +warlock_drop_helmet: + name: '&dWarlock Hood' + lore: + - '&dOffers good protection from spells.' +water_pest_drop_shield: + name: '&bWater Logged Shield' + lore: + - '&bIt''s pretty sturdy actually.' +wendigo_drop_sword: + name: '&8Blade of Starving' + lore: + - '&8This blade will always' + - '&8hunger for more blood.' +werehare_drop_charm: + name: '&eWerehare Trophy' + lore: + - '&eLuck and health to' + - 'ðose who carry it.' +werewolf_bone: + name: '&6Werewolf Bone' + lore: + - '&aHaving killed the alpha,' + - '&athis temporarily makes you!' + - '&athe wolves'' new leader' +wolfsbane: + name: '&7Wolfsbane' + lore: + - '&aWykonane z resztek' + - '&ato alfa wilkołak, wszyscy' + - '&awilki kulą się na jego widok.' +yeti_drop_leggings: + name: '&eFur Leggings' + lore: + - '&eNice and warm.' +yezhi_baba_drop_boots: + name: '&aWitches Robes' + lore: + - '&aThe smell should go' + - '&aaway eventually.' +zombie_kings_axe: + name: '&4Siekiera Króla Zombie' + lore: + - Siekiera dzierżona przez Zombie + - zwącego się ich królem. + - Żądza krwi jest niemal namacalna. +airship_minidungeon: + name: '&6Sterowiec' + customInfo: + - '&fNiesamowity sterowiec pełen nieumarłych piratów!' + - '&6Credits: MagmaGuy, 69OzCanOfBepis' + - '&6i Realm of Lotheridon' + playerInfo: |- + Poziom Trudności: &6Średni + Liczba Bossów $bossCount, od poziomu $lowestTier do $highestTier + &6&fNiesamowity sterowiec pełen nieumarłych piratów + &6dla doświadczonych graczy! + regionEnterMessage: '&8[EM] &cWkroczyłeś do wrogiej strefy powietrznej!' + regionLeaveMessage: '&8[EM] &cOpuszczasz teren wrogiej strefy!' +binder_of_worlds_lair: + name: '&5Binder Of Worlds' + customInfo: + - '&5Najlepsze wyzwanie. Bądź gotowy!' + - '&6Twórcy: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Trudność: &6Koszmar + $bossCount finałowych Bossów poziomu $highestTier! + &5To najtrudniejsza walka w EliteMobs! + regionEnterMessage: '&8[EM] &5Rzeczywistość pojawia się wokół Ciebie. Spotkasz się z ostatnim wyzwaniem. &4Nie jesteś gotowy!' + regionLeaveMessage: '&8[EM] &5Opuściłeś/aś Rozplątanie Światów. Czy znalazłeś/aś to, czego szukałeś? Czy było to warte?' +catacombs_lair: + name: '&8The Catacombs' + customInfo: + - '&fNajlepszy wybór dla początkujących graczy!' + - '&6Credits: Realm of Lotheridon' + playerInfo: |- + Difficulty: &cHard + $bossCount bosses, from tier $lowestTier to $highestTier + &2The best Lair challenge for groups of beginners! + regionEnterMessage: '&8[EM] &8Wchodzisz na teren katakumb. Bądź czujny przed tym co czai się poniżej...' + regionLeaveMessage: '&8[EM] &8Opuszczasz Katakumby. Czy było warto?' +colosseum_lair: + name: '&6Koloseum' + customInfo: + - '&fZawierająca pierwszego prawdziwego WorldBossa, pierwszy' + - '&fboss z wierzchowcem oraz wielofazową walką,' + - '&fpierwszy boss z przebraniem... prawdziwie epicka walka!' + - '&6Credits: MagmaGuy & Maldini' + playerInfo: |- + Difficulty: &cHard + $bossCount bosses, from level $lowestTier to $highestTier + &cA true challenge for big groups of players! + regionEnterMessage: '&8[EM] &6Czempioni i pretendeci na stanowiska! &eDowiedźcie swojej wartości przeciwko najpotężniejszym wrogom!' + regionLeaveMessage: '&8[EM] &6Bywa wędrowcze! &eWróć niebawem aby pokazać swoją potęgę raz jeszcze!' +dark_cathedral_lair: + name: '&8Mroczna Katedra' + customInfo: + - '&fPierwszy w historii EliteMobs dungeon!' + - '&fKlasyk, którego potrzeba na każdym serwerze!' + - '&6Twórcy: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &cHard + $bossCount level $highestTier Big Boss! + &cThe original minidungeon, a challenge for + &ca group of players or for veterans! + regionEnterMessage: '&8[EM] &8Witajcie w Mrocznej Katedrze. &4Śmierć już czeka w środku...' + regionLeaveMessage: '&8[EM] &8Opuszczasz Mroczną Katedrę. &4Oczekujemy twego powrotu...' +dark_spire_minidungeon: + name: '&8Piekielna Iglica' + customInfo: + - '&fPiewszy wysoko poziomy kontent!' + - '&fStworzony dla tych którzy chcą prawdziwych wyzwań!' + - '&6Credits: 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &cA vast challenge for advanced players! + regionEnterMessage: '&8[EM] &1Trwa inwazja. &9Zatrzymaj ją i powstrzymaj powstanie!' + regionLeaveMessage: '&8[EM] &1Udało ci się ich powstrzymać. &9Na teraz...' +fireworks_lair: + name: '&aFireworks' + customInfo: + - '&fThe 2021 4th of July map!' + - '&6Credits: MagmaGuy' + playerInfo: |- + Difficulty: &cHard + $bossCount level $lowestTier Big Boss! + &6An encounter full of explosions! + regionEnterMessage: '&8[EM] &eWelcome to the fireworks show!' + regionLeaveMessage: '&8[EM] &eYou''ve left the party!' +frost_palace_sanctum: + name: Frost Palace + customInfo: + - '&fA 7 phase fight against' + - the queen of ice! + - '&6Credits: MagmaGuy, Delio' + playerInfo: 'Difficulty: &45-man hard content!' + regionEnterMessage: '&bYou are stepping into the Frost Palace! Stay frosty!' + regionLeaveMessage: '&bYou have left the Frost Palace!' +hallosseum_lair: + name: '&cHallosseum' + customInfo: + - '&fStraszna Halloweenowa mapa z 2020!' + - '&6Twórcy: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &chard + $bossCount level $lowestTier Big Boss! + &6A fun Halloween challenge! + regionEnterMessage: '&8[EM] &4Cukierek albo psikus! &8Twoja dusza należy do MNIE!' + regionLeaveMessage: '&8[EM] &4Udało ci się uciec z twoją duszą w całości.' +invasion_minidungeon: + name: '&2The Invasion' + customInfo: + - '&fThe Halloween Minidungeon!' + - '&6Twórcy: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount aliens, from level $lowestTier to $highestTier + &6Don't get abducted! + regionEnterMessage: '&8[EM] &7Alien invasion in progress! Defeat the Mothership!' + regionLeaveMessage: '&8[EM] &7You have escaped the alien abductions! No one will ever believe you.' +north_pole_minidungeon: + name: '&9The North Pole' + customInfo: + - '&fŚwiąteczny minidungeon!' + - '&6Twórcy: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Poziom Trudnośc: &6Średni + Liczba Bossów $bossCount, od poziomu $lowestTier do $highestTier + &6Gwiazdka w świątecznej kuli! + regionEnterMessage: '&8[EM] &7Dotarłeś do Bieguna Północnego! &fByłeś grzeczny w tym roku?' + regionLeaveMessage: '&8[EM] &7Chodź, wróć i zobacz. &fMamy ciągle mnóstwo słodyczy i prezentów na następny raz raz!' +oasis_adventure: + name: '&6Oaza' + customInfo: + - '&fWielka przygoda dla początkujących!' + - '&6Credits: 69OzCanOfBepis' + playerInfo: |- + Difficulty: &2Solo-able + $bossCount bosses, from level $lowestTier to $highestTier + &6A big adventure for people who know the ropes! + regionEnterMessage: '&8[EM] &6Udało ci się dotrzeć do Oazy!' + regionLeaveMessage: '&8[EM] &6Opuszczasz Oaze!' +pirate_ship_minidungeon: + name: '&6Piracki Statek' + customInfo: + - '&fPrzyjemny acz wyzywający minidungeon pełen' + - '&fbosów stworzonych dla graczy starających się zdobyć doświadczenie' + - '&fw EliteMobsach!' + - '&6Credits: MagmaGuy & Realm of Lotheridon' + playerInfo: |- + Poziom Trudności: &6Średni + Liczba Bossów $bossCount, od poziomu $lowestTier do $highestTier + &6Jedne z najlepszych spotów dla &6aspirujących poszukiwaczy przygód! + regionEnterMessage: '&8[EM] &3Wchodzisz na podkład pirackiego statku! &bGrab i łup co ile dusza zapragnie. ARrrr!' + regionLeaveMessage: '&8[EM] &3Gracz za burtą! &bWróć gdy nauczysz się nauczysz chodzić po statku ty Szczurze Lądowy!' +primis_adventure: + name: '&7Primis' + customInfo: + - '&fPrzygoda stanowiąca samouczek dla nowych graczy!' + - '&6Credits: 69OzCanOfBepis, MagmaGuy' + playerInfo: |- + Poziom Trudności: &2Łatwy + Liczba Bossów: $bossCount, od levela $lowestTier do $highestTier + &6Świat stanowiący samouczek dla nowych graczy! + regionEnterMessage: '&8[EM] &6Primis czeka, pora wyruszyć w przygodę!' + regionLeaveMessage: '&8[EM] &6Opuściłeś Primis!' +sewers_minidungeon: + name: '&8Kanały' + customInfo: + - '&fNajwiększy minidungeon jaki zrobiliśmy!' + - '&6Twórcy: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Poziom Trudności: &6Średni + Liczba Bossów $bossCount, od poziomu $lowestTier do $highestTier + &6Skomplikowany labirynt z wieloma wyzwaniami! + regionEnterMessage: '&8[EM] &5To miejsce wygląda na opuszczone... &dJednak wygląda jak by coś kryło się w kanałach!' + regionLeaveMessage: '&8[EM] &5Udało ci się wypłynąć. &dMoże następnym razem utoniesz.' +the_ruins: + name: '&6The Ruins' + customInfo: + - '&fA fight against a myth from' + - '&fNorse mythology, be prepared for a smiting!' + - '&6Credits: 69OzCanOfBepis, MagmaGuy' + playerInfo: |- + Difficulty: &cHard + $bossCount level $lowestTier Big Boss! + &cA tough fight against a Norse god! + regionEnterMessage: '&8[EM] &3Those who challenge the myths must be prepared for their downfall!' + regionLeaveMessage: '&8[EM] &3You now know what it takes to make a legend!' +vampire_manor: + name: '&cThe Vampire Manor' + customInfo: + - '&fPrepare to spill blood!' + - '&6Credits: MagmaGuy, 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &6A deadly manor full of blood thristy creatures! + &6Are you ready to face that which haunts the night? + regionEnterMessage: '&8[EM] &cTrespassing on dangerous grounds!!' + regionLeaveMessage: '&8[EM] &cNow leaving haunted land!' +alpha_werewolf_p1: + name: '$eventBossLevel &7Enraged Vindicator' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Alpha Wolf has been put down!' + - '&c&l Najwięcej obrażeń zadał: $damager1name &cz ilością $damager1damage obrażeń!' + - '&6&l Drugim graczem pod względem obrażeń jest: $damager2name&6, który zadał aż $damager2damage obrażeń!' + - '&e&l Trzecim graczem pod względem obrażeń jest: $damager3name&6, który zadał $damager3damage obrażeń!' + - '&aPogromcy: $players' + - '&e&l---------------------------------------------' + locationMessage: '&7Enraged Vindicator: $distance blocks away!' + spawnMessage: '&cThe howls of an Alpha Werewolf are heard!' + deathMessage: '&aThe Alpha Werewolf has been stopped by $players!' + escapeMessage: '&4Dawn breaks, the Alpha Wolf vanishes without a trace!' +alpha_werewolf_p2: + name: '$eventBossLevel &7Alpha Werewolf' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Alpha Wolf has been put down!' + - '&c&l Najwięcej obrażeń zadał: $damager1name &cz ilością $damager1damage obrażeń!' + - '&6&l Drugim graczem pod względem obrażeń jest: $damager2name&6, który zadał aż $damager2damage obrażeń!' + - '&e&l Trzecim graczem pod względem obrażeń jest: $damager3name&6, który zadał $damager3damage obrażeń!' + - '&aPogromcy: $players' + - '&e&l---------------------------------------------' + locationMessage: '&7Alpha Wolf: $distance blocks away!' + spawnMessage: '&cThe howls of an Alpha Werewolf are heard!' + deathMessage: '&aThe Alpha Werewolf has been stopped by $players!' + escapeMessage: '&4Dawn breaks, the Alpha Wolf vanishes without a trace!' +ancient_corpse: + name: '$eventBossLevel &eAncient Corpse' +animated_armor: + name: '$eventBossLevel &8Animated Armor' + locationMessage: '&cAnimated Armor: $distance blocks away!' + spawnMessage: '&cOh no! An Animated Armor has escape from it''s armor stand!' + deathMessage: '&aThe Animated Armor was stopped by $players!' + escapeMessage: '&4The Animated Armor is gone!' +arachnid_matriarch: + name: '$eventBossLevel &cArachnid Matriarch' + locationMessage: '&cArachnid Matriarch: $distance blocks away!' + spawnMessage: '&cA Matriarch has come to spread her brood across the land!' + deathMessage: '&aThe Matriarch and her brood were stopped by $players!' + escapeMessage: '&4The Matriarch has left!' +arachnid_matriarch_summon: + name: '$eventBossLevel &4Broodling' +armor_goblin: + name: '$eventBossLevel &3Armor Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Armor Goblin has been pillaged!' + - '&c&l Najwięcej obrażeń zadał: $damager1name &cz ilością $damager1damage obrażeń!' + - '&6&l Drugim graczem pod względem obrażeń jest: $damager2name&6, który zadał aż $damager2damage obrażeń!' + - '&e&l Trzecim graczem pod względem obrażeń jest: $damager3name&6, który zadał $damager3damage obrażeń!' + - '&aPogromcy: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cArmor Goblin: $distance blocks away!' + spawnMessage: '&cAn Armor Goblin has been sighted!' + deathMessage: '&aAn Armor Goblin has been slain by $players!' + escapeMessage: '&4An Armor Goblin has escaped!' +baba_rhoga: + name: '$eventBossLevel &cBaba Rhoga' + locationMessage: '&cBaba Rhoga: $distance blocks away!' + spawnMessage: '&cA wicked hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +baba_rhoga_summon: + name: '$reinforcementLevel &4Baba Rhoga' +baba_yaga: + name: '$eventBossLevel &cBaba Yaga' + locationMessage: '&cBaba Yaga: $distance blocks away!' + spawnMessage: '&cA wicked hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +baba_yaga_summon: + name: '$reinforcementLevel &4Baba Yaga' +balloon_rider: + name: '$eventBossLevel &dBalloon Rider' + locationMessage: '&cBalloon Rider: $distance blocks away!' + spawnMessage: '&cA brave Balloon Rider has come to the Nether!' + deathMessage: '&aThe Balloon Rider has taken his last ride thanks to $players!' + escapeMessage: '&4The Balloon Rider has floated away!' +balloon_rider_mount: + name: '$eventBossLevel &5Ghastly Balloon' +balrog: + name: '$eventBossLevel &4Balrog' +banshee: + name: '$eventBossLevel &cBanshee' + locationMessage: '&cBanshee: $distance blocks away!' + spawnMessage: '&cA Banshee''s wail can be heard!' + deathMessage: '&aThe Banshee was silenced by $players!' + escapeMessage: '&4The Banshee has left!' +banshee_summon: + name: '$eventBossLevel &cGrief' +beast_master: + name: '$eventBossLevel &6Beast Master' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Beast Master has been savaged!' + - '&c&l Najwięcej obrażeń zadał: $damager1name &cz ilością $damager1damage obrażeń!' + - '&6&l Drugim graczem pod względem obrażeń jest: $damager2name&6, który zadał aż $damager2damage obrażeń!' + - '&e&l Trzecim graczem pod względem obrażeń jest: $damager3name&6, który zadał $damager3damage obrażeń!' + - '&aPogromcy: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cBeast Master: $distance blocks away!' + spawnMessage: '&cThe Beast Master has been sighted!' + deathMessage: '&aThe Best Master has been slain by $players!' + escapeMessage: '&4The Beast Master has returned to the wilds!' +beast_tamer: + name: '$eventBossLevel &eBeast Tamer' + locationMessage: '&cBeast Tamer: $distance blocks away!' + spawnMessage: '&cA master of beasts roams the world!' + deathMessage: '&aThe Beast Tamer was stopped by $players!' + escapeMessage: '&4The Beast Tamer has left!' +beast_tamer_summon: + name: '$eventBossLevel &6Large Beast' +beast_tamer_summon_1: + name: '$eventBossLevel &6Beast' +beta_wolf: + name: '$reinforcementLevel &7Beta Wolf' +bigfoot: + name: '$eventBossLevel &fBigfoot' + locationMessage: '&cBigfoot: $distance blocks away!' + spawnMessage: '&cA mighty beast has appeared!' + deathMessage: '&aThe beast is no more thanks to $players!.' + escapeMessage: '&4The beast has escaped!' +big_bad_wolf: + name: '$eventBossLevel &fBig Bad Wolf' + locationMessage: '&cBig Bad Wolf: $distance blocks away!' + spawnMessage: '&cAnd he huffed and he puffed!' + deathMessage: '&aThe little piggies are now safe thanks to $players!' + escapeMessage: '&4The Big Bad Wolf has left!' +binder_of_worlds_phase_1_endermite_reinforcement: + name: '$reinforcementLevel &5Skażający Rzeczywistość' +binder_of_worlds_phase_3_enderman_reinforcement: + name: '$reinforcementLevel &5Pogromca Rzeczywistości' +binder_of_worlds_phase_3_ghast_reinforcement: + name: '$reinforcementLevel &5Strzępiciel Rzeczywistości' +blayyze: + name: '$eventBossLevel &6Blayyze' + deathMessages: + - '&e&l---------------------------------------------' + - '&6Blayyze został pokonany!' + - '&c&l Najwięcej obrażeń zadał: $damager1name &cz ilością $damager1damage obrażeń!' + - '&6&l Drugim graczem pod względem obrażeń jest: $damager2name&6, który zadał aż $damager2damage obrażeń!' + - '&e&l Trzecim graczem pod względem obrażeń jest: $damager3name&6, który zadał $damager3damage obrażeń!' + - '&aPogromcy: $players' + - '&e&l---------------------------------------------' + locationMessage: '&6????: $distance bloków od Ciebie' + spawnMessage: '&cCoś wyszło z krateru po meteorycie...' + deathMessage: '&6$players dokonał pierwszego kontaktu.' + escapeMessage: '&6Kosmici zostali zabrani do areny 51!' +bloated_jeffrey: + name: '$eventBossLevel &dBloated Jeffrey' + locationMessage: '&cBloated Jeffrey: $distance blocks away!' + spawnMessage: '&cIt''s Jeffrey! They are in the nether! Bring a bow!' + deathMessage: '&aBloated Jeffrey has been slain by $players!' + escapeMessage: '&4Jeffrey and his friends grew bored and they left!' +bloated_jeffrey_summon: + name: '$eventBossLevel &dJeffrey''s Friend' +bone_fiend: + name: '$eventBossLevel &7Bone Fiend' + locationMessage: '&cBone Fiend: $distance blocks away!' + spawnMessage: '&cA creature of bone and bone has appeared!' + deathMessage: '&aThe Bone Fiend was defeated by $players!' + escapeMessage: '&4The Bone Fiend found no bone and left!' +bone_fiend_mount: + name: '$eventBossLevel &8Bone Carrier' +changeling: + name: '$eventBossLevel &4Changeling' + locationMessage: '&cChangeling: $distance blocks away!' + spawnMessage: '&cA shape-shifter has entered this world.' + deathMessage: '&aThe Changeling was stopped by $players!' + escapeMessage: '&4The Changeling has escaped!' +changeling_p2: + name: '$eventBossLevel &4Changeling' +changeling_p3: + name: '$eventBossLevel &4Changeling' +changeling_p4: + name: '$eventBossLevel &4Changeling' +changeling_p5: + name: '$eventBossLevel &4Changeling' +changeling_p6: + name: '$eventBossLevel &4Changeling' +changeling_p7: + name: '$eventBossLevel &4Changeling' +charms_goblin: + name: '$eventBossLevel &2Charms Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Charms Goblin has been pillaged!' + - '&c&l Najwięcej obrażeń zadał: $damager1name &cz ilością $damager1damage obrażeń!' + - '&6&l Drugim graczem pod względem obrażeń jest: $damager2name&6, który zadał aż $damager2damage obrażeń!' + - '&e&l Trzecim graczem pod względem obrażeń jest: $damager3name&6, który zadał $damager3damage obrażeń!' + - '&aPogromcy: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cCharms Goblin: $distance blocks away!' + spawnMessage: '&cA Charms Goblin has been sighted!' + deathMessage: '&aA Charms Goblin has been slain by $players!' + escapeMessage: '&4A Charms Goblin has escaped!' +circus_ringmaster: + name: '$eventBossLevel &dRingmaster' + locationMessage: '&cCircus Ringmaster: $distance blocks away!' + spawnMessage: '&cA terrible circus is in town!' + deathMessage: '&a$players has stopped the RIngmasters reign of abuse!' + escapeMessage: '&4The circus has left town!' +circus_ringmaster_summon: + name: '$eventBossLevel &5Tortured Animal' +circus_ringmaster_summon_1: + name: '$eventBossLevel &5Abused Clown' +circus_ringmaster_summon_2: + name: '$eventBossLevel &5Mistreated Balloon' +coins_goblin: + name: '$eventBossLevel &eCoins Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Coins Goblin has been pillaged!' + - '&c&l Najwięcej obrażeń zadał: $damager1name &cz ilością $damager1damage obrażeń!' + - '&6&l Drugim graczem pod względem obrażeń jest: $damager2name&6, który zadał aż $damager2damage obrażeń!' + - '&e&l Trzecim graczem pod względem obrażeń jest: $damager3name&6, który zadał $damager3damage obrażeń!' + - '&aPogromcy: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cCoins Goblin: $distance blocks away!' + spawnMessage: '&cA Coins Goblin has been sighted!' + deathMessage: '&aA Coins Goblin has been slain by $players!' + escapeMessage: '&4A Coins Goblin has escaped!' +craftenmine_stacked_bones: + name: '$eventBossLevel &eArmed Skull' + locationMessage: '&cDr. Craftenmine''s Stacked Bones: $distance blocks away!' + spawnMessage: '&cA horrible Dr. Craftenmine creation is out in the wild!' + deathMessage: '&aThe horrible Stacked-Bones creation was slain by $players!' + escapeMessage: '&4Dr. Craftenmines horrible creation has escaped!' +craftenmine_stacked_bones_ankle: + name: '$eventBossLevel &6Armed Ankle' +craftenmine_stacked_bones_backbone: + name: '$eventBossLevel &6Armed Backbone' +craftenmine_stacked_bones_femur: + name: '$eventBossLevel &6Armed Femur' +craftenmine_stacked_bones_spine: + name: '$eventBossLevel &6Armed Spine' +craftenmine_terror: + name: '$eventBossLevel &cLobotimized Ghast' + locationMessage: '&cDr. Craftenmine''s Terror: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine creation is on the loose!' + deathMessage: '&aThe Lobotimized Ghast was slain by $players!' + escapeMessage: '&4The Lobotimized Ghast has left!' +craftenmine_terror_mount: + name: '$eventBossLevel &dGhast Carrier' +creeperpede_1: + name: '$eventBossLevel &5Creeperpede Observer' + locationMessage: '&cCreeperpede: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine experiment is on the loose!' + deathMessage: '&aThe Creeperpede was stopped in its tracks by $players!.' + escapeMessage: '&4AThe Dr. Craftenmine experiment has managed to escape!' +creeperpede_2: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_3: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_4: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_5: + name: '$eventBossLevel &5Creeperpede Carrier' +crone: + name: '$eventBossLevel &aOld Crone' + locationMessage: '&cOld Crone: $distance blocks away!' + spawnMessage: '&cAn Old Crone has wandered into this world!' + deathMessage: '&aThe Crone was vanquished by $players!.' + escapeMessage: '&4The Old Crone has left this world on her broom!' +crone_summon: + name: '$eventBossLevel &fPet Spider' +divine_cinder: + name: '$eventBossLevel &cDivine Cinder' + locationMessage: '&cDivine Cinder: $distance blocks away!' + spawnMessage: '&cA divine blaze has appeared!' + deathMessage: '&aThe Divine Cinder was defeated by $players!' + escapeMessage: '&4The Divine Cinder has smoked away!' +ember: + name: '$reinforcementLevel &cPłomyk' +enders_1: + name: '$eventBossLevel &dEnderlad' + locationMessage: '&cEnder Clique: $distance blocks away!' + spawnMessage: '&cA group of ender troublemakers have appeared.' + deathMessage: '&aThe Ender Clique was stopped by $players!' + escapeMessage: '&4The Ender Clique have left!' +enders_2: + name: '$eventBossLevel &dEnderchap' + locationMessage: '&cClique Member: $distance blocks away!' +enders_3: + name: '$eventBossLevel &dEnderdude' + locationMessage: '&cClique Member: $distance blocks away!' +ender_lapin: + name: '$eventBossLevel &aEnder Lapin' +endless_pursuer: + name: '$eventBossLevel &dEndless Pursuer' + locationMessage: '&cEndless Pursuer: $distance blocks away!' + spawnMessage: '&cIt will not stop chasing...' + deathMessage: '&aThe chase has stopped thanks to $players!' + escapeMessage: '&4The Pursuer has vanished!' +enraged_snowman: + name: '$eventBossLevel &1Enraged Snowman' + locationMessage: '&cEnraged Snowman: $distance blocks away!' + spawnMessage: '&cAn angry Snowman was sighted!' + deathMessage: '&aThe Enraged Snowman was put to rest by $players!' + escapeMessage: '&4The Enraged Snowman has vanished!' +evil_undead: + name: '$eventBossLevel &cEvil Undead' + locationMessage: '&cEvil Undead: $distance blocks away!' + spawnMessage: '&cAn Evil Undead has appeared!' + deathMessage: '&aThe Evil Undead was put to rest by $players!' + escapeMessage: '&4The Evil Undead has escaped!' +evil_undead_p2: + name: '$eventBossLevel &cEvil Undead' + locationMessage: '&cEvil Undead: $distance blocks away!' + spawnMessage: '&cAn Evil Undead has appeared!' + deathMessage: '&aThe Evil Undead was put to rest by $players!' + escapeMessage: '&4The Evil Undead has escaped!' +fallen_knight: + name: '$eventBossLevel &7Fallen Knight' + locationMessage: '&cFallen Knight: $distance blocks away!' + spawnMessage: '&cA Fallen Knight rises from their grave!' + deathMessage: '&aA Fallen Knight has fallen to $players!.' + escapeMessage: '&4The Fallen Knight goes back to slumber!' +fine_swine: + name: '$eventBossLevel &eFine Swine' +fine_swine_summon: + name: '$eventBossLevel &eMighty Protector' +firestarter: + name: '$eventBossLevel &6Firestarter' + locationMessage: '&cFirestarter: $distance blocks away!' + spawnMessage: '&cA wicked Firestarter has appeared!' + deathMessage: '&aThe Firestarter was slain by $players!' + escapeMessage: '&4The Firestarter has left!' +firestarter_mount: + name: '$eventBossLevel &6Spark' +fire_conjurer: + name: '$eventBossLevel &eFire Conjurer' + locationMessage: '&cFire Conjurer: $distance blocks away!' + spawnMessage: '&cA master of fire and flame walks this world!' + deathMessage: '&aThe Fire Conjurer was extinguished by $players!' + escapeMessage: '&4The Fire Conjurer has vanished!' +fire_conjurer_summon: + name: '$eventBossLevel &6Summoned Flame' +fire_fae: + name: '$eventBossLevel &cOgnista Wróżka' +foreign_visitor: + name: '$eventBossLevel &5Foreign Visitor' + locationMessage: '&cForeign Visitor: $distance blocks away!' + spawnMessage: '&cA visitor from a another dimension has arrived!' + deathMessage: '&a$players has made sure to let the visitor know that they are not welcome here.' + escapeMessage: '&4The visitor has gone back home!' +fox_king_cold: + name: '$eventBossLevel &1Fox King Cold' + locationMessage: '&cFox King Cold: $distance blocks away!' + spawnMessage: '&cA magical creature roams the world.' + deathMessage: '&aFox King Cold was defeated by $players!' + escapeMessage: '&4Fox King Cold has left this world.' +frost_palace_frost_queen_p0: + name: '$bossLevel &8Frost Queen' + locationMessage: '&9Frost Queen' + spawnMessage: '&9The wind howls. The Frost Queen rises up to the challenge.' + deathMessage: '&aThe Frost queen is no more, slain by $players!' +frost_palace_frost_queen_p1: + name: '$bossLevel &8Frost Queen phase 1' + locationMessage: '&9Frost Queen phase 1' +frost_palace_frost_queen_p2: + name: '$bossLevel &8Frost Queen phase 2' + locationMessage: '&9Frost Queen phase 2' +frost_palace_frost_queen_p3: + name: '$bossLevel &8Frost Queen phase 3' + locationMessage: '&9Frost Queen phase 3' +frost_palace_frost_queen_p4: + name: '$bossLevel &8Frost Queen phase 4' + locationMessage: '&9Frost Queen phase 4' +frost_palace_frost_queen_p5: + name: '$bossLevel &8Frost Queen phase 5' + locationMessage: '&9Frost Queen phase 5' +frost_palace_frost_queen_p6: + name: '$bossLevel &8Frost Queen phase 6' + locationMessage: '&9Frost Queen phase 6' +frost_palace_frost_queen_p7: + name: '$bossLevel &8Frost Queen phase 7' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Frost Queen was thawed!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&9Frost Queen phase 7' +frost_palace_reinforcement_1: + name: '$reinforcementLevel Spirit of Winter' +frost_palace_reinforcement_2: + name: '$reinforcementLevel Spirit of Spring' +frost_palace_reinforcement_3: + name: '$reinforcementLevel Spirit of Summer' +fulgora: + name: '$eventBossLevel &3Fulgora' + locationMessage: '&cFulgora: $distance blocks away!' + spawnMessage: '&cA mighty thunder goat has come!' + deathMessage: '&aFulgora was stopped by $players!' + escapeMessage: '&4Fulgora has left this place!' +gamma_werewolf: + name: '$reinforcementLevel &7Gamma Werewolf' +goblin_invader: + name: '$eventBossLevel &2Goblin Leader' + locationMessage: '&cGoblin Army: $distance blocks away!' + spawnMessage: '&cA Goblin Army has invaded this realm!' + deathMessage: '&aThe Goblin Army has been vanquished by $players!' + escapeMessage: '&4The Goblin Army is done with this realm!' +goblin_invader_summon_1: + name: '&2Goblin Warrior' +goblin_invader_summon_2: + name: '&2Goblin Fighter' +goblin_invader_summon_3: + name: '&2Goblin Trooper' +goblin_invader_summon_4: + name: '&2Goblin Reinforcements' +greedy_dwarf: + name: '$eventBossLevel &9Greedy Dwarf' + locationMessage: '&cGreedy Dwarf: $distance blocks away!' + spawnMessage: '&cCan you find the Greedy Dwarf digging somewhere underground?!' + deathMessage: '&aThe Greedy Dwarf was released of their curse by $players!' + escapeMessage: '&4The Greedy Dwarf had found their treasure and they left!' +gremlin_1: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + spawnMessage: '&cA Gremlin hoard has invaded this world!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_10: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_2: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_3: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_4: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_5: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_6: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_7: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_8: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_9: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +grunter: + name: '$eventBossLevel &aGrunter' + locationMessage: '&cGrunter: $distance blocks away!' + spawnMessage: '&cA mighty hog roams the lands.' + deathMessage: '&aGrunter was stopped by $players!' + escapeMessage: '&4Grunter has escaped!' +harmless_chicken: + name: '$eventBossLevel &fHarmless Chick' + locationMessage: '&cHarmless Chick: $distance blocks away!' + spawnMessage: '&cBwok!!! Cluck, Cluck! Bawk!' + deathMessage: '&aBaaaawk! Cluck...$players!' + escapeMessage: '&4Harmless Chicken has baaaaaawked away.' +harmless_chicken_summon: + name: '$eventBossLevel &fClucktector' +hog_rider: + name: '$eventBossLevel &6Hog Rider' + locationMessage: '&cHog Rider: $distance blocks away!' + spawnMessage: '&cA mighty Hog Rider has appeared!' + deathMessage: '&aThe Hog Rider and their Hog were vanquished by $players!' + escapeMessage: '&4The Hog Rider has vanished.' +hog_rider_mount: + name: '$eventBossLevel &eLoyal Hog' +hog_rider_p2: + name: '$eventBossLevel &6Hog Rider' + locationMessage: '&cHog Rider: $distance blocks away!' + deathMessage: '&aThe Hog Rider and their Hog were vanquished by $players!' + escapeMessage: '&4The Hog Rider has vanished.' +hog_rider_summon: + name: '$eventBossLevel &eLoyal Zob-Hog' +horde_champion: + name: '$eventBossLevel &cHorde Champion' + locationMessage: '&cUndead Horde Champion: $distance blocks away!' + spawnMessage: '&cAn undead horde approaches!' + deathMessage: '&aThe horde has been stopped by $players!.' + escapeMessage: '&4AThe undead horde has left!' +horrid_duplicator: + name: '$eventBossLevel &dHorrid Duplicator' + locationMessage: '&cHorrid Duplicator: $distance blocks away!' + spawnMessage: '&cAn endless foe has appeared!' + deathMessage: '&aThe Horrid Duplicator was slain by $players!' + escapeMessage: '&4The Horrid Duplicator has left!' +horrid_duplicator_summon: + name: '$eventBossLevel &dHorrid Duplicator' +horrid_duplicator_summon_1: + name: '$eventBossLevel &dHorrid Duplicator' +ice_fae: + name: '$eventBossLevel &Lodowa Wróżka' +imperial_bee_guard: + name: '$reinforcementLevel &eImperial Bee Soldier' +invasion_abducted_hoglin_leader: + name: '$normalLevel &8Abducted Hoglin Leader' +invasion_abducted_pillager_leader: + name: '$normalLevel &8Abducted Pillager Leader' +invasion_abducted_silverfish: + name: '$normalLevel &8Abducted Silverfish' +invasion_abducted_silverfish_leader: + name: '$normalLevel &8Abducted Silverfish' +invasion_abducted_zombie: + name: '$normalLevel &8Abducted Zombie' +invasion_abducted_zombie_leader: + name: '$normalLevel &8Abducted Zombie' +invasion_abductor: + name: '$normalLevel &6Abductor' +invasion_abudcted_pillager: + name: '$normalLevel &8Abducted Pillager' +invasion_analytic_thin_man_1: + name: '$normalLevel &8Analytic Thin Man' +invasion_analytic_thin_man_2: + name: '$normalLevel &8Analytic Thin Man' +invasion_analytic_thin_man_3: + name: '$normalLevel &8Analytic Thin Man' +invasion_analytic_thin_man_4: + name: '$normalLevel &8Analytic Thin Man' +invasion_ballistic_construct: + name: '$minibossLevel &fBallistic Construct' +invasion_convert: + name: '$normalLevel &6Convert' +invasion_energy_construct: + name: '$minibossLevel &fEnergy Construct' +invasion_fire_construct: + name: '$minibossLevel &fFire Construct' +invasion_genetically_modified_cow_phase_1: + name: '$minibossLevel &fGenetically Modified Cow' +invasion_genetically_modified_cow_phase_2: + name: '$minibossLevel &fGenetically Modified Cow' +invasion_gray_man_courthouse_phase_1: + name: '$minibossLevel &7Gray Man' +invasion_gray_man_courthouse_phase_2: + name: '$minibossLevel &7Gray Man' +invasion_green_man_hotel_phase_1: + name: '$bossLevel &2Green Man' +invasion_green_man_hotel_phase_2: + name: '$bossLevel &2Green Man' +invasion_green_man_hotel_phase_3: + name: '$bossLevel &2Green Man' + deathMessage: '&4The &2Green Man &4was vanquished by $players! That''s the end for this version of the map, the inside of the UFO is in the full version!' +invasion_green_man_spaceship_phase_1: + name: '$bossLevel &2Green Man' +invasion_green_man_spaceship_phase_2: + name: '$bossLevel &2Green Man' +invasion_green_man_spaceship_phase_3: + name: '$bossLevel &2Green Man' +invasion_green_man_spaceship_phase_4: + name: '$bossLevel &2Green Man' + deathMessages: + - '&e&l---------------------------------------------' + - '&2The Alien menace is no more!' + - '&c&l Najwięcej obrażeń zadał: $damager1name &cz ilością $damager1damage obrażeń!' + - '&6&l Drugim graczem pod względem obrażeń jest: $damager2name&6, który zadał aż $damager2damage obrażeń!' + - '&e&l Trzecim graczem pod względem obrażeń jest: $damager3name&6, który zadał $damager3damage obrażeń!' + - '&aPogromcy: $players' + - '&e&l---------------------------------------------' +invasion_ice_construct: + name: '$minibossLevel &fIce Construct' +invasion_merman: + name: '$normalLevel &6Merman' +invasion_merman_leader: + name: '$normalLevel &6Merman Leader' +invasion_otherwordly_ember: + name: '$normalLevel &6Otherworldly Ember' +invasion_psychic_apparition: + name: '$normalLevel &5Psychic Apparition' +invasion_psychic_clone: + name: '$reinforcementLevel &6Psychic Clone' +invasion_psychic_explosion: + name: '$reinforcementLevel &5Psychic Explosion' +invasion_psychic_summon_gold_boots: + name: '$reinforcementLevel &5Psychic Apparition' +invasion_psychic_summon_gold_pants: + name: '$reinforcementLevel &5Psychic Apparition' +invasion_psychic_summon_leather_hat: + name: '$reinforcementLevel &5Psychic Apparition' +invasion_shrieking_shulker: + name: '$normalLevel &8Shrieking Shulker' +invasion_thin_man: + name: '$normalLevel &8Thin Man' +killer_rabbit_of_caerbannog: + name: '$eventBossLevel &cKiller Rabbit of Caerbannog' +kraken: + name: '$eventBossLevel &3Kraken' +krampus: + name: '$eventBossLevel &1Krampus' + locationMessage: '&cKrampus: $distance blocks away!' + spawnMessage: '&cKrampus has come to punish the naughty!' + deathMessage: '&aKrampus has been sent back to his realm to by $players!.' + escapeMessage: '&4There was nobody to punish!' +large_hopper: + name: '$eventBossLevel &dLarge Hopper' + locationMessage: '&cLarge Hopper: $distance blocks away!' + spawnMessage: '&cA large beast is hopping around!' + deathMessage: '&aThe Large Hopper was stopped by $players!' + escapeMessage: '&4The Large Hopper has jumped out of this world!' +large_hopper_mount: + name: '$eventBossLevel &aHopper' +lightning_fae: + name: '$eventBossLevel &Elektryczna Wróżka' +living_shadow: + name: '$eventBossLevel &7Living Shadow' + locationMessage: '&cLiving Shadow: $distance blocks away!' + spawnMessage: '&cLiving Shadow has appeared! Do not look it in the yes!' + deathMessage: '&aLiving Shadow has been turned into Dead Shadow by $players!.' + escapeMessage: '&4The Living Shadow saw nothing so it left!' +meme_boss: + name: '&2The Maestro' +meme_boss_reinforcement: + name: '&cFan' +merman: + name: '$eventBossLevel &1Merman' + locationMessage: '&cMerman: $distance blocks away!' + spawnMessage: '&cA Merman swims the oceans!' + deathMessage: '&aThe Merman was slain by $players!' + escapeMessage: '&4The Merman has retreated.' +monster_of_the_deep: + name: '$eventBossLevel &bMonster of the Deep' + locationMessage: '&cMonster of the Deep: $distance blocks away!' + spawnMessage: '&cSomething terrible swims the oceans!' + deathMessage: '&aMonster of the Deep has been slain by $players!' + escapeMessage: '&4The oceans are once again safe!' +moon_spider: + name: '$eventBossLevel &fMoon Spider' + locationMessage: '&cMoon Spider: $distance blocks away!' + spawnMessage: '&cA powerful arachnid has been spotted!' + deathMessage: '&aThe Moon Spider was slain by $players!' + escapeMessage: '&4The Moon Spider has left!' +moon_spider_summon: + name: '&fSilk Mender' +necromancer: + name: '$eventBossLevel &7Necromancer' + locationMessage: '&cNecromancer: $distance blocks away!' + spawnMessage: '&cA powerful evil Necromancer has entered this world!' + deathMessage: '&aThe Necromancer is no more thanks to $players!' + escapeMessage: '&4The Necromancer has disappeared.' +necromancer_summon_1: + name: '$eventBossLevel &fFiery Bones' +necromancer_summon_2: + name: '$eventBossLevel &bChilled Bones' +necromancer_summon_3: + name: '$eventBossLevel &8Charred Bones' +necronomicon_skeleton: + name: '$reinforcementLevel &7Przywołany Szkielet' +necronomicon_zombie: + name: '$reinforcementLevel &7Przywołany Zombie' +netherite_golem: + name: '$eventBossLevel &8Netherite Golem' + locationMessage: '&cNetherite Golem: $distance blocks away!' + spawnMessage: '&cAn ancient golem has entered this world!' + deathMessage: '&aThe Netherite Golem was slain by $players!' + escapeMessage: '&4The Netherite Golem has left this world!' +nether_escapee: + name: '$eventBossLevel &6Nether Escapee' + locationMessage: '&cNether Escapee: $distance blocks away!' + spawnMessage: '&cA terrible foe has escaped the nether!' + deathMessage: '&aThe Nether Escapee was sent back to the nether by $players!' + escapeMessage: '&4The Nether Escapee has left this place!' +nether_hag: + name: '$eventBossLevel &4Nether Hag' + locationMessage: '&cNether Hag: $distance blocks away!' + spawnMessage: '&cAn evil hag walks the nether!' + deathMessage: '&aThe Nether Hag was slain by $players!' + escapeMessage: '&4The Nether Hag has vanished!' +nether_wasp: + name: '$eventBossLevel &6Nether Wasp' + locationMessage: '&cNether Wasp: $distance blocks away!' + spawnMessage: '&cTry not to get stung, a wasp roams the nether!' + deathMessage: '&aThe Nether Wasp was slain by $players!' + escapeMessage: '&4The Nether Wasp has decided to buzz off!' +nether_wasp_summon_1: + name: '$eventBossLevel &cHive Summoner' +nether_wasp_summon_2: + name: '$eventBossLevel &cHive Wasp' +nightwing: + name: '$eventBossLevel &cNightwing' + locationMessage: '&cNightwing: $distance blocks away!' + spawnMessage: '&cA bird of the night has appeared!' + deathMessage: '&aNightwing was stopped by $players!' + escapeMessage: '&4Nightwing has flown home.' +nightwing_summon: + name: '$eventBossLevel &cSmart Bomb' +nightwing_summon_1: + name: '$eventBossLevel &cSworn Protector' +night_crawler: + name: '$eventBossLevel &4Night Crawler' + locationMessage: '&cNight Crawler: $distance blocks away!' + spawnMessage: '&cSomething awful is crawling about!' + deathMessage: '&aThe Night Crawler has been slain by $players!' + escapeMessage: '&4The Night Crawler Undead has left!' +night_horder: + name: '$eventBossLevel &aNight Horder' + locationMessage: '&cNight Horder: $distance blocks away!' + spawnMessage: '&cA Night Horder has appeared! Slay him to loot his booty!' + deathMessage: '&aThe Night Horder has been plundered by $players!' + escapeMessage: '&4The Night Horder has escaped!' +oasis_10_old_bones: + name: '$normalLevel &fOld Bones' +oasis_10_surreptitious_scribe: + name: '$minibossLevel &7Surreptitious Scribe' +oasis_12_entombed_tenant: + name: '$normalLevel &7Entombed Tenant' +oasis_12_entombed_tenant_p2: + name: '$normalLevel &7Entombed Tenant' +oasis_12_sinister_siren: + name: '$minibossLevel &5Sinister Siren' +oasis_14_gnarly_grimace: + name: '$normalLevel &8Gnarly Grimace' +oasis_14_undead_drifter: + name: '$normalLevel &1Undead Drifter' +oasis_16_lesser_sentinel: + name: '$normalLevel &9Lesser Sentinel' +oasis_16_magical_magus: + name: '$normalLevel &3Magical Magus' +oasis_16_rancid_roamer: + name: '$normalLevel &8Rancid Roamer' +oasis_18_sly_sharpshooter: + name: '$normalLevel &eSly Sharpshooter' +oasis_18_stout_thaumaturge: + name: '$normalLevel &5Stout Thaumaturge' +oasis_18_tricky_treasure_hoarder: + name: '$normalLevel &dTricky Treasure Hoarder' +oasis_20_scheming_scribe: + name: '$minibossLevel &7Scheming Scribe' +oasis_20_septic_scribe: + name: '$minibossLevel &7Septic Scribe' +oasis_20_vampiric_sorcerer: + name: '$bossLevel &cVampiric Sorcerer' +oasis_20_wrapped_wraith: + name: '$normalLevel &8Wrapped Wraith' +oasis_20_wrapped_wraith_p2: + name: '$normalLevel &8Wrapped Wraith' +oasis_25_vampiric_warlock: + name: '$bossLevel &4Vampiric Warlock' +oasis_25_warlocks_spirit_summon: + name: '$reinforcementLevel &cWarlocks Spirit' +oasis_26_adept_sentinel: + name: '$normalLevel &1Adept Sentinel' +oasis_26_grim_grovetender: + name: '$normalLevel &aGrim Grovetender' +oasis_26_precarious_sniper: + name: '$normalLevel &3Precarious Sniper' +oasis_26_superior_sharpshooter: + name: '$normalLevel &3Superior Sharpshooter' +oasis_28_perilous_prophet: + name: '$normalLevel &3Perlious Prophet' +oasis_28_treacherous_treasure_hoarder: + name: '$normalLevel &dTreacherous Treasure Hoarder' +oasis_2_haunted_hauler: + name: '$normalLevel &9Haunted Hauler' +oasis_30_forsaken_soul: + name: '$reinforcementLevel &0Forsaken Soul' +oasis_30_lost_soul: + name: '$normalLevel Lost Soul' +oasis_30_parlous_preist: + name: '$minibossLevel &bParlous Preist' +oasis_30_seeker_of_the_staid: + name: '$normalLevel &cSeeker of the Staid' +oasis_30_wimpy_louse: + name: '$reinforcementLevel &8Loathing Louse' +oasis_32_loathing_louse: + name: '$normalLevel &8Loathing Louse' +oasis_32_skeletal_sniper: + name: '$normalLevel &9Skeletal Sniper' +oasis_34_grizly_grimace: + name: '$normalLevel &8Gnarly Grimace' +oasis_34_gruesome_grimace: + name: '$normalLevel &8Gruesome Grimace' +oasis_35_ice_eidolon: + name: '$reinforcementLevel &9Ice Eidolon' +oasis_35_light_of_darkness: + name: '$minibossLevel &9Light of Darkness' +oasis_36_cruel_cultist: + name: '$normalLevel &3Cruel Cultist' +oasis_36_cultists_cretins: + name: '$reinforcementLevel &3Cruel Cultist' +oasis_36_cultists_cretins_drowned: + name: '$reinforcementLevel &3Cruel Cultist' +oasis_36_dexterous_sentinel: + name: '$normalLevel &9Dexterous Sentinel' +oasis_36_grudging_grovetender: + name: '$normalLevel &aGrudging Grovetender' +oasis_36_parlous_sniper: + name: '$normalLevel &3Parlous Sniper' +oasis_36_rueful_roamer: + name: '$normalLevel &8Rueful Roamer' +oasis_36_spectral_magus: + name: '$normalLevel &3Spectral Magus' +oasis_38_poisonous_perch: + name: '$normalLevel &3Poisonous Perch' +oasis_38_traitorous_treasure_hoarder: + name: '$normalLevel &dTraitorous Treasure Hoarder' +oasis_40_chief_cultist: + name: '$minibossLevel &5Chief Cultist' +oasis_40_louse_lord: + name: '$minibossLevel &8Louse Lord' +oasis_40_pharaohs_scribe: + name: '$minibossLevel &7Pharaoh''s Scribe' +oasis_40_skeletal_stiff: + name: '$normalLevel &9Skeletal Stiff' +oasis_40_soaked_sacrifice: + name: '$reinforcementLevel &1Soaked Sacrifice' +oasis_40_solar_flare: + name: '$reinforcementLevel &eSolar Flare' +oasis_42_hexed_hauler: + name: '$normalLevel &9Hexed Hauler' +oasis_42_skeletal_sharpshooter: + name: '$normalLevel &9Skeletal Sharpshooter' +oasis_42_tyranical_treasure_hoarder: + name: '$normalLevel &dTyranical Treasure Hoarder' +oasis_42_tyranical_treasure_hoarder_phase_2: + name: '$normalLevel &dTyranical Treasure Hoarder' +oasis_45_golden_cast_autonomation: + name: '$reinforcementLevel &6Golden Cast Autonomation' +oasis_45_monumental_monstrosity: + name: '$bossLevel &bMonumental Monstrosity' +oasis_45_monumental_monstrosity_phase_2: + name: '$bossLevel &bMonumental Monstrosity' +oasis_45_monumental_monstrosity_phase_3: + name: '$bossLevel &6Monumental Monstrosity' +oasis_45_monumental_monstrosity_phase_4: + name: '$bossLevel &bMonumental Monstrosity' +oasis_45_oracle_of_knowledge: + name: '$minibossLevel &0Oracle of Knowledge' +oasis_45_shadow_of_knowledge_summon: + name: '$reinforcementLevel &8Shadow of Knowledge' +oasis_45_the_beacon: + name: '$minibossLevel &6The Beacon' +oasis_45_the_beacon_phase_2: + name: '$minibossLevel &6The Beacon' +oasis_45_the_beacon_phase_3: + name: '$minibossLevel &6The Beacon' +oasis_45_the_beacon_phase_4: + name: '$minibossLevel &6The Beacon' +oasis_46_pharaohs_sentinel: + name: '$normalLevel &9Pharaoh''s Sentinel' +oasis_4_cursed_desert_dweller: + name: '$normalLevel &eCursed Desert Dweller' +oasis_4_grotesque_grimace: + name: '$normalLevel &8Grotesque Grimace' +oasis_4_swamp_rat: + name: '$normalLevel &6Swamp Rat' +oasis_50_moneychanger_arrow: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_arrow_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_blindness: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_blindness_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_fire: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_fire_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_freeze: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_freeze_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_knockback: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_knockback_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_poison: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_poison_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_wither: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_wither_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_pharaohs_royal_guard: + name: '$reinforcementLevel &8Pharaoh''s Royal Guard' +oasis_50_the_foundry: + name: '$bossLevel &4The Foundry' +oasis_50_the_foundry_phase_2: + name: '$bossLevel &4The Foundry' +oasis_55_pharaoh_of_pestilence: + name: '$bossLevel &0Pharaoh of Pestilence' +oasis_6_dry_bones: + name: '$normalLevel &fDry Bones' +oasis_6_rotten_roamer: + name: '$normalLevel &8Rotten Roamer' +oasis_8_mythical_magus: + name: '$normalLevel &3Mythical Magus' +oasis_8_tough_thaumaturge: + name: '$normalLevel &5Tough Thaumaturge' +oasis_8_troublesome_treasure_hoarder: + name: '$normalLevel &dTroublesome Treasure Hoarder' +okami: + name: '$eventBossLevel &cOkami' + locationMessage: '&cOkami: $distance blocks away!' + spawnMessage: '&cA god has awakened!' + deathMessage: '&a$players has fought with a god and won!.' + escapeMessage: '&4Okami has left!' +okami_p2: + name: '$eventBossLevel &cOkami' +okami_p3: + name: '$eventBossLevel &cOkami' +omega_wolf: + name: '$reinforcementLevel &7Omega Wolf' +pillager_caravan_beast: + name: '$reinforcementLevel &cCaravan Beast' +pillager_caravan_guard: + name: '$reinforcementLevel &cCaravan Guard' +pillager_caravan_leader: + name: '$eventBossLevel &cPillager Caravan Leader' + locationMessage: '&cPillager Caravan: $distance blocks away!' + spawnMessage: '&cA pillager caravan has been sighted!' +primis_acolyte_brute: + name: '$normalLevel &bAkolita Barbarzyńca' +primis_acolyte_forest_brute: + name: '$normalLevel &bElf Bandit Brute' +primis_acolyte_forest_brute_with_watch: + name: '$normalLevel &bElf Bandit Brute' +primis_acolyte_forest_sharpshooter: + name: '$normalLevel &bElf Bandit Ranger' +primis_acolyte_forest_summoner: + name: '$normalLevel &bElf Bandit Summoner' +primis_acolyte_forest_summoner_heirloom_guardian: + name: '$normalLevel &bElf Bandit Mage' +primis_acolyte_guard_1: + name: '$normalLevel &bAkolita Strażnik' + onDamagedMessages: + - Nie możesz wejść! + - Mag na to nie zezwoli! + - Opuść to miejsce! + - Mag chroni to miejsce! + - Głupcze! + - Odejdź! + deathMessage: '[Acolyte Guard] Jesteś ślepy na prawdę, mag z wieży widzi wszystko!' +primis_acolyte_guard_2: + name: '$normalLevel &bAkolita Strażnik' + onDamagedMessages: + - Nie możesz wejść! + - Mag na to nie zezwoli! + - Opuść to miejsce! + - Mag chroni to miejsce! + - Głupcze! + - Odejdź! + deathMessage: '[Acolyte Guard] Nie przejdziesz, mag w wieży nie zezwoli na to!' +primis_acolyte_sharpshooter: + name: '$normalLevel &bAkolita Zwiadowca' +primis_aggressive_llama: + name: '$normalLevel &6Agresywna Lama' +primis_angry_goat: + name: '$normalLevel &6Zdenerwowana Koza' +primis_beta_feral_wolf: + name: '$reinforcementLevel &8Beta Dziki Wilk' +primis_blood_temple_blood_golem: + name: '$normalLevel &cBlood Golem' +primis_blood_temple_charred_construct: + name: '$normalLevel &cCharred Construct' +primis_blood_temple_conjured_flame: + name: '$normalLevel &cConjured Flame' +primis_blood_temple_eradicator: + name: '$normalLevel &cEradicator' +primis_blood_temple_fire_conjurer: + name: '$normalLevel &cFire Conjurer' +primis_blood_temple_flame_elemental: + name: '$normalLevel &cFlame Elemental' +primis_catacomb_nemus_to_redwood_archer: + name: '$normalLevel &8Catacomb Archer' +primis_catacomb_nemus_to_redwood_golem: + name: '$normalLevel &bCatacomb Golem' +primis_catacomb_nemus_to_redwood_necromancer: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_nemus_to_redwood_necromancer_p1: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_nemus_to_redwood_necromancer_p2: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_nemus_to_redwood_soul_reinforcement: + name: '$reinforcementLevel &8Catacomb Soul' +primis_catacomb_nemus_to_redwood_swordsman: + name: '$normalLevel &8Catacomb Swordsman' +primis_catacomb_pontis_to_ice_archer: + name: '$normalLevel &8Catacomb Archer' +primis_catacomb_pontis_to_ice_golem: + name: '$normalLevel &bCatacomb Golem' +primis_catacomb_pontis_to_ice_necromancer_p1: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_pontis_to_ice_necromancer_p2: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_pontis_to_ice_swordsman: + name: '$normalLevel &8Catacomb Swordsman' +primis_catacomb_trio_archer: + name: '$normalLevel &8Catacomb Archer' +primis_catacomb_trio_golem: + name: '$normalLevel &bCatacomb Golem' +primis_catacomb_trio_necromancer_p1: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_necromancer_p2: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_necromancer_summon: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_swordsman: + name: '$normalLevel &8Catacomb Swordsman' +primis_crazed_rabbit: + name: '$normalLevel Szalony Królik' +primis_crystaline_summoner_p1: + name: '$normalLevel &3Crystaline Summoner' +primis_crystaline_summoner_p2: + name: '&3Krystaliczny Przywoływacz' +primis_earth_temple_golem: + name: '$normalLevel &fAnimated Clay' +primis_emerald_eater: + name: '$normalLevel &aEmerald Eater' +primis_farmstead_lighthouse_keeper: + name: '$bossLevel &6The Lighthouse Keeper' + questLore: + - Coś jest bardzo nie tak z moim mężem. + - He used to be a loving and caring husband and father, + - but in recent times he has been focusing on documents he found in the basement. + - He said it was for important research, something that could change the world. + - I should've told him to stop when I saw how obsessed he was becoming. + - He did... something... to the lighthouse - and + - I fear the lighthouse has done something to him, too. + - It morphed him into some kind of monster. He no longer recognizes us, + - and has even attacked us when we tried to approach him. + - At night, we can't sleep due to the wailing sounds + - coming from the &dLighthouse's Basement&f. + - He is suffering, and we are powerless to help him. + - I know it's asking a lot, but do you think you could help us? + questAcceptDialog: + - '&a[Amavit]&f Thank you so much for accepting our request. I hope with all my heart you succeed.' + - '&7&oI should go to the &dBasement of the Lighthouse&7&o and put the &cLighthouse Keeper&7&o out of his misery.' + questCompleteMessage: + - '&a[Amavit]&f I heard it - so it is done? Did he suff- no, forget it, I don''t want to know.' + - '&fWydaje się, że latarnia zaczęła emitować dziwne światło kiedy... zajmowałeś się tą sprawą. Musimy upewnić się, że nie jest to problem.' + - '&7&oSeems like &aAmavit&7&o has another task for me. I should talk to her.' +primis_feral_alpha_wolf: + name: '$normalLevel &8Dziki Wilk Alfa' +primis_feral_wolf: + name: '$normalLevel &8Dziki Wilk' +primis_feral_wolf_scout: + name: '$normalLevel &8Dziki Wilk Zwiadowca' +primis_gladius_admiral: + name: '$normalLevel &fAdmirał Najeźdźca' +primis_gladius_assassin: + name: '$normalLevel &fNajeźdźca Assassin' +primis_gladius_barkeep_p1: + name: '$minibossLevel &6Barman' +primis_gladius_barkeep_p2: + name: '$minibossLevel &6Barman' +primis_gladius_captain: + name: '$normalLevel &fNajeźdźca Kapitan' +primis_gladius_champion_p1: + name: '$bossLevel &6Upadły Czempion Natus' +primis_gladius_champion_p2: + name: '$bossLevel &6Upadły Czempion Natus' +primis_gladius_gatekeeper_p1: + name: '$minibossLevel &5Strażnik Bramy' +primis_gladius_gatekeeper_p2: + name: '$minibossLevel &5Strażnik Bramy' +primis_gladius_gatekeeper_pontis_p1: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_gatekeeper_pontis_p2: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_longbowman: + name: '$normalLevel &fNajeźdźca Łucznik Wyborowy' +primis_gladius_mariner: + name: '$normalLevel &fNajeźdźca Marynarz' +primis_gladius_mariner_quest: + name: '$normalLevel &fNajeźdźca Marynarz' +primis_gladius_monk_p1: + name: '$minibossLevel &6Mnich' +primis_gladius_monk_p2: + name: '$minibossLevel &6Mnich' +primis_gladius_raider: + name: '$normalLevel &fNajeżdżający Rabuś' +primis_gladius_swordsman: + name: '$normalLevel &fNajeźdźca Rycerz' +primis_gladius_undead_buccaneer: + name: '$normalLevel &fNieumarły Korsarz' +primis_gladius_undead_captain: + name: '$minibossLevel &fNieumarły Kapitan' +primis_gladius_undead_swashbuckler: + name: '$normalLevel &fNieumarły Zawadiaka' +primis_gladius_underlord: + name: '$minibossLevel &0Władca Podziemia' +primis_gladius_villager: + name: '$normalLevel &fNieumarły Wieśniak' +primis_goblin_fowl_warrior: + name: '$minibossLevel &6Cursed Fowl Goblin' +primis_goblin_grunt: + name: '$normalLevel &6Goblin Grunt' +primis_goblin_king: + name: '$bossLevel &2Goblin King' +primis_goblin_piranah: + name: '$normalLevel &9Goblin Piranah' +primis_goblin_spearman: + name: '$normalLevel &6Goblin Spearman' +primis_goblin_warrior: + name: '$normalLevel &6Goblin Warrior' +primis_ice_mage: + name: '$minibossLevel &9Lodowy Mag' +primis_ice_mage_p2: + name: '$minibossLevel &bLodowy Mag' + deathMessage: '&8&oSłyszysz dźwięk pękania pobliskiej ściany lodowej...' +primis_ice_village_annoyed_goat: + name: '$normalLevel &bAnnoyed Goat' +primis_ice_village_bell_banger: + name: '$minibossLevel &6Undead' + questLore: + - Do you see that? There, look at that bell + - tower in the village. + - You see it too, right? The feller there + - banging his head on the bell. + - I am pretty sure that's what's going on, + - unless my vision is failing me. + - Could you go investigate and report back + - to me what you found. + questAcceptDialog: + - '&a[Eleusium Festus]&f What is going on...' + - '&7&oI should go see what is happening at the &d&oIce Village Bell Tower&7&o.' + questCompleteMessage: + - '&a[Eleusium Festus]&f You found an undead banging their head on the bell...' + - Well now I have heard it all... +primis_ice_village_escaped_prisoner: + name: '$normalLevel &bEscaped Prisoner' +primis_ice_village_fallen_trial_warrior_summon: + name: '$reinforcementLevel &7Enslaved Soul' +primis_ice_village_frost_fur_ursus: + name: '$normalLevel &9Frost Fur Ursus' +primis_ice_village_frost_simulacrum: + name: '$normalLevel &3Frost Simulacrum' +primis_ice_village_ice_simulacrum: + name: '$reinforcementLevel &3Ice Simulacrum' +primis_ice_village_manifested_nightmare: + name: '$normalLevel &bManifested Nightmare' +primis_ice_village_meek_customer: + name: '$normalLevel &cMeek Customer' +primis_ice_village_naughty_customer: + name: '$normalLevel &cNaughty Customer' +primis_ice_village_screecher_bomb_summon: + name: '$reinforcementLevel &dScreecher Droppings' +primis_ice_village_sky_screecher: + name: '$normalLevel &bSky Screecher' +primis_ice_village_the_ice_aspect: + name: '$minibossLevel &9Ice Aspect' +primis_ice_village_the_ice_elemental: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_the_ice_elemental_p2: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_the_ice_elemental_p3: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_trial_of_ice_minor_ice_elemental: + name: '$minibossLevel &bMinor Ice Elemental' +primis_ice_village_wolf_summon: + name: '$reinforcementLevel &cTamed Wolf' +primis_minor_ice_elemental: + name: '$bossLevel &1Mały Lodowy Żywiołak' +primis_minor_ice_elemental_p2: + name: '$bossLevel &1Mały Lodowy Żywiołak' +primis_mountain_pass_guardian_p1: + name: '$bossLevel &6Strażnik' +primis_mountain_pass_guardian_p2: + name: '$bossLevel &6Strażnik' +primis_mountain_pass_healer: + name: '$reinforcementLevel &fRepairtron' +primis_nasty_worm: + name: '$normalLevel &fPaskudny Robak' +primis_ogre_mines_mite: + name: '$normalLevel &fRoztocz Kopalniana' +primis_ogre_mines_ogre_archer: + name: '$minibossLevel &fOgr Łucznik' +primis_ogre_mines_ogre_magi: + name: '$minibossLevel &fOgr Mag' +primis_ogre_mines_ogre_warrior: + name: '$minibossLevel &fOgr Wojownik' +primis_ogre_mines_undead_archer: + name: '$normalLevel &fNieumarły Łucznik' +primis_ogre_mines_undead_swordsman: + name: '$normalLevel &fNieumarły Szermierz' +primis_pontis_beast_cod: + name: '$minibossLevel &dBeast Cod Furiosa' +primis_pontis_beast_crawler: + name: '$minibossLevel &dCrawler Beast Megdun' +primis_pontis_beast_impaler: + name: '$minibossLevel &dImpaler Beast Uladzimir' +primis_pontis_counselor_guard_left_1: + name: '$normalLevel &4Corrupt Counselor Guard' +primis_pontis_counselor_guard_left_2: + name: '$normalLevel &4Warped Counselor Guard' + deathMessage: '&5[Counselor Machiavelli]&f So that fool must have finally figured it out...' +primis_pontis_counselor_guard_left_3: + name: '$normalLevel &4Uplifted Experiment' + deathMessage: '&5[Counselor Machiavelli]&f You''re stronger than I thought.' +primis_pontis_counselor_guard_left_4: + name: '$normalLevel &4Abomination' + deathMessage: '&5[Counselor Machiavelli]&f My soul magic will protect me!!!' +primis_pontis_counselor_guard_mid: + name: '$normalLevel &4Corrupt Counselor Guard' + deathMessage: '&8[Counselor Machiavelli]&f I see that we have guests!...' +primis_pontis_counselor_guard_right_1: + name: '$normalLevel &4Corrupt Counselor Guard' +primis_pontis_counselor_guard_right_2: + name: '$normalLevel &4Warped Counselor Guard' +primis_pontis_counselor_guard_right_3: + name: '$normalLevel &4Uplifted Experiment' +primis_pontis_counselor_guard_right_4: + name: '$normalLevel &4Abomination' +primis_pontis_counselor_twisted_copy: + name: '$reinforcementLevel &4Twisted Copy' +primis_pontis_mille_arena_air_elemental: + name: '$minibossLevel &fAir Elemental' +primis_pontis_mille_arena_human_wave_4: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_6: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_7: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_8: + name: '$normalLevel &4Dominated Human Warrior' +primis_pontis_mille_arena_human_worshiper: + name: '$normalLevel &4Elemental Worshiper' +primis_pontis_mille_arena_minor_air_elemental: + name: '$normalLevel &fMinor Air Elemental' +primis_pontis_mille_arena_minor_earth_elemental: + name: '$normalLevel &7Minor Earth Elemental' +primis_pontis_mille_arena_minor_fire_elemental: + name: '$normalLevel &eMinor Fire Elemental' +primis_pontis_mille_arena_minor_fire_elemental_prime: + name: '$normalLevel &eMinor Fire Elemental' +primis_pontis_mille_arena_minor_water_elemental: + name: '$normalLevel &bMinor Water Elemental' +primis_pontis_mille_arena_primal_air_wisp: + name: '$normalLevel &fPrimal Air Wisp' +primis_pontis_mille_arena_primal_air_wisp_2: + name: '$normalLevel &fPrimal Air Wisp' +primis_pontis_mille_arena_primal_earth_wisp: + name: '$normalLevel &7Primal Earth Wisp' +primis_pontis_mille_arena_primal_earth_wisp_2: + name: '$normalLevel &7Primal Earth Wisp' +primis_pontis_mille_arena_primal_fire_wisp: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_fire_wisp_2: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_fire_wisp_3: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_water_wisp: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_water_wisp_2: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_water_wisp_3: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_wisp: + name: '$normalLevel &5Primal Wisp' +primis_pontis_mille_arena_water_elemental: + name: '$minibossLevel &1Water Elemental' +primis_pontis_mille_counselor_p1: + name: '$minibossLevel &fCounselor Machiavelli' +primis_pontis_mille_counselor_p2: + name: '$minibossLevel &fCounselor Machiavelli' +primis_pontis_mille_counselor_p3: + name: '$minibossLevel &fCounselor Machiavelli' +primis_pontis_mille_fields_babe_razorback: + name: '$normalLevel &2Babe Razorback' +primis_pontis_mille_fields_bird: + name: '$normalLevel &fFeathered Field Rat' +primis_pontis_mille_fields_bird_nightmare: + name: '$normalLevel &dFeathered Nightmare Rat' +primis_pontis_mille_fields_bubba: + name: '$minibossLevel &cBig ol'' Bubba' +primis_pontis_mille_fields_field_rat: + name: '$normalLevel &fField Rat' +primis_pontis_mille_fields_juvenile_razorback: + name: '$normalLevel &2Juvenile Razorback' +primis_pontis_mille_fields_longhorn: + name: '$normalLevel &4Fields Longhorn' +primis_pontis_mille_fields_mature_razorback: + name: '$normalLevel &2Mature Razorback' +primis_pontis_mille_fields_shorthorn: + name: '$normalLevel &6Fields Shorthorn' +primis_pontis_mille_fields_two_legged_terror: + name: '$normalLevel &2Two Legged Terror' +primis_pontis_mille_fields_well_fed_rat: + name: '$normalLevel &fWell Fed Rat' +primis_pontis_mille_rat: + name: '$normalLevel &fRat' +primis_quartz_elemental: + name: '$bossLevel &dKwarcowy Żywiołak' +primis_quartz_elemental_p2: + name: '$bossLevel &dKwarcowy Żywiołak' +primis_redwood_barracuda: + name: '$normalLevel &3Redwood Barracuda' +primis_redwood_fruity_hound: + name: '$normalLevel &2Fruity Hound' +primis_redwood_rockhound: + name: '$normalLevel &7Redwood Rockhound' +primis_redwood_werewolf_grunt: + name: '$normalLevel &cRedwood Werewolf Grunt' +primis_redwood_werewolf_packleader: + name: '$normalLevel &4Redwood Werewolf Packleader' +primis_river_guardian: + name: '$normalLevel &5Strażnik Rzeki' +primis_roofed_forest_cave_spider: + name: '$normalLevel &6Nest Crawler' +primis_roofed_forest_cave_spider_boss: + name: '$bossLevel &eBrood Mother' +primis_roofed_forest_spider: + name: '$normalLevel &6Forest Crawler' +primis_roofed_forest_spider_reinforcement: + name: '$reinforcementLevel &6Nest Brood' +primis_sea_monster: + name: '$bossLevel &dMorski Potwór' +primis_sewer_noxious_ninja: + name: '$normalLevel &2Noxious Ninja' +primis_sewer_spore_spreader: + name: '$normalLevel &4Spore Spreader' +primis_sewer_the_shredder_p1: + name: '$bossLevel &5The Shredder' +primis_sewer_the_shredder_p2: + name: '$bossLevel &5The Shredder' +primis_storm_temple_axeman: + name: '$normalLevel &dStorm Temple Axeman' +primis_storm_temple_bowman: + name: '$normalLevel &dStorm Temple Bowman' +primis_storm_temple_kuzco: + name: '$normalLevel &6Kuzco' +primis_storm_temple_minor_storm_elemental: + name: '$normalLevel &5Minor Storm Elemental' +primis_storm_temple_storm_elemental: + name: '$bossLevel &1Storm Elemental' +primis_storm_temple_storm_elemental_p2: + name: '$bossLevel &1Storm Elemental' +primis_storm_temple_storm_elemental_p3: + name: '$bossLevel &1Storm Elemental' +primis_storm_temple_summoner: + name: '$normalLevel &5Storm Temple Summoner' +primis_terravilla_alpha_razorback: + name: '$minibossLevel &2Alpha Razorback' +primis_terravilla_alpha_razorback_p2: + name: '$minibossLevel &2Alpha Razorback' +primis_terravilla_bar_brawler: + name: '$normalLevel &6Bar Brawler' + onDamagedMessages: + - That all ya got! + - I did not even feel that! + - Why...you! + - I will show you! + - Who the heck are you! + - TAKE THAT! +primis_terravilla_earth_elemental: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_earth_elemental_p2: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_earth_elemental_p3: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_regular_fish: + name: '$normalLevel &bRegular Fish' +primis_terravilla_robber_gladiator: + name: '$normalLevel &bRobber Gladiator' +primis_terravilla_robber_slugger: + name: '$normalLevel &bSlugger' +primis_undead_archer: + name: '$normalLevel &fNieumarły Łucznik' +primis_undead_climber: + name: '$normalLevel &0Nieumarły Wspinacz' +primis_undead_grappler: + name: '$normalLevel &3Nieumarły Chwytak' +primis_undead_guardian: + name: '$normalLevel &bNieumarły Strażnik' +primis_undead_swordsman: + name: '$normalLevel &0Nieumarły Szermierz' +pufferfish: + name: '$eventBossLevel &3Pufferfish' + locationMessage: '&cPufferfish: $distance blocks away!' + spawnMessage: '&cA puffed fish is swimming in the oceans!' + deathMessage: '&aThe Pufferfish reign has been ended by $players!' + escapeMessage: '&4The Pufferfish has swam away!' +pufferfish_summon_1: + name: '$eventBossLevel &bPooferfish' +pufferfish_summon_2: + name: '$eventBossLevel &bPooperfish' +pufferfish_summon_3: + name: '$eventBossLevel &bPooderfish' +pufferfish_summon_4: + name: '$eventBossLevel &bPudderfish' +queen_bee: + name: '$eventBossLevel &6Queen Bee' +rabbit_wolf_1: + name: '$eventBossLevel &cFlame Wolf' + locationMessage: '&cFlame: $distance blocks away!' + spawnMessage: '&cA powerful duo has come to this world!' + deathMessage: '&aThe Wolf and the Rabbit were stopped by $players!' + escapeMessage: '&4The Wolf and the Rabbit have left this place!' +rabbit_wolf_2: + name: '$eventBossLevel &cLightning Rabbit' + locationMessage: '&cLightning: $distance blocks away!' + deathMessage: '&aThe Wolf and the Rabbit were stopped by $players!' + escapeMessage: '&4The Wolf and the Rabbit have left this place!' +raug: + name: '$reinforcementLevel &4Raug' +regular_hoglin: + name: '$eventBossLevel &4Regular Hoglin' + locationMessage: '&cRegular Hoglin: $distance blocks away!' + spawnMessage: '&cA Regular Hoglin has arrived! Nothing special about this Hoglin!' + deathMessage: '&aRegular Hoglin was slain by $players!.' + escapeMessage: '&4The Regular Hoglin has left!' +rotting_diver: + name: '$eventBossLevel &bRotting Diver' + locationMessage: '&cRotting Diver: $distance blocks away!' + spawnMessage: '&cA foul corpse floats in the waters!' + deathMessage: '&aThe Rotting Diver was sent to the depths by $players!' + escapeMessage: '&4The Rotting Diver floated away!' +salty_corpse: + name: '$eventBossLevel &bSalty Corpse' + locationMessage: '&cSalty Corpse: $distance blocks away!' + spawnMessage: '&cSomething awful has floated up to the surface!' + deathMessage: '&aThe Salty Corpse was sent back to the depths by $players!' + escapeMessage: '&4The Salty Corpse has left!' +skeleton_knight: + name: '$eventBossLevel &fSkeleton Knight' + locationMessage: '&cSkeleton Knight: $distance blocks away!' + spawnMessage: '&cThe undead have sent a Skeleton Knight into the night!' + deathMessage: '&aThe Skeleton Knight was slain by $players!' + escapeMessage: '&4The Skeleton Knight had to retreat!' +sky_archer: + name: '$eventBossLevel &aSky Archer' + locationMessage: '&cSky Archer: $distance blocks away!' + spawnMessage: '&cA Sky Archer has entered this world! Bring your bow!' + deathMessage: '&aThe Sky Archer got sniped by $players!' + escapeMessage: '&4The Sky Archer has flown away!' +sky_archer_mount: + name: '$eventBossLevel &aSky Steed' +smallstack: + name: '$eventBossLevel &bSmallstack Top' + locationMessage: '&cSmallstack: $distance blocks away!' + spawnMessage: '&cA Smallstack is roaming the wilds!' + deathMessage: '&aThe Smallstack was unstacked by $players!' + escapeMessage: '&4The Smallstack has left!' +smallstack_1: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_2: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_3: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_4: + name: '$eventBossLevel &bSmallstack Bottom' +smallstack_5: + name: '$eventBossLevel &bSmallstack Bottom' +smallstack_6: + name: '$eventBossLevel &bSmallstack Carrier' +snoopy: + name: '&6{&4☠&6} &fSnoopy' + onDamageMessages: + - Woof! + onDamagedMessages: + - Woof! + spawnMessage: '&aZaobserwowano niezwykle rzadki okaz, jakim jest Snoopy!' +sorcerer_supreme: + name: '$eventBossLevel &5Sorcerer Supreme' + locationMessage: '&cSorcerer Supreme: $distance blocks away!' + spawnMessage: '&cAn almighty Sorcerer has phased into this world!' + deathMessage: '&aThe Sorcerer Supreme was defeated by $players!' + escapeMessage: '&4The Sorcerer Supreme has left this world!' +sorcerer_supreme_summon: + name: '$eventBossLevel &5Eternal Servant' +spider_knight: + name: '$eventBossLevel &aDwarven Knight' + locationMessage: '&cDwarven Knight: $distance blocks away!' + spawnMessage: '&cA Knight has come to challenge the heroes of this place!' + deathMessage: '&aThe Knight was defeated by $players!' + escapeMessage: '&4The Knight has left this place!' +spider_knight_mount: + name: '$eventBossLevel &aFaithful Steed' +summonable_wolf: + name: '$normalLevel Wilczek' + onDamageMessages: + - Woof! + onDamagedMessages: + - Woof! +super_mite: + name: '$eventBossLevel &dSuper Mite' + locationMessage: '&cSuper Mite: $distance blocks away!' + spawnMessage: '&cA trouble maker appears!' + deathMessage: '&aThe mite could not handle a fight with $players!.' + escapeMessage: '&4The Super Mite left out of boredom!' +super_mite_summon: + name: '$eventBossLevel &dFriendmite' +suspicious_phantom: + name: '$eventBossLevel &eSuspicious Phantom' + locationMessage: '&cSuspicious Phantom: $distance blocks away!' + spawnMessage: '&cA Suspicious Phantom was sighted in the skies!' + deathMessage: '&aThe Phantom was put to bed by $players!' + escapeMessage: '&4The Suspicious Phantom has left!' +suspicious_phantom_summon: + name: '$eventBossLevel &cFlamer' +suspicious_phantom_summon_1: + name: '$eventBossLevel &cFireballer' +test_boss: + name: '$eventBossLevel &6Test boss' + deathMessages: + - '&e&l---------------------------------------------' + - '&eTestowy Boss został debugowany!' + - '&c&l Najwięcej obrażeń zadał: $damager1name &cz ilością $damager1damage obrażeń!' + - '&6&l Drugim graczem pod względem obrażeń jest: $damager2name&6, który zadał aż $damager2damage obrażeń!' + - '&e&l Trzecim graczem pod względem obrażeń jest: $damager3name&6, który zadał $damager3damage obrażeń!' + - '&aPogromcy: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Trafiłem Cię! + onDamagedMessages: + - Dostałem! + locationMessage: 'Test Boss odległość: $distance' + spawnMessage: Test boss pojawił się! + deathMessage: Test boss został zgładzony przez $players! + escapeMessage: Test boss uciekł! +airship_tier_45_knockback: + name: '$normalLevel &2Bow Bowsman' +airship_tier_45_witherblind: + name: '$normalLevel &aNoxious Bowsman' +airship_tier_50_powder_monkeys: + name: '$normalLevel &7Powder Monkey' +airship_tier_50_scourge: + name: '$normalLevel &8Swashbuckling Scourge' +airship_tier_60_mess_hall_mate: + name: '$normalLevel &bMess Hall Mate' +airship_tier_65_boatswain_boss: + name: '$normalLevel &cBoatswain Boss' +airship_tier_65_bodyguard: + name: '$normalLevel &eBuccaneer Bodyguard' +airship_tier_65_silverfish: + name: '$normalLevel &8Ship Rat' +airship_tier_65_silverfish_reinforcement: + name: '$reinforcementLevel &8Ship Mouse' +airship_tier_70_miniboss: + name: '$minibossLevel Quark the Quartermaster ' +airship_tier_70_miniboss_2: + name: '$minibossLevel &6Living Boiler' +airship_tier_70_miniboss_wayfinder: + name: '$minibossLevel &3Wharf Wayfinder' +airship_tier_75_boss: + name: '$bossLevel &4Captain Davey' + deathMessages: + - '&e&l---------------------------------------------' + - '&9Captain Davey was put to rest! ... again.' + - '&c&l Najwięcej obrażeń zadał: $damager1name &cz ilością $damager1damage obrażeń!' + - '&6&l Drugim graczem pod względem obrażeń jest: $damager2name&6, który zadał aż $damager2damage obrażeń!' + - '&e&l Trzecim graczem pod względem obrażeń jest: $damager3name&6, który zadał $damager3damage obrażeń!' + - '&aPogromcy: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Captain Davey: $distance' + spawnMessage: '&4Captain Davey haunts the skies once more!' + deathMessage: '$players &ahave made &4Captain Davey &ashuffle off his mortal coil!' + escapeMessage: '&6Captain Davey has moved on the haunt another day!' +binder_of_worlds_phase_1: + name: '$eventBossLevel &eBinder of Worlds' + spawnMessage: '&5The binder of worlds approaches!' +binder_of_worlds_phase_1_melee_miniboss: + name: '$reinforcementLevel &9Reality Uprooter' +binder_of_worlds_phase_1_melee_reinforcement: + name: '$reinforcementLevel &8Reality Waster' +binder_of_worlds_phase_1_parkour_reinforcement: + name: '$reinforcementLevel &2Reality Harbinger' +binder_of_worlds_phase_1_ranged_miniboss: + name: '$reinforcementLevel &3Reality Ruiner' +binder_of_worlds_phase_1_ranged_reinforcement: + name: '$reinforcementLevel &6Reality Ruiner' +binder_of_worlds_phase_1_status_miniboss: + name: '$reinforcementLevel &1Reality Wrencher' +binder_of_worlds_phase_1_status_reinforcement: + name: '$reinforcementLevel &7Reality Rupturer' +binder_of_worlds_phase_2: + name: '$eventBossLevel &eBinder of Worlds' +binder_of_worlds_phase_3: + name: '$eventBossLevel &eBinder of Worlds' +binder_of_worlds_phase_3_shulker_reinforcement: + name: '$reinforcementLevel &5Reality Riftrender' +binder_of_worlds_phase_4: + name: '$eventBossLevel &eBinder of Worlds' + deathMessages: + - '&e&l---------------------------------------------' + - '&9The binder is bound to this mortal plane no more!' + - '&c&l Najwięcej obrażeń zadał: $damager1name &cz ilością $damager1damage obrażeń!' + - '&6&l Drugim graczem pod względem obrażeń jest: $damager2name&6, który zadał aż $damager2damage obrażeń!' + - '&e&l Trzecim graczem pod względem obrażeń jest: $damager3name&6, który zadał $damager3damage obrażeń!' + - '&aPogromcy: $players' + - '&e&l---------------------------------------------' +catacombs_tier_10_miniboss: + name: '$minibossLevel &7Terragog' +catacombs_tier_15_boss: + name: '$bossLevel &6The Rattler' + deathMessages: + - '&e&l---------------------------------------------' + - '&9The Rattler rattled away!' + - '&c&l Najwięcej obrażeń zadał: $damager1name &cz ilością $damager1damage obrażeń!' + - '&6&l Drugim graczem pod względem obrażeń jest: $damager2name&6, który zadał aż $damager2damage obrażeń!' + - '&e&l Trzecim graczem pod względem obrażeń jest: $damager3name&6, który zadał $damager3damage obrażeń!' + - '&aPogromcy: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Feeling.. rattled? + - Show me your skeleton! + - You're boned! + - Your calcium is weak! + onDamagedMessages: + - I felt that in my bones! + - I've got a bone to pick with you! + - Doot doot mr skeltal + - I need calcium! + locationMessage: 'The Rattler: $distance blocks away!' + spawnMessage: '&6The Rattler rises!' + deathMessage: '&aThe Rattler has been defeated by $players!' +catacombs_tier_15_mimic_boss: + name: '$bossLevel &6The Forgotten' +catacombs_tier_15_reinforcement: + name: '$reinforcementLevel &eUnturned' +catacombs_tier_5_evoker_guard_2: + name: '$normalLevel &7Catacomb Guard' + onDamageMessages: + - No entry! + - Entry is forbidden! +catacombs_tier_5_illusioner_guard_1: + name: '$normalLevel &7Catacomb Guard' + onDamageMessages: + - No entry! + - Entry is forbidden! +colosseum_tier_70_boss_mount: + name: '$bossLevel &4Pit Lord' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Pit Lord is no more!' + - '&c&l Najwięcej obrażeń zadał: $damager1name &cz ilością $damager1damage obrażeń!' + - '&6&l Drugim graczem pod względem obrażeń jest: $damager2name&6, który zadał aż $damager2damage obrażeń!' + - '&e&l Trzecim graczem pod względem obrażeń jest: $damager3name&6, który zadał $damager3damage obrażeń!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + deathMessage: '&2The Pit Lord has been vanquished by $players!' +colosseum_tier_70_boss_p1: + name: '$bossLevel &cPit Master' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Pit Master has fallen!' + - '&c&l Najwięcej obrażeń zadał: $damager1name &cz ilością $damager1damage obrażeń!' + - '&6&l Drugim graczem pod względem obrażeń jest: $damager2name&6, który zadał aż $damager2damage obrażeń!' + - '&e&l Trzecim graczem pod względem obrażeń jest: $damager3name&6, który zadał $damager3damage obrażeń!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Pit Master: $distance blocks away!' + spawnMessage: '&4The Pit Master charges into battle once more!' + deathMessage: '&2The Pit Master has been slain by $players!' +colosseum_tier_70_boss_p2: + name: '$bossLevel &cPit Master' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Pit Master has fallen!' + - '&c&l Najwięcej obrażeń zadał: $damager1name &cz ilością $damager1damage obrażeń!' + - '&6&l Drugim graczem pod względem obrażeń jest: $damager2name&6, który zadał aż $damager2damage obrażeń!' + - '&e&l Trzecim graczem pod względem obrażeń jest: $damager3name&6, który zadał $damager3damage obrażeń!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Pit Master: $distance blocks away!' + deathMessage: '&2The Pit Master has been slain by $players!' +colosseum_tier_70_boss_reinforcements_p1: + name: '$reinforcementLevel &6Gladiator' +colosseum_tier_70_boss_reinforcements_p2: + name: '$reinforcementLevel &6Gladiator' +colosseum_tier_70_gladiator: + name: '$normalLevel &6Gladiator' +colosseum_tier_70_mount_reinforcements: + name: '$reinforcementLevel &cPit Beast' +dark_cathedral_tier_75_boss: + name: '$bossLevel &4Cultist of Cthulhu' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The summoning has been interrupted!' + - '&c&l Najwięcej obrażeń zadał: $damager1name &cz ilością $damager1damage obrażeń!' + - '&6&l Drugim graczem pod względem obrażeń jest: $damager2name&6, który zadał aż $damager2damage obrażeń!' + - '&e&l Trzecim graczem pod względem obrażeń jest: $damager3name&6, który zadał $damager3damage obrażeń!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Fools! + - Chtulhu R'lyeh! + - None can defeat Chtulhu! + - Stare into the abyss... + locationMessage: 'Cultist of Cthulhu: $distance blocks away' + spawnMessage: '&cA dark cultist is summoning Cthulhu!' + deathMessage: '&2The summoning has been thwarted $players!' + escapeMessage: '&2The cultist has completed the summoning!' +dark_cathedral_tier_75_reinforcement: + name: '$reinforcementLevel Follower of Cthulhu' + onDamageMessages: + - Cthulhu R'lyeh + onDamagedMessages: + - Cthulhu R'lyeh +darkspire_level_100_berserker_brute: + name: '$normalLevel &7Underworld Berserker' +darkspire_level_100_berserker_reanimated: + name: '$normalLevel &fReanimated Underworld Berserker' +darkspire_level_100_blacksmith_brute: + name: '$normalLevel &eSmoldering Goldsmith' +darkspire_level_100_endermite: + name: '$normalLevel &5Pełzacz Pustki' +darkspire_level_100_marksman_piglin: + name: '$normalLevel &9Foolish Marksman' +darkspire_level_100_sentry_brute: + name: '$normalLevel &3Darkguard Sentry' +darkspire_level_100_summon_blaze: + name: '$reinforcementLevel &cHellspawn' +darkspire_level_100_summon_evoker: + name: '$reinforcementLevel &cFalse Hellraiser' +darkspire_level_100_summon_ghast: + name: '$reinforcementLevel &7Maalkvvhar' +darkspire_level_100_summon_husk: + name: '$reinforcementLevel &cOroxak''s Corrupted' +darkspire_level_100_summon_ravager: + name: '$reinforcementLevel &cEerbix the Fallen' +darkspire_level_100_summon_skeleton: + name: '$reinforcementLevel &cRibling' +darkspire_level_110_berserker_reanimated: + name: '$normalLevel &7Reanimated Underworld Berserker' +darkspire_level_110_marksman_reanimated: + name: '$normalLevel &9Reanimated Foolish Marksman' +darkspire_level_110_necromancer_evoker: + name: '$normalLevel &8Black-Hearted Enchanter' +darkspire_level_110_sentry_reanimated: + name: '$normalLevel &3Reanimated Darkguard Sentry' +darkspire_level_110_stationary_stray: + name: '$normalLevel &6Hewn Watchman' +darkspire_level_120_miniboss_evoker: + name: '$minibossLevel &4Hellraiser' +darkspire_level_120_miniboss_illusioner: + name: '$minibossLevel &4Maalkv' +darkspire_level_120_miniboss_skeleton: + name: '$minibossLevel &4Crypt Keeper' +darkspire_level_120_miniboss_stray: + name: '$minibossLevel &4Nicolas Ribcage' +darkspire_level_120_miniboss_vindicator: + name: '$minibossLevel &4Zalmur the Impslayer' +darkspire_level_120_miniboss_wither_skeleton: + name: '$minibossLevel &4Oroxak' +darkspire_level_120_summon_zoglin: + name: '$reinforcementLevel &cArzags Horde' +darkspire_level_130_miniboss_phase_brute: + name: '$bossLevel &4Arzag the Beast' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Arzag the Beast''s invasion has been stopped!' + - '&c&l Najwięcej obrażeń zadał: $damager1name &cz ilością $damager1damage obrażeń!' + - '&6&l Drugim graczem pod względem obrażeń jest: $damager2name&6, który zadał aż $damager2damage obrażeń!' + - '&e&l Trzecim graczem pod względem obrażeń jest: $damager3name&6, który zadał $damager3damage obrażeń!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' +darkspire_level_130_miniboss_zoglin: + name: '$bossLevel &4Arzag the Beast' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Arzag the Beast''s invasion has been stopped!' + - '&c&l Najwięcej obrażeń zadał: $damager1name &cz ilością $damager1damage obrażeń!' + - '&6&l Drugim graczem pod względem obrażeń jest: $damager2name&6, który zadał aż $damager2damage obrażeń!' + - '&e&l Trzecim graczem pod względem obrażeń jest: $damager3name&6, który zadał $damager3damage obrażeń!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Arzag the Beast: $distance blocks away' + spawnMessage: '&4Arzag the Beast prepares for the invasion!' + escapeMessage: '&cArzag the Beast is done plundering!' +darkspire_level_80_summon_blaze: + name: '$reinforcementLevel &dFalse Hellspawn' +fireworks_level_50_boss_phase_1: + name: '$eventBossLevel &cSparky' + spawnMessage: '&eSparks fill the sky!' +fireworks_level_50_boss_phase_2: + name: '$eventBossLevel &cSparky' +fireworks_level_50_boss_phase_3: + name: '$eventBossLevel &cSparky' + deathMessages: + - '&e&l---------------------------------------------' + - '&eSparky''s out, party''s over!' + - '&c&l Najwięcej obrażeń zadał: $damager1name &cz ilością $damager1damage obrażeń!' + - '&6&l Drugim graczem pod względem obrażeń jest: $damager2name&6, który zadał aż $damager2damage obrażeń!' + - '&e&l Trzecim graczem pod względem obrażeń jest: $damager3name&6, który zadał $damager3damage obrażeń!' + - '&aPogromcy: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&6Sparky returns to celebrate!' +fireworks_phase_2_reinforcement: + name: '$eventBossLevel &cBoomi' +fireworks_phase_3_reinforcement: + name: '$eventBossLevel &cPartygoer' +the_great_weaver: + name: '$eventBossLevel &cThe Great Weaver' + locationMessage: '&cThe Great Weaver: $distance blocks away!' + spawnMessage: '&cAwful creatures have appeared!' + deathMessage: '&aThe Great Weaver and it''s brood have been stopped by $players!' + escapeMessage: '&4The Great Weaver and it''s brood have vanished!' +the_great_weaver_summon: + name: '$eventBossLevel &4Brood Mother' +the_great_weaver_summon_1: + name: '$eventBossLevel &6Brood' +halloween_event_boss_mount: + name: '$minibossLevel Daredevil' +halloween_event_boss_p1: + name: '$bossLevel Dullahan' + locationMessage: '&4Dullahan: $distance blocks away!' + spawnMessage: '&4Don''t lose your head now, the headless horseman walks the earth once again!' + deathMessage: '&4The headless horseman was vanquished by $players!' + escapeMessage: '&4The headless horseman has left to haunt someone''s dreams!' +halloween_event_boss_p2: + name: '$bossLevel Dullahan' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Headless Horseman was vanquished!' + - '&c&l Najwięcej obrażeń zadał: $damager1name &cz ilością $damager1damage obrażeń!' + - '&6&l Drugim graczem pod względem obrażeń jest: $damager2name&6, który zadał aż $damager2damage obrażeń!' + - '&e&l Trzecim graczem pod względem obrażeń jest: $damager3name&6, który zadał $damager3damage obrażeń!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Dullahan: $distance blocks away!' + deathMessage: '&4The headless horseman was vanquished by $players!' + escapeMessage: '&4The headless horseman has left to haunt someone''s dreams!' +halloween_event_boss_reinforcement: + name: '$normalLevel Spooky Skeleton' +the_hunter: + name: '$eventBossLevel &4The Hunter' + locationMessage: '&cThe Hunter: $distance blocks away!' + spawnMessage: '&cA Hunter is on the prowl!' + deathMessage: '&aThe Hunter was hunted to extinction by $players!' + escapeMessage: '&4The Hunter declares the hunt now over!' +the_hunter_mount: + name: '$eventBossLevel &fTamed Beast' +the_living_dead: + name: '$reinforcementLevel &6The Living Dead' +northpole_elf: + name: '$normalLevel &2Workshop Elf' +northpole_elf_summon: + name: '$reinforcementLevel &aSanta''s Elf' +northpole_jack_frost: + name: '$bossLevel &bJack Frost' +northpole_krampus: + name: '$bossLevel &5Krampus' +northpole_mrs_claus: + name: '$bossLevel &cMrs. Claus' +northpole_santa_claus: + name: '$bossLevel &4Santa Claus' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Someone stole all of Santa''s presents!' + - '&c&l Najwięcej obrażeń zadał: $damager1name &cz ilością $damager1damage obrażeń!' + - '&6&l Drugim graczem pod względem obrażeń jest: $damager2name&6, który zadał aż $damager2damage obrażeń!' + - '&e&l Trzecim graczem pod względem obrażeń jest: $damager3name&6, który zadał $damager3damage obrażeń!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Santa Claus: $distance blocks away' + spawnMessage: '&4Santa Claus is getting ready for Christmas!!' + escapeMessage: '&cSanta set off on his sleigh!' +northpole_skeleton_summon: + name: '$reinforcementLevel &dSoul of the Naughty List' +northpole_snowy_wraith: + name: '$reinforcementLevel &1Snowy Wraith' +the_phantom: + name: '$eventBossLevel &7The Phantom' + locationMessage: '&cThe Phantom: $distance blocks away!' + spawnMessage: '&cA Phantom roams in the dark!' + deathMessage: '&aThe Phantom and his evil troupe have been stopped by $players!' + escapeMessage: '&4The Phantom has left!' +the_phantom_summon_1: + name: '&fCave Spider' +the_phantom_summon_2: + name: '&fWItch' +the_phantom_summon_3: + name: '&fZombie' +the_phantom_summon_4: + name: '&fHusk' +the_phantom_summon_5: + name: '&fDrowned' +the_phantom_summon_6: + name: '&fSkeleton' +the_phantom_summon_7: + name: '&fStray' +the_phantom_summon_8: + name: '&fEnderman' +pirate_ship_tier_10: + name: '$normalLevel &cCrewman' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_15: + name: '$normalLevel &cDeckhand' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_20_melee_1: + name: '$normalLevel &cShipmate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_20_melee_2: + name: '$normalLevel &eDrunken lout' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_20_miniboss: + name: '$minibossLevel &dCookie the Cook' + onDamageMessages: + - Wat're u doin n my kitchen! + - I've got layers! + - You've been served! + - Out me kitchen! + deathMessage: '&2Cookie the Cook''s been sliced and diced by $players!' +pirate_ship_tier_20_ranged: + name: '$normalLevel &cShipmate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_25_miniboss_1: + name: '$miniboss &cCharon the Helmsman' + onDamageMessages: + - Fools ahoy! + - Worthy opponent at prow! + deathMessage: '&2Charon the Helmsman''s been led astray by $players!' +pirate_ship_tier_30_melee: + name: '$normalLevel &cPirate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_30_miniboss_1: + name: '$minibossLevel &7Crushy the Crusher' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! + deathMessage: '&7Crushy the Crusher has been crushed by $players!' +pirate_ship_tier_30_ranged: + name: '$normalLevel &cPirate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_35: + name: '$normalLevel &4Pirate Navigator' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_35_miniboss_1: + name: '$minibossLevel &cSecond Mate' + onDamageMessages: + - You're not allowed here! + - Captain's quarters, back off! +pirate_ship_tier_35_miniboss_2: + name: '$minibossLevel &cSecond Mate' + onDamageMessages: + - You're not allowed here! + - Captain's quarters, back off! +pirate_ship_tier_40_miniboss_1: + name: '$minibossLevel &4First Hand' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! + deathMessage: '&6The Pirate Ship''s First Hand has been demoted by $players!' +pirate_ship_tier_45_boss: + name: '$bossLevel &4Captain Blackbeard' + onDamageMessages: + - Get off me ship! + - Arr, landlubers! + spawnMessage: '&4Captain Blackbeard is leading the Pirate Ship!' + deathMessage: '&2Captain Blackbeard''s beard''s been shaved by $players!' + escapeMessage: '&2Captain Blackbeard has run away with the plunder!' +the_returned: + name: '$reinforcementLevel &6Nawrócony' +ruins_boss_p1: + name: '$eventBossLevel &9Thor' + spawnMessage: '&6Lightning descends down from the sky!' +ruins_boss_p2: + name: '$eventBossLevel &9Thor' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Thor was sent back to Asgard!' + - '&c&l Najwięcej obrażeń zadał: $damager1name &cz ilością $damager1damage obrażeń!' + - '&6&l Drugim graczem pod względem obrażeń jest: $damager2name&6, który zadał aż $damager2damage obrażeń!' + - '&e&l Trzecim graczem pod względem obrażeń jest: $damager3name&6, który zadał $damager3damage obrażeń!' + - '&aPogromcy: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&6Lightning descends down from the sky!' +ruins_boss_reinforcement: + name: '$eventBossLevel &7Fenrir' +sewer_tier_10: + name: '$normalLevel &fLurker' +sewer_tier_15: + name: '$normalLevel &2Crawler' +sewer_tier_20_dry: + name: '$normalLevel &1Lost Wanderer' +sewer_tier_20_gravity_boss: + name: '$minibossLevel &1Spark' +sewer_tier_20_water: + name: '$normalLevel &1Smuggler' + onDamageMessages: + - You shouldn't be here! + onDamagedMessages: + - None shall stand in our way! +sewer_tier_20_water_boss: + name: '$minibossLevel &1Forgotten Hero' +sewer_tier_20_wither_boss: + name: '$minibossLevel &2Withered Corpse' +sewer_tier_30_ice_boss: + name: '$minibossLevel &2Ice Wraith' +sewer_tier_30_invisibility_boss: + name: '$minibossLevel &2Shadow Archer' +sewer_tier_30_melee: + name: '$normalLevel &5Sewer Beast' +sewer_tier_30_ranged: + name: '$normalLevel &5Spirit Whisperer' + onDamageMessages: + - A curse upon you! + - A pox upon your family! + - Feel the wrath of the spirits! + onDamagedMessages: + - You vex me so! + - Spirits, protect me! +sewer_tier_40: + name: '$normalLevel &6Mirage' + onDamageMessages: + - You victory, a lie + - Your odds, grim + - Your life, mine + onDamagedMessages: + - This pain, an illusion + - This blood, a mirage + - This weakness, a lie +sewer_tier_40_darkness_boss: + name: '$minibossLevel &2The Shadowmaster' +sewer_tier_40_darkness_boss_reinforcement: + name: '$reinforcementLevel &2Shadow' +sewer_tier_40_fire_boss: + name: '$minibossLevel &2The Grill Master' +sewer_tier_40_fire_boss_reinforcement: + name: '$reinforcementLevel &2Flame' +sewer_tier_40_poison_boss: + name: '$minibossLevel &2Toxic Gardener' + onDamageMessages: + - Feel nature's wrath! + onDamagedMessages: + - To me, minions! +sewer_tier_40_poison_boss_reinforcement: + name: '$reinforcementLevel &2Fallen Gardener' +sewer_tier_5: + name: '$normalLevel &7Sewer worker' + onDamageMessages: + - This area is restricted! + - Don't jump into the vats! + - | + You're not supposed to be here| + onDamagedMessages: + - Do you know what you're doing!? + - Foolishness! + - Don't you dare! +sewer_tier_50: + name: '$normalLevel &3Sewer Piranha' +sewer_tier_50_lightning_boss: + name: '$minibossLevel &2Mjolnir' +sewer_tier_50_ravager_boss: + name: '$minibossLevel &2Sewer Monstrosity' +sewer_tier_50_spider_boss: + name: '$minibossLevel &2Ancient Crawler' +sewer_tier_50_spider_boss_reinforcement: + name: '$reinforcementLevel &2Spiderling' +sewer_tier_50_water_boss: + name: '$minibossLevel &2Piranha King' +sewer_tier_50_water_boss_reinforcement: + name: '$reinforcementLevel &2Piranha Prince' +sewer_tier_60: + name: '$normalLevel &4Drowned One' +sewer_tier_70_boss: + name: '$bossLevel &4Drowned King' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Drowned King has been slain!' + - '&c&l Najwięcej obrażeń zadał: $damager1name &cz ilością $damager1damage obrażeń!' + - '&6&l Drugim graczem pod względem obrażeń jest: $damager2name&6, który zadał aż $damager2damage obrażeń!' + - '&e&l Trzecim graczem pod względem obrażeń jest: $damager3name&6, który zadał $damager3damage obrażeń!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&cThe sewers echo with the clamor of a returned king...' + deathMessage: '&2The Drowned King has been slain!' + escapeMessage: '&2The sewers grow quiet, for now...' +sewer_tier_70_boss_reinforcement: + name: '$reinforcementLevel &4Drowned One' +totem_zombie_1: + name: '$eventBossLevel Head Zombie' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Zombie Totem been slain!' + - '&c&l Najwięcej obrażeń zadał: $damager1name &cz ilością $damager1damage obrażeń!' + - '&6&l Drugim graczem pod względem obrażeń jest: $damager2name&6, który zadał aż $damager2damage obrażeń!' + - '&e&l Trzecim graczem pod względem obrażeń jest: $damager3name&6, który zadał $damager3damage obrażeń!' + - '&aPogromcy: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cZombie Totem: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine abomination has been sighted!' + deathMessage: '&aDr. Craftenmine''s abomination been terminated by $players!' + escapeMessage: '&4Dr. Craftenmine''s creation has escaped!' +totem_zombie_2: + name: '$eventBossLevel Totem Zombie' +totem_zombie_3: + name: '$eventBossLevel Totem Zombie' +totem_zombie_4: + name: '$eventBossLevel Totem Zombie' +totem_zombie_5: + name: '$eventBossLevel Totem Zombie' +totem_zombie_6: + name: '$eventBossLevel Totem Zombie' +treasure_goblin: + name: '$eventBossLevel &eGoblin Skarbnik' + deathMessages: + - '&e&l---------------------------------------------' + - '&eGoblin Skarbnik został ograbiony!' + - '&c&l Najwięcej obrażeń zadał: $damager1name &cz ilością $damager1damage obrażeń!' + - '&6&l Drugim graczem pod względem obrażeń jest: $damager2name&6, który zadał aż $damager2damage obrażeń!' + - '&e&l Trzecim graczem pod względem obrażeń jest: $damager3name&6, który zadał $damager3damage obrażeń!' + - '&aPogromcy: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cGoblin Skarbnik jest: $distance bloków od Ciebie!' + spawnMessage: '&cWidziano Goblin Skarbnika!' + deathMessage: '&aGoblin Skarbnik został zgładzony przez $players!' + escapeMessage: '&4A Goblin Skarbnik dał nogę!' +tree_defender: + name: '$eventBossLevel &2Tree Defender' +undead_farmer: + name: '$eventBossLevel &aUndead Farmer' + locationMessage: '&cUndead Farmer: $distance blocks away!' + spawnMessage: '&cAn Undead Farmer walks the earth!' + deathMessage: '&aThe Undead Farmer''s career was ended by $players!' + escapeMessage: '&4The Undead Farmer has gone back to rest!' +undead_farmer_summon: + name: '$eventBossLevel &2Farmers Pride' +undead_farmer_summon_1: + name: '$eventBossLevel &2Failed Hog' +undead_horde_summon_1: + name: '$reinforcementLevel &aUndead Horde' +undead_horde_summon_2: + name: '$reinforcementLevel &dUndead Horde' +undead_horde_summon_3: + name: '$reinforcementLevel &eUndead Horde' +unwanted_visitor: + name: '$eventBossLevel &9Unwanted Visitor' + locationMessage: '&cUnwanted Visitor: $distance blocks away!' + spawnMessage: '&cAn Unwanted Visitor has come to the nether to warm up!' + deathMessage: '&aThe Visitor was slain by $players!' + escapeMessage: '&4The Visitor has gone back to his chilly domain!' +unwanted_visitor_summon: + name: '$eventBossLevel &bIce Clone' +vampire_boneman: + name: '$reinforcementLevel &7Drainlings' +vampire_brute: + name: '$normalLevel &1Vampire Brute' +vampire_brute_coffin_breaker: + name: '$normalLevel &1Vampire Brute' +vampire_brute_gargoyle_rush_left: + name: '$normalLevel &3Vampire Brute' +vampire_brute_gargoyle_rush_left_phase_2: + name: '$normalLevel &3Vampire Brute' +vampire_brute_gargoyle_rush_right: + name: '$normalLevel &3Vampire Brute' +vampire_brute_gargoyle_rush_right_phase_2: + name: '$normalLevel &3Vampire Brute' +vampire_fledgling: + name: '$normalLevel &9Vampire Fledgling' +vampire_fledgling_coffin_breaker: + name: '$normalLevel &9Vampire Fledgling' +vampire_fledgling_gargoyle_overlord: + name: '$normalLevel &9Vampire Fledgling' +vampire_gargoyle: + name: '$normalLevel &6Vampire''s Gargoyle' +vampire_grunt: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_coffin_breaker: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_left: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_left_phase_2: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_right: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_right_phase_2: + name: '$normalLevel &1Vampire Grunt' +vampire_hound: + name: '$reinforcementLevel &bVampire Hound' +vampire_king: + name: '$bossLevel &4Vampire King' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Vampire King has been slain!' + - '&c&l Najwięcej obrażeń zadał: $damager1name &cz ilością $damager1damage obrażeń!' + - '&6&l Drugim graczem pod względem obrażeń jest: $damager2name&6, który zadał aż $damager2damage obrażeń!' + - '&e&l Trzecim graczem pod względem obrażeń jest: $damager3name&6, który zadał $damager3damage obrażeń!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Vampire King: $distance blocks away.' + spawnMessage: '&cThe Vampire King crawls back to his throne...' + deathMessage: '&2The Vampire King has been smitten!' + escapeMessage: '&2Darkness flees, but for how long...' +vampire_king_phase_2: + name: '$bossLevel &4Vampire King' +vampire_king_phase_3: + name: '$bossLevel &4Vampire King' +vampire_king_phase_4: + name: '$bossLevel &4Vampire King' +vampire_king_phase_5: + name: '$bossLevel &4Vampire King' +vampire_king_phase_6: + name: '$bossLevel &4Vampire King' +vampire_level_120_miniboss_evoker: + name: '$minibossLevel &4Hellraiser''s Spirit' +vampire_level_120_miniboss_skeleton: + name: '$minibossLevel &4Crypt Keeper''s Spirit' +vampire_level_120_miniboss_stray: + name: '$minibossLevel &4Nicolas Ribcage''s Spirit' +vampire_level_120_miniboss_wither_skeleton: + name: '$minibossLevel &4Oroxak''s Spirit' +vampire_necromancer: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_dining_hall: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_entrance: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_foresight_pool: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_gargoyle_rush: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_gargoyle_rush_phase_2: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_left_bedroom: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_right_bedroom: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_supply_room: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_supreme_coffin_breaker: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_2: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_3: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_4: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_5: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_gargoyle_overlord: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_gargoyle_overlord_phase_2: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_gargoyle_overlord_phase_3: + name: '$minibossLevel &2Gargoyle Overlord' +vampire_sentinel: + name: '$minibossLevel &eVampire''s Sentinel' +vampire_thrall: + name: '$reinforcementLevel &dVampire''s Thrall' +vampire_wraith: + name: '$minibossLevel &8Drained One' +vampire_wraith_phase_2: + name: '$minibossLevel &8Drowned One' +vampire_zombie: + name: '$normalLevel &aDrained Husk' +vex_top: + name: '$eventBossLevel &eVex Selfish Top' + locationMessage: '&cVex Troublemakers: $distance blocks away!' + spawnMessage: '&cA gang of Vex Troublemakers have appeared!' + deathMessage: '&aThe Vex Troublemakers were slain by $players!' + escapeMessage: '&4The Vex Troublemakers have decided to leave.' +vex_top_mount_1: + name: '$eventBossLevel &6Vex Bottom' +vex_top_mount_2: + name: '$eventBossLevel &6Vex Bottom' +vex_top_mount_3: + name: '$eventBossLevel &6Vex Bottom' +warlock: + name: '$eventBossLevel &dWarlock' + locationMessage: '&cWarlock: $distance blocks away!' + spawnMessage: '&cA demon riding Warlock has appeared!' + deathMessage: '&aThe Warlock was slain by $players!' + escapeMessage: '&4The Warlock ran away on his demon!' +warlock_mount: + name: '$eventBossLevel &dDemon' +wasp_queen: + name: '$eventBossLevel &aWasp Queen' + locationMessage: '&cWasp Queen: $distance blocks away!' + spawnMessage: '&cA wasp swarm has been sighted!' + deathMessage: '&aThe wasp swarm was eliminated by $players!' + escapeMessage: '&4The wasp swarm has flown away.' +wasp_queen_summon: + name: '$eventBossLevel &aWasp' +water_pest: + name: '$eventBossLevel &3Water Pest' + locationMessage: '&cWater Pest: $distance blocks away!' + spawnMessage: '&cAn annoying foe swims the waters!' + deathMessage: '&aThe Water Pest was slain by $players!' + escapeMessage: '&4The waters are clear of all Pests' +weapons_goblin: + name: '$eventBossLevel &cWeapons Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Weapons Goblin has been pillaged!' + - '&c&l Najwięcej obrażeń zadał: $damager1name &cz ilością $damager1damage obrażeń!' + - '&6&l Drugim graczem pod względem obrażeń jest: $damager2name&6, który zadał aż $damager2damage obrażeń!' + - '&e&l Trzecim graczem pod względem obrażeń jest: $damager3name&6, który zadał $damager3damage obrażeń!' + - '&aPogromcy: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cWeapons Goblin: $distance blocks away!' + spawnMessage: '&cA Weapons Goblin has been sighted!' + deathMessage: '&aA Weapons Goblin has been slain by $players!' + escapeMessage: '&4A Weapons Goblin has escaped!' +wendigo: + name: '$eventBossLevel &7Wendigo' + locationMessage: '&cWendigo: $distance blocks away!' + spawnMessage: '&cSomething awful has appeared!' + deathMessage: '&aThe Wendigo has been slain $players!.' + escapeMessage: '&4The Wendigo has disappeared!' +wendigo_summon: + name: '$reinforcementLevel &aWindigo' +werehare: + name: '$eventBossLevel &5Alice' + locationMessage: '&cWerehare: $distance blocks away!' + spawnMessage: '&cA bloody roar can be heard! A werehare approaches!' + deathMessage: '&a$players! made sure to end the werehare''s reign!' + escapeMessage: '&4The werehare escaped!' +werehare_p2: + name: '$eventBossLevel &dWerehare' +wild_wolf: + name: '$reinforcementLevel &7Wild Wolf' +wood_league_wave_10_boss: + name: '$bossLevel &4Bad Doggo' +wood_league_wave_10_reinforcement: + name: '$reinforcementLevel &cBad Pupper' +wood_league_wave_11_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_11_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_12_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_12_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_13_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_13_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_14_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_14_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_15_miniboss: + name: '$bossLevel &4Mr. Oinkers' + onDamagedMessages: + - Oink!? +wood_league_wave_16_melee: + name: '$normalLevel Mr. Oinkers Fan' +wood_league_wave_16_ranged: + name: '$normalLevel Mr. Oinkers Fan' +wood_league_wave_17_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_17_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_18_melee: + name: '$normalLevel &4Fencing Club Enthusiast' +wood_league_wave_19_ranged: + name: '$normalLevel Archery Club Enthusiast' +wood_league_wave_1_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_1_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_20_boss: + name: '$bossLevel &2Zoltan' +wood_league_wave_21_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_21_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_22_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_22_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_23_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_23_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_24_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_24_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_25_miniboss: + name: '$minibossLevel &bAgdluak' +wood_league_wave_26_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_26_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_27_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_27_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_28_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_29_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_2_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_2_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_30_boss: + name: '$bossLevel &2The Southern Viper' +wood_league_wave_31_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_31_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_32_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_32_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_33_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_33_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_34_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_34_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_35_miniboss: + name: '$minibossLevel &6The Jester' +wood_league_wave_36_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_36_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_37_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_37_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_38_melee: + name: '$normalLevel &4Arena Swordsman' +wood_league_wave_39_ranged: + name: '$normalLevel Arena Archer' +wood_league_wave_3_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_3_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_40_boss: + name: '$bossLevel &cCrucio the Bearer of Curses' +wood_league_wave_41_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_41_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_42_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_42_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_42_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_43_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_43_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_43_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_44_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_44_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_44_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_45_miniboss: + name: '$minibossLevel &6Thousand Blades' +wood_league_wave_46_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_46_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_46_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_47_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_47_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_47_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_48_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_48_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_49_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_49_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_4_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_4_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_50_boss: + name: '$bossLevel &6Uther the Champion' +wood_league_wave_50_boss_p2: + name: '$bossLevel &6Uther the Champion' +wood_league_wave_50_boss_p3: + name: '$bossLevel &6Uther the Champion' +wood_league_wave_50_reinforcement: + name: '$reinforcementLevel &6Uther Stan' +wood_league_wave_5_miniboss: + name: '$minibossLevel &cWeird Cow' + onDamagedMessages: + - Woof! +wood_league_wave_6_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_6_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_7_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_7_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_8_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_9_ranged: + name: '$normalLevel Arena Crossbowman' +yeti: + name: '$eventBossLevel &bYeti' + locationMessage: '&cYeti: $distance blocks away!' + spawnMessage: '&cA mighty beast has appeared!' + deathMessage: '&aThe beast is no more thanks to $players!.' + escapeMessage: '&4The beast has escaped!' +yezhi_baba: + name: '$eventBossLevel &cYezhi Baba' + locationMessage: '&cYezhi Baba: $distance blocks away!' + spawnMessage: '&cA foul hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +yezhi_baba_summon: + name: '$reinforcementLevel &4Yezhi Baba' +zombie_friends_friend: + name: '$reinforcementLevel &7Ziomek Zombiego' +zombie_king: + name: '$eventBossLevel &4Król Zombie' + locationMessage: '&cKról Zombie jest: $distance bloków od Ciebie!' + spawnMessage: '&cKról Zombie został zauważony!' + deathMessage: '&aKról Zombie został zgładzony przez $players!' + escapeMessage: '&4Władca Zombie uciekł!' +zombie_parents_dad: + name: '$reinforcementLevel &7Tata Zombie' +zombie_parents_mom: + name: '$reinforcementLevel &7Mama Zombie' +back_teleporter: + name: Hermes + role: + greetings: + - Witaj w\nCentrum Przygód Gildii! + dialog: + - Potrzebujesz powrotu? + farewell: + - Bezpiecznej podróży, przyjacielu. + noPreviousLocationMessage: '&8[EliteMobs] &cNie można wysłać cię z powrotem do poprzedniej lokalizacji - nie znaleziono poprzedniej lokalizacji!' +barkeep: + name: Bartley + role: + greetings: + - Potrzebujesz się napić? + - Chcesz pić + - Spragniony? + - Cześć partneru. + dialog: + - Miej jedną z naszych specjalności domowych. + - Specjalne napoje, nie znajdziesz\nich nigdzie indziej. + - Raz spróbujesz i,\nwrócisz po więcej. + farewell: + - Wróć w każdej chwili + - Na dół! + - Kampai! + - Zdrowie! + - Na zdrowie! + - Zdrowie! + - Twoje zdrowie! + - Głupek! + - Święty! + - Zdrowie! + - Zdrowie! + - Na zdrowie! + - Twoje zdrowie! +blacksmith: + name: Greg + role: + greetings: + - Witamy w naszym sklepie! + - Sprzedaj swoje towary tutaj! + - Świeże towary, tylko dla Ciebie! + - Masz coś do sprzedaży? + - Chcesz kupić coś dobrego? + - Świeże towary za każdym razem! + dialog: + - Moby wyższego poziomu upuszczają\nprzedmioty wyższej wartości! + - Przedmioty z mnóstwem \nzaklęć są warte więcej! + - Moby wyższego poziomu upuszczają\nlepsze przedmioty! + - Moby wyższego poziomu mają\nwiększe szanse na wypadnięcie łupu! + - Elitarne moby są przyciągane do\npancerza, im lepsza zbroja,\n tym wyższy jest ich poziom! + - Niektóre przedmioty mają specjalne\nefekty mikstury! + - Niektóre przedmioty mają unikalne\nefekty! + - Zaklęcie myśliwego\nprzyciąga elitarne moby do Twojej\nlokalizacji! + - Broń specjalna i zbroja\nupuszczone przez elitarne moby\nmogą być sprzedane tutaj! + - Wyższe rangi gildii\nzwiększają jakość łupów\nz elitarnych mobów! + farewell: + - Dziękujemy za współpracę! + - Wracaj szybko! + - Wróć w każdej chwili! + - Poleć ten sklep swoim\nznajomym! +combat_instructor: + name: Karol + role: + greetings: + - Chcesz dowiedzieć się więcej o walce? + - Potrzebujesz lekcji walki? + - Chcesz wiedzieć więcej o walce? + - Gotowy do walki z Elitarnymi Mobami? + dialog: + - Przedmioty wokół Elitarnych Mobów\npokazują, jakie posiadają moce. + - Im wyższy poziom\nElitarnego moba, tym\nwięcej moga mieć mocy + - Im wyższy poziom\nElitarnego moba, tym\nmogą mieć lepszy łup + - Im wyższy poziom\nElitarnego moba, tym większa\nszansa na specjalny łup + - Elitarne Moby z latającą\nstrzałą strzelają do\npobliskich graczy + - Elitarne Moby z latającym\nokiem enderu oślepiają\nkiedy Ciebie uderzą + - Elitarne Moby z latającymi\ncząsteczkami magii dezorientują\nkiedy Ciebie uderzą + - Elitarne Moby z latającym\nwiaderkiem lawy podpalają\nkiedy Ciebie uderzą + - |- + Elite Mobs with floating\nfireballs fire fireballs + at nearby players + - Elitarne Moby z latającym\nlodem zamrażają\nkiedy Ciebie uderzą + - Elitarne Moby z latającą\nelytrą sprawiają że latasz\nkiedy Ciebie uderzą + - Elitarne Moby z latającym\nszmaragdem zatruwają\nkiedy Ciebie uderzą + - Elitarne Moby z latającym\ntłokiem odrzucają\nkiedy Ciebie uderzą + - Elitarne Moby z latającym\ntotemem osłabiają\nkiedy Ciebie uderzą + - Elitarne Moby z latającą\npajęczyną zaplątują\nkiedy Ciebie uderzą + - Elitarne Moby z latającą\nczaszką ususzają\nkiedy Ciebie uderzą + - Elitarne Moby z latającą\nskrzynką mają dodatkowy łup\nkiedy je zabijesz + - Elitarne Moby z latającymi\nzłotymi butami są szybsze + - Elitarne Moby z latającą\nszafą grającą wyśmiewają\nCiebie podczas walki + - Elitarne Moby z latającą\nszybą są niewidzialne + - Elitarne Moby z latającymi\nwidmowymi strzałami są\nodporne na strzały + - Elitarne Moby z latającym\npiórem są odporne na\nobrażenia od upadku + - Elitarne Moby z latającym\nogniem są odporne\nna ogień + - Elitarne Moby z latającym\nkowadłem są cięższe\nniż zwykłe + - Elitarne moby z latającymi\nblokami kości zostawiają\nzwłoki po zabiciu + - Elitarne moby z latającym\nblokiem szlamu skaczą wyżej\nniż zwykle + - Elitarne moby z latającą\nkulką szlamu tworzą szczepionkę\npo śmierci + - Elitarne Moby z latającą\nsmyczą zaplątują\nkiedy Ciebie uderzą + - Elitarne moby z latającą\n kością tworzą filary kości\npodczas walki + - Elitarne moby z latającą\nstrzałą z miksturą strzelają\nstrzałami podczas walki + - Elitarne moby z latającym\nmuchomorem rosną aż do uzyskania statusu\ngianta po trafieniu + - Elitarne moby z latającą\nczaszką przywołują posiłki\npo uderzeniu + - Elitarne moby z latającą\nksiążką przywołują posiłki\ndopóki nie zabijesz przywoływacza + - Elitarne moby z latającym\njajkiem przywołują posiłki\npo uderzeniu + - Elitarne moby z latającą\nfajerwerką przywołują Drużynę\nRakiet po trafieniu +enhancer_config: + name: Tim + role: + greetings: + - Chcesz może ulepszyć swoje przedmioty? + - Masz może kule ulepszeń? + - Tutaj możesz ulepszyć swoje przedmioty! + - Ahoj! + - Ye masz może złom synu? + dialog: + - Twoje przedmioty są słabe\nmożesz za to jest ulepszyć tutaj! + - Tutaj możesz ulepszyć swoje przedmioty! + - Ye masz może kule ulepszeń? + - Ten miecz wygląda okropnie,\nulepsz go u mnie! + - Potrzebujesz ulepszenia? + farewell: + - Powodzenia! + - Przybądź do mnie kiedy będziesz miał więcej kul ulepszeń! + - Idź zdobądź więcej kul ulepszeń! +frost_queen_teleporter: + name: Ishard the Frostbitten + role: + greetings: + - '' +guide_0: + name: Dux + role: + greetings: + - Heard about the AG? + - Been to the AG? + - Heard of the Adventurer's Guild? + - Know about the Adventurer's Guild? + dialog: + - Heard about the AG? + - Been to the AG? + - Heard of the Adventurer's Guild? + - Know about the Adventurer's Guild? + farewell: + - Wróć w każdej chwili + - Będę tutaj, jeśli mnie potrzebujesz! + - I'll be around! + - Do zobaczenia później! +guide_1: + name: Casus + role: + greetings: + - Need guidance? + - Need a hint + - Are you lost? + - Need help? + dialog: + - I know everything about\nthis place! + - Want to meet the other members\nof the Adventurer's Guild? + - Need to learn your way around\nthis place? + farewell: + - Wróć w każdej chwili + - Będę tutaj, jeśli mnie potrzebujesz! + - I'll be around! + - Do zobaczenia później! +guild_attendant: + name: Gillian + role: + greetings: + - Witaj w\nCentrum Przygód Gildii! + - Witaj! + dialog: + - Sprawdź tablicę zadań, aby\nzobaczyć aktywne zadanie! + - Możesz porozmawiać ze mną, aby\nzmianić rangę Twojej gildii! + - Możesz sprzedać przedmioty\nkowalowi za monety! + - Możesz porozmawiać z mistrzem areny,\n aby udać się na arenę! + - Możesz kupić wyposażenie od\nkowala! + - Możesz porozmawiać z mistrzem walki,\naby sprawdzić swój poziom walki! + - Odblokowanie nowych poziomów poradników\nzwiększa twoje maksymalne zdrowie! + farewell: + - Do zobaczenia wkrótce! + - Dziękuję za zatrzymanie się! + - Szczęśliwego polowanie! +primis_69ozcanofbepis: + name: '&a69OzCanOfBepis' + role: '&2Map Maker (Uuuuge gamer)' + dialog: + - Hope you are enjoying the map! + farewell: + - Have fun! +primis_caeruleaum_fisherman: + name: '&3Piscis Nemesis' + role: '&b' + greetings: + - Hiya!. + dialog: + - Woah! Almost fell off the boat. + - Darn sea monster! + - Need more bait. + farewell: + - Later! + - Good luck! +primis_caeruleaum_fletcher: + name: '&6Ventus Artifex' + role: '&e' + greetings: + - Witaj. + dialog: + - Kiedyś byłem wojownikiem takim jak ty. + - Witaj, obcy człowieku + - Potrzebujesz czegoś? + - |- + Nie jesteś z okolicy, + prawda? + farewell: + - Do zobaczenia wkrótce! + - Wracaj szybko! +primis_caeruleaum_forager: + name: '&5Wenator Pabulatus' + role: '&d' + greetings: + - Witaj nieznajomy. + dialog: + - Kiedyś byłem wojownikiem takim jak ty. + - Witaj, obcy człowieku + - Potrzebujesz czegoś? + - |- + Nie jesteś z okolicy, + prawda? + farewell: + - Do zobaczenia wkrótce! + - Wracaj szybko! +primis_caeruleaum_hint_giver: + name: '&fVir Loquax' + role: '&fMędrzec' + greetings: + - Witam! + - Cześć! + - Dobrze cię widzieć! + - Witaj! + dialog: + - Wyglądasz silnie i potężnie. Porozmawiaj z kilkoma \nz osadników, jeśli chcesz nam pomóc. + - Dawno temu była piękna świątynia\nna południowy wschód, to wielka szkoda co się z nią stało. + - Ruiny na południowym zachodzie to tak straszne miejsce!\n Kto chciałby by tam iść... + - Poznałem kiedyś potężnego maga,\nbył w stanie przywołać piękną ścianę lodową.\nSzkoda, że ona by się popsuła, gdyby on stracił przytomność. + - Słyszałem, że paskudny wilk\n zadomowił się w wilczym legowisku! + farewell: + - Do zobaczenia! + - Do zobaczenia później! + - Odwiedź mnie ponownie! + - Bywaj! +primis_caeruleaum_injured_fisherman: + name: '&3Callidus Piscatus' + role: '&b' + greetings: + - Witaj, wędrowcze. + dialog: + - Złapałeś może ostatnio jakąkolwiek dobrą rybę? + - Witaj, obcy człowieku + - Potrzebujesz czegoś? + - |- + Nie jesteś z okolicy, + prawda? + farewell: + - Do zobaczenia wkrótce! + - Wracaj szybko! +primis_caeruleaum_jeeves: + name: Jeeves + role: + greetings: + - Just traveling! + dialog: + - Just here to sell\nto the shop-keep. + - I'm busy negotiating\nhere. + - Not right now,\ncome back later. + farewell: + - Uhuh... +primis_caeruleaum_leader: + name: '&4Wódz Piscis' + role: '&c' + greetings: + - Witaj w naszej wiosce! + dialog: + - |- + Zapytaj nie co ta wioska może dla ciebie zrobić, + zapytaj co możesz zrobić dla tej wioski! + - Witaj, obcy człowieku + - Potrzebujesz czegoś? + - |- + Nie jesteś z okolicy, + prawda? + farewell: + - Ruszaj! + - Wracaj szybko! +primis_caeruleaum_merchant: + name: Emptor + role: + greetings: + - Masz coś do sprzedania? + dialog: + - Bandyci ukradli moje towary! + - Niestety nie mam nic na sprzedaż. + - Kupię wszystko, co masz! + farewell: + - Bezpiecznych podróży! +primis_captain: + name: '&4Kapitan Squalus' + role: '&c' + greetings: + - W końcu się obudziłeś! + - To była dzika jazda! + - Wciąż żyjesz? + - Nie róbmy tego ponownie! + dialog: + - Mam dla Ciebie zadanie! + - Potrzebuję twojej pomocy! + - |- + Dobrze, że tu jesteś, + potrzebujemy pomocy! + farewell: + - Ruszaj! + - Nie zapomnij o mnie! + - Wracaj szybko! +primis_deli'o: + name: '&eDéli''O' + role: '&6Map Maker (Gamer)' + dialog: + - Hope you are enjoying the map! + farewell: + - Have fun! +primis_farmstead_son: + name: '&4Filiusz' + role: '&c' + greetings: + - Skąd pochodzisz? + - Wygląda na to, że przyszedłeś daleko stąd. + dialog: + - Żyjemy w niebezpiecznych czasach. + - Widziałeś mojego ojca? + - Bez latarni morskiej jak ludzie by nawigowali po morzach? + farewell: + - Uważaj na siebie! + - Stąpaj ostrożnie! +primis_farmstead_wife: + name: '&4Amavit' + role: '&c<Żona Strażnika Latarni>' + greetings: + - Nie widziałam cię wcześniej! + - Jakiekolwiek wieści z Pontis Mille? + dialog: + - Widziałeś mojego męża? + - Potrzebuję twojej pomocy! + - Żyjemy w niebezpiecznych czasach. + - Coś jest nie tak! + farewell: + - Bezpiecznych podróży! + - Dziękuję! +primis_first_mate: + name: '&cIracundi' + role: '&c' + greetings: + - W końcu się obudziłeś! + - To była dzika jazda! + - Wciąż żyjesz? + - Nie róbmy tego ponownie! + dialog: + - Mam dla Ciebie zadanie! + - Potrzebuję twojej pomocy! + - |- + Dobrze, że tu jesteś, + potrzebujemy pomocy! + farewell: + - Ruszaj! + - Nie zapomnij o mnie! + - Wracaj szybko! +primis_frostcone: + name: '&bFrostCone' + role: '&9Map Maker (Gamer)' + dialog: + - Hope you are enjoying the map! + - It's a pine-cone covered in snow. + - Czy Primis jest już dostępny? + farewell: + - Have fun! +primis_gladius_guard_1: + name: '&2Strażnik Miasta' + role: '&a' + greetings: + - Stąpaj ostrożnie! + - Posiłki? + - Cholerni najeźdźcy! + - Uważaj na siebie! + - Bądź ostrożny. +primis_gladius_guard_2: + name: '&2Strażnik Miasta' + role: '&a' + greetings: + - Stąpaj ostrożnie! + - Posiłki? + - Cholerni najeźdźcy! + - Uważaj na siebie! + - Bądź ostrożny. +primis_gladius_guard_3: + name: '&2Strażnik Miasta' + role: '&a' + greetings: + - Stąpaj ostrożnie! + - Posiłki? + - Cholerni najeźdźcy! + - Uważaj na siebie! + - Bądź ostrożny. +primis_gladius_guard_4: + name: '&2Strażnik Miasta' + role: '&a' + greetings: + - Stąpaj ostrożnie! + - Posiłki? + - Cholerni najeźdźcy! + - Uważaj na siebie! + - Bądź ostrożny. +primis_gladius_lord: + name: '&4Generał Hasta' + role: '&c' + greetings: + - Jesteś tutaj, aby pomóc? + - To jest strefa wojenna! + dialog: + - Przybyli w nocy! + - Nie spodziewaliśmy się ich! + - Gdzie są nasze posiłki? + farewell: + - Uważaj na siebie! + - Stąpaj ostrożnie! +primis_gladius_quartermaster: + name: '&6Cibus' + role: '&c' + greetings: + - Jesteś tutaj, aby pomóc? + - To jest strefa wojenna! + dialog: + - Przybyli w nocy! + - Nie spodziewaliśmy się ich! + - Gdzie są nasze posiłki? + farewell: + - Uważaj na siebie! + - Stąpaj ostrożnie! +primis_gladius_strategist: + name: '&6Belli' + role: '&c' + greetings: + - Jesteś tutaj, aby pomóc? + - To jest strefa wojenna! + dialog: + - Przybyli w nocy! + - Nie spodziewaliśmy się ich! + - Gdzie są nasze posiłki? + farewell: + - Uważaj na siebie! + - Stąpaj ostrożnie! +primis_groves_nemus_leader: + name: '&3King Nemian' + role: '&c' + dialog: + - What brings you under the hill? + - Where are you from? + - |- + Have you tried our + delicious glow berries? + farewell: + - Until next time. +primis_ice_village_fisherman_boat: + name: '&3Theopropides Nero' + role: '&3' + greetings: + - Fishy day! + dialog: + - A chilly day for fishing. + - They aren't biting. + - Just gotta be patient. + farewell: + - Don't fall into\nthe water! +primis_ice_village_friendly_villager: + name: '&3Luxuria Placidus' + role: '&3' + greetings: + - Hellos! + dialog: + - Old age will not\nslow me down! + - Being in a good\nmood is important. + - Hoping for some\nsnow soon. + farewell: + - Farewell! +primis_ice_village_generic_npc_1: + name: '&3Albertus Vitalis' + role: '&3' + greetings: + - How goes it. + dialog: + - Nothing like good ale! + farewell: + - Bye. +primis_ice_village_generic_npc_10: + name: '&3Trebatia Cornix' + role: '&3' + greetings: + - OK. + dialog: + - Yep, got it. + - I see... + - Oh! + farewell: + - I will try that\nnext time. +primis_ice_village_generic_npc_11: + name: '&3Albatia Lateranus' + role: '&3' + greetings: + - Visiting Violet? + dialog: + - Don't cause trouble. + farewell: + - Later stranger. +primis_ice_village_generic_npc_12: + name: '&3Hostilia Carantus' + role: '&3' + greetings: + - Hi. + dialog: + - I was just\nleaving. + farewell: + - Bye. +primis_ice_village_generic_npc_13: + name: '&3Vagennia Sejanus' + role: '&3' + greetings: + - Hiya. + dialog: + - What brings you\nto the docks? + farewell: + - See ya. +primis_ice_village_generic_npc_14: + name: '&3Dinia Vettonius' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_15: + name: '&3Sceledrus Marcallas' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_16: + name: '&3Fridericus Castinus' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_17: + name: '&3Cario Fimbria' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_18: + name: '&3Piscatores Laevinus' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_19: + name: '&3Monkerius Vitalis' + role: '&3' + greetings: + - Been hunting? + dialog: + - Time to go hunting. + farewell: + - Farewell. +primis_ice_village_generic_npc_2: + name: '&3Luxuria Tyranus' + role: '&3' + greetings: + - How goes it. + dialog: + - One more! + farewell: + - Bye. +primis_ice_village_generic_npc_3: + name: '&3Aurelio Nigidius' + role: '&3' + greetings: + - Hey there. + dialog: + - What a sight! + farewell: + - Goodbye. +primis_ice_village_generic_npc_4: + name: '&3Lysidamus Paratus' + role: '&3' + greetings: + - Out for a walk? + dialog: + - I couldn't imagine\nliving somewhere\nwithout snow. + - Starting to get chilly. + farewell: + - Until later. +primis_ice_village_generic_npc_5: + name: '&3Simo Proceus' + role: '&3' + greetings: + - What a view! + dialog: + - I love climbing. + - Look at all the fish! + farewell: + - Yep. +primis_ice_village_generic_npc_6: + name: '&3Dordalus Marullinus' + role: '&3' + greetings: + - Welcome to the pub! + dialog: + - Time to warm up\nmy fingers. + - Nice and warm. + farewell: + - Don't let the\ncold get ya. +primis_ice_village_generic_npc_7: + name: '&3Tranio Silvanus' + role: '&3' + greetings: + - Here somewhere.. + dialog: + - Where is it. + farewell: + - I was sure I\nleft it here. +primis_ice_village_generic_npc_8: + name: '&3Milonia Trebellius' + role: '&3' + greetings: + - Welcome to our\nvillage! + dialog: + - I sure am hungry. + - Could go for\nsome salmon. + farewell: + - Farewell. +primis_ice_village_generic_npc_9: + name: '&3Barria Brocchus' + role: '&3' + greetings: + - Did you hear... + dialog: + - Keep that in mind\nnext time you swing\nyour sword. + - The shield can be\nmore than defense. + farewell: + - Got it? +primis_ice_village_hunter: + name: '&3Alanus Isatis' + role: '&3' + greetings: + - Hey! + dialog: + - Hoping for a good\nday tomorrow. + - Sure are many Razorbacks\nout this season. + farewell: + - Be seeing you. +primis_ice_village_imprisoned_husband: + name: '&3Eleusium Calenus' + role: '&3' + greetings: + - '.....' + dialog: + - Another day in a cage... + farewell: + - '.....' +primis_ice_village_jail_caretaker: + name: '&3Philolaches Triferus' + role: '&3' + greetings: + - Hey there. + dialog: + - What else needs\nfixing. + - I should check up\non the cages. + farewell: + - Later. +primis_ice_village_jail_guard: + name: '&3Eleusium Festus' + role: '&3' + greetings: + - Climbed the\ntower eh. + dialog: + - Everything seems in order. + - Almost everything... + farewell: + - Take care. +primis_ice_village_jail_master: + name: '&3Romanus Superbus' + role: '&3' + greetings: + - Well met. + dialog: + - Don't do the crime if\nyou can't do the time. + - Crime doesn't pay. + farewell: + - Until later. +primis_ice_village_leader: + name: '&3Glacies Princeps' + role: '&3' + greetings: + - Hey. + dialog: + - Darn Ice Elemental! + - Too many problems... + - How are we supposed to\ncomplete the trials now. + farewell: + - Goodbye. +primis_ice_village_lighthouse_keeper: + name: '&3Severinus Martius' + role: '&3' + greetings: + - Well met stranger. + dialog: + - Calm day today. + - Watch out for\nthe Ursus! + farewell: + - Take it easy. +primis_ice_village_missing_daughter: + name: '&3Cornelia Ennodius' + role: '&3' + greetings: + - Help... + dialog: + - Go away, go away,\nGO AWAY! + - They are not\nreal... + - Just don't look\nat them Cornelia. + farewell: + - Bye. +primis_ice_village_prisoner: + name: '&3Adrius Calpornius' + role: '&3' + greetings: + - I am innocent! + dialog: + - This is not where\nI belong!!! + farewell: + - Get me out of here! +primis_ice_village_pubkeeper: + name: '&3Grania Cecilius' + role: '&3' + greetings: + - Welcome! + dialog: + - Coming right up! + - Try our black ale! + - Need a drink? + farewell: + - One coming up! +primis_ice_village_tower_squatter: + name: '&3Modestus Eulogius' + role: '&3' + greetings: + - The noise! + dialog: + - So much screeching! + - Just trying to\nenjoy the peace. + farewell: + - Bye. +primis_ice_village_violet: + name: '&5Domina Violet' + role: '&d' + greetings: + - Did I ask\nyour opinion? + dialog: + - Feels good to\nget it out. + - They're gonna pay\nwhile I collect. + farewell: + - No, that's what I thought. +primis_ice_village_worried_father: + name: '&3Sparax Ennodius' + role: '&3' + greetings: + - I hope she is OK... + dialog: + - Let our girl be\nsafe, please. + farewell: + - Bye. +primis_ice_village_worried_mother: + name: '&3Sestia Ennodius' + role: '&3' + greetings: + - Where did she go. + dialog: + - Hmm, lost the trail. + farewell: + - Bye. +primis_ice_village_worried_wife: + name: '&3Titia Calenus' + role: '&3' + greetings: + - Hiya! + dialog: + - Nice and clean beds. + - Did I miss something? + - Another chest sorted. + farewell: + - Bye! +primis_magmaguy: + name: '&4Magmaguy' + role: '&cLead Developer (Non-gamer)' + dialog: + - Hope you are enjoying the map! + farewell: + - Have fun! +primis_mountain_guide: + name: '&4Petrae' + role: '&c' + greetings: + - Witaj w naszej wiosce! + dialog: + - |- + Zapytaj nie co ta wioska może dla ciebie zrobić, + zapytaj co możesz zrobić dla tej wioski! + - Witaj, obcy człowieku + - Potrzebujesz czegoś? + - |- + Nie jesteś z okolicy, + prawda? + farewell: + - Ruszaj! + - Wracaj szybko! +primis_mountain_guide_2: + name: '&4Petrae' + role: '&c' + greetings: + - Witaj w naszej wiosce! + dialog: + - |- + Zapytaj nie co ta wioska może dla ciebie zrobić, + zapytaj co możesz zrobić dla tej wioski! + - Witaj, obcy człowieku + - Potrzebujesz czegoś? + - |- + Nie jesteś z okolicy, + prawda? + farewell: + - Ruszaj! + - Wracaj szybko! +primis_nemus_leader: + name: '&3Król Nemian' + role: '&c' + dialog: + - Co cię tu sprowadza? + - Skąd jesteś? + - |- + Próbowałeś naszych + pysznych świecących jagód? + farewell: + - Do następnego raza. +primis_ogre_mines_escaped_miner: + name: '&cFugit Fossores' + role: '&c' + greetings: + - Nie mogę uwierzyć, że mi się udało! + - Są wszędzie! + - Mógłbyś wyciągnąć pomocną dłoń? + dialog: + - Mam dla Ciebie zadanie! + - Potrzebuję twojej pomocy! + farewell: + - Ruszaj! + - Bądź w tym miejscu ostrożny! + - Bądź bezpieczny! +primis_ogre_mines_lone_miner: + name: '&cFortis Fossores' + role: '&c' + greetings: + - W końcu jakaś pomoc! + - Nie pozwól im Cię zobaczyć! + - Pomocy! + dialog: + - Mam dla Ciebie zadanie! + - Potrzebuję twojej pomocy! + farewell: + - Ruszaj! + - Wróć do kopalni dla mnie! + - Bądź bezpieczny! +primis_ogre_mines_old_miner: + name: '&cVetus Fossores' + role: '&c' + greetings: + - Witaj młody! + - Wyglądasz na trochę zagubionego! + - Co cię tu sprowadza? + dialog: + - Mam dla Ciebie zadanie! + - Potrzebuję twojej pomocy! + farewell: + - Ruszaj! + - Nie pozwól, aby roztocza z kopalni cię ugryzły! + - Bądź bezpieczny! +primis_ogre_mines_panicked_miner: + name: '&cMetus' + role: '&c' + greetings: + - Kopalnia jest spustoszona! + dialog: + - Ogry są wszędzie! + - Czy możesz nam pomóc? + farewell: + - Bądź ostrożny! +primis_pontis_citizen_1: + name: '&7Agorastocles Gorgonius' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_10: + name: '&7Pardalisca Saunio' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_11: + name: '&7Sobersides Colias' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_12: + name: '&7Saturio Caepio' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_13: + name: '&7Chrysalus Trebonius' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_14: + name: '&7Toxilus Micon' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_15: + name: '&7Phronesium Viridio' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_16: + name: '&7Aurelio Zoilus' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_17: + name: '&7Diniarchus Nelius' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_18: + name: '&7Cleostrata Senopius' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_19: + name: '&7Georgius Sorio' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_2: + name: '&7Franciscus Crispian' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_20: + name: '&7Epidicus Silvanus' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_21: + name: '&7Pleusicles Marcellinus' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_22: + name: '&7Plesidippus Nerva' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_23: + name: '&7Plesidippus Megellus' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_24: + name: '&7Fridericus Achaicus' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_25: + name: '&7Curculio Zosimus' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_26: + name: '&7Demipho Sylvius' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_27: + name: '&7Peniculus Nemesius' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_28: + name: '&7Tyndarus Faustinius' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_29: + name: '&7Sulpicio Panthera' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_3: + name: '&7Tycho Sellic' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_30: + name: '&7Melaenis Gelasius' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_31: + name: '&7Tyndarus Columbanus' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_32: + name: '&7Antamonides Cerinthus' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_33: + name: '&7Lesbonicus Momus' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_34: + name: '&7Fridericus Saloninus' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_35: + name: '&7Anterastilis Fabricius' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_36: + name: '&7Tyndarus Augustalis' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_37: + name: '&7Modestus Aper' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_38: + name: '&7Henricus Crassus' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_39: + name: '&7Franciscus Tancinus' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_4: + name: '&7Advocati Micon' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_40: + name: '&7Phygia Aurelius' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_5: + name: '&7Advocati Micon' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_6: + name: '&7Messenio Rectus' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_7: + name: '&7Hadrius Donicus' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_8: + name: '&7Sulpicio Sejanus' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_citizen_9: + name: '&7Stasimus Mutilus' + role: '&8Mieszkaniec Pontis' + dialog: + - Byłeś w obserwatorium? + - Skąd podróżowałeś? + - Nie wyglądasz jakbyś był stąd... + - Dziś jest wspaniały dzień. + farewell: + - Do zobaczenia wkrótce! + - Bywaj! +primis_pontis_dockworker_1: + name: '&3Członek Załogi z Pontis' + role: '&8Pracownik Doków' + dialog: + - Mnóstwo zaopatrzenia do przeniesienia! + - Uważaj! + - Z drogi! + farewell: + - Do zobaczenia później! +primis_pontis_dockworker_10: + name: '&3Członek Załogi z Pontis' + role: '&8Pracownik Doków' + dialog: + - Mnóstwo zaopatrzenia do przeniesienia! + - Uważaj! + - Z drogi! + farewell: + - Do zobaczenia później! +primis_pontis_dockworker_2: + name: '&3Członek Załogi z Pontis' + role: '&8Pracownik Doków' + dialog: + - Mnóstwo zaopatrzenia do przeniesienia! + - Uważaj! + - Z drogi! + farewell: + - Do zobaczenia później! +primis_pontis_dockworker_3: + name: '&3Członek Załogi z Pontis' + role: '&8Pracownik Doków' + dialog: + - Mnóstwo zaopatrzenia do przeniesienia! + - Uważaj! + - Z drogi! + farewell: + - Do zobaczenia później! +primis_pontis_dockworker_4: + name: '&3Członek Załogi z Pontis' + role: '&8Pracownik Doków' + dialog: + - Mnóstwo zaopatrzenia do przeniesienia! + - Uważaj! + - Z drogi! + farewell: + - Do zobaczenia później! +primis_pontis_dockworker_5: + name: '&3Członek Załogi z Pontis' + role: '&8Pracownik Doków' + dialog: + - Mnóstwo zaopatrzenia do przeniesienia! + - Uważaj! + - Z drogi! + farewell: + - Do zobaczenia później! +primis_pontis_dockworker_6: + name: '&3Członek Załogi z Pontis' + role: '&8Pracownik Doków' + dialog: + - Mnóstwo zaopatrzenia do przeniesienia! + - Uważaj! + - Z drogi! + farewell: + - Do zobaczenia później! +primis_pontis_dockworker_7: + name: '&3Członek Załogi z Pontis' + role: '&8Pracownik Doków' + dialog: + - Mnóstwo zaopatrzenia do przeniesienia! + - Uważaj! + - Z drogi! + farewell: + - Do zobaczenia później! +primis_pontis_dockworker_8: + name: '&3Członek Załogi z Pontis' + role: '&8Pracownik Doków' + dialog: + - Mnóstwo zaopatrzenia do przeniesienia! + - Uważaj! + - Z drogi! + farewell: + - Do zobaczenia później! +primis_pontis_dockworker_9: + name: '&3Członek Załogi z Pontis' + role: '&8Pracownik Doków' + dialog: + - Mnóstwo zaopatrzenia do przeniesienia! + - Uważaj! + - Z drogi! + farewell: + - Do zobaczenia później! +primis_pontis_enhancer: + name: '&7Meliorem' + role: '&8' + greetings: + - Potrzebujesz coś ulepszyć? + - Masz jakiś złom? + - Ulepszajmy! + dialog: + - Ulepszę jak dasz mi złom! + - Przynieś mi złom! + - Ulepsz swoje uzbrojenie w zamian za złom! +primis_pontis_gardener_1: + name: '&eGorgines Asina' + role: '&8Ogrodnik' + dialog: + - Czy te kwiatki nie są piękne? + - Oto moje arcydzieło! + - Kwiaty kwitną. + farewell: + - Proszę, nie depcz tych pięknych kwiatów. + - Uważaj jak idziesz! +primis_pontis_gardener_2: + name: '&ePiscatores Orissus' + role: '&8Ogrodnik' + dialog: + - Czy te kwiatki nie są piękne? + - Oto moje arcydzieło! + - Kwiaty kwitną. + farewell: + - Proszę, nie depcz tych pięknych kwiatów. + - Uważaj jak idziesz! +primis_pontis_gardener_3: + name: '&eAlcesimus Abito' + role: '&8Ogrodnik' + dialog: + - Czy te kwiatki nie są piękne? + - Oto moje arcydzieło! + - Kwiaty kwitną. + farewell: + - Proszę, nie depcz tych pięknych kwiatów. + - Uważaj jak idziesz! +primis_pontis_gardener_4: + name: '&ePyrgopolynices Perpenna' + role: '&8Ogrodnik' + dialog: + - Czy te kwiatki nie są piękne? + - Oto moje arcydzieło! + - Kwiaty kwitną. + farewell: + - Proszę, nie depcz tych pięknych kwiatów. + - Uważaj jak idziesz! +primis_pontis_gardener_5: + name: '&eLemniselenis Gelasius' + role: '&8Ogrodnik' + dialog: + - Czy te kwiatki nie są piękne? + - Oto moje arcydzieło! + - Kwiaty kwitną. + farewell: + - Proszę, nie depcz tych pięknych kwiatów. + - Uważaj jak idziesz! +primis_pontis_gardener_6: + name: '&eLysimachus Sulinus' + role: '&8Ogrodnik' + dialog: + - Czy te kwiatki nie są piękne? + - Oto moje arcydzieło! + - Kwiaty kwitną. + farewell: + - Proszę, nie depcz tych pięknych kwiatów. + - Uważaj jak idziesz! +primis_pontis_gardener_7: + name: '&eStrobilus Farus' + role: '&8Ogrodnik' + dialog: + - Czy te kwiatki nie są piękne? + - Oto moje arcydzieło! + - Kwiaty kwitną. + farewell: + - Proszę, nie depcz tych pięknych kwiatów. + - Uważaj jak idziesz! +primis_pontis_groves_catacombs_npc: + name: '&7Inaequaliter Hyaena' + role: '&7' + greetings: + - Psssst! + dialog: + - I heard there is great\ntreasure to be had! + - Something wonderful awaits\nyou if you enter! + - You should adventure\ninto this place... + - Why not go in? + - You should go inside... + - Don't worry, it's\ncompletely safe. + - No danger. I swear! + - Take a look inside. + - You should check\nout this place! + - He he he he he... + - What if somebody\ninside needs help. + - Go in, go in! + - Aren't you curious? + - Surely you should\ntake a peek. + farewell: + - He he he, later! +primis_pontis_groves_generic_npc_1: + name: '&2Sycophanta Mucius' + role: '&2' + greetings: + - I'm fine! + dialog: + - Do not worry about me. + - My brother will come rescue me. + - They won't eat me. + - I assure you I will be just fine. + farewell: + - Web ya later! +primis_pontis_groves_generic_npc_10: + name: '&2Hostilia Metunus' + role: '&2' + greetings: + - Hellos. + dialog: + - Are you bored too? + - Ugh, there must be something to do. + - Maybe I should brew more drinks. + farewell: + - See ya! +primis_pontis_groves_generic_npc_11: + name: '&2Tortilia Getha' + role: '&2' + greetings: + - Hi there. + dialog: + - My husband makes the best cakes. + - Want a slice? + - So delicious and moist! + farewell: + - Bye! +primis_pontis_groves_generic_npc_12: + name: '&2Consentia Apellinus' + role: '&2' + greetings: + - Oh, hello. + dialog: + - There, as good as new! + - Have to make sure the light keeps them away. + - Another lantern fixed... + farewell: + - Don't let the spiders bite! +primis_pontis_groves_generic_npc_13: + name: '&2Novia Senecius' + role: '&2' + greetings: + - Hi! + dialog: + - Oh, did not expect to see anyone here. + - Just gotta be quick and they can't get ya. + - The spiders don't stop me. + - This is my favorite resting spot. + farewell: + - Stay safe. +primis_pontis_groves_generic_npc_14: + name: '&2Maximia Priscus' + role: '&2' + greetings: + - Shhhh... + dialog: + - Thought you could\nsteal from me elves... + - Gonna get back my\npossessions when\nthey go sleep. + - Made it here by\ngoing around. + - They never saw\nme coming. + farewell: + - Keep it down. +primis_pontis_groves_generic_npc_15: + name: '&2Herennia Exsupereus' + role: '&2' + greetings: + - Hey there. + dialog: + - Just woke up. + - It's gonna be a good\nday I can feel it. + farewell: + - Bye bye. +primis_pontis_groves_generic_npc_16: + name: '&2Atria Maursus' + role: '&2' + greetings: + - Greetings. + dialog: + - Not sure how the king\nexpects me to do\nall of this... + - So much work.. + - Busy, busy, busy. + - This paperwork\nwon't do itself. + farewell: + - Bye bye. +primis_pontis_groves_generic_npc_17: + name: '&2Felicius Esurpus' + role: '&2' + greetings: + - Greetings! + dialog: + - If you need anything\nspeak to the king. + - Sorry, I am busy. + - No time for chit-chat,\nmy apologies. + farewell: + - Goodbye. +primis_pontis_groves_generic_npc_2: + name: '&2Sceledrus Fredisius' + role: '&2' + greetings: + - Heya! + dialog: + - I am actually fishing for bugs. + - Large aqua-bugs fall from the trees. + - I use tree sap as bait. + - The aqua-bugs cannot resist the bait! + - They are actually amphibious. + - Gotta catch'em before they head for the trees. + - They are quite tasty if you roast them. + - Hoping for a good catch! + farewell: + - Later. +primis_pontis_groves_generic_npc_3: + name: '&2Felicius Surius' + role: '&2' + greetings: + - Hi there! + dialog: + - The ocean is so pretty. + - I could stand here for days. + - The spiders sure are annoying. + farewell: + - Bye. +primis_pontis_groves_generic_npc_4: + name: '&2Periplectomenus Burcanius' + role: '&2' + greetings: + - Welcome! + dialog: + - Plenty of glow berries left. + - Hope you like my little farm. + - So many wines to attend to. + farewell: + - See you later. +primis_pontis_groves_generic_npc_5: + name: '&2Stephanus Magnus' + role: '&2' + greetings: + - Hey there! + dialog: + - Did you check out the berry farm? + - Lovely time for a walk. + - Can't be inside all the time. + farewell: + - Have a good one. +primis_pontis_groves_generic_npc_6: + name: '&2Abundantius Rogatus' + role: '&2' + greetings: + - Hiya! + dialog: + - What brings you into our lovely hole? + - Feel free to stay a while. + farewell: + - Bye. +primis_pontis_groves_generic_npc_7: + name: '&2Albanus Ivmarus' + role: '&2' + greetings: + - Easy there... + dialog: + - What? Yes, I'm doing just fine. + - I did not have too many, nope. + - Just one more... + - One more pint... + farewell: + - Farewell. +primis_pontis_groves_generic_npc_8: + name: '&2Bacchis Aventinus' + role: '&2' + greetings: + - Good day or evening... + dialog: + - I am so cozy right now. + - We used to go outside more often. + - Too many dangers outside these days. + farewell: + - Bless ya. +primis_pontis_groves_generic_npc_9: + name: '&2Pasicompsa Getha' + role: '&2' + greetings: + - Come in, come in! + dialog: + - Welcome to the best hole in the grove! + - Built this hole with my own hands! + - Hope you enjoy your stay! + farewell: + - Come back soon! +primis_pontis_groves_hole_luxuria: + name: '&cLuxuria Gorgonius' + role: '&c' + greetings: + - Hi there! + - Hellos! + dialog: + - Life is all about taking it easy. + - Why stress. + farewell: + - Visit us again! +primis_pontis_groves_hole_phygia: + name: '&cPhygia Gorgonius' + role: '&c' + greetings: + - Welcome to my home! + - Hellos! + dialog: + - We have to take action! + - Too many elves in our grove. + farewell: + - Visit us again! +primis_pontis_groves_lighthouse_generic_npc_1: + name: '&3Eleusium Martius' + role: '&3' + greetings: + - What brings you here? + dialog: + - Gotta make sure the\nlighthouse is working. + - Nice to see someone\ncome visit. + farewell: + - Goodbye. +primis_pontis_groves_lighthouse_generic_npc_2: + name: '&3Caelia Zoilus' + role: '&3' + greetings: + - Hey. + dialog: + - I hope he will\nbe alright. + - My turn to watch\nover the light. + - We almost ran\nout of food. + farewell: + - Bye. +primis_pontis_groves_lighthouse_sick_man: + name: '&3Alanus Secundas' + role: '&c' + dialog: + - I don't feel so good + - Hopefully I recover soon. + - Well, I am feeling a bit better. + - We need more food. + farewell: + - Farewell. +primis_pontis_groves_parkour_npc_1: + name: '&3Posuere Hominem' + role: '&c' + dialog: + - Up for a challenge? + - You think you got what it takes? + - Wanna go swinging? + - You a mad lad? + - No cheating! + farewell: + - See you later. +primis_pontis_groves_parkour_npc_2: + name: '&cIdoneitatem Hominem' + role: '&3' + dialog: + - That was impressive! + - Try and beat my record of 1m 47s. + - No cheating! + farewell: + - See you later. +primis_pontis_guard: + name: '&cStrażnik Pontis' + role: '&8' + greetings: + - Chcesz ulepszyć wyposażenie? + dialog: + - Zgubiłeś się? Podążaj za kolorowymi dachami mostów. + - Każda ścieżka mostkowa ma co najmniej jeden kolor! + - Trzymaj się z dala od kłopotów! + - Nie powoduj żadnych problemów! + - Pontis został zbudowany jak labirynt do obrony. + - Pułapy mostu pokazują kolor ścieżki! +primis_pontis_guard_1: + name: '&cStrażnik Pontis' + role: '&8' + greetings: + - Chcesz ulepszyć wyposażenie? + dialog: + - Zgubiłeś się? Podążaj za kolorowymi dachami mostów. + - Każda ścieżka mostkowa ma co najmniej jeden kolor! + - Trzymaj się z dala od kłopotów! + - Nie powoduj żadnych problemów! + - Pontis został zbudowany jak labirynt do obrony. + - Pułapy mostu pokazują kolor ścieżki! +primis_pontis_guard_2: + name: '&cStrażnik Pontis' + role: '&8' + greetings: + - Witaj! + dialog: + - Tędy do szoguna! +primis_pontis_guard_rat: + name: '&cPontis Elite Guard' + role: '&8' + greetings: + - Darn rats! + dialog: + - Filthy rats!!! + - Hold still,\ndarn you! + - Stop dodging\nmy attacks! + - Almost got one! + - Just die! + - Why wont you die!!! + - You can't dodge\nforever! + - Next strike! + - You're dead! + - How dare you\ndodge! + - Almost! +primis_pontis_guard_rat_at_wormhole: + name: '&cPontis Elite Guard' + role: '&8' + greetings: + - What's taking\nso long. + dialog: + - We got this\nunder control. + - Do not worry,\nthe elite guard\nis on the case! +primis_pontis_guard_shogun_1: + name: '&4Royal Guard' + role: '&8' + dialog: + - Nie wpakuj się w kłopoty. + - Don't mind me, just keeping the peace. + - No funny business here. + - I've got my eye on you, adventurer. + - No questions, and no one gets hurt! + - Ain't got no time for messing around. + farewell: + - Bezpiecznej podróży. +primis_pontis_guard_shogun_1_cat_quest: + name: '&4Royal Guard' + role: '&8' + dialog: + - Don't go getting into trouble. + - Don't mind me, just keeping the peace. + - No funny business here. + - I've got my eye on you, adventurer. + - No questions, and no one gets hurt! + - Ain't got no time for messing around. + farewell: + - Safe travels, adventurer. +primis_pontis_mille_arena_master_observatory: + name: Stella Hominis + role: + greetings: + - Hellos! + dialog: + - I hope to see many stars. + - Such heavenly bodies! + - The cosmos calls to me. + - Infinite possibilities. + - The ancient knowledge... + - I have tales to tell. + - If only you knew... + farewell: + - May the stars bless you. +primis_pontis_mille_concerned_shipmate: + name: '&3Delphium Calpurnius' + role: '&8' + dialog: + - Sigh. + - So much for my\nshipments... + farewell: + - Safe travels! +primis_pontis_mille_fields_camp_generic_npc_1: + name: '&cScribonia Ingenvinus' + role: '&c' + dialog: + - The most dangerous\nweapon is the one\nbetween your ears. + - Three arrows\nis all I need. + farewell: + - Catch ya later! +primis_pontis_mille_fields_camp_generic_npc_2: + name: '&cValador Lumus' + role: '&c' + dialog: + - I have hunted in\nmany places. + - Do you travel\na lot too? + farewell: + - May your blade be swift. +primis_pontis_mille_fields_camp_generic_npc_3: + name: '&cPhygia Ahala' + role: '&c' + dialog: + - Nothing like a\ngood hunt! + farewell: + - Stay safe. +primis_pontis_mille_fields_camp_generic_npc_4: + name: '&cAdrius Paterculus' + role: '&c' + dialog: + - The hunt calls! + farewell: + - Swift death. +primis_pontis_mille_fields_camp_generic_npc_5: + name: '&cCappadox Galerus' + role: '&c' + dialog: + - Join us, stranger! + farewell: + - Later. +primis_pontis_mille_fields_camp_generic_npc_6: + name: '&cSulpicio Rutilius' + role: '&c' + dialog: + - Hope our camp\nprovides you respite\nfrom the wild. + farewell: + - Bye. +primis_pontis_mille_fields_camp_generic_npc_7: + name: '&cAquarius Manus' + role: '&c' + dialog: + - Don't mind me just\nfetching some water. + - Clear blue water today. + farewell: + - Bye. +primis_pontis_mille_fields_camp_magmus: + name: '&cMagmus Hypnos' + role: '&4' + dialog: + - Where is Volumnia... + - I hope she isn't in\ntrouble again. + - I need a good rest. + - If only there were more\nhours in the day. + - Speak to me when you\nhave found Volumnia. + - So much work,\nso little time. + - Yet another 17 hour day. + - I worry too much. + farewell: + - Never enough time... +primis_pontis_mille_fields_farm_berry_npc: + name: '&9Dordalus Nasica' + role: '&e' + dialog: + - Berries are so tasty! + - You should eat\nmore berries! + - Why would they\nsteal my berries... + farewell: + - See'd ya later. +primis_pontis_mille_fields_farm_boy_npc: + name: '&9Planesium Victricius' + role: '&e' + dialog: + - So many rats... + - Phew almost\ndone here. + - This thing better hold. + - Any more lifting and\nI'm gonna break. + - The view from here\nis really nice. + - OK, back to work! + farewell: + - Try some our berries! +primis_pontis_mille_fields_farm_npc: + name: '&9Milonia Majus' + role: '&e' + dialog: + - Get away, darn rats! + - Stop eating my goods! + - Sigh... + farewell: + - Later. +primis_pontis_mille_fields_farm_well_npc: + name: '&eVolumnia Zoilus' + role: '&c' + dialog: + - Watch out for its spit! + - Its saliva is toxic. + - Please help! + - I hope nobody hears\nabout this... + - Am I glad to see you! + farewell: + - How could I let this happen. +primis_pontis_mille_fields_windmill_npc_1: + name: '&eDinia Niraemius' + role: '&d' + dialog: + - Plenty of wheat to process! + - No flour no bread. + - Do you like bread too? + farewell: + - See you. +primis_pontis_mille_fields_windmill_npc_2: + name: '&eDaemones Maritialis' + role: '&d' + dialog: + - It's so nice out here! + - Do you like my windmill? + - Just out here on break. + farewell: + - See you. +primis_pontis_mille_fields_windmill_npc_3: + name: '&eAdulescens Lupis' + role: '&d' + dialog: + - Hoping for some good wind! + - Need some flour? + - This one is the best Windmill around! + farewell: + - Bless ya. +primis_pontis_mille_general_bromia: + name: '&6Bromia Curio' + role: '&6General' + greetings: + - Hail! + dialog: + - It's time for war! + farewell: + - Goodbye! +primis_pontis_mille_general_cylindrus: + name: '&eCylindrus Celatus' + role: '&eGeneral' + greetings: + - Hail! + dialog: + - There is not enough time! + farewell: + - Goodbye! +primis_pontis_mille_general_godefridus: + name: '&cGodefridus Novation' + role: '&c' + greetings: + - Greetings! + - Hail! + dialog: + - Someone needs to drop\noff these documents. + - So many candles... + farewell: + - See you +primis_pontis_mille_general_rogerius: + name: '&eRogerius Olennius' + role: '&eGeneral' + greetings: + - Hail! + dialog: + - So much to do! + - I hope those 4 are ok... + farewell: + - Bye! +primis_pontis_mille_lighthouse_man: + name: '&3Hegio Remus' + role: '&c' + dialog: + - It is so beautiful up here. + - The best view... + farewell: + - Farewell. + - The sun sets! +primis_pontis_mille_major: + name: '&cFortes Bellator' + role: '&c' + greetings: + - Hello traveler! + - Hail! + dialog: + - Those darn goblins! + farewell: + - Farewell! +primis_pontis_mille_mew_meowzer: + name: '&aMew Meowzer' + role: '&d' + dialog: + - Meooooww! + - Meow... + - Mreeeooooowww... + - Meowww. + - MEOW! + farewell: + - Prrrr meow! +primis_pontis_mille_observatory_arena_turn_in: + name: Virgo Dexippus + role: + greetings: + - Hi! + dialog: + - Stella knows a lot. + - Stars have so much to tell. + - The light tells all. + farewell: + - May the moon light your way. +primis_pontis_mille_royal_guard_centurion: + name: '&4Royal Guard Centurion' + role: '&8' + dialog: + - No dallying! + - Set up camp! + - Where are our reinforcements? + - How many have fallen? + - We need to reorganize! + farewell: + - Tread lightly and carry a big sword. +primis_pontis_mille_scout_1: + name: '&cSyra Ursacius' + role: '&cWounded Scout' + greetings: + - Hail! + dialog: + - I can barely hold on... + farewell: + - Bye! +primis_pontis_mille_scout_2: + name: '&cSparax Auxilius' + role: '&cWounded Scout' + greetings: + - Hail! + dialog: + - The pain... + farewell: + - Bye! +primis_pontis_mille_scout_leader: + name: '&cBlepharo Octavius' + role: '&cScout Leader' + greetings: + - Hail! + dialog: + - It was too much... + farewell: + - Bye! +primis_pontis_mille_shogun: + name: '&6Navita' + role: '&c' + greetings: + - Tak? + dialog: + - Potrzebujesz pomocy? + farewell: + - Idź powoli i zawsze noś ze sobą duży pistolet. +primis_pontis_mille_slums_generic_npc_1: + name: '&7Gallicles Rex' + role: '&7' + dialog: + - It's not much but its our\nlittle part of town + farewell: + - Later. +primis_pontis_mille_slums_generic_npc_2: + name: '&7Gallicles Caelistis' + role: '&7' + dialog: + - Day by day... + farewell: + - '...' +primis_pontis_mille_slums_generic_npc_3: + name: '&7Nicodemus Frontinus' + role: '&7' + dialog: + - Fresh water for\nthe home. + farewell: + - The well serves\nus well +primis_pontis_mille_slums_generic_npc_4: + name: '&7Cocus Lucio' + role: '&7' + dialog: + - Hope you're having\na great day. + farewell: + - Enjoy your stay. +primis_pontis_mille_slums_generic_npc_5: + name: '&7Cornelia Florius' + role: '&7' + dialog: + - Which one should\nI get... + farewell: + - So many pretty\nflowers. +primis_pontis_mille_slums_generic_npc_6: + name: '&7Rutilia Placidus' + role: '&7' + dialog: + - I love it here. + - The smell of hay\nmakes me happy. + - My favorite place to\nrelax after a hard day. + farewell: + - Hay ya later! +primis_pontis_mille_slums_npc_1: + name: '&7Lena Lucan' + role: '&7' + dialog: + - Just one loaf of bread... + farewell: + - Wonder what tomorrow brings. +primis_pontis_mille_slums_npc_2: + name: '&7Tranio Florens' + role: '&7' + dialog: + - Doing OK today\nactually. + farewell: + - Night save ya. +primis_pontis_mille_slums_npc_3: + name: '&7Rufia Tertulus' + role: '&7' + dialog: + - At least something\ngood for\nthe kids. + - Not much at\nthe market... + - I cannot\nafford that. + farewell: + - Later. +primis_pontis_mille_slums_npc_4: + name: '&7Fabia Praetextus' + role: '&7' + dialog: + - Just close my eyes\nfor a second. + - Gotta imagine I am\nat a better place. + farewell: + - Goodbye. +primis_pontis_mille_slums_npc_5: + name: '&7Augustina Verrucosis' + role: '&7' + dialog: + - So many mouths\nto feed. + - Maybe some fruit\nfor the little\nones. + farewell: + - Bye. +primis_pontis_mines_guard_1: + name: '&cPontis Guard' + role: '&c' + greetings: + - HELP!!! + dialog: + - Please kill them! + - I am so scared. +primis_pontis_mines_guard_2: + name: '&cPontis Guard' + role: '&c' + greetings: + - SOMEONE PLEASE!!! + dialog: + - I don't wanna die! + - Can't hold out any more. +primis_pontis_mines_guard_3: + name: '&cPontis Guard' + role: '&c' + greetings: + - SAVE ME!!! + dialog: + - Are they gone? + - GET ME OUT! +primis_pontis_outpost_officer: + name: '&4NAME ME' + role: '&8' + dialog: + - I am unfinished! + - There is supposed\nto be an outpost\nhere. + farewell: + - Bye! +primis_pontis_redwoods_injured_lumberjack: + name: '&6Lyco Lupicinus' + role: '&6' + greetings: + - Heyo! + dialog: + - Darn saw! + - Got me again... + farewell: + - See you later. +primis_pontis_redwoods_lumberjack: + name: '&6Ligna Crispian' + role: '&6' + greetings: + - Greetings! + dialog: + - I love the look of a healthy tree. + - The brown tree really smells. + - |- + Pretty sure I saw a wolf on two legs + creeping around at night around here. + farewell: + - Until next time. +primis_pontis_redwoods_lumberjack_generic_1: + name: '&6Mulier Proculus' + role: '&6' + greetings: + - Hey-yo! + dialog: + - I wish they would leave us alone. + - Perfect day for logging. + farewell: + - Pinecone ya later! +primis_pontis_redwoods_lumberjack_generic_10: + name: '&6Piscatores Trenico' + role: '&6' + greetings: + - Well met! + dialog: + - Go away wolves! + - Leave me alone, darn fur-balls! + - Hah! Try and reach me up here! + farewell: + - Bye, Bye! +primis_pontis_redwoods_lumberjack_generic_2: + name: '&6Alanus Hermina' + role: '&6' + greetings: + - Hi... + dialog: + - Not so loud, keep it down. + - I am catching an extra break. + - Don't tell em I am here. + - Logging is tough work... + farewell: + - Later +primis_pontis_redwoods_lumberjack_generic_3: + name: '&6Lena Triarius' + role: '&6' + greetings: + - What's up! + dialog: + - Just standing here buzzin! + - Operating the saw is kinda fun. + - Gotta make sure you don't get hurt. + farewell: + - Catch you later! +primis_pontis_redwoods_lumberjack_generic_4: + name: '&6Aquila Isatis' + role: '&6' + greetings: + - How's it going! + dialog: + - Darn logs! + - No, not that way! + - Float better!!! + - Yep, that will do it. + farewell: + - See ya! +primis_pontis_redwoods_lumberjack_generic_5: + name: '&6Sulpicio Sidonius' + role: '&6' + greetings: + - Hi! + dialog: + - Nothing like a nice fire! + - Just relaxing after an honest day of work. + - Join us! + farewell: + - Bye, friend! +primis_pontis_redwoods_lumberjack_generic_6: + name: '&6Strobilus Clemens' + role: '&6' + greetings: + - Salutations! + dialog: + - Chopping like a beaver! + - The fastest axe in the west. + - No tree is a match for me! + farewell: + - Smell ya later! +primis_pontis_redwoods_lumberjack_generic_7: + name: '&6Candidus Nigellus' + role: '&6' + greetings: + - Greetings! + dialog: + - Fastest axe...my bottom! + - Don't take his ramblings seriously. + - Mr. big-shot sure has a lot to say. + farewell: + - Goodbye! +primis_pontis_redwoods_lumberjack_generic_8: + name: '&6Strobilus Clemens' + role: '&6' + greetings: + - I'm a bit busy! + dialog: + - We need to increase production... + - If we raise the cost... + - Need to order more axes. + farewell: + - Uh... +primis_pontis_redwoods_lumberjack_generic_9: + name: '&6Martinus Lepontus' + role: '&6' + greetings: + - Woah, hello! + dialog: + - You're coming down big one! + - I will show you! + - My axe, your bark, they should meet. + - Start off with a good chop. + farewell: + - Scared me... +primis_pontis_redwoods_lumberlord: + name: '&6Magnus Castorea' + role: '&6' + greetings: + - HELLO! + dialog: + - Nothing like healthy wood. + - |- + For every tree we cut, + we plant a new one! + - Big brown logs, yep. + farewell: + - BYE! +primis_pontis_redwoods_reyn: + name: '&6Reynus Protectoris' + role: '&6' + greetings: + - I am turning up the heat! + - Hiya! + dialog: + - Are you into logs? + - I love the smell of lumber! + farewell: + - See you later. + - Bye bye! +primis_pontis_scrapper: + name: '&7Fragmentum' + role: '&8' + greetings: + - Masz coś do zezłomowania? + - Masz jakieś śmieci? + - Potrzebujesz złomowania? + dialog: + - Zezłomuje wszystko, co mi dasz! + - Potrzebujesz złomowania? + - Chcesz coś złomować? +primis_pontis_smelter: + name: '&7Orbis' + role: '&8' + greetings: + - Chcesz ulepszyć wyposażenie? + dialog: + - Potrzebujesz kuli ulepszeń? + - Zrobię kule ulepszeń za złom! + - Przynieś mi złom! +primis_sewer_donatello: + name: '&5Donatello' + role: '&dObrońca Ścieków' + dialog: + - Co słychać? + - Jak udało Ci się nas znaleźć? + - Uważaj na Strzępiciela! + farewell: + - Do zobaczenia później! +primis_sewer_leonardo: + name: '&1Leonardo' + role: '&9Obrońca Ścieków' + dialog: + - Co słychać? + - Jak udało Ci się nas znaleźć? + - Uważaj na Strzępiciela! + farewell: + - Do zobaczenia później! +primis_sewer_michelangelo: + name: '&6Michelangelo' + role: '&eObrońca Ścieków' + dialog: + - Co słychać? + - Jak udało Ci się nas znaleźć? + - Uważaj na Strzępiciela! + farewell: + - Do zobaczenia później! +primis_sewer_raphael: + name: '&4Raphael' + role: '&cObrońca Ścieków' + dialog: + - Co słychać? + - Jak udało Ci się nas znaleźć? + - Uważaj na Strzępiciela! + farewell: + - Do zobaczenia później! +primis_spa_attendee_1: + name: '&fNatsumi' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_2: + name: '&5Hanako' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_3: + name: '&3Tamika' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_4: + name: '&9Zaphra' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_5: + name: '&4Chie' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_6: + name: '&fKatashi' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_7: + name: '&dAkihiko' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_8: + name: '&6Sheranee' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - Rawr... + - OwO + farewell: + - Have fun! +primis_spa_staff: + name: '&cAozora' + role: '&7' + dialog: + - Enjoy the hot spring! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_staff_2: + name: '&6Rei' + role: '&7' + dialog: + - Enjoy the hot spring! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_terravilla_annoyed_explorer: + name: '&6Dorippa Sarimarcus' + role: '&6' + greetings: + - How's it going. + dialog: + - Not again. + - Stuck once more. + farewell: + - Be seeing you. +primis_terravilla_explorer: + name: '&6Telestis Senna' + role: '&6' + greetings: + - How goes it. + dialog: + - Always so\nbusy. + - Need a bag? + farewell: + - Bye. +primis_terravilla_generic_npc_1: + name: '&6Stephanium Major' + role: '&6' + greetings: + - Welcome to Terravilla! + dialog: + - Watch out for the\nTwo Legged Terrors! + - Here to check out the ruins? + farewell: + - Bye. +primis_terravilla_generic_npc_10: + name: '&6Mallia Galvisius' + role: '&6' + greetings: + - Heyo! + dialog: + - I would rather be in\ndown in the ruins... + - Hog watching to\npass the time. + farewell: + - Laters. +primis_terravilla_generic_npc_11: + name: '&6Papiria Virginius' + role: '&6' + greetings: + - Ok then... + dialog: + - Hit him harder! + - Woah! Good one! + - Yeah! Mess him up! + farewell: + - Yep... +primis_terravilla_generic_npc_12: + name: '&6Umbria Maccalus' + role: '&6' + greetings: + - What! + dialog: + - Is a girl not\nallowed to be\non a rooftop. + - Just try and\nget me down! + farewell: + - Yeah, whatever... +primis_terravilla_generic_npc_2: + name: '&6Delphium Assanius' + role: '&6' + greetings: + - Leave me alone! + dialog: + - What are you\nlooking at. + farewell: + - Scram! +primis_terravilla_generic_npc_3: + name: '&6Stephanium Vopiscus' + role: '&6' + greetings: + - Leave me alone! + dialog: + - What are you\nlooking at. + farewell: + - Scram! +primis_terravilla_generic_npc_4: + name: '&6Simo Clericus' + role: '&6' + greetings: + - Hey! + dialog: + - Heard the hog is on\nthe lift again. + farewell: + - Bye. +primis_terravilla_generic_npc_5: + name: '&6Harpax Colias' + role: '&6' + greetings: + - Ello. + dialog: + - The bo...I mean the\nOverseer is upstairs. + farewell: + - Laters. +primis_terravilla_generic_npc_6: + name: '&6Sulpicio Epolonius' + role: '&6' + greetings: + - Hi there. + dialog: + - I hope the ruins\nopen up again soon. + - I miss artifact\nhunting. + farewell: + - Goodbye. +primis_terravilla_generic_npc_7: + name: '&6Baebia Lucan' + role: '&6' + greetings: + - '...' + dialog: + - Cringe... + farewell: + - '...' +primis_terravilla_generic_npc_8: + name: '&6Novia Longinus' + role: '&6' + greetings: + - '...' + dialog: + - Are you always\nstaring at people? + - How about some\nprivacy? + farewell: + - '...' +primis_terravilla_generic_npc_9: + name: '&6Septimia Baro' + role: '&6' + greetings: + - Oh, hey. + dialog: + - If it opens up again\nthen I gotta go\nget more of these. + - What is this skull\nnfrom hmm... + farewell: + - '...' +primis_terravilla_overseer: + name: '&6Lutum Princeps' + role: '&6' + greetings: + - Yes? + dialog: + - What is it\nnow... + - I need to check\nup on them. + - At least I\nam not bored. + farewell: + - Good luck. +primis_terravilla_researcher: + name: '&6Plautia Suilius' + role: '&6' + greetings: + - Hmm... + dialog: + - Maybe if... + - That can't be right + - Not sure... + farewell: + - Later... +primis_traveler_1: + name: '&6Lysidamus Nolus' + role: '&6' + greetings: + - Hello stranger! + dialog: + - On my way back from the village. + - Heading to the village? + - Good luck on\nyour travels. + farewell: + - Roads bless you. +primis_traveler_2: + name: '&6Citro Gala' + role: '&6' + greetings: + - Hi! + dialog: + - On my way back\nfrom the village. + - Coming from Pontis Mille or? + - Good luck! + farewell: + - Roads bless you. +primis_traveler_3: + name: '&6Bromia Culleolus' + role: '&6' + greetings: + - Hello! + dialog: + - Are you too going\nto the village? + - I heard it's pretty\ncold there at\nthe village. + - Phew! Almost there!\nI gotta keep going. + farewell: + - Roads bless you. +primis_traveler_4: + name: '&6Demenis Nolus' + role: '&6' + greetings: + - Hello stranger! + dialog: + - Good to see someone\nelse on the road. + - Almost reached the village. + - Phew! + farewell: + - Roads bless you. +primis_traveler_5: + name: '&6Callipho Classicius' + role: '&6' + greetings: + - Heya! + dialog: + - I need better shoes. + - Soon I will\nbe home. + - Good to see the\nfields again! + farewell: + - Safe travels! +primis_traveler_6: + name: '&6Rodenus Palis' + role: '&6' + greetings: + - Hi there! + dialog: + - I am on my way back\nfrom the village. + - Good to see\nPontis Mille again. + - Is my brother lost again... + - Where is he? + farewell: + - Later! +primis_traveler_7: + name: '&6Gorenus Palis' + role: '&6' + greetings: + - Hey... + dialog: + - Am I lost again? + - This isn't Pontis Mille. + - Where am I? + - Uhh, this doesn't\nseem like the\nright way... + farewell: + - Bye. +quest_giver: + name: Qel'Thuzad + role: + greetings: + - Witam, poszukiwaczu przygód!\nMasz ochotę na misję? + - Ty! Mam dla Ciebie zadanie! + - Czujesz się... żądny przygód? + dialog: + - Ukończ zadania gildii,\naby zdobyć fajne nagrody! + - Zadania wyższego poziomu mają\nlepsze nagrody! + - Zadania wyższego poziomu sprawiają, że\npolujesz na potwory wyższego poziomu! + - Chcesz trudniejsze wyzwanie?\nZwiększ rangę gildii! + - Upewnij się, że jesteś dobrze wyposażony\nna te zadania! + farewell: + - Bezpiecznej podróży, przyjacielu. + - Szczęśliwego polowanie! + - Żyj długo i bogato! + - Wróć ze swoją tarczą,\n lub na niej. + - Życie przed śmiercią! + - Siła przed słabością! + - Podróż przed miejscem docelowym! +refiner_config: + name: Ralph + role: + greetings: + - Chcesz może ulepszyć swój złom? + - Masz jakiś złom? + - Szukam złomu niskiego poziomu! + - Pozdrowienia, masz może jakiś złom? + - Mogę przetworzyć twój złom! + dialog: + - Potrzebujesz może ulepszyć swój złom? + - Upgrade your scrap here! + - Rozbuduj 10 złomu do wyższego poziomu! + - Zrób swój złom bardziej użyteczny! + - Masz może złom niskiego poziomu? + farewell: + - Wróć jak będziesz miał więcej\nzłomu niskiego poziomu + - Nie zapomnij aby zrobić ten\nzłom bardziej użyczny! + - Idź na złom! +repairman_config: + name: Reggie + role: + greetings: + - Napraw swoje przedmioty! + - Naprawianie rzeczy za złom! + - Zamień ten złom w trwałość! + - Potrzebujesz coś naprawić? + - Masz może uszkodzone przedmioty? + dialog: + - Najlepsze naprawy w mieście! + - Mam twój naprawiony przedmiot! + - Potrzebujesz może naprawy? + - Naprawię twoje przedmioty! + - Potrzebujesz naprawić elitarne przedmioty? + farewell: + - Nie zapomnij przeprowadzić konserwacji! + - Będę tutaj, jeśli mnie potrzebujesz! + - Zadzwoń do mnie jeżeli\nchcesz się skontaktować jeżeli chcesz\nto możesz do mnie dzwonić +santa: + name: '&4Saint Nick' + role: '&c' + greetings: + - Ho ho ho! + dialog: + - I have lost some presents, \ncan you help me? + - Dear traveller, I have\na request for you! + - Can you help an old man\nin his time of need? + farewell: + - Ho ho ho! +scrapper_config: + name: Kelly + role: + greetings: + - Chcesz pozbyć się przedmiotów? + - Chcess oddać przedmioty do recyklingu? + - Szukasz złomu? + - Jest godzina złom'owania! + - Czas złomowania! + dialog: + - Złomowe Oferty! + - Zdobądź tutaj swój złom! + - 75% szans na działanie! + - Brak zwrotów. + - Recykling, wykorzystanie redukcja! + farewell: + - Wróć jak będziesz miał\nwięcej złomu + - Nie zapomnij aby zrobić ten\nzłom bardziej użyczny! + - Szczęśliwego złomowania! +smelter: + name: Sam + role: + greetings: + - Masz jakiś złom? + - Masz może dodatkowy złom? + - Wyczuwam złom!? + - Proszę potrzebuję złomu! + - Nakarm mnie złomem! + dialog: + - Zrobię twój złom bardziej urzytecznym! + - Daj mi złom a\ndam ci kule ulepszeń! + - Złom jest bezużyteczny, daj mi go! + farewell: + - Wróć z powrotem do mnie kiedy\n będziesz miał więcej złomu + - Ruszaj do ulepszacza! +special_blacksmith: + name: Grog + role: + greetings: + - Potrzebujesz czegoś? + - Masz coś dobrego? + - Nie mamy nic, poza tym co najlepsze + - Masz coś wartego sprzedaży? + - Kupujemy tylko elitarne wyposażenie mobów. + dialog: + - Kupujemy nisko i sprzedajemy wysoko. + - Brak zwrotów. + - Absolutnie brak zwrotów. + - Brak zwrotów. + - Żadnych etykietek. + - Zakupy sklepu są ostateczne. + farewell: + - Wróć gdy będziesz mieć\nwięcej do wydania + - Nie daj się zabić,\nchcemy od Ciebie\nwięcej wyposażenia. + - Następnym razem kup coś \ndroższego. + - Nie zapomnij, brak zwrotów. +test_npc: + name: Test NPC + role: Testing! + greetings: + - Test Greeting! + dialog: + - Test Dialog! + farewell: + - Test Farewell! +travelling_merchant: + name: Jeeves + role: + greetings: + - Masz coś do sprzedaży? + - Dzwoniłeś/aś? + - Huh? + dialog: + - Kupię to tanio! + - Masz coś dla mnie? + - Czas to pieniądz! + farewell: + - Zadzwoń ponownie w każdej chwili! + - Czy to wszystko? + - Bezpiecznych podróży! + - Nie daj się zabić! + - Miłego polowania! +unbinder: + name: Ulfric + role: + greetings: + - Witaj. + - Miło cię poznać. + - Hej, przyjacielu. + - Tak? + - Mogę ci w czymś pomóc? + dialog: + - Odbinduje twoje przedmioty\nza ekstremalnie rzadki zwój unbindu. + - Jestem jedyny uprawnioną\naby odbindować twoje przedmioty. + - Masz zwój unbindu? + farewell: + - "Zapamiętaj: Użyj zwoju\nunbindu mądrze." + - Bezpiecznej podróży, przyjacielu. +wood_league_arena_master: + name: Gladius + role: + greetings: + - Welcome to the\nArena! + dialog: + - Prepared to face the arena? + farewell: + - Return with your shield, or on it! +wood_league: + arenaName: Wood League + arenaMessages: + - wave=1:message=&8[Gladius] &fToday's main event! A legendary fighter came all the way to the arena to test his might against the toughest monsters from all the land! But before that, here's a rookie fighting some zombies. + - wave=2:message=&8[Gladius] &fWould you look at that, they at least know how to wave their arms! That was just the warmup, let's start putting on some pressure! + - wave=3:message=&8[Gladius] &fSo you think you know how to fight? Well this wave will put the &cheat &fon! Ha ha ha ha ha! + - wave=4:message=&8[Gladius] &fAlright I guess they can take the heat! Ladies and gentlemen, strap on, we might be in for a show! + - wave=5:message=&8[Gladius] &fI found this &cweird creature &foutside, and I thought putting it in the arena would be funny! + - wave=6:message=&8[Gladius] &fSeems like you can handle small groups of enemies just fine, &clet's try scaling that up! + - wave=7:message=&8[Gladius] &fSo you think you can truly challenge the arena? We shall see... + - wave=8:message=&8[Gladius] &fNot bad, but what if every enemy is a &cmelee &fenemy? + - wave=9:message=&8[Gladius] &fNice, nice, but what if they're all &cranged &finstead? + - wave=10:message=&8[Gladius] &fCareful now, a &cbad doggo &fseems to have wandered into the arena! Where did it even come from? + - wave=11:message=&8[Gladius] &fAlright folks we got animal control to deal with the bad doggos, we're back in business! + - wave=12:message=&8[Gladius] &fIt seems like the audience is clamoring for &cmore&f! Well, let's give it to them! + - wave=13:message=&8[Gladius] &fSeems like the custodians got bored and gave the arena creatures &2poison&f! Let's see where this goes... + - wave=14:message=&8[Gladius] &fWell that was... boring! Whoever gave those guys poison is fired! Come up with something better next time! + - wave=15:message=&8[Gladius] &fAnd here we have this year's prize-winning &4hog&f! It got first place for ugliness and meanness! Everyone give a round of applause for &4Mr. Oinkers&f! + - wave=16:message=&8[Gladius] &fMr. Oinkers is now bacon! Here comes &cMr. Oinker's fans&f, flooding the arena to get their revenge! + - wave=17:message=&8[Gladius] &fIt would seem as though our arena challenger thinks they have a shot! But can they deal with even more &cpowerful &ffoes? + - wave=18:message=&8[Gladius] &fThe &cfencing club &fand the &carchery club &fare having a contest! Let's see which one does better! + - wave=19:message=&8[Gladius] &fThe fencing club didn't so so hot, let's see what the &carchery club&f has for us! + - wave=20:message=&8[Gladius] &fSeems like the archery club didn't do so hot either! It seems like our challenger has begun attracting the attention of some of our top gladiators! Introducing &2Zoltan, the Pride of the Zombies&f! + - wave=21:message=&8[Gladius] &fUnbelievable! Seems like this rookie defeated Zoltan! Do we have a potential new champion in our hands? + - wave=22:message=&8[Gladius] &fSpectators are starting to place their bets! How far can today's contestant go? + - wave=23:message=&8[Gladius] &fDon't look away now, this wave's enemies all have &cwithering &fattacks! + - wave=24:message=&8[Gladius] &fSeems like some pretty big arena names are starting to arrive to stop this challenger! Stay tuned! + - wave=25:message=&8[Gladius] &fHere comes &bAgdluak&f, the archer from the Great North! Beware of its &bfrost&f! + - wave=26:message=&8[Gladius] &fThat was a pretty cool fight! I am &cswarming &fwith excitement to see what's next! + - wave=27:message=&8[Gladius] &fI've been told the arena grows harder! &cZombies immune to arrows, skeletons that freeze their opponents &f- what will they think of next!? + - wave=28:message=&8[Gladius] &fIt's time to show off those &cfencing &fskills! Remember, it's all about the legwork! + - wave=29:message=&8[Gladius] &fAnd now, let's have some &ctarget practice&f! The challenger is the target! + - wave=30:message=&8[Gladius] &fA true arena champion approaches! The &2Southern Viper &fonce again seeks to &cpoison &ftheir enemies to death with his &cthousand poisons&f! + - wave=31:message=&8[Gladius] &fThe Southern Viper has fallen! The crowd goes wild! What a day, ladies and gentlemen, what a day! + - wave=32:message=&8[Gladius] &fI have been told that the arena custodians are done messing around and are staring to let loose! Can our challenger survive this? + - wave=33:message=&8[Gladius] &fSeems like some enemies got their hands on some of Southern Viper's &cpoisons&f! You do not want to get hit by those, ladies and gentlemen! + - wave=34:message=&8[Gladius] &fBobby, make sure you put 1,000 Elite Coins on these contestants dying for me - no, no, 1,000 Elite Coins - wait was this thing on? I mean, onwards to the next wave! + - wave=35:message=&8[Gladius] &fLadies and gentlemen, what a rare treat! It would seems as the very &aWood League Jester &fhas stepped up to fight! What delightful &2tricks &fdoes he have for us today? + - wave=36:message=&8[Gladius] &fWhat a lovely show ladies and gentlemen, give it up for &aThe Jester&f! + - wave=37:message=&8[Gladius] &fBobby, how is my bet doing? What do you mean 10,000 Elite Coins, I told you to put 1,000 on there! Uh, pump them, &cpump the powers up&f! + - wave=38:message=&8[Gladius] &fBobby you're killing me here! Uh, dump some &cswordsmen &fon there, I need to deal with something real quick... + - wave=39:message=&8[Gladius] &fWhat do you mean no refunds? I didn't even want to - ahem, I mean, a legion of &carchers &fhave come from far to show off their skills! + - wave=40:message=&8[Gladius] &fLadies an gentlemen, for, uh, random reasons, I have invited the strongest fighter I can summon! Meet &4Crucios, the Bearer of Curses&f! + - wave=41:message=&8[Gladius] &fCrucios has been defeated!? What has the world come to? + - wave=42:message=&8[Gladius] &fA wealthy for now patron has decided to throw in free healthcare to arena enemies! Will they do better with &2healing&f? + - wave=43:message=&8[Gladius] &f&cWither&f, &cpoison, &cfire&f throw in everything you have! Do you even know how much is on the line!? + - wave=44:message=&8[Gladius] &fThis is clearly not working, let me think of something... + - wave=45:message=&8[Gladius] &fHere is one of the top gladiators of the Wood League Arena! &cThousand Blades &fapproaches once again with his &cinnumerable projectiles&f! He better win! + - wave=46:message=&8[Gladius] &fThousand Blades has fallen! It just seems like you can't get competent gladiators these days! That's fine, you'll see! You'll all see! &cRelease the swarm! + - wave=47:message=&8[Gladius] &fIf swarms don't work, throw in &cmore powers&f! Throw in all of the powers! + - wave=48:message=&8[Gladius] &fWe are starting to run out of options here! Are these all of the &cswordsmen &fwe have left? + - wave=49:message=&8[Gladius] &fAlright send all we have left, we have no other options! Move forth, &carchers&f! + - wave=50:message=&8[Gladius] &fI guess this is it for me... I have no option but to declare - wait, who is that in the distance? Is that &4Uther, the Champion of the Wood League Arena&f? Ladies and gentlemen, match set and over, our contestant has no chance of winning here! They shall be &csmitten &fby our champion! + - wave=51:message=&8[Gladius the Destitute] &fUnbelievable, Uther has been defeated! We have a new arena champion! I would be incredibly excited if I wasn't so terribly in debt now! +ag_welcome_quest_0: + customObjectives: + Objective1: + dialog: + - '&8[&aCasus&8]&f Welcome to the Adventurer''s Guild Hub, the hub for all things EliteMobs!' + - You can always get back here using &2/ag&f! + - Talk to me again for a quest! + name: '&2Finding the AG!' + questLore: + - Discover the Adventurer's Guild Hub using the command &2/ag &0or &2/adventurersguild ! + questAcceptDialog: + - '&8[Odigos]&f Alright, make sure you use &2/ag &f or &2/adventurersguild&f to head off to the Adventurer''s Guild Hub!' + - Make sure you talk to Casus when you're there! +ag_welcome_quest_1: + customObjectives: + Objective3: + dialog: + - '&8[&aGreg&8]&f Want to buy or sell something? I''ve got a little of everything!' + Objective4: + dialog: + - '&8[&aCharles&8]&f Want to learn about fighting elites? Just talk to me!' + Objective1: + dialog: + - '&8[&aHermes&8]&f I take you back to where you were before! Just talk to me again!' + Objective2: + dialog: + - '&8[&aBartley&8]&f Need a stiff drink? My drinks pack an extra punch!' + Objective7: + dialog: + - '&8[&aQel''Thuzad&8]&f These Elite monsters, where do they keep coming from?' + - Ah, never mind that for now, we are always in need of more people to assist us in slaying quests! + - Just talk to me to get one! + Objective12: + dialog: + - '&8[&aGrog&8]&f Want to buy special items? I''ve got just the thing!' + Objective8: + dialog: + - '&8[&aRalph&8]&f Get more out of your scrap by upgrading it! Just talk to me at any time.' + Objective13: + dialog: + - '&8[&aUlfric&8]&f If you bring me a very special and rare item, I can unbind your Elite items.' + - You don't yet look prepared to take this challenge on, but you can make killing the Binder of Worlds your ultimate goal, if you dare. + Objective5: + dialog: + - '&8[&aTim&8]&f Want to upgrade your Elite Items? Just get an upgrade orb from Sam over there!' + Objective10: + dialog: + - '&8[&aKelly&8]&f Got extra Elite items? Don''t know what to do with them? Give them to me, and I''ll turn them into scrap!' + - You can use scrap to do lots of things, like repairing or upgrading Elite items! + Objective6: + dialog: + - '&8[&aGillian&8]&f Do you seek power? Do you desire to reach new heights? Talk to me to unlock new guild ranks, and reach levels of power you never thought to be possible!' + Objective11: + dialog: + - '&8[&aSam&8]&f Got extra scrap? I can refine that into Upgrade Orbs, which you can give to Tim to upgrade your Elite items with!' + Objective9: + dialog: + - '&8[&aReggie&8]&f Need your Elite items repaired? Just bring me some scrap, and I''ll make them as good as new!' + - Remember, the higher the level of your scrap, the better I can repair you Elite item! + name: '&2Welcome to the AG!' + questLore: + - '&aMeet the Adventurer''s Guild NPCs!' +primis_caeruleaum_a_can_of_worms: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis] &fPlease tell me you''re the one bringing the bait.' + name: '&2A can of worms' + questLore: + - Here, take the bait and go. + - Please hurry! + questAcceptDialog: + - '&a[Callidus Piscatus]&f My friend is in a boat near the docks!' + - '&7&oI should hurry to the boat.' + questCompleteMessage: + - '&a[Piscis Nemesis]&f You brought bait? Perfect!' + - The bait should lure it out! + - '&7&oI should talk with Nemesis.' +primis_caeruleaum_fishing: + name: '&2Przynęta na ryby' + questLore: + - Mamy ogromny problem! + - I got wounded by a monstrous &cSea Creature&f that came from a fishy portal to another realm! + - My friend &aPiscis Nemesis&f is still out on the boat, trying to either fight the creature or close the portal, + - but he can't do anything without the right bait! + - I'll tell you where to go get &eFish Bait &f, please go help my friend! + - I promise I'll reward you! + questAcceptDialog: + - '&a[Callidus Piscatus]&f Time is of the essence! There are a bunch of &cBig Worms&f to the right when you leave the village!' + - Get 5 and come back here and I will prepare them for use. + - '&7&oI should go get some Fish Bait.' + questCompleteMessage: + - '&a[Callidus Piscatus]&f You brought bait? Perfect!' + - I'll prepare it right away! + - '&7&oI should talk to &aCallidus &7&oagain and collect the prepared bait.' +primis_caeruleaum_fishing_2: + name: '&2Przynęta na Potwora' + questLore: + - To załatwiło sprawę! Wskocz do tunelu, a ja zatrzymam łódź! + - Pokażmy temu potworowi gniew rybaka! + questAcceptDialog: + - '&a[Piscis Nemesis]&f Hop in, I''ll hold the boat!' + - Don't forget to put on that &eDiving Helmet&f! + - '&7&oI should enter the wormhole and defeat the Sea Monster.' + questCompleteMessage: + - '&a[Piscis Nemesis]&f Haha! What a show!' + - '&fOczywiście cały czas miałem tą sytuację pod kontrolą, ale na pewno trochę pomogłeś!' + - '&fTrzymaj, możesz to zachować!' + - '&7&oThe monster is dead and the shore is safe. Seems like a job well done.' +primis_caeruleaum_fletching: + name: '&2Łowca Strzał' + questLore: + - Masz chwilkę, żeby nam pomóc? + - With all the recent raids, we have found ourselves out of &eGrappling Arrows&f! + - It is usually my job to get them, but things are just a + - bit too dangerous right now for me to go dungeon delving. + - If you could get these &eGrappling Arrows&f for me, + - I will teach you how to use them! + questAcceptDialog: + - '&a[Ventus Artifex]&f Please bring me 10 &eGrappling Arrows &ffrom the ruins just beyond the village.' + - The &cUndead Skeletons&f and &cDrowned&f from of old usually carry these. + - '&7&oI should go kill &cSkeletons&7&o and &cDrowned&7&o at the ruins near the village for their &eGrappling Arrows&7&o.' + questCompleteMessage: + - '&a[Ventus Artifex]&f Great work!' + - '&eGrappling Arrows &fcan be used on &cTarget Blocks &fto get to hard to reach places.' + - Są koniecznością dla aspirującego poszukiwacza starożytnych ruin. + - Oto twoja nagroda! + - Co powiesz na przetestowanie swojej wiedzy? + - '&7&oSeems like &aVentus Artifex&7&o has a challenge for me.' +primis_caeruleaum_fletching_2: + name: '&2Łowca Tarczy' + questLore: + - Masz strzały? Świetnie! + - Wykorzystaj te strzały łukiem, by wspiąć się na wieżę! + questAcceptDialog: + - '&a[Ventus Artifex]&f Use the arrows you just received to go to the ruins and shoot the targets with them!' + - Krążą plotki o starożytnej skrzyni wewnątrz ruin. Niezbyt przydatne informacje dla nikogo... poza kolekcjonerami! + - Go and grab me that &eShield&f, and I will trade it with something more... useful... to you! + - '&7&oI should go get the &eShield&7&o inside of the ruins, using the &eGrappling Arrows&7&o in order to shoot the targets inside of the building.' + questCompleteMessage: + - '&a[Ventus Artifex]&f Outstanding!' + - Naprawdę jesteś prawdziwym poszukiwaczem ruin i nieustraszonym wojownikiem! + - Oto twoja nagroda! + - '&7&oSeems like Grappling Arrows will be useful in the future.' +primis_caeruleaum_foraging: + name: '&2Wilcza Przynęta' + questLore: + - Słyszałem, że chciałeś pomóc mieszkańcom naszej wioski. + - There is a &dDen of Wolves&f nearby that is + - really impeding my foraging for the village! + questAcceptDialog: + - '&a[Venator Pabulatus]&f If you can get rid of those pesky &cWolves&f, I will reward you handsomely!' + - Jestem za stary, żeby zajmować się tymi dzikimi rzeczami z tych ziem... + - '&7&oI should go kill the &cWolves&7&o in the den to the Southeast of the village.' + questCompleteMessage: + - '&a[Venator Pabulatus]&f I knew I could count on you!' + - Bardzo Ci dziękuję za pomoc! + - Oto twoja nagroda jak obiecywałem. +primis_farmstead_lighthouse_keeper_2: + customObjectives: + Objective1: + dialog: + - "&a[Jeeves]&f &2Amavit&f sent you? What's this about a lighthouse? My, what a discovery!\n&fThis will revolutionize my job as a traveling merchant! Here, have these &eScrolls&f - just call me and I'll be there in a jiffy!\n&7&oSeems like &aJeeves&7&o has something for me. I should talk to him." + name: '&2Tajemnicze Światła' + questLore: + - A strange light started being emitted from the &dTop of the Lighthouse&f when you... dealt with the issue. + - My father &aJeeves&f went to the top to check but he has not returned yet. + - My heart can not bear to suffer any more, and we already owe you much - but if you could investigate the issue and find my father, I would be eternally grateful. + questAcceptDialog: + - '&a[Amavit]&f Thank you once again, and good luck. Hopefully it''s nothing.' + - '&7&oI should go to the &dTop of the Lighthouse&f, investigate the issue and then report back to &aAmavit''s&f father &aJeeves&f in the village.' + questCompleteMessage: + - '&7&oThese scrolls seem mighty useful! I should use the &dLighthouse&7&o to get back to the &dFarmstead&7&o and keep moving.' +primis_gladius_assassins: + name: '&5Kto zastrzeli snajperów?' + questLore: + - The roofs of &dGladius&f are covered in &cAssassins&f! + - Wychodzenie na ulice to wyrok śmierci. Musimy rozprawić się z tymi snajperami! + - There are some spots for &eGrappling Arrows&f on the roofs, make good use of them and deal with those snipers! + questAcceptDialog: + - '&a[Belli] Deal with those &cAssassins&f! Remember to use the &eGrappling Arrows&f!.' + - '&7&oI should kill those &cAssassins&7&o.' + questCompleteMessage: + - '&a[Belli]&f You dealt with those &cAssassins&f? Good! That''s one headache dealt with!' +primis_gladius_clear: + name: '&5Odzyskiwanie ulic' + questLore: + - Nie muszę ci mówić, że miasto jest oblężone, prawda? + - We are offering a reward to those willing to put a dent in the amount of &cInvaders&f. + - Czy jesteś na to gotowy? + questAcceptDialog: + - '&a[Belli] &fJust go out there and thin their numbers!' + - '&7&oI go out and clear the streets of &dGladius&7&o.' + questCompleteMessage: + - '&a[Belli]&f Look at that, the Gods have provided with a true warrior in our time of need! I have a job for a person like you.' + - '&7&oSeems like &aBelli&7&o has a plan for me. I should talk to her..' +primis_gladius_prayer: + name: '&5Skok wiary' + questLore: + - Nie mam zamiaru udawać, że jest dobrze. Sprawy wyglądają wręcz ponuro! + - The walls have fallen, the streets are teeming + - with the &cUndead&f and I just ran out of drinks. + - At times like these, people turn their hope to + - some kind of divine intervention! + - There is a &dPath&f, lit by candles, that leads to a + - '&dSanctuary in the Mountains&f.' + - Warriors go up this path and defeat the &cMonk&f which guards + - the sanctuary in order to be blessed by the war god in combat. + - It may just be a superstition, but would it hurt + - to give people hope? + - The fact you made your way here shows you are a cut above + - the rest - go up the mountain and defeat the &cMonk&f. + - All warriors will feel better knowing they are being watched over. + questAcceptDialog: + - '&a[Belli] &fGo &dUpstairs&f and follow the candles! Careful not to fall, the path is treacherous!' + - '&7&oI should follow the &dandle Path&7&o and defeat the &cMonk&7&o.' + questCompleteMessage: + - '&a[Belli]&f You completed the prayer? Thank you, the soldiers will feel relieved to hear it.' +primis_gladius_ships: + name: '&5Uczucie tonięcia' + questLore: + - Have you seen them? The dozens of ships just outside + - of &dGladius&f? They are to blame for all of this. + - We never expected an invasion from the &dBlood Temple&f, + - much less one done by siege weapons mounted on boats! + - We must do something about it. Killing the &cAdmiral&f + - and some of the forces won't give us back what we lost, + - but it will sure make us feel better. + questAcceptDialog: + - '&a[Belli] &fKill the &cAdmiral&f and some of the troops on the boats. Be careful about their water superiority! I recommend using &eGrappling Arrows&f to move around the ships.' + - '&7&oI should go slay the &cAdmiral&7&o and some of its troops on the boats just &dOutside of Gladius&7&o.' + questCompleteMessage: + - '&a[Belli]&f The admiral is no more? Why, I feel better already!' +primis_gladius_sunken_ship: + name: '&5Sunken ship' + questLore: + - Now that you took care of the &cMariner Forces&f I got + - another task for you. + - The &dSunken Ship&f should be reachable now. + - You see some time ago one of our ships got sunk, + - unfortunately it was carrying &eImportant DDocuments&f. + - I need you to reach the &dSunken Ship&f and kill any threats + - around and retrieve the &eDocuments&f. + - Come back to me after you have completed the task. + questAcceptDialog: + - '&a[Belli] &fYou will find the ship in the waters to the south-west. Give them hell!' + - '&7&oI should go collect the &eDocuments&7&o and slay any &cMariners&7&o near the ship.' + questCompleteMessage: + - '&a[Belli]&f Back already? Excellent work! We really needed these &eDocuments&f.' +primis_gladius_supplies_1: + name: '&cProblemy z zaopatrzeniem' + questLore: + - We are running out of &eSupplies&f! + - '&dGladius&f is a fortress equipped to last a long siege' + - without any issues, but that's assuming we have + - access to the &dWarehouse&f! + - Unfortunately the &dWarehouse&f was one of the first places to fall, + - and now we are slowly starving to death! + - If you can clear a path to the &dWarehouse&f and get some &eSupplies&f + - that would greatly aid in the war effort! + questAcceptDialog: + - '&a[Cibus]&f The &dWarehouse&f is hard to miss! It''s the extra large warehouse-looking building near the part where the wall fell! Grab some &eSupplies&f and get them back here!' + - '&7&oI should go to the &dWarehouse&7&o and bring back &eSupplies&7&o.' + questCompleteMessage: + - '&a[Cibus]&f You brought the &eSupplies&f back? Fantastic! Meanwhile I came up with the perfect idea for the drinks - and it should be something that will lift the spirits of the soldiers!' + - '&7&oSeems like the &aCibus&7&o has a plan, I should talk to them.' +primis_gladius_supplies_2: + name: '&cZaopatrzenie w więcej problemów' + questLore: + - Mamy jedzenie, ale co z napojami? + - Some would say it's foolish to get drunk in the middle + - of a war, but if now then when? + - The &cBarkeep&f across the street kept all of the good + - stuff in the &dBasement&f. + - I think you know where I'm going with this! + - Go to the &dBasement&f of the tavern across the street and get + - the &eGood Stuff&f. If you find the &cBarkeep&f, I'd consider it a + - personal favor if you free him from this curse of undeath. + - We are pretty sure that he was in the &dBasement&f when the + - invasion happened so odds are he is still there, + - though probably no longer himself. + - Be careful! + questAcceptDialog: + - '&a[Cibus]&f The &dTavern&f is right across the street, hard to miss! Just head to the &dBasement&f and get the &eGood Stuff&f!' + - '&7&oI should go to the &dBasement&7&o of the tavern and get "the &eGood Stuff&7&o".' + questCompleteMessage: + - '&a[Cibus]&f You defeated the &cBarkeep&f? I thank you for freeing my old man from this accursed undeath. Here, I''ll have the first drink with you.' +primis_ice_village_all_out_of_chains: + customObjectives: + Objective1: + dialog: + - '&a[Orbis]&f Oh, the Ice Village chain shipment. Yes, it is right in that chest over there.' + - Sorry for not sending it over, but we were quite busy and had no time. + - It's all paid for so feel free to just grab it. + name: '&2All out of chains' + questLore: + - Hey, you came from &dPontis Mille&f right? + - How would you like to help us out. + - Here at the jail we tend to go through a + - lot of chains... + - Especially the chains holding up the cages. + - They rust a lot and then they break. That's + - how one of the prisoners escaped. The rusty + - chain snapped, the cage fell and he ran. + - We paid for a + - '&eShipment of new chains&f, but it' + - did not arrive yet. If you could go to + - '&dPontis Mille&f and fetch our' + - '&eShipment of Chains&f' + - then that would be great! + questAcceptDialog: + - '&a[Philolaches Triferus]&f Go talk to Orbis. They are the ones that make the chains.' + - '&7&oI should go talk to &a&oOrbis&7&o and bring back the &e&oShipment of Chains&7&o.' + questCompleteMessage: + - '&a[Philolaches Triferus]&f Those are the chains! Thank you for getting these, we really needed them.' +primis_ice_village_catch_me_if_you_can: + name: '&2Catch me if you can' + questLore: + - What timing! I was just looking for someone to go capture our + - '&cEscaped Prisoner&f.' + - One of our prisoners managed to make the darn cage swing and the rusty chain that holds it cracked under the load. + - He must have gotten pretty hurt during the escape so he cannot have gone that far. + - I need you to bring him back &9alive&f, be careful though, he managed to snag one of our rusty swords before he fled. + questAcceptDialog: + - '&a[Romanus Superbus]&f He must be somewhere in the mountains.' + - '&7&oI need to find the &c&oEscaped Prisoner&7&o and bring him back to the prison.' + questCompleteMessage: + - '&a[Romanus Superbus]&f Well, well, well. If it isn''t our escaped sleeping beauty.' + - Good work. A job well done deserves a good payment, here ya go. + - '&aRomanus&7 hands you a heavy bag of coin.' +primis_ice_village_get_them_off_my_back: + name: '&2Get them off my back!' + questLore: + - Let me tell ya, I sure am glad you are here to help, ha ha. + - Our mission here is to hunt &cRazorbacks&f and keep their numbers in check. + - It's not all about population control either. + - They provide us with valuable leather, tusks and meat. + - Not sure this village would be around without them. + - But this season their numbers have just exploded. We have been struggling with culling their numbers. + - It's all about striking a balance, can't have their numbers be so high that they start becoming a danger again. + - You need to go out there and slay a significant amount of them. Don't bother with hunting any of the &9Mature&f ones. + - We only need you to cull the &cBabe&f and the &cJuvenile Razorbacks&f. + - I also have a personal favor to ask of you. When you're out there could you keep an eye out for my old &eDagger&f. + - I lost it couple of days ago during a hunt. Stuck it in a &cRazorback&f and it just ran off with my dagger still attached... + - Would mean a lot to me if you could retrieve it. + questAcceptDialog: + - '&a[Alanus Isatis]&f You must have seen the &cRazorbacks&f on your way here so I assume you know where to find them.' + - '&7&oI need to cull the &c&oRazorback&7&o population and retrieve &e&oAlanus'' Dagger&7&o.' + questCompleteMessage: + - '&a[Alanus Isatis]&f Well done friend! That should help a lot.' + - We can handle the rest. And you found my dagger too, glad to have it in my hands again. + - The dagger is nothing special, but it was a handmade gift from my late father. + - Next time you're thirsty, the drinks are on me! +primis_ice_village_gotta_keep_warm: + customObjectives: + Objective1: + dialog: + - '&a[Severinus Martius]&f Ha ha! That should keep me warm for another couple of weeks!' + - Hey friend, you heading for &dCaerullium Village&f by any chance? + name: '&2Gotta keep warm' + questLore: + - We deliver the &aLighthouse Keeper&f some + - of our strong stuff every couple of weeks. + - It keeps him warm during the colder days. + - It's a small gesture of thanks for all his + - hard work. Any chance you could help out + - and bring over the next batch? + questAcceptDialog: + - '&a[Grania Cecilius]&f You can find the lighthouse to the East. Thanks!' + - '&7&oI should go to the &d&oLighthouse&7&o and deliver these to the &a&oLighthouse Keeper&7&o.' + questCompleteMessage: + - '&a[Severinus Martius]&f If you''re heading over there then I would appreciate if you could deliver some of these to my good friend &aJeeves&f.' + - '&7&oSeems like the &a&oLighthouse Keeper&7&o has a quest for me.' +primis_ice_village_gotta_see_jeeves: + customObjectives: + Objective1: + dialog: + - '&a[Jeeves]&f Oh! A gift from my friend Severinus you say.' + - Well, thank you for bringing it over. Was nice seeing you again! + name: '&2Gotta see Jeeves' + questLore: + - Now, now it would be really rude of me to keep + - all of the good stuff to myself! + - If you would bother helping me out friend and + - delivering some of the good stuff + - to my friend &aJeeves&f at &dCaerullium Village&f. + - You can get there quickly by taking the + - '&9lighthouse portal&f.' + questAcceptDialog: + - '&a[Severinus Martius]&f The portal is all the way at the top.' + - '&7&oI should go to &d&oCaerullium Village&7&o and deliver some of the good stuff to &a&oJeeves&7&o.' + questCompleteMessage: + - '&a[Severinus Martius]&f Thank you for delivering some of the strong stuff to Jeeves. I know he likes a good drink here and there ha ha!' +primis_ice_village_living_nightmares: + customObjectives: + Objective1: + dialog: + - '&a[Cornelia Ennodius]&f Are they gone? I was so scared. My parents sent you? Thank goodness.' + - I woke up in the night, but the nightmares, they did not end. They were still there, so I ran and ran... + - I couldn't escape. I, I...will be fine, I just need a minute... + name: '&2Living nightmares' + questLore: + - I was following her trail, this is where it ends. + - Not sure where she would have gone from here. + - I fear that something bad might have happened. + - Our &aGirl&f takes a lot after me and my special powers. + - Except that hers are a lot more potent, she is capable + - of making powerful emotions manifest in the real world. + - We are running out of time, we need to find her soon. + questAcceptDialog: + - '&a[Sestia Ennodius]&f The trail went cold here, she cannot be that far away...' + - '&7&oI need to find the &a&oMissing Daughter&7&o before something happens to her.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f You found her! Quickly, where is she?' + - Thank you stranger, I will go to her at once! +primis_ice_village_make_them_go_ouch: + name: '&2Make them go ouch' + questLore: + - I had some naughty '&cCustomers&f' + - come visit some days ago. + - They stole the most valuable + - of my &ePossessions&f. + - You need to find them and make sure + - to teach them a lesson. + - Make sure they know that + - '&aViolet&f does not forget to collect.' + questAcceptDialog: + - '&a[Domina Violet]&f They went East past the &9Trees&f.' + - '&7&oI need to make sure that the &c&oCustomers&7&o know not to mess with &a&oViolet&7&o. I also need to retrieve &e&oViolet''s Property&7&o.' + questCompleteMessage: + - '&a[Domina Violet]&f I hope you taught them the value of pain.' + - A small reward is in order for your hard work. I appreciate people that get it done. +primis_ice_village_objection!: + customObjectives: + Objective3: + dialog: + - '&a[Glacies Princeps]&f What, absolutely not. I don''t know how he convinced you to come here and beg for his release.' + - That man you are trying to help was corrupted by the Ice Elemental. He went mad and slaughtered his entire family. + - He will never be released. Is that understood. + Objective1: + dialog: + - '&a[Romanus Superbus]&f Release him? Not guilty? Are you mad? You''re lucky I don''t throw you in a cage too for suggesting such nonsense.' + Objective2: + dialog: + - '&a[Luxuria Placidus]&f Who? Never heard of him.' + name: '&2Objection!' + questLore: + - I do not belong here! Surely you can see that? + - I have done no wrong! Stranger will you hear my plea. + - Would you help this poor soul who has been trapped + - here in this awful cage of no fault of his own? + - You must go talk to the + - '&aJail Master&f or the ' + - '&aVillage Leader&f.' + - Or any other + - '&aFriendly Villager&f' + - who would be + - willing to argue for + - my release! + questAcceptDialog: + - '&a[Adrius Calpornius]&f Go talk to them! Get me out!' + - '&7&oI should go talk to the people on my list.' + questCompleteMessage: + - '&a[Adrius Calpornius]&f WHAT?! LIES!!! I never would do such a horrible thing to my family...' + - They are right here! Can't you see them, hear them. Here next to me, they want to be free too!!! RELEASE US!!! + - '&7Whatever sanity this poor man still had left, is gone now...' +primis_ice_village_run_away_daughter: + customObjectives: + Objective1: + dialog: + - '&a[Sestia Ennodius]&f I could sense you coming.' + name: '&2Run away daughter' + questLore: + - Stranger! Would you help our family? + - Our &aDaughter&f has gone missing. + - She has been gifted with special + - powers just like her &aMother&f + - I fear that last night something + - terrible must have happened to + - make her run away in the middle of + - the night. + questAcceptDialog: + - '&a[Sparax Ennodius]&f My &aWife&f has already gone looking for her.' + - I am sure she is somewhere outside the village. Go find her and talk to her. + - '&7&oI should go look for the &a&oWorried Mother&7&o.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f You were sent by my &aHusband&f to help with the search?' + - '&7&oI should hear out the &a&oWorried Mother&7&o.' +primis_ice_village_silence: + name: '&2Make them go ouch' + questLore: + - Shhh! Do you hear it? + - The annoying screeching. + - Ugh, I cannot take it anymore! + - Listen, I will pay good coin + - if you can find the source + - of that annoying screeching + - and make it stop. + questAcceptDialog: + - '&a[Modestus Eulogius]&f It sounds like it coming somewhere from the hills behind me.' + - '&7&oI should find the source of all the noise and make it stop.' + questCompleteMessage: + - '&a[Modestus Eulogius]&f Both me and my ears thank you!' +primis_ice_village_taking_the_bait: + name: '&2Taking the bait' + questLore: + - These &cFish&f, what is wrong with them! + - I have been out here fishing for days now! + - Not even a single bite. If only I was younger I would show them! + - Well it sure is good you're here now. Our village gets most of its food from these &cFish&f. + - And if we cannot catch any, well that is a big problem. + - You will need to go down there and beat them senseless. + questAcceptDialog: + - '&a[Theopropides Nero]&f You wanted to help so here is your chance!' + - '&7&oI must jump into the lake and kill 7 &c&oChilly Salmon&7&o and collect their bodies.' + questCompleteMessage: + - '&a[Theopropides Nero]&f Oh! Look at them! Such big ones!.' + - This should keep us fed for a while! Thank you for the assistance, you're a good soul in my book! +primis_ice_village_treats_for_the_punished: + customObjectives: + Objective1: + dialog: + - '&a[Eleusium Calenus]&f My wife sent you? Oh, are those treats? My favorite too! She''s such a darling.' + - She always takes care of me, even in these dark times, she still has a place for me in her heart. + - 'You tell her I am doing just fine and that I love her very much. ' + name: '&2Treats for the punished' + questLore: + - If you don't mind, could I ask you to do something for me? + - My dear &aHusband&f has been jailed and I know it's tough living a cage all day. + - So I prepared some treats that I was gonna deliver to him. + - But I am quite busy right now and I was wondering if maybe you would like to go there and deliver them to him. + questAcceptDialog: + - '&a[Titia Calenus]&f He will be in one of the middle cages.' + - Do not forget to tell him I love him. + - '&7&oI should deliver these treats to the &a&oHusband&7&o.' + questCompleteMessage: + - '&a[Titia Calenus]&f Back so quick! Oh, did he really say that? He is such a sweetie.' +primis_ice_village_wanna_make_a_snowman: + name: '&2Wanna build a snowman' + questLore: + - The kids around the village have been pretty bored lately + - and I've been thinking. There are these + - '&cMagical Creatures&f that inhabit the woods around this' + - village. The creatures fur grows &eMagical Ice Crystals&e. + - When you infuse snow with these &eCrystals&f it makes the + - snow shuffle around and expand and contract. + - And if you build a snowman out of this infused snow + - it makes it look as if the snowman is alive. + - The kids would love it! So, want to help + - this old man cheer up some kids? + questAcceptDialog: + - '&a[Sparax Ennodius]&f You will find the &cCreatures&f in any woods near the village.' + - We will at least need 15 of the &eCrystals&f if we want to have enough to build a snowman. + - '&7&oI should go slay enough &c&oFrost Fur Ursus&7&o to gather 15 &e&oIce Crystals&7&o.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f You gathered enough crystals? Wonderful!' + - I can start making the snowman now, I cannot wait for the kids to see it! +primis_main_quest_: + name: '&2Goblins in the mines!' + questLore: + - This day just keeps getting worse. First, we get ambushed by goblins. + - The we retreat, only to find our army split. Some are dead, many are missing. + - Worst of all, we fear we might've woken the Goblin King. + - Some, hopefully, made it through. We have to set up camp and recover for now. + - If you dare brave into the mines, you are on your own. + - We tried to sneak past them, and it did not go well. + - The only way forward is through bloodshed. + questAcceptDialog: + - '&8[Centurion]&fAre you braving the Goblin Mines? Beware the Goblin King!' + - '&8[Centurion]&fWe hope our scouting party made it past him. Meet up with them if you can.' + - '&8&oI should venture through the mines and defeat the Goblin King.' + questCompleteMessage: + - '&8[Scouting party]&fYou made it through? I almost wish you hadn''t. You won''t believe what lies ahead.' + - '&8&oSounds like the scouting party has bad news for me.' +primis_main_quest_1: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis] &fOh so you were in the ship that beached a few hours ago?' + - I apologize, we would've sent help but I am afraid we are drowning in our own issues right now! + - A nearby &dBandit Camp &fkeeps raiding our supplies, a mysterious &cSea Creature &fkeeps haunting our shores and a &dWolf Den &fis making foraging impossible! + - If you help us out, I will tell you where you might be able to get the supplies you need to repair your ship. + - '&7&oI should report to the &aFirst Mate &7&oto see if I should help these people!' + name: '&2Rozbitkowie!' + questLore: + - W końcu się obudziłeś? Dobrze! Potrzebujemy twojej pomocy. + - The ship beached during last night's storm. + - We see a &dLighthouse &fin the distance, so there must be a village there! + - Go talk to the &aVillage Leader &fand see if they can lend use some help! + - The &aFirst Mate &fwent ahead of you, but hasn't returned yet. + - Follow his instructions if you see him! + questAcceptDialog: + - '&a[Captain Squalus]&f Go to the nearby village and see if they will help us!' + - Bądź ostrożny na swojej drodze, nie wiemy co czai się w tych okolicach! + - '&7&oI should investigate the nearby village and talk to their leader.' + questCompleteMessage: + - '&a[First Mate Iracundi]&f Darnation! We just can''t catch a break today! Here, it''s clearly dangerous to go alone, take this!' + - '&7&oSeems like First Mate Iracundi has a request for me...' +primis_main_quest_10: + customObjectives: + Objective2: + dialog: + - "&a[Shogun Navita] &f&dGladius&f calls for our aid?\n&7&oSeems like I should talk to the &aShogun&7&o." + name: '&5Pokonywanie przerwy' + questLore: + - It is time to call &dPontis Mille&f for aid. + - Niech wiedzą o tym, co się tu stało i powiedz, że spieniężamy naszą przysługę. + - There is an &cAutomaton&f on the &dBridge&f that leads there. Defeat it and the bridge will lower. + questAcceptDialog: + - '&a[General Hasta] &fSafe travels, friend. Remember: Kill the &cGate Keeper&f and make sure our plea reaches &aShogun Navita''s&f ears..' + - '&7&oI should slay the &cGate Keeper&7&o at the &dBridge&7&o and make my way to &aShogun Navita&7&o in &dPontis Mille&7&o.' + questCompleteMessage: + - '&a[Shogun Navita]&f Truly the news you bring me are most disturbing, but I am afraid we already suspected something... unnatural... was going on.' + - '&7&oSeems like &aShogun Navita&7&o wants to talk to me.' +primis_main_quest_11: + customObjectives: + Objective1: + dialog: + - '&a[Major Fortes Bellator]&f Yes, traveler?' + name: '&2Sending a message!' + questLore: + - The tales of your travel are most surprising. + - That you made it alive to here is nothing short of a miracle. + - The forces invading &dGladius&f are insurmountable. + - '&dGladius&f will eventually crumble under their might...' + - Aid?... Ah, yes. Go see &aMajor Fortes Bellator&f. + - He will be able to assist you. + questAcceptDialog: + - '&a[Navita]&f You can find the &aMajor&f on top of those stairs right ahead!' + - '&7&oI should go talk to the &aMajor&f and see if he can help.' + questCompleteMessage: + - '&a[Major Fortes Bellator]&f The &aShogun&f seeks to aid &dGladius&f? I thought he would never ask! But first, we must prepare.' + - '&7&oSeems like &aFortes Bellator&7&o has work for me.' +primis_main_quest_12: + customObjectives: + Objective1: + dialog: + - '&a[Centurion]&f Where are our reinforcements?' + name: '&2Mine path' + questLore: + - I cannot believe what befell &dGladius&f. They hit it fast, + - and they hit it where it hurts most. + - It is our sworn duty to aid our allies. We have failed our + - duty, and we have failed our allies. + - The &cCounselor's&f ordered us to mobilize our troops in several + - zones before the invasion. + - You see, recently and unusual and devastating storm was spotted + - at the &dStorm Temple&f. + - The Royal Guard was ordered to quiet the storm, and the &aShogun&f + - refuses to belay that order. + - Our own guards are in other places, and I fear we will need all + - that we have to take &dGladius&f back. + - The path to the &dStorm Temple&f is treacherous, as it requires going + - through the &dGoblin Mines&f. + - Help our guard clear the mines and make a path to the &dStorm Temple&f! + questAcceptDialog: + - '&a[Fortes Bellator]&fTread lightly, the &dGoblin Mines&f are a dangerous place. Perhaps you should aid the normal guard before assisting the &aRoyal Guard&f.' + - The &dMines&f are north of the city. There are stairs leading to its entrance. + - '&7&oI should see what else I can aid &aFortes Bellator&7&o with, or I can head to the &dGoblin Mines''&7&o entrance.' + questCompleteMessage: + - '&a[Centurion]&fIt is so good to see someone! Has &dPontis Mille&f sent you?' + - '&7&oI should hear what the &aCenturion&7&o has to say' +primis_main_quest_13: + name: '&2Goblins in the mines!' + questLore: + - This day just keeps getting worse. First, we get ambushed by goblins. + - Then we retreat, only to find our army split. Some are dead, many are missing. + - Worst of all, we fear we might've woken the &cGoblin King&f. + - Some, hopefully, made it through. We have to set up camp and recover for now. + - If you dare brave into the mines, you are on your own. + - We tried to sneak past them, and it did not go well. + - The only way forward is through bloodshed. + questAcceptDialog: + - '&a[Centurion]&f Are you braving the &dGoblin Mines&f? Beware the &cGoblin King&f!' + - We hope our &aScouting Party&f made it past him. Meet up with them if you can. + - '&7&oI should venture through the &dMines&7&o and defeat the &cGoblin King&7&o.' + questCompleteMessage: + - '&a[Scouting Party]&f You made it through? I almost wish you hadn''t. You won''t believe what lies ahead.' + - '&7&oSounds like the scouting party has bad news for me.' +primis_main_quest_14: + name: '&2Storm''s end' + questLore: + - It is hard to believe that you pushed through the + - '&dGoblin Mines&f on your own.' + - Perhaps with your fortitude you will be able to face the challenge ahead. + - We attempted to assault the &dStorm Temple&f, and reached its deepest + - confines at a great cost. + - What we found there... It defies understanding. + - It may be hard to believe, but it sounds like the very storm + - itself has materialized as our opponent. + - We do not even know if it can be defeated. We feared we were sent to our deaths. + - If you truly defeated the &cGoblin King&f, then perhaps you will find a way to slay this storm. + questAcceptDialog: + - '&a[Blepharo]&f We have weakened their forces a little, but still, this is no easy task.' + - The Storm is no ordinary opponent. Do not underestimate it. + - '&7&oI should go into the &dStorm Temple&f and slay the &cStorm&f.' + questCompleteMessage: + - '&a[Shogun Navita]&f You WHAT!?' + - Defeated the &cStorm&f? I was told that was impossible! I mean... + - '... it is no use hiding it now. I knew about the &cStorm&f. I knew about the &dGladius&f invasion - I even facilitated it. I did it for my people - for &dPontis Mille&f.' + - '&cCounselor Machiavelli&f convinced me that the &cStorm&f was as unstoppable as Nature itself, and that the fall of &dGladius&f and &dPontis Mille&f was an inevitability that we could but delay through sacrifice.' + - I see now that that snake poisoned my mind and corrupted my judgment. He must be dealt with posthaste. + - '&8&oSeems like &aShogun Navita&7&o has a problem he wants me to deal with.' +primis_main_quest_15: + name: '&2Severance payback!' + questLore: + - Once upon a time, &cCounselor Machiavelli&f, the wisest among us, foresaw the fall of &dPontis Mille&f. + - Faced with an unprecedented existential threat, he convinced me to keep quiet as to not incite panic. + - I took the only course of action I thought we had left - sacrificing our closest ally to buy us mere weeks. + - I spoke to the entity which resides in the &dBlood Temple&f. I made a deal with the devil. + - + - I bought us time. + - They demanded I send the army away, which I did by mobilizing it to face nearby conflicts. + - I was blind, but now I see. &cCounselor Machiavelli&f was in their pocket the whole time. + - He guided us to our doom, and would've gotten away with it had you not appeared. + - Now, there is hope. + - I ask you, please rid us of the treacherous &cCounselor&f. + - He has locked himself in his quarters, surrounded by those loyal to him and his... pets. + - Be careful. I knew not the reason why he isolated himself, but it is now clear he is expecting retribution. + - Bring me back the &eFar SSpeech Stone&f we used to communicate with the &dBlood Temple&f. + - I wish to deliver one last message through them. + questAcceptDialog: + - '&a[Shogun Navita]&f &cCounselor Machiavelli&f has retreated to his quarters in the lower city by the market. Be careful, has has amassed a devoted following in his time, and will not go down without a fight.' + - '&7&oIt is time for &cCounselor Machiavelli&f to face righteous retribution.' + questCompleteMessage: + - '&a[Shogun Navita]&f So it is done.' + - '&dPontis Mille&f owes you a great debt, wanderer. Once we finish mobilizing the army we will be ready to right our wrongs and march to &dGladius''&f aid.' + - '&7&a[Shogun Navita]&2 We feared you. We surrendered our allies to you. We dispersed our armies. No more.' + - '&dPontis Mille&2 marches to war, and we shall not walk alone! You shall rue the day you crossed our path.' + - '&7' + - '&7&oSeems like the &aShogun&7&o has a plan. I should talk to him.' +primis_main_quest_16: + customObjectives: + Objective3: + dialog: + - '&a[Demenis Nolus]&f Heading to the village, eh. Just keep going East, follow the road and you should be there in no time!' + Objective4: + dialog: + - '&a[Callipho Classicius]&f Directions? Just head down this road that leads to the graveyards.' + Objective1: + dialog: + - '&a[Glacies]&f Welcome to our village traveler! Please tell me, what brings you here friend.' + Objective2: + dialog: + - '&a[Bromia Culleolus]&f Oh, the way to the village. Yes, just take this road that leads to the mountain.' + - Happy to help! + name: '&2The ice village awaits' + questLore: + - We must send aid to &dGladius&f as soon as possible. + - Champion, there is a village of mighty warriors to the far south. + - You should travel there and inform them that &dPontis Mille&f + - would seek their aid in pushing back the invaders from the &dBlood Temple&f. + - Find &aGlacies Princeps&f and tell them I sent you. + - There many travelers on the roads, you should stop and ask them for direction. + questAcceptDialog: + - '&a[Shogun Navita]&f It will be a long journey. Make sure you prepare. Follow the roads that lead south.' + - '&7&oI must go and locate the &d&oIce Village&7&o to the far south.' + questCompleteMessage: + - '&a[Glacies Princeps]&f The Shogun sent you, I see, it is good to hear that &aNavita&f is back to his old self.' + - Before we can act against the &dBlood Temple&f, there are some issues that I would like dealt with first. + - Let me tell you more... + - '&7&oI should speak to &a&oGlacies&7&o.' +primis_main_quest_17: + customObjectives: + Objective3: + dialog: + - '&a[Theopropides Nero]&f Help? Yes, please!' + Objective1: + dialog: + - '&a[Alanus Isatis]&f Here to help with the &cRazorbacks&f?' + Objective2: + dialog: + - '&a[Domina Violet]&f I hope you are here to help!' + name: '&2Helping the north' + questLore: + - Before we further discuss anything about + - the &dBlood Temple&f. + - There are issues that have popped around our village that need to be dealt with as soon as possible. + - If these issues are not resolved then I would fail in my duties as a village leader. + - There is no way for me to ignore the plea of my own people and put others first. + - If you could aid us in resolving these issues then our attention would be all yours. + - We have an escaped prisoner, wildlife problems and even our own villagers stealing from the village. + - I will tell you the names and the locations of the people that came with these issues to me. + - Go talk to them and make sure you help them with any complaints and issues they have. + - They will be able to tell you in more detail what needs to be done. + questAcceptDialog: + - '&a[Glacies Princeps]&f Once you are done helping them. Come back to me and we can talk.' + - '&7&oI should go talk to the villagers on my list and help them out with any issues they might have.' + questCompleteMessage: + - '&a[Romanus Superbus]&f &2Glacies&f sent you, about darn time! We have a prisoner on the loose!' + - '&7&oI should speak to &a&oRomanus Superbus&7&o.' +primis_main_quest_18: + name: '&2The trial of ice' + questLore: + - Well you have certainly impressed me and most of the village. + - I owe you an explanation friend. You see for the longest time we used to draw power from + - the &cIce Elementals&f. + - They would bless us with their power and in return any of us who would want to become a warrior or a hunter had to pass the &9Trial of Ice&f. + - To pass the trial you had to climb the black mountain all the way to its eastern peak. And at the peak you would face the + - '&cMinor Ice Elementals&f in combat.' + - Should you succeed then your claim to become a warrior or a hunter was unquestionably your right. + - If you failed...then...your energy and your being belonged to the &cIce Elementals&f. + - This is how it was for the longest time. Until the &dBlood Temples&f influence grew in power. + - Ever since then + - the &cIce Elementals&f have been emboldened. Drawing power from them was now a risk. + - Several of our people got corrupted and we had to jail them for our own safety. + - And doing the trial became impossible, what faced you at the peak was something no villager could overcome. + - Those who have failed the trial are still there, their souls trapped in the husks of their decaying bodies. + - Slaves to the + - '&cIce Elementals&f.' + - It is clear that our old traditions are no longer. + - The &cIce Elementals&f must be dealt with... + - I would ask you to be the last one to + - undertake &9The Trial of Ice&f. Climb to the peak and face the + - '&cMinor Ice Elementals&f and release the souls of those who failed the trial.' + questAcceptDialog: + - '&a[Glacies Princeps]&f You can find the start of the path to the trial at &aViolet''s&f house.' + - Follow the &9Amethyst&f blocks, they will guide you to the peak. + - '&7&oI should follow the &9&oAmethyst Blocks&7&o to the peak of the mountain and then slay the &c&oMinor Ice Elementals&7&o.' + questCompleteMessage: + - '&a[Glacies Princeps]&f You have done it? May their souls rest in peace now.' + - Let's speak again friend. There is more to be done. + - '&7&oI should speak to &a&oGlacies&7&o.' +primis_main_quest_19: + name: '&2Chill out' + questLore: + - It is time to free ourselves from this curse. + - We should have never made ourselves dependent on an &cElementals&f power. + - We shall correct that mistake here and now. + - What you have slain were just + - '&cMinor Ice Elementals&f, the' + - '&cIce Elemental&f rests in a temple right across from our village.' + - It was the main source of our power...and foolishness. + - Go forth now and slay the &cIce Elemental&f. + questAcceptDialog: + - '&a[Glacies Princeps]&f You will find a path that leads into the temple at the summit of the village.' + - '&7&oI should go into the temple and slay the &c&oIce Elemental&7&o.' + questCompleteMessage: + - '&a[Glacies Princeps]&f I could feel the energies flowing out, all the way from here.' + - You have done us a great favor friend. The &dIce Village&f will provide aid to you and your allies. + - There is another settlement that might need your help, let's speak. + - '&7&oI should hear what &a&oGlacies&7&o has to say.' +primis_main_quest_2: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis]&fYou''ll help us? Thank the seas! This was starting to feel like a sinking ship!' + name: '&2Nieznajomi w potrzebie...' + questLore: + - Więc nie tylko nie mogą pomóc, ale chcą naszej pomocy? Bah! + - Cóż, nie mamy teraz zbyt dużego wyboru, prawda? + - Idź, pomóż im, a potem spraw, by oni pomogli nam! + questAcceptDialog: + - '&a[First Mate Iracundi]&f Fine, go help the locals, see what info you can gather and see if you can get them to help us in turn. I will be here, negotiating things.' + - Wróć jak tylko coś będziesz wiedzieć! + - '&7&oI should talk to the &aVillage Leader&f to see about helping the locals.' + questCompleteMessage: + - '&a[Chief Piscis]&f Everyone in the village has an issue that needs dealing with, and I am no exception. My request is quite challenging, so maybe you want to get warmed up and get the lay of the land with some of the issues from the other villagers.' + - Odezwij się do mnie, gdy będziesz gotowy, a ja podzielę się z Tobą sekretami dotyczącymi tego jak opuścić tą dolinę! + - '&7&oI should talk to the locals and see who needs help, and come back to the leader when I feel ready to continue.' +primis_main_quest_20: + customObjectives: + Objective1: + dialog: + - '&a[Lutum Princeps]&f This better be important.' + name: '&2Terravilla' + questLore: + - Some time ago we received a request for aid from a + - a nearby settlement. Years ago a bunch + - of explorers settled on top of this ancient ruin. + - I think they call their little + - settlement &dTerravilla&f. Apparently there is a lot + - of treasure to be had there if you don't mind the risk. + - But I hear that stuff has gone wrong there and they asked + - us if we could spare any help to send their way. To be + - honest, you are the strongest warrior I have ever seen. + - You are the best help we could send. If you would like + - to go of course. + questAcceptDialog: + - '&a[Glacies Princeps]&f You will find &aTerravilla&f straight West of here.' + - It is located on top of this ancient elemental ruin, you will know it when you see it. + - Oh, I almost forgot. The person you want to talk to is &aOverseer Lutum&f. + - '&7&oI should go to &d&oTerravilla&7&o and talk to &a&oOverseer Lutum&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f Came all the way from the &dIce Village&f, eh. Good to see some help arrive.' + - When I sent that request for aid I wasn't sure if we were gonna get any. I heard the situation over there wasn't that much better. + - We are in quite a pickle over here. We have plenty of work for you if you want it. + - '&7&oI should talk to &a&oLutum&7&o.' +primis_main_quest_21: + name: '&2Taking out the trash' + questLore: + - Many years ago some explorers came across this ruin and + - as they investigated it more closely they discovered a + - large underground maze-like structure. In this structure + - there were a lot of ancient artifacts and treasures. But + - also a lot of danger. Not like that stopped anyone from + - going down there. And as the word spread, more and more + - people came here to make their fortunes. Before you + - know it, it turned into a small settlement. Until lately + - everything was fine, but then awful things started + - happening. Before I tell you more, we should start by + - dealing with the simple problems first. A small band of + - '&cRobbers&f has found a foothold in the hills surrounding' + - '&dTerravilla&f. We need them gone. Also, feel free to assist' + - any villagers in &aTerravilla&f that might need help. + questAcceptDialog: + - '&a[Lutum Princeps]&f I am not sure where the &cRobbers&f are exactly. I just know that people have reported seeing them coming from the hills.' + - '&7&oI should deal with the &c&oRobbers&7&o and help any villagers in need if I have the time.' + questCompleteMessage: + - '&a[Lutum Princeps]&f Well that is one issue resolved. Onto the next!' + - Before we move on, I want you to have this blade. + - It might be old and dull but it's still as good as anything you can get your hands on today. + - '&7&oI should hear out what &a&oLutum&7&o has planned next.' +primis_main_quest_22: + name: '&2Big trouble in little pub' + questLore: + - Before we get to the big problem underground, I would + - like you to do one last thing here in town. There has + - been huge trouble in our little pub. There are certain + - characters in town who keep going to the pub and causing + - a ruckus. Well I heard that this time all of them managed + - to gather at the pub at the same time. And of course now + - there is a huge brawl happening over there. This is a great + - opportunity for us to arrest all of them at once. Go to the + - pub and knock them all out. We will handle the rest. + questAcceptDialog: + - '&a[Lutum Princeps]&f The pub is at the ground level, right across. Don''t let them overwhelm you.' + - I will have a nice reward waiting here for you when you're back. + - '&7&oI need to go to the pub and deal with the &c&oBar Brawlers&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f I hear that the pub is a peaceful place again. Let''s discuss the real issue now.' + - '&7&oI need to talk to &a&oLutum&7&o.' +primis_main_quest_23: + name: '&2Strike the earth' + questLore: + - You see the real reason we asked for help is because of what happened + - at the ruins. There were always dangerous things down there, + - but nothing a seasoned adventurer or explorer could not handle. But then + - something awakened, these ancient constructs started rising out of the + - ground and the walls. Then these quakes started happening, it was weird, + - because you could only feel them if you were down in the ruins. So we shut + - everything down, nobody was allowed access to the ruins anymore. A few days + - ago I gathered some of my best men and sent them down there to find the source + - of it all. They barely made it back. They found an &cEarth Elemental&f high + - above the pillars, on top some sort of platform. It must have been there + - dormant all this time. No clue why it decided to wake up now... + - Your job would be to go down there, navigate through the maze and put the + - '&cEarth Elemental&f into a slumber it will never wake up from.' + questAcceptDialog: + - '&a[Lutum Princeps]&f You can get to the maze by walking down the spiral staircase in the middle of the ruins.' + - Don't get lost in the maze, also make sure to watch out for the constructs. Good luck! + - '&7&oI should enter the &d&oRuins Maze&7&o and slay the &c&oEarth Elemental&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f I cannot believe it, you''re back. In one piece too!' + - I guess you are tougher than you look. What you have done here is incredible it is clear we are in great debt to you. Is there anything Terravilla might be able to do for you. + - '&7&oI need to tell &a&oLutum&7&o about my quest and the &d&oBlood Temple&7&o.' +primis_main_quest_24: + customObjectives: + Objective1: + dialog: + - '&a[Navita]&f You have returned! I hope you have good tidings.' + name: '&2There and back again' + questLore: + - We had no idea what was going on... Yes, + - '&dTerravilla&f will be able to pledge some' + - of our forces to your cause. I wonder if the + - '&cEarth Elemental&f awakening had anything' + - to do with the &dBlood Temple&f. We will + - prepare our forces and wait for word from + - '&dPontis Mille&f.' + questAcceptDialog: + - '&a[Lutum Princeps]&f So you are heading off to &dPontis Mille&f, make sure to tell the &aShogun&f that &dTerravilla&f will be ready to assist.' + - '&7&oI should head to &d&oPontis Mille&7&o and speak with &a&oShogun Navita&7&o.' + questCompleteMessage: + - '&a[Navita]&f It is good to hear that the &dIce Village&f has decided to join our cause! But I did not expect that you would manage to convince &dTerravilla&f to pledge to our cause as well.' +primis_main_quest_25: + customObjectives: + Objective1: + dialog: + - '&a[Outpost Officer]&fFILLER TEXT!' + name: '&2To the outpost' + questLore: + - It is so good to see you again friend! + - While you were gone we were preparing our + - forces. We have made an &dOutpost&f + - between the &dBlood Temple&f and &dPontis Mille&f. + - You should go there and report to the + - '&aOutpost Officer&f. They will let you know' + - how we shall proceed with the assault on the + - '&dBlood Temple&f.' + questAcceptDialog: + - '&a[Navita]&f The outpost is to the South of the city. Not too long now, before the additional forces from &dTerravilla&f and the &dIce Village&f arrive.' + - '&7&oI should head to the &d&oOutpost&7&o and speak with the &a&oOutpost Officer&7&o.' + questCompleteMessage: + - '&a[Outpost Officer]&f I GOT NO IDEA WHAT TO SAY CAUSE I AM NOT DONE' +primis_main_quest_3: + name: '&cObóz Bandytów!' + questLore: + - A nearby &dBandit Camp&f has recently been sighted + - and is trying to take us under! + - They keep raiding our supplies and kidnapping our villagers! + - They even took my &eGrandfather's Heirloom&f! + - We don't know what they want, but we need them gone! + - Figure out what they are doing, deal with them and bring + - me back my &eGrandfather's Heirloom&f! + questAcceptDialog: + - '&a[Chief Piscis]&f The &dBandit Camp&f isn''t too far away if you follow the road!' + - Bądź ostrożny w drodze tam, nie wiemy co oni kombinują, ale nie może to być nic dobrego! + - Oh, and make sure you bring back my &eGrandfather's Heirloom&f! + - '&7&oI should go to the nearby &dBandit Camp&7&o and clear it out.' + questCompleteMessage: + - '&a[Chief Piscis]&f I see you''re back! Do you bring good news?' + - '&7&oYou tell &aChief Piscis&7&o about the camp and turn the &eHeirloom&7&o in.' + - What's this? Mages? Elementals? This is an ill omen. You must talk to the &aRuler of Gladius&f to report this incident at once! + - Truly you have served us well! Here, for your efforts, I give you my &eGrandfather's Sword&f! May it serve you as well as it has served our family! + - '&7&oSeems like the &aChief Piscis&f is ready to tell me how to get out of here.' +primis_main_quest_4: + customObjectives: + Objective1: + dialog: + - '&a[Petrae]&f &2Chief Piscis&f sent you? Unfortunately the passage is closed, and the &cElemental&f guards it...' + name: '&9Ścieżka Niebieskiego Kwiata!' + questLore: + - We must report our findings about the + - '&dBandit Camp&f to &dGladius&f!' + - The mountain pass is guarded by an ancient, + - powerful &cGolem&f which must be avoided at all costs! + - Follow the &eBlue Flowers&f along the path, + - they will lead you to a secret passage + - through the mountains! + - A mountain guide will be waiting for you at the end + - of the &9Blue Flower &fpath! + questAcceptDialog: + - '&a[Chief Piscis]&f The mountain pass is guarded by an extremely dangerous &cGolem&f, which you are probably not able to defeat right now!' + - We know of a secret passage in the mountains. Follow the path of &9Blue Flowers &fand talk to the &aMountain Guide&f to get safe passage to Bridgeport! + - '&7&oI should follow the &9&oBlue Flower &7&opath to the &aMountain Guide&7&o!' + - '&7&oI should make sure to finish any business I got left before I leave.' + - '&7&oHint: Make sure you track the quest to make finding your destination easier!' + questCompleteMessage: + - '&a[Petrae]&f Are you sure you want to risk it? I can help you...' + - '&7&oSeems like &aPetrae&f has a request for me.' +primis_main_quest_5: + name: '&5Kryształowy Żywiołak' + questLore: + - Musisz przejść? Złe wyczucie czasu, mój przyjacielu. + - A &cCrystal Elemental &fhas invaded our passage + - and shut it down. + - If you really must make your way to Gladius, + - you will have to defeat this &cElemental&f first! + questAcceptDialog: + - '&a[Petrae]&f You seek to defeat the &cCrystal Elemental&f? I can but wish you luck in your endeavor!' + - Ja pójdę zaraz za tobą. Jeśli ci się powiedzie, spotkajmy się po drugiej stronie przejścia! + - '&7&oSeems like I must defeat the &cCrystal Elemental&7&o.' + questCompleteMessage: + - '&a[Petrae]&f Outstanding! I saw you defeat the &cCrystal Elemental&f, clearly there''s greatness in your future!' + - Now that we are on the other side, let me tell you the path to &dGladius&f! +primis_main_quest_6: + customObjectives: + Objective1: + dialog: + - '&a[Filius] &fYou made it through the mountain! You don''t see that every day.' + - I'm afraid my father is missing, but I can tell you about the path to &dGladius&f. If you want to help us though, talk to my &aMother&f! + - '&7&oSeem like &aFilius&7&o can help me find the way to &dGladius&7&o.' + name: '&5Gospodarstwo Rolne' + questLore: + - The path to &dGladius&f should be easy, but with + - all the disturbances we've been seeing I suspect + - it might not be that simple. + - I am good friends with the &aProprietor of the Farmstead&f + - down the road. If you tell them I sent you, I am sure + - they will tell you how to safely reach &dGladius&f and + - give you news about the surrounding area. + - Good luck in your travels and stay safe! + questAcceptDialog: + - '&a[Petrae]&f Just tell the &aProprietor of the Farmstead&f that I sent you, though I have heard that the &aProprietor&f hasn''t been seen in a while.' + - If they aren't around I am sure their son &aFilius&f will be glad to help you out! + - Bezpiecznych podróży! + - '&7&oI should follow the path to the &dFarmstead&7&o and talk to its &aProprietor&7&o.' + questCompleteMessage: + - '&a[Petrae]&f Outstanding! I saw you defeat the &cCrystal Elemental&f, clearly there''s greatness in your future!' + - Now that we are on the other side, let me tell you the path to &dGladius&f! + - '&7&oI should talk to &aFilius&7&o to learn the way to &dGladius&7&o, and possibly talk to his &aMother&7&o to see how I can help.' +primis_main_quest_7: + customObjectives: + Objective4: + dialog: + - '&a[General Hasta] &fI can''t believe you made it past the enemies.' + - You are exactly the kind of help we need right now! + - '&7&oSeems like I should talk to &aGeneral Hasta&7&o.' + name: '&5Ścieżka do Miasta Gladius' + questLore: + - Recently smoke was sighted over the fortress of &dGladius&f. + - We were unable to go there and see what's happening + - because a &dShip&f is currently blocking the path. + - We got attacked by a bunch of undead-looking creatures + - when we approached the &dShip&f, so we ran away. + - I am afraid you will have to force your way through this + - '&dShip&f in order to reach &dGladius&f. I''m sure that they will' + - reward you if you help thin the number of &cUndead&f on that ship! + questAcceptDialog: + - '&a[Filius] Be careful on the road, clearly something has gone wrong in &dGladius&f.' + - Once you reach &dGladius&f, the Fortress' lord should either be at his mansion or at the barracks! + - '&7&oI should go down the path to &dGladius&7&o and clear out some &cUndead Sailors&7&o on the way there.' + questCompleteMessage: + - '&a[Lord Hasta]&f Were you sent as reinforcements from Pontis Mille? Where are the others? Are you a messenger?' + - '&7&oI should talk to &aLord Hasta&7&o.' +primis_main_quest_8: + name: '&5Odzyskanie nadziei' + questLore: + - Nie spodziewaliśmy się tej inwazji. + - They came in the dead of night, hit us hard and fast. + - Before we knew it, half the city was overrun. + - Morale is low. Everyone here has lost someone. + - To spite our heartache, our own loved ones parade + - through the streets in a mockery of life itself. + - We need to rally and bolster morale, + - or we won't see another dawn! + - Back in my &dMansion&f, in my treasury, lies a &eDocument&f + - of the utmost importance. It is a written promise with + - one of the founders of &dPontis Mille&f to provide us with + - assistance in a time of dire need. This is the time. + - Retrieve the &eDocument&f, bring it back to me and + - I promise you will be welcomed in &dPontis Mille&f with + - open arms. Soldiers will fight to their last + - if given this small hope. + questAcceptDialog: + - '&a[General Hasta] The note is in my &dMansion&f. Be sure to bring it back. My men here also have other requests around town you can help with, if able.' + - '&7&oI should check what the other soldiers need and head to the &dMansion&7&o at the town exit.' + questCompleteMessage: + - '&a[Lord Hasta]&f Outstanding! Recovering this &eDocument&f in the middle of a war? If we had 10 more of you, the city would never have been taken in the first place!' + - Zanim pójdziesz, czy mógłbyś zrobić mi małą osobistą przysługę? + - '&7&oSeems like &aLord Hasta&7&o wants to talk to me.' +primis_main_quest_9: + name: '&5Czempion Gladiusa' + questLore: + - Before heading to &dPontis Mille&f, I have a + - personal favor to ask. + - Our &cChampion&f was last seen fighting off a horde of + - enemies near the &dStatue&f. + - We have not heard from him since the start of the + - invasion and at this stage we fear the worst. + - Please go check on him. If you find him and he has + - turned into one of these undead... please free him of his curse. + questAcceptDialog: + - '&a[General Hasta] &fMake your way to the &dStatue&f. I am sure our &cChampion&f will be easy to find.' + - '&7&oI should go to the &dStatue&7&o and investigate what happened to the &cChampion of Gladius&7&o.' + questCompleteMessage: + - '&a[General Hasta]&f So... The worst has come to pass. I will make sure these beasts shall pay for slaying my son.' + - 7&oSeems like &aGeneral Hasta&7&o has some parting words for me. +primis_ogre_mines_clear: + name: '&2Problemy wielkości Ogra' + questLore: + - Nasz obóz górniczy został opanowany! + - Potrzebujemy pomocy! + - I don't really know what happened, but we need to clear + - the encampment and talk to &aOld Vetus&f! + questAcceptDialog: + - '&a[Metus]&f You''re going to help? Please hurry, the encampment is just beyond here!' + - '&7&oI should clear the encampment and talk to &aOld Vetus&7&o.' + questCompleteMessage: + - '&a[Vetus Fossores]&f You came to help? Fantastic, we absolutely need help right now!' + - Here's a little something for your help clearing the encampment! +primis_ogre_mines_lost_bretheren: + customObjectives: + Objective1: + dialog: + - '&a[Fortis Fossores] &fWhat do you want? What, &aFugit&f sent you? What for? The mines were overrun? Hah, I didn''t even notice!' + - Let that worrywart brother of mine know that I am fine. Now, begone! I am on the verge of making a big mining discovery. I call it - branch mining! Hehehe, this one will change everything! + name: '&5Zagubieni Bracia' + questLore: + - The mine was overrun by &cOgres&7&o! + - In the confusion I got separated from my &aBrother&f in the &dMines&f, + - and I fear for his safety! + - He's a bit of an eccentric man, very dedicated to mining. + - You'll know if you've seen him! + - Please bring him back up here, or at the very least tell me if he is safe. + - I'll make it worth your trouble! + questAcceptDialog: + - '&a[Fugit] &fPlease find my &aBrother&f and make sure he''s OK!' + - '&7&oI find &aFugit''s Brother&7&o in the &dMines&7&o overrun by &cOgres&7&o.' + questCompleteMessage: + - '&a[Fugit Fossores]&f My &aBrother&f said what? Ah, typical of him, too focused on his work to notice the entire place was taken over!' + - Przy następnym spotkaniu przeprowadzę z nim poważną rozmowę! + - Thank you for your help, you can have my best pick-axe, LL I call her. It doesn't look like I'll be able to get mining any time soon at this rate. +primis_ogre_mines_old_miner_quest: + name: '&2Szczęśliwy Kilof' + questLore: + - Mamy trochę kłopotów! + - Podczas wydobycia natrafiliśmy na tajemniczą jaskinię pełną potworów! + - I dropped my favorite &ePick-axe&f as I ran, I need your help to go get it! + - I'm sure the &cOgre Magi&f picked it up for himself. + - Get my &eLucky Pickaxe&f back from that brute! + - I've got some trinkets for you when you return. + questAcceptDialog: + - '&a[Vetus Fossores]&f That &cOgre&f shouldn''t be far! You can find him in the cave to the right, before the collapsed area.' + - He should have the &ePickaxe&f, &cOgres&f love shiny things after all! + - '&7&oI should defeat the &cOgre Chief&f.' + questCompleteMessage: + - '&aa[Vetus Fossores]&f You got my lucky pick? Excellent!' + - Heres your reward! +primis_pontis_groves_acrobatics: + customObjectives: + Objective1: + dialog: + - '&a[Idoneitatem Hominem]&f Congratulations!' + name: '&2Acrobatics' + questLore: + - So you think you have you what it takes. + - Are you fit enough, are you quick enough, are you strong enough? + - Platforms, wines, dangerous heights. All you could ever want! + - The ultimate challenge lies ahead! + - OK, OK. Me and my &aBrother&f might have been bored a bit and + - made an entire acrobatics course. + - The goal is to to get from platform to platform using &9Wines&f and + - '&9Acrobatics&f and reach the end of the course.' + - Should you get through the course and reach the end. (Which is a sphere by the way.) + - You will be rewarded with a very nice &eItem&f! + questAcceptDialog: + - '&a[Posuere Hominem]&f You can find the start of the course at the &dEnd of that Tunnel&f.' + - Just swim up to the first wine and keep climbing the wine until you reach the top. + - Don't forget to speak to my &aBrother&f at the end of the course for the reward! + - '&7&oI should head to the start of the course.' + questCompleteMessage: + - '&a[Idoneitatem Hominem]&f Well deserved! I hope you did not cheat! Try and beat my record if you can.' +primis_pontis_groves_caught in the web: + name: '&2Caught in the web' + questLore: + - So they have a &dNest&f somewhere in the &dGrove&f. + - That would explain why their population has skyrocketed. + - We were used to some &cSpiders&f wandering into the &dGrove&f, but this is too much. + - It would be great if you could locate the &dNest&f and clear it out. + - We will make you some fine &eSpider Leg Boots&f as a reward! + questAcceptDialog: + - '&a[King Nemian]&f If there is a &dNest&f I am sure it would be &9Surrounded by Cobwebs&f.' + - '&7&oI should find the &dSpiders Nest&7&o and clear it out.' + questCompleteMessage: + - '&a[King Nemian]&f Hah! I knew we could count on you!' + - Here are your fine boots, well deserved! +primis_pontis_groves_elf_stole_from_my_shelf: + name: '&2Elf stole from my shelf' + questLore: + - Disaster has struck our little hole. + - Not too long ago our lovely home got raided by &cElf Bandits&f. + - Thankfully we weren't home at the time so nobody got hurt. + - We managed to replace most of our possessions. + - But they took my &eFamily Heirloom&f that was sitting on the shelf. + - If you would be so kind to go try and get it back for me, I would be most thankful. + - I make the best stews, I would be glad to share some with you as a reward. + questAcceptDialog: + - '&a[Luxuria Gorgonius]&f The &eHeirloom&f is quite valuable I am sure they would keep it &9Somewhere Extra Safe&f.' + - '&7&oI need to go retrieve the &eHeirloom&7&o.' + questCompleteMessage: + - '&a[Luxuria Gorgonius]&f Oh my gosh! You found it!' + - There are not enough thanks in the world for what you just did for me. + - '&7&oThis stew should keep med fed for a while.' +primis_pontis_groves_into_the_next_hole: + customObjectives: + Objective1: + dialog: + - '&a[Phygia Gorgonius]&f Time to kick those &cElves&f out for good!' + name: '&2Into the next hole...' + questLore: + - If you are available there is plenty more work to do around here. + - We have some serious &cElf&f problems, + - but I have assigned &aPhygia&f to handle those issues. + - Go talk to &aPhygia Gorgonius&f in the hole next to this one. + - They will be able to tell you more and what needs to be done. + questAcceptDialog: + - '&a[King Nemian]&f The hole right next to this one one, can''t miss it!' + - '&7&oI should go talk to &aPhygia Gorgonius&7&o.' + questCompleteMessage: + - '&a[Phygia Gorgonius]&f Let''s talk...' + - '&7&oI should hear out &aPhygia Gorgonius&7&o.' +primis_pontis_groves_lighthouse_1: + customObjectives: + Objective1: + dialog: + - '&a[Alanus Secundas] &fHas the &dGrove&f sent you?' + name: '&2Feeding the sick' + questLore: + - Wanderer, could I ask a simple favor of you? + - There is a nearby &dLighthouse&f. We usually deliver food to the family that lives there. + - But ever since the troubles began we could not leave our &dGrove&f. + - Would you be so kind to bring the family their latest batch of food. + - It would be great if you could hurry, it has been a while since the last delivery. + questAcceptDialog: + - '&a[King Nemian]&f When you exit the hole the &dLighthouse&f is straight forward and a bit to the left.' + - '&7&oI should go to the &dLighthouse&7&o.' + questCompleteMessage: + - '&a[Alanus Secundas]&f I am so thankful! We were just starting to run out of food.' + - Are you busy? + - '&7&oSeems like &aAlanus&7&o wants to talk to me.' +primis_pontis_groves_lighthouse_2: + customObjectives: + Objective1: + dialog: + - '&8[Jeeves]&fOh, hello there again!' + - '&8[Jeeves]&f They do not need the food anymore? I was just about to go shopping.' + - '&8[Jeeves]&f So kind of you to come here and let me know.' + name: '&2Do not ask Jeeves' + questLore: + - Uh, before you came. Jeeves the Travelling Merchant stopped by. + - We asked him if he could go get some food for us. + - Well, that is not necessary anymore so it would be great if you could climb to the top of + - the lighthouse and travel to Caeruleaum Village and tell Jeeves we do not need the food anymore. + questAcceptDialog: + - '&8[Alanus Secundas]&f When you exit the dwelling the Lighthouse is straight forward and a bit to the left.' + - '&8&oI should go to the Lighthouse.' + questCompleteMessage: + - '&8[Alanus]&f You let him know? Good, good!' + - '&8&oSeems like Alanus is quite fed.' +primis_pontis_groves_population_control: + name: '&2Population control!' + questLore: + - Oh I am so happy that finally someone has arrived to help us out. + - We have a big arachnid problem going on in our little grove. + - There are so many arachnids around these days that you cannot even + - take a nice evening walk without one of the nasty buggers + - jumping at you from the shadows. + - It is clear that their population numbers need a serious culling. + - Oh! Please bring to me any arachnid legs that are still in good contidion. + - We use them to make small cranes and grabbers. + questAcceptDialog: + - '&8[King Nemian]&f You will find them lurking beneath the shadows of the trees.' + - '&8&oI need to find Forest Crawlers and kill them.' + questCompleteMessage: + - '&8[King Nemian]&fGood to see you return, and with plenty of legs too!' + - '&8[King Nemian]&fYou think that their nest might be near? Let''s talk more about this' +primis_pontis_groves_tree_climbing_elf_bandits: + name: '&2Tree climbing elf bandits!' + questLore: + - I've had it up here with these gosh darn tree climbing &cElf Bandits&f in our &dGrove&f. + - Not like the &cSpiders&f were enough, + - now these shadow loving poop nuts have decided to settle in our trees! + - They love the dark you see, the light hurts them, makes them all foggy in the head. + - Of course a lot of darkness and shadow in our little &dGrove&f. So they moved right in! + - Forced their way in with their superior numbers. + - Well they got something coming alright, + - one look at you and I can tell you can handle a couple of stone giants! + - I am sure some elves won't be much of an issue for you. + - Go send them a message. The message is clear, THEIR NASTY BUTTS AIN'T WELCOME HERE! + questAcceptDialog: + - '&a[Phygia Gorgonius]&f I am sure you will find plenty of them if you find some place with shade and just look up, hard to miss their tree houses.' + - '&7&oI should go take care of these &cElves&7&o before &aPhygia&7&o catches on fire from rage.' + questCompleteMessage: + - '&a[Phygia Gorgonius]&f My friend! HAHA! So good to see you again!' + - I was watching from a distance. Seeing those fools fall to their death, nothing better! + - '&7&oThe elves wont be bothering &aPhygia&7&o ever again.' +primis_pontis_mille_fields_berry_crazed_wolf: + name: '&2Berry crazed wolves' + questLore: + - Oh gosh, I have no idea what is wrong with these &cRockhounds&f. + - They keep coming into the &dBerry Farm&f while I am away or sleeping. + - You would think they come here and eat the berries, but no! + - They load their mouths with them and carry them + - off somewhere deep into the forest. + - I mean they are &cHounds&f! Why are they even stealing berries. + - Well I guess it doesn''t matter, I have a favor to ask. + - Could you go clear the + - '&9Area Behind the Berry Farm&f,' + - and bring back my &eStolen Berries&f. + - I have a lot of pies to make and the berries they stole were ripe and ready. + questAcceptDialog: + - '&a[Dordalus Nasica]&f I only saw the &cRockhounds&f steal the berries.' + - '&7&oI should go kill the &c&oRedwood Rockhounds&7&o and collect any &e&oStolen Berries&7&o they drop.' + questCompleteMessage: + - '&a[Dordalus Nasica]&f Oh my, you did it. Could I bother you with one more tiny favor.' + - '&7&o Seems like &d&oMilonia&7&o has more work for me.' +primis_pontis_mille_fields_camping_hunters: + customObjectives: + Objective1: + dialog: + - '&a[Scribonia Ingenvinus]&f Yes?' + name: '&2Camping hunters' + questLore: + - I hope I am not bothering you. You look like a person that would listen to a plea. + - We do not have much to do here in the &dSlums&f, + - most of us like to wander the &dFields&f to pass the time. + - Unfortunately that has come to a stop after a bunch + - of &cMonsters&f started roaming around the &dFields&f. + - We heard that some hunters have made &dCamp&f near the &dFields&f. + - If you could go there and talk to them and ask them to deal with these &cMonsters&f... + questAcceptDialog: + - '&a[Augustina Verrucosis]&f Their &dCamp&f should be somewhere North-West of here.' + - '&7&oI need to head for the &d&oHunters Camp&7&o.' + questCompleteMessage: + - '&a[Scribonia Ingenvinus]&f Help the &dSlums&f with their &cMonster&f issue?' + - Let's talk more about. + - '&7&oI should talk to &a&oScribonia&7&o and hear out what she has to say.' +primis_pontis_mille_fields_camp_hunter_three_times_hunter: + name: '&2Hunter three times hunter' + questLore: + - So you found &aVolumnia&f. Thank the great hunters that she is alright. + - Since you have helped &aVolumnia&f and proven yourself a kind soul. + - How about a friendly challenge. I would be willing to offer you some nice + - quality armor should you face the challenge and return victorious. + - The challenge involves hunting + - '&cThree Great Beasts&f scattered across Pontis.' + - The &cBeast Cod Furiosa&f who swims underneath a bridge where two mountains stand. + - '&cBeast Crawler Megdun&f that slumbers on top of a sun covered grove.' + - Dancing between two western peaks you will find the + - '&cBeast Impaler Uladzimir' + - As proof bring me the &eImpaler's Horn&f, the &eCod's Scale&f and the &eCrawler's Silk&f. + questAcceptDialog: + - '&a[Milonia Majus]&f Here take this device it will roughly guide you to the their location.' + - '&7&oI should go and challenge the &c&oThree Great Beasts&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f You have returned. And you have brought all three items I requested as proof.' + - That must have been quite an adventure, reminds me of my younger days when I had more strength and agility. + - Well enough about me, here is your reward as promised! + - '&7You hand back the beast tracking device.' + - '&a[Milonia Majus]&fI had almost forgotten about that thing, thank you!' + - Until we meet again adventurer! +primis_pontis_mille_fields_do_it_yourself: + name: '&2Do it yourself' + questLore: + - Deal with the &cMonsters&f? Well I can tell you we have already been doing that. + - There is just too many of them and not enough of us. + - We started hunting them as soon as we made our &dCamp&f here. + - But their numbers just don't seem to be going down. + - And that's not even the worst of it. + - We have discovered a lair and a big old &cBeast&f that comes with it! + - Well since you have made it to our &dCamp&f in one piece, + - I assume you are quite capable yourself. + - How about joining the hunt? What say you? + questAcceptDialog: + - '&a[Scribonia Ingenvinus]&f I knew you would say yes! I see you are already well equipped.' + - OK, this is what I want you to do. + - We are worried about that large &cBeast&f aka. &cBig ol' Bubba&f so that is priority number one. + - Second I need you to slay 5 &cLonghorns&f and 6 &cShorthorns&f. + - Understood? Good. Report to me when you're done. + - '&7&oI should slay &c&oBig ol'' Bubba&7&o and kill 5 &c&oLonghorns&7&o and 6 &c&oShorthorns&7&o.' + questCompleteMessage: + - '&a[Scribonia Ingenvinus]&f I must say I am quite impressed.' + - Clearly you are way more than just 'capable'. + - Thank you for the assistance, we will be able to handle the rest. + - Until we meet again, great hunter. +primis_pontis_mille_fields_feeding_the_hungry: + customObjectives: + Objective3: + dialog: + - '&7You hand the over the bread and the flour.' + - '&a[Rufia Tertulus]&f I don''t know what to say. My children will be so happy!' + - '&7The woman bows to you in deep appreciation.' + Objective4: + dialog: + - '&a[Fabia Praetextus]&f I guess fantasies do come true sometimes. I am eternally grateful to you kind sir.' + Objective1: + dialog: + - '&a[Lena Lucan]&f Fresh bread! I cannot thank you enough!' + Objective2: + dialog: + - '&a[Tranio Florens]&f Wow! The day just keeps getting better!' + - Thank you for the flour kind soul. + name: '&2Feeding the hungry' + questLore: + - I can feel a good heart beating in that chest of yours. + - Not everyone is as fortunate as you and I. + - There are some poor souls living in the &dPontis Mille Slums&f. + - For a while now I have been working over + - time to produce surplus bread and flour. + - Would you mind taking these sacks of wheat and these bread stacks. + - Then travel with them to the &dSlums&f and hand them out to those in need? + - I have been doing this for a while now but I injured my left foot, + - so I cannot do much walking right now. + questAcceptDialog: + - '&a[Daemones Maritialis]&f I wish there were more people like you in the world.' + - The &dSlums&f are straight North of here, you can see the buildings in the distance. + - '&7&oI should go to the &dSlums&7&o and hand out the food to those in need.' + questCompleteMessage: + - '&a[Augustina Verrucosis]&f &2Daemones&f sent you here didn''t he.' + - He has been coming by every week handing out any food he could spare to make sure we didn't starve... + - Thank you stranger, my family won't forget this. +primis_pontis_mille_fields_fruity_hound: + name: '&2Fruity hound' + questLore: + - Since you are my NUMBER ONE berry recovery agent, + - I have another task for you. + - As you can see we grow some very large berries on our + - little &dBerry Farm&f here. + - There was a + - '&eSpecific Berry&f I was growing for a contest.' + - But as I was walking to the &dBerry Farm&f I saw a + - '&cFruity Rockhound&f jump for the bush holding my prized berry.' + - He snapped it off and carried it away. + - Its jaws were holding the berry by its stem so + - it should still be in one piece, I hope. + - If you go slay the beast and bring back my + - dear &eContest Berry&f I will have a nice + - reward waiting for you. + questAcceptDialog: + - '&a[Dordalus Nasica]&f I think I saw the &cHound&f head into the &dRedwoods&f, North-West of the farm.' + - '&7&oI should go slay the &c&oFruity Hound&7&o and see if the &e&oContest Berry&7&o is still in one piece.' + questCompleteMessage: + - '&a[Dordalus Nasica]&f YES! That is my darling! Fine and whole, not even any saliva on it!' + - As a reward for your work you can have my second largest berry. Be careful not to eat it. + - I know might be tempting to eat it, but believe me it's way more useful if you keep it around. +primis_pontis_mille_fields_not_on_my_farm: + name: '&2Not on my farm!' + questLore: + - Lately all these &cRats&f have been driving me crazy. + - They keep going into our little farm and eating all our goods! + - Any chance you could go and lower their numbers a bit? + - Be careful, there are so many of them. + - Oh, I almost forgot to tell you. + - If you see a large &cWell Fed Rat&f don't bother with it. + - It has grown so large and fat it would take you days to slay it. + questAcceptDialog: + - '&a[Milonia Majus]&f I am sure that you already noticed that they like to squirm around the path area.' + - '&7&oI should go kill the &cRats&7&o that hang around the path that leads to &dPontis Mille&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f Thank you so much! We can get back to making delicious goods now.' +primis_pontis_mille_fields_surprise_me_with_flour: + customObjectives: + Objective3: + dialog: + - '&a[Adulescens Lupis]&f I heard the farm was having &cRat&f problems. Three sacks of flour coming up, no problem!' + Objective1: + dialog: + - '&a[Dinia Niraemius]&f Flour? Sure, one sack of flour coming up!' + Objective2: + dialog: + - '&a[Daemones Maritialis]&f The farm needs more flour eh? Here ya go, two sacks!' + name: '&2Surprise me with flour' + questLore: + - Wow, you're quite handy. If I could bother you with another task. + - The &cRats&f had completely ruined our current stock of flour. + - So we need to a completely new batch of flour. + - The &dWindmills&f should have plenty of it. + - Go collect the flour and drop it off back here with me. + - I will be paying good coin for this service! + questAcceptDialog: + - '&a[Milonia Majus]&f You will need to collect the flour from all three &dWindmills&f.' + - '&7&oI need to visit the three &dWindmills&7&o and collect the flour they produce.' + questCompleteMessage: + - '&a[Milonia Majus]&f This should last us for quite a while!' + - Hopefully our flour tab won't get too big, hehe. +primis_pontis_mille_fields_wellness: + name: '&2Wellness' + questLore: + - Am I glad to see you right now! + - Dang &cNightmare Rat&f ambushed me while I was climbing down the well. + - I injured my arm and legs when I fell. + - Argh, I still have some of its toxic spit left in my eyes. + - Thankfully I managed to crawl my way onto this little + - ledge before it could come finish me off. + - How embarrassing, not sure what hurts more right now, my body or my pride. + - I have some + - '&eFirst Aid Equipment&f' + - in my chest at the &dHunters Camp&f. + - Would you mind getting it for me? Oh, and make sure not to tell anyone + - there a word about what you saw here. + - '...almost died in a well...this is chapter of my life I will need to erase...' + questAcceptDialog: + - '&a[Volumnia Zoilus]&f The &dHunters Camp&f is straight South, cannot miss it, look for tents.' + - '&7&oI need to go collect the &e&oFirst Aid Equipment&7&o for &a&oVolumnia&7&o at the &d&oHunters Camp&7&o.' + questCompleteMessage: + - '&a[Volumnia Zoilus]&f Already back? Hand me the equipment.' + - Do not worry about me, I will have myself patched up in no time. + - Thank you for everything! You saved my life you know! +primis_pontis_mille_field_check: + customObjectives: + Objective1: + dialog: + - '&a[Augustina Verrucosis]&f Oh, this is quite important! I will let the residents know.' + - Thank you for delivering these important documents. + name: '&2Field check' + questLore: + - If I could bother you with some delivery tasks. + - I have here some important documents that need to be delivered to the + - '&dSlums&f and to the &dFields Farm&f.' + - The soldier that was supposed to come and get them has not arrived yet. + - And this is an urgent matter, we cannot afford to wait any longer. + - Unfortunately I have strict orders to not leave my post. + - If you could do this for me it would help us out a lot. + questAcceptDialog: + - '&a[Godefridus Novation]&f You will do it? Excellent!' + - You can follow the &9Yellow Path&f to get to the slums. + - The &dFields Farm&f is right beyond the slums, just follow the path. + - Oh! And watch out for the field rats! + - '&7&oI should head for the &d&oSlums&7&o and then the &d&oFields Farm&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f Documents? Let me see them. Hmmm, looks official.' + - Thank you for coming all the way here to deliver them. + - '&7&oSeems like &a&oMilonia&7&o could use my help with the rats...' +primis_pontis_mille_fresh_rats_coming_up: + customObjectives: + Objective1: + dialog: + - '&a[Elite Guard]&f Plenty of rats inside.' + name: '&2Fresh rats coming up' + questLore: + - No cat food but I think I can help ya + - find something even better... + - I heard a couple of + - '&aGuards&f have been dealing with' + - a rat infestation in the lower parts of the city. + - Go down there and maybe you can get some + - '&cRats&f for your cat friend.' + questAcceptDialog: + - '&7&oI should check out the lower part of the city and see if I can find the &a&oElite Guards&7&o.' + questCompleteMessage: + - '&a[Mew Meowzer]&f Meow. MEOW! Prrrrr.' + - '&7&oI should let the cat enjoy it''s meal in peace.' + - '&7&oIt seems to have dropped something, hmm...' +primis_pontis_mille_hungry_friend: + customObjectives: + Objective3: + dialog: + - '&a[Melaenis Gelasius]&f Cat food? Where the heck did you manage to find a cat here...' + - No, I don't know where to get any cat food. + Objective4: + dialog: + - '&a[Sulpicio Panthera]&f I wish I could help, sorry.' + Objective1: + dialog: + - '&a[Royal Guard]&f Do I look like someone who keeps track of cat food?...' + Objective2: + dialog: + - '&a[Tyndarus Faustinius]&f Sorry, I have no idea.' + Objective5: + dialog: + - '&a[Tyndarus Columbanus]&f We used to have cat food around here somewhere, but heck knows what happened to it...' + name: '&2Hungry friend' + questLore: + - '&7&oWhat is wrong little one.' + - '&a[Mew Meowzer]&f Meow!' + - '&7&o Are you hungry? Does the' + - '&7&olittle one want some food?' + - '&a[Mew Meowzer]&f MREOOOW!!!' + - '&7&oLet''s see if we can' + - '&7&oget you some food.' + questAcceptDialog: + - '&7&oI should see if anybody in the city knows where to find some cat food.' + questCompleteMessage: + - '&a[Modestus Aper]&f Cat food? I don''t know about that. But...' + - '&7&oSeems like &a&oModestus&7&o might know something...' +primis_pontis_mille_late_delivery: + name: '&2Late delivery' + questLore: + - I ordered some &eFishing Nets&f from + - '&dGladius&f that haven''t arrived yet. I wonder' + - if something might have happened to the + - shipment. If you are willing, I would pay you + - a small fee if you could go see what + - happened to the shipment and get the + - '&eFishing Nets&f for me.' + questAcceptDialog: + - '&a[Delphium Calpurnius]&f Last I heard my shipment of &eFishing Nets&f was supposed to be heading for &dGladius&f.' + - '&7&oI need to go look around &d&oGladius&7&o for &a&oDelphium''s&7&o shipment of &e&oFishing Nets&7&o.' + questCompleteMessage: + - '&a[Delphium Calpurnius]&f Those are the &eFishing Nets&f! Thank you so much!' + - '&a[Delphium Calpurnius]&f I invested a lot of my savings into these! Not sure what I would have done if you hadn''t found them.' +primis_pontis_mille_let_them_know: + customObjectives: + Objective3: + dialog: + - So Fortes sent you? I see. + - Your help would be much appreciated, aid me and my forces will be ready. + Objective1: + dialog: + - So Fortes has decided to take action. + - Help me finish my task, and my forces will be ready. + Objective2: + dialog: + - So Fortes has decided to act. + - If you could assist me with this task, then my forces will be ready. + name: '&2Let them know!' + questLore: + - I am sorry that we cannot send aid to &dGladius&f right away. + - Ever since that new &cCounselor&f came, our ruler has not been himself. + - If you could reach out to the &aGenerals&f in the city and let them know + - that &dGladius&f needs help we might be able to to do something about it. + - But not before we deal with the existing issues first. + - I am sure that the &aGenerals&f will be happy to let you help them out with their issues. + - Go talk to them and then come back to let me know they got the message. + - I will reward you for your time. + questAcceptDialog: + - '&a[Fortes]&f Follow the &9orange path&f from the main room to find &aGeneral Bromia&f.' + - '&a[Fortes]&f At the end of the &9yellow path&f you will find the &aGeneral Rogerius&f.' + - '&a[Fortes]&f At the end of the &9shorter purple&f path you will find the &aGeneral Cylindrus&f.' + - '&7&oI need to talk to the three &a&oGenerals&7&o.' + questCompleteMessage: + - '&a[Fortes]&f You managed to contact them? Excellent!' + - '&a[Fortes]&f Here is your reward. Don''t spend it all in one place.' +primis_pontis_mille_lighthouse_1: + customObjectives: + Objective1: + dialog: + - '&8[Hegio Remus]&f Another letter? Thank you for bringing it to me.' + name: '&2A quick delivery' + questLore: + - Before you go anywhere, could you deliver this letter for me? + - You can find the gentleman it needs to go to on top of the Lighthouse. + - Don't worry the Lighthouse is right behind me through that doorway. + questAcceptDialog: + - '&8[Fortes]&f Thank you.' + - '&8&oI should go talk to the Pontis Mille Lighthouse Keeper.' + questCompleteMessage: + - '&8[Hegio Remus]&f Hey, do you have a second?' + - '&8&oSeems like Hegio Remus needs me to talk to him.' +primis_pontis_mille_lighthouse_2: + customObjectives: + Objective1: + dialog: + - '&a[Jeeves]&f Oh, we meet again. It''s good to see you.' + - You have something for me? Oh, wow...that is quite the shopping list. + - I will have the items sent back to &aHegio&f as soon as possible. + - Thank you for stopping by. Hope we meet again. + - '&7&oI should let &aHegio&7&o know I delivered the note.' + name: '&2Ask Jeeves' + questLore: + - Would you mind taking the portal and delivering a note to my good friend &aJeeves&f. + questAcceptDialog: + - '&a[Hegio]&f Much appreciated friend.' + - '&7&oI should go talk to &aJeeves&f at &dCaeruleaum Village&7&o.' + questCompleteMessage: + - '&a[Hegio]&f You delivered the note? Excellent!' + - Here, you can have some of this &eRabbit Stew&f I keep in my back pocket. +primis_pontis_mille_mines_goblined_up_in_the_maze: + customObjectives: + Objective3: + dialog: + - '&a[Hurt Guard]&f Am so I happy to see you!' + Objective1: + dialog: + - '&a[Injured Guard]&f Thank the skies!' + Objective2: + dialog: + - '&a[Wounded Guard]&f Finally, the rescue is here!' + name: '&2Goblined up in the maze' + questLore: + - If I could bother you for a second. + - Since you will be going into the &dMines&f already, it + - would be great if you could help us resolve some issues. + - We are missing three &aGuards&f that were sent + - into the mines to hunt down a &cCursed Goblin&f. + - I fear that something might have happened to them. + - This &cCursed Goblin&f is supposed to be + - hiding in some sort of &9Maze&f in the &dMines&f. + - Could you locate the &aMissing Guards&f and + - bring me proof of the &cGoblins&f death. + questAcceptDialog: + - '&a[Centurion]&fTry to not get lost in the &9Maze&f.' + - May luck be on your side warrior! + - '&7&oI should venture through the &d&oMines&7&o and locate the &9&oMaze&7&o.' + questCompleteMessage: + - '&a[Centurion]&f They are alive, excellent, we will send some soldiers to get them out as soon as possible.' + - I see you brought proof of the &cGoblins&f death, well done. + - '&7&oHopefully people keep out of the &9Maze&7&o in the future.' +primis_pontis_mille_serious_sewage: + customObjectives: + Objective3: + dialog: + - '&a[Michelangelo]&f Tell that old man everything is in order!' + Objective4: + dialog: + - '&a[Raphael]&f Tell Rogerius I am alive and doing fine!' + Objective1: + dialog: + - '&a[Donatello]&f You can tell the General I am doing just fine!' + Objective2: + dialog: + - '&a[Leonardo]&f The General should not worry, I am ok!' + name: '&2Serious sewage' + questLore: + - If you are up to the task then I could use your help. + - The &dSewers&f under the city have become a lair for all sorts of trouble makers and critters. + - The trouble makers call themselves &cNinjas&f...even though they are far from it. + - They have a leader, I think he calls himself &cShreepper&f or something. + - Make sure to get rid of him, a snake without it's head is not a threat. + - If you could go down there and thin the numbers of critters and the trouble makers + - then that would allow me to assign my forces to more important tasks... + - We had also sent &a4 Agents&f down there, I have not heard from them yet. + - It would mean a lot to me if you could check up on them to make sure they are ok. + - I also seem to have misplaced my personal &eSewage Keys&f + - if you could retrieve those too, that would be great. + questAcceptDialog: + - '&a[Rogerius]&fYou can get to the &dSewers&f by going to the fountain and then a bit south-east.' + - You know you are at the right spot when you see a big sewage pipe going into the wall. + - '&7&oI need to find my way into the &dSewers&7&o and complete the tasks.' + questCompleteMessage: + - '&a[Rogerius]&f You have completed the all I have asked? If only I had 10 more men like you...' +primis_pontis_mille_star_gazing: + customObjectives: + Objective1: + dialog: + - '&a[Virgo Dexippus]&f Yes, what is it?' + name: '&2Star gazing' + questLore: + - You have done so much for this city and its people. + - Having assisted the three &aGenerals&f and helped the areas around &dPontis Mille&f + - has freed up a serious amount of our forces and resources. + - We would be able to send our forces to aid &dGladius&f now. + - But before we take action there is one last thing I would like you to do. + - You should go speak with the &aStargazers&f. + - It is in regards to our lost history and the &cElementals&f. + - The &aStargazers&f will be able to tell you more once you talk to them. + - Here take this sealed note and show it to them. + questAcceptDialog: + - '&7[Fortes Bellator]&f You can find the &aStargazers&f at the &dObservatory&f.' + - The &dObservatory&f is located past the &dLighthouse&f. It is a large tower, hard to miss. + - '&7&oI should talk to the &aStargazers&7&o at the &dObservatory&7&o.' + questCompleteMessage: + - '&a[Virgo Dexippus]&f The &aMajor&f sent you? It must be important then.' + - '&7&oI should talk to &aVirgo&7&o.' +primis_pontis_mille_stay_a_while_and_listen: + name: '&2Stay a while and listen' + questLore: + - Hand me the note. Let me take a look... + - We have been given permission to share important + - information with you regarding our past. + - You must have done something quite important, + - this information is usually only shared with the top brass. + - '&aStella&f will share with you what we have uncovered.' + questAcceptDialog: + - '&a[Virgo Dexippus]&f Talk to &aStella&f and &9Click on the Sword&f to start listening.' + - '&7&oI should talk to &aStella&7&o and start the &9Arena Challenge&7&o.' + questCompleteMessage: + - '&a[Virgo Dexippus]&f Do not share this information with anyone.' + - '&7&oThat was quite a tale.' +primis_pontis_mille_the_groves_call: + customObjectives: + Objective1: + dialog: + - '&a[King Nemian]&f &2General Bromia&a sent you?' + - Excellent, I knew we could count on him. + name: '&2The groves call!' + questLore: + - It is our duty to protect the &dGroves&f from any threats. + - '&aKing Nemian&f of the &dGroves&f has sent a request for aid.' + - Nasty critters have come to the &dGroves&f and other + - invaders are taking over the trees. + - If you could go over there and sort out these issues + - then my forces will be free to come to &dGladius'&f aid + questAcceptDialog: + - '&a[Bromia]&f The &dGroves&f are located North of the city.' + - There is a path through the mountain,, below the mines. + - '&7&oI should talk to &aKing Nemian&7&o.' + questCompleteMessage: + - '&a[King Nemian]&f You have arrived just in time!' +primis_pontis_mille_to_lycan_or_not_to_lycan: + name: '&2To lycan or not to lycan' + questLore: + - Not sure how a single person can accomplish what + - an entire battalion cannot. + - But if the &aGeneral&f has sent you, then who I am to complain. + - We have located their &dDen&f, but the resistance is too strong. + - There was just no way to get through. + - But If you could fight your way into the &dDen&f and clear it out + - then the &dRedwoods&f could be safe yet again. Well safer at least... + - Their &dDen&f is located under a &9Corrupted Redwood Tree&f. + - Should be easy to spot it, it stands out among the healthy trees. + questAcceptDialog: + - '&a[Cylindrus]&f Be careful...' + - '&7&oI need to clear out the &dWerewolf Den&7&o.' + questCompleteMessage: + - '&a[Magnus]&f By the great tree fairy, you''ve done it!!!' + - Feel free to rest at our camp, you are always welcome here. +primis_pontis_mille_where_is_he_now: + customObjectives: + Objective1: + dialog: + - '&a[Gorenus Palis]&f My brother sent you looking for me?' + - Oh, I messed up again...I got real lost this time. + - I hope he isn't too mad. + - When you go back, please tell him I'm safe. + name: '&2Hungry friend' + questLore: + - Me and my &aBrother&f were on our way + - back here from the village. + - During our travels I had to do a little detour, so we got separated. + - We were supposed to meet up here. + - But no trace of him for quite some time now. + - He has a tendency to get lost...real lost. + - I am quite worried about him. + - I would be willing to pay a high reward + - to anyone who can find him. + questAcceptDialog: + - '&a[Rodenus Palis]&f So kind of you to offer your help.' + - Please if you find him come tell me where he is right away. + - '&7&oI need to go find &a&oRodenus''&7&o brother.' + questCompleteMessage: + - '&a[Rodenus Palis]&f What! How the heck did he end up all the way there!' + - Sigh, I better start going now then... + - Thank you for all your help. Here are the coins as promised. +primis_pontis_redwoods_big_brown_logs: + customObjectives: + Objective1: + dialog: + - '&a[Magnus]&f Who are you? Oh, you came from &dPontis Mille&f.' + name: '&2Big brown logs' + questLore: + - I could dedicate my forces to helping &dGladius&f if you could help + - us deal with the &cWerewolf&f crisis in the &dRedwoods&f. + - Our forces have been holding back the &cWerewolves&f for weeks now. + - It would be great if you could assist us. + - Go to the &dRedwoods&f and talk to &aMagnus Castorea&f. + - They will let you know what needs to be done to end this crisis. + questAcceptDialog: + - '&a[Cylindrus]&fThe &dRedwoods&f can be reached by heading North.' + - Head North until you reach the &dRailway Stop&f, then head West. + - '&7&oI need to head into the &dRedwoods&7&o and talk to &aMagnus&7&o.' + questCompleteMessage: + - '&a[Magnus]&f The general has sent you to help?' + - Hmm...you better be good. +primis_pontis_redwoods_its_reyn_time: + name: '&2It is Reyn time!' + questLore: + - My &ePocket-watch&f had fallen into the river when I was cutting down a tree. + - It is a special watch you see. Filled with air and quite robust. + - Fully resilient to heavy logs being dropped on it, yep. + - I saw one of those nasty &cBandits&f scoop it up and put it in their pocket. + - Pretty sure I saw them &9Carrying a Hatchet&f. + - If you could go to their camp and get it back for me. That would mean the world to me! + - A nice reward for you too when you get back! + questAcceptDialog: + - '&8[Reynus]&f You can find the &cBandits&f right across the river.' + - '&7&oI need to go slay the correct &cBandit&7&o and collect the &eWatch&7&o.' + questCompleteMessage: + - '&a[Reynus]&f I will make sure not to loose it again!' + - Your reward my good sir! +primis_pontis_redwoods_nasty_little_bandits: + name: '&2Nasty little bandits!' + questLore: + - Ever since these darn &cBandits&f settled across the river there has been no peace. + - They keep ruining the trees, yesterday I caught one of them + - trying to set one of these giant trees on fire! + - And not too long ago I got chased by a crazy person with a hatchet, + - I am quite sure it was one of the &cBandits&f. + - Not too mention they keep trying to rob anyone that + - has business with us good folk here at the &dSawmill&f. + - Enough is enough. I am willing to pay good coin to make this madness end. + questAcceptDialog: + - '&a[Ligna Crispian]&f You will find them across the river.' + - '&8&oI should go to the &dBandit Camp&f and clear it out.' + questCompleteMessage: + - '&a[Ligna Crispian]&f Finally! Some peace, thank you!' +primis_pontis_redwoods_need_a_smoke: + name: '&2Need a smoke' + questLore: + - I heard you helped good old &aReynus&f there. + - Well as you can see, I managed to cut my legs with that darn saw again. + - Oh, don't worry about me. My legs will be healed up again in no time. + - You see, the issue is, not much to do while I wait for my legs to heal. + - This makes me in the mood for some good puffin. + - I brought with me some &ePremium Tobacco&f for my pipe, + - but I had to hide it in case those &cBandits&f got their hands on it. + - The problem is, I completely forgot where I hid it! + - All I remember is burying it &9Near a Tree&f. + - Which tree? Who knows! + - Listen I got you a fine deal here. Find my tobacco and you can have + - all of my &eGolden Apples&f. + questAcceptDialog: + - '&a[Lyco]&f Hope ya find it soon.' + - '&7&oI should go look for the &eTobacco&7&o.' + questCompleteMessage: + - '&a[Lyco]&f You found it! HAHA! Knew I could rely on ya!' +primis_terravilla_bipedal_examination: + name: '&2Bipedal examination' + questLore: + - I have been studying the &cTwo Legged Terrors&f that roam + - around &dTerravilla&f. Did you know that their population + - used to be much larger just some years ago. In fact it was + - the reason why the first settlers decided to build + - '&dTerravilla&f on top of the ruins and not down on the ground.' + - For some reason their numbers have really decreased. I was + - trying to get some &eSamples&f but trying to kill any of them is + - far beyond my skill. But you look like the sort of type who + - can handle a &cTwo Legged Terror&f or two. Interested in + - helping me out? + questAcceptDialog: + - '&a[Plautia Suilius]&f Six &eSamples&f should do it. Return to me once you have collected the &eSamples&f.' + - '&7&oI need to slay 3 &c&oTwo Legged Terrors&7&o and collect their &e&oSamples&7&o.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Great! Let''s have a look.' + - '&7&oI should hear what &a&oPlautia Suilius&7&o has discovered.' +primis_terravilla_drowning_terror: + name: '&2Drowning terror' + questLore: + - My theory was correct. I dissected the growth and found + - an organism inside. After careful examination I have + - determined that the organism is of aquatic origin. And + - not only that, they are capable of hijacking the host's + - brain. Once ready to hatch they make the host go to the + - nearest water source and drown themselves. The organism + - can then freely hatch and swim away. Whatever is + - infecting the &cTwo Legged Terrors&f must be living in + - a nearby river. You should go there and collect a + - '&ePerfect Sample&f of whatever organism is causing this.' + - I do not know if this is something that can affect humans + - but just in case you should kill a few of the organisms + - to make sure. + questAcceptDialog: + - '&a[Plautia Suilius]&f Come back here once you have collected a &ePerfect Sample&f.' + - '&7&oI need to go to the nearby river and collect a &e&oPerfect Sample&7&o of whatever is causing the infections.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Wow it looks like a fish, but it''s internal organs are different.' + - It must infect other creatures by releasing these tiny worm like meat particles... + - Let me have a look at you. Hmm, you seem fine, no traces... + - So it is not affecting us...yet. This is an emergency, I need to collect my stuff and go present my findings to the researchers at &dPontis Mille&f immediately. I need to get approval for extermination, that organism cannot be allowed to evolve. + - Thank you for everything you have done. Here, take this. It's not a lot but at least it's something. + - '&7&oI should make sure to stay away from the river...' +primis_terravilla_hog_on_my_porch: + name: '&2Bipedal examination' + questLore: + - He is sitting on the darn lift again! + - I cannot believe it! You there! + - You look like you can handle a large beast. + - I will pay you good money if you can get rid + - of that &cAnnoying Large Hog&f that keeps sitting + - on the lift. How are we supposed to get goods + - up and down this way. + questAcceptDialog: + - '&a[Dorippa Sarimarcus]&f Get rid of that hog right down there, see it?' + - '&7&oI need to slay the &c&oAlpha Razorback&7&o.' + questCompleteMessage: + - '&a[Dorippa Sarimarcus]&f Finally! I can move on with my life now! Thank you!' +primis_terravilla_razorbag: + name: '&2Razorbag' + questLore: + - If you are looking for work I got some for ya. + - I design and make heavy duty bags that I sell + - here at my little shop. So I am in need of + - leather. Thankfully there are plenty of + - '&cRazorbacks&f around these parts. If you are' + - interested I would like to hire you to go hunt + - them for their leather. I would need a considerable + - amount of leather. So this won't be a quick job. + questAcceptDialog: + - '&a[Telestis Senna]&f You will mostly find them roaming around here and towards the fields area.' + - '&7&oI need to go hunt the &c&oMature Razorback&7&o.' + questCompleteMessage: + - '&a[Telestis Senna]&f Yep, that will do it. In pristine condition too! Here is your coin, as promised.' +primis_terravilla_terrifying: + name: '&2Terrifying' + questLore: + - Well that is concerning. The sample you brought shows + - that they are slowly being drained of their nutrients. + - My hypothesis is that there is most likely a parasite + - attached to them that is causing this. You should go + - out there again and see if you can find any large + - '&eGrowths&f on their bodies, and then cut them off' + - and bring them back here. + questAcceptDialog: + - '&a[Plautia Suilius]&f I would only need two &eGrowths&f no more than that.' + - '&7&oI need to slay &c&oTwo Legged Terrors&7&o and collect two &e&oGrowths&7&o.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Excellent, these should do it.' + - '&7&oI should hear what &a&oPlautia Suilius&7&o has managed to find.' +test_quest: + name: Kill the Test Boss + questLore: + - '&cEnd the test boss'' reign of terror!' +xmas_quest_0: + name: '&2Find the lost gifts!' + questLore: + - I seem to have lost some Christmas gifts along the way, would you help a poor old man find them again? + - I will let you open one of them in return! + questAcceptDialog: + - '&8[&cSaint Nick&8]&f Thank you! I will be waiting here for you!' + questCompleteMessage: + - '&8[&cSaint Nick&8]&f Thank you for your help! There are still some lost gifts out there, talk to me again if you want to help out more!' diff --git a/src/main/resources/translations/portuguese_brazilian.yml b/src/main/resources/translations/portuguese_brazilian.yml new file mode 100644 index 000000000..47c570a4c --- /dev/null +++ b/src/main/resources/translations/portuguese_brazilian.yml @@ -0,0 +1,13250 @@ +config: + noArenaPermissionMessage: '[EliteMobs] Você não tem permissão para entrar nesta arena!' +ItemSettings: + itemLoreStructureV2: + - '&7§m§l---------§7<§lEquip Info§7>§m§l---------' + - '&7Nível do Item: &f$itemLevel &7Prestígio &6$prestigeLevel' + - '$weaponOrArmorStats' + - '$soulbindInfo' + - '$itemSource' + - '$ifLore&7&m&l-----------&7< &f&lLore&7 >&m&l-----------' + - '$customLore' + - '$ifEnchantments&7&m&l--------&7<&9&lEncantamentos&7>&m&l--------' + - '$enchantments,' + - '$eliteEnchantments' + - '$ifCustomEnchantments&7&m&l------&7< &3&lEncantamentos Customizados&7 >&m&l------' + - '$customEnchantments' + - '$ifPotionEffects&7&m&l----------&7< &5&lEfeitos&7 >&m&l----------' + - '$potionEffect' + - '&7&l&m-----------------------------' + - '$loreResaleValue' + shopSourceItemLores: '&7Comprado em uma loja' + mobSourceItemLores: '&7Saqueado de $mob' + loreWorths: '&7 Valor $worth $currencyName' + loreResaleValues: '&7Vender por $resale $currencyName' + eliteEnchantmentLoreStrings: Elite + noSoulbindLore: '&7não é ligado à alma!' + preventEliteItemDisenchantmentMessage: '&c[EliteMobs] Não pode desencantar Itens de Elite!' + scrapSucceededMessageV2: '&8[EliteMobs] &2Reciclagem deu certo $amount vezes!' + scrapFailedMessageV2: '&8[EliteMobs] &cReciclagem falhou $amount vezes!' + lowDurabilityItemDropMessage: '&8[EliteMobs] &cEquipamento jogado no chão devido à baixa durabilidade! &8Repare o item no NPC com scrap pra voltar a usa-lo!' + lowWeaponItemDropMessage: '&8[EliteMobs] &Arma jogada no chão devido à baixa durabilidade! &8Repare o item no NPC com scrap pra voltar a usa-lo!' + simlootMessageSuccess: '&8[EliteMobs] &2Joguei os dados para o loot e consegui $itemName &2!' + simlootMessageFailure: '&8[EliteMobs] &cJoguei os dados para o loot e não obtive nada!' + directDropCustomLootMessage: '&8[EliteMobs] &Obteve $itemName &2!' + directDropMinecraftLootMessage: '&8[EliteMobs] &Obtido $itemName &2!' + directDropCoinMessage: '&8[EliteMobs] &aObtido &2$amount $currencyName &a!' + directDropSpecialMessage: '&8[EliteMobs] &aObtido &2$amount $name &a!' + weaponEntry: '&7Elite DPS: &2$EDPS' + armorEntry: '&7Armadura de Elite: &2$EDEF' +ProceduralItemGenerationSettings: + materialNames: + swordName: Sword + bowName: Bow + pickaxe: Pickaxe + spade: Spade + hoe: Hoe + axe: Axe + helmet: Helmet + chestplate: Chestplate + leggings: Leggings + boots: Boots + shears: Shears + fishingRod: Fishing Rod + shield: Shield + trident: Trident + crossbow: Crossbow + nameFormats: + - '$verb $itemType of the $adjective $noun' + - '$itemType of the $adjective $noun' + - '$noun''s $adjective $verb $itemType' + - '$verb $itemType' + - '$adjective $verb $itemType' + - The $verb-er + - The $adjective $verb-er + nouns: + - MagmaGuy + - Dawn + - Sunset + - Heaven + - Hell + - Angel + - Archangel + - Cherub + - Seraph + - Demônio + - Fiend + - Bat + - Chicken + - Cow + - Mooshroom + - Pig + - Rabbit + - Sheep + - Squid + - Villager + - Cave Spider + - Enderman + - Polar Bear + - Spider + - Zombie Pigman + - Blaze + - Creeper + - Elder Guardian + - Endermite + - Evoker + - Ghast + - Guardian + - Husk + - Magma Cube + - Shulker + - Silverfish + - Skeleton + - Slime + - Stray + - Vex + - Vindicator + - Witch + - Wither Skeleton + - Zombie + - Donkey + - Horse + - Llama + - Mule + - Ocelot + - Wolf + - Iron Golem + - Snow Golem + - Ender Dragon + - Wither + - Illusioner + - Parrot + - Giant + - Killer Bunny + - Steve + - Wolfbane + - Chaos + - Aeon + - Dragon + - Sphynx + - Minotaur + - Hades + - Oath + - Oathbreaker + - Deserter + - Betrayer + - Jade + - Light + - Darkness + - Oblivion + - Shadow + - Void + - Xeno + - Zealot + - Zenith + - Dusk + - Twilight + - Mob + - Elite Mob + - Urist + - Dwarf + - Elf + - Ork + - Goblin + - Gnome + - Goliath + - Drow + - Human + - Halfling + - Half-Orc + - Beholder + - Mind Flayer + - Owlbear + - Bulette + - Rust Monster + - Hill Giant + - Stone Giant + - Frost Giant + - Fire Giant + - Cloud Giant + - Storm Giant + - Kobold + - Lich + - Ork + - Umber Hulk + - Fighter + - Wizard + - Paladin + - Cleric + - Ranger + - Archer + - Mage + - Tiefling + - Werewolf + - Vampire + - Centaur + - Catfolk + - Half-Giant + - Ogre + - Troll + - Rogue + - Barbarian + - Bard + - Druid + - Monk + - Sorcerer + - Warlock + - Demon Hunter + - Death Knight + - Priest + - Shaman + - Warrior + - Basilisk + - Chimera + - Imp + - Dryad + - Gargoyle + - Djinni + - Efreeti + - Ghost + - Hobgoblin + - Hydra + - Kraken + - Lamia + - Medusa + - Mimic + - Mummy + - Pegasus + - Roc + - Satyr + - Tarrasque + - Abomination + - Ghoul + - Treant + - Unicorn + - Wraith + - Acolyte + - Gladiator + - Knight + - Gryphon + - Raider + - Scout + - Spy + - Thg + - Noble + - Guard + - Veteran + - Wyvern + - Abyssal + - Infernal + - Elemental + - Tauren + - Pandaren + - Sasquatch + - Forsaken + - Yeti + - Banshee + - Arachnid + - Undead + - Night Elf + - Blood Elf + - Draenei + - Worgen + - Warlord + - Witch + - Magi + - Sage + - Thief + - Assassin + - Templar + - Beastmaster + - Berserker + - Inventor + - Luchador + - Pirate + - Vanguard + - Voidblade + - Wisp + - Peasant + - Footman + - Swordsman + - Thrall + - Felhound + - Huntress + - Caçador + - Aarakorcra + - Aboleth + - Deva + - Planetar + - Solar + - Ankheg + - Azer + - Behir + - Death Tyrant + - Blight + - Bugbear + - Hugbear + - Bullywug + - Cambion + - Chuul + - Lich King + - Cockatrice + - Couatl + - Cyclops + - Titan + - Darkmantle + - Ancient One + - Demilich + - Balor + - Barlgura + - Chasme + - Dretch + - Glabrezu + - Goristro + - Hezrou + - Manes + - Marilith + - Nalfeshnee + - Quasit + - Vrock + - Yochlol + - Pit Fiend + - Lemure + - Dracolich + - Doppleganger + - Chromatic Dragon + - Drider + - Air Elemental + - Earth Elemental + - Fire Elemental + - Water Elemental + - Rohirrim + - Gondorian + - Empyrean + - Faerie Dragon + - Ettin + - Flumph + - Fomorian + - Dao + - Gnoll + - Parshendi + - Listener + - Spren + - Stormfather + - Rosharian + - Brightlord + - Highprince + - King + - Emperor + - Shardbearer + - Surgebinder + - Bondsmith + - Golem + - Gorgon + - Hag + - Harpy + - Hippogriff + - Homunculus + - State Alchemist + - Undying Soldier + - Jackalwere + - Nothic + - Oni + - Rakshasa + - Revenant + - Cultist + adjectives: + - Adorable + - Beautiful + - Clean + - Elegant + - Fancy + - Glamorous + - Handsome + - Long + - Magnificent + - Plain + - Quaint + - Sparkling + - Ugliest + - Red + - Orange + - Yellow + - Green + - Blue + - Purple + - Gray + - Black + - White + - Dead + - Odd + - Powerful + - Rich + - Vast + - Zealous + - Deafening + - Faint + - Melodic + - Quiet + - Thundering + - Whispering + - Hissing + - Ancient + - Fast + - Old + - Rapid + - Slow + - Rotten + - Creepy + - Crooked + - Empty + - Heavy + - Abhorrent + - Abnormal + - Absurd + - Acceptable + - Accidental + - Adamant + - Adventurous + - Agonizing + - Alert + - Annoyed + - Annoying + - Anxious + - Aromatic + - Aggressive + - Aloof + - Amazing + - Ambiguous + - Ambitious + - Amused + - Angry + - Arrogant + - Ashamed + - Aspiring + - Astonishing + - Auspicious + - Average + - Awesome + - Awful + - Bad + - Barbarous + - Bashful + - Beffiting + - Belligerent + - Beneficial + - Berserk + - Best + - Bewildered + - Big + - Bitter + - Bizarre + - Bloody + - Boiling + - Boundless + - Brash + - Brave + - Brawny + - Breakable + - Brief + - Bright + - Broken + - Busy + - Calculating + - Callous + - Calm + - Capricious + - Careful + - Careless + - Caring + - Cautious + - Ceaseless + - Certain + - Charming + - Cheap + - Chief + - Chilly + - Chivalrous + - Chunky + - Clear + - Clever + - Cloistered + - Clumsy + - Cloudy + - Classy + - Colossal + - Combative + - Common + - Confused + - Condemned + - Cool + - Courageous + - Cowardly + - Crazy + - Craven + - Cruel + - Cuddly + - Curious + - Cute + - Damaged + - Damaging + - Dangerous + - Dark + - Dashing + - Decisive + - Deep + - Defeated + - Defective + - Defiant + - Delicate + - Delicious + - Delightful + - Demonic + - Delirious + - Deranged + - Descriptive + - Devilish + - Difficult + - Diligent + - Direful + - Dirty + - Disastrous + - Disgusted + - Disgusting + - Disillusioned + - Distinct + - Disturbed + - Draconian + - Dramatic + - Dreary + - Dysfunctional + - Eager + - Elderly + - Electric + - Elite + - Enchanted + - Enchanting + - Energetic + - Enormous + - Entertaining + - Enthusiastic + - Envious + - Erratic + - Ethereal + - Evasive + - Excellent + - Excited + - Exciting + - Exotic + - Exuberant + - Fabulous + - Faded + - Fair + - Faithful + - 'False' + - Familiar + - Famous + - Fanatical + - Fantastic + - Fascinated + - Fat + - Fearful + - Fearless + - Feeble + - Festive + - Fierce + - Filthy + - Fine + - Finicky + - First + - Fixed + - Flashy + - Flawless + - Flimsy + - Flippant + - Flowery + - Fluffy + - Fluttering + - Foamy + - Foolish + - Forgetful + - Fortunate + - Frail + - Fragile + - Frantic + - Free + - Freezing + - Fresh + - Friendly + - Frightening + - Fumbling + - Funny + - Furry + - Furtive + - Fuzzy + - Giant + - Gifted + - Gigantic + - Glistening + - Glorious + - Godly + - Good + - Goofy + - Gorgeous + - Graceful + - Grandiose + - Grateful + - Greasy + - Great + - Greedy + - Grieving + - Groovy + - Grotesque + - Grubby + - Gruesome + - Grumpy + - Guarded + - Guiltless + - Gullible + - Gutsy + - Guttural + - Hallowed + - Hanging + - Hapless + - Happy + - Harmonious + - Hateful + - Healthy + - Heartbreaking + - Heavenly + - Hellish + - Helpful + - Helpless + - Hesitant + - Hideous + - Hilarious + - Hollow + - Homeless + - Honorable + - Horrible + - Hospitable + - Huge + - Hulking + - Humorous + - Hungry + - Hurt + - Hushed + - Hypnotic + - Hysterical + - Icky + - Icy + - Ignorant + - Ill + - Illegal + - Illustrious + - Imaginary + - Immense + - Imminent + - Impartial + - Imperfect + - Impolite + - Important + - Incandescent + - Incompetent + - Industrious + - Incredible + - Inexpensive + - Infamous + - Innocent + - Inquisitive + - Insidious + - Instinctive + - Intelligent + - Interesting + - Invincible + - Irate + - Itchy + - Jaded + - Jagged + - Jealous + - Jolly + - Joyous + - Jumpy + - Juvenile + - Keen + - Kind + - Kindhearted + - Knowing + - Knowledgeable + - Known + - Labored + - Lame + - Large + - Last + - Late + - Laughable + - Lazy + - Lean + - Lethal + - Light + - Little + - Living + - Lonely + - Loud + - Lovely + - Lucky + - Magenta + - Magical + - Majestic + - Malicious + - Marked + - Massive + - Marvelous + - Mean + - Medical + - Melted + - Messy + - Mighty + - Military + - Mindless + - Minor + - Misty + - Mixed + - Modern + - Motionless + - Mysterious + - Naive + - Narrow + - Natural + - Neat + - Necessary + - Needless + - Needy + - Nervous + - New + - Nice + - Normal + - Nostalgic + - Numberless + - Obsolete + - Obtainable + - Oceanic + - Old-fashioned + - Omniscient + - Optimal + - Ordinary + - Organic + - Outstanding + - Oval + - Overrated + - Painful + - Parallel + - Pathetic + - Peaceful + - Penitent + - Perfect + - Periodic + - Petite + - Physical + - Pink + - Plastic + - Pleasant + - Pointless + - Polite + - Poor + - Precious + - Premium + - Present + - Pretty + - Private + - Productive + - Protective + - Public + - Puzzling + - Questionable + - Quick + - Quickest + - Rare + - Ready + - Real + - Rebel + - Regular + - Remarkable + - Responsible + - Romantic + - Round + - Royal + - Sad + - Safe + - Salty + - Satisfying + - Scared + - Scary + - Scientific + - Scrawny + - Screeching + - Second + - Second-hand + - Secret + - Selfish + - Sequacious + - Serious + - Shallow + - Sharp + - Shiny + - Shocking + - Short + - Shy + - Sick + - Silent + - Silky + - Silly + - Simple + - Skinny + - Slim + - Slimy + - Slippery + - Small + - Smart + - Smiling + - Smooth + - Sneaky + - Soft + - Solid + - Special + - Spectacular + - Spicy + - Spiky + - Splendid + - Spooky + - Spotless + - Square + - Staking + - Standing + - Steady + - Sticky + - Strange + - Striped + - Strong + - Successful + - Super + - Supreme + - Sweet + - Talented + - Tall + - Tasty + - Temporary + - Tense + - Terrible + - Terrific + - Tested + - Thankful + - Thick + - Thin + - Thirsty + - Thoughtful + - Tiny + - Tired + - Tricky + - Troubled + - 'True' + - Ugly + - Ultra + - Unadvised + - Unarmed + - Uncovered + - Unhealthy + - Unique + - Unknown + - Unnatural + - Unused + - Unusual + - Used + - Useful + - Useless + - Valuable + - Violent + - Waiting + - Wandering + - Warm + - Weak + - Wealthy + - Whole + - Wise + - Wonderful + - Wooden + - Worried + - Worthless + - Wrong + - Menacing + - Trusting + - Unassuming + - Threatening + verbs: + - Slashing + - Cutting + - Stabbing + - Scratching + - Killing + - Slaying + - Butchering + - Destroying + - Tickling + - Hugging + - Murdering + - Slapping + - Hissing + - Traveling + - Teleporting + - Blinking + - Destroying + - Wrecking + - Flashing + - Materializing + - Spawning + - Questioning + - Inquiring + - Pleading + - Demanding + - Interrogating + - Querying + - Assaulting + - Striking + - Ambushing + - Assailing + - Rushing + - Storming + - Bombarding + - Barraging + - Smiting + - Charging + - Clobbering + - Battling + - Battering + - Hammering + - Beating + - Combating + - Overwhelming + - Raiding + - Tackling + - Shooting + - Venturing + - Cracking + - Rupturing + - Smashing + - Shattering + - Fracturing + - Splintering + - Pulverizing + - Tearing + - Rending + - Snapping + - Bursting + - Exploding + - Damaging + - Fragmenting + - Splitting + - Fortifying + - Nudging + - Tapping + - Jostling + - Thumping + - Butting + - Clattering + - Striking + - Whacking + - Slamming + - Summoning + - Screaming + - Bellowing + - Roaring + - Shifting + - Transforming + - Modifying + - Twisting + - Mutating + - Distorting + - Blurring + - Adjusting + - Warping + - Altering + - Adapting + - Evolving + - Varying + - Hunting + - Trailing + - Following + - Stalking + - Shadowing + - Hounding + - Casing + - Mounting + - Ascending + - Rising + - Heaving + - Springing + - Cresting + - Gathering + - Corralling + - Hoarding + - Reaping + - Harvesting + - Saving + - Sheltering + - Cloaking + - Shrouding + - Enclosing + - Concealing + - Hiding + - Disguising + - Masking + - Burying + - Smothering + - Clouding + - Shielding + - Shading + - Sealing + - Enveloping + - Veiling + - Obscuring + - Traversing + - Fording + - Gliding + - Howling + - Whimpering + - Screaming + - Shrieking + - Squealing + - Roaring + - Wailing + - Bawling + - Screeching + - Cleaving + - Chopping + - Chipping + - Severing + - Slicing + - Snipping + - Splitting + - Axing + - Slashing + - Rending + - Tearing + - Thinning + - Cropping + - Carving + - Dissecting + - Hacking + - Perfuração + - Sawing + - Shaving + - Shearing + - Mining + - Delving + - Excavating + - Burrowing + - Perfuração + - Hollowing + - Gouging + - Tunneling + - Invading + - Boarding + - Wandering + - Infiltrating + - Intruding + - Evading + - Fleeing + - Running + - Dodging + - Crashing + - Battling + - Tussling + - Wrestling + - Scuffling + - Dueling + - Brawling + - Jousting + - Sparring + - Clashing + - Warring + - Grappling + - Scrapping + - Attacking + - Feuding + - Skirmishing + - Discovering + - Detecting + - Catching + - Solving + - Revealing + - Unearthing + - Leaping + - Bouncing + - Springing + - Vaulting + - Hopping + - Surging + - Punting + - Booting + - Dropkicking + - Sensing + - Perceiving + - Detecting + - Fading + - Bleeding + - Shrinking + - Enfraquecimento + - Abating + - Diminishing + - Forging + - Releasing + - Gathering + - Collecting + - Culling + - Crushing + - Propelling + - Jogging + - Sprinting + - Questing + - Scouting + - Exploring + - Digging + - Trembling + - Rattling + - Parting + - Hacking + - Rupturing + - Carving + - Dividing + - Halving + - Breaking + - Sundering + - Separating + - Rending + - Ripping + - Grazing + - Imprisoning + - Snaring + - Cornering + - Entangling + - Pinning + - Catching + - Restraining + - Binding + - Hooking + - Snagging + - Snatching + - Caging + - Capturing + - Haunting + - Creeping + - Sneaking + - Spying + - Avenging + - Storming + verb-ers (noun): + - World Breaker + - World Shatterer + - Avenger + - Ashbringer + - Windseeker + - Defiler + - Thunderfury + - Slicer + - Slasher + - Cutter + - Stabber + - Scratcher + - Killer + - Slayer + - Destroyer + - Hugger + - Murderer + - Slapper + - Traveller + - Teleporter + - Blinker + - Wrecker + - Materializer + - Spawner + - Demander + - Assaulter + - Striker + - Ambusher + - Rusher + - Stormer + - Bombarder + - Barrager + - Smiter + - Charger + - Battler + - Hammerer + - Beater + - Combater + - Overwhelmer + - Raider + - Tackler + - Shooter + - Venturer + - Cracker + - Smasher + - Shatterer + - Fracturer + - Splinterer + - Pulverizer + - Tearer + - Renderer + - Snapper + - Burster + - Exploder + - Damager + - Fragmenter + - Splitter + - Fortifier + - Nudger + - Tapper + - Thumper + - Butter + - Clatterer + - Striker + - Whacker + - Slammer + - Summoner + - Screamer + - Shifter + - Transformer + - Modifyer + - Twister + - Blurrer + - Warper + - Alterer + - Adapter + - Evolver + - HunterEnchantment + - Trailer + - Follower + - Stalker + - Shadower + - Hounder + - Caser + - Mounter + - Ascender + - Riser + - Springer + - Hoarder + - Reaper + - Harvester + - Saver + - Shelterer + - Cloaker + - Shrouder + - Encloser + - Hider + - Masker + - Buryer + - Clouder + - Shader + - Sealer + - Enveloper + - Veiler + - Traverser + - Forder + - Glider + - Howler + - Whimperer + - Screamer + - Squealer + - Bawler + - Screecher + - Chopper + - Chipper + - Snipper + - Splitter + - Axer + - Slasher + - Renderer + - Tearer + - Thinner + - Cropper + - Carver + - Hacker + - Piercer + - Sawer + - Shaver + - Shearer + - Miner + - Excavater + - Burrower + - Driller + - Tunneler + - Invader + - Boarder + - Wanderer + - Intruder + - Evader + - Runner + - Dodger + - Crasher + - Battler + - Wrestler + - Scuffler + - Dueler + - Brawler + - Clasher + - Grappler + - Scrapper + - Attacker + - Feuder + - Catcher + - Solver + - Revealer + - Leaper + - Bouncer + - Vaulter + - Hopper + - Surger + - Punter + - Dropkicker + - Perceiver + - Fader + - Bleeder + - Weakener + - Forger + - Releaser + - Gatherer + - Crusher + - Propeller + - Jogger + - Sprinter + - Scouter + - Explorer + - Digger + - Trembler + - Parter + - Hacker + - Carver + - Divider + - Halver + - Breaker + - Renderer + - Ripper + - Grazer + - Imprisoner + - Cornerer + - Pinner + - Catcher + - Restrainer + - Binder + - Snagger + - Snatcher + - Cager + - Capturer + - Haunter + - Creeper + - Sneaker + - Binder + - Jailer + - Seducer + - Dancer + - Blasphemer + - Eater + - Snorer + - Thruster + - Slapper +absorption: + name: Absorção +blindness: + name: Cegueira +conduit_power: + name: Força do Conduíte +confusion: + name: Náusea +damage_resistance: + name: Resistência +dolphins_grace: + name: Graça do Golfinho +fast_digging: + name: Pressa +fire_resistance: + name: Resistência ao Fogo +glowing: + name: Brilhante +harm: + name: Dano Instantâneo +heal: + name: Vida instantânea +health_boost: + name: Impulso na Vida +hunger: + name: Fome +increase_damage: + name: Força +invisibility: + name: Invisibilidade +jump: + name: Super Pulo +levitation: + name: Levitação +luck: + name: Sorte +night_vision: + name: Visão Noturna +poison: + name: Veneno +regeneration: + name: Regeneração +saturation: + name: Saturação +slow: + name: Lentidão +slow_digging: + name: Fadiga de minerador +slow_falling: + name: Queda Lenta +speed: + name: Velocidade +unluck: + name: Má Sorte +water_breathing: + name: Respiração Aquática +weakness: + name: Fraqueza +wither: + name: Wither +translation: + Economy pay message v2: '&2Você pagou &2$amount_sent $currency_name &2a $receiver&2, que recebeu $amount_received depois dos impostos!' + Economy currency left message: Agora você tem &2$amount_left $currency_name + Economy money from payment message: Você recebeu &2$amount_received $currency_name &fde $sender + Economy payment insuficient currency: '&cVocê não tem $currency_name suficiente para fazer isso!' + Wallet command message: Você tem &2$balance $currency_name + Tax confirmation message: '&cEnviar um pagamento custará $percentage% em impostos. &aUse &9$command &apara continuar!' + shopBatchSellItem: '&aVocê vendeu seus itens &apor $currency_amount $currency_name!' + Shop buy message: '&aVocê comprou $item_name &apor $item_value $currency_name!' + Shop current balance message: '&aVocê tem $currency_amount $currency_name.' + Shop insufficient funds message: '&cVocê não tem $currency_name suficiente!' + Shop item cost message: '$currency_name custa &c$item_value.' + Shop sell message: '&aVocê vendeu $item_name &apor $currency_amount $currency_name!' + Shop sale player items warning: '&cVocê não pode vender itens que não estão com alma vinculada a você! Isso inclui itens de outros níveis de prestígio!' + Shop sale instructions: '&cVocê só pode vender itens do EliteMobs aqui! (Armadura / armas dropadas de elites que mostram um valor em sua lore)' + Teleport time left: '&7[EM] Teleportando em &a$time &7segundos...' + Teleport cancelled: '&7[EM] &cTeleporte interrompido!' + noPendingCommands: '&cVocê não tem nenhum comando pendente!' + trackMessage: Rastrear o $name + chestLowRankMessage: '&7[EM] &c Seu rank de guilda necessita ser ao menos $rank &cpara poder abrir este baú!' + chestCooldownMessage: '&7[EM] &cVocê já abriu esse baú recentemente! Aguarde $time!' + insufficientCurrencyForWormholeMessage: '&8[EliteMobs] &cSaldo insuficiente! Você precisa de $amount para abrir este com.magmaguy.elitemobs.wormhole!' + dismissEMMessage: '&8[EliteMobs] &fMenu do &2/elitemobs não está funcionando para você? Tente &2/elitemobs alt &fpara ver uma versão alternativa do menu! &cNão quer ver essa mensagem novamente? &4/em dismiss' + switchEMStyleMessage: '&8[EliteMobs] O estilo do &fmenu &2/elitemobs foi atlerado! Verifique!' +EconomySettings: + currencyName: Elite Coins + chatCurrencyShowerMessage: '&7[EM] Você pegou &a$amount $currency_name!' + actionbarCurrencyShowerMessage: '&7[EM] Você pegou &a$amount $currency_name!' + adventurersGuildNotificationMessages: '&7[EM] Sobrando dinheiro ? Tente &a/em !' +arrow_damage: + name: Poder +arrow_fire: + name: Chama +arrow_infinite: + name: Infinidade +arrow_knockback: + name: Impacto +binding_curse: + name: Maldição da Ligação +channeling: + name: Canalização +critical_strikes: + name: Ataques Críticos + criticalHitPopup: '&5Acerto Crítico!' +damage_all: + name: Afiação +damage_arthropods: + name: Ruína dos artrópodes +damage_undead: + name: Julgamento +depth_strider: + name: Passos profundos +dig_speed: + name: Eficiência +drilling: + name: Perfuração +durability: + name: Durabilidade +earthquake: + name: Terremoto + earthquakeActivationMessage: '&8[EliteMobs] &aTerramoto disparado! &c2 min de cooldown!' + earthquakeAvailableMessage: '&8[EliteMobs] Cooldown do &2Earthquake terminou!' +fire_aspect: + name: Aspecto flamejante +flamethrower: + name: Lança-Chamas +frost_walker: + name: Passos Gelados +grappling_hook: + name: Gancho +hunter: + name: Caçador +ice_breaker: + name: Quebra Gelo +impaling: + name: Empalar +knockback: + name: Repulsão +lightning: + name: Relâmpago +loot_bonus_blocks: + name: Fortuna +loot_bonus_mobs: + name: Pilhagem +loud_strikes: + name: Golpes Altos +loyalty: + name: Lealdade +lure: + name: Isca +mending: + name: Remendo +meteor_shower: + name: Chuva de Meteoros +multishot: + name: Tiro Múltiplo +oxygen: + name: Respiração +piercing: + name: Perfuração +plasma_boots: + name: Botas de Plasma +protection_environmental: + name: Proteção +protection_explosions: + name: Proteção contra explosões +protection_fall: + name: Peso Pena +protection_fire: + name: Proteção contra Fogo +protection_projectile: + name: Proteção contra projetéis +quick_charge: + name: Carga Rápida +riptide: + name: Correnteza +silk_touch: + name: Toque suave +soulbind: + name: Vinculado + loreStrings: '&7Vinculado a &f$player' + hologramString: '$player&f''s' +summon_merchant: + name: Invocar o Mercador + message: Jeeves! +summon_wolf: + name: Invocar Lobo +sweeping_edge: + name: Alcance +thorns: + name: Espinhos +unbind: + name: Desvincular +vanishing_curse: + name: Maldição do desaparecimento +water_worker: + name: Afinidade Aquática +AntiExploit: + AntiExploit message: '&c[EM AntiExploit] &7Elite próxima não ira dropar itens especiais.' +CombatTag: + Combat tag message: '&c[EliteMobs] Tag de combate ativada!' +AdventurersGuild: + adventurersGuildMenuName: '&6&lAdventurer''s Hub' + Prestige 0 rank 0: '&8Commoner - desabilita elites!' + Prestige 0 rank 0 short placeholder: '&6&l✧&e0' + Prestige 0 rank 1: '&fNovato' + Prestige 0 rank 1 short placeholder: '&6&l✧&eⅠ' + Prestige 0 rank 2: '&fNovato' + Prestige 0 rank 2 short placeholder: '&6&l✧&eⅠⅠ' + Prestige 0 rank 3: '&fAprendiz' + Prestige 0 rank 3 short placeholder: '&6&l✧&eⅠⅠⅠ' + Prestige 0 rank 4: '&2Aventureiro' + Prestige 0 rank 4 short placeholder: '&6&l✧&eⅠⅤ' + Prestige 0 rank 5: '&2Artifice' + Prestige 0 rank 5 short placeholder: '&6&l✧&eⅤ' + Prestige 0 rank 6: '&2Adepto' + Prestige 0 rank 6 short placeholder: '&6&l✧&eⅤⅠ' + Prestige 0 rank 7: '&1Veterano' + Prestige 0 rank 7 short placeholder: '&6&l✧&eⅤⅠⅠ' + Prestige 0 rank 8: '&1Elite' + Prestige 0 rank 8 short placeholder: '&6&l✧&eⅤⅠⅠⅠ' + Prestige 0 rank 9: '&lMestre' + Prestige 0 rank 9 short placeholder: '&6&l✧&eⅠⅩ' + Prestige 0 rank 10: '&5Herói' + Prestige 0 rank 10 short placeholder: '&6&l✧&eⅩ' + Prestige 1 rank 0: '&ePrestígio 1 &8Plebeu' + Prestige 1 rank 0 short placeholder: '&e⚜Ⅰ&6&l✧&e0' + Prestige 1 rank 1: '&ePrestígio 1 &fNoob' + Prestige 1 rank 1 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠ' + Prestige 1 rank 2: '&ePrestígio 1 &fPrincipiante' + Prestige 1 rank 2 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅠ' + Prestige 1 rank 3: '&ePrestígio 1 &fAprendiz' + Prestige 1 rank 3 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅠⅠ' + Prestige 1 rank 4: '&ePrestígio 1 &2Aventureiro' + Prestige 1 rank 4 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅤ' + Prestige 1 rank 5: '&ePrestígio 1 &2Artifice' + Prestige 1 rank 5 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤ' + Prestige 1 rank 6: '&ePrestígio 1 &2Adepto' + Prestige 1 rank 6 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠ' + Prestige 1 rank 7: '&ePrestígio 1 &1Veterano' + Prestige 1 rank 7 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠⅠ' + Prestige 1 rank 8: '&ePrestígio 1 &1Elite' + Prestige 1 rank 8 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠⅠⅠ' + Prestige 1 rank 9: '&ePrestígio 1 &5Mestre' + Prestige 1 rank 9 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅩ' + Prestige 1 rank 10 short placeholder: '&e⚜Ⅰ&6&l✧&eⅩ' + Prestige 1 rank 10: '&ePrestígio 1 &5Herói' + Prestige 1 rank 11: '&ePrestígio 1 &5Lenda' + Prestige 1 rank 11 short placeholder: '&e⚜Ⅰ&6&l✧&eⅩⅠ' + Prestige 2 rank 0: '&2Prestígio 2 &8Plebeu' + Prestige 2 rank 0 short placeholder: '&2⚜ⅠⅠ&6&l✧&e0' + Prestige 2 rank 1: '&2Prestígio 2 &fNovato' + Prestige 2 rank 1 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠ' + Prestige 2 rank 2: '&2Prestígio 2 &fPrincipiante' + Prestige 2 rank 2 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅠ' + Prestige 2 rank 3: '&2Prestígio 2 &fAprendiz' + Prestige 2 rank 3 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 2 rank 4: '&2Prestígio 2 &2Aventureiro' + Prestige 2 rank 4 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅤ' + Prestige 2 rank 5: '&2Prestígio 2 &2Artifice' + Prestige 2 rank 5 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤ' + Prestige 2 rank 6: '&2Prestígio 2 &2Adepto' + Prestige 2 rank 6 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠ' + Prestige 2 rank 7: '&2Prestígio 2 &1Veterano' + Prestige 2 rank 7 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 2 rank 8: '&2Prestígio 2 &1Elite' + Prestige 2 rank 8 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 2 rank 9: '&2Prestígio 2 &5Mestre' + Prestige 2 rank 9 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅩ' + Prestige 2 rank 10 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩ' + Prestige 2 rank 10: '&2Prestígio 2 &5Herói' + Prestige 2 rank 11: '&2Prestígio 2 &5Lenda' + Prestige 2 rank 11 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩⅠ' + Prestige 2 rank 12: '&2Prestígio 2 &5Mito' + Prestige 2 rank 12 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 3 rank 0: '&aPrestígio 3 &8Plebeu' + Prestige 3 rank 0 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&e0' + Prestige 3 rank 1: '&aPrestígio 3 &fNovato' + Prestige 3 rank 1 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠ' + Prestige 3 rank 2: '&aPrestígio 3 &fPrincipiante' + Prestige 3 rank 2 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠ' + Prestige 3 rank 3: '&aPrestígio 3 &fAprendiz' + Prestige 3 rank 3 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 3 rank 4: '&aPrestígio 3 &2Aventureiro' + Prestige 3 rank 4 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅤ' + Prestige 3 rank 5: '&aPrestígio 3 &2Artifice' + Prestige 3 rank 5 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤ' + Prestige 3 rank 6: '&aPrestígio 3 &2Adepto' + Prestige 3 rank 6 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠ' + Prestige 3 rank 7: '&aPrestígio 3 &1Veterano' + Prestige 3 rank 7 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 3 rank 8: '&Prestígio 3 &1Elite' + Prestige 3 rank 8 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 3 rank 9: '&aPrestígio 3 &5Mestre' + Prestige 3 rank 9 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅩ' + Prestige 3 rank 10 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩ' + Prestige 3 rank 10: '&aPrestígio 3 &5Herói' + Prestige 3 rank 11: '&aPrestígio 3 &5Lenda' + Prestige 3 rank 11 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠ' + Prestige 3 rank 12: '&2Prestígio 3 &5Mito' + Prestige 3 rank 12 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 3 rank 13: '&aPrestígio 3 &5Imortal' + Prestige 3 rank 13 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 4 rank 0: '&ePrestígio 4 &8Plebeu' + Prestige 4 rank 0 short placeholder: '&3⚜ⅠⅠ&6&l✧&e0' + Prestige 4 rank 1: '&ePrestígio 4 &fCampones' + Prestige 4 rank 1 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠ' + Prestige 4 rank 2: '&3Prestígio 4 &fPrincipiante' + Prestige 4 rank 2 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅠ' + Prestige 4 rank 3: '&3Prestígio 4 &fAprendiz' + Prestige 4 rank 3 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅠⅠ' + Prestige 4 rank 4: '&3Prestigio 4 &2Aventureiro' + Prestige 4 rank 4 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅤ' + Prestige 4 rank 5: '&3Prestígio 4 &2Artifice' + Prestige 4 rank 5 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤ' + Prestige 4 rank 6: '&3Prestigio 4 &2Adepto' + Prestige 4 rank 6 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠ' + Prestige 4 rank 7: '&ePrestígio 4 &1Veterano' + Prestige 4 rank 7 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠⅠ' + Prestige 4 rank 8: '&ePrestígio 4 &1Elite' + Prestige 4 rank 8 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠⅠⅠ' + Prestige 4 rank 9: '&3Prestígio 4 &5Mestre' + Prestige 4 rank 9 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅩ' + Prestige 4 rank 10 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩ' + Prestige 4 rank 10: '&3Prestigio 4 &5Herói' + Prestige 4 rank 11: '&3Prestigio 4 &5Lenda' + Prestige 4 rank 11 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠ' + Prestige 4 rank 12: '&dPrestígio 4 &5Mito' + Prestige 4 rank 12 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅠ' + Prestige 4 rank 13: '&3Prestígio 4 &5Imortal' + Prestige 4 rank 13 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅠⅠ' + Prestige 4 rank 14: '&dPrestígio 4 &5Escolhido' + Prestige 4 rank 14 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅤ' + Prestige 5 rank 0: '&bPrestígio 5 &8Plebeu' + Prestige 5 rank 0 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 5 rank 1: '&bPrestígio 5 &fNovato' + Prestige 5 rank 1 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠ' + Prestige 5 rank 2: '&bPrestígio 5 &fPrincipiante' + Prestige 5 rank 2 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅠ' + Prestige 5 rank 3: '&bPrestígio 5 &fAprendiz' + Prestige 5 rank 3 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅠⅠ' + Prestige 5 rank 4: '&bPrestígio 5 &2Aventureiro' + Prestige 5 rank 4 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅤ' + Prestige 5 rank 5: '&bPrestígio 5 &2Artifice' + Prestige 5 rank 5 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤ' + Prestige 5 rank 6: '&bPrestígio 5 &2Adepto' + Prestige 5 rank 6 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠ' + Prestige 5 rank 7: '&bPrestígio 5 &1Veterano' + Prestige 5 rank 7 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠⅠ' + Prestige 5 rank 8: '&bPrestígio 5 &1Elite' + Prestige 5 rank 8 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠⅠⅠ' + Prestige 5 rank 9: '&bPrestígio 5 &5Mestre' + Prestige 5 rank 9 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅩ' + Prestige 5 rank 10 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩ' + Prestige 5 rank 10: '&bPrestígio 5 &5Herói' + Prestige 5 rank 11: '&bPrestígio 5 &5Lenda' + Prestige 5 rank 11 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠ' + Prestige 5 rank 12: '&bPrestígio 5 &5Mito' + Prestige 5 rank 12 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅠ' + Prestige 5 rank 13: '&bPrestígio 5 &5Imortal' + Prestige 5 rank 13 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅠⅠ' + Prestige 5 rank 14: '&bPrestígio 5 &5Escolhido' + Prestige 5 rank 14 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅤ' + Prestige 5 rank 15: '&bPrestígio 5 &5Ascendente' + Prestige 5 rank 15 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅤ' + Prestige 6 rank 0: '&4Prestígio 6 &8Plebeu' + Prestige 6 rank 0 short placeholder: '&4⚜ⅤⅠ&6&l✧&e0' + Prestige 6 rank 1: '&4Prestígio 6 &fNovato' + Prestige 6 rank 1 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠ' + Prestige 6 rank 2: '&4Prestígio 6 &fPrincipiante' + Prestige 6 rank 2 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅠ' + Prestige 6 rank 3: '&4Prestígio 6 &fAprendiz' + Prestige 6 rank 3 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅠⅠ' + Prestige 6 rank 4: '&4Prestígio 6 &2Aventureiro' + Prestige 6 rank 4 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅤ' + Prestige 6 rank 5: '&4Prestígio 6 &2Artifice' + Prestige 6 rank 5 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤ' + Prestige 6 rank 6: '&4Prestígio 6 &2Adepto' + Prestige 6 rank 6 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠ' + Prestige 6 rank 7: '&4Prestígio 6 &1Veterano' + Prestige 6 rank 7 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠⅠ' + Prestige 6 rank 8: '&4Prestígio 6 &1Elite' + Prestige 6 rank 8 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 6 rank 9: '&4Prestígio 6 &5Mestre' + Prestige 6 rank 9 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅩ' + Prestige 6 rank 10 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩ' + Prestige 6 rank 10: '&4Prestígio 6 &5Herói' + Prestige 6 rank 11: '&4Prestígio 6 &5Lenda' + Prestige 6 rank 11 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠ' + Prestige 6 rank 12: '&4Prestígio 6 &5Mito' + Prestige 6 rank 12 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠ' + Prestige 6 rank 13: '&4Prestígio 6 &5Imortal' + Prestige 6 rank 13 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 6 rank 14: '&4Prestígio 6 &5Escolhido' + Prestige 6 rank 14 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅤ' + Prestige 6 rank 15: '&4Prestígio 6 &5Ascendente' + Prestige 6 rank 15 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤ' + Prestige 6 rank 16: '&4Prestigio 6 &5Titã' + Prestige 6 rank 16 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤⅠ' + Prestige 7 rank 0: '&cPrestígio 7 &8Plebeu' + Prestige 7 rank 0 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&e0' + Prestige 7 rank 1: '&cPrestígio 7 &fNoob' + Prestige 7 rank 1 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠ' + Prestige 7 rank 2: '&cPrestígio 7 &fPrincipiante' + Prestige 7 rank 2 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅠ' + Prestige 7 rank 3: '&cPrestígio 7 &fAprendiz' + Prestige 7 rank 3 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 7 rank 4: '&cPrestígio 7 &2Aventureiro' + Prestige 7 rank 4 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅤ' + Prestige 7 rank 5: '&cPrestígio 7 &2Artifice' + Prestige 7 rank 5 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤ' + Prestige 7 rank 6: '&cPrestígio 7 &2Adepto' + Prestige 7 rank 6 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠ' + Prestige 7 rank 7: '&cPrestígio 7 &1Veterano' + Prestige 7 rank 7 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 7 rank 8: '&cPrestígio 7 &1Elite' + Prestige 7 rank 8 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 7 rank 9: '&cPrestígio 7 &5Mestre' + Prestige 7 rank 9 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅩ' + Prestige 7 rank 10 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩ' + Prestige 7 rank 10: '&cPrestígio 7 &5Herói' + Prestige 7 rank 11: '&cPrestígio 7 &5Lenda' + Prestige 7 rank 11 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠ' + Prestige 7 rank 12: '&cPrestígio 7 &5Mito' + Prestige 7 rank 12 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 7 rank 13: '&cPrestígio 7 &5Imortal' + Prestige 7 rank 13 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 7 rank 14: '&cPrestígio 7 &5Escolhido' + Prestige 7 rank 14 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅤ' + Prestige 7 rank 15: '&cPrestígio 7 &5Ascendente' + Prestige 7 rank 15 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤ' + Prestige 7 rank 16: '&cPrestigio 7 &5Titã' + Prestige 7 rank 16 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤⅠ' + Prestige 7 rank 17: '&cPrestígio 7 &5Semideus' + Prestige 7 rank 17 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤⅠⅠ' + Prestige 8 rank 0: '&9Prestígio 8 &8Plebeu' + Prestige 8 rank 0 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&e0' + Prestige 8 rank 1: '&9Prestígio 8 &fNovato' + Prestige 8 rank 1 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠ' + Prestige 8 rank 2: '&9Prestígio 8 &fPrincipiante' + Prestige 8 rank 2 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅠ' + Prestige 8 rank 3: '&9Prestígio 8 &fAprendiz' + Prestige 8 rank 3 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 8 rank 4: '&9Prestígio 8 &2Aventureiro' + Prestige 8 rank 4 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅤ' + Prestige 8 rank 5: '&9Prestígio 8 &2Artifice' + Prestige 8 rank 5 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤ' + Prestige 8 rank 6: '&9Prestige 8 &2Adept' + Prestige 8 rank 6 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠ' + Prestige 8 rank 7: '&9Prestígio 8 &1Veterano' + Prestige 8 rank 7 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 8 rank 8: '&9Prestígio 8 &1Elite' + Prestige 8 rank 8 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 8 rank 9: '&9Prestígio 8 &5Mestre' + Prestige 8 rank 9 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅩ' + Prestige 8 rank 10 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩ' + Prestige 8 rank 10: '&9Prestígio 8 &5Herói' + Prestige 8 rank 11: '&9Prestígio 8 &5Lenda' + Prestige 8 rank 11 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠ' + Prestige 8 rank 12: '&9Prestígio 8 &5Mito' + Prestige 8 rank 12 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 8 rank 13: '&9Prestígio 8 &5Imortal' + Prestige 8 rank 13 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 8 rank 14: '&9Prestígio 8 &5Escolhido' + Prestige 8 rank 14 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅤ' + Prestige 8 rank 15: '&9Prestígio 8 &5Ascendente' + Prestige 8 rank 15 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤ' + Prestige 8 rank 16: '&9Prestigio 8 &5Titã' + Prestige 8 rank 16 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠ' + Prestige 8 rank 17: '&9Prestígio 8 &5Semideus' + Prestige 8 rank 17 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠⅠ' + Prestige 8 rank 18: '&9Prestígio 8 &5Divindade' + Prestige 8 rank 18 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 9 rank 0: '&dPrestígio 9 &8Plebeu' + Prestige 9 rank 0 short placeholder: '&d⚜ⅠⅩ&6&l✧&e0' + Prestige 9 rank 1: '&dPrestígio 9 &fNovato' + Prestige 9 rank 1 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠ' + Prestige 9 rank 2: '&dPrestígio 9 &fPrincipiante' + Prestige 9 rank 2 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅠ' + Prestige 9 rank 3: '&dPrestígio 9 &fAprendiz' + Prestige 9 rank 3 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅠⅠ' + Prestige 9 rank 4: '&dPrestígio 9 &2Aventureiro' + Prestige 9 rank 4 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅤ' + Prestige 9 rank 5: '&dPrestígio 9 &2Artifice' + Prestige 9 rank 5 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤ' + Prestige 9 rank 6: '&dPrestígio 9 &2Adepto' + Prestige 9 rank 6 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠ' + Prestige 9 rank 7: '&dPrestígio 9 &1Veterano' + Prestige 9 rank 7 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠⅠ' + Prestige 9 rank 8: '&dPrestígio 9 &1Elite' + Prestige 9 rank 8 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠⅠⅠ' + Prestige 9 rank 9: '&dPrestígio 9 &5Mestre' + Prestige 9 rank 9 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅩ' + Prestige 9 rank 10 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩ' + Prestige 9 rank 10: '&dPrestígio 9 &5Herói' + Prestige 9 rank 11: '&dPrestígio 9 &5Lenda' + Prestige 9 rank 11 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠ' + Prestige 9 rank 12: '&dPrestígio 9 &5Mito' + Prestige 9 rank 12 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅠ' + Prestige 9 rank 13: '&dPrestígio 9 &5Imortal' + Prestige 9 rank 13 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅠⅠ' + Prestige 9 rank 14: '&dPrestígio 9 &5Escolhido' + Prestige 9 rank 14 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅤ' + Prestige 9 rank 15: '&dPrestígio 9 &5Ascendente' + Prestige 9 rank 15 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤ' + Prestige 9 rank 16: '&dPrestigio 9 &5Titã' + Prestige 9 rank 16 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠ' + Prestige 9 rank 17: '&dPrestígio 9 &5Semideus' + Prestige 9 rank 17 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠⅠ' + Prestige 9 rank 18: '&dPrestígio 9 &5Divindade' + Prestige 9 rank 18 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 9 rank 19: '&dPrestígio 9 &5Caçador de Deuses' + Prestige 9 rank 19 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅩ' + Prestige 10 rank 0: '&5Prestígio 10 &8Plebeu' + Prestige 10 rank 0 short placeholder: '&5⚜Ⅹ&6&l✧&e0' + Prestige 10 rank 1: '&5Prestígio 10 &fNovato' + Prestige 10 rank 1 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠ' + Prestige 10 rank 2: '&5Prestígio 10 &fPrincipiante' + Prestige 10 rank 2 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠ' + Prestige 10 rank 3: '&5Prestígio 10 &fAprendiz' + Prestige 10 rank 3 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠⅠ' + Prestige 10 rank 4: '&5Prestígio 10 &2Aventureiro' + Prestige 10 rank 4 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅤ' + Prestige 10 rank 5: '&5Prestígio 10 &2Artifice' + Prestige 10 rank 5 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤ' + Prestige 10 rank 6: '&5Prestígio 10 &2Adepto' + Prestige 10 rank 6 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠ' + Prestige 10 rank 7: '&5Prestígio 10 &1Veterano' + Prestige 10 rank 7 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠ' + Prestige 10 rank 8: '&5Prestígio 10 &1Elite' + Prestige 10 rank 8 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠⅠ' + Prestige 10 rank 9: '&5Prestígio 10 &5Mestre' + Prestige 10 rank 9 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅩ' + Prestige 10 rank 10 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩ' + Prestige 10 rank 10: '&5Prestígio 10 &5Herói' + Prestige 10 rank 11: '&5Prestígio 10 &5Lenda' + Prestige 10 rank 11 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠ' + Prestige 10 rank 12: '&5Prestígio 10 &5Mito' + Prestige 10 rank 12 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅠ' + Prestige 10 rank 13: '&5Prestígio 10 &5Imortal' + Prestige 10 rank 13 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅠⅠ' + Prestige 10 rank 14: '&5Prestígio 10 &5Escolhido' + Prestige 10 rank 14 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅤ' + Prestige 10 rank 15: '&5Prestígio 10 &5Ascendente' + Prestige 10 rank 15 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤ' + Prestige 10 rank 16: '&5Prestigio 10 &5Titã' + Prestige 10 rank 16 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠ' + Prestige 10 rank 17: '&5Prestígio 10 &5Semideus' + Prestige 10 rank 17 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠⅠ' + Prestige 10 rank 18: '&5Prestígio 10 &5Divindade' + Prestige 10 rank 18 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 10 rank 19: '&5Prestígio 10 &5Caçador de Deuses' + Prestige 10 rank 19 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅩ' + Prestige 10 rank 20: '&5Prestígio 10 &5Matador de Deuses' + Prestige 10 rank 20 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅩ' + lootLimiterMessage: '&7[EM] Você precisa desbloquear o próximo rank da guilda através do /ag para obter itens melhores!' + prestigeUnlockMessageTitle: '$player' + prestigeUnlockMessageSubtitle: '&2desbloqueou $tier&2!' +buy_or_sell_menu: + Shop name: '[EM] Comprar ou vender' +custom_quest_screen: + headerTextLines2: | + &a&l『&c&l$questName&a&l』 + acceptTextLines: '&a&l[Aceitar!]' + acceptHoverLines: "&aClique para \n&aaceitar missão!" + acceptedTextLines: '&2&Aceita! &aComplete com o $npcName &4[Abandon]' + acceptedHoverLines: '&aClique para abandonar a quest!' + trackTextLines: '&2&l[Rastrear]' + trackHoverLines: '&aClique para rastrear a quest!' + untrackTextLines: '&4&l[Desacompanhar]' + untrackHoverLines: '&cClique para parar de rastrear a quest!' + completedTextLines: '&2&l[Completar!]' + completedHoverLines: '&aClique para completar a quest!' + turnedInTextLines: '&8[Concluído!]' + turnedInHoverLines: '&8Já foi completada!' + objectivesLine: '&c&lObjetivos:' + killQuestDefaultSummaryLine: '&c➤Elimine $name:$color$current&0/$color$target' + fetchQuestDefaultSummaryLine: '&c➤Obtenha $name:$color&$current&0/$color$target' + dialogQuestDefaultSummaryLine: '&c➤Vá falar com $name $location' + rewardsLine: '&2&lRecompensas:' + rewardsDefaultSummaryLine: '&2➤$amountx $rewardName &8($chance%)' +custom_shop_menu: + Shop name: '[EM] Loja de Itens Personalizados' + Full inventory message: '[EliteMobs] &4Seu inventário está cheio! Você não pode comprar itens até obter algum espaço livre.' +dynamic_quest_screen: + questName: Derrote $amount $name + headerTextLines2: |- + &c&lPedido de Guild! + &0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ + defaultLoreTextLines: '&8Derrote $amount $name!' + acceptTextLines: '&a&lAceitar!' + acceptHoverLines: "&aClique para \n&aaceitar missão!" + acceptedTextLines: '&2&lAceita! &4[Abandonar]' + acceptedHoverLines: '&aClique para abandonar a quest!' + completedTextLines: '&2&l[Completar!]' + completedHoverLines: '&aClique para completar a quest!' + turnedInTextLines: '&8[Concluído!]' + turnedInHoverLines: '&8Já foi completada!' + objectivesLine: '&c&lObjetivos:' + killQuestDefaultSummaryLine: '&c➤Elimine $name:$color$current&0/$color$target' + rewardsLine: '&2&lRecompensas:' + rewardsDefaultSummaryLine: '&2➤$amountx $rewardName &8($chance%)' +enhancement_menu: + shopName: '[EM] Menu de Encantamentos!' +get_loot_menu: + Menu name: '[EM] Menu do Loot' + tierTranslation: Nível + itemFilterTranslation: Filtrar por itens deste nível. +guild_rank_selector_menu: + questTierSelectorMenuTitle: '[EM] Seleção de Rank da Guilda' + lowTierWarning: '&cElites não podem soltar saques melhores!' + normalTierWarning: '&aElite pode soltar saques melhores!' + notEnoughCurrencyMessages: '&7[EliteMobs] &4Você não tem moedas de Elite suficientes ($neededAmount $currencyName)! Venda alguns saques de mobs de elite em [/em shop]! Você tem $currentAmount $currencyName.' + unlockMessages: "&7[EliteMobs] &aVocê desbloqueou o $rankName &arank por $price\\ $currencyName. \n&6Boa caçada!" + questCompleteBroadcastMessages: '&7[EliteMobs] &a$player &achegou ao rank $rankName &ade guilda!' + failedMessages: '&7[EliteMobs] &cVocê precisa desbloquear outros ranks primeiro!' + spawnRateModifierMessages: 'Modificador de taxa de spawn de &fMob Elite: &c$modifier%' + lootModifierMessages: '&fModificador de saque de Elite Mob: &a$modifier%' + difficultyModifierMessages: '&fModificador de dificuldade de Elite Mob: &a$modifier%' + lootTierMessages: '&2Elites podem soltar até o nível $tier de recompensas!' + currencyBonusMessages: '&a$amountx moedas de drops e quests!' + healthBonusMessages: '&cAdiciona $amount ❤ de vida máxima' + critBonusMessages: '&eAdiciona $amount% de chance de crítico' + dodgeBonusMessages: '&8Adiciona $amount% de chance de esquivar' +player_status_screen: + indexTexts0: '&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + indexTexts1: '&5&l/ag &7- &6EliteMobs Hub' + indexHovers1: |- + CLIQUE PARA USAR + O lugar onde você pode encontrar + NPCs que dão missões, comprar e + vender itens, dar conselhos e muito mais! + indexTexts2: '&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + indexTexts4: '&6&lÍndice' + indexTexts6: '&bp. $statsPage &8- &6Estatísticas' + indexHovers6: Clique para ir! + indexTexts7: '&bp. $gearPage &8- Equipamento' + indexHovers7: Clique para ir! + indexTexts8: '&bp. $teleportsPage &8- &6Teleportes' + indexHovers8: Clique para ir! + indexTexts9: '&bp. $commandsPage &8- &6Comandos' + indexHovers9: Clique para ir! + indexTexts10: '&bp. $questsPage &8- &6Rastreamento de missão' + indexHovers10: Clique para ir! + indexTexts11: '&bp. $bossTrackingPage &8- &6Rastreamento de Chefões' + indexHovers11: Clique para ir! + statsText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + statsText1: '&5&lStatus do player:' + statsText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + statsText4: '&2Dinheiro: &a$money' + statsHover4: |- + Mate Elite Mobs para conseguir moedas, venda drops no /em shop ou complete quests! + statsText6: '&6Tier da guilda: &3$guildtier' + statsHover6: |- + Nivel de Prestigio e Rank de Guilda: + O Rank da Guilda determina quão bom seu saque pode ser, define seu bônus do Nível de Prestígio, entre outras coisas. O nível Prestige desbloqueia recompensas extremamente poderosas, como saúde máxima aumentada, chance de esquivar/crit, recompensas monetárias aumentadas e muito mais! Você pode desbloquear Ranks de Guilda e Níveis de Prestígio em /ag + ⚜ = rank de prestigio, ✧ = rank de guilda! + statsText7: '&4Kills Elite: &c$kills' + statsHover7: Quantidade de mobs mortos. + statsText8: '&4Maior nivel morto: &c$highestkill' + statsHover8: |- + Nível do mais alto Elite Mob morto. + Os níveis de Elite Mob são baseados no nível + do seu equipamento! Níveis mais altos, mais altos + Níveis de Elite Mob! + Nota: apenas mortes sem exploração são contadas! + statsText9: '&4Mortes por Mobs Elite: &c$deaths' + statsHover9: Vezes morto por Elite Mobs. + statsText10: '&5Missões completadas: &d$quests' + statsHover10: |- + Quantidade de missões EliteMobs completadas. + Você pode aceitar quests falando com NPCs! + statsText12: '&bPontuação: &3$score' + statsHover12: |- + Sua pontuação EliteMobs. Ele sobe + quando você mata e elite mob, + e desce quando você morre + a uma elite. Nível superior + elites dão mais pontuação. + gearText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + gearText1: '&7&lArmaduras e Armas:' + gearText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + gearText3: '&8&Níveis de Equipamento:' + gearText4: ' ☠ - $helmettier' + gearHover4: '$helmet' + gearText5: ' ▼ - $chestplatetier' + gearHover5: '$chestplate' + gearText6: ' Π - $leggingstier' + gearHover6: '$leggings' + gearText7: ' ╯╰ - $bootstier' + gearHover7: '$boots' + gearText8: '{⚔ - $mainhandtier} {⛨ - $offhandtier}' + gearHover8: '{$mainhand}{$offhand}' + gearText10: '{dmg : $damage} {armr: $armor}' + gearHover10: '{Base damage dealt to Elite Mobs}{Damage reduction from Elite Mobs}' + gearText11: 'Nível de ameaça: $threat' + gearHover11: | + Isso determina o nível dos Monstros Elite + que aparecem perto de você. Leva armadura, + arma na mão, nível de guilda em consideração. + teleportText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + teleportText1: '&2&lTeleporte' + teleportText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + teleportText3: Gerador + teleportHover3: Teleportar para o spawn! + teleportText4: '&6&lAdventurer''s Hub' + teleportHover4: Teleporta para o Hub da Guilda do Aventureiro! + onTeleportsHover: Clique para se teleportar! + commandsText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + commandsText1: '&3&lComandos:' + commandsText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + commandsText4: '&5/ag' + commandsHover4: |- + CLIQUE PARA USAR + O lugar onde você pode encontrar + NPCs que dão missões, comprar e + vender itens, dar conselhos e muito mais! + commandsText6: '/shareitem' + commandsHover6: |- + CLIQUE PARA USAR + Compartilha o item que você está segurando + no chat! + questTrackerText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + questTrackerText1: '&6&lMissões:' + questTrackerHover1: Fale com NPCs para aceitar quests! + questTrackerText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + onQuestTrackHover: Clique para abandonar! + bossTrackerText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + bossTrackerText1: '&4&l Rastreador de Chefe:' + bossTrackerHover1: Chefões grandes são exibidos aqui! + bossTrackerText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + onBossTrackHover: Clique para rastrear/não rastrear! + teleportChestMenuName: '&2Teleports EliteMobs' + bossTrackerChestMenuName: '&2Rastreamento de Bosses EliteMobs' + indexChestMenuName: '&2Índice EliteMobs' + gearChestMenuName: '&2Tier EliteMobs' + statsChestMenuName: '&2Status EliteMobs' + commandsChestMenuName: '&2Comandos EliteMobs' +procedural_shop_menu: + Shop name: '[EM] Loja de Itens Unicos' + Full inventory message: '&7[EliteMobs] &4Seu inventário está cheio! Você não pode comprar itens até obter algum espaço livre.' +quest_menu: + menuName: '[EM] Seleção de Missões' + cancelQuestMessage1: '&c&l&m&o---------------------------------------------&cVocê só pode ter uma missão de cada vez! Cancelar sua missão atual irá reiniciar o progresso dela!' + cancelQuestMessage2: '&2[Clique aqui para cancelar a missão atual!]' + cancelQuestMessage3: '&7Você pode ver o status da sua missão com o comando &a/em quest status&c&l&m&o---------------------------------------------' + questCancelMessage: '&7[EliteMobs] &cSua missão atual foi cancelada!' + questStartTitle: Você aceitou uma missão! + questStartSubtitle: Derrote $objectiveAmount $objectiveName + questCompleteTitle: Missão concluída! + questCompleteSubtitle: Você derrotou $objectiveAmount $objectiveName + bossBarObjective: Derrote $objectiveAmount $objectiveName + questRewardMessage: '&7[EM] &aMissão concluída! &6Sua recompensa é &2$reward $currencyName' + questCompleteBroadcastMessage: '&7[EM] $player &2completou uma missão $rank&2!' + questStartBroadcastMessage: '&7[EM] $player &2aceitou um $rank &2quest!' + questStatusMessage: '&7[EM] &aVocê matou &a$currentAmount &f/ &c$objectiveAmount &a$objectiveName' +refiner_menu: + shopName: '[EM] Coloque 10 sucatas!' +repair_menu: + shopName: '[EM] Menu de reparo!' +scrapper_menu: + shopName: '[EM] Sucatedor' +sell_menu: + shopName: '[EM] Mercado de vendas' +smelt_menu: + shopName: '[EM] Coloque 25 sucatas!' +unbind_menu: + shopName: '[EM] Menu de desvinculação!' +taunt: + onDamaged: + - Oh! + - Oi! + - Pare com isso! + - Por quê?! + - Você luta como um fazendeiro Gordo! + - Você é uma dor nas costas! + - Em guarda! Touche! + - Isso Foi Hack! + - Minha saúde está bugada, impossível de matar! + - Seus golpes só me fazem ficar mais forte! + - Graveto e pedra... + - 'É apenas uma ferida de carne!' + - Grande Imperador protege! + - Herobrine, me ajude! + - Atrás de você! Um creeper! + - Eu cometi um terrível erro. + - O que não me mata... + - Zumbis fazem cicatrizes + - Vou mostrar-lhe o meu verdadeiro poder! + - Prepare-se para o meu ataque supremo! + - Meus reforços estão chegando! + - Você vai pagar por isso! + - Isso vai deixar um marco! + - Olho por olho! + - O seguro de saúde cobrirá isso + - Eu senti que era um dos meus ossos + - 'Foi só de raspão' + - O que é isso? Uma brisa suave? + - Você nunca vai me derrotar assim + - Patético. + - Fraco. + - Isso nem sequer riscou minha armadura! + - Este vai ser fácil + - Os meus netos vão sentir que + - Você está ao menos tentando? + - Um administrador acabou de me curar completamente + - Haxxor! + - Eu? Fui Danificado? usou Hacks! + - Eu não posso ser derrotado! + - Ainda bem que estou usando hacks! + - Cuidado! Herobrine atrás de você! + - Minha vida para Aiur! + - Sua casa esta sendo destruida! + - Por que nós não podemos ser amigos? + - Valhalla! + - Notch me salve! + - Sem recuos! + - Acerte me com seu melhor tiro! + onDamagedByBow: + - Me enfrente como um homem! + - Medo de chegar perto? + - Eu posso sentir o seu medo daqui! + - Você esqueceu sua espada? + - Covarde! Arco não é justo! + - Arcos? É tão 2011... + - Arcos são para os fracos de mente! + - Arcos são para o fraco do espírito! + - Arcos são para os fracos de coração! + - Pensei que não concordávamos com arcos! + - Arcos? Você vai se arrepender disso + - Oh! + - Oi! + - Pare com isso! + - Por quê?! + - Você luta como um fazendeiro Gordo! + - Você é uma dor nas costas! + - Em guarda! Touche! + - Isso Foi Hack! + - Minha saúde está bugada, impossível de matar! + - Seus golpes só me fazem ficar mais forte! + - Graveto e pedra... + - 'É apenas uma ferida de carne!' + - Grande Imperador protege! + - Herobrine, me ajude! + - Atrás de você! Um creeper! + - Eu cometi um terrível erro. + - O que não me mata... + - Zumbis fazem cicatrizes + - Vou mostrar-lhe o meu verdadeiro poder! + - Prepare-se para o meu ataque supremo! + - Meus reforços estão chegando! + - Você vai pagar por isso! + - Isso vai deixar um marco! + - Olho por olho! + - O seguro de saúde cobrirá isso + - Eu senti que era um dos meus ossos + - 'Foi só de raspão' + - O que é isso? Uma brisa suave? + - Você nunca vai me derrotar assim + - Patético. + - Fraco. + - Isso nem sequer riscou minha armadura! + - Este vai ser fácil + - Os meus netos vão sentir que + - Você está ao menos tentando? + - Um administrador acabou de me curar completamente + - Haxxor! + - Eu? Fui Danificado? usou Hacks! + - Eu não posso ser derrotado! + - Ainda bem que estou usando hacks! + - Cuidado! Herobrine atrás de você! + - Minha vida para Aiur! + - Sua casa esta sendo destruida! + - Por que nós não podemos ser amigos? + - Valhalla! + - Notch me salve! + - Sem recuos! + - Acerte me com seu melhor tiro! + onDamage: + - Um golpe sólido! + - Ele atira, ele marca pontos! + - Você vai sentir isso de manhã! + - A vitória se aproxima! + - A vitória será minha! + - Isso foi apenas metade do meu poder! + - Você veio pra favela errada! + - Cê mexeu com o cara errado! + - Prepare-se para o mob! + - Este foi seu último erro! + - Sinta-se Queimar! + - John Cena + - C-Como você ainda está de pé? + - Desista de uma vez! + - Desista! + - Eu estou com um terreno alto! + - Vou acabar com você! + - Espero que você tenha vindo preparado para a dor! + - O caçador se torna a caça! + - Sangue pelo trono de sangue! + - Crânios para o trono de crânio! + - Um bom Herói é um Herói morto! + - Git gud! + - Louve o Sol! + - O final se aproxima! + - Vocês não estão preparado. + - Zug zug! + - Quase não vale a pena! + - Pensei que este era um desafio? + - 'Dica de profissional: não seja atingido' + - Ima firin mah lazer bwooooooooo + - Pelo Imperador! + - O Herobrine ficará satisfeito! + - Esse é o seu fim! + - Você está ao menos tentando? + - Fracote! + - Patético. + - Talvez isso te acorde. + - Esse é apenas o começo! + - Eu estou apenas começando! + - Isso foi só um aquecimento! + - Você não é páreo para mim! + - RKO fora de lugar! + - Posso fazer isto a noite toda! + - Um belo saco de pancada! + - Eu sou a noite! + - Me pergunto o que vai quebrar primeiro + - Vingança por Steve! Seu monstro! + - Junte-se nós! + - Muito fácil, muito fácil! + - Muito fácil! + - Você não pode me derrotar! + - Pikachuuuuuu + - Avada kedavra! + - Crucio! + - Jierda! + - Um golpe crítico! + - É assim que as habilidades se parecem! + - 9001 de dano! + - Continua em pé? + - Encare sua derrota! + - Um gosto de dor por vir! + - Vou te deixar em perigo! + onDeath: + - Infelizmente, pobre Yorick! + - O resto é silêncio + - Eu voltarei + - Imperdoável + - Eu vivo, eu morro, eu vivo de novo! + - SEGUIR ME + - Cavalgarei até valhalla! + - VALHALLA! + - VALHALA! LIBERTAÇÃO + - Você venceu, desta vez + - Uma praga sobre sua terra! + - Uma varíola sobre ti! + - Você vai se juntar a mim brevemente! + - Isso não acabou + - A morte é apenas um contratempo + - Não gosto disso... + - Eu só queria ir ao espaço + - Poderíamos ter sido amigos + - Seus pecados se arrastam pelas suas costas + - Vejo você num pouco + - Até mais + - Eu estarei esperando por vocês + - Vou me vingar! + - Eu não irei tranquilamente para a noite + - Deveria ter um seguro de vida.. + - Foi o meu último dia no serviço + - Foi meu último dia aqui + - Et tu, Brute? + - RIP + - x.x + - (x.x) + - xox + - Desmaiado + - GG, WP + - GG + - WP + - GG sem RE + - HAX + - Hacker + - Não é justo que eu estava com lag + - Você venceu, desta vez + - Seu Monstro... + - Medíocre... + onTarget: + - Venha aqui! + - O que eu estou vendo? Um covarde? + - Senhor, prepare seus punhos! + - Vamos acabar com isso como homens das cavernas! + - Em guarda! + - Cuidado! Um creeper, atrás de você! + - Você não é uma caneca feia certa! + - Você parece delicioso. + - Prepare-se para a encrenca! + - Deixe o melhor que o melhor spammer de click ganhe! + - SPARTAAAAAA + - Na verdade, sou nível 9001 + - Não é um criatura de elite + - Mob de Elite mal disfarçado + - Ah, uma presa fresca! + - O caçador se torna a caça! + - Me matar trava o servidor + - Na verdade, sou um jogador disfarçado! + - Eu não vou dar nenhuma recompensa! + - Por que nós não podemos ser amigos? + - Sssssss + - Este é o meu último dia no trabalho! + - Pare aí mesmo, seu lixo criminoso! + - Prepare-se para morrer! + - Louve o Sol! + - Git gud + - Alea jacta est! + - Sem comentários! + - Crânios para o trono de crânio! + - Sangue pelo trono de sangue! + - Um sacrifício para Herobrine! + - I shall pierce the heavens! + - Você sabe quem sou eu!? + - Um fracote! Ele é meu. + - Limpe os fracos! + - Venha até mim! + - Um duelo até a morte! + - Eu te desafio para um duelo! + - Pika pika! + - Você me chamou de Infernal? + - Do que você me chamou? + - Sei o que você fez monstro! + - É assim que a sua história termina! + - Prepare-se para a encrenca! + - Eu estive me preparando para isso! + - Eu estou preparado. e Você está? + - AH! Um inimigo digno de me enfrentar! + - Um oponente digno! + - Um novato! É o meu dia de sorte! + - Suas coisas ou sua vida! + - Isto é um assalto! + - É você! Seu monstro! + - Tão faminto, me dê sua carne! + - Aí está ele! + - Deve ter sido minha imaginação + - Olá, eu sou o Sr Meeseeks! + - Eu sou o Sr Meeseeks, olhe para mim! + - Seus diamantes ou sua vida! + - Pelo Meu Rei! + - Acerte me com seu melhor tiro! + - Me enfrente! + - Me enfrente saco de sangue! + - Eu vou brilhar mais que cromo! +zombie_friends: + friend1Name: 'BFF #1' + friend2Name: 'BFF #2' + friendDeathMessage: + - Nãããão! + - Medíocre! + - Zacharias! + - Ele está mais morto do que antes! + - Vingança! + - Retaliaçao! + - Não acredito que você tenha feito isso. + originalEntityDialog: + - Vamos jogar ZombieCraft depois! + - Sinta o poder da amizade! + - El pueblo, unido! + - Eu chamei meus amigos! + - Poder BFF! + - Um por todos! + - Peguem ele! + - Screw you guys, eu vou para casa! + reinforcementDialog: + - Não se intrometa com nossos amigos! + - Nós pegamos o Zach de volta! + - A Backup chegou! + - Um por todos, um por todos! + - Este vai ser fácil! + - Deixe pra la, esta muito alto! + - Você quer brutalidade? + - Rockstaaaar! + - O que você está fazendo com nosso amigo + - Sinta o poder da amizade! + - Poder de amizade a 100%! + - Zombies, em formação! + - Te dou cobertura amigo! + - Juntos somos melhores! + - Quanto mais melhor! + - Consegui com sua família! + - Todos por um! +zombie_necronomicon: + summoningChant: Nem é para se pensar... O homem de chapéu é o mais antigo ou o último dos mestres da Terra, ou que a maior parte da vida e da substância andam sozinhas. Os Antigos eram, os Antigos são e os Velhos devem ser. Não nos espaços que conhecemos, mas entre eles, eles andam sereno e primário, sem dimensionamento e para nós sem serem vistos. Iog-Sothoth conhece o portão. Yog-Sothoth é o portão. Iog-Sothoth é a chave e guardião do portão. Passado, presente, todos são um em Yog-Sothoth. Ele sabe onde os Velhos atravessaram os velhos e onde devem atravessar de novo. Ele sabe onde eles tinham campos da terra de troça e onde ainda os pisam, e por que ninguém pode olhá-los como eles olharem. Pelo cheiro deles podem os homens conhecê-los às vezes perto, mas da semelhança deles não pode o homem saber, economizando apenas nas características daquelas pessoas que se tornaram humanas; e destes são muitos os tipos, diferem em comparação com o verdadeiro eidolão do homem e a sua forma sem visões nem substâncias. Andam invisíveis e falsos em lugares solitários onde as palavras foram faladas, e os Rites se inspiraram em suas temporadas. Os moradores de vento com suas vozes, e a terra murcha com sua consciência. Eles dobram a floresta e esmagam a cidade, mas não podem floresta nem a cidade segurar a mão que se vive. O Kadath no frio resíduo conhecido por Them, e que homem conhece o Kadath? O deserto de gelo do Sul e as ilhas afundadas do Oceano têm pedras onde seu selo está mergulhado, mas quem viu a cidade congelada profunda ou a torre fechada ficaram guarnecidas com algas e celeiros? Grande Cthulhu é a prima deles, mas ele pode espia-los apenas mal. Ia├! Shub-Niggurath! Como uma alma te conhecerá eles. A mão deles está na sua garganta, mas o centeio não vê; e a habitação deles é até mesmo uma com o seu limite de guarda. Iog-Sothoth é a chave do portão, onde as esferas se encontram. As regras do homem agora em que foram decididas uma vez; em breve governarão onde o homem governará agora. Depois do verão for o inverno, depois do verão de inverno. Eles esperam paciente e poderoso, por aqui hão-de reinar de novo. +zombie_parents: + deathMessage: + - Seu Monstro! + - Meu bebê! + - O que você fez!? + - Retaliaçao! + - Nããããooooo! + - Você vai pagar por isso! + - Eh, ele foi adotado + - Ele está morto! outra vez! + - Ele está mais morto do que antes! + - Você o quebrou! + bossEntityDialog: + - Você está me envergonhando! + - Ele está me intimidando! + - Ele é quem me escolhe! + - Eu posso tratar disso sozinho! + - Deixe-me em paz, eu consegui isso! + - Pare de me seguir por aí! + - Deus isto é tão constrangedor! + - Ele pegou meu dinheiro do almoço! + - Ele está me intimidando! + zombieDad: + - Afaste-se de meu filho! + - Defenda-se filho! + - Eu vou lidar com ele! + - Pare de focar no meu filho! + - Por que você está fazendo isso? + - Falarei com seus pais! + - Você vai se divertir! + - Mostre-lhe quem manda crianças! + - Bom soco criança! + zombieMom: + - Deixa o meu filho! + - Você está machucado docinho? + - Ele te machucou meu doce? + - Deixe-me ver isso + - Vou falar com os pais dele! + - Você esqueceu sua jaqueta docinho! + - Postura, querida + - Quebre isso! + - Pare com isso! + - Você levou o lixo para fora? +elite_blaze: + name: '&fLvl &2$level &fElite &eBlaze' + deathMessages: + - '$player &cfoi aceso por $entity!' +elite_cave_spider: + name: '&fNvl &2$level &fElite da Aranha das Cavernas' + deathMessages: + - '$player &cficou encurralado na &cweb de $entity!' +elite_creeper: + name: '&fNvl &2$level &fElite &2Creeper' + deathMessages: + - '$player &cfoi explodido por $entity!' + - '$entity &cjust oh manda $player&c!' +elite_drowned: + name: '&fLvl &2$level &fElite &3Drowned' + deathMessages: + - '$player &chas foram derrubadas para as profundezas por $entity!' + - '$player &chas foram afogadas por $entity!' +elite_elder_guardian: + name: '&fNvl &2$level &fElite &3Guardião Ancião' + deathMessages: + - '$entity &cpreveniu $player &cde explorar as profundezas!' +elite_guardian: + name: '&fNvl &2$level &fElite &3Guardião' + deathMessages: + - '$entity &cpreveniu $player &cde explorar as profundezas!' +elite_enderman: + name: '&fNvl &2$level &fElite &5Enderman' + deathMessages: + - '$entity &cenviou $player &cpara o void!' + - '$player &cexaminou $entity &cerrado!' + - '$player &cand $entity &ctornou-se os melhores amigos!' +elitemob_endermite: + name: '&fNvl &2$level &fElite &7Endermite' + deathMessages: + - '$entity &cis para $player &cque David está para Golias!' +elite_evoker: + name: '&fLvl &2$level &fElite &5Evoker' + deathMessages: + - '$player &cfoi encantado por $entity&c!' +elite_husk: + name: '&fLvl &2$level &fElite &7Husk' + deathMessages: + - '$player &cfoi ocultado por $entity&c!' +elite_illusioner: + name: '&fNvl &2$level &fElite &8Ilusionista' + deathMessages: + - '$player&c caiu para &cillusões de $entity!' +elite_iron_golem: + name: '&fLvl &2$level &fElite &fIron Golem' + deathMessages: + - '$player &cmessou com a $entityincorreta!' + - '$player &chas foram ensinadas o modo de punho de $entity&c!' +elite_phantom: + name: '&fNvl &2$level &fElite &9Fantasma' + deathMessages: + - '$player &cacabou de ter um pesadelo ruim cerca de $entity&c!' + - '$player &cterá pesadelos sobre $entity&c!' + - '$entity &chas ensinou $player &co valor do sono!' +elite_pillager: + name: '&fNvl &2$level &fElite &8Saqueador' + deathMessages: + - '$entity &csaqueou $player&c!' + - '$entity &csaqueou $player&c!' +elite_polar_bear: + name: '&fLvl &2$level &fElite &fPolar Bear' + deathMessages: + - '$player &cfoi agarrado até a morte por $entity&c!' + - '$player &cfoi mutilado até a morte por $entity&c!' +elite_ravager: + name: '&fLvl &2$level &fElite &6Ravager' + deathMessages: + - '$entity &cmostrou $player &cquem é o encarregado!' +elite_silverfish: + name: '&fLvl &2$level &fElite &7Silverfish' + deathMessages: + - '$player &cmissou $entity &cpor um bloco de pedra!' +elite_skeleton: + name: '&fLvl &2$level &fElite &fSkeleton' + deathMessages: + - '$player &cvirou a &cpin cushion de $entity!' + - '$entity &cwanted to see $player''s &cbones!' +elite_spider: + name: '&fLvl &2$level &fElite &7Spider' + deathMessages: + - '$player &cficou encurralado na &cweb de $entity!' + - '$entity &chas devoured $player&c!' +elite_stray: + name: '&fLvl &2$level &fElite &bStray' + deathMessages: + - '$player &cwas led astray by $entity&c!' +elite_vex: + name: '&fLvl &2$level &fElite &bVex' + deathMessages: + - '$entity &chas vexed $player&c!' +elite_vindicator: + name: '&fLvl &2$level &fElite &8Vindicator' + deathMessages: + - '$entity &cvindicated his fighting skills over $player&c!' +elite_witch: + name: '&fLvl &2$level &fElite &5Witch' + deathMessages: + - '$player &cbecame $entity''s &ctest subject!' + - '$player &chas been bewitched by $entity&c!' +elite_wither_skeleton: + name: '&fLvl &2$level &fElite &8Wither Skeleton' + deathMessages: + - '$entity''s &carrows withered away $player&c!' + - '$entity''s &chas withered $player &caway!' +elite_zombie: + name: '&fLvl &2$level &fElite &2Zombie' + deathMessages: + - '$player &cwas devoured by $entity&c!' + - '$entity &cgot to $player''s &cbrains!' +elite_ghast: + name: '&fLvl &2$level &fElite &fGhast' + deathMessages: + - '$player &cnão escapou do $entity&c &cballs!' + - '$player &cfoi explodido para os bits $entity&c!' + - '$entity &ctirou $player''s &cbacon!' +elite_wolf: + name: '[$level] Elite Wolf' + deathMessages: + - '$entity tore $player apart!' + - '$player was torn to shreds by $entity!' +elite_ender_dragon: + name: '&fLvl &2$level &fElite &5Ender Dragon' + deathMessages: + - '$entity &chas ended $player!' +elite_shulker: + name: '&fLvl &2$level &fElite &5Shulker' + deathMessages: + - '$entity &cshowed $player &cnew heights!' +super_chicken: + name: '&2Super Galinha' +super_cow: + name: '&2Super Vaca' +super_mushroom_cow: + name: '&2Super Coguvaca' +super_pig: + name: '&dSuper Porco' +super_sheep: + name: Super Ovelha +elite_killer_bunny: + name: '&fLvl &2$level &fElite &cKiller Rabbit' + deathMessages: + - '$entity &cmade $player &cgo live in a farm upstate!' + - '$entity &ceducated $player using a stick and not a carrot!' +elite_llama: + name: '&fLvl &2$level &fElite &5Llama' + deathMessages: + - '$player &cwas spit on by $entity&c!' + - '$player &cwas made $entity&c angry!' +elite_warden: + name: '&fLvl &2$level &fElite &3Warden' + deathMessages: + - '$entity &csensed $player &cwas nearby!' +elite_goat: + name: '&fLvl &2$level &fElite &5Goat' + deathMessages: + - '$player &cwas rammed by $entity&c!' + - '$player &cwas run over by $entity&c!' + - '$player &cwas trampled by $entity&c!' + - '$player &cgot $entity&c horns!' +elite_zombified_piglin: + name: '&fLvl &2$level &fElite &6Zombified Piglin' + deathMessages: + - '$player &cfoi mutilado até a morte por $entity&c!' + - '$entity &ctirou $player''s &cbacon!' +elite_zoglin: + name: '&fLvl &2$level &fElite &dZoglin' + deathMessages: + - '$player &cmessou com o $entity &cand pegaram os chifres!' + - '$entity &ctirou $player''s &cbacon!' +elite_piglin: + name: '&fLvl &2$level &fElite &ePiglin' + deathMessages: + - '$entity &cirá obter um bom preço pelos restos de $player!' + - '$entity &censinou $player &co valor de ouro!' +elite_hoglin: + name: '&fLvl &2$level &fElite &dHoglin' + deathMessages: + - '$player &cmessou com o $entity &cand pegaram os chifres!' + - '$entity &ctirou $player''s &cbacon!' +elite_piglin_brute: + name: '&fLvl &2$level &fElite &cPiglin Brute' + deathMessages: + - '$entity &ctenderou $player!' + - '$entity &cbrutalizou $player!' +elite_bee: + name: '&eAbelha &fElite &fLvl &2$level' + deathMessages: + - '$player &cfoi picado por $entity!' +MobCombatSettings: + bossLocationMessage: '&7[EM] &2[Clique para rastrear!]' + bossKillParticipationMessage: '&eSeu dano: &2$playerDamage' + defaultOtherWorldBossLocationMessage: '$name: Em um mundo diferente!' + weakText: '&9&lWeak!' + resistText: '&c&lResist!' + fullHealMessage: '&2FULL HEAL!' +check_tier: + message1: '&7[EM] Seu nível de combate é $tier' + message2: '&7[EM] O seu bônus de nível da guilda é $tier' + message3: '&7[EM] &aSeu nível total de ameaça é $tier' +check_tier_others: + message1: '&7[EM] O nível de combate de $player é $tier' + message2: '&7[EM] O bônus de nível da guilda de $player é $tier' + message3: '&7[EM] &aO nível total de ameaça de $player é $tier' +ScrapItemSettings: + scrapItemName: '&2sucata de nível $level' + scrapItemLore: + - '&aColete 25 sucatas do mesmo nível para' + - '&acriar um orbe de aprimoramento de item!' + - '&aVocê também pode usar sucata para reparar' + - '&aitem e fabricam sucata de nível superior!' + - '&2Faça isto no Centro da Guilda do Aventureiro!' + upgradeItemName: '&2Orbe de Melhoria de Nível $level' + upgradeItemLore: + - '&aUse no NPC Enhancer para atualizar' + - '&apara o nível $orbLevel!' +Quests: + questJoinMessage: '&aYou have accepted the quest $questName &a!' + questLeaveMessage: '&cYou have abandoned the quest $questName &c!' + questCompleteMessage: '&2You completed the quest $questName &2!' + leaveWhenNoActiveQuestsExist: '&cYou don''t currently have an active quest!' + questLeaveConfirmationMessage: '&cAre you sure you want to abandon your current quest? Do &a/em confirm &c to confirm your choice!' + questStartTitle: '&aQuest Accepted!' + questCompleteTitle: '&2Quest Completed!' + questLeaveTitle: '&cQuest Abandoned!' + killQuestChatProgressionMessage: '&8[EliteMobs]&c➤Kill $name:$color$current&0/$color$target' + fetchQuestChatProgressionMessage: '&8[EliteMobs]&c➤Get $name:$color$current&0/$color$target' + dialogQuestChatProgressionMessage: '&8[EliteMobs]&c➤Talk to $name:$color$current&0/$color$target' + questCapMessage: '&8[EliteMobs] &cYou have reached the maximum amount of active quests (10)! &4Abandon or complete at least one active quest if you want to get more quests!' + killQuestScoreboardProgressionMessage: '&c➤Kill $name:$color$current&0/$color$target' + fetchQuestScoreboardProgressionMessage: '&c➤Get $name:$color$current&0/$color$target' + dialogQuestScoreboardProgressionMessage: '&c➤Talk to $name:$color$current&0/$color$target' + chatTrackMessage: '&8[EliteMobs]&2 Click here to track your quest!' + chatTrackHover: '&2Click to track!' + chatTrackingMessage: '&8[EliteMobs]&9 You are now tracking a quest!' + chatTrackingHover: '&2Click to untrack/track! /em -> Quests to track a different quest!' + noQuestDestinationFound: '[EM] No quest destination found!' + questDestinationInOtherWorld: '[EM] Go to world $world!' + questAlreadyCompletedMessage: '&8[EliteMobs] &cYou already completed this quest!' + questPrerequisitesMissingMessage: '&8[EliteMobs] &cCan''t accept this quest yet!' + lowRankDynamicQuestWarning: '&8[EliteMobs] &cYou can''t take these quests with your current guild rank! Increase your guild rank to accept these quests.' + questTurnInObjective: '&a2Talk to $npcName' +Wormholes: + dungeonNotInstalledMessage: '&8[EliteMobs] &cDungeon $dungeonID &cis not installed! This teleport will not work.' + defaultPortalMissingMessage: '&8[EliteMobs] &cThis portal doesn''t seem to lead anywhere!' +Arenas: + notEnoughPlayersMessage: '&8[EliteMobs] &cYou need at least $amount to start the match!' + startingMessage: '&2Starting!' + startingSubtitle: '&2in $count...' + arenaFullMessage: '&4[EliteMobs] &cArena is full! You can spectate instead while you wait for it to finish!' + arenasOngoingMessage: '&4[EliteMobs] &cCan''t join the arena now - a match is currently happening! You can spectate instead while you wait for it to finish!' + arenaStartHintMessage: '&2[EliteMobs] &aYou can start the arena by doing &2/em start' + arenaQuitHintMessage: '&4[EliteMobs] &cYou can leave the arena by doing &4/em quit' + arenaJoinPlayerMessage: "&2[EliteMobs] &aYou can start the arena by doing &2/em\\ \\ start &aif there are at least &2$count &aplayers in it! \nYou can leave the\\ \\ arena by doing &c/em quit" + arenaJoinSpectatorMessage: '&2[EliteMobs] &aYou can leave the arena at any time using &2/em quit' + waveTitle: '&aWave &2$wave' + victoryTitle: '&2Victory!' + victorySubtitle: '&aCompleted &2$wave &awaves!' + defeatTitle: '&4Defeat!' + defeatSubtitle: '&cReached wave &4$wave&c!' + victoryBroadcast: Arena $arenaName was conquered by $players! + joinPlayerTitle: '&aStart with &2/em start &a!' + joinPlayerSubtitle: '&cLeave with &4/em quit &c!' + joinSpectatorTitle: '&aNow spectating!' + joinSpectatorSubtitle: '&cLeave with &4/em quit &c!' +ancient_corpse_drop_axe: + name: '&eButchers Cleaver' + lore: + - '&aRetrived from the' + - '&aAncient Corpse''s skull...' +animated_armor_drop_axe: + name: '&8Enchanted Axe' + lore: + - '&8This axe was almost the' + - '&8end of you.' +animated_armor_drop_boots: + name: '&8Enchanted Boots' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +animated_armor_drop_chestplate: + name: '&8Enchanted Chestplate' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +animated_armor_drop_helmet: + name: '&8Enchanted Helmet' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +animated_armor_drop_leggings: + name: '&8Enchanted Leggings' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +arachnid_matriarch_drop_boots: + name: '&bSilk Striders' + lore: + - '&bMade out of rare spider silk.' +baba_rhoga_drop_chest: + name: '&aWitches Robes' + lore: + - '&aThe smell should go' + - '&aaway eventually.' +baba_yaga_drop_helmet: + name: '&aWitches Hat' + lore: + - '&aThe smell should go' + - '&aaway eventually.' +balloon_rider_drop_leggings: + name: '&dRoomy Leggings' + lore: + - '&dVery comfortable and spacious leggings.' +banshee_drop_charm: + name: '&8Manifested Sorrow' + lore: + - '&8May this hardened sorrow protect' + - '&8you from grief.' +beast_tamer_drop_axe: + name: '&eGreat Axe' + lore: + - '&eHeavy enough to cleave any beast in two.' +berserker_charm: + name: '&bAmuleto do Berseker' + lore: + - '&aPerca-se diante de' + - '&aadversidade esmagadora em mais ' + - '&Nunca antes de um...' +bigfoot_drop_chestplate: + name: '&eFur Armor' + lore: + - '&eNice and warm.' +big_bad_wolf_drop_chestplate: + name: '&aBig Bad Wolf Fur' + lore: + - '&aScary!' +bloated_jeffrey_drop_tear: + name: '&bSweet Tear' + lore: + - '&bYou made Jeffrey cry...' +bone_fiend_drop_leggings: + name: '&aBoney Leggings' + lore: + - '&aThe sharp bones attached to these' + - '&aleggings sure do rattle a lot.' +challengers_boots: + name: '&cChallenger''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_chestplate: + name: '&cChallenger''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_helmet: + name: '&cChallenger''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_leggings: + name: '&cChallenger''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_sword: + name: '&cChallenger''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +chameleon_charm: + name: '&bAmuleto de Camaleão ' + lore: + - '&aO Camaleão colorido pode' + - '&aCamuflar-se em qualquer lugar,' + - '&arastejando vagarosamente... ' +changeling_drop_sword: + name: '&aCrystalline Sword' + lore: + - '&aThe blade shimmers as you gaze upon it.' +cheetah_charm: + name: '&bAmuleto de Guepardo' + lore: + - '&aGuepardos podem atingir velocidades de' + - '&a120 km/h... por cerca de 60' + - '&asegundos. Faça valer!' +circus_ringmaster_drop_charm: + name: '&dRingmasters Whip' + lore: + - '&dThis was used for terrible punishment.' +craftenmine_terror_drop_trident: + name: '&cGhast Lobotomizer' + lore: + - '&cPerfect for making sure that' + - '&cthe Ghasts stay grounded.' +creeperpede_drop_chestplate: + name: '&dExplosion Proof Vest' + lore: + - '&dMake ''BOOM!'' feel' + - '&dmore like ''boom''.' +crone_drop_axe: + name: '&fWitch Feller' + lore: + - '&fA fine axe that demands a fine hunt.' +depths_seeker: + name: '&2Caçador das profundezas' + lore: + - '&9Vem de profundidades imensuráveis' + - '&9e saqueado do monstro mais frágil,' + - '&9não há como dizer quais horrores' + - '&9esta vara de pesca já viu.' +divine_cinder_drop_charm: + name: '&6Divine Fire' + lore: + - '&6Blessed be the fire!' +dwarven_greed: + name: '&4Ganância guerrida' + lore: + - '&cAqueles que se aprofundam ' + - '&cmuito gananciosamente podem' + - '&cacordar antigos coradores de sombra e chama,' + - '&cmelhor deixados imperturbáveis.' +elephant_charm: + name: '&bAmuleto do Elefante' + lore: + - '&aGanhe o poder de um elefante' + - '&adebandada, pelo custo de' + - '&a velocidade de uma debandada de elefantes!' +enders_drop_chestplate: + name: '&dEnder Shirt' + lore: + - '&dProtective and comfy!' +enders_drop_helmet: + name: '&dEnder Cap' + lore: + - '&dComfy but also quite sturdy.' +enders_drop_leggings: + name: '&dEnder Pants' + lore: + - '&dA bit too long but it will do.' +ender_lapin_drop_boots: + name: '&cDark Star Boots' + lore: + - '&cGives you the courage' + - '&cof running when in danger.' +endless_pursuer_drop_sword: + name: '&7Dark Blood Sword' + lore: + - '&7The sword seems to' + - '&7be weeping blood...' +enraged_snowman_drop_sword: + name: '&9Snowman''s Nose' + lore: + - '&9No wonder that the Snowman''s' + - '&9nose was so pointy...' +xmas_and_gold: + name: '&6and gold!' + lore: + - '&7Everyone wishes for silver' + - '&7and gold!' +xmas_and_goooooold: + name: '&6and goooooold!' + lore: + - '&7Everyone wishes for silver' + - '&7and gold!' +xmas_cornelius_pick: + name: '&bCornelius'' Pick' + lore: + - '&3If you throw it in the air' + - '&3and let it hit the ground,' + - '&3you may just find some' + - '&3peppermint!' +xmas_lost_present: + name: '&2Lost Present' + lore: + - '&2Turn this in for a reward!' +xmas_peppermint: + name: '&cPeppermint' + lore: + - '&fWhat I''ve been searching for all my life!' +xmas_siiiiilver: + name: '&7Siiiiilver' + lore: + - '&6Everyone wishes for silver' + - '&6and gold!' +xmas_silver: + name: '&7Silver' + lore: + - '&6Everyone wishes for silver' + - '&6and gold!' +xmas_substitute_elf_practice: + name: '&8Substitue Elf Practice' + lore: + - '&fThis doll needs its teeth fixed' +xmas_treat: + name: '&aTrato!' + lore: + - '&eUm delicioso lanche!' +xmas_treat_v2: + name: '&aTrato!' + lore: + - '&eA delicious snack!' +evil_undead_drop_sword: + name: '&eTransient Blade' + lore: + - '&eIt will only serve' + - '&eyou for song long.' +fallen_knight_drop_boots: + name: '&e7Ancient Boots' + lore: + - '&7Even though the boots are old they' + - '&7still provide plenty of protection.' +fallen_knight_drop_chestplate: + name: '&e7Ancient Nether-Plate' + lore: + - '&7This armor might look plain to' + - '&7the untrained eye but is clear' + - '%7that anything wishing to penetrate' + - '&7it''s thick plate will need to be' + - '&7swung with considerable force.' +fallen_knight_drop_helmet: + name: '&e7Ancient Headgear' + lore: + - '&7Many swords have left their mark' + - '&7aon this helm but none have' + - '&7managed to break its defense.' +fallen_knight_drop_leggings: + name: '&e7Ancient Leggings' + lore: + - '&7You feel sorry for anyone that tries' + - '&7to strike these leggings.' +fine_swine_drop_sword: + name: '&6Fine Golden Sword' + lore: + - '&6A fine master-crafted golden sword.' + - '&6The molten gold flowing inside' + - '&6the sword makes sure that any damage' + - '&6to the blade is repaired swiftly.' +firefly_charm: + name: '&b Charme ardente' + lore: + - '&aAcenda as luzes a noite!' +firestarter_drop_helmet: + name: '&eFire Stopper' + lore: + - '&eOnly half the heat!' +fire_conjurer_drop_shield: + name: '&eFlame Touched Shield' + lore: + - '&eProtects against fire and flame.' +fishy_charm: + name: '&b Charme duvidosa' + lore: + - '&aHá apenas algo que não' + - '&amuito bem com este...' +fox_king_cold_drop_charm: + name: '&9Magical Snow' + lore: + - '&9You sense impossible energies' + - '&9coming from this snow.' +fulgora_drop_boots: + name: '&bMountain Boots' + lore: + - '&bShould be useful when' + - '&bexploring the mountains.' +goblin_ballista: + name: '&8Goblin Ballista' + lore: + - '&8A treasure among goblins!' +goblin_boots: + name: '&8Goblin Boots' + lore: + - '&8A treasure among goblins!' +goblin_chestplate: + name: '&8Goblin Chestplate' + lore: + - '&8A treasure among goblins!' +goblin_cleaver: + name: '&8Goblin Cleaver' + lore: + - '&8A treasure among goblins!' +goblin_helmet: + name: '&8Goblin Helmet' + lore: + - '&8A treasure among goblins!' +goblin_invasion_drop_chestplate: + name: '&aSmall Chestplate' + lore: + - '&aReally tight...' +goblin_invasion_drop_leggings: + name: '&aSmall Leggings' + lore: + - '&aWell, at least it really' + - '&ashows off your legs.' +goblin_leggings: + name: '&8Goblin Leggings' + lore: + - '&8A treasure among goblins!' +goblin_poker: + name: '&8Goblin Poker' + lore: + - '&8A treasure among goblins!' +goblin_shooter: + name: '&8Goblin Shooter' + lore: + - '&8A treasure among goblins!' +goblin_slasher: + name: '&8Goblin Slasher' + lore: + - '&8A treasure among goblins!' +grappling_arrow: + name: '&6Grappling Arrow' + lore: + - '&eFire at a TARGET BLOCK to grapple!' +greedy_dwarf_drop_pickaxe: + name: '&9Dwarven Need' + lore: + - '&cThose who delve too greedily' + - '&cand too deep may wake ancient' + - '&chorrors of shadow and flame' + - '&cbest left undisturbed.' +grunter_drop_axe: + name: '&cBig Oink' + lore: + - '&cThe axe has a tendency' + - '&cto squeal when swung.' +grunts_boots: + name: '&fGrunt''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_chestplate: + name: '&fGrunt''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_helmet: + name: '&fGrunt''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_leggings: + name: '&fGrunt''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_sword: + name: '&fGrunt''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +harmless_chicken_drop_boots: + name: '&aUseless Boots' + lore: + - '&aAt least they''re explosion proof...' +hog_rider_drop_boots: + name: '&a3.6 Radioactive Boots' + lore: + - '&aNot great, not terrible.' +horde_champion_drop_sword: + name: '&dHorde Eviscerator' + lore: + - '&dWhen you need to take' + - '&dcare of an undead horde.' +horrid_duplicator_drop_arrow: + name: '&aDuped Arrow' + lore: + - '&2Looks and feels' + - '&2like the real thing...' +horrid_duplicator_drop_bow: + name: '&4Fiery Bone Bow' + lore: + - '&4This bow is made out of' + - '&4a single large bone.' +invasion_alien_treat: + name: '&6Alien treats' + lore: + - '&6The taste is out of this planet!' +invasion_cheap_plasma_boots: + name: '&2Cheap Plasma Boots' + lore: + - '&aBlast off!' + - '&cNote: &8Double shift to activate!' +invasion_low_grade_tinfoil_bolt_caster: + name: '&7Low Grade Bolt Caster' + lore: + - '&7Get off my property!' +invasion_low_grade_tinfoil_boots: + name: '&7Low Grade Tinfoil Shoes' + lore: + - '&7Avoids floor radiation!' +invasion_low_grade_tinfoil_chestplate: + name: '&7Low Grade Tinfoil Chestpiece' + lore: + - '&7Prevents 6G from spying on your pacemaker!' +invasion_low_grade_tinfoil_hat: + name: '&7Low Grade Tinfoil Hat' + lore: + - '&7I want to believe!' +invasion_low_grade_tinfoil_leggings: + name: '&7Low Grade Tinfoil Pants' + lore: + - '&7Made for running from aliens!' +invasion_polished_plasma_boots: + name: '&2Polished Plasma Boots' + lore: + - '&aBlast off!' + - '&cNote: &8Double shift to activate!' +invasion_quality_bolt_caster: + name: '&7Quality Bolt Caster' + lore: + - '&7Get off my property!' +invasion_quality_tinfoil_boots: + name: '&7Low Grade Tinfoil Shoes' + lore: + - '&7Avoids floor radiation!' +invasion_quality_tinfoil_chestplate: + name: '&7Quality Tinfoil Chestpiece' + lore: + - '&7Prevents 6G from spying on your pacemaker!' +invasion_quality_tinfoil_hat: + name: '&7Quality Tinfoil Hat' + lore: + - '&7Stay out of my head!' +invasion_quality_tinfoil_leggings: + name: '&7Quality Tinfoil Pants' + lore: + - '&7Made for running from aliens!' +invictus_boots: + name: '&4Invictus Boots' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_chestplate: + name: '&4Invictus Chestplate' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_helmet: + name: '&4Invictus Helmet' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_leggings: + name: '&4Invictus Leggings' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_pickaxe: + name: '&4Invictus Pickaxe' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_shovel: + name: '&4Invictus Shovel' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_sword: + name: '&4Invictus Sword' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +krampus_drop_boots: + name: '&1Snow Boots' + lore: + - '&1Made out of actual snow.' +large_hopper_drop_axe: + name: '&aHeavy Axe' + lore: + - '&aPerfect for chopping off heads.' +living_shadow_drop_boots: + name: '&5Shadow Boots' + lore: + - '&5Falling doesn''t hurt as much.' +lucky_charms: + name: '&bCharme de sorte' + lore: + - '&aParte de um cafe da manha completo!' + - '&cNota: Absolutamente não faz parte' + - '&cum café da manhã completo.' +magmaguys_toothpick: + name: '&4CaraDoMagma &2Palito de dente' + lore: + - '&aEm estado quase novo!' +merman_drop_trident: + name: '&1Merman Trident' + lore: + - '&1A Merman''s favorite weapon.' +meteor_shower_scroll: + name: '&7Banho de chuva de meteoros' + lore: + - '&4Chame a quarta destruição.' + - '&4Uso-unico.' +monster_of_the_deep_drop_trident: + name: '&3Bone Trident' + lore: + - '&3Made out of the bones' + - '&3of the Monster of the Deep.' +moon_spider_drop_sword: + name: '&fSilk Spun Sword' + lore: + - '&fRazor sharp silk surrounds' + - '&fthe iron core of this blade.' + - '&fThe blade will serve you,' + - '&ffor now...' +necromancer_drop_helmet: + name: '&cDark Omen Helm' + lore: + - '&cThere is something off' + - '&cabout this helmet.' +netherite_golem_drop_helmet: + name: '&8Ancient Helmet' + lore: + - '&8You''re not sure if you' + - '&8should put this on your' + - '&8head or send it to a museum.' +nether_escapee_drop_charm: + name: '&6Fire Amulet' + lore: + - '&6May the flames not harm you.' +nether_hag_drop_sword: + name: '&7Bewitched Sword' + lore: + - '&7All kinds of curses and' + - '&7enchantments flow through' + - '&7this sword.' +nightwing_drop_crossbow: + name: '&aSky Watcher' + lore: + - '&aKeeping the skies safe.' +night_crawler_drop_shield: + name: '&8Night Shield' + lore: + - '&8Almost unbreakable.' +night_crawler_drop_sword: + name: '&8Night Blade' + lore: + - '&e8The only answer to the' + - '&8threats of the night.' +novices_boots: + name: '&8Novice''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_chestplate: + name: '&8Novice''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_helmet: + name: '&8Novice''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_leggings: + name: '&8Novice''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_sword: + name: '&8Novice''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +oasis_beacons_brigandine: + name: '&8Beacon''s Brigandine' + lore: + - '&fSolid steel can repel' + - '&fmost attacks.' +oasis_chief_cultists_bow: + name: '&5Chief Cultist''s Bow' + lore: + - '&dThe necrotic war bow' + - '&dof the cultist chief.' +oasis_earthquake_boots_10: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_20: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_30: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_40: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_50: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_10: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_20: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_30: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_40: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_50: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_10: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_20: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_30: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_40: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_50: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_10: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_20: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_30: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_40: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_50: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_foundrys_flaming_hammer: + name: '&6Foundry''s Flaming Hammer' + lore: + - '&eThe Hammer of the foundry!' +oasis_foundrys_flux: + name: '&6Foundry''s Flux' + lore: + - '&eThe flux that''s infused in' + - '&eevery forged weapon!' +oasis_mask_of_the_warlock: + name: '&4Mask of the Warlock' + lore: + - '&7The stone is in his mask!' + - '&7The UV light will help him!' +oasis_monumental_lance: + name: '&3Monumental Lance' + lore: + - '&bSpearfishing is my hobby.' +oasis_oracles_shroud: + name: '&3Oracle''s Shroud' + lore: + - '&1Illusion is your weapon!' +oasis_page_of_darkness_I: + name: '&0Page of Darkness I' + lore: + - '&829 paces North' + - '&811 paces West' + - '&816 paces North' + - '&86 paces East' +oasis_page_of_darkness_II: + name: '&0Page of Darkness II' + lore: + - '&87 paces South' + - '&86 paces East' + - '&833 paces North' + - '&812 paces West' +oasis_page_of_darkness_III: + name: '&0Page of Darkness III' + lore: + - '&86 paces North' + - '&83 paces West' + - '&830 paces North' + - '&89 paces East' +oasis_page_of_darkness_index: + name: '&0Page of Darkness Index' + lore: + - '&8Tread carefully in darkness' + - '&8they know youve come.' + - '&8Be weary on the path ahead' + - '&8for balls of fire drum.' +oasis_page_of_darkness_IV: + name: '&0Page of Darkness IV' + lore: + - '&824 paces South' + - '&89 paces East' + - '&836 paces North' + - '&83 paces West' +oasis_page_of_darkness_V: + name: '&0Page of Darkness V' + lore: + - '&89 paces North' + - '&812 paces East' + - '&86 paces South' + - '&86 paces East' +oasis_page_of_darkness_VI: + name: '&0Page of Darkness VI' + lore: + - '&86 paces South' + - '&86 paces East' + - '&812 paces North' + - '&83 paces East' +oasis_page_of_darkness_VII: + name: '&0Page of Darkness VII' + lore: + - '&83 paces North' + - '&86 paces East' + - '&88 paces South' +oasis_page_of_darkness_VIII: + name: '&0Page of Darkness VIII' + lore: + - '&8Out of the shadow comes a light' + - '&8whose robes are dull gray, marred by fight.' + - '&8Of ice and snow, of fire and heat.' + - '&8Axes deflect, but swords defeat.' +oasis_page_of_libraris_I: + name: '&7Page of Libraris I' + lore: + - '&fUnder the bookshelf' + - '&fthat has no reflection' + - '&fwill appear unto you' + - '&fpassage and direction.' +oasis_page_of_libraris_II: + name: '&7Page of Libraris II' + lore: + - '&fThe bookshelf''s reflection' + - '&fholds more knowledge' + - '&f4 shelves more full of books' + - '&fthan its upward image!' +oasis_page_of_libraris_III: + name: '&7Page of Libraris III' + lore: + - '&fBearing slightly west' + - '&fof the bookshelf that holds the best.' + - '&fThe most knowledge does it keep.' + - '&fA favorite for those who reap.' +oasis_page_of_libraris_index: + name: '&7Page of Libraris Index' + lore: + - '&f5 papers to find,' + - '&f3 switches to flip,' + - '&fa door to be opened' + - '&fand in it shall ye slip.' +oasis_page_of_libraris_IV: + name: '&7Page of Libraris IV' + lore: + - '&fThe oracle of knowledge' + - '&fyeilds shocking surprise' + - '&ffrom depths of despair' + - '&fshall lightning bolts arise.' +oasis_page_of_libraris_V: + name: '&7Page of Libraris V' + lore: + - '&fHis last secret' + - '&fhe will try to hide' + - '&fthough use of shadow and puppets' + - '&fto strike you as you stride.' +oasis_page_of_plundering_I: + name: '&6Page of Plundering I' + lore: + - '&eHouses throughout the town' + - '&ehide their secrets up rather than down.' + - '&eGrapple or flight' + - '&ecan aid your plight.' +oasis_page_of_sentris: + name: '&1Page of Sentris' + lore: + - '&bA sentry''s armor is too tough' + - '&bwielding a sword, your fight will be rough.' +oasis_page_of_the_pharaoh_I: + name: '&0Page of the Pharaoh I' + lore: + - '&6A sacrifice on the altar' + - '&6must be made to pursue.' + - '&6But what shall ye offer?' + - '&red sandstone holds this clue.' +oasis_page_of_the_pharaoh_II: + name: '&0Page of the Pharaoh II' + lore: + - '&6The pharaohs halls are lined' + - '&6in the finest gold around.' + - '&6It shall be his undoing' + - '&6for from gold your damage shall abound.' +oasis_page_of_the_pharaoh_III: + name: '&0Page of the Pharaoh III' + lore: + - '&6The pharaohs walls are filled' + - '&6with perils and precious treasures.' + - '&6From the southwest corner of the room with blue windows' + - '&6streams very ominous pressures.' +oasis_page_of_the_pharaoh_index: + name: '&0Page of the Pharaoh Index' + lore: + - '&6The pharaoh is sealed' + - '&6within his tomb.' + - '&6He lies in wait, undisturbed;' + - '&6his traps will be your doom.' + - '&63 pages will help your adventure' + - '&6from being curbed.' +oasis_page_of_the_sewer_I: + name: '&0Page of the Sewer I' + lore: + - '&3There is a louse of unusual size.' + - '&3Its on the prowl, behold its prize.' + - '&3Plenty of treasure to be found' + - '&3all you have to do is swim around.' +oasis_page_of_the_sewer_II: + name: '&0Page of the Sewer II' + lore: + - '&3Activating the gates one by one' + - '&3will allow the water to flow.' + - '&3Swim up once it pours out' + - '&3then down the right tunnel you must go.' +oasis_page_of_the_sewer_index: + name: '&0Page of the Sewer Index' + lore: + - '&3Evil lurks where waters drain' + - '&3Be ever watchful, they''ll eat your brain!' + - '&3You must open 3 gates guarded by creatures' + - '&3lined with red sandstone features.' + - '&32 pages will guide you, do not strain.' +oasis_page_of_vampiris_I: + name: '&4Page of Vampiris I' + lore: + - '&cDozens of weapons have struck the beast' + - '&cand every blow it''s withstood.' + - '&cIt fears not the bite of stone, gold or diamonds in the least' + - '&cbut it trembles before wood.' +oasis_page_of_vampiris_II: + name: '&4Page of Vampiris II' + lore: + - '&cIf the warlock you seek to slight,' + - '&cbe prepared for a tough fight!' + - '&cThe second floor shall test your might,' + - '&cconquering it first is a rite.' +oasis_page_of_vampiris_III: + name: '&4Page of Vampiris III' + lore: + - '&cDown the spire and into the cave' + - '&cis the path of the brave.' + - '&cBeware of those returned from the grave,' + - '&cslay master for what you crave.' +oasis_page_of_vampiris_index: + name: '&4Page of Vampiris Index' + lore: + - '&cWithin the observatory' + - '&cthere lurks a creature' + - '&cwho has never seen the sun.' + - '&cFind 4 pages to help you' + - '&cescape alive!' +oasis_page_of_vampiris_IV: + name: '&4Page of Vampiris IV' + lore: + - '&cTwo chests of loot,' + - '&cDon''t wake the dead!' + - '&cOne under the stair,' + - '&cthe other where books can be read!' +oasis_pharaohs_feast: + name: '&6Pharaohs Feast' + lore: + - '&eA golden reminder' + - '&eof the once golden city' + - '&ecorrupted by the sands of time.' +oasis_pharaohs_flail: + name: '&0Pharaoh''s Flail' + lore: + - '&4The flail of the afterlife.' +oasis_pick_of_darkness: + name: '&1Pick of Darkness' + lore: + - '&bShining bright through' + - '&bthe shadows.' +oasis_sunkiller: + name: '&6Sunkiller' + lore: + - '&eIsnt that rock over there' + - '&ejust big enough for someone' + - '&eto hide behind?' +oasis_tohth: + name: '&8Oingo Boingo Brothers Adventure' + lore: + - '&fMy preminitions are absolute!' + - '&fIt is fate!' +okami_drop_leggings: + name: '&cOkami''s Blessing' + lore: + - '&cSpeed of the wolf.' + - '&cFire protection of a god.' +owl_charm: + name: '&bAmuleto da Coruja' + lore: + - '&aTorne-se a propria Noite' + - '&apredador!' +primis_artifexs_shield: + name: '&6Artifex''s Shield' + lore: + - '&eAn old relic from a more' + - '&edangerous time. It has been' + - '&erestored to its glory!' +primis_caeruleaums_hope: + name: '&9Caeruleaum''s Hope' + lore: + - '&8A relic of a bygone era, still sharp' + - '&8enough to hurt but rusty enough to' + - '&8belong in a museum!' +primis_catacomb_drop_boots: + name: '&7Dark Bone Footgear' + lore: + - '&7Unnaturally dark bones' + - '&7cover these boots.' +primis_catacomb_drop_boots_2: + name: '&7Dark Bone Footgear' + lore: + - '&7Unnaturally dark bones' + - '&7cover these boots.' +primis_catacomb_drop_chestplate: + name: '&7Dark Bone Armor' + lore: + - '&7Bones as dark as the abyss' + - '&7adorn this armor.' + - '&7The arrows will make quite a' + - '&7noise as they bounce off the bones.' +primis_catacomb_drop_chestplate_2: + name: '&7Dark Bone Armor' + lore: + - '&7Bones as dark as the abyss' + - '&7adorn this armor.' + - '&7The arrows will make quite a' + - '&7noise as they bounce off the bones.' +primis_catacomb_drop_leggings: + name: '&7Dark Bone Leggings' + lore: + - '&7The dark bones covering the' + - '&7leggings will make dangerous' + - '&7falls more survivable.' +primis_catacomb_drop_leggings_2: + name: '&7Dark Bone Leggings' + lore: + - '&7The dark bones covering the' + - '&7leggings will make dangerous' + - '&7falls more survivable.' +primis_catacomb_necromancer_drop_helmet: + name: '&5Dark Bone Cowl' + lore: + - '&5The cowl offers little protection,' + - '&5it only seeks blood and death.' +primis_catacomb_necromancer_drop_helmet_2: + name: '&5Dark Bone Cowl' + lore: + - '&5The cowl offers little protection,' + - '&5it only seeks blood and death.' +primis_catacomb_necromancer_drop_sword: + name: '&5Dark Bone Brand' + lore: + - '&5The unnaturally dark bone-brand' + - '&5glistens in the light' + - '&5ready to part anything' + - '&5that stands in it''s way.' +primis_catacomb_necromancer_drop_sword_2: + name: '&5Dark Bone Brand' + lore: + - '&5The dark bone-brand howls' + - '&5viciously with every swing' + - '&5as the air rushes through' + - '&5it''s hollow cavity.' +primis_cooked_rabbit: + name: '&cCooked Rabbit' + lore: + - Huh, did this rabbit overheat? +primis_diving_helmet: + name: '&1Diving Helmet' + lore: + - An old Diving Helmet. + - Still works just fine. +primis_fish_bait: + name: '&2Fish Bait' + lore: + - '&aLooks like you could reel big fish with these.' +primis_gladius_important_documents: + name: '&2Important Documents' + lore: + - '&aThe documents are sealed.' +primis_gladius_lord_promise: + name: '&5Assistance Agreement' + lore: + - '... hence, for the help lended during these most trying' + - times, Pontis Mille promises to return in kind at Gladius' + - darkest hour. +primis_gladius_supplies: + name: '&2Supplies' + lore: + - '&aFit to keep a soldier fed during a war.' +primis_gladius_sword: + name: '&5Gladius' + lore: + - '&8The very symbol of the Gladius Fortress.' +primis_gladius_the_good_stuff: + name: '&2The Good Stuff' + lore: + - '&aSmells... strong.' +primis_heirloom: + name: '&2Lost Heirloom' + lore: + - '&aSeems old, ancient even.' +primis_ice_village_alanus_dagger: + name: '&eAlanus'' Dagger' + lore: + - '&eA simple dagger with' + - '&erunes covering the handle.' +primis_ice_village_chains_shipment: + name: '&aShipment of Chains' + lore: + - '&aA lot of chains.' +primis_ice_village_escaped_prisoner_body: + name: '&cUnconcious Body' + lore: + - '&cHeavy.' +primis_ice_village_foot_of_mountain_chest_axe: + name: '&1Dull Frost Axe' + lore: + - '&1Freezing to the touch' +primis_ice_village_island_chest_trident: + name: '&3Magma''s Delight' + lore: + - '&3Those who look, shall find.' +primis_ice_village_living_nightmares_reward_chest: + name: '&3Fur Coat' + lore: + - '&3Made out of the' + - '&3toughest fur around.' +primis_ice_village_magical_ice_crystals: + name: '&1Fur Ice Crystal' + lore: + - Having the crystal near + - snow makes it react. +primis_ice_village_make_them_go_ouch_reward_leggings: + name: '&dViolet''s Spare Leggings' + lore: + - '&dMakes you wanna strut down the' + - '&droad and do some punishment.' +primis_ice_village_salmon: + name: '&2Fresh Salmon' + lore: + - You don't think you saw + - larger salmon in your life. +primis_ice_village_silence_reward_helmet: + name: '&aBoomers Helm' + lore: + - '&aShould handle an explosion or two.' +primis_ice_village_taking_the_bait_reward: + name: '&bNorthern Rod' + lore: + - '&bIt''s a well made fishing rod.' +primis_ice_village_violet_boots: + name: '&dViolet''s Leather Boots' + lore: + - '&dFancy leather boots with' + - '&da raised pointy heel.' +primis_ice_village_violet_leggings: + name: '&dViolet''s Fancy Leggings' + lore: + - '&dTight and slightly see-through' + - '&dwith beautiful flower motives.' +primis_ice_village_violet_whip: + name: '&dViolet''s Whip' + lore: + - '&dDelivers exquisite punishment.' +primis_ice_village_wanna_build_a_snowman_reward_boots: + name: '&3Frost Boots' + lore: + - '&3It''s just frost boots.' +primis_invaders_assassins_bow: + name: '&8Assassin''s Bow' + lore: + - '&aThe perfect way to give them' + - '&aa taste of their own medicine.' +primis_invaders_boots: + name: '&4Invader''s boots' + lore: + - '&aThese don''t smell so good.' +primis_invaders_bow: + name: '&8Invader''s Bow' + lore: + - '&aOnce blotted out the Sun.' +primis_invaders_captains_sword: + name: '&4Invader''s Captain Sword' + lore: + - '&aCurved and mean-looking.' +primis_invaders_chestplate: + name: '&4Invader''s chestplate' + lore: + - '&aRusty, ugly and smelly. Lovely!' +primis_invaders_helmet: + name: '&4Invader''s helmet' + lore: + - '&aBeats a concussion!' +primis_invaders_leggings: + name: '&4Invader''s leggings' + lore: + - '&aCould use some oil.' +primis_invaders_sword: + name: '&4Invader''s sword' + lore: + - '&aSuspiciously bloodstained.' +primis_lucky_pickaxe: + name: '&6Lucky Lickaxe' + lore: + - '&eShines bright, even underground.' + - '&eYou see LL engraved in the handle' +primis_monster_slaying_spear: + name: '&8Monster Slaying Spear' + lore: + - Turns Sea Monsters into barbecue. +primis_ogre_boots: + name: '&cOgre''s boots' + lore: + - '&7They''ll keep you nice' + - '&7and toasty.' +primis_ogre_chestplate: + name: '&cOgre''s chestplate' + lore: + - '&7Hot to the touch' +primis_ogre_helmet: + name: '&cOgre''s helmet' + lore: + - '&7You''ll be sweating bullets.' +primis_ogre_leggings: + name: '&cOgre''s leggings' + lore: + - '&7Smoldering slacks.' +primis_ogre_mines_lucky_pickaxe: + name: '&eLucky Pickaxe' + lore: + - '&aLucky, but useless.' +primis_ogre_mines_waterworks_chest_shield: + name: '&aSturdy Door' + lore: + - '&aIt''s just a door.' +primis_old_shield: + name: '&8Old Shield' + lore: + - '&7An old relic from a more' + - '&7dangerous time. It might be' + - '&7able to be mended, though...' +primis_pirate_boots: + name: '&4Pirate''s boots' + lore: + - '&aThese have a few too many' + - '&aholes to be useful.' +primis_pirate_bow: + name: '&8Pirate''s Bow' + lore: + - '&aNot quite a flintlock,' + - '&abut it will do!' +primis_pirate_chestplate: + name: '&4Pirate''s Chestplate' + lore: + - '&aBasically a t-shirt.' +primis_pirate_helmet: + name: '&4Pirate''s Helmet' + lore: + - '&aMissing an eye-patch.' +primis_pirate_leggings: + name: '&4Pirate''s leggings' + lore: + - '&aFeels like sea legs!' +primis_pirate_sword: + name: '&4Pirate''s sword' + lore: + - '&aCurved and mean-looking.' +primis_pointis_groves_heirloom: + name: '&2Valuable Heirloom' + lore: + - '&aThis is the second one of these that you retrieved.' +primis_pointis_mille_chest_dirty_note: + name: Dirty Note + lore: + - '&fThere was a really cool sword' + - '&fin here but it''s gone now.' +primis_pontis_beast_horn: + name: '&2Blood Drenched Horn' + lore: + - '&fOn closer inspection the horn isn''t' + - '&fcovered in blood but seems to' + - '&fbe made out of it.' + - '&fThe crystallized blood is incredibly sharp.' +primis_pontis_beast_scale: + name: '&2Toxic Fish Scale' + lore: + - '&fThe scale is rock hard on the outside.' + - '&fThe inside is covered in' + - '&ftoxic and acidic ooze.' +primis_pontis_beast_silk: + name: '&2Sun Soaked Silk' + lore: + - '&fThe silk is radiating light and warmth.' +primis_pontis_elf_drop_boots: + name: '&7Elf Boots' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_elf_drop_chestplate: + name: '&7Elf Chest-plate' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_elf_drop_crossbow: + name: '&7Elf Dark-bow' + lore: + - '&7The special projectiles that the bow' + - '&7uses are both sharp and blunt.' +primis_pontis_elf_drop_helmet: + name: '&7Elf Helmet' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_elf_drop_leggings: + name: '&7Elf Leggings' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_fields_berry_charm: + name: '&dLarge Berry' + lore: + - '&dThe fresh odor this berry emits' + - '&dcan be smelled from miles away.' + - '&dThe odor seems to have a calming' + - '&deffect on monsters and beasts.' + - '&dIt makes their attacks less vicious.' +primis_pontis_groves_brood_moher_drop_charm: + name: '&aCrawlers Torment' + lore: + - '&aThe silk radiates strong energy.' +primis_pontis_groves_nest_crawler_drop_shield: + name: '&7Magma''s Lure' + lore: + - '&7When the shield is held up' + - '&7it lures monsters into striking it.' +primis_pontis_groves_spider_boots_reward: + name: '&1Spider-legs Boots' + lore: + - '&1Boots made from spider legs and leather.' +primis_pontis_groves_tree_climbing_elf_bandits_reward_leggings: + name: '&aElf Pearl Leggings' + lore: + - '&aProtective leggings' + - '&aadorned with pearls.' +primis_pontis_mille_arena_knowledge: + name: '&2Knowledge' + lore: + - '&aImportant Knowledge.' +primis_pontis_mille_arena_reward_1: + name: '&4Star Touched Shield' + lore: + - '&7An ornate shield with a cosmos motive.' +primis_pontis_mille_arena_reward_2: + name: '&4Star Touched Chestplate' + lore: + - '&7A thousand tiny spiky stars stretch across the Chestplate.' +primis_pontis_mille_arena_reward_3: + name: '&4Star Touched Leggings' + lore: + - '&7The leggings sparkle like the stars in the sky.' +primis_pontis_mille_cat_quest_reward_charm: + name: '&9Cat''s Blessing' + lore: + - '&9If you hold it up all the' + - '&9way to your ear you can' + - '&9hear a slight purr.' +primis_pontis_mille_counselor_sword: + name: '&eStone of Far-speech' + lore: + - '&aYou can sense a presence coming from the stone.' +primis_pontis_mille_fields_beasts_reward_chest: + name: '&eHunters Pride' + lore: + - '&eThose who hunt cannot be the prey.' +primis_pontis_mille_fields_contest_berry: + name: '&dContest Berry' + lore: + - '&dA beautiful and very large berry.' + - '&dTruly a one in a million specimen.' +primis_pontis_mille_fields_do_it_yourself_reward_bow: + name: '&cHunters Bow' + lore: + - '&cA finely crafted bow.' + - '&cArrows fired from this' + - '&cbow will hurt any beast.' +primis_pontis_mille_fields_first_aid: + name: '&2First Aid Equipment' + lore: + - '&fEverything one would need" - "&fto treat serious injuries.' +primis_pontis_mille_fields_rat_drop_helmet: + name: '&fFeathered Rat Cap' + lore: + - '&fYou managed to make a' + - '&fcap out of your prey.' + - '&fHaving extracted the preys' + - '&fblinding properties, you have made' + - '&fit work in your favor.' +primis_pontis_mille_fields_rat_meat: + name: '&cRat Meat' + lore: + - Raw rat meat. No need to cook. +primis_pontis_mille_fields_stolen_berries: + name: '&4Stolen Berries' + lore: + - '&fIt''s the stolen berries' +primis_pontis_mille_fish_nets: + name: '&2Fish Nets' + lore: + - '&aCatching fish made easy!' +primis_pontis_mille_fresh_rat: + name: '&fFresh Rat' + lore: + - The cat will love this. +primis_pontis_mille_mines_goblined_up_in_the_maze_reward_axe: + name: '&aRuned Goblin Axe' + lore: + - '&aThere are runes etched into the axe handle.' + - '&aThey are quite faded by now.' + - '&aSeems like this axe was cursed at one point...' +primis_pontis_mille_mines_goblin_head: + name: '&2Fowl Goblin Feathers' + lore: + - '&aSo soft and prickly.' +primis_pontis_mille_parkour_reward_boots: + name: '&4Diamond Tree Boots' + lore: + - '&7Boots made out of special soft bark.' + - '&7Decorated with gems.' +primis_pontis_mille_reward_boots: + name: '&4Pontis Mille Boots' + lore: + - '&7Traditional Pontis Mille Boots' +primis_pontis_mille_reward_chest: + name: '&4Pontis Mille Chestplate' + lore: + - '&7A traditional Pontis Mille Chestplate' +primis_pontis_mille_reward_helmet: + name: '&4Pontis Mille Helm' + lore: + - '&7A traditional Pontis Mille Helm' +primis_pontis_mille_reward_leggings: + name: '&4Pontis Mille Leggings' + lore: + - '&7Traditional Pontis Mille Leggings' +primis_pontis_mille_reward_shield: + name: '&4Pontis Mille Shield' + lore: + - '&7A traditional Pontis Mille Shield' +primis_pontis_mille_reward_sword: + name: '&4Pontis Mille Katana' + lore: + - '&7Incredibly sharp' +primis_pontis_mille_serious_sewage_reward_helmet: + name: '&2Turtle Shell Helm' + lore: + - '&2Makes you wanna eat some pizza.' +primis_pontis_mille_sewage_keys: + name: '&2Sewage Keys' + lore: + - '&aA key ring with a lot of keys on it.' +primis_pontis_mille_sewers_ninja_drop_chestplate: + name: '&7Ninja Garb Chest-plate' + lore: + - Now you too are a Ninja +primis_pontis_mille_sewers_ninja_drop_leggings: + name: '&7Ninja Garb Leggings' + lore: + - Now you too are a Ninja +primis_pontis_mille_sewers_shredder_drop: + name: '&4Shredding Helmet' + lore: + - Full of small tiny razor blade + - like points on the exterior. +primis_pontis_mille_slums_chest_sword: + name: '&4Dull Pontis Mille Katana' + lore: + - '&7Incredibly sharp' +primis_pontis_mille_to_lycan_or_not_to_lycan_reward: + name: '&aFur Leggings' + lore: + - '&aTough and light' + - '&aMade out of fur and hide.' +primis_pontis_mines_goblin_drop_boots: + name: '&7Goblin Boots' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_chestplate: + name: '&7Goblin Chest-Plate' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_helmet: + name: '&7Goblin Helmet' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_leggings: + name: '&7Goblin Leggings' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_spear: + name: '&7Goblin Spear' + lore: + - '&7A nice and sharp stone at the end.' +primis_pontis_mines_goblin_drop_sword: + name: '&7Goblin Sword' + lore: + - '&7It''''s just a stone club with a handle.' +primis_pontis_redwoods_nasty_little_bandits_reward_boots: + name: '&2Forest Boots' + lore: + - '&2The boots seem to be made' + - '&2out of soft bark, leaves' + - '&2and crystallized tree sap.' +primis_pontis_redwoods_spider_legs: + name: '&2Spider Legs' + lore: + - '&aIt is just spider legs...' +primis_pontis_redwoods_tobacco: + name: '&2Premium Tobacco' + lore: + - '&aSmells amazing...' +primis_pontis_redwoods_watch: + name: '&2Sturdy Pocket Watch' + lore: + - '&aSuprisingly light and sturdy.' +primis_pontis_redwoods_werewolf_drop_chestplate: + name: '&7Fur Chest-Plate' + lore: + - '&7Made out of tough fur and hide.' + - '&7Light, but very tough.' +primis_roughspun_boots: + name: '&5Roughspun Boots' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_roughspun_chestplate: + name: '&5Roughspun Chestplate' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_roughspun_helmet: + name: '&5Roughspun Helmet' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_roughspun_leggings: + name: '&5Roughspun Leggings' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_ruins_bow: + name: '&8Ruined Bow' + lore: + - An old bow. Might've been good at some point. +primis_ruins_diary_entry: + name: Diary page + lore: + - '... I now regret chasing after the treasure in these ruins.' + - Now that I have fallen and broken my legs, it would seem + - as though I am fated to die under the treasure I sought. + - If only I had paid more attention during parkour class! +primis_ruin_relic_boots: + name: '&bRuin Relic Boots' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_ruin_relic_chestplate: + name: '&bRuin Relic Chestplate' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_ruin_relic_helmet: + name: '&bRuin Relic Helmet' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_ruin_relic_leggings: + name: '&bRuin Relic Leggings' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_rusty_mail_boots: + name: '&3Rusty Mail Boots' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_rusty_mail_chestplate: + name: '&3Rusty Mail Chestplate' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_rusty_mail_helmet: + name: '&3Rough Mail Helmet' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_rusty_mail_leggings: + name: '&3Rough Mail Leggings' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_starter_boots: + name: '&4Shipwreck''s Boots' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_chestplate: + name: '&4Shipwreck''s Chestplate' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_helmet: + name: '&4Shipwreck''s Helmet' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_leggings: + name: '&4Shipwreck''s Leggings' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_sword: + name: '&4Shipwreck''s Sword' + lore: + - '&aPossibly improvised from the beached remains of a ship!' +primis_storm_temple_drop_axe: + name: '&bStorm Axe' + lore: + - '&bThe wind shall repel them.' +primis_storm_temple_drop_boots: + name: '&bStorm Boots' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_storm_temple_drop_charm: + name: '&bStorm Necklace' + lore: + - '&bThe power of the storm.' +primis_storm_temple_drop_chestplate: + name: '&bStorm Chest-plate' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_storm_temple_drop_helmet: + name: '&bStorm Helmet' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_storm_temple_drop_leggings: + name: '&bStorm Leggings' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_terravilla_big_trouble_in_little_pub_reward_leggings: + name: '&eEarth''s Blessing' + lore: + - '&eLooks heavy but it is' + - '&esurprisingly light.' + - '&eIt is clear that these' + - '&eleggings are at least a' + - '&efew centuries old.' +primis_terravilla_drowning_terror_reward_charm: + name: '&aFish Charm' + lore: + - '&aFishy.' +primis_terravilla_hog_on_my_porch_reward_helmet: + name: '&6Hog Helmet' + lore: + - '&6Made out of tough Razorback leather.' +primis_terravilla_perfect_sample: + name: '&ePerfect Sample' + lore: + - '&eIt looks like a fish...' + - '&eBut it sure isn''t...' +primis_terravilla_strike_the_earth_reward_sword: + name: '&5Earth Splitter' + lore: + - '&5You pulled this blade out of' + - '&5the Earth Elementals corpse.' + - '&5Unlike it''s dull twin, this' + - '&5blade is in pristine condition.' +primis_terravilla_taking_out_the_trash_reward_sword: + name: '&9Earth Splitter' + lore: + - '&9Looks ancient and dull.' +primis_terravilla_two_legged_terror_growth: + name: '&eTwo Legged Terror Growth' + lore: + - '&eLarge fleshy growth.' +primis_terravilla_two_legged_terror_sample: + name: '&eTwo Legged Terror Sample' + lore: + - '&eIt''s a simple sample.' +primis_wolf_hide_boots: + name: '&5Wolf Hide Slippers' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_wolf_hide_chestplate: + name: '&5Wolf Hide Gambeson' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_wolf_hide_helmet: + name: '&5Wolf Hide Helmet' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_wolf_hide_leggings: + name: '&5Wolf Hide Pants' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +pufferfish_drop_helmet: + name: '&bPuffer Helm' + lore: + - '&bOnce a fish, now a helmet.' +rabbit_charm: + name: '&4Charme do coelho' + lore: + - '&aCom este encanto, quase' + - '&aqualquer destino é apenas um salto,' + - '&askip e um pulo de distância!' +rabbit_wolf_drop_chestplate: + name: '&6Electrically Charged Chestplate' + lore: + - '&6As long as you don''t mind a' + - '&6casual zap here and there.' +rabbit_wolf_drop_leggings: + name: '&6Flame Licked Leggings' + lore: + - '&6Just lightly scorched.' +regular_hoglin_drop_boots: + name: '&eHog Boots' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_chestplate: + name: '&eHog Armor' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_helmet: + name: '&eHog Hood' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_leggings: + name: '&eHog Leggings' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +rod_of_the_depths: + name: '&3Rod of the Depths' + lore: + - '&3You want to hear about where' + - '&3I got this from? Sit down lad,' + - '&3I''ve got a tale for ye...' +rotting_diver_drop_hoe: + name: '&bDivers Hoe' + lore: + - '&bFound on the Rotting Divers corpse.' +salamander_charm: + name: '&aCharme da salamandra' + lore: + - '& aQuase tão quente quanto o CaraDoMagma' + - '&nova mixtape!' +salty_corpse_drop_helmet: + name: '&aStinky Helm' + lore: + - '&aYou''re not sure why' + - '&ayou decided to pull' + - '&athis off of the corpse.' +scorpion_charm: + name: '&bCharme do escorpião' + lore: + - '&aFlutuar como uma borboleta,' + - '&aComo uma picada de uma abelha,' + - '&avenenoso como uma batata!' +shulker_charm: + name: '&bCharme do shulker' + lore: + - '&aEu consigo voar' + - '&aEu acredito que posso tocar o céu' + - '&aE você vem comigo!' +skeleton_knight_drop_helmet: + name: '&fKnights Honor' + lore: + - '&fA knights helmet. Made to last.' +sky_archer_drop_bow: + name: '&aSky Bow' + lore: + - '&aGood for keeping phantoms at bay.' +slowpoke_charm: + name: '&bAmuleto Lento' + lore: + - '&aVamos torcer para que não acerte' + - '&e em sua confusão...' +spider_knight_drop_helmet: + name: '&aSmall Helmet' + lore: + - '&aA decent helmet. Maybe, a bit tight.' +stacked_bones_drop_helmet: + name: '&6Skull' + lore: + - '&6Large enough to fit your' + - '&6head inside, so why not.' +summon_merchant_scroll: + name: '&6Invocar Pergaminho do Comerciante' + lore: + - '&aPrecisa vender um item?' + - '&aClique com o botão direito para ativar' + - '&aou grite &9Jeeves!' +summon_wolf_scroll: + name: '&6Invocar Pergaminho de Lobo' + lore: + - '&aConvoca um bom menino' + - '¶ ajudá-lo a morder Elites!' + - '&aCertifique-se de acariciá-lo!' +super_mite_drop_charm: + name: '&dMite Pearl' + lore: + - '&dWas it worth it...' +air_ship_air_buccaneer_boots: + name: '&5Air Bucanneer''s Boots' + lore: + - '&dPerfect for air raids!' +air_ship_air_buccaneer_chestplate: + name: '&5Air Bucanneer''s Chestplate' + lore: + - '&dPerfect for air raids!' +air_ship_air_buccaneer_helmet: + name: '&5Air Bucanneer''s Helmet' + lore: + - '&dPerfect for air raids!' +air_ship_air_buccaneer_leggings: + name: '&5Air Bucanneer''s Leggings' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_boots: + name: '&5Air Pirate''s Boots' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_chestplate: + name: '&5Air Pirate''s Chestplate' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_helmet: + name: '&5Air Pirate''s Helmet' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_leggings: + name: '&5Air Pirate''s Leggings' + lore: + - '&dPerfect for air raids!' +air_ship_bowsmans_bow: + name: '&2Bowsman''s Bow' + lore: + - '&aDropped by the late' + - '&aairship bowsman!' +air_ship_cannon_powder: + name: '&cCannon Powder' + lore: + - '&8How else are you supposed' + - '&8to light the fuse?' +air_ship_daveys_digger: + name: '&4Davey''s Digger' + lore: + - '&cDavey doesn''t desire downtrodden' + - '&cdunderheads displaying his digger.' +air_ship_quartermasters_whip: + name: '&fQuartermaster''s Whip' + lore: + - '&7The quartermaster has a ' + - '&7schedule to keep.' +air_ship_wayfinders_windlass: + name: '&3Wayfinder''s Windlass' + lore: + - '&bUsed to guide ships' + - '&bwith nothing but the stars!' +pirate_ship_sea_feast: + name: '&6Sea feast' + lore: + - '&6A feast for the eyes' + - '&6and the health bar!' +pirate_ship_sea_ration: + name: '&eSea ration' + lore: + - '&eAn apple a day' + - '&ekeep the scurvy away' + - '&cNote: it does not' +catacombs_tier_10_miniboss_boots: + name: '&9Spiderweave boots' + lore: + - '&5As light as air!' +catacombs_tier_10_miniboss_spider_eye: + name: '&7Terragog''s eye' + lore: + - '&7Whispers from nowhere reach' + - '&7your ears while holding this...' +catacombs_tier_15_boss_bone: + name: The Picker + lore: + - '&fYou''ve got a bone to pick!' +catacombs_tier_15_boss_bow: + name: '&6The Bone Shaker' + lore: + - '&fThey''ll feel this one down to' + - '&ftheir bones!' +catacombs_tier_15_boss_shovel: + name: '&8Gravedigger' + lore: + - '&fThey''ll feel this one down to' + - '&ftheir bones!' +catacombs_tier_15_mimic_boss_shield: + name: '&3Shield of the lost Templar' + lore: + - Found in a mysterious chest in a + - secret room of ancient catacombs... +colosseum_pit_breaker: + name: '&4Pit Shatterer' + lore: + - '&4Veni' +colosseum_pit_filler: + name: '&4&lPit Filler' + lore: + - '&4Vici' +colosseum_pit_maker: + name: '&4&lPit Maker' + lore: + - '&4Vidi' +dark_cathedral_tier_75_sword: + name: '&0Cursed Sword' + lore: + - '&0&kChtulhu is the one true God.' + - '&0&kThis world is but a lamb' + - '&0&kto the slaughter' +darkspire_arzags_boots: + name: '&8Arzag''s War Boots' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_chestplate: + name: '&8Arzag''s War Chestplate' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_helmet: + name: '&8Arzag''s War Helmet' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_leggings: + name: '&8Arzag''s War Leggings' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_slicer: + name: '&8Arzag''s Slicer' + lore: + - '&7Once used by the might Arzag!' +darkspire_crypt_keepers_boots: + name: '&4Crypt Keeper''s Boots' + lore: + - '&cFormerly the boots of the' + - '&ccorrupt Crypt Keeper!' +darkspire_hellraisers_battle_armor: + name: '&4Eerbix''s Battle Armor' + lore: + - '&cFormerly the battle' + - '&carmor of the egregious' + - '&cEerbix the Fallen!' +darkspire_maalkvs_bow: + name: '&4Maalkv''s Bow' + lore: + - '&cFormerly the bow of the' + - '&cmischievous Maalkv!' +darkspire_netherite_axe: + name: '&8Void Eviscerator' + lore: + - '&8Shards of the void itself were' + - '&8collected to form the cleaving' + - '&8head of this ancient weapon.' +darkspire_nicolas_ribcages_helmet: + name: '&4Nicolas Ribcage''s Helmet' + lore: + - '&cFormerly the helmet of the' + - '&cnefarious Nicolas Ribcage!' +darkspire_oroxaks_sword: + name: '&4Oroxak''s Sword' + lore: + - '&cFormerly the sword of the' + - '&codious Oroxak!' +darkspire_zalmurs_leggings: + name: '&4Zalmur''s Leggings' + lore: + - '&cFormerly the leggings of' + - '&cthe zealous Zalmur' + - '&cthe Impslayer!' +the_feller: + name: '&2O Companheiro' + lore: + - '&aMesmo enquanto dorme,' + - '&avocê pode sentir este machado' + - '&aUm verdadeiro pica-pau' +the_great_weaver_drop_charm: + name: '&cWeavers Silk' + lore: + - '&cGreat power is imbued into this silk.' +hallosseum_amazing_treat: + name: '&aAmazing Treat!' + lore: + - '&eAn amazing snack!' +hallosseum_axe_of_beheadings: + name: '&cAxe of Beheadings' + lore: + - '&4Famously used to decapitate a' + - '&4certain headless horseman!' +hallosseum_incredible_treat: + name: '&aIncredible Treat!' + lore: + - '&eAn incredible snack!' +hallosseum_treat: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +hallosseum_treat_v2: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +the_hunter_drop_crossbow: + name: '&aHunter''s Friend' + lore: + - '&aLet the hunt begin.' +northpole_amazing_treat: + name: '&aAmazing Treat!' + lore: + - '&eAn amazing snack!' +northpole_coalbringer: + name: '&8Coalbringer' + lore: + - '&cWhatever I touch' + - '&cStarts to melt in my clutch.' + - '&cI''m too much!' +northpole_frostcaster: + name: '&bFrostcaster' + lore: + - '&7Whatever I touch' + - '&7Turns to snow in my clutch!' + - '&7I''m too much' +northpole_incredible_treat: + name: '&aIncredible Treat!' + lore: + - '&eAn incredible snack!' +northpole_naughty_lister: + name: '&4The Naughty Lister' + lore: + - '&cTakes names. Doesn''t ask twice!' + - '&cHave you been naughty this year?' +northpole_treat: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +northpole_treat_v2: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +the_phantom_drop_chestplate: + name: '&dPhantom Gambison' + lore: + - '&dYou would say it is made out of soft' + - '&dand comfy fibrous cloth, but a blade' + - '&dwould not recoil from striking cloth.' +pirate_ship_tier_15_boots: + name: Pirate Sandals + lore: + - Make you want to + - go to the beach! +pirate_ship_tier_15_bow: + name: Pirate shortbow + lore: + - Perfect for boarding parties! +pirate_ship_tier_15_chestplate: + name: Pirate Shirt + lore: + - No shoes, no shirt + - no problem! +pirate_ship_tier_15_helmet: + name: Pirate Bandana + lore: + - No shoes, no shirt + - no problem! +pirate_ship_tier_15_leggings: + name: Pirate Sash + lore: + - These could use a wash! +pirate_ship_tier_15_sword: + name: Pirate marlinspike + lore: + - Loud and deadly! +pirate_ship_tier_20_miniboss_axe: + name: '&5Cookie''s Tenderizer' + lore: + - '&5You''ll feel that tomorrow!' +pirate_ship_tier_20_miniboss_chestplate: + name: '&5Cookie''s apron' + lore: + - '&5Has seen better days!' +pirate_ship_tier_25_boots: + name: '&aPirate shoes' + lore: + - '&aPerfect for thieving!' +pirate_ship_tier_25_bow: + name: '&aPirate musket' + lore: + - '&aCareful where you point it!' +pirate_ship_tier_25_chestplate: + name: '&aPirate vest' + lore: + - '&aProbably illegally obtained!' +pirate_ship_tier_25_helmet: + name: '&aPirate earrings' + lore: + - '&aWorth enough to pay for' + - '&aa funeral!' +pirate_ship_tier_25_leggings: + name: '&aPirate trousers' + lore: + - '&aFull of gold coins!' +pirate_ship_tier_25_miniboss_helmet: + name: '&5Helmsman''s Eyepatch' + lore: + - '&5How can you see better' + - '&5with it on!?' +pirate_ship_tier_25_miniboss_trident: + name: '&5Helmsman''s Trident' + lore: + - '&5Pointy end towards the enemy!' +pirate_ship_tier_25_sword: + name: '&aPirate cutlass' + lore: + - '&aTruly piratey!' +pirate_ship_tier_30_miniboss_axe: + name: '&5Crushy''s Chopper' + lore: + - '&5Step back!' +pirate_ship_tier_30_miniboss_shield: + name: '&5Crushy''s Shoulder' + lore: + - '&5Never skipped shoulder day!' +pirate_ship_tier_35_boots: + name: '&9Pirate boots' + lore: + - '&9Perfect for swashbuckling!' +pirate_ship_tier_35_bow: + name: '&9Pirate handcannon' + lore: + - '&9Blast em away!' +pirate_ship_tier_35_chestplate: + name: '&9Pirate straps' + lore: + - '&9Perfect for looting!' +pirate_ship_tier_35_helmet: + name: '&9Pirate eyepatch' + lore: + - '&9Not perfect for seeing!' +pirate_ship_tier_35_leggings: + name: '&9Pirate greaves' + lore: + - '&9Perfect for looting!' +pirate_ship_tier_35_miniboss_boots: + name: '&9Bodyguard''s boots' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_chestplate: + name: '&5Bodyguard''s straps' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_crossbow: + name: '&5Bodyguard''s handcannon' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_helmet: + name: '&5Bodyguard''s eyepatch' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_leggings: + name: '&5Bodyguard''s greaves' + lore: + - '&9For those with something to defend!' +pirate_ship_tier_35_miniboss_sword: + name: '&5Bodyguard''s cutlass' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_sword: + name: '&9Pirate cutlass' + lore: + - '&9Truly piratey!' +pirate_ship_tier_40_miniboss_crossbow: + name: '&5The Blunderbuss' + lore: + - '&5Spray ''n pray!' +pirate_ship_tier_40_miniboss_leggings: + name: '&5The Zaggers' + lore: + - '&5When they think you''re going!' + - '&5to zig, zag on them!' +pirate_ship_tier_45_boss_helmet: + name: '&5Captain''s eyepatch' + lore: + - '&5I don''t see any issues!' +pirate_ship_tier_45_boss_sword: + name: '&5Captain''s scimitar' + lore: + - '&5En garde, ye scurvy rats!' +the_ruins_boss_loot: + name: '&6Thor''s Axe' + lore: + - Only the pure of heart + - can wield this axe. +sewer_drowned_kings_boots: + name: '&4Drowned King''s Boots' + lore: + - '&cFormerly the boots of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_chestplate: + name: '&4Drowned King''s Chestplate' + lore: + - '&cFormerly the chestplate of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_crown: + name: '&4Drowned King''s Crown' + lore: + - '&cFormerly the crown of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_leggings: + name: '&4Drowned King''s Leggings' + lore: + - '&cFormerly the leggings of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_trident: + name: '&4Drowned King''s Trident' + lore: + - '&cFormerly the trident of the' + - '&cdevilish Drowned King!' +sewer_spelunkers_boots: + name: '&2Sewer Spelunker''s Boots' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential leggings!' +sewer_spelunkers_chestplate: + name: '&2Sewer Spelunker''s Chestplate' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential chestplate!' +sewer_spelunkers_helmet: + name: '&2Sewer Spelunker''s Helmet' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential helmet!' +sewer_spelunkers_leggings: + name: '&2Sewer Spelunker''s Leggings' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential leggings!' +sewer_spelunkers_sword: + name: '&2Sewer Spelunker''s Sword' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential sword!' +the_stinger: + name: '&eThe Stinger' + lore: + - '&aFlutuar como uma borboleta,' + - '&aComo uma picada de uma abelha!' +tree_defender_drop_shield: + name: '&7Living Wood Shield' + lore: + - '&7This shield will' + - '&7slowly repair itself.' +unbind_scroll: + name: '&5Desvincular pergaminho' + lore: + - '&5Permite que os usuários desvinculem um' + - '&5item de alma em uma bigorna!' + - '&5Use com sabedoria!' +undead_farmer_drop_shovel: + name: '&8Manure Master' + lore: + - '&8Perfect for shoveling pig manure.' +unwanted_visitor_drop_bow: + name: '&1Frost Bow' + lore: + - '&9Makes you wanna chill' + - '&9and snipe from afar.' +vampire_manor_gargoyle_granulator: + name: '&8Gargoyle Granulator' + lore: + - '&cLightly dusted in garlic.' +vampire_manor_stake_your_claim: + name: '&4Stake your Claim' + lore: + - '&cLightly dusted in garlic.' +vampiric_charm: + name: '&bFeitiço Vampírico' + lore: + - '&aNinguém consegue se lembrar onde isso' + - '& veio de, e ninguém pode,' + - '& Esqueça o quão perigoso é...' +veterans_boots: + name: '&6Veteran''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_chestplate: + name: '&6Veteran''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_helmet: + name: '&6Veteran''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_leggings: + name: '&6Veteran''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_sword: + name: '&6Veteran''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +vex_top_drop_boots: + name: '&bVexed Boots' + lore: + - '&bWith mighty boots' + - '&bcomes mighty strength.' +warlock_drop_chestplate: + name: '&dWarlock Robes' + lore: + - '&dOffers good protection from spells.' +warlock_drop_helmet: + name: '&dWarlock Hood' + lore: + - '&dOffers good protection from spells.' +water_pest_drop_shield: + name: '&bWater Logged Shield' + lore: + - '&bIt''s pretty sturdy actually.' +wendigo_drop_sword: + name: '&8Blade of Starving' + lore: + - '&8This blade will always' + - '&8hunger for more blood.' +werehare_drop_charm: + name: '&eWerehare Trophy' + lore: + - '&eLuck and health to' + - 'ðose who carry it.' +werewolf_bone: + name: '&6Werewolf Bone' + lore: + - '&aHaving killed the alpha,' + - '&athis temporarily makes you!' + - '&athe wolves'' new leader' +wolfsbane: + name: '&7Wolfsbane' + lore: + - '&aMade from the remains of' + - '&aan alpha werewolf, all' + - '&awolves cower at the sight of it.' +yeti_drop_leggings: + name: '&eFur Leggings' + lore: + - '&eNice and warm.' +yezhi_baba_drop_boots: + name: '&aWitches Robes' + lore: + - '&aThe smell should go' + - '&aaway eventually.' +zombie_kings_axe: + name: '&4Machado do Rei Zumbi' + lore: + - O machado de O Zumbi + - chame o rei deles. + - A sede de sangue é palpável. +airship_minidungeon: + name: '&6O Dirigível' + customInfo: + - '&fUm incrível dirigível cheio de piratas mortos-vivos!' + - '&6Créditos: MagmaGuy, 69OzCanOfBepis' + - '&6e Reino de Lotheridon' + playerInfo: |- + Dificuldade: &6Médio + $bossCount chefes, de nível $lowestTier a $highestTier + &6Um dirigível incrível cheio de piratas morto-vivos + &6para jogadores experientes! + regionEnterMessage: '&8[EM] &cEntrando na zona aérea hostil!' + regionLeaveMessage: '&8[EM] Deixando a zona aérea hostil!' +binder_of_worlds_lair: + name: '&5Binder Of Worlds' + customInfo: + - '&5O desafio final. Esteja preparado!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Dificuldade: &6 Pesadelo + $bossCount level $highestTier chefe final! + &5Esta é a luta mais difícil em EliteMobs! + regionEnterMessage: '&8[EM] &5A realidade se desenrola ao seu redor. Você enfrenta o desafio final. &4Você não está preparado!' + regionLeaveMessage: '&8[EM] &5Você deixou o desenrolar. Encontrou o que procurava? Valeu a pena?' +catacombs_lair: + name: '&8The Catacombs' + customInfo: + - '&fA melhor masmorra inicial para jogadores!' + - '&6Créditos: Reino de Lotheridon' + playerInfo: |- + Difficulty: &cHard + $bossCount bosses, from tier $lowestTier to $highestTier + &2The best Lair challenge for groups of beginners! + regionEnterMessage: '&8[EM] &8Entrando nas Catacumbas. Tenha cuidado com o que habita aqui embaixo...' + regionLeaveMessage: '&8[EM] &8Você saiu das Catacumbas. Valeu a pena?' +colosseum_lair: + name: '&6O Coliseu' + customInfo: + - '&Apresentando o primeiro verdadeiro chefe do mundo, primeiro' + - '&fluta de várias fases, primeiro chefe montado,' + - '&fprimeiro chefe disfarçado... uma luta verdadeiramente épica!' + - '&6Créditos: MagmaGuy e Maldini' + playerInfo: |- + Difficulty: &cHard + $bossCount bosses, from level $lowestTier to $highestTier + &cA true challenge for big groups of players! + regionEnterMessage: '&8[EM] &6Campeões e adversários preparem-se! &eProve seu valor contra o mais poderoso dos inimigos!' + regionLeaveMessage: '&8[EM] &6Adeus viajante! &eRetorne em breve para mostrar sua força novamente!' +dark_cathedral_lair: + name: '&8A Catedral Sombria' + customInfo: + - '&fO primeiro covil do EliteMobs!' + - '&fUm clássico que todos os servidores precisam!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &cHard + $bossCount level $highestTier Big Boss! + &cThe original minidungeon, a challenge for + &ca group of players or for veterans! + regionEnterMessage: '&8[EM] &8Bem-vindo à Catedral Sombria. &4A morte te espera aqui dentro...' + regionLeaveMessage: '&8[EM] &8Saindo da Catedral Sombria. &4Ela espera o seu retorno...' +dark_spire_minidungeon: + name: '&8OPináculo Escuro' + customInfo: + - '&fO primeiro nível de conteúdo alto!' + - '&fFeito para aqueles que querem um desafio real!' + - '&6Credits: 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &cA vast challenge for advanced players! + regionEnterMessage: '&8[EM] &1Uma invasão está em andamento. &9Parar a insurreição!' + regionLeaveMessage: '&8[EM] &1Você conseguiu impedi-los. &9Por enquanto...' +fireworks_lair: + name: '&aFireworks' + customInfo: + - '&fThe 2021 4th of July map!' + - '&6Credits: MagmaGuy' + playerInfo: |- + Difficulty: &cHard + $bossCount level $lowestTier Big Boss! + &6An encounter full of explosions! + regionEnterMessage: '&8[EM] &eWelcome to the fireworks show!' + regionLeaveMessage: '&8[EM] &eYou''ve left the party!' +frost_palace_sanctum: + name: Frost Palace + customInfo: + - '&fA 7 phase fight against' + - the queen of ice! + - '&6Credits: MagmaGuy, Delio' + playerInfo: 'Difficulty: &45-man hard content!' + regionEnterMessage: '&bYou are stepping into the Frost Palace! Stay frosty!' + regionLeaveMessage: '&bYou have left the Frost Palace!' +hallosseum_lair: + name: '&cHallisseum' + customInfo: + - '&fO encontro assustador de Halloween de 2020!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &chard + $bossCount level $lowestTier Big Boss! + &6A fun Halloween challenge! + regionEnterMessage: '&8[EM] &4Doces ou travessuras! &8Sua alma é minha!' + regionLeaveMessage: '&8[EM] &4Você escapou com sua alma intacta.' +invasion_minidungeon: + name: '&2The Invasion' + customInfo: + - '&fThe Halloween Minidungeon!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount aliens, from level $lowestTier to $highestTier + &6Don't get abducted! + regionEnterMessage: '&8[EM] &7Alien invasion in progress! Defeat the Mothership!' + regionLeaveMessage: '&8[EM] &7You have escaped the alien abductions! No one will ever believe you.' +north_pole_minidungeon: + name: '&9The North Pole' + customInfo: + - '&fA minimasmorra de Natal!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Dificuldade: &6Média + $bossCount chefes, do nível $lowestTier a $highestTier + &6Natal em um globo de neve! + regionEnterMessage: '&8[EM] &7Você alcançou o Pólo Norte! &fVocê foi travesso este ano?' + regionLeaveMessage: '&8[EM] &7Volte e visite. &fHá muitos doces e guloseimas para a próxima vez!' +oasis_adventure: + name: '&6O Oásis' + customInfo: + - '&f uma enorme aventura para iniciantes!' + - '&6Credits: 69OzCanOfBepis' + playerInfo: |- + Difficulty: &2Solo-able + $bossCount bosses, from level $lowestTier to $highestTier + &6A big adventure for people who know the ropes! + regionEnterMessage: '&8[EM] &6Você chegou ao Oásis!' + regionLeaveMessage: '&8[EM] &6Você chegou ao Oásis!' +pirate_ship_minidungeon: + name: '&6O Navio Pirata' + customInfo: + - '&fA divertida e desafiadora Masmorra cheia de' + - '&fchefes feitos para os jogadores começarem a ficar fortinhos' + - '&f Contra Mobs de Elite!' + - '&6Créditos: MagmaGuy e Realm of Lotheridon' + playerInfo: |- + Dificuldade: &6Médio + $bossCount Chefões, do nível $lowestTier a $highestTier + &6um dos melhores locais de caça para aventureiros aspirantes! + regionEnterMessage: '&8[EM] &3Agora embarcando no Navio Pirata! &Billager!' + regionLeaveMessage: '&8[EM] Atalho do jogador! &bReturn quando tiver ganhado a luminosidade dos seus olhos nas pernas do mar!' +primis_adventure: + name: '&7Primis' + customInfo: + - '&fA tutorial adventure for new players!' + - '&6Credits: 69OzCanOfBepis, MagmaGuy' + playerInfo: |- + Difficulty: &2Easy + $bossCount bosses, from level $lowestTier to $highestTier + &6A tutorial adventure for new players! + regionEnterMessage: '&8[EM] &6Primis awaits, strike the earth!' + regionLeaveMessage: '&8[EM] &6You have left Primis!' +sewers_minidungeon: + name: '&8Os Esgotos' + customInfo: + - '&fA maior minimasmorra já feita!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Dificuldade: &6medio + $bossCount chefões, do level $lowestTier ate $highestTier + &6A labirinto complexo de masmorras com seções desafiadoras! + regionEnterMessage: '&8[EM] &5Este lugar parece abandonado... &dNo entanto, algo se esconde nesses esgotos!' + regionLeaveMessage: '&8[EM] &5Você conseguiu ficar acima da água. &dTalvez da próxima vez você se afogue.' +the_ruins: + name: '&6The Ruins' + customInfo: + - '&fA fight against a myth from' + - '&fNorse mythology, be prepared for a smiting!' + - '&6Credits: 69OzCanOfBepis, MagmaGuy' + playerInfo: |- + Difficulty: &cHard + $bossCount level $lowestTier Big Boss! + &cA tough fight against a Norse god! + regionEnterMessage: '&8[EM] &3Those who challenge the myths must be prepared for their downfall!' + regionLeaveMessage: '&8[EM] &3You now know what it takes to make a legend!' +vampire_manor: + name: '&cThe Vampire Manor' + customInfo: + - '&fPrepare to spill blood!' + - '&6Créditos: MagmaGuy, 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &6A deadly manor full of blood thristy creatures! + &6Are you ready to face that which haunts the night? + regionEnterMessage: '&8[EM] &cTrespassing on dangerous grounds!!' + regionLeaveMessage: '&8[EM] &cNow leaving haunted land!' +alpha_werewolf_p1: + name: '$eventBossLevel &7Enraged Vindicator' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Alpha Wolf has been put down!' + - '&c&l 1º em Dano: $damager1name &ccom $damager1damage de dano!' + - '&6&l 2º em Dano: $damager2name &6com $damager2damage de dano!' + - '&e&l 3º em Dano: $damager3name &ecom $damager3damage de dano!' + - '&aMatadores: $players' + - '&e&l---------------------------------------------' + locationMessage: '&7Enraged Vindicator: $distance blocks away!' + spawnMessage: '&cThe howls of an Alpha Werewolf are heard!' + deathMessage: '&aThe Alpha Werewolf has been stopped by $players!' + escapeMessage: '&4Dawn breaks, the Alpha Wolf vanishes without a trace!' +alpha_werewolf_p2: + name: '$eventBossLevel &7Alpha Werewolf' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Alpha Wolf has been put down!' + - '&c&l 1º em Dano: $damager1name &ccom $damager1damage de dano!' + - '&6&l 2º em Dano: $damager2name &6com $damager2damage de dano!' + - '&e&l 3º em Dano: $damager3name &ecom $damager3damage de dano!' + - '&aMatadores: $players' + - '&e&l---------------------------------------------' + locationMessage: '&7Alpha Wolf: $distance blocks away!' + spawnMessage: '&cThe howls of an Alpha Werewolf are heard!' + deathMessage: '&aThe Alpha Werewolf has been stopped by $players!' + escapeMessage: '&4Dawn breaks, the Alpha Wolf vanishes without a trace!' +ancient_corpse: + name: '$eventBossLevel &eAncient Corpse' +animated_armor: + name: '$eventBossLevel &8Animated Armor' + locationMessage: '&cAnimated Armor: $distance blocks away!' + spawnMessage: '&cOh no! An Animated Armor has escape from it''s armor stand!' + deathMessage: '&aThe Animated Armor was stopped by $players!' + escapeMessage: '&4The Animated Armor is gone!' +arachnid_matriarch: + name: '$eventBossLevel &cArachnid Matriarch' + locationMessage: '&cArachnid Matriarch: $distance blocks away!' + spawnMessage: '&cA Matriarch has come to spread her brood across the land!' + deathMessage: '&aThe Matriarch and her brood were stopped by $players!' + escapeMessage: '&4The Matriarch has left!' +arachnid_matriarch_summon: + name: '$eventBossLevel &4Broodling' +armor_goblin: + name: '$eventBossLevel &3Armor Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Armor Goblin has been pillaged!' + - '&c&l 1º em Dano: $damager1name &ccom $damager1damage de dano!' + - '&6&l 2º em Dano: $damager2name &6com $damager2damage de dano!' + - '&e&l 3º em Dano: $damager3name &ecom $damager3damage de dano!' + - '&aMatadores: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cArmor Goblin: $distance blocks away!' + spawnMessage: '&cAn Armor Goblin has been sighted!' + deathMessage: '&aAn Armor Goblin has been slain by $players!' + escapeMessage: '&4An Armor Goblin has escaped!' +baba_rhoga: + name: '$eventBossLevel &cBaba Rhoga' + locationMessage: '&cBaba Rhoga: $distance blocks away!' + spawnMessage: '&cA wicked hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +baba_rhoga_summon: + name: '$reinforcementLevel &4Baba Rhoga' +baba_yaga: + name: '$eventBossLevel &cBaba Yaga' + locationMessage: '&cBaba Yaga: $distance blocks away!' + spawnMessage: '&cA wicked hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +baba_yaga_summon: + name: '$reinforcementLevel &4Baba Yaga' +balloon_rider: + name: '$eventBossLevel &dBalloon Rider' + locationMessage: '&cBalloon Rider: $distance blocks away!' + spawnMessage: '&cA brave Balloon Rider has come to the Nether!' + deathMessage: '&aThe Balloon Rider has taken his last ride thanks to $players!' + escapeMessage: '&4The Balloon Rider has floated away!' +balloon_rider_mount: + name: '$eventBossLevel &5Ghastly Balloon' +balrog: + name: '$eventBossLevel &4Balrog' +banshee: + name: '$eventBossLevel &cBanshee' + locationMessage: '&cBanshee: $distance blocks away!' + spawnMessage: '&cA Banshee''s wail can be heard!' + deathMessage: '&aThe Banshee was silenced by $players!' + escapeMessage: '&4The Banshee has left!' +banshee_summon: + name: '$eventBossLevel &cGrief' +beast_master: + name: '$eventBossLevel &6Beast Master' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Beast Master has been savaged!' + - '&c&l 1º em Dano: $damager1name &ccom $damager1damage de dano!' + - '&6&l 2º em Dano: $damager2name &6com $damager2damage de dano!' + - '&e&l 3º em Dano: $damager3name &ecom $damager3damage de dano!' + - '&aMatadores: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cBeast Master: $distance blocks away!' + spawnMessage: '&cThe Beast Master has been sighted!' + deathMessage: '&aThe Best Master has been slain by $players!' + escapeMessage: '&4The Beast Master has returned to the wilds!' +beast_tamer: + name: '$eventBossLevel &eBeast Tamer' + locationMessage: '&cBeast Tamer: $distance blocks away!' + spawnMessage: '&cA master of beasts roams the world!' + deathMessage: '&aThe Beast Tamer was stopped by $players!' + escapeMessage: '&4The Beast Tamer has left!' +beast_tamer_summon: + name: '$eventBossLevel &6Large Beast' +beast_tamer_summon_1: + name: '$eventBossLevel &6Beast' +beta_wolf: + name: '$reinforcementLevel &7Beta Wolf' +bigfoot: + name: '$eventBossLevel &fBigfoot' + locationMessage: '&cBigfoot: $distance blocks away!' + spawnMessage: '&cA mighty beast has appeared!' + deathMessage: '&aThe beast is no more thanks to $players!.' + escapeMessage: '&4The beast has escaped!' +big_bad_wolf: + name: '$eventBossLevel &fBig Bad Wolf' + locationMessage: '&cBig Bad Wolf: $distance blocks away!' + spawnMessage: '&cAnd he huffed and he puffed!' + deathMessage: '&aThe little piggies are now safe thanks to $players!' + escapeMessage: '&4The Big Bad Wolf has left!' +binder_of_worlds_phase_1_endermite_reinforcement: + name: '$reinforcementLevel &5Reality Corruptor' +binder_of_worlds_phase_3_enderman_reinforcement: + name: '$reinforcementLevel &5Reality Slayer' +binder_of_worlds_phase_3_ghast_reinforcement: + name: '$reinforcementLevel &5Destruidor de Realidade ' +blayyze: + name: '$eventBossLevel &6Blayyze' + deathMessages: + - '&e&l---------------------------------------------' + - '&6O Blayyze foi repelido!' + - '&c&l 1º em Dano: $damager1name &ccom $damager1damage de dano!' + - '&6&l 2º em Dano: $damager2name &6com $damager2damage de dano!' + - '&e&l 3º em Dano: $damager3name &ecom $damager3damage de dano!' + - '&aMatadores: $players' + - '&e&l---------------------------------------------' + locationMessage: '&6????: $distance blocos de distância' + spawnMessage: '&cAlguma coisa saiu da cratera do meteorito...' + deathMessage: '&6$players completou o primeiro contato.' + escapeMessage: '&6Os ayyliens foram levados para área 51!' +bloated_jeffrey: + name: '$eventBossLevel &dBloated Jeffrey' + locationMessage: '&cBloated Jeffrey: $distance blocks away!' + spawnMessage: '&cIt''s Jeffrey! They are in the nether! Bring a bow!' + deathMessage: '&aBloated Jeffrey has been slain by $players!' + escapeMessage: '&4Jeffrey and his friends grew bored and they left!' +bloated_jeffrey_summon: + name: '$eventBossLevel &dJeffrey''s Friend' +bone_fiend: + name: '$eventBossLevel &7Bone Fiend' + locationMessage: '&cBone Fiend: $distance blocks away!' + spawnMessage: '&cA creature of bone and bone has appeared!' + deathMessage: '&aThe Bone Fiend was defeated by $players!' + escapeMessage: '&4The Bone Fiend found no bone and left!' +bone_fiend_mount: + name: '$eventBossLevel &8Bone Carrier' +changeling: + name: '$eventBossLevel &4Changeling' + locationMessage: '&cChangeling: $distance blocks away!' + spawnMessage: '&cA shape-shifter has entered this world.' + deathMessage: '&aThe Changeling was stopped by $players!' + escapeMessage: '&4The Changeling has escaped!' +changeling_p2: + name: '$eventBossLevel &4Changeling' +changeling_p3: + name: '$eventBossLevel &4Changeling' +changeling_p4: + name: '$eventBossLevel &4Changeling' +changeling_p5: + name: '$eventBossLevel &4Changeling' +changeling_p6: + name: '$eventBossLevel &4Changeling' +changeling_p7: + name: '$eventBossLevel &4Changeling' +charms_goblin: + name: '$eventBossLevel &2Charms Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Charms Goblin has been pillaged!' + - '&c&l 1º em Dano: $damager1name &ccom $damager1damage de dano!' + - '&6&l 2º em Dano: $damager2name &6com $damager2damage de dano!' + - '&e&l 3º em Dano: $damager3name &ecom $damager3damage de dano!' + - '&aMatadores: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cCharms Goblin: $distance blocks away!' + spawnMessage: '&cA Charms Goblin has been sighted!' + deathMessage: '&aA Charms Goblin has been slain by $players!' + escapeMessage: '&4A Charms Goblin has escaped!' +circus_ringmaster: + name: '$eventBossLevel &dRingmaster' + locationMessage: '&cCircus Ringmaster: $distance blocks away!' + spawnMessage: '&cA terrible circus is in town!' + deathMessage: '&a$players has stopped the RIngmasters reign of abuse!' + escapeMessage: '&4The circus has left town!' +circus_ringmaster_summon: + name: '$eventBossLevel &5Tortured Animal' +circus_ringmaster_summon_1: + name: '$eventBossLevel &5Abused Clown' +circus_ringmaster_summon_2: + name: '$eventBossLevel &5Mistreated Balloon' +coins_goblin: + name: '$eventBossLevel &eCoins Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Coins Goblin has been pillaged!' + - '&c&l 1º em Dano: $damager1name &ccom $damager1damage de dano!' + - '&6&l 2º em Dano: $damager2name &6com $damager2damage de dano!' + - '&e&l 3º em Dano: $damager3name &ecom $damager3damage de dano!' + - '&aMatadores: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cCoins Goblin: $distance blocks away!' + spawnMessage: '&cA Coins Goblin has been sighted!' + deathMessage: '&aA Coins Goblin has been slain by $players!' + escapeMessage: '&4A Coins Goblin has escaped!' +craftenmine_stacked_bones: + name: '$eventBossLevel &eArmed Skull' + locationMessage: '&cDr. Craftenmine''s Stacked Bones: $distance blocks away!' + spawnMessage: '&cA horrible Dr. Craftenmine creation is out in the wild!' + deathMessage: '&aThe horrible Stacked-Bones creation was slain by $players!' + escapeMessage: '&4Dr. Craftenmines horrible creation has escaped!' +craftenmine_stacked_bones_ankle: + name: '$eventBossLevel &6Armed Ankle' +craftenmine_stacked_bones_backbone: + name: '$eventBossLevel &6Armed Backbone' +craftenmine_stacked_bones_femur: + name: '$eventBossLevel &6Armed Femur' +craftenmine_stacked_bones_spine: + name: '$eventBossLevel &6Armed Spine' +craftenmine_terror: + name: '$eventBossLevel &cLobotimized Ghast' + locationMessage: '&cDr. Craftenmine''s Terror: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine creation is on the loose!' + deathMessage: '&aThe Lobotimized Ghast was slain by $players!' + escapeMessage: '&4The Lobotimized Ghast has left!' +craftenmine_terror_mount: + name: '$eventBossLevel &dGhast Carrier' +creeperpede_1: + name: '$eventBossLevel &5Creeperpede Observer' + locationMessage: '&cCreeperpede: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine experiment is on the loose!' + deathMessage: '&aThe Creeperpede was stopped in its tracks by $players!.' + escapeMessage: '&4AThe Dr. Craftenmine experiment has managed to escape!' +creeperpede_2: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_3: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_4: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_5: + name: '$eventBossLevel &5Creeperpede Carrier' +crone: + name: '$eventBossLevel &aOld Crone' + locationMessage: '&cOld Crone: $distance blocks away!' + spawnMessage: '&cAn Old Crone has wandered into this world!' + deathMessage: '&aThe Crone was vanquished by $players!.' + escapeMessage: '&4The Old Crone has left this world on her broom!' +crone_summon: + name: '$eventBossLevel &fPet Spider' +divine_cinder: + name: '$eventBossLevel &cDivine Cinder' + locationMessage: '&cDivine Cinder: $distance blocks away!' + spawnMessage: '&cA divine blaze has appeared!' + deathMessage: '&aThe Divine Cinder was defeated by $players!' + escapeMessage: '&4The Divine Cinder has smoked away!' +ember: + name: '$reinforcementLevel &cEmber' +enders_1: + name: '$eventBossLevel &dEnderlad' + locationMessage: '&cEnder Clique: $distance blocks away!' + spawnMessage: '&cA group of ender troublemakers have appeared.' + deathMessage: '&aThe Ender Clique was stopped by $players!' + escapeMessage: '&4The Ender Clique have left!' +enders_2: + name: '$eventBossLevel &dEnderchap' + locationMessage: '&cClique Member: $distance blocks away!' +enders_3: + name: '$eventBossLevel &dEnderdude' + locationMessage: '&cClique Member: $distance blocks away!' +ender_lapin: + name: '$eventBossLevel &aEnder Lapin' +endless_pursuer: + name: '$eventBossLevel &dEndless Pursuer' + locationMessage: '&cEndless Pursuer: $distance blocks away!' + spawnMessage: '&cIt will not stop chasing...' + deathMessage: '&aThe chase has stopped thanks to $players!' + escapeMessage: '&4The Pursuer has vanished!' +enraged_snowman: + name: '$eventBossLevel &1Enraged Snowman' + locationMessage: '&cEnraged Snowman: $distance blocks away!' + spawnMessage: '&cAn angry Snowman was sighted!' + deathMessage: '&aThe Enraged Snowman was put to rest by $players!' + escapeMessage: '&4The Enraged Snowman has vanished!' +evil_undead: + name: '$eventBossLevel &cEvil Undead' + locationMessage: '&cEvil Undead: $distance blocks away!' + spawnMessage: '&cAn Evil Undead has appeared!' + deathMessage: '&aThe Evil Undead was put to rest by $players!' + escapeMessage: '&4The Evil Undead has escaped!' +evil_undead_p2: + name: '$eventBossLevel &cEvil Undead' + locationMessage: '&cEvil Undead: $distance blocks away!' + spawnMessage: '&cAn Evil Undead has appeared!' + deathMessage: '&aThe Evil Undead was put to rest by $players!' + escapeMessage: '&4The Evil Undead has escaped!' +fallen_knight: + name: '$eventBossLevel &7Fallen Knight' + locationMessage: '&cFallen Knight: $distance blocks away!' + spawnMessage: '&cA Fallen Knight rises from their grave!' + deathMessage: '&aA Fallen Knight has fallen to $players!.' + escapeMessage: '&4The Fallen Knight goes back to slumber!' +fine_swine: + name: '$eventBossLevel &eFine Swine' +fine_swine_summon: + name: '$eventBossLevel &eMighty Protector' +firestarter: + name: '$eventBossLevel &6Firestarter' + locationMessage: '&cFirestarter: $distance blocks away!' + spawnMessage: '&cA wicked Firestarter has appeared!' + deathMessage: '&aThe Firestarter was slain by $players!' + escapeMessage: '&4The Firestarter has left!' +firestarter_mount: + name: '$eventBossLevel &6Spark' +fire_conjurer: + name: '$eventBossLevel &eFire Conjurer' + locationMessage: '&cFire Conjurer: $distance blocks away!' + spawnMessage: '&cA master of fire and flame walks this world!' + deathMessage: '&aThe Fire Conjurer was extinguished by $players!' + escapeMessage: '&4The Fire Conjurer has vanished!' +fire_conjurer_summon: + name: '$eventBossLevel &6Summoned Flame' +fire_fae: + name: '$eventBossLevel &cFire Fae' +foreign_visitor: + name: '$eventBossLevel &5Foreign Visitor' + locationMessage: '&cForeign Visitor: $distance blocks away!' + spawnMessage: '&cA visitor from a another dimension has arrived!' + deathMessage: '&a$players has made sure to let the visitor know that they are not welcome here.' + escapeMessage: '&4The visitor has gone back home!' +fox_king_cold: + name: '$eventBossLevel &1Fox King Cold' + locationMessage: '&cFox King Cold: $distance blocks away!' + spawnMessage: '&cA magical creature roams the world.' + deathMessage: '&aFox King Cold was defeated by $players!' + escapeMessage: '&4Fox King Cold has left this world.' +frost_palace_frost_queen_p0: + name: '$bossLevel &8Frost Queen' + locationMessage: '&9Frost Queen' + spawnMessage: '&9The wind howls. The Frost Queen rises up to the challenge.' + deathMessage: '&aThe Frost queen is no more, slain by $players!' +frost_palace_frost_queen_p1: + name: '$bossLevel &8Frost Queen phase 1' + locationMessage: '&9Frost Queen phase 1' +frost_palace_frost_queen_p2: + name: '$bossLevel &8Frost Queen phase 2' + locationMessage: '&9Frost Queen phase 2' +frost_palace_frost_queen_p3: + name: '$bossLevel &8Frost Queen phase 3' + locationMessage: '&9Frost Queen phase 3' +frost_palace_frost_queen_p4: + name: '$bossLevel &8Frost Queen phase 4' + locationMessage: '&9Frost Queen phase 4' +frost_palace_frost_queen_p5: + name: '$bossLevel &8Frost Queen phase 5' + locationMessage: '&9Frost Queen phase 5' +frost_palace_frost_queen_p6: + name: '$bossLevel &8Frost Queen phase 6' + locationMessage: '&9Frost Queen phase 6' +frost_palace_frost_queen_p7: + name: '$bossLevel &8Frost Queen phase 7' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Frost Queen was thawed!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&9Frost Queen phase 7' +frost_palace_reinforcement_1: + name: '$reinforcementLevel Spirit of Winter' +frost_palace_reinforcement_2: + name: '$reinforcementLevel Spirit of Spring' +frost_palace_reinforcement_3: + name: '$reinforcementLevel Spirit of Summer' +fulgora: + name: '$eventBossLevel &3Fulgora' + locationMessage: '&cFulgora: $distance blocks away!' + spawnMessage: '&cA mighty thunder goat has come!' + deathMessage: '&aFulgora was stopped by $players!' + escapeMessage: '&4Fulgora has left this place!' +gamma_werewolf: + name: '$reinforcementLevel &7Gamma Werewolf' +goblin_invader: + name: '$eventBossLevel &2Goblin Leader' + locationMessage: '&cGoblin Army: $distance blocks away!' + spawnMessage: '&cA Goblin Army has invaded this realm!' + deathMessage: '&aThe Goblin Army has been vanquished by $players!' + escapeMessage: '&4The Goblin Army is done with this realm!' +goblin_invader_summon_1: + name: '&2Goblin Warrior' +goblin_invader_summon_2: + name: '&2Goblin Fighter' +goblin_invader_summon_3: + name: '&2Goblin Trooper' +goblin_invader_summon_4: + name: '&2Goblin Reinforcements' +greedy_dwarf: + name: '$eventBossLevel &9Greedy Dwarf' + locationMessage: '&cGreedy Dwarf: $distance blocks away!' + spawnMessage: '&cCan you find the Greedy Dwarf digging somewhere underground?!' + deathMessage: '&aThe Greedy Dwarf was released of their curse by $players!' + escapeMessage: '&4The Greedy Dwarf had found their treasure and they left!' +gremlin_1: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + spawnMessage: '&cA Gremlin hoard has invaded this world!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_10: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_2: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_3: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_4: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_5: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_6: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_7: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_8: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_9: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +grunter: + name: '$eventBossLevel &aGrunter' + locationMessage: '&cGrunter: $distance blocks away!' + spawnMessage: '&cA mighty hog roams the lands.' + deathMessage: '&aGrunter was stopped by $players!' + escapeMessage: '&4Grunter has escaped!' +harmless_chicken: + name: '$eventBossLevel &fHarmless Chick' + locationMessage: '&cHarmless Chick: $distance blocks away!' + spawnMessage: '&cBwok!!! Cluck, Cluck! Bawk!' + deathMessage: '&aBaaaawk! Cluck...$players!' + escapeMessage: '&4Harmless Chicken has baaaaaawked away.' +harmless_chicken_summon: + name: '$eventBossLevel &fClucktector' +hog_rider: + name: '$eventBossLevel &6Hog Rider' + locationMessage: '&cHog Rider: $distance blocks away!' + spawnMessage: '&cA mighty Hog Rider has appeared!' + deathMessage: '&aThe Hog Rider and their Hog were vanquished by $players!' + escapeMessage: '&4The Hog Rider has vanished.' +hog_rider_mount: + name: '$eventBossLevel &eLoyal Hog' +hog_rider_p2: + name: '$eventBossLevel &6Hog Rider' + locationMessage: '&cHog Rider: $distance blocks away!' + deathMessage: '&aThe Hog Rider and their Hog were vanquished by $players!' + escapeMessage: '&4The Hog Rider has vanished.' +hog_rider_summon: + name: '$eventBossLevel &eLoyal Zob-Hog' +horde_champion: + name: '$eventBossLevel &cHorde Champion' + locationMessage: '&cUndead Horde Champion: $distance blocks away!' + spawnMessage: '&cAn undead horde approaches!' + deathMessage: '&aThe horde has been stopped by $players!.' + escapeMessage: '&4AThe undead horde has left!' +horrid_duplicator: + name: '$eventBossLevel &dHorrid Duplicator' + locationMessage: '&cHorrid Duplicator: $distance blocks away!' + spawnMessage: '&cAn endless foe has appeared!' + deathMessage: '&aThe Horrid Duplicator was slain by $players!' + escapeMessage: '&4The Horrid Duplicator has left!' +horrid_duplicator_summon: + name: '$eventBossLevel &dHorrid Duplicator' +horrid_duplicator_summon_1: + name: '$eventBossLevel &dHorrid Duplicator' +ice_fae: + name: '$eventBossLevel &bIce Fae' +imperial_bee_guard: + name: '$reinforcementLevel &eImperial Bee Soldier' +invasion_abducted_hoglin_leader: + name: '$normalLevel &8Abducted Hoglin Leader' +invasion_abducted_pillager_leader: + name: '$normalLevel &8Abducted Pillager Leader' +invasion_abducted_silverfish: + name: '$normalLevel &8Abducted Silverfish' +invasion_abducted_silverfish_leader: + name: '$normalLevel &8Abducted Silverfish' +invasion_abducted_zombie: + name: '$normalLevel &8Abducted Zombie' +invasion_abducted_zombie_leader: + name: '$normalLevel &8Abducted Zombie' +invasion_abductor: + name: '$normalLevel &6Abductor' +invasion_abudcted_pillager: + name: '$normalLevel &8Abducted Pillager' +invasion_analytic_thin_man_1: + name: '$normalLevel &8Analytic Thin Man' +invasion_analytic_thin_man_2: + name: '$normalLevel &8Analytic Thin Man' +invasion_analytic_thin_man_3: + name: '$normalLevel &8Analytic Thin Man' +invasion_analytic_thin_man_4: + name: '$normalLevel &8Analytic Thin Man' +invasion_ballistic_construct: + name: '$minibossLevel &fBallistic Construct' +invasion_convert: + name: '$normalLevel &6Convert' +invasion_energy_construct: + name: '$minibossLevel &fEnergy Construct' +invasion_fire_construct: + name: '$minibossLevel &fFire Construct' +invasion_genetically_modified_cow_phase_1: + name: '$minibossLevel &fGenetically Modified Cow' +invasion_genetically_modified_cow_phase_2: + name: '$minibossLevel &fGenetically Modified Cow' +invasion_gray_man_courthouse_phase_1: + name: '$minibossLevel &7Gray Man' +invasion_gray_man_courthouse_phase_2: + name: '$minibossLevel &7Gray Man' +invasion_green_man_hotel_phase_1: + name: '$bossLevel &2Green Man' +invasion_green_man_hotel_phase_2: + name: '$bossLevel &2Green Man' +invasion_green_man_hotel_phase_3: + name: '$bossLevel &2Green Man' + deathMessage: '&4The &2Green Man &4was vanquished by $players! That''s the end for this version of the map, the inside of the UFO is in the full version!' +invasion_green_man_spaceship_phase_1: + name: '$bossLevel &2Green Man' +invasion_green_man_spaceship_phase_2: + name: '$bossLevel &2Green Man' +invasion_green_man_spaceship_phase_3: + name: '$bossLevel &2Green Man' +invasion_green_man_spaceship_phase_4: + name: '$bossLevel &2Green Man' + deathMessages: + - '&e&l---------------------------------------------' + - '&2The Alien menace is no more!' + - '&c&l 1º em Dano: $damager1name &ccom $damager1damage de dano!' + - '&6&l 2º em Dano: $damager2name &6com $damager2damage de dano!' + - '&e&l 3º em Dano: $damager3name &ecom $damager3damage de dano!' + - '&aMatadores: $players' + - '&e&l---------------------------------------------' +invasion_ice_construct: + name: '$minibossLevel &fIce Construct' +invasion_merman: + name: '$normalLevel &6Merman' +invasion_merman_leader: + name: '$normalLevel &6Merman Leader' +invasion_otherwordly_ember: + name: '$normalLevel &6Otherworldly Ember' +invasion_psychic_apparition: + name: '$normalLevel &5Psychic Apparition' +invasion_psychic_clone: + name: '$reinforcementLevel &6Psychic Clone' +invasion_psychic_explosion: + name: '$reinforcementLevel &5Psychic Explosion' +invasion_psychic_summon_gold_boots: + name: '$reinforcementLevel &5Psychic Apparition' +invasion_psychic_summon_gold_pants: + name: '$reinforcementLevel &5Psychic Apparition' +invasion_psychic_summon_leather_hat: + name: '$reinforcementLevel &5Psychic Apparition' +invasion_shrieking_shulker: + name: '$normalLevel &8Shrieking Shulker' +invasion_thin_man: + name: '$normalLevel &8Thin Man' +killer_rabbit_of_caerbannog: + name: '$eventBossLevel &cKiller Rabbit of Caerbannog' +kraken: + name: '$eventBossLevel &3Kraken' +krampus: + name: '$eventBossLevel &1Krampus' + locationMessage: '&cKrampus: $distance blocks away!' + spawnMessage: '&cKrampus has come to punish the naughty!' + deathMessage: '&aKrampus has been sent back to his realm to by $players!.' + escapeMessage: '&4There was nobody to punish!' +large_hopper: + name: '$eventBossLevel &dLarge Hopper' + locationMessage: '&cLarge Hopper: $distance blocks away!' + spawnMessage: '&cA large beast is hopping around!' + deathMessage: '&aThe Large Hopper was stopped by $players!' + escapeMessage: '&4The Large Hopper has jumped out of this world!' +large_hopper_mount: + name: '$eventBossLevel &aHopper' +lightning_fae: + name: '$eventBossLevel &eLightning Fae' +living_shadow: + name: '$eventBossLevel &7Living Shadow' + locationMessage: '&cLiving Shadow: $distance blocks away!' + spawnMessage: '&cLiving Shadow has appeared! Do not look it in the yes!' + deathMessage: '&aLiving Shadow has been turned into Dead Shadow by $players!.' + escapeMessage: '&4The Living Shadow saw nothing so it left!' +meme_boss: + name: '&2The Maestro' +meme_boss_reinforcement: + name: '&cFan' +merman: + name: '$eventBossLevel &1Merman' + locationMessage: '&cMerman: $distance blocks away!' + spawnMessage: '&cA Merman swims the oceans!' + deathMessage: '&aThe Merman was slain by $players!' + escapeMessage: '&4The Merman has retreated.' +monster_of_the_deep: + name: '$eventBossLevel &bMonster of the Deep' + locationMessage: '&cMonster of the Deep: $distance blocks away!' + spawnMessage: '&cSomething terrible swims the oceans!' + deathMessage: '&aMonster of the Deep has been slain by $players!' + escapeMessage: '&4The oceans are once again safe!' +moon_spider: + name: '$eventBossLevel &fMoon Spider' + locationMessage: '&cMoon Spider: $distance blocks away!' + spawnMessage: '&cA powerful arachnid has been spotted!' + deathMessage: '&aThe Moon Spider was slain by $players!' + escapeMessage: '&4The Moon Spider has left!' +moon_spider_summon: + name: '&fSilk Mender' +necromancer: + name: '$eventBossLevel &7Necromancer' + locationMessage: '&cNecromancer: $distance blocks away!' + spawnMessage: '&cA powerful evil Necromancer has entered this world!' + deathMessage: '&aThe Necromancer is no more thanks to $players!' + escapeMessage: '&4The Necromancer has disappeared.' +necromancer_summon_1: + name: '$eventBossLevel &fFiery Bones' +necromancer_summon_2: + name: '$eventBossLevel &bChilled Bones' +necromancer_summon_3: + name: '$eventBossLevel &8Charred Bones' +necronomicon_skeleton: + name: '$reinforcementLevel &7Esqueleto Invocado' +necronomicon_zombie: + name: '$reinforcementLevel &7Zumbi Invocado' +netherite_golem: + name: '$eventBossLevel &8Netherite Golem' + locationMessage: '&cNetherite Golem: $distance blocks away!' + spawnMessage: '&cAn ancient golem has entered this world!' + deathMessage: '&aThe Netherite Golem was slain by $players!' + escapeMessage: '&4The Netherite Golem has left this world!' +nether_escapee: + name: '$eventBossLevel &6Nether Escapee' + locationMessage: '&cNether Escapee: $distance blocks away!' + spawnMessage: '&cA terrible foe has escaped the nether!' + deathMessage: '&aThe Nether Escapee was sent back to the nether by $players!' + escapeMessage: '&4The Nether Escapee has left this place!' +nether_hag: + name: '$eventBossLevel &4Nether Hag' + locationMessage: '&cNether Hag: $distance blocks away!' + spawnMessage: '&cAn evil hag walks the nether!' + deathMessage: '&aThe Nether Hag was slain by $players!' + escapeMessage: '&4The Nether Hag has vanished!' +nether_wasp: + name: '$eventBossLevel &6Nether Wasp' + locationMessage: '&cNether Wasp: $distance blocks away!' + spawnMessage: '&cTry not to get stung, a wasp roams the nether!' + deathMessage: '&aThe Nether Wasp was slain by $players!' + escapeMessage: '&4The Nether Wasp has decided to buzz off!' +nether_wasp_summon_1: + name: '$eventBossLevel &cHive Summoner' +nether_wasp_summon_2: + name: '$eventBossLevel &cHive Wasp' +nightwing: + name: '$eventBossLevel &cNightwing' + locationMessage: '&cNightwing: $distance blocks away!' + spawnMessage: '&cA bird of the night has appeared!' + deathMessage: '&aNightwing was stopped by $players!' + escapeMessage: '&4Nightwing has flown home.' +nightwing_summon: + name: '$eventBossLevel &cSmart Bomb' +nightwing_summon_1: + name: '$eventBossLevel &cSworn Protector' +night_crawler: + name: '$eventBossLevel &4Night Crawler' + locationMessage: '&cNight Crawler: $distance blocks away!' + spawnMessage: '&cSomething awful is crawling about!' + deathMessage: '&aThe Night Crawler has been slain by $players!' + escapeMessage: '&4The Night Crawler Undead has left!' +night_horder: + name: '$eventBossLevel &aNight Horder' + locationMessage: '&cNight Horder: $distance blocks away!' + spawnMessage: '&cA Night Horder has appeared! Slay him to loot his booty!' + deathMessage: '&aThe Night Horder has been plundered by $players!' + escapeMessage: '&4The Night Horder has escaped!' +oasis_10_old_bones: + name: '$normalLevel &fOld Bones' +oasis_10_surreptitious_scribe: + name: '$minibossLevel &7Surreptitious Scribe' +oasis_12_entombed_tenant: + name: '$normalLevel &7Entombed Tenant' +oasis_12_entombed_tenant_p2: + name: '$normalLevel &7Entombed Tenant' +oasis_12_sinister_siren: + name: '$minibossLevel &5Sinister Siren' +oasis_14_gnarly_grimace: + name: '$normalLevel &8Gnarly Grimace' +oasis_14_undead_drifter: + name: '$normalLevel &1Undead Drifter' +oasis_16_lesser_sentinel: + name: '$normalLevel &9Lesser Sentinel' +oasis_16_magical_magus: + name: '$normalLevel &3Magical Magus' +oasis_16_rancid_roamer: + name: '$normalLevel &8Rancid Roamer' +oasis_18_sly_sharpshooter: + name: '$normalLevel &eSly Sharpshooter' +oasis_18_stout_thaumaturge: + name: '$normalLevel &5Stout Thaumaturge' +oasis_18_tricky_treasure_hoarder: + name: '$normalLevel &dTricky Treasure Hoarder' +oasis_20_scheming_scribe: + name: '$minibossLevel &7Scheming Scribe' +oasis_20_septic_scribe: + name: '$minibossLevel &7Septic Scribe' +oasis_20_vampiric_sorcerer: + name: '$bossLevel &cVampiric Sorcerer' +oasis_20_wrapped_wraith: + name: '$normalLevel &8Wrapped Wraith' +oasis_20_wrapped_wraith_p2: + name: '$normalLevel &8Wrapped Wraith' +oasis_25_vampiric_warlock: + name: '$bossLevel &4Vampiric Warlock' +oasis_25_warlocks_spirit_summon: + name: '$reinforcementLevel &cWarlocks Spirit' +oasis_26_adept_sentinel: + name: '$normalLevel &1Adept Sentinel' +oasis_26_grim_grovetender: + name: '$normalLevel &aGrim Grovetender' +oasis_26_precarious_sniper: + name: '$normalLevel &3Precarious Sniper' +oasis_26_superior_sharpshooter: + name: '$normalLevel &3Superior Sharpshooter' +oasis_28_perilous_prophet: + name: '$normalLevel &3Perlious Prophet' +oasis_28_treacherous_treasure_hoarder: + name: '$normalLevel &dTreacherous Treasure Hoarder' +oasis_2_haunted_hauler: + name: '$normalLevel &9Haunted Hauler' +oasis_30_forsaken_soul: + name: '$reinforcementLevel &0Forsaken Soul' +oasis_30_lost_soul: + name: '$normalLevel Lost Soul' +oasis_30_parlous_preist: + name: '$minibossLevel &bParlous Preist' +oasis_30_seeker_of_the_staid: + name: '$normalLevel &cSeeker of the Staid' +oasis_30_wimpy_louse: + name: '$reinforcementLevel &8Loathing Louse' +oasis_32_loathing_louse: + name: '$normalLevel &8Loathing Louse' +oasis_32_skeletal_sniper: + name: '$normalLevel &9Skeletal Sniper' +oasis_34_grizly_grimace: + name: '$normalLevel &8Gnarly Grimace' +oasis_34_gruesome_grimace: + name: '$normalLevel &8Gruesome Grimace' +oasis_35_ice_eidolon: + name: '$reinforcementLevel &9Ice Eidolon' +oasis_35_light_of_darkness: + name: '$minibossLevel &9Light of Darkness' +oasis_36_cruel_cultist: + name: '$normalLevel &3Cruel Cultist' +oasis_36_cultists_cretins: + name: '$reinforcementLevel &3Cruel Cultist' +oasis_36_cultists_cretins_drowned: + name: '$reinforcementLevel &3Cruel Cultist' +oasis_36_dexterous_sentinel: + name: '$normalLevel &9Dexterous Sentinel' +oasis_36_grudging_grovetender: + name: '$normalLevel &aGrudging Grovetender' +oasis_36_parlous_sniper: + name: '$normalLevel &3Parlous Sniper' +oasis_36_rueful_roamer: + name: '$normalLevel &8Rueful Roamer' +oasis_36_spectral_magus: + name: '$normalLevel &3Spectral Magus' +oasis_38_poisonous_perch: + name: '$normalLevel &3Poisonous Perch' +oasis_38_traitorous_treasure_hoarder: + name: '$normalLevel &dTraitorous Treasure Hoarder' +oasis_40_chief_cultist: + name: '$minibossLevel &5Chief Cultist' +oasis_40_louse_lord: + name: '$minibossLevel &8Louse Lord' +oasis_40_pharaohs_scribe: + name: '$minibossLevel &7Pharaoh''s Scribe' +oasis_40_skeletal_stiff: + name: '$normalLevel &9Skeletal Stiff' +oasis_40_soaked_sacrifice: + name: '$reinforcementLevel &1Soaked Sacrifice' +oasis_40_solar_flare: + name: '$reinforcementLevel &eSolar Flare' +oasis_42_hexed_hauler: + name: '$normalLevel &9Hexed Hauler' +oasis_42_skeletal_sharpshooter: + name: '$normalLevel &9Skeletal Sharpshooter' +oasis_42_tyranical_treasure_hoarder: + name: '$normalLevel &dTyranical Treasure Hoarder' +oasis_42_tyranical_treasure_hoarder_phase_2: + name: '$normalLevel &dTyranical Treasure Hoarder' +oasis_45_golden_cast_autonomation: + name: '$reinforcementLevel &6Golden Cast Autonomation' +oasis_45_monumental_monstrosity: + name: '$bossLevel &bMonumental Monstrosity' +oasis_45_monumental_monstrosity_phase_2: + name: '$bossLevel &bMonumental Monstrosity' +oasis_45_monumental_monstrosity_phase_3: + name: '$bossLevel &6Monumental Monstrosity' +oasis_45_monumental_monstrosity_phase_4: + name: '$bossLevel &bMonumental Monstrosity' +oasis_45_oracle_of_knowledge: + name: '$minibossLevel &0Oracle of Knowledge' +oasis_45_shadow_of_knowledge_summon: + name: '$reinforcementLevel &8Shadow of Knowledge' +oasis_45_the_beacon: + name: '$minibossLevel &6The Beacon' +oasis_45_the_beacon_phase_2: + name: '$minibossLevel &6The Beacon' +oasis_45_the_beacon_phase_3: + name: '$minibossLevel &6The Beacon' +oasis_45_the_beacon_phase_4: + name: '$minibossLevel &6The Beacon' +oasis_46_pharaohs_sentinel: + name: '$normalLevel &9Pharaoh''s Sentinel' +oasis_4_cursed_desert_dweller: + name: '$normalLevel &eCursed Desert Dweller' +oasis_4_grotesque_grimace: + name: '$normalLevel &8Grotesque Grimace' +oasis_4_swamp_rat: + name: '$normalLevel &6Swamp Rat' +oasis_50_moneychanger_arrow: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_arrow_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_blindness: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_blindness_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_fire: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_fire_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_freeze: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_freeze_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_knockback: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_knockback_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_poison: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_poison_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_wither: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_wither_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_pharaohs_royal_guard: + name: '$reinforcementLevel &8Pharaoh''s Royal Guard' +oasis_50_the_foundry: + name: '$bossLevel &4The Foundry' +oasis_50_the_foundry_phase_2: + name: '$bossLevel &4The Foundry' +oasis_55_pharaoh_of_pestilence: + name: '$bossLevel &0Pharaoh of Pestilence' +oasis_6_dry_bones: + name: '$normalLevel &fDry Bones' +oasis_6_rotten_roamer: + name: '$normalLevel &8Rotten Roamer' +oasis_8_mythical_magus: + name: '$normalLevel &3Mythical Magus' +oasis_8_tough_thaumaturge: + name: '$normalLevel &5Tough Thaumaturge' +oasis_8_troublesome_treasure_hoarder: + name: '$normalLevel &dTroublesome Treasure Hoarder' +okami: + name: '$eventBossLevel &cOkami' + locationMessage: '&cOkami: $distance blocks away!' + spawnMessage: '&cA god has awakened!' + deathMessage: '&a$players has fought with a god and won!.' + escapeMessage: '&4Okami has left!' +okami_p2: + name: '$eventBossLevel &cOkami' +okami_p3: + name: '$eventBossLevel &cOkami' +omega_wolf: + name: '$reinforcementLevel &7Omega Wolf' +pillager_caravan_beast: + name: '$reinforcementLevel &cCaravan Beast' +pillager_caravan_guard: + name: '$reinforcementLevel &cCaravan Guard' +pillager_caravan_leader: + name: '$eventBossLevel &cPillager Caravan Leader' + locationMessage: '&cPillager Caravan: $distance blocks away!' + spawnMessage: '&cA pillager caravan has been sighted!' +primis_acolyte_brute: + name: '$normalLevel &bAcolyte Brute' +primis_acolyte_forest_brute: + name: '$normalLevel &bElf Bandit Brute' +primis_acolyte_forest_brute_with_watch: + name: '$normalLevel &bElf Bandit Brute' +primis_acolyte_forest_sharpshooter: + name: '$normalLevel &bElf Bandit Ranger' +primis_acolyte_forest_summoner: + name: '$normalLevel &bElf Bandit Summoner' +primis_acolyte_forest_summoner_heirloom_guardian: + name: '$normalLevel &bElf Bandit Mage' +primis_acolyte_guard_1: + name: '$normalLevel &bAcolyte Guard' + onDamagedMessages: + - You can't enter! + - The mage won't allow this! + - Leave this place! + - The mage protects this place! + - Foolishness! + - Begone! + deathMessage: '[Acolyte Guard] You are blind to the truth, the tower''s mage sees all!' +primis_acolyte_guard_2: + name: '$normalLevel &bAcolyte Guard' + onDamagedMessages: + - You can't enter! + - The mage won't allow this! + - Leave this place! + - The mage protects this place! + - Foolishness! + - Begone! + deathMessage: '[Acolyte Guard] You shall not pass, the mage in the tower will not allow it!' +primis_acolyte_sharpshooter: + name: '$normalLevel &bAcolyte Ranger' +primis_aggressive_llama: + name: '$normalLevel &6Aggressive LLama' +primis_angry_goat: + name: '$normalLevel &6Angry Goat' +primis_beta_feral_wolf: + name: '$reinforcementLevel &8Beta Feral Wolf' +primis_blood_temple_blood_golem: + name: '$normalLevel &cBlood Golem' +primis_blood_temple_charred_construct: + name: '$normalLevel &cCharred Construct' +primis_blood_temple_conjured_flame: + name: '$normalLevel &cConjured Flame' +primis_blood_temple_eradicator: + name: '$normalLevel &cEradicator' +primis_blood_temple_fire_conjurer: + name: '$normalLevel &cFire Conjurer' +primis_blood_temple_flame_elemental: + name: '$normalLevel &cFlame Elemental' +primis_catacomb_nemus_to_redwood_archer: + name: '$normalLevel &8Catacomb Archer' +primis_catacomb_nemus_to_redwood_golem: + name: '$normalLevel &bCatacomb Golem' +primis_catacomb_nemus_to_redwood_necromancer: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_nemus_to_redwood_necromancer_p1: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_nemus_to_redwood_necromancer_p2: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_nemus_to_redwood_soul_reinforcement: + name: '$reinforcementLevel &8Catacomb Soul' +primis_catacomb_nemus_to_redwood_swordsman: + name: '$normalLevel &8Catacomb Swordsman' +primis_catacomb_pontis_to_ice_archer: + name: '$normalLevel &8Catacomb Archer' +primis_catacomb_pontis_to_ice_golem: + name: '$normalLevel &bCatacomb Golem' +primis_catacomb_pontis_to_ice_necromancer_p1: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_pontis_to_ice_necromancer_p2: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_pontis_to_ice_swordsman: + name: '$normalLevel &8Catacomb Swordsman' +primis_catacomb_trio_archer: + name: '$normalLevel &8Catacomb Archer' +primis_catacomb_trio_golem: + name: '$normalLevel &bCatacomb Golem' +primis_catacomb_trio_necromancer_p1: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_necromancer_p2: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_necromancer_summon: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_swordsman: + name: '$normalLevel &8Catacomb Swordsman' +primis_crazed_rabbit: + name: '$normalLevel &cCrazed Rabbit' +primis_crystaline_summoner_p1: + name: '$normalLevel &3Crystaline Summoner' +primis_crystaline_summoner_p2: + name: '&3Crystaline Summoner' +primis_earth_temple_golem: + name: '$normalLevel &fAnimated Clay' +primis_emerald_eater: + name: '$normalLevel &aEmerald Eater' +primis_farmstead_lighthouse_keeper: + name: '$bossLevel &6The Lighthouse Keeper' + questLore: + - Something is deeply wrong with my husband. + - He used to be a loving and caring husband and father, + - but in recent times he has been focusing on documents he found in the basement. + - He said it was for important research, something that could change the world. + - I should've told him to stop when I saw how obsessed he was becoming. + - He did... something... to the lighthouse - and + - I fear the lighthouse has done something to him, too. + - It morphed him into some kind of monster. He no longer recognizes us, + - and has even attacked us when we tried to approach him. + - At night, we can't sleep due to the wailing sounds + - coming from the &dLighthouse's Basement&f. + - He is suffering, and we are powerless to help him. + - I know it's asking a lot, but do you think you could help us? + questAcceptDialog: + - '&a[Amavit]&f Thank you so much for accepting our request. I hope with all my heart you succeed.' + - '&7&oI should go to the &dBasement of the Lighthouse&7&o and put the &cLighthouse Keeper&7&o out of his misery.' + questCompleteMessage: + - '&a[Amavit]&f I heard it - so it is done? Did he suff- no, forget it, I don''t want to know.' + - '&fIt seems like the lighthouse started emitting an odd light when you... dealt with the issue. We need to make sure it is not an issue.' + - '&7&oSeems like &aAmavit&7&o has another task for me. I should talk to her.' +primis_feral_alpha_wolf: + name: '$normalLevel &8Feral Alpha Wolf' +primis_feral_wolf: + name: '$normalLevel &8Feral Wolf' +primis_feral_wolf_scout: + name: '$normalLevel &8Feral Wolf Scout' +primis_gladius_admiral: + name: '$normalLevel &fInvading Admiral' +primis_gladius_assassin: + name: '$normalLevel &fInvading Assassin' +primis_gladius_barkeep_p1: + name: '$minibossLevel &6The Barkeep' +primis_gladius_barkeep_p2: + name: '$minibossLevel &6The Barkeep' +primis_gladius_captain: + name: '$normalLevel &fInvading Captain' +primis_gladius_champion_p1: + name: '$bossLevel &6Fallen Champion Natus' +primis_gladius_champion_p2: + name: '$bossLevel &6Fallen Champion Natus' +primis_gladius_gatekeeper_p1: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_gatekeeper_p2: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_gatekeeper_pontis_p1: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_gatekeeper_pontis_p2: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_longbowman: + name: '$normalLevel &fInvading Longbowman' +primis_gladius_mariner: + name: '$normalLevel &fInvading Mariner' +primis_gladius_mariner_quest: + name: '$normalLevel &fInvading Mariner' +primis_gladius_monk_p1: + name: '$minibossLevel &6The Monk' +primis_gladius_monk_p2: + name: '$minibossLevel &6The Monk' +primis_gladius_raider: + name: '$normalLevel &fInvading Raider' +primis_gladius_swordsman: + name: '$normalLevel &fInvading Swordsman' +primis_gladius_undead_buccaneer: + name: '$normalLevel &fUndead Buccaneer' +primis_gladius_undead_captain: + name: '$minibossLevel &fUndead Captain' +primis_gladius_undead_swashbuckler: + name: '$normalLevel &fUndead Swashbuckler' +primis_gladius_underlord: + name: '$minibossLevel &0Underlord' +primis_gladius_villager: + name: '$normalLevel &fUndead Villager' +primis_goblin_fowl_warrior: + name: '$minibossLevel &6Cursed Fowl Goblin' +primis_goblin_grunt: + name: '$normalLevel &6Goblin Grunt' +primis_goblin_king: + name: '$bossLevel &2Goblin King' +primis_goblin_piranah: + name: '$normalLevel &9Goblin Piranah' +primis_goblin_spearman: + name: '$normalLevel &6Goblin Spearman' +primis_goblin_warrior: + name: '$normalLevel &6Goblin Warrior' +primis_ice_mage: + name: '$minibossLevel &9Ice Mage' +primis_ice_mage_p2: + name: '$minibossLevel &bIce Mage' + deathMessage: '&8&oYou hear the sound of a nearby ice wall cracking and breaking...' +primis_ice_village_annoyed_goat: + name: '$normalLevel &bAnnoyed Goat' +primis_ice_village_bell_banger: + name: '$minibossLevel &6Undead' + questLore: + - Do you see that? There, look at that bell + - tower in the village. + - You see it too, right? The feller there + - banging his head on the bell. + - I am pretty sure that's what's going on, + - unless my vision is failing me. + - Could you go investigate and report back + - to me what you found. + questAcceptDialog: + - '&a[Eleusium Festus]&f What is going on...' + - '&7&oI should go see what is happening at the &d&oIce Village Bell Tower&7&o.' + questCompleteMessage: + - '&a[Eleusium Festus]&f You found an undead banging their head on the bell...' + - Well now I have heard it all... +primis_ice_village_escaped_prisoner: + name: '$normalLevel &bEscaped Prisoner' +primis_ice_village_fallen_trial_warrior_summon: + name: '$reinforcementLevel &7Enslaved Soul' +primis_ice_village_frost_fur_ursus: + name: '$normalLevel &9Frost Fur Ursus' +primis_ice_village_frost_simulacrum: + name: '$normalLevel &3Frost Simulacrum' +primis_ice_village_ice_simulacrum: + name: '$reinforcementLevel &3Ice Simulacrum' +primis_ice_village_manifested_nightmare: + name: '$normalLevel &bManifested Nightmare' +primis_ice_village_meek_customer: + name: '$normalLevel &cMeek Customer' +primis_ice_village_naughty_customer: + name: '$normalLevel &cNaughty Customer' +primis_ice_village_screecher_bomb_summon: + name: '$reinforcementLevel &dScreecher Droppings' +primis_ice_village_sky_screecher: + name: '$normalLevel &bSky Screecher' +primis_ice_village_the_ice_aspect: + name: '$minibossLevel &9Ice Aspect' +primis_ice_village_the_ice_elemental: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_the_ice_elemental_p2: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_the_ice_elemental_p3: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_trial_of_ice_minor_ice_elemental: + name: '$minibossLevel &bMinor Ice Elemental' +primis_ice_village_wolf_summon: + name: '$reinforcementLevel &cTamed Wolf' +primis_minor_ice_elemental: + name: '$bossLevel &1Minor Ice Elemental' +primis_minor_ice_elemental_p2: + name: '$bossLevel &1Minor Ice Elemental' +primis_mountain_pass_guardian_p1: + name: '$bossLevel &6The Guardian' +primis_mountain_pass_guardian_p2: + name: '$bossLevel &6The Guardian' +primis_mountain_pass_healer: + name: '$reinforcementLevel &fRepairtron' +primis_nasty_worm: + name: '$normalLevel &fNasty Worm' +primis_ogre_mines_mite: + name: '$normalLevel &fMine Mite' +primis_ogre_mines_ogre_archer: + name: '$minibossLevel &fOgre Archer' +primis_ogre_mines_ogre_magi: + name: '$minibossLevel &fOgre Magi' +primis_ogre_mines_ogre_warrior: + name: '$minibossLevel &fOgre Warrior' +primis_ogre_mines_undead_archer: + name: '$normalLevel &fUndead Archer' +primis_ogre_mines_undead_swordsman: + name: '$normalLevel &fUndead Swordsman' +primis_pontis_beast_cod: + name: '$minibossLevel &dBeast Cod Furiosa' +primis_pontis_beast_crawler: + name: '$minibossLevel &dCrawler Beast Megdun' +primis_pontis_beast_impaler: + name: '$minibossLevel &dImpaler Beast Uladzimir' +primis_pontis_counselor_guard_left_1: + name: '$normalLevel &4Corrupt Counselor Guard' +primis_pontis_counselor_guard_left_2: + name: '$normalLevel &4Warped Counselor Guard' + deathMessage: '&5[Counselor Machiavelli]&f So that fool must have finally figured it out...' +primis_pontis_counselor_guard_left_3: + name: '$normalLevel &4Uplifted Experiment' + deathMessage: '&5[Counselor Machiavelli]&f You''re stronger than I thought.' +primis_pontis_counselor_guard_left_4: + name: '$normalLevel &4Abomination' + deathMessage: '&5[Counselor Machiavelli]&f My soul magic will protect me!!!' +primis_pontis_counselor_guard_mid: + name: '$normalLevel &4Corrupt Counselor Guard' + deathMessage: '&8[Counselor Machiavelli]&f I see that we have guests!...' +primis_pontis_counselor_guard_right_1: + name: '$normalLevel &4Corrupt Counselor Guard' +primis_pontis_counselor_guard_right_2: + name: '$normalLevel &4Warped Counselor Guard' +primis_pontis_counselor_guard_right_3: + name: '$normalLevel &4Uplifted Experiment' +primis_pontis_counselor_guard_right_4: + name: '$normalLevel &4Abomination' +primis_pontis_counselor_twisted_copy: + name: '$reinforcementLevel &4Twisted Copy' +primis_pontis_mille_arena_air_elemental: + name: '$minibossLevel &fAir Elemental' +primis_pontis_mille_arena_human_wave_4: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_6: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_7: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_8: + name: '$normalLevel &4Dominated Human Warrior' +primis_pontis_mille_arena_human_worshiper: + name: '$normalLevel &4Elemental Worshiper' +primis_pontis_mille_arena_minor_air_elemental: + name: '$normalLevel &fMinor Air Elemental' +primis_pontis_mille_arena_minor_earth_elemental: + name: '$normalLevel &7Minor Earth Elemental' +primis_pontis_mille_arena_minor_fire_elemental: + name: '$normalLevel &eMinor Fire Elemental' +primis_pontis_mille_arena_minor_fire_elemental_prime: + name: '$normalLevel &eMinor Fire Elemental' +primis_pontis_mille_arena_minor_water_elemental: + name: '$normalLevel &bMinor Water Elemental' +primis_pontis_mille_arena_primal_air_wisp: + name: '$normalLevel &fPrimal Air Wisp' +primis_pontis_mille_arena_primal_air_wisp_2: + name: '$normalLevel &fPrimal Air Wisp' +primis_pontis_mille_arena_primal_earth_wisp: + name: '$normalLevel &7Primal Earth Wisp' +primis_pontis_mille_arena_primal_earth_wisp_2: + name: '$normalLevel &7Primal Earth Wisp' +primis_pontis_mille_arena_primal_fire_wisp: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_fire_wisp_2: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_fire_wisp_3: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_water_wisp: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_water_wisp_2: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_water_wisp_3: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_wisp: + name: '$normalLevel &5Primal Wisp' +primis_pontis_mille_arena_water_elemental: + name: '$minibossLevel &1Water Elemental' +primis_pontis_mille_counselor_p1: + name: '$minibossLevel &fCounselor Machiavelli' +primis_pontis_mille_counselor_p2: + name: '$minibossLevel &fCounselor Machiavelli' +primis_pontis_mille_counselor_p3: + name: '$minibossLevel &fCounselor Machiavelli' +primis_pontis_mille_fields_babe_razorback: + name: '$normalLevel &2Babe Razorback' +primis_pontis_mille_fields_bird: + name: '$normalLevel &fFeathered Field Rat' +primis_pontis_mille_fields_bird_nightmare: + name: '$normalLevel &dFeathered Nightmare Rat' +primis_pontis_mille_fields_bubba: + name: '$minibossLevel &cBig ol'' Bubba' +primis_pontis_mille_fields_field_rat: + name: '$normalLevel &fField Rat' +primis_pontis_mille_fields_juvenile_razorback: + name: '$normalLevel &2Juvenile Razorback' +primis_pontis_mille_fields_longhorn: + name: '$normalLevel &4Fields Longhorn' +primis_pontis_mille_fields_mature_razorback: + name: '$normalLevel &2Mature Razorback' +primis_pontis_mille_fields_shorthorn: + name: '$normalLevel &6Fields Shorthorn' +primis_pontis_mille_fields_two_legged_terror: + name: '$normalLevel &2Two Legged Terror' +primis_pontis_mille_fields_well_fed_rat: + name: '$normalLevel &fWell Fed Rat' +primis_pontis_mille_rat: + name: '$normalLevel &fRat' +primis_quartz_elemental: + name: '$bossLevel &dQuartz Elemental' +primis_quartz_elemental_p2: + name: '$bossLevel &dQuartz Elemental' +primis_redwood_barracuda: + name: '$normalLevel &3Redwood Barracuda' +primis_redwood_fruity_hound: + name: '$normalLevel &2Fruity Hound' +primis_redwood_rockhound: + name: '$normalLevel &7Redwood Rockhound' +primis_redwood_werewolf_grunt: + name: '$normalLevel &cRedwood Werewolf Grunt' +primis_redwood_werewolf_packleader: + name: '$normalLevel &4Redwood Werewolf Packleader' +primis_river_guardian: + name: '$normalLevel &5River Guardian' +primis_roofed_forest_cave_spider: + name: '$normalLevel &6Nest Crawler' +primis_roofed_forest_cave_spider_boss: + name: '$bossLevel &eBrood Mother' +primis_roofed_forest_spider: + name: '$normalLevel &6Forest Crawler' +primis_roofed_forest_spider_reinforcement: + name: '$reinforcementLevel &6Nest Brood' +primis_sea_monster: + name: '$bossLevel &dSea Monster' +primis_sewer_noxious_ninja: + name: '$normalLevel &2Noxious Ninja' +primis_sewer_spore_spreader: + name: '$normalLevel &4Spore Spreader' +primis_sewer_the_shredder_p1: + name: '$bossLevel &5The Shredder' +primis_sewer_the_shredder_p2: + name: '$bossLevel &5The Shredder' +primis_storm_temple_axeman: + name: '$normalLevel &dStorm Temple Axeman' +primis_storm_temple_bowman: + name: '$normalLevel &dStorm Temple Bowman' +primis_storm_temple_kuzco: + name: '$normalLevel &6Kuzco' +primis_storm_temple_minor_storm_elemental: + name: '$normalLevel &5Minor Storm Elemental' +primis_storm_temple_storm_elemental: + name: '$bossLevel &1Storm Elemental' +primis_storm_temple_storm_elemental_p2: + name: '$bossLevel &1Storm Elemental' +primis_storm_temple_storm_elemental_p3: + name: '$bossLevel &1Storm Elemental' +primis_storm_temple_summoner: + name: '$normalLevel &5Storm Temple Summoner' +primis_terravilla_alpha_razorback: + name: '$minibossLevel &2Alpha Razorback' +primis_terravilla_alpha_razorback_p2: + name: '$minibossLevel &2Alpha Razorback' +primis_terravilla_bar_brawler: + name: '$normalLevel &6Bar Brawler' + onDamagedMessages: + - That all ya got! + - I did not even feel that! + - Why...you! + - I will show you! + - Who the heck are you! + - TAKE THAT! +primis_terravilla_earth_elemental: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_earth_elemental_p2: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_earth_elemental_p3: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_regular_fish: + name: '$normalLevel &bRegular Fish' +primis_terravilla_robber_gladiator: + name: '$normalLevel &bRobber Gladiator' +primis_terravilla_robber_slugger: + name: '$normalLevel &bSlugger' +primis_undead_archer: + name: '$normalLevel &fUndead Archer' +primis_undead_climber: + name: '$normalLevel &0Undead Climber' +primis_undead_grappler: + name: '$normalLevel &3Undead Grappler' +primis_undead_guardian: + name: '$normalLevel &bUndead Guardian' +primis_undead_swordsman: + name: '$normalLevel &0Undead Swordsman' +pufferfish: + name: '$eventBossLevel &3Pufferfish' + locationMessage: '&cPufferfish: $distance blocks away!' + spawnMessage: '&cA puffed fish is swimming in the oceans!' + deathMessage: '&aThe Pufferfish reign has been ended by $players!' + escapeMessage: '&4The Pufferfish has swam away!' +pufferfish_summon_1: + name: '$eventBossLevel &bPooferfish' +pufferfish_summon_2: + name: '$eventBossLevel &bPooperfish' +pufferfish_summon_3: + name: '$eventBossLevel &bPooderfish' +pufferfish_summon_4: + name: '$eventBossLevel &bPudderfish' +queen_bee: + name: '$eventBossLevel &6Queen Bee' +rabbit_wolf_1: + name: '$eventBossLevel &cFlame Wolf' + locationMessage: '&cFlame: $distance blocks away!' + spawnMessage: '&cA powerful duo has come to this world!' + deathMessage: '&aThe Wolf and the Rabbit were stopped by $players!' + escapeMessage: '&4The Wolf and the Rabbit have left this place!' +rabbit_wolf_2: + name: '$eventBossLevel &cLightning Rabbit' + locationMessage: '&cLightning: $distance blocks away!' + deathMessage: '&aThe Wolf and the Rabbit were stopped by $players!' + escapeMessage: '&4The Wolf and the Rabbit have left this place!' +raug: + name: '$reinforcementLevel &4Raug' +regular_hoglin: + name: '$eventBossLevel &4Regular Hoglin' + locationMessage: '&cRegular Hoglin: $distance blocks away!' + spawnMessage: '&cA Regular Hoglin has arrived! Nothing special about this Hoglin!' + deathMessage: '&aRegular Hoglin was slain by $players!.' + escapeMessage: '&4The Regular Hoglin has left!' +rotting_diver: + name: '$eventBossLevel &bRotting Diver' + locationMessage: '&cRotting Diver: $distance blocks away!' + spawnMessage: '&cA foul corpse floats in the waters!' + deathMessage: '&aThe Rotting Diver was sent to the depths by $players!' + escapeMessage: '&4The Rotting Diver floated away!' +salty_corpse: + name: '$eventBossLevel &bSalty Corpse' + locationMessage: '&cSalty Corpse: $distance blocks away!' + spawnMessage: '&cSomething awful has floated up to the surface!' + deathMessage: '&aThe Salty Corpse was sent back to the depths by $players!' + escapeMessage: '&4The Salty Corpse has left!' +skeleton_knight: + name: '$eventBossLevel &fSkeleton Knight' + locationMessage: '&cSkeleton Knight: $distance blocks away!' + spawnMessage: '&cThe undead have sent a Skeleton Knight into the night!' + deathMessage: '&aThe Skeleton Knight was slain by $players!' + escapeMessage: '&4The Skeleton Knight had to retreat!' +sky_archer: + name: '$eventBossLevel &aSky Archer' + locationMessage: '&cSky Archer: $distance blocks away!' + spawnMessage: '&cA Sky Archer has entered this world! Bring your bow!' + deathMessage: '&aThe Sky Archer got sniped by $players!' + escapeMessage: '&4The Sky Archer has flown away!' +sky_archer_mount: + name: '$eventBossLevel &aSky Steed' +smallstack: + name: '$eventBossLevel &bSmallstack Top' + locationMessage: '&cSmallstack: $distance blocks away!' + spawnMessage: '&cA Smallstack is roaming the wilds!' + deathMessage: '&aThe Smallstack was unstacked by $players!' + escapeMessage: '&4The Smallstack has left!' +smallstack_1: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_2: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_3: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_4: + name: '$eventBossLevel &bSmallstack Bottom' +smallstack_5: + name: '$eventBossLevel &bSmallstack Bottom' +smallstack_6: + name: '$eventBossLevel &bSmallstack Carrier' +snoopy: + name: '&6{&4☠&6} &fSnoopy' + onDamageMessages: + - Au au! + onDamagedMessages: + - Au au! + spawnMessage: '&aUm Snoopy extremamente raro foi avistado!' +sorcerer_supreme: + name: '$eventBossLevel &5Sorcerer Supreme' + locationMessage: '&cSorcerer Supreme: $distance blocks away!' + spawnMessage: '&cAn almighty Sorcerer has phased into this world!' + deathMessage: '&aThe Sorcerer Supreme was defeated by $players!' + escapeMessage: '&4The Sorcerer Supreme has left this world!' +sorcerer_supreme_summon: + name: '$eventBossLevel &5Eternal Servant' +spider_knight: + name: '$eventBossLevel &aDwarven Knight' + locationMessage: '&cDwarven Knight: $distance blocks away!' + spawnMessage: '&cA Knight has come to challenge the heroes of this place!' + deathMessage: '&aThe Knight was defeated by $players!' + escapeMessage: '&4The Knight has left this place!' +spider_knight_mount: + name: '$eventBossLevel &aFaithful Steed' +summonable_wolf: + name: '$normalLevel Lobo' + onDamageMessages: + - Au au! + onDamagedMessages: + - Au au! +super_mite: + name: '$eventBossLevel &dSuper Mite' + locationMessage: '&cSuper Mite: $distance blocks away!' + spawnMessage: '&cA trouble maker appears!' + deathMessage: '&aThe mite could not handle a fight with $players!.' + escapeMessage: '&4The Super Mite left out of boredom!' +super_mite_summon: + name: '$eventBossLevel &dFriendmite' +suspicious_phantom: + name: '$eventBossLevel &eSuspicious Phantom' + locationMessage: '&cSuspicious Phantom: $distance blocks away!' + spawnMessage: '&cA Suspicious Phantom was sighted in the skies!' + deathMessage: '&aThe Phantom was put to bed by $players!' + escapeMessage: '&4The Suspicious Phantom has left!' +suspicious_phantom_summon: + name: '$eventBossLevel &cFlamer' +suspicious_phantom_summon_1: + name: '$eventBossLevel &cFireballer' +test_boss: + name: '$eventBossLevel &6Test boss' + deathMessages: + - '&e&l---------------------------------------------' + - '&eO chefe de teste foi depurado!' + - '&c&l 1º em Dano: $damager1name &ccom $damager1damage de dano!' + - '&6&l 2º em Dano: $damager2name &6com $damager2damage de dano!' + - '&e&l 3º em Dano: $damager3name &ecom $damager3damage de dano!' + - '&aMatadores: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Eu bati em você! + onDamagedMessages: + - Eu fui atingido! + locationMessage: 'Entidade de teste: $distance' + spawnMessage: Um chefe de teste foi gerado! + deathMessage: Um chefe de teste foi morto por $players! + escapeMessage: Uma entidade teste de chefe escapou! +airship_tier_45_knockback: + name: '$normalLevel &2Bow Bowsman' +airship_tier_45_witherblind: + name: '$normalLevel &aNoxious Bowsman' +airship_tier_50_powder_monkeys: + name: '$normalLevel &7Powder Monkey' +airship_tier_50_scourge: + name: '$normalLevel &8Swashbuckling Scourge' +airship_tier_60_mess_hall_mate: + name: '$normalLevel &bMess Hall Mate' +airship_tier_65_boatswain_boss: + name: '$normalLevel &cBoatswain Boss' +airship_tier_65_bodyguard: + name: '$normalLevel &eBuccaneer Bodyguard' +airship_tier_65_silverfish: + name: '$normalLevel &8Ship Rat' +airship_tier_65_silverfish_reinforcement: + name: '$reinforcementLevel &8Ship Mouse' +airship_tier_70_miniboss: + name: '$minibossLevel Quark the Quartermaster ' +airship_tier_70_miniboss_2: + name: '$minibossLevel &6Living Boiler' +airship_tier_70_miniboss_wayfinder: + name: '$minibossLevel &3Wharf Wayfinder' +airship_tier_75_boss: + name: '$bossLevel &4Captain Davey' + deathMessages: + - '&e&l---------------------------------------------' + - '&9Captain Davey was put to rest! ... again.' + - '&c&l 1º em Dano: $damager1name &ccom $damager1damage de dano!' + - '&6&l 2º em Dano: $damager2name &6com $damager2damage de dano!' + - '&e&l 3º em Dano: $damager3name &ecom $damager3damage de dano!' + - '&aMatadores: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Captain Davey: $distance' + spawnMessage: '&4Captain Davey haunts the skies once more!' + deathMessage: '$players &ahave made &4Captain Davey &ashuffle off his mortal coil!' + escapeMessage: '&6Captain Davey has moved on the haunt another day!' +binder_of_worlds_phase_1: + name: '$eventBossLevel &eBinder of Worlds' + spawnMessage: '&5The binder of worlds approaches!' +binder_of_worlds_phase_1_melee_miniboss: + name: '$reinforcementLevel &9Reality Uprooter' +binder_of_worlds_phase_1_melee_reinforcement: + name: '$reinforcementLevel &8Reality Waster' +binder_of_worlds_phase_1_parkour_reinforcement: + name: '$reinforcementLevel &2Reality Harbinger' +binder_of_worlds_phase_1_ranged_miniboss: + name: '$reinforcementLevel &3Reality Ruiner' +binder_of_worlds_phase_1_ranged_reinforcement: + name: '$reinforcementLevel &6Reality Ruiner' +binder_of_worlds_phase_1_status_miniboss: + name: '$reinforcementLevel &1Reality Wrencher' +binder_of_worlds_phase_1_status_reinforcement: + name: '$reinforcementLevel &7Reality Rupturer' +binder_of_worlds_phase_2: + name: '$eventBossLevel &eBinder of Worlds' +binder_of_worlds_phase_3: + name: '$eventBossLevel &eBinder of Worlds' +binder_of_worlds_phase_3_shulker_reinforcement: + name: '$reinforcementLevel &5Reality Riftrender' +binder_of_worlds_phase_4: + name: '$eventBossLevel &eBinder of Worlds' + deathMessages: + - '&e&l---------------------------------------------' + - '&9The binder is bound to this mortal plane no more!' + - '&c&l 1º em Dano: $damager1name &ccom $damager1damage de dano!' + - '&6&l 2º em Dano: $damager2name &6com $damager2damage de dano!' + - '&e&l 3º em Dano: $damager3name &ecom $damager3damage de dano!' + - '&aMatadores: $players' + - '&e&l---------------------------------------------' +catacombs_tier_10_miniboss: + name: '$minibossLevel &7Terragog' +catacombs_tier_15_boss: + name: '$bossLevel &6The Rattler' + deathMessages: + - '&e&l---------------------------------------------' + - '&9The Rattler rattled away!' + - '&c&l 1º em Dano: $damager1name &ccom $damager1damage de dano!' + - '&6&l 2º em Dano: $damager2name &6com $damager2damage de dano!' + - '&e&l 3º em Dano: $damager3name &ecom $damager3damage de dano!' + - '&aMatadores: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Feeling.. rattled? + - Show me your skeleton! + - You're boned! + - Your calcium is weak! + onDamagedMessages: + - I felt that in my bones! + - I've got a bone to pick with you! + - Doot doot mr skeltal + - I need calcium! + locationMessage: 'The Rattler: $distance blocks away!' + spawnMessage: '&6The Rattler rises!' + deathMessage: '&aThe Rattler has been defeated by $players!' +catacombs_tier_15_mimic_boss: + name: '$bossLevel &6The Forgotten' +catacombs_tier_15_reinforcement: + name: '$reinforcementLevel &eUnturned' +catacombs_tier_5_evoker_guard_2: + name: '$normalLevel &7Catacomb Guard' + onDamageMessages: + - No entry! + - Entry is forbidden! +catacombs_tier_5_illusioner_guard_1: + name: '$normalLevel &7Catacomb Guard' + onDamageMessages: + - No entry! + - Entry is forbidden! +colosseum_tier_70_boss_mount: + name: '$bossLevel &4Pit Lord' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Pit Lord is no more!' + - '&c&l 1º em Dano: $damager1name &ccom $damager1damage de dano!' + - '&6&l 2º em Dano: $damager2name &6com $damager2damage de dano!' + - '&e&l 3º em Dano: $damager3name &ecom $damager3damage de dano!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + deathMessage: '&2The Pit Lord has been vanquished by $players!' +colosseum_tier_70_boss_p1: + name: '$bossLevel &cPit Master' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Pit Master has fallen!' + - '&c&l 1º em Dano: $damager1name &ccom $damager1damage de dano!' + - '&6&l 2º em Dano: $damager2name &6com $damager2damage de dano!' + - '&e&l 3º em Dano: $damager3name &ecom $damager3damage de dano!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Pit Master: $distance blocks away!' + spawnMessage: '&4The Pit Master charges into battle once more!' + deathMessage: '&2The Pit Master has been slain by $players!' +colosseum_tier_70_boss_p2: + name: '$bossLevel &cPit Master' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Pit Master has fallen!' + - '&c&l 1º em Dano: $damager1name &ccom $damager1damage de dano!' + - '&6&l 2º em Dano: $damager2name &6com $damager2damage de dano!' + - '&e&l 3º em Dano: $damager3name &ecom $damager3damage de dano!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Pit Master: $distance blocks away!' + deathMessage: '&2The Pit Master has been slain by $players!' +colosseum_tier_70_boss_reinforcements_p1: + name: '$reinforcementLevel &6Gladiator' +colosseum_tier_70_boss_reinforcements_p2: + name: '$reinforcementLevel &6Gladiator' +colosseum_tier_70_gladiator: + name: '$normalLevel &6Gladiator' +colosseum_tier_70_mount_reinforcements: + name: '$reinforcementLevel &cPit Beast' +dark_cathedral_tier_75_boss: + name: '$bossLevel &4Cultist of Cthulhu' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The summoning has been interrupted!' + - '&c&l 1º em Dano: $damager1name &ccom $damager1damage de dano!' + - '&6&l 2º em Dano: $damager2name &6com $damager2damage de dano!' + - '&e&l 3º em Dano: $damager3name &ecom $damager3damage de dano!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Fools! + - Chtulhu R'lyeh! + - None can defeat Chtulhu! + - Stare into the abyss... + locationMessage: 'Cultist of Cthulhu: $distance blocks away' + spawnMessage: '&cA dark cultist is summoning Cthulhu!' + deathMessage: '&2The summoning has been thwarted $players!' + escapeMessage: '&2The cultist has completed the summoning!' +dark_cathedral_tier_75_reinforcement: + name: '$reinforcementLevel Follower of Cthulhu' + onDamageMessages: + - Cthulhu R'lyeh + onDamagedMessages: + - Cthulhu R'lyeh +darkspire_level_100_berserker_brute: + name: '$normalLevel &7Underworld Berserker' +darkspire_level_100_berserker_reanimated: + name: '$normalLevel &fReanimated Underworld Berserker' +darkspire_level_100_blacksmith_brute: + name: '$normalLevel &eSmoldering Goldsmith' +darkspire_level_100_endermite: + name: '$normalLevel &5Voidcrawler' +darkspire_level_100_marksman_piglin: + name: '$normalLevel &9Foolish Marksman' +darkspire_level_100_sentry_brute: + name: '$normalLevel &3Darkguard Sentry' +darkspire_level_100_summon_blaze: + name: '$reinforcementLevel &cHellspawn' +darkspire_level_100_summon_evoker: + name: '$reinforcementLevel &cFalse Hellraiser' +darkspire_level_100_summon_ghast: + name: '$reinforcementLevel &7Maalkvvhar' +darkspire_level_100_summon_husk: + name: '$reinforcementLevel &cOroxak''s Corrupted' +darkspire_level_100_summon_ravager: + name: '$reinforcementLevel &cEerbix the Fallen' +darkspire_level_100_summon_skeleton: + name: '$reinforcementLevel &cRibling' +darkspire_level_110_berserker_reanimated: + name: '$normalLevel &7Reanimated Underworld Berserker' +darkspire_level_110_marksman_reanimated: + name: '$normalLevel &9Reanimated Foolish Marksman' +darkspire_level_110_necromancer_evoker: + name: '$normalLevel &8Black-Hearted Enchanter' +darkspire_level_110_sentry_reanimated: + name: '$normalLevel &3Reanimated Darkguard Sentry' +darkspire_level_110_stationary_stray: + name: '$normalLevel &6Hewn Watchman' +darkspire_level_120_miniboss_evoker: + name: '$minibossLevel &4Hellraiser' +darkspire_level_120_miniboss_illusioner: + name: '$minibossLevel &4Maalkv' +darkspire_level_120_miniboss_skeleton: + name: '$minibossLevel &4Crypt Keeper' +darkspire_level_120_miniboss_stray: + name: '$minibossLevel &4Nicolas Ribcage' +darkspire_level_120_miniboss_vindicator: + name: '$minibossLevel &4Zalmur the Impslayer' +darkspire_level_120_miniboss_wither_skeleton: + name: '$minibossLevel &4Oroxak' +darkspire_level_120_summon_zoglin: + name: '$reinforcementLevel &cArzags Horde' +darkspire_level_130_miniboss_phase_brute: + name: '$bossLevel &4Arzag the Beast' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Arzag the Beast''s invasion has been stopped!' + - '&c&l 1º em Dano: $damager1name &ccom $damager1damage de dano!' + - '&6&l 2º em Dano: $damager2name &6com $damager2damage de dano!' + - '&e&l 3º em Dano: $damager3name &ecom $damager3damage de dano!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' +darkspire_level_130_miniboss_zoglin: + name: '$bossLevel &4Arzag the Beast' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Arzag the Beast''s invasion has been stopped!' + - '&c&l 1º em Dano: $damager1name &ccom $damager1damage de dano!' + - '&6&l 2º em Dano: $damager2name &6com $damager2damage de dano!' + - '&e&l 3º em Dano: $damager3name &ecom $damager3damage de dano!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Arzag the Beast: $distance blocks away' + spawnMessage: '&4Arzag the Beast prepares for the invasion!' + escapeMessage: '&cArzag the Beast is done plundering!' +darkspire_level_80_summon_blaze: + name: '$reinforcementLevel &dFalse Hellspawn' +fireworks_level_50_boss_phase_1: + name: '$eventBossLevel &cSparky' + spawnMessage: '&eSparks fill the sky!' +fireworks_level_50_boss_phase_2: + name: '$eventBossLevel &cSparky' +fireworks_level_50_boss_phase_3: + name: '$eventBossLevel &cSparky' + deathMessages: + - '&e&l---------------------------------------------' + - '&eSparky''s out, party''s over!' + - '&c&l 1º em Dano: $damager1name &ccom $damager1damage de dano!' + - '&6&l 2º em Dano: $damager2name &6com $damager2damage de dano!' + - '&e&l 3º em Dano: $damager3name &ecom $damager3damage de dano!' + - '&aMatadores: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&6Sparky returns to celebrate!' +fireworks_phase_2_reinforcement: + name: '$eventBossLevel &cBoomi' +fireworks_phase_3_reinforcement: + name: '$eventBossLevel &cPartygoer' +the_great_weaver: + name: '$eventBossLevel &cThe Great Weaver' + locationMessage: '&cThe Great Weaver: $distance blocks away!' + spawnMessage: '&cAwful creatures have appeared!' + deathMessage: '&aThe Great Weaver and it''s brood have been stopped by $players!' + escapeMessage: '&4The Great Weaver and it''s brood have vanished!' +the_great_weaver_summon: + name: '$eventBossLevel &4Brood Mother' +the_great_weaver_summon_1: + name: '$eventBossLevel &6Brood' +halloween_event_boss_mount: + name: '$minibossLevel Daredevil' +halloween_event_boss_p1: + name: '$bossLevel Dullahan' + locationMessage: '&4Dullahan: $distance blocks away!' + spawnMessage: '&4Don''t lose your head now, the headless horseman walks the earth once again!' + deathMessage: '&4The headless horseman was vanquished by $players!' + escapeMessage: '&4The headless horseman has left to haunt someone''s dreams!' +halloween_event_boss_p2: + name: '$bossLevel Dullahan' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Headless Horseman was vanquished!' + - '&c&l 1º em Dano: $damager1name &ccom $damager1damage de dano!' + - '&6&l 2º em Dano: $damager2name &6com $damager2damage de dano!' + - '&e&l 3º em Dano: $damager3name &ecom $damager3damage de dano!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Dullahan: $distance blocks away!' + deathMessage: '&4The headless horseman was vanquished by $players!' + escapeMessage: '&4The headless horseman has left to haunt someone''s dreams!' +halloween_event_boss_reinforcement: + name: '$normalLevel Spooky Skeleton' +the_hunter: + name: '$eventBossLevel &4The Hunter' + locationMessage: '&cThe Hunter: $distance blocks away!' + spawnMessage: '&cA Hunter is on the prowl!' + deathMessage: '&aThe Hunter was hunted to extinction by $players!' + escapeMessage: '&4The Hunter declares the hunt now over!' +the_hunter_mount: + name: '$eventBossLevel &fTamed Beast' +the_living_dead: + name: '$reinforcementLevel &6The Living Dead' +northpole_elf: + name: '$normalLevel &2Workshop Elf' +northpole_elf_summon: + name: '$reinforcementLevel &aSanta''s Elf' +northpole_jack_frost: + name: '$bossLevel &bJack Frost' +northpole_krampus: + name: '$bossLevel &5Krampus' +northpole_mrs_claus: + name: '$bossLevel &cMrs. Claus' +northpole_santa_claus: + name: '$bossLevel &4Santa Claus' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Someone stole all of Santa''s presents!' + - '&c&l 1º em Dano: $damager1name &ccom $damager1damage de dano!' + - '&6&l 2º em Dano: $damager2name &6com $damager2damage de dano!' + - '&e&l 3º em Dano: $damager3name &ecom $damager3damage de dano!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Santa Claus: $distance blocks away' + spawnMessage: '&4Santa Claus is getting ready for Christmas!!' + escapeMessage: '&cSanta set off on his sleigh!' +northpole_skeleton_summon: + name: '$reinforcementLevel &dSoul of the Naughty List' +northpole_snowy_wraith: + name: '$reinforcementLevel &1Snowy Wraith' +the_phantom: + name: '$eventBossLevel &7The Phantom' + locationMessage: '&cThe Phantom: $distance blocks away!' + spawnMessage: '&cA Phantom roams in the dark!' + deathMessage: '&aThe Phantom and his evil troupe have been stopped by $players!' + escapeMessage: '&4The Phantom has left!' +the_phantom_summon_1: + name: '&fCave Spider' +the_phantom_summon_2: + name: '&fWItch' +the_phantom_summon_3: + name: '&fZombie' +the_phantom_summon_4: + name: '&fHusk' +the_phantom_summon_5: + name: '&fDrowned' +the_phantom_summon_6: + name: '&fSkeleton' +the_phantom_summon_7: + name: '&fStray' +the_phantom_summon_8: + name: '&fEnderman' +pirate_ship_tier_10: + name: '$normalLevel &cCrewman' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_15: + name: '$normalLevel &cDeckhand' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_20_melee_1: + name: '$normalLevel &cShipmate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_20_melee_2: + name: '$normalLevel &eDrunken lout' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_20_miniboss: + name: '$minibossLevel &dCookie the Cook' + onDamageMessages: + - Wat're u doin n my kitchen! + - I've got layers! + - You've been served! + - Out me kitchen! + deathMessage: '&2Cookie the Cook''s been sliced and diced by $players!' +pirate_ship_tier_20_ranged: + name: '$normalLevel &cShipmate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_25_miniboss_1: + name: '$miniboss &cCharon the Helmsman' + onDamageMessages: + - Fools ahoy! + - Worthy opponent at prow! + deathMessage: '&2Charon the Helmsman''s been led astray by $players!' +pirate_ship_tier_30_melee: + name: '$normalLevel &cPirate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_30_miniboss_1: + name: '$minibossLevel &7Crushy the Crusher' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! + deathMessage: '&7Crushy the Crusher has been crushed by $players!' +pirate_ship_tier_30_ranged: + name: '$normalLevel &cPirate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_35: + name: '$normalLevel &4Pirate Navigator' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_35_miniboss_1: + name: '$minibossLevel &cSecond Mate' + onDamageMessages: + - You're not allowed here! + - Captain's quarters, back off! +pirate_ship_tier_35_miniboss_2: + name: '$minibossLevel &cSecond Mate' + onDamageMessages: + - You're not allowed here! + - Captain's quarters, back off! +pirate_ship_tier_40_miniboss_1: + name: '$minibossLevel &4First Hand' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! + deathMessage: '&6The Pirate Ship''s First Hand has been demoted by $players!' +pirate_ship_tier_45_boss: + name: '$bossLevel &4Captain Blackbeard' + onDamageMessages: + - Get off me ship! + - Arr, landlubers! + spawnMessage: '&4Captain Blackbeard is leading the Pirate Ship!' + deathMessage: '&2Captain Blackbeard''s beard''s been shaved by $players!' + escapeMessage: '&2Captain Blackbeard has run away with the plunder!' +the_returned: + name: '$reinforcementLevel &6O Retornado' +ruins_boss_p1: + name: '$eventBossLevel &9Thor' + spawnMessage: '&6Lightning descends down from the sky!' +ruins_boss_p2: + name: '$eventBossLevel &9Thor' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Thor was sent back to Asgard!' + - '&c&l 1º em Dano: $damager1name &ccom $damager1damage de dano!' + - '&6&l 2º em Dano: $damager2name &6com $damager2damage de dano!' + - '&e&l 3º em Dano: $damager3name &ecom $damager3damage de dano!' + - '&aMatadores: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&6Lightning descends down from the sky!' +ruins_boss_reinforcement: + name: '$eventBossLevel &7Fenrir' +sewer_tier_10: + name: '$normalLevel &fLurker' +sewer_tier_15: + name: '$normalLevel &2Crawler' +sewer_tier_20_dry: + name: '$normalLevel &1Lost Wanderer' +sewer_tier_20_gravity_boss: + name: '$minibossLevel &1Spark' +sewer_tier_20_water: + name: '$normalLevel &1Smuggler' + onDamageMessages: + - You shouldn't be here! + onDamagedMessages: + - None shall stand in our way! +sewer_tier_20_water_boss: + name: '$minibossLevel &1Forgotten Hero' +sewer_tier_20_wither_boss: + name: '$minibossLevel &2Withered Corpse' +sewer_tier_30_ice_boss: + name: '$minibossLevel &2Ice Wraith' +sewer_tier_30_invisibility_boss: + name: '$minibossLevel &2Shadow Archer' +sewer_tier_30_melee: + name: '$normalLevel &5Sewer Beast' +sewer_tier_30_ranged: + name: '$normalLevel &5Spirit Whisperer' + onDamageMessages: + - A curse upon you! + - A pox upon your family! + - Feel the wrath of the spirits! + onDamagedMessages: + - You vex me so! + - Spirits, protect me! +sewer_tier_40: + name: '$normalLevel &6Mirage' + onDamageMessages: + - You victory, a lie + - Your odds, grim + - Your life, mine + onDamagedMessages: + - This pain, an illusion + - This blood, a mirage + - This weakness, a lie +sewer_tier_40_darkness_boss: + name: '$minibossLevel &2The Shadowmaster' +sewer_tier_40_darkness_boss_reinforcement: + name: '$reinforcementLevel &2Shadow' +sewer_tier_40_fire_boss: + name: '$minibossLevel &2The Grill Master' +sewer_tier_40_fire_boss_reinforcement: + name: '$reinforcementLevel &2Flame' +sewer_tier_40_poison_boss: + name: '$minibossLevel &2Toxic Gardener' + onDamageMessages: + - Feel nature's wrath! + onDamagedMessages: + - To me, minions! +sewer_tier_40_poison_boss_reinforcement: + name: '$reinforcementLevel &2Fallen Gardener' +sewer_tier_5: + name: '$normalLevel &7Sewer worker' + onDamageMessages: + - This area is restricted! + - Don't jump into the vats! + - | + You're not supposed to be here| + onDamagedMessages: + - Do you know what you're doing!? + - Foolishness! + - Don't you dare! +sewer_tier_50: + name: '$normalLevel &3Sewer Piranha' +sewer_tier_50_lightning_boss: + name: '$minibossLevel &2Mjolnir' +sewer_tier_50_ravager_boss: + name: '$minibossLevel &2Sewer Monstrosity' +sewer_tier_50_spider_boss: + name: '$minibossLevel &2Ancient Crawler' +sewer_tier_50_spider_boss_reinforcement: + name: '$reinforcementLevel &2Spiderling' +sewer_tier_50_water_boss: + name: '$minibossLevel &2Piranha King' +sewer_tier_50_water_boss_reinforcement: + name: '$reinforcementLevel &2Piranha Prince' +sewer_tier_60: + name: '$normalLevel &4Drowned One' +sewer_tier_70_boss: + name: '$bossLevel &4Drowned King' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Drowned King has been slain!' + - '&c&l 1º em Dano: $damager1name &ccom $damager1damage de dano!' + - '&6&l 2º em Dano: $damager2name &6com $damager2damage de dano!' + - '&e&l 3º em Dano: $damager3name &ecom $damager3damage de dano!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&cThe sewers echo with the clamor of a returned king...' + deathMessage: '&2The Drowned King has been slain!' + escapeMessage: '&2The sewers grow quiet, for now...' +sewer_tier_70_boss_reinforcement: + name: '$reinforcementLevel &4Drowned One' +totem_zombie_1: + name: '$eventBossLevel Head Zombie' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Zombie Totem been slain!' + - '&c&l 1º em Dano: $damager1name &ccom $damager1damage de dano!' + - '&6&l 2º em Dano: $damager2name &6com $damager2damage de dano!' + - '&e&l 3º em Dano: $damager3name &ecom $damager3damage de dano!' + - '&aMatadores: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cZombie Totem: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine abomination has been sighted!' + deathMessage: '&aDr. Craftenmine''s abomination been terminated by $players!' + escapeMessage: '&4Dr. Craftenmine''s creation has escaped!' +totem_zombie_2: + name: '$eventBossLevel Totem Zombie' +totem_zombie_3: + name: '$eventBossLevel Totem Zombie' +totem_zombie_4: + name: '$eventBossLevel Totem Zombie' +totem_zombie_5: + name: '$eventBossLevel Totem Zombie' +totem_zombie_6: + name: '$eventBossLevel Totem Zombie' +treasure_goblin: + name: '$eventBossLevel &eGoblin do Tesouro' + deathMessages: + - '&e&l---------------------------------------------' + - '&eO Tesouro do Goblin foi saqueado!' + - '&c&l 1º em Dano: $damager1name &ccom $damager1damage de dano!' + - '&6&l 2º em Dano: $damager2name &6com $damager2damage de dano!' + - '&e&l 3º em Dano: $damager3name &ecom $damager3damage de dano!' + - '&aMatadores: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cGoblin do Tesouro: $distance blocos de distância!' + spawnMessage: '&cUm Goblin do Tesouro foi avistado!' + deathMessage: '&aUm Goblin do Tesouro foi abatido por $players!' + escapeMessage: '&4Um Goblin do Tesouro escapou!' +tree_defender: + name: '$eventBossLevel &2Tree Defender' +undead_farmer: + name: '$eventBossLevel &aUndead Farmer' + locationMessage: '&cUndead Farmer: $distance blocks away!' + spawnMessage: '&cAn Undead Farmer walks the earth!' + deathMessage: '&aThe Undead Farmer''s career was ended by $players!' + escapeMessage: '&4The Undead Farmer has gone back to rest!' +undead_farmer_summon: + name: '$eventBossLevel &2Farmers Pride' +undead_farmer_summon_1: + name: '$eventBossLevel &2Failed Hog' +undead_horde_summon_1: + name: '$reinforcementLevel &aUndead Horde' +undead_horde_summon_2: + name: '$reinforcementLevel &dUndead Horde' +undead_horde_summon_3: + name: '$reinforcementLevel &eUndead Horde' +unwanted_visitor: + name: '$eventBossLevel &9Unwanted Visitor' + locationMessage: '&cUnwanted Visitor: $distance blocks away!' + spawnMessage: '&cAn Unwanted Visitor has come to the nether to warm up!' + deathMessage: '&aThe Visitor was slain by $players!' + escapeMessage: '&4The Visitor has gone back to his chilly domain!' +unwanted_visitor_summon: + name: '$eventBossLevel &bIce Clone' +vampire_boneman: + name: '$reinforcementLevel &7Drainlings' +vampire_brute: + name: '$normalLevel &1Vampire Brute' +vampire_brute_coffin_breaker: + name: '$normalLevel &1Vampire Brute' +vampire_brute_gargoyle_rush_left: + name: '$normalLevel &3Vampire Brute' +vampire_brute_gargoyle_rush_left_phase_2: + name: '$normalLevel &3Vampire Brute' +vampire_brute_gargoyle_rush_right: + name: '$normalLevel &3Vampire Brute' +vampire_brute_gargoyle_rush_right_phase_2: + name: '$normalLevel &3Vampire Brute' +vampire_fledgling: + name: '$normalLevel &9Vampire Fledgling' +vampire_fledgling_coffin_breaker: + name: '$normalLevel &9Vampire Fledgling' +vampire_fledgling_gargoyle_overlord: + name: '$normalLevel &9Vampire Fledgling' +vampire_gargoyle: + name: '$normalLevel &6Vampire''s Gargoyle' +vampire_grunt: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_coffin_breaker: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_left: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_left_phase_2: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_right: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_right_phase_2: + name: '$normalLevel &1Vampire Grunt' +vampire_hound: + name: '$reinforcementLevel &bVampire Hound' +vampire_king: + name: '$bossLevel &4Vampire King' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Vampire King has been slain!' + - '&c&l 1º em Dano: $damager1name &ccom $damager1damage de dano!' + - '&6&l 2º em Dano: $damager2name &6com $damager2damage de dano!' + - '&e&l 3º em Dano: $damager3name &ecom $damager3damage de dano!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Vampire King: $distance blocks away.' + spawnMessage: '&cThe Vampire King crawls back to his throne...' + deathMessage: '&2The Vampire King has been smitten!' + escapeMessage: '&2Darkness flees, but for how long...' +vampire_king_phase_2: + name: '$bossLevel &4Vampire King' +vampire_king_phase_3: + name: '$bossLevel &4Vampire King' +vampire_king_phase_4: + name: '$bossLevel &4Vampire King' +vampire_king_phase_5: + name: '$bossLevel &4Vampire King' +vampire_king_phase_6: + name: '$bossLevel &4Vampire King' +vampire_level_120_miniboss_evoker: + name: '$minibossLevel &4Hellraiser''s Spirit' +vampire_level_120_miniboss_skeleton: + name: '$minibossLevel &4Crypt Keeper''s Spirit' +vampire_level_120_miniboss_stray: + name: '$minibossLevel &4Nicolas Ribcage''s Spirit' +vampire_level_120_miniboss_wither_skeleton: + name: '$minibossLevel &4Oroxak''s Spirit' +vampire_necromancer: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_dining_hall: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_entrance: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_foresight_pool: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_gargoyle_rush: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_gargoyle_rush_phase_2: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_left_bedroom: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_right_bedroom: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_supply_room: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_supreme_coffin_breaker: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_2: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_3: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_4: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_5: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_gargoyle_overlord: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_gargoyle_overlord_phase_2: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_gargoyle_overlord_phase_3: + name: '$minibossLevel &2Gargoyle Overlord' +vampire_sentinel: + name: '$minibossLevel &eVampire''s Sentinel' +vampire_thrall: + name: '$reinforcementLevel &dVampire''s Thrall' +vampire_wraith: + name: '$minibossLevel &8Drained One' +vampire_wraith_phase_2: + name: '$minibossLevel &8Drowned One' +vampire_zombie: + name: '$normalLevel &aDrained Husk' +vex_top: + name: '$eventBossLevel &eVex Selfish Top' + locationMessage: '&cVex Troublemakers: $distance blocks away!' + spawnMessage: '&cA gang of Vex Troublemakers have appeared!' + deathMessage: '&aThe Vex Troublemakers were slain by $players!' + escapeMessage: '&4The Vex Troublemakers have decided to leave.' +vex_top_mount_1: + name: '$eventBossLevel &6Vex Bottom' +vex_top_mount_2: + name: '$eventBossLevel &6Vex Bottom' +vex_top_mount_3: + name: '$eventBossLevel &6Vex Bottom' +warlock: + name: '$eventBossLevel &dWarlock' + locationMessage: '&cWarlock: $distance blocks away!' + spawnMessage: '&cA demon riding Warlock has appeared!' + deathMessage: '&aThe Warlock was slain by $players!' + escapeMessage: '&4The Warlock ran away on his demon!' +warlock_mount: + name: '$eventBossLevel &dDemon' +wasp_queen: + name: '$eventBossLevel &aWasp Queen' + locationMessage: '&cWasp Queen: $distance blocks away!' + spawnMessage: '&cA wasp swarm has been sighted!' + deathMessage: '&aThe wasp swarm was eliminated by $players!' + escapeMessage: '&4The wasp swarm has flown away.' +wasp_queen_summon: + name: '$eventBossLevel &aWasp' +water_pest: + name: '$eventBossLevel &3Water Pest' + locationMessage: '&cWater Pest: $distance blocks away!' + spawnMessage: '&cAn annoying foe swims the waters!' + deathMessage: '&aThe Water Pest was slain by $players!' + escapeMessage: '&4The waters are clear of all Pests' +weapons_goblin: + name: '$eventBossLevel &cWeapons Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Weapons Goblin has been pillaged!' + - '&c&l 1º em Dano: $damager1name &ccom $damager1damage de dano!' + - '&6&l 2º em Dano: $damager2name &6com $damager2damage de dano!' + - '&e&l 3º em Dano: $damager3name &ecom $damager3damage de dano!' + - '&aMatadores: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cWeapons Goblin: $distance blocks away!' + spawnMessage: '&cA Weapons Goblin has been sighted!' + deathMessage: '&aA Weapons Goblin has been slain by $players!' + escapeMessage: '&4A Weapons Goblin has escaped!' +wendigo: + name: '$eventBossLevel &7Wendigo' + locationMessage: '&cWendigo: $distance blocks away!' + spawnMessage: '&cSomething awful has appeared!' + deathMessage: '&aThe Wendigo has been slain $players!.' + escapeMessage: '&4The Wendigo has disappeared!' +wendigo_summon: + name: '$reinforcementLevel &aWindigo' +werehare: + name: '$eventBossLevel &5Alice' + locationMessage: '&cWerehare: $distance blocks away!' + spawnMessage: '&cA bloody roar can be heard! A werehare approaches!' + deathMessage: '&a$players! made sure to end the werehare''s reign!' + escapeMessage: '&4The werehare escaped!' +werehare_p2: + name: '$eventBossLevel &dWerehare' +wild_wolf: + name: '$reinforcementLevel &7Wild Wolf' +wood_league_wave_10_boss: + name: '$bossLevel &4Bad Doggo' +wood_league_wave_10_reinforcement: + name: '$reinforcementLevel &cBad Pupper' +wood_league_wave_11_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_11_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_12_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_12_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_13_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_13_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_14_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_14_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_15_miniboss: + name: '$bossLevel &4Mr. Oinkers' + onDamagedMessages: + - Oink!? +wood_league_wave_16_melee: + name: '$normalLevel Mr. Oinkers Fan' +wood_league_wave_16_ranged: + name: '$normalLevel Mr. Oinkers Fan' +wood_league_wave_17_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_17_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_18_melee: + name: '$normalLevel &4Fencing Club Enthusiast' +wood_league_wave_19_ranged: + name: '$normalLevel Archery Club Enthusiast' +wood_league_wave_1_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_1_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_20_boss: + name: '$bossLevel &2Zoltan' +wood_league_wave_21_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_21_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_22_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_22_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_23_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_23_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_24_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_24_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_25_miniboss: + name: '$minibossLevel &bAgdluak' +wood_league_wave_26_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_26_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_27_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_27_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_28_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_29_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_2_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_2_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_30_boss: + name: '$bossLevel &2The Southern Viper' +wood_league_wave_31_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_31_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_32_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_32_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_33_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_33_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_34_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_34_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_35_miniboss: + name: '$minibossLevel &6The Jester' +wood_league_wave_36_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_36_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_37_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_37_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_38_melee: + name: '$normalLevel &4Arena Swordsman' +wood_league_wave_39_ranged: + name: '$normalLevel Arena Archer' +wood_league_wave_3_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_3_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_40_boss: + name: '$bossLevel &cCrucio the Bearer of Curses' +wood_league_wave_41_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_41_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_42_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_42_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_42_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_43_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_43_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_43_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_44_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_44_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_44_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_45_miniboss: + name: '$minibossLevel &6Thousand Blades' +wood_league_wave_46_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_46_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_46_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_47_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_47_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_47_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_48_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_48_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_49_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_49_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_4_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_4_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_50_boss: + name: '$bossLevel &6Uther the Champion' +wood_league_wave_50_boss_p2: + name: '$bossLevel &6Uther the Champion' +wood_league_wave_50_boss_p3: + name: '$bossLevel &6Uther the Champion' +wood_league_wave_50_reinforcement: + name: '$reinforcementLevel &6Uther Stan' +wood_league_wave_5_miniboss: + name: '$minibossLevel &cWeird Cow' + onDamagedMessages: + - Au au! +wood_league_wave_6_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_6_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_7_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_7_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_8_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_9_ranged: + name: '$normalLevel Arena Crossbowman' +yeti: + name: '$eventBossLevel &bYeti' + locationMessage: '&cYeti: $distance blocks away!' + spawnMessage: '&cA mighty beast has appeared!' + deathMessage: '&aThe beast is no more thanks to $players!.' + escapeMessage: '&4The beast has escaped!' +yezhi_baba: + name: '$eventBossLevel &cYezhi Baba' + locationMessage: '&cYezhi Baba: $distance blocks away!' + spawnMessage: '&cA foul hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +yezhi_baba_summon: + name: '$reinforcementLevel &4Yezhi Baba' +zombie_friends_friend: + name: '$reinforcementLevel &7Amigos Zumbis' +zombie_king: + name: '$eventBossLevel &4Rei Zumbi' + locationMessage: '&cRei Zumbi: $distance blocos de distância!' + spawnMessage: '&cO Rei Zumbi foi avistado!' + deathMessage: '&aO Rei Zumbi foi morto por $players!' + escapeMessage: '&4O Rei Zumbi escapou!' +zombie_parents_dad: + name: '$reinforcementLevel &7Zumbi Pai' +zombie_parents_mom: + name: '$reinforcementLevel &7Zumbi Mãe' +back_teleporter: + name: Hermes + role: + greetings: + - Bem-vindo ao\nCentro de Guilda do Aventureiro! + dialog: + - Precisa voltar? + farewell: + - Boas viagens, amigo. + noPreviousLocationMessage: '&8[EliteMobs] &cNão foi possível enviar você de volta ao local anterior - nenhum local anterior encontrado!' +barkeep: + name: Bartley + role: + greetings: + - Precisa de uma bebida? + - Quer uma bebida? + - Com sede? + - Olá, parceiro. + dialog: + - Experimente uma das especialidades da casa. + - Essas bebidas especiais não encontrará em\nnenhum outro lugar. + - Prove um e fará com que você volte\nsempre. + farewell: + - Volte a qualquer hora + - Saúde! + - Kampai! + - Salut! + - Brosd! + - Salud! + - À la vôtre ! + - Prost! + - Santi! + - Salute! + - Saúde! + - Cheers! + - Kanpai! +blacksmith: + name: Greg + role: + greetings: + - Bem vindo a nossa loja! + - Venda seus espólios aqui! + - Produtos frescos, só para você! + - Tem algo para vender? + - Quer comprar algo? + - Produtos frescos sempre! + dialog: + - Mobs de nível mais alto dropam itens de\nvalor mais alto! + - Itens com\nmais encantos valem mais! + - Mobs de nível alto dropam\nitens melhores! + - Os mobs de nível mais alto têm uma chance\nmaior de dropar itens! + - + - + - Alguns itens têm efeitos de\npoções especiais! + - Alguns itens têm\nefeitos únicos! + - O encantamento do caçador\natrai multidões de elite para\nsua localização! + - Armas e armaduras especiais\ndropadas por mobs de elite\npodem ser vendidas aqui! + - As classificações mais altas da guilda\naumentarão a qualidade do\nsaque dos mobs de elite! + farewell: + - Agradeço pelos seus serviços! + - Volte logo! + - Volte a qualquer hora! + - Recomende esta loja aos seus\namigos! +combat_instructor: + name: Charles + role: + greetings: + - Quer aprender sobre combate? + - Precisa de uma lição de combate? + - Quer saber mais sobre combate? + - Pronto para lutar contra Mobs Elite? + dialog: + - Os itens em torno de Mobs de Elite\nmostram quais poderes eles têm. + - Quanto mais alto o nível do\nElite Mob,\nmais poderes eles podem ter + - Quanto mais alto o nível do \nElite Mob,\nmelhor será o saque que eles podem receber + - Mobs de Elite de nível superior\ntem maiores chances\nde dropar itens especiais + - Elite Mobs com flechas flutuantes\natiram flechas contra\njogadores próximos + - Elite Mobs com olhos flutuantes\nender o cegam\nquando atingem você + - Elite Mobs com partículas de feitiço\nflutuantes confundem você\nquando atingem você + - Elite Mobs com baldes de\nlava flutuantes incendeiam você\nquando atingem você + - |- + Elite Mobs with floating\nfireballs fire fireballs + at nearby players + - Elite Mobs com gelo flutuante\ncompactado congelam você\nquando atingem você + - Elite Mobs com flutuante\nelytras fazem você flutuar\nquando atingem você + - Elite Mobs com esmeraldas flutuantes envenenam você\nquando atingem você + - Elite Mobs com pistões\nflutuantes empurram você\nquando atingem você + - Mobs de Elite com totens flutuantes\nenfraquecem você\nquando eles te acertam + - Mobs de Elite com \nteias flutuantes prendern você \n quando te acertam + - Mobs de Elite com totens flutuantes\nenfraquecem você\nquando eles te acertam + - Elite Mobs with floating\nchests drop bonus loot\nwhen you kill them + - Mobs de Elite com botas flutuantes de\nouro são mais rápidos + - Elite Mobs with floating\njukeboxes taunt you\nduring combat + - Elite Mobs with floating\nglass panes are invisible + - Elite Mobs with floating\nspectral arrows are immune\nto arrows + - Elite Mobs with floating\nfeathers are immune\nto fall damage + - Elite Mobs with floating\nflames are immune\nto fire + - Elite Mobs with floating\nanvils are heavier\nthan usual + - Elite Mobs with floating\nbone blocks leave their\ncorpses behind when killed + - Elite Mobs with floating\nslime blocks jump higher\nthan usual + - Elite Mobs with floating\nslime balls create a vaccum\nupon death + - Elite Mobs with floating\nleads pull you\nwhen they hit you + - Elite Mobs with floating\nbones create bone pillars\nduring combat + - Elite Mobs with floating\ntipped arrows fire tracking\narrows during combat + - Elite Mobs with floating\nmushrooms bloat up to become giants\nwhen hit + - Elite Mobs with floating\nskulls summon reinforcements\nwhen hit + - Elite Mobs with floating\nbooks summon reinforcements\nuntil you kill the summoner + - Elite Mobs with floating\neggs summon reinforcements\nwhen hit + - Elite Mobs with floating\nfireworks summon Team Rocket\nwhen hit +enhancer_config: + name: Tim + role: + greetings: + - Quer atualizar seus itens? + - Tem orbes de atualização? + - Obtenha seus itens atualizados aqui! + - Opa! + - Você tem sucata filho? + dialog: + - Seus itens são péssimos,\n faça um upgrade aqui! + - Atualize seus itens aqui! + - Você tem um orbe de atualização? + - Essa espada parece horrível,\n faça um upgrade aqui! + - Precisa de uma atualização? + farewell: + - Não se envergonhe por aí! + - Volte quando tiver mais orbes! + - Vá buscar mais orbes! +frost_queen_teleporter: + name: Ishard the Frostbitten + role: + greetings: + - '' +guide_0: + name: Dux + role: + greetings: + - Heard about the AG? + - Been to the AG? + - Heard of the Adventurer's Guild? + - Know about the Adventurer's Guild? + dialog: + - Heard about the AG? + - Been to the AG? + - Heard of the Adventurer's Guild? + - Know about the Adventurer's Guild? + farewell: + - Volte a qualquer hora + - Estarei aqui se precisar de mim! + - I'll be around! + - Até mais! +guide_1: + name: Casus + role: + greetings: + - Need guidance? + - Need a hint + - Are you lost? + - Need help? + dialog: + - I know everything about\nthis place! + - Want to meet the other members\nof the Adventurer's Guild? + - Need to learn your way around\nthis place? + farewell: + - Volte a qualquer hora + - Estarei aqui se precisar de mim! + - I'll be around! + - Até mais! +guild_attendant: + name: Gillian + role: + greetings: + - Bem-vindo à\nGuilda dos Aventureiros! + - Bem-vindo! + dialog: + - Verifique o quadro de missões para\nver missões ativas! + - Você pode falar comigo para\nalterar a classificação da sua guilda! + - Você pode vender itens para o\nferreiro por moedas! + - Você pode falar com o\nmaster da arena para assumir a arena! + - Você pode comprar equipamentos\no ferreiro! + - Você pode falar com o\nmaster de combate para verificar seu nível de combate! + - Desbloquear novos níveis de guida\naumenta sua saúde máxima! + farewell: + - Vejo você em breve! + - Obrigada por apareceres! + - Caçada feliz! +primis_69ozcanofbepis: + name: '&a69OzCanOfBepis' + role: '&2Map Maker (Uuuuge gamer)' + dialog: + - Hope you are enjoying the map! + farewell: + - Have fun! +primis_caeruleaum_fisherman: + name: '&3Piscis Nemesis' + role: '&b' + greetings: + - Hiya!. + dialog: + - Woah! Almost fell off the boat. + - Darn sea monster! + - Need more bait. + farewell: + - Later! + - Good luck! +primis_caeruleaum_fletcher: + name: '&6Ventus Artifex' + role: '&e' + greetings: + - Saudações. + dialog: + - I used to be an adventurer like you. + - Welcome, outsider + - Preciso de algo? + - |- + You're not from around these parts, + are you? + farewell: + - See you 'round! + - Volte logo! +primis_caeruleaum_forager: + name: '&5Venator Pabulatus' + role: '&d' + greetings: + - Hello, stranger. + dialog: + - I used to be an adventurer like you. + - Welcome, outsider + - Preciso de algo? + - |- + You're not from around these parts, + are you? + farewell: + - See you 'round! + - Volte logo! +primis_caeruleaum_hint_giver: + name: '&fVir Loquax' + role: '&fWise Man' + greetings: + - Hi there! + - Hello! + - It is good to see you! + - Saudações! + dialog: + - + - + - + - + - The ruins in the southwest are such a horrible place!\n Who would ever go there... + - + - + - I heard that a nasty type of\nwolf has settled in the wolf den! + farewell: + - Goodbye! + - Até mais! + - Come visit me again! + - Farewell! +primis_caeruleaum_injured_fisherman: + name: '&3Callidus Piscatus' + role: '&b' + greetings: + - Hello, wanderer. + dialog: + - Caught any good fish lately? + - Welcome, outsider + - Preciso de algo? + - |- + You're not from around these parts, + are you? + farewell: + - See you 'round! + - Volte logo! +primis_caeruleaum_jeeves: + name: Jeeves + role: + greetings: + - Just traveling! + dialog: + - Just here to sell\nto the shop-keep. + - I'm busy negotiating\nhere. + - Not right now,\ncome back later. + farewell: + - Uhuh... +primis_caeruleaum_leader: + name: '&4Chief Piscis' + role: '&c' + greetings: + - Welcome to our village! + dialog: + - |- + Ask not what this village can do for you, + ask what you can do for this village! + - Welcome, outsider + - Preciso de algo? + - |- + You're not from around these parts, + are you? + farewell: + - Off you go! + - Volte logo! +primis_caeruleaum_merchant: + name: Emptor + role: + greetings: + - Tem algo para vender? + dialog: + - Bandits stole my wares! + - Got nothing to sell, I'm afraid. + - I'll buy anything you have! + farewell: + - Viagens seguras! +primis_captain: + name: '&4Captain Squalus' + role: '&c' + greetings: + - So you're finally awake! + - That was a wild ride! + - Still alive? + - Let's not do that again! + dialog: + - I've got a task for you! + - I need your help! + - |- + Good thing you're here, + we need some help! + farewell: + - Off you go! + - Don't forget about me! + - Volte logo! +primis_deli'o: + name: '&eDéli''O' + role: '&6Map Maker (Gamer)' + dialog: + - Hope you are enjoying the map! + farewell: + - Have fun! +primis_farmstead_son: + name: '&4Filius' + role: '&c' + greetings: + - Where do you fare from? + - You seem like you came a long way from here. + dialog: + - Dangerous times we live in. + - Have you seen my father? + - Without a lighthouse, how will boats navigate? + farewell: + - Watch your back! + - Tread lightly! +primis_farmstead_wife: + name: '&4Amavit' + role: '&c' + greetings: + - I haven't seen you before! + - Any news from Pontis Mille? + dialog: + - Have you seen my husband? + - I need your help! + - What dangerous times we live in. + - Something is amiss! + farewell: + - Viagens seguras! + - Thank you! +primis_first_mate: + name: '&cIracundi' + role: '&c' + greetings: + - So you're finally awake! + - That was a wild ride! + - Still alive? + - Let's not do that again! + dialog: + - I've got a task for you! + - I need your help! + - |- + Good thing you're here, + we need some help! + farewell: + - Off you go! + - Don't forget about me! + - Volte logo! +primis_frostcone: + name: '&bFrostCone' + role: '&9Map Maker (Gamer)' + dialog: + - Hope you are enjoying the map! + - It's a pine-cone covered in snow. + - Is Primis out yet? + farewell: + - Have fun! +primis_gladius_guard_1: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_guard_2: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_guard_3: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_guard_4: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_lord: + name: '&4General Hasta' + role: '&c' + greetings: + - Are you here to help? + - It's a war zone out there! + dialog: + - They came in the night! + - We never saw them coming! + - Where are our reinforcements? + farewell: + - Watch your back! + - Tread lightly! +primis_gladius_quartermaster: + name: '&6Cibus' + role: '&c' + greetings: + - Are you here to help? + - It's a war zone out there! + dialog: + - They came in the night! + - We never saw them coming! + - Where are our reinforcements? + farewell: + - Watch your back! + - Tread lightly! +primis_gladius_strategist: + name: '&6Belli' + role: '&c' + greetings: + - Are you here to help? + - It's a war zone out there! + dialog: + - They came in the night! + - We never saw them coming! + - Where are our reinforcements? + farewell: + - Watch your back! + - Tread lightly! +primis_groves_nemus_leader: + name: '&3King Nemian' + role: '&c' + dialog: + - What brings you under the hill? + - Where are you from? + - |- + Have you tried our + delicious glow berries? + farewell: + - Until next time. +primis_ice_village_fisherman_boat: + name: '&3Theopropides Nero' + role: '&3' + greetings: + - Fishy day! + dialog: + - A chilly day for fishing. + - They aren't biting. + - Just gotta be patient. + farewell: + - Don't fall into\nthe water! +primis_ice_village_friendly_villager: + name: '&3Luxuria Placidus' + role: '&3' + greetings: + - Hellos! + dialog: + - Old age will not\nslow me down! + - Being in a good\nmood is important. + - Hoping for some\nsnow soon. + farewell: + - Farewell! +primis_ice_village_generic_npc_1: + name: '&3Albertus Vitalis' + role: '&3' + greetings: + - How goes it. + dialog: + - Nothing like good ale! + farewell: + - Bye. +primis_ice_village_generic_npc_10: + name: '&3Trebatia Cornix' + role: '&3' + greetings: + - OK. + dialog: + - Yep, got it. + - I see... + - Oh! + farewell: + - I will try that\nnext time. +primis_ice_village_generic_npc_11: + name: '&3Albatia Lateranus' + role: '&3' + greetings: + - Visiting Violet? + dialog: + - Don't cause trouble. + farewell: + - Later stranger. +primis_ice_village_generic_npc_12: + name: '&3Hostilia Carantus' + role: '&3' + greetings: + - Hi. + dialog: + - I was just\nleaving. + farewell: + - Bye. +primis_ice_village_generic_npc_13: + name: '&3Vagennia Sejanus' + role: '&3' + greetings: + - Hiya. + dialog: + - What brings you\nto the docks? + farewell: + - See ya. +primis_ice_village_generic_npc_14: + name: '&3Dinia Vettonius' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_15: + name: '&3Sceledrus Marcallas' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_16: + name: '&3Fridericus Castinus' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_17: + name: '&3Cario Fimbria' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_18: + name: '&3Piscatores Laevinus' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_19: + name: '&3Monkerius Vitalis' + role: '&3' + greetings: + - Been hunting? + dialog: + - Time to go hunting. + farewell: + - Farewell. +primis_ice_village_generic_npc_2: + name: '&3Luxuria Tyranus' + role: '&3' + greetings: + - How goes it. + dialog: + - One more! + farewell: + - Bye. +primis_ice_village_generic_npc_3: + name: '&3Aurelio Nigidius' + role: '&3' + greetings: + - Hey there. + dialog: + - What a sight! + farewell: + - Goodbye. +primis_ice_village_generic_npc_4: + name: '&3Lysidamus Paratus' + role: '&3' + greetings: + - Out for a walk? + dialog: + - I couldn't imagine\nliving somewhere\nwithout snow. + - Starting to get chilly. + farewell: + - Until later. +primis_ice_village_generic_npc_5: + name: '&3Simo Proceus' + role: '&3' + greetings: + - What a view! + dialog: + - I love climbing. + - Look at all the fish! + farewell: + - Yep. +primis_ice_village_generic_npc_6: + name: '&3Dordalus Marullinus' + role: '&3' + greetings: + - Welcome to the pub! + dialog: + - Time to warm up\nmy fingers. + - Nice and warm. + farewell: + - Don't let the\ncold get ya. +primis_ice_village_generic_npc_7: + name: '&3Tranio Silvanus' + role: '&3' + greetings: + - Here somewhere.. + dialog: + - Where is it. + farewell: + - I was sure I\nleft it here. +primis_ice_village_generic_npc_8: + name: '&3Milonia Trebellius' + role: '&3' + greetings: + - Welcome to our\nvillage! + dialog: + - I sure am hungry. + - Could go for\nsome salmon. + farewell: + - Farewell. +primis_ice_village_generic_npc_9: + name: '&3Barria Brocchus' + role: '&3' + greetings: + - Did you hear... + dialog: + - Keep that in mind\nnext time you swing\nyour sword. + - The shield can be\nmore than defense. + farewell: + - Got it? +primis_ice_village_hunter: + name: '&3Alanus Isatis' + role: '&3' + greetings: + - Hey! + dialog: + - Hoping for a good\nday tomorrow. + - Sure are many Razorbacks\nout this season. + farewell: + - Be seeing you. +primis_ice_village_imprisoned_husband: + name: '&3Eleusium Calenus' + role: '&3' + greetings: + - '.....' + dialog: + - Another day in a cage... + farewell: + - '.....' +primis_ice_village_jail_caretaker: + name: '&3Philolaches Triferus' + role: '&3' + greetings: + - Hey there. + dialog: + - What else needs\nfixing. + - I should check up\non the cages. + farewell: + - Later. +primis_ice_village_jail_guard: + name: '&3Eleusium Festus' + role: '&3' + greetings: + - Climbed the\ntower eh. + dialog: + - Everything seems in order. + - Almost everything... + farewell: + - Take care. +primis_ice_village_jail_master: + name: '&3Romanus Superbus' + role: '&3' + greetings: + - Well met. + dialog: + - Don't do the crime if\nyou can't do the time. + - Crime doesn't pay. + farewell: + - Until later. +primis_ice_village_leader: + name: '&3Glacies Princeps' + role: '&3' + greetings: + - Hey. + dialog: + - Darn Ice Elemental! + - Too many problems... + - How are we supposed to\ncomplete the trials now. + farewell: + - Goodbye. +primis_ice_village_lighthouse_keeper: + name: '&3Severinus Martius' + role: '&3' + greetings: + - Well met stranger. + dialog: + - Calm day today. + - Watch out for\nthe Ursus! + farewell: + - Take it easy. +primis_ice_village_missing_daughter: + name: '&3Cornelia Ennodius' + role: '&3' + greetings: + - Help... + dialog: + - Go away, go away,\nGO AWAY! + - They are not\nreal... + - Just don't look\nat them Cornelia. + farewell: + - Bye. +primis_ice_village_prisoner: + name: '&3Adrius Calpornius' + role: '&3' + greetings: + - I am innocent! + dialog: + - This is not where\nI belong!!! + farewell: + - Get me out of here! +primis_ice_village_pubkeeper: + name: '&3Grania Cecilius' + role: '&3' + greetings: + - Welcome! + dialog: + - Coming right up! + - Try our black ale! + - Need a drink? + farewell: + - One coming up! +primis_ice_village_tower_squatter: + name: '&3Modestus Eulogius' + role: '&3' + greetings: + - The noise! + dialog: + - So much screeching! + - Just trying to\nenjoy the peace. + farewell: + - Bye. +primis_ice_village_violet: + name: '&5Domina Violet' + role: '&d' + greetings: + - Did I ask\nyour opinion? + dialog: + - Feels good to\nget it out. + - They're gonna pay\nwhile I collect. + farewell: + - No, that's what I thought. +primis_ice_village_worried_father: + name: '&3Sparax Ennodius' + role: '&3' + greetings: + - I hope she is OK... + dialog: + - Let our girl be\nsafe, please. + farewell: + - Bye. +primis_ice_village_worried_mother: + name: '&3Sestia Ennodius' + role: '&3' + greetings: + - Where did she go. + dialog: + - Hmm, lost the trail. + farewell: + - Bye. +primis_ice_village_worried_wife: + name: '&3Titia Calenus' + role: '&3' + greetings: + - Hiya! + dialog: + - Nice and clean beds. + - Did I miss something? + - Another chest sorted. + farewell: + - Bye! +primis_magmaguy: + name: '&4Magmaguy' + role: '&cLead Developer (Non-gamer)' + dialog: + - Hope you are enjoying the map! + farewell: + - Have fun! +primis_mountain_guide: + name: '&4Petrae' + role: '&c' + greetings: + - Welcome to our village! + dialog: + - |- + Ask not what this village can do for you, + ask what you can do for this village! + - Welcome, outsider + - Preciso de algo? + - |- + You're not from around these parts, + are you? + farewell: + - Off you go! + - Volte logo! +primis_mountain_guide_2: + name: '&4Petrae' + role: '&c' + greetings: + - Welcome to our village! + dialog: + - |- + Ask not what this village can do for you, + ask what you can do for this village! + - Welcome, outsider + - Preciso de algo? + - |- + You're not from around these parts, + are you? + farewell: + - Off you go! + - Volte logo! +primis_nemus_leader: + name: '&3King Nemian' + role: '&c' + dialog: + - What brings you under the hill? + - Where are you from? + - |- + Have you tried our + delicious glow berries? + farewell: + - Until next time. +primis_ogre_mines_escaped_miner: + name: '&cFugit Fossores' + role: '&c' + greetings: + - I can't believe I made it! + - They're everywhere! + - Could you lend a hand? + dialog: + - I've got a task for you! + - I need your help! + farewell: + - Off you go! + - Be careful in there! + - Stay safe! +primis_ogre_mines_lone_miner: + name: '&cFortis Fossores' + role: '&c' + greetings: + - Finally, some help! + - Don't let them see you! + - Help me! + dialog: + - I've got a task for you! + - I need your help! + farewell: + - Off you go! + - Back to mining for me! + - Stay safe! +primis_ogre_mines_old_miner: + name: '&cVetus Fossores' + role: '&c' + greetings: + - Hey there sonny! + - You're lookin' a little lost! + - What brings you over here? + dialog: + - I've got a task for you! + - I need your help! + farewell: + - Off you go! + - Don't let the mine mites bite! + - Stay safe! +primis_ogre_mines_panicked_miner: + name: '&cMetus' + role: '&c' + greetings: + - The mine is overrun! + dialog: + - There's ogres everywhere! + - Can you help us? + farewell: + - Be careful! +primis_pontis_citizen_1: + name: '&7Agorastocles Gorgonius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_10: + name: '&7Pardalisca Saunio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_11: + name: '&7Sobersides Colias' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_12: + name: '&7Saturio Caepio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_13: + name: '&7Chrysalus Trebonius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_14: + name: '&7Toxilus Micon' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_15: + name: '&7Phronesium Viridio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_16: + name: '&7Aurelio Zoilus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_17: + name: '&7Diniarchus Nelius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_18: + name: '&7Cleostrata Senopius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_19: + name: '&7Georgius Sorio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_2: + name: '&7Franciscus Crispian' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_20: + name: '&7Epidicus Silvanus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_21: + name: '&7Pleusicles Marcellinus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_22: + name: '&7Plesidippus Nerva' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_23: + name: '&7Plesidippus Megellus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_24: + name: '&7Fridericus Achaicus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_25: + name: '&7Curculio Zosimus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_26: + name: '&7Demipho Sylvius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_27: + name: '&7Peniculus Nemesius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_28: + name: '&7Tyndarus Faustinius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_29: + name: '&7Sulpicio Panthera' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_3: + name: '&7Tycho Sellic' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_30: + name: '&7Melaenis Gelasius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_31: + name: '&7Tyndarus Columbanus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_32: + name: '&7Antamonides Cerinthus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_33: + name: '&7Lesbonicus Momus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_34: + name: '&7Fridericus Saloninus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_35: + name: '&7Anterastilis Fabricius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_36: + name: '&7Tyndarus Augustalis' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_37: + name: '&7Modestus Aper' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_38: + name: '&7Henricus Crassus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_39: + name: '&7Franciscus Tancinus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_4: + name: '&7Advocati Micon' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_40: + name: '&7Phygia Aurelius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_5: + name: '&7Advocati Micon' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_6: + name: '&7Messenio Rectus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_7: + name: '&7Hadrius Donicus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_8: + name: '&7Sulpicio Sejanus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_9: + name: '&7Stasimus Mutilus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_dockworker_1: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - Até mais! +primis_pontis_dockworker_10: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - Até mais! +primis_pontis_dockworker_2: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - Até mais! +primis_pontis_dockworker_3: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - Até mais! +primis_pontis_dockworker_4: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - Até mais! +primis_pontis_dockworker_5: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - Até mais! +primis_pontis_dockworker_6: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - Até mais! +primis_pontis_dockworker_7: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - Até mais! +primis_pontis_dockworker_8: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - Até mais! +primis_pontis_dockworker_9: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - Até mais! +primis_pontis_enhancer: + name: '&7Meliorem' + role: '&8' + greetings: + - Need to upgrade? + - Tem sucata? + - Let's upgrade! + dialog: + - I'll upgrade for scrap! + - Bring me scrap! + - Upgrade your gear for scrap! +primis_pontis_gardener_1: + name: '&eGorgines Asina' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_2: + name: '&ePiscatores Orissus' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_3: + name: '&eAlcesimus Abito' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_4: + name: '&ePyrgopolynices Perpenna' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_5: + name: '&eLemniselenis Gelasius' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_6: + name: '&eLysimachus Sulinus' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_7: + name: '&eStrobilus Farus' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_groves_catacombs_npc: + name: '&7Inaequaliter Hyaena' + role: '&7' + greetings: + - Psssst! + dialog: + - I heard there is great\ntreasure to be had! + - Something wonderful awaits\nyou if you enter! + - You should adventure\ninto this place... + - Why not go in? + - You should go inside... + - Don't worry, it's\ncompletely safe. + - No danger. I swear! + - Take a look inside. + - You should check\nout this place! + - He he he he he... + - What if somebody\ninside needs help. + - Go in, go in! + - Aren't you curious? + - Surely you should\ntake a peek. + farewell: + - He he he, later! +primis_pontis_groves_generic_npc_1: + name: '&2Sycophanta Mucius' + role: '&2' + greetings: + - I'm fine! + dialog: + - Do not worry about me. + - My brother will come rescue me. + - They won't eat me. + - I assure you I will be just fine. + farewell: + - Web ya later! +primis_pontis_groves_generic_npc_10: + name: '&2Hostilia Metunus' + role: '&2' + greetings: + - Hellos. + dialog: + - Are you bored too? + - Ugh, there must be something to do. + - Maybe I should brew more drinks. + farewell: + - See ya! +primis_pontis_groves_generic_npc_11: + name: '&2Tortilia Getha' + role: '&2' + greetings: + - Hi there. + dialog: + - My husband makes the best cakes. + - Want a slice? + - So delicious and moist! + farewell: + - Bye! +primis_pontis_groves_generic_npc_12: + name: '&2Consentia Apellinus' + role: '&2' + greetings: + - Oh, hello. + dialog: + - There, as good as new! + - Have to make sure the light keeps them away. + - Another lantern fixed... + farewell: + - Don't let the spiders bite! +primis_pontis_groves_generic_npc_13: + name: '&2Novia Senecius' + role: '&2' + greetings: + - Hi! + dialog: + - Oh, did not expect to see anyone here. + - Just gotta be quick and they can't get ya. + - The spiders don't stop me. + - This is my favorite resting spot. + farewell: + - Stay safe. +primis_pontis_groves_generic_npc_14: + name: '&2Maximia Priscus' + role: '&2' + greetings: + - Shhhh... + dialog: + - Thought you could\nsteal from me elves... + - Gonna get back my\npossessions when\nthey go sleep. + - Made it here by\ngoing around. + - They never saw\nme coming. + farewell: + - Keep it down. +primis_pontis_groves_generic_npc_15: + name: '&2Herennia Exsupereus' + role: '&2' + greetings: + - Hey there. + dialog: + - Just woke up. + - It's gonna be a good\nday I can feel it. + farewell: + - Bye bye. +primis_pontis_groves_generic_npc_16: + name: '&2Atria Maursus' + role: '&2' + greetings: + - Greetings. + dialog: + - Not sure how the king\nexpects me to do\nall of this... + - So much work.. + - Busy, busy, busy. + - This paperwork\nwon't do itself. + farewell: + - Bye bye. +primis_pontis_groves_generic_npc_17: + name: '&2Felicius Esurpus' + role: '&2' + greetings: + - Greetings! + dialog: + - If you need anything\nspeak to the king. + - Sorry, I am busy. + - No time for chit-chat,\nmy apologies. + farewell: + - Goodbye. +primis_pontis_groves_generic_npc_2: + name: '&2Sceledrus Fredisius' + role: '&2' + greetings: + - Heya! + dialog: + - I am actually fishing for bugs. + - Large aqua-bugs fall from the trees. + - I use tree sap as bait. + - The aqua-bugs cannot resist the bait! + - They are actually amphibious. + - Gotta catch'em before they head for the trees. + - They are quite tasty if you roast them. + - Hoping for a good catch! + farewell: + - Later. +primis_pontis_groves_generic_npc_3: + name: '&2Felicius Surius' + role: '&2' + greetings: + - Hi there! + dialog: + - The ocean is so pretty. + - I could stand here for days. + - The spiders sure are annoying. + farewell: + - Bye. +primis_pontis_groves_generic_npc_4: + name: '&2Periplectomenus Burcanius' + role: '&2' + greetings: + - Welcome! + dialog: + - Plenty of glow berries left. + - Hope you like my little farm. + - So many wines to attend to. + farewell: + - See you later. +primis_pontis_groves_generic_npc_5: + name: '&2Stephanus Magnus' + role: '&2' + greetings: + - Hey there! + dialog: + - Did you check out the berry farm? + - Lovely time for a walk. + - Can't be inside all the time. + farewell: + - Have a good one. +primis_pontis_groves_generic_npc_6: + name: '&2Abundantius Rogatus' + role: '&2' + greetings: + - Hiya! + dialog: + - What brings you into our lovely hole? + - Feel free to stay a while. + farewell: + - Bye. +primis_pontis_groves_generic_npc_7: + name: '&2Albanus Ivmarus' + role: '&2' + greetings: + - Easy there... + dialog: + - What? Yes, I'm doing just fine. + - I did not have too many, nope. + - Just one more... + - One more pint... + farewell: + - Farewell. +primis_pontis_groves_generic_npc_8: + name: '&2Bacchis Aventinus' + role: '&2' + greetings: + - Good day or evening... + dialog: + - I am so cozy right now. + - We used to go outside more often. + - Too many dangers outside these days. + farewell: + - Bless ya. +primis_pontis_groves_generic_npc_9: + name: '&2Pasicompsa Getha' + role: '&2' + greetings: + - Come in, come in! + dialog: + - Welcome to the best hole in the grove! + - Built this hole with my own hands! + - Hope you enjoy your stay! + farewell: + - Come back soon! +primis_pontis_groves_hole_luxuria: + name: '&cLuxuria Gorgonius' + role: '&c' + greetings: + - Hi there! + - Hellos! + dialog: + - Life is all about taking it easy. + - Why stress. + farewell: + - Visit us again! +primis_pontis_groves_hole_phygia: + name: '&cPhygia Gorgonius' + role: '&c' + greetings: + - Welcome to my home! + - Hellos! + dialog: + - We have to take action! + - Too many elves in our grove. + farewell: + - Visit us again! +primis_pontis_groves_lighthouse_generic_npc_1: + name: '&3Eleusium Martius' + role: '&3' + greetings: + - What brings you here? + dialog: + - Gotta make sure the\nlighthouse is working. + - Nice to see someone\ncome visit. + farewell: + - Goodbye. +primis_pontis_groves_lighthouse_generic_npc_2: + name: '&3Caelia Zoilus' + role: '&3' + greetings: + - Hey. + dialog: + - I hope he will\nbe alright. + - My turn to watch\nover the light. + - We almost ran\nout of food. + farewell: + - Bye. +primis_pontis_groves_lighthouse_sick_man: + name: '&3Alanus Secundas' + role: '&c' + dialog: + - I don't feel so good + - Hopefully I recover soon. + - Well, I am feeling a bit better. + - We need more food. + farewell: + - Farewell. +primis_pontis_groves_parkour_npc_1: + name: '&3Posuere Hominem' + role: '&c' + dialog: + - Up for a challenge? + - You think you got what it takes? + - Wanna go swinging? + - You a mad lad? + - No cheating! + farewell: + - See you later. +primis_pontis_groves_parkour_npc_2: + name: '&cIdoneitatem Hominem' + role: '&3' + dialog: + - That was impressive! + - Try and beat my record of 1m 47s. + - No cheating! + farewell: + - See you later. +primis_pontis_guard: + name: '&cPontis Guard' + role: '&8' + greetings: + - Want to upgrade gear? + dialog: + - Lost? Follow the bridge colors. + - Every bridge path has at least one color! + - Stay out of trouble! + - Don't cause any trouble! + - Pontis was built like a maze for defense. + - The bridge ceilings show that path's color! +primis_pontis_guard_1: + name: '&cPontis Guard' + role: '&8' + greetings: + - Want to upgrade gear? + dialog: + - Lost? Follow the bridge colors. + - Every bridge path has at least one color! + - Stay out of trouble! + - Don't cause any trouble! + - Pontis was built like a maze for defense. + - The bridge ceilings show that path's color! +primis_pontis_guard_2: + name: '&cPontis Guard' + role: '&8' + greetings: + - Hello! + dialog: + - This way to the shogun! +primis_pontis_guard_rat: + name: '&cPontis Elite Guard' + role: '&8' + greetings: + - Darn rats! + dialog: + - Filthy rats!!! + - Hold still,\ndarn you! + - Stop dodging\nmy attacks! + - Almost got one! + - Just die! + - Why wont you die!!! + - You can't dodge\nforever! + - Next strike! + - You're dead! + - How dare you\ndodge! + - Almost! +primis_pontis_guard_rat_at_wormhole: + name: '&cPontis Elite Guard' + role: '&8' + greetings: + - What's taking\nso long. + dialog: + - We got this\nunder control. + - Do not worry,\nthe elite guard\nis on the case! +primis_pontis_guard_shogun_1: + name: '&4Royal Guard' + role: '&8' + dialog: + - Don't go getting into trouble. + - Don't mind me, just keeping the peace. + - No funny business here. + - I've got my eye on you, adventurer. + - No questions, and no one gets hurt! + - Ain't got no time for messing around. + farewell: + - Safe travels, adventurer. +primis_pontis_guard_shogun_1_cat_quest: + name: '&4Royal Guard' + role: '&8' + dialog: + - Don't go getting into trouble. + - Don't mind me, just keeping the peace. + - No funny business here. + - I've got my eye on you, adventurer. + - No questions, and no one gets hurt! + - Ain't got no time for messing around. + farewell: + - Safe travels, adventurer. +primis_pontis_mille_arena_master_observatory: + name: Stella Hominis + role: + greetings: + - Hellos! + dialog: + - I hope to see many stars. + - Such heavenly bodies! + - The cosmos calls to me. + - Infinite possibilities. + - The ancient knowledge... + - I have tales to tell. + - If only you knew... + farewell: + - May the stars bless you. +primis_pontis_mille_concerned_shipmate: + name: '&3Delphium Calpurnius' + role: '&8' + dialog: + - Sigh. + - So much for my\nshipments... + farewell: + - Safe travels! +primis_pontis_mille_fields_camp_generic_npc_1: + name: '&cScribonia Ingenvinus' + role: '&c' + dialog: + - The most dangerous\nweapon is the one\nbetween your ears. + - Three arrows\nis all I need. + farewell: + - Catch ya later! +primis_pontis_mille_fields_camp_generic_npc_2: + name: '&cValador Lumus' + role: '&c' + dialog: + - I have hunted in\nmany places. + - Do you travel\na lot too? + farewell: + - May your blade be swift. +primis_pontis_mille_fields_camp_generic_npc_3: + name: '&cPhygia Ahala' + role: '&c' + dialog: + - Nothing like a\ngood hunt! + farewell: + - Stay safe. +primis_pontis_mille_fields_camp_generic_npc_4: + name: '&cAdrius Paterculus' + role: '&c' + dialog: + - The hunt calls! + farewell: + - Swift death. +primis_pontis_mille_fields_camp_generic_npc_5: + name: '&cCappadox Galerus' + role: '&c' + dialog: + - Join us, stranger! + farewell: + - Later. +primis_pontis_mille_fields_camp_generic_npc_6: + name: '&cSulpicio Rutilius' + role: '&c' + dialog: + - Hope our camp\nprovides you respite\nfrom the wild. + farewell: + - Bye. +primis_pontis_mille_fields_camp_generic_npc_7: + name: '&cAquarius Manus' + role: '&c' + dialog: + - Don't mind me just\nfetching some water. + - Clear blue water today. + farewell: + - Bye. +primis_pontis_mille_fields_camp_magmus: + name: '&cMagmus Hypnos' + role: '&4' + dialog: + - Where is Volumnia... + - I hope she isn't in\ntrouble again. + - I need a good rest. + - If only there were more\nhours in the day. + - Speak to me when you\nhave found Volumnia. + - So much work,\nso little time. + - Yet another 17 hour day. + - I worry too much. + farewell: + - Never enough time... +primis_pontis_mille_fields_farm_berry_npc: + name: '&9Dordalus Nasica' + role: '&e' + dialog: + - Berries are so tasty! + - You should eat\nmore berries! + - Why would they\nsteal my berries... + farewell: + - See'd ya later. +primis_pontis_mille_fields_farm_boy_npc: + name: '&9Planesium Victricius' + role: '&e' + dialog: + - So many rats... + - Phew almost\ndone here. + - This thing better hold. + - Any more lifting and\nI'm gonna break. + - The view from here\nis really nice. + - OK, back to work! + farewell: + - Try some our berries! +primis_pontis_mille_fields_farm_npc: + name: '&9Milonia Majus' + role: '&e' + dialog: + - Get away, darn rats! + - Stop eating my goods! + - Sigh... + farewell: + - Later. +primis_pontis_mille_fields_farm_well_npc: + name: '&eVolumnia Zoilus' + role: '&c' + dialog: + - Watch out for its spit! + - Its saliva is toxic. + - Please help! + - I hope nobody hears\nabout this... + - Am I glad to see you! + farewell: + - How could I let this happen. +primis_pontis_mille_fields_windmill_npc_1: + name: '&eDinia Niraemius' + role: '&d' + dialog: + - Plenty of wheat to process! + - No flour no bread. + - Do you like bread too? + farewell: + - See you. +primis_pontis_mille_fields_windmill_npc_2: + name: '&eDaemones Maritialis' + role: '&d' + dialog: + - It's so nice out here! + - Do you like my windmill? + - Just out here on break. + farewell: + - See you. +primis_pontis_mille_fields_windmill_npc_3: + name: '&eAdulescens Lupis' + role: '&d' + dialog: + - Hoping for some good wind! + - Need some flour? + - This one is the best Windmill around! + farewell: + - Bless ya. +primis_pontis_mille_general_bromia: + name: '&6Bromia Curio' + role: '&6General' + greetings: + - Hail! + dialog: + - It's time for war! + farewell: + - Goodbye! +primis_pontis_mille_general_cylindrus: + name: '&eCylindrus Celatus' + role: '&eGeneral' + greetings: + - Hail! + dialog: + - There is not enough time! + farewell: + - Goodbye! +primis_pontis_mille_general_godefridus: + name: '&cGodefridus Novation' + role: '&c' + greetings: + - Greetings! + - Hail! + dialog: + - Someone needs to drop\noff these documents. + - So many candles... + farewell: + - See you +primis_pontis_mille_general_rogerius: + name: '&eRogerius Olennius' + role: '&eGeneral' + greetings: + - Hail! + dialog: + - So much to do! + - I hope those 4 are ok... + farewell: + - Bye! +primis_pontis_mille_lighthouse_man: + name: '&3Hegio Remus' + role: '&c' + dialog: + - It is so beautiful up here. + - The best view... + farewell: + - Farewell. + - The sun sets! +primis_pontis_mille_major: + name: '&cFortes Bellator' + role: '&c' + greetings: + - Hello traveler! + - Hail! + dialog: + - Those darn goblins! + farewell: + - Farewell! +primis_pontis_mille_mew_meowzer: + name: '&aMew Meowzer' + role: '&d' + dialog: + - Meooooww! + - Meow... + - Mreeeooooowww... + - Meowww. + - MEOW! + farewell: + - Prrrr meow! +primis_pontis_mille_observatory_arena_turn_in: + name: Virgo Dexippus + role: + greetings: + - Hi! + dialog: + - Stella knows a lot. + - Stars have so much to tell. + - The light tells all. + farewell: + - May the moon light your way. +primis_pontis_mille_royal_guard_centurion: + name: '&4Royal Guard Centurion' + role: '&8' + dialog: + - No dallying! + - Set up camp! + - Where are our reinforcements? + - How many have fallen? + - We need to reorganize! + farewell: + - Tread lightly and carry a big sword. +primis_pontis_mille_scout_1: + name: '&cSyra Ursacius' + role: '&cWounded Scout' + greetings: + - Hail! + dialog: + - I can barely hold on... + farewell: + - Bye! +primis_pontis_mille_scout_2: + name: '&cSparax Auxilius' + role: '&cWounded Scout' + greetings: + - Hail! + dialog: + - The pain... + farewell: + - Bye! +primis_pontis_mille_scout_leader: + name: '&cBlepharo Octavius' + role: '&cScout Leader' + greetings: + - Hail! + dialog: + - It was too much... + farewell: + - Bye! +primis_pontis_mille_shogun: + name: '&6Navita' + role: '&c' + greetings: + - Sim? + dialog: + - Can I help you? + farewell: + - Walk softly, and carry a big gun. +primis_pontis_mille_slums_generic_npc_1: + name: '&7Gallicles Rex' + role: '&7' + dialog: + - It's not much but its our\nlittle part of town + farewell: + - Later. +primis_pontis_mille_slums_generic_npc_2: + name: '&7Gallicles Caelistis' + role: '&7' + dialog: + - Day by day... + farewell: + - '...' +primis_pontis_mille_slums_generic_npc_3: + name: '&7Nicodemus Frontinus' + role: '&7' + dialog: + - Fresh water for\nthe home. + farewell: + - The well serves\nus well +primis_pontis_mille_slums_generic_npc_4: + name: '&7Cocus Lucio' + role: '&7' + dialog: + - Hope you're having\na great day. + farewell: + - Enjoy your stay. +primis_pontis_mille_slums_generic_npc_5: + name: '&7Cornelia Florius' + role: '&7' + dialog: + - Which one should\nI get... + farewell: + - So many pretty\nflowers. +primis_pontis_mille_slums_generic_npc_6: + name: '&7Rutilia Placidus' + role: '&7' + dialog: + - I love it here. + - The smell of hay\nmakes me happy. + - My favorite place to\nrelax after a hard day. + farewell: + - Hay ya later! +primis_pontis_mille_slums_npc_1: + name: '&7Lena Lucan' + role: '&7' + dialog: + - Just one loaf of bread... + farewell: + - Wonder what tomorrow brings. +primis_pontis_mille_slums_npc_2: + name: '&7Tranio Florens' + role: '&7' + dialog: + - Doing OK today\nactually. + farewell: + - Night save ya. +primis_pontis_mille_slums_npc_3: + name: '&7Rufia Tertulus' + role: '&7' + dialog: + - At least something\ngood for\nthe kids. + - Not much at\nthe market... + - I cannot\nafford that. + farewell: + - Later. +primis_pontis_mille_slums_npc_4: + name: '&7Fabia Praetextus' + role: '&7' + dialog: + - Just close my eyes\nfor a second. + - Gotta imagine I am\nat a better place. + farewell: + - Goodbye. +primis_pontis_mille_slums_npc_5: + name: '&7Augustina Verrucosis' + role: '&7' + dialog: + - So many mouths\nto feed. + - Maybe some fruit\nfor the little\nones. + farewell: + - Bye. +primis_pontis_mines_guard_1: + name: '&cPontis Guard' + role: '&c' + greetings: + - HELP!!! + dialog: + - Please kill them! + - I am so scared. +primis_pontis_mines_guard_2: + name: '&cPontis Guard' + role: '&c' + greetings: + - SOMEONE PLEASE!!! + dialog: + - I don't wanna die! + - Can't hold out any more. +primis_pontis_mines_guard_3: + name: '&cPontis Guard' + role: '&c' + greetings: + - SAVE ME!!! + dialog: + - Are they gone? + - GET ME OUT! +primis_pontis_outpost_officer: + name: '&4NAME ME' + role: '&8' + dialog: + - I am unfinished! + - There is supposed\nto be an outpost\nhere. + farewell: + - Bye! +primis_pontis_redwoods_injured_lumberjack: + name: '&6Lyco Lupicinus' + role: '&6' + greetings: + - Heyo! + dialog: + - Darn saw! + - Got me again... + farewell: + - See you later. +primis_pontis_redwoods_lumberjack: + name: '&6Ligna Crispian' + role: '&6' + greetings: + - Greetings! + dialog: + - I love the look of a healthy tree. + - The brown tree really smells. + - |- + Pretty sure I saw a wolf on two legs + creeping around at night around here. + farewell: + - Until next time. +primis_pontis_redwoods_lumberjack_generic_1: + name: '&6Mulier Proculus' + role: '&6' + greetings: + - Hey-yo! + dialog: + - I wish they would leave us alone. + - Perfect day for logging. + farewell: + - Pinecone ya later! +primis_pontis_redwoods_lumberjack_generic_10: + name: '&6Piscatores Trenico' + role: '&6' + greetings: + - Well met! + dialog: + - Go away wolves! + - Leave me alone, darn fur-balls! + - Hah! Try and reach me up here! + farewell: + - Bye, Bye! +primis_pontis_redwoods_lumberjack_generic_2: + name: '&6Alanus Hermina' + role: '&6' + greetings: + - Hi... + dialog: + - Not so loud, keep it down. + - I am catching an extra break. + - Don't tell em I am here. + - Logging is tough work... + farewell: + - Later +primis_pontis_redwoods_lumberjack_generic_3: + name: '&6Lena Triarius' + role: '&6' + greetings: + - What's up! + dialog: + - Just standing here buzzin! + - Operating the saw is kinda fun. + - Gotta make sure you don't get hurt. + farewell: + - Catch you later! +primis_pontis_redwoods_lumberjack_generic_4: + name: '&6Aquila Isatis' + role: '&6' + greetings: + - How's it going! + dialog: + - Darn logs! + - No, not that way! + - Float better!!! + - Yep, that will do it. + farewell: + - See ya! +primis_pontis_redwoods_lumberjack_generic_5: + name: '&6Sulpicio Sidonius' + role: '&6' + greetings: + - Hi! + dialog: + - Nothing like a nice fire! + - Just relaxing after an honest day of work. + - Join us! + farewell: + - Bye, friend! +primis_pontis_redwoods_lumberjack_generic_6: + name: '&6Strobilus Clemens' + role: '&6' + greetings: + - Salutations! + dialog: + - Chopping like a beaver! + - The fastest axe in the west. + - No tree is a match for me! + farewell: + - Smell ya later! +primis_pontis_redwoods_lumberjack_generic_7: + name: '&6Candidus Nigellus' + role: '&6' + greetings: + - Greetings! + dialog: + - Fastest axe...my bottom! + - Don't take his ramblings seriously. + - Mr. big-shot sure has a lot to say. + farewell: + - Goodbye! +primis_pontis_redwoods_lumberjack_generic_8: + name: '&6Strobilus Clemens' + role: '&6' + greetings: + - I'm a bit busy! + dialog: + - We need to increase production... + - If we raise the cost... + - Need to order more axes. + farewell: + - Uh... +primis_pontis_redwoods_lumberjack_generic_9: + name: '&6Martinus Lepontus' + role: '&6' + greetings: + - Woah, hello! + dialog: + - You're coming down big one! + - I will show you! + - My axe, your bark, they should meet. + - Start off with a good chop. + farewell: + - Scared me... +primis_pontis_redwoods_lumberlord: + name: '&6Magnus Castorea' + role: '&6' + greetings: + - HELLO! + dialog: + - Nothing like healthy wood. + - |- + For every tree we cut, + we plant a new one! + - Big brown logs, yep. + farewell: + - BYE! +primis_pontis_redwoods_reyn: + name: '&6Reynus Protectoris' + role: '&6' + greetings: + - I am turning up the heat! + - Hiya! + dialog: + - Are you into logs? + - I love the smell of lumber! + farewell: + - See you later. + - Bye bye! +primis_pontis_scrapper: + name: '&7Fragmentum' + role: '&8' + greetings: + - Got something to scrap? + - Got trash? + - Need scrappin'? + dialog: + - I'll scrap anything you bring! + - Need scrap? + - Want scrap? +primis_pontis_smelter: + name: '&7Orbis' + role: '&8' + greetings: + - Want to upgrade gear? + dialog: + - Need upgrade orbs? + - I'll make upgrade orbs for scrap! + - Bring me scrap! +primis_sewer_donatello: + name: '&5Donatello' + role: '&dSewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_sewer_leonardo: + name: '&1Leonardo' + role: '&9Sewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_sewer_michelangelo: + name: '&6Michelangelo' + role: '&eSewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_sewer_raphael: + name: '&4Raphael' + role: '&cSewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_spa_attendee_1: + name: '&fNatsumi' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_2: + name: '&5Hanako' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_3: + name: '&3Tamika' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_4: + name: '&9Zaphra' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_5: + name: '&4Chie' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_6: + name: '&fKatashi' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_7: + name: '&dAkihiko' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_8: + name: '&6Sheranee' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - Rawr... + - OwO + farewell: + - Have fun! +primis_spa_staff: + name: '&cAozora' + role: '&7' + dialog: + - Enjoy the hot spring! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_staff_2: + name: '&6Rei' + role: '&7' + dialog: + - Enjoy the hot spring! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_terravilla_annoyed_explorer: + name: '&6Dorippa Sarimarcus' + role: '&6' + greetings: + - How's it going. + dialog: + - Not again. + - Stuck once more. + farewell: + - Be seeing you. +primis_terravilla_explorer: + name: '&6Telestis Senna' + role: '&6' + greetings: + - How goes it. + dialog: + - Always so\nbusy. + - Need a bag? + farewell: + - Bye. +primis_terravilla_generic_npc_1: + name: '&6Stephanium Major' + role: '&6' + greetings: + - Welcome to Terravilla! + dialog: + - Watch out for the\nTwo Legged Terrors! + - Here to check out the ruins? + farewell: + - Bye. +primis_terravilla_generic_npc_10: + name: '&6Mallia Galvisius' + role: '&6' + greetings: + - Heyo! + dialog: + - I would rather be in\ndown in the ruins... + - Hog watching to\npass the time. + farewell: + - Laters. +primis_terravilla_generic_npc_11: + name: '&6Papiria Virginius' + role: '&6' + greetings: + - Ok then... + dialog: + - Hit him harder! + - Woah! Good one! + - Yeah! Mess him up! + farewell: + - Yep... +primis_terravilla_generic_npc_12: + name: '&6Umbria Maccalus' + role: '&6' + greetings: + - What! + dialog: + - Is a girl not\nallowed to be\non a rooftop. + - Just try and\nget me down! + farewell: + - Yeah, whatever... +primis_terravilla_generic_npc_2: + name: '&6Delphium Assanius' + role: '&6' + greetings: + - Leave me alone! + dialog: + - What are you\nlooking at. + farewell: + - Scram! +primis_terravilla_generic_npc_3: + name: '&6Stephanium Vopiscus' + role: '&6' + greetings: + - Leave me alone! + dialog: + - What are you\nlooking at. + farewell: + - Scram! +primis_terravilla_generic_npc_4: + name: '&6Simo Clericus' + role: '&6' + greetings: + - Hey! + dialog: + - Heard the hog is on\nthe lift again. + farewell: + - Bye. +primis_terravilla_generic_npc_5: + name: '&6Harpax Colias' + role: '&6' + greetings: + - Ello. + dialog: + - The bo...I mean the\nOverseer is upstairs. + farewell: + - Laters. +primis_terravilla_generic_npc_6: + name: '&6Sulpicio Epolonius' + role: '&6' + greetings: + - Hi there. + dialog: + - I hope the ruins\nopen up again soon. + - I miss artifact\nhunting. + farewell: + - Goodbye. +primis_terravilla_generic_npc_7: + name: '&6Baebia Lucan' + role: '&6' + greetings: + - '...' + dialog: + - Cringe... + farewell: + - '...' +primis_terravilla_generic_npc_8: + name: '&6Novia Longinus' + role: '&6' + greetings: + - '...' + dialog: + - Are you always\nstaring at people? + - How about some\nprivacy? + farewell: + - '...' +primis_terravilla_generic_npc_9: + name: '&6Septimia Baro' + role: '&6' + greetings: + - Oh, hey. + dialog: + - If it opens up again\nthen I gotta go\nget more of these. + - What is this skull\nnfrom hmm... + farewell: + - '...' +primis_terravilla_overseer: + name: '&6Lutum Princeps' + role: '&6' + greetings: + - Yes? + dialog: + - What is it\nnow... + - I need to check\nup on them. + - At least I\nam not bored. + farewell: + - Good luck. +primis_terravilla_researcher: + name: '&6Plautia Suilius' + role: '&6' + greetings: + - Hmm... + dialog: + - Maybe if... + - That can't be right + - Not sure... + farewell: + - Later... +primis_traveler_1: + name: '&6Lysidamus Nolus' + role: '&6' + greetings: + - Hello stranger! + dialog: + - On my way back from the village. + - Heading to the village? + - Good luck on\nyour travels. + farewell: + - Roads bless you. +primis_traveler_2: + name: '&6Citro Gala' + role: '&6' + greetings: + - Hi! + dialog: + - On my way back\nfrom the village. + - Coming from Pontis Mille or? + - Good luck! + farewell: + - Roads bless you. +primis_traveler_3: + name: '&6Bromia Culleolus' + role: '&6' + greetings: + - Hello! + dialog: + - Are you too going\nto the village? + - I heard it's pretty\ncold there at\nthe village. + - Phew! Almost there!\nI gotta keep going. + farewell: + - Roads bless you. +primis_traveler_4: + name: '&6Demenis Nolus' + role: '&6' + greetings: + - Hello stranger! + dialog: + - Good to see someone\nelse on the road. + - Almost reached the village. + - Phew! + farewell: + - Roads bless you. +primis_traveler_5: + name: '&6Callipho Classicius' + role: '&6' + greetings: + - Heya! + dialog: + - I need better shoes. + - Soon I will\nbe home. + - Good to see the\nfields again! + farewell: + - Safe travels! +primis_traveler_6: + name: '&6Rodenus Palis' + role: '&6' + greetings: + - Hi there! + dialog: + - I am on my way back\nfrom the village. + - Good to see\nPontis Mille again. + - Is my brother lost again... + - Where is he? + farewell: + - Later! +primis_traveler_7: + name: '&6Gorenus Palis' + role: '&6' + greetings: + - Hey... + dialog: + - Am I lost again? + - This isn't Pontis Mille. + - Where am I? + - Uhh, this doesn't\nseem like the\nright way... + farewell: + - Bye. +quest_giver: + name: Qel'Thuzad + role: + greetings: + - Saudações, aventureiro!\nGostaria de uma missão? + - Você! Eu tenho uma missão! + - Se sentindo... aventureiro? + dialog: + - Complete missões da guilda\npara recompensas legais! + - Missões de nível mais alto têm\nmelhores recompensas! + - Missões de nível mais alto fazem\nvocê caçar mobs de nível mais alto! + - Quer um desafio mais difícil?\nAumente sua classificação na guilda! + - Certifique-se de estar bem equipado\npara essas missões! + farewell: + - Boas viagens, amigo. + - Caçada feliz! + - Vida longa e próspera! + - Volte com seu escudo\n ou nele. + - Vida antes da morte! + - Força antes da fraqueza! + - Viagem antes do destino! +refiner_config: + name: Ralph + role: + greetings: + - Quer atualizar sua sucata? + - Tem sucata? + - Procurando sucata de baixo nível! + - Saudações, tem sucata? + - Eu reciclo sua sucata! + dialog: + - Precisa atualizar sua sucata? + - Upgrade your scrap here! + - Atualize 10 sucatas para um nível superior! + - Torne seu scrap mais útil! + - Tem sucata de baixo nível? + farewell: + - Volte quando tiver\nmais para sucata de baixo nível + - Não se esqueça de tornar esse\nsucata útil! + - Vá entrar em uma sucata! +repairman_config: + name: Reggie + role: + greetings: + - Conserte seus itens! + - Reparando itens para sucata! + - Transforme aquela sucata em durabilidade! + - Precisa de um reparo? + - Tem itens danificados? + dialog: + - Os melhores reparos da cidade! + - Eu tenho um reparo! + - Precisa de um reparo? + - Eu vou consertar seus itens! + - Precisa de itens de elite reparados? + farewell: + - Não se esqueça de fazer a manutenção! + - Estarei aqui se precisar de mim! + - Ligue para mim se quiser falar comigo,\nse quiser me chamar, tudo bem +santa: + name: '&4Saint Nick' + role: '&c' + greetings: + - Ho ho ho! + dialog: + - I have lost some presents, \ncan you help me? + - Dear traveller, I have\na request for you! + - Can you help an old man\nin his time of need? + farewell: + - Ho ho ho! +scrapper_config: + name: Kelly + role: + greetings: + - Quer se livrar de itens? + - Precisa reciclar itens? + - Procurando sucata? + - É sucata 'o relógio! + - Tempo de sucata! + dialog: + - Ofertas malucas! + - Pegue sua sucata aqui! + - 75% de chance de trabalhar! + - Não há reembolsos. + - Recicle, reutilize, reduza! + farewell: + - Volte quando tiver\nmais para desfazer + - Não se esqueça de tornar esse\nsucata útil! + - Feliz sucateamento! +smelter: + name: Sam + role: + greetings: + - Tem sucata? + - Tem sucata extra? + - Sinto cheiro de sucata em você!? + - Por favor, preciso de sucata! + - Alimente-me sucata! + dialog: + - Eu vou fazer o seu recado útil! + - Dê-me sucata e eu lhe darei orbes de atualização! + - Sucata é inútil, dê para mim! + farewell: + - Volte quando tiver\nmais sucata + - Saindo do atualizador para você! +special_blacksmith: + name: Grog + role: + greetings: + - Preciso de algo? + - Tem alguma coisa boa? + - Não temos nada além do melhor + - Tem algo que valha a pena vender? + - Nós só compramos equipamentos de elite da máfia. + dialog: + - Compramos na baixa e vendemos na alta. + - Sem reembolsos. + - Absolutamente nenhum reembolso. + - Não há reembolsos. + - No taksies backsies. + - As compras na loja são finais. + farewell: + - Volte quando tiver\nmais para gastar + - Não se deixe matar,\nqueremos que você nos traga\nmais equipamentos. + - Da próxima vez compre algo \nmais caro. + - Não se esqueça, não há reembolso. +test_npc: + name: Test NPC + role: Testing! + greetings: + - Test Greeting! + dialog: + - Test Dialog! + farewell: + - Test Farewell! +travelling_merchant: + name: Jeeves + role: + greetings: + - Tem algo para vender? + - Você chamou? + - Hã? + dialog: + - Vou comprar barato! + - Tem algo para mim? + - Tempo é dinheiro! + farewell: + - Me ligue novamente a qualquer hora! + - Isso era tudo? + - Viagens seguras! + - Não se deixe ser morto! + - Boa caçada! +unbinder: + name: Ulfric + role: + greetings: + - Saudações. + - Bem cumprido. + - Salve, amigo. + - Sim? + - Posso te ajudar? + dialog: + - Vou desvincular seus itens\npara um pergaminho de desvinculação extremamente raro. + - Eu sou o único qualificado\npara desvincular suas mercadorias. + - Tem um pergaminho de desvinculação? + farewell: + - "Lembre-se: use desvincular\nrola com sabedoria." + - Boas viagens, amigo. +wood_league_arena_master: + name: Gladius + role: + greetings: + - Welcome to the\nArena! + dialog: + - Prepared to face the arena? + farewell: + - Return with your shield, or on it! +wood_league: + arenaName: Wood League + arenaMessages: + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - wave=8:message=&8[Gladius] &fNot bad, but what if every enemy is a &cmelee &fenemy? + - wave=9:message=&8[Gladius] &fNice, nice, but what if they're all &cranged &finstead? + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - wave=44:message=&8[Gladius] &fThis is clearly not working, let me think of something... + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +ag_welcome_quest_0: + customObjectives: + Objective1: + dialog: + - '&8[&aCasus&8]&f Welcome to the Adventurer''s Guild Hub, the hub for all things EliteMobs!' + - You can always get back here using &2/ag&f! + - Talk to me again for a quest! + name: '&2Finding the AG!' + questLore: + - + - + questAcceptDialog: + - '&8[Odigos]&f Alright, make sure you use &2/ag &f or &2/adventurersguild&f to head off to the Adventurer''s Guild Hub!' + - Make sure you talk to Casus when you're there! +ag_welcome_quest_1: + customObjectives: + Objective3: + dialog: + - '&8[&aGreg&8]&f Want to buy or sell something? I''ve got a little of everything!' + Objective4: + dialog: + - '&8[&aCharles&8]&f Want to learn about fighting elites? Just talk to me!' + Objective1: + dialog: + - '&8[&aHermes&8]&f I take you back to where you were before! Just talk to me again!' + Objective2: + dialog: + - '&8[&aBartley&8]&f Need a stiff drink? My drinks pack an extra punch!' + Objective7: + dialog: + - '&8[&aQel''Thuzad&8]&f These Elite monsters, where do they keep coming from?' + - + - + - Just talk to me to get one! + Objective12: + dialog: + - '&8[&aGrog&8]&f Want to buy special items? I''ve got just the thing!' + Objective8: + dialog: + - '&8[&aRalph&8]&f Get more out of your scrap by upgrading it! Just talk to me at any time.' + Objective13: + dialog: + - '&8[&aUlfric&8]&f If you bring me a very special and rare item, I can unbind your Elite items.' + - + - + Objective5: + dialog: + - '&8[&aTim&8]&f Want to upgrade your Elite Items? Just get an upgrade orb from Sam over there!' + Objective10: + dialog: + - '&8[&aKelly&8]&f Got extra Elite items? Don''t know what to do with them? Give them to me, and I''ll turn them into scrap!' + - + - + Objective6: + dialog: + - '&8[&aGillian&8]&f Do you seek power? Do you desire to reach new heights? Talk to me to unlock new guild ranks, and reach levels of power you never thought to be possible!' + Objective11: + dialog: + - '&8[&aSam&8]&f Got extra scrap? I can refine that into Upgrade Orbs, which you can give to Tim to upgrade your Elite items with!' + Objective9: + dialog: + - '&8[&aReggie&8]&f Need your Elite items repaired? Just bring me some scrap, and I''ll make them as good as new!' + - + - + name: '&2Welcome to the AG!' + questLore: + - '&aMeet the Adventurer''s Guild NPCs!' +primis_caeruleaum_a_can_of_worms: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis] &fPlease tell me you''re the one bringing the bait.' + name: '&2A can of worms' + questLore: + - Here, take the bait and go. + - Please hurry! + questAcceptDialog: + - '&a[Callidus Piscatus]&f My friend is in a boat near the docks!' + - '&7&oI should hurry to the boat.' + questCompleteMessage: + - '&a[Piscis Nemesis]&f You brought bait? Perfect!' + - The bait should lure it out! + - '&7&oI should talk with Nemesis.' +primis_caeruleaum_fishing: + name: '&2Fish Bait' + questLore: + - We have a big problem! + - + - + - + - + - but he can't do anything without the right bait! + - I'll tell you where to go get &eFish Bait &f, please go help my friend! + - I promise I'll reward you! + questAcceptDialog: + - '&a[Callidus Piscatus]&f Time is of the essence! There are a bunch of &cBig Worms&f to the right when you leave the village!' + - Get 5 and come back here and I will prepare them for use. + - '&7&oI should go get some Fish Bait.' + questCompleteMessage: + - '&a[Callidus Piscatus]&f You brought bait? Perfect!' + - I'll prepare it right away! + - '&7&oI should talk to &aCallidus &7&oagain and collect the prepared bait.' +primis_caeruleaum_fishing_2: + name: '&2Monster Bait' + questLore: + - That did the trick! Hop into the wormhole, I'll hold the boat! + - Let's show this monster the wrath of a fisherman! + questAcceptDialog: + - '&a[Piscis Nemesis]&f Hop in, I''ll hold the boat!' + - Don't forget to put on that &eDiving Helmet&f! + - '&7&oI should enter the wormhole and defeat the Sea Monster.' + questCompleteMessage: + - '&a[Piscis Nemesis]&f Haha! What a show!' + - '&fOf course, I had the situation under control this entire time, but you sure helped a bit!' + - '&fHere, you can have this!' + - '&7&oThe monster is dead and the shore is safe. Seems like a job well done.' +primis_caeruleaum_fletching: + name: '&2Arrow Hunter' + questLore: + - Got a few minutes to help out? + - With all the recent raids, we have found ourselves out of &eGrappling Arrows&f! + - It is usually my job to get them, but things are just a + - bit too dangerous right now for me to go dungeon delving. + - If you could get these &eGrappling Arrows&f for me, + - I will teach you how to use them! + questAcceptDialog: + - '&a[Ventus Artifex]&f Please bring me 10 &eGrappling Arrows &ffrom the ruins just beyond the village.' + - The &cUndead Skeletons&f and &cDrowned&f from of old usually carry these. + - '&7&oI should go kill &cSkeletons&7&o and &cDrowned&7&o at the ruins near the village for their &eGrappling Arrows&7&o.' + questCompleteMessage: + - '&a[Ventus Artifex]&f Great work!' + - '&eGrappling Arrows &fcan be used on &cTarget Blocks &fto get to hard to reach places.' + - They are a must have for the aspiring ancient ruin delver. + - Here is your reward! + - How about putting your knowledge to the test? + - '&7&oSeems like &aVentus Artifex&7&o has a challenge for me.' +primis_caeruleaum_fletching_2: + name: '&2Shield Hunter' + questLore: + - You got the arrows? Great! + - Use those arrows with a bow to climb the tower! + questAcceptDialog: + - '&a[Ventus Artifex]&f Use the arrows you just received to go to the ruins and shoot the targets with them!' + - + - + - + - + - '&7&oI should go get the &eShield&7&o inside of the ruins, using the &eGrappling Arrows&7&o in order to shoot the targets inside of the building.' + questCompleteMessage: + - '&a[Ventus Artifex]&f Outstanding!' + - Truly you are a real ruins delver! + - Here is your reward! + - '&7&oSeems like Grappling Arrows will be useful in the future.' +primis_caeruleaum_foraging: + name: '&2Wolf Bait' + questLore: + - I heard you were looking to help out around here. + - There is a &dDen of Wolves&f nearby that is + - really impeding my foraging for the village! + questAcceptDialog: + - '&a[Venator Pabulatus]&f If you can get rid of those pesky &cWolves&f, I will reward you handsomely!' + - I am getting too old to be dealing with the wild things of these lands... + - '&7&oI should go kill the &cWolves&7&o in the den to the Southeast of the village.' + questCompleteMessage: + - '&a[Venator Pabulatus]&f I knew I could count on you!' + - Thank you for all of your help! + - Here is your reward as promised. +primis_farmstead_lighthouse_keeper_2: + customObjectives: + Objective1: + dialog: + - "&a[Jeeves]&f &2Amavit&f sent you? What's this about a lighthouse? My, what a discovery!\n&fThis will revolutionize my job as a traveling merchant! Here, have these &eScrolls&f - just call me and I'll be there in a jiffy!\n&7&oSeems like &aJeeves&7&o has something for me. I should talk to him." + name: '&2The Mysterious Lights' + questLore: + - + - + - My father &aJeeves&f went to the top to check but he has not returned yet. + - + - + questAcceptDialog: + - '&a[Amavit]&f Thank you once again, and good luck. Hopefully it''s nothing.' + - '&7&oI should go to the &dTop of the Lighthouse&f, investigate the issue and then report back to &aAmavit''s&f father &aJeeves&f in the village.' + questCompleteMessage: + - '&7&oThese scrolls seem mighty useful! I should use the &dLighthouse&7&o to get back to the &dFarmstead&7&o and keep moving.' +primis_gladius_assassins: + name: '&5Who snipes the snipers?' + questLore: + - The roofs of &dGladius&f are covered in &cAssassins&f! + - Venturing out to the streets is a death sentence. We need to deal with these snipers! + - + - + questAcceptDialog: + - '&a[Belli] Deal with those &cAssassins&f! Remember to use the &eGrappling Arrows&f!.' + - '&7&oI should kill those &cAssassins&7&o.' + questCompleteMessage: + - '&a[Belli]&f You dealt with those &cAssassins&f? Good! That''s one headache dealt with!' +primis_gladius_clear: + name: '&5Taking back the streets' + questLore: + - I don't need to tell you that the town is being invaded, do I? + - We are offering a reward to those willing to put a dent in the amount of &cInvaders&f. + - Are you up for it? + questAcceptDialog: + - '&a[Belli] &fJust go out there and thin their numbers!' + - '&7&oI go out and clear the streets of &dGladius&7&o.' + questCompleteMessage: + - '&a[Belli]&f Look at that, the Gods have provided with a true warrior in our time of need! I have a job for a person like you.' + - '&7&oSeems like &aBelli&7&o has a plan for me. I should talk to her..' +primis_gladius_prayer: + name: '&5Leap of faith' + questLore: + - I am not going to sugarcoat it, things look downright grim! + - The walls have fallen, the streets are teeming + - with the &cUndead&f and I just ran out of drinks. + - At times like these, people turn their hope to + - some kind of divine intervention! + - There is a &dPath&f, lit by candles, that leads to a + - '&dSanctuary in the Mountains&f.' + - Warriors go up this path and defeat the &cMonk&f which guards + - the sanctuary in order to be blessed by the war god in combat. + - It may just be a superstition, but would it hurt + - to give people hope? + - The fact you made your way here shows you are a cut above + - the rest - go up the mountain and defeat the &cMonk&f. + - All warriors will feel better knowing they are being watched over. + questAcceptDialog: + - '&a[Belli] &fGo &dUpstairs&f and follow the candles! Careful not to fall, the path is treacherous!' + - '&7&oI should follow the &dandle Path&7&o and defeat the &cMonk&7&o.' + questCompleteMessage: + - '&a[Belli]&f You completed the prayer? Thank you, the soldiers will feel relieved to hear it.' +primis_gladius_ships: + name: '&5A sinking feeling' + questLore: + - Have you seen them? The dozens of ships just outside + - of &dGladius&f? They are to blame for all of this. + - We never expected an invasion from the &dBlood Temple&f, + - much less one done by siege weapons mounted on boats! + - We must do something about it. Killing the &cAdmiral&f + - and some of the forces won't give us back what we lost, + - but it will sure make us feel better. + questAcceptDialog: + - '&a[Belli] &fKill the &cAdmiral&f and some of the troops on the boats. Be careful about their water superiority! I recommend using &eGrappling Arrows&f to move around the ships.' + - '&7&oI should go slay the &cAdmiral&7&o and some of its troops on the boats just &dOutside of Gladius&7&o.' + questCompleteMessage: + - '&a[Belli]&f The admiral is no more? Why, I feel better already!' +primis_gladius_sunken_ship: + name: '&5Sunken ship' + questLore: + - Now that you took care of the &cMariner Forces&f I got + - another task for you. + - The &dSunken Ship&f should be reachable now. + - You see some time ago one of our ships got sunk, + - unfortunately it was carrying &eImportant DDocuments&f. + - I need you to reach the &dSunken Ship&f and kill any threats + - around and retrieve the &eDocuments&f. + - Come back to me after you have completed the task. + questAcceptDialog: + - '&a[Belli] &fYou will find the ship in the waters to the south-west. Give them hell!' + - '&7&oI should go collect the &eDocuments&7&o and slay any &cMariners&7&o near the ship.' + questCompleteMessage: + - '&a[Belli]&f Back already? Excellent work! We really needed these &eDocuments&f.' +primis_gladius_supplies_1: + name: '&cSupplying problems' + questLore: + - We are running out of &eSupplies&f! + - '&dGladius&f is a fortress equipped to last a long siege' + - without any issues, but that's assuming we have + - access to the &dWarehouse&f! + - Unfortunately the &dWarehouse&f was one of the first places to fall, + - and now we are slowly starving to death! + - If you can clear a path to the &dWarehouse&f and get some &eSupplies&f + - that would greatly aid in the war effort! + questAcceptDialog: + - '&a[Cibus]&f The &dWarehouse&f is hard to miss! It''s the extra large warehouse-looking building near the part where the wall fell! Grab some &eSupplies&f and get them back here!' + - '&7&oI should go to the &dWarehouse&7&o and bring back &eSupplies&7&o.' + questCompleteMessage: + - '&a[Cibus]&f You brought the &eSupplies&f back? Fantastic! Meanwhile I came up with the perfect idea for the drinks - and it should be something that will lift the spirits of the soldiers!' + - '&7&oSeems like the &aCibus&7&o has a plan, I should talk to them.' +primis_gladius_supplies_2: + name: '&cSupplying more problems' + questLore: + - We have food, but what about drinks? + - Some would say it's foolish to get drunk in the middle + - of a war, but if now then when? + - The &cBarkeep&f across the street kept all of the good + - stuff in the &dBasement&f. + - I think you know where I'm going with this! + - Go to the &dBasement&f of the tavern across the street and get + - the &eGood Stuff&f. If you find the &cBarkeep&f, I'd consider it a + - personal favor if you free him from this curse of undeath. + - We are pretty sure that he was in the &dBasement&f when the + - invasion happened so odds are he is still there, + - though probably no longer himself. + - Be careful! + questAcceptDialog: + - '&a[Cibus]&f The &dTavern&f is right across the street, hard to miss! Just head to the &dBasement&f and get the &eGood Stuff&f!' + - '&7&oI should go to the &dBasement&7&o of the tavern and get "the &eGood Stuff&7&o".' + questCompleteMessage: + - '&a[Cibus]&f You defeated the &cBarkeep&f? I thank you for freeing my old man from this accursed undeath. Here, I''ll have the first drink with you.' +primis_ice_village_all_out_of_chains: + customObjectives: + Objective1: + dialog: + - '&a[Orbis]&f Oh, the Ice Village chain shipment. Yes, it is right in that chest over there.' + - Sorry for not sending it over, but we were quite busy and had no time. + - It's all paid for so feel free to just grab it. + name: '&2All out of chains' + questLore: + - Hey, you came from &dPontis Mille&f right? + - How would you like to help us out. + - Here at the jail we tend to go through a + - lot of chains... + - Especially the chains holding up the cages. + - They rust a lot and then they break. That's + - how one of the prisoners escaped. The rusty + - chain snapped, the cage fell and he ran. + - We paid for a + - '&eShipment of new chains&f, but it' + - did not arrive yet. If you could go to + - '&dPontis Mille&f and fetch our' + - '&eShipment of Chains&f' + - then that would be great! + questAcceptDialog: + - '&a[Philolaches Triferus]&f Go talk to Orbis. They are the ones that make the chains.' + - '&7&oI should go talk to &a&oOrbis&7&o and bring back the &e&oShipment of Chains&7&o.' + questCompleteMessage: + - '&a[Philolaches Triferus]&f Those are the chains! Thank you for getting these, we really needed them.' +primis_ice_village_catch_me_if_you_can: + name: '&2Catch me if you can' + questLore: + - What timing! I was just looking for someone to go capture our + - '&cEscaped Prisoner&f.' + - + - + - + - + - + - + questAcceptDialog: + - '&a[Romanus Superbus]&f He must be somewhere in the mountains.' + - '&7&oI need to find the &c&oEscaped Prisoner&7&o and bring him back to the prison.' + questCompleteMessage: + - '&a[Romanus Superbus]&f Well, well, well. If it isn''t our escaped sleeping beauty.' + - Good work. A job well done deserves a good payment, here ya go. + - '&aRomanus&7 hands you a heavy bag of coin.' +primis_ice_village_get_them_off_my_back: + name: '&2Get them off my back!' + questLore: + - Let me tell ya, I sure am glad you are here to help, ha ha. + - Our mission here is to hunt &cRazorbacks&f and keep their numbers in check. + - It's not all about population control either. + - They provide us with valuable leather, tusks and meat. + - Not sure this village would be around without them. + - + - + - + - + - + - + - We only need you to cull the &cBabe&f and the &cJuvenile Razorbacks&f. + - + - + - + - + - Would mean a lot to me if you could retrieve it. + questAcceptDialog: + - '&a[Alanus Isatis]&f You must have seen the &cRazorbacks&f on your way here so I assume you know where to find them.' + - '&7&oI need to cull the &c&oRazorback&7&o population and retrieve &e&oAlanus'' Dagger&7&o.' + questCompleteMessage: + - '&a[Alanus Isatis]&f Well done friend! That should help a lot.' + - + - + - The dagger is nothing special, but it was a handmade gift from my late father. + - Next time you're thirsty, the drinks are on me! +primis_ice_village_gotta_keep_warm: + customObjectives: + Objective1: + dialog: + - '&a[Severinus Martius]&f Ha ha! That should keep me warm for another couple of weeks!' + - Hey friend, you heading for &dCaerullium Village&f by any chance? + name: '&2Gotta keep warm' + questLore: + - We deliver the &aLighthouse Keeper&f some + - of our strong stuff every couple of weeks. + - It keeps him warm during the colder days. + - It's a small gesture of thanks for all his + - hard work. Any chance you could help out + - and bring over the next batch? + questAcceptDialog: + - '&a[Grania Cecilius]&f You can find the lighthouse to the East. Thanks!' + - '&7&oI should go to the &d&oLighthouse&7&o and deliver these to the &a&oLighthouse Keeper&7&o.' + questCompleteMessage: + - '&a[Severinus Martius]&f If you''re heading over there then I would appreciate if you could deliver some of these to my good friend &aJeeves&f.' + - '&7&oSeems like the &a&oLighthouse Keeper&7&o has a quest for me.' +primis_ice_village_gotta_see_jeeves: + customObjectives: + Objective1: + dialog: + - '&a[Jeeves]&f Oh! A gift from my friend Severinus you say.' + - Well, thank you for bringing it over. Was nice seeing you again! + name: '&2Gotta see Jeeves' + questLore: + - Now, now it would be really rude of me to keep + - all of the good stuff to myself! + - If you would bother helping me out friend and + - delivering some of the good stuff + - to my friend &aJeeves&f at &dCaerullium Village&f. + - You can get there quickly by taking the + - '&9lighthouse portal&f.' + questAcceptDialog: + - '&a[Severinus Martius]&f The portal is all the way at the top.' + - '&7&oI should go to &d&oCaerullium Village&7&o and deliver some of the good stuff to &a&oJeeves&7&o.' + questCompleteMessage: + - '&a[Severinus Martius]&f Thank you for delivering some of the strong stuff to Jeeves. I know he likes a good drink here and there ha ha!' +primis_ice_village_living_nightmares: + customObjectives: + Objective1: + dialog: + - '&a[Cornelia Ennodius]&f Are they gone? I was so scared. My parents sent you? Thank goodness.' + - + - + - I couldn't escape. I, I...will be fine, I just need a minute... + name: '&2Living nightmares' + questLore: + - I was following her trail, this is where it ends. + - Not sure where she would have gone from here. + - I fear that something bad might have happened. + - Our &aGirl&f takes a lot after me and my special powers. + - Except that hers are a lot more potent, she is capable + - of making powerful emotions manifest in the real world. + - We are running out of time, we need to find her soon. + questAcceptDialog: + - '&a[Sestia Ennodius]&f The trail went cold here, she cannot be that far away...' + - '&7&oI need to find the &a&oMissing Daughter&7&o before something happens to her.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f You found her! Quickly, where is she?' + - Thank you stranger, I will go to her at once! +primis_ice_village_make_them_go_ouch: + name: '&2Make them go ouch' + questLore: + - I had some naughty '&cCustomers&f' + - come visit some days ago. + - They stole the most valuable + - of my &ePossessions&f. + - You need to find them and make sure + - to teach them a lesson. + - Make sure they know that + - '&aViolet&f does not forget to collect.' + questAcceptDialog: + - '&a[Domina Violet]&f They went East past the &9Trees&f.' + - '&7&oI need to make sure that the &c&oCustomers&7&o know not to mess with &a&oViolet&7&o. I also need to retrieve &e&oViolet''s Property&7&o.' + questCompleteMessage: + - '&a[Domina Violet]&f I hope you taught them the value of pain.' + - + - +primis_ice_village_objection!: + customObjectives: + Objective3: + dialog: + - '&a[Glacies Princeps]&f What, absolutely not. I don''t know how he convinced you to come here and beg for his release.' + - + - + - He will never be released. Is that understood. + Objective1: + dialog: + - '&a[Romanus Superbus]&f Release him? Not guilty? Are you mad? You''re lucky I don''t throw you in a cage too for suggesting such nonsense.' + Objective2: + dialog: + - '&a[Luxuria Placidus]&f Who? Never heard of him.' + name: '&2Objection!' + questLore: + - I do not belong here! Surely you can see that? + - I have done no wrong! Stranger will you hear my plea. + - Would you help this poor soul who has been trapped + - here in this awful cage of no fault of his own? + - You must go talk to the + - '&aJail Master&f or the ' + - '&aVillage Leader&f.' + - Or any other + - '&aFriendly Villager&f' + - who would be + - willing to argue for + - my release! + questAcceptDialog: + - '&a[Adrius Calpornius]&f Go talk to them! Get me out!' + - '&7&oI should go talk to the people on my list.' + questCompleteMessage: + - '&a[Adrius Calpornius]&f WHAT?! LIES!!! I never would do such a horrible thing to my family...' + - + - + - '&7Whatever sanity this poor man still had left, is gone now...' +primis_ice_village_run_away_daughter: + customObjectives: + Objective1: + dialog: + - '&a[Sestia Ennodius]&f I could sense you coming.' + name: '&2Run away daughter' + questLore: + - Stranger! Would you help our family? + - Our &aDaughter&f has gone missing. + - She has been gifted with special + - powers just like her &aMother&f + - I fear that last night something + - terrible must have happened to + - make her run away in the middle of + - the night. + questAcceptDialog: + - '&a[Sparax Ennodius]&f My &aWife&f has already gone looking for her.' + - I am sure she is somewhere outside the village. Go find her and talk to her. + - '&7&oI should go look for the &a&oWorried Mother&7&o.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f You were sent by my &aHusband&f to help with the search?' + - '&7&oI should hear out the &a&oWorried Mother&7&o.' +primis_ice_village_silence: + name: '&2Make them go ouch' + questLore: + - Shhh! Do you hear it? + - The annoying screeching. + - Ugh, I cannot take it anymore! + - Listen, I will pay good coin + - if you can find the source + - of that annoying screeching + - and make it stop. + questAcceptDialog: + - '&a[Modestus Eulogius]&f It sounds like it coming somewhere from the hills behind me.' + - '&7&oI should find the source of all the noise and make it stop.' + questCompleteMessage: + - '&a[Modestus Eulogius]&f Both me and my ears thank you!' +primis_ice_village_taking_the_bait: + name: '&2Taking the bait' + questLore: + - These &cFish&f, what is wrong with them! + - I have been out here fishing for days now! + - Not even a single bite. If only I was younger I would show them! + - + - + - And if we cannot catch any, well that is a big problem. + - You will need to go down there and beat them senseless. + questAcceptDialog: + - '&a[Theopropides Nero]&f You wanted to help so here is your chance!' + - '&7&oI must jump into the lake and kill 7 &c&oChilly Salmon&7&o and collect their bodies.' + questCompleteMessage: + - '&a[Theopropides Nero]&f Oh! Look at them! Such big ones!.' + - + - +primis_ice_village_treats_for_the_punished: + customObjectives: + Objective1: + dialog: + - '&a[Eleusium Calenus]&f My wife sent you? Oh, are those treats? My favorite too! She''s such a darling.' + - + - + - 'You tell her I am doing just fine and that I love her very much. ' + name: '&2Treats for the punished' + questLore: + - If you don't mind, could I ask you to do something for me? + - My dear &aHusband&f has been jailed and I know it's tough living a cage all day. + - So I prepared some treats that I was gonna deliver to him. + - + - + questAcceptDialog: + - '&a[Titia Calenus]&f He will be in one of the middle cages.' + - Do not forget to tell him I love him. + - '&7&oI should deliver these treats to the &a&oHusband&7&o.' + questCompleteMessage: + - '&a[Titia Calenus]&f Back so quick! Oh, did he really say that? He is such a sweetie.' +primis_ice_village_wanna_make_a_snowman: + name: '&2Wanna build a snowman' + questLore: + - The kids around the village have been pretty bored lately + - and I've been thinking. There are these + - '&cMagical Creatures&f that inhabit the woods around this' + - village. The creatures fur grows &eMagical Ice Crystals&e. + - When you infuse snow with these &eCrystals&f it makes the + - snow shuffle around and expand and contract. + - And if you build a snowman out of this infused snow + - it makes it look as if the snowman is alive. + - The kids would love it! So, want to help + - this old man cheer up some kids? + questAcceptDialog: + - '&a[Sparax Ennodius]&f You will find the &cCreatures&f in any woods near the village.' + - + - + - '&7&oI should go slay enough &c&oFrost Fur Ursus&7&o to gather 15 &e&oIce Crystals&7&o.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f You gathered enough crystals? Wonderful!' + - I can start making the snowman now, I cannot wait for the kids to see it! +primis_main_quest_: + name: '&2Goblins in the mines!' + questLore: + - This day just keeps getting worse. First, we get ambushed by goblins. + - The we retreat, only to find our army split. Some are dead, many are missing. + - Worst of all, we fear we might've woken the Goblin King. + - Some, hopefully, made it through. We have to set up camp and recover for now. + - If you dare brave into the mines, you are on your own. + - We tried to sneak past them, and it did not go well. + - The only way forward is through bloodshed. + questAcceptDialog: + - '&8[Centurion]&fAre you braving the Goblin Mines? Beware the Goblin King!' + - '&8[Centurion]&fWe hope our scouting party made it past him. Meet up with them if you can.' + - '&8&oI should venture through the mines and defeat the Goblin King.' + questCompleteMessage: + - '&8[Scouting party]&fYou made it through? I almost wish you hadn''t. You won''t believe what lies ahead.' + - '&8&oSounds like the scouting party has bad news for me.' +primis_main_quest_1: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis] &fOh so you were in the ship that beached a few hours ago?' + - + - + - + - + - + - + - '&7&oI should report to the &aFirst Mate &7&oto see if I should help these people!' + name: '&2Shipwrecked!' + questLore: + - You're finally awake? Good! We need your help. + - The ship beached during last night's storm. + - We see a &dLighthouse &fin the distance, so there must be a village there! + - Go talk to the &aVillage Leader &fand see if they can lend use some help! + - The &aFirst Mate &fwent ahead of you, but hasn't returned yet. + - Follow his instructions if you see him! + questAcceptDialog: + - '&a[Captain Squalus]&f Go to the nearby village and see if they will help us!' + - Be careful on your way there, we don't know what lurks around these parts! + - '&7&oI should investigate the nearby village and talk to their leader.' + questCompleteMessage: + - '&a[First Mate Iracundi]&f Darnation! We just can''t catch a break today! Here, it''s clearly dangerous to go alone, take this!' + - '&7&oSeems like First Mate Iracundi has a request for me...' +primis_main_quest_10: + customObjectives: + Objective2: + dialog: + - "&a[Shogun Navita] &f&dGladius&f calls for our aid?\n&7&oSeems like I should talk to the &aShogun&7&o." + name: '&5Bridging the gap' + questLore: + - It is time to call &dPontis Mille&f for aid. + - Let them know of what happened here and tell them we are cashing in our favor. + - + - + questAcceptDialog: + - '&a[General Hasta] &fSafe travels, friend. Remember: Kill the &cGate Keeper&f and make sure our plea reaches &aShogun Navita''s&f ears..' + - '&7&oI should slay the &cGate Keeper&7&o at the &dBridge&7&o and make my way to &aShogun Navita&7&o in &dPontis Mille&7&o.' + questCompleteMessage: + - '&a[Shogun Navita]&f Truly the news you bring me are most disturbing, but I am afraid we already suspected something... unnatural... was going on.' + - '&7&oSeems like &aShogun Navita&7&o wants to talk to me.' +primis_main_quest_11: + customObjectives: + Objective1: + dialog: + - '&a[Major Fortes Bellator]&f Yes, traveler?' + name: '&2Sending a message!' + questLore: + - The tales of your travel are most surprising. + - That you made it alive to here is nothing short of a miracle. + - The forces invading &dGladius&f are insurmountable. + - '&dGladius&f will eventually crumble under their might...' + - Aid?... Ah, yes. Go see &aMajor Fortes Bellator&f. + - He will be able to assist you. + questAcceptDialog: + - '&a[Navita]&f You can find the &aMajor&f on top of those stairs right ahead!' + - '&7&oI should go talk to the &aMajor&f and see if he can help.' + questCompleteMessage: + - '&a[Major Fortes Bellator]&f The &aShogun&f seeks to aid &dGladius&f? I thought he would never ask! But first, we must prepare.' + - '&7&oSeems like &aFortes Bellator&7&o has work for me.' +primis_main_quest_12: + customObjectives: + Objective1: + dialog: + - '&a[Centurion]&f Where are our reinforcements?' + name: '&2Mine path' + questLore: + - I cannot believe what befell &dGladius&f. They hit it fast, + - and they hit it where it hurts most. + - It is our sworn duty to aid our allies. We have failed our + - duty, and we have failed our allies. + - The &cCounselor's&f ordered us to mobilize our troops in several + - zones before the invasion. + - You see, recently and unusual and devastating storm was spotted + - at the &dStorm Temple&f. + - The Royal Guard was ordered to quiet the storm, and the &aShogun&f + - refuses to belay that order. + - Our own guards are in other places, and I fear we will need all + - that we have to take &dGladius&f back. + - The path to the &dStorm Temple&f is treacherous, as it requires going + - through the &dGoblin Mines&f. + - Help our guard clear the mines and make a path to the &dStorm Temple&f! + questAcceptDialog: + - '&a[Fortes Bellator]&fTread lightly, the &dGoblin Mines&f are a dangerous place. Perhaps you should aid the normal guard before assisting the &aRoyal Guard&f.' + - The &dMines&f are north of the city. There are stairs leading to its entrance. + - '&7&oI should see what else I can aid &aFortes Bellator&7&o with, or I can head to the &dGoblin Mines''&7&o entrance.' + questCompleteMessage: + - '&a[Centurion]&fIt is so good to see someone! Has &dPontis Mille&f sent you?' + - '&7&oI should hear what the &aCenturion&7&o has to say' +primis_main_quest_13: + name: '&2Goblins in the mines!' + questLore: + - This day just keeps getting worse. First, we get ambushed by goblins. + - Then we retreat, only to find our army split. Some are dead, many are missing. + - Worst of all, we fear we might've woken the &cGoblin King&f. + - Some, hopefully, made it through. We have to set up camp and recover for now. + - If you dare brave into the mines, you are on your own. + - We tried to sneak past them, and it did not go well. + - The only way forward is through bloodshed. + questAcceptDialog: + - '&a[Centurion]&f Are you braving the &dGoblin Mines&f? Beware the &cGoblin King&f!' + - We hope our &aScouting Party&f made it past him. Meet up with them if you can. + - '&7&oI should venture through the &dMines&7&o and defeat the &cGoblin King&7&o.' + questCompleteMessage: + - '&a[Scouting Party]&f You made it through? I almost wish you hadn''t. You won''t believe what lies ahead.' + - '&7&oSounds like the scouting party has bad news for me.' +primis_main_quest_14: + name: '&2Storm''s end' + questLore: + - It is hard to believe that you pushed through the + - '&dGoblin Mines&f on your own.' + - Perhaps with your fortitude you will be able to face the challenge ahead. + - We attempted to assault the &dStorm Temple&f, and reached its deepest + - confines at a great cost. + - What we found there... It defies understanding. + - It may be hard to believe, but it sounds like the very storm + - itself has materialized as our opponent. + - We do not even know if it can be defeated. We feared we were sent to our deaths. + - + - + questAcceptDialog: + - '&a[Blepharo]&f We have weakened their forces a little, but still, this is no easy task.' + - The Storm is no ordinary opponent. Do not underestimate it. + - '&7&oI should go into the &dStorm Temple&f and slay the &cStorm&f.' + questCompleteMessage: + - '&a[Shogun Navita]&f You WHAT!?' + - Defeated the &cStorm&f? I was told that was impossible! I mean... + - '... it is no use hiding it now. I knew about the &cStorm&f. I knew about the &dGladius&f invasion - I even facilitated it. I did it for my people - for &dPontis Mille&f.' + - '&cCounselor Machiavelli&f convinced me that the &cStorm&f was as unstoppable as Nature itself, and that the fall of &dGladius&f and &dPontis Mille&f was an inevitability that we could but delay through sacrifice.' + - + - + - '&8&oSeems like &aShogun Navita&7&o has a problem he wants me to deal with.' +primis_main_quest_15: + name: '&2Severance payback!' + questLore: + - + - + - + - + - + - + - + - + - + - I bought us time. + - + - + - + - + - He guided us to our doom, and would've gotten away with it had you not appeared. + - Now, there is hope. + - I ask you, please rid us of the treacherous &cCounselor&f. + - + - + - + - + - + - + - I wish to deliver one last message through them. + questAcceptDialog: + - '&a[Shogun Navita]&f &cCounselor Machiavelli&f has retreated to his quarters in the lower city by the market. Be careful, has has amassed a devoted following in his time, and will not go down without a fight.' + - '&7&oIt is time for &cCounselor Machiavelli&f to face righteous retribution.' + questCompleteMessage: + - '&a[Shogun Navita]&f So it is done.' + - '&dPontis Mille&f owes you a great debt, wanderer. Once we finish mobilizing the army we will be ready to right our wrongs and march to &dGladius''&f aid.' + - '&7&a[Shogun Navita]&2 We feared you. We surrendered our allies to you. We dispersed our armies. No more.' + - '&dPontis Mille&2 marches to war, and we shall not walk alone! You shall rue the day you crossed our path.' + - '&7' + - '&7&oSeems like the &aShogun&7&o has a plan. I should talk to him.' +primis_main_quest_16: + customObjectives: + Objective3: + dialog: + - '&a[Demenis Nolus]&f Heading to the village, eh. Just keep going East, follow the road and you should be there in no time!' + Objective4: + dialog: + - '&a[Callipho Classicius]&f Directions? Just head down this road that leads to the graveyards.' + Objective1: + dialog: + - '&a[Glacies]&f Welcome to our village traveler! Please tell me, what brings you here friend.' + Objective2: + dialog: + - '&a[Bromia Culleolus]&f Oh, the way to the village. Yes, just take this road that leads to the mountain.' + - Happy to help! + name: '&2The ice village awaits' + questLore: + - We must send aid to &dGladius&f as soon as possible. + - Champion, there is a village of mighty warriors to the far south. + - You should travel there and inform them that &dPontis Mille&f + - would seek their aid in pushing back the invaders from the &dBlood Temple&f. + - Find &aGlacies Princeps&f and tell them I sent you. + - There many travelers on the roads, you should stop and ask them for direction. + questAcceptDialog: + - '&a[Shogun Navita]&f It will be a long journey. Make sure you prepare. Follow the roads that lead south.' + - '&7&oI must go and locate the &d&oIce Village&7&o to the far south.' + questCompleteMessage: + - '&a[Glacies Princeps]&f The Shogun sent you, I see, it is good to hear that &aNavita&f is back to his old self.' + - + - + - Let me tell you more... + - '&7&oI should speak to &a&oGlacies&7&o.' +primis_main_quest_17: + customObjectives: + Objective3: + dialog: + - '&a[Theopropides Nero]&f Help? Yes, please!' + Objective1: + dialog: + - '&a[Alanus Isatis]&f Here to help with the &cRazorbacks&f?' + Objective2: + dialog: + - '&a[Domina Violet]&f I hope you are here to help!' + name: '&2Helping the north' + questLore: + - Before we further discuss anything about + - the &dBlood Temple&f. + - + - + - If these issues are not resolved then I would fail in my duties as a village leader. + - There is no way for me to ignore the plea of my own people and put others first. + - + - + - + - + - + - + - + - + - They will be able to tell you in more detail what needs to be done. + questAcceptDialog: + - '&a[Glacies Princeps]&f Once you are done helping them. Come back to me and we can talk.' + - '&7&oI should go talk to the villagers on my list and help them out with any issues they might have.' + questCompleteMessage: + - '&a[Romanus Superbus]&f &2Glacies&f sent you, about darn time! We have a prisoner on the loose!' + - '&7&oI should speak to &a&oRomanus Superbus&7&o.' +primis_main_quest_18: + name: '&2The trial of ice' + questLore: + - Well you have certainly impressed me and most of the village. + - + - + - the &cIce Elementals&f. + - + - + - + - + - '&cMinor Ice Elementals&f in combat.' + - + - + - If you failed...then...your energy and your being belonged to the &cIce Elementals&f. + - + - + - Ever since then + - + - + - Several of our people got corrupted and we had to jail them for our own safety. + - + - + - + - + - Slaves to the + - '&cIce Elementals&f.' + - It is clear that our old traditions are no longer. + - The &cIce Elementals&f must be dealt with... + - I would ask you to be the last one to + - undertake &9The Trial of Ice&f. Climb to the peak and face the + - '&cMinor Ice Elementals&f and release the souls of those who failed the trial.' + questAcceptDialog: + - '&a[Glacies Princeps]&f You can find the start of the path to the trial at &aViolet''s&f house.' + - Follow the &9Amethyst&f blocks, they will guide you to the peak. + - '&7&oI should follow the &9&oAmethyst Blocks&7&o to the peak of the mountain and then slay the &c&oMinor Ice Elementals&7&o.' + questCompleteMessage: + - '&a[Glacies Princeps]&f You have done it? May their souls rest in peace now.' + - Let's speak again friend. There is more to be done. + - '&7&oI should speak to &a&oGlacies&7&o.' +primis_main_quest_19: + name: '&2Chill out' + questLore: + - It is time to free ourselves from this curse. + - We should have never made ourselves dependent on an &cElementals&f power. + - We shall correct that mistake here and now. + - What you have slain were just + - '&cMinor Ice Elementals&f, the' + - '&cIce Elemental&f rests in a temple right across from our village.' + - It was the main source of our power...and foolishness. + - Go forth now and slay the &cIce Elemental&f. + questAcceptDialog: + - '&a[Glacies Princeps]&f You will find a path that leads into the temple at the summit of the village.' + - '&7&oI should go into the temple and slay the &c&oIce Elemental&7&o.' + questCompleteMessage: + - '&a[Glacies Princeps]&f I could feel the energies flowing out, all the way from here.' + - + - + - There is another settlement that might need your help, let's speak. + - '&7&oI should hear what &a&oGlacies&7&o has to say.' +primis_main_quest_2: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis]&fYou''ll help us? Thank the seas! This was starting to feel like a sinking ship!' + name: '&2Strangers in need...' + questLore: + - So not only can they not help, but they want our help? Bah! + - Well, we don't have much choice now, do we? + - Go, help them, then make them help us! + questAcceptDialog: + - '&a[First Mate Iracundi]&f Fine, go help the locals, see what info you can gather and see if you can get them to help us in turn. I will be here, negotiating things.' + - Come back as soon as you have something! + - '&7&oI should talk to the &aVillage Leader&f to see about helping the locals.' + questCompleteMessage: + - '&a[Chief Piscis]&f Everyone in the village has an issue that needs dealing with, and I am no exception. My request is quite challenging, so maybe you want to get warmed up and get the lay of the land with some of the issues from the other villagers.' + - + - + - '&7&oI should talk to the locals and see who needs help, and come back to the leader when I feel ready to continue.' +primis_main_quest_20: + customObjectives: + Objective1: + dialog: + - '&a[Lutum Princeps]&f This better be important.' + name: '&2Terravilla' + questLore: + - Some time ago we received a request for aid from a + - a nearby settlement. Years ago a bunch + - of explorers settled on top of this ancient ruin. + - I think they call their little + - settlement &dTerravilla&f. Apparently there is a lot + - of treasure to be had there if you don't mind the risk. + - But I hear that stuff has gone wrong there and they asked + - us if we could spare any help to send their way. To be + - honest, you are the strongest warrior I have ever seen. + - You are the best help we could send. If you would like + - to go of course. + questAcceptDialog: + - '&a[Glacies Princeps]&f You will find &aTerravilla&f straight West of here.' + - + - + - Oh, I almost forgot. The person you want to talk to is &aOverseer Lutum&f. + - '&7&oI should go to &d&oTerravilla&7&o and talk to &a&oOverseer Lutum&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f Came all the way from the &dIce Village&f, eh. Good to see some help arrive.' + - + - + - + - + - '&7&oI should talk to &a&oLutum&7&o.' +primis_main_quest_21: + name: '&2Taking out the trash' + questLore: + - Many years ago some explorers came across this ruin and + - as they investigated it more closely they discovered a + - large underground maze-like structure. In this structure + - there were a lot of ancient artifacts and treasures. But + - also a lot of danger. Not like that stopped anyone from + - going down there. And as the word spread, more and more + - people came here to make their fortunes. Before you + - know it, it turned into a small settlement. Until lately + - everything was fine, but then awful things started + - happening. Before I tell you more, we should start by + - dealing with the simple problems first. A small band of + - '&cRobbers&f has found a foothold in the hills surrounding' + - '&dTerravilla&f. We need them gone. Also, feel free to assist' + - any villagers in &aTerravilla&f that might need help. + questAcceptDialog: + - '&a[Lutum Princeps]&f I am not sure where the &cRobbers&f are exactly. I just know that people have reported seeing them coming from the hills.' + - '&7&oI should deal with the &c&oRobbers&7&o and help any villagers in need if I have the time.' + questCompleteMessage: + - '&a[Lutum Princeps]&f Well that is one issue resolved. Onto the next!' + - Before we move on, I want you to have this blade. + - + - + - '&7&oI should hear out what &a&oLutum&7&o has planned next.' +primis_main_quest_22: + name: '&2Big trouble in little pub' + questLore: + - Before we get to the big problem underground, I would + - like you to do one last thing here in town. There has + - been huge trouble in our little pub. There are certain + - characters in town who keep going to the pub and causing + - a ruckus. Well I heard that this time all of them managed + - to gather at the pub at the same time. And of course now + - there is a huge brawl happening over there. This is a great + - opportunity for us to arrest all of them at once. Go to the + - pub and knock them all out. We will handle the rest. + questAcceptDialog: + - '&a[Lutum Princeps]&f The pub is at the ground level, right across. Don''t let them overwhelm you.' + - I will have a nice reward waiting here for you when you're back. + - '&7&oI need to go to the pub and deal with the &c&oBar Brawlers&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f I hear that the pub is a peaceful place again. Let''s discuss the real issue now.' + - '&7&oI need to talk to &a&oLutum&7&o.' +primis_main_quest_23: + name: '&2Strike the earth' + questLore: + - You see the real reason we asked for help is because of what happened + - at the ruins. There were always dangerous things down there, + - but nothing a seasoned adventurer or explorer could not handle. But then + - something awakened, these ancient constructs started rising out of the + - ground and the walls. Then these quakes started happening, it was weird, + - because you could only feel them if you were down in the ruins. So we shut + - everything down, nobody was allowed access to the ruins anymore. A few days + - ago I gathered some of my best men and sent them down there to find the source + - of it all. They barely made it back. They found an &cEarth Elemental&f high + - above the pillars, on top some sort of platform. It must have been there + - dormant all this time. No clue why it decided to wake up now... + - Your job would be to go down there, navigate through the maze and put the + - '&cEarth Elemental&f into a slumber it will never wake up from.' + questAcceptDialog: + - '&a[Lutum Princeps]&f You can get to the maze by walking down the spiral staircase in the middle of the ruins.' + - + - + - '&7&oI should enter the &d&oRuins Maze&7&o and slay the &c&oEarth Elemental&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f I cannot believe it, you''re back. In one piece too!' + - + - + - + - '&7&oI need to tell &a&oLutum&7&o about my quest and the &d&oBlood Temple&7&o.' +primis_main_quest_24: + customObjectives: + Objective1: + dialog: + - '&a[Navita]&f You have returned! I hope you have good tidings.' + name: '&2There and back again' + questLore: + - We had no idea what was going on... Yes, + - '&dTerravilla&f will be able to pledge some' + - of our forces to your cause. I wonder if the + - '&cEarth Elemental&f awakening had anything' + - to do with the &dBlood Temple&f. We will + - prepare our forces and wait for word from + - '&dPontis Mille&f.' + questAcceptDialog: + - '&a[Lutum Princeps]&f So you are heading off to &dPontis Mille&f, make sure to tell the &aShogun&f that &dTerravilla&f will be ready to assist.' + - '&7&oI should head to &d&oPontis Mille&7&o and speak with &a&oShogun Navita&7&o.' + questCompleteMessage: + - '&a[Navita]&f It is good to hear that the &dIce Village&f has decided to join our cause! But I did not expect that you would manage to convince &dTerravilla&f to pledge to our cause as well.' +primis_main_quest_25: + customObjectives: + Objective1: + dialog: + - '&a[Outpost Officer]&fFILLER TEXT!' + name: '&2To the outpost' + questLore: + - It is so good to see you again friend! + - While you were gone we were preparing our + - forces. We have made an &dOutpost&f + - between the &dBlood Temple&f and &dPontis Mille&f. + - You should go there and report to the + - '&aOutpost Officer&f. They will let you know' + - how we shall proceed with the assault on the + - '&dBlood Temple&f.' + questAcceptDialog: + - '&a[Navita]&f The outpost is to the South of the city. Not too long now, before the additional forces from &dTerravilla&f and the &dIce Village&f arrive.' + - '&7&oI should head to the &d&oOutpost&7&o and speak with the &a&oOutpost Officer&7&o.' + questCompleteMessage: + - '&a[Outpost Officer]&f I GOT NO IDEA WHAT TO SAY CAUSE I AM NOT DONE' +primis_main_quest_3: + name: '&cBandit Camp!' + questLore: + - A nearby &dBandit Camp&f has recently been sighted + - and is trying to take us under! + - They keep raiding our supplies and kidnapping our villagers! + - They even took my &eGrandfather's Heirloom&f! + - We don't know what they want, but we need them gone! + - Figure out what they are doing, deal with them and bring + - me back my &eGrandfather's Heirloom&f! + questAcceptDialog: + - '&a[Chief Piscis]&f The &dBandit Camp&f isn''t too far away if you follow the road!' + - + - + - Oh, and make sure you bring back my &eGrandfather's Heirloom&f! + - '&7&oI should go to the nearby &dBandit Camp&7&o and clear it out.' + questCompleteMessage: + - '&a[Chief Piscis]&f I see you''re back! Do you bring good news?' + - '&7&oYou tell &aChief Piscis&7&o about the camp and turn the &eHeirloom&7&o in.' + - + - + - + - + - '&7&oSeems like the &aChief Piscis&f is ready to tell me how to get out of here.' +primis_main_quest_4: + customObjectives: + Objective1: + dialog: + - '&a[Petrae]&f &2Chief Piscis&f sent you? Unfortunately the passage is closed, and the &cElemental&f guards it...' + name: '&9Blue flower path!' + questLore: + - We must report our findings about the + - '&dBandit Camp&f to &dGladius&f!' + - The mountain pass is guarded by an ancient, + - powerful &cGolem&f which must be avoided at all costs! + - Follow the &eBlue Flowers&f along the path, + - they will lead you to a secret passage + - through the mountains! + - A mountain guide will be waiting for you at the end + - of the &9Blue Flower &fpath! + questAcceptDialog: + - '&a[Chief Piscis]&f The mountain pass is guarded by an extremely dangerous &cGolem&f, which you are probably not able to defeat right now!' + - + - + - '&7&oI should follow the &9&oBlue Flower &7&opath to the &aMountain Guide&7&o!' + - '&7&oI should make sure to finish any business I got left before I leave.' + - '&7&oHint: Make sure you track the quest to make finding your destination easier!' + questCompleteMessage: + - '&a[Petrae]&f Are you sure you want to risk it? I can help you...' + - '&7&oSeems like &aPetrae&f has a request for me.' +primis_main_quest_5: + name: '&5The Crystal Elemental' + questLore: + - You need to pass through? Ill timing, my friend. + - A &cCrystal Elemental &fhas invaded our passage + - and shut it down. + - If you really must make your way to Gladius, + - you will have to defeat this &cElemental&f first! + questAcceptDialog: + - '&a[Petrae]&f You seek to defeat the &cCrystal Elemental&f? I can but wish you luck in your endeavor!' + - + - + - '&7&oSeems like I must defeat the &cCrystal Elemental&7&o.' + questCompleteMessage: + - '&a[Petrae]&f Outstanding! I saw you defeat the &cCrystal Elemental&f, clearly there''s greatness in your future!' + - Now that we are on the other side, let me tell you the path to &dGladius&f! +primis_main_quest_6: + customObjectives: + Objective1: + dialog: + - '&a[Filius] &fYou made it through the mountain! You don''t see that every day.' + - + - + - '&7&oSeem like &aFilius&7&o can help me find the way to &dGladius&7&o.' + name: '&5The Farmstead' + questLore: + - The path to &dGladius&f should be easy, but with + - all the disturbances we've been seeing I suspect + - it might not be that simple. + - I am good friends with the &aProprietor of the Farmstead&f + - down the road. If you tell them I sent you, I am sure + - they will tell you how to safely reach &dGladius&f and + - give you news about the surrounding area. + - Good luck in your travels and stay safe! + questAcceptDialog: + - '&a[Petrae]&f Just tell the &aProprietor of the Farmstead&f that I sent you, though I have heard that the &aProprietor&f hasn''t been seen in a while.' + - + - + - Viagens seguras! + - '&7&oI should follow the path to the &dFarmstead&7&o and talk to its &aProprietor&7&o.' + questCompleteMessage: + - '&a[Petrae]&f Outstanding! I saw you defeat the &cCrystal Elemental&f, clearly there''s greatness in your future!' + - Now that we are on the other side, let me tell you the path to &dGladius&f! + - '&7&oI should talk to &aFilius&7&o to learn the way to &dGladius&7&o, and possibly talk to his &aMother&7&o to see how I can help.' +primis_main_quest_7: + customObjectives: + Objective4: + dialog: + - '&a[General Hasta] &fI can''t believe you made it past the enemies.' + - You are exactly the kind of help we need right now! + - '&7&oSeems like I should talk to &aGeneral Hasta&7&o.' + name: '&5The path to Gladius' + questLore: + - Recently smoke was sighted over the fortress of &dGladius&f. + - We were unable to go there and see what's happening + - because a &dShip&f is currently blocking the path. + - We got attacked by a bunch of undead-looking creatures + - when we approached the &dShip&f, so we ran away. + - I am afraid you will have to force your way through this + - '&dShip&f in order to reach &dGladius&f. I''m sure that they will' + - reward you if you help thin the number of &cUndead&f on that ship! + questAcceptDialog: + - '&a[Filius] Be careful on the road, clearly something has gone wrong in &dGladius&f.' + - + - + - '&7&oI should go down the path to &dGladius&7&o and clear out some &cUndead Sailors&7&o on the way there.' + questCompleteMessage: + - '&a[Lord Hasta]&f Were you sent as reinforcements from Pontis Mille? Where are the others? Are you a messenger?' + - '&7&oI should talk to &aLord Hasta&7&o.' +primis_main_quest_8: + name: '&5Recovering Hope' + questLore: + - We never saw this invasion coming. + - They came in the dead of night, hit us hard and fast. + - Before we knew it, half the city was overrun. + - Morale is low. Everyone here has lost someone. + - To spite our heartache, our own loved ones parade + - through the streets in a mockery of life itself. + - We need to rally and bolster morale, + - or we won't see another dawn! + - Back in my &dMansion&f, in my treasury, lies a &eDocument&f + - of the utmost importance. It is a written promise with + - one of the founders of &dPontis Mille&f to provide us with + - assistance in a time of dire need. This is the time. + - Retrieve the &eDocument&f, bring it back to me and + - I promise you will be welcomed in &dPontis Mille&f with + - open arms. Soldiers will fight to their last + - if given this small hope. + questAcceptDialog: + - '&a[General Hasta] The note is in my &dMansion&f. Be sure to bring it back. My men here also have other requests around town you can help with, if able.' + - '&7&oI should check what the other soldiers need and head to the &dMansion&7&o at the town exit.' + questCompleteMessage: + - '&a[Lord Hasta]&f Outstanding! Recovering this &eDocument&f in the middle of a war? If we had 10 more of you, the city would never have been taken in the first place!' + - Before you go, do you think you could do me a small personal favor? + - '&7&oSeems like &aLord Hasta&7&o wants to talk to me.' +primis_main_quest_9: + name: '&5Gladius'' Champion' + questLore: + - Before heading to &dPontis Mille&f, I have a + - personal favor to ask. + - Our &cChampion&f was last seen fighting off a horde of + - enemies near the &dStatue&f. + - We have not heard from him since the start of the + - invasion and at this stage we fear the worst. + - Please go check on him. If you find him and he has + - turned into one of these undead... please free him of his curse. + questAcceptDialog: + - '&a[General Hasta] &fMake your way to the &dStatue&f. I am sure our &cChampion&f will be easy to find.' + - '&7&oI should go to the &dStatue&7&o and investigate what happened to the &cChampion of Gladius&7&o.' + questCompleteMessage: + - '&a[General Hasta]&f So... The worst has come to pass. I will make sure these beasts shall pay for slaying my son.' + - 7&oSeems like &aGeneral Hasta&7&o has some parting words for me. +primis_ogre_mines_clear: + name: '&2Ogre-sized problems' + questLore: + - Our mining encampment was overrun! + - We need help! + - I don't really know what happened, but we need to clear + - the encampment and talk to &aOld Vetus&f! + questAcceptDialog: + - '&a[Metus]&f You''re going to help? Please hurry, the encampment is just beyond here!' + - '&7&oI should clear the encampment and talk to &aOld Vetus&7&o.' + questCompleteMessage: + - '&a[Vetus Fossores]&f You came to help? Fantastic, we absolutely need help right now!' + - Here's a little something for your help clearing the encampment! +primis_ogre_mines_lost_bretheren: + customObjectives: + Objective1: + dialog: + - '&a[Fortis Fossores] &fWhat do you want? What, &aFugit&f sent you? What for? The mines were overrun? Hah, I didn''t even notice!' + - + - + - + name: '&5Lost Bretheren' + questLore: + - The mine was overrun by &cOgres&7&o! + - In the confusion I got separated from my &aBrother&f in the &dMines&f, + - and I fear for his safety! + - He's a bit of an eccentric man, very dedicated to mining. + - You'll know if you've seen him! + - Please bring him back up here, or at the very least tell me if he is safe. + - I'll make it worth your trouble! + questAcceptDialog: + - '&a[Fugit] &fPlease find my &aBrother&f and make sure he''s OK!' + - '&7&oI find &aFugit''s Brother&7&o in the &dMines&7&o overrun by &cOgres&7&o.' + questCompleteMessage: + - '&a[Fugit Fossores]&f My &aBrother&f said what? Ah, typical of him, too focused on his work to notice the entire place was taken over!' + - I'll have a serious conversation with him next time I see him! + - + - +primis_ogre_mines_old_miner_quest: + name: '&2Lucky Pickaxe' + questLore: + - We have ourselves a bit of a pickle! + - As we were mining, we came across a mysterious cave full of monsters! + - I dropped my favorite &ePick-axe&f as I ran, I need your help to go get it! + - I'm sure the &cOgre Magi&f picked it up for himself. + - Get my &eLucky Pickaxe&f back from that brute! + - I've got some trinkets for you when you return. + questAcceptDialog: + - '&a[Vetus Fossores]&f That &cOgre&f shouldn''t be far! You can find him in the cave to the right, before the collapsed area.' + - He should have the &ePickaxe&f, &cOgres&f love shiny things after all! + - '&7&oI should defeat the &cOgre Chief&f.' + questCompleteMessage: + - '&aa[Vetus Fossores]&f You got my lucky pick? Excellent!' + - Heres your reward! +primis_pontis_groves_acrobatics: + customObjectives: + Objective1: + dialog: + - '&a[Idoneitatem Hominem]&f Congratulations!' + name: '&2Acrobatics' + questLore: + - So you think you have you what it takes. + - Are you fit enough, are you quick enough, are you strong enough? + - Platforms, wines, dangerous heights. All you could ever want! + - The ultimate challenge lies ahead! + - OK, OK. Me and my &aBrother&f might have been bored a bit and + - made an entire acrobatics course. + - The goal is to to get from platform to platform using &9Wines&f and + - '&9Acrobatics&f and reach the end of the course.' + - + - + - You will be rewarded with a very nice &eItem&f! + questAcceptDialog: + - '&a[Posuere Hominem]&f You can find the start of the course at the &dEnd of that Tunnel&f.' + - + - + - Don't forget to speak to my &aBrother&f at the end of the course for the reward! + - '&7&oI should head to the start of the course.' + questCompleteMessage: + - '&a[Idoneitatem Hominem]&f Well deserved! I hope you did not cheat! Try and beat my record if you can.' +primis_pontis_groves_caught in the web: + name: '&2Caught in the web' + questLore: + - So they have a &dNest&f somewhere in the &dGrove&f. + - That would explain why their population has skyrocketed. + - + - + - It would be great if you could locate the &dNest&f and clear it out. + - We will make you some fine &eSpider Leg Boots&f as a reward! + questAcceptDialog: + - '&a[King Nemian]&f If there is a &dNest&f I am sure it would be &9Surrounded by Cobwebs&f.' + - '&7&oI should find the &dSpiders Nest&7&o and clear it out.' + questCompleteMessage: + - '&a[King Nemian]&f Hah! I knew we could count on you!' + - Here are your fine boots, well deserved! +primis_pontis_groves_elf_stole_from_my_shelf: + name: '&2Elf stole from my shelf' + questLore: + - Disaster has struck our little hole. + - Not too long ago our lovely home got raided by &cElf Bandits&f. + - Thankfully we weren't home at the time so nobody got hurt. + - We managed to replace most of our possessions. + - But they took my &eFamily Heirloom&f that was sitting on the shelf. + - If you would be so kind to go try and get it back for me, I would be most thankful. + - I make the best stews, I would be glad to share some with you as a reward. + questAcceptDialog: + - '&a[Luxuria Gorgonius]&f The &eHeirloom&f is quite valuable I am sure they would keep it &9Somewhere Extra Safe&f.' + - '&7&oI need to go retrieve the &eHeirloom&7&o.' + questCompleteMessage: + - '&a[Luxuria Gorgonius]&f Oh my gosh! You found it!' + - There are not enough thanks in the world for what you just did for me. + - '&7&oThis stew should keep med fed for a while.' +primis_pontis_groves_into_the_next_hole: + customObjectives: + Objective1: + dialog: + - '&a[Phygia Gorgonius]&f Time to kick those &cElves&f out for good!' + name: '&2Into the next hole...' + questLore: + - If you are available there is plenty more work to do around here. + - We have some serious &cElf&f problems, + - but I have assigned &aPhygia&f to handle those issues. + - Go talk to &aPhygia Gorgonius&f in the hole next to this one. + - They will be able to tell you more and what needs to be done. + questAcceptDialog: + - '&a[King Nemian]&f The hole right next to this one one, can''t miss it!' + - '&7&oI should go talk to &aPhygia Gorgonius&7&o.' + questCompleteMessage: + - '&a[Phygia Gorgonius]&f Let''s talk...' + - '&7&oI should hear out &aPhygia Gorgonius&7&o.' +primis_pontis_groves_lighthouse_1: + customObjectives: + Objective1: + dialog: + - '&a[Alanus Secundas] &fHas the &dGrove&f sent you?' + name: '&2Feeding the sick' + questLore: + - Wanderer, could I ask a simple favor of you? + - + - + - But ever since the troubles began we could not leave our &dGrove&f. + - Would you be so kind to bring the family their latest batch of food. + - It would be great if you could hurry, it has been a while since the last delivery. + questAcceptDialog: + - '&a[King Nemian]&f When you exit the hole the &dLighthouse&f is straight forward and a bit to the left.' + - '&7&oI should go to the &dLighthouse&7&o.' + questCompleteMessage: + - '&a[Alanus Secundas]&f I am so thankful! We were just starting to run out of food.' + - Are you busy? + - '&7&oSeems like &aAlanus&7&o wants to talk to me.' +primis_pontis_groves_lighthouse_2: + customObjectives: + Objective1: + dialog: + - '&8[Jeeves]&fOh, hello there again!' + - '&8[Jeeves]&f They do not need the food anymore? I was just about to go shopping.' + - '&8[Jeeves]&f So kind of you to come here and let me know.' + name: '&2Do not ask Jeeves' + questLore: + - Uh, before you came. Jeeves the Travelling Merchant stopped by. + - We asked him if he could go get some food for us. + - + - + - + - + questAcceptDialog: + - '&8[Alanus Secundas]&f When you exit the dwelling the Lighthouse is straight forward and a bit to the left.' + - '&8&oI should go to the Lighthouse.' + questCompleteMessage: + - '&8[Alanus]&f You let him know? Good, good!' + - '&8&oSeems like Alanus is quite fed.' +primis_pontis_groves_population_control: + name: '&2Population control!' + questLore: + - Oh I am so happy that finally someone has arrived to help us out. + - We have a big arachnid problem going on in our little grove. + - There are so many arachnids around these days that you cannot even + - take a nice evening walk without one of the nasty buggers + - jumping at you from the shadows. + - It is clear that their population numbers need a serious culling. + - Oh! Please bring to me any arachnid legs that are still in good contidion. + - We use them to make small cranes and grabbers. + questAcceptDialog: + - '&8[King Nemian]&f You will find them lurking beneath the shadows of the trees.' + - '&8&oI need to find Forest Crawlers and kill them.' + questCompleteMessage: + - '&8[King Nemian]&fGood to see you return, and with plenty of legs too!' + - '&8[King Nemian]&fYou think that their nest might be near? Let''s talk more about this' +primis_pontis_groves_tree_climbing_elf_bandits: + name: '&2Tree climbing elf bandits!' + questLore: + - + - + - Not like the &cSpiders&f were enough, + - now these shadow loving poop nuts have decided to settle in our trees! + - + - + - + - + - Forced their way in with their superior numbers. + - Well they got something coming alright, + - one look at you and I can tell you can handle a couple of stone giants! + - I am sure some elves won't be much of an issue for you. + - + - + questAcceptDialog: + - '&a[Phygia Gorgonius]&f I am sure you will find plenty of them if you find some place with shade and just look up, hard to miss their tree houses.' + - '&7&oI should go take care of these &cElves&7&o before &aPhygia&7&o catches on fire from rage.' + questCompleteMessage: + - '&a[Phygia Gorgonius]&f My friend! HAHA! So good to see you again!' + - + - + - '&7&oThe elves wont be bothering &aPhygia&7&o ever again.' +primis_pontis_mille_fields_berry_crazed_wolf: + name: '&2Berry crazed wolves' + questLore: + - Oh gosh, I have no idea what is wrong with these &cRockhounds&f. + - They keep coming into the &dBerry Farm&f while I am away or sleeping. + - You would think they come here and eat the berries, but no! + - They load their mouths with them and carry them + - off somewhere deep into the forest. + - I mean they are &cHounds&f! Why are they even stealing berries. + - Well I guess it doesn''t matter, I have a favor to ask. + - Could you go clear the + - '&9Area Behind the Berry Farm&f,' + - and bring back my &eStolen Berries&f. + - I have a lot of pies to make and the berries they stole were ripe and ready. + questAcceptDialog: + - '&a[Dordalus Nasica]&f I only saw the &cRockhounds&f steal the berries.' + - '&7&oI should go kill the &c&oRedwood Rockhounds&7&o and collect any &e&oStolen Berries&7&o they drop.' + questCompleteMessage: + - '&a[Dordalus Nasica]&f Oh my, you did it. Could I bother you with one more tiny favor.' + - '&7&o Seems like &d&oMilonia&7&o has more work for me.' +primis_pontis_mille_fields_camping_hunters: + customObjectives: + Objective1: + dialog: + - '&a[Scribonia Ingenvinus]&f Yes?' + name: '&2Camping hunters' + questLore: + - I hope I am not bothering you. You look like a person that would listen to a plea. + - We do not have much to do here in the &dSlums&f, + - most of us like to wander the &dFields&f to pass the time. + - Unfortunately that has come to a stop after a bunch + - of &cMonsters&f started roaming around the &dFields&f. + - We heard that some hunters have made &dCamp&f near the &dFields&f. + - If you could go there and talk to them and ask them to deal with these &cMonsters&f... + questAcceptDialog: + - '&a[Augustina Verrucosis]&f Their &dCamp&f should be somewhere North-West of here.' + - '&7&oI need to head for the &d&oHunters Camp&7&o.' + questCompleteMessage: + - '&a[Scribonia Ingenvinus]&f Help the &dSlums&f with their &cMonster&f issue?' + - Let's talk more about. + - '&7&oI should talk to &a&oScribonia&7&o and hear out what she has to say.' +primis_pontis_mille_fields_camp_hunter_three_times_hunter: + name: '&2Hunter three times hunter' + questLore: + - So you found &aVolumnia&f. Thank the great hunters that she is alright. + - Since you have helped &aVolumnia&f and proven yourself a kind soul. + - How about a friendly challenge. I would be willing to offer you some nice + - quality armor should you face the challenge and return victorious. + - The challenge involves hunting + - '&cThree Great Beasts&f scattered across Pontis.' + - The &cBeast Cod Furiosa&f who swims underneath a bridge where two mountains stand. + - '&cBeast Crawler Megdun&f that slumbers on top of a sun covered grove.' + - Dancing between two western peaks you will find the + - '&cBeast Impaler Uladzimir' + - + - + questAcceptDialog: + - '&a[Milonia Majus]&f Here take this device it will roughly guide you to the their location.' + - '&7&oI should go and challenge the &c&oThree Great Beasts&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f You have returned. And you have brought all three items I requested as proof.' + - + - + - Well enough about me, here is your reward as promised! + - '&7You hand back the beast tracking device.' + - '&a[Milonia Majus]&fI had almost forgotten about that thing, thank you!' + - Until we meet again adventurer! +primis_pontis_mille_fields_do_it_yourself: + name: '&2Do it yourself' + questLore: + - Deal with the &cMonsters&f? Well I can tell you we have already been doing that. + - There is just too many of them and not enough of us. + - We started hunting them as soon as we made our &dCamp&f here. + - But their numbers just don't seem to be going down. + - And that's not even the worst of it. + - We have discovered a lair and a big old &cBeast&f that comes with it! + - Well since you have made it to our &dCamp&f in one piece, + - I assume you are quite capable yourself. + - How about joining the hunt? What say you? + questAcceptDialog: + - '&a[Scribonia Ingenvinus]&f I knew you would say yes! I see you are already well equipped.' + - OK, this is what I want you to do. + - + - + - Second I need you to slay 5 &cLonghorns&f and 6 &cShorthorns&f. + - Understood? Good. Report to me when you're done. + - '&7&oI should slay &c&oBig ol'' Bubba&7&o and kill 5 &c&oLonghorns&7&o and 6 &c&oShorthorns&7&o.' + questCompleteMessage: + - '&a[Scribonia Ingenvinus]&f I must say I am quite impressed.' + - Clearly you are way more than just 'capable'. + - Thank you for the assistance, we will be able to handle the rest. + - Until we meet again, great hunter. +primis_pontis_mille_fields_feeding_the_hungry: + customObjectives: + Objective3: + dialog: + - '&7You hand the over the bread and the flour.' + - '&a[Rufia Tertulus]&f I don''t know what to say. My children will be so happy!' + - '&7The woman bows to you in deep appreciation.' + Objective4: + dialog: + - '&a[Fabia Praetextus]&f I guess fantasies do come true sometimes. I am eternally grateful to you kind sir.' + Objective1: + dialog: + - '&a[Lena Lucan]&f Fresh bread! I cannot thank you enough!' + Objective2: + dialog: + - '&a[Tranio Florens]&f Wow! The day just keeps getting better!' + - Thank you for the flour kind soul. + name: '&2Feeding the hungry' + questLore: + - I can feel a good heart beating in that chest of yours. + - Not everyone is as fortunate as you and I. + - There are some poor souls living in the &dPontis Mille Slums&f. + - For a while now I have been working over + - time to produce surplus bread and flour. + - Would you mind taking these sacks of wheat and these bread stacks. + - Then travel with them to the &dSlums&f and hand them out to those in need? + - I have been doing this for a while now but I injured my left foot, + - so I cannot do much walking right now. + questAcceptDialog: + - '&a[Daemones Maritialis]&f I wish there were more people like you in the world.' + - The &dSlums&f are straight North of here, you can see the buildings in the distance. + - '&7&oI should go to the &dSlums&7&o and hand out the food to those in need.' + questCompleteMessage: + - '&a[Augustina Verrucosis]&f &2Daemones&f sent you here didn''t he.' + - + - + - Thank you stranger, my family won't forget this. +primis_pontis_mille_fields_fruity_hound: + name: '&2Fruity hound' + questLore: + - Since you are my NUMBER ONE berry recovery agent, + - I have another task for you. + - As you can see we grow some very large berries on our + - little &dBerry Farm&f here. + - There was a + - '&eSpecific Berry&f I was growing for a contest.' + - But as I was walking to the &dBerry Farm&f I saw a + - '&cFruity Rockhound&f jump for the bush holding my prized berry.' + - He snapped it off and carried it away. + - Its jaws were holding the berry by its stem so + - it should still be in one piece, I hope. + - If you go slay the beast and bring back my + - dear &eContest Berry&f I will have a nice + - reward waiting for you. + questAcceptDialog: + - '&a[Dordalus Nasica]&f I think I saw the &cHound&f head into the &dRedwoods&f, North-West of the farm.' + - '&7&oI should go slay the &c&oFruity Hound&7&o and see if the &e&oContest Berry&7&o is still in one piece.' + questCompleteMessage: + - '&a[Dordalus Nasica]&f YES! That is my darling! Fine and whole, not even any saliva on it!' + - + - + - + - +primis_pontis_mille_fields_not_on_my_farm: + name: '&2Not on my farm!' + questLore: + - Lately all these &cRats&f have been driving me crazy. + - They keep going into our little farm and eating all our goods! + - Any chance you could go and lower their numbers a bit? + - Be careful, there are so many of them. + - Oh, I almost forgot to tell you. + - If you see a large &cWell Fed Rat&f don't bother with it. + - It has grown so large and fat it would take you days to slay it. + questAcceptDialog: + - '&a[Milonia Majus]&f I am sure that you already noticed that they like to squirm around the path area.' + - '&7&oI should go kill the &cRats&7&o that hang around the path that leads to &dPontis Mille&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f Thank you so much! We can get back to making delicious goods now.' +primis_pontis_mille_fields_surprise_me_with_flour: + customObjectives: + Objective3: + dialog: + - '&a[Adulescens Lupis]&f I heard the farm was having &cRat&f problems. Three sacks of flour coming up, no problem!' + Objective1: + dialog: + - '&a[Dinia Niraemius]&f Flour? Sure, one sack of flour coming up!' + Objective2: + dialog: + - '&a[Daemones Maritialis]&f The farm needs more flour eh? Here ya go, two sacks!' + name: '&2Surprise me with flour' + questLore: + - Wow, you're quite handy. If I could bother you with another task. + - The &cRats&f had completely ruined our current stock of flour. + - So we need to a completely new batch of flour. + - The &dWindmills&f should have plenty of it. + - Go collect the flour and drop it off back here with me. + - I will be paying good coin for this service! + questAcceptDialog: + - '&a[Milonia Majus]&f You will need to collect the flour from all three &dWindmills&f.' + - '&7&oI need to visit the three &dWindmills&7&o and collect the flour they produce.' + questCompleteMessage: + - '&a[Milonia Majus]&f This should last us for quite a while!' + - Hopefully our flour tab won't get too big, hehe. +primis_pontis_mille_fields_wellness: + name: '&2Wellness' + questLore: + - Am I glad to see you right now! + - Dang &cNightmare Rat&f ambushed me while I was climbing down the well. + - I injured my arm and legs when I fell. + - Argh, I still have some of its toxic spit left in my eyes. + - Thankfully I managed to crawl my way onto this little + - ledge before it could come finish me off. + - How embarrassing, not sure what hurts more right now, my body or my pride. + - I have some + - '&eFirst Aid Equipment&f' + - in my chest at the &dHunters Camp&f. + - Would you mind getting it for me? Oh, and make sure not to tell anyone + - there a word about what you saw here. + - '...almost died in a well...this is chapter of my life I will need to erase...' + questAcceptDialog: + - '&a[Volumnia Zoilus]&f The &dHunters Camp&f is straight South, cannot miss it, look for tents.' + - '&7&oI need to go collect the &e&oFirst Aid Equipment&7&o for &a&oVolumnia&7&o at the &d&oHunters Camp&7&o.' + questCompleteMessage: + - '&a[Volumnia Zoilus]&f Already back? Hand me the equipment.' + - Do not worry about me, I will have myself patched up in no time. + - Thank you for everything! You saved my life you know! +primis_pontis_mille_field_check: + customObjectives: + Objective1: + dialog: + - '&a[Augustina Verrucosis]&f Oh, this is quite important! I will let the residents know.' + - Thank you for delivering these important documents. + name: '&2Field check' + questLore: + - If I could bother you with some delivery tasks. + - I have here some important documents that need to be delivered to the + - '&dSlums&f and to the &dFields Farm&f.' + - The soldier that was supposed to come and get them has not arrived yet. + - And this is an urgent matter, we cannot afford to wait any longer. + - Unfortunately I have strict orders to not leave my post. + - If you could do this for me it would help us out a lot. + questAcceptDialog: + - '&a[Godefridus Novation]&f You will do it? Excellent!' + - You can follow the &9Yellow Path&f to get to the slums. + - The &dFields Farm&f is right beyond the slums, just follow the path. + - Oh! And watch out for the field rats! + - '&7&oI should head for the &d&oSlums&7&o and then the &d&oFields Farm&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f Documents? Let me see them. Hmmm, looks official.' + - Thank you for coming all the way here to deliver them. + - '&7&oSeems like &a&oMilonia&7&o could use my help with the rats...' +primis_pontis_mille_fresh_rats_coming_up: + customObjectives: + Objective1: + dialog: + - '&a[Elite Guard]&f Plenty of rats inside.' + name: '&2Fresh rats coming up' + questLore: + - No cat food but I think I can help ya + - find something even better... + - I heard a couple of + - '&aGuards&f have been dealing with' + - a rat infestation in the lower parts of the city. + - Go down there and maybe you can get some + - '&cRats&f for your cat friend.' + questAcceptDialog: + - '&7&oI should check out the lower part of the city and see if I can find the &a&oElite Guards&7&o.' + questCompleteMessage: + - '&a[Mew Meowzer]&f Meow. MEOW! Prrrrr.' + - '&7&oI should let the cat enjoy it''s meal in peace.' + - '&7&oIt seems to have dropped something, hmm...' +primis_pontis_mille_hungry_friend: + customObjectives: + Objective3: + dialog: + - '&a[Melaenis Gelasius]&f Cat food? Where the heck did you manage to find a cat here...' + - No, I don't know where to get any cat food. + Objective4: + dialog: + - '&a[Sulpicio Panthera]&f I wish I could help, sorry.' + Objective1: + dialog: + - '&a[Royal Guard]&f Do I look like someone who keeps track of cat food?...' + Objective2: + dialog: + - '&a[Tyndarus Faustinius]&f Sorry, I have no idea.' + Objective5: + dialog: + - '&a[Tyndarus Columbanus]&f We used to have cat food around here somewhere, but heck knows what happened to it...' + name: '&2Hungry friend' + questLore: + - '&7&oWhat is wrong little one.' + - '&a[Mew Meowzer]&f Meow!' + - '&7&o Are you hungry? Does the' + - '&7&olittle one want some food?' + - '&a[Mew Meowzer]&f MREOOOW!!!' + - '&7&oLet''s see if we can' + - '&7&oget you some food.' + questAcceptDialog: + - '&7&oI should see if anybody in the city knows where to find some cat food.' + questCompleteMessage: + - '&a[Modestus Aper]&f Cat food? I don''t know about that. But...' + - '&7&oSeems like &a&oModestus&7&o might know something...' +primis_pontis_mille_late_delivery: + name: '&2Late delivery' + questLore: + - I ordered some &eFishing Nets&f from + - '&dGladius&f that haven''t arrived yet. I wonder' + - if something might have happened to the + - shipment. If you are willing, I would pay you + - a small fee if you could go see what + - happened to the shipment and get the + - '&eFishing Nets&f for me.' + questAcceptDialog: + - '&a[Delphium Calpurnius]&f Last I heard my shipment of &eFishing Nets&f was supposed to be heading for &dGladius&f.' + - '&7&oI need to go look around &d&oGladius&7&o for &a&oDelphium''s&7&o shipment of &e&oFishing Nets&7&o.' + questCompleteMessage: + - '&a[Delphium Calpurnius]&f Those are the &eFishing Nets&f! Thank you so much!' + - '&a[Delphium Calpurnius]&f I invested a lot of my savings into these! Not sure what I would have done if you hadn''t found them.' +primis_pontis_mille_let_them_know: + customObjectives: + Objective3: + dialog: + - So Fortes sent you? I see. + - Your help would be much appreciated, aid me and my forces will be ready. + Objective1: + dialog: + - So Fortes has decided to take action. + - Help me finish my task, and my forces will be ready. + Objective2: + dialog: + - So Fortes has decided to act. + - If you could assist me with this task, then my forces will be ready. + name: '&2Let them know!' + questLore: + - I am sorry that we cannot send aid to &dGladius&f right away. + - Ever since that new &cCounselor&f came, our ruler has not been himself. + - If you could reach out to the &aGenerals&f in the city and let them know + - that &dGladius&f needs help we might be able to to do something about it. + - But not before we deal with the existing issues first. + - + - + - Go talk to them and then come back to let me know they got the message. + - I will reward you for your time. + questAcceptDialog: + - '&a[Fortes]&f Follow the &9orange path&f from the main room to find &aGeneral Bromia&f.' + - '&a[Fortes]&f At the end of the &9yellow path&f you will find the &aGeneral Rogerius&f.' + - '&a[Fortes]&f At the end of the &9shorter purple&f path you will find the &aGeneral Cylindrus&f.' + - '&7&oI need to talk to the three &a&oGenerals&7&o.' + questCompleteMessage: + - '&a[Fortes]&f You managed to contact them? Excellent!' + - '&a[Fortes]&f Here is your reward. Don''t spend it all in one place.' +primis_pontis_mille_lighthouse_1: + customObjectives: + Objective1: + dialog: + - '&8[Hegio Remus]&f Another letter? Thank you for bringing it to me.' + name: '&2A quick delivery' + questLore: + - Before you go anywhere, could you deliver this letter for me? + - You can find the gentleman it needs to go to on top of the Lighthouse. + - Don't worry the Lighthouse is right behind me through that doorway. + questAcceptDialog: + - '&8[Fortes]&f Thank you.' + - '&8&oI should go talk to the Pontis Mille Lighthouse Keeper.' + questCompleteMessage: + - '&8[Hegio Remus]&f Hey, do you have a second?' + - '&8&oSeems like Hegio Remus needs me to talk to him.' +primis_pontis_mille_lighthouse_2: + customObjectives: + Objective1: + dialog: + - '&a[Jeeves]&f Oh, we meet again. It''s good to see you.' + - You have something for me? Oh, wow...that is quite the shopping list. + - I will have the items sent back to &aHegio&f as soon as possible. + - Thank you for stopping by. Hope we meet again. + - '&7&oI should let &aHegio&7&o know I delivered the note.' + name: '&2Ask Jeeves' + questLore: + - Would you mind taking the portal and delivering a note to my good friend &aJeeves&f. + questAcceptDialog: + - '&a[Hegio]&f Much appreciated friend.' + - '&7&oI should go talk to &aJeeves&f at &dCaeruleaum Village&7&o.' + questCompleteMessage: + - '&a[Hegio]&f You delivered the note? Excellent!' + - Here, you can have some of this &eRabbit Stew&f I keep in my back pocket. +primis_pontis_mille_mines_goblined_up_in_the_maze: + customObjectives: + Objective3: + dialog: + - '&a[Hurt Guard]&f Am so I happy to see you!' + Objective1: + dialog: + - '&a[Injured Guard]&f Thank the skies!' + Objective2: + dialog: + - '&a[Wounded Guard]&f Finally, the rescue is here!' + name: '&2Goblined up in the maze' + questLore: + - If I could bother you for a second. + - Since you will be going into the &dMines&f already, it + - would be great if you could help us resolve some issues. + - We are missing three &aGuards&f that were sent + - into the mines to hunt down a &cCursed Goblin&f. + - I fear that something might have happened to them. + - This &cCursed Goblin&f is supposed to be + - hiding in some sort of &9Maze&f in the &dMines&f. + - Could you locate the &aMissing Guards&f and + - bring me proof of the &cGoblins&f death. + questAcceptDialog: + - '&a[Centurion]&fTry to not get lost in the &9Maze&f.' + - May luck be on your side warrior! + - '&7&oI should venture through the &d&oMines&7&o and locate the &9&oMaze&7&o.' + questCompleteMessage: + - '&a[Centurion]&f They are alive, excellent, we will send some soldiers to get them out as soon as possible.' + - I see you brought proof of the &cGoblins&f death, well done. + - '&7&oHopefully people keep out of the &9Maze&7&o in the future.' +primis_pontis_mille_serious_sewage: + customObjectives: + Objective3: + dialog: + - '&a[Michelangelo]&f Tell that old man everything is in order!' + Objective4: + dialog: + - '&a[Raphael]&f Tell Rogerius I am alive and doing fine!' + Objective1: + dialog: + - '&a[Donatello]&f You can tell the General I am doing just fine!' + Objective2: + dialog: + - '&a[Leonardo]&f The General should not worry, I am ok!' + name: '&2Serious sewage' + questLore: + - If you are up to the task then I could use your help. + - + - + - + - + - They have a leader, I think he calls himself &cShreepper&f or something. + - Make sure to get rid of him, a snake without it's head is not a threat. + - If you could go down there and thin the numbers of critters and the trouble makers + - then that would allow me to assign my forces to more important tasks... + - We had also sent &a4 Agents&f down there, I have not heard from them yet. + - + - + - I also seem to have misplaced my personal &eSewage Keys&f + - if you could retrieve those too, that would be great. + questAcceptDialog: + - '&a[Rogerius]&fYou can get to the &dSewers&f by going to the fountain and then a bit south-east.' + - + - + - '&7&oI need to find my way into the &dSewers&7&o and complete the tasks.' + questCompleteMessage: + - '&a[Rogerius]&f You have completed the all I have asked? If only I had 10 more men like you...' +primis_pontis_mille_star_gazing: + customObjectives: + Objective1: + dialog: + - '&a[Virgo Dexippus]&f Yes, what is it?' + name: '&2Star gazing' + questLore: + - You have done so much for this city and its people. + - Having assisted the three &aGenerals&f and helped the areas around &dPontis Mille&f + - has freed up a serious amount of our forces and resources. + - We would be able to send our forces to aid &dGladius&f now. + - But before we take action there is one last thing I would like you to do. + - You should go speak with the &aStargazers&f. + - It is in regards to our lost history and the &cElementals&f. + - The &aStargazers&f will be able to tell you more once you talk to them. + - Here take this sealed note and show it to them. + questAcceptDialog: + - '&7[Fortes Bellator]&f You can find the &aStargazers&f at the &dObservatory&f.' + - + - + - '&7&oI should talk to the &aStargazers&7&o at the &dObservatory&7&o.' + questCompleteMessage: + - '&a[Virgo Dexippus]&f The &aMajor&f sent you? It must be important then.' + - '&7&oI should talk to &aVirgo&7&o.' +primis_pontis_mille_stay_a_while_and_listen: + name: '&2Stay a while and listen' + questLore: + - Hand me the note. Let me take a look... + - We have been given permission to share important + - information with you regarding our past. + - You must have done something quite important, + - this information is usually only shared with the top brass. + - '&aStella&f will share with you what we have uncovered.' + questAcceptDialog: + - '&a[Virgo Dexippus]&f Talk to &aStella&f and &9Click on the Sword&f to start listening.' + - '&7&oI should talk to &aStella&7&o and start the &9Arena Challenge&7&o.' + questCompleteMessage: + - '&a[Virgo Dexippus]&f Do not share this information with anyone.' + - '&7&oThat was quite a tale.' +primis_pontis_mille_the_groves_call: + customObjectives: + Objective1: + dialog: + - '&a[King Nemian]&f &2General Bromia&a sent you?' + - Excellent, I knew we could count on him. + name: '&2The groves call!' + questLore: + - It is our duty to protect the &dGroves&f from any threats. + - '&aKing Nemian&f of the &dGroves&f has sent a request for aid.' + - Nasty critters have come to the &dGroves&f and other + - invaders are taking over the trees. + - If you could go over there and sort out these issues + - then my forces will be free to come to &dGladius'&f aid + questAcceptDialog: + - '&a[Bromia]&f The &dGroves&f are located North of the city.' + - There is a path through the mountain,, below the mines. + - '&7&oI should talk to &aKing Nemian&7&o.' + questCompleteMessage: + - '&a[King Nemian]&f You have arrived just in time!' +primis_pontis_mille_to_lycan_or_not_to_lycan: + name: '&2To lycan or not to lycan' + questLore: + - Not sure how a single person can accomplish what + - an entire battalion cannot. + - But if the &aGeneral&f has sent you, then who I am to complain. + - We have located their &dDen&f, but the resistance is too strong. + - There was just no way to get through. + - But If you could fight your way into the &dDen&f and clear it out + - then the &dRedwoods&f could be safe yet again. Well safer at least... + - Their &dDen&f is located under a &9Corrupted Redwood Tree&f. + - Should be easy to spot it, it stands out among the healthy trees. + questAcceptDialog: + - '&a[Cylindrus]&f Be careful...' + - '&7&oI need to clear out the &dWerewolf Den&7&o.' + questCompleteMessage: + - '&a[Magnus]&f By the great tree fairy, you''ve done it!!!' + - Feel free to rest at our camp, you are always welcome here. +primis_pontis_mille_where_is_he_now: + customObjectives: + Objective1: + dialog: + - '&a[Gorenus Palis]&f My brother sent you looking for me?' + - Oh, I messed up again...I got real lost this time. + - I hope he isn't too mad. + - When you go back, please tell him I'm safe. + name: '&2Hungry friend' + questLore: + - Me and my &aBrother&f were on our way + - back here from the village. + - During our travels I had to do a little detour, so we got separated. + - We were supposed to meet up here. + - But no trace of him for quite some time now. + - He has a tendency to get lost...real lost. + - I am quite worried about him. + - I would be willing to pay a high reward + - to anyone who can find him. + questAcceptDialog: + - '&a[Rodenus Palis]&f So kind of you to offer your help.' + - Please if you find him come tell me where he is right away. + - '&7&oI need to go find &a&oRodenus''&7&o brother.' + questCompleteMessage: + - '&a[Rodenus Palis]&f What! How the heck did he end up all the way there!' + - Sigh, I better start going now then... + - Thank you for all your help. Here are the coins as promised. +primis_pontis_redwoods_big_brown_logs: + customObjectives: + Objective1: + dialog: + - '&a[Magnus]&f Who are you? Oh, you came from &dPontis Mille&f.' + name: '&2Big brown logs' + questLore: + - I could dedicate my forces to helping &dGladius&f if you could help + - us deal with the &cWerewolf&f crisis in the &dRedwoods&f. + - Our forces have been holding back the &cWerewolves&f for weeks now. + - It would be great if you could assist us. + - Go to the &dRedwoods&f and talk to &aMagnus Castorea&f. + - They will let you know what needs to be done to end this crisis. + questAcceptDialog: + - '&a[Cylindrus]&fThe &dRedwoods&f can be reached by heading North.' + - Head North until you reach the &dRailway Stop&f, then head West. + - '&7&oI need to head into the &dRedwoods&7&o and talk to &aMagnus&7&o.' + questCompleteMessage: + - '&a[Magnus]&f The general has sent you to help?' + - Hmm...you better be good. +primis_pontis_redwoods_its_reyn_time: + name: '&2It is Reyn time!' + questLore: + - My &ePocket-watch&f had fallen into the river when I was cutting down a tree. + - It is a special watch you see. Filled with air and quite robust. + - Fully resilient to heavy logs being dropped on it, yep. + - I saw one of those nasty &cBandits&f scoop it up and put it in their pocket. + - Pretty sure I saw them &9Carrying a Hatchet&f. + - + - + - A nice reward for you too when you get back! + questAcceptDialog: + - '&8[Reynus]&f You can find the &cBandits&f right across the river.' + - '&7&oI need to go slay the correct &cBandit&7&o and collect the &eWatch&7&o.' + questCompleteMessage: + - '&a[Reynus]&f I will make sure not to loose it again!' + - Your reward my good sir! +primis_pontis_redwoods_nasty_little_bandits: + name: '&2Nasty little bandits!' + questLore: + - Ever since these darn &cBandits&f settled across the river there has been no peace. + - They keep ruining the trees, yesterday I caught one of them + - trying to set one of these giant trees on fire! + - And not too long ago I got chased by a crazy person with a hatchet, + - I am quite sure it was one of the &cBandits&f. + - Not too mention they keep trying to rob anyone that + - has business with us good folk here at the &dSawmill&f. + - Enough is enough. I am willing to pay good coin to make this madness end. + questAcceptDialog: + - '&a[Ligna Crispian]&f You will find them across the river.' + - '&8&oI should go to the &dBandit Camp&f and clear it out.' + questCompleteMessage: + - '&a[Ligna Crispian]&f Finally! Some peace, thank you!' +primis_pontis_redwoods_need_a_smoke: + name: '&2Need a smoke' + questLore: + - I heard you helped good old &aReynus&f there. + - Well as you can see, I managed to cut my legs with that darn saw again. + - Oh, don't worry about me. My legs will be healed up again in no time. + - You see, the issue is, not much to do while I wait for my legs to heal. + - This makes me in the mood for some good puffin. + - I brought with me some &ePremium Tobacco&f for my pipe, + - but I had to hide it in case those &cBandits&f got their hands on it. + - The problem is, I completely forgot where I hid it! + - All I remember is burying it &9Near a Tree&f. + - Which tree? Who knows! + - Listen I got you a fine deal here. Find my tobacco and you can have + - all of my &eGolden Apples&f. + questAcceptDialog: + - '&a[Lyco]&f Hope ya find it soon.' + - '&7&oI should go look for the &eTobacco&7&o.' + questCompleteMessage: + - '&a[Lyco]&f You found it! HAHA! Knew I could rely on ya!' +primis_terravilla_bipedal_examination: + name: '&2Bipedal examination' + questLore: + - I have been studying the &cTwo Legged Terrors&f that roam + - around &dTerravilla&f. Did you know that their population + - used to be much larger just some years ago. In fact it was + - the reason why the first settlers decided to build + - '&dTerravilla&f on top of the ruins and not down on the ground.' + - For some reason their numbers have really decreased. I was + - trying to get some &eSamples&f but trying to kill any of them is + - far beyond my skill. But you look like the sort of type who + - can handle a &cTwo Legged Terror&f or two. Interested in + - helping me out? + questAcceptDialog: + - '&a[Plautia Suilius]&f Six &eSamples&f should do it. Return to me once you have collected the &eSamples&f.' + - '&7&oI need to slay 3 &c&oTwo Legged Terrors&7&o and collect their &e&oSamples&7&o.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Great! Let''s have a look.' + - '&7&oI should hear what &a&oPlautia Suilius&7&o has discovered.' +primis_terravilla_drowning_terror: + name: '&2Drowning terror' + questLore: + - My theory was correct. I dissected the growth and found + - an organism inside. After careful examination I have + - determined that the organism is of aquatic origin. And + - not only that, they are capable of hijacking the host's + - brain. Once ready to hatch they make the host go to the + - nearest water source and drown themselves. The organism + - can then freely hatch and swim away. Whatever is + - infecting the &cTwo Legged Terrors&f must be living in + - a nearby river. You should go there and collect a + - '&ePerfect Sample&f of whatever organism is causing this.' + - I do not know if this is something that can affect humans + - but just in case you should kill a few of the organisms + - to make sure. + questAcceptDialog: + - '&a[Plautia Suilius]&f Come back here once you have collected a &ePerfect Sample&f.' + - '&7&oI need to go to the nearby river and collect a &e&oPerfect Sample&7&o of whatever is causing the infections.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Wow it looks like a fish, but it''s internal organs are different.' + - It must infect other creatures by releasing these tiny worm like meat particles... + - Let me have a look at you. Hmm, you seem fine, no traces... + - + - + - + - + - + - '&7&oI should make sure to stay away from the river...' +primis_terravilla_hog_on_my_porch: + name: '&2Bipedal examination' + questLore: + - He is sitting on the darn lift again! + - I cannot believe it! You there! + - You look like you can handle a large beast. + - I will pay you good money if you can get rid + - of that &cAnnoying Large Hog&f that keeps sitting + - on the lift. How are we supposed to get goods + - up and down this way. + questAcceptDialog: + - '&a[Dorippa Sarimarcus]&f Get rid of that hog right down there, see it?' + - '&7&oI need to slay the &c&oAlpha Razorback&7&o.' + questCompleteMessage: + - '&a[Dorippa Sarimarcus]&f Finally! I can move on with my life now! Thank you!' +primis_terravilla_razorbag: + name: '&2Razorbag' + questLore: + - If you are looking for work I got some for ya. + - I design and make heavy duty bags that I sell + - here at my little shop. So I am in need of + - leather. Thankfully there are plenty of + - '&cRazorbacks&f around these parts. If you are' + - interested I would like to hire you to go hunt + - them for their leather. I would need a considerable + - amount of leather. So this won't be a quick job. + questAcceptDialog: + - '&a[Telestis Senna]&f You will mostly find them roaming around here and towards the fields area.' + - '&7&oI need to go hunt the &c&oMature Razorback&7&o.' + questCompleteMessage: + - '&a[Telestis Senna]&f Yep, that will do it. In pristine condition too! Here is your coin, as promised.' +primis_terravilla_terrifying: + name: '&2Terrifying' + questLore: + - Well that is concerning. The sample you brought shows + - that they are slowly being drained of their nutrients. + - My hypothesis is that there is most likely a parasite + - attached to them that is causing this. You should go + - out there again and see if you can find any large + - '&eGrowths&f on their bodies, and then cut them off' + - and bring them back here. + questAcceptDialog: + - '&a[Plautia Suilius]&f I would only need two &eGrowths&f no more than that.' + - '&7&oI need to slay &c&oTwo Legged Terrors&7&o and collect two &e&oGrowths&7&o.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Excellent, these should do it.' + - '&7&oI should hear what &a&oPlautia Suilius&7&o has managed to find.' +test_quest: + name: Kill the Test Boss + questLore: + - '&cEnd the test boss'' reign of terror!' +xmas_quest_0: + name: '&2Find the lost gifts!' + questLore: + - + - + - I will let you open one of them in return! + questAcceptDialog: + - '&8[&cSaint Nick&8]&f Thank you! I will be waiting here for you!' + questCompleteMessage: + - '&8[&cSaint Nick&8]&f Thank you for your help! There are still some lost gifts out there, talk to me again if you want to help out more!' diff --git a/src/main/resources/translations/russian.yml b/src/main/resources/translations/russian.yml new file mode 100644 index 000000000..a11eb7fe3 --- /dev/null +++ b/src/main/resources/translations/russian.yml @@ -0,0 +1,13253 @@ +config: + noArenaPermissionMessage: '[EliteMobs] У вас нет разрешения на вход в эту арену!' +ItemSettings: + itemLoreStructureV2: + - '&7&m&l---------&7<&lЭпическая информация&7>&m&l---------' + - '&7Уровень предмета: &f$itemLevel &7Престиж &6$prestigeLevel' + - '$weaponOrArmorStats' + - '$soulbindInfo' + - '$itemSource' + - '$ifLore§7&m&l-----------§7< &f&lПредание&7 >&m&l-----------' + - '$customLore' + - '$ifEnchantments§7&m&l--------§7<§9§lЗачарования§7>&m&l--------' + - '$enchantments' + - '$eliteEnchantments' + - '$ifCustomEnchantments§7&m&l------§7< §3§lПользовательские зачарования§7 >&m&l------' + - '$customEnchantments' + - '$ifPotionEffects§7&m&l----------&7< &5&lЭффекты&7 >&m&l----------' + - '$potionEffect' + - '&7&l&m-----------------------------' + - '$loreResaleValue' + shopSourceItemLores: '&7Куплено в магазине' + mobSourceItemLores: '&7Разграблено $mob' + loreWorths: '&7Стойкость $worth $currencyName' + loreResaleValues: '&7Продается за $resale $currencyName' + eliteEnchantmentLoreStrings: Элитный + noSoulbindLore: '&7Не присоединён ни к какой душе!' + preventEliteItemDisenchantmentMessage: '&c[EliteMobs] Невозможно разобрать Elite предметы!' + scrapSucceededMessageV2: '&8[EliteMobs] &2Утилизация успешно выполнена $amount раз!' + scrapFailedMessageV2: '&8[EliteMobs] &2Утилизация не выполнена $amount раз!' + lowDurabilityItemDropMessage: '&8[EliteMobs] &cБроня сброшена из-за низкой прочности! &8Отремонтируйте её у NPC утилизации, чтобы использовать её снова!' + lowWeaponItemDropMessage: '&8[EliteMobs] &cПредмет сброшен из-за низкой прочности! &8Отремонтируйте его у NPC утилизации, чтобы использовать его снова!' + simlootMessageSuccess: '&8[EliteMobs] &2Отдано предмет и получено $itemName &2!' + simlootMessageFailure: '&8[EliteMobs] &cВы отдали предмет, увы, ничего не получив взамен!' + directDropCustomLootMessage: '&8[EliteMobs] &2Получено $itemName &2!' + directDropMinecraftLootMessage: '&8[EliteMobs] &aПолучено $itemName &a!' + directDropCoinMessage: '&8[EliteMobs] &aПолучено &2$amount $currencyName &a!' + directDropSpecialMessage: '&8[EliteMobs] &aПолучено &2$amount $name &a!' + weaponEntry: '&7Elite DPS: &2$EDPS' + armorEntry: '&7Elite броня: &2$EDEF' +ProceduralItemGenerationSettings: + materialNames: + swordName: Меч + bowName: Лук + pickaxe: Кирка + spade: Лопата + hoe: Мотыга + axe: Топор + helmet: Шлем + chestplate: Нагрудник + leggings: Поножи + boots: Ботинки + shears: Ножницы + fishingRod: Удочка + shield: Щит + trident: Трезубец + crossbow: Арбалет + nameFormats: + - '$verb $itemType из $adjective $noun' + - '$itemType из $adjective $noun' + - '$noun $adjective $verb $itemType' + - '$verb $itemType' + - '$adjective $verb $itemType' + - '$verb-er' + - '$adjective $verb-er' + nouns: + - MagmaGuy + - Рассвет + - Закат + - Рай + - Ад + - Ангел + - Архангел + - Херувим + - Серафим + - Демон + - Проклятые + - Летучая мышь + - Курица + - Корова + - Мухомор + - Свинья + - Кролик + - Овца + - Спрут + - Деревенский житель + - Пещерный паук + - Эндермен + - Белый Медведь + - Паук + - Свинозомби + - Ифрит + - Крипер + - Древний Страж + - Эндермит + - вызыватель + - Гаст + - Страж + - Хаск + - Магма Куб + - Шалкер + - Чешуйница + - Скелет + - Слизень + - Зигомор + - Векс + - Поборник + - Ведьма + - Скелет-Иссушитель + - Зомби + - Осел + - Лошадь + - Лама + - Мул + - Оцелот + - Волк + - Железный голем + - Снежный Голем + - Эндер-дракон + - Визер + - Иллюзионист + - Попугай + - Гигант + - Кролик убийца + - Стив + - Вольфбан + - Хаос + - Эон + - Дракон + - Сфинкс + - Минотавр + - Отклонение + - Клятва + - Клятвопреступник + - Дезертир + - Предатель + - Нефрит + - Свет + - Тьма + - Забвение + - Тень + - Пустой + - Чужой + - Зилотск + - Зенит + - Сумерки + - Сумерки + - Моб + - Элитный моб + - Урист + - Дворф + - Эльф + - Орк + - Гоблин + - Гном + - Голиаф + - Drow + - Человек + - Halfling + - Полуорк + - Beholder + - Mind Flayer + - Owlbear + - Bulette + - Rust Monster + - Холмовой гигант + - Каменный гигант + - Морозный гигант + - Огненный гигант + - Облачный гигант + - Штормовой гигант + - Kobold + - Лич + - Орк + - Umber Hulk + - Боец + - Маг + - Паладин + - Жрец + - Рейнджер + - Лучник + - Маг + - Tiefling + - Оборотень + - Вампир + - Кентавр + - Catfolk + - Полугигант + - Огр + - Тролль + - Жулик + - Варвар + - Бард + - Друид + - Monk + - Sorcerer + - Warlock + - Demon Hunter + - Death Knight + - Priest + - Shaman + - Warrior + - Basilisk + - Chimera + - Imp + - Dryad + - Gargoyle + - Djinni + - Efreeti + - Ghost + - Hobgoblin + - Hydra + - Kraken + - Lamia + - Medusa + - Mimic + - Mummy + - Pegasus + - Roc + - Satyr + - Тарраске + - Отвращение + - Вурдалак + - Древний + - Единорожек + - Призрак + - Послушники + - Гладиатор + - Рыцарь + - грифон + - Рейдер + - Скаут + - Шпион + - Тг + - Благородный + - Стражник + - Ветеран + - Виверна + - Бездна + - Адский + - Элементаль + - Таурен + - Пандарен + - снежный человек + - Покинутый + - Йети + - Банши + - Арахнид + - Нежить + - Ночной эльф + - Кровавый Эльф + - Дреней + - Ворген + - Главнокомандующий + - Ведьма + - Маг + - Шалфей + - Вор + - Ассассин + - Храмовник + - Повелитель зверей + - Берсеркер + - изобретатель + - Luchador + - Пират + - Авангард + - Voidblade + - Висп + - Крестьянин + - Лакей + - Мечник + - Тралл + - Гончая скверны + - Охотницы + - Охотник + - Aarakorcra + - Aboleth + - Дева + - Planetar + - Солнечная + - Ankheg + - Azer + - Позади + - Смертельный Тиран + - Упадок + - Медведь + - Хугбер + - Булливуд + - Камбион + - Chuul + - Король-лич + - Василиск + - Коатль + - Циклоп + - Титан + - Мантия тьмы + - Древний + - Demilich + - Балор + - Barlgura + - Пропасть + - Дретч + - Glabrezu + - Гористро + - Hezrou + - Мане + - Марилит + - Nalfeshnee + - Выход + - Vrock + - Yochlol + - Pit Fiend + - Lemure + - Dracolich + - Doppleganger + - Chromatic Dragon + - Drider + - Элементаль воздуха + - Элементаль земли + - Элементаль огня + - Элементаль воды + - Rohirrim + - Gondorian + - Empyrean + - Faerie Dragon + - Ettin + - Flumph + - Fomorian + - Dao + - Gnoll + - Parshendi + - Listener + - Spren + - Stormfather + - Rosharian + - Брайтлорд + - Высокий принц + - Король + - Император + - Осколочный носитель + - Surgebinder + - Кузнец Бондзей + - Голем + - Горгона + - Hag + - Гарпия + - Hippogriff + - Homunculus + - Опытный Алхимик + - Бессмертный солдат + - Чакалверс + - Нотик + - Они + - Rakshasa + - Revenant + - Сектант + adjectives: + - Изящный + - Прекрасно + - Чистый + - Элегантный + - Причудливое + - Обаятельный + - Красивый | мужественный + - Длинный + - Восхитительно + - Чистый + - Приближение + - Игристое + - Самый уродливый + - Красный + - Оранжевый + - Жёлтый + - Зеленый + - Синий + - Фиолетовый + - Серый + - Черный + - Белый + - Мёртв + - Странный + - Мощный + - Богатый + - Огромный + - Ревностный + - Оглушительный + - Слабый + - Мелодичный + - Тихий + - Гром + - Шепотом + - Шипение + - Древний + - Быстрый + - Старый + - Быстрый + - Медленный + - Гнилая + - Жуткий + - Изогнутый + - Пустой + - Тяжелая + - Отвратительный + - Аномальный + - Абсурд + - Приемлемый + - Случайный + - Адамант + - Авантюрный + - Агонизирующий + - Предупреждение + - Раздраженный + - Раздражающий + - Тревожный + - Ароматный + - Агрессивный + - В стороне + - Удивительный + - Двусмысленный + - Амбициозный + - Изумленный + - Злой + - Высокомерный + - Ashamed + - Стремящийся + - Удивительный + - Знаменательный + - Средний + - Отличный + - Ужасный + - Плохой + - Варварский + - Робкий + - Подобающее + - Воюющий + - Эффективный + - Берсерк + - Лучший + - Извилистый + - Большой + - Горький + - Причудливый + - Кровавый + - Кипящий + - Бескрайний + - Дерзкий + - Храбрый + - Мускулистый + - Разбиваемый + - Краткий + - Яркий + - Сломанный + - Занят(-а) + - Подсчет + - Черствый + - Спокойный + - Капризный + - Осторожный + - Беспечный + - Заботливый + - Осторожный + - Непрерывный + - Уверенный + - Очаровательный + - Бюджетные + - Глава + - Острый + - Рыцарский + - Chunky + - Clear + - Clever + - Cloistered + - Clumsy + - Cloudy + - Classy + - Колоссал + - Боевой + - Общее + - Озадаченный + - Осуждает меня + - Холодный + - Доблестный + - трусливый + - Сумасшедшее + - трусливый + - Жестокость + - Ласковый + - Любопытный + - Милые + - Повреждено + - Повреждение + - Опасно + - Темный + - Битье + - Решающий + - Глубина + - Босс побежден + - Перебежчики + - Непобедимый + - Delicate + - Delicious + - Delightful + - Demonic + - Delirious + - Deranged + - Descriptive + - Devilish + - Difficult + - Diligent + - Direful + - Dirty + - Disastrous + - Disgusted + - Противноядие + - Распространяется + - Различия + - Вмешательство + - Draconian + - Драматичная + - Мечтатель + - Дисфункциональный + - Перенос + - Пожилые + - Электронагрев + - Элитный + - Зачарованная + - Чародейство + - Полный сил + - Огромный + - Развлечения + - Восторженный + - Зависть + - Некорректный + - Этереал + - Уклоняющийся + - Отличный + - Волнение + - Захватывающая + - Экзотичная + - Буйный + - Невероятный + - Затухание + - Ясно + - Преданный + - 'Ложь' + - Familiar + - Знаменитости + - Фанатик + - Фантастическое + - Завороженность + - Жиры + - Пугливый + - Бесстрашность + - Слабость + - праздничный + - Свирепый + - Неожиданно + - '[Хорошая работа]' + - Привередливый + - Первый + - Фиксированный + - Оглушающий + - Безукоризненный + - Flimsy + - Flippant + - Flowery + - Fluffy + - Fluttering + - Foamy + - Foolish + - Forgetful + - Fortunate + - Frail + - Fragile + - Frantic + - Free + - Freezing + - Fresh + - Friendly + - Frightening + - Fumbling + - Funny + - Furry + - Furtive + - Fuzzy + - Гигант + - Gifted + - Gigantic + - Glistening + - Glorious + - Godly + - Good + - Goofy + - Gorgeous + - Graceful + - Grandiose + - Grateful + - Greasy + - Great + - Greedy + - Grieving + - Groovy + - Grotesque + - Grubby + - Gruesome + - Grumpy + - Guarded + - Guiltless + - Gullible + - Gutsy + - Guttural + - Hallowed + - Hanging + - Безжалостный + - Happy + - Harmonious + - Hateful + - Healthy + - Heartbreaking + - Heavenly + - Hellish + - Helpful + - Helpless + - Hesitant + - Hideous + - Hilarious + - Hollow + - Homeless + - Honorable + - Horrible + - Hospitable + - Huge + - Hulking + - Humorous + - Hungry + - Hurt + - Hushed + - Hypnotic + - Hysterical + - Icky + - Icy + - Ignorant + - Ill + - Illegal + - Illustrious + - Imaginary + - Immense + - Imminent + - Impartial + - Imperfect + - Impolite + - Important + - Incandescent + - Incompetent + - Industrious + - Incredible + - Inexpensive + - Infamous + - Innocent + - Inquisitive + - Insidious + - Instinctive + - Intelligent + - Interesting + - Invincible + - Irate + - Itchy + - Jaded + - Jagged + - Jealous + - Jolly + - Joyous + - Jumpy + - Juvenile + - Keen + - Kind + - Kindhearted + - Knowing + - Knowledgeable + - Known + - Labored + - Lame + - Large + - Last + - Late + - Laughable + - Lazy + - Lean + - Lethal + - Свет + - Little + - Living + - Lonely + - Loud + - Lovely + - Lucky + - Magenta + - Magical + - Majestic + - Malicious + - Marked + - Massive + - Marvelous + - Mean + - Medical + - Melted + - Messy + - Mighty + - Military + - Mindless + - Minor + - Misty + - Mixed + - Modern + - Motionless + - Mysterious + - Naive + - Narrow + - Natural + - Neat + - Necessary + - Needless + - Needy + - Nervous + - New + - Nice + - Normal + - Nostalgic + - Numberless + - Obsolete + - Obtainable + - Oceanic + - Old-fashioned + - Omniscient + - Optimal + - Ordinary + - Organic + - Outstanding + - Oval + - Overrated + - Painful + - Parallel + - Pathetic + - Peaceful + - Penitent + - Perfect + - Periodic + - Petite + - Physical + - Pink + - Plastic + - Pleasant + - Pointless + - Polite + - Poor + - Precious + - Premium + - Present + - Pretty + - Private + - Productive + - Protective + - Public + - Puzzling + - Questionable + - Quick + - Quickest + - Rare + - Ready + - Real + - Rebel + - Regular + - Remarkable + - Responsible + - Romantic + - Round + - Royal + - Sad + - Safe + - Salty + - Satisfying + - Scared + - Scary + - Scientific + - Scrawny + - Screeching + - Second + - Second-hand + - Secret + - Selfish + - Sequacious + - Serious + - Shallow + - Sharp + - Shiny + - Shocking + - Short + - Shy + - Sick + - Silent + - Silky + - Silly + - Simple + - Skinny + - Slim + - Slimy + - Slippery + - Small + - Smart + - Smiling + - Smooth + - Sneaky + - Soft + - Solid + - Special + - Spectacular + - Spicy + - Spiky + - Splendid + - Spooky + - Spotless + - Square + - Staking + - Standing + - Steady + - Sticky + - Strange + - Striped + - Strong + - Successful + - Super + - Supreme + - Sweet + - Talented + - Tall + - Tasty + - Temporary + - Tense + - Terrible + - Terrific + - Tested + - Thankful + - Thick + - Thin + - Жажда + - Thoughtful + - Tiny + - Tired + - Tricky + - Troubled + - 'True' + - Ugly + - Ultra + - Unadvised + - Unarmed + - Uncovered + - Unhealthy + - Unique + - Unknown + - Unnatural + - Unused + - Unusual + - Used + - Useful + - Useless + - Valuable + - Violent + - Waiting + - Wandering + - Warm + - Weak + - Wealthy + - Whole + - Wise + - Wonderful + - Wooden + - Worried + - Worthless + - Wrong + - Menacing + - Trusting + - Unassuming + - Threatening + verbs: + - Slashing + - Cutting + - Stabbing + - Scratching + - Killing + - Slaying + - Butchering + - Destroying + - Tickling + - Hugging + - Murdering + - Slapping + - Шипение + - Traveling + - Teleporting + - Blinking + - Destroying + - Wrecking + - Flashing + - Materializing + - Spawning + - Questioning + - Inquiring + - Pleading + - Demanding + - Interrogating + - Querying + - Assaulting + - Striking + - Ambushing + - Assailing + - Rushing + - Storming + - Bombarding + - Barraging + - Smiting + - Charging + - Clobbering + - Battling + - Battering + - Hammering + - Beating + - Combating + - Overwhelming + - Raiding + - Tackling + - Shooting + - Venturing + - Cracking + - Rupturing + - Smashing + - Shattering + - Fracturing + - Splintering + - Pulverizing + - Tearing + - Rending + - Snapping + - Bursting + - Exploding + - Повреждение + - Fragmenting + - Splitting + - Fortifying + - Nudging + - Tapping + - Jostling + - Thumping + - Butting + - Clattering + - Striking + - Whacking + - Slamming + - Summoning + - Screaming + - Bellowing + - Roaring + - Shifting + - Transforming + - Modifying + - Twisting + - Mutating + - Distorting + - Blurring + - Adjusting + - Warping + - Altering + - Adapting + - Evolving + - Varying + - Hunting + - Trailing + - Following + - Stalking + - Shadowing + - Hounding + - Casing + - Mounting + - Ascending + - Rising + - Heaving + - Springing + - Cresting + - Gathering + - Corralling + - Hoarding + - Reaping + - Harvesting + - Saving + - Sheltering + - Cloaking + - Shrouding + - Enclosing + - Concealing + - Hiding + - Disguising + - Masking + - Burying + - Smothering + - Clouding + - Shielding + - Shading + - Sealing + - Enveloping + - Veiling + - Obscuring + - Traversing + - Fording + - Gliding + - Howling + - Whimpering + - Screaming + - Shrieking + - Squealing + - Roaring + - Wailing + - Bawling + - Screeching + - Cleaving + - Chopping + - Chipping + - Severing + - Slicing + - Snipping + - Splitting + - Axing + - Slashing + - Rending + - Tearing + - Thinning + - Cropping + - Carving + - Dissecting + - Hacking + - Piercing + - Sawing + - Shaving + - Shearing + - Mining + - Delving + - Excavating + - Burrowing + - Drilling + - Hollowing + - Gouging + - Tunneling + - Invading + - Boarding + - Wandering + - Infiltrating + - Intruding + - Evading + - Fleeing + - Running + - Dodging + - Crashing + - Battling + - Tussling + - Wrestling + - Scuffling + - Dueling + - Brawling + - Jousting + - Sparring + - Clashing + - Warring + - Grappling + - Scrapping + - Attacking + - Feuding + - Skirmishing + - Discovering + - Detecting + - Catching + - Solving + - Revealing + - Unearthing + - Leaping + - Bouncing + - Springing + - Vaulting + - Hopping + - Surging + - Punting + - Booting + - Dropkicking + - Sensing + - Perceiving + - Detecting + - Fading + - Bleeding + - Shrinking + - Ослабление + - Abating + - Diminishing + - Forging + - Releasing + - Gathering + - Collecting + - Culling + - Crushing + - Propelling + - Jogging + - Sprinting + - Questing + - Scouting + - Exploring + - Digging + - Trembling + - Rattling + - Parting + - Hacking + - Rupturing + - Carving + - Dividing + - Halving + - Breaking + - Sundering + - Separating + - Rending + - Ripping + - Grazing + - Imprisoning + - Snaring + - Cornering + - Entangling + - Pinning + - Catching + - Restraining + - Binding + - Hooking + - Snagging + - Snatching + - Caging + - Capturing + - Haunting + - Creeping + - Sneaking + - Spying + - Avenging + - Storming + verb-ers (noun): + - World Breaker + - World Shatterer + - Avenger + - Ashbringer + - Windseeker + - Defiler + - Thunderfury + - Slicer + - Slasher + - Cutter + - Stabber + - Scratcher + - Killer + - Slayer + - Destroyer + - Hugger + - Murderer + - Slapper + - Traveller + - Teleporter + - Blinker + - Wrecker + - Materializer + - Spawner + - Demander + - Assaulter + - Striker + - Ambusher + - Rusher + - Stormer + - Bombarder + - Barrager + - Smiter + - Charger + - Battler + - Hammerer + - Beater + - Combater + - Overwhelmer + - Рейдер + - Tackler + - Shooter + - Venturer + - Cracker + - Smasher + - Shatterer + - Fracturer + - Splinterer + - Pulverizer + - Tearer + - Renderer + - Snapper + - Burster + - Exploder + - Damager + - Fragmenter + - Splitter + - Fortifier + - Nudger + - Tapper + - Thumper + - Butter + - Clatterer + - Striker + - Whacker + - Slammer + - Summoner + - Screamer + - Shifter + - Transformer + - Modifyer + - Twister + - Blurrer + - Warper + - Alterer + - Adapter + - Evolver + - HunterEnchantment + - Trailer + - Follower + - Stalker + - Shadower + - Hounder + - Caser + - Mounter + - Ascender + - Riser + - Springer + - Hoarder + - Reaper + - Harvester + - Saver + - Shelterer + - Cloaker + - Shrouder + - Encloser + - Hider + - Masker + - Buryer + - Clouder + - Shader + - Sealer + - Enveloper + - Veiler + - Traverser + - Forder + - Glider + - Howler + - Whimperer + - Screamer + - Squealer + - Bawler + - Screecher + - Chopper + - Chipper + - Snipper + - Splitter + - Axer + - Slasher + - Renderer + - Tearer + - Thinner + - Cropper + - Carver + - Hacker + - Piercer + - Sawer + - Shaver + - Shearer + - Miner + - Excavater + - Burrower + - Driller + - Tunneler + - Invader + - Boarder + - Wanderer + - Intruder + - Evader + - Runner + - Dodger + - Crasher + - Battler + - Wrestler + - Scuffler + - Dueler + - Brawler + - Clasher + - Grappler + - Scrapper + - Attacker + - Feuder + - Catcher + - Solver + - Revealer + - Leaper + - Bouncer + - Vaulter + - Hopper + - Surger + - Punter + - Dropkicker + - Perceiver + - Fader + - Bleeder + - Weakener + - Forger + - Releaser + - Gatherer + - Crusher + - Propeller + - Jogger + - Sprinter + - Scouter + - Explorer + - Digger + - Trembler + - Parter + - Hacker + - Carver + - Divider + - Halver + - Breaker + - Renderer + - Ripper + - Grazer + - Imprisoner + - Cornerer + - Pinner + - Catcher + - Restrainer + - Binder + - Snagger + - Snatcher + - Cager + - Capturer + - Haunter + - Крипер + - Sneaker + - Binder + - Jailer + - Seducer + - Dancer + - Blasphemer + - Eater + - Snorer + - Thruster + - Slapper +absorption: + name: Поглощение +blindness: + name: Слепота +conduit_power: + name: Морская сила +confusion: + name: Тошнота +damage_resistance: + name: Сопротивление +dolphins_grace: + name: Грация Дельфина +fast_digging: + name: Спешка +fire_resistance: + name: Огнестойкость +glowing: + name: Светящийся +harm: + name: Мгновенный урон +heal: + name: Мгновенное исцеление +health_boost: + name: Максимальное здоровье +hunger: + name: Голод +increase_damage: + name: Сила +invisibility: + name: Невидимость +jump: + name: Прыгучесть +levitation: + name: Левитация +luck: + name: Luck +night_vision: + name: Ночное Зрение +poison: + name: Отравление +regeneration: + name: Регенерация +saturation: + name: Насыщение +slow: + name: Медлительность +slow_digging: + name: Усталость +slow_falling: + name: Замедленное падение +speed: + name: Скорость +unluck: + name: Неудачник +water_breathing: + name: Подводное дыхание +weakness: + name: Слабость +wither: + name: Визер +translation: + Economy pay message v2: '&2Вы заплатили &2$amount_sent $currency_name &2 $receiver&2, получив $amount_received после налога!' + Economy currency left message: Теперь у вас есть &2$amount_left $currency_name + Economy money from payment message: Вы получили &2$amount_received $currency_name &ffrom $sender + Economy payment insuficient currency: '&cУ вас недостаточно $currency_name чтобы сделать это!' + Wallet command message: У вас на балансе &2$balance $currency_name + Tax confirmation message: '&cКомиссия $percentage%. &aНапишите &9$command &aчтобы продолжить!' + shopBatchSellItem: '&aYou have sold your items &afor $currency_amount $currency_name!' + Shop buy message: '&aВы купили $item_name &aза $item_value $currency_name!' + Shop current balance message: '&У вас на балансе &$currency_amount $currency_name.' + Shop insufficient funds message: '&cУ вас недостаточно $currency_name чтобы сделать это!' + Shop item cost message: Этот предмет стоит &c$item_value $currency_name. + Shop sell message: '&aВы продали $item_name &aза $currency_amount $currency_name!' + Shop sale player items warning: '&cВы не можете продать предметы, которые в настоящее время не связаны с вашей душей! К ним относятся предметы из других престижей!' + Shop sale instructions: '&cВы можете продавать только предметы из плагина EliteMobs! (Броня или оружие, сбрасываемое из врагов, показывающие цену в их Лоре)' + Teleport time left: '&7[EM] Телепортирование через &a$time &7секунд...' + Teleport cancelled: '&7[EM] &cТелепортация прервана!' + noPendingCommands: '&cНа данный момент у вас нет команд, ожидающих выполнения!' + trackMessage: Track the $name + chestLowRankMessage: '&7[EM] &cYour guild rank needs to be at least $rank &cin order to open this chest!' + chestCooldownMessage: '&7[EM] &cYou''ve already opened this chest recently! Wait $time!' + insufficientCurrencyForWormholeMessage: '&8[EliteMobs] &cInsufficient currency! You need $amount to use this com.magmaguy.elitemobs.wormhole!' + dismissEMMessage: '&8[EliteMobs] &2/elitemobs &fmenu not working for you? Try &2/elitemobs alt &fto see an alternative version of the menu! &cDon''t want to see this message again? &4/em dismiss' + switchEMStyleMessage: '&8[EliteMobs] &2/elitemobs &fmenu style changed! Check it out!' +EconomySettings: + currencyName: Элитные монеты + chatCurrencyShowerMessage: '&7[EM] Вы подняли &a$amount $currency_name!' + actionbarCurrencyShowerMessage: '&7[EM] Вы подняли &a$amount $currency_name!' + adventurersGuildNotificationMessages: '&7[EM] Дополнительные расходы? Попробуйте &a/em !' +arrow_damage: + name: Сила +arrow_fire: + name: Огненная Стрела +arrow_infinite: + name: Infinity +arrow_knockback: + name: Откидывание +binding_curse: + name: Curse of Binding +channeling: + name: Channeling +critical_strikes: + name: Критические удары + criticalHitPopup: '&5Критический Удар!' +damage_all: + name: Sharpness +damage_arthropods: + name: Bane of Arthropods +damage_undead: + name: Smite +depth_strider: + name: Depth Strider +dig_speed: + name: Efficiency +drilling: + name: Drilling +durability: + name: Unbreaking +earthquake: + name: Earthquake + earthquakeActivationMessage: '&8[EliteMobs] &aEarthquake triggered! &c2 min cooldown!' + earthquakeAvailableMessage: '&8[EliteMobs] &2Earthquake cooldown over!' +fire_aspect: + name: Fire Aspect +flamethrower: + name: Огнемет +frost_walker: + name: Ледоход +grappling_hook: + name: Grappling Hook +hunter: + name: Охотник +ice_breaker: + name: Ice Breaker +impaling: + name: Impaling +knockback: + name: Отбрасывание +lightning: + name: Lightning +loot_bonus_blocks: + name: Fortune +loot_bonus_mobs: + name: Looting +loud_strikes: + name: Loud Strikes +loyalty: + name: Loyalty +lure: + name: Lure +mending: + name: Mending +meteor_shower: + name: Метеоритный дождь +multishot: + name: Multishot +oxygen: + name: Respiration +piercing: + name: Piercing +plasma_boots: + name: Plasma Boots +protection_environmental: + name: Защита +protection_explosions: + name: Blast Protection +protection_fall: + name: Невесомость +protection_fire: + name: Fire Protection +protection_projectile: + name: Projectile Protection +quick_charge: + name: Quick Charge +riptide: + name: Riptide +silk_touch: + name: Silk Touch +soulbind: + name: Soulbind + loreStrings: '&7Soulbound to &f$player' + hologramString: '$player&f''s' +summon_merchant: + name: Summon Merchant + message: Jeeves! +summon_wolf: + name: Summon Wolf +sweeping_edge: + name: Sweeping Edge +thorns: + name: Thorns +unbind: + name: Unbind +vanishing_curse: + name: Curse of Vanishing +water_worker: + name: Aqua Affinity +AntiExploit: + AntiExploit message: '&c[EM AntiExploit] &7Ближайшая элита не отбрасывает специальные предметы.' +CombatTag: + Combat tag message: '&c[EliteMobs] Боевой тег активирован!' +AdventurersGuild: + adventurersGuildMenuName: '&6&lЦентр Искателей Приключений' + Prestige 0 rank 0: '&8Commoner - disables elites!' + Prestige 0 rank 0 short placeholder: '&6&l✧&e0' + Prestige 0 rank 1: '&fРекрут' + Prestige 0 rank 1 short placeholder: '&6&l✧&eⅠ' + Prestige 0 rank 2: '&fНовичок' + Prestige 0 rank 2 short placeholder: '&6&l✧&eⅠⅠ' + Prestige 0 rank 3: '&fУченик' + Prestige 0 rank 3 short placeholder: '&6&l✧&eⅠⅠⅠ' + Prestige 0 rank 4: '&2Искатель приключений' + Prestige 0 rank 4 short placeholder: '&6&l✧&eⅠⅤ' + Prestige 0 rank 5: '&2Подмастерье' + Prestige 0 rank 5 short placeholder: '&6&l✧&eⅤ' + Prestige 0 rank 6: '&2Адепт' + Prestige 0 rank 6 short placeholder: '&6&l✧&eⅤⅠ' + Prestige 0 rank 7: '&1Ветеран' + Prestige 0 rank 7 short placeholder: '&6&l✧&eⅤⅠⅠ' + Prestige 0 rank 8: '&1Элита' + Prestige 0 rank 8 short placeholder: '&6&l✧&eⅤⅠⅠⅠ' + Prestige 0 rank 9: '&lМастер' + Prestige 0 rank 9 short placeholder: '&6&l✧&eⅠⅩ' + Prestige 0 rank 10: '&5Герой' + Prestige 0 rank 10 short placeholder: '&6&l✧&eⅩ' + Prestige 1 rank 0: '&eПрестиж 1 &8Плебей' + Prestige 1 rank 0 short placeholder: '&e⚜Ⅰ&6&l✧&e0' + Prestige 1 rank 1: '&eПрестиж 1 &fРекрут' + Prestige 1 rank 1 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠ' + Prestige 1 rank 2: '&eПрестиж 1 &fНовичок' + Prestige 1 rank 2 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅠ' + Prestige 1 rank 3: '&eПрестиж 1 &fУченик' + Prestige 1 rank 3 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅠⅠ' + Prestige 1 rank 4: '&eПрестиж 1 &fУченик' + Prestige 1 rank 4 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅤ' + Prestige 1 rank 5: '&eПрестиж 1 &2Подмастерье' + Prestige 1 rank 5 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤ' + Prestige 1 rank 6: '&eПрестиж 1 &fАдепт' + Prestige 1 rank 6 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠ' + Prestige 1 rank 7: '&eПрестиж 1 &1Ветеран' + Prestige 1 rank 7 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠⅠ' + Prestige 1 rank 8: '&eПрестиж 1 &fЭлита' + Prestige 1 rank 8 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠⅠⅠ' + Prestige 1 rank 9: '&eПрестиж 1 &fМастер' + Prestige 1 rank 9 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅩ' + Prestige 1 rank 10 short placeholder: '&e⚜Ⅰ&6&l✧&eⅩ' + Prestige 1 rank 10: '&eПрестиж 1 &fГерой' + Prestige 1 rank 11: '&eПрестиж 1 &5Легенда' + Prestige 1 rank 11 short placeholder: '&e⚜Ⅰ&6&l✧&eⅩⅠ' + Prestige 2 rank 0: '&eПрестиж 2 &8Крестьянин' + Prestige 2 rank 0 short placeholder: '&2⚜ⅠⅠ&6&l✧&e0' + Prestige 2 rank 1: '&eПрестиж 2 &fРекрут' + Prestige 2 rank 1 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠ' + Prestige 2 rank 2: '&eПрестиж 2 &fНовичок' + Prestige 2 rank 2 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅠ' + Prestige 2 rank 3: '&eПрестиж 2 &fУченик' + Prestige 2 rank 3 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 2 rank 4: '&eПрестиж 2 &fАвантюрист' + Prestige 2 rank 4 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅤ' + Prestige 2 rank 5: '&eПрестиж 2 &2Подмастерье' + Prestige 2 rank 5 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤ' + Prestige 2 rank 6: '&eПрестиж 2 &fАдепт' + Prestige 2 rank 6 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠ' + Prestige 2 rank 7: '&eПрестиж 2 &1Ветеран' + Prestige 2 rank 7 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 2 rank 8: '&eПрестиж 2 &fЭлита' + Prestige 2 rank 8 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 2 rank 9: '&eПрестиж 2 &fМастер' + Prestige 2 rank 9 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅩ' + Prestige 2 rank 10 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩ' + Prestige 2 rank 10: '&eПрестиж 2 &fГерой' + Prestige 2 rank 11: '&eПрестиж 2 &fЛегенда' + Prestige 2 rank 11 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩⅠ' + Prestige 2 rank 12: '&2Престиж 2 &5Мифический' + Prestige 2 rank 12 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 3 rank 0: '&eПрестиж 2 &8Крестьянин' + Prestige 3 rank 0 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&e0' + Prestige 3 rank 1: '&eПрестиж 3 &fРекрут' + Prestige 3 rank 1 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠ' + Prestige 3 rank 2: '&eПрестиж 3 &fНовичок' + Prestige 3 rank 2 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠ' + Prestige 3 rank 3: '&eПрестиж 3 &fУченик' + Prestige 3 rank 3 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 3 rank 4: '&aПрестиж 3 &2Авантюрист' + Prestige 3 rank 4 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅤ' + Prestige 3 rank 5: '&aПрестиж 3 &2Подмастерье' + Prestige 3 rank 5 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤ' + Prestige 3 rank 6: '&aПрестиж 3 &2Адепт' + Prestige 3 rank 6 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠ' + Prestige 3 rank 7: '&aПрестиж 3 &1Ветеран' + Prestige 3 rank 7 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 3 rank 8: '&aПрестиж 3 &1Элитная' + Prestige 3 rank 8 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 3 rank 9: '&aПрестиж 3 &5Мастер' + Prestige 3 rank 9 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅩ' + Prestige 3 rank 10 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩ' + Prestige 3 rank 10: '&aПрестиж 3 &5Герой' + Prestige 3 rank 11: '&aПрестиж 3 &5Легенда' + Prestige 3 rank 11 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠ' + Prestige 3 rank 12: '&aПрестиж 3 &5Миф' + Prestige 3 rank 12 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 3 rank 13: '&aПрестиж 3 &5Бессмертный' + Prestige 3 rank 13 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 4 rank 0: '&3Престиж 4 &8Командер' + Prestige 4 rank 0 short placeholder: '&3⚜ⅠⅤ&6&l✧&e0' + Prestige 4 rank 1: '&3Престиж 4 &fНовобранец' + Prestige 4 rank 1 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠ' + Prestige 4 rank 2: '&eПрестиж 4 &fНовичок' + Prestige 4 rank 2 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅠ' + Prestige 4 rank 3: '&eПрестиж 4 &fУченик' + Prestige 4 rank 3 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅠⅠ' + Prestige 4 rank 4: '&aПрестиж 4 &2Авантюрист' + Prestige 4 rank 4 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅤ' + Prestige 4 rank 5: '&eПрестиж 4 &2Подмастерье' + Prestige 4 rank 5 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤ' + Prestige 4 rank 6: '&eПрестиж 4 &fАдепт' + Prestige 4 rank 6 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠ' + Prestige 4 rank 7: '&aПрестиж 4 &1Ветеран' + Prestige 4 rank 7 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠⅠ' + Prestige 4 rank 8: '&3Престиж 4 &1Элита' + Prestige 4 rank 8 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠⅠⅠ' + Prestige 4 rank 9: '&3Престиж 4 &5Мастер' + Prestige 4 rank 9 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅩ' + Prestige 4 rank 10 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩ' + Prestige 4 rank 10: '&3Престиж 4 &5Герой' + Prestige 4 rank 11: '&3Престиж 4 &5Легенда' + Prestige 4 rank 11 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠ' + Prestige 4 rank 12: '&3Престиж 4 &5Миф' + Prestige 4 rank 12 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅠ' + Prestige 4 rank 13: '&3Престиж 4 &5Бессмертный' + Prestige 4 rank 13 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅠⅠ' + Prestige 4 rank 14: '&3Престиж 4 &5Избранный' + Prestige 4 rank 14 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅤ' + Prestige 5 rank 0: '&bПрестиж 5 &8Командер' + Prestige 5 rank 0 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 5 rank 1: '&3Престиж 5 &fНовобранец' + Prestige 5 rank 1 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 5 rank 2: '&eПрестиж 5 &fНовичок' + Prestige 5 rank 2 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 5 rank 3: '&eПрестиж 5 &fУченик' + Prestige 5 rank 3 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 5 rank 4: '&eПрестиж 5 &fУченик' + Prestige 5 rank 4 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 5 rank 5: '&eПрестиж 5 &2Подмастерье' + Prestige 5 rank 5 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 5 rank 6: '&eПрестиж 5 &fАдепт' + Prestige 5 rank 6 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 5 rank 7: '&eПрестиж 5 &1Ветеран' + Prestige 5 rank 7 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 5 rank 8: '&eПрестиж 5 &fЭлита' + Prestige 5 rank 8 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 5 rank 9: '&eПрестиж 5 &fМастер' + Prestige 5 rank 9 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 5 rank 10 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 5 rank 10: '&eПрестиж 5 &fГерой' + Prestige 5 rank 11: '&eПрестиж 5 &5Легенда' + Prestige 5 rank 11 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 5 rank 12: '&aПрестиж 5 &5Миф' + Prestige 5 rank 12 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 5 rank 13: '&aПрестиж 5 &5Бессмертный' + Prestige 5 rank 13 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 5 rank 14: '&3Престиж 5 &5Избранный' + Prestige 5 rank 14 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 5 rank 15: '&eПрестиж 5 &5Восходящий' + Prestige 5 rank 15 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 6 rank 0: '&eПрестиж 6 &8Плебей' + Prestige 6 rank 0 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩ' + Prestige 6 rank 1: '&eПрестиж 6 &fРекрут' + Prestige 6 rank 1 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅩ' + Prestige 6 rank 2: '&eПрестиж 6 &fНовичок' + Prestige 6 rank 2 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠ' + Prestige 6 rank 3: '&eПрестиж 6 &fУченик' + Prestige 6 rank 3 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 6 rank 4: '&eПрестиж 6 &fУченик' + Prestige 6 rank 4 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅤ' + Prestige 6 rank 5: '&eПрестиж 6 &2Подмастерье' + Prestige 6 rank 5 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤ' + Prestige 6 rank 6: '&eПрестиж 6 &fАдепт' + Prestige 6 rank 6 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤⅠ' + Prestige 6 rank 7: '&eПрестиж 6 &1Ветеран' + Prestige 6 rank 7 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠ' + Prestige 6 rank 8: '&eПрестиж 6 &fЭлита' + Prestige 6 rank 8 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 6 rank 9: '&eПрестиж 6 &fМастер' + Prestige 6 rank 9 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅩ' + Prestige 6 rank 10 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩ' + Prestige 6 rank 10: '&eПрестиж 6 &fГерой' + Prestige 6 rank 11: '&eПрестиж 6 &5Легенда' + Prestige 6 rank 11 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠ' + Prestige 6 rank 12: '&aПрестиж 6 &5Миф' + Prestige 6 rank 12 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠ' + Prestige 6 rank 13: '&aПрестиж 6 &5Бессмертный' + Prestige 6 rank 13 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 6 rank 14: '&3Престиж 6 &5Избранный' + Prestige 6 rank 14 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅤ' + Prestige 6 rank 15: '&eПрестиж 6 &5Восходящий' + Prestige 6 rank 15 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤ' + Prestige 6 rank 16: '&aПрестиж 6 &5Титан' + Prestige 6 rank 16 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤⅠ' + Prestige 7 rank 0: '&3Престиж 7 &8Командер' + Prestige 7 rank 0 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&e0' + Prestige 7 rank 1: '&3Престиж 7 &fНовобранец' + Prestige 7 rank 1 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠ' + Prestige 7 rank 2: '&eПрестиж 7 &fНовичок' + Prestige 7 rank 2 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅠ' + Prestige 7 rank 3: '&eПрестиж 7 &fУченик' + Prestige 7 rank 3 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 7 rank 4: '&aПрестиж 7 &2Авантюрист' + Prestige 7 rank 4 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅤ' + Prestige 7 rank 5: '&eПрестиж 7 &2Подмастерье' + Prestige 7 rank 5 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤ' + Prestige 7 rank 6: '&eПрестиж 7 &fАдепт' + Prestige 7 rank 6 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠ' + Prestige 7 rank 7: '&eПрестиж 7 &1Ветеран' + Prestige 7 rank 7 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 7 rank 8: '&eПрестиж 7 &fЭлита' + Prestige 7 rank 8 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 7 rank 9: '&eПрестиж 7 &fМастер' + Prestige 7 rank 9 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅩ' + Prestige 7 rank 10 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩ' + Prestige 7 rank 10: '&aПрестиж 7 &5Герой' + Prestige 7 rank 11: '&aПрестиж 7 &5Легенда' + Prestige 7 rank 11 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠ' + Prestige 7 rank 12: '&aПрестиж 7 &5Миф' + Prestige 7 rank 12 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 7 rank 13: '&aПрестиж 7 &5Бессмертный' + Prestige 7 rank 13 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 7 rank 14: '&3Престиж 7 &5Избранный' + Prestige 7 rank 14 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅤ' + Prestige 7 rank 15: '&eПрестиж 7 &5Восходящий' + Prestige 7 rank 15 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤ' + Prestige 7 rank 16: '&aПрестиж 7 &5Титан' + Prestige 7 rank 16 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤⅠ' + Prestige 7 rank 17: '&aПрестиж 7 &5Полубог' + Prestige 7 rank 17 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 8 rank 0: '&eПрестиж 8 &8Плебей' + Prestige 8 rank 0 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&e0' + Prestige 8 rank 1: '&eПрестиж 8 &fРекрут' + Prestige 8 rank 1 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠ' + Prestige 8 rank 2: '&eПрестиж 8 &fНовичок' + Prestige 8 rank 2 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠ' + Prestige 8 rank 3: '&eПрестиж 8 &fУченик' + Prestige 8 rank 3 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 8 rank 4: '&eПрестиж 8 &fУченик' + Prestige 8 rank 4 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅤ' + Prestige 8 rank 5: '&eПрестиж 8 &2Подмастерье' + Prestige 8 rank 5 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤ' + Prestige 8 rank 6: '&eПрестиж 8 &fАдепт' + Prestige 8 rank 6 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠ' + Prestige 8 rank 7: '&eПрестиж 8 &1Ветеран' + Prestige 8 rank 7 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 8 rank 8: '&eПрестиж 8 &fЭлита' + Prestige 8 rank 8 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 8 rank 9: '&eПрестиж 8 &fМастер' + Prestige 8 rank 9 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅩ' + Prestige 8 rank 10 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩ' + Prestige 8 rank 10: '&eПрестиж 8 &fГерой' + Prestige 8 rank 11: '&eПрестиж 8 &5Легенда' + Prestige 8 rank 11 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠ' + Prestige 8 rank 12: '&aПрестиж 8 &5Миф' + Prestige 8 rank 12 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 8 rank 13: '&aПрестиж 8 &5Бессмертный' + Prestige 8 rank 13 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 8 rank 14: '&3Престиж 8 &5Избранный' + Prestige 8 rank 14 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅤ' + Prestige 8 rank 15: '&eПрестиж 8 &5Восходящий' + Prestige 8 rank 15 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤ' + Prestige 8 rank 16: '&aПрестиж 8 &5Титан' + Prestige 8 rank 16 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤⅠ' + Prestige 8 rank 17: '&aПрестиж 8 &5Полубог' + Prestige 8 rank 17 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 8 rank 18: '&aПрестиж 8 &5Божество' + Prestige 8 rank 18 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 9 rank 0: '&eПрестиж 9 &8Плебей' + Prestige 9 rank 0 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤ' + Prestige 9 rank 1: '&eПрестиж 9 &fРекрут' + Prestige 9 rank 1 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠ' + Prestige 9 rank 2: '&eПрестиж 9 &fНовичок' + Prestige 9 rank 2 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠⅠ' + Prestige 9 rank 3: '&eПрестиж 9 &fУченик' + Prestige 9 rank 3 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠⅠⅠ' + Prestige 9 rank 4: '&eПрестиж 9 &fУченик' + Prestige 9 rank 4 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅤ' + Prestige 9 rank 5: '&eПрестиж 9 &2Подмастерье' + Prestige 9 rank 5 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤ' + Prestige 9 rank 6: '&eПрестиж 9 &fАдепт' + Prestige 9 rank 6 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠ' + Prestige 9 rank 7: '&eПрестиж 9 &1Ветеран' + Prestige 9 rank 7 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠⅠ' + Prestige 9 rank 8: '&eПрестиж 9 &fЭлита' + Prestige 9 rank 8 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠⅠⅠ' + Prestige 9 rank 9: '&eПрестиж 9 &fМастер' + Prestige 9 rank 9 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅩ' + Prestige 9 rank 10 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩ' + Prestige 9 rank 10: '&aПрестиж 9 &5Герой' + Prestige 9 rank 11: '&aПрестиж 9 &5Легенда' + Prestige 9 rank 11 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠ' + Prestige 9 rank 12: '&aПрестиж 9 &5Миф' + Prestige 9 rank 12 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅠ' + Prestige 9 rank 13: '&aПрестиж 9 &5Бессмертный' + Prestige 9 rank 13 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅠⅠ' + Prestige 9 rank 14: '&3Престиж 9 &5Избранный' + Prestige 9 rank 14 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅤ' + Prestige 9 rank 15: '&eПрестиж 9 &5Восходящий' + Prestige 9 rank 15 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤ' + Prestige 9 rank 16: '&aПрестиж 9 &5Титан' + Prestige 9 rank 16 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠ' + Prestige 9 rank 17: '&aПрестиж 9 &5Полубог' + Prestige 9 rank 17 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠⅠ' + Prestige 9 rank 18: '&aПрестиж 9 &5Божество' + Prestige 9 rank 18 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 9 rank 19: '&eПрестиж 9 &fКрепкий' + Prestige 9 rank 19 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅩ' + Prestige 10 rank 0: '&3Престиж 10 &8Командер' + Prestige 10 rank 0 short placeholder: '&5⚜Ⅹ&6&l✧&e0' + Prestige 10 rank 1: '&3Престиж 10 &fНовобранец' + Prestige 10 rank 1 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠ' + Prestige 10 rank 2: '&eПрестиж 10 &fНовичок' + Prestige 10 rank 2 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠ' + Prestige 10 rank 3: '&eПрестиж 10 &fУченик' + Prestige 10 rank 3 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠⅠ' + Prestige 10 rank 4: '&aПрестиж 10 &2Авантюрист' + Prestige 10 rank 4 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅤ' + Prestige 10 rank 5: '&eПрестиж 10 &2Подмастерье' + Prestige 10 rank 5 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤ' + Prestige 10 rank 6: '&eПрестиж 10 &fАдепт' + Prestige 10 rank 6 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠ' + Prestige 10 rank 7: '&eПрестиж 10 &1Ветеран' + Prestige 10 rank 7 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠ' + Prestige 10 rank 8: '&eПрестиж 10 &fЭлита' + Prestige 10 rank 8 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠⅠ' + Prestige 10 rank 9: '&eПрестиж 10 &fМастер' + Prestige 10 rank 9 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅩ' + Prestige 10 rank 10 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩ' + Prestige 10 rank 10: '&eПрестиж 10 &fГерой' + Prestige 10 rank 11: '&eПрестиж 10 &5Легенда' + Prestige 10 rank 11 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠ' + Prestige 10 rank 12: '&aПрестиж 10 &5Миф' + Prestige 10 rank 12 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠ' + Prestige 10 rank 13: '&aПрестиж 10 &5Бессмертный' + Prestige 10 rank 13 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠⅠ' + Prestige 10 rank 14: '&3Престиж 10 &5Избранный' + Prestige 10 rank 14 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅤ' + Prestige 10 rank 15: '&eПрестиж 10 &5Восходящий' + Prestige 10 rank 15 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅤ' + Prestige 10 rank 16: '&aПрестиж 10 &5Титан' + Prestige 10 rank 16 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠ' + Prestige 10 rank 17: '&aПрестиж 10 &5Полубог' + Prestige 10 rank 17 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠ' + Prestige 10 rank 18: '&aПрестиж 10 &5Божество' + Prestige 10 rank 18 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠⅠ' + Prestige 10 rank 19: '&eПрестиж 10 &fКрепкий' + Prestige 10 rank 19 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅩ' + Prestige 10 rank 20: '&eПрестиж 10 &fКрепкий' + Prestige 10 rank 20 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅩ' + lootLimiterMessage: '&7[EM] Вы должны разблокировать следующий ранг гильдии через /ag для получения более качественных предметов!' + prestigeUnlockMessageTitle: '$player' + prestigeUnlockMessageSubtitle: '&2has unlocked $tier&2!' +buy_or_sell_menu: + Shop name: '[EM] Купить или продать' +custom_quest_screen: + headerTextLines2: | + &a&l『&c&l$questName&a&l』 + acceptTextLines: '&a&l[Accept!]' + acceptHoverLines: "&aClick to \n&aaccept quest!" + acceptedTextLines: '&2&lAccepted! &aTurn in with $npcName &4[Abandon]' + acceptedHoverLines: '&aClick to abandon quest!' + trackTextLines: '&2&l[Track]' + trackHoverLines: '&aClick to track quest!' + untrackTextLines: '&4&l[Untrack]' + untrackHoverLines: '&cClick to untrack quest!' + completedTextLines: '&2&l[Turn in!]' + completedHoverLines: '&aClick to turn quest in!' + turnedInTextLines: '&8[Completed!]' + turnedInHoverLines: '&8Already turned in!' + objectivesLine: '&c&lObjectives:' + killQuestDefaultSummaryLine: '&c➤Kill $name:$color$current&0/$color$target' + fetchQuestDefaultSummaryLine: '&c➤Get $name:$color&$current&0/$color$target' + dialogQuestDefaultSummaryLine: '&c➤Go talk to $name $location' + rewardsLine: '&2&lRewards:' + rewardsDefaultSummaryLine: '&2➤$amountx $rewardName &8($chance%)' +custom_shop_menu: + Shop name: '[EM] Custom Shop' + Full inventory message: '[EliteMobs] &4Ваш инвентарь полон! Вы не можете купить предметы, пока не освободите инвентарь .' +dynamic_quest_screen: + questName: убить $amount $name + headerTextLines2: |- + &c&lGuild request! + &0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ + defaultLoreTextLines: '&8Slay $amount $name!' + acceptTextLines: '&a&lAccept!' + acceptHoverLines: "&aClick to \n&aaccept quest!" + acceptedTextLines: '&2&lAccepted! &4[Abandon]' + acceptedHoverLines: '&aClick to abandon quest!' + completedTextLines: '&2&l[Turn in!]' + completedHoverLines: '&aClick to turn quest in!' + turnedInTextLines: '&8[Completed!]' + turnedInHoverLines: '&8Already turned in!' + objectivesLine: '&c&lObjectives:' + killQuestDefaultSummaryLine: '&c➤Kill $name:$color$current&0/$color$target' + rewardsLine: '&2&lRewards:' + rewardsDefaultSummaryLine: '&2➤$amountx $rewardName &8($chance%)' +enhancement_menu: + shopName: '[EM] Меню улучшения!' +get_loot_menu: + Menu name: '[EM] Меню Getloot' + tierTranslation: Level + itemFilterTranslation: Filter by items of this level. +guild_rank_selector_menu: + questTierSelectorMenuTitle: '[EM] Выбор ранга гильдии' + lowTierWarning: '&cЭлиты не могут получить лучшую добычу!' + normalTierWarning: '&aЭлита может получить лучшую добычу!' + notEnoughCurrencyMessages: '&7[EliteMobs] &4У вас недостаточно элитных монет ($neededAmount $currencyName)! Продайте элитную добычу моба [/em shop]! У вас есть $currentAmount $currencyName.' + unlockMessages: "&7[EliteMobs] &aВы разблокировали $rankName &aранг для $price $currencyName.\\ \\ \n&6Хорошей охоты!" + questCompleteBroadcastMessages: '&7[EliteMobs] &a$player &aдостиг $rankName &aранг гильдии!' + failedMessages: '&7[EliteMobs] &cСначала вам нужно разблокировать другие ранги!' + spawnRateModifierMessages: '&fМодификатор скорости появления элитных мобов: &c$modifier%' + lootModifierMessages: '&fМодификатор добычи элитных мобов: &a$modifier%' + difficultyModifierMessages: '&fМодификатор сложности элитных мобов: &c$modifier%' + lootTierMessages: '&2Элиты могут дропать лут до уровня $tier !' + currencyBonusMessages: '&a$amountx coins from drops and quests!' + healthBonusMessages: '&cДобавляет $amount ❤ максимального здоровья' + critBonusMessages: '&eДобавляет $amount% шанс крита' + dodgeBonusMessages: '&8Добавляет $amount% шанс увернуться' +player_status_screen: + indexTexts0: '&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + indexTexts1: '&5&l/ag &7- &6EliteMobs Hub' + indexHovers1: |- + НАЖМИТЕ, ЧТОБЫ ИСПОЛЬЗОВАТЬ + Место, где вы можете найти + NPC, которые дают квесты, покупают и + продавают предметы, дают советы и многое другое! + indexTexts2: '&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + indexTexts4: '&6&lИндекс' + indexTexts6: '&bp. $statsPage &8- &6Статистика' + indexHovers6: Нажмите, чтобы перейти! + indexTexts7: '&bp. $gearPage &8- &6Одежда' + indexHovers7: Нажмите, чтобы перейти! + indexTexts8: '&bp. $teleportsPage &8- &6Телепорты' + indexHovers8: Нажмите, чтобы перейти! + indexTexts9: '&bp. $commandsPage &8- &6Команды' + indexHovers9: Нажмите, чтобы перейти! + indexTexts10: '&bp. $questsPage &8- &6Отслеживание квестов' + indexHovers10: Нажмите, чтобы перейти! + indexTexts11: '&bp. $bossTrackingPage &8- &6Отслеживание босса' + indexHovers11: Нажмите, чтобы перейти! + statsText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + statsText1: '&5&lСтатистика игрока:' + statsText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + statsText4: '&2Деньги: &a$money' + statsHover4: |- + Kill Elite Mobs to loot currency or + sell their drops in /em shop or + complete quests! + statsText6: '&6Уровень гильдии: &3$guildtier' + statsHover6: |- + Уровень Престижа и Ранг Гильдии: + Ранг гильдии определяет, насколько хорошей может быть ваша добыча, устанавливает ваш бонус от уровня престижа, среди прочего. Престиж-уровень открывает чрезвычайно мощные награды, такие как увеличенное максимальное здоровье, шанс уклонения/критического удара, увеличенное денежное вознаграждение и многое другое! Вы можете разблокировать ранги гильдии и уровни престижа в /ag! + ⚜ = престижный ранг, ✧ = ранг гильдии! + statsText7: '&4Убийства: &c$kills' + statsHover7: Количество убитых элитных мобов. + statsText8: '&4Максимальный уровень убитых: &c$highestkill' + statsHover8: |- + Уровень самого высокого убитого элитного моба. + Уровни элитных мобов основаны на уровне + вашего снаряжения! Высшие уровни, выше + Элитные уровни моба! + Примечание: учитываются только убийства, не связанные с эксплуатацией! + statsText9: '&4Элитные смерти: &c$deaths' + statsHover9: Количество убитых элитными мобами. + statsText10: '&5Выполнены квесты: &d$quests' + statsHover10: |- + Amount of EliteMobs quests completed. + You can accept quests by talking to NPCs! + statsText12: '&bСчет: &3$score' + statsHover12: |- + Ваша оценка EliteMobs. Это идет вверх + когда убиваешь и элитный моб, + и он падает, когда ты умираешь + к элите. Высший уровень + элиты дают больше очков. + gearText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + gearText1: '&7&lБроня и оружие:' + gearText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + gearText3: '&8&lУровни снаряжения:' + gearText4: ' ☠ - $helmettier' + gearHover4: '$helmet' + gearText5: ' ▼ - $chestplatetier' + gearHover5: '$chestplate' + gearText6: ' Π - $leggingstier' + gearHover6: '$leggings' + gearText7: ' ╯╰ - $bootstier' + gearHover7: '$boots' + gearText8: '{⚔ - $mainhandtier} {⛨ - $offhandtier}' + gearHover8: '{$mainhand}{$offhand}' + gearText10: '{урон : $damage} {броня: $armor}' + gearHover10: '{Базовый урон, наносимый элитным мобам}{Снижение урона от элитных мобов}' + gearText11: 'Уровень угрозы: $threat' + gearHover11: | + Это определяет уровень + Элитные мобы, которые появляются рядом с вами. + Берет доспехи, оружие в руки, гильдию + уровень во внимание. + teleportText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + teleportText1: '&2&lТелепорты' + teleportText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + teleportText3: Спавн + teleportHover3: Телепортируйтесь на спавн! + teleportText4: '&6&lЦентр Искателей Приключений' + teleportHover4: Телепортируйтесь в центр гильдии искателей приключений! + onTeleportsHover: Нажмите, чтобы телепортироваться! + commandsText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + commandsText1: '&3&lКоманды:' + commandsText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + commandsText4: '&5/ag' + commandsHover4: |- + НАЖМИТЕ, ЧТОБЫ ИСПОЛЬЗОВАТЬ + Место, где вы можете найти + NPC, которые дают квесты, покупают и + продавают предметы, дают советы и многое другое! + commandsText6: '&5/shareitem' + commandsHover6: |- + НАЖМИТЕ, ЧТОБЫ ИСПОЛЬЗОВАТЬ + Делится предметом, который вы держите + в чате! + questTrackerText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + questTrackerText1: '&6&lКвесты:' + questTrackerHover1: Talk to NPCs to accept quests! + questTrackerText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + onQuestTrackHover: Нажмите, чтобы отказаться! + bossTrackerText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + bossTrackerText1: '&4&lБосс Трекер:' + bossTrackerHover1: Здесь отображаются большие боссы! + bossTrackerText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + onBossTrackHover: Нажмите, чтобы отследить/отменить отслеживание! + teleportChestMenuName: '&2EliteMobs Teleports' + bossTrackerChestMenuName: '&2EliteMobs Boss Tracking' + indexChestMenuName: '&2EliteMobs Index' + gearChestMenuName: '&2EliteMobs Gear' + statsChestMenuName: '&2EliteMobs Stats' + commandsChestMenuName: '&2EliteMobs Commands' +procedural_shop_menu: + Shop name: '[EM] Магазин процедурных предметов' + Full inventory message: '&7[EliteMobs] &4Ваш инвентарь полон! Вы не можете покупать предметы пока не появится свободное место.' +quest_menu: + menuName: '[EM] Выбор квеста' + cancelQuestMessage1: '&c&l&m&o---------------------------------------------&cВы можете иметь только один квест за раз! Отмена вашего текущего квеста сбросит прогресс квеста!' + cancelQuestMessage2: '&2[Нажмите здесь, чтобы отменить текущий квест!]' + cancelQuestMessage3: '&7Вы можете увидеть статус своего квеста с помощью команды &a/em quest status&c&l&m&o---------------------------------------------' + questCancelMessage: '&7[EliteMobs] &cВаш текущий квест был отменен!' + questStartTitle: Вы приняли квест! + questStartSubtitle: убить $objectiveAmount $objectiveName + questCompleteTitle: Квест завершен! + questCompleteSubtitle: Вы убили $objectiveAmount $objectiveName + bossBarObjective: убить $objectiveAmount $objectiveName + questRewardMessage: '&7[EM] &aКвест выполнен! &6Ваша награда &2$reward $currencyName' + questCompleteBroadcastMessage: '&7[EM] $player &2завершил $rank &2quest!' + questStartBroadcastMessage: '&7[EM] $player &2принял $rank &2quest!' + questStatusMessage: '&7[EM] &aВы убили &a$currentAmount &f/ &c$objectiveAmount &a$objectiveName' +refiner_menu: + shopName: '[EM] Place 10 scrap!' +repair_menu: + shopName: '[EM] Repair menu!' +scrapper_menu: + shopName: '[EM] Scrapper' +sell_menu: + shopName: '[EM] Магазин продаж' +smelt_menu: + shopName: '[EM] Place 25 scrap!' +unbind_menu: + shopName: '[EM] Unbind menu!' +taunt: + onDamaged: + - Ow! + - Oi! + - Stop that! + - Why?! + - You fight like a Dairy Farmer! + - You are a pain in the backside! + - En garde! Touche! + - Hacks! + - My health is bugged, unkillable! + - Your hits only make me stronger! + - Sticks and stones... + - '''tis but a flesh wound!' + - Emperor protects! + - Herobrine, aid me! + - Behind you! A creeper! + - I have made a terrible mistake. + - What doesn't kill me... + - Zombies dig scars + - I shall show you my true power! + - Prepare for my ultimate attack! + - My reinforcements are arriving! + - You're going to pay for that! + - That's going to leave a mark! + - An eye for an eye! + - Health insurance will cover that + - I felt that one in my bones + - '''tis but a scratch' + - What was that? A soft breeze? + - You'll never defeat me like that + - Pathetic. + - Weak. + - That didn't even dent my armor! + - This is going to be an easy one + - My grandchildren will feel that + - Are you even trying? + - An admin just fully healed me + - Haxxor! + - Me? Damaged? Hacks! + - I can't be defeated! + - Good thing I'm using hacks! + - Watch out! Herobrine behind you! + - My life for Aiur! + - Your home is getting griefed! + - Why can't we be friends? + - Valhalla! + - Notch save me! + - No retreat! + - Hit me with your best shot! + onDamagedByBow: + - Fight me like a Player! + - Afraid to come up-close? + - I can smell your fear from here! + - Did you forget your sword? + - Coward! Bow are no fair! + - Bows? That's so 2011... + - Bows are for the weak of mind! + - Bows are for the weak of spirit! + - Bows are for the weak of heart! + - I thought we agreed no bows! + - Bows? You'll regret that + - Ow! + - Oi! + - Stop that! + - Why?! + - You fight like a Dairy Farmer! + - You are a pain in the backside! + - En garde! Touche! + - Hacks! + - My health is bugged, unkillable! + - Your hits only make me stronger! + - Sticks and stones... + - '''tis but a flesh wound!' + - Emperor protects! + - Herobrine, aid me! + - Behind you! A creeper! + - I have made a terrible mistake. + - What doesn't kill me... + - Zombies dig scars + - I shall show you my true power! + - Prepare for my ultimate attack! + - My reinforcements are arriving! + - You're going to pay for that! + - That's going to leave a mark! + - An eye for an eye! + - Health insurance will cover that + - I felt that one in my bones + - '''tis but a scratch' + - What was that? A soft breeze? + - You'll never defeat me like that + - Pathetic. + - Weak. + - That didn't even dent my armor! + - This is going to be an easy one + - My grandchildren will feel that + - Are you even trying? + - An admin just fully healed me + - Haxxor! + - Me? Damaged? Hacks! + - I can't be defeated! + - Good thing I'm using hacks! + - Watch out! Herobrine behind you! + - My life for Aiur! + - Your home is getting griefed! + - Why can't we be friends? + - Valhalla! + - Notch save me! + - No retreat! + - Hit me with your best shot! + onDamage: + - A solid hit! + - He shoots, and he scores! + - You'll feel that in the morning! + - Victory approaches! + - Victory shall be mine! + - That was only half of my power! + - You came to the wrong hood! + - You messed with the wrong mob! + - Get ready to get mobbed on! + - This was your last mistake! + - Feel the burn! + - John Cena + - How are you still standing? + - Just give up already! + - Give up! + - I have the high ground! + - I will end you! + - Hope you came prepared for pain! + - The hunter becomes the hunted! + - Blood for the blood throne! + - Skulls for the skull throne! + - A good player is a dead player! + - Git gud! + - Praise the Sun! + - The end draws near! + - You are not prepared. + - Zug zug! + - Hardly worth my time! + - I thought this was a challenge? + - 'Pro tip: don''t get hit' + - Ima firin mah lazer bwooooooooo + - For the Emperor! + - Herobrine shall be pleased! + - This is the end for you! + - Are you even trying? + - Weakling! + - Pathetic. + - Maybe this will wake you up. + - This is just the beggining! + - We're just getting started! + - That was just a warm-up! + - You are no match for me! + - RKO out of nowhere! + - I can do this all night long! + - A fine punching bag! + - I am the night! + - I wonder what will break first + - Revenge for Steve! You monster! + - Join the mob side! + - Too easy, too easy! + - Too easy! + - You can't defeat me! + - Pikachuuuuuu + - Avada kedavra! + - Crucio! + - Jierda! + - A critical hit! + - This is what skills looks like! + - 9001 damage! + - Still standing? + - Face your defeat! + - A taste of pain to come! + - I'll make you endangered! + onDeath: + - Alas, poor Yorick! + - The rest is silence + - I shall return + - Unforgivable + - I live, I die, I live again! + - WITNESS ME + - I ride to valhalla! + - VALHALLA! + - VALHALLA! DELIVERANCE + - You win, this time + - A blight upon your land! + - A pox upon thee! + - You'll join me soon enough! + - This is not over + - Death is but a setback + - Not like this... + - I just wanted to go into space + - We could've been friends + - Your sins crawling on your back + - See you in a bit + - See you later + - I'll be waiting for you + - I will be avenged! + - I won't go gently into the night + - Should've gotten life insurance + - It was my last day on the job + - It was my last day here + - Et tu, Brute? + - RIP + - x.x + - (x.x) + - xox + - Fainted + - GG, WP + - GG + - WP + - GG no RE + - HAX + - Hacker + - Not fair I was lagging + - You win, this time + - You monster... + - Mediocre... + onTarget: + - OI! Get over here! + - What's that I see? A coward? + - Sir, prepare your fisticuffs! + - Let's settle this like cavemen! + - En garde! + - Look out! A creeper, behind you! + - Aren't you a right ugly mug! + - You look delicious. + - Prepare for trouble! + - Let the best click spammer win! + - SPARTAAAAAA + - I am actually level 9001 + - Not an Elite Mob + - Poorly disguised Elite Mob + - Ah, fresh prey! + - The hunter becomes the hunted! + - Killing me crashes the server + - I'm actually a disguised player! + - I'm not going to drop any loot! + - Why can't we be friends? + - Sssssss + - This is my last day on the job! + - Stop right there criminal scum! + - Prepare to die! + - Praise the Sun! + - Git gud + - Alea jacta est! + - Facta, non verba! + - Skulls for the skull throne! + - Blood for the blood throne! + - A sacrifice for Herobrine! + - I shall pierce the heavens! + - Just who do you think I am!? + - A weakling! He's mine. + - Dibs on the weakling! + - Accio player! + - A duel to the death! + - I challenge you to a duel! + - Pika pika! + - Did you just call me an infernal + - What did you just call me? + - I know what you did you monster! + - This is how your story ends! + - Prepare for trouble! + - I've been preparing for this! + - I am prepared. Are you? + - A worthy foe! + - A worthy opponent! + - A newbie! It's my lucky day! + - Your stuff or your life! + - This is a robbery! + - It's you! You monster! + - So hungry, give me your flesh! + - There he is! + - Must've been my imagination + - Hi I'm Mr Meeseeks! + - I'm Mr Meeseeks, look at me! + - Your diamonds or your life! + - For king and country! + - Hit me with your best shot! + - Witness me! + - Witness me blood bag! + - I go all shiny and chrome! +zombie_friends: + friend1Name: 'BFF #1' + friend2Name: 'BFF #2' + friendDeathMessage: + - Noooo! + - Mediocre! + - Zacharias! + - He's deader than before! + - Vengeance! + - Revenge! + - I can't believe you've done this. + originalEntityDialog: + - Let's play ZombieCraft later! + - Feel the power of friendship! + - El pueblo, unido! + - I called my friends over! + - BFF power! + - One for all! + - Get him! + - Screw you guys, I'm going home! + reinforcementDialog: + - Don't mess with our friends! + - We got your back Zach! + - Backup has arrived! + - One for all, one for all! + - This is going to be easy! + - Give up we have the high ground! + - You wanna go bruv? + - Worldstaaaaaaaaar! + - What are you doing to our friend + - Feel the power of friendship! + - Friendship power at 100%! + - Zombies, assemble! + - We got your back mate! + - Together we are better! + - The more the merrier! + - I got you fam! + - All for one! +zombie_necronomicon: + summoningChant: И об этом не следует думать...что человек либо самый старый, либо последний из хозяев земли, либо что общая масса жизни и субстанции ходит одна. Старые были, Старые есть, и Старые будут. Не в тех пространствах, которые мы знаем, но между ними они ходят безмятежные и первобытные, безразмерные и для нас невидимые. Йог-Сотот знает врата. Йог-Сотот-это врата. Йог-Сотот-ключ и страж врат. Прошлое, настоящее, будущее-все едино в Йог-Сототе. Он знает, где Старые прорвались из старых, и где Они прорвутся снова. Он знает, где Они ступали по земным полям, и где Они все еще ступают по ним, и почему никто не может видеть Их, когда Они ступают. По их запаху люди иногда могут узнать Их вблизи, но об Их подобии не может знать никто, кроме как в чертах тех, кого Они породили на человечестве; и есть много видов, отличающихся по сходству от истинного эйдолона человека до той формы без зрения или субстанции, которая является Ими. Они ходят +zombie_parents: + deathMessage: + - You monster! + - My baby! + - What have you done!? + - Revenge! + - Nooooo! + - You will pay for that! + - Eh, he was adopted + - He's dead! Again! + - He's deader than before! + - You broke him! + bossEntityDialog: + - You're embarrassing me! + - He's bullying me! + - He's the one picking on me! + - I can deal with this alone! + - Leave me alone, I got this! + - Stop following me around! + - God this is so embarrassing! + - He took my lunch money! + - He's bullying me! + zombieDad: + - Get away from my son! + - Stand up for yourself son! + - I'll deal with him! + - Stop picking on my son! + - Why are you doing this? + - I'll talk to your parents! + - You go kiddo! + - Show him who's boss kiddo! + - Nice punch kiddo! + zombieMom: + - Hands off my child! + - Are you hurt sweetie? + - Did he hurt you sweetie? + - Let me see that booboo sweetie + - I'll talk to his parents! + - You forgot your jacket sweetie! + - Posture, sweetheart + - Break it up! + - Stop this! + - Did you take out the garbage? +elite_blaze: + name: '&fLvl &2$level &fElite &eBlaze' + deathMessages: + - '$player &cwas lit ablaze by $entity!' +elite_cave_spider: + name: '&fLvl &2$level &fElite &3Cave Spider' + deathMessages: + - '$player &cbecame entangled in $entity''s &cweb!' +elite_creeper: + name: '&fLvl &2$level &fElite &2Creeper' + deathMessages: + - '$player &cwas blasted away by $entity!' + - '$entity &cjust oh man''d $player&c!' +elite_drowned: + name: '&fLvl &2$level &fElite &3Drowned' + deathMessages: + - '$player &chas been brought down to the depths by $entity!' + - '$player &chas been drowned by $entity!' +elite_elder_guardian: + name: '&fLvl &2$level &fElite &3Elder Guardian' + deathMessages: + - '$entity &cprevented $player &cfrom exploring the depths!' +elite_guardian: + name: '&fLvl &2$level &fElite &3Guardian' + deathMessages: + - '$entity &cprevented $player &cfrom exploring the depths!' +elite_enderman: + name: '&fLvl &2$level &fElite &5Enderman' + deathMessages: + - '$entity &csent $player &cinto the void!' + - '$player &clooked at $entity &cwrong!' + - '$player &cand $entity &cbecame best friends!' +elitemob_endermite: + name: '&fLvl &2$level &fElite &7Endermite' + deathMessages: + - '$entity &cis to $player &cwhat David is to Goliath!' +elite_evoker: + name: '&fLvl &2$level &fElite &5Evoker' + deathMessages: + - '$player &cwas enchanted by $entity&c!' +elite_husk: + name: '&fLvl &2$level &fElite &7Husk' + deathMessages: + - '$player &cwas hollowed out by $entity&c!' +elite_illusioner: + name: '&fLvl &2$level &fElite &8Illusioner' + deathMessages: + - '$player&c fell for $entity''s &cillusions!' +elite_iron_golem: + name: '&fLvl &2$level &fElite &fIron Golem' + deathMessages: + - '$player &cmessed with the wrong $entity&c!' + - '$player &chas been taught the way of fist by $entity&c!' +elite_phantom: + name: '&fLvl &2$level &fElite &9Phantom' + deathMessages: + - '$player &cjust had a bad nightmare about $entity&c!' + - '$player &cwill be having nightmares about $entity&c!' + - '$entity &chas taught $player &cthe value of sleep!' +elite_pillager: + name: '&fLvl &2$level &fElite &8Pillager' + deathMessages: + - '$entity &cplundered $player&c!' + - '$entity &cpillaged $player&c!' +elite_polar_bear: + name: '&fLvl &2$level &fElite &fPolar Bear' + deathMessages: + - '$player &cwas clawed to death by $entity&c!' + - '$player &cwas mauled to death by $entity&c!' +elite_ravager: + name: '&fLvl &2$level &fElite &6Ravager' + deathMessages: + - '$entity &cshowed $player &cwho''s in charge!' +elite_silverfish: + name: '&fLvl &2$level &fElite &7Silverfish' + deathMessages: + - '$player &cmistook $entity &cfor a stone block!' +elite_skeleton: + name: '&fLvl &2$level &fElite &fSkeleton' + deathMessages: + - '$player &cbecame $entity''s &cpin cushion!' + - '$entity &cwanted to see $player''s &cbones!' +elite_spider: + name: '&fLvl &2$level &fElite &7Spider' + deathMessages: + - '$player &cbecame entangled in $entity''s &cweb!' + - '$entity &chas devoured $player&c!' +elite_stray: + name: '&fLvl &2$level &fElite &bStray' + deathMessages: + - '$player &cwas led astray by $entity&c!' +elite_vex: + name: '&fLvl &2$level &fElite &bVex' + deathMessages: + - '$entity &chas vexed $player&c!' +elite_vindicator: + name: '&fLvl &2$level &fElite &8Vindicator' + deathMessages: + - '$entity &cvindicated his fighting skills over $player&c!' +elite_witch: + name: '&fLvl &2$level &fElite &5Witch' + deathMessages: + - '$player &cbecame $entity''s &ctest subject!' + - '$player &chas been bewitched by $entity&c!' +elite_wither_skeleton: + name: '&fLvl &2$level &fElite &8Wither Skeleton' + deathMessages: + - '$entity''s &carrows withered away $player&c!' + - '$entity''s &chas withered $player &caway!' +elite_zombie: + name: '&2$level &fУровень &fЭлитный &2Зомби' + deathMessages: + - '$player &cбыл съеден $entity&c!' + - '$entity &cсъел &cмозги $player''s!' +elite_ghast: + name: '&fLvl &2$level &fElite &fGhast' + deathMessages: + - '$player &cdidn''t dodge $entity&c &cfireballs!' + - '$player &cwas blown to bits $entity&c!' + - '$entity &cgot $player''s &cbacon!' +elite_wolf: + name: '[$level] Elite Wolf' + deathMessages: + - '$entity tore $player apart!' + - '$player was torn to shreds by $entity!' +elite_ender_dragon: + name: '&fLvl &2$level &fElite &5Ender Dragon' + deathMessages: + - '$entity &chas ended $player!' +elite_shulker: + name: '&fLvl &2$level &fElite &5Shulker' + deathMessages: + - '$entity &cshowed $player &cnew heights!' +super_chicken: + name: '&2Super Chicken' +super_cow: + name: '&2Super Cow' +super_mushroom_cow: + name: '&2Super Mooshroom Cow' +super_pig: + name: '&dSuper Pig' +super_sheep: + name: Super Sheep +elite_killer_bunny: + name: '&fLvl &2$level &fElite &cKiller Rabbit' + deathMessages: + - '$entity &cmade $player &cgo live in a farm upstate!' + - '$entity &ceducated $player using a stick and not a carrot!' +elite_llama: + name: '&fLvl &2$level &fElite &5Llama' + deathMessages: + - '$player &cwas spit on by $entity&c!' + - '$player &cwas made $entity&c angry!' +elite_warden: + name: '&fLvl &2$level &fElite &3Warden' + deathMessages: + - '$entity &csensed $player &cwas nearby!' +elite_goat: + name: '&fLvl &2$level &fElite &5Goat' + deathMessages: + - '$player &cwas rammed by $entity&c!' + - '$player &cwas run over by $entity&c!' + - '$player &cwas trampled by $entity&c!' + - '$player &cgot $entity&c horns!' +elite_zombified_piglin: + name: '&fLvl &2$level &fElite &6Zombified Piglin' + deathMessages: + - '$player &cwas mobbed to death by $entity&c!' + - '$entity &cgot $player''s &cbacon!' +elite_zoglin: + name: '&fLvl &2$level &fElite &dZoglin' + deathMessages: + - '$player &cmessed with the $entity &cand got the horns!' + - '$entity &cgot $player''s &cbacon!' +elite_piglin: + name: '&fLvl &2$level &fElite &ePiglin' + deathMessages: + - '$entity &cwill fetch a good price for $player''s remains!' + - '$entity &ctaught $player &cthe value of gold!' +elite_hoglin: + name: '&fLvl &2$level &fElite &dHoglin' + deathMessages: + - '$player &cmessed with the $entity &cand got the horns!' + - '$entity &cgot $player''s &cbacon!' +elite_piglin_brute: + name: '&fLvl &2$level &fElite &cPiglin Brute' + deathMessages: + - '$entity &ctenderized $player!' + - '$entity &cbrutalized $player!' +elite_bee: + name: '&fLvl &2$level &fElite &eBee' + deathMessages: + - '$player &cwas stung by $entity!' +MobCombatSettings: + bossLocationMessage: '&7[EM] &2[Нажмите, чтобы отслеживать!]' + bossKillParticipationMessage: '&eВаш урон: &2$playerDamage' + defaultOtherWorldBossLocationMessage: '$name: В другом мире!' + weakText: '&9&lWeak!' + resistText: '&c&lResist!' + fullHealMessage: '&2FULL HEAL!' +check_tier: + message1: '&7[EM] Ваш боевой уровень: $tier' + message2: '&7[EM] Бонус уровня гильдии $tier' + message3: '&7[EM] &aУровень вашей общей угрозы равен $tier' +check_tier_others: + message1: '&7[EM] $player боевой уровень $tier' + message2: '&7[EM] бонус $player в гильдии $tier' + message3: '&7[EM] &aУровень вашей общей угрозы равен $tier' +ScrapItemSettings: + scrapItemName: '&2лом в $level уровне' + scrapItemLore: + - '&aСобрать 25 скрапа того же уровня в' + - '&aупорядочить создание области улучшения предмета!' + - '&aВы также можете использовать металлолом для ремонта' + - '&aitems и создать более высокий металлолом!' + - '&Добро пожаловать вГильдию Искателей Приключений!' + upgradeItemName: '&2Уровень $level улучшения Сфера' + upgradeItemLore: + - '&aИспользовать в Enhancer NPC для обновления' + - '&aitems up the level of $orbLevel!' +Quests: + questJoinMessage: '&aYou have accepted the quest $questName &a!' + questLeaveMessage: '&cYou have abandoned the quest $questName &c!' + questCompleteMessage: '&2You completed the quest $questName &2!' + leaveWhenNoActiveQuestsExist: '&cYou don''t currently have an active quest!' + questLeaveConfirmationMessage: '&cAre you sure you want to abandon your current quest? Do &a/em confirm &c to confirm your choice!' + questStartTitle: '&aQuest Accepted!' + questCompleteTitle: '&2Quest Completed!' + questLeaveTitle: '&cQuest Abandoned!' + killQuestChatProgressionMessage: '&8[EliteMobs]&c➤Kill $name:$color$current&0/$color$target' + fetchQuestChatProgressionMessage: '&8[EliteMobs]&c➤Get $name:$color$current&0/$color$target' + dialogQuestChatProgressionMessage: '&8[EliteMobs]&c➤Talk to $name:$color$current&0/$color$target' + questCapMessage: '&8[EliteMobs] &cYou have reached the maximum amount of active quests (10)! &4Abandon or complete at least one active quest if you want to get more quests!' + killQuestScoreboardProgressionMessage: '&c➤Kill $name:$color$current&0/$color$target' + fetchQuestScoreboardProgressionMessage: '&c➤Get $name:$color$current&0/$color$target' + dialogQuestScoreboardProgressionMessage: '&c➤Talk to $name:$color$current&0/$color$target' + chatTrackMessage: '&8[EliteMobs]&2 Click here to track your quest!' + chatTrackHover: '&2Click to track!' + chatTrackingMessage: '&8[EliteMobs]&9 You are now tracking a quest!' + chatTrackingHover: '&2Click to untrack/track! /em -> Quests to track a different quest!' + noQuestDestinationFound: '[EM] No quest destination found!' + questDestinationInOtherWorld: '[EM] Go to world $world!' + questAlreadyCompletedMessage: '&8[EliteMobs] &cYou already completed this quest!' + questPrerequisitesMissingMessage: '&8[EliteMobs] &cCan''t accept this quest yet!' + lowRankDynamicQuestWarning: '&8[EliteMobs] &cYou can''t take these quests with your current guild rank! Increase your guild rank to accept these quests.' + questTurnInObjective: '&a2Talk to $npcName' +Wormholes: + dungeonNotInstalledMessage: '&8[EliteMobs] &cDungeon $dungeonID &cis not installed! This teleport will not work.' + defaultPortalMissingMessage: '&8[EliteMobs] &cThis portal doesn''t seem to lead anywhere!' +Arenas: + notEnoughPlayersMessage: '&8[EliteMobs] &cYou need at least $amount to start the match!' + startingMessage: '&2Starting!' + startingSubtitle: '&2in $count...' + arenaFullMessage: '&4[EliteMobs] &cArena is full! You can spectate instead while you wait for it to finish!' + arenasOngoingMessage: '&4[EliteMobs] &cCan''t join the arena now - a match is currently happening! You can spectate instead while you wait for it to finish!' + arenaStartHintMessage: '&2[EliteMobs] &aYou can start the arena by doing &2/em start' + arenaQuitHintMessage: '&4[EliteMobs] &cYou can leave the arena by doing &4/em quit' + arenaJoinPlayerMessage: "&2[EliteMobs] &aYou can start the arena by doing &2/em\\ \\ start &aif there are at least &2$count &aplayers in it! \nYou can leave the\\ \\ arena by doing &c/em quit" + arenaJoinSpectatorMessage: '&2[EliteMobs] &aYou can leave the arena at any time using &2/em quit' + waveTitle: '&aWave &2$wave' + victoryTitle: '&2Victory!' + victorySubtitle: '&aCompleted &2$wave &awaves!' + defeatTitle: '&4Defeat!' + defeatSubtitle: '&cReached wave &4$wave&c!' + victoryBroadcast: Arena $arenaName was conquered by $players! + joinPlayerTitle: '&aStart with &2/em start &a!' + joinPlayerSubtitle: '&cLeave with &4/em quit &c!' + joinSpectatorTitle: '&aNow spectating!' + joinSpectatorSubtitle: '&cLeave with &4/em quit &c!' +ancient_corpse_drop_axe: + name: '&eButchers Cleaver' + lore: + - '&aRetrived from the' + - '&aAncient Corpse''s skull...' +animated_armor_drop_axe: + name: '&8Enchanted Axe' + lore: + - '&8This axe was almost the' + - '&8end of you.' +animated_armor_drop_boots: + name: '&8Enchanted Boots' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +animated_armor_drop_chestplate: + name: '&8Enchanted Chestplate' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +animated_armor_drop_helmet: + name: '&8Enchanted Helmet' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +animated_armor_drop_leggings: + name: '&8Enchanted Leggings' + lore: + - '&8You literally fought this' + - '&8piece of armor.' +arachnid_matriarch_drop_boots: + name: '&bSilk Striders' + lore: + - '&bMade out of rare spider silk.' +baba_rhoga_drop_chest: + name: '&aWitches Robes' + lore: + - '&aThe smell should go' + - '&aaway eventually.' +baba_yaga_drop_helmet: + name: '&aWitches Hat' + lore: + - '&aThe smell should go' + - '&aaway eventually.' +balloon_rider_drop_leggings: + name: '&dRoomy Leggings' + lore: + - '&dVery comfortable and spacious leggings.' +banshee_drop_charm: + name: '&8Manifested Sorrow' + lore: + - '&8May this hardened sorrow protect' + - '&8you from grief.' +beast_tamer_drop_axe: + name: '&eGreat Axe' + lore: + - '&eHeavy enough to cleave any beast in two.' +berserker_charm: + name: '&bталисман берсерка' + lore: + - '&aСброс себя на лице' + - '&aПодавляющее ощущение еще' + - '&ожидает...' +bigfoot_drop_chestplate: + name: '&eFur Armor' + lore: + - '&eNice and warm.' +big_bad_wolf_drop_chestplate: + name: '&aBig Bad Wolf Fur' + lore: + - '&aScary!' +bloated_jeffrey_drop_tear: + name: '&bSweet Tear' + lore: + - '&bYou made Jeffrey cry...' +bone_fiend_drop_leggings: + name: '&aBoney Leggings' + lore: + - '&aThe sharp bones attached to these' + - '&aleggings sure do rattle a lot.' +challengers_boots: + name: '&cChallenger''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_chestplate: + name: '&cChallenger''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_helmet: + name: '&cChallenger''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_leggings: + name: '&cChallenger''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +challengers_sword: + name: '&cChallenger''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +chameleon_charm: + name: 'Оберег хамелеона' + lore: + - 'Красочная банка-хамелеон' + - 'и может быть где угодно,' + - 'и медленно ползет...' +changeling_drop_sword: + name: '&aCrystalline Sword' + lore: + - '&aThe blade shimmers as you gaze upon it.' +cheetah_charm: + name: '&bCheetah Charm' + lore: + - '& aCheetahs могут достигать скорости' + - '&a120 км/ч... около 60' + - '& секунды. Заставь их посчитать!' +circus_ringmaster_drop_charm: + name: '&dRingmasters Whip' + lore: + - '&dThis was used for terrible punishment.' +craftenmine_terror_drop_trident: + name: '&cGhast Lobotomizer' + lore: + - '&cPerfect for making sure that' + - '&cthe Ghasts stay grounded.' +creeperpede_drop_chestplate: + name: '&dExplosion Proof Vest' + lore: + - '&dMake ''BOOM!'' feel' + - '&dmore like ''boom''.' +crone_drop_axe: + name: '&fWitch Feller' + lore: + - '&fA fine axe that demands a fine hunt.' +depths_seeker: + name: '&2Depths seeker' + lore: + - '&9Come from depths immeasurable' + - '&9and looted from monster most vile,' + - '&9there is no telling what horrors' + - '&9this fishing rod has seen.' +divine_cinder_drop_charm: + name: '&6Divine Fire' + lore: + - '&6Blessed be the fire!' +dwarven_greed: + name: '&4Dwarven Greed' + lore: + - '&cThose who delve too greedily' + - '&cand too deep may wake ancient' + - '&chorrors of shadow and flame' + - '&cbest left undisturbed.' +elephant_charm: + name: '&bElephant Charm' + lore: + - '&aGain the power of an elephant' + - '&astampede, for the cost of the' + - '&aspeed of an elephant stampede!' +enders_drop_chestplate: + name: '&dEnder Shirt' + lore: + - '&dProtective and comfy!' +enders_drop_helmet: + name: '&dEnder Cap' + lore: + - '&dComfy but also quite sturdy.' +enders_drop_leggings: + name: '&dEnder Pants' + lore: + - '&dA bit too long but it will do.' +ender_lapin_drop_boots: + name: '&cDark Star Boots' + lore: + - '&cGives you the courage' + - '&cof running when in danger.' +endless_pursuer_drop_sword: + name: '&7Dark Blood Sword' + lore: + - '&7The sword seems to' + - '&7be weeping blood...' +enraged_snowman_drop_sword: + name: '&9Snowman''s Nose' + lore: + - '&9No wonder that the Snowman''s' + - '&9nose was so pointy...' +xmas_and_gold: + name: '&6and gold!' + lore: + - '&7Everyone wishes for silver' + - '&7and gold!' +xmas_and_goooooold: + name: '&6and goooooold!' + lore: + - '&7Everyone wishes for silver' + - '&7and gold!' +xmas_cornelius_pick: + name: '&bCornelius'' Pick' + lore: + - '&3If you throw it in the air' + - '&3and let it hit the ground,' + - '&3you may just find some' + - '&3peppermint!' +xmas_lost_present: + name: '&2Lost Present' + lore: + - '&2Turn this in for a reward!' +xmas_peppermint: + name: '&cPeppermint' + lore: + - '&fWhat I''ve been searching for all my life!' +xmas_siiiiilver: + name: '&7Siiiiilver' + lore: + - '&6Everyone wishes for silver' + - '&6and gold!' +xmas_silver: + name: '&7Silver' + lore: + - '&6Everyone wishes for silver' + - '&6and gold!' +xmas_substitute_elf_practice: + name: '&8Substitue Elf Practice' + lore: + - '&fThis doll needs its teeth fixed' +xmas_treat: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +xmas_treat_v2: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +evil_undead_drop_sword: + name: '&eTransient Blade' + lore: + - '&eIt will only serve' + - '&eyou for song long.' +fallen_knight_drop_boots: + name: '&e7Ancient Boots' + lore: + - '&7Even though the boots are old they' + - '&7still provide plenty of protection.' +fallen_knight_drop_chestplate: + name: '&e7Ancient Nether-Plate' + lore: + - '&7This armor might look plain to' + - '&7the untrained eye but is clear' + - '%7that anything wishing to penetrate' + - '&7it''s thick plate will need to be' + - '&7swung with considerable force.' +fallen_knight_drop_helmet: + name: '&e7Ancient Headgear' + lore: + - '&7Many swords have left their mark' + - '&7aon this helm but none have' + - '&7managed to break its defense.' +fallen_knight_drop_leggings: + name: '&e7Ancient Leggings' + lore: + - '&7You feel sorry for anyone that tries' + - '&7to strike these leggings.' +fine_swine_drop_sword: + name: '&6Fine Golden Sword' + lore: + - '&6A fine master-crafted golden sword.' + - '&6The molten gold flowing inside' + - '&6the sword makes sure that any damage' + - '&6to the blade is repaired swiftly.' +firefly_charm: + name: '&bFirefly Charm' + lore: + - '&aLight up the night!' +firestarter_drop_helmet: + name: '&eFire Stopper' + lore: + - '&eOnly half the heat!' +fire_conjurer_drop_shield: + name: '&eFlame Touched Shield' + lore: + - '&eProtects against fire and flame.' +fishy_charm: + name: '&bFishy Charm' + lore: + - '&aThere''s just something not' + - '&aquite right with this one...' +fox_king_cold_drop_charm: + name: '&9Magical Snow' + lore: + - '&9You sense impossible energies' + - '&9coming from this snow.' +fulgora_drop_boots: + name: '&bMountain Boots' + lore: + - '&bShould be useful when' + - '&bexploring the mountains.' +goblin_ballista: + name: '&8Goblin Ballista' + lore: + - '&8A treasure among goblins!' +goblin_boots: + name: '&8Goblin Boots' + lore: + - '&8A treasure among goblins!' +goblin_chestplate: + name: '&8Goblin Chestplate' + lore: + - '&8A treasure among goblins!' +goblin_cleaver: + name: '&8Goblin Cleaver' + lore: + - '&8A treasure among goblins!' +goblin_helmet: + name: '&8Goblin Helmet' + lore: + - '&8A treasure among goblins!' +goblin_invasion_drop_chestplate: + name: '&aSmall Chestplate' + lore: + - '&aReally tight...' +goblin_invasion_drop_leggings: + name: '&aSmall Leggings' + lore: + - '&aWell, at least it really' + - '&ashows off your legs.' +goblin_leggings: + name: '&8Goblin Leggings' + lore: + - '&8A treasure among goblins!' +goblin_poker: + name: '&8Goblin Poker' + lore: + - '&8A treasure among goblins!' +goblin_shooter: + name: '&8Goblin Shooter' + lore: + - '&8A treasure among goblins!' +goblin_slasher: + name: '&8Goblin Slasher' + lore: + - '&8A treasure among goblins!' +grappling_arrow: + name: '&6Grappling Arrow' + lore: + - '&eFire at a TARGET BLOCK to grapple!' +greedy_dwarf_drop_pickaxe: + name: '&9Dwarven Need' + lore: + - '&cThose who delve too greedily' + - '&cand too deep may wake ancient' + - '&chorrors of shadow and flame' + - '&cbest left undisturbed.' +grunter_drop_axe: + name: '&cBig Oink' + lore: + - '&cThe axe has a tendency' + - '&cto squeal when swung.' +grunts_boots: + name: '&fGrunt''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_chestplate: + name: '&fGrunt''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_helmet: + name: '&fGrunt''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_leggings: + name: '&fGrunt''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +grunts_sword: + name: '&fGrunt''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +harmless_chicken_drop_boots: + name: '&aUseless Boots' + lore: + - '&aAt least they''re explosion proof...' +hog_rider_drop_boots: + name: '&a3.6 Radioactive Boots' + lore: + - '&aNot great, not terrible.' +horde_champion_drop_sword: + name: '&dHorde Eviscerator' + lore: + - '&dWhen you need to take' + - '&dcare of an undead horde.' +horrid_duplicator_drop_arrow: + name: '&aDuped Arrow' + lore: + - '&2Looks and feels' + - '&2like the real thing...' +horrid_duplicator_drop_bow: + name: '&4Fiery Bone Bow' + lore: + - '&4This bow is made out of' + - '&4a single large bone.' +invasion_alien_treat: + name: '&6Alien treats' + lore: + - '&6The taste is out of this planet!' +invasion_cheap_plasma_boots: + name: '&2Cheap Plasma Boots' + lore: + - '&aBlast off!' + - '&cNote: &8Double shift to activate!' +invasion_low_grade_tinfoil_bolt_caster: + name: '&7Low Grade Bolt Caster' + lore: + - '&7Get off my property!' +invasion_low_grade_tinfoil_boots: + name: '&7Low Grade Tinfoil Shoes' + lore: + - '&7Avoids floor radiation!' +invasion_low_grade_tinfoil_chestplate: + name: '&7Low Grade Tinfoil Chestpiece' + lore: + - '&7Prevents 6G from spying on your pacemaker!' +invasion_low_grade_tinfoil_hat: + name: '&7Low Grade Tinfoil Hat' + lore: + - '&7I want to believe!' +invasion_low_grade_tinfoil_leggings: + name: '&7Low Grade Tinfoil Pants' + lore: + - '&7Made for running from aliens!' +invasion_polished_plasma_boots: + name: '&2Polished Plasma Boots' + lore: + - '&aBlast off!' + - '&cNote: &8Double shift to activate!' +invasion_quality_bolt_caster: + name: '&7Quality Bolt Caster' + lore: + - '&7Get off my property!' +invasion_quality_tinfoil_boots: + name: '&7Low Grade Tinfoil Shoes' + lore: + - '&7Avoids floor radiation!' +invasion_quality_tinfoil_chestplate: + name: '&7Quality Tinfoil Chestpiece' + lore: + - '&7Prevents 6G from spying on your pacemaker!' +invasion_quality_tinfoil_hat: + name: '&7Quality Tinfoil Hat' + lore: + - '&7Stay out of my head!' +invasion_quality_tinfoil_leggings: + name: '&7Quality Tinfoil Pants' + lore: + - '&7Made for running from aliens!' +invictus_boots: + name: '&4Invictus Boots' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_chestplate: + name: '&4Invictus Chestplate' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_helmet: + name: '&4Invictus Helmet' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_leggings: + name: '&4Invictus Leggings' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_pickaxe: + name: '&4Invictus Pickaxe' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_shovel: + name: '&4Invictus Shovel' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +invictus_sword: + name: '&4Invictus Sword' + lore: + - '&2Awarded to the champions of the' + - '&2Wood League Arena!' +krampus_drop_boots: + name: '&1Snow Boots' + lore: + - '&1Made out of actual snow.' +large_hopper_drop_axe: + name: '&aHeavy Axe' + lore: + - '&aPerfect for chopping off heads.' +living_shadow_drop_boots: + name: '&5Shadow Boots' + lore: + - '&5Falling doesn''t hurt as much.' +lucky_charms: + name: '&bLucky Charms' + lore: + - '&aPart of a complete breakfast!' + - '&cNote: Absolutely not a part of' + - '&ca complete breakfast.' +magmaguys_toothpick: + name: '&4Magmaguy&c''s &2Toothpick' + lore: + - '&aIn nearly mint condition!' +merman_drop_trident: + name: '&1Merman Trident' + lore: + - '&1A Merman''s favorite weapon.' +meteor_shower_scroll: + name: 'Свиток метеоритного дождя' + lore: + - '&4Call forth destruction.' + - '&4Одноразовое использование.' +monster_of_the_deep_drop_trident: + name: '&3Bone Trident' + lore: + - '&3Made out of the bones' + - '&3of the Monster of the Deep.' +moon_spider_drop_sword: + name: '&fSilk Spun Sword' + lore: + - '&fRazor sharp silk surrounds' + - '&fthe iron core of this blade.' + - '&fThe blade will serve you,' + - '&ffor now...' +necromancer_drop_helmet: + name: '&cDark Omen Helm' + lore: + - '&cThere is something off' + - '&cabout this helmet.' +netherite_golem_drop_helmet: + name: '&8Ancient Helmet' + lore: + - '&8You''re not sure if you' + - '&8should put this on your' + - '&8head or send it to a museum.' +nether_escapee_drop_charm: + name: '&6Fire Amulet' + lore: + - '&6May the flames not harm you.' +nether_hag_drop_sword: + name: '&7Bewitched Sword' + lore: + - '&7All kinds of curses and' + - '&7enchantments flow through' + - '&7this sword.' +nightwing_drop_crossbow: + name: '&aSky Watcher' + lore: + - '&aKeeping the skies safe.' +night_crawler_drop_shield: + name: '&8Night Shield' + lore: + - '&8Almost unbreakable.' +night_crawler_drop_sword: + name: '&8Night Blade' + lore: + - '&e8The only answer to the' + - '&8threats of the night.' +novices_boots: + name: '&8Novice''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_chestplate: + name: '&8Novice''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_helmet: + name: '&8Novice''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_leggings: + name: '&8Novice''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +novices_sword: + name: '&8Novice''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +oasis_beacons_brigandine: + name: '&8Beacon''s Brigandine' + lore: + - '&fSolid steel can repel' + - '&fmost attacks.' +oasis_chief_cultists_bow: + name: '&5Chief Cultist''s Bow' + lore: + - '&dThe necrotic war bow' + - '&dof the cultist chief.' +oasis_earthquake_boots_10: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_20: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_30: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_40: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_boots_50: + name: '&2Earthquake Boots' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_10: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_20: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_30: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_40: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_chestplate_50: + name: '&2Earthquake Chestplate' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_10: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_20: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_30: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_40: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_helmet_50: + name: '&2Earthquake Helmet' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_10: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_20: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_30: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_40: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_earthquake_leggings_50: + name: '&2Earthquake Leggings' + lore: + - '&aSlam the ground, and mobs!' + - '&cNote: &8Double shift to activate!' +oasis_foundrys_flaming_hammer: + name: '&6Foundry''s Flaming Hammer' + lore: + - '&eThe Hammer of the foundry!' +oasis_foundrys_flux: + name: '&6Foundry''s Flux' + lore: + - '&eThe flux that''s infused in' + - '&eevery forged weapon!' +oasis_mask_of_the_warlock: + name: '&4Mask of the Warlock' + lore: + - '&7The stone is in his mask!' + - '&7The UV light will help him!' +oasis_monumental_lance: + name: '&3Monumental Lance' + lore: + - '&bSpearfishing is my hobby.' +oasis_oracles_shroud: + name: '&3Oracle''s Shroud' + lore: + - '&1Illusion is your weapon!' +oasis_page_of_darkness_I: + name: '&0Page of Darkness I' + lore: + - '&829 paces North' + - '&811 paces West' + - '&816 paces North' + - '&86 paces East' +oasis_page_of_darkness_II: + name: '&0Page of Darkness II' + lore: + - '&87 paces South' + - '&86 paces East' + - '&833 paces North' + - '&812 paces West' +oasis_page_of_darkness_III: + name: '&0Page of Darkness III' + lore: + - '&86 paces North' + - '&83 paces West' + - '&830 paces North' + - '&89 paces East' +oasis_page_of_darkness_index: + name: '&0Page of Darkness Index' + lore: + - '&8Tread carefully in darkness' + - '&8they know youve come.' + - '&8Be weary on the path ahead' + - '&8for balls of fire drum.' +oasis_page_of_darkness_IV: + name: '&0Page of Darkness IV' + lore: + - '&824 paces South' + - '&89 paces East' + - '&836 paces North' + - '&83 paces West' +oasis_page_of_darkness_V: + name: '&0Page of Darkness V' + lore: + - '&89 paces North' + - '&812 paces East' + - '&86 paces South' + - '&86 paces East' +oasis_page_of_darkness_VI: + name: '&0Page of Darkness VI' + lore: + - '&86 paces South' + - '&86 paces East' + - '&812 paces North' + - '&83 paces East' +oasis_page_of_darkness_VII: + name: '&0Page of Darkness VII' + lore: + - '&83 paces North' + - '&86 paces East' + - '&88 paces South' +oasis_page_of_darkness_VIII: + name: '&0Page of Darkness VIII' + lore: + - '&8Out of the shadow comes a light' + - '&8whose robes are dull gray, marred by fight.' + - '&8Of ice and snow, of fire and heat.' + - '&8Axes deflect, but swords defeat.' +oasis_page_of_libraris_I: + name: '&7Page of Libraris I' + lore: + - '&fUnder the bookshelf' + - '&fthat has no reflection' + - '&fwill appear unto you' + - '&fpassage and direction.' +oasis_page_of_libraris_II: + name: '&7Page of Libraris II' + lore: + - '&fThe bookshelf''s reflection' + - '&fholds more knowledge' + - '&f4 shelves more full of books' + - '&fthan its upward image!' +oasis_page_of_libraris_III: + name: '&7Page of Libraris III' + lore: + - '&fBearing slightly west' + - '&fof the bookshelf that holds the best.' + - '&fThe most knowledge does it keep.' + - '&fA favorite for those who reap.' +oasis_page_of_libraris_index: + name: '&7Page of Libraris Index' + lore: + - '&f5 papers to find,' + - '&f3 switches to flip,' + - '&fa door to be opened' + - '&fand in it shall ye slip.' +oasis_page_of_libraris_IV: + name: '&7Page of Libraris IV' + lore: + - '&fThe oracle of knowledge' + - '&fyeilds shocking surprise' + - '&ffrom depths of despair' + - '&fshall lightning bolts arise.' +oasis_page_of_libraris_V: + name: '&7Page of Libraris V' + lore: + - '&fHis last secret' + - '&fhe will try to hide' + - '&fthough use of shadow and puppets' + - '&fto strike you as you stride.' +oasis_page_of_plundering_I: + name: '&6Page of Plundering I' + lore: + - '&eHouses throughout the town' + - '&ehide their secrets up rather than down.' + - '&eGrapple or flight' + - '&ecan aid your plight.' +oasis_page_of_sentris: + name: '&1Page of Sentris' + lore: + - '&bA sentry''s armor is too tough' + - '&bwielding a sword, your fight will be rough.' +oasis_page_of_the_pharaoh_I: + name: '&0Page of the Pharaoh I' + lore: + - '&6A sacrifice on the altar' + - '&6must be made to pursue.' + - '&6But what shall ye offer?' + - '&red sandstone holds this clue.' +oasis_page_of_the_pharaoh_II: + name: '&0Page of the Pharaoh II' + lore: + - '&6The pharaohs halls are lined' + - '&6in the finest gold around.' + - '&6It shall be his undoing' + - '&6for from gold your damage shall abound.' +oasis_page_of_the_pharaoh_III: + name: '&0Page of the Pharaoh III' + lore: + - '&6The pharaohs walls are filled' + - '&6with perils and precious treasures.' + - '&6From the southwest corner of the room with blue windows' + - '&6streams very ominous pressures.' +oasis_page_of_the_pharaoh_index: + name: '&0Page of the Pharaoh Index' + lore: + - '&6The pharaoh is sealed' + - '&6within his tomb.' + - '&6He lies in wait, undisturbed;' + - '&6his traps will be your doom.' + - '&63 pages will help your adventure' + - '&6from being curbed.' +oasis_page_of_the_sewer_I: + name: '&0Page of the Sewer I' + lore: + - '&3There is a louse of unusual size.' + - '&3Its on the prowl, behold its prize.' + - '&3Plenty of treasure to be found' + - '&3all you have to do is swim around.' +oasis_page_of_the_sewer_II: + name: '&0Page of the Sewer II' + lore: + - '&3Activating the gates one by one' + - '&3will allow the water to flow.' + - '&3Swim up once it pours out' + - '&3then down the right tunnel you must go.' +oasis_page_of_the_sewer_index: + name: '&0Page of the Sewer Index' + lore: + - '&3Evil lurks where waters drain' + - '&3Be ever watchful, they''ll eat your brain!' + - '&3You must open 3 gates guarded by creatures' + - '&3lined with red sandstone features.' + - '&32 pages will guide you, do not strain.' +oasis_page_of_vampiris_I: + name: '&4Page of Vampiris I' + lore: + - '&cDozens of weapons have struck the beast' + - '&cand every blow it''s withstood.' + - '&cIt fears not the bite of stone, gold or diamonds in the least' + - '&cbut it trembles before wood.' +oasis_page_of_vampiris_II: + name: '&4Page of Vampiris II' + lore: + - '&cIf the warlock you seek to slight,' + - '&cbe prepared for a tough fight!' + - '&cThe second floor shall test your might,' + - '&cconquering it first is a rite.' +oasis_page_of_vampiris_III: + name: '&4Page of Vampiris III' + lore: + - '&cDown the spire and into the cave' + - '&cis the path of the brave.' + - '&cBeware of those returned from the grave,' + - '&cslay master for what you crave.' +oasis_page_of_vampiris_index: + name: '&4Page of Vampiris Index' + lore: + - '&cWithin the observatory' + - '&cthere lurks a creature' + - '&cwho has never seen the sun.' + - '&cFind 4 pages to help you' + - '&cescape alive!' +oasis_page_of_vampiris_IV: + name: '&4Page of Vampiris IV' + lore: + - '&cTwo chests of loot,' + - '&cDon''t wake the dead!' + - '&cOne under the stair,' + - '&cthe other where books can be read!' +oasis_pharaohs_feast: + name: '&6Pharaohs Feast' + lore: + - '&eA golden reminder' + - '&eof the once golden city' + - '&ecorrupted by the sands of time.' +oasis_pharaohs_flail: + name: '&0Pharaoh''s Flail' + lore: + - '&4The flail of the afterlife.' +oasis_pick_of_darkness: + name: '&1Pick of Darkness' + lore: + - '&bShining bright through' + - '&bthe shadows.' +oasis_sunkiller: + name: '&6Sunkiller' + lore: + - '&eIsnt that rock over there' + - '&ejust big enough for someone' + - '&eto hide behind?' +oasis_tohth: + name: '&8Oingo Boingo Brothers Adventure' + lore: + - '&fMy preminitions are absolute!' + - '&fIt is fate!' +okami_drop_leggings: + name: '&cOkami''s Blessing' + lore: + - '&cSpeed of the wolf.' + - '&cFire protection of a god.' +owl_charm: + name: '&bOwl Charm' + lore: + - '&aBecome the ultimate nocturnal' + - '&apredator!' +primis_artifexs_shield: + name: '&6Artifex''s Shield' + lore: + - '&eAn old relic from a more' + - '&edangerous time. It has been' + - '&erestored to its glory!' +primis_caeruleaums_hope: + name: '&9Caeruleaum''s Hope' + lore: + - '&8A relic of a bygone era, still sharp' + - '&8enough to hurt but rusty enough to' + - '&8belong in a museum!' +primis_catacomb_drop_boots: + name: '&7Dark Bone Footgear' + lore: + - '&7Unnaturally dark bones' + - '&7cover these boots.' +primis_catacomb_drop_boots_2: + name: '&7Dark Bone Footgear' + lore: + - '&7Unnaturally dark bones' + - '&7cover these boots.' +primis_catacomb_drop_chestplate: + name: '&7Dark Bone Armor' + lore: + - '&7Bones as dark as the abyss' + - '&7adorn this armor.' + - '&7The arrows will make quite a' + - '&7noise as they bounce off the bones.' +primis_catacomb_drop_chestplate_2: + name: '&7Dark Bone Armor' + lore: + - '&7Bones as dark as the abyss' + - '&7adorn this armor.' + - '&7The arrows will make quite a' + - '&7noise as they bounce off the bones.' +primis_catacomb_drop_leggings: + name: '&7Dark Bone Leggings' + lore: + - '&7The dark bones covering the' + - '&7leggings will make dangerous' + - '&7falls more survivable.' +primis_catacomb_drop_leggings_2: + name: '&7Dark Bone Leggings' + lore: + - '&7The dark bones covering the' + - '&7leggings will make dangerous' + - '&7falls more survivable.' +primis_catacomb_necromancer_drop_helmet: + name: '&5Dark Bone Cowl' + lore: + - '&5The cowl offers little protection,' + - '&5it only seeks blood and death.' +primis_catacomb_necromancer_drop_helmet_2: + name: '&5Dark Bone Cowl' + lore: + - '&5The cowl offers little protection,' + - '&5it only seeks blood and death.' +primis_catacomb_necromancer_drop_sword: + name: '&5Dark Bone Brand' + lore: + - '&5The unnaturally dark bone-brand' + - '&5glistens in the light' + - '&5ready to part anything' + - '&5that stands in it''s way.' +primis_catacomb_necromancer_drop_sword_2: + name: '&5Dark Bone Brand' + lore: + - '&5The dark bone-brand howls' + - '&5viciously with every swing' + - '&5as the air rushes through' + - '&5it''s hollow cavity.' +primis_cooked_rabbit: + name: '&cCooked Rabbit' + lore: + - Huh, did this rabbit overheat? +primis_diving_helmet: + name: '&1Diving Helmet' + lore: + - An old Diving Helmet. + - Still works just fine. +primis_fish_bait: + name: '&2Fish Bait' + lore: + - '&aLooks like you could reel big fish with these.' +primis_gladius_important_documents: + name: '&2Important Documents' + lore: + - '&aThe documents are sealed.' +primis_gladius_lord_promise: + name: '&5Assistance Agreement' + lore: + - '... hence, for the help lended during these most trying' + - times, Pontis Mille promises to return in kind at Gladius' + - darkest hour. +primis_gladius_supplies: + name: '&2Supplies' + lore: + - '&aFit to keep a soldier fed during a war.' +primis_gladius_sword: + name: '&5Gladius' + lore: + - '&8The very symbol of the Gladius Fortress.' +primis_gladius_the_good_stuff: + name: '&2The Good Stuff' + lore: + - '&aSmells... strong.' +primis_heirloom: + name: '&2Lost Heirloom' + lore: + - '&aSeems old, ancient even.' +primis_ice_village_alanus_dagger: + name: '&eAlanus'' Dagger' + lore: + - '&eA simple dagger with' + - '&erunes covering the handle.' +primis_ice_village_chains_shipment: + name: '&aShipment of Chains' + lore: + - '&aA lot of chains.' +primis_ice_village_escaped_prisoner_body: + name: '&cUnconcious Body' + lore: + - '&cHeavy.' +primis_ice_village_foot_of_mountain_chest_axe: + name: '&1Dull Frost Axe' + lore: + - '&1Freezing to the touch' +primis_ice_village_island_chest_trident: + name: '&3Magma''s Delight' + lore: + - '&3Those who look, shall find.' +primis_ice_village_living_nightmares_reward_chest: + name: '&3Fur Coat' + lore: + - '&3Made out of the' + - '&3toughest fur around.' +primis_ice_village_magical_ice_crystals: + name: '&1Fur Ice Crystal' + lore: + - Having the crystal near + - snow makes it react. +primis_ice_village_make_them_go_ouch_reward_leggings: + name: '&dViolet''s Spare Leggings' + lore: + - '&dMakes you wanna strut down the' + - '&droad and do some punishment.' +primis_ice_village_salmon: + name: '&2Fresh Salmon' + lore: + - You don't think you saw + - larger salmon in your life. +primis_ice_village_silence_reward_helmet: + name: '&aBoomers Helm' + lore: + - '&aShould handle an explosion or two.' +primis_ice_village_taking_the_bait_reward: + name: '&bNorthern Rod' + lore: + - '&bIt''s a well made fishing rod.' +primis_ice_village_violet_boots: + name: '&dViolet''s Leather Boots' + lore: + - '&dFancy leather boots with' + - '&da raised pointy heel.' +primis_ice_village_violet_leggings: + name: '&dViolet''s Fancy Leggings' + lore: + - '&dTight and slightly see-through' + - '&dwith beautiful flower motives.' +primis_ice_village_violet_whip: + name: '&dViolet''s Whip' + lore: + - '&dDelivers exquisite punishment.' +primis_ice_village_wanna_build_a_snowman_reward_boots: + name: '&3Frost Boots' + lore: + - '&3It''s just frost boots.' +primis_invaders_assassins_bow: + name: '&8Assassin''s Bow' + lore: + - '&aThe perfect way to give them' + - '&aa taste of their own medicine.' +primis_invaders_boots: + name: '&4Invader''s boots' + lore: + - '&aThese don''t smell so good.' +primis_invaders_bow: + name: '&8Invader''s Bow' + lore: + - '&aOnce blotted out the Sun.' +primis_invaders_captains_sword: + name: '&4Invader''s Captain Sword' + lore: + - '&aCurved and mean-looking.' +primis_invaders_chestplate: + name: '&4Invader''s chestplate' + lore: + - '&aRusty, ugly and smelly. Lovely!' +primis_invaders_helmet: + name: '&4Invader''s helmet' + lore: + - '&aBeats a concussion!' +primis_invaders_leggings: + name: '&4Invader''s leggings' + lore: + - '&aCould use some oil.' +primis_invaders_sword: + name: '&4Invader''s sword' + lore: + - '&aSuspiciously bloodstained.' +primis_lucky_pickaxe: + name: '&6Lucky Lickaxe' + lore: + - '&eShines bright, even underground.' + - '&eYou see LL engraved in the handle' +primis_monster_slaying_spear: + name: '&8Monster Slaying Spear' + lore: + - Turns Sea Monsters into barbecue. +primis_ogre_boots: + name: '&cOgre''s boots' + lore: + - '&7They''ll keep you nice' + - '&7and toasty.' +primis_ogre_chestplate: + name: '&cOgre''s chestplate' + lore: + - '&7Hot to the touch' +primis_ogre_helmet: + name: '&cOgre''s helmet' + lore: + - '&7You''ll be sweating bullets.' +primis_ogre_leggings: + name: '&cOgre''s leggings' + lore: + - '&7Smoldering slacks.' +primis_ogre_mines_lucky_pickaxe: + name: '&eLucky Pickaxe' + lore: + - '&aLucky, but useless.' +primis_ogre_mines_waterworks_chest_shield: + name: '&aSturdy Door' + lore: + - '&aIt''s just a door.' +primis_old_shield: + name: '&8Old Shield' + lore: + - '&7An old relic from a more' + - '&7dangerous time. It might be' + - '&7able to be mended, though...' +primis_pirate_boots: + name: '&4Pirate''s boots' + lore: + - '&aThese have a few too many' + - '&aholes to be useful.' +primis_pirate_bow: + name: '&8Pirate''s Bow' + lore: + - '&aNot quite a flintlock,' + - '&abut it will do!' +primis_pirate_chestplate: + name: '&4Pirate''s Chestplate' + lore: + - '&aBasically a t-shirt.' +primis_pirate_helmet: + name: '&4Pirate''s Helmet' + lore: + - '&aMissing an eye-patch.' +primis_pirate_leggings: + name: '&4Pirate''s leggings' + lore: + - '&aFeels like sea legs!' +primis_pirate_sword: + name: '&4Pirate''s sword' + lore: + - '&aCurved and mean-looking.' +primis_pointis_groves_heirloom: + name: '&2Valuable Heirloom' + lore: + - '&aThis is the second one of these that you retrieved.' +primis_pointis_mille_chest_dirty_note: + name: Dirty Note + lore: + - '&fThere was a really cool sword' + - '&fin here but it''s gone now.' +primis_pontis_beast_horn: + name: '&2Blood Drenched Horn' + lore: + - '&fOn closer inspection the horn isn''t' + - '&fcovered in blood but seems to' + - '&fbe made out of it.' + - '&fThe crystallized blood is incredibly sharp.' +primis_pontis_beast_scale: + name: '&2Toxic Fish Scale' + lore: + - '&fThe scale is rock hard on the outside.' + - '&fThe inside is covered in' + - '&ftoxic and acidic ooze.' +primis_pontis_beast_silk: + name: '&2Sun Soaked Silk' + lore: + - '&fThe silk is radiating light and warmth.' +primis_pontis_elf_drop_boots: + name: '&7Elf Boots' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_elf_drop_chestplate: + name: '&7Elf Chest-plate' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_elf_drop_crossbow: + name: '&7Elf Dark-bow' + lore: + - '&7The special projectiles that the bow' + - '&7uses are both sharp and blunt.' +primis_pontis_elf_drop_helmet: + name: '&7Elf Helmet' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_elf_drop_leggings: + name: '&7Elf Leggings' + lore: + - '&7You feel strange energy' + - '&7coming from the armor.' +primis_pontis_fields_berry_charm: + name: '&dLarge Berry' + lore: + - '&dThe fresh odor this berry emits' + - '&dcan be smelled from miles away.' + - '&dThe odor seems to have a calming' + - '&deffect on monsters and beasts.' + - '&dIt makes their attacks less vicious.' +primis_pontis_groves_brood_moher_drop_charm: + name: '&aCrawlers Torment' + lore: + - '&aThe silk radiates strong energy.' +primis_pontis_groves_nest_crawler_drop_shield: + name: '&7Magma''s Lure' + lore: + - '&7When the shield is held up' + - '&7it lures monsters into striking it.' +primis_pontis_groves_spider_boots_reward: + name: '&1Spider-legs Boots' + lore: + - '&1Boots made from spider legs and leather.' +primis_pontis_groves_tree_climbing_elf_bandits_reward_leggings: + name: '&aElf Pearl Leggings' + lore: + - '&aProtective leggings' + - '&aadorned with pearls.' +primis_pontis_mille_arena_knowledge: + name: '&2Knowledge' + lore: + - '&aImportant Knowledge.' +primis_pontis_mille_arena_reward_1: + name: '&4Star Touched Shield' + lore: + - '&7An ornate shield with a cosmos motive.' +primis_pontis_mille_arena_reward_2: + name: '&4Star Touched Chestplate' + lore: + - '&7A thousand tiny spiky stars stretch across the Chestplate.' +primis_pontis_mille_arena_reward_3: + name: '&4Star Touched Leggings' + lore: + - '&7The leggings sparkle like the stars in the sky.' +primis_pontis_mille_cat_quest_reward_charm: + name: '&9Cat''s Blessing' + lore: + - '&9If you hold it up all the' + - '&9way to your ear you can' + - '&9hear a slight purr.' +primis_pontis_mille_counselor_sword: + name: '&eStone of Far-speech' + lore: + - '&aYou can sense a presence coming from the stone.' +primis_pontis_mille_fields_beasts_reward_chest: + name: '&eHunters Pride' + lore: + - '&eThose who hunt cannot be the prey.' +primis_pontis_mille_fields_contest_berry: + name: '&dContest Berry' + lore: + - '&dA beautiful and very large berry.' + - '&dTruly a one in a million specimen.' +primis_pontis_mille_fields_do_it_yourself_reward_bow: + name: '&cHunters Bow' + lore: + - '&cA finely crafted bow.' + - '&cArrows fired from this' + - '&cbow will hurt any beast.' +primis_pontis_mille_fields_first_aid: + name: '&2First Aid Equipment' + lore: + - '&fEverything one would need" - "&fto treat serious injuries.' +primis_pontis_mille_fields_rat_drop_helmet: + name: '&fFeathered Rat Cap' + lore: + - '&fYou managed to make a' + - '&fcap out of your prey.' + - '&fHaving extracted the preys' + - '&fblinding properties, you have made' + - '&fit work in your favor.' +primis_pontis_mille_fields_rat_meat: + name: '&cRat Meat' + lore: + - Raw rat meat. No need to cook. +primis_pontis_mille_fields_stolen_berries: + name: '&4Stolen Berries' + lore: + - '&fIt''s the stolen berries' +primis_pontis_mille_fish_nets: + name: '&2Fish Nets' + lore: + - '&aCatching fish made easy!' +primis_pontis_mille_fresh_rat: + name: '&fFresh Rat' + lore: + - The cat will love this. +primis_pontis_mille_mines_goblined_up_in_the_maze_reward_axe: + name: '&aRuned Goblin Axe' + lore: + - '&aThere are runes etched into the axe handle.' + - '&aThey are quite faded by now.' + - '&aSeems like this axe was cursed at one point...' +primis_pontis_mille_mines_goblin_head: + name: '&2Fowl Goblin Feathers' + lore: + - '&aSo soft and prickly.' +primis_pontis_mille_parkour_reward_boots: + name: '&4Diamond Tree Boots' + lore: + - '&7Boots made out of special soft bark.' + - '&7Decorated with gems.' +primis_pontis_mille_reward_boots: + name: '&4Pontis Mille Boots' + lore: + - '&7Traditional Pontis Mille Boots' +primis_pontis_mille_reward_chest: + name: '&4Pontis Mille Chestplate' + lore: + - '&7A traditional Pontis Mille Chestplate' +primis_pontis_mille_reward_helmet: + name: '&4Pontis Mille Helm' + lore: + - '&7A traditional Pontis Mille Helm' +primis_pontis_mille_reward_leggings: + name: '&4Pontis Mille Leggings' + lore: + - '&7Traditional Pontis Mille Leggings' +primis_pontis_mille_reward_shield: + name: '&4Pontis Mille Shield' + lore: + - '&7A traditional Pontis Mille Shield' +primis_pontis_mille_reward_sword: + name: '&4Pontis Mille Katana' + lore: + - '&7Incredibly sharp' +primis_pontis_mille_serious_sewage_reward_helmet: + name: '&2Turtle Shell Helm' + lore: + - '&2Makes you wanna eat some pizza.' +primis_pontis_mille_sewage_keys: + name: '&2Sewage Keys' + lore: + - '&aA key ring with a lot of keys on it.' +primis_pontis_mille_sewers_ninja_drop_chestplate: + name: '&7Ninja Garb Chest-plate' + lore: + - Now you too are a Ninja +primis_pontis_mille_sewers_ninja_drop_leggings: + name: '&7Ninja Garb Leggings' + lore: + - Now you too are a Ninja +primis_pontis_mille_sewers_shredder_drop: + name: '&4Shredding Helmet' + lore: + - Full of small tiny razor blade + - like points on the exterior. +primis_pontis_mille_slums_chest_sword: + name: '&4Dull Pontis Mille Katana' + lore: + - '&7Incredibly sharp' +primis_pontis_mille_to_lycan_or_not_to_lycan_reward: + name: '&aFur Leggings' + lore: + - '&aTough and light' + - '&aMade out of fur and hide.' +primis_pontis_mines_goblin_drop_boots: + name: '&7Goblin Boots' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_chestplate: + name: '&7Goblin Chest-Plate' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_helmet: + name: '&7Goblin Helmet' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_leggings: + name: '&7Goblin Leggings' + lore: + - '&7It looks like someone took an iron ingot' + - '&7and pummeled it into the correct shape.' +primis_pontis_mines_goblin_drop_spear: + name: '&7Goblin Spear' + lore: + - '&7A nice and sharp stone at the end.' +primis_pontis_mines_goblin_drop_sword: + name: '&7Goblin Sword' + lore: + - '&7It''''s just a stone club with a handle.' +primis_pontis_redwoods_nasty_little_bandits_reward_boots: + name: '&2Forest Boots' + lore: + - '&2The boots seem to be made' + - '&2out of soft bark, leaves' + - '&2and crystallized tree sap.' +primis_pontis_redwoods_spider_legs: + name: '&2Spider Legs' + lore: + - '&aIt is just spider legs...' +primis_pontis_redwoods_tobacco: + name: '&2Premium Tobacco' + lore: + - '&aSmells amazing...' +primis_pontis_redwoods_watch: + name: '&2Sturdy Pocket Watch' + lore: + - '&aSuprisingly light and sturdy.' +primis_pontis_redwoods_werewolf_drop_chestplate: + name: '&7Fur Chest-Plate' + lore: + - '&7Made out of tough fur and hide.' + - '&7Light, but very tough.' +primis_roughspun_boots: + name: '&5Roughspun Boots' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_roughspun_chestplate: + name: '&5Roughspun Chestplate' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_roughspun_helmet: + name: '&5Roughspun Helmet' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_roughspun_leggings: + name: '&5Roughspun Leggings' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_ruins_bow: + name: '&8Ruined Bow' + lore: + - An old bow. Might've been good at some point. +primis_ruins_diary_entry: + name: Diary page + lore: + - '... I now regret chasing after the treasure in these ruins.' + - Now that I have fallen and broken my legs, it would seem + - as though I am fated to die under the treasure I sought. + - If only I had paid more attention during parkour class! +primis_ruin_relic_boots: + name: '&bRuin Relic Boots' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_ruin_relic_chestplate: + name: '&bRuin Relic Chestplate' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_ruin_relic_helmet: + name: '&bRuin Relic Helmet' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_ruin_relic_leggings: + name: '&bRuin Relic Leggings' + lore: + - '&6Buried with the ruins.' + - '&6Imbued with ancient power.' +primis_rusty_mail_boots: + name: '&3Rusty Mail Boots' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_rusty_mail_chestplate: + name: '&3Rusty Mail Chestplate' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_rusty_mail_helmet: + name: '&3Rough Mail Helmet' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_rusty_mail_leggings: + name: '&3Rough Mail Leggings' + lore: + - '&9Rusty but durable, beats' + - '&9leather scraps!' +primis_starter_boots: + name: '&4Shipwreck''s Boots' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_chestplate: + name: '&4Shipwreck''s Chestplate' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_helmet: + name: '&4Shipwreck''s Helmet' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_leggings: + name: '&4Shipwreck''s Leggings' + lore: + - '&aThese leather scraps barely count as armor.' +primis_starter_sword: + name: '&4Shipwreck''s Sword' + lore: + - '&aPossibly improvised from the beached remains of a ship!' +primis_storm_temple_drop_axe: + name: '&bStorm Axe' + lore: + - '&bThe wind shall repel them.' +primis_storm_temple_drop_boots: + name: '&bStorm Boots' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_storm_temple_drop_charm: + name: '&bStorm Necklace' + lore: + - '&bThe power of the storm.' +primis_storm_temple_drop_chestplate: + name: '&bStorm Chest-plate' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_storm_temple_drop_helmet: + name: '&bStorm Helmet' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_storm_temple_drop_leggings: + name: '&bStorm Leggings' + lore: + - '&bThe Storm Temple' + - '&bspared no expense.' +primis_terravilla_big_trouble_in_little_pub_reward_leggings: + name: '&eEarth''s Blessing' + lore: + - '&eLooks heavy but it is' + - '&esurprisingly light.' + - '&eIt is clear that these' + - '&eleggings are at least a' + - '&efew centuries old.' +primis_terravilla_drowning_terror_reward_charm: + name: '&aFish Charm' + lore: + - '&aFishy.' +primis_terravilla_hog_on_my_porch_reward_helmet: + name: '&6Hog Helmet' + lore: + - '&6Made out of tough Razorback leather.' +primis_terravilla_perfect_sample: + name: '&ePerfect Sample' + lore: + - '&eIt looks like a fish...' + - '&eBut it sure isn''t...' +primis_terravilla_strike_the_earth_reward_sword: + name: '&5Earth Splitter' + lore: + - '&5You pulled this blade out of' + - '&5the Earth Elementals corpse.' + - '&5Unlike it''s dull twin, this' + - '&5blade is in pristine condition.' +primis_terravilla_taking_out_the_trash_reward_sword: + name: '&9Earth Splitter' + lore: + - '&9Looks ancient and dull.' +primis_terravilla_two_legged_terror_growth: + name: '&eTwo Legged Terror Growth' + lore: + - '&eLarge fleshy growth.' +primis_terravilla_two_legged_terror_sample: + name: '&eTwo Legged Terror Sample' + lore: + - '&eIt''s a simple sample.' +primis_wolf_hide_boots: + name: '&5Wolf Hide Slippers' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_wolf_hide_chestplate: + name: '&5Wolf Hide Gambeson' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_wolf_hide_helmet: + name: '&5Wolf Hide Helmet' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +primis_wolf_hide_leggings: + name: '&5Wolf Hide Pants' + lore: + - '&dWorn and weathered, beats' + - '&dno armor at all!' +pufferfish_drop_helmet: + name: '&bPuffer Helm' + lore: + - '&bOnce a fish, now a helmet.' +rabbit_charm: + name: '&bRabbit Charm' + lore: + - '&aWith this charm, just about' + - '&aany destination is only a hop,' + - '&askip and a jump away!' +rabbit_wolf_drop_chestplate: + name: '&6Electrically Charged Chestplate' + lore: + - '&6As long as you don''t mind a' + - '&6casual zap here and there.' +rabbit_wolf_drop_leggings: + name: '&6Flame Licked Leggings' + lore: + - '&6Just lightly scorched.' +regular_hoglin_drop_boots: + name: '&eHog Boots' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_chestplate: + name: '&eHog Armor' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_helmet: + name: '&eHog Hood' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_leggings: + name: '&eHog Leggings' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +rod_of_the_depths: + name: '&3Rod of the Depths' + lore: + - '&3You want to hear about where' + - '&3I got this from? Sit down lad,' + - '&3I''ve got a tale for ye...' +rotting_diver_drop_hoe: + name: '&bDivers Hoe' + lore: + - '&bFound on the Rotting Divers corpse.' +salamander_charm: + name: '&bSalamander Charm' + lore: + - '&aAlmost as hot as MagmaGuy''s' + - '&anew mixtape!' +salty_corpse_drop_helmet: + name: '&aStinky Helm' + lore: + - '&aYou''re not sure why' + - '&ayou decided to pull' + - '&athis off of the corpse.' +scorpion_charm: + name: '&bScorpion Charm' + lore: + - '&aFloat like a butterfly,' + - '&asting like a bee,' + - '&apoison like a potato!' +shulker_charm: + name: '&bShulker Charm' + lore: + - '&aI believe I can fly' + - '&aI believe I can touch the sky' + - '&aAnd you''re coming with me!' +skeleton_knight_drop_helmet: + name: '&fKnights Honor' + lore: + - '&fA knights helmet. Made to last.' +sky_archer_drop_bow: + name: '&aSky Bow' + lore: + - '&aGood for keeping phantoms at bay.' +slowpoke_charm: + name: '&bSlowpoke Charm' + lore: + - '&aLet''s just hope it doesn''t hit' + - '&aitself in its confusion...' +spider_knight_drop_helmet: + name: '&aSmall Helmet' + lore: + - '&aA decent helmet. Maybe, a bit tight.' +stacked_bones_drop_helmet: + name: '&6Skull' + lore: + - '&6Large enough to fit your' + - '&6head inside, so why not.' +summon_merchant_scroll: + name: '&6Summon Merchant Scroll' + lore: + - '&aNeed to sell an item?' + - '&aRight-click to activate' + - '&aor yell &9Jeeves!' +summon_wolf_scroll: + name: '&6Summon Wolf Scroll' + lore: + - '&aSummons a good boy' + - '&ato help you bite Elites!' + - '&aMake sure you pet it!' +super_mite_drop_charm: + name: '&dMite Pearl' + lore: + - '&dWas it worth it...' +air_ship_air_buccaneer_boots: + name: '&5Air Bucanneer''s Boots' + lore: + - '&dPerfect for air raids!' +air_ship_air_buccaneer_chestplate: + name: '&5Air Bucanneer''s Chestplate' + lore: + - '&dPerfect for air raids!' +air_ship_air_buccaneer_helmet: + name: '&5Air Bucanneer''s Helmet' + lore: + - '&dPerfect for air raids!' +air_ship_air_buccaneer_leggings: + name: '&5Air Bucanneer''s Leggings' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_boots: + name: '&5Air Pirate''s Boots' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_chestplate: + name: '&5Air Pirate''s Chestplate' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_helmet: + name: '&5Air Pirate''s Helmet' + lore: + - '&dPerfect for air raids!' +air_ship_air_pirates_leggings: + name: '&5Air Pirate''s Leggings' + lore: + - '&dPerfect for air raids!' +air_ship_bowsmans_bow: + name: '&2Bowsman''s Bow' + lore: + - '&aDropped by the late' + - '&aairship bowsman!' +air_ship_cannon_powder: + name: '&cCannon Powder' + lore: + - '&8How else are you supposed' + - '&8to light the fuse?' +air_ship_daveys_digger: + name: '&4Davey''s Digger' + lore: + - '&cDavey doesn''t desire downtrodden' + - '&cdunderheads displaying his digger.' +air_ship_quartermasters_whip: + name: '&fQuartermaster''s Whip' + lore: + - '&7The quartermaster has a ' + - '&7schedule to keep.' +air_ship_wayfinders_windlass: + name: '&3Wayfinder''s Windlass' + lore: + - '&bUsed to guide ships' + - '&bwith nothing but the stars!' +pirate_ship_sea_feast: + name: '&6Sea feast' + lore: + - '&6A feast for the eyes' + - '&6and the health bar!' +pirate_ship_sea_ration: + name: '&eSea ration' + lore: + - '&eAn apple a day' + - '&ekeep the scurvy away' + - '&cNote: it does not' +catacombs_tier_10_miniboss_boots: + name: '&9Spiderweave boots' + lore: + - '&5As light as air!' +catacombs_tier_10_miniboss_spider_eye: + name: '&7Terragog''s eye' + lore: + - '&7Whispers from nowhere reach' + - '&7your ears while holding this...' +catacombs_tier_15_boss_bone: + name: The Picker + lore: + - '&fYou''ve got a bone to pick!' +catacombs_tier_15_boss_bow: + name: '&6The Bone Shaker' + lore: + - '&fThey''ll feel this one down to' + - '&ftheir bones!' +catacombs_tier_15_boss_shovel: + name: '&8Gravedigger' + lore: + - '&fThey''ll feel this one down to' + - '&ftheir bones!' +catacombs_tier_15_mimic_boss_shield: + name: '&3Shield of the lost Templar' + lore: + - Found in a mysterious chest in a + - secret room of ancient catacombs... +colosseum_pit_breaker: + name: '&4Pit Shatterer' + lore: + - '&4Veni' +colosseum_pit_filler: + name: '&4&lPit Filler' + lore: + - '&4Vici' +colosseum_pit_maker: + name: '&4&lPit Maker' + lore: + - '&4Vidi' +dark_cathedral_tier_75_sword: + name: '&0Cursed Sword' + lore: + - '&0&kChtulhu is the one true God.' + - '&0&kThis world is but a lamb' + - '&0&kto the slaughter' +darkspire_arzags_boots: + name: '&8Arzag''s War Boots' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_chestplate: + name: '&8Arzag''s War Chestplate' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_helmet: + name: '&8Arzag''s War Helmet' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_leggings: + name: '&8Arzag''s War Leggings' + lore: + - '&7Once worn by the might Arzag!' +darkspire_arzags_slicer: + name: '&8Arzag''s Slicer' + lore: + - '&7Once used by the might Arzag!' +darkspire_crypt_keepers_boots: + name: '&4Crypt Keeper''s Boots' + lore: + - '&cFormerly the boots of the' + - '&ccorrupt Crypt Keeper!' +darkspire_hellraisers_battle_armor: + name: '&4Eerbix''s Battle Armor' + lore: + - '&cFormerly the battle' + - '&carmor of the egregious' + - '&cEerbix the Fallen!' +darkspire_maalkvs_bow: + name: '&4Maalkv''s Bow' + lore: + - '&cFormerly the bow of the' + - '&cmischievous Maalkv!' +darkspire_netherite_axe: + name: '&8Void Eviscerator' + lore: + - '&8Shards of the void itself were' + - '&8collected to form the cleaving' + - '&8head of this ancient weapon.' +darkspire_nicolas_ribcages_helmet: + name: '&4Nicolas Ribcage''s Helmet' + lore: + - '&cFormerly the helmet of the' + - '&cnefarious Nicolas Ribcage!' +darkspire_oroxaks_sword: + name: '&4Oroxak''s Sword' + lore: + - '&cFormerly the sword of the' + - '&codious Oroxak!' +darkspire_zalmurs_leggings: + name: '&4Zalmur''s Leggings' + lore: + - '&cFormerly the leggings of' + - '&cthe zealous Zalmur' + - '&cthe Impslayer!' +the_feller: + name: '&2The Feller' + lore: + - '&aEven in your sleep,' + - '&ayou can feel this axe''''s' + - '&asaplust' +the_great_weaver_drop_charm: + name: '&cWeavers Silk' + lore: + - '&cGreat power is imbued into this silk.' +hallosseum_amazing_treat: + name: '&aAmazing Treat!' + lore: + - '&eAn amazing snack!' +hallosseum_axe_of_beheadings: + name: '&cAxe of Beheadings' + lore: + - '&4Famously used to decapitate a' + - '&4certain headless horseman!' +hallosseum_incredible_treat: + name: '&aIncredible Treat!' + lore: + - '&eAn incredible snack!' +hallosseum_treat: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +hallosseum_treat_v2: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +the_hunter_drop_crossbow: + name: '&aHunter''s Friend' + lore: + - '&aLet the hunt begin.' +northpole_amazing_treat: + name: '&aAmazing Treat!' + lore: + - '&eAn amazing snack!' +northpole_coalbringer: + name: '&8Coalbringer' + lore: + - '&cWhatever I touch' + - '&cStarts to melt in my clutch.' + - '&cI''m too much!' +northpole_frostcaster: + name: '&bFrostcaster' + lore: + - '&7Whatever I touch' + - '&7Turns to snow in my clutch!' + - '&7I''m too much' +northpole_incredible_treat: + name: '&aIncredible Treat!' + lore: + - '&eAn incredible snack!' +northpole_naughty_lister: + name: '&4The Naughty Lister' + lore: + - '&cTakes names. Doesn''t ask twice!' + - '&cHave you been naughty this year?' +northpole_treat: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +northpole_treat_v2: + name: '&aTreat!' + lore: + - '&eA delicious snack!' +the_phantom_drop_chestplate: + name: '&dPhantom Gambison' + lore: + - '&dYou would say it is made out of soft' + - '&dand comfy fibrous cloth, but a blade' + - '&dwould not recoil from striking cloth.' +pirate_ship_tier_15_boots: + name: Pirate Sandals + lore: + - Make you want to + - go to the beach! +pirate_ship_tier_15_bow: + name: Pirate shortbow + lore: + - Perfect for boarding parties! +pirate_ship_tier_15_chestplate: + name: Pirate Shirt + lore: + - No shoes, no shirt + - no problem! +pirate_ship_tier_15_helmet: + name: Pirate Bandana + lore: + - No shoes, no shirt + - no problem! +pirate_ship_tier_15_leggings: + name: Pirate Sash + lore: + - These could use a wash! +pirate_ship_tier_15_sword: + name: Pirate marlinspike + lore: + - Loud and deadly! +pirate_ship_tier_20_miniboss_axe: + name: '&5Cookie''s Tenderizer' + lore: + - '&5You''ll feel that tomorrow!' +pirate_ship_tier_20_miniboss_chestplate: + name: '&5Cookie''s apron' + lore: + - '&5Has seen better days!' +pirate_ship_tier_25_boots: + name: '&aPirate shoes' + lore: + - '&aPerfect for thieving!' +pirate_ship_tier_25_bow: + name: '&aPirate musket' + lore: + - '&aCareful where you point it!' +pirate_ship_tier_25_chestplate: + name: '&aPirate vest' + lore: + - '&aProbably illegally obtained!' +pirate_ship_tier_25_helmet: + name: '&aPirate earrings' + lore: + - '&aWorth enough to pay for' + - '&aa funeral!' +pirate_ship_tier_25_leggings: + name: '&aPirate trousers' + lore: + - '&aFull of gold coins!' +pirate_ship_tier_25_miniboss_helmet: + name: '&5Helmsman''s Eyepatch' + lore: + - '&5How can you see better' + - '&5with it on!?' +pirate_ship_tier_25_miniboss_trident: + name: '&5Helmsman''s Trident' + lore: + - '&5Pointy end towards the enemy!' +pirate_ship_tier_25_sword: + name: '&aPirate cutlass' + lore: + - '&aTruly piratey!' +pirate_ship_tier_30_miniboss_axe: + name: '&5Crushy''s Chopper' + lore: + - '&5Step back!' +pirate_ship_tier_30_miniboss_shield: + name: '&5Crushy''s Shoulder' + lore: + - '&5Never skipped shoulder day!' +pirate_ship_tier_35_boots: + name: '&9Pirate boots' + lore: + - '&9Perfect for swashbuckling!' +pirate_ship_tier_35_bow: + name: '&9Pirate handcannon' + lore: + - '&9Blast em away!' +pirate_ship_tier_35_chestplate: + name: '&9Pirate straps' + lore: + - '&9Perfect for looting!' +pirate_ship_tier_35_helmet: + name: '&9Pirate eyepatch' + lore: + - '&9Not perfect for seeing!' +pirate_ship_tier_35_leggings: + name: '&9Pirate greaves' + lore: + - '&9Perfect for looting!' +pirate_ship_tier_35_miniboss_boots: + name: '&9Bodyguard''s boots' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_chestplate: + name: '&5Bodyguard''s straps' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_crossbow: + name: '&5Bodyguard''s handcannon' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_helmet: + name: '&5Bodyguard''s eyepatch' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_miniboss_leggings: + name: '&5Bodyguard''s greaves' + lore: + - '&9For those with something to defend!' +pirate_ship_tier_35_miniboss_sword: + name: '&5Bodyguard''s cutlass' + lore: + - '&5For those with something to defend!' +pirate_ship_tier_35_sword: + name: '&9Pirate cutlass' + lore: + - '&9Truly piratey!' +pirate_ship_tier_40_miniboss_crossbow: + name: '&5The Blunderbuss' + lore: + - '&5Spray ''n pray!' +pirate_ship_tier_40_miniboss_leggings: + name: '&5The Zaggers' + lore: + - '&5When they think you''re going!' + - '&5to zig, zag on them!' +pirate_ship_tier_45_boss_helmet: + name: '&5Captain''s eyepatch' + lore: + - '&5I don''t see any issues!' +pirate_ship_tier_45_boss_sword: + name: '&5Captain''s scimitar' + lore: + - '&5En garde, ye scurvy rats!' +the_ruins_boss_loot: + name: '&6Thor''s Axe' + lore: + - Only the pure of heart + - can wield this axe. +sewer_drowned_kings_boots: + name: '&4Drowned King''s Boots' + lore: + - '&cFormerly the boots of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_chestplate: + name: '&4Drowned King''s Chestplate' + lore: + - '&cFormerly the chestplate of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_crown: + name: '&4Drowned King''s Crown' + lore: + - '&cFormerly the crown of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_leggings: + name: '&4Drowned King''s Leggings' + lore: + - '&cFormerly the leggings of the' + - '&cdevilish Drowned King!' +sewer_drowned_kings_trident: + name: '&4Drowned King''s Trident' + lore: + - '&cFormerly the trident of the' + - '&cdevilish Drowned King!' +sewer_spelunkers_boots: + name: '&2Sewer Spelunker''s Boots' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential leggings!' +sewer_spelunkers_chestplate: + name: '&2Sewer Spelunker''s Chestplate' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential chestplate!' +sewer_spelunkers_helmet: + name: '&2Sewer Spelunker''s Helmet' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential helmet!' +sewer_spelunkers_leggings: + name: '&2Sewer Spelunker''s Leggings' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential leggings!' +sewer_spelunkers_sword: + name: '&2Sewer Spelunker''s Sword' + lore: + - '&aThe up and coming sewer' + - '&aexplorer''s essential sword!' +the_stinger: + name: '&eThe Stinger' + lore: + - '&aFloat like a butterfly,' + - '&asting like a bee!' +tree_defender_drop_shield: + name: '&7Living Wood Shield' + lore: + - '&7This shield will' + - '&7slowly repair itself.' +unbind_scroll: + name: '&5Unbind Scroll' + lore: + - '&5Allows users to unbind one' + - '&5soulbound item at an anvil!' + - '&5Use wisely!' +undead_farmer_drop_shovel: + name: '&8Manure Master' + lore: + - '&8Perfect for shoveling pig manure.' +unwanted_visitor_drop_bow: + name: '&1Frost Bow' + lore: + - '&9Makes you wanna chill' + - '&9and snipe from afar.' +vampire_manor_gargoyle_granulator: + name: '&8Gargoyle Granulator' + lore: + - '&cLightly dusted in garlic.' +vampire_manor_stake_your_claim: + name: '&4Stake your Claim' + lore: + - '&cLightly dusted in garlic.' +vampiric_charm: + name: '&bVampiric Charm' + lore: + - '&aNo one can remember where this' + - '&acame from, and no one can,' + - '&aforget how dangerous it is...' +veterans_boots: + name: '&6Veteran''s Boots' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_chestplate: + name: '&6Veteran''s Chestplate' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_helmet: + name: '&6Veteran''s Helmet' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_leggings: + name: '&6Veteran''s Leggings' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +veterans_sword: + name: '&6Veteran''s Sword' + lore: + - '&2Awarded to those who challenge the' + - '&2Wood League Arena!' +vex_top_drop_boots: + name: '&bVexed Boots' + lore: + - '&bWith mighty boots' + - '&bcomes mighty strength.' +warlock_drop_chestplate: + name: '&dWarlock Robes' + lore: + - '&dOffers good protection from spells.' +warlock_drop_helmet: + name: '&dWarlock Hood' + lore: + - '&dOffers good protection from spells.' +water_pest_drop_shield: + name: '&bWater Logged Shield' + lore: + - '&bIt''s pretty sturdy actually.' +wendigo_drop_sword: + name: '&8Blade of Starving' + lore: + - '&8This blade will always' + - '&8hunger for more blood.' +werehare_drop_charm: + name: '&eWerehare Trophy' + lore: + - '&eLuck and health to' + - 'ðose who carry it.' +werewolf_bone: + name: '&6Werewolf Bone' + lore: + - '&aHaving killed the alpha,' + - '&athis temporarily makes you!' + - '&athe wolves'' new leader' +wolfsbane: + name: '&7Wolfsbane' + lore: + - '&aMade from the remains of' + - '&aan alpha werewolf, all' + - '&awolves cower at the sight of it.' +yeti_drop_leggings: + name: '&eFur Leggings' + lore: + - '&eNice and warm.' +yezhi_baba_drop_boots: + name: '&aWitches Robes' + lore: + - '&aThe smell should go' + - '&aaway eventually.' +zombie_kings_axe: + name: '&4Zombie King''s Axe' + lore: + - The axe of the one Zombies + - call their king. + - The bloodlust is palpable. +airship_minidungeon: + name: '&6The Airship' + customInfo: + - '&fAn awesome airship full of undead pirates!' + - '&6Credits: MagmaGuy, 69OzCanOfBepis' + - '&6and Realm of Lotheridon' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &6An awesome airship full of undead pirates + &6for experienced players! + regionEnterMessage: '&8[EM] &cEntering hostile air zone!' + regionLeaveMessage: '&8[EM] &cLeaving hostile air zone!' +binder_of_worlds_lair: + name: '&5Binder Of Worlds' + customInfo: + - '&5The ultimate challenge. Be prepared!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Nightmare + $bossCount level $highestTier final boss! + &5This is the hardest fight in EliteMobs! + regionEnterMessage: '&8[EM] &5Reality unravels around you. You face the final challenge. &4You are not prepared!' + regionLeaveMessage: '&8[EM] &5You have left the unravelling. Did you find what you sought? Was it worth it?' +catacombs_lair: + name: '&8The Catacombs' + customInfo: + - '&fЛучшее начальное подземелье для игроков!' + - '&6Credits: Realm of Lotheridon' + playerInfo: |- + Difficulty: &cHard + $bossCount bosses, from tier $lowestTier to $highestTier + &2The best Lair challenge for groups of beginners! + regionEnterMessage: '&8[EM] &8В Катакомбы. Будьте внимательны с тем, что находится ниже...' + regionLeaveMessage: '&8[EM] &8You have left the Catacombs. Was it worth it?' +colosseum_lair: + name: '&6The Colosseum' + customInfo: + - '&fFeaturing the first true World boss, first' + - '&fmulti-phased battle, first mounted boss,' + - '&ffirst disguised boss... a truly epic fight!' + - '&6Credits: MagmaGuy & Maldini' + playerInfo: |- + Difficulty: &cHard + $bossCount bosses, from level $lowestTier to $highestTier + &cA true challenge for big groups of players! + regionEnterMessage: '&8[EM] &6Champions and challengers prepare! &eProve your worth against the most mighty of foes!' + regionLeaveMessage: '&8[EM] &6Farewell traveller! &eReturn soon to show your might once more!' +dark_cathedral_lair: + name: '&8The Dark Cathedral' + customInfo: + - '&fThe first ever EliteMobs Lair!' + - '&fA classic that all servers need!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &cHard + $bossCount level $highestTier Big Boss! + &cThe original minidungeon, a challenge for + &ca group of players or for veterans! + regionEnterMessage: '&8[EM] &8Welcome to the Dark Cathedral. &4Death awaits inside...' + regionLeaveMessage: '&8[EM] &8Now leaving the Dark Cathedral. &4It awaits your return...' +dark_spire_minidungeon: + name: '&8The Dark Spire' + customInfo: + - '&fThe first ever high level content!' + - '&fMade for those who want a real challenge!' + - '&6Credits: 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &cA vast challenge for advanced players! + regionEnterMessage: '&8[EM] &1An invasion is in progress. &9Stop the insurrection!' + regionLeaveMessage: '&8[EM] &1You managed to hold them back. &9For now...' +fireworks_lair: + name: '&aFireworks' + customInfo: + - '&fThe 2021 4th of July map!' + - '&6Credits: MagmaGuy' + playerInfo: |- + Difficulty: &cHard + $bossCount level $lowestTier Big Boss! + &6An encounter full of explosions! + regionEnterMessage: '&8[EM] &eWelcome to the fireworks show!' + regionLeaveMessage: '&8[EM] &eYou''ve left the party!' +frost_palace_sanctum: + name: Frost Palace + customInfo: + - '&fA 7 phase fight against' + - the queen of ice! + - '&6Credits: MagmaGuy, Delio' + playerInfo: 'Difficulty: &45-man hard content!' + regionEnterMessage: '&bYou are stepping into the Frost Palace! Stay frosty!' + regionLeaveMessage: '&bYou have left the Frost Palace!' +hallosseum_lair: + name: '&cHallosseum' + customInfo: + - '&fThe 2020 spooky halloween encounter!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &chard + $bossCount level $lowestTier Big Boss! + &6A fun Halloween challenge! + regionEnterMessage: '&8[EM] &4Trick or treat! &8Your soul is mine!' + regionLeaveMessage: '&8[EM] &4You''ve escaped with your soul intact.' +invasion_minidungeon: + name: '&2The Invasion' + customInfo: + - '&fThe Halloween Minidungeon!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount aliens, from level $lowestTier to $highestTier + &6Don't get abducted! + regionEnterMessage: '&8[EM] &7Alien invasion in progress! Defeat the Mothership!' + regionLeaveMessage: '&8[EM] &7You have escaped the alien abductions! No one will ever believe you.' +north_pole_minidungeon: + name: '&9The North Pole' + customInfo: + - '&fThe Christmas minidungeon!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &6Christmas in a snow globe! + regionEnterMessage: '&8[EM] &7You have reached the North Pole! &fHave you been naughty this year?' + regionLeaveMessage: '&8[EM] &7Come back and visit. &fThere are plenty of sweets and treats for next time!' +oasis_adventure: + name: '&6The Oasis' + customInfo: + - '&fA massive adventure for beginners!' + - '&6Credits: 69OzCanOfBepis' + playerInfo: |- + Difficulty: &2Solo-able + $bossCount bosses, from level $lowestTier to $highestTier + &6A big adventure for people who know the ropes! + regionEnterMessage: '&8[EM] &6You have arrived at the Oasis!' + regionLeaveMessage: '&8[EM] &6You have left the Oasis!' +pirate_ship_minidungeon: + name: '&6The Pirate Ship' + customInfo: + - '&fA fun, challenging minidungeon full of' + - '&fbosses made for players starting to get good,' + - '&fat EliteMobs!' + - '&6Credits: MagmaGuy & Realm of Lotheridon' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &6One of the best hunting grounds for&6aspiring adventurers! + regionEnterMessage: '&8[EM] &3Now boarding the Pirate Ship! &bPillage and plunder to yer'' hearts content!' + regionLeaveMessage: '&8[EM] &3Player overboard! &bReturn when you''ve earned your sea-legs ye'' landlubber!' +primis_adventure: + name: '&7Primis' + customInfo: + - '&fA tutorial adventure for new players!' + - '&6Credits: 69OzCanOfBepis, MagmaGuy' + playerInfo: |- + Difficulty: &2Easy + $bossCount bosses, from level $lowestTier to $highestTier + &6A tutorial adventure for new players! + regionEnterMessage: '&8[EM] &6Primis awaits, strike the earth!' + regionLeaveMessage: '&8[EM] &6You have left Primis!' +sewers_minidungeon: + name: '&8The Sewers' + customInfo: + - '&fThe biggest minidungeon ever made!' + - '&6Credits: MagmaGuy & 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &6A complex dungeon maze with a challenging sections! + regionEnterMessage: '&8[EM] &5This place looks abandoned... &dYet something lurks in these sewers!' + regionLeaveMessage: '&8[EM] &5You managed to stay above water. &dMaybe next time you''ll drown.' +the_ruins: + name: '&6The Ruins' + customInfo: + - '&fA fight against a myth from' + - '&fNorse mythology, be prepared for a smiting!' + - '&6Credits: 69OzCanOfBepis, MagmaGuy' + playerInfo: |- + Difficulty: &cHard + $bossCount level $lowestTier Big Boss! + &cA tough fight against a Norse god! + regionEnterMessage: '&8[EM] &3Those who challenge the myths must be prepared for their downfall!' + regionLeaveMessage: '&8[EM] &3You now know what it takes to make a legend!' +vampire_manor: + name: '&cThe Vampire Manor' + customInfo: + - '&fPrepare to spill blood!' + - '&6Credits: MagmaGuy, 69OzCanOfBepis' + playerInfo: |- + Difficulty: &6Medium + $bossCount bosses, from level $lowestTier to $highestTier + &6A deadly manor full of blood thristy creatures! + &6Are you ready to face that which haunts the night? + regionEnterMessage: '&8[EM] &cTrespassing on dangerous grounds!!' + regionLeaveMessage: '&8[EM] &cNow leaving haunted land!' +alpha_werewolf_p1: + name: '$eventBossLevel &7Enraged Vindicator' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Alpha Wolf has been put down!' + - '&c&l Третье место по урону: $damager1name &eс $damager1damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&aБыл убит: $players' + - '&e&l---------------------------------------------' + locationMessage: '&7Enraged Vindicator: $distance blocks away!' + spawnMessage: '&cThe howls of an Alpha Werewolf are heard!' + deathMessage: '&aThe Alpha Werewolf has been stopped by $players!' + escapeMessage: '&4Dawn breaks, the Alpha Wolf vanishes without a trace!' +alpha_werewolf_p2: + name: '$eventBossLevel &7Alpha Werewolf' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Alpha Wolf has been put down!' + - '&c&l Третье место по урону: $damager1name &eс $damager1damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&aБыл убит: $players' + - '&e&l---------------------------------------------' + locationMessage: '&7Alpha Wolf: $distance blocks away!' + spawnMessage: '&cThe howls of an Alpha Werewolf are heard!' + deathMessage: '&aThe Alpha Werewolf has been stopped by $players!' + escapeMessage: '&4Dawn breaks, the Alpha Wolf vanishes without a trace!' +ancient_corpse: + name: '$eventBossLevel &eAncient Corpse' +animated_armor: + name: '$eventBossLevel &8Animated Armor' + locationMessage: '&cAnimated Armor: $distance blocks away!' + spawnMessage: '&cOh no! An Animated Armor has escape from it''s armor stand!' + deathMessage: '&aThe Animated Armor was stopped by $players!' + escapeMessage: '&4The Animated Armor is gone!' +arachnid_matriarch: + name: '$eventBossLevel &cArachnid Matriarch' + locationMessage: '&cArachnid Matriarch: $distance blocks away!' + spawnMessage: '&cA Matriarch has come to spread her brood across the land!' + deathMessage: '&aThe Matriarch and her brood were stopped by $players!' + escapeMessage: '&4The Matriarch has left!' +arachnid_matriarch_summon: + name: '$eventBossLevel &4Broodling' +armor_goblin: + name: '$eventBossLevel &3Armor Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Armor Goblin has been pillaged!' + - '&c&l Третье место по урону: $damager1name &eс $damager1damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&aБыл убит: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cArmor Goblin: $distance blocks away!' + spawnMessage: '&cAn Armor Goblin has been sighted!' + deathMessage: '&aAn Armor Goblin has been slain by $players!' + escapeMessage: '&4An Armor Goblin has escaped!' +baba_rhoga: + name: '$eventBossLevel &cBaba Rhoga' + locationMessage: '&cBaba Rhoga: $distance blocks away!' + spawnMessage: '&cA wicked hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +baba_rhoga_summon: + name: '$reinforcementLevel &4Baba Rhoga' +baba_yaga: + name: '$eventBossLevel &cBaba Yaga' + locationMessage: '&cBaba Yaga: $distance blocks away!' + spawnMessage: '&cA wicked hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +baba_yaga_summon: + name: '$reinforcementLevel &4Baba Yaga' +balloon_rider: + name: '$eventBossLevel &dBalloon Rider' + locationMessage: '&cBalloon Rider: $distance blocks away!' + spawnMessage: '&cA brave Balloon Rider has come to the Nether!' + deathMessage: '&aThe Balloon Rider has taken his last ride thanks to $players!' + escapeMessage: '&4The Balloon Rider has floated away!' +balloon_rider_mount: + name: '$eventBossLevel &5Ghastly Balloon' +balrog: + name: '$eventBossLevel &4Balrog' +banshee: + name: '$eventBossLevel &cBanshee' + locationMessage: '&cBanshee: $distance blocks away!' + spawnMessage: '&cA Banshee''s wail can be heard!' + deathMessage: '&aThe Banshee was silenced by $players!' + escapeMessage: '&4The Banshee has left!' +banshee_summon: + name: '$eventBossLevel &cGrief' +beast_master: + name: '$eventBossLevel &6Beast Master' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Beast Master has been savaged!' + - '&c&l Третье место по урону: $damager1name &eс $damager1damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&aБыл убит: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cBeast Master: $distance blocks away!' + spawnMessage: '&cThe Beast Master has been sighted!' + deathMessage: '&aThe Best Master has been slain by $players!' + escapeMessage: '&4The Beast Master has returned to the wilds!' +beast_tamer: + name: '$eventBossLevel &eBeast Tamer' + locationMessage: '&cBeast Tamer: $distance blocks away!' + spawnMessage: '&cA master of beasts roams the world!' + deathMessage: '&aThe Beast Tamer was stopped by $players!' + escapeMessage: '&4The Beast Tamer has left!' +beast_tamer_summon: + name: '$eventBossLevel &6Large Beast' +beast_tamer_summon_1: + name: '$eventBossLevel &6Beast' +beta_wolf: + name: '$reinforcementLevel &7Beta Wolf' +bigfoot: + name: '$eventBossLevel &fBigfoot' + locationMessage: '&cBigfoot: $distance blocks away!' + spawnMessage: '&cA mighty beast has appeared!' + deathMessage: '&aThe beast is no more thanks to $players!.' + escapeMessage: '&4The beast has escaped!' +big_bad_wolf: + name: '$eventBossLevel &fBig Bad Wolf' + locationMessage: '&cBig Bad Wolf: $distance blocks away!' + spawnMessage: '&cAnd he huffed and he puffed!' + deathMessage: '&aThe little piggies are now safe thanks to $players!' + escapeMessage: '&4The Big Bad Wolf has left!' +binder_of_worlds_phase_1_endermite_reinforcement: + name: '$reinforcementLevel &5Разрушитель реальности' +binder_of_worlds_phase_3_enderman_reinforcement: + name: '$reinforcementLevel &5Убийца реальности' +binder_of_worlds_phase_3_ghast_reinforcement: + name: '$reinforcementLevel &5Измельчитель реальности' +blayyze: + name: '$eventBossLevel &6Бланза' + deathMessages: + - '&e&l---------------------------------------------' + - '&6Блайзер был разграблен!' + - '&c&l Третье место по урону: $damager1name &eс $damager1damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&aБыл убит: $players' + - '&e&l---------------------------------------------' + locationMessage: '&6????: $distance блоков осталось' + spawnMessage: '&cЧто-то вышло из кратера метеорита...' + deathMessage: '&6$players завершил первый контакт.' + escapeMessage: 'Аллиены были доставлены в зону 51!' +bloated_jeffrey: + name: '$eventBossLevel &dBloated Jeffrey' + locationMessage: '&cBloated Jeffrey: $distance blocks away!' + spawnMessage: '&cIt''s Jeffrey! They are in the nether! Bring a bow!' + deathMessage: '&aBloated Jeffrey has been slain by $players!' + escapeMessage: '&4Jeffrey and his friends grew bored and they left!' +bloated_jeffrey_summon: + name: '$eventBossLevel &dJeffrey''s Friend' +bone_fiend: + name: '$eventBossLevel &7Bone Fiend' + locationMessage: '&cBone Fiend: $distance blocks away!' + spawnMessage: '&cA creature of bone and bone has appeared!' + deathMessage: '&aThe Bone Fiend was defeated by $players!' + escapeMessage: '&4The Bone Fiend found no bone and left!' +bone_fiend_mount: + name: '$eventBossLevel &8Bone Carrier' +changeling: + name: '$eventBossLevel &4Changeling' + locationMessage: '&cChangeling: $distance blocks away!' + spawnMessage: '&cA shape-shifter has entered this world.' + deathMessage: '&aThe Changeling was stopped by $players!' + escapeMessage: '&4The Changeling has escaped!' +changeling_p2: + name: '$eventBossLevel &4Changeling' +changeling_p3: + name: '$eventBossLevel &4Changeling' +changeling_p4: + name: '$eventBossLevel &4Changeling' +changeling_p5: + name: '$eventBossLevel &4Changeling' +changeling_p6: + name: '$eventBossLevel &4Changeling' +changeling_p7: + name: '$eventBossLevel &4Changeling' +charms_goblin: + name: '$eventBossLevel &2Charms Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Charms Goblin has been pillaged!' + - '&c&l Третье место по урону: $damager1name &eс $damager1damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&aБыл убит: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cCharms Goblin: $distance blocks away!' + spawnMessage: '&cA Charms Goblin has been sighted!' + deathMessage: '&aA Charms Goblin has been slain by $players!' + escapeMessage: '&4A Charms Goblin has escaped!' +circus_ringmaster: + name: '$eventBossLevel &dRingmaster' + locationMessage: '&cCircus Ringmaster: $distance blocks away!' + spawnMessage: '&cA terrible circus is in town!' + deathMessage: '&a$players has stopped the RIngmasters reign of abuse!' + escapeMessage: '&4The circus has left town!' +circus_ringmaster_summon: + name: '$eventBossLevel &5Tortured Animal' +circus_ringmaster_summon_1: + name: '$eventBossLevel &5Abused Clown' +circus_ringmaster_summon_2: + name: '$eventBossLevel &5Mistreated Balloon' +coins_goblin: + name: '$eventBossLevel &eCoins Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Coins Goblin has been pillaged!' + - '&c&l Третье место по урону: $damager1name &eс $damager1damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&aБыл убит: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cCoins Goblin: $distance blocks away!' + spawnMessage: '&cA Coins Goblin has been sighted!' + deathMessage: '&aA Coins Goblin has been slain by $players!' + escapeMessage: '&4A Coins Goblin has escaped!' +craftenmine_stacked_bones: + name: '$eventBossLevel &eArmed Skull' + locationMessage: '&cDr. Craftenmine''s Stacked Bones: $distance blocks away!' + spawnMessage: '&cA horrible Dr. Craftenmine creation is out in the wild!' + deathMessage: '&aThe horrible Stacked-Bones creation was slain by $players!' + escapeMessage: '&4Dr. Craftenmines horrible creation has escaped!' +craftenmine_stacked_bones_ankle: + name: '$eventBossLevel &6Armed Ankle' +craftenmine_stacked_bones_backbone: + name: '$eventBossLevel &6Armed Backbone' +craftenmine_stacked_bones_femur: + name: '$eventBossLevel &6Armed Femur' +craftenmine_stacked_bones_spine: + name: '$eventBossLevel &6Armed Spine' +craftenmine_terror: + name: '$eventBossLevel &cLobotimized Ghast' + locationMessage: '&cDr. Craftenmine''s Terror: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine creation is on the loose!' + deathMessage: '&aThe Lobotimized Ghast was slain by $players!' + escapeMessage: '&4The Lobotimized Ghast has left!' +craftenmine_terror_mount: + name: '$eventBossLevel &dGhast Carrier' +creeperpede_1: + name: '$eventBossLevel &5Creeperpede Observer' + locationMessage: '&cCreeperpede: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine experiment is on the loose!' + deathMessage: '&aThe Creeperpede was stopped in its tracks by $players!.' + escapeMessage: '&4AThe Dr. Craftenmine experiment has managed to escape!' +creeperpede_2: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_3: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_4: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_5: + name: '$eventBossLevel &5Creeperpede Carrier' +crone: + name: '$eventBossLevel &aOld Crone' + locationMessage: '&cOld Crone: $distance blocks away!' + spawnMessage: '&cAn Old Crone has wandered into this world!' + deathMessage: '&aThe Crone was vanquished by $players!.' + escapeMessage: '&4The Old Crone has left this world on her broom!' +crone_summon: + name: '$eventBossLevel &fPet Spider' +divine_cinder: + name: '$eventBossLevel &cDivine Cinder' + locationMessage: '&cDivine Cinder: $distance blocks away!' + spawnMessage: '&cA divine blaze has appeared!' + deathMessage: '&aThe Divine Cinder was defeated by $players!' + escapeMessage: '&4The Divine Cinder has smoked away!' +ember: + name: '$reinforcementLevel &cEmber' +enders_1: + name: '$eventBossLevel &dEnderlad' + locationMessage: '&cEnder Clique: $distance blocks away!' + spawnMessage: '&cA group of ender troublemakers have appeared.' + deathMessage: '&aThe Ender Clique was stopped by $players!' + escapeMessage: '&4The Ender Clique have left!' +enders_2: + name: '$eventBossLevel &dEnderchap' + locationMessage: '&cClique Member: $distance blocks away!' +enders_3: + name: '$eventBossLevel &dEnderdude' + locationMessage: '&cClique Member: $distance blocks away!' +ender_lapin: + name: '$eventBossLevel &aEnder Lapin' +endless_pursuer: + name: '$eventBossLevel &dEndless Pursuer' + locationMessage: '&cEndless Pursuer: $distance blocks away!' + spawnMessage: '&cIt will not stop chasing...' + deathMessage: '&aThe chase has stopped thanks to $players!' + escapeMessage: '&4The Pursuer has vanished!' +enraged_snowman: + name: '$eventBossLevel &1Enraged Snowman' + locationMessage: '&cEnraged Snowman: $distance blocks away!' + spawnMessage: '&cAn angry Snowman was sighted!' + deathMessage: '&aThe Enraged Snowman was put to rest by $players!' + escapeMessage: '&4The Enraged Snowman has vanished!' +evil_undead: + name: '$eventBossLevel &cEvil Undead' + locationMessage: '&cEvil Undead: $distance blocks away!' + spawnMessage: '&cAn Evil Undead has appeared!' + deathMessage: '&aThe Evil Undead was put to rest by $players!' + escapeMessage: '&4The Evil Undead has escaped!' +evil_undead_p2: + name: '$eventBossLevel &cEvil Undead' + locationMessage: '&cEvil Undead: $distance blocks away!' + spawnMessage: '&cAn Evil Undead has appeared!' + deathMessage: '&aThe Evil Undead was put to rest by $players!' + escapeMessage: '&4The Evil Undead has escaped!' +fallen_knight: + name: '$eventBossLevel &7Fallen Knight' + locationMessage: '&cFallen Knight: $distance blocks away!' + spawnMessage: '&cA Fallen Knight rises from their grave!' + deathMessage: '&aA Fallen Knight has fallen to $players!.' + escapeMessage: '&4The Fallen Knight goes back to slumber!' +fine_swine: + name: '$eventBossLevel &eFine Swine' +fine_swine_summon: + name: '$eventBossLevel &eMighty Protector' +firestarter: + name: '$eventBossLevel &6Firestarter' + locationMessage: '&cFirestarter: $distance blocks away!' + spawnMessage: '&cA wicked Firestarter has appeared!' + deathMessage: '&aThe Firestarter was slain by $players!' + escapeMessage: '&4The Firestarter has left!' +firestarter_mount: + name: '$eventBossLevel &6Spark' +fire_conjurer: + name: '$eventBossLevel &eFire Conjurer' + locationMessage: '&cFire Conjurer: $distance blocks away!' + spawnMessage: '&cA master of fire and flame walks this world!' + deathMessage: '&aThe Fire Conjurer was extinguished by $players!' + escapeMessage: '&4The Fire Conjurer has vanished!' +fire_conjurer_summon: + name: '$eventBossLevel &6Summoned Flame' +fire_fae: + name: '$eventBossLevel &cFire Fae' +foreign_visitor: + name: '$eventBossLevel &5Foreign Visitor' + locationMessage: '&cForeign Visitor: $distance blocks away!' + spawnMessage: '&cA visitor from a another dimension has arrived!' + deathMessage: '&a$players has made sure to let the visitor know that they are not welcome here.' + escapeMessage: '&4The visitor has gone back home!' +fox_king_cold: + name: '$eventBossLevel &1Fox King Cold' + locationMessage: '&cFox King Cold: $distance blocks away!' + spawnMessage: '&cA magical creature roams the world.' + deathMessage: '&aFox King Cold was defeated by $players!' + escapeMessage: '&4Fox King Cold has left this world.' +frost_palace_frost_queen_p0: + name: '$bossLevel &8Frost Queen' + locationMessage: '&9Frost Queen' + spawnMessage: '&9The wind howls. The Frost Queen rises up to the challenge.' + deathMessage: '&aThe Frost queen is no more, slain by $players!' +frost_palace_frost_queen_p1: + name: '$bossLevel &8Frost Queen phase 1' + locationMessage: '&9Frost Queen phase 1' +frost_palace_frost_queen_p2: + name: '$bossLevel &8Frost Queen phase 2' + locationMessage: '&9Frost Queen phase 2' +frost_palace_frost_queen_p3: + name: '$bossLevel &8Frost Queen phase 3' + locationMessage: '&9Frost Queen phase 3' +frost_palace_frost_queen_p4: + name: '$bossLevel &8Frost Queen phase 4' + locationMessage: '&9Frost Queen phase 4' +frost_palace_frost_queen_p5: + name: '$bossLevel &8Frost Queen phase 5' + locationMessage: '&9Frost Queen phase 5' +frost_palace_frost_queen_p6: + name: '$bossLevel &8Frost Queen phase 6' + locationMessage: '&9Frost Queen phase 6' +frost_palace_frost_queen_p7: + name: '$bossLevel &8Frost Queen phase 7' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Frost Queen was thawed!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&9Frost Queen phase 7' +frost_palace_reinforcement_1: + name: '$reinforcementLevel Spirit of Winter' +frost_palace_reinforcement_2: + name: '$reinforcementLevel Spirit of Spring' +frost_palace_reinforcement_3: + name: '$reinforcementLevel Spirit of Summer' +fulgora: + name: '$eventBossLevel &3Fulgora' + locationMessage: '&cFulgora: $distance blocks away!' + spawnMessage: '&cA mighty thunder goat has come!' + deathMessage: '&aFulgora was stopped by $players!' + escapeMessage: '&4Fulgora has left this place!' +gamma_werewolf: + name: '$reinforcementLevel &7Gamma Werewolf' +goblin_invader: + name: '$eventBossLevel &2Goblin Leader' + locationMessage: '&cGoblin Army: $distance blocks away!' + spawnMessage: '&cA Goblin Army has invaded this realm!' + deathMessage: '&aThe Goblin Army has been vanquished by $players!' + escapeMessage: '&4The Goblin Army is done with this realm!' +goblin_invader_summon_1: + name: '&2Goblin Warrior' +goblin_invader_summon_2: + name: '&2Goblin Fighter' +goblin_invader_summon_3: + name: '&2Goblin Trooper' +goblin_invader_summon_4: + name: '&2Goblin Reinforcements' +greedy_dwarf: + name: '$eventBossLevel &9Greedy Dwarf' + locationMessage: '&cGreedy Dwarf: $distance blocks away!' + spawnMessage: '&cCan you find the Greedy Dwarf digging somewhere underground?!' + deathMessage: '&aThe Greedy Dwarf was released of their curse by $players!' + escapeMessage: '&4The Greedy Dwarf had found their treasure and they left!' +gremlin_1: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + spawnMessage: '&cA Gremlin hoard has invaded this world!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_10: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_2: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_3: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_4: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_5: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_6: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_7: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_8: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_9: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +grunter: + name: '$eventBossLevel &aGrunter' + locationMessage: '&cGrunter: $distance blocks away!' + spawnMessage: '&cA mighty hog roams the lands.' + deathMessage: '&aGrunter was stopped by $players!' + escapeMessage: '&4Grunter has escaped!' +harmless_chicken: + name: '$eventBossLevel &fHarmless Chick' + locationMessage: '&cHarmless Chick: $distance blocks away!' + spawnMessage: '&cBwok!!! Cluck, Cluck! Bawk!' + deathMessage: '&aBaaaawk! Cluck...$players!' + escapeMessage: '&4Harmless Chicken has baaaaaawked away.' +harmless_chicken_summon: + name: '$eventBossLevel &fClucktector' +hog_rider: + name: '$eventBossLevel &6Hog Rider' + locationMessage: '&cHog Rider: $distance blocks away!' + spawnMessage: '&cA mighty Hog Rider has appeared!' + deathMessage: '&aThe Hog Rider and their Hog were vanquished by $players!' + escapeMessage: '&4The Hog Rider has vanished.' +hog_rider_mount: + name: '$eventBossLevel &eLoyal Hog' +hog_rider_p2: + name: '$eventBossLevel &6Hog Rider' + locationMessage: '&cHog Rider: $distance blocks away!' + deathMessage: '&aThe Hog Rider and their Hog were vanquished by $players!' + escapeMessage: '&4The Hog Rider has vanished.' +hog_rider_summon: + name: '$eventBossLevel &eLoyal Zob-Hog' +horde_champion: + name: '$eventBossLevel &cHorde Champion' + locationMessage: '&cUndead Horde Champion: $distance blocks away!' + spawnMessage: '&cAn undead horde approaches!' + deathMessage: '&aThe horde has been stopped by $players!.' + escapeMessage: '&4AThe undead horde has left!' +horrid_duplicator: + name: '$eventBossLevel &dHorrid Duplicator' + locationMessage: '&cHorrid Duplicator: $distance blocks away!' + spawnMessage: '&cAn endless foe has appeared!' + deathMessage: '&aThe Horrid Duplicator was slain by $players!' + escapeMessage: '&4The Horrid Duplicator has left!' +horrid_duplicator_summon: + name: '$eventBossLevel &dHorrid Duplicator' +horrid_duplicator_summon_1: + name: '$eventBossLevel &dHorrid Duplicator' +ice_fae: + name: '$eventBossLevel &bIce Fae' +imperial_bee_guard: + name: '$reinforcementLevel &eImperial Bee Soldier' +invasion_abducted_hoglin_leader: + name: '$normalLevel &8Abducted Hoglin Leader' +invasion_abducted_pillager_leader: + name: '$normalLevel &8Abducted Pillager Leader' +invasion_abducted_silverfish: + name: '$normalLevel &8Abducted Silverfish' +invasion_abducted_silverfish_leader: + name: '$normalLevel &8Abducted Silverfish' +invasion_abducted_zombie: + name: '$normalLevel &8Abducted Zombie' +invasion_abducted_zombie_leader: + name: '$normalLevel &8Abducted Zombie' +invasion_abductor: + name: '$normalLevel &6Abductor' +invasion_abudcted_pillager: + name: '$normalLevel &8Abducted Pillager' +invasion_analytic_thin_man_1: + name: '$normalLevel &8Analytic Thin Man' +invasion_analytic_thin_man_2: + name: '$normalLevel &8Analytic Thin Man' +invasion_analytic_thin_man_3: + name: '$normalLevel &8Analytic Thin Man' +invasion_analytic_thin_man_4: + name: '$normalLevel &8Analytic Thin Man' +invasion_ballistic_construct: + name: '$minibossLevel &fBallistic Construct' +invasion_convert: + name: '$normalLevel &6Convert' +invasion_energy_construct: + name: '$minibossLevel &fEnergy Construct' +invasion_fire_construct: + name: '$minibossLevel &fFire Construct' +invasion_genetically_modified_cow_phase_1: + name: '$minibossLevel &fGenetically Modified Cow' +invasion_genetically_modified_cow_phase_2: + name: '$minibossLevel &fGenetically Modified Cow' +invasion_gray_man_courthouse_phase_1: + name: '$minibossLevel &7Gray Man' +invasion_gray_man_courthouse_phase_2: + name: '$minibossLevel &7Gray Man' +invasion_green_man_hotel_phase_1: + name: '$bossLevel &2Green Man' +invasion_green_man_hotel_phase_2: + name: '$bossLevel &2Green Man' +invasion_green_man_hotel_phase_3: + name: '$bossLevel &2Green Man' + deathMessage: '&4The &2Green Man &4was vanquished by $players! That''s the end for this version of the map, the inside of the UFO is in the full version!' +invasion_green_man_spaceship_phase_1: + name: '$bossLevel &2Green Man' +invasion_green_man_spaceship_phase_2: + name: '$bossLevel &2Green Man' +invasion_green_man_spaceship_phase_3: + name: '$bossLevel &2Green Man' +invasion_green_man_spaceship_phase_4: + name: '$bossLevel &2Green Man' + deathMessages: + - '&e&l---------------------------------------------' + - '&2The Alien menace is no more!' + - '&c&l Третье место по урону: $damager1name &eс $damager1damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&aБыл убит: $players' + - '&e&l---------------------------------------------' +invasion_ice_construct: + name: '$minibossLevel &fIce Construct' +invasion_merman: + name: '$normalLevel &6Merman' +invasion_merman_leader: + name: '$normalLevel &6Merman Leader' +invasion_otherwordly_ember: + name: '$normalLevel &6Otherworldly Ember' +invasion_psychic_apparition: + name: '$normalLevel &5Psychic Apparition' +invasion_psychic_clone: + name: '$reinforcementLevel &6Psychic Clone' +invasion_psychic_explosion: + name: '$reinforcementLevel &5Psychic Explosion' +invasion_psychic_summon_gold_boots: + name: '$reinforcementLevel &5Psychic Apparition' +invasion_psychic_summon_gold_pants: + name: '$reinforcementLevel &5Psychic Apparition' +invasion_psychic_summon_leather_hat: + name: '$reinforcementLevel &5Psychic Apparition' +invasion_shrieking_shulker: + name: '$normalLevel &8Shrieking Shulker' +invasion_thin_man: + name: '$normalLevel &8Thin Man' +killer_rabbit_of_caerbannog: + name: '$eventBossLevel &cKiller Rabbit of Caerbannog' +kraken: + name: '$eventBossLevel &3Kraken' +krampus: + name: '$eventBossLevel &1Krampus' + locationMessage: '&cKrampus: $distance blocks away!' + spawnMessage: '&cKrampus has come to punish the naughty!' + deathMessage: '&aKrampus has been sent back to his realm to by $players!.' + escapeMessage: '&4There was nobody to punish!' +large_hopper: + name: '$eventBossLevel &dLarge Hopper' + locationMessage: '&cLarge Hopper: $distance blocks away!' + spawnMessage: '&cA large beast is hopping around!' + deathMessage: '&aThe Large Hopper was stopped by $players!' + escapeMessage: '&4The Large Hopper has jumped out of this world!' +large_hopper_mount: + name: '$eventBossLevel &aHopper' +lightning_fae: + name: '$eventBossLevel &eLightning Fae' +living_shadow: + name: '$eventBossLevel &7Living Shadow' + locationMessage: '&cLiving Shadow: $distance blocks away!' + spawnMessage: '&cLiving Shadow has appeared! Do not look it in the yes!' + deathMessage: '&aLiving Shadow has been turned into Dead Shadow by $players!.' + escapeMessage: '&4The Living Shadow saw nothing so it left!' +meme_boss: + name: '&2The Maestro' +meme_boss_reinforcement: + name: '&cFan' +merman: + name: '$eventBossLevel &1Merman' + locationMessage: '&cMerman: $distance blocks away!' + spawnMessage: '&cA Merman swims the oceans!' + deathMessage: '&aThe Merman was slain by $players!' + escapeMessage: '&4The Merman has retreated.' +monster_of_the_deep: + name: '$eventBossLevel &bMonster of the Deep' + locationMessage: '&cMonster of the Deep: $distance blocks away!' + spawnMessage: '&cSomething terrible swims the oceans!' + deathMessage: '&aMonster of the Deep has been slain by $players!' + escapeMessage: '&4The oceans are once again safe!' +moon_spider: + name: '$eventBossLevel &fMoon Spider' + locationMessage: '&cMoon Spider: $distance blocks away!' + spawnMessage: '&cA powerful arachnid has been spotted!' + deathMessage: '&aThe Moon Spider was slain by $players!' + escapeMessage: '&4The Moon Spider has left!' +moon_spider_summon: + name: '&fSilk Mender' +necromancer: + name: '$eventBossLevel &7Necromancer' + locationMessage: '&cNecromancer: $distance blocks away!' + spawnMessage: '&cA powerful evil Necromancer has entered this world!' + deathMessage: '&aThe Necromancer is no more thanks to $players!' + escapeMessage: '&4The Necromancer has disappeared.' +necromancer_summon_1: + name: '$eventBossLevel &fFiery Bones' +necromancer_summon_2: + name: '$eventBossLevel &bChilled Bones' +necromancer_summon_3: + name: '$eventBossLevel &8Charred Bones' +necronomicon_skeleton: + name: '$reinforcementLevel &7Summoned Skeleton' +necronomicon_zombie: + name: '$reinforcementLevel &7Призванный зомби' +netherite_golem: + name: '$eventBossLevel &8Netherite Golem' + locationMessage: '&cNetherite Golem: $distance blocks away!' + spawnMessage: '&cAn ancient golem has entered this world!' + deathMessage: '&aThe Netherite Golem was slain by $players!' + escapeMessage: '&4The Netherite Golem has left this world!' +nether_escapee: + name: '$eventBossLevel &6Nether Escapee' + locationMessage: '&cNether Escapee: $distance blocks away!' + spawnMessage: '&cA terrible foe has escaped the nether!' + deathMessage: '&aThe Nether Escapee was sent back to the nether by $players!' + escapeMessage: '&4The Nether Escapee has left this place!' +nether_hag: + name: '$eventBossLevel &4Nether Hag' + locationMessage: '&cNether Hag: $distance blocks away!' + spawnMessage: '&cAn evil hag walks the nether!' + deathMessage: '&aThe Nether Hag was slain by $players!' + escapeMessage: '&4The Nether Hag has vanished!' +nether_wasp: + name: '$eventBossLevel &6Nether Wasp' + locationMessage: '&cNether Wasp: $distance blocks away!' + spawnMessage: '&cTry not to get stung, a wasp roams the nether!' + deathMessage: '&aThe Nether Wasp was slain by $players!' + escapeMessage: '&4The Nether Wasp has decided to buzz off!' +nether_wasp_summon_1: + name: '$eventBossLevel &cHive Summoner' +nether_wasp_summon_2: + name: '$eventBossLevel &cHive Wasp' +nightwing: + name: '$eventBossLevel &cNightwing' + locationMessage: '&cNightwing: $distance blocks away!' + spawnMessage: '&cA bird of the night has appeared!' + deathMessage: '&aNightwing was stopped by $players!' + escapeMessage: '&4Nightwing has flown home.' +nightwing_summon: + name: '$eventBossLevel &cSmart Bomb' +nightwing_summon_1: + name: '$eventBossLevel &cSworn Protector' +night_crawler: + name: '$eventBossLevel &4Night Crawler' + locationMessage: '&cNight Crawler: $distance blocks away!' + spawnMessage: '&cSomething awful is crawling about!' + deathMessage: '&aThe Night Crawler has been slain by $players!' + escapeMessage: '&4The Night Crawler Undead has left!' +night_horder: + name: '$eventBossLevel &aNight Horder' + locationMessage: '&cNight Horder: $distance blocks away!' + spawnMessage: '&cA Night Horder has appeared! Slay him to loot his booty!' + deathMessage: '&aThe Night Horder has been plundered by $players!' + escapeMessage: '&4The Night Horder has escaped!' +oasis_10_old_bones: + name: '$normalLevel &fOld Bones' +oasis_10_surreptitious_scribe: + name: '$minibossLevel &7Surreptitious Scribe' +oasis_12_entombed_tenant: + name: '$normalLevel &7Entombed Tenant' +oasis_12_entombed_tenant_p2: + name: '$normalLevel &7Entombed Tenant' +oasis_12_sinister_siren: + name: '$minibossLevel &5Sinister Siren' +oasis_14_gnarly_grimace: + name: '$normalLevel &8Gnarly Grimace' +oasis_14_undead_drifter: + name: '$normalLevel &1Undead Drifter' +oasis_16_lesser_sentinel: + name: '$normalLevel &9Lesser Sentinel' +oasis_16_magical_magus: + name: '$normalLevel &3Magical Magus' +oasis_16_rancid_roamer: + name: '$normalLevel &8Rancid Roamer' +oasis_18_sly_sharpshooter: + name: '$normalLevel &eSly Sharpshooter' +oasis_18_stout_thaumaturge: + name: '$normalLevel &5Stout Thaumaturge' +oasis_18_tricky_treasure_hoarder: + name: '$normalLevel &dTricky Treasure Hoarder' +oasis_20_scheming_scribe: + name: '$minibossLevel &7Scheming Scribe' +oasis_20_septic_scribe: + name: '$minibossLevel &7Septic Scribe' +oasis_20_vampiric_sorcerer: + name: '$bossLevel &cVampiric Sorcerer' +oasis_20_wrapped_wraith: + name: '$normalLevel &8Wrapped Wraith' +oasis_20_wrapped_wraith_p2: + name: '$normalLevel &8Wrapped Wraith' +oasis_25_vampiric_warlock: + name: '$bossLevel &4Vampiric Warlock' +oasis_25_warlocks_spirit_summon: + name: '$reinforcementLevel &cWarlocks Spirit' +oasis_26_adept_sentinel: + name: '$normalLevel &1Adept Sentinel' +oasis_26_grim_grovetender: + name: '$normalLevel &aGrim Grovetender' +oasis_26_precarious_sniper: + name: '$normalLevel &3Precarious Sniper' +oasis_26_superior_sharpshooter: + name: '$normalLevel &3Superior Sharpshooter' +oasis_28_perilous_prophet: + name: '$normalLevel &3Perlious Prophet' +oasis_28_treacherous_treasure_hoarder: + name: '$normalLevel &dTreacherous Treasure Hoarder' +oasis_2_haunted_hauler: + name: '$normalLevel &9Haunted Hauler' +oasis_30_forsaken_soul: + name: '$reinforcementLevel &0Forsaken Soul' +oasis_30_lost_soul: + name: '$normalLevel Lost Soul' +oasis_30_parlous_preist: + name: '$minibossLevel &bParlous Preist' +oasis_30_seeker_of_the_staid: + name: '$normalLevel &cSeeker of the Staid' +oasis_30_wimpy_louse: + name: '$reinforcementLevel &8Loathing Louse' +oasis_32_loathing_louse: + name: '$normalLevel &8Loathing Louse' +oasis_32_skeletal_sniper: + name: '$normalLevel &9Skeletal Sniper' +oasis_34_grizly_grimace: + name: '$normalLevel &8Gnarly Grimace' +oasis_34_gruesome_grimace: + name: '$normalLevel &8Gruesome Grimace' +oasis_35_ice_eidolon: + name: '$reinforcementLevel &9Ice Eidolon' +oasis_35_light_of_darkness: + name: '$minibossLevel &9Light of Darkness' +oasis_36_cruel_cultist: + name: '$normalLevel &3Cruel Cultist' +oasis_36_cultists_cretins: + name: '$reinforcementLevel &3Cruel Cultist' +oasis_36_cultists_cretins_drowned: + name: '$reinforcementLevel &3Cruel Cultist' +oasis_36_dexterous_sentinel: + name: '$normalLevel &9Dexterous Sentinel' +oasis_36_grudging_grovetender: + name: '$normalLevel &aGrudging Grovetender' +oasis_36_parlous_sniper: + name: '$normalLevel &3Parlous Sniper' +oasis_36_rueful_roamer: + name: '$normalLevel &8Rueful Roamer' +oasis_36_spectral_magus: + name: '$normalLevel &3Spectral Magus' +oasis_38_poisonous_perch: + name: '$normalLevel &3Poisonous Perch' +oasis_38_traitorous_treasure_hoarder: + name: '$normalLevel &dTraitorous Treasure Hoarder' +oasis_40_chief_cultist: + name: '$minibossLevel &5Chief Cultist' +oasis_40_louse_lord: + name: '$minibossLevel &8Louse Lord' +oasis_40_pharaohs_scribe: + name: '$minibossLevel &7Pharaoh''s Scribe' +oasis_40_skeletal_stiff: + name: '$normalLevel &9Skeletal Stiff' +oasis_40_soaked_sacrifice: + name: '$reinforcementLevel &1Soaked Sacrifice' +oasis_40_solar_flare: + name: '$reinforcementLevel &eSolar Flare' +oasis_42_hexed_hauler: + name: '$normalLevel &9Hexed Hauler' +oasis_42_skeletal_sharpshooter: + name: '$normalLevel &9Skeletal Sharpshooter' +oasis_42_tyranical_treasure_hoarder: + name: '$normalLevel &dTyranical Treasure Hoarder' +oasis_42_tyranical_treasure_hoarder_phase_2: + name: '$normalLevel &dTyranical Treasure Hoarder' +oasis_45_golden_cast_autonomation: + name: '$reinforcementLevel &6Golden Cast Autonomation' +oasis_45_monumental_monstrosity: + name: '$bossLevel &bMonumental Monstrosity' +oasis_45_monumental_monstrosity_phase_2: + name: '$bossLevel &bMonumental Monstrosity' +oasis_45_monumental_monstrosity_phase_3: + name: '$bossLevel &6Monumental Monstrosity' +oasis_45_monumental_monstrosity_phase_4: + name: '$bossLevel &bMonumental Monstrosity' +oasis_45_oracle_of_knowledge: + name: '$minibossLevel &0Oracle of Knowledge' +oasis_45_shadow_of_knowledge_summon: + name: '$reinforcementLevel &8Shadow of Knowledge' +oasis_45_the_beacon: + name: '$minibossLevel &6The Beacon' +oasis_45_the_beacon_phase_2: + name: '$minibossLevel &6The Beacon' +oasis_45_the_beacon_phase_3: + name: '$minibossLevel &6The Beacon' +oasis_45_the_beacon_phase_4: + name: '$minibossLevel &6The Beacon' +oasis_46_pharaohs_sentinel: + name: '$normalLevel &9Pharaoh''s Sentinel' +oasis_4_cursed_desert_dweller: + name: '$normalLevel &eCursed Desert Dweller' +oasis_4_grotesque_grimace: + name: '$normalLevel &8Grotesque Grimace' +oasis_4_swamp_rat: + name: '$normalLevel &6Swamp Rat' +oasis_50_moneychanger_arrow: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_arrow_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_blindness: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_blindness_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_fire: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_fire_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_freeze: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_freeze_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_knockback: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_knockback_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_poison: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_poison_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_wither: + name: '$minibossLevel &6Moneychanger' +oasis_50_moneychanger_wither_phase_2: + name: '$minibossLevel &6Moneychanger' +oasis_50_pharaohs_royal_guard: + name: '$reinforcementLevel &8Pharaoh''s Royal Guard' +oasis_50_the_foundry: + name: '$bossLevel &4The Foundry' +oasis_50_the_foundry_phase_2: + name: '$bossLevel &4The Foundry' +oasis_55_pharaoh_of_pestilence: + name: '$bossLevel &0Pharaoh of Pestilence' +oasis_6_dry_bones: + name: '$normalLevel &fDry Bones' +oasis_6_rotten_roamer: + name: '$normalLevel &8Rotten Roamer' +oasis_8_mythical_magus: + name: '$normalLevel &3Mythical Magus' +oasis_8_tough_thaumaturge: + name: '$normalLevel &5Tough Thaumaturge' +oasis_8_troublesome_treasure_hoarder: + name: '$normalLevel &dTroublesome Treasure Hoarder' +okami: + name: '$eventBossLevel &cOkami' + locationMessage: '&cOkami: $distance blocks away!' + spawnMessage: '&cA god has awakened!' + deathMessage: '&a$players has fought with a god and won!.' + escapeMessage: '&4Okami has left!' +okami_p2: + name: '$eventBossLevel &cOkami' +okami_p3: + name: '$eventBossLevel &cOkami' +omega_wolf: + name: '$reinforcementLevel &7Omega Wolf' +pillager_caravan_beast: + name: '$reinforcementLevel &cCaravan Beast' +pillager_caravan_guard: + name: '$reinforcementLevel &cCaravan Guard' +pillager_caravan_leader: + name: '$eventBossLevel &cPillager Caravan Leader' + locationMessage: '&cPillager Caravan: $distance blocks away!' + spawnMessage: '&cA pillager caravan has been sighted!' +primis_acolyte_brute: + name: '$normalLevel &bAcolyte Brute' +primis_acolyte_forest_brute: + name: '$normalLevel &bElf Bandit Brute' +primis_acolyte_forest_brute_with_watch: + name: '$normalLevel &bElf Bandit Brute' +primis_acolyte_forest_sharpshooter: + name: '$normalLevel &bElf Bandit Ranger' +primis_acolyte_forest_summoner: + name: '$normalLevel &bElf Bandit Summoner' +primis_acolyte_forest_summoner_heirloom_guardian: + name: '$normalLevel &bElf Bandit Mage' +primis_acolyte_guard_1: + name: '$normalLevel &bAcolyte Guard' + onDamagedMessages: + - You can't enter! + - The mage won't allow this! + - Leave this place! + - The mage protects this place! + - Foolishness! + - Begone! + deathMessage: '[Acolyte Guard] You are blind to the truth, the tower''s mage sees all!' +primis_acolyte_guard_2: + name: '$normalLevel &bAcolyte Guard' + onDamagedMessages: + - You can't enter! + - The mage won't allow this! + - Leave this place! + - The mage protects this place! + - Foolishness! + - Begone! + deathMessage: '[Acolyte Guard] You shall not pass, the mage in the tower will not allow it!' +primis_acolyte_sharpshooter: + name: '$normalLevel &bAcolyte Ranger' +primis_aggressive_llama: + name: '$normalLevel &6Aggressive LLama' +primis_angry_goat: + name: '$normalLevel &6Angry Goat' +primis_beta_feral_wolf: + name: '$reinforcementLevel &8Beta Feral Wolf' +primis_blood_temple_blood_golem: + name: '$normalLevel &cBlood Golem' +primis_blood_temple_charred_construct: + name: '$normalLevel &cCharred Construct' +primis_blood_temple_conjured_flame: + name: '$normalLevel &cConjured Flame' +primis_blood_temple_eradicator: + name: '$normalLevel &cEradicator' +primis_blood_temple_fire_conjurer: + name: '$normalLevel &cFire Conjurer' +primis_blood_temple_flame_elemental: + name: '$normalLevel &cFlame Elemental' +primis_catacomb_nemus_to_redwood_archer: + name: '$normalLevel &8Catacomb Archer' +primis_catacomb_nemus_to_redwood_golem: + name: '$normalLevel &bCatacomb Golem' +primis_catacomb_nemus_to_redwood_necromancer: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_nemus_to_redwood_necromancer_p1: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_nemus_to_redwood_necromancer_p2: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_nemus_to_redwood_soul_reinforcement: + name: '$reinforcementLevel &8Catacomb Soul' +primis_catacomb_nemus_to_redwood_swordsman: + name: '$normalLevel &8Catacomb Swordsman' +primis_catacomb_pontis_to_ice_archer: + name: '$normalLevel &8Catacomb Archer' +primis_catacomb_pontis_to_ice_golem: + name: '$normalLevel &bCatacomb Golem' +primis_catacomb_pontis_to_ice_necromancer_p1: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_pontis_to_ice_necromancer_p2: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_pontis_to_ice_swordsman: + name: '$normalLevel &8Catacomb Swordsman' +primis_catacomb_trio_archer: + name: '$normalLevel &8Catacomb Archer' +primis_catacomb_trio_golem: + name: '$normalLevel &bCatacomb Golem' +primis_catacomb_trio_necromancer_p1: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_necromancer_p2: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_necromancer_summon: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_swordsman: + name: '$normalLevel &8Catacomb Swordsman' +primis_crazed_rabbit: + name: '$normalLevel &cCrazed Rabbit' +primis_crystaline_summoner_p1: + name: '$normalLevel &3Crystaline Summoner' +primis_crystaline_summoner_p2: + name: '&3Crystaline Summoner' +primis_earth_temple_golem: + name: '$normalLevel &fAnimated Clay' +primis_emerald_eater: + name: '$normalLevel &aEmerald Eater' +primis_farmstead_lighthouse_keeper: + name: '$bossLevel &6The Lighthouse Keeper' + questLore: + - Something is deeply wrong with my husband. + - He used to be a loving and caring husband and father, + - but in recent times he has been focusing on documents he found in the basement. + - He said it was for important research, something that could change the world. + - I should've told him to stop when I saw how obsessed he was becoming. + - He did... something... to the lighthouse - and + - I fear the lighthouse has done something to him, too. + - It morphed him into some kind of monster. He no longer recognizes us, + - and has even attacked us when we tried to approach him. + - At night, we can't sleep due to the wailing sounds + - coming from the &dLighthouse's Basement&f. + - He is suffering, and we are powerless to help him. + - I know it's asking a lot, but do you think you could help us? + questAcceptDialog: + - '&a[Amavit]&f Thank you so much for accepting our request. I hope with all my heart you succeed.' + - '&7&oI should go to the &dBasement of the Lighthouse&7&o and put the &cLighthouse Keeper&7&o out of his misery.' + questCompleteMessage: + - '&a[Amavit]&f I heard it - so it is done? Did he suff- no, forget it, I don''t want to know.' + - '&fIt seems like the lighthouse started emitting an odd light when you... dealt with the issue. We need to make sure it is not an issue.' + - '&7&oSeems like &aAmavit&7&o has another task for me. I should talk to her.' +primis_feral_alpha_wolf: + name: '$normalLevel &8Feral Alpha Wolf' +primis_feral_wolf: + name: '$normalLevel &8Feral Wolf' +primis_feral_wolf_scout: + name: '$normalLevel &8Feral Wolf Scout' +primis_gladius_admiral: + name: '$normalLevel &fInvading Admiral' +primis_gladius_assassin: + name: '$normalLevel &fInvading Assassin' +primis_gladius_barkeep_p1: + name: '$minibossLevel &6The Barkeep' +primis_gladius_barkeep_p2: + name: '$minibossLevel &6The Barkeep' +primis_gladius_captain: + name: '$normalLevel &fInvading Captain' +primis_gladius_champion_p1: + name: '$bossLevel &6Fallen Champion Natus' +primis_gladius_champion_p2: + name: '$bossLevel &6Fallen Champion Natus' +primis_gladius_gatekeeper_p1: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_gatekeeper_p2: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_gatekeeper_pontis_p1: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_gatekeeper_pontis_p2: + name: '$minibossLevel &5The Gatekeeper' +primis_gladius_longbowman: + name: '$normalLevel &fInvading Longbowman' +primis_gladius_mariner: + name: '$normalLevel &fInvading Mariner' +primis_gladius_mariner_quest: + name: '$normalLevel &fInvading Mariner' +primis_gladius_monk_p1: + name: '$minibossLevel &6The Monk' +primis_gladius_monk_p2: + name: '$minibossLevel &6The Monk' +primis_gladius_raider: + name: '$normalLevel &fInvading Raider' +primis_gladius_swordsman: + name: '$normalLevel &fInvading Swordsman' +primis_gladius_undead_buccaneer: + name: '$normalLevel &fUndead Buccaneer' +primis_gladius_undead_captain: + name: '$minibossLevel &fUndead Captain' +primis_gladius_undead_swashbuckler: + name: '$normalLevel &fUndead Swashbuckler' +primis_gladius_underlord: + name: '$minibossLevel &0Underlord' +primis_gladius_villager: + name: '$normalLevel &fUndead Villager' +primis_goblin_fowl_warrior: + name: '$minibossLevel &6Cursed Fowl Goblin' +primis_goblin_grunt: + name: '$normalLevel &6Goblin Grunt' +primis_goblin_king: + name: '$bossLevel &2Goblin King' +primis_goblin_piranah: + name: '$normalLevel &9Goblin Piranah' +primis_goblin_spearman: + name: '$normalLevel &6Goblin Spearman' +primis_goblin_warrior: + name: '$normalLevel &6Goblin Warrior' +primis_ice_mage: + name: '$minibossLevel &9Ice Mage' +primis_ice_mage_p2: + name: '$minibossLevel &bIce Mage' + deathMessage: '&8&oYou hear the sound of a nearby ice wall cracking and breaking...' +primis_ice_village_annoyed_goat: + name: '$normalLevel &bAnnoyed Goat' +primis_ice_village_bell_banger: + name: '$minibossLevel &6Undead' + questLore: + - Do you see that? There, look at that bell + - tower in the village. + - You see it too, right? The feller there + - banging his head on the bell. + - I am pretty sure that's what's going on, + - unless my vision is failing me. + - Could you go investigate and report back + - to me what you found. + questAcceptDialog: + - '&a[Eleusium Festus]&f What is going on...' + - '&7&oI should go see what is happening at the &d&oIce Village Bell Tower&7&o.' + questCompleteMessage: + - '&a[Eleusium Festus]&f You found an undead banging their head on the bell...' + - Well now I have heard it all... +primis_ice_village_escaped_prisoner: + name: '$normalLevel &bEscaped Prisoner' +primis_ice_village_fallen_trial_warrior_summon: + name: '$reinforcementLevel &7Enslaved Soul' +primis_ice_village_frost_fur_ursus: + name: '$normalLevel &9Frost Fur Ursus' +primis_ice_village_frost_simulacrum: + name: '$normalLevel &3Frost Simulacrum' +primis_ice_village_ice_simulacrum: + name: '$reinforcementLevel &3Ice Simulacrum' +primis_ice_village_manifested_nightmare: + name: '$normalLevel &bManifested Nightmare' +primis_ice_village_meek_customer: + name: '$normalLevel &cMeek Customer' +primis_ice_village_naughty_customer: + name: '$normalLevel &cNaughty Customer' +primis_ice_village_screecher_bomb_summon: + name: '$reinforcementLevel &dScreecher Droppings' +primis_ice_village_sky_screecher: + name: '$normalLevel &bSky Screecher' +primis_ice_village_the_ice_aspect: + name: '$minibossLevel &9Ice Aspect' +primis_ice_village_the_ice_elemental: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_the_ice_elemental_p2: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_the_ice_elemental_p3: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_trial_of_ice_minor_ice_elemental: + name: '$minibossLevel &bMinor Ice Elemental' +primis_ice_village_wolf_summon: + name: '$reinforcementLevel &cTamed Wolf' +primis_minor_ice_elemental: + name: '$bossLevel &1Minor Ice Elemental' +primis_minor_ice_elemental_p2: + name: '$bossLevel &1Minor Ice Elemental' +primis_mountain_pass_guardian_p1: + name: '$bossLevel &6The Guardian' +primis_mountain_pass_guardian_p2: + name: '$bossLevel &6The Guardian' +primis_mountain_pass_healer: + name: '$reinforcementLevel &fRepairtron' +primis_nasty_worm: + name: '$normalLevel &fNasty Worm' +primis_ogre_mines_mite: + name: '$normalLevel &fMine Mite' +primis_ogre_mines_ogre_archer: + name: '$minibossLevel &fOgre Archer' +primis_ogre_mines_ogre_magi: + name: '$minibossLevel &fOgre Magi' +primis_ogre_mines_ogre_warrior: + name: '$minibossLevel &fOgre Warrior' +primis_ogre_mines_undead_archer: + name: '$normalLevel &fUndead Archer' +primis_ogre_mines_undead_swordsman: + name: '$normalLevel &fUndead Swordsman' +primis_pontis_beast_cod: + name: '$minibossLevel &dBeast Cod Furiosa' +primis_pontis_beast_crawler: + name: '$minibossLevel &dCrawler Beast Megdun' +primis_pontis_beast_impaler: + name: '$minibossLevel &dImpaler Beast Uladzimir' +primis_pontis_counselor_guard_left_1: + name: '$normalLevel &4Corrupt Counselor Guard' +primis_pontis_counselor_guard_left_2: + name: '$normalLevel &4Warped Counselor Guard' + deathMessage: '&5[Counselor Machiavelli]&f So that fool must have finally figured it out...' +primis_pontis_counselor_guard_left_3: + name: '$normalLevel &4Uplifted Experiment' + deathMessage: '&5[Counselor Machiavelli]&f You''re stronger than I thought.' +primis_pontis_counselor_guard_left_4: + name: '$normalLevel &4Abomination' + deathMessage: '&5[Counselor Machiavelli]&f My soul magic will protect me!!!' +primis_pontis_counselor_guard_mid: + name: '$normalLevel &4Corrupt Counselor Guard' + deathMessage: '&8[Counselor Machiavelli]&f I see that we have guests!...' +primis_pontis_counselor_guard_right_1: + name: '$normalLevel &4Corrupt Counselor Guard' +primis_pontis_counselor_guard_right_2: + name: '$normalLevel &4Warped Counselor Guard' +primis_pontis_counselor_guard_right_3: + name: '$normalLevel &4Uplifted Experiment' +primis_pontis_counselor_guard_right_4: + name: '$normalLevel &4Abomination' +primis_pontis_counselor_twisted_copy: + name: '$reinforcementLevel &4Twisted Copy' +primis_pontis_mille_arena_air_elemental: + name: '$minibossLevel &fAir Elemental' +primis_pontis_mille_arena_human_wave_4: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_6: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_7: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_8: + name: '$normalLevel &4Dominated Human Warrior' +primis_pontis_mille_arena_human_worshiper: + name: '$normalLevel &4Elemental Worshiper' +primis_pontis_mille_arena_minor_air_elemental: + name: '$normalLevel &fMinor Air Elemental' +primis_pontis_mille_arena_minor_earth_elemental: + name: '$normalLevel &7Minor Earth Elemental' +primis_pontis_mille_arena_minor_fire_elemental: + name: '$normalLevel &eMinor Fire Elemental' +primis_pontis_mille_arena_minor_fire_elemental_prime: + name: '$normalLevel &eMinor Fire Elemental' +primis_pontis_mille_arena_minor_water_elemental: + name: '$normalLevel &bMinor Water Elemental' +primis_pontis_mille_arena_primal_air_wisp: + name: '$normalLevel &fPrimal Air Wisp' +primis_pontis_mille_arena_primal_air_wisp_2: + name: '$normalLevel &fPrimal Air Wisp' +primis_pontis_mille_arena_primal_earth_wisp: + name: '$normalLevel &7Primal Earth Wisp' +primis_pontis_mille_arena_primal_earth_wisp_2: + name: '$normalLevel &7Primal Earth Wisp' +primis_pontis_mille_arena_primal_fire_wisp: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_fire_wisp_2: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_fire_wisp_3: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_water_wisp: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_water_wisp_2: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_water_wisp_3: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_wisp: + name: '$normalLevel &5Primal Wisp' +primis_pontis_mille_arena_water_elemental: + name: '$minibossLevel &1Water Elemental' +primis_pontis_mille_counselor_p1: + name: '$minibossLevel &fCounselor Machiavelli' +primis_pontis_mille_counselor_p2: + name: '$minibossLevel &fCounselor Machiavelli' +primis_pontis_mille_counselor_p3: + name: '$minibossLevel &fCounselor Machiavelli' +primis_pontis_mille_fields_babe_razorback: + name: '$normalLevel &2Babe Razorback' +primis_pontis_mille_fields_bird: + name: '$normalLevel &fFeathered Field Rat' +primis_pontis_mille_fields_bird_nightmare: + name: '$normalLevel &dFeathered Nightmare Rat' +primis_pontis_mille_fields_bubba: + name: '$minibossLevel &cBig ol'' Bubba' +primis_pontis_mille_fields_field_rat: + name: '$normalLevel &fField Rat' +primis_pontis_mille_fields_juvenile_razorback: + name: '$normalLevel &2Juvenile Razorback' +primis_pontis_mille_fields_longhorn: + name: '$normalLevel &4Fields Longhorn' +primis_pontis_mille_fields_mature_razorback: + name: '$normalLevel &2Mature Razorback' +primis_pontis_mille_fields_shorthorn: + name: '$normalLevel &6Fields Shorthorn' +primis_pontis_mille_fields_two_legged_terror: + name: '$normalLevel &2Two Legged Terror' +primis_pontis_mille_fields_well_fed_rat: + name: '$normalLevel &fWell Fed Rat' +primis_pontis_mille_rat: + name: '$normalLevel &fRat' +primis_quartz_elemental: + name: '$bossLevel &dQuartz Elemental' +primis_quartz_elemental_p2: + name: '$bossLevel &dQuartz Elemental' +primis_redwood_barracuda: + name: '$normalLevel &3Redwood Barracuda' +primis_redwood_fruity_hound: + name: '$normalLevel &2Fruity Hound' +primis_redwood_rockhound: + name: '$normalLevel &7Redwood Rockhound' +primis_redwood_werewolf_grunt: + name: '$normalLevel &cRedwood Werewolf Grunt' +primis_redwood_werewolf_packleader: + name: '$normalLevel &4Redwood Werewolf Packleader' +primis_river_guardian: + name: '$normalLevel &5River Guardian' +primis_roofed_forest_cave_spider: + name: '$normalLevel &6Nest Crawler' +primis_roofed_forest_cave_spider_boss: + name: '$bossLevel &eBrood Mother' +primis_roofed_forest_spider: + name: '$normalLevel &6Forest Crawler' +primis_roofed_forest_spider_reinforcement: + name: '$reinforcementLevel &6Nest Brood' +primis_sea_monster: + name: '$bossLevel &dSea Monster' +primis_sewer_noxious_ninja: + name: '$normalLevel &2Noxious Ninja' +primis_sewer_spore_spreader: + name: '$normalLevel &4Spore Spreader' +primis_sewer_the_shredder_p1: + name: '$bossLevel &5The Shredder' +primis_sewer_the_shredder_p2: + name: '$bossLevel &5The Shredder' +primis_storm_temple_axeman: + name: '$normalLevel &dStorm Temple Axeman' +primis_storm_temple_bowman: + name: '$normalLevel &dStorm Temple Bowman' +primis_storm_temple_kuzco: + name: '$normalLevel &6Kuzco' +primis_storm_temple_minor_storm_elemental: + name: '$normalLevel &5Minor Storm Elemental' +primis_storm_temple_storm_elemental: + name: '$bossLevel &1Storm Elemental' +primis_storm_temple_storm_elemental_p2: + name: '$bossLevel &1Storm Elemental' +primis_storm_temple_storm_elemental_p3: + name: '$bossLevel &1Storm Elemental' +primis_storm_temple_summoner: + name: '$normalLevel &5Storm Temple Summoner' +primis_terravilla_alpha_razorback: + name: '$minibossLevel &2Alpha Razorback' +primis_terravilla_alpha_razorback_p2: + name: '$minibossLevel &2Alpha Razorback' +primis_terravilla_bar_brawler: + name: '$normalLevel &6Bar Brawler' + onDamagedMessages: + - That all ya got! + - I did not even feel that! + - Why...you! + - I will show you! + - Who the heck are you! + - TAKE THAT! +primis_terravilla_earth_elemental: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_earth_elemental_p2: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_earth_elemental_p3: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_regular_fish: + name: '$normalLevel &bRegular Fish' +primis_terravilla_robber_gladiator: + name: '$normalLevel &bRobber Gladiator' +primis_terravilla_robber_slugger: + name: '$normalLevel &bSlugger' +primis_undead_archer: + name: '$normalLevel &fUndead Archer' +primis_undead_climber: + name: '$normalLevel &0Undead Climber' +primis_undead_grappler: + name: '$normalLevel &3Undead Grappler' +primis_undead_guardian: + name: '$normalLevel &bUndead Guardian' +primis_undead_swordsman: + name: '$normalLevel &0Undead Swordsman' +pufferfish: + name: '$eventBossLevel &3Pufferfish' + locationMessage: '&cPufferfish: $distance blocks away!' + spawnMessage: '&cA puffed fish is swimming in the oceans!' + deathMessage: '&aThe Pufferfish reign has been ended by $players!' + escapeMessage: '&4The Pufferfish has swam away!' +pufferfish_summon_1: + name: '$eventBossLevel &bPooferfish' +pufferfish_summon_2: + name: '$eventBossLevel &bPooperfish' +pufferfish_summon_3: + name: '$eventBossLevel &bPooderfish' +pufferfish_summon_4: + name: '$eventBossLevel &bPudderfish' +queen_bee: + name: '$eventBossLevel &6Queen Bee' +rabbit_wolf_1: + name: '$eventBossLevel &cFlame Wolf' + locationMessage: '&cFlame: $distance blocks away!' + spawnMessage: '&cA powerful duo has come to this world!' + deathMessage: '&aThe Wolf and the Rabbit were stopped by $players!' + escapeMessage: '&4The Wolf and the Rabbit have left this place!' +rabbit_wolf_2: + name: '$eventBossLevel &cLightning Rabbit' + locationMessage: '&cLightning: $distance blocks away!' + deathMessage: '&aThe Wolf and the Rabbit were stopped by $players!' + escapeMessage: '&4The Wolf and the Rabbit have left this place!' +raug: + name: '$reinforcementLevel &4Raug' +regular_hoglin: + name: '$eventBossLevel &4Regular Hoglin' + locationMessage: '&cRegular Hoglin: $distance blocks away!' + spawnMessage: '&cA Regular Hoglin has arrived! Nothing special about this Hoglin!' + deathMessage: '&aRegular Hoglin was slain by $players!.' + escapeMessage: '&4The Regular Hoglin has left!' +rotting_diver: + name: '$eventBossLevel &bRotting Diver' + locationMessage: '&cRotting Diver: $distance blocks away!' + spawnMessage: '&cA foul corpse floats in the waters!' + deathMessage: '&aThe Rotting Diver was sent to the depths by $players!' + escapeMessage: '&4The Rotting Diver floated away!' +salty_corpse: + name: '$eventBossLevel &bSalty Corpse' + locationMessage: '&cSalty Corpse: $distance blocks away!' + spawnMessage: '&cSomething awful has floated up to the surface!' + deathMessage: '&aThe Salty Corpse was sent back to the depths by $players!' + escapeMessage: '&4The Salty Corpse has left!' +skeleton_knight: + name: '$eventBossLevel &fSkeleton Knight' + locationMessage: '&cSkeleton Knight: $distance blocks away!' + spawnMessage: '&cThe undead have sent a Skeleton Knight into the night!' + deathMessage: '&aThe Skeleton Knight was slain by $players!' + escapeMessage: '&4The Skeleton Knight had to retreat!' +sky_archer: + name: '$eventBossLevel &aSky Archer' + locationMessage: '&cSky Archer: $distance blocks away!' + spawnMessage: '&cA Sky Archer has entered this world! Bring your bow!' + deathMessage: '&aThe Sky Archer got sniped by $players!' + escapeMessage: '&4The Sky Archer has flown away!' +sky_archer_mount: + name: '$eventBossLevel &aSky Steed' +smallstack: + name: '$eventBossLevel &bSmallstack Top' + locationMessage: '&cSmallstack: $distance blocks away!' + spawnMessage: '&cA Smallstack is roaming the wilds!' + deathMessage: '&aThe Smallstack was unstacked by $players!' + escapeMessage: '&4The Smallstack has left!' +smallstack_1: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_2: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_3: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_4: + name: '$eventBossLevel &bSmallstack Bottom' +smallstack_5: + name: '$eventBossLevel &bSmallstack Bottom' +smallstack_6: + name: '$eventBossLevel &bSmallstack Carrier' +snoopy: + name: '&6{&4☠&6} &fSnoopy' + onDamageMessages: + - Woof! + onDamagedMessages: + - Woof! + spawnMessage: '&aAn extremely rare Snoopy has been sighted!' +sorcerer_supreme: + name: '$eventBossLevel &5Sorcerer Supreme' + locationMessage: '&cSorcerer Supreme: $distance blocks away!' + spawnMessage: '&cAn almighty Sorcerer has phased into this world!' + deathMessage: '&aThe Sorcerer Supreme was defeated by $players!' + escapeMessage: '&4The Sorcerer Supreme has left this world!' +sorcerer_supreme_summon: + name: '$eventBossLevel &5Eternal Servant' +spider_knight: + name: '$eventBossLevel &aDwarven Knight' + locationMessage: '&cDwarven Knight: $distance blocks away!' + spawnMessage: '&cA Knight has come to challenge the heroes of this place!' + deathMessage: '&aThe Knight was defeated by $players!' + escapeMessage: '&4The Knight has left this place!' +spider_knight_mount: + name: '$eventBossLevel &aFaithful Steed' +summonable_wolf: + name: '$normalLevel Wolfy' + onDamageMessages: + - Woof! + onDamagedMessages: + - Woof! +super_mite: + name: '$eventBossLevel &dSuper Mite' + locationMessage: '&cSuper Mite: $distance blocks away!' + spawnMessage: '&cA trouble maker appears!' + deathMessage: '&aThe mite could not handle a fight with $players!.' + escapeMessage: '&4The Super Mite left out of boredom!' +super_mite_summon: + name: '$eventBossLevel &dFriendmite' +suspicious_phantom: + name: '$eventBossLevel &eSuspicious Phantom' + locationMessage: '&cSuspicious Phantom: $distance blocks away!' + spawnMessage: '&cA Suspicious Phantom was sighted in the skies!' + deathMessage: '&aThe Phantom was put to bed by $players!' + escapeMessage: '&4The Suspicious Phantom has left!' +suspicious_phantom_summon: + name: '$eventBossLevel &cFlamer' +suspicious_phantom_summon_1: + name: '$eventBossLevel &cFireballer' +test_boss: + name: '$eventBossLevel &6Test boss' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Test Boss has been debugged!' + - '&c&l Третье место по урону: $damager1name &eс $damager1damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&aБыл убит: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - I've hit you! + onDamagedMessages: + - I've been hit! + locationMessage: 'Test entity: $distance' + spawnMessage: A test boss has been spawned! + deathMessage: A test boss has been slain by $players! + escapeMessage: A test boss entity has escaped! +airship_tier_45_knockback: + name: '$normalLevel &2Bow Bowsman' +airship_tier_45_witherblind: + name: '$normalLevel &aNoxious Bowsman' +airship_tier_50_powder_monkeys: + name: '$normalLevel &7Powder Monkey' +airship_tier_50_scourge: + name: '$normalLevel &8Swashbuckling Scourge' +airship_tier_60_mess_hall_mate: + name: '$normalLevel &bMess Hall Mate' +airship_tier_65_boatswain_boss: + name: '$normalLevel &cBoatswain Boss' +airship_tier_65_bodyguard: + name: '$normalLevel &eBuccaneer Bodyguard' +airship_tier_65_silverfish: + name: '$normalLevel &8Ship Rat' +airship_tier_65_silverfish_reinforcement: + name: '$reinforcementLevel &8Ship Mouse' +airship_tier_70_miniboss: + name: '$minibossLevel Quark the Quartermaster ' +airship_tier_70_miniboss_2: + name: '$minibossLevel &6Living Boiler' +airship_tier_70_miniboss_wayfinder: + name: '$minibossLevel &3Wharf Wayfinder' +airship_tier_75_boss: + name: '$bossLevel &4Captain Davey' + deathMessages: + - '&e&l---------------------------------------------' + - '&9Captain Davey was put to rest! ... again.' + - '&c&l Третье место по урону: $damager1name &eс $damager1damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&aБыл убит: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Captain Davey: $distance' + spawnMessage: '&4Captain Davey haunts the skies once more!' + deathMessage: '$players &ahave made &4Captain Davey &ashuffle off his mortal coil!' + escapeMessage: '&6Captain Davey has moved on the haunt another day!' +binder_of_worlds_phase_1: + name: '$eventBossLevel &eBinder of Worlds' + spawnMessage: '&5The binder of worlds approaches!' +binder_of_worlds_phase_1_melee_miniboss: + name: '$reinforcementLevel &9Reality Uprooter' +binder_of_worlds_phase_1_melee_reinforcement: + name: '$reinforcementLevel &8Reality Waster' +binder_of_worlds_phase_1_parkour_reinforcement: + name: '$reinforcementLevel &2Reality Harbinger' +binder_of_worlds_phase_1_ranged_miniboss: + name: '$reinforcementLevel &3Reality Ruiner' +binder_of_worlds_phase_1_ranged_reinforcement: + name: '$reinforcementLevel &6Reality Ruiner' +binder_of_worlds_phase_1_status_miniboss: + name: '$reinforcementLevel &1Reality Wrencher' +binder_of_worlds_phase_1_status_reinforcement: + name: '$reinforcementLevel &7Reality Rupturer' +binder_of_worlds_phase_2: + name: '$eventBossLevel &eBinder of Worlds' +binder_of_worlds_phase_3: + name: '$eventBossLevel &eBinder of Worlds' +binder_of_worlds_phase_3_shulker_reinforcement: + name: '$reinforcementLevel &5Reality Riftrender' +binder_of_worlds_phase_4: + name: '$eventBossLevel &eBinder of Worlds' + deathMessages: + - '&e&l---------------------------------------------' + - '&9The binder is bound to this mortal plane no more!' + - '&c&l Третье место по урону: $damager1name &eс $damager1damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&aБыл убит: $players' + - '&e&l---------------------------------------------' +catacombs_tier_10_miniboss: + name: '$minibossLevel &7Terragog' +catacombs_tier_15_boss: + name: '$bossLevel &6The Rattler' + deathMessages: + - '&e&l---------------------------------------------' + - '&9The Rattler rattled away!' + - '&c&l Третье место по урону: $damager1name &eс $damager1damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&aБыл убит: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Feeling.. rattled? + - Show me your skeleton! + - You're boned! + - Your calcium is weak! + onDamagedMessages: + - I felt that in my bones! + - I've got a bone to pick with you! + - Doot doot mr skeltal + - I need calcium! + locationMessage: 'The Rattler: $distance blocks away!' + spawnMessage: '&6The Rattler rises!' + deathMessage: '&aThe Rattler has been defeated by $players!' +catacombs_tier_15_mimic_boss: + name: '$bossLevel &6The Forgotten' +catacombs_tier_15_reinforcement: + name: '$reinforcementLevel &eUnturned' +catacombs_tier_5_evoker_guard_2: + name: '$normalLevel &7Catacomb Guard' + onDamageMessages: + - No entry! + - Entry is forbidden! +catacombs_tier_5_illusioner_guard_1: + name: '$normalLevel &7Catacomb Guard' + onDamageMessages: + - No entry! + - Entry is forbidden! +colosseum_tier_70_boss_mount: + name: '$bossLevel &4Pit Lord' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Pit Lord is no more!' + - '&c&l Третье место по урону: $damager1name &eс $damager1damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + deathMessage: '&2The Pit Lord has been vanquished by $players!' +colosseum_tier_70_boss_p1: + name: '$bossLevel &cPit Master' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Pit Master has fallen!' + - '&c&l Третье место по урону: $damager1name &eс $damager1damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Pit Master: $distance blocks away!' + spawnMessage: '&4The Pit Master charges into battle once more!' + deathMessage: '&2The Pit Master has been slain by $players!' +colosseum_tier_70_boss_p2: + name: '$bossLevel &cPit Master' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Pit Master has fallen!' + - '&c&l Третье место по урону: $damager1name &eс $damager1damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Pit Master: $distance blocks away!' + deathMessage: '&2The Pit Master has been slain by $players!' +colosseum_tier_70_boss_reinforcements_p1: + name: '$reinforcementLevel &6Gladiator' +colosseum_tier_70_boss_reinforcements_p2: + name: '$reinforcementLevel &6Gladiator' +colosseum_tier_70_gladiator: + name: '$normalLevel &6Gladiator' +colosseum_tier_70_mount_reinforcements: + name: '$reinforcementLevel &cPit Beast' +dark_cathedral_tier_75_boss: + name: '$bossLevel &4Cultist of Cthulhu' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The summoning has been interrupted!' + - '&c&l Третье место по урону: $damager1name &eс $damager1damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Fools! + - Chtulhu R'lyeh! + - None can defeat Chtulhu! + - Stare into the abyss... + locationMessage: 'Cultist of Cthulhu: $distance blocks away' + spawnMessage: '&cA dark cultist is summoning Cthulhu!' + deathMessage: '&2The summoning has been thwarted $players!' + escapeMessage: '&2The cultist has completed the summoning!' +dark_cathedral_tier_75_reinforcement: + name: '$reinforcementLevel Follower of Cthulhu' + onDamageMessages: + - Cthulhu R'lyeh + onDamagedMessages: + - Cthulhu R'lyeh +darkspire_level_100_berserker_brute: + name: '$normalLevel &7Underworld Berserker' +darkspire_level_100_berserker_reanimated: + name: '$normalLevel &fReanimated Underworld Berserker' +darkspire_level_100_blacksmith_brute: + name: '$normalLevel &eSmoldering Goldsmith' +darkspire_level_100_endermite: + name: '$normalLevel &5Voidcrawler' +darkspire_level_100_marksman_piglin: + name: '$normalLevel &9Foolish Marksman' +darkspire_level_100_sentry_brute: + name: '$normalLevel &3Darkguard Sentry' +darkspire_level_100_summon_blaze: + name: '$reinforcementLevel &cHellspawn' +darkspire_level_100_summon_evoker: + name: '$reinforcementLevel &cFalse Hellraiser' +darkspire_level_100_summon_ghast: + name: '$reinforcementLevel &7Maalkvvhar' +darkspire_level_100_summon_husk: + name: '$reinforcementLevel &cOroxak''s Corrupted' +darkspire_level_100_summon_ravager: + name: '$reinforcementLevel &cEerbix the Fallen' +darkspire_level_100_summon_skeleton: + name: '$reinforcementLevel &cRibling' +darkspire_level_110_berserker_reanimated: + name: '$normalLevel &7Reanimated Underworld Berserker' +darkspire_level_110_marksman_reanimated: + name: '$normalLevel &9Reanimated Foolish Marksman' +darkspire_level_110_necromancer_evoker: + name: '$normalLevel &8Black-Hearted Enchanter' +darkspire_level_110_sentry_reanimated: + name: '$normalLevel &3Reanimated Darkguard Sentry' +darkspire_level_110_stationary_stray: + name: '$normalLevel &6Hewn Watchman' +darkspire_level_120_miniboss_evoker: + name: '$minibossLevel &4Hellraiser' +darkspire_level_120_miniboss_illusioner: + name: '$minibossLevel &4Maalkv' +darkspire_level_120_miniboss_skeleton: + name: '$minibossLevel &4Crypt Keeper' +darkspire_level_120_miniboss_stray: + name: '$minibossLevel &4Nicolas Ribcage' +darkspire_level_120_miniboss_vindicator: + name: '$minibossLevel &4Zalmur the Impslayer' +darkspire_level_120_miniboss_wither_skeleton: + name: '$minibossLevel &4Oroxak' +darkspire_level_120_summon_zoglin: + name: '$reinforcementLevel &cArzags Horde' +darkspire_level_130_miniboss_phase_brute: + name: '$bossLevel &4Arzag the Beast' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Arzag the Beast''s invasion has been stopped!' + - '&c&l Третье место по урону: $damager1name &eс $damager1damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' +darkspire_level_130_miniboss_zoglin: + name: '$bossLevel &4Arzag the Beast' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Arzag the Beast''s invasion has been stopped!' + - '&c&l Третье место по урону: $damager1name &eс $damager1damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Arzag the Beast: $distance blocks away' + spawnMessage: '&4Arzag the Beast prepares for the invasion!' + escapeMessage: '&cArzag the Beast is done plundering!' +darkspire_level_80_summon_blaze: + name: '$reinforcementLevel &dFalse Hellspawn' +fireworks_level_50_boss_phase_1: + name: '$eventBossLevel &cSparky' + spawnMessage: '&eSparks fill the sky!' +fireworks_level_50_boss_phase_2: + name: '$eventBossLevel &cSparky' +fireworks_level_50_boss_phase_3: + name: '$eventBossLevel &cSparky' + deathMessages: + - '&e&l---------------------------------------------' + - '&eSparky''s out, party''s over!' + - '&c&l Третье место по урону: $damager1name &eс $damager1damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&aБыл убит: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&6Sparky returns to celebrate!' +fireworks_phase_2_reinforcement: + name: '$eventBossLevel &cBoomi' +fireworks_phase_3_reinforcement: + name: '$eventBossLevel &cPartygoer' +the_great_weaver: + name: '$eventBossLevel &cThe Great Weaver' + locationMessage: '&cThe Great Weaver: $distance blocks away!' + spawnMessage: '&cAwful creatures have appeared!' + deathMessage: '&aThe Great Weaver and it''s brood have been stopped by $players!' + escapeMessage: '&4The Great Weaver and it''s brood have vanished!' +the_great_weaver_summon: + name: '$eventBossLevel &4Brood Mother' +the_great_weaver_summon_1: + name: '$eventBossLevel &6Brood' +halloween_event_boss_mount: + name: '$minibossLevel Daredevil' +halloween_event_boss_p1: + name: '$bossLevel Dullahan' + locationMessage: '&4Dullahan: $distance blocks away!' + spawnMessage: '&4Don''t lose your head now, the headless horseman walks the earth once again!' + deathMessage: '&4The headless horseman was vanquished by $players!' + escapeMessage: '&4The headless horseman has left to haunt someone''s dreams!' +halloween_event_boss_p2: + name: '$bossLevel Dullahan' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Headless Horseman was vanquished!' + - '&c&l Третье место по урону: $damager1name &eс $damager1damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Dullahan: $distance blocks away!' + deathMessage: '&4The headless horseman was vanquished by $players!' + escapeMessage: '&4The headless horseman has left to haunt someone''s dreams!' +halloween_event_boss_reinforcement: + name: '$normalLevel Spooky Skeleton' +the_hunter: + name: '$eventBossLevel &4The Hunter' + locationMessage: '&cThe Hunter: $distance blocks away!' + spawnMessage: '&cA Hunter is on the prowl!' + deathMessage: '&aThe Hunter was hunted to extinction by $players!' + escapeMessage: '&4The Hunter declares the hunt now over!' +the_hunter_mount: + name: '$eventBossLevel &fTamed Beast' +the_living_dead: + name: '$reinforcementLevel &6The Living Dead' +northpole_elf: + name: '$normalLevel &2Workshop Elf' +northpole_elf_summon: + name: '$reinforcementLevel &aSanta''s Elf' +northpole_jack_frost: + name: '$bossLevel &bJack Frost' +northpole_krampus: + name: '$bossLevel &5Krampus' +northpole_mrs_claus: + name: '$bossLevel &cMrs. Claus' +northpole_santa_claus: + name: '$bossLevel &4Santa Claus' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Someone stole all of Santa''s presents!' + - '&c&l Третье место по урону: $damager1name &eс $damager1damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Santa Claus: $distance blocks away' + spawnMessage: '&4Santa Claus is getting ready for Christmas!!' + escapeMessage: '&cSanta set off on his sleigh!' +northpole_skeleton_summon: + name: '$reinforcementLevel &dSoul of the Naughty List' +northpole_snowy_wraith: + name: '$reinforcementLevel &1Snowy Wraith' +the_phantom: + name: '$eventBossLevel &7The Phantom' + locationMessage: '&cThe Phantom: $distance blocks away!' + spawnMessage: '&cA Phantom roams in the dark!' + deathMessage: '&aThe Phantom and his evil troupe have been stopped by $players!' + escapeMessage: '&4The Phantom has left!' +the_phantom_summon_1: + name: '&fCave Spider' +the_phantom_summon_2: + name: '&fWItch' +the_phantom_summon_3: + name: '&fZombie' +the_phantom_summon_4: + name: '&fHusk' +the_phantom_summon_5: + name: '&fDrowned' +the_phantom_summon_6: + name: '&fSkeleton' +the_phantom_summon_7: + name: '&fStray' +the_phantom_summon_8: + name: '&fEnderman' +pirate_ship_tier_10: + name: '$normalLevel &cCrewman' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_15: + name: '$normalLevel &cDeckhand' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_20_melee_1: + name: '$normalLevel &cShipmate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_20_melee_2: + name: '$normalLevel &eDrunken lout' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_20_miniboss: + name: '$minibossLevel &dCookie the Cook' + onDamageMessages: + - Wat're u doin n my kitchen! + - I've got layers! + - You've been served! + - Out me kitchen! + deathMessage: '&2Cookie the Cook''s been sliced and diced by $players!' +pirate_ship_tier_20_ranged: + name: '$normalLevel &cShipmate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_25_miniboss_1: + name: '$miniboss &cCharon the Helmsman' + onDamageMessages: + - Fools ahoy! + - Worthy opponent at prow! + deathMessage: '&2Charon the Helmsman''s been led astray by $players!' +pirate_ship_tier_30_melee: + name: '$normalLevel &cPirate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_30_miniboss_1: + name: '$minibossLevel &7Crushy the Crusher' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! + deathMessage: '&7Crushy the Crusher has been crushed by $players!' +pirate_ship_tier_30_ranged: + name: '$normalLevel &cPirate' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_35: + name: '$normalLevel &4Pirate Navigator' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! +pirate_ship_tier_35_miniboss_1: + name: '$minibossLevel &cSecond Mate' + onDamageMessages: + - You're not allowed here! + - Captain's quarters, back off! +pirate_ship_tier_35_miniboss_2: + name: '$minibossLevel &cSecond Mate' + onDamageMessages: + - You're not allowed here! + - Captain's quarters, back off! +pirate_ship_tier_40_miniboss_1: + name: '$minibossLevel &4First Hand' + onDamageMessages: + - Yarr! + - Harr! + - Avast, matey! + - All hands hoay! + - Dance the hempen jig! + - Ye dungbie! + - Shiver me timbers! + deathMessage: '&6The Pirate Ship''s First Hand has been demoted by $players!' +pirate_ship_tier_45_boss: + name: '$bossLevel &4Captain Blackbeard' + onDamageMessages: + - Get off me ship! + - Arr, landlubers! + spawnMessage: '&4Captain Blackbeard is leading the Pirate Ship!' + deathMessage: '&2Captain Blackbeard''s beard''s been shaved by $players!' + escapeMessage: '&2Captain Blackbeard has run away with the plunder!' +the_returned: + name: '$reinforcementLevel &6The Returned' +ruins_boss_p1: + name: '$eventBossLevel &9Thor' + spawnMessage: '&6Lightning descends down from the sky!' +ruins_boss_p2: + name: '$eventBossLevel &9Thor' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Thor was sent back to Asgard!' + - '&c&l Третье место по урону: $damager1name &eс $damager1damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&aБыл убит: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&6Lightning descends down from the sky!' +ruins_boss_reinforcement: + name: '$eventBossLevel &7Fenrir' +sewer_tier_10: + name: '$normalLevel &fLurker' +sewer_tier_15: + name: '$normalLevel &2Crawler' +sewer_tier_20_dry: + name: '$normalLevel &1Lost Wanderer' +sewer_tier_20_gravity_boss: + name: '$minibossLevel &1Spark' +sewer_tier_20_water: + name: '$normalLevel &1Smuggler' + onDamageMessages: + - You shouldn't be here! + onDamagedMessages: + - None shall stand in our way! +sewer_tier_20_water_boss: + name: '$minibossLevel &1Forgotten Hero' +sewer_tier_20_wither_boss: + name: '$minibossLevel &2Withered Corpse' +sewer_tier_30_ice_boss: + name: '$minibossLevel &2Ice Wraith' +sewer_tier_30_invisibility_boss: + name: '$minibossLevel &2Shadow Archer' +sewer_tier_30_melee: + name: '$normalLevel &5Sewer Beast' +sewer_tier_30_ranged: + name: '$normalLevel &5Spirit Whisperer' + onDamageMessages: + - A curse upon you! + - A pox upon your family! + - Feel the wrath of the spirits! + onDamagedMessages: + - You vex me so! + - Spirits, protect me! +sewer_tier_40: + name: '$normalLevel &6Mirage' + onDamageMessages: + - You victory, a lie + - Your odds, grim + - Your life, mine + onDamagedMessages: + - This pain, an illusion + - This blood, a mirage + - This weakness, a lie +sewer_tier_40_darkness_boss: + name: '$minibossLevel &2The Shadowmaster' +sewer_tier_40_darkness_boss_reinforcement: + name: '$reinforcementLevel &2Shadow' +sewer_tier_40_fire_boss: + name: '$minibossLevel &2The Grill Master' +sewer_tier_40_fire_boss_reinforcement: + name: '$reinforcementLevel &2Flame' +sewer_tier_40_poison_boss: + name: '$minibossLevel &2Toxic Gardener' + onDamageMessages: + - Feel nature's wrath! + onDamagedMessages: + - To me, minions! +sewer_tier_40_poison_boss_reinforcement: + name: '$reinforcementLevel &2Fallen Gardener' +sewer_tier_5: + name: '$normalLevel &7Sewer worker' + onDamageMessages: + - This area is restricted! + - Don't jump into the vats! + - | + You're not supposed to be here| + onDamagedMessages: + - Do you know what you're doing!? + - Foolishness! + - Don't you dare! +sewer_tier_50: + name: '$normalLevel &3Sewer Piranha' +sewer_tier_50_lightning_boss: + name: '$minibossLevel &2Mjolnir' +sewer_tier_50_ravager_boss: + name: '$minibossLevel &2Sewer Monstrosity' +sewer_tier_50_spider_boss: + name: '$minibossLevel &2Ancient Crawler' +sewer_tier_50_spider_boss_reinforcement: + name: '$reinforcementLevel &2Spiderling' +sewer_tier_50_water_boss: + name: '$minibossLevel &2Piranha King' +sewer_tier_50_water_boss_reinforcement: + name: '$reinforcementLevel &2Piranha Prince' +sewer_tier_60: + name: '$normalLevel &4Drowned One' +sewer_tier_70_boss: + name: '$bossLevel &4Drowned King' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Drowned King has been slain!' + - '&c&l Третье место по урону: $damager1name &eс $damager1damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&cThe sewers echo with the clamor of a returned king...' + deathMessage: '&2The Drowned King has been slain!' + escapeMessage: '&2The sewers grow quiet, for now...' +sewer_tier_70_boss_reinforcement: + name: '$reinforcementLevel &4Drowned One' +totem_zombie_1: + name: '$eventBossLevel Head Zombie' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Zombie Totem been slain!' + - '&c&l Третье место по урону: $damager1name &eс $damager1damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&aБыл убит: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cZombie Totem: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine abomination has been sighted!' + deathMessage: '&aDr. Craftenmine''s abomination been terminated by $players!' + escapeMessage: '&4Dr. Craftenmine''s creation has escaped!' +totem_zombie_2: + name: '$eventBossLevel Totem Zombie' +totem_zombie_3: + name: '$eventBossLevel Totem Zombie' +totem_zombie_4: + name: '$eventBossLevel Totem Zombie' +totem_zombie_5: + name: '$eventBossLevel Totem Zombie' +totem_zombie_6: + name: '$eventBossLevel Totem Zombie' +treasure_goblin: + name: '$eventBossLevel &eЛепрекон' + deathMessages: + - '&e&l---------------------------------------------' + - '&eЛепрекон был разграблен!' + - '&c&l Третье место по урону: $damager1name &eс $damager1damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&aБыл убит: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cЛепрекон: в $distance блоках!' + spawnMessage: '&cA Лепрекон был замечен!' + deathMessage: '&aA Лепрекон был повержен $players!' + escapeMessage: '&4A Лепрекон сбежал!' +tree_defender: + name: '$eventBossLevel &2Tree Defender' +undead_farmer: + name: '$eventBossLevel &aUndead Farmer' + locationMessage: '&cUndead Farmer: $distance blocks away!' + spawnMessage: '&cAn Undead Farmer walks the earth!' + deathMessage: '&aThe Undead Farmer''s career was ended by $players!' + escapeMessage: '&4The Undead Farmer has gone back to rest!' +undead_farmer_summon: + name: '$eventBossLevel &2Farmers Pride' +undead_farmer_summon_1: + name: '$eventBossLevel &2Failed Hog' +undead_horde_summon_1: + name: '$reinforcementLevel &aUndead Horde' +undead_horde_summon_2: + name: '$reinforcementLevel &dUndead Horde' +undead_horde_summon_3: + name: '$reinforcementLevel &eUndead Horde' +unwanted_visitor: + name: '$eventBossLevel &9Unwanted Visitor' + locationMessage: '&cUnwanted Visitor: $distance blocks away!' + spawnMessage: '&cAn Unwanted Visitor has come to the nether to warm up!' + deathMessage: '&aThe Visitor was slain by $players!' + escapeMessage: '&4The Visitor has gone back to his chilly domain!' +unwanted_visitor_summon: + name: '$eventBossLevel &bIce Clone' +vampire_boneman: + name: '$reinforcementLevel &7Drainlings' +vampire_brute: + name: '$normalLevel &1Vampire Brute' +vampire_brute_coffin_breaker: + name: '$normalLevel &1Vampire Brute' +vampire_brute_gargoyle_rush_left: + name: '$normalLevel &3Vampire Brute' +vampire_brute_gargoyle_rush_left_phase_2: + name: '$normalLevel &3Vampire Brute' +vampire_brute_gargoyle_rush_right: + name: '$normalLevel &3Vampire Brute' +vampire_brute_gargoyle_rush_right_phase_2: + name: '$normalLevel &3Vampire Brute' +vampire_fledgling: + name: '$normalLevel &9Vampire Fledgling' +vampire_fledgling_coffin_breaker: + name: '$normalLevel &9Vampire Fledgling' +vampire_fledgling_gargoyle_overlord: + name: '$normalLevel &9Vampire Fledgling' +vampire_gargoyle: + name: '$normalLevel &6Vampire''s Gargoyle' +vampire_grunt: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_coffin_breaker: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_left: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_left_phase_2: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_right: + name: '$normalLevel &1Vampire Grunt' +vampire_grunt_gargoyle_rush_right_phase_2: + name: '$normalLevel &1Vampire Grunt' +vampire_hound: + name: '$reinforcementLevel &bVampire Hound' +vampire_king: + name: '$bossLevel &4Vampire King' + deathMessages: + - '&e&l---------------------------------------------' + - '&4The Vampire King has been slain!' + - '&c&l Третье место по урону: $damager1name &eс $damager1damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&4Slayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Vampire King: $distance blocks away.' + spawnMessage: '&cThe Vampire King crawls back to his throne...' + deathMessage: '&2The Vampire King has been smitten!' + escapeMessage: '&2Darkness flees, but for how long...' +vampire_king_phase_2: + name: '$bossLevel &4Vampire King' +vampire_king_phase_3: + name: '$bossLevel &4Vampire King' +vampire_king_phase_4: + name: '$bossLevel &4Vampire King' +vampire_king_phase_5: + name: '$bossLevel &4Vampire King' +vampire_king_phase_6: + name: '$bossLevel &4Vampire King' +vampire_level_120_miniboss_evoker: + name: '$minibossLevel &4Hellraiser''s Spirit' +vampire_level_120_miniboss_skeleton: + name: '$minibossLevel &4Crypt Keeper''s Spirit' +vampire_level_120_miniboss_stray: + name: '$minibossLevel &4Nicolas Ribcage''s Spirit' +vampire_level_120_miniboss_wither_skeleton: + name: '$minibossLevel &4Oroxak''s Spirit' +vampire_necromancer: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_dining_hall: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_entrance: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_foresight_pool: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_gargoyle_rush: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_gargoyle_rush_phase_2: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_left_bedroom: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_right_bedroom: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_supply_room: + name: '$normalLevel &5Vampire Necromancer' +vampire_necromancer_supreme_coffin_breaker: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_2: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_3: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_4: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_coffin_breaker_phase_5: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_gargoyle_overlord: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_gargoyle_overlord_phase_2: + name: '$minibossLevel &5Vampire Necromancer Supreme' +vampire_necromancer_supreme_gargoyle_overlord_phase_3: + name: '$minibossLevel &2Gargoyle Overlord' +vampire_sentinel: + name: '$minibossLevel &eVampire''s Sentinel' +vampire_thrall: + name: '$reinforcementLevel &dVampire''s Thrall' +vampire_wraith: + name: '$minibossLevel &8Drained One' +vampire_wraith_phase_2: + name: '$minibossLevel &8Drowned One' +vampire_zombie: + name: '$normalLevel &aDrained Husk' +vex_top: + name: '$eventBossLevel &eVex Selfish Top' + locationMessage: '&cVex Troublemakers: $distance blocks away!' + spawnMessage: '&cA gang of Vex Troublemakers have appeared!' + deathMessage: '&aThe Vex Troublemakers were slain by $players!' + escapeMessage: '&4The Vex Troublemakers have decided to leave.' +vex_top_mount_1: + name: '$eventBossLevel &6Vex Bottom' +vex_top_mount_2: + name: '$eventBossLevel &6Vex Bottom' +vex_top_mount_3: + name: '$eventBossLevel &6Vex Bottom' +warlock: + name: '$eventBossLevel &dWarlock' + locationMessage: '&cWarlock: $distance blocks away!' + spawnMessage: '&cA demon riding Warlock has appeared!' + deathMessage: '&aThe Warlock was slain by $players!' + escapeMessage: '&4The Warlock ran away on his demon!' +warlock_mount: + name: '$eventBossLevel &dDemon' +wasp_queen: + name: '$eventBossLevel &aWasp Queen' + locationMessage: '&cWasp Queen: $distance blocks away!' + spawnMessage: '&cA wasp swarm has been sighted!' + deathMessage: '&aThe wasp swarm was eliminated by $players!' + escapeMessage: '&4The wasp swarm has flown away.' +wasp_queen_summon: + name: '$eventBossLevel &aWasp' +water_pest: + name: '$eventBossLevel &3Water Pest' + locationMessage: '&cWater Pest: $distance blocks away!' + spawnMessage: '&cAn annoying foe swims the waters!' + deathMessage: '&aThe Water Pest was slain by $players!' + escapeMessage: '&4The waters are clear of all Pests' +weapons_goblin: + name: '$eventBossLevel &cWeapons Goblin' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Weapons Goblin has been pillaged!' + - '&c&l Третье место по урону: $damager1name &eс $damager1damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&e&l Третье место по урону: $damager3name &eс $damager3damage урона!' + - '&aБыл убит: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cWeapons Goblin: $distance blocks away!' + spawnMessage: '&cA Weapons Goblin has been sighted!' + deathMessage: '&aA Weapons Goblin has been slain by $players!' + escapeMessage: '&4A Weapons Goblin has escaped!' +wendigo: + name: '$eventBossLevel &7Wendigo' + locationMessage: '&cWendigo: $distance blocks away!' + spawnMessage: '&cSomething awful has appeared!' + deathMessage: '&aThe Wendigo has been slain $players!.' + escapeMessage: '&4The Wendigo has disappeared!' +wendigo_summon: + name: '$reinforcementLevel &aWindigo' +werehare: + name: '$eventBossLevel &5Alice' + locationMessage: '&cWerehare: $distance blocks away!' + spawnMessage: '&cA bloody roar can be heard! A werehare approaches!' + deathMessage: '&a$players! made sure to end the werehare''s reign!' + escapeMessage: '&4The werehare escaped!' +werehare_p2: + name: '$eventBossLevel &dWerehare' +wild_wolf: + name: '$reinforcementLevel &7Wild Wolf' +wood_league_wave_10_boss: + name: '$bossLevel &4Bad Doggo' +wood_league_wave_10_reinforcement: + name: '$reinforcementLevel &cBad Pupper' +wood_league_wave_11_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_11_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_12_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_12_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_13_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_13_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_14_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_14_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_15_miniboss: + name: '$bossLevel &4Mr. Oinkers' + onDamagedMessages: + - Oink!? +wood_league_wave_16_melee: + name: '$normalLevel Mr. Oinkers Fan' +wood_league_wave_16_ranged: + name: '$normalLevel Mr. Oinkers Fan' +wood_league_wave_17_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_17_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_18_melee: + name: '$normalLevel &4Fencing Club Enthusiast' +wood_league_wave_19_ranged: + name: '$normalLevel Archery Club Enthusiast' +wood_league_wave_1_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_1_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_20_boss: + name: '$bossLevel &2Zoltan' +wood_league_wave_21_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_21_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_22_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_22_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_23_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_23_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_24_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_24_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_25_miniboss: + name: '$minibossLevel &bAgdluak' +wood_league_wave_26_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_26_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_27_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_27_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_28_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_29_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_2_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_2_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_30_boss: + name: '$bossLevel &2The Southern Viper' +wood_league_wave_31_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_31_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_32_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_32_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_33_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_33_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_34_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_34_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_35_miniboss: + name: '$minibossLevel &6The Jester' +wood_league_wave_36_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_36_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_37_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_37_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_38_melee: + name: '$normalLevel &4Arena Swordsman' +wood_league_wave_39_ranged: + name: '$normalLevel Arena Archer' +wood_league_wave_3_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_3_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_40_boss: + name: '$bossLevel &cCrucio the Bearer of Curses' +wood_league_wave_41_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_41_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_42_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_42_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_42_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_43_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_43_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_43_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_44_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_44_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_44_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_45_miniboss: + name: '$minibossLevel &6Thousand Blades' +wood_league_wave_46_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_46_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_46_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_47_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_47_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_47_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_48_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_48_melee: + name: '$normalLevel &4Arena Zombie' +wood_league_wave_49_healer: + name: '$normalLevel Arena Healer' +wood_league_wave_49_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_4_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_4_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_50_boss: + name: '$bossLevel &6Uther the Champion' +wood_league_wave_50_boss_p2: + name: '$bossLevel &6Uther the Champion' +wood_league_wave_50_boss_p3: + name: '$bossLevel &6Uther the Champion' +wood_league_wave_50_reinforcement: + name: '$reinforcementLevel &6Uther Stan' +wood_league_wave_5_miniboss: + name: '$minibossLevel &cWeird Cow' + onDamagedMessages: + - Woof! +wood_league_wave_6_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_6_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_7_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_7_ranged: + name: '$normalLevel Arena Crossbowman' +wood_league_wave_8_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_9_ranged: + name: '$normalLevel Arena Crossbowman' +yeti: + name: '$eventBossLevel &bYeti' + locationMessage: '&cYeti: $distance blocks away!' + spawnMessage: '&cA mighty beast has appeared!' + deathMessage: '&aThe beast is no more thanks to $players!.' + escapeMessage: '&4The beast has escaped!' +yezhi_baba: + name: '$eventBossLevel &cYezhi Baba' + locationMessage: '&cYezhi Baba: $distance blocks away!' + spawnMessage: '&cA foul hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +yezhi_baba_summon: + name: '$reinforcementLevel &4Yezhi Baba' +zombie_friends_friend: + name: '$reinforcementLevel &7Zombie Friend' +zombie_king: + name: '$eventBossLevel &4Король Зомби' + locationMessage: '&cКороль Зомби: в $distance блоках!' + spawnMessage: '&cКороль Зомби был замечен неподалёку!' + deathMessage: '&aКороль Зомби был повержен $players!' + escapeMessage: '&4Король Зомби сбежал!' +zombie_parents_dad: + name: '$reinforcementLevel &7Zombie Dad' +zombie_parents_mom: + name: '$reinforcementLevel &7Зомби Мама' +back_teleporter: + name: Гермес + role: + greetings: + - Добро пожаловать в\nГильдию Искателей Приключений! + dialog: + - Хотите вернуться? + farewell: + - Счастливого пути, друг. + noPreviousLocationMessage: '&8[EliteMobs] &cНе удалось отправить вас обратно к предыдущему местоположению - предыдущее местоположение не найдено!' +barkeep: + name: Бартли + role: + greetings: + - Нужен напиток? + - Хотите выпить? + - Жажда? + - Привет, напарник. + dialog: + - Возьмите одно из наших фирменных блюд. + - Специальные напитки \nих больше нигде не найдут. + - Один вкус и вы будете держать\nвозвращаться из других. + farewell: + - Возвращайтесь в любое время + - Пьем до дна! + - Kampai! + - Салют! + - Brosd! + - Салют! + - À la vôtre! + - Prost! + - Санти! + - Начнем! + - Засада! + - Всего доброго! + - 乾杯! +blacksmith: + name: Грег + role: + greetings: + - Добро пожаловать! + - Продавайте свои вещи здесь! + - Новые вещи только для вас! + - Есть что продать? + - Ищите что-то новое? + - Свежие товары каждый раз! + dialog: + - Чем выше уровень мобов, тем выше\nценность! + - Предмет стоит дороже чем больше на нём чар! + - Чем выше уровень мобов, тем выше\nценность! + - Мобы более высокого уровня имеют на\nбольший шанс выбрасывать предметы! + - + - + - Некоторые предметы имеют специальные\nэффекты зелья! + - Некоторые предметы имеют уникальные\nэффекты! + - Охотник зачарование\nпривлекает элитных мобов в ваше\nместоположение! + - Специальное оружие и броня\nупали элитные мобы\nмогут быть проданы здесь! + - Более высокие ранги гильдии\nувеличит качество добычи\nот элитных мобов! + farewell: + - Спасибо за то, что Вы с нами! + - Возвращайтесь скорее! + - Заходи ещё. + - Рекомендовать это приложение своим друзьям. +combat_instructor: + name: Чарлс + role: + greetings: + - Хотите узнать о битве? + - Нужен боевой урок? + - Хотите узнать больше о битве? + - Готовы сражаться с Элитными Мобами? + dialog: + - Предметы вокруг Элитных Мобов\nпоказывают какие силы у них есть. + - Чем выше уровень\nЭлитного моба, тем\nон может получить больше сил. + - Чем выше уровень\nЭлитного моба, тем лучше\nдобыча + - Элитные мобы более высокого уровня\nимеют больше шансов\nвыбрасывать специальные предметы + - Элитные мобы плавущими\nстрелами, стреляющими в\nсоседних игроков + - Элитные мобы с плавающими\nглазами сделают вас слепыми \nкогда они попадут в вас + - Элитные мобы с частицами заклинаний\nпутают вас\nкогда они напали на вас + - Элитные мобы с плавущими\nведрами наложат на вас огонь\nкогда они нападут на вас + - |- + Elite Mobs with floating\nfireballs fire fireballs + at nearby players + - Элитные мобы с плавающими\nглазами сделают вас слепыми \nкогда они попадут в вас + - Элитные мобы с плавающими\nглазами сделают вас слепыми \nкогда они попадут в вас + - Элитные мобы с плавающими\nглазами сделают вас слепыми \nкогда они попадут в вас + - Элитные мобы с плавающими\nглазами сделают вас слепыми \nкогда они попадут в вас + - Элитные мобы с плавающими\nглазами сделают вас слепыми \nкогда они попадут в вас + - Элитные мобы с плавающими\nглазами сделают вас слепыми \nкогда они попадут в вас + - Элитные мобы с плавающими\nглазами сделают вас слепыми \nкогда они попадут в вас + - Элитные мобы с плавающей\nсундуками дадут бонусные предметы\n, когда вы убиваете их + - Элитные мобы с плавущими\nсапогами золота быстрее + - Элитные мобы с плавающими\nджекборами сбежали вас\nво время боя + - Элитные мобы с плавающей\nстеклянной панелью невидимы + - Элитные мобы с плавущими\nспектральными стрелами иммунной\nк стрелам + - Элитные мобы с плавущими\nперьями не имеют\nдля нанесения урона + - Элитные мобы с плавущими\nперьями не имеют\nдля нанесения урона + - Элитные мобы с плавающей\nнаковальней тяжелее\n, чем обычно, + - Элитные мобы с плавущими блоками\nкостей оставляют за собой\nтрупов при убийстве + - Элитные мобы с плавающей\nнаковальней тяжелее\n, чем обычно, + - Элитные мобы с плавучими\nсливовыми шарами создают вакцину\nпосле смерти + - Элитные мобы с плавающими\nглазами сделают вас слепыми \nкогда они попадут в вас + - Элитные мобы с плавучими\nкостями создают костяные столбы\nво время боя + - Элитные мобы с плавущими\nстрелами, стреляющими за\nстрелами во время боя + - Элитные мобы с плавающим\nгрибов расцвели до гигантов,\nпри попадании + - Элитные мобы с плавущими\nчерепами вызывают подкрепления\n, когда ударо + - Элитные мобы с плавающей\nкнигой призывают подкрепления\nдо тех пор, пока вы не убьете призрака + - Элитные Мобы с плавущими\nяйцами призывают подкрепления\nпри попадании + - Элитные мобы с плавущими\nчерепами вызывают подкрепления\n, когда ударо +enhancer_config: + name: Тим + role: + greetings: + - Хотите улучшить предметы? + - Есть сферы улучшения? + - Улучшите вещи здесь! + - На палубе! + - У тебя есть лом, сынок? + dialog: + - Ваши вещи,\n улучшайте здесь! + - Улучшите предметы здесь! + - Есть сфера улучшения? + - Этот меч выглядит ужасным,\nулучшите его! + - Нужно улучшить? + farewell: + - Не смущайтесь! + - Возвращайтесь, когда у вас будет больше сфер! + - Иди получи больше сфер! +frost_queen_teleporter: + name: Ishard the Frostbitten + role: + greetings: + - '' +guide_0: + name: Dux + role: + greetings: + - Heard about the AG? + - Been to the AG? + - Heard of the Adventurer's Guild? + - Know about the Adventurer's Guild? + dialog: + - Heard about the AG? + - Been to the AG? + - Heard of the Adventurer's Guild? + - Know about the Adventurer's Guild? + farewell: + - Возвращайтесь в любое время + - Я буду здесь, если я тебе понадоблюсь! + - I'll be around! + - See you later! +guide_1: + name: Casus + role: + greetings: + - Need guidance? + - Need a hint + - Are you lost? + - Need help? + dialog: + - I know everything about\nthis place! + - Want to meet the other members\nof the Adventurer's Guild? + - Need to learn your way around\nthis place? + farewell: + - Возвращайтесь в любое время + - Я буду здесь, если я тебе понадоблюсь! + - I'll be around! + - See you later! +guild_attendant: + name: Гиллиан + role: + greetings: + - Добро пожаловать в\nГильдию Искателей Приключений! + - Добро пожаловать! + dialog: + - Проверьте квест, чтобы\nувидел активные! + - Вы можете поговорить со мной,\nизменить свой ранг гильдии! + - Вы можете продать предметы кузнецу\nза монеты! + - Вы можете поговорить с ареной\nмастер, чтобы получить арену! + - Вы можете купить снаряжение у\nкузнеца! + - Вы можете поговорить с мастером боя\n, чтобы проверить свой уровень боя! + - Разблокировка новых уровней гильдии\nувеличивает ваше максимальное здоровье! + farewell: + - Увидимся! + - Спасибо, что зашли! + - Счастливой охоты! +primis_69ozcanofbepis: + name: '&a69OzCanOfBepis' + role: '&2Map Maker (Uuuuge gamer)' + dialog: + - Hope you are enjoying the map! + farewell: + - Have fun! +primis_caeruleaum_fisherman: + name: '&3Piscis Nemesis' + role: '&b' + greetings: + - Hiya!. + dialog: + - Woah! Almost fell off the boat. + - Darn sea monster! + - Need more bait. + farewell: + - Later! + - Good luck! +primis_caeruleaum_fletcher: + name: '&6Ventus Artifex' + role: '&e' + greetings: + - Приветствую. + dialog: + - I used to be an adventurer like you. + - Welcome, outsider + - Нужно что-нибудь? + - |- + You're not from around these parts, + are you? + farewell: + - See you 'round! + - Возвращайтесь скорее! +primis_caeruleaum_forager: + name: '&5Venator Pabulatus' + role: '&d' + greetings: + - Hello, stranger. + dialog: + - I used to be an adventurer like you. + - Welcome, outsider + - Нужно что-нибудь? + - |- + You're not from around these parts, + are you? + farewell: + - See you 'round! + - Возвращайтесь скорее! +primis_caeruleaum_hint_giver: + name: '&fVir Loquax' + role: '&fWise Man' + greetings: + - Hi there! + - Hello! + - It is good to see you! + - Приветствую! + dialog: + - + - + - + - + - The ruins in the southwest are such a horrible place!\n Who would ever go there... + - + - + - I heard that a nasty type of\nwolf has settled in the wolf den! + farewell: + - Goodbye! + - See you later! + - Come visit me again! + - Farewell! +primis_caeruleaum_injured_fisherman: + name: '&3Callidus Piscatus' + role: '&b' + greetings: + - Hello, wanderer. + dialog: + - Caught any good fish lately? + - Welcome, outsider + - Нужно что-нибудь? + - |- + You're not from around these parts, + are you? + farewell: + - See you 'round! + - Возвращайтесь скорее! +primis_caeruleaum_jeeves: + name: Jeeves + role: + greetings: + - Just traveling! + dialog: + - Just here to sell\nto the shop-keep. + - I'm busy negotiating\nhere. + - Not right now,\ncome back later. + farewell: + - Uhuh... +primis_caeruleaum_leader: + name: '&4Chief Piscis' + role: '&c' + greetings: + - Welcome to our village! + dialog: + - |- + Ask not what this village can do for you, + ask what you can do for this village! + - Welcome, outsider + - Нужно что-нибудь? + - |- + You're not from around these parts, + are you? + farewell: + - Off you go! + - Возвращайтесь скорее! +primis_caeruleaum_merchant: + name: Emptor + role: + greetings: + - Есть что продать? + dialog: + - Bandits stole my wares! + - Got nothing to sell, I'm afraid. + - I'll buy anything you have! + farewell: + - Безопасные путешествия! +primis_captain: + name: '&4Captain Squalus' + role: '&c' + greetings: + - So you're finally awake! + - That was a wild ride! + - Still alive? + - Let's not do that again! + dialog: + - I've got a task for you! + - I need your help! + - |- + Good thing you're here, + we need some help! + farewell: + - Off you go! + - Don't forget about me! + - Возвращайтесь скорее! +primis_deli'o: + name: '&eDéli''O' + role: '&6Map Maker (Gamer)' + dialog: + - Hope you are enjoying the map! + farewell: + - Have fun! +primis_farmstead_son: + name: '&4Filius' + role: '&c' + greetings: + - Where do you fare from? + - You seem like you came a long way from here. + dialog: + - Dangerous times we live in. + - Have you seen my father? + - Without a lighthouse, how will boats navigate? + farewell: + - Watch your back! + - Tread lightly! +primis_farmstead_wife: + name: '&4Amavit' + role: '&c' + greetings: + - I haven't seen you before! + - Any news from Pontis Mille? + dialog: + - Have you seen my husband? + - I need your help! + - What dangerous times we live in. + - Something is amiss! + farewell: + - Безопасные путешествия! + - Thank you! +primis_first_mate: + name: '&cIracundi' + role: '&c' + greetings: + - So you're finally awake! + - That was a wild ride! + - Still alive? + - Let's not do that again! + dialog: + - I've got a task for you! + - I need your help! + - |- + Good thing you're here, + we need some help! + farewell: + - Off you go! + - Don't forget about me! + - Возвращайтесь скорее! +primis_frostcone: + name: '&bFrostCone' + role: '&9Map Maker (Gamer)' + dialog: + - Hope you are enjoying the map! + - It's a pine-cone covered in snow. + - Is Primis out yet? + farewell: + - Have fun! +primis_gladius_guard_1: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_guard_2: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_guard_3: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_guard_4: + name: '&2Town Guard' + role: '&a' + greetings: + - Tread lightly! + - Reinforcements? + - Damned invaders! + - Watch your back! + - Be careful. +primis_gladius_lord: + name: '&4General Hasta' + role: '&c' + greetings: + - Are you here to help? + - It's a war zone out there! + dialog: + - They came in the night! + - We never saw them coming! + - Where are our reinforcements? + farewell: + - Watch your back! + - Tread lightly! +primis_gladius_quartermaster: + name: '&6Cibus' + role: '&c' + greetings: + - Are you here to help? + - It's a war zone out there! + dialog: + - They came in the night! + - We never saw them coming! + - Where are our reinforcements? + farewell: + - Watch your back! + - Tread lightly! +primis_gladius_strategist: + name: '&6Belli' + role: '&c' + greetings: + - Are you here to help? + - It's a war zone out there! + dialog: + - They came in the night! + - We never saw them coming! + - Where are our reinforcements? + farewell: + - Watch your back! + - Tread lightly! +primis_groves_nemus_leader: + name: '&3King Nemian' + role: '&c' + dialog: + - What brings you under the hill? + - Where are you from? + - |- + Have you tried our + delicious glow berries? + farewell: + - Until next time. +primis_ice_village_fisherman_boat: + name: '&3Theopropides Nero' + role: '&3' + greetings: + - Fishy day! + dialog: + - A chilly day for fishing. + - They aren't biting. + - Just gotta be patient. + farewell: + - Don't fall into\nthe water! +primis_ice_village_friendly_villager: + name: '&3Luxuria Placidus' + role: '&3' + greetings: + - Hellos! + dialog: + - Old age will not\nslow me down! + - Being in a good\nmood is important. + - Hoping for some\nsnow soon. + farewell: + - Farewell! +primis_ice_village_generic_npc_1: + name: '&3Albertus Vitalis' + role: '&3' + greetings: + - How goes it. + dialog: + - Nothing like good ale! + farewell: + - Bye. +primis_ice_village_generic_npc_10: + name: '&3Trebatia Cornix' + role: '&3' + greetings: + - OK. + dialog: + - Yep, got it. + - I see... + - Oh! + farewell: + - I will try that\nnext time. +primis_ice_village_generic_npc_11: + name: '&3Albatia Lateranus' + role: '&3' + greetings: + - Visiting Violet? + dialog: + - Don't cause trouble. + farewell: + - Later stranger. +primis_ice_village_generic_npc_12: + name: '&3Hostilia Carantus' + role: '&3' + greetings: + - Hi. + dialog: + - I was just\nleaving. + farewell: + - Bye. +primis_ice_village_generic_npc_13: + name: '&3Vagennia Sejanus' + role: '&3' + greetings: + - Hiya. + dialog: + - What brings you\nto the docks? + farewell: + - See ya. +primis_ice_village_generic_npc_14: + name: '&3Dinia Vettonius' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_15: + name: '&3Sceledrus Marcallas' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_16: + name: '&3Fridericus Castinus' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_17: + name: '&3Cario Fimbria' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_18: + name: '&3Piscatores Laevinus' + role: '&3' + greetings: + - Hi.. + dialog: + - Another day... + farewell: + - '...' +primis_ice_village_generic_npc_19: + name: '&3Monkerius Vitalis' + role: '&3' + greetings: + - Been hunting? + dialog: + - Time to go hunting. + farewell: + - Farewell. +primis_ice_village_generic_npc_2: + name: '&3Luxuria Tyranus' + role: '&3' + greetings: + - How goes it. + dialog: + - One more! + farewell: + - Bye. +primis_ice_village_generic_npc_3: + name: '&3Aurelio Nigidius' + role: '&3' + greetings: + - Hey there. + dialog: + - What a sight! + farewell: + - Goodbye. +primis_ice_village_generic_npc_4: + name: '&3Lysidamus Paratus' + role: '&3' + greetings: + - Out for a walk? + dialog: + - I couldn't imagine\nliving somewhere\nwithout snow. + - Starting to get chilly. + farewell: + - Until later. +primis_ice_village_generic_npc_5: + name: '&3Simo Proceus' + role: '&3' + greetings: + - What a view! + dialog: + - I love climbing. + - Look at all the fish! + farewell: + - Yep. +primis_ice_village_generic_npc_6: + name: '&3Dordalus Marullinus' + role: '&3' + greetings: + - Welcome to the pub! + dialog: + - Time to warm up\nmy fingers. + - Nice and warm. + farewell: + - Don't let the\ncold get ya. +primis_ice_village_generic_npc_7: + name: '&3Tranio Silvanus' + role: '&3' + greetings: + - Here somewhere.. + dialog: + - Where is it. + farewell: + - I was sure I\nleft it here. +primis_ice_village_generic_npc_8: + name: '&3Milonia Trebellius' + role: '&3' + greetings: + - Welcome to our\nvillage! + dialog: + - I sure am hungry. + - Could go for\nsome salmon. + farewell: + - Farewell. +primis_ice_village_generic_npc_9: + name: '&3Barria Brocchus' + role: '&3' + greetings: + - Did you hear... + dialog: + - Keep that in mind\nnext time you swing\nyour sword. + - The shield can be\nmore than defense. + farewell: + - Got it? +primis_ice_village_hunter: + name: '&3Alanus Isatis' + role: '&3' + greetings: + - Hey! + dialog: + - Hoping for a good\nday tomorrow. + - Sure are many Razorbacks\nout this season. + farewell: + - Be seeing you. +primis_ice_village_imprisoned_husband: + name: '&3Eleusium Calenus' + role: '&3' + greetings: + - '.....' + dialog: + - Another day in a cage... + farewell: + - '.....' +primis_ice_village_jail_caretaker: + name: '&3Philolaches Triferus' + role: '&3' + greetings: + - Hey there. + dialog: + - What else needs\nfixing. + - I should check up\non the cages. + farewell: + - Later. +primis_ice_village_jail_guard: + name: '&3Eleusium Festus' + role: '&3' + greetings: + - Climbed the\ntower eh. + dialog: + - Everything seems in order. + - Almost everything... + farewell: + - Take care. +primis_ice_village_jail_master: + name: '&3Romanus Superbus' + role: '&3' + greetings: + - Well met. + dialog: + - Don't do the crime if\nyou can't do the time. + - Crime doesn't pay. + farewell: + - Until later. +primis_ice_village_leader: + name: '&3Glacies Princeps' + role: '&3' + greetings: + - Hey. + dialog: + - Darn Ice Elemental! + - Too many problems... + - How are we supposed to\ncomplete the trials now. + farewell: + - Goodbye. +primis_ice_village_lighthouse_keeper: + name: '&3Severinus Martius' + role: '&3' + greetings: + - Well met stranger. + dialog: + - Calm day today. + - Watch out for\nthe Ursus! + farewell: + - Take it easy. +primis_ice_village_missing_daughter: + name: '&3Cornelia Ennodius' + role: '&3' + greetings: + - Help... + dialog: + - Go away, go away,\nGO AWAY! + - They are not\nreal... + - Just don't look\nat them Cornelia. + farewell: + - Bye. +primis_ice_village_prisoner: + name: '&3Adrius Calpornius' + role: '&3' + greetings: + - I am innocent! + dialog: + - This is not where\nI belong!!! + farewell: + - Get me out of here! +primis_ice_village_pubkeeper: + name: '&3Grania Cecilius' + role: '&3' + greetings: + - Welcome! + dialog: + - Coming right up! + - Try our black ale! + - Need a drink? + farewell: + - One coming up! +primis_ice_village_tower_squatter: + name: '&3Modestus Eulogius' + role: '&3' + greetings: + - The noise! + dialog: + - So much screeching! + - Just trying to\nenjoy the peace. + farewell: + - Bye. +primis_ice_village_violet: + name: '&5Domina Violet' + role: '&d' + greetings: + - Did I ask\nyour opinion? + dialog: + - Feels good to\nget it out. + - They're gonna pay\nwhile I collect. + farewell: + - No, that's what I thought. +primis_ice_village_worried_father: + name: '&3Sparax Ennodius' + role: '&3' + greetings: + - I hope she is OK... + dialog: + - Let our girl be\nsafe, please. + farewell: + - Bye. +primis_ice_village_worried_mother: + name: '&3Sestia Ennodius' + role: '&3' + greetings: + - Where did she go. + dialog: + - Hmm, lost the trail. + farewell: + - Bye. +primis_ice_village_worried_wife: + name: '&3Titia Calenus' + role: '&3' + greetings: + - Hiya! + dialog: + - Nice and clean beds. + - Did I miss something? + - Another chest sorted. + farewell: + - Bye! +primis_magmaguy: + name: '&4Magmaguy' + role: '&cLead Developer (Non-gamer)' + dialog: + - Hope you are enjoying the map! + farewell: + - Have fun! +primis_mountain_guide: + name: '&4Petrae' + role: '&c' + greetings: + - Welcome to our village! + dialog: + - |- + Ask not what this village can do for you, + ask what you can do for this village! + - Welcome, outsider + - Нужно что-нибудь? + - |- + You're not from around these parts, + are you? + farewell: + - Off you go! + - Возвращайтесь скорее! +primis_mountain_guide_2: + name: '&4Petrae' + role: '&c' + greetings: + - Welcome to our village! + dialog: + - |- + Ask not what this village can do for you, + ask what you can do for this village! + - Welcome, outsider + - Нужно что-нибудь? + - |- + You're not from around these parts, + are you? + farewell: + - Off you go! + - Возвращайтесь скорее! +primis_nemus_leader: + name: '&3King Nemian' + role: '&c' + dialog: + - What brings you under the hill? + - Where are you from? + - |- + Have you tried our + delicious glow berries? + farewell: + - Until next time. +primis_ogre_mines_escaped_miner: + name: '&cFugit Fossores' + role: '&c' + greetings: + - I can't believe I made it! + - They're everywhere! + - Could you lend a hand? + dialog: + - I've got a task for you! + - I need your help! + farewell: + - Off you go! + - Be careful in there! + - Stay safe! +primis_ogre_mines_lone_miner: + name: '&cFortis Fossores' + role: '&c' + greetings: + - Finally, some help! + - Don't let them see you! + - Help me! + dialog: + - I've got a task for you! + - I need your help! + farewell: + - Off you go! + - Back to mining for me! + - Stay safe! +primis_ogre_mines_old_miner: + name: '&cVetus Fossores' + role: '&c' + greetings: + - Hey there sonny! + - You're lookin' a little lost! + - What brings you over here? + dialog: + - I've got a task for you! + - I need your help! + farewell: + - Off you go! + - Don't let the mine mites bite! + - Stay safe! +primis_ogre_mines_panicked_miner: + name: '&cMetus' + role: '&c' + greetings: + - The mine is overrun! + dialog: + - There's ogres everywhere! + - Can you help us? + farewell: + - Be careful! +primis_pontis_citizen_1: + name: '&7Agorastocles Gorgonius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_10: + name: '&7Pardalisca Saunio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_11: + name: '&7Sobersides Colias' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_12: + name: '&7Saturio Caepio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_13: + name: '&7Chrysalus Trebonius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_14: + name: '&7Toxilus Micon' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_15: + name: '&7Phronesium Viridio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_16: + name: '&7Aurelio Zoilus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_17: + name: '&7Diniarchus Nelius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_18: + name: '&7Cleostrata Senopius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_19: + name: '&7Georgius Sorio' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_2: + name: '&7Franciscus Crispian' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_20: + name: '&7Epidicus Silvanus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_21: + name: '&7Pleusicles Marcellinus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_22: + name: '&7Plesidippus Nerva' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_23: + name: '&7Plesidippus Megellus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_24: + name: '&7Fridericus Achaicus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_25: + name: '&7Curculio Zosimus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_26: + name: '&7Demipho Sylvius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_27: + name: '&7Peniculus Nemesius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_28: + name: '&7Tyndarus Faustinius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_29: + name: '&7Sulpicio Panthera' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_3: + name: '&7Tycho Sellic' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_30: + name: '&7Melaenis Gelasius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_31: + name: '&7Tyndarus Columbanus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_32: + name: '&7Antamonides Cerinthus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_33: + name: '&7Lesbonicus Momus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_34: + name: '&7Fridericus Saloninus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_35: + name: '&7Anterastilis Fabricius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_36: + name: '&7Tyndarus Augustalis' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_37: + name: '&7Modestus Aper' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_38: + name: '&7Henricus Crassus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_39: + name: '&7Franciscus Tancinus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_4: + name: '&7Advocati Micon' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_40: + name: '&7Phygia Aurelius' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_5: + name: '&7Advocati Micon' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_6: + name: '&7Messenio Rectus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_7: + name: '&7Hadrius Donicus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_8: + name: '&7Sulpicio Sejanus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_citizen_9: + name: '&7Stasimus Mutilus' + role: '&8Pontis Resident' + dialog: + - Have you been to the observatory? + - Where did you journey from? + - You don't look like you're from around here... + - It's a great day today. + farewell: + - See you around! + - Farewell! +primis_pontis_dockworker_1: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_10: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_2: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_3: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_4: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_5: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_6: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_7: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_8: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_dockworker_9: + name: '&3Pontis Shipmate' + role: '&8Dock Worker' + dialog: + - Plenty of supplies to be moved! + - Watch out! + - Coming through. + farewell: + - See you later! +primis_pontis_enhancer: + name: '&7Meliorem' + role: '&8' + greetings: + - Need to upgrade? + - Есть лом? + - Let's upgrade! + dialog: + - I'll upgrade for scrap! + - Bring me scrap! + - Upgrade your gear for scrap! +primis_pontis_gardener_1: + name: '&eGorgines Asina' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_2: + name: '&ePiscatores Orissus' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_3: + name: '&eAlcesimus Abito' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_4: + name: '&ePyrgopolynices Perpenna' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_5: + name: '&eLemniselenis Gelasius' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_6: + name: '&eLysimachus Sulinus' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_gardener_7: + name: '&eStrobilus Farus' + role: '&8Gardener' + dialog: + - Aren't the flowers pretty? + - Behold, my masterpiece! + - The flowers are blooming. + farewell: + - Please, don't tread on the beautiful flowers. + - Take care now! +primis_pontis_groves_catacombs_npc: + name: '&7Inaequaliter Hyaena' + role: '&7' + greetings: + - Psssst! + dialog: + - I heard there is great\ntreasure to be had! + - Something wonderful awaits\nyou if you enter! + - You should adventure\ninto this place... + - Why not go in? + - You should go inside... + - Don't worry, it's\ncompletely safe. + - No danger. I swear! + - Take a look inside. + - You should check\nout this place! + - He he he he he... + - What if somebody\ninside needs help. + - Go in, go in! + - Aren't you curious? + - Surely you should\ntake a peek. + farewell: + - He he he, later! +primis_pontis_groves_generic_npc_1: + name: '&2Sycophanta Mucius' + role: '&2' + greetings: + - I'm fine! + dialog: + - Do not worry about me. + - My brother will come rescue me. + - They won't eat me. + - I assure you I will be just fine. + farewell: + - Web ya later! +primis_pontis_groves_generic_npc_10: + name: '&2Hostilia Metunus' + role: '&2' + greetings: + - Hellos. + dialog: + - Are you bored too? + - Ugh, there must be something to do. + - Maybe I should brew more drinks. + farewell: + - See ya! +primis_pontis_groves_generic_npc_11: + name: '&2Tortilia Getha' + role: '&2' + greetings: + - Hi there. + dialog: + - My husband makes the best cakes. + - Want a slice? + - So delicious and moist! + farewell: + - Bye! +primis_pontis_groves_generic_npc_12: + name: '&2Consentia Apellinus' + role: '&2' + greetings: + - Oh, hello. + dialog: + - There, as good as new! + - Have to make sure the light keeps them away. + - Another lantern fixed... + farewell: + - Don't let the spiders bite! +primis_pontis_groves_generic_npc_13: + name: '&2Novia Senecius' + role: '&2' + greetings: + - Hi! + dialog: + - Oh, did not expect to see anyone here. + - Just gotta be quick and they can't get ya. + - The spiders don't stop me. + - This is my favorite resting spot. + farewell: + - Stay safe. +primis_pontis_groves_generic_npc_14: + name: '&2Maximia Priscus' + role: '&2' + greetings: + - Shhhh... + dialog: + - Thought you could\nsteal from me elves... + - Gonna get back my\npossessions when\nthey go sleep. + - Made it here by\ngoing around. + - They never saw\nme coming. + farewell: + - Keep it down. +primis_pontis_groves_generic_npc_15: + name: '&2Herennia Exsupereus' + role: '&2' + greetings: + - Hey there. + dialog: + - Just woke up. + - It's gonna be a good\nday I can feel it. + farewell: + - Bye bye. +primis_pontis_groves_generic_npc_16: + name: '&2Atria Maursus' + role: '&2' + greetings: + - Greetings. + dialog: + - Not sure how the king\nexpects me to do\nall of this... + - So much work.. + - Busy, busy, busy. + - This paperwork\nwon't do itself. + farewell: + - Bye bye. +primis_pontis_groves_generic_npc_17: + name: '&2Felicius Esurpus' + role: '&2' + greetings: + - Greetings! + dialog: + - If you need anything\nspeak to the king. + - Sorry, I am busy. + - No time for chit-chat,\nmy apologies. + farewell: + - Goodbye. +primis_pontis_groves_generic_npc_2: + name: '&2Sceledrus Fredisius' + role: '&2' + greetings: + - Heya! + dialog: + - I am actually fishing for bugs. + - Large aqua-bugs fall from the trees. + - I use tree sap as bait. + - The aqua-bugs cannot resist the bait! + - They are actually amphibious. + - Gotta catch'em before they head for the trees. + - They are quite tasty if you roast them. + - Hoping for a good catch! + farewell: + - Later. +primis_pontis_groves_generic_npc_3: + name: '&2Felicius Surius' + role: '&2' + greetings: + - Hi there! + dialog: + - The ocean is so pretty. + - I could stand here for days. + - The spiders sure are annoying. + farewell: + - Bye. +primis_pontis_groves_generic_npc_4: + name: '&2Periplectomenus Burcanius' + role: '&2' + greetings: + - Welcome! + dialog: + - Plenty of glow berries left. + - Hope you like my little farm. + - So many wines to attend to. + farewell: + - See you later. +primis_pontis_groves_generic_npc_5: + name: '&2Stephanus Magnus' + role: '&2' + greetings: + - Hey there! + dialog: + - Did you check out the berry farm? + - Lovely time for a walk. + - Can't be inside all the time. + farewell: + - Have a good one. +primis_pontis_groves_generic_npc_6: + name: '&2Abundantius Rogatus' + role: '&2' + greetings: + - Hiya! + dialog: + - What brings you into our lovely hole? + - Feel free to stay a while. + farewell: + - Bye. +primis_pontis_groves_generic_npc_7: + name: '&2Albanus Ivmarus' + role: '&2' + greetings: + - Easy there... + dialog: + - What? Yes, I'm doing just fine. + - I did not have too many, nope. + - Just one more... + - One more pint... + farewell: + - Farewell. +primis_pontis_groves_generic_npc_8: + name: '&2Bacchis Aventinus' + role: '&2' + greetings: + - Good day or evening... + dialog: + - I am so cozy right now. + - We used to go outside more often. + - Too many dangers outside these days. + farewell: + - Bless ya. +primis_pontis_groves_generic_npc_9: + name: '&2Pasicompsa Getha' + role: '&2' + greetings: + - Come in, come in! + dialog: + - Welcome to the best hole in the grove! + - Built this hole with my own hands! + - Hope you enjoy your stay! + farewell: + - Come back soon! +primis_pontis_groves_hole_luxuria: + name: '&cLuxuria Gorgonius' + role: '&c' + greetings: + - Hi there! + - Hellos! + dialog: + - Life is all about taking it easy. + - Why stress. + farewell: + - Visit us again! +primis_pontis_groves_hole_phygia: + name: '&cPhygia Gorgonius' + role: '&c' + greetings: + - Welcome to my home! + - Hellos! + dialog: + - We have to take action! + - Too many elves in our grove. + farewell: + - Visit us again! +primis_pontis_groves_lighthouse_generic_npc_1: + name: '&3Eleusium Martius' + role: '&3' + greetings: + - What brings you here? + dialog: + - Gotta make sure the\nlighthouse is working. + - Nice to see someone\ncome visit. + farewell: + - Goodbye. +primis_pontis_groves_lighthouse_generic_npc_2: + name: '&3Caelia Zoilus' + role: '&3' + greetings: + - Hey. + dialog: + - I hope he will\nbe alright. + - My turn to watch\nover the light. + - We almost ran\nout of food. + farewell: + - Bye. +primis_pontis_groves_lighthouse_sick_man: + name: '&3Alanus Secundas' + role: '&c' + dialog: + - I don't feel so good + - Hopefully I recover soon. + - Well, I am feeling a bit better. + - We need more food. + farewell: + - Farewell. +primis_pontis_groves_parkour_npc_1: + name: '&3Posuere Hominem' + role: '&c' + dialog: + - Up for a challenge? + - You think you got what it takes? + - Wanna go swinging? + - You a mad lad? + - No cheating! + farewell: + - See you later. +primis_pontis_groves_parkour_npc_2: + name: '&cIdoneitatem Hominem' + role: '&3' + dialog: + - That was impressive! + - Try and beat my record of 1m 47s. + - No cheating! + farewell: + - See you later. +primis_pontis_guard: + name: '&cPontis Guard' + role: '&8' + greetings: + - Want to upgrade gear? + dialog: + - Lost? Follow the bridge colors. + - Every bridge path has at least one color! + - Stay out of trouble! + - Don't cause any trouble! + - Pontis was built like a maze for defense. + - The bridge ceilings show that path's color! +primis_pontis_guard_1: + name: '&cPontis Guard' + role: '&8' + greetings: + - Want to upgrade gear? + dialog: + - Lost? Follow the bridge colors. + - Every bridge path has at least one color! + - Stay out of trouble! + - Don't cause any trouble! + - Pontis was built like a maze for defense. + - The bridge ceilings show that path's color! +primis_pontis_guard_2: + name: '&cPontis Guard' + role: '&8' + greetings: + - Hello! + dialog: + - This way to the shogun! +primis_pontis_guard_rat: + name: '&cPontis Elite Guard' + role: '&8' + greetings: + - Darn rats! + dialog: + - Filthy rats!!! + - Hold still,\ndarn you! + - Stop dodging\nmy attacks! + - Almost got one! + - Just die! + - Why wont you die!!! + - You can't dodge\nforever! + - Next strike! + - You're dead! + - How dare you\ndodge! + - Almost! +primis_pontis_guard_rat_at_wormhole: + name: '&cPontis Elite Guard' + role: '&8' + greetings: + - What's taking\nso long. + dialog: + - We got this\nunder control. + - Do not worry,\nthe elite guard\nis on the case! +primis_pontis_guard_shogun_1: + name: '&4Royal Guard' + role: '&8' + dialog: + - Don't go getting into trouble. + - Don't mind me, just keeping the peace. + - No funny business here. + - I've got my eye on you, adventurer. + - No questions, and no one gets hurt! + - Ain't got no time for messing around. + farewell: + - Safe travels, adventurer. +primis_pontis_guard_shogun_1_cat_quest: + name: '&4Royal Guard' + role: '&8' + dialog: + - Don't go getting into trouble. + - Don't mind me, just keeping the peace. + - No funny business here. + - I've got my eye on you, adventurer. + - No questions, and no one gets hurt! + - Ain't got no time for messing around. + farewell: + - Safe travels, adventurer. +primis_pontis_mille_arena_master_observatory: + name: Stella Hominis + role: + greetings: + - Hellos! + dialog: + - I hope to see many stars. + - Such heavenly bodies! + - The cosmos calls to me. + - Infinite possibilities. + - The ancient knowledge... + - I have tales to tell. + - If only you knew... + farewell: + - May the stars bless you. +primis_pontis_mille_concerned_shipmate: + name: '&3Delphium Calpurnius' + role: '&8' + dialog: + - Sigh. + - So much for my\nshipments... + farewell: + - Safe travels! +primis_pontis_mille_fields_camp_generic_npc_1: + name: '&cScribonia Ingenvinus' + role: '&c' + dialog: + - The most dangerous\nweapon is the one\nbetween your ears. + - Three arrows\nis all I need. + farewell: + - Catch ya later! +primis_pontis_mille_fields_camp_generic_npc_2: + name: '&cValador Lumus' + role: '&c' + dialog: + - I have hunted in\nmany places. + - Do you travel\na lot too? + farewell: + - May your blade be swift. +primis_pontis_mille_fields_camp_generic_npc_3: + name: '&cPhygia Ahala' + role: '&c' + dialog: + - Nothing like a\ngood hunt! + farewell: + - Stay safe. +primis_pontis_mille_fields_camp_generic_npc_4: + name: '&cAdrius Paterculus' + role: '&c' + dialog: + - The hunt calls! + farewell: + - Swift death. +primis_pontis_mille_fields_camp_generic_npc_5: + name: '&cCappadox Galerus' + role: '&c' + dialog: + - Join us, stranger! + farewell: + - Later. +primis_pontis_mille_fields_camp_generic_npc_6: + name: '&cSulpicio Rutilius' + role: '&c' + dialog: + - Hope our camp\nprovides you respite\nfrom the wild. + farewell: + - Bye. +primis_pontis_mille_fields_camp_generic_npc_7: + name: '&cAquarius Manus' + role: '&c' + dialog: + - Don't mind me just\nfetching some water. + - Clear blue water today. + farewell: + - Bye. +primis_pontis_mille_fields_camp_magmus: + name: '&cMagmus Hypnos' + role: '&4' + dialog: + - Where is Volumnia... + - I hope she isn't in\ntrouble again. + - I need a good rest. + - If only there were more\nhours in the day. + - Speak to me when you\nhave found Volumnia. + - So much work,\nso little time. + - Yet another 17 hour day. + - I worry too much. + farewell: + - Never enough time... +primis_pontis_mille_fields_farm_berry_npc: + name: '&9Dordalus Nasica' + role: '&e' + dialog: + - Berries are so tasty! + - You should eat\nmore berries! + - Why would they\nsteal my berries... + farewell: + - See'd ya later. +primis_pontis_mille_fields_farm_boy_npc: + name: '&9Planesium Victricius' + role: '&e' + dialog: + - So many rats... + - Phew almost\ndone here. + - This thing better hold. + - Any more lifting and\nI'm gonna break. + - The view from here\nis really nice. + - OK, back to work! + farewell: + - Try some our berries! +primis_pontis_mille_fields_farm_npc: + name: '&9Milonia Majus' + role: '&e' + dialog: + - Get away, darn rats! + - Stop eating my goods! + - Sigh... + farewell: + - Later. +primis_pontis_mille_fields_farm_well_npc: + name: '&eVolumnia Zoilus' + role: '&c' + dialog: + - Watch out for its spit! + - Its saliva is toxic. + - Please help! + - I hope nobody hears\nabout this... + - Am I glad to see you! + farewell: + - How could I let this happen. +primis_pontis_mille_fields_windmill_npc_1: + name: '&eDinia Niraemius' + role: '&d' + dialog: + - Plenty of wheat to process! + - No flour no bread. + - Do you like bread too? + farewell: + - See you. +primis_pontis_mille_fields_windmill_npc_2: + name: '&eDaemones Maritialis' + role: '&d' + dialog: + - It's so nice out here! + - Do you like my windmill? + - Just out here on break. + farewell: + - See you. +primis_pontis_mille_fields_windmill_npc_3: + name: '&eAdulescens Lupis' + role: '&d' + dialog: + - Hoping for some good wind! + - Need some flour? + - This one is the best Windmill around! + farewell: + - Bless ya. +primis_pontis_mille_general_bromia: + name: '&6Bromia Curio' + role: '&6General' + greetings: + - Hail! + dialog: + - It's time for war! + farewell: + - Goodbye! +primis_pontis_mille_general_cylindrus: + name: '&eCylindrus Celatus' + role: '&eGeneral' + greetings: + - Hail! + dialog: + - There is not enough time! + farewell: + - Goodbye! +primis_pontis_mille_general_godefridus: + name: '&cGodefridus Novation' + role: '&c' + greetings: + - Greetings! + - Hail! + dialog: + - Someone needs to drop\noff these documents. + - So many candles... + farewell: + - See you +primis_pontis_mille_general_rogerius: + name: '&eRogerius Olennius' + role: '&eGeneral' + greetings: + - Hail! + dialog: + - So much to do! + - I hope those 4 are ok... + farewell: + - Bye! +primis_pontis_mille_lighthouse_man: + name: '&3Hegio Remus' + role: '&c' + dialog: + - It is so beautiful up here. + - The best view... + farewell: + - Farewell. + - The sun sets! +primis_pontis_mille_major: + name: '&cFortes Bellator' + role: '&c' + greetings: + - Hello traveler! + - Hail! + dialog: + - Those darn goblins! + farewell: + - Farewell! +primis_pontis_mille_mew_meowzer: + name: '&aMew Meowzer' + role: '&d' + dialog: + - Meooooww! + - Meow... + - Mreeeooooowww... + - Meowww. + - MEOW! + farewell: + - Prrrr meow! +primis_pontis_mille_observatory_arena_turn_in: + name: Virgo Dexippus + role: + greetings: + - Hi! + dialog: + - Stella knows a lot. + - Stars have so much to tell. + - The light tells all. + farewell: + - May the moon light your way. +primis_pontis_mille_royal_guard_centurion: + name: '&4Royal Guard Centurion' + role: '&8' + dialog: + - No dallying! + - Set up camp! + - Where are our reinforcements? + - How many have fallen? + - We need to reorganize! + farewell: + - Tread lightly and carry a big sword. +primis_pontis_mille_scout_1: + name: '&cSyra Ursacius' + role: '&cWounded Scout' + greetings: + - Hail! + dialog: + - I can barely hold on... + farewell: + - Bye! +primis_pontis_mille_scout_2: + name: '&cSparax Auxilius' + role: '&cWounded Scout' + greetings: + - Hail! + dialog: + - The pain... + farewell: + - Bye! +primis_pontis_mille_scout_leader: + name: '&cBlepharo Octavius' + role: '&cScout Leader' + greetings: + - Hail! + dialog: + - It was too much... + farewell: + - Bye! +primis_pontis_mille_shogun: + name: '&6Navita' + role: '&c' + greetings: + - Да? + dialog: + - Can I help you? + farewell: + - Walk softly, and carry a big gun. +primis_pontis_mille_slums_generic_npc_1: + name: '&7Gallicles Rex' + role: '&7' + dialog: + - It's not much but its our\nlittle part of town + farewell: + - Later. +primis_pontis_mille_slums_generic_npc_2: + name: '&7Gallicles Caelistis' + role: '&7' + dialog: + - Day by day... + farewell: + - '...' +primis_pontis_mille_slums_generic_npc_3: + name: '&7Nicodemus Frontinus' + role: '&7' + dialog: + - Fresh water for\nthe home. + farewell: + - The well serves\nus well +primis_pontis_mille_slums_generic_npc_4: + name: '&7Cocus Lucio' + role: '&7' + dialog: + - Hope you're having\na great day. + farewell: + - Enjoy your stay. +primis_pontis_mille_slums_generic_npc_5: + name: '&7Cornelia Florius' + role: '&7' + dialog: + - Which one should\nI get... + farewell: + - So many pretty\nflowers. +primis_pontis_mille_slums_generic_npc_6: + name: '&7Rutilia Placidus' + role: '&7' + dialog: + - I love it here. + - The smell of hay\nmakes me happy. + - My favorite place to\nrelax after a hard day. + farewell: + - Hay ya later! +primis_pontis_mille_slums_npc_1: + name: '&7Lena Lucan' + role: '&7' + dialog: + - Just one loaf of bread... + farewell: + - Wonder what tomorrow brings. +primis_pontis_mille_slums_npc_2: + name: '&7Tranio Florens' + role: '&7' + dialog: + - Doing OK today\nactually. + farewell: + - Night save ya. +primis_pontis_mille_slums_npc_3: + name: '&7Rufia Tertulus' + role: '&7' + dialog: + - At least something\ngood for\nthe kids. + - Not much at\nthe market... + - I cannot\nafford that. + farewell: + - Later. +primis_pontis_mille_slums_npc_4: + name: '&7Fabia Praetextus' + role: '&7' + dialog: + - Just close my eyes\nfor a second. + - Gotta imagine I am\nat a better place. + farewell: + - Goodbye. +primis_pontis_mille_slums_npc_5: + name: '&7Augustina Verrucosis' + role: '&7' + dialog: + - So many mouths\nto feed. + - Maybe some fruit\nfor the little\nones. + farewell: + - Bye. +primis_pontis_mines_guard_1: + name: '&cPontis Guard' + role: '&c' + greetings: + - HELP!!! + dialog: + - Please kill them! + - I am so scared. +primis_pontis_mines_guard_2: + name: '&cPontis Guard' + role: '&c' + greetings: + - SOMEONE PLEASE!!! + dialog: + - I don't wanna die! + - Can't hold out any more. +primis_pontis_mines_guard_3: + name: '&cPontis Guard' + role: '&c' + greetings: + - SAVE ME!!! + dialog: + - Are they gone? + - GET ME OUT! +primis_pontis_outpost_officer: + name: '&4NAME ME' + role: '&8' + dialog: + - I am unfinished! + - There is supposed\nto be an outpost\nhere. + farewell: + - Bye! +primis_pontis_redwoods_injured_lumberjack: + name: '&6Lyco Lupicinus' + role: '&6' + greetings: + - Heyo! + dialog: + - Darn saw! + - Got me again... + farewell: + - See you later. +primis_pontis_redwoods_lumberjack: + name: '&6Ligna Crispian' + role: '&6' + greetings: + - Greetings! + dialog: + - I love the look of a healthy tree. + - The brown tree really smells. + - |- + Pretty sure I saw a wolf on two legs + creeping around at night around here. + farewell: + - Until next time. +primis_pontis_redwoods_lumberjack_generic_1: + name: '&6Mulier Proculus' + role: '&6' + greetings: + - Hey-yo! + dialog: + - I wish they would leave us alone. + - Perfect day for logging. + farewell: + - Pinecone ya later! +primis_pontis_redwoods_lumberjack_generic_10: + name: '&6Piscatores Trenico' + role: '&6' + greetings: + - Well met! + dialog: + - Go away wolves! + - Leave me alone, darn fur-balls! + - Hah! Try and reach me up here! + farewell: + - Bye, Bye! +primis_pontis_redwoods_lumberjack_generic_2: + name: '&6Alanus Hermina' + role: '&6' + greetings: + - Hi... + dialog: + - Not so loud, keep it down. + - I am catching an extra break. + - Don't tell em I am here. + - Logging is tough work... + farewell: + - Later +primis_pontis_redwoods_lumberjack_generic_3: + name: '&6Lena Triarius' + role: '&6' + greetings: + - What's up! + dialog: + - Just standing here buzzin! + - Operating the saw is kinda fun. + - Gotta make sure you don't get hurt. + farewell: + - Catch you later! +primis_pontis_redwoods_lumberjack_generic_4: + name: '&6Aquila Isatis' + role: '&6' + greetings: + - How's it going! + dialog: + - Darn logs! + - No, not that way! + - Float better!!! + - Yep, that will do it. + farewell: + - See ya! +primis_pontis_redwoods_lumberjack_generic_5: + name: '&6Sulpicio Sidonius' + role: '&6' + greetings: + - Hi! + dialog: + - Nothing like a nice fire! + - Just relaxing after an honest day of work. + - Join us! + farewell: + - Bye, friend! +primis_pontis_redwoods_lumberjack_generic_6: + name: '&6Strobilus Clemens' + role: '&6' + greetings: + - Salutations! + dialog: + - Chopping like a beaver! + - The fastest axe in the west. + - No tree is a match for me! + farewell: + - Smell ya later! +primis_pontis_redwoods_lumberjack_generic_7: + name: '&6Candidus Nigellus' + role: '&6' + greetings: + - Greetings! + dialog: + - Fastest axe...my bottom! + - Don't take his ramblings seriously. + - Mr. big-shot sure has a lot to say. + farewell: + - Goodbye! +primis_pontis_redwoods_lumberjack_generic_8: + name: '&6Strobilus Clemens' + role: '&6' + greetings: + - I'm a bit busy! + dialog: + - We need to increase production... + - If we raise the cost... + - Need to order more axes. + farewell: + - Uh... +primis_pontis_redwoods_lumberjack_generic_9: + name: '&6Martinus Lepontus' + role: '&6' + greetings: + - Woah, hello! + dialog: + - You're coming down big one! + - I will show you! + - My axe, your bark, they should meet. + - Start off with a good chop. + farewell: + - Scared me... +primis_pontis_redwoods_lumberlord: + name: '&6Magnus Castorea' + role: '&6' + greetings: + - HELLO! + dialog: + - Nothing like healthy wood. + - |- + For every tree we cut, + we plant a new one! + - Big brown logs, yep. + farewell: + - BYE! +primis_pontis_redwoods_reyn: + name: '&6Reynus Protectoris' + role: '&6' + greetings: + - I am turning up the heat! + - Hiya! + dialog: + - Are you into logs? + - I love the smell of lumber! + farewell: + - See you later. + - Bye bye! +primis_pontis_scrapper: + name: '&7Fragmentum' + role: '&8' + greetings: + - Got something to scrap? + - Got trash? + - Need scrappin'? + dialog: + - I'll scrap anything you bring! + - Need scrap? + - Want scrap? +primis_pontis_smelter: + name: '&7Orbis' + role: '&8' + greetings: + - Want to upgrade gear? + dialog: + - Need upgrade orbs? + - I'll make upgrade orbs for scrap! + - Bring me scrap! +primis_sewer_donatello: + name: '&5Donatello' + role: '&dSewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_sewer_leonardo: + name: '&1Leonardo' + role: '&9Sewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_sewer_michelangelo: + name: '&6Michelangelo' + role: '&eSewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_sewer_raphael: + name: '&4Raphael' + role: '&cSewer Defender' + dialog: + - What's up? + - How'd you manage to find us down here? + - Beware of The Shredder! + farewell: + - See ya later! +primis_spa_attendee_1: + name: '&fNatsumi' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_2: + name: '&5Hanako' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_3: + name: '&3Tamika' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_4: + name: '&9Zaphra' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_5: + name: '&4Chie' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_6: + name: '&fKatashi' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_7: + name: '&dAkihiko' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_8: + name: '&6Sheranee' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - Rawr... + - OwO + farewell: + - Have fun! +primis_spa_staff: + name: '&cAozora' + role: '&7' + dialog: + - Enjoy the hot spring! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_staff_2: + name: '&6Rei' + role: '&7' + dialog: + - Enjoy the hot spring! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_terravilla_annoyed_explorer: + name: '&6Dorippa Sarimarcus' + role: '&6' + greetings: + - How's it going. + dialog: + - Not again. + - Stuck once more. + farewell: + - Be seeing you. +primis_terravilla_explorer: + name: '&6Telestis Senna' + role: '&6' + greetings: + - How goes it. + dialog: + - Always so\nbusy. + - Need a bag? + farewell: + - Bye. +primis_terravilla_generic_npc_1: + name: '&6Stephanium Major' + role: '&6' + greetings: + - Welcome to Terravilla! + dialog: + - Watch out for the\nTwo Legged Terrors! + - Here to check out the ruins? + farewell: + - Bye. +primis_terravilla_generic_npc_10: + name: '&6Mallia Galvisius' + role: '&6' + greetings: + - Heyo! + dialog: + - I would rather be in\ndown in the ruins... + - Hog watching to\npass the time. + farewell: + - Laters. +primis_terravilla_generic_npc_11: + name: '&6Papiria Virginius' + role: '&6' + greetings: + - Ok then... + dialog: + - Hit him harder! + - Woah! Good one! + - Yeah! Mess him up! + farewell: + - Yep... +primis_terravilla_generic_npc_12: + name: '&6Umbria Maccalus' + role: '&6' + greetings: + - What! + dialog: + - Is a girl not\nallowed to be\non a rooftop. + - Just try and\nget me down! + farewell: + - Yeah, whatever... +primis_terravilla_generic_npc_2: + name: '&6Delphium Assanius' + role: '&6' + greetings: + - Leave me alone! + dialog: + - What are you\nlooking at. + farewell: + - Scram! +primis_terravilla_generic_npc_3: + name: '&6Stephanium Vopiscus' + role: '&6' + greetings: + - Leave me alone! + dialog: + - What are you\nlooking at. + farewell: + - Scram! +primis_terravilla_generic_npc_4: + name: '&6Simo Clericus' + role: '&6' + greetings: + - Hey! + dialog: + - Heard the hog is on\nthe lift again. + farewell: + - Bye. +primis_terravilla_generic_npc_5: + name: '&6Harpax Colias' + role: '&6' + greetings: + - Ello. + dialog: + - The bo...I mean the\nOverseer is upstairs. + farewell: + - Laters. +primis_terravilla_generic_npc_6: + name: '&6Sulpicio Epolonius' + role: '&6' + greetings: + - Hi there. + dialog: + - I hope the ruins\nopen up again soon. + - I miss artifact\nhunting. + farewell: + - Goodbye. +primis_terravilla_generic_npc_7: + name: '&6Baebia Lucan' + role: '&6' + greetings: + - '...' + dialog: + - Cringe... + farewell: + - '...' +primis_terravilla_generic_npc_8: + name: '&6Novia Longinus' + role: '&6' + greetings: + - '...' + dialog: + - Are you always\nstaring at people? + - How about some\nprivacy? + farewell: + - '...' +primis_terravilla_generic_npc_9: + name: '&6Septimia Baro' + role: '&6' + greetings: + - Oh, hey. + dialog: + - If it opens up again\nthen I gotta go\nget more of these. + - What is this skull\nnfrom hmm... + farewell: + - '...' +primis_terravilla_overseer: + name: '&6Lutum Princeps' + role: '&6' + greetings: + - Yes? + dialog: + - What is it\nnow... + - I need to check\nup on them. + - At least I\nam not bored. + farewell: + - Good luck. +primis_terravilla_researcher: + name: '&6Plautia Suilius' + role: '&6' + greetings: + - Hmm... + dialog: + - Maybe if... + - That can't be right + - Not sure... + farewell: + - Later... +primis_traveler_1: + name: '&6Lysidamus Nolus' + role: '&6' + greetings: + - Hello stranger! + dialog: + - On my way back from the village. + - Heading to the village? + - Good luck on\nyour travels. + farewell: + - Roads bless you. +primis_traveler_2: + name: '&6Citro Gala' + role: '&6' + greetings: + - Hi! + dialog: + - On my way back\nfrom the village. + - Coming from Pontis Mille or? + - Good luck! + farewell: + - Roads bless you. +primis_traveler_3: + name: '&6Bromia Culleolus' + role: '&6' + greetings: + - Hello! + dialog: + - Are you too going\nto the village? + - I heard it's pretty\ncold there at\nthe village. + - Phew! Almost there!\nI gotta keep going. + farewell: + - Roads bless you. +primis_traveler_4: + name: '&6Demenis Nolus' + role: '&6' + greetings: + - Hello stranger! + dialog: + - Good to see someone\nelse on the road. + - Almost reached the village. + - Phew! + farewell: + - Roads bless you. +primis_traveler_5: + name: '&6Callipho Classicius' + role: '&6' + greetings: + - Heya! + dialog: + - I need better shoes. + - Soon I will\nbe home. + - Good to see the\nfields again! + farewell: + - Safe travels! +primis_traveler_6: + name: '&6Rodenus Palis' + role: '&6' + greetings: + - Hi there! + dialog: + - I am on my way back\nfrom the village. + - Good to see\nPontis Mille again. + - Is my brother lost again... + - Where is he? + farewell: + - Later! +primis_traveler_7: + name: '&6Gorenus Palis' + role: '&6' + greetings: + - Hey... + dialog: + - Am I lost again? + - This isn't Pontis Mille. + - Where am I? + - Uhh, this doesn't\nseem like the\nright way... + farewell: + - Bye. +quest_giver: + name: Qel'Thuzad + role: <Квестодатель> + greetings: + - Приветствуем, искатель приключений!\nnНаслаждайтесь заданием? + - У меня есть задание! + - Чувствуете... вкус приключения? + dialog: + - Выполните задания гильдии\nдля получения крутых наград! + - Чем выше уровень, тем лучше награда за\n! + - Чем выше уровень заданий, тем\nвыше уровень мобов! + - Хотите сложнее задание?\nУвеличьте свой ранг в гильдии! + - Убедитесь, что вы хорошо экипированы\nдля этих заданий! + farewell: + - Счастливого пути, друг. + - Счастливой охоты! + - Живи долго и процветай! + - Возвращайся со щитом,\n или на щите. + - Жизнь до смерти! + - Сила перед слабостью! + - Путешествие до назначения! +refiner_config: + name: Ralph + role: <Рафинер> + greetings: + - Хотите обновить свой лом? + - Есть лом? + - Ищу низкоуровневый лом! + - Привет, есть лом? + - Я переработаю твой лом! + dialog: + - Нужен модернизированный лом? + - Upgrade your scrap here! + - Обновите 10 металлолома до более высокого уровня! + - Сделайте свой лом более полезным! + - Есть низкоуровневый лом? + farewell: + - Возвращайтесь, когда у вас будет\больше низкоуровневого лома + - Не забудьте сделать этот\nобрывок полезным! + - Чтобы попасть в драку! +repairman_config: + name: Reggie + role: <Ремонтник> + greetings: + - Отремонтируйте свои вещи! + - Ремонт предметов на металлолом! + - Преврати этот лом в прочность! + - Нужен ремонт? + - Есть поврежденные предметы? + dialog: + - Лучший ремонт в городе! + - Я получил твое исправление! + - Нужна починка? + - Я отремонтирую ваши вещи! + - Нужен ремонт элитных предметов? + farewell: + - Не забывайте делать техническое обслуживание! + - Я буду здесь, если я тебе понадоблюсь! + - Позвони мне, попиши, если хочешь связаться со мной,\nесли хочешь отправить мне сообщение, все в порядке. +santa: + name: '&4Saint Nick' + role: '&c' + greetings: + - Ho ho ho! + dialog: + - I have lost some presents, \ncan you help me? + - Dear traveller, I have\na request for you! + - Can you help an old man\nin his time of need? + farewell: + - Ho ho ho! +scrapper_config: + name: Kelly + role: <Скребок> + greetings: + - Хотите избавиться от предметов? + - Нужно переработать предметы? + - Глядя на металлолом? + - Это лом часов! + - Время лома! + dialog: + - Лоскутные сделки! + - Давай сюда свой лом! + - 75% chance to work! + - Нет возвратов. + - Перерабатывайте, повторно используйте, сокращайте! + farewell: + - Возвращайтесь, когда\nу вас будет больше мусора + - Не забудьте сделать этот\nобрывок полезным! + - Удачной разборки! +smelter: + name: Сэм + role: Плавильщик + greetings: + - Есть лом? + - Есть лишний лом? + - От тебя веет ломом!? + - Пожалуйста, мне нужен лом! + - ДАЙ МНЕ ЛОМ! + dialog: + - Я сделаю твой лом полезным! + - Дай мне лом, и я\nдам тебе сферы улучшения! + - Лом бесполезен, дай его мне! + farewell: + - Возвращайся, когда будет\nбольше лома + - Вы уехали с обновлением! +special_blacksmith: + name: Grog + role: <Специальный Кузнец> + greetings: + - Нужно что-нибудь? + - Есть что-нибудь хорошее? + - У нас нет ничего, кроме идеального + - Есть что стоит продать? + - Мы покупаем только уровневое снаряжение. + dialog: + - Мы покупаем дешево и продаем дорого. + - Возврата нет. + - Абсолютно нет возврата. + - Нет возвратов. + - Нет обратной связи. + - Покупки в магазине являются окончательными. + farewell: + - Возвращайся, когда захочешь чтобы\nя тебя обобрал + - Не убивай себя,\nмы хотим, чтобы вы принесли нам еще\nснаряжения. + - В следующий раз купите что-то дороже. + - Не забудьте, нет возврата. +test_npc: + name: Test NPC + role: Testing! + greetings: + - Test Greeting! + dialog: + - Test Dialog! + farewell: + - Test Farewell! +travelling_merchant: + name: Jeeves + role: <Странствующий торговец> + greetings: + - Есть что продать? + - Вы назвали? + - Хм? + dialog: + - Я куплю его по дешевке! + - Есть что-то для меня? + - Время - деньги! + farewell: + - Позвони мне снова в любое время! + - Это все? + - Безопасные путешествия! + - Не дай себя убить! + - Удачной охоты! +unbinder: + name: Ulfric + role: <Развязывающий> + greetings: + - Приветствую. + - Хорошо познакомились. + - Привет, друг. + - Да? + - Могу я вам чем-нибудь помочь? + dialog: + - Я отвяжу ваши предметы\nдля чрезвычайно редкого свитка отвязки. + - Я единственный, кто имеет право\nразвязать ваш товар. + - У вас есть свиток развязывания? + farewell: + - "Помните: Используйте свитки\nразвязывания с умом." + - Счастливого пути, друг. +wood_league_arena_master: + name: Gladius + role: + greetings: + - Welcome to the\nArena! + dialog: + - Prepared to face the arena? + farewell: + - Return with your shield, or on it! +wood_league: + arenaName: Wood League + arenaMessages: + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - wave=8:message=&8[Gladius] &fNot bad, but what if every enemy is a &cmelee &fenemy? + - wave=9:message=&8[Gladius] &fNice, nice, but what if they're all &cranged &finstead? + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - wave=44:message=&8[Gladius] &fThis is clearly not working, let me think of something... + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +ag_welcome_quest_0: + customObjectives: + Objective1: + dialog: + - '&8[&aCasus&8]&f Welcome to the Adventurer''s Guild Hub, the hub for all things EliteMobs!' + - You can always get back here using &2/ag&f! + - Talk to me again for a quest! + name: '&2Finding the AG!' + questLore: + - + - + questAcceptDialog: + - '&8[Odigos]&f Alright, make sure you use &2/ag &f or &2/adventurersguild&f to head off to the Adventurer''s Guild Hub!' + - Make sure you talk to Casus when you're there! +ag_welcome_quest_1: + customObjectives: + Objective3: + dialog: + - '&8[&aGreg&8]&f Want to buy or sell something? I''ve got a little of everything!' + Objective4: + dialog: + - '&8[&aCharles&8]&f Want to learn about fighting elites? Just talk to me!' + Objective1: + dialog: + - '&8[&aHermes&8]&f I take you back to where you were before! Just talk to me again!' + Objective2: + dialog: + - '&8[&aBartley&8]&f Need a stiff drink? My drinks pack an extra punch!' + Objective7: + dialog: + - '&8[&aQel''Thuzad&8]&f These Elite monsters, where do they keep coming from?' + - + - + - Just talk to me to get one! + Objective12: + dialog: + - '&8[&aGrog&8]&f Want to buy special items? I''ve got just the thing!' + Objective8: + dialog: + - '&8[&aRalph&8]&f Get more out of your scrap by upgrading it! Just talk to me at any time.' + Objective13: + dialog: + - '&8[&aUlfric&8]&f If you bring me a very special and rare item, I can unbind your Elite items.' + - + - + Objective5: + dialog: + - '&8[&aTim&8]&f Want to upgrade your Elite Items? Just get an upgrade orb from Sam over there!' + Objective10: + dialog: + - '&8[&aKelly&8]&f Got extra Elite items? Don''t know what to do with them? Give them to me, and I''ll turn them into scrap!' + - + - + Objective6: + dialog: + - '&8[&aGillian&8]&f Do you seek power? Do you desire to reach new heights? Talk to me to unlock new guild ranks, and reach levels of power you never thought to be possible!' + Objective11: + dialog: + - '&8[&aSam&8]&f Got extra scrap? I can refine that into Upgrade Orbs, which you can give to Tim to upgrade your Elite items with!' + Objective9: + dialog: + - '&8[&aReggie&8]&f Need your Elite items repaired? Just bring me some scrap, and I''ll make them as good as new!' + - + - + name: '&2Welcome to the AG!' + questLore: + - '&aMeet the Adventurer''s Guild NPCs!' +primis_caeruleaum_a_can_of_worms: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis] &fPlease tell me you''re the one bringing the bait.' + name: '&2A can of worms' + questLore: + - Here, take the bait and go. + - Please hurry! + questAcceptDialog: + - '&a[Callidus Piscatus]&f My friend is in a boat near the docks!' + - '&7&oI should hurry to the boat.' + questCompleteMessage: + - '&a[Piscis Nemesis]&f You brought bait? Perfect!' + - The bait should lure it out! + - '&7&oI should talk with Nemesis.' +primis_caeruleaum_fishing: + name: '&2Fish Bait' + questLore: + - We have a big problem! + - + - + - + - + - but he can't do anything without the right bait! + - I'll tell you where to go get &eFish Bait &f, please go help my friend! + - I promise I'll reward you! + questAcceptDialog: + - '&a[Callidus Piscatus]&f Time is of the essence! There are a bunch of &cBig Worms&f to the right when you leave the village!' + - Get 5 and come back here and I will prepare them for use. + - '&7&oI should go get some Fish Bait.' + questCompleteMessage: + - '&a[Callidus Piscatus]&f You brought bait? Perfect!' + - I'll prepare it right away! + - '&7&oI should talk to &aCallidus &7&oagain and collect the prepared bait.' +primis_caeruleaum_fishing_2: + name: '&2Monster Bait' + questLore: + - That did the trick! Hop into the wormhole, I'll hold the boat! + - Let's show this monster the wrath of a fisherman! + questAcceptDialog: + - '&a[Piscis Nemesis]&f Hop in, I''ll hold the boat!' + - Don't forget to put on that &eDiving Helmet&f! + - '&7&oI should enter the wormhole and defeat the Sea Monster.' + questCompleteMessage: + - '&a[Piscis Nemesis]&f Haha! What a show!' + - '&fOf course, I had the situation under control this entire time, but you sure helped a bit!' + - '&fHere, you can have this!' + - '&7&oThe monster is dead and the shore is safe. Seems like a job well done.' +primis_caeruleaum_fletching: + name: '&2Arrow Hunter' + questLore: + - Got a few minutes to help out? + - With all the recent raids, we have found ourselves out of &eGrappling Arrows&f! + - It is usually my job to get them, but things are just a + - bit too dangerous right now for me to go dungeon delving. + - If you could get these &eGrappling Arrows&f for me, + - I will teach you how to use them! + questAcceptDialog: + - '&a[Ventus Artifex]&f Please bring me 10 &eGrappling Arrows &ffrom the ruins just beyond the village.' + - The &cUndead Skeletons&f and &cDrowned&f from of old usually carry these. + - '&7&oI should go kill &cSkeletons&7&o and &cDrowned&7&o at the ruins near the village for their &eGrappling Arrows&7&o.' + questCompleteMessage: + - '&a[Ventus Artifex]&f Great work!' + - '&eGrappling Arrows &fcan be used on &cTarget Blocks &fto get to hard to reach places.' + - They are a must have for the aspiring ancient ruin delver. + - Here is your reward! + - How about putting your knowledge to the test? + - '&7&oSeems like &aVentus Artifex&7&o has a challenge for me.' +primis_caeruleaum_fletching_2: + name: '&2Shield Hunter' + questLore: + - You got the arrows? Great! + - Use those arrows with a bow to climb the tower! + questAcceptDialog: + - '&a[Ventus Artifex]&f Use the arrows you just received to go to the ruins and shoot the targets with them!' + - + - + - + - + - '&7&oI should go get the &eShield&7&o inside of the ruins, using the &eGrappling Arrows&7&o in order to shoot the targets inside of the building.' + questCompleteMessage: + - '&a[Ventus Artifex]&f Outstanding!' + - Truly you are a real ruins delver! + - Here is your reward! + - '&7&oSeems like Grappling Arrows will be useful in the future.' +primis_caeruleaum_foraging: + name: '&2Wolf Bait' + questLore: + - I heard you were looking to help out around here. + - There is a &dDen of Wolves&f nearby that is + - really impeding my foraging for the village! + questAcceptDialog: + - '&a[Venator Pabulatus]&f If you can get rid of those pesky &cWolves&f, I will reward you handsomely!' + - I am getting too old to be dealing with the wild things of these lands... + - '&7&oI should go kill the &cWolves&7&o in the den to the Southeast of the village.' + questCompleteMessage: + - '&a[Venator Pabulatus]&f I knew I could count on you!' + - Thank you for all of your help! + - Here is your reward as promised. +primis_farmstead_lighthouse_keeper_2: + customObjectives: + Objective1: + dialog: + - "&a[Jeeves]&f &2Amavit&f sent you? What's this about a lighthouse? My, what a discovery!\n&fThis will revolutionize my job as a traveling merchant! Here, have these &eScrolls&f - just call me and I'll be there in a jiffy!\n&7&oSeems like &aJeeves&7&o has something for me. I should talk to him." + name: '&2The Mysterious Lights' + questLore: + - + - + - My father &aJeeves&f went to the top to check but he has not returned yet. + - + - + questAcceptDialog: + - '&a[Amavit]&f Thank you once again, and good luck. Hopefully it''s nothing.' + - '&7&oI should go to the &dTop of the Lighthouse&f, investigate the issue and then report back to &aAmavit''s&f father &aJeeves&f in the village.' + questCompleteMessage: + - '&7&oThese scrolls seem mighty useful! I should use the &dLighthouse&7&o to get back to the &dFarmstead&7&o and keep moving.' +primis_gladius_assassins: + name: '&5Who snipes the snipers?' + questLore: + - The roofs of &dGladius&f are covered in &cAssassins&f! + - Venturing out to the streets is a death sentence. We need to deal with these snipers! + - + - + questAcceptDialog: + - '&a[Belli] Deal with those &cAssassins&f! Remember to use the &eGrappling Arrows&f!.' + - '&7&oI should kill those &cAssassins&7&o.' + questCompleteMessage: + - '&a[Belli]&f You dealt with those &cAssassins&f? Good! That''s one headache dealt with!' +primis_gladius_clear: + name: '&5Taking back the streets' + questLore: + - I don't need to tell you that the town is being invaded, do I? + - We are offering a reward to those willing to put a dent in the amount of &cInvaders&f. + - Are you up for it? + questAcceptDialog: + - '&a[Belli] &fJust go out there and thin their numbers!' + - '&7&oI go out and clear the streets of &dGladius&7&o.' + questCompleteMessage: + - '&a[Belli]&f Look at that, the Gods have provided with a true warrior in our time of need! I have a job for a person like you.' + - '&7&oSeems like &aBelli&7&o has a plan for me. I should talk to her..' +primis_gladius_prayer: + name: '&5Leap of faith' + questLore: + - I am not going to sugarcoat it, things look downright grim! + - The walls have fallen, the streets are teeming + - with the &cUndead&f and I just ran out of drinks. + - At times like these, people turn their hope to + - some kind of divine intervention! + - There is a &dPath&f, lit by candles, that leads to a + - '&dSanctuary in the Mountains&f.' + - Warriors go up this path and defeat the &cMonk&f which guards + - the sanctuary in order to be blessed by the war god in combat. + - It may just be a superstition, but would it hurt + - to give people hope? + - The fact you made your way here shows you are a cut above + - the rest - go up the mountain and defeat the &cMonk&f. + - All warriors will feel better knowing they are being watched over. + questAcceptDialog: + - '&a[Belli] &fGo &dUpstairs&f and follow the candles! Careful not to fall, the path is treacherous!' + - '&7&oI should follow the &dandle Path&7&o and defeat the &cMonk&7&o.' + questCompleteMessage: + - '&a[Belli]&f You completed the prayer? Thank you, the soldiers will feel relieved to hear it.' +primis_gladius_ships: + name: '&5A sinking feeling' + questLore: + - Have you seen them? The dozens of ships just outside + - of &dGladius&f? They are to blame for all of this. + - We never expected an invasion from the &dBlood Temple&f, + - much less one done by siege weapons mounted on boats! + - We must do something about it. Killing the &cAdmiral&f + - and some of the forces won't give us back what we lost, + - but it will sure make us feel better. + questAcceptDialog: + - '&a[Belli] &fKill the &cAdmiral&f and some of the troops on the boats. Be careful about their water superiority! I recommend using &eGrappling Arrows&f to move around the ships.' + - '&7&oI should go slay the &cAdmiral&7&o and some of its troops on the boats just &dOutside of Gladius&7&o.' + questCompleteMessage: + - '&a[Belli]&f The admiral is no more? Why, I feel better already!' +primis_gladius_sunken_ship: + name: '&5Sunken ship' + questLore: + - Now that you took care of the &cMariner Forces&f I got + - another task for you. + - The &dSunken Ship&f should be reachable now. + - You see some time ago one of our ships got sunk, + - unfortunately it was carrying &eImportant DDocuments&f. + - I need you to reach the &dSunken Ship&f and kill any threats + - around and retrieve the &eDocuments&f. + - Come back to me after you have completed the task. + questAcceptDialog: + - '&a[Belli] &fYou will find the ship in the waters to the south-west. Give them hell!' + - '&7&oI should go collect the &eDocuments&7&o and slay any &cMariners&7&o near the ship.' + questCompleteMessage: + - '&a[Belli]&f Back already? Excellent work! We really needed these &eDocuments&f.' +primis_gladius_supplies_1: + name: '&cSupplying problems' + questLore: + - We are running out of &eSupplies&f! + - '&dGladius&f is a fortress equipped to last a long siege' + - without any issues, but that's assuming we have + - access to the &dWarehouse&f! + - Unfortunately the &dWarehouse&f was one of the first places to fall, + - and now we are slowly starving to death! + - If you can clear a path to the &dWarehouse&f and get some &eSupplies&f + - that would greatly aid in the war effort! + questAcceptDialog: + - '&a[Cibus]&f The &dWarehouse&f is hard to miss! It''s the extra large warehouse-looking building near the part where the wall fell! Grab some &eSupplies&f and get them back here!' + - '&7&oI should go to the &dWarehouse&7&o and bring back &eSupplies&7&o.' + questCompleteMessage: + - '&a[Cibus]&f You brought the &eSupplies&f back? Fantastic! Meanwhile I came up with the perfect idea for the drinks - and it should be something that will lift the spirits of the soldiers!' + - '&7&oSeems like the &aCibus&7&o has a plan, I should talk to them.' +primis_gladius_supplies_2: + name: '&cSupplying more problems' + questLore: + - We have food, but what about drinks? + - Some would say it's foolish to get drunk in the middle + - of a war, but if now then when? + - The &cBarkeep&f across the street kept all of the good + - stuff in the &dBasement&f. + - I think you know where I'm going with this! + - Go to the &dBasement&f of the tavern across the street and get + - the &eGood Stuff&f. If you find the &cBarkeep&f, I'd consider it a + - personal favor if you free him from this curse of undeath. + - We are pretty sure that he was in the &dBasement&f when the + - invasion happened so odds are he is still there, + - though probably no longer himself. + - Be careful! + questAcceptDialog: + - '&a[Cibus]&f The &dTavern&f is right across the street, hard to miss! Just head to the &dBasement&f and get the &eGood Stuff&f!' + - '&7&oI should go to the &dBasement&7&o of the tavern and get "the &eGood Stuff&7&o".' + questCompleteMessage: + - '&a[Cibus]&f You defeated the &cBarkeep&f? I thank you for freeing my old man from this accursed undeath. Here, I''ll have the first drink with you.' +primis_ice_village_all_out_of_chains: + customObjectives: + Objective1: + dialog: + - '&a[Orbis]&f Oh, the Ice Village chain shipment. Yes, it is right in that chest over there.' + - Sorry for not sending it over, but we were quite busy and had no time. + - It's all paid for so feel free to just grab it. + name: '&2All out of chains' + questLore: + - Hey, you came from &dPontis Mille&f right? + - How would you like to help us out. + - Here at the jail we tend to go through a + - lot of chains... + - Especially the chains holding up the cages. + - They rust a lot and then they break. That's + - how one of the prisoners escaped. The rusty + - chain snapped, the cage fell and he ran. + - We paid for a + - '&eShipment of new chains&f, but it' + - did not arrive yet. If you could go to + - '&dPontis Mille&f and fetch our' + - '&eShipment of Chains&f' + - then that would be great! + questAcceptDialog: + - '&a[Philolaches Triferus]&f Go talk to Orbis. They are the ones that make the chains.' + - '&7&oI should go talk to &a&oOrbis&7&o and bring back the &e&oShipment of Chains&7&o.' + questCompleteMessage: + - '&a[Philolaches Triferus]&f Those are the chains! Thank you for getting these, we really needed them.' +primis_ice_village_catch_me_if_you_can: + name: '&2Catch me if you can' + questLore: + - What timing! I was just looking for someone to go capture our + - '&cEscaped Prisoner&f.' + - + - + - + - + - + - + questAcceptDialog: + - '&a[Romanus Superbus]&f He must be somewhere in the mountains.' + - '&7&oI need to find the &c&oEscaped Prisoner&7&o and bring him back to the prison.' + questCompleteMessage: + - '&a[Romanus Superbus]&f Well, well, well. If it isn''t our escaped sleeping beauty.' + - Good work. A job well done deserves a good payment, here ya go. + - '&aRomanus&7 hands you a heavy bag of coin.' +primis_ice_village_get_them_off_my_back: + name: '&2Get them off my back!' + questLore: + - Let me tell ya, I sure am glad you are here to help, ha ha. + - Our mission here is to hunt &cRazorbacks&f and keep their numbers in check. + - It's not all about population control either. + - They provide us with valuable leather, tusks and meat. + - Not sure this village would be around without them. + - + - + - + - + - + - + - We only need you to cull the &cBabe&f and the &cJuvenile Razorbacks&f. + - + - + - + - + - Would mean a lot to me if you could retrieve it. + questAcceptDialog: + - '&a[Alanus Isatis]&f You must have seen the &cRazorbacks&f on your way here so I assume you know where to find them.' + - '&7&oI need to cull the &c&oRazorback&7&o population and retrieve &e&oAlanus'' Dagger&7&o.' + questCompleteMessage: + - '&a[Alanus Isatis]&f Well done friend! That should help a lot.' + - + - + - The dagger is nothing special, but it was a handmade gift from my late father. + - Next time you're thirsty, the drinks are on me! +primis_ice_village_gotta_keep_warm: + customObjectives: + Objective1: + dialog: + - '&a[Severinus Martius]&f Ha ha! That should keep me warm for another couple of weeks!' + - Hey friend, you heading for &dCaerullium Village&f by any chance? + name: '&2Gotta keep warm' + questLore: + - We deliver the &aLighthouse Keeper&f some + - of our strong stuff every couple of weeks. + - It keeps him warm during the colder days. + - It's a small gesture of thanks for all his + - hard work. Any chance you could help out + - and bring over the next batch? + questAcceptDialog: + - '&a[Grania Cecilius]&f You can find the lighthouse to the East. Thanks!' + - '&7&oI should go to the &d&oLighthouse&7&o and deliver these to the &a&oLighthouse Keeper&7&o.' + questCompleteMessage: + - '&a[Severinus Martius]&f If you''re heading over there then I would appreciate if you could deliver some of these to my good friend &aJeeves&f.' + - '&7&oSeems like the &a&oLighthouse Keeper&7&o has a quest for me.' +primis_ice_village_gotta_see_jeeves: + customObjectives: + Objective1: + dialog: + - '&a[Jeeves]&f Oh! A gift from my friend Severinus you say.' + - Well, thank you for bringing it over. Was nice seeing you again! + name: '&2Gotta see Jeeves' + questLore: + - Now, now it would be really rude of me to keep + - all of the good stuff to myself! + - If you would bother helping me out friend and + - delivering some of the good stuff + - to my friend &aJeeves&f at &dCaerullium Village&f. + - You can get there quickly by taking the + - '&9lighthouse portal&f.' + questAcceptDialog: + - '&a[Severinus Martius]&f The portal is all the way at the top.' + - '&7&oI should go to &d&oCaerullium Village&7&o and deliver some of the good stuff to &a&oJeeves&7&o.' + questCompleteMessage: + - '&a[Severinus Martius]&f Thank you for delivering some of the strong stuff to Jeeves. I know he likes a good drink here and there ha ha!' +primis_ice_village_living_nightmares: + customObjectives: + Objective1: + dialog: + - '&a[Cornelia Ennodius]&f Are they gone? I was so scared. My parents sent you? Thank goodness.' + - + - + - I couldn't escape. I, I...will be fine, I just need a minute... + name: '&2Living nightmares' + questLore: + - I was following her trail, this is where it ends. + - Not sure where she would have gone from here. + - I fear that something bad might have happened. + - Our &aGirl&f takes a lot after me and my special powers. + - Except that hers are a lot more potent, she is capable + - of making powerful emotions manifest in the real world. + - We are running out of time, we need to find her soon. + questAcceptDialog: + - '&a[Sestia Ennodius]&f The trail went cold here, she cannot be that far away...' + - '&7&oI need to find the &a&oMissing Daughter&7&o before something happens to her.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f You found her! Quickly, where is she?' + - Thank you stranger, I will go to her at once! +primis_ice_village_make_them_go_ouch: + name: '&2Make them go ouch' + questLore: + - I had some naughty '&cCustomers&f' + - come visit some days ago. + - They stole the most valuable + - of my &ePossessions&f. + - You need to find them and make sure + - to teach them a lesson. + - Make sure they know that + - '&aViolet&f does not forget to collect.' + questAcceptDialog: + - '&a[Domina Violet]&f They went East past the &9Trees&f.' + - '&7&oI need to make sure that the &c&oCustomers&7&o know not to mess with &a&oViolet&7&o. I also need to retrieve &e&oViolet''s Property&7&o.' + questCompleteMessage: + - '&a[Domina Violet]&f I hope you taught them the value of pain.' + - + - +primis_ice_village_objection!: + customObjectives: + Objective3: + dialog: + - '&a[Glacies Princeps]&f What, absolutely not. I don''t know how he convinced you to come here and beg for his release.' + - + - + - He will never be released. Is that understood. + Objective1: + dialog: + - '&a[Romanus Superbus]&f Release him? Not guilty? Are you mad? You''re lucky I don''t throw you in a cage too for suggesting such nonsense.' + Objective2: + dialog: + - '&a[Luxuria Placidus]&f Who? Never heard of him.' + name: '&2Objection!' + questLore: + - I do not belong here! Surely you can see that? + - I have done no wrong! Stranger will you hear my plea. + - Would you help this poor soul who has been trapped + - here in this awful cage of no fault of his own? + - You must go talk to the + - '&aJail Master&f or the ' + - '&aVillage Leader&f.' + - Or any other + - '&aFriendly Villager&f' + - who would be + - willing to argue for + - my release! + questAcceptDialog: + - '&a[Adrius Calpornius]&f Go talk to them! Get me out!' + - '&7&oI should go talk to the people on my list.' + questCompleteMessage: + - '&a[Adrius Calpornius]&f WHAT?! LIES!!! I never would do such a horrible thing to my family...' + - + - + - '&7Whatever sanity this poor man still had left, is gone now...' +primis_ice_village_run_away_daughter: + customObjectives: + Objective1: + dialog: + - '&a[Sestia Ennodius]&f I could sense you coming.' + name: '&2Run away daughter' + questLore: + - Stranger! Would you help our family? + - Our &aDaughter&f has gone missing. + - She has been gifted with special + - powers just like her &aMother&f + - I fear that last night something + - terrible must have happened to + - make her run away in the middle of + - the night. + questAcceptDialog: + - '&a[Sparax Ennodius]&f My &aWife&f has already gone looking for her.' + - I am sure she is somewhere outside the village. Go find her and talk to her. + - '&7&oI should go look for the &a&oWorried Mother&7&o.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f You were sent by my &aHusband&f to help with the search?' + - '&7&oI should hear out the &a&oWorried Mother&7&o.' +primis_ice_village_silence: + name: '&2Make them go ouch' + questLore: + - Shhh! Do you hear it? + - The annoying screeching. + - Ugh, I cannot take it anymore! + - Listen, I will pay good coin + - if you can find the source + - of that annoying screeching + - and make it stop. + questAcceptDialog: + - '&a[Modestus Eulogius]&f It sounds like it coming somewhere from the hills behind me.' + - '&7&oI should find the source of all the noise and make it stop.' + questCompleteMessage: + - '&a[Modestus Eulogius]&f Both me and my ears thank you!' +primis_ice_village_taking_the_bait: + name: '&2Taking the bait' + questLore: + - These &cFish&f, what is wrong with them! + - I have been out here fishing for days now! + - Not even a single bite. If only I was younger I would show them! + - + - + - And if we cannot catch any, well that is a big problem. + - You will need to go down there and beat them senseless. + questAcceptDialog: + - '&a[Theopropides Nero]&f You wanted to help so here is your chance!' + - '&7&oI must jump into the lake and kill 7 &c&oChilly Salmon&7&o and collect their bodies.' + questCompleteMessage: + - '&a[Theopropides Nero]&f Oh! Look at them! Such big ones!.' + - + - +primis_ice_village_treats_for_the_punished: + customObjectives: + Objective1: + dialog: + - '&a[Eleusium Calenus]&f My wife sent you? Oh, are those treats? My favorite too! She''s such a darling.' + - + - + - 'You tell her I am doing just fine and that I love her very much. ' + name: '&2Treats for the punished' + questLore: + - If you don't mind, could I ask you to do something for me? + - My dear &aHusband&f has been jailed and I know it's tough living a cage all day. + - So I prepared some treats that I was gonna deliver to him. + - + - + questAcceptDialog: + - '&a[Titia Calenus]&f He will be in one of the middle cages.' + - Do not forget to tell him I love him. + - '&7&oI should deliver these treats to the &a&oHusband&7&o.' + questCompleteMessage: + - '&a[Titia Calenus]&f Back so quick! Oh, did he really say that? He is such a sweetie.' +primis_ice_village_wanna_make_a_snowman: + name: '&2Wanna build a snowman' + questLore: + - The kids around the village have been pretty bored lately + - and I've been thinking. There are these + - '&cMagical Creatures&f that inhabit the woods around this' + - village. The creatures fur grows &eMagical Ice Crystals&e. + - When you infuse snow with these &eCrystals&f it makes the + - snow shuffle around and expand and contract. + - And if you build a snowman out of this infused snow + - it makes it look as if the snowman is alive. + - The kids would love it! So, want to help + - this old man cheer up some kids? + questAcceptDialog: + - '&a[Sparax Ennodius]&f You will find the &cCreatures&f in any woods near the village.' + - + - + - '&7&oI should go slay enough &c&oFrost Fur Ursus&7&o to gather 15 &e&oIce Crystals&7&o.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f You gathered enough crystals? Wonderful!' + - I can start making the snowman now, I cannot wait for the kids to see it! +primis_main_quest_: + name: '&2Goblins in the mines!' + questLore: + - This day just keeps getting worse. First, we get ambushed by goblins. + - The we retreat, only to find our army split. Some are dead, many are missing. + - Worst of all, we fear we might've woken the Goblin King. + - Some, hopefully, made it through. We have to set up camp and recover for now. + - If you dare brave into the mines, you are on your own. + - We tried to sneak past them, and it did not go well. + - The only way forward is through bloodshed. + questAcceptDialog: + - '&8[Centurion]&fAre you braving the Goblin Mines? Beware the Goblin King!' + - '&8[Centurion]&fWe hope our scouting party made it past him. Meet up with them if you can.' + - '&8&oI should venture through the mines and defeat the Goblin King.' + questCompleteMessage: + - '&8[Scouting party]&fYou made it through? I almost wish you hadn''t. You won''t believe what lies ahead.' + - '&8&oSounds like the scouting party has bad news for me.' +primis_main_quest_1: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis] &fOh so you were in the ship that beached a few hours ago?' + - + - + - + - + - + - + - '&7&oI should report to the &aFirst Mate &7&oto see if I should help these people!' + name: '&2Shipwrecked!' + questLore: + - You're finally awake? Good! We need your help. + - The ship beached during last night's storm. + - We see a &dLighthouse &fin the distance, so there must be a village there! + - Go talk to the &aVillage Leader &fand see if they can lend use some help! + - The &aFirst Mate &fwent ahead of you, but hasn't returned yet. + - Follow his instructions if you see him! + questAcceptDialog: + - '&a[Captain Squalus]&f Go to the nearby village and see if they will help us!' + - Be careful on your way there, we don't know what lurks around these parts! + - '&7&oI should investigate the nearby village and talk to their leader.' + questCompleteMessage: + - '&a[First Mate Iracundi]&f Darnation! We just can''t catch a break today! Here, it''s clearly dangerous to go alone, take this!' + - '&7&oSeems like First Mate Iracundi has a request for me...' +primis_main_quest_10: + customObjectives: + Objective2: + dialog: + - "&a[Shogun Navita] &f&dGladius&f calls for our aid?\n&7&oSeems like I should talk to the &aShogun&7&o." + name: '&5Bridging the gap' + questLore: + - It is time to call &dPontis Mille&f for aid. + - Let them know of what happened here and tell them we are cashing in our favor. + - + - + questAcceptDialog: + - '&a[General Hasta] &fSafe travels, friend. Remember: Kill the &cGate Keeper&f and make sure our plea reaches &aShogun Navita''s&f ears..' + - '&7&oI should slay the &cGate Keeper&7&o at the &dBridge&7&o and make my way to &aShogun Navita&7&o in &dPontis Mille&7&o.' + questCompleteMessage: + - '&a[Shogun Navita]&f Truly the news you bring me are most disturbing, but I am afraid we already suspected something... unnatural... was going on.' + - '&7&oSeems like &aShogun Navita&7&o wants to talk to me.' +primis_main_quest_11: + customObjectives: + Objective1: + dialog: + - '&a[Major Fortes Bellator]&f Yes, traveler?' + name: '&2Sending a message!' + questLore: + - The tales of your travel are most surprising. + - That you made it alive to here is nothing short of a miracle. + - The forces invading &dGladius&f are insurmountable. + - '&dGladius&f will eventually crumble under their might...' + - Aid?... Ah, yes. Go see &aMajor Fortes Bellator&f. + - He will be able to assist you. + questAcceptDialog: + - '&a[Navita]&f You can find the &aMajor&f on top of those stairs right ahead!' + - '&7&oI should go talk to the &aMajor&f and see if he can help.' + questCompleteMessage: + - '&a[Major Fortes Bellator]&f The &aShogun&f seeks to aid &dGladius&f? I thought he would never ask! But first, we must prepare.' + - '&7&oSeems like &aFortes Bellator&7&o has work for me.' +primis_main_quest_12: + customObjectives: + Objective1: + dialog: + - '&a[Centurion]&f Where are our reinforcements?' + name: '&2Mine path' + questLore: + - I cannot believe what befell &dGladius&f. They hit it fast, + - and they hit it where it hurts most. + - It is our sworn duty to aid our allies. We have failed our + - duty, and we have failed our allies. + - The &cCounselor's&f ordered us to mobilize our troops in several + - zones before the invasion. + - You see, recently and unusual and devastating storm was spotted + - at the &dStorm Temple&f. + - The Royal Guard was ordered to quiet the storm, and the &aShogun&f + - refuses to belay that order. + - Our own guards are in other places, and I fear we will need all + - that we have to take &dGladius&f back. + - The path to the &dStorm Temple&f is treacherous, as it requires going + - through the &dGoblin Mines&f. + - Help our guard clear the mines and make a path to the &dStorm Temple&f! + questAcceptDialog: + - '&a[Fortes Bellator]&fTread lightly, the &dGoblin Mines&f are a dangerous place. Perhaps you should aid the normal guard before assisting the &aRoyal Guard&f.' + - The &dMines&f are north of the city. There are stairs leading to its entrance. + - '&7&oI should see what else I can aid &aFortes Bellator&7&o with, or I can head to the &dGoblin Mines''&7&o entrance.' + questCompleteMessage: + - '&a[Centurion]&fIt is so good to see someone! Has &dPontis Mille&f sent you?' + - '&7&oI should hear what the &aCenturion&7&o has to say' +primis_main_quest_13: + name: '&2Goblins in the mines!' + questLore: + - This day just keeps getting worse. First, we get ambushed by goblins. + - Then we retreat, only to find our army split. Some are dead, many are missing. + - Worst of all, we fear we might've woken the &cGoblin King&f. + - Some, hopefully, made it through. We have to set up camp and recover for now. + - If you dare brave into the mines, you are on your own. + - We tried to sneak past them, and it did not go well. + - The only way forward is through bloodshed. + questAcceptDialog: + - '&a[Centurion]&f Are you braving the &dGoblin Mines&f? Beware the &cGoblin King&f!' + - We hope our &aScouting Party&f made it past him. Meet up with them if you can. + - '&7&oI should venture through the &dMines&7&o and defeat the &cGoblin King&7&o.' + questCompleteMessage: + - '&a[Scouting Party]&f You made it through? I almost wish you hadn''t. You won''t believe what lies ahead.' + - '&7&oSounds like the scouting party has bad news for me.' +primis_main_quest_14: + name: '&2Storm''s end' + questLore: + - It is hard to believe that you pushed through the + - '&dGoblin Mines&f on your own.' + - Perhaps with your fortitude you will be able to face the challenge ahead. + - We attempted to assault the &dStorm Temple&f, and reached its deepest + - confines at a great cost. + - What we found there... It defies understanding. + - It may be hard to believe, but it sounds like the very storm + - itself has materialized as our opponent. + - We do not even know if it can be defeated. We feared we were sent to our deaths. + - + - + questAcceptDialog: + - '&a[Blepharo]&f We have weakened their forces a little, but still, this is no easy task.' + - The Storm is no ordinary opponent. Do not underestimate it. + - '&7&oI should go into the &dStorm Temple&f and slay the &cStorm&f.' + questCompleteMessage: + - '&a[Shogun Navita]&f You WHAT!?' + - Defeated the &cStorm&f? I was told that was impossible! I mean... + - '... it is no use hiding it now. I knew about the &cStorm&f. I knew about the &dGladius&f invasion - I even facilitated it. I did it for my people - for &dPontis Mille&f.' + - '&cCounselor Machiavelli&f convinced me that the &cStorm&f was as unstoppable as Nature itself, and that the fall of &dGladius&f and &dPontis Mille&f was an inevitability that we could but delay through sacrifice.' + - + - + - '&8&oSeems like &aShogun Navita&7&o has a problem he wants me to deal with.' +primis_main_quest_15: + name: '&2Severance payback!' + questLore: + - + - + - + - + - + - + - + - + - + - I bought us time. + - + - + - + - + - He guided us to our doom, and would've gotten away with it had you not appeared. + - Now, there is hope. + - I ask you, please rid us of the treacherous &cCounselor&f. + - + - + - + - + - + - + - I wish to deliver one last message through them. + questAcceptDialog: + - '&a[Shogun Navita]&f &cCounselor Machiavelli&f has retreated to his quarters in the lower city by the market. Be careful, has has amassed a devoted following in his time, and will not go down without a fight.' + - '&7&oIt is time for &cCounselor Machiavelli&f to face righteous retribution.' + questCompleteMessage: + - '&a[Shogun Navita]&f So it is done.' + - '&dPontis Mille&f owes you a great debt, wanderer. Once we finish mobilizing the army we will be ready to right our wrongs and march to &dGladius''&f aid.' + - '&7&a[Shogun Navita]&2 We feared you. We surrendered our allies to you. We dispersed our armies. No more.' + - '&dPontis Mille&2 marches to war, and we shall not walk alone! You shall rue the day you crossed our path.' + - '&7' + - '&7&oSeems like the &aShogun&7&o has a plan. I should talk to him.' +primis_main_quest_16: + customObjectives: + Objective3: + dialog: + - '&a[Demenis Nolus]&f Heading to the village, eh. Just keep going East, follow the road and you should be there in no time!' + Objective4: + dialog: + - '&a[Callipho Classicius]&f Directions? Just head down this road that leads to the graveyards.' + Objective1: + dialog: + - '&a[Glacies]&f Welcome to our village traveler! Please tell me, what brings you here friend.' + Objective2: + dialog: + - '&a[Bromia Culleolus]&f Oh, the way to the village. Yes, just take this road that leads to the mountain.' + - Happy to help! + name: '&2The ice village awaits' + questLore: + - We must send aid to &dGladius&f as soon as possible. + - Champion, there is a village of mighty warriors to the far south. + - You should travel there and inform them that &dPontis Mille&f + - would seek their aid in pushing back the invaders from the &dBlood Temple&f. + - Find &aGlacies Princeps&f and tell them I sent you. + - There many travelers on the roads, you should stop and ask them for direction. + questAcceptDialog: + - '&a[Shogun Navita]&f It will be a long journey. Make sure you prepare. Follow the roads that lead south.' + - '&7&oI must go and locate the &d&oIce Village&7&o to the far south.' + questCompleteMessage: + - '&a[Glacies Princeps]&f The Shogun sent you, I see, it is good to hear that &aNavita&f is back to his old self.' + - + - + - Let me tell you more... + - '&7&oI should speak to &a&oGlacies&7&o.' +primis_main_quest_17: + customObjectives: + Objective3: + dialog: + - '&a[Theopropides Nero]&f Help? Yes, please!' + Objective1: + dialog: + - '&a[Alanus Isatis]&f Here to help with the &cRazorbacks&f?' + Objective2: + dialog: + - '&a[Domina Violet]&f I hope you are here to help!' + name: '&2Helping the north' + questLore: + - Before we further discuss anything about + - the &dBlood Temple&f. + - + - + - If these issues are not resolved then I would fail in my duties as a village leader. + - There is no way for me to ignore the plea of my own people and put others first. + - + - + - + - + - + - + - + - + - They will be able to tell you in more detail what needs to be done. + questAcceptDialog: + - '&a[Glacies Princeps]&f Once you are done helping them. Come back to me and we can talk.' + - '&7&oI should go talk to the villagers on my list and help them out with any issues they might have.' + questCompleteMessage: + - '&a[Romanus Superbus]&f &2Glacies&f sent you, about darn time! We have a prisoner on the loose!' + - '&7&oI should speak to &a&oRomanus Superbus&7&o.' +primis_main_quest_18: + name: '&2The trial of ice' + questLore: + - Well you have certainly impressed me and most of the village. + - + - + - the &cIce Elementals&f. + - + - + - + - + - '&cMinor Ice Elementals&f in combat.' + - + - + - If you failed...then...your energy and your being belonged to the &cIce Elementals&f. + - + - + - Ever since then + - + - + - Several of our people got corrupted and we had to jail them for our own safety. + - + - + - + - + - Slaves to the + - '&cIce Elementals&f.' + - It is clear that our old traditions are no longer. + - The &cIce Elementals&f must be dealt with... + - I would ask you to be the last one to + - undertake &9The Trial of Ice&f. Climb to the peak and face the + - '&cMinor Ice Elementals&f and release the souls of those who failed the trial.' + questAcceptDialog: + - '&a[Glacies Princeps]&f You can find the start of the path to the trial at &aViolet''s&f house.' + - Follow the &9Amethyst&f blocks, they will guide you to the peak. + - '&7&oI should follow the &9&oAmethyst Blocks&7&o to the peak of the mountain and then slay the &c&oMinor Ice Elementals&7&o.' + questCompleteMessage: + - '&a[Glacies Princeps]&f You have done it? May their souls rest in peace now.' + - Let's speak again friend. There is more to be done. + - '&7&oI should speak to &a&oGlacies&7&o.' +primis_main_quest_19: + name: '&2Chill out' + questLore: + - It is time to free ourselves from this curse. + - We should have never made ourselves dependent on an &cElementals&f power. + - We shall correct that mistake here and now. + - What you have slain were just + - '&cMinor Ice Elementals&f, the' + - '&cIce Elemental&f rests in a temple right across from our village.' + - It was the main source of our power...and foolishness. + - Go forth now and slay the &cIce Elemental&f. + questAcceptDialog: + - '&a[Glacies Princeps]&f You will find a path that leads into the temple at the summit of the village.' + - '&7&oI should go into the temple and slay the &c&oIce Elemental&7&o.' + questCompleteMessage: + - '&a[Glacies Princeps]&f I could feel the energies flowing out, all the way from here.' + - + - + - There is another settlement that might need your help, let's speak. + - '&7&oI should hear what &a&oGlacies&7&o has to say.' +primis_main_quest_2: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis]&fYou''ll help us? Thank the seas! This was starting to feel like a sinking ship!' + name: '&2Strangers in need...' + questLore: + - So not only can they not help, but they want our help? Bah! + - Well, we don't have much choice now, do we? + - Go, help them, then make them help us! + questAcceptDialog: + - '&a[First Mate Iracundi]&f Fine, go help the locals, see what info you can gather and see if you can get them to help us in turn. I will be here, negotiating things.' + - Come back as soon as you have something! + - '&7&oI should talk to the &aVillage Leader&f to see about helping the locals.' + questCompleteMessage: + - '&a[Chief Piscis]&f Everyone in the village has an issue that needs dealing with, and I am no exception. My request is quite challenging, so maybe you want to get warmed up and get the lay of the land with some of the issues from the other villagers.' + - + - + - '&7&oI should talk to the locals and see who needs help, and come back to the leader when I feel ready to continue.' +primis_main_quest_20: + customObjectives: + Objective1: + dialog: + - '&a[Lutum Princeps]&f This better be important.' + name: '&2Terravilla' + questLore: + - Some time ago we received a request for aid from a + - a nearby settlement. Years ago a bunch + - of explorers settled on top of this ancient ruin. + - I think they call their little + - settlement &dTerravilla&f. Apparently there is a lot + - of treasure to be had there if you don't mind the risk. + - But I hear that stuff has gone wrong there and they asked + - us if we could spare any help to send their way. To be + - honest, you are the strongest warrior I have ever seen. + - You are the best help we could send. If you would like + - to go of course. + questAcceptDialog: + - '&a[Glacies Princeps]&f You will find &aTerravilla&f straight West of here.' + - + - + - Oh, I almost forgot. The person you want to talk to is &aOverseer Lutum&f. + - '&7&oI should go to &d&oTerravilla&7&o and talk to &a&oOverseer Lutum&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f Came all the way from the &dIce Village&f, eh. Good to see some help arrive.' + - + - + - + - + - '&7&oI should talk to &a&oLutum&7&o.' +primis_main_quest_21: + name: '&2Taking out the trash' + questLore: + - Many years ago some explorers came across this ruin and + - as they investigated it more closely they discovered a + - large underground maze-like structure. In this structure + - there were a lot of ancient artifacts and treasures. But + - also a lot of danger. Not like that stopped anyone from + - going down there. And as the word spread, more and more + - people came here to make their fortunes. Before you + - know it, it turned into a small settlement. Until lately + - everything was fine, but then awful things started + - happening. Before I tell you more, we should start by + - dealing with the simple problems first. A small band of + - '&cRobbers&f has found a foothold in the hills surrounding' + - '&dTerravilla&f. We need them gone. Also, feel free to assist' + - any villagers in &aTerravilla&f that might need help. + questAcceptDialog: + - '&a[Lutum Princeps]&f I am not sure where the &cRobbers&f are exactly. I just know that people have reported seeing them coming from the hills.' + - '&7&oI should deal with the &c&oRobbers&7&o and help any villagers in need if I have the time.' + questCompleteMessage: + - '&a[Lutum Princeps]&f Well that is one issue resolved. Onto the next!' + - Before we move on, I want you to have this blade. + - + - + - '&7&oI should hear out what &a&oLutum&7&o has planned next.' +primis_main_quest_22: + name: '&2Big trouble in little pub' + questLore: + - Before we get to the big problem underground, I would + - like you to do one last thing here in town. There has + - been huge trouble in our little pub. There are certain + - characters in town who keep going to the pub and causing + - a ruckus. Well I heard that this time all of them managed + - to gather at the pub at the same time. And of course now + - there is a huge brawl happening over there. This is a great + - opportunity for us to arrest all of them at once. Go to the + - pub and knock them all out. We will handle the rest. + questAcceptDialog: + - '&a[Lutum Princeps]&f The pub is at the ground level, right across. Don''t let them overwhelm you.' + - I will have a nice reward waiting here for you when you're back. + - '&7&oI need to go to the pub and deal with the &c&oBar Brawlers&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f I hear that the pub is a peaceful place again. Let''s discuss the real issue now.' + - '&7&oI need to talk to &a&oLutum&7&o.' +primis_main_quest_23: + name: '&2Strike the earth' + questLore: + - You see the real reason we asked for help is because of what happened + - at the ruins. There were always dangerous things down there, + - but nothing a seasoned adventurer or explorer could not handle. But then + - something awakened, these ancient constructs started rising out of the + - ground and the walls. Then these quakes started happening, it was weird, + - because you could only feel them if you were down in the ruins. So we shut + - everything down, nobody was allowed access to the ruins anymore. A few days + - ago I gathered some of my best men and sent them down there to find the source + - of it all. They barely made it back. They found an &cEarth Elemental&f high + - above the pillars, on top some sort of platform. It must have been there + - dormant all this time. No clue why it decided to wake up now... + - Your job would be to go down there, navigate through the maze and put the + - '&cEarth Elemental&f into a slumber it will never wake up from.' + questAcceptDialog: + - '&a[Lutum Princeps]&f You can get to the maze by walking down the spiral staircase in the middle of the ruins.' + - + - + - '&7&oI should enter the &d&oRuins Maze&7&o and slay the &c&oEarth Elemental&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f I cannot believe it, you''re back. In one piece too!' + - + - + - + - '&7&oI need to tell &a&oLutum&7&o about my quest and the &d&oBlood Temple&7&o.' +primis_main_quest_24: + customObjectives: + Objective1: + dialog: + - '&a[Navita]&f You have returned! I hope you have good tidings.' + name: '&2There and back again' + questLore: + - We had no idea what was going on... Yes, + - '&dTerravilla&f will be able to pledge some' + - of our forces to your cause. I wonder if the + - '&cEarth Elemental&f awakening had anything' + - to do with the &dBlood Temple&f. We will + - prepare our forces and wait for word from + - '&dPontis Mille&f.' + questAcceptDialog: + - '&a[Lutum Princeps]&f So you are heading off to &dPontis Mille&f, make sure to tell the &aShogun&f that &dTerravilla&f will be ready to assist.' + - '&7&oI should head to &d&oPontis Mille&7&o and speak with &a&oShogun Navita&7&o.' + questCompleteMessage: + - '&a[Navita]&f It is good to hear that the &dIce Village&f has decided to join our cause! But I did not expect that you would manage to convince &dTerravilla&f to pledge to our cause as well.' +primis_main_quest_25: + customObjectives: + Objective1: + dialog: + - '&a[Outpost Officer]&fFILLER TEXT!' + name: '&2To the outpost' + questLore: + - It is so good to see you again friend! + - While you were gone we were preparing our + - forces. We have made an &dOutpost&f + - between the &dBlood Temple&f and &dPontis Mille&f. + - You should go there and report to the + - '&aOutpost Officer&f. They will let you know' + - how we shall proceed with the assault on the + - '&dBlood Temple&f.' + questAcceptDialog: + - '&a[Navita]&f The outpost is to the South of the city. Not too long now, before the additional forces from &dTerravilla&f and the &dIce Village&f arrive.' + - '&7&oI should head to the &d&oOutpost&7&o and speak with the &a&oOutpost Officer&7&o.' + questCompleteMessage: + - '&a[Outpost Officer]&f I GOT NO IDEA WHAT TO SAY CAUSE I AM NOT DONE' +primis_main_quest_3: + name: '&cBandit Camp!' + questLore: + - A nearby &dBandit Camp&f has recently been sighted + - and is trying to take us under! + - They keep raiding our supplies and kidnapping our villagers! + - They even took my &eGrandfather's Heirloom&f! + - We don't know what they want, but we need them gone! + - Figure out what they are doing, deal with them and bring + - me back my &eGrandfather's Heirloom&f! + questAcceptDialog: + - '&a[Chief Piscis]&f The &dBandit Camp&f isn''t too far away if you follow the road!' + - + - + - Oh, and make sure you bring back my &eGrandfather's Heirloom&f! + - '&7&oI should go to the nearby &dBandit Camp&7&o and clear it out.' + questCompleteMessage: + - '&a[Chief Piscis]&f I see you''re back! Do you bring good news?' + - '&7&oYou tell &aChief Piscis&7&o about the camp and turn the &eHeirloom&7&o in.' + - + - + - + - + - '&7&oSeems like the &aChief Piscis&f is ready to tell me how to get out of here.' +primis_main_quest_4: + customObjectives: + Objective1: + dialog: + - '&a[Petrae]&f &2Chief Piscis&f sent you? Unfortunately the passage is closed, and the &cElemental&f guards it...' + name: '&9Blue flower path!' + questLore: + - We must report our findings about the + - '&dBandit Camp&f to &dGladius&f!' + - The mountain pass is guarded by an ancient, + - powerful &cGolem&f which must be avoided at all costs! + - Follow the &eBlue Flowers&f along the path, + - they will lead you to a secret passage + - through the mountains! + - A mountain guide will be waiting for you at the end + - of the &9Blue Flower &fpath! + questAcceptDialog: + - '&a[Chief Piscis]&f The mountain pass is guarded by an extremely dangerous &cGolem&f, which you are probably not able to defeat right now!' + - + - + - '&7&oI should follow the &9&oBlue Flower &7&opath to the &aMountain Guide&7&o!' + - '&7&oI should make sure to finish any business I got left before I leave.' + - '&7&oHint: Make sure you track the quest to make finding your destination easier!' + questCompleteMessage: + - '&a[Petrae]&f Are you sure you want to risk it? I can help you...' + - '&7&oSeems like &aPetrae&f has a request for me.' +primis_main_quest_5: + name: '&5The Crystal Elemental' + questLore: + - You need to pass through? Ill timing, my friend. + - A &cCrystal Elemental &fhas invaded our passage + - and shut it down. + - If you really must make your way to Gladius, + - you will have to defeat this &cElemental&f first! + questAcceptDialog: + - '&a[Petrae]&f You seek to defeat the &cCrystal Elemental&f? I can but wish you luck in your endeavor!' + - + - + - '&7&oSeems like I must defeat the &cCrystal Elemental&7&o.' + questCompleteMessage: + - '&a[Petrae]&f Outstanding! I saw you defeat the &cCrystal Elemental&f, clearly there''s greatness in your future!' + - Now that we are on the other side, let me tell you the path to &dGladius&f! +primis_main_quest_6: + customObjectives: + Objective1: + dialog: + - '&a[Filius] &fYou made it through the mountain! You don''t see that every day.' + - + - + - '&7&oSeem like &aFilius&7&o can help me find the way to &dGladius&7&o.' + name: '&5The Farmstead' + questLore: + - The path to &dGladius&f should be easy, but with + - all the disturbances we've been seeing I suspect + - it might not be that simple. + - I am good friends with the &aProprietor of the Farmstead&f + - down the road. If you tell them I sent you, I am sure + - they will tell you how to safely reach &dGladius&f and + - give you news about the surrounding area. + - Good luck in your travels and stay safe! + questAcceptDialog: + - '&a[Petrae]&f Just tell the &aProprietor of the Farmstead&f that I sent you, though I have heard that the &aProprietor&f hasn''t been seen in a while.' + - + - + - Безопасные путешествия! + - '&7&oI should follow the path to the &dFarmstead&7&o and talk to its &aProprietor&7&o.' + questCompleteMessage: + - '&a[Petrae]&f Outstanding! I saw you defeat the &cCrystal Elemental&f, clearly there''s greatness in your future!' + - Now that we are on the other side, let me tell you the path to &dGladius&f! + - '&7&oI should talk to &aFilius&7&o to learn the way to &dGladius&7&o, and possibly talk to his &aMother&7&o to see how I can help.' +primis_main_quest_7: + customObjectives: + Objective4: + dialog: + - '&a[General Hasta] &fI can''t believe you made it past the enemies.' + - You are exactly the kind of help we need right now! + - '&7&oSeems like I should talk to &aGeneral Hasta&7&o.' + name: '&5The path to Gladius' + questLore: + - Recently smoke was sighted over the fortress of &dGladius&f. + - We were unable to go there and see what's happening + - because a &dShip&f is currently blocking the path. + - We got attacked by a bunch of undead-looking creatures + - when we approached the &dShip&f, so we ran away. + - I am afraid you will have to force your way through this + - '&dShip&f in order to reach &dGladius&f. I''m sure that they will' + - reward you if you help thin the number of &cUndead&f on that ship! + questAcceptDialog: + - '&a[Filius] Be careful on the road, clearly something has gone wrong in &dGladius&f.' + - + - + - '&7&oI should go down the path to &dGladius&7&o and clear out some &cUndead Sailors&7&o on the way there.' + questCompleteMessage: + - '&a[Lord Hasta]&f Were you sent as reinforcements from Pontis Mille? Where are the others? Are you a messenger?' + - '&7&oI should talk to &aLord Hasta&7&o.' +primis_main_quest_8: + name: '&5Recovering Hope' + questLore: + - We never saw this invasion coming. + - They came in the dead of night, hit us hard and fast. + - Before we knew it, half the city was overrun. + - Morale is low. Everyone here has lost someone. + - To spite our heartache, our own loved ones parade + - through the streets in a mockery of life itself. + - We need to rally and bolster morale, + - or we won't see another dawn! + - Back in my &dMansion&f, in my treasury, lies a &eDocument&f + - of the utmost importance. It is a written promise with + - one of the founders of &dPontis Mille&f to provide us with + - assistance in a time of dire need. This is the time. + - Retrieve the &eDocument&f, bring it back to me and + - I promise you will be welcomed in &dPontis Mille&f with + - open arms. Soldiers will fight to their last + - if given this small hope. + questAcceptDialog: + - '&a[General Hasta] The note is in my &dMansion&f. Be sure to bring it back. My men here also have other requests around town you can help with, if able.' + - '&7&oI should check what the other soldiers need and head to the &dMansion&7&o at the town exit.' + questCompleteMessage: + - '&a[Lord Hasta]&f Outstanding! Recovering this &eDocument&f in the middle of a war? If we had 10 more of you, the city would never have been taken in the first place!' + - Before you go, do you think you could do me a small personal favor? + - '&7&oSeems like &aLord Hasta&7&o wants to talk to me.' +primis_main_quest_9: + name: '&5Gladius'' Champion' + questLore: + - Before heading to &dPontis Mille&f, I have a + - personal favor to ask. + - Our &cChampion&f was last seen fighting off a horde of + - enemies near the &dStatue&f. + - We have not heard from him since the start of the + - invasion and at this stage we fear the worst. + - Please go check on him. If you find him and he has + - turned into one of these undead... please free him of his curse. + questAcceptDialog: + - '&a[General Hasta] &fMake your way to the &dStatue&f. I am sure our &cChampion&f will be easy to find.' + - '&7&oI should go to the &dStatue&7&o and investigate what happened to the &cChampion of Gladius&7&o.' + questCompleteMessage: + - '&a[General Hasta]&f So... The worst has come to pass. I will make sure these beasts shall pay for slaying my son.' + - 7&oSeems like &aGeneral Hasta&7&o has some parting words for me. +primis_ogre_mines_clear: + name: '&2Ogre-sized problems' + questLore: + - Our mining encampment was overrun! + - We need help! + - I don't really know what happened, but we need to clear + - the encampment and talk to &aOld Vetus&f! + questAcceptDialog: + - '&a[Metus]&f You''re going to help? Please hurry, the encampment is just beyond here!' + - '&7&oI should clear the encampment and talk to &aOld Vetus&7&o.' + questCompleteMessage: + - '&a[Vetus Fossores]&f You came to help? Fantastic, we absolutely need help right now!' + - Here's a little something for your help clearing the encampment! +primis_ogre_mines_lost_bretheren: + customObjectives: + Objective1: + dialog: + - '&a[Fortis Fossores] &fWhat do you want? What, &aFugit&f sent you? What for? The mines were overrun? Hah, I didn''t even notice!' + - + - + - + name: '&5Lost Bretheren' + questLore: + - The mine was overrun by &cOgres&7&o! + - In the confusion I got separated from my &aBrother&f in the &dMines&f, + - and I fear for his safety! + - He's a bit of an eccentric man, very dedicated to mining. + - You'll know if you've seen him! + - Please bring him back up here, or at the very least tell me if he is safe. + - I'll make it worth your trouble! + questAcceptDialog: + - '&a[Fugit] &fPlease find my &aBrother&f and make sure he''s OK!' + - '&7&oI find &aFugit''s Brother&7&o in the &dMines&7&o overrun by &cOgres&7&o.' + questCompleteMessage: + - '&a[Fugit Fossores]&f My &aBrother&f said what? Ah, typical of him, too focused on his work to notice the entire place was taken over!' + - I'll have a serious conversation with him next time I see him! + - + - +primis_ogre_mines_old_miner_quest: + name: '&2Lucky Pickaxe' + questLore: + - We have ourselves a bit of a pickle! + - As we were mining, we came across a mysterious cave full of monsters! + - I dropped my favorite &ePick-axe&f as I ran, I need your help to go get it! + - I'm sure the &cOgre Magi&f picked it up for himself. + - Get my &eLucky Pickaxe&f back from that brute! + - I've got some trinkets for you when you return. + questAcceptDialog: + - '&a[Vetus Fossores]&f That &cOgre&f shouldn''t be far! You can find him in the cave to the right, before the collapsed area.' + - He should have the &ePickaxe&f, &cOgres&f love shiny things after all! + - '&7&oI should defeat the &cOgre Chief&f.' + questCompleteMessage: + - '&aa[Vetus Fossores]&f You got my lucky pick? Excellent!' + - Heres your reward! +primis_pontis_groves_acrobatics: + customObjectives: + Objective1: + dialog: + - '&a[Idoneitatem Hominem]&f Congratulations!' + name: '&2Acrobatics' + questLore: + - So you think you have you what it takes. + - Are you fit enough, are you quick enough, are you strong enough? + - Platforms, wines, dangerous heights. All you could ever want! + - The ultimate challenge lies ahead! + - OK, OK. Me and my &aBrother&f might have been bored a bit and + - made an entire acrobatics course. + - The goal is to to get from platform to platform using &9Wines&f and + - '&9Acrobatics&f and reach the end of the course.' + - + - + - You will be rewarded with a very nice &eItem&f! + questAcceptDialog: + - '&a[Posuere Hominem]&f You can find the start of the course at the &dEnd of that Tunnel&f.' + - + - + - Don't forget to speak to my &aBrother&f at the end of the course for the reward! + - '&7&oI should head to the start of the course.' + questCompleteMessage: + - '&a[Idoneitatem Hominem]&f Well deserved! I hope you did not cheat! Try and beat my record if you can.' +primis_pontis_groves_caught in the web: + name: '&2Caught in the web' + questLore: + - So they have a &dNest&f somewhere in the &dGrove&f. + - That would explain why their population has skyrocketed. + - + - + - It would be great if you could locate the &dNest&f and clear it out. + - We will make you some fine &eSpider Leg Boots&f as a reward! + questAcceptDialog: + - '&a[King Nemian]&f If there is a &dNest&f I am sure it would be &9Surrounded by Cobwebs&f.' + - '&7&oI should find the &dSpiders Nest&7&o and clear it out.' + questCompleteMessage: + - '&a[King Nemian]&f Hah! I knew we could count on you!' + - Here are your fine boots, well deserved! +primis_pontis_groves_elf_stole_from_my_shelf: + name: '&2Elf stole from my shelf' + questLore: + - Disaster has struck our little hole. + - Not too long ago our lovely home got raided by &cElf Bandits&f. + - Thankfully we weren't home at the time so nobody got hurt. + - We managed to replace most of our possessions. + - But they took my &eFamily Heirloom&f that was sitting on the shelf. + - If you would be so kind to go try and get it back for me, I would be most thankful. + - I make the best stews, I would be glad to share some with you as a reward. + questAcceptDialog: + - '&a[Luxuria Gorgonius]&f The &eHeirloom&f is quite valuable I am sure they would keep it &9Somewhere Extra Safe&f.' + - '&7&oI need to go retrieve the &eHeirloom&7&o.' + questCompleteMessage: + - '&a[Luxuria Gorgonius]&f Oh my gosh! You found it!' + - There are not enough thanks in the world for what you just did for me. + - '&7&oThis stew should keep med fed for a while.' +primis_pontis_groves_into_the_next_hole: + customObjectives: + Objective1: + dialog: + - '&a[Phygia Gorgonius]&f Time to kick those &cElves&f out for good!' + name: '&2Into the next hole...' + questLore: + - If you are available there is plenty more work to do around here. + - We have some serious &cElf&f problems, + - but I have assigned &aPhygia&f to handle those issues. + - Go talk to &aPhygia Gorgonius&f in the hole next to this one. + - They will be able to tell you more and what needs to be done. + questAcceptDialog: + - '&a[King Nemian]&f The hole right next to this one one, can''t miss it!' + - '&7&oI should go talk to &aPhygia Gorgonius&7&o.' + questCompleteMessage: + - '&a[Phygia Gorgonius]&f Let''s talk...' + - '&7&oI should hear out &aPhygia Gorgonius&7&o.' +primis_pontis_groves_lighthouse_1: + customObjectives: + Objective1: + dialog: + - '&a[Alanus Secundas] &fHas the &dGrove&f sent you?' + name: '&2Feeding the sick' + questLore: + - Wanderer, could I ask a simple favor of you? + - + - + - But ever since the troubles began we could not leave our &dGrove&f. + - Would you be so kind to bring the family their latest batch of food. + - It would be great if you could hurry, it has been a while since the last delivery. + questAcceptDialog: + - '&a[King Nemian]&f When you exit the hole the &dLighthouse&f is straight forward and a bit to the left.' + - '&7&oI should go to the &dLighthouse&7&o.' + questCompleteMessage: + - '&a[Alanus Secundas]&f I am so thankful! We were just starting to run out of food.' + - Are you busy? + - '&7&oSeems like &aAlanus&7&o wants to talk to me.' +primis_pontis_groves_lighthouse_2: + customObjectives: + Objective1: + dialog: + - '&8[Jeeves]&fOh, hello there again!' + - '&8[Jeeves]&f They do not need the food anymore? I was just about to go shopping.' + - '&8[Jeeves]&f So kind of you to come here and let me know.' + name: '&2Do not ask Jeeves' + questLore: + - Uh, before you came. Jeeves the Travelling Merchant stopped by. + - We asked him if he could go get some food for us. + - + - + - + - + questAcceptDialog: + - '&8[Alanus Secundas]&f When you exit the dwelling the Lighthouse is straight forward and a bit to the left.' + - '&8&oI should go to the Lighthouse.' + questCompleteMessage: + - '&8[Alanus]&f You let him know? Good, good!' + - '&8&oSeems like Alanus is quite fed.' +primis_pontis_groves_population_control: + name: '&2Population control!' + questLore: + - Oh I am so happy that finally someone has arrived to help us out. + - We have a big arachnid problem going on in our little grove. + - There are so many arachnids around these days that you cannot even + - take a nice evening walk without one of the nasty buggers + - jumping at you from the shadows. + - It is clear that their population numbers need a serious culling. + - Oh! Please bring to me any arachnid legs that are still in good contidion. + - We use them to make small cranes and grabbers. + questAcceptDialog: + - '&8[King Nemian]&f You will find them lurking beneath the shadows of the trees.' + - '&8&oI need to find Forest Crawlers and kill them.' + questCompleteMessage: + - '&8[King Nemian]&fGood to see you return, and with plenty of legs too!' + - '&8[King Nemian]&fYou think that their nest might be near? Let''s talk more about this' +primis_pontis_groves_tree_climbing_elf_bandits: + name: '&2Tree climbing elf bandits!' + questLore: + - + - + - Not like the &cSpiders&f were enough, + - now these shadow loving poop nuts have decided to settle in our trees! + - + - + - + - + - Forced their way in with their superior numbers. + - Well they got something coming alright, + - one look at you and I can tell you can handle a couple of stone giants! + - I am sure some elves won't be much of an issue for you. + - + - + questAcceptDialog: + - '&a[Phygia Gorgonius]&f I am sure you will find plenty of them if you find some place with shade and just look up, hard to miss their tree houses.' + - '&7&oI should go take care of these &cElves&7&o before &aPhygia&7&o catches on fire from rage.' + questCompleteMessage: + - '&a[Phygia Gorgonius]&f My friend! HAHA! So good to see you again!' + - + - + - '&7&oThe elves wont be bothering &aPhygia&7&o ever again.' +primis_pontis_mille_fields_berry_crazed_wolf: + name: '&2Berry crazed wolves' + questLore: + - Oh gosh, I have no idea what is wrong with these &cRockhounds&f. + - They keep coming into the &dBerry Farm&f while I am away or sleeping. + - You would think they come here and eat the berries, but no! + - They load their mouths with them and carry them + - off somewhere deep into the forest. + - I mean they are &cHounds&f! Why are they even stealing berries. + - Well I guess it doesn''t matter, I have a favor to ask. + - Could you go clear the + - '&9Area Behind the Berry Farm&f,' + - and bring back my &eStolen Berries&f. + - I have a lot of pies to make and the berries they stole were ripe and ready. + questAcceptDialog: + - '&a[Dordalus Nasica]&f I only saw the &cRockhounds&f steal the berries.' + - '&7&oI should go kill the &c&oRedwood Rockhounds&7&o and collect any &e&oStolen Berries&7&o they drop.' + questCompleteMessage: + - '&a[Dordalus Nasica]&f Oh my, you did it. Could I bother you with one more tiny favor.' + - '&7&o Seems like &d&oMilonia&7&o has more work for me.' +primis_pontis_mille_fields_camping_hunters: + customObjectives: + Objective1: + dialog: + - '&a[Scribonia Ingenvinus]&f Yes?' + name: '&2Camping hunters' + questLore: + - I hope I am not bothering you. You look like a person that would listen to a plea. + - We do not have much to do here in the &dSlums&f, + - most of us like to wander the &dFields&f to pass the time. + - Unfortunately that has come to a stop after a bunch + - of &cMonsters&f started roaming around the &dFields&f. + - We heard that some hunters have made &dCamp&f near the &dFields&f. + - If you could go there and talk to them and ask them to deal with these &cMonsters&f... + questAcceptDialog: + - '&a[Augustina Verrucosis]&f Their &dCamp&f should be somewhere North-West of here.' + - '&7&oI need to head for the &d&oHunters Camp&7&o.' + questCompleteMessage: + - '&a[Scribonia Ingenvinus]&f Help the &dSlums&f with their &cMonster&f issue?' + - Let's talk more about. + - '&7&oI should talk to &a&oScribonia&7&o and hear out what she has to say.' +primis_pontis_mille_fields_camp_hunter_three_times_hunter: + name: '&2Hunter three times hunter' + questLore: + - So you found &aVolumnia&f. Thank the great hunters that she is alright. + - Since you have helped &aVolumnia&f and proven yourself a kind soul. + - How about a friendly challenge. I would be willing to offer you some nice + - quality armor should you face the challenge and return victorious. + - The challenge involves hunting + - '&cThree Great Beasts&f scattered across Pontis.' + - The &cBeast Cod Furiosa&f who swims underneath a bridge where two mountains stand. + - '&cBeast Crawler Megdun&f that slumbers on top of a sun covered grove.' + - Dancing between two western peaks you will find the + - '&cBeast Impaler Uladzimir' + - + - + questAcceptDialog: + - '&a[Milonia Majus]&f Here take this device it will roughly guide you to the their location.' + - '&7&oI should go and challenge the &c&oThree Great Beasts&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f You have returned. And you have brought all three items I requested as proof.' + - + - + - Well enough about me, here is your reward as promised! + - '&7You hand back the beast tracking device.' + - '&a[Milonia Majus]&fI had almost forgotten about that thing, thank you!' + - Until we meet again adventurer! +primis_pontis_mille_fields_do_it_yourself: + name: '&2Do it yourself' + questLore: + - Deal with the &cMonsters&f? Well I can tell you we have already been doing that. + - There is just too many of them and not enough of us. + - We started hunting them as soon as we made our &dCamp&f here. + - But their numbers just don't seem to be going down. + - And that's not even the worst of it. + - We have discovered a lair and a big old &cBeast&f that comes with it! + - Well since you have made it to our &dCamp&f in one piece, + - I assume you are quite capable yourself. + - How about joining the hunt? What say you? + questAcceptDialog: + - '&a[Scribonia Ingenvinus]&f I knew you would say yes! I see you are already well equipped.' + - OK, this is what I want you to do. + - + - + - Second I need you to slay 5 &cLonghorns&f and 6 &cShorthorns&f. + - Understood? Good. Report to me when you're done. + - '&7&oI should slay &c&oBig ol'' Bubba&7&o and kill 5 &c&oLonghorns&7&o and 6 &c&oShorthorns&7&o.' + questCompleteMessage: + - '&a[Scribonia Ingenvinus]&f I must say I am quite impressed.' + - Clearly you are way more than just 'capable'. + - Thank you for the assistance, we will be able to handle the rest. + - Until we meet again, great hunter. +primis_pontis_mille_fields_feeding_the_hungry: + customObjectives: + Objective3: + dialog: + - '&7You hand the over the bread and the flour.' + - '&a[Rufia Tertulus]&f I don''t know what to say. My children will be so happy!' + - '&7The woman bows to you in deep appreciation.' + Objective4: + dialog: + - '&a[Fabia Praetextus]&f I guess fantasies do come true sometimes. I am eternally grateful to you kind sir.' + Objective1: + dialog: + - '&a[Lena Lucan]&f Fresh bread! I cannot thank you enough!' + Objective2: + dialog: + - '&a[Tranio Florens]&f Wow! The day just keeps getting better!' + - Thank you for the flour kind soul. + name: '&2Feeding the hungry' + questLore: + - I can feel a good heart beating in that chest of yours. + - Not everyone is as fortunate as you and I. + - There are some poor souls living in the &dPontis Mille Slums&f. + - For a while now I have been working over + - time to produce surplus bread and flour. + - Would you mind taking these sacks of wheat and these bread stacks. + - Then travel with them to the &dSlums&f and hand them out to those in need? + - I have been doing this for a while now but I injured my left foot, + - so I cannot do much walking right now. + questAcceptDialog: + - '&a[Daemones Maritialis]&f I wish there were more people like you in the world.' + - The &dSlums&f are straight North of here, you can see the buildings in the distance. + - '&7&oI should go to the &dSlums&7&o and hand out the food to those in need.' + questCompleteMessage: + - '&a[Augustina Verrucosis]&f &2Daemones&f sent you here didn''t he.' + - + - + - Thank you stranger, my family won't forget this. +primis_pontis_mille_fields_fruity_hound: + name: '&2Fruity hound' + questLore: + - Since you are my NUMBER ONE berry recovery agent, + - I have another task for you. + - As you can see we grow some very large berries on our + - little &dBerry Farm&f here. + - There was a + - '&eSpecific Berry&f I was growing for a contest.' + - But as I was walking to the &dBerry Farm&f I saw a + - '&cFruity Rockhound&f jump for the bush holding my prized berry.' + - He snapped it off and carried it away. + - Its jaws were holding the berry by its stem so + - it should still be in one piece, I hope. + - If you go slay the beast and bring back my + - dear &eContest Berry&f I will have a nice + - reward waiting for you. + questAcceptDialog: + - '&a[Dordalus Nasica]&f I think I saw the &cHound&f head into the &dRedwoods&f, North-West of the farm.' + - '&7&oI should go slay the &c&oFruity Hound&7&o and see if the &e&oContest Berry&7&o is still in one piece.' + questCompleteMessage: + - '&a[Dordalus Nasica]&f YES! That is my darling! Fine and whole, not even any saliva on it!' + - + - + - + - +primis_pontis_mille_fields_not_on_my_farm: + name: '&2Not on my farm!' + questLore: + - Lately all these &cRats&f have been driving me crazy. + - They keep going into our little farm and eating all our goods! + - Any chance you could go and lower their numbers a bit? + - Be careful, there are so many of them. + - Oh, I almost forgot to tell you. + - If you see a large &cWell Fed Rat&f don't bother with it. + - It has grown so large and fat it would take you days to slay it. + questAcceptDialog: + - '&a[Milonia Majus]&f I am sure that you already noticed that they like to squirm around the path area.' + - '&7&oI should go kill the &cRats&7&o that hang around the path that leads to &dPontis Mille&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f Thank you so much! We can get back to making delicious goods now.' +primis_pontis_mille_fields_surprise_me_with_flour: + customObjectives: + Objective3: + dialog: + - '&a[Adulescens Lupis]&f I heard the farm was having &cRat&f problems. Three sacks of flour coming up, no problem!' + Objective1: + dialog: + - '&a[Dinia Niraemius]&f Flour? Sure, one sack of flour coming up!' + Objective2: + dialog: + - '&a[Daemones Maritialis]&f The farm needs more flour eh? Here ya go, two sacks!' + name: '&2Surprise me with flour' + questLore: + - Wow, you're quite handy. If I could bother you with another task. + - The &cRats&f had completely ruined our current stock of flour. + - So we need to a completely new batch of flour. + - The &dWindmills&f should have plenty of it. + - Go collect the flour and drop it off back here with me. + - I will be paying good coin for this service! + questAcceptDialog: + - '&a[Milonia Majus]&f You will need to collect the flour from all three &dWindmills&f.' + - '&7&oI need to visit the three &dWindmills&7&o and collect the flour they produce.' + questCompleteMessage: + - '&a[Milonia Majus]&f This should last us for quite a while!' + - Hopefully our flour tab won't get too big, hehe. +primis_pontis_mille_fields_wellness: + name: '&2Wellness' + questLore: + - Am I glad to see you right now! + - Dang &cNightmare Rat&f ambushed me while I was climbing down the well. + - I injured my arm and legs when I fell. + - Argh, I still have some of its toxic spit left in my eyes. + - Thankfully I managed to crawl my way onto this little + - ledge before it could come finish me off. + - How embarrassing, not sure what hurts more right now, my body or my pride. + - I have some + - '&eFirst Aid Equipment&f' + - in my chest at the &dHunters Camp&f. + - Would you mind getting it for me? Oh, and make sure not to tell anyone + - there a word about what you saw here. + - '...almost died in a well...this is chapter of my life I will need to erase...' + questAcceptDialog: + - '&a[Volumnia Zoilus]&f The &dHunters Camp&f is straight South, cannot miss it, look for tents.' + - '&7&oI need to go collect the &e&oFirst Aid Equipment&7&o for &a&oVolumnia&7&o at the &d&oHunters Camp&7&o.' + questCompleteMessage: + - '&a[Volumnia Zoilus]&f Already back? Hand me the equipment.' + - Do not worry about me, I will have myself patched up in no time. + - Thank you for everything! You saved my life you know! +primis_pontis_mille_field_check: + customObjectives: + Objective1: + dialog: + - '&a[Augustina Verrucosis]&f Oh, this is quite important! I will let the residents know.' + - Thank you for delivering these important documents. + name: '&2Field check' + questLore: + - If I could bother you with some delivery tasks. + - I have here some important documents that need to be delivered to the + - '&dSlums&f and to the &dFields Farm&f.' + - The soldier that was supposed to come and get them has not arrived yet. + - And this is an urgent matter, we cannot afford to wait any longer. + - Unfortunately I have strict orders to not leave my post. + - If you could do this for me it would help us out a lot. + questAcceptDialog: + - '&a[Godefridus Novation]&f You will do it? Excellent!' + - You can follow the &9Yellow Path&f to get to the slums. + - The &dFields Farm&f is right beyond the slums, just follow the path. + - Oh! And watch out for the field rats! + - '&7&oI should head for the &d&oSlums&7&o and then the &d&oFields Farm&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f Documents? Let me see them. Hmmm, looks official.' + - Thank you for coming all the way here to deliver them. + - '&7&oSeems like &a&oMilonia&7&o could use my help with the rats...' +primis_pontis_mille_fresh_rats_coming_up: + customObjectives: + Objective1: + dialog: + - '&a[Elite Guard]&f Plenty of rats inside.' + name: '&2Fresh rats coming up' + questLore: + - No cat food but I think I can help ya + - find something even better... + - I heard a couple of + - '&aGuards&f have been dealing with' + - a rat infestation in the lower parts of the city. + - Go down there and maybe you can get some + - '&cRats&f for your cat friend.' + questAcceptDialog: + - '&7&oI should check out the lower part of the city and see if I can find the &a&oElite Guards&7&o.' + questCompleteMessage: + - '&a[Mew Meowzer]&f Meow. MEOW! Prrrrr.' + - '&7&oI should let the cat enjoy it''s meal in peace.' + - '&7&oIt seems to have dropped something, hmm...' +primis_pontis_mille_hungry_friend: + customObjectives: + Objective3: + dialog: + - '&a[Melaenis Gelasius]&f Cat food? Where the heck did you manage to find a cat here...' + - No, I don't know where to get any cat food. + Objective4: + dialog: + - '&a[Sulpicio Panthera]&f I wish I could help, sorry.' + Objective1: + dialog: + - '&a[Royal Guard]&f Do I look like someone who keeps track of cat food?...' + Objective2: + dialog: + - '&a[Tyndarus Faustinius]&f Sorry, I have no idea.' + Objective5: + dialog: + - '&a[Tyndarus Columbanus]&f We used to have cat food around here somewhere, but heck knows what happened to it...' + name: '&2Hungry friend' + questLore: + - '&7&oWhat is wrong little one.' + - '&a[Mew Meowzer]&f Meow!' + - '&7&o Are you hungry? Does the' + - '&7&olittle one want some food?' + - '&a[Mew Meowzer]&f MREOOOW!!!' + - '&7&oLet''s see if we can' + - '&7&oget you some food.' + questAcceptDialog: + - '&7&oI should see if anybody in the city knows where to find some cat food.' + questCompleteMessage: + - '&a[Modestus Aper]&f Cat food? I don''t know about that. But...' + - '&7&oSeems like &a&oModestus&7&o might know something...' +primis_pontis_mille_late_delivery: + name: '&2Late delivery' + questLore: + - I ordered some &eFishing Nets&f from + - '&dGladius&f that haven''t arrived yet. I wonder' + - if something might have happened to the + - shipment. If you are willing, I would pay you + - a small fee if you could go see what + - happened to the shipment and get the + - '&eFishing Nets&f for me.' + questAcceptDialog: + - '&a[Delphium Calpurnius]&f Last I heard my shipment of &eFishing Nets&f was supposed to be heading for &dGladius&f.' + - '&7&oI need to go look around &d&oGladius&7&o for &a&oDelphium''s&7&o shipment of &e&oFishing Nets&7&o.' + questCompleteMessage: + - '&a[Delphium Calpurnius]&f Those are the &eFishing Nets&f! Thank you so much!' + - '&a[Delphium Calpurnius]&f I invested a lot of my savings into these! Not sure what I would have done if you hadn''t found them.' +primis_pontis_mille_let_them_know: + customObjectives: + Objective3: + dialog: + - So Fortes sent you? I see. + - Your help would be much appreciated, aid me and my forces will be ready. + Objective1: + dialog: + - So Fortes has decided to take action. + - Help me finish my task, and my forces will be ready. + Objective2: + dialog: + - So Fortes has decided to act. + - If you could assist me with this task, then my forces will be ready. + name: '&2Let them know!' + questLore: + - I am sorry that we cannot send aid to &dGladius&f right away. + - Ever since that new &cCounselor&f came, our ruler has not been himself. + - If you could reach out to the &aGenerals&f in the city and let them know + - that &dGladius&f needs help we might be able to to do something about it. + - But not before we deal with the existing issues first. + - + - + - Go talk to them and then come back to let me know they got the message. + - I will reward you for your time. + questAcceptDialog: + - '&a[Fortes]&f Follow the &9orange path&f from the main room to find &aGeneral Bromia&f.' + - '&a[Fortes]&f At the end of the &9yellow path&f you will find the &aGeneral Rogerius&f.' + - '&a[Fortes]&f At the end of the &9shorter purple&f path you will find the &aGeneral Cylindrus&f.' + - '&7&oI need to talk to the three &a&oGenerals&7&o.' + questCompleteMessage: + - '&a[Fortes]&f You managed to contact them? Excellent!' + - '&a[Fortes]&f Here is your reward. Don''t spend it all in one place.' +primis_pontis_mille_lighthouse_1: + customObjectives: + Objective1: + dialog: + - '&8[Hegio Remus]&f Another letter? Thank you for bringing it to me.' + name: '&2A quick delivery' + questLore: + - Before you go anywhere, could you deliver this letter for me? + - You can find the gentleman it needs to go to on top of the Lighthouse. + - Don't worry the Lighthouse is right behind me through that doorway. + questAcceptDialog: + - '&8[Fortes]&f Thank you.' + - '&8&oI should go talk to the Pontis Mille Lighthouse Keeper.' + questCompleteMessage: + - '&8[Hegio Remus]&f Hey, do you have a second?' + - '&8&oSeems like Hegio Remus needs me to talk to him.' +primis_pontis_mille_lighthouse_2: + customObjectives: + Objective1: + dialog: + - '&a[Jeeves]&f Oh, we meet again. It''s good to see you.' + - You have something for me? Oh, wow...that is quite the shopping list. + - I will have the items sent back to &aHegio&f as soon as possible. + - Thank you for stopping by. Hope we meet again. + - '&7&oI should let &aHegio&7&o know I delivered the note.' + name: '&2Ask Jeeves' + questLore: + - Would you mind taking the portal and delivering a note to my good friend &aJeeves&f. + questAcceptDialog: + - '&a[Hegio]&f Much appreciated friend.' + - '&7&oI should go talk to &aJeeves&f at &dCaeruleaum Village&7&o.' + questCompleteMessage: + - '&a[Hegio]&f You delivered the note? Excellent!' + - Here, you can have some of this &eRabbit Stew&f I keep in my back pocket. +primis_pontis_mille_mines_goblined_up_in_the_maze: + customObjectives: + Objective3: + dialog: + - '&a[Hurt Guard]&f Am so I happy to see you!' + Objective1: + dialog: + - '&a[Injured Guard]&f Thank the skies!' + Objective2: + dialog: + - '&a[Wounded Guard]&f Finally, the rescue is here!' + name: '&2Goblined up in the maze' + questLore: + - If I could bother you for a second. + - Since you will be going into the &dMines&f already, it + - would be great if you could help us resolve some issues. + - We are missing three &aGuards&f that were sent + - into the mines to hunt down a &cCursed Goblin&f. + - I fear that something might have happened to them. + - This &cCursed Goblin&f is supposed to be + - hiding in some sort of &9Maze&f in the &dMines&f. + - Could you locate the &aMissing Guards&f and + - bring me proof of the &cGoblins&f death. + questAcceptDialog: + - '&a[Centurion]&fTry to not get lost in the &9Maze&f.' + - May luck be on your side warrior! + - '&7&oI should venture through the &d&oMines&7&o and locate the &9&oMaze&7&o.' + questCompleteMessage: + - '&a[Centurion]&f They are alive, excellent, we will send some soldiers to get them out as soon as possible.' + - I see you brought proof of the &cGoblins&f death, well done. + - '&7&oHopefully people keep out of the &9Maze&7&o in the future.' +primis_pontis_mille_serious_sewage: + customObjectives: + Objective3: + dialog: + - '&a[Michelangelo]&f Tell that old man everything is in order!' + Objective4: + dialog: + - '&a[Raphael]&f Tell Rogerius I am alive and doing fine!' + Objective1: + dialog: + - '&a[Donatello]&f You can tell the General I am doing just fine!' + Objective2: + dialog: + - '&a[Leonardo]&f The General should not worry, I am ok!' + name: '&2Serious sewage' + questLore: + - If you are up to the task then I could use your help. + - + - + - + - + - They have a leader, I think he calls himself &cShreepper&f or something. + - Make sure to get rid of him, a snake without it's head is not a threat. + - If you could go down there and thin the numbers of critters and the trouble makers + - then that would allow me to assign my forces to more important tasks... + - We had also sent &a4 Agents&f down there, I have not heard from them yet. + - + - + - I also seem to have misplaced my personal &eSewage Keys&f + - if you could retrieve those too, that would be great. + questAcceptDialog: + - '&a[Rogerius]&fYou can get to the &dSewers&f by going to the fountain and then a bit south-east.' + - + - + - '&7&oI need to find my way into the &dSewers&7&o and complete the tasks.' + questCompleteMessage: + - '&a[Rogerius]&f You have completed the all I have asked? If only I had 10 more men like you...' +primis_pontis_mille_star_gazing: + customObjectives: + Objective1: + dialog: + - '&a[Virgo Dexippus]&f Yes, what is it?' + name: '&2Star gazing' + questLore: + - You have done so much for this city and its people. + - Having assisted the three &aGenerals&f and helped the areas around &dPontis Mille&f + - has freed up a serious amount of our forces and resources. + - We would be able to send our forces to aid &dGladius&f now. + - But before we take action there is one last thing I would like you to do. + - You should go speak with the &aStargazers&f. + - It is in regards to our lost history and the &cElementals&f. + - The &aStargazers&f will be able to tell you more once you talk to them. + - Here take this sealed note and show it to them. + questAcceptDialog: + - '&7[Fortes Bellator]&f You can find the &aStargazers&f at the &dObservatory&f.' + - + - + - '&7&oI should talk to the &aStargazers&7&o at the &dObservatory&7&o.' + questCompleteMessage: + - '&a[Virgo Dexippus]&f The &aMajor&f sent you? It must be important then.' + - '&7&oI should talk to &aVirgo&7&o.' +primis_pontis_mille_stay_a_while_and_listen: + name: '&2Stay a while and listen' + questLore: + - Hand me the note. Let me take a look... + - We have been given permission to share important + - information with you regarding our past. + - You must have done something quite important, + - this information is usually only shared with the top brass. + - '&aStella&f will share with you what we have uncovered.' + questAcceptDialog: + - '&a[Virgo Dexippus]&f Talk to &aStella&f and &9Click on the Sword&f to start listening.' + - '&7&oI should talk to &aStella&7&o and start the &9Arena Challenge&7&o.' + questCompleteMessage: + - '&a[Virgo Dexippus]&f Do not share this information with anyone.' + - '&7&oThat was quite a tale.' +primis_pontis_mille_the_groves_call: + customObjectives: + Objective1: + dialog: + - '&a[King Nemian]&f &2General Bromia&a sent you?' + - Excellent, I knew we could count on him. + name: '&2The groves call!' + questLore: + - It is our duty to protect the &dGroves&f from any threats. + - '&aKing Nemian&f of the &dGroves&f has sent a request for aid.' + - Nasty critters have come to the &dGroves&f and other + - invaders are taking over the trees. + - If you could go over there and sort out these issues + - then my forces will be free to come to &dGladius'&f aid + questAcceptDialog: + - '&a[Bromia]&f The &dGroves&f are located North of the city.' + - There is a path through the mountain,, below the mines. + - '&7&oI should talk to &aKing Nemian&7&o.' + questCompleteMessage: + - '&a[King Nemian]&f You have arrived just in time!' +primis_pontis_mille_to_lycan_or_not_to_lycan: + name: '&2To lycan or not to lycan' + questLore: + - Not sure how a single person can accomplish what + - an entire battalion cannot. + - But if the &aGeneral&f has sent you, then who I am to complain. + - We have located their &dDen&f, but the resistance is too strong. + - There was just no way to get through. + - But If you could fight your way into the &dDen&f and clear it out + - then the &dRedwoods&f could be safe yet again. Well safer at least... + - Their &dDen&f is located under a &9Corrupted Redwood Tree&f. + - Should be easy to spot it, it stands out among the healthy trees. + questAcceptDialog: + - '&a[Cylindrus]&f Be careful...' + - '&7&oI need to clear out the &dWerewolf Den&7&o.' + questCompleteMessage: + - '&a[Magnus]&f By the great tree fairy, you''ve done it!!!' + - Feel free to rest at our camp, you are always welcome here. +primis_pontis_mille_where_is_he_now: + customObjectives: + Objective1: + dialog: + - '&a[Gorenus Palis]&f My brother sent you looking for me?' + - Oh, I messed up again...I got real lost this time. + - I hope he isn't too mad. + - When you go back, please tell him I'm safe. + name: '&2Hungry friend' + questLore: + - Me and my &aBrother&f were on our way + - back here from the village. + - During our travels I had to do a little detour, so we got separated. + - We were supposed to meet up here. + - But no trace of him for quite some time now. + - He has a tendency to get lost...real lost. + - I am quite worried about him. + - I would be willing to pay a high reward + - to anyone who can find him. + questAcceptDialog: + - '&a[Rodenus Palis]&f So kind of you to offer your help.' + - Please if you find him come tell me where he is right away. + - '&7&oI need to go find &a&oRodenus''&7&o brother.' + questCompleteMessage: + - '&a[Rodenus Palis]&f What! How the heck did he end up all the way there!' + - Sigh, I better start going now then... + - Thank you for all your help. Here are the coins as promised. +primis_pontis_redwoods_big_brown_logs: + customObjectives: + Objective1: + dialog: + - '&a[Magnus]&f Who are you? Oh, you came from &dPontis Mille&f.' + name: '&2Big brown logs' + questLore: + - I could dedicate my forces to helping &dGladius&f if you could help + - us deal with the &cWerewolf&f crisis in the &dRedwoods&f. + - Our forces have been holding back the &cWerewolves&f for weeks now. + - It would be great if you could assist us. + - Go to the &dRedwoods&f and talk to &aMagnus Castorea&f. + - They will let you know what needs to be done to end this crisis. + questAcceptDialog: + - '&a[Cylindrus]&fThe &dRedwoods&f can be reached by heading North.' + - Head North until you reach the &dRailway Stop&f, then head West. + - '&7&oI need to head into the &dRedwoods&7&o and talk to &aMagnus&7&o.' + questCompleteMessage: + - '&a[Magnus]&f The general has sent you to help?' + - Hmm...you better be good. +primis_pontis_redwoods_its_reyn_time: + name: '&2It is Reyn time!' + questLore: + - My &ePocket-watch&f had fallen into the river when I was cutting down a tree. + - It is a special watch you see. Filled with air and quite robust. + - Fully resilient to heavy logs being dropped on it, yep. + - I saw one of those nasty &cBandits&f scoop it up and put it in their pocket. + - Pretty sure I saw them &9Carrying a Hatchet&f. + - + - + - A nice reward for you too when you get back! + questAcceptDialog: + - '&8[Reynus]&f You can find the &cBandits&f right across the river.' + - '&7&oI need to go slay the correct &cBandit&7&o and collect the &eWatch&7&o.' + questCompleteMessage: + - '&a[Reynus]&f I will make sure not to loose it again!' + - Your reward my good sir! +primis_pontis_redwoods_nasty_little_bandits: + name: '&2Nasty little bandits!' + questLore: + - Ever since these darn &cBandits&f settled across the river there has been no peace. + - They keep ruining the trees, yesterday I caught one of them + - trying to set one of these giant trees on fire! + - And not too long ago I got chased by a crazy person with a hatchet, + - I am quite sure it was one of the &cBandits&f. + - Not too mention they keep trying to rob anyone that + - has business with us good folk here at the &dSawmill&f. + - Enough is enough. I am willing to pay good coin to make this madness end. + questAcceptDialog: + - '&a[Ligna Crispian]&f You will find them across the river.' + - '&8&oI should go to the &dBandit Camp&f and clear it out.' + questCompleteMessage: + - '&a[Ligna Crispian]&f Finally! Some peace, thank you!' +primis_pontis_redwoods_need_a_smoke: + name: '&2Need a smoke' + questLore: + - I heard you helped good old &aReynus&f there. + - Well as you can see, I managed to cut my legs with that darn saw again. + - Oh, don't worry about me. My legs will be healed up again in no time. + - You see, the issue is, not much to do while I wait for my legs to heal. + - This makes me in the mood for some good puffin. + - I brought with me some &ePremium Tobacco&f for my pipe, + - but I had to hide it in case those &cBandits&f got their hands on it. + - The problem is, I completely forgot where I hid it! + - All I remember is burying it &9Near a Tree&f. + - Which tree? Who knows! + - Listen I got you a fine deal here. Find my tobacco and you can have + - all of my &eGolden Apples&f. + questAcceptDialog: + - '&a[Lyco]&f Hope ya find it soon.' + - '&7&oI should go look for the &eTobacco&7&o.' + questCompleteMessage: + - '&a[Lyco]&f You found it! HAHA! Knew I could rely on ya!' +primis_terravilla_bipedal_examination: + name: '&2Bipedal examination' + questLore: + - I have been studying the &cTwo Legged Terrors&f that roam + - around &dTerravilla&f. Did you know that their population + - used to be much larger just some years ago. In fact it was + - the reason why the first settlers decided to build + - '&dTerravilla&f on top of the ruins and not down on the ground.' + - For some reason their numbers have really decreased. I was + - trying to get some &eSamples&f but trying to kill any of them is + - far beyond my skill. But you look like the sort of type who + - can handle a &cTwo Legged Terror&f or two. Interested in + - helping me out? + questAcceptDialog: + - '&a[Plautia Suilius]&f Six &eSamples&f should do it. Return to me once you have collected the &eSamples&f.' + - '&7&oI need to slay 3 &c&oTwo Legged Terrors&7&o and collect their &e&oSamples&7&o.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Great! Let''s have a look.' + - '&7&oI should hear what &a&oPlautia Suilius&7&o has discovered.' +primis_terravilla_drowning_terror: + name: '&2Drowning terror' + questLore: + - My theory was correct. I dissected the growth and found + - an organism inside. After careful examination I have + - determined that the organism is of aquatic origin. And + - not only that, they are capable of hijacking the host's + - brain. Once ready to hatch they make the host go to the + - nearest water source and drown themselves. The organism + - can then freely hatch and swim away. Whatever is + - infecting the &cTwo Legged Terrors&f must be living in + - a nearby river. You should go there and collect a + - '&ePerfect Sample&f of whatever organism is causing this.' + - I do not know if this is something that can affect humans + - but just in case you should kill a few of the organisms + - to make sure. + questAcceptDialog: + - '&a[Plautia Suilius]&f Come back here once you have collected a &ePerfect Sample&f.' + - '&7&oI need to go to the nearby river and collect a &e&oPerfect Sample&7&o of whatever is causing the infections.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Wow it looks like a fish, but it''s internal organs are different.' + - It must infect other creatures by releasing these tiny worm like meat particles... + - Let me have a look at you. Hmm, you seem fine, no traces... + - + - + - + - + - + - '&7&oI should make sure to stay away from the river...' +primis_terravilla_hog_on_my_porch: + name: '&2Bipedal examination' + questLore: + - He is sitting on the darn lift again! + - I cannot believe it! You there! + - You look like you can handle a large beast. + - I will pay you good money if you can get rid + - of that &cAnnoying Large Hog&f that keeps sitting + - on the lift. How are we supposed to get goods + - up and down this way. + questAcceptDialog: + - '&a[Dorippa Sarimarcus]&f Get rid of that hog right down there, see it?' + - '&7&oI need to slay the &c&oAlpha Razorback&7&o.' + questCompleteMessage: + - '&a[Dorippa Sarimarcus]&f Finally! I can move on with my life now! Thank you!' +primis_terravilla_razorbag: + name: '&2Razorbag' + questLore: + - If you are looking for work I got some for ya. + - I design and make heavy duty bags that I sell + - here at my little shop. So I am in need of + - leather. Thankfully there are plenty of + - '&cRazorbacks&f around these parts. If you are' + - interested I would like to hire you to go hunt + - them for their leather. I would need a considerable + - amount of leather. So this won't be a quick job. + questAcceptDialog: + - '&a[Telestis Senna]&f You will mostly find them roaming around here and towards the fields area.' + - '&7&oI need to go hunt the &c&oMature Razorback&7&o.' + questCompleteMessage: + - '&a[Telestis Senna]&f Yep, that will do it. In pristine condition too! Here is your coin, as promised.' +primis_terravilla_terrifying: + name: '&2Terrifying' + questLore: + - Well that is concerning. The sample you brought shows + - that they are slowly being drained of their nutrients. + - My hypothesis is that there is most likely a parasite + - attached to them that is causing this. You should go + - out there again and see if you can find any large + - '&eGrowths&f on their bodies, and then cut them off' + - and bring them back here. + questAcceptDialog: + - '&a[Plautia Suilius]&f I would only need two &eGrowths&f no more than that.' + - '&7&oI need to slay &c&oTwo Legged Terrors&7&o and collect two &e&oGrowths&7&o.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Excellent, these should do it.' + - '&7&oI should hear what &a&oPlautia Suilius&7&o has managed to find.' +test_quest: + name: Kill the Test Boss + questLore: + - '&cEnd the test boss'' reign of terror!' +xmas_quest_0: + name: '&2Find the lost gifts!' + questLore: + - + - + - I will let you open one of them in return! + questAcceptDialog: + - '&8[&cSaint Nick&8]&f Thank you! I will be waiting here for you!' + questCompleteMessage: + - '&8[&cSaint Nick&8]&f Thank you for your help! There are still some lost gifts out there, talk to me again if you want to help out more!' diff --git a/src/main/resources/translations/spanish.yml b/src/main/resources/translations/spanish.yml new file mode 100644 index 000000000..f66f55d13 --- /dev/null +++ b/src/main/resources/translations/spanish.yml @@ -0,0 +1,13253 @@ +config: + noArenaPermissionMessage: '[EliteMobs] ¡No tienes el permiso para entrar a esta arena!' +ItemSettings: + itemLoreStructureV2: + - '&7&m&l-------&7<&lInfo del Equipo&7>&m&l-------' + - '&7Nivel de Objeto: &f$itemLevel &7Prestigio &6$prestigeLevel' + - '$weaponOrArmorStats' + - '$soulbindInfo' + - '$itemSource' + - '$ifLore&7&m&l-----------&7< &f&lLore&7 >&m&l-----------' + - '$customLore' + - '$ifEnchantments&7&m&l--------&7<&9&lEncantamientos&7>&m&l' + - '$enchantments' + - '$eliteEnchantments' + - '$ifCustomEnchantments&7&m&l------&7< &3&lEncantamientos Personalizados&7 >&m&l------' + - '$customEnchantments' + - '$ifPotionEffects&7&m&l----------&7< &5&lEfectos&7 >&m&l----------' + - '$potionEffect' + - '&7&l&m-----------------------------' + - '$loreResaleValue' + shopSourceItemLores: '&7Comprado en una tienda' + mobSourceItemLores: '&7Saqueado de $mob' + loreWorths: '&7Vale $worth $currencyName' + loreResaleValues: '&7Se vende por $resale $currencyName' + eliteEnchantmentLoreStrings: Elite + noSoulbindLore: '&7¡No ligado al alma!' + preventEliteItemDisenchantmentMessage: '&c[EliteMobs] ¡No se puede desencantar objetos de Elite!' + scrapSucceededMessageV2: '&8[EliteMobs] &2¡Desguace exitoso $amount veces!' + scrapFailedMessageV2: '&8[EliteMobs] &c¡Desguace fallado $amount veces!' + lowDurabilityItemDropMessage: '&8[EliteMobs] &cArmadura soltada debido a su baja debilidad! &8Reparalo con un NPC con chatarra para usarlo!' + lowWeaponItemDropMessage: '&8[EliteMobs] &cArma soltada debido a su baja durabilidad! &8Reparalo en un NPC con chatarra para usarlo!' + simlootMessageSuccess: '&8[EliteMobs] &2Tiraste por loot y obtuviste $itemName &2!' + simlootMessageFailure: '&8[EliteMobs] &cTiraste por loot y no conseguiste nada!' + directDropCustomLootMessage: '&8[EliteMobs] &2Obtenido $itemName &2!' + directDropMinecraftLootMessage: '&8[EliteMobs] &aObtenido $itemName &a!' + directDropCoinMessage: '&8[EliteMobs] &aObtenido &2$amount $currencyName &a!' + directDropSpecialMessage: '&8[EliteMobs] &aObtenido &2$amount $name &a!' + weaponEntry: '&7Daño del Elite: &2$EDPS' + armorEntry: '&7Armadura del Elite: &2$EDEF' +ProceduralItemGenerationSettings: + materialNames: + swordName: Espada + bowName: Arco + pickaxe: Pico + spade: Pala + hoe: Azada + axe: Hacha + helmet: Casco + chestplate: Pechera + leggings: Pantalones + boots: Botas + shears: Tijeras + fishingRod: Caña de Pescar + shield: Escudo + trident: Tridente + crossbow: Ballesta + nameFormats: + - '$verb $itemType del $adjective $noun' + - '$itemType del $adjective $noun' + - '$noun de $adjective $verb $itemType' + - '$verb $itemType' + - '$adjective $verb $itemType' + - El $verb-er + - El $adjective $verb-er + nouns: + - MagmaGuy + - Amanecer + - Puesta de sol + - Paraíso + - Infierno + - Ángel + - Arcángel + - Querubín + - Serafín + - Demonio + - Desalmado + - Murciélago + - Gallina + - Vaca + - Champiñon + - Cerdo + - Conejo + - Oveja + - Calamar + - Aldeano + - Araña de Cueva + - Enderman + - Oso Polar + - Araña + - Zombie Pigman + - Blaze + - Creeper + - Guardián Anciano + - Endermite + - Invocador + - Ghast + - Guardián + - Zombi Momificado + - Cubo de Magma + - Shulker + - Lepisma + - Esqueleto + - Slime + - Esqueleto Glacial + - Vex + - Vindicator + - Bruja + - Esqueleto Wither + - Zombie + - Burro + - Caballo + - Llama + - Mula + - Ocelote + - Lobo + - Golem de Hierro + - Golem de Nieve + - Dragón del End + - Wither + - Illusionador + - Loro + - Gigante + - Conejo Asesino + - Steve + - Wolfbane + - Caos + - Aeon + - Dragón + - Sphynx + - Minotauro + - Hades + - Juramento + - Rompe juramentos + - Desertor + - Traidor + - Jade + - Luz + - Oscuridad + - Olvido + - Sombra + - Vacío + - Xeno + - Zelote + - Cenit + - Atardecer + - Crepúsculo + - Criatura + - Mob Elite + - Urist + - Enano + - Elfo + - Orco + - Duende + - Gnomo + - Goliat + - Drow + - Humano + - Mediano + - Mitad-Orco + - Contemplador + - Desollador Mental + - Buoso + - Tiburón de tierra + - Monstruo de Óxido + - Gigante de las colinas + - Gigante de piedra + - Gigante gélido + - Gigante de fuego + - Gigante de las Nubes + - Gigante de la tormenta + - Kóbold + - Lich + - Orco + - Umber Hulk + - Luchador + - Brujo + - Paladín + - Clérigo + - Guardabosque + - Arquero + - Mago + - Tiefling + - Hombre lobo + - Vampiro + - Centauro + - Hombre Gato + - Semigigante + - Ogro + - Troll + - Pícaro + - Bárbaro + - Bardo + - Druida + - Monje + - Hechicero + - Hechicero + - Cazador de demonios + - Caballero de la Muerte + - Sacerdote + - Chamán + - Guerrero + - Basilisco + - Quimera + - Diablillo + - Dríade + - Gárgola + - Genio + - Efreeti + - Fantasma + - Hobgoblin + - Hydra + - Kraken + - Lamia + - Medusa + - Mimic + - Momia + - Pegaso + - Roca + - Satyr + - Tarrasque + - Abominación + - Ghoul + - Treant + - Unicornio + - Wraith + - Acolyte + - Gladiador + - Caballero + - Gryphon + - Atracador + - Explorador + - Espía + - Thg + - Noble + - Guardia + - Veterano + - Wyvern + - Abismal + - Infernal + - Elemental + - Tauren + - Pandaren + - Sasquatch + - Forsaken + - Yeti + - Banshee + - Arachnid + - Muerto viviente + - Elfo de la noche + - Elfo de sangre + - Draenei + - Worgen + - Warlord + - Bruja + - Magi + - Sage + - Thief + - Asesino + - Templario + - Maestro de bestias + - Frenético + - Inventor + - Luchador + - Pirata + - Vanguardia + - Hoja del Vacío + - Girón + - Campesina + - Lacayo + - Espadachín + - Esclavo + - Felhound + - Cazador + - Cazador + - Aarakorcra + - Aboleth + - Deva + - Planetar + - Solar + - Ankheg + - Azer + - Behir + - Asesino Tirano + - Plaga + - Bugbear + - Bárbaro + - Abusón + - Cambion + - Chuul + - Rey Derrocado + - Cocatriz + - Couatl + - Cíclope + - Titán + - Manto oscuro + - Tomo ancestral + - Demilich + - Balor + - Barlgura + - Chasm + - Sobreño + - Glabrezu + - Goristro + - Hezrou + - Melena + - Marilith + - Nalfeshnee + - Quasit + - Vrock + - Yochlol + - Demonio del Foso + - Lemure + - Dracolich + - Doppleganger + - Chromatic Dragon + - Drider + - Elemental de Aire + - Elemental de Tierra + - Elemental de Fuego + - Elemental de Agua + - Rohirrim + - Gondorian + - Empyrean + - Faerie Dragon + - Ettin + - Flumph + - Fomorian + - Dao + - Gnoll + - Parshendi + - Listener + - Spren + - Stormfather + - Rosharian + - Brightlord + - Highprince + - King + - Emperor + - Shardbearer + - Surgebinder + - Bondsmith + - Gólem + - Gorgona + - Hag + - Arpía + - Hippogriffo + - Homunculo + - Maestro Alquimista + - Soldado Zombi + - Jackalare + - Nothic + - Oni + - Rakshasa + - Renacido + - Cultista + adjectives: + - Adorable + - Precioso + - Limpio + - Elegante + - Lujoso + - Glamuroso + - Apuesto + - Largo + - Magnífico + - Simple + - Pechera + - Espumoso + - Más Feo + - Rojo + - Naranja + - Amarillo + - Verde + - Azul + - Morado + - Gris + - Negro + - Blanco + - Muerto + - Raro + - Poderoso + - Rico + - Vasto + - Celoso + - Ensordecedor + - Débil + - Melodico + - Tranquilo + - Tormentoso + - Susurro + - Silbando + - Ancestral + - Rápido + - Viejo + - Rápido + - Lento + - Podido + - Espeluznante + - Torcido + - Vacío + - Pesado + - Aborrecible + - Anormal + - Absurdo + - Aceptable + - Accidentalmente + - Firme + - Aventurero + - Agonizando + - Alerta + - Molesto + - Molesto + - Ansioso + - Aromático + - Agresivo + - A distancia + - Asombroso + - Ambiguo + - Ambicioso + - Divertido + - Enfadado + - Arrogante + - Avergonzado + - Ambicioso + - Asombroso + - Propicio + - Promedio + - Impresionante + - Horrible + - Malo + - Bárbaro + - Tímido + - Propio + - Beligerante + - Beneficioso + - Enloquecido + - Mejor + - Desconcertado + - Grande + - Amargo + - Bizarro + - Sangriento + - Bordes + - Sin límites + - Temerario + - Valiente + - Musculoso + - Rompible + - Breve + - Luminoso + - Roto + - Ocupado + - Calculando + - Calloso + - Calma + - Caprichoso + - Cuidadoso + - Descuidado + - Cuidando + - Cauteloso + - Incesante + - Cierto + - Encantador + - Barato + - Jefe + - Friolero + - Caballerosidad + - Formido + - Claro + - Inteligente + - Claustro + - Torpe + - Nublado + - Elegante + - Colosal + - Combativo + - Común + - Confundido + - Condenado + - Genial + - Valiente + - Cobarde + - Loco + - Ansioso + - Cruel + - Adorable + - Curioso + - Lindo + - Dañado + - Perjudicial + - Peligroso + - Oscuro + - Enérgica + - Decisivo + - Profundo + - Derrotado + - Defectuoso + - Desafiante + - Delicado + - Delicioso + - Encantador + - Demoníaco + - Delirante + - Desordenado + - Descriptivo + - Diabólico + - Difícil + - Diligente + - Directo + - Sucio + - Desastroso + - Asqueado + - Asqueroso + - Decepcionado + - Distintivo + - Perturbado + - Draconiano + - Dramático + - Deprimente + - Disfuncional + - Ansioso + - Anciano + - Eléctrico + - Elite + - Encantado + - Encantando + - Energético + - Enorme + - Entretenido + - Entusiasta + - Envioso + - Errático + - Etéreo + - Evasivo + - Excelente + - Emocionado + - Emocionante + - Exótico + - Exuberante + - Fabuloso + - Desteñido + - Justo + - Fiel + - 'Falso' + - Familiar + - Famoso + - Fanático + - Fantástico + - Fascinado + - Gordo + - Temeroso + - Sin miedo + - Débil + - Festivo + - Intenso + - Asqueroso + - Fino + - Melindroso + - Primer + - Fijo + - Ostentoso + - Perfecto + - Endeble + - Ligero + - Florido + - Esponjoso + - Aleteo + - Espumoso + - Tonto + - Olvidadizo + - Afortunado + - Fragilidad + - Frágil + - Frenético + - Libre + - Congelado + - Fresco + - Amistoso + - Temible + - Torpe + - Gracioso + - Peludo + - Furtivo + - Borroso + - Gigante + - Dotado + - Gigantesco + - Centellante + - Glorioso + - Piadoso + - Bueno + - Simplón + - Maravilloso + - Agraciado + - Grandioso + - Agradecido + - Grasoso + - Grande + - Voraz + - Aflijiente + - Exitante + - Grotesca + - Sucia + - Horripilante + - Irritante + - Guardada + - Inculpable + - Crédula + - Valiente + - Gorgoteante + - Santificada + - Colgante + - Desdichada + - Feliz + - Armonizante + - Detestable + - Saludable + - Rompecorazones + - Celestial + - Infernal + - Útil + - Indefenso + - Vacilante + - Espantoso + - Divertidísimo + - Hueco + - Vagabundo + - Honorable + - Horrible + - Hospitalario + - Enorme + - Pesado + - Humorístico + - Hambriento + - Herido + - Callado + - Hipnótico + - Histérico + - Asqueroso + - Helado + - Ignorante + - Enfermo + - Ilegal + - Ilustre + - Imaginario + - Inmenso + - Inminente + - Imparcial + - Imperfecto + - Descortés + - Importante + - Incandescente + - Incompetente + - Industrioso + - Increíble + - Económico + - Infame + - Inocente + - Inquisitivo + - Insidioso + - Instintivo + - Inteligente + - Interesante + - Invencible + - Furioso + - Picante + - Hastiado + - Dentado + - Celoso + - Alegre + - Alegre + - Neurótica + - Juvenil + - Afilada + - Amable + - Bondadosa + - Astuta + - Experta + - Conocida + - Trabajada + - Aburrida + - Grande + - Última + - Antigua + - Risible + - Perezosa + - Delgada + - Letal + - Luz + - Pequeña + - Viviente + - Solitaria + - Ruidosa + - Encantadora + - Afortunada + - Magenta + - Mágica + - Mayestuosa + - Malicioso + - Marcada + - Masivo + - Maravilloso + - Promedio + - Médico + - Fundir + - Desordenado + - Fuerte. + - Military + - Sin inteligencia + - Menor + - Niebla + - Mixto + - Moderno + - Sin movimiento + - Misterioso + - Ingenua + - Estrecho + - Natural + - Hábil + - Necesaria + - Innecesario + - Necesitado + - Nervioso + - Nuevo + - Agradable + - Normal + - Nostálgico + - Innumerable + - Obsoleto + - Asequible + - Oceánico + - Anticuado + - Omnisciente + - Óptimo + - Ordinario + - Orgánico + - Sobresaliente + - Ovalado + - Sobrevalorado + - Doloroso + - Paralelo + - Patético + - Pacífico + - Penitente + - Perfecto + - Periódico + - Pequeño + - Físico + - Rosa + - Plástico + - Agradable + - Inútil + - Educado + - Pobre + - Precioso + - Premium + - Actual + - Bonito + - Privado + - Productivo + - Protección + - Público + - Puzzle + - Cuestionable + - Rápido + - Más rápido + - Raro + - Listo + - Real + - Rebelde + - Regular + - Notable + - Responsable + - Romántico + - Ronda + - Real + - Triste + - Seguro + - Salado + - Satisfecho + - Asustado + - Aterrador + - Científico + - Amanecer + - Pliegue + - Segundo + - Segunda mano + - Secreto + - Egoísta + - Secuenciar + - Seria + - Zona Poco Profunda + - Afilado + - Brillante + - '¡Impactante!' + - Corto + - Tímido + - Enfermo + - Silencioso + - Silky + - Rídicula + - Básico + - Delgado + - Delgado + - Baboso + - Resbaladizo + - Pequeño + - Inteligente + - Sonriendo + - Suave + - Sigiloso + - Suave + - Sólido + - Especial + - espectacular + - Picante + - Puntiagudo + - Espléndido + - Escalofriante + - Inmaculado + - Cuadrado + - Estaca + - Permanente + - Constante + - Pegajoso + - Extraño + - Rayado + - Fuerte + - Éxito + - Súper + - Supremo + - Dulce + - Talentoso + - Alto + - Sabroso + - Temporal + - Tenso + - Terrible + - Extraordinario + - Probado + - Agradecido + - Grueso + - Delgado + - Sediento + - Pensado + - Pequeño + - Cansado + - Complicado + - Problemas + - 'Verdadero' + - Feo + - Ultra + - No aconsejado + - Desarmado + - Descubierto + - Insalubre + - Único + - Desconocido + - Antinatural + - Sin usar + - Inusual + - Usado + - Útil + - Inútil + - Valioso + - Violento + - Esperando + - Errante + - Cálido + - Débil + - Adinerado + - Entero + - Sabio + - Maravilloso + - de Madera + - Estoy {gender, select, MALE{preocupado} FEMALE{preocupada} other{}} + - Sin valor + - Incorrecto + - Amenazador + - Confiando + - modesto + - Amenazante + verbs: + - Cortante + - "Cortando\n" + - Puñalada + - Rascarse + - "Matando\n" + - Matando + - Carnicería + - Destruyendo + - Cosquillas + - Abrazando + - Asesinando + - Slapping + - Silbando + - "Viajando\n" + - Teletransportándose + - Parpadeando + - Destruyendo + - Demoliendo + - Parpadeando + - Materializando + - Generando + - Preguntando + - Indagando + - Suplicando + - Demandando + - Interrogando + - Preguntando + - Asaltando + - Llamativo + - Emboscando + - Asesoría + - Acelerando + - Atormentar + - Bombardeo + - Barragio + - Golpeando + - Cargando + - Aporreando + - En batalla + - Cañoneo + - Martilleo + - Golpeando + - Combatiendo + - Abrumadora + - Asaltar + - Abordar + - Disparando + - Aventurarse + - Agrietamiento + - Ruptura + - Imponente + - Aplastante + - Fracturamiento + - Astillado + - Pulverizando + - Desgarro + - Desgarrando + - Chasquido + - Muy Lleno + - Explotando + - Perjudicial + - Fragmentando + - Dividiendo + - Fortificante + - Empujar + - Pulsar + - Empujar + - Descomunal + - Cabezazo + - Traqueteo + - Llamativo + - Enorme + - Golpeando + - Convocando + - Gritando + - Rugiendo + - Rugiendo + - Cambiando + - Transformando + - Modificando + - Retortijón + - Mutante + - Distorsionista + - Borrón + - Ajustando + - Deformando + - Alterando + - Adaptando + - Evolucionando + - Variando + - Caza + - Detrás + - Siguiendo + - Acechando + - Sombreado + - Acoso + - Entubado de revestimiento + - Montura + - Ascendente + - Aumento + - Pesado + - Brincar + - Reposo + - Recolectando + - "\nacorralar" + - Acaparar + - Segar + - Cosechar + - Guardar + - Refugiar + - Camuflar + - Shrouding + - Enclosing + - Concealing + - Hiding + - Disguising + - Masking + - Burying + - Smothering + - Clouding + - Shielding + - Shading + - Sealing + - Enveloping + - Veiling + - Obscuring + - Traversing + - Vadeando + - deslizándose + - Aullido + - español + - Gritando + - Shrieking + - Saqueo + - Rugiendo + - Lamento + - Bawling + - Pliegue + - Corte + - Cortando + - Astillado + - Gravedad + - Cortando + - Cortar + - Dividiendo + - Ejecutando + - Cortante + - Desgarrando + - Desgarro + - Delgado + - Recorte + - Tallar + - Diseccionar + - Hackeando + - Perforación + - Aserruchar + - Afeitando + - Esquilando + - Minando + - Profundizando + - Excavando + - Excavación + - Taladrando + - Vaciar + - Arrancar + - Tunnelado + - Invadiendo + - Embarque + - Errante + - Infiltrando + - Entrometido + - Evadiendo + - Huyendo + - Corriendo + - Esquivando + - Chocando + - En batalla + - Pelear + - Lucha Libre + - Reñir + - Duelo + - Pelear + - Justas + - Combate + - Chocando + - Guerreando + - Apresado + - Chatarra + - Atacando. + - Pelearse + - Escaramuzar + - Descubrir + - Detectando + - Atrapando + - Resolviendo + - Revelando + - Desenterrando + - Saltando + - Rebotando + - Brincar + - Abovedado + - Brincando + - Creciendo + - Pateando + - Patear + - Patada voladora + - Sentir + - Percibiendo + - Detectando + - Desvaneciendo + - Sangrado + - Encogimiento + - Debilitar + - Abatir + - Disminuyendo + - Forjar + - Liberando + - Recolectando + - Coleccionando + - Descartar + - Triturando + - Propulsando + - Trotar + - Corriendo + - Misionando + - Explorando + - Explorando + - Cavando + - Temblando + - Golpeteo + - Partiendo + - Hackeando + - Ruptura + - Tallar + - Dividiendo + - Reducir + - Romper + - Desgarramiento + - Separando + - Desgarrando + - Desgarrar + - Pastoreo + - Aprisionado + - Atrapando + - Arrinconando + - Enredando + - Fijando + - Atrapando + - Restringiendo + - Enlazando + - Atrapando + - Enganchando + - Arrebatando + - Enjaulamiento + - Capturando + - Embrujando + - Arrastrar + - Agachado + - Espiando + - Vengando + - Atormentar + verb-ers (noun): + - Rompe Mundos + - Quiebra Mundos + - Vengador + - Cenicero + - Buscador de viento + - Profanador + - Trueno Furioso + - Cortador + - Machetero + - Cortador + - Apuñalador + - Rascador + - Asesino + - Matador + - Destructor + - Abrazador + - Asesino + - Bofetada + - Viajeros + - Teletransportador + - Luces intermitentes + - Omg + - Materializando + - Generador + - Demanda + - Maleante + - Artillero + - Emboscada + - Apurado + - Tormenta + - Bombardero + - Cargador de barras + - Apuñalador + - Artillero + - Batallador + - Martillero + - Golpeador + - Combatiente + - Abrumador + - Atracador + - Rematador + - Tirador + - Aventurero + - Cracker + - Aplastador + - Vuelto pijador + - Vuelto en pinga + - Astillero + - Pulverizador + - Desgarrador + - Renderizador + - Pargo + - Ráfaga + - Explorador + - Dañador + - Fragmentador + - Duplicador + - Fortificador + - Empujador + - Grifo + - Golpeador + - Mantequillador + - Bullero + - Artillero + - Cortador + - Golpeador + - Invocador + - Ñañeco + - Cambiador + - Transformador + - Modificador + - Torbellino + - Difusor + - Urdidor + - Alterador + - Adaptador + - Evolucionador + - Encantamiento de Cazador + - Remolque + - Seguidor + - Acosador + - Sombreador + - Sabueso + - Cajero + - Montador + - Ascendido + - Elevador + - Springer + - Acaparador + - Muerte + - Cosechadora + - Ahorrador + - Refugio + - Encubierto + - Shrouder + - "Economy pay message v2: '&2You have paid &2$amount_sent $currency_name &2to $receiver&2,\n who got $amount_received after taxes!'\nEconomy currency left message: You now have &2$amount_left $currency_name\nEconomy money from payment message: You have received &2$amount_received $currency_name\n &ffrom $sender\nEconomy payment insuficient currency: '&cYou don''t have enough $currency_name to\n do that!'\nWallet command message: You have &2$balance $currency_name\nTax confirmation message: '&cSending a payment will cost $percentage% in taxes. &aDo\n &9$command &ato proceed!'\nshopBatchSellItem: '&aYou have sold your items &afor $currency_amount $currency_name!'\nShop buy message: '&aYou have bought $item_name &afor $item_value $currency_name!'\nShop current balance message: '&aYou have $currency_amount $currency_name.'\nShop insufficient funds message: '&cYou don''t have enough $currency_name!'\nShop item cost message: That item costs &c$item_value $currency_name.\nShop sell message: '&aYou have sold $item_name &afor $currency_amount $currency_name!'\nShop sale player items warning: '&cYou can''t sell items that are not currently soulbound\n to you! This includes items from other prestige tiers!'\nShop sale instructions: '&cYou can only sell EliteMobs loot here! (Armor / weapons\n dropped from elites showing a value on their lore)'\nTeleport time left: '&7[EM] Teleporting in &a$time &7seconds...'\nTeleport cancelled: '&7[EM] &cTeleport interrupted!'\nnoPendingCommands: '&cYou don''t currently have any pending commands!'\ntrackMessage: Track the $name\nchestLowRankMessage: '&7[EM] &cYour guild rank needs to be at least $rank &cin order\n to open this chest!'\nchestCooldownMessage: '&7[EM] &cYou''ve already opened this chest recently! Wait $time!'\ninsufficientCurrencyForWormholeMessage: '&8[EliteMobs] &cInsufficient currency! You\n need $amount to use this com.magmaguy.elitemobs.wormhole!'\ndismissEMMessage: '&8[EliteMobs] &2/elitemobs &fmenu not working for you? Try &2/elitemobs\n alt &fto see an alternative version of the menu! &cDon''t want to see this message\n again? &4/em dismiss'\nswitchEMStyleMessage: '&8[EliteMobs] &2/elitemobs &fmenu style changed! Check it out!'\n" + - Escondidos + - Masker + - Buryer + - Nuber + - Sombreado + - Sealizador + - Sobre + - Estrella de guía + - Atravesar + - Demandas + - Planeador + - Aullador + - O + - Ñañeco + - Guardián + - Bawler + - Chillador + - Cortador + - Trituradora + - Francotirador + - Duplicador + - Talador + - Machetero + - Renderizador + - Desgarrador + - Diminuto + - Cortador + - Tallador + - Hacker + - Perforante + - Serrador + - Maquina de Afeitar + - Tenazas + - Minero + - Excavador + - Madriguera + - Taladrador + - Tuneladora + - Invasor + - Borde + - Vagabundo + - Intruso + - Evasor + - Corredor + - Esquivador + - Crasher + - Batallador + - Luchadores + - Peleador + - Duelista + - Alborotador + - Clasher + - Agarrador + - Desguezadero + - Atacante + - Feudo + - Receptor + - Solucionador + - Revelador + - Saltador + - Bravucón + - Saltador + - Tolva + - Cirujano + - Cazador + - Bicicleta de Montaña + - Perceptor + - Atenuador + - Sangriento + - Debilitador + - Forjador + - Liberador + - Recolector + - Triturador + - Hélice + - Trotador + - Velocista + - Explorador + - Explorador + - Cavador + - Temblador + - Socio + - Hacker + - Tallador + - Divisor + - Mitades + - Interruptor + - Renderizador + - Extractor + - Herbívoro + - Encarcelador + - Rincón + - Pintor + - Receptor + - Limitador + - Vinculador + - Enganchar + - Ladrón + - Jaula + - Capturador + - Cazador + - Creeper + - Zapatillas + - Vinculador + - Carcelero + - Seductor + - Bailarín + - Blasfemador + - Comedor + - Roncador + - Impulsores + - Bofetada +absorption: + name: Absorción +blindness: + name: Ceguera +conduit_power: + name: Canalización +confusion: + name: Náusea +damage_resistance: + name: Resistencia +dolphins_grace: + name: Gracia del delfín +fast_digging: + name: Prisa minera +fire_resistance: + name: Cuerpo ignífugo +glowing: + name: Luminiscencia +harm: + name: Daño instantáneo +heal: + name: Curación instantánea +health_boost: + name: Salud mejorada +hunger: + name: Hambre +increase_damage: + name: Fuerza +invisibility: + name: Invisibilidad +jump: + name: Supersalto +levitation: + name: Levitación +luck: + name: Suerte +night_vision: + name: Visión nocturna +poison: + name: Veneno +regeneration: + name: Regeneración +saturation: + name: Saturación +slow: + name: Lentitud +slow_digging: + name: Fatiga al picar +slow_falling: + name: Caída lenta +speed: + name: Velocidad +unluck: + name: Mala suerte +water_breathing: + name: Respiración +weakness: + name: Debilidad +wither: + name: Wither +translation: + Economy pay message v2: '&2Has pagado &2$amount_sent $currency_name &2a $receiver&2, ¡quien obtuvo $amount_received después de los impuestos!' + Economy currency left message: Ahora tienes &2$amount_left $currency_name + Economy money from payment message: Usted ha recibido &2$amount_received $currency_name &ffrom $sender + Economy payment insuficient currency: '&c¡No tienes suficiente $currency_name para hacer eso!' + Wallet command message: Tienes $balance $currency_name + Tax confirmation message: '&cEnviar un pago costará $percentage% en impuestos. &a¡Coloca &9$command &apara continuar!' + shopBatchSellItem: '&aHas vendido tus objetos &apor $currency_amount $currency_name!' + Shop buy message: '&aHas comprado $item_name &apor $item_value $currency_name!' + Shop current balance message: '&aTienes $currency_amount $currency_name.' + Shop insufficient funds message: '&c ¡No tienes suficiente $currency_name!' + Shop item cost message: Este artículo cuesta &c$item_value $currency_name. + Shop sell message: '&aHas comprado $item_name &apor $currency_amount $currency_name!' + Shop sale player items warning: '&c¡No puedes vender artículos que no estén actualmente ligados a ti! ¡Esto incluye artículos de otros grados de prestigio!' + Shop sale instructions: '&cSolo puedes vender EliteMobs aquí! (Armadura / armas dejadas de las élites mostrando un valor en su lore)' + Teleport time left: '&7[EM] Teletransportando en &a$time &7segundos...' + Teleport cancelled: '&7[EM] &c¡Teletransporte interrumpido!' + noPendingCommands: '&cNo tienes ningún comando pendiente!' + trackMessage: Sigue el $name + chestLowRankMessage: '&7[EM] &cTu rango de gremio debe ser al menos $rank &cpara abrir este cofre!' + chestCooldownMessage: '&7[EM] &cYa has abierto este cofre recientemente! Espera $time!' + insufficientCurrencyForWormholeMessage: '&8[EliteMobs] &c¡Moneda insuficiente! ¡Necesitas $amount para usar este com.magmaguy.elitemobs.wormhole!' + dismissEMMessage: '&8[EliteMobs] &2/elitemobs &fmenu no funciona para ti? Intenta &2/elitemobs alt &fver una versión alternativa del menú! &c¿No quieres ver este mensaje de nuevo? &4/em descartar' + switchEMStyleMessage: '&8[EliteMobs] &2/elitemobs &fmenu ha cambiado! Échale un vistazo!' +EconomySettings: + currencyName: Monedas Elite + chatCurrencyShowerMessage: '&7[EM] ¡Has recogido &a$amount $currency_name!' + actionbarCurrencyShowerMessage: '&7[EM] ¡Has recogido &a$amount $currency_name!' + adventurersGuildNotificationMessages: '&7[EM] ¿Dinero extra para gastar? ¡ Prueba con &a/em !' +arrow_damage: + name: Poder +arrow_fire: + name: Llama +arrow_infinite: + name: Infinidad +arrow_knockback: + name: Golpeo +binding_curse: + name: Maldición de Ligamiento +channeling: + name: Canalización +critical_strikes: + name: Golpes Críticos + criticalHitPopup: '&5¡Golpe Crítico!' +damage_all: + name: Filo +damage_arthropods: + name: Perdición de los Artrópodos +damage_undead: + name: Castigo +depth_strider: + name: Agilidad Acuática +dig_speed: + name: Eficiencia +drilling: + name: Taladrando +durability: + name: Irrompibilidad +earthquake: + name: Terremoto + earthquakeActivationMessage: '&8[EliteMobs] &aTerremoto activado! &c2 min de enfriamiento!' + earthquakeAvailableMessage: '&8[EliteMobs] &2¡Tiempo de enfriamiento de terremoto!' +fire_aspect: + name: Aspecto Ígneo +flamethrower: + name: Lanzallamas +frost_walker: + name: Paso Helado +grappling_hook: + name: Gancho +hunter: + name: Cazador +ice_breaker: + name: Rompehielos +impaling: + name: Empalamiento +knockback: + name: Empuje +lightning: + name: Trueno +loot_bonus_blocks: + name: Fortuna +loot_bonus_mobs: + name: Saqueo +loud_strikes: + name: Golpes Fuertes +loyalty: + name: Lealtad +lure: + name: Cebo +mending: + name: Reparación +meteor_shower: + name: Lluvia de meteoritos +multishot: + name: Disparo múltiple +oxygen: + name: Respiración +piercing: + name: Perforación +plasma_boots: + name: Botas de Plasma +protection_environmental: + name: Protección +protection_explosions: + name: Protección contra explosiones +protection_fall: + name: Caída de Pluma +protection_fire: + name: Protección contra el Fuego +protection_projectile: + name: Protección contra Proyectiles +quick_charge: + name: Carga rápida +riptide: + name: Impulso +silk_touch: + name: Toque de seda +soulbind: + name: Atadura de Alma + loreStrings: '&7Ligado al alma de &f$player' + hologramString: '$player&f''s' +summon_merchant: + name: Invocar Comerciante + message: '¡Tooddles!' +summon_wolf: + name: Invocar Un Lobo +sweeping_edge: + name: Filo Arrasador +thorns: + name: Espinas +unbind: + name: Desligar +vanishing_curse: + name: Maldición de desaparición +water_worker: + name: Afinidad Acuática +AntiExploit: + AntiExploit message: '&c[EM AntiExploit] &7Los mobs de élite cercanos no soltarán el botín especial.' +CombatTag: + Combat tag message: '&c[EliteMobs] Etiqueta de Combate activado!' +AdventurersGuild: + adventurersGuildMenuName: '&6&lCentro del Aventurero' + Prestige 0 rank 0: '&8Commoner - desactiva las élites!' + Prestige 0 rank 0 short placeholder: '&6&l&e0&e0' + Prestige 0 rank 1: '&fPrincipiante' + Prestige 0 rank 1 short placeholder: '&6&l&eI' + Prestige 0 rank 2: '&fNovato' + Prestige 0 rank 2 short placeholder: '&6&l✧&eⅠⅠ' + Prestige 0 rank 3: '&fAprendiz' + Prestige 0 rank 3 short placeholder: '&6&l✧&eⅠⅠⅠ' + Prestige 0 rank 4: '&2Aventurero' + Prestige 0 rank 4 short placeholder: '&6&l✧&eⅠⅤ' + Prestige 0 rank 5: '&2Viajero' + Prestige 0 rank 5 short placeholder: '&6&l✧&eⅠⅤ' + Prestige 0 rank 6: '&2Adepto' + Prestige 0 rank 6 short placeholder: '&6&l✧&eⅤⅠ' + Prestige 0 rank 7: '&1Veterano' + Prestige 0 rank 7 short placeholder: '&6&l✧&eⅤⅠⅠ' + Prestige 0 rank 8: '&1Élite' + Prestige 0 rank 8 short placeholder: '&6&l✧&eⅤⅠⅠⅠ' + Prestige 0 rank 9: '&lMaestro' + Prestige 0 rank 9 short placeholder: '&6&l✧&eⅠⅩ' + Prestige 0 rank 10: '&5Héroe' + Prestige 0 rank 10 short placeholder: '&6&l✧&eⅩ' + Prestige 1 rank 0: '&ePrestigio 1 &8Plebeyo' + Prestige 1 rank 0 short placeholder: '&e⚜Ⅰ&6&l✧&e0' + Prestige 1 rank 1: '&ePrestigio 1 &fPrincipiante' + Prestige 1 rank 1 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠ' + Prestige 1 rank 2: '&ePrestigio 1 &fNovato' + Prestige 1 rank 2 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅠ' + Prestige 1 rank 3: '&ePrestigio 1 &fAprendiz' + Prestige 1 rank 3 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅠⅠ' + Prestige 1 rank 4: '&ePrestigio 1 &2Aventurero' + Prestige 1 rank 4 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅤ' + Prestige 1 rank 5: '&ePrestigio 1 &2Viajero' + Prestige 1 rank 5 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤ' + Prestige 1 rank 6: '&ePrestigio 1 &2Adepto' + Prestige 1 rank 6 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠ' + Prestige 1 rank 7: '&ePrestigio 1 &1Veterano' + Prestige 1 rank 7 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠⅠ' + Prestige 1 rank 8: '&ePrestigio 1 &1Élite' + Prestige 1 rank 8 short placeholder: '&e⚜Ⅰ&6&l✧&eⅤⅠⅠⅠ' + Prestige 1 rank 9: '&ePrestigio 1 &lMaestro' + Prestige 1 rank 9 short placeholder: '&e⚜Ⅰ&6&l✧&eⅠⅩ' + Prestige 1 rank 10 short placeholder: '&e⚜Ⅰ&6&l✧&eⅩ' + Prestige 1 rank 10: '&ePrestigio 1 &5Héroe' + Prestige 1 rank 11: '&ePrestigio 1 &5Legend' + Prestige 1 rank 11 short placeholder: '&e⚜Ⅰ&6&l✧&eⅩⅠ' + Prestige 2 rank 0: '&2Prestigio 2 &8Plebeyo' + Prestige 2 rank 0 short placeholder: '&2⚜ⅠⅠ&6&l✧&e0' + Prestige 2 rank 1: '&2Prestigio 2 &fPrincipiante' + Prestige 2 rank 1 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠ' + Prestige 2 rank 2: '&2Prestigio 2 &fNovato' + Prestige 2 rank 2 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅠ' + Prestige 2 rank 3: '&2Prestigio 2 &fAprendiz' + Prestige 2 rank 3 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 2 rank 4: '&2Prestigio 2 &2Aventurero' + Prestige 2 rank 4 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅤ' + Prestige 2 rank 5: '&2Prestigio 2 &2Viajero' + Prestige 2 rank 5 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤ' + Prestige 2 rank 6: '&2Prestigio 2 &2Adepto' + Prestige 2 rank 6 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠ' + Prestige 2 rank 7: '&2Prestigio 2 &1Veterano' + Prestige 2 rank 7 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 2 rank 8: '&2Prestigio 2 &1Élite' + Prestige 2 rank 8 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 2 rank 9: '&2Prestigio 2 &lMaestro' + Prestige 2 rank 9 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅠⅩ' + Prestige 2 rank 10 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩ' + Prestige 2 rank 10: '&2Prestigio 2 &5Héroe' + Prestige 2 rank 11: '&2Prestigio 2 &5Legend' + Prestige 2 rank 11 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩⅠ' + Prestige 2 rank 12: '&2Prestigio 2 &5Myth' + Prestige 2 rank 12 short placeholder: '&2⚜ⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 3 rank 0: '&aPrestigio 3 &8Plebeyo' + Prestige 3 rank 0 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&e0' + Prestige 3 rank 1: '&aPrestigio 3 &fPrincipiante' + Prestige 3 rank 1 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠ' + Prestige 3 rank 2: '&aPrestigio 3 &fNovato' + Prestige 3 rank 2 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠ' + Prestige 3 rank 3: '&aPrestigio 3 &fAprendiz' + Prestige 3 rank 3 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 3 rank 4: '&aPrestigio 3 &2Aventurero' + Prestige 3 rank 4 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅤ' + Prestige 3 rank 5: '&aPrestigio 3 &2Viajero' + Prestige 3 rank 5 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤ' + Prestige 3 rank 6: '&aPrestigio 3 &2Adepto' + Prestige 3 rank 6 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠ' + Prestige 3 rank 7: '&aPrestigio 3 &1Veterano' + Prestige 3 rank 7 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 3 rank 8: '&aPrestigio 3 &1Élite' + Prestige 3 rank 8 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 3 rank 9: '&aPrestigio 3 &lMaestro' + Prestige 3 rank 9 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅠⅩ' + Prestige 3 rank 10 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩ' + Prestige 3 rank 10: '&aPrestigio 3 &5Héroe' + Prestige 3 rank 11: '&aPrestigio 3 &5Leyenda' + Prestige 3 rank 11 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠ' + Prestige 3 rank 12: '&aPrestigio 3 &5Mito' + Prestige 3 rank 12 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 3 rank 13: '&aPrestigio 3 &5Inmortal' + Prestige 3 rank 13 short placeholder: '&a⚜ⅠⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 4 rank 0: '&3Prestigio 4 &8Plebeyo' + Prestige 4 rank 0 short placeholder: '&3⚜ⅠⅤ&6&l✧&e0' + Prestige 4 rank 1: '&3Prestigio 4 &fPrincipiante' + Prestige 4 rank 1 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠ' + Prestige 4 rank 2: '&3Prestigio 4 &fNovato' + Prestige 4 rank 2 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅠ' + Prestige 4 rank 3: '&3Prestigio 4 &fAprendiz' + Prestige 4 rank 3 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅠⅠ' + Prestige 4 rank 4: '&3Prestigio 4 &2Aventurero' + Prestige 4 rank 4 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅤ' + Prestige 4 rank 5: '&3Prestigio 4 &2Viajero' + Prestige 4 rank 5 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤ' + Prestige 4 rank 6: '&3Prestigio 4 &2Adepto' + Prestige 4 rank 6 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠ' + Prestige 4 rank 7: '&3Prestigio 4 &1Veterano' + Prestige 4 rank 7 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠⅠ' + Prestige 4 rank 8: '&3Prestigio 4 &1Élite' + Prestige 4 rank 8 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅤⅠⅠⅠ' + Prestige 4 rank 9: '&3Prestigio 4 &lMaestro' + Prestige 4 rank 9 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅠⅩ' + Prestige 4 rank 10 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩ' + Prestige 4 rank 10: '&3Prestigio 4 &5Héroe' + Prestige 4 rank 11: '&3Prestigio 4 &5Leyenda' + Prestige 4 rank 11 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠ' + Prestige 4 rank 12: '&3Prestigio 4 &5Mito' + Prestige 4 rank 12 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅠ' + Prestige 4 rank 13: '&3Prestigio 4 &5Inmortal' + Prestige 4 rank 13 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅠⅠ' + Prestige 4 rank 14: '&3Prestigio 4 &5Elegido' + Prestige 4 rank 14 short placeholder: '&3⚜ⅠⅤ&6&l✧&eⅩⅠⅤ' + Prestige 5 rank 0: '&bPrestigio 5 &8Plebeyo' + Prestige 5 rank 0 short placeholder: '&b⚜Ⅴ&6&l✧&e0' + Prestige 5 rank 1: '&bPrestigio 5 &fPrincipiante' + Prestige 5 rank 1 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠ' + Prestige 5 rank 2: '&bPrestigio 5 &fNovato' + Prestige 5 rank 2 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅠ' + Prestige 5 rank 3: '&bPrestigio 5 &fAprendiz' + Prestige 5 rank 3 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅠⅠ' + Prestige 5 rank 4: '&bPrestigio 5 &2Aventurero' + Prestige 5 rank 4 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅤ' + Prestige 5 rank 5: '&bPrestigio 5 &2Viajero' + Prestige 5 rank 5 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤ' + Prestige 5 rank 6: '&bPrestigio 5 &2Adepto' + Prestige 5 rank 6 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠ' + Prestige 5 rank 7: '&bPrestigio 5 &1Veterano' + Prestige 5 rank 7 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠⅠ' + Prestige 5 rank 8: '&bPrestigio 5 &1Élite' + Prestige 5 rank 8 short placeholder: '&b⚜Ⅴ&6&l✧&eⅤⅠⅠⅠ' + Prestige 5 rank 9: '&bPrestigio 5 &lMaestro' + Prestige 5 rank 9 short placeholder: '&b⚜Ⅴ&6&l✧&eⅠⅩ' + Prestige 5 rank 10 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩ' + Prestige 5 rank 10: '&bPrestigio 5 &5Héroe' + Prestige 5 rank 11: '&bPrestigio 5 &5Leyenda' + Prestige 5 rank 11 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠ' + Prestige 5 rank 12: '&bPrestigio 5 &5Mito' + Prestige 5 rank 12 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅠ' + Prestige 5 rank 13: '&bPrestigio 5 &5Inmortal' + Prestige 5 rank 13 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅠⅠ' + Prestige 5 rank 14: '&bPrestigio 5 &5Elegido' + Prestige 5 rank 14 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅠⅤ' + Prestige 5 rank 15: '&bPrestigio 5 &5Ascendido' + Prestige 5 rank 15 short placeholder: '&b⚜Ⅴ&6&l✧&eⅩⅤ' + Prestige 6 rank 0: '&4Prestigio 6 &8Plebeyo' + Prestige 6 rank 0 short placeholder: '&4⚜ⅤⅠ&6&l✧&e0' + Prestige 6 rank 1: '&4Prestigio 6 &fPrincipiante' + Prestige 6 rank 1 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠ' + Prestige 6 rank 2: '&4Prestigio 6 &fNovato' + Prestige 6 rank 2 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅠ' + Prestige 6 rank 3: '&4Prestigio 6 &fAprendiz' + Prestige 6 rank 3 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅠⅠ' + Prestige 6 rank 4: '&4Prestigio 6 &2Aventurero' + Prestige 6 rank 4 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅤ' + Prestige 6 rank 5: '&4Prestigio 6 &2Viajero' + Prestige 6 rank 5 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤ' + Prestige 6 rank 6: '&4Prestigio 6 &2Adepto' + Prestige 6 rank 6 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠ' + Prestige 6 rank 7: '&4Prestigio 6 &1Veterano' + Prestige 6 rank 7 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠⅠ' + Prestige 6 rank 8: '&4Prestigio 6 &1Élite' + Prestige 6 rank 8 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 6 rank 9: '&4Prestigio 6 &lMaestro' + Prestige 6 rank 9 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅠⅩ' + Prestige 6 rank 10 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩ' + Prestige 6 rank 10: '&4Prestigio 6 &5Héroe' + Prestige 6 rank 11: '&4Prestigio 6 &5Leyenda' + Prestige 6 rank 11 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠ' + Prestige 6 rank 12: '&4Prestigio 6 &5Mito' + Prestige 6 rank 12 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠ' + Prestige 6 rank 13: '&4Prestigio 6 &5Inmortal' + Prestige 6 rank 13 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 6 rank 14: '&4Prestigio 6 &5Elegido' + Prestige 6 rank 14 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅠⅤ' + Prestige 6 rank 15: '&4Prestigio 6 &5Ascendido' + Prestige 6 rank 15 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤ' + Prestige 6 rank 16: '&4Prestigio 6 &5Titan' + Prestige 6 rank 16 short placeholder: '&4⚜ⅤⅠ&6&l✧&eⅩⅤⅠ' + Prestige 7 rank 0: '&cPrestigio 7 &8Plebeyo' + Prestige 7 rank 0 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&e0' + Prestige 7 rank 1: '&cPrestigio 7 &fPrincipiante' + Prestige 7 rank 1 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠ' + Prestige 7 rank 2: '&cPrestigio 7 &fNovato' + Prestige 7 rank 2 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅠ' + Prestige 7 rank 3: '&cPrestigio 7 &fAprendiz' + Prestige 7 rank 3 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 7 rank 4: '&cPrestigio 7 &2Aventurero' + Prestige 7 rank 4 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅤ' + Prestige 7 rank 5: '&cPrestigio 7 &2Viajero' + Prestige 7 rank 5 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤ' + Prestige 7 rank 6: '&cPrestigio 7 &2Adepto' + Prestige 7 rank 6 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠ' + Prestige 7 rank 7: '&cPrestigio 7 &1Veterano' + Prestige 7 rank 7 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 7 rank 8: '&cPrestigio 7 &1Élite' + Prestige 7 rank 8 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 7 rank 9: '&cPrestigio 7 &lMaestro' + Prestige 7 rank 9 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅠⅩ' + Prestige 7 rank 10 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩ' + Prestige 7 rank 10: '&cPrestigio 7 &5Héroe' + Prestige 7 rank 11: '&cPrestigio 7 &5Leyenda' + Prestige 7 rank 11 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠ' + Prestige 7 rank 12: '&cPrestigio 7 &5Mito' + Prestige 7 rank 12 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 7 rank 13: '&cPrestigio 7 &5Inmortal' + Prestige 7 rank 13 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 7 rank 14: '&cPrestigio 7 &5Elegido' + Prestige 7 rank 14 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅠⅤ' + Prestige 7 rank 15: '&cPrestigio 7 &5Ascendido' + Prestige 7 rank 15 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤ' + Prestige 7 rank 16: '&cPrestigio 7 &5Titan' + Prestige 7 rank 16 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤⅠ' + Prestige 7 rank 17: '&cPrestigio 7 &5Demiurgo' + Prestige 7 rank 17 short placeholder: '&c⚜ⅤⅠⅠ&6&l✧&eⅩⅤⅠⅠ' + Prestige 8 rank 0: '&9Prestigio 8 &8Plebeyo' + Prestige 8 rank 0 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&e0' + Prestige 8 rank 1: '&9Prestigio 8 &fPrincipiante' + Prestige 8 rank 1 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠ' + Prestige 8 rank 2: '&9Prestigio 8 &fNovato' + Prestige 8 rank 2 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅠ' + Prestige 8 rank 3: '&9Prestigio 8 &fAprendiz' + Prestige 8 rank 3 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅠⅠ' + Prestige 8 rank 4: '&9Prestigio 8 &2Aventurero' + Prestige 8 rank 4 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅤ' + Prestige 8 rank 5: '&9Prestigio 8 &2Viajero' + Prestige 8 rank 5 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤ' + Prestige 8 rank 6: '&9Prestigio 8 &2Adepto' + Prestige 8 rank 6 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠ' + Prestige 8 rank 7: '&9Prestigio 8 &1Veterano' + Prestige 8 rank 7 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠⅠ' + Prestige 8 rank 8: '&9Prestigio 8 &1Élite' + Prestige 8 rank 8 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅤⅠⅠⅠ' + Prestige 8 rank 9: '&9Prestigio 8 &lMaestro' + Prestige 8 rank 9 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅠⅩ' + Prestige 8 rank 10 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩ' + Prestige 8 rank 10: '&9Prestigio 8 &5Héroe' + Prestige 8 rank 11: '&9Prestigio 8 &5Leyenda' + Prestige 8 rank 11 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠ' + Prestige 8 rank 12: '&9Prestigio 8 &5Mito' + Prestige 8 rank 12 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅠ' + Prestige 8 rank 13: '&9Prestigio 8 &5Inmortal' + Prestige 8 rank 13 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅠⅠ' + Prestige 8 rank 14: '&9Prestigio 8 &5Elegido' + Prestige 8 rank 14 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅠⅤ' + Prestige 8 rank 15: '&9Prestigio 8 &5Ascendido' + Prestige 8 rank 15 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤ' + Prestige 8 rank 16: '&9Prestigio 8 &5Titan' + Prestige 8 rank 16 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠ' + Prestige 8 rank 17: '&9Prestigio 8 &5Demiurgo' + Prestige 8 rank 17 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠⅠ' + Prestige 8 rank 18: '&9Prestigio 8 &5Deidad' + Prestige 8 rank 18 short placeholder: '&9⚜ⅤⅠⅠⅠ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 9 rank 0: '&dPrestigio 9 &8Plebeyo' + Prestige 9 rank 0 short placeholder: '&d⚜ⅠⅩ&6&l✧&e0' + Prestige 9 rank 1: '&dPrestigio 9 &fPrincipiante' + Prestige 9 rank 1 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠ' + Prestige 9 rank 2: '&dPrestigio 9 &fNovato' + Prestige 9 rank 2 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅠ' + Prestige 9 rank 3: '&dPrestigio 9 &fAprendiz' + Prestige 9 rank 3 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅠⅠ' + Prestige 9 rank 4: '&dPrestigio 9 &2Aventurero' + Prestige 9 rank 4 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅤ' + Prestige 9 rank 5: '&dPrestigio 9 &2Viajero' + Prestige 9 rank 5 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤ' + Prestige 9 rank 6: '&dPrestigio 9 &2Adepto' + Prestige 9 rank 6 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠ' + Prestige 9 rank 7: '&dPrestigio 9 &1Veterano' + Prestige 9 rank 7 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠⅠ' + Prestige 9 rank 8: '&dPrestigio 9 &1Élite' + Prestige 9 rank 8 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅤⅠⅠⅠ' + Prestige 9 rank 9: '&dPrestigio 9 &lMaestro' + Prestige 9 rank 9 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅠⅩ' + Prestige 9 rank 10 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩ' + Prestige 9 rank 10: '&dPrestigio 9 &5Héroe' + Prestige 9 rank 11: '&dPrestigio 9 &5Leyenda' + Prestige 9 rank 11 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠ' + Prestige 9 rank 12: '&dPrestigio 9 &5Mito' + Prestige 9 rank 12 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅠ' + Prestige 9 rank 13: '&dPrestigio 9 &5Inmortal' + Prestige 9 rank 13 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅠⅠ' + Prestige 9 rank 14: '&dPrestigio 9 &5Elegido' + Prestige 9 rank 14 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅤ' + Prestige 9 rank 15: '&dPrestigio 9 &5Ascendido' + Prestige 9 rank 15 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤ' + Prestige 9 rank 16: '&dPrestigio 9 &5Titan' + Prestige 9 rank 16 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠ' + Prestige 9 rank 17: '&dPrestigio 9 &5Demiurgo' + Prestige 9 rank 17 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠⅠ' + Prestige 9 rank 18: '&dPrestigio 9 &5Deidad' + Prestige 9 rank 18 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 9 rank 19: '&dPrestigio 9 &5Cazador de dioses' + Prestige 9 rank 19 short placeholder: '&d⚜ⅠⅩ&6&l✧&eⅩⅠⅤ' + Prestige 10 rank 0: '&5Prestigio 10 &8Plebeyo' + Prestige 10 rank 0 short placeholder: '&5⚜Ⅹ&6&l✧&e0' + Prestige 10 rank 1: '&5Prestigio 10 &fPrincipiante' + Prestige 10 rank 1 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠ' + Prestige 10 rank 2: '&5Prestigio 10 &fNovato' + Prestige 10 rank 2 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠ' + Prestige 10 rank 3: '&5Prestigio 10 &fAprendiz' + Prestige 10 rank 3 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅠⅠ' + Prestige 10 rank 4: '&5Prestigio 10 &2Aventurero' + Prestige 10 rank 4 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅤ' + Prestige 10 rank 5: '&5Prestigio 10 &2Viajero' + Prestige 10 rank 5 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤ' + Prestige 10 rank 6: '&5Prestigio 10 &2Adepto' + Prestige 10 rank 6 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠ' + Prestige 10 rank 7: '&5Prestigio 10 &1Veterano' + Prestige 10 rank 7 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠ' + Prestige 10 rank 8: '&5Prestigio 10 &1Élite' + Prestige 10 rank 8 short placeholder: '&5⚜Ⅹ&6&l✧&eⅤⅠⅠⅠ' + Prestige 10 rank 9: '&5Prestigio 10 &lMaestro' + Prestige 10 rank 9 short placeholder: '&5⚜Ⅹ&6&l✧&eⅠⅩ' + Prestige 10 rank 10 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩ' + Prestige 10 rank 10: '&5Prestigio 10 &5Héroe' + Prestige 10 rank 11: '&5Prestigio 10 &5Leyenda' + Prestige 10 rank 11 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠ' + Prestige 10 rank 12: '&5Prestigio 10 &5Mito' + Prestige 10 rank 12 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅠ' + Prestige 10 rank 13: '&5Prestigio 10 &5Inmortal' + Prestige 10 rank 13 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅠⅠ' + Prestige 10 rank 14: '&5Prestigio 10 &5Elegido' + Prestige 10 rank 14 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅤ' + Prestige 10 rank 15: '&5Prestigio 10 &5Ascendido' + Prestige 10 rank 15 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤ' + Prestige 10 rank 16: '&5Prestigio 10 &5Titan' + Prestige 10 rank 16 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠ' + Prestige 10 rank 17: '&5Prestigio 10 &5Demiurgo' + Prestige 10 rank 17 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠⅠ' + Prestige 10 rank 18: '&5Prestigio 10 &5Deidad' + Prestige 10 rank 18 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅤⅠⅠⅠ' + Prestige 10 rank 19: '&5Prestigio 10 &5Cazador de dioses' + Prestige 10 rank 19 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅠⅩ' + Prestige 10 rank 20: '&5Prestigio 10 &5Asesino de Dioses' + Prestige 10 rank 20 short placeholder: '&5⚜Ⅹ&6&l✧&eⅩⅩ' + lootLimiterMessage: '&7[EM] &c¡Debes desbloquear el siguiente rango de gremio a través de /ag para obtener mejores objetos!' + prestigeUnlockMessageTitle: '$player' + prestigeUnlockMessageSubtitle: '&2¡ha desbloqueado $tier&2!' +buy_or_sell_menu: + Shop name: '[EM] Comprar o Vender' +custom_quest_screen: + headerTextLines2: | + &a&l&c&l$questName&a& + acceptTextLines: '&a&l[Aceptar!]' + acceptHoverLines: "&aClick para \n&aaceptar misión!" + acceptedTextLines: '&2&lAceptado! &aDirigete con $npcName &4[Abandon]' + acceptedHoverLines: '&a¡Haz clic para abandonar misión!' + trackTextLines: '&2&l[Seguir]' + trackHoverLines: '&a Haz Click Aquí Para Aceptar La Misión' + untrackTextLines: '&4&l[Untrack]' + untrackHoverLines: '&c¡Clic para dejar de seguir la misión!' + completedTextLines: '&2&l[Entrar!]' + completedHoverLines: '&a¡Clic para activar la misión!' + turnedInTextLines: '&8[Completado!]' + turnedInHoverLines: '&8Ya está activado!' + objectivesLine: '&c&lObjetivos:' + killQuestDefaultSummaryLine: '&caMata a $name:$color$current&0/$color$target' + fetchQuestDefaultSummaryLine: '&c➤Obtener $name:$color&$current&0/$color$target' + dialogQuestDefaultSummaryLine: '&c Ir a hablar con $name $location' + rewardsLine: '&2&lRecompensas:' + rewardsDefaultSummaryLine: '&2➤$amountx $rewardName &8($chance%)' +custom_shop_menu: + Shop name: '[EM] Tienda personalizada' + Full inventory message: '[EliteMobs] &4¡Tu inventario está lleno! No puedes comprar objetos hasta que liberes espacio en tu inventario.' +dynamic_quest_screen: + questName: Asesinar a $amount $name + headerTextLines2: |- + &c&lSolicitud de Gremio! &0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ + defaultLoreTextLines: '&8Asesinar a $amount $name!' + acceptTextLines: '&a&lAceptar!' + acceptHoverLines: "&aClick para \n&aaceptar misión!" + acceptedTextLines: '&2&lAceptado! &4[Abandon]' + acceptedHoverLines: '&a¡Haz clic para abandonar misión!' + completedTextLines: '&2&l[Entrar!]' + completedHoverLines: '&a¡Clic para activar la misión!' + turnedInTextLines: '&8[Completado!]' + turnedInHoverLines: '&8Ya está activado!' + objectivesLine: '&c&lObjetivos:' + killQuestDefaultSummaryLine: '&c➤Matar $name:$color$current&0/$color$target' + rewardsLine: '&2&lRecompensas:' + rewardsDefaultSummaryLine: '&2➤$amountx $rewardName &8($chance%)' +enhancement_menu: + shopName: '[EM] ¡Menú de mejoras!' +get_loot_menu: + Menu name: '[EM] Menú de Botín' + tierTranslation: Nivel + itemFilterTranslation: Filtrar por ítems de este nivel. +guild_rank_selector_menu: + questTierSelectorMenuTitle: '[EM] Selección de Rango de Gremio' + lowTierWarning: '&c¡Los élites no pueden soltar mejor botín!' + normalTierWarning: '&c¡Los élites no pueden soltar mejor botín!' + notEnoughCurrencyMessages: '&7[EliteMobs] &4¡No tienes suficientes Monedas Élite ($neededAmount $currencyName)! ¡Vende algunos objetos de Mobs Élites con [/em shop]! Tienes $currentAmount $currencyName.' + unlockMessages: "&7[EliteMobs] &aHas desbloqueado el rango $rankName &apor $price\\ \\ $currencyName. \n&6¡Disfruta la cacería!" + questCompleteBroadcastMessages: '&7[EliteMobs] &a$player &aha desbloqueado el rango de gremio $rankName&a!' + failedMessages: '&7[EliteMobs] &c¡Necesitas desbloquear otros rangos primero!' + spawnRateModifierMessages: '&fModificador de tasa de aparición de Mobs Élite: &c$modifier%' + lootModifierMessages: '&fModificador de Botín de Elite Mobs: &a$modifier%' + difficultyModifierMessages: '&fModificador de dificultad de EliteMobs: &c$modifier%' + lootTierMessages: '&2¡Los Élites pueden soltar objetos de hasta grado $tier!' + currencyBonusMessages: '&a¡$amountx% de monedas por el botín y misiones!' + healthBonusMessages: '&cAñade $amount ❤ de vida máxima' + critBonusMessages: '&eAñade $amount% probabilidad de crítico' + dodgeBonusMessages: '&8Añade $amount% probabilidad de esquivar' +player_status_screen: + indexTexts0: '&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + indexTexts1: '&5&l/ag &7- &6Centro de EliteMobs' + indexHovers1: |- + CLICK PARA USAR + ¡El lugar donde puedes encontrar + NPCs que otorgan misiones, compran + y venden objetos, dan consejos y más! + indexTexts2: '&0&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + indexTexts4: '&6&lÍndice' + indexTexts6: '&bp. $statsPage &8- &6Estadísticas' + indexHovers6: '¡Haz click para Ir!' + indexTexts7: '&bp. $gearPage &8- &6Equipamento' + indexHovers7: '¡Haz click para Ir!' + indexTexts8: '&bp. $teleportsPage &8- &6Teletransportes' + indexHovers8: '¡Haz click para Ir!' + indexTexts9: '&bp. $commandsPage &8- &6Comandos' + indexHovers9: '¡Haz click para Ir!' + indexTexts10: '&bp. $questsPage &8- &6Seguimiento de Misiones' + indexHovers10: '¡Haz click para Ir!' + indexTexts11: '&bp. $bossTrackingPage &8- &6Seguimiento de Bosses' + indexHovers11: '¡Haz click para Ir!' + statsText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + statsText1: '&5&lEstadísticas de Jugador:' + statsText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + statsText4: '&2Dinero: &a$money' + statsHover4: |- + ¡Mata mobs de élite para conseguir + monedas o vende su botín en /em shop + o bien completa misiones en /em quest! + statsText6: '&6Grado de Gremio: &3$guildtier' + statsHover6: |- + Prestigio y Rango de Gremio: + El Rango de Gremio determina que tan bueno puede ser el botín, establece tu bonificación de prestigio, entre varias cosas. ¡El Prestigio desbloquea recompensas poderosas, como incrementar tu vida máxima, probabilidad de esquivar/crítico, conseguir más monedas y mucho mas! ¡Puedes desbloquear todo esto en /ag! + ⚜ = Prestigio, ✧ = Rango de Hermandad! + statsText7: '&4Asesinatos de Élites: &c$kills' + statsHover7: Total de mobs de élite asesinados. + statsText8: '&4Asesinato de mayor nivel: &c$highestkill' + statsHover8: |- + Nivel del Mob de Élite más alto asesinado. + ¡Los niveles de los Mob de Élite se rigen por el grado + de tu equipamiento! ¡A mayor grado, mayor + nivel de los Mob de Élite! + ¡Nota: solo cuentan los asesinatos sin trampas! + statsText9: '&4Muertes de Élites: &c$deaths' + statsHover9: Cantidad de muertes contra mobs de élite. + statsText10: '&5Misiones Completadas: &d$quests' + statsHover10: |- + Cantidad de misiones de EliteMobs completadas. + ¡Puedes aceptar misiones hablando con los NPCs! + statsText12: '&bPuntuación: &3$score' + statsHover12: |- + Tu puntuación de EliteMobs. Sube + al matar mobs de élite y es + reducida cuando mueres contra ellos. + Los élites de mayor nivel dan más + puntuación. + gearText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + gearText1: '&7&lArmaduras y Armas:' + gearText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + gearText3: '&8&lGrado de Equipamiento:' + gearText4: ' ☠ - $helmettier' + gearHover4: '$helmet' + gearText5: ' ▼ - $chestplatetier' + gearHover5: '$chestplate' + gearText6: ' Π - $leggingstier' + gearHover6: '$leggings' + gearText7: ' ╯╰ - $bootstier' + gearHover7: '$boots' + gearText8: '{⚔ - $mainhandtier} {⛨ - $offhandtier}' + gearHover8: '{$mainhand}{$offhand}' + gearText10: '{dmg : $damage} {armr: $armor}' + gearHover10: '{Base damage dealt to Elite Mobs}{Damage reduction from Elite Mobs}' + gearText11: 'Nivel de Amenaza: $threat' + gearHover11: | + Esto determina el nivel de los mobs + de élite que aparecen cerca tuya. + Considera tu armadura, arma en mano + y el grado de gremio en consideración. + teleportText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + teleportText1: '&2&lTeletransportes' + teleportText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + teleportText3: Spawn + teleportHover3: '¡Te teletransporta al Spawn!' + teleportText4: '&6&lCentro del Aventurero' + teleportHover4: '¡Teletranspórtate al hub del Gremio de Aventureros!' + onTeleportsHover: '¡Haz click para teletransportarte!' + commandsText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + commandsText1: '&3&lComandos:' + commandsText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + commandsText4: '&5/ag' + commandsHover4: |- + CLICK PARA USAR + ¡El lugar donde puedes encontrar + NPCs que otorgan misiones, compran + y venden objetos, dan consejos y más! + commandsText6: '&5/shareitem' + commandsHover6: |- + CLIC PARA USAR + ¡Comparte el objeto que tienes + a mano en el chat! + questTrackerText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + questTrackerText1: '&6&lMisiones:' + questTrackerHover1: '¡Habla con los NPC para aceptar misiones!' + questTrackerText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + onQuestTrackHover: '¡Click para abandonar!' + bossTrackerText0: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + bossTrackerText1: '&4&lRastreador del Boss:' + bossTrackerHover1: '¡Los grandes bosses se muestran aquí!' + bossTrackerText2: '&m⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯' + onBossTrackHover: '¡Click para seguir/dejar de seguir!' + teleportChestMenuName: '&2Teletransportes de EliteMobs' + bossTrackerChestMenuName: '&2Seguimiento de jefes de EliteMobs' + indexChestMenuName: '&2Índice de EliteMobs' + gearChestMenuName: '&2Equipo EliteMobs' + statsChestMenuName: '&2Estadísticas de EliteMobs' + commandsChestMenuName: '&2Comandos EliteMobs' +procedural_shop_menu: + Shop name: '[EM] Tienda de artículos procedimentales' + Full inventory message: '&[EliteMobs] &4¡Tu inventario está lleno! No puedes comprar objetos hasta que liberes espacio en tu inventario.' +quest_menu: + menuName: '[EM] Selección de misiones' + cancelQuestMessage1: '&c&l&m&o---------------------------------------------&c¡Sólo puedes tener una misión a la vez! ¡Cancelar tu misión en curso restablecerá el progreso de la misión!' + cancelQuestMessage2: '&2[¡Haz clic aquí para cancelar la misión actual!]' + cancelQuestMessage3: '&7Puedes ver el estado de tu misión con el comando &a/em quest status&c&l&m&o---------------------------------------------' + questCancelMessage: '&7[EliteMobs] &cTu misión actual ha sido cancelada!' + questStartTitle: '¡Has aceptado una misión!' + questStartSubtitle: Asesinar a $objectiveAmount $objectiveName + questCompleteTitle: '¡Misión completada!' + questCompleteSubtitle: Has muerto $objectiveAmount $objectiveName + bossBarObjective: Asesinar a $objectiveAmount $objectiveName + questRewardMessage: '&7[EM] &aMisión completada! &6Tu recompensa es &2$reward $currencyName' + questCompleteBroadcastMessage: '&7[EM] $player &2ha completado una $rank &2quest!' + questStartBroadcastMessage: '&7[EM] $player &2ha aceptado una $rank &2quest!' + questStatusMessage: '&7[EM] &aHas asesinado &a$currentAmount &f/ &c$objectiveAmount &a$objectiveName' +refiner_menu: + shopName: '[EM] Place 10 Scrapy!' +repair_menu: + shopName: '[EM] ¡Reparar menú!' +scrapper_menu: + shopName: '[EM] Raspador' +sell_menu: + shopName: '[EM] Tienda de venta' +smelt_menu: + shopName: '[EM] ¡Coloca 25 chatarras!' +unbind_menu: + shopName: '[EM] ¡Desvincular menú!' +taunt: + onDamaged: + - '¡Oh!' + - '¡Oye!' + - '¡Para!' + - '¡¿Por qué?!' + - '¡Luchas como un debilucho!' + - '¡Eres un dolor de espalda!' + - '¡En Guardia!' + - '¡Trampas!' + - '¡Mi salud está errada, no puede matar!' + - Tus golpes sólo me hacen más fuerte! + - Palos y piedras... + - '¡No es má'' que una herida de superficial!' + - '¡Proteged el Emperador!' + - '¡Herobrine, cúrame!' + - '¡Detrás! ¡Un Creeper!' + - He cometido un grave error. + - Lo que no me mata... + - Los zombis cavan cicatrices + - '¡Te mostraré mi verdadero poder!' + - '¡Prepárate para mi ataque definitivo!' + - '¡Están llegando mis refuerzos!' + - '¡Vas a pagar por eso!' + - '¡Eso va a dejar una marca!' + - '¡Ojo por ojo!' + - El seguro de vida cubrirá eso + - Sentí que uno en mis huesos + - 'e'' sólo un rasguño' + - '¿Qué era eso? ¿Una brisa delicada?' + - Nunca me derrotarás así + - Patético. + - Débil. + - '¡Eso ni siquiera ha hecho una marca en mi armadura!' + - Esto va a ser sencillo + - Mis nietos sentirán que + - '¿Estás siquiera intentándolo?' + - Un administrador me ha curado por completo + - '¡Haxxor!' + - '¿Yo? ¿Dañado? ¡Hacks!' + - '¡No puedo ser derrotado!' + - '¡Bueno, estoy usando hacks!' + - '¡Cuidado! ¡Herobrine detrás de ti!' + - '¡Mi vida por Aiur!' + - '¡Tu hogar está sufriendo!' + - '¿Por qué no podemos ser amigos?' + - '¡Valhalla!' + - '¡Notch sálvame!' + - '¡Sin retroceder!' + - '¡Dame con tu mejor disparo!' + onDamagedByBow: + - '¡Pelea como un Solado!' + - '¿Tienes miedo de acercarte a mi?' + - '¡Puedo oler tu miedo desde aquí!' + - '¿Has olvidado tu espada?' + - '¡Cobarde! ¡El arco no es justo!' + - '¿Arcos? Eso es tan de 2011...' + - '¡Los arcos son para los débiles de la mente!' + - '¡Los arcos son para el débil del espíritu!' + - '¡Los arcos son para los débiles del corazón!' + - '¡Pensé que no estábamos de acuerdo con los arcos!' + - '¿Arcos? Lo lamentarás' + - '¡Oh!' + - '¡Oye!' + - '¡Para!' + - '¡¿Por qué?!' + - '¡Luchas como un debilucho!' + - '¡Eres un dolor de espalda!' + - '¡En Guardia!' + - '¡Trampas!' + - '¡Mi salud está errada, no puede matar!' + - Tus golpes sólo me hacen más fuerte! + - Palos y piedras... + - '¡No es má'' que una herida de superficial!' + - '¡Proteged el Emperador!' + - '¡Herobrine, cúrame!' + - '¡Detrás! ¡Un Creeper!' + - He cometido un grave error. + - Lo que no me mata... + - Los zombis cavan cicatrices + - '¡Te mostraré mi verdadero poder!' + - '¡Prepárate para mi ataque definitivo!' + - '¡Están llegando mis refuerzos!' + - '¡Vas a pagar por eso!' + - '¡Eso va a dejar una marca!' + - '¡Ojo por ojo!' + - El seguro de vida cubrirá eso + - Sentí que uno en mis huesos + - 'e'' sólo un rasguño' + - '¿Qué era eso? ¿Una brisa delicada?' + - Nunca me derrotarás así + - Patético. + - Débil. + - '¡Eso ni siquiera ha hecho una marca en mi armadura!' + - Esto va a ser sencillo + - Mis nietos sentirán que + - '¿Estás siquiera intentándolo?' + - Un administrador me ha curado por completo + - '¡Haxxor!' + - '¿Yo? ¿Dañado? ¡Hacks!' + - '¡No puedo ser derrotado!' + - '¡Bueno, estoy usando hacks!' + - '¡Cuidado! ¡Herobrine detrás de ti!' + - '¡Mi vida por Aiur!' + - '¡Tu hogar está sufriendo!' + - '¿Por qué no podemos ser amigos?' + - '¡Valhalla!' + - '¡Notch sálvame!' + - '¡Sin retroceder!' + - '¡Dame con tu mejor disparo!' + onDamage: + - '¡Un golpe sólido!' + - '¡Dispara y anota!' + - '¡Lo sentirás por la mañana!' + - '¡La victoria se acerca!' + - '¡La victoria será mía!' + - '¡Eso fue sólo la mitad de mi poder!' + - '¡Te has metido en el barrio que no debías!' + - '¡Te metiste con la mafia equivocada!' + - '¡Prepárate para ser asediado!' + - '¡Este ha sido tu último error!' + - '¡Siente la quemadura!' + - John Cena + - '¿Cómo todavía estás de pie?' + - '¡Tómalo!' + - '¡Ríndete!' + - '¡Tengo el terreno alto!' + - '¡Terminaré contigo!' + - '¡Espero que viniste preparado para el dolor que vas a sufrir!' + - '¡El cazador se convierte en la presa!' + - '¡Sangre para el trono de sangre!' + - '¡Calaveras para el trono de calaveras!' + - '¡Un buen jugador es un jugador muerto!' + - '¡Vete bien!' + - '¡Praise the Sun!' + - '¡El final se acerca!' + - No estas preparado. + - Zug zug! + - '¡Tú no vales la pena mi tiempo!' + - '¿Y yo pensaba que esto era un desafío?' + - 'Consejo profesional: que no te golpeen' + - Ima firin mah lazer bwooooooooo + - '¡Por el Emperador!' + - '¡Herobrine estará satisfecho!' + - '¡Este es el final para ti!' + - '¿Estás siquiera intentándolo?' + - '¡Debilitado!' + - Patético. + - Quizás esto te despierte. + - Esto es sólo el comienzo! + - '¡Recién estamos comenzando!' + - '¡Esto no fue más que un calentamiento!' + - '¡No eres rival para mí!' + - '¡RKO de la nada!' + - '¡Puedo hacer esto toda la noche!' + - '¡Una bonita bolsa de puños!' + - '¡Yo soy la noche!' + - Me pregunto qué se romperá primero + - '¡Venganza para Steve! ¡Tú, monstruo!' + - '¡Únete al lado de la mafia!' + - '¡Demasiado fácil, demasiado fácil!' + - Demasiado fácil! + - '¡No puedes derrotarme!' + - Pickuuuuu + - Avada kedavra! + - '¡Yo torturo!' + - '¡Yo y grande!' + - '¡Un golpe crítico!' + - '¡Así es como se ven las habilidades!' + - '¡9001 daño!' + - '¿Sigue de pie?' + - '¡Enfréntate a tu derrota!' + - '¡Un sabor de dolor por venir!' + - '¡Te pondré en peligro!' + onDeath: + - '¡Lamentablemente pobre!' + - El resto es el silencio + - Volveré + - Imperdonable + - '¡Vivo, muero, vivo de nuevo!' + - '¡SÉ TESTIGO DE MI!' + - '¡Cabalgaré hasta el Valhalla!' + - '¡VALHALLA!' + - '¡VALHALLA! ¡LIBERACIÓN!' + - Has ganado, esta vez + - '¡Una plaga sobre tu tierra!' + - '¡Una vena sobre ti!' + - '¡Te unirás pronto conmigo!' + - '¡Esto no se ha acabado!' + - La muerte no es más que un simple contratiempo + - Así no... + - Sólo quería entrar en el espacio + - Podríamos haber sido amigos + - Tus pecados arrastrándose sobre tu espalda + - Nos vemos en nada + - '¡Nos vemos luego' + - '¡Te estaré esperando' + - '¡Seré vengado!' + - No voy a ir suavemente a la noche + - Tenía que haber contratado un seguro de vida + - Era mi último día en el trabajo + - Era mi último día aquí + - '¿Y tú, Bruto?' + - D.E.P + - x.x + - (x.x) + - xox! + - Débil + - GG, WP + - GG + - WP + - GG no RE + - HAX + - Hacker + - No es justo, tenía lag + - Has ganado, esta vez + - Tú, monstruo.... + - Mediocre... + onTarget: + - '¡Oye! ¡Ven aquí!' + - '¿Qué es lo que veo? ¿Un cobarde?' + - '¡Señor, prepara tus puños!' + - '¡Vamos a arreglar esto como personas!' + - '¡En guardia!' + - '¡Cuidado! ¡Un creeper, detrás de ti!' + - '¡Menuda jeta más fea!' + - Se ve delicioso. + - '¡Prepárate para los problemas!' + - '¡Que el mejor spammer de clicks gane!' + - SPARTAAAAAA + - En realidad soy nivel 9001 + - No es un Mob de Élite + - Mob de Élite mal disfrazado + - '¡Ah, presa fresca!' + - '¡El cazador se convierte en la presa!' + - Matándome, el servidor crasheará + - '¡En realidad soy un jugador disfrazado!' + - '¡No voy a dejar caer ningún botín!' + - '¿Por qué no podemos ser amigos?' + - Ssssssh + - '¡Este es mi último día en el trabajo!' + - '¡Parar allí escoria criminal!' + - '¡Prepárate para morir!' + - '¡Praise the Sun!' + - Git gud + - '¡La suerte está echada!' + - '¡Hechos no palabras!' + - '¡Calaveras para el trono de calaveras!' + - '¡Sangre para el trono de sangre!' + - '¡Un sacrificio por Herobrina!' + - '¡Perforaré los cielos!' + - '¿¡Quién te crees que soy!?' + - '¡Un débil! Él es mío.' + - '¡Reclamo al debilucho!' + - '¡Por ejemplo, jugador!' + - Un duelo a muerte! + - Te desafío a un duelo! + - Pika pika! + - Acabas de llamarme un inferior + - '¿Cómo acabas de llamarme?' + - '¡Sé lo que has hecho monstruo!' + - '¡Así es como termina tu historia!' + - '¡Prepárate para los problemas!' + - '¡Me he estado preparando para esto!' + - '¿Estoy preparado, y tú?' + - '¡Un enemigo digno!' + - '¡Un oponente digno!' + - '¡Un novato! ¡Es mi día de suerte!' + - '¡Tus cosas o tu vida!' + - '¡Esto es un atraco!' + - '¡Eres tu! ¡Tú, monstruo!' + - '¡Tan hambriento, dame tu carne!' + - '¡Ahí está!' + - Debe haber sido mi imaginación + - '¡Hola, soy el señor Meeseeks!' + - Soy el Sr. Meeseeks, ¡mírame! + - '¡Tus diamantes o tu vida!' + - '¡Por el rey y la patria!' + - '¡Dame con tu mejor disparo!' + - '¡Sé testigo de mí!' + - '¡Testigo de mi bolsa de sangre!' + - '¡Voy todo brillante y cromado!' +zombie_friends: + friend1Name: 'Mejor amigo #1' + friend2Name: 'Mejor amigo #2' + friendDeathMessage: + - '¡Noooo!' + - '¡Mediocre!' + - '¡Zacarías!' + - '¡Está más muerto que antes!' + - '¡Venganza!' + - '¡Venganza!' + - No puedo creer que hayas hecho esto. + originalEntityDialog: + - '¡Vamos a jugar ZombieCraft, más tarde!' + - '¡Siente el poder de la amistad!' + - '¡El pueblo, unido!' + - '¡Llamé a mis amigos!' + - '¡Poder de mejores amigos!' + - '¡Uno para todos!' + - '¡Agárralo!' + - '¡Al diablo con ustedes me voy a casa!' + reinforcementDialog: + - '¡No te metas con nuestros amigos!' + - '¡Te respaldamos, Zach!' + - '¡Han llegado refuerzos!' + - '¡Uno para todos y todos para una!' + - Esto será fácil! + - '¡Ríndete, tenemos el terreno elevado!' + - '¿Quieres irte bro?' + - '¡Superestrellaaaaaa!' + - Que le estas haciendo a nuestro amigo + - '¡Siente el poder de la amistad!' + - El poder de la amistad al 100%! + - '¡Zombis, reuníos!' + - '¡Te respaldamos compañero!' + - '¡Juntos somos mejores!' + - '¡Cuanto más, mejor!' + - '¡Te tengo familia!' + - '¡Todos para uno!' +zombie_necronomicon: + summoningChant: No hay que pensar... el hombre de sombrero es o el más viejo o el último de los maestros de la tierra; o que el grueso común de la vida y la sustancia camina solo. Los Antiguos eran, los Antiguos eran, y los Antiguos serán. No en los espacios que conocemos, pero entre ellos, caminan sereno y primordial, no imensionados y para nosotros invisibles; Yog-Sothoth conoce la puerta. Yog-Sothoth es la puerta. Yog-Sothoth es la llave y gardián de la puerta. Pasado, presente, futuro, todos son uno en Yog-Sothothoth. Sabe donde los Antiguos rompieron y donde volverán a penetrar. Sabe dónde habían pisado los campos de la tierra; y dónde aún los han pisado, y por qué nadie puede verlos como pisan. Por su olor a veces los hombres pueden conocerlos cerca, pero de su apariencia nadie puede saber, salvar sólo en las características de aquellos que han engendrado a la humanidad; y de ellos hay muchos tipos que difieren en semejanza del eidolón más verdadero del hombre a esa forma sin la vista o la sustancia que es Tema. Caminan inadvertidos y faltos en lugares solitarios, donde se han hablado las Palabras y los Ritos se apoderan en sus Temporadas. El viento gibera con Su voz y la tierra muta con Su conciencia. Ellos doblegan el bosque y aplastan la ciudad, pero no pueden ver el bosque o la ciudad la mano que muere. Kadat en la basura frГ­a ha conocido a Tг­, y Вїque hombre sabe a Kadath? El desierto de hielo del Sur y las islas hundidas del Océano contienen piedras en donde su sello es grabador, ¿Pero quién ha visto la profunda ciudad congelada o la torre sellada largamente guarnecida con algas y barnacles? Gran Cthulhu es su primo, pero puede espiarlos sólo con poca luz. ¡Iaúd! ¡Shub-Nigurat! Como estúpido lo conoceréis. Su mano está en vuestras gargantas; sin embargo, vosotros no las veéis; y Su morada es aun una con vuestros guardianes vigilados. Yog-Sothoth es la llave de la puerta, donde se cruzan las esferas. El hombre gobierna ahora donde gobernaron una vez; Pronto gobernarán donde el hombre gobierna ahora. Después del invierno se invierte, esperan paciente y potente, porque aquí reinarán de nuevo. +zombie_parents: + deathMessage: + - '¡Eres un monstruo!' + - Mi bebé! + - Qué has hecho!? + - '¡Venganza!' + - Nooooo! + - '¡Pagarás por ello!' + - Eh, el fue adoptado + - Está muerto! Otra vez! + - '¡Está más muerto que antes!' + - Le has roto! + bossEntityDialog: + - Me estás avergonzando! + - '¡Me está acosando!' + - '¡Él es el que me elige!' + - '¡Puedo ocuparme de esto solo!' + - Déjame solo, lo tengo controlado! + - '¡Deja de seguirme!' + - '¡Dios esto es muy vergonzoso!' + - '¡Me ha quitado el dinero de la comida!' + - '¡Me está acosando!' + zombieDad: + - '¡Aléjate de mi hijo!' + - '¡Levántate por ti solo hijo!' + - '¡Me ocuparé de él!' + - '¡Deja de centrarte en mi hijo!' + - '¿Por qué estás haciendo esto?' + - '¡Hablaré con tus padres!' + - '¡Ahí vas niño!' + - '¡Demuéstrale quién es el jefe!' + - '¡Buen puño chico!' + zombieMom: + - '¡Manos fuera de mi niño!' + - '¿Estás herido cariño?' + - '¿Te ha lastimado cariño?' + - Dejame ver esa herida cariño + - '¡Hablaré con sus padres!' + - '¡Has olvidado tu chaqueta cariño!' + - Compórtate cariño + - '¡Rompámoslo!' + - '¡Detén esto!' + - '¿Sacaste la basura?' +elite_blaze: + name: '&eBlaze de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$player &cfue encendido en llamas infernales por $entity&c!' +elite_cave_spider: + name: '&3Araña de Cueva de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$player &cse quedó enredado en la telaraña de $entity&c!' +elite_creeper: + name: '&2Creeper de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$player &cfue reventado por $entity&c!' + - '&c¡$entity &cdejó hecho pedazos a $player&c!' +elite_drowned: + name: '&3Ahogado de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$player &cha sido llevado a las profundidades por $entity&c!' + - '&c¡$player &cha sido ahogado por $entity&c!' +elite_elder_guardian: + name: '&3Guardián anciano de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$entity &cimpidió que $player &cexplorara las profundidades!' +elite_guardian: + name: '&3Guardián de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$entity &cimpidió que $player &cexplorara las profundidades!' +elite_enderman: + name: '&5Enderman de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$entity &cenvió a $player &cal vacío!' + - '&c¡$player &cmiró mal a $entity&c!' + - '&c¡$player &cy $entity &cse convirtieron en los mejores amigos!' +elitemob_endermite: + name: '&7Endermite de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$entity &ces para $player &clo que David es para Goliat!' +elite_evoker: + name: '&5Invocador de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$player &cfue encantado por $entity&c!' +elite_husk: + name: '&7Zombi Momificado de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$player &cfue carroña de un $entity&c!' +elite_illusioner: + name: '&8Ilusionista de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$player &ccayó en las ilusiones de $entity&c!' +elite_iron_golem: + name: '&fGólem de Hierro de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$player &cse metió con el $entity &cequivocado!' + - '&c¡$entity &cle ha enseñado el sendero del puño a $player&c!' +elite_phantom: + name: '&9Fantasma de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$player &cacaba de tener una pesadilla sobre $entity&c!' + - '&c¡$player &cestará teniendo pesadillas sobre $entity&c!' + - '&c¡$entity &cle ha enseñado a $player &cel valor del sueño!' +elite_pillager: + name: '&8Saqueador de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$entity &cexpolió a $player&c!' + - '&c¡$entity &csaqueó a $player&c!' +elite_polar_bear: + name: '&fOso polar de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$player &cfue arañado hasta morir por $entity&c!' + - '&c¡$player &cfue masticado hasta la muerte por $entity&c!' +elite_ravager: + name: '&6Devastador de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$entity &cle mostró a $player &cquién está a cargo!' +elite_silverfish: + name: '&7Pez de plata de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$player &cconfundió a $entity &cpor un bloque de piedra!' +elite_skeleton: + name: '&2Esqueleto de Elite &9Nivel &2$level' + deathMessages: + - '&c¡$player &cse ha convertido en el cojín de $entity&c!' + - '&c¡$entity &cquería ver los huesos de $player&c!' +elite_spider: + name: '&7Araña de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$player &cse quedó enredado en la telaraña de $entity&c!' + - '&c¡$entity ha devorado a $player&c!' +elite_stray: + name: '&bEsqueleto glacial de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$player &cfué raptado por $entity&c!' +elite_vex: + name: '&bVex de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$entity &cha atormentado a $player&c!' +elite_vindicator: + name: '&8Vindicador de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$entity &creivindicó sus habilidades de lucha con $player&c!' +elite_witch: + name: '&5Bruja de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$player &cse convirtió en el sujeto de prueba de $entity&c!' + - '&c¡$player &cha sido embrujado por $entity&c!' +elite_wither_skeleton: + name: '&2Esqueleto del Wither de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡Las flechas de $entity &cmarchitaron a $player&c!' + - '&c¡$entity &cha marchitado a $player&c!' +elite_zombie: + name: '&2Zombi de &cElite &9Nivel &2$level' + deathMessages: + - '&c¡$player &cfue devorado por $entity&c!' + - '&c¡$entity &cllegó a los cerebros de $player&c!' +elite_ghast: + name: '&fGhast de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$player &cno pudo esquivar las bolas de fuego de $entity&c!' + - '&c¡$player &cfue volado en pedazos por $entity&c!' + - '$entity &cConvirtió a $player &cen jamón!' +elite_wolf: + name: '[$level] Lobo de Elite' + deathMessages: + - '&c¡$entity &cdestrozó a $player&c!' + - '&c¡$player &cfue despedazado por $entity&c!' +elite_ender_dragon: + name: '&5Dragon del End &fElite &9Nivel &2$level' + deathMessages: + - '$entity &cacabó con $player!' +elite_shulker: + name: '&fNivel &2$level &5Invocador de &fElite' + deathMessages: + - '$entity &cmostró $player &cnuevas alturas!' +super_chicken: + name: '&2Super Gallina' +super_cow: + name: '&2Super Vaca' +super_mushroom_cow: + name: '&2Super Vaca champiñón' +super_pig: + name: '&dSuper Cerdo' +super_sheep: + name: '&dSuper Oveja' +elite_killer_bunny: + name: '&fNivel &2$level &fElite &cConejo Asesino' + deathMessages: + - '$entity &chizo $player &cve vivo en una granja!' + - '$entity &ceducó $player usando un palo y no una zanahoria!' +elite_llama: + name: '&fNivel &2$level &fElite &5Llama' + deathMessages: + - '&c¡$player &cfue picado brutalmente por $entity&c!' + - '¡$player &c enojó a $entity!' +elite_warden: + name: '&3Guardián de &fElite Nivel &2$level' + deathMessages: + - '¡$entity &csintió que $player &cestaba cerca!' +elite_goat: + name: '&5Invocador de &fElite &9Nivel &2$level' + deathMessages: + - '$player &cfue amado por $entity&c!' + - '$player &cfue pisoteado por $entity&c!' + - '$player &cfue pisoteado por $entity&c!' + - '$player &ctiene $entity&c cuernos!' +elite_zombified_piglin: + name: '&ePiglin Zombificado de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$player &cfue acosado hasta la muerte por $entity&c!' + - '$entity &cConvirtió a $player &cen jamón!' +elite_zoglin: + name: '&dZoglin de &cElite &9Nivel &2$level' + deathMessages: + - '&c¡$player &cse metió con el $entity &cy se quedó con los cuernos!' + - '$entity &cConvirtió a $player &cen jamón!' +elite_piglin: + name: '&ePiglin de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$entity &cconseguirá un buen precio por los restos de $player&c!' + - '&c¡$entity &cle enseñó a $player &cel valor del oro!' +elite_hoglin: + name: '&dHoglin de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$player &cse metió con el $entity &cy se quedó con los cuernos!' + - '$entity &cConvirtió a $player &cen jamón!' +elite_piglin_brute: + name: '&cPiglin bruto de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$entity &cablandó a $player&c!' + - '&c¡$entity &cbrutalizó a $player&c!' +elite_bee: + name: '&eAbeja de &fElite &9Nivel &2$level' + deathMessages: + - '&c¡$player &cfue picado brutalmente por $entity&c!' +MobCombatSettings: + bossLocationMessage: '&7[EM] &2[¡Clic para rastrear!]' + bossKillParticipationMessage: '&eTu daño: &2$playerDamage' + defaultOtherWorldBossLocationMessage: '$name: ¡Está en un mundo distinto!' + weakText: '&9&lDébil!' + resistText: '¡&c&resiste!' + fullHealMessage: '&2¡TOTALMENTE CURADO!' +check_tier: + message1: '&7[EM] El nivel de combate de $player es $tier' + message2: '&7[EM] Su bonus de nivel de gremio es $tier' + message3: '&7[EM] &aTu nivel total de amenaza es $tier' +check_tier_others: + message1: '&7[EM] El nivel de combate de $player es $tier' + message2: '&7[EM] El nivel de combate de $player es $tier' + message3: '&7[EM] &aEl nivel de amenaza de $player es $tier' +ScrapItemSettings: + scrapItemName: '&2Chatarra nivel $level' + scrapItemLore: + - '&a¡Consigue 25 chatarras del mismo nivel para' + - '&acrear un orbe de mejora!' + - '&a¡Tambien puedes usar la chatarra para reparar' + - '&aobjetos y fabricar chatarra de mayor nivel!' + - '&2¡Haz esto en el Hub del Gremio de Aventureros!' + upgradeItemName: '&2Orbe de mejora nivel $level' + upgradeItemLore: + - '&¡Úsalo en el NPC de Mejoras para mejorar' + - '&aobjetos hasta el nivel $orbLevel!' +Quests: + questJoinMessage: '&aHas aceptado la misión $questName &a!' + questLeaveMessage: '&cHas abandonado la misión $questName &c!' + questCompleteMessage: '&2Has completado la misión $questName &2!' + leaveWhenNoActiveQuestsExist: '&cNo tienes actualmente una misión activa!' + questLeaveConfirmationMessage: "&c ¿Estás seguro de que quieres abandonar tu misión actual? ¡Haz&a /em\nconfirm&c para confirmar tu elección!" + questStartTitle: '&a¡Misión Aceptada!' + questCompleteTitle: '&2¡Misión completada!' + questLeaveTitle: '&c¡Misión abandonada!' + killQuestChatProgressionMessage: '&8[EliteMobs]&c➤Mata a $name:$color$current&0/$color$target' + fetchQuestChatProgressionMessage: '&8[EliteMobs]&c➤Consigue $name:$color$current&0/$color$target' + dialogQuestChatProgressionMessage: '&8[EliteMobs]&c➤Habla con $name:$color$current&0/$color$target' + questCapMessage: '&8[EliteMobs] &cHas alcanzado la cantidad máxima de misiones activas (10)! &4¡Abandona o completa al menos una misión activa si quieres conseguir más misiones!' + killQuestScoreboardProgressionMessage: '&c➤Mata $name:$color$current&0/$color$target' + fetchQuestScoreboardProgressionMessage: '&c➤Consigue $name:$color$current&0/$color$target' + dialogQuestScoreboardProgressionMessage: '&c➤Habla con $name:$color$current&0/$color$target' + chatTrackMessage: '&8[EliteMobs]&2 ¡Clic aquí para seguir tu misión!' + chatTrackHover: '&2¡Clic para seguir!' + chatTrackingMessage: '&8[EliteMobs]&9 ¡Ahora estás siguiendo una misión!' + chatTrackingHover: '&2¡Clic para desrastrear/seguir! /em -> Misiones para rastrear una misión diferente!' + noQuestDestinationFound: '[EM] No se encontró destino de misión!' + questDestinationInOtherWorld: '[EM] ¡Ve al mundo $world!' + questAlreadyCompletedMessage: '&8[EliteMobs] &c¡Ya has completado esta misión!' + questPrerequisitesMissingMessage: '&8[EliteMobs] &c¡No puedes aceptar esta misión todavía!' + lowRankDynamicQuestWarning: '&8[EliteMobs] &cNo puedes llevar estas misiones con tu rango actual de gremio! Aumenta el rango de tu gremio para aceptar estas misiones.' + questTurnInObjective: '&a2Habla con $npcName' +Wormholes: + dungeonNotInstalledMessage: '&8[EliteMobs] &cLa dungeon $dungeonID &cno está instalada! Este teletransporte no funcionará.' + defaultPortalMissingMessage: '&8[EliteMobs] &c¡Este portal no parece llevar a ninguna parte!' +Arenas: + notEnoughPlayersMessage: '&8[EliteMobs] &c¡Necesitas al menos $amount para comenzar la batalla!' + startingMessage: '&2Comenzando!' + startingSubtitle: '&2en $count...' + arenaFullMessage: '&4[EliteMobs] &cArena está llena! Puedes observar en su lugar mientras esperas a que termine!' + arenasOngoingMessage: '&4[EliteMobs] &cNo puedes unirte a la arena ahora - ¡Una partida está ocurriendo actualmente! ¡Puedes observar en su lugar mientras esperas a que termine!' + arenaStartHintMessage: '&2[EliteMobs] &aPuedes iniciar la arena haciendo &2/em start' + arenaQuitHintMessage: '&4[EliteMobs] &cPuedes salir de la arena haciendo &4/em quit' + arenaJoinPlayerMessage: "&2[EliteMobs] &aPuedes iniciar la arena haciendo &2/em\\ \\ iniciar &asi hay al menos &2$count &ajugadores en ella! \nPuedes abandonar la arena \\ \\ haciendo &c/en salir" + arenaJoinSpectatorMessage: '&2[EliteMobs] &aPuedes salir de la arena en cualquier momento usando &2/em quit' + waveTitle: '&aOleada &2$wave' + victoryTitle: '&2¡Victoria!' + victorySubtitle: '&a¡Completadas &2$wave &aoleadas!' + defeatTitle: '&4¡Derrotas!' + defeatSubtitle: '&c¡Alcanzada oleada &4$wave&c!' + victoryBroadcast: '¡Arena $arenaName fue conquistada por $players!' + joinPlayerTitle: '&a¡Comienza con &2/em start &a!' + joinPlayerSubtitle: '&c¡Abandonar con &4/em quit &c!' + joinSpectatorTitle: '&a¡Ahora observando!' + joinSpectatorSubtitle: '&c¡Abandonar con &4/em quit &c!' +ancient_corpse_drop_axe: + name: '&eCuchillo de Carnicero' + lore: + - '&aRecuperado del' + - '&aCráneo de un Cadáver Antiguo...' +animated_armor_drop_axe: + name: '&8Hacha Encantada' + lore: + - '&8Este hacha era casi el' + - '&8final para ti.' +animated_armor_drop_boots: + name: '&8Botas Encantadas' + lore: + - '&8Literalmente luchaste' + - '&8contra esta pieza de armadura.' +animated_armor_drop_chestplate: + name: '&8Pechera Encantada' + lore: + - '&8Literalmente luchaste' + - '&8contra esta pieza de armadura.' +animated_armor_drop_helmet: + name: '&8Casco Encantado' + lore: + - '&8Literalmente luchaste' + - '&8contra esta pieza de armadura.' +animated_armor_drop_leggings: + name: '&8Pantalones Encantados' + lore: + - '&8Literalmente luchaste' + - '&8contra esta pieza de armadura.' +arachnid_matriarch_drop_boots: + name: '&bZancudos de Seda' + lore: + - '&bHecho de seda araña rara.' +baba_rhoga_drop_chest: + name: '&aTúnicas de Brujas' + lore: + - '&aEl olor debería' + - '&adesaparecer eventualmente.' +baba_yaga_drop_helmet: + name: '&aSombrero de Brujas' + lore: + - '&aEl olor debería' + - '&adesaparecer eventualmente.' +balloon_rider_drop_leggings: + name: '&dPantalones espaciosos' + lore: + - '&dPantalones muy cómodos y espaciosos.' +banshee_drop_charm: + name: '&8Tristeza Manifestada' + lore: + - '&8Que esta tristeza endurecida te proteja' + - '&8del dolor.' +beast_tamer_drop_axe: + name: '&eGran Hacha' + lore: + - '&eLo suficientemente pesado como para partir cualquier bestia en dos.' +berserker_charm: + name: '&bAmuleto berserker' + lore: + - '&aPierdete a ti mismo a la hora de enfrentar' + - '&ala abrumadora adversidad en más' + - '&ade una manera...' +bigfoot_drop_chestplate: + name: '&eArmadura de Pelaje' + lore: + - '&eBonito y cálido.' +big_bad_wolf_drop_chestplate: + name: '&aPelaje de Lobo Malo Grande' + lore: + - '&a¡Aterrador!' +bloated_jeffrey_drop_tear: + name: '&bLágrima Dulce' + lore: + - '&bHas hecho llorar a Jeffrey...' +bone_fiend_drop_leggings: + name: '&aPantalones huesudos' + lore: + - '&aLos huesos afilados adheridos a estos' + - '&apantalones traquetean mucho.' +challengers_boots: + name: '&cBotas del Desafío' + lore: + - '&2Otorgado a aquellos que desafíen el' + - '&2¡Arena Liga de Madera!' +challengers_chestplate: + name: '&cPechera del Desafío' + lore: + - '&2Otorgado a aquellos que desafíen el' + - '&2¡Arena Liga de Madera!' +challengers_helmet: + name: '&cYelmo del Desafío' + lore: + - '&2Otorgado a aquellos que desafíen el' + - '&2¡Arena Liga de Madera!' +challengers_leggings: + name: '&cPerneras del Desafío' + lore: + - '&2Otorgado a aquellos que desafíen el' + - '&2¡Arena Liga de Madera!' +challengers_sword: + name: '&cEspada del Desafío' + lore: + - '&2Otorgado a aquellos que desafíen el' + - '&2¡Arena Liga de Madera!' +chameleon_charm: + name: '&bEncanto del camaleon' + lore: + - '&aEl colorido Camaleón' + - '&ase camufla en casi todos lado,' + - '&aarrastrándose lentamente...' +changeling_drop_sword: + name: '&aEspada Cristalina' + lore: + - '&aLa hoja resplandece mientras miras sobre ella.' +cheetah_charm: + name: '&bEncanto del Guepardo' + lore: + - '&aLos Guepardos pueden alcanzar velocidades de' + - '&a120 km/h... por unos 60' + - '&asegundos. ¡Hazlos contar!' +circus_ringmaster_drop_charm: + name: '&dLátigo de Maestros de Ceremonias' + lore: + - '&dEsto fue usado para un castigo terrible.' +craftenmine_terror_drop_trident: + name: '&cLobotomizador de Ghast' + lore: + - '&cPerfecto para asegurarse de que' + - '&clos Ghasts permanecerán en tierra.' +creeperpede_drop_chestplate: + name: '&dChaleco a Prueba de Explosiones' + lore: + - '&dHaz sentir el ''¡BOOM!''' + - '&dMás como ''boom''.' +crone_drop_axe: + name: 'Talador de brujas' + lore: + - '&fUn hacha buena que exige una buena caza.' +depths_seeker: + name: '&2Buscador de Profundidades' + lore: + - '&9Viene de profundidades inimaginables' + - '&9y del botín del monstruo mas vil,' + - '&9no hay manera de determinar qué horrores' + - '&9ha visto esta caña.' +divine_cinder_drop_charm: + name: '&6Fuego Divino' + lore: + - '¡Bendito sea el fuego!' +dwarven_greed: + name: '&4Codicia de Enanos' + lore: + - '&cAquellos que recaen de manera codiciosa' + - '&cy de manera muy profunda, pueden despertar a los antiguos' + - '&chorrores de la sombra y la llama' + - '&c,lo mejor es no molestar.' +elephant_charm: + name: '&bTalismán de Elefante' + lore: + - '&a¡Consigue el poder de una estampida' + - '&ade elefante, por el precio de' + - '&air la velocidad de un estampida de elefantes!' +enders_drop_chestplate: + name: 'Camisa Ender' + lore: + - '&dProtector y cómodo!' +enders_drop_helmet: + name: '&dCasco Ender' + lore: + - '&dCómodo pero también bastante robusto.' +enders_drop_leggings: + name: '&dPantalones Ender' + lore: + - '&dUn poco demasiado largo pero lo hará.' +ender_lapin_drop_boots: + name: '&cBotas Estrella Oscuras' + lore: + - '&cTe da el valor' + - '&cde correr cuando está en peligro.' +endless_pursuer_drop_sword: + name: '&7Espada de sangre oscura' + lore: + - '&7La espada parece' + - '&7llorando sangre...' +enraged_snowman_drop_sword: + name: '&9Nariz de Muñeco de Nieve' + lore: + - '&9No es de extrañar que el muñeco de nieve' + - '&9la nariz era tan puntiaguda...' +xmas_and_gold: + name: '&6¡y oro!' + lore: + - '&7Todo el mundo desea plata' + - '&7¡ y oro!' +xmas_and_goooooold: + name: '&6¡y ooooooro!' + lore: + - '&7Todo el mundo desea plata' + - '&7¡y oro!' +xmas_cornelius_pick: + name: '&bElección de Cornelius' + lore: + - '&3Si lo lanzas al aire' + - '&3y dejas que golpee el suelo,' + - '&3puedas encontrar' + - '&3¡menta!' +xmas_lost_present: + name: '&2Regalo perdido' + lore: + - '&2¡Se convierte en una recompensa!' +xmas_peppermint: + name: '&cMenta' + lore: + - '&f¡Lo que he estado buscando toda mi vida!' +xmas_siiiiilver: + name: '&7Plaaaaaata' + lore: + - '&6Todo el mundo desea plata' + - '&6¡y oro!' +xmas_silver: + name: '&7Plata' + lore: + - '&6Todo el mundo desea plata' + - '&6¡y oro!' +xmas_substitute_elf_practice: + name: '&8Sustituir Elfo de prácticas' + lore: + - '&fEsta muñeca necesita arreglarse los dientes' +xmas_treat: + name: '&a¡Trato!' + lore: + - '&e¡Un delicioso snack!' +xmas_treat_v2: + name: '&a¡Trato!' + lore: + - '&e¡Un delicioso snack!' +evil_undead_drop_sword: + name: '&eHoja transitoria' + lore: + - '&eSólo servirá' + - '&epor mucho tiempo.' +fallen_knight_drop_boots: + name: 'Botas Antiguas' + lore: + - '&7A pesar de que las botas son viejas ellas' + - '&7todavía proporcionan mucha protección.' +fallen_knight_drop_chestplate: + name: '&ePechera Antigua de Nether' + lore: + - '&7Esta armadura puede parecer sencilla' + - '&7al ojo no entrenado, pero es claro' + - '%7 cualquier cosa que quiera penetrar' + - '&7la placa gruesa tendrá que ser' + - '&7atravezada con fuerza considerable.' +fallen_knight_drop_helmet: + name: '&e7Cabeza Antigua' + lore: + - '&7Muchas espadas han dejado su marca' + - '&7aEn este timón, pero ninguno lo tiene' + - '&7consiguió romper su defensa.' +fallen_knight_drop_leggings: + name: '&e7Pantalones Antiguos' + lore: + - '&7Lo sientes por cualquiera que intente' + - '&7para golpear estas piernas.' +fine_swine_drop_sword: + name: '&6Espada Dorada fina' + lore: + - '&6Una espada dorada fina de maestros.' + - '&6El oro fundido fluye dentro' + - '&6la espada se asegura de cualquier daño' + - '&6a la hoja se repara rápidamente.' +firefly_charm: + name: '&bTalismán de Luciérnaga' + lore: + - '&a¡Ilumina la noche!' +firestarter_drop_helmet: + name: '&eLimpiador de Fuego' + lore: + - '&e¡Sólo la mitad del calor!' +fire_conjurer_drop_shield: + name: '&4Escudo Tocado de Estrella' + lore: + - '&eProtector contra fuego y llama.' +fishy_charm: + name: 'Talismán Acuático' + lore: + - '&aHay algo que no se siente' + - '&abien con este talismán' +fox_king_cold_drop_charm: + name: '&9Nieve mágica' + lore: + - '&9Sientes energías imposibles' + - '&9viniendo de esta nieve.' +fulgora_drop_boots: + name: 'Botas de Montaña' + lore: + - '&bDebe ser útil cuando' + - '&bexplorando las montañas.' +goblin_ballista: + name: '&8Balista Trasgo' + lore: + - '&8¡Un tesoro entre los trasgos!' +goblin_boots: + name: '&8Botas de trasgo' + lore: + - '&8¡Un tesoro entre los trasgos!' +goblin_chestplate: + name: '&8Pechera de Trasgo' + lore: + - '&8¡Un tesoro entre los trasgos!' +goblin_cleaver: + name: '&8Cuchilla de trasgo' + lore: + - '&8¡Un tesoro entre los trasgos!' +goblin_helmet: + name: '&8Casco de Trasgo' + lore: + - '&8¡Un tesoro entre los trasgos!' +goblin_invasion_drop_chestplate: + name: 'Peto de Toro' + lore: + - '&aRealmente apretado...' +goblin_invasion_drop_leggings: + name: 'Leggings de Calavera' + lore: + - '&aBueno, al menos es realmente' + - '&apaga las piernas.' +goblin_leggings: + name: '&8Perneras de Trasgo' + lore: + - '&8¡Un tesoro entre los trasgos!' +goblin_poker: + name: '&8Atizador de Trasgo' + lore: + - '&8¡Un tesoro entre los trasgos!' +goblin_shooter: + name: '&8Tirador Trasgo' + lore: + - '&8¡Un tesoro entre los duendes!' +goblin_slasher: + name: '&8Acribillador de Trasgo' + lore: + - '&8¡Un tesoro entre los trasgos!' +grappling_arrow: + name: '&Flecha rastreadora' + lore: + - '&e¡Dispara en un bloque para agarrarte!' +greedy_dwarf_drop_pickaxe: + name: '&9Necesidad Enano' + lore: + - '&cAquellos que recaen de manera codiciosa' + - '&cy de manera muy profunda, pueden despertar a los antiguos' + - '&chorrores de la sombra y la llama' + - '&ces mejor dejarlo tranquilo.' +grunter_drop_axe: + name: '&cOink Gigante' + lore: + - '&cEl hacha tiene una tendencia' + - '&ca llorar cuando se mueve.' +grunts_boots: + name: '&fBotas de Grunt' + lore: + - '&2Otorgado a aquellos que desafíen el' + - '&2¡Arena Liga de Madera!' +grunts_chestplate: + name: '&fPechera de Grunt' + lore: + - '&2Otorgado a aquellos que desafíen el' + - '&2¡Arena Liga de Madera!' +grunts_helmet: + name: '&fCasco de Grunt' + lore: + - '&2Otorgado a aquellos que desafíen el' + - '&2¡Arena Liga de Madera!' +grunts_leggings: + name: '&fPantalones de Grunt' + lore: + - '&2Otorgado a aquellos que desafíen el' + - '&2¡Arena Liga de Madera!' +grunts_sword: + name: '&fBotas de Grunt' + lore: + - '&2Otorgado a aquellos que desafíen el' + - '&2¡Arena Liga de Madera!' +harmless_chicken_drop_boots: + name: '&aBotas Inútiles' + lore: + - '&aAl menos son la prueba de la explosión...' +hog_rider_drop_boots: + name: '&a3.6 Botas Radioactivas' + lore: + - '&aNo es genial, tampoco terrible.' +horde_champion_drop_sword: + name: 'El Eviscerador de la &dHorda' + lore: + - '&dCuando necesite tomar' + - 'Cuidado una horda de no vivos.' +horrid_duplicator_drop_arrow: + name: '&aFlecha Duplicada' + lore: + - 'Mira y siente' + - '&2Como lo real...' +horrid_duplicator_drop_bow: + name: '&4Arco de hueso ardiente' + lore: + - '&4Este arco está hecho de' + - '&4Un hueso grande.' +invasion_alien_treat: + name: '&6Trato alienígena' + lore: + - '&6¡El sabor está fuera de este planeta!' +invasion_cheap_plasma_boots: + name: '&2Botas de Plasma baratas' + lore: + - '&a¡Explosión!' + - '&cNota: &8¡Doble Mayus para activar!' +invasion_low_grade_tinfoil_bolt_caster: + name: '&7Caster de perno de escala baja' + lore: + - '&7¡Fuera de mi propiedad!' +invasion_low_grade_tinfoil_boots: + name: '&7Calzado de escala baja' + lore: + - '&7¡Evita la radiación del suelo!' +invasion_low_grade_tinfoil_chestplate: + name: '&7Peto de papel de aluminio de bajo grado' + lore: + - '&7¡Evita que el 6G espíe tu marcapasos!' +invasion_low_grade_tinfoil_hat: + name: '&7Calzado de escala baja' + lore: + - '&7¡Quiero creer!' +invasion_low_grade_tinfoil_leggings: + name: '&7Pantalones de escala baja' + lore: + - '&7¡Hecho para huir de los alienígenas!' +invasion_polished_plasma_boots: + name: '&2Botas de Plasma pulidas' + lore: + - '&a¡Explosión!' + - '&cNota: &8¡Doble Mayus para activar!' +invasion_quality_bolt_caster: + name: '&7Calidad Caster perno' + lore: + - '&7¡Fuera de mi propiedad!' +invasion_quality_tinfoil_boots: + name: '&7Zapatos de aluminio de baja calidad' + lore: + - '&7¡Evita la radiación del suelo!' +invasion_quality_tinfoil_chestplate: + name: '&7Pechera de aluminio de calidad' + lore: + - '&7¡Evita que el 6G espíe tu marcapasos!' +invasion_quality_tinfoil_hat: + name: '&7Sombrero de aluminio de calidad' + lore: + - '&7¡Quédate fuera de mi cabeza!' +invasion_quality_tinfoil_leggings: + name: '&7Pantalones de aluminio de calidad' + lore: + - '&7¡Hecho para huir de los extraterrestres!' +invictus_boots: + name: '&4Botas del Invicto' + lore: + - '&2Otorgado a los campeones del' + - '&2¡Arena Liga de Madera!' +invictus_chestplate: + name: '&4Pechera del Invicto' + lore: + - '&2Otorgado a los campeones del' + - '&2¡Arena Liga de Madera!' +invictus_helmet: + name: '&4Yelmo del Invicto' + lore: + - '&2Otorgado a los campeones del' + - '&2¡Arena Liga de Madera!' +invictus_leggings: + name: '&4Perneras del Invicto' + lore: + - '&2Otorgado a los campeones del' + - '&2¡Arena Liga de Madera!' +invictus_pickaxe: + name: '&4Pico del Invicto' + lore: + - '&2Otorgado a los campeones del' + - '&2¡Arena Liga de Madera!' +invictus_shovel: + name: '&4Pala del Invicto' + lore: + - '&2Otorgado a los campeones del' + - '&2¡Arena Liga de Madera!' +invictus_sword: + name: '&4Espada del Invicto' + lore: + - '&2Otorgado a los campeones del' + - '&2¡Arena Liga de Madera!' +krampus_drop_boots: + name: 'Botas de &1nieve' + lore: + - '&1Hecho de nieve real.' +large_hopper_drop_axe: + name: '&aHacha Pesada' + lore: + - '&aPerfecto para cortar cabezas.' +living_shadow_drop_boots: + name: '&5Botas Sombrías' + lore: + - '&5Caer no te daña tanto.' +lucky_charms: + name: '&bTalisman de la suerte' + lore: + - '&a¡Parte de un desayuno completo!' + - '&cNota: Absolutamente no es parte de' + - '&ca de un desayuno completo.' +magmaguys_toothpick: + name: '&2Palillo de dientes de &4Magmaguy' + lore: + - '&aEn casi perfecto estado!' +merman_drop_trident: + name: '&1Tridente de Merman' + lore: + - '&1El arma favorita de Merman.' +meteor_shower_scroll: + name: '&7Pergamino de Lluvia de Meteoros' + lore: + - '&4Invoca la destrucción.' + - '&4Un solo uso.' +monster_of_the_deep_drop_trident: + name: '&3Tridente de Hueso' + lore: + - '&3Hecho de los huesos' + - '&3del Monstruo de las Profundidades.' +moon_spider_drop_sword: + name: 'Espada de Hilada de Seda' + lore: + - '&fRazor Agudo de seda afilada' + - '&fEl núcleo de hierro de esta Espada.' + - '&fEsta hoja te servirá' + - '&fpor ahora...' +necromancer_drop_helmet: + name: '&cCasco de Presagio Oscuro' + lore: + - '&cHay algo desactivado' + - '&cacerca de este casco.' +netherite_golem_drop_helmet: + name: '&8Casco Ancestro' + lore: + - '&8No estás seguro de si eres' + - '&8deberías poner esto en tu' + - '&8diríjase o envíelo al museo.' +nether_escapee_drop_charm: + name: '&6Amuleto de Fuego' + lore: + - '&6Que las llamas no te afecten.' +nether_hag_drop_sword: + name: '&7Espada Guauzana' + lore: + - '&7Todo tipo de maldiciones y' + - '&7encantamientos fluyen a través' + - '&7esta espada.' +nightwing_drop_crossbow: + name: '&aGuardián del cielo' + lore: + - '&aManteniendo los cielos a salvo.' +night_crawler_drop_shield: + name: '&8Escudo Noche' + lore: + - '&8Casi irrompible.' +night_crawler_drop_sword: + name: '&8Hoja Noche' + lore: + - '&8La única respuesta al' + - '&8amenazas de la noche.' +novices_boots: + name: '&8Botas de Principiante' + lore: + - '&2Otorgado a aquellos que desafíen el' + - '&2¡Arena Liga de Madera!' +novices_chestplate: + name: '&8Pechera de Principiante' + lore: + - '&2Otorgado a aquellos que desafíen el' + - '&2¡Arena Liga de Madera!' +novices_helmet: + name: '&8Casco de Principiante' + lore: + - '&2Otorgado a aquellos que desafíen el' + - '&2¡Arena Liga de Madera!' +novices_leggings: + name: '&8Perneras de Principiante' + lore: + - '&2Otorgado a aquellos que desafíen el' + - '&2¡Arena Liga de Madera!' +novices_sword: + name: '&8Espada del Principiante' + lore: + - '&2Otorgado a aquellos que desafíen el' + - '&2¡Arena Liga de Madera!' +oasis_beacons_brigandine: + name: '&7Brigandina de Beacon' + lore: + - '&fAcero sólido puede repeler' + - '&fla mayoría de los ataques.' +oasis_chief_cultists_bow: + name: '&7Arco del cultista jefe' + lore: + - '&dArco necroso de guerra' + - '&ddel jefe del culto.' +oasis_earthquake_boots_10: + name: '&2Botas del Terremoto' + lore: + - '&a¡Golpea el suelo, y a los monstruos!' + - '&cNota: &8¡Doble Mayus para activar!' +oasis_earthquake_boots_20: + name: '&2Botas del Terremoto' + lore: + - '&a¡Golpea el suelo, y a los monstruos!' + - '&cNota: &8¡Doble Mayus para activar!' +oasis_earthquake_boots_30: + name: '&2Botas del Terremoto' + lore: + - '&a¡Golpea el suelo, y a los monstruos!' + - '&cNota: &8¡Doble Mayus para activar!' +oasis_earthquake_boots_40: + name: '&2Botas del Terremoto' + lore: + - '&a¡Golpea el suelo, y a los monstruos!' + - '&cNota: &8¡Doble Mayus para activar!' +oasis_earthquake_boots_50: + name: '&2Botas del Terremoto' + lore: + - '&a¡Golpea el suelo, y a los monstruos!' + - '&cNota: &8¡Doble Mayus para activar!' +oasis_earthquake_chestplate_10: + name: '&2Pechera del Terremoto' + lore: + - '&a¡Golpea el suelo, y a los monstruos!' + - '&cNota: &8¡Doble Mayus para activar!' +oasis_earthquake_chestplate_20: + name: '&2Pechera del Terremoto' + lore: + - '&a¡Golpea el suelo, y a los monstruos!' + - '&cNota: &8¡Doble Mayus para activar!' +oasis_earthquake_chestplate_30: + name: '&2Pechera del Terremoto' + lore: + - '&a¡Golpea el suelo, y a los monstruos!' + - '&cNota: &8¡Doble Mayus para activar!' +oasis_earthquake_chestplate_40: + name: '&2Pechera del Terremoto' + lore: + - '&a¡Golpea el suelo, y a los monstruos!' + - '&cNota: &8¡Doble Mayus para activar!' +oasis_earthquake_chestplate_50: + name: '&2Pechera del Terremoto' + lore: + - '&a¡Golpea el suelo, y a los monstruos!' + - '&cNota: &8¡Doble Mayus para activar!' +oasis_earthquake_helmet_10: + name: '&2Yelmo del Terremoto' + lore: + - '&a¡Golpea el suelo, y a los monstruos!' + - '&cNota: &8¡Doble Mayus para activar!' +oasis_earthquake_helmet_20: + name: '&2Yelmo del Terremoto' + lore: + - '&a¡Golpea el suelo, y a los monstruos!' + - '&cNota: &8¡Doble Mayus para activar!' +oasis_earthquake_helmet_30: + name: '&2Yelmo del Terremoto' + lore: + - '&a¡Golpea el suelo, y a los monstruos!' + - '&cNota: &8¡Doble Mayus para activar!' +oasis_earthquake_helmet_40: + name: '&2Yelmo del Terremoto' + lore: + - '&a¡Golpea el suelo, y a los monstruos!' + - '&cNota: &8¡Doble Mayus para activar!' +oasis_earthquake_helmet_50: + name: '&2Yelmo del Terremoto' + lore: + - '&a¡Golpea el suelo, y a los monstruos!' + - '&cNota: &8¡Doble Mayus para activar!' +oasis_earthquake_leggings_10: + name: '&2Perneras del Terremoto' + lore: + - '&a¡Golpea el suelo, y a los monstruos!' + - '&cNota: &8¡Doble Mayus para activar!' +oasis_earthquake_leggings_20: + name: '&2Perneras del Terremoto' + lore: + - '&a¡Golpea el suelo, y a los monstruos!' + - '&cNota: &8¡Doble Mayus para activar!' +oasis_earthquake_leggings_30: + name: '&2Perneras del Terremoto' + lore: + - '&a¡Golpea el suelo, y a los monstruos!' + - '&cNota: &8¡Doble Mayus para activar!' +oasis_earthquake_leggings_40: + name: '&2Perneras del Terremoto' + lore: + - '&a¡Golpea el suelo, y a los monstruos!' + - '&cNota: &8¡Doble Mayus para activar!' +oasis_earthquake_leggings_50: + name: '&2Perneras del Terremoto' + lore: + - '&a¡Golpea el suelo, y a los monstruos!' + - '&cNota: &8¡Doble Mayus para activar!' +oasis_foundrys_flaming_hammer: + name: '&6El martillo llameante de la función' + lore: + - '&e¡El martillo de la función!' +oasis_foundrys_flux: + name: '&6Flujo de la fundación' + lore: + - '&eEl flujo del que está infundido' + - '&e¡cada arma forjada!' +oasis_mask_of_the_warlock: + name: '&4Máscara del brujo' + lore: + - '&7¡La piedra está en su máscara!' + - '&7¡La luz UV le ayudará!' +oasis_monumental_lance: + name: '&3Lanza monumental' + lore: + - '&bLa pesca con lanza es mi pasatiempo.' +oasis_oracles_shroud: + name: '&3Velo del Oráculo' + lore: + - '&1¡La ilusión es tu arma!' +oasis_page_of_darkness_I: + name: '&0Página de la Oscuridad I' + lore: + - '&829 paso del Norte' + - '&811 paso del Oeste' + - '&816 paso del Norte' + - '&86 paso del Este' +oasis_page_of_darkness_II: + name: '&0Página de la Oscuridad II' + lore: + - '&87 paso del Sur' + - '&86 paso del Este' + - '&833 paso del Norte' + - '&812 paso del Oeste' +oasis_page_of_darkness_III: + name: '&0Página de la Oscuridad III' + lore: + - '&86 paso del Norte' + - '&83 paso del Oeste' + - '&830 paso del Norte' + - '&89 paso del Este' +oasis_page_of_darkness_index: + name: '&0Índice de Página de la Oscuridad' + lore: + - '&8Pisa cuidadosamente en la oscuridad' + - '&8ellos saben que vienes.' + - '&8Cuidado con el camino que tienes adelante' + - '&8para bolas de tambor de fuego.' +oasis_page_of_darkness_IV: + name: '&0Página de la Oscuridad IV' + lore: + - '&824 paso del Sur' + - '&89 paso del Este' + - '&836 paso del Norte' + - '&83 paso del Oeste' +oasis_page_of_darkness_V: + name: '&0Página de la Oscuridad V' + lore: + - '&89 paso del Norte' + - '&812 paso del Este' + - '&86 paso del Sur' + - '&86 paso del Este' +oasis_page_of_darkness_VI: + name: '&0Página de la Oscuridad VI' + lore: + - '&86 paso del Sur' + - '&86 paso del Este' + - '&812 paso del Norte' + - '&83 paso del Este' +oasis_page_of_darkness_VII: + name: '&0Página de la Oscuridad VII' + lore: + - '&83 paso del Norte' + - '&86 paso del Este' + - '&88 paso del Sur' +oasis_page_of_darkness_VIII: + name: '&0Página de la Oscuridad VIII' + lore: + - '&8Fuera de la sombra aparece una luz' + - '&8cuyas túnicas son de un gris apagado, estropeadas por la lucha.' + - '&8De hielo y nieve, de fuego y calor.' + - '&8Las hachas rebotan pero las espadas derrotan.' +oasis_page_of_libraris_I: + name: '&7Página de Libraris I' + lore: + - '&fBajo la estantería' + - '&fno tiene reflejo' + - '&f aparece frente a ti' + - '&fpasaje y dirección.' +oasis_page_of_libraris_II: + name: '&7Página de Libraris II' + lore: + - '&fEl reflejo de la estantería' + - '&fcontiene mas conocimiento' + - '&f4 estanterias más, llenas de libros' + - '&fde su imagen ascendente!' +oasis_page_of_libraris_III: + name: '&7Página de Libraris III' + lore: + - '&fOrientación ligeramente al oeste' + - '&fde la estanteria que contiene lo mejor.' + - '&fLos mayores conocimientos que conserva.' + - '&fEl favorito de los que cosechan.' +oasis_page_of_libraris_index: + name: '&7Índice de página de Libraris' + lore: + - '&f5documentos que encontrar,' + - '&f3 interruptores para voltear,' + - '&funa puerta para ser abierta' + - '&fy en el te resbalas.' +oasis_page_of_libraris_IV: + name: '&7Pagina de Libraris IV' + lore: + - '&fEl oráculo del conocimiento' + - '&fproduce sorpresa impactante' + - '&fdesde las profundidades de la desesperación' + - '&fsurgirán relámpagos.' +oasis_page_of_libraris_V: + name: '&7Pagina de Libraris V' + lore: + - '&fSu último secreto' + - '&fel tratara de esconderse' + - '&fpor el uso de sombras y marionetas' + - '&fGolpearte a medida que te marchas.' +oasis_page_of_plundering_I: + name: '&6Página de Saqueo I' + lore: + - '&eCasas en toda la ciudad' + - '&ocultar sus secretos hacia arriba y no hacia abajo.' + - '&eAgarrar o volar' + - '&epuede ayudadarte en tu situación dificil.' +oasis_page_of_sentris: + name: '&1Página de Sentris' + lore: + - '&bLa armadura del sentry es demasiado resistente' + - '&busar una espada, tu lucha será dificil.' +oasis_page_of_the_pharaoh_I: + name: '&0Página del Faraon I' + lore: + - '&6Un sacrificio en el altar' + - '&6debe ser perseguido.' + - '&6¿Y qué habéis de ofrecer?' + - '&La arenisca roja es la pista.' +oasis_page_of_the_pharaoh_II: + name: '&0Página del Faraon II' + lore: + - '&6Los pasillos del faraon están alineadas' + - '&6en el mejor oro por ahi.' + - '&6Será su desecho' + - 'A partir del oro tu daño desaparecerá.' +oasis_page_of_the_pharaoh_III: + name: '&0Página del faraón III' + lore: + - '&6Las paredes de los faraones están llenas' + - '&6con peligros y tesoros preciosos.' + - '&6Desde la esquina suroeste de la habitación con ventanas azules' + - '&6flujos de presiones muy ominosas.' +oasis_page_of_the_pharaoh_index: + name: '&0Índice de la Página del Faraón' + lore: + - '&6El faraón está sellado' + - '&6dentro de su tumba.' + - '&6Él yace al acecho, imperturbable;' + - '&6Sus trampas seran tu castigo.' + - '&63 páginas ayudarán a tu aventura' + - '&6para ser detenido.' +oasis_page_of_the_sewer_I: + name: '&0Página del Sewer I' + lore: + - '&3Hay un molino de tamaño inusual.' + - '&3Está al acecho, he aquí su premio.' + - '&3Hay muchos tesoros por encontrar' + - '&3Todo lo que tienes que hacer es nadar.' +oasis_page_of_the_sewer_II: + name: '&0Página del Sewer II' + lore: + - '&3Activando las puertas una por una' + - '&3Permitirá que el agua fluya.' + - '&3Nadar una vez que se derrame' + - '&3luego debes seguir por el túnel de la derecha.' +oasis_page_of_the_sewer_index: + name: '&0Página del índice de alcantarillado' + lore: + - '&3La maldad acecha donde se drenan las aguas' + - '&3¡Ten cuidado, te comerán el cerebro!' + - '&3Debes abrir 3 puertas custodiadas por criaturas' + - '&3revestido con elementos de arenisca roja.' + - '&32 páginas te guiarán, no te esfuerces.' +oasis_page_of_vampiris_I: + name: '&4Página de Vampiris I' + lore: + - '&cDocenas de armas han golpeado a la bestia' + - '&cy cada golpe es resistido.' + - '&cNo teme al mordisco de la piedra, el oro o los diamantes en lo más mínimo' + - '&cpero tiembla ante la madera.' +oasis_page_of_vampiris_II: + name: '&4Página de Vampiris II' + lore: + - '&cSi el brujo que buscas despreciar,' + - '&c¡Prepárate para una dura pelea!' + - '&cEl segundo piso pondrá a prueba tu fuerza,' + - '&cConquistarlo primero es un rito.' +oasis_page_of_vampiris_III: + name: '&4Página de Vampiris III' + lore: + - '&cAbajo de la aguja y dentro de la cueva' + - '&cEs el camino de los valientes.' + - '&cCuidado con los que regresan de la tumba,' + - '&cMata al maestro por lo que anhelas.' +oasis_page_of_vampiris_index: + name: '&4Índice de la pagina de Vampiris' + lore: + - '&cDentro del observatorio' + - '&callí acecha a una criatura' + - '&c¿Quién nunca ha visto al sol?.' + - '&cEncuentra las 4 páginas para ayudarte' + - '&cescapa vivo!' +oasis_page_of_vampiris_IV: + name: '&4Página del Vampiris IV' + lore: + - '&cDos cofres de botín,' + - '&c¡No despiertes a los muertos!' + - '&cUno bajo la escalera,' + - '&cel otro donde los libros pueden ser leídos!' +oasis_pharaohs_feast: + name: '&6Festin del Faraón' + lore: + - '&eUn recordatorio dorado' + - '&ede la que fue la ciudad dorada' + - '&ecorrompido por las arenas del tiempo.' +oasis_pharaohs_flail: + name: '&0Mayal del Faraón' + lore: + - '&4Mayal del mas allá.' +oasis_pick_of_darkness: + name: '&1Pico de la Oscuridad' + lore: + - '&bBrillando a través' + - '&blas sombras.' +oasis_sunkiller: + name: '&6Asesino solar' + lore: + - '&eNo es esa roca de ahí' + - '&eLo suficientemente grande para alguien' + - '&epara esconderse detrás?' +oasis_tohth: + name: '&8La aventura de los hermanos Oingo Boingo' + lore: + - '&f¡Mis premoniciones son absolutas!' + - '&fEs el Destino!' +okami_drop_leggings: + name: '&cBendición de Okami' + lore: + - '&cVelocidad del lobo.' + - '&cProtección de fuego de un dios.' +owl_charm: + name: '&bTalismán de Búho' + lore: + - '&aConviértete en el mejor predador' + - '&anocturno!' +primis_artifexs_shield: + name: '&6Escudo de Artifex' + lore: + - '&eUna antigua reliquia de una más' + - '&eTiempos peligrosos. Han sido' + - '&eRestaurado a su gloria!' +primis_caeruleaums_hope: + name: '&9Esperanza de Caeruleaum' + lore: + - '&8Una reliquia de una era pasada, aún afilada' + - '&8lo suficiente para lastimar pero, lo suficientemente oxidado para' + - '&8pertenecen a un museo!' +primis_catacomb_drop_boots: + name: '&7Equipo de Hueso Oscuro' + lore: + - '&7Huesos oscuros poco naturales' + - '&7cubrir estas botas.' +primis_catacomb_drop_boots_2: + name: '&7Equipo de Hueso Oscuro' + lore: + - '&7Huesos oscuros poco naturales' + - '&7cubrir estas botas.' +primis_catacomb_drop_chestplate: + name: '&7Armadura de Hueso Oscuro' + lore: + - '&7Huesos tan oscuros como el abismo' + - '&7adorna esta armadura.' + - '&7Las flechas deben hacer un buen' + - '&7ruido cuando rebotan de los huesos.' +primis_catacomb_drop_chestplate_2: + name: '&7Armadura de Hueso Oscuro' + lore: + - '&7Huesos tan oscuros como el abismo' + - '&7adorna esta armadura.' + - '&7Las flechas deben hacer un buen' + - '&7ruido cuando rebotan de los huesos.' +primis_catacomb_drop_leggings: + name: '&7Pantalones de Hueso Oscuro' + lore: + - '&7Los huesos oscuros que rodean el' + - '&7Las piernas harán peligroso' + - '&7Cae más seguro.' +primis_catacomb_drop_leggings_2: + name: '&7Pantalones de Hueso Oscuro' + lore: + - '&7Los huesos oscuros que rodean el' + - '&7Las piernas harán peligroso' + - '&7Cae más seguro.' +primis_catacomb_necromancer_drop_helmet: + name: '&5Capucha de Hueso Oscuro' + lore: + - '&5La capucha ofrece poca proteccion' + - '&5eso sólo busca sangre y muerte.' +primis_catacomb_necromancer_drop_helmet_2: + name: '&5Capucha de Hueso Oscuro' + lore: + - '&5La capucha ofrece poca proteccion' + - '&5eso sólo busca sangre y muerte.' +primis_catacomb_necromancer_drop_sword: + name: '&5Marca de Hueso Oscuro' + lore: + - '&5La marca hueso oscuro, no naturalmente' + - '&5visibles en la luz' + - '&5listo para partir cualquier cosa' + - '&5que se interpone en su camino.' +primis_catacomb_necromancer_drop_sword_2: + name: '&5Marca de Hueso Oscuro' + lore: + - '&5Los aullidos de la marca hueso oscuro' + - '&5viciamente con cada swing' + - '&5como salpicaduras en el aire' + - '&5su interior hueco.' +primis_cooked_rabbit: + name: '&cConejo Cocinado' + lore: + - Huh, ¿Este conejo se sobrecalentó? +primis_diving_helmet: + name: '&1Casco de Buceo' + lore: + - Un casco viejo. + - Todavía funciona bien. +primis_fish_bait: + name: '&2Cebo para Peces' + lore: + - '&aParece que podrias atrapar peces grandes con estos.' +primis_gladius_important_documents: + name: '&2Documentos Importantes' + lore: + - '&aLos documentos están sellados.' +primis_gladius_lord_promise: + name: '&5Acuerdo de Asistencia' + lore: + - '... por lo tanto, por la ayuda prestada durante estos tiempos tan difíciles' + - ', Pontis Miles promete regresar de la misma manera en Gladius''' + - hora más oscura. +primis_gladius_supplies: + name: '&2Suministros' + lore: + - '&aAdecuado para mantener a un soldado bien alimentado durante la guerra.' +primis_gladius_sword: + name: '&5Gladius' + lore: + - '&8El mismísimo símbolo de la Fortaleza Gladius.' +primis_gladius_the_good_stuff: + name: '&2Las cosas buenas' + lore: + - '&aHuele... fuerte.' +primis_heirloom: + name: '&2Reliquia perdida' + lore: + - '&aParece viejo, incluso antiguo.' +primis_ice_village_alanus_dagger: + name: '&eDaga de Alanus' + lore: + - '&eUna daga sencilla con' + - '&erunas que cubren el mango.' +primis_ice_village_chains_shipment: + name: '&Hip de Cadenas' + lore: + - '&aUn montón de cadenas.' +primis_ice_village_escaped_prisoner_body: + name: '&cCuerpo Inconciso' + lore: + - '&cPesado.' +primis_ice_village_foot_of_mountain_chest_axe: + name: '&1Hacha Helada' + lore: + - '&1Congelando al tocar' +primis_ice_village_island_chest_trident: + name: '&3La Delicia de Magma' + lore: + - '&3Aquellos que miren, encontrarán.' +primis_ice_village_living_nightmares_reward_chest: + name: 'Abrigo de piel' + lore: + - '&3Hecho de los' + - '&3pelaje más duro que se puede encontrar.' +primis_ice_village_magical_ice_crystals: + name: '&1Piel de Cristal del Hielo' + lore: + - Tener el cristal cerca + - hace que la nieve reaccione. +primis_ice_village_make_them_go_ouch_reward_leggings: + name: '&dCalza de Violeta' + lore: + - '&dHace que quieras acabar el' + - '&Arrastrar y hacer algún castigo.' +primis_ice_village_salmon: + name: '&2Salmón fresco' + lore: + - Piensas que no has visto + - salmón más grande en su vida. +primis_ice_village_silence_reward_helmet: + name: '&aYelmo de Boomers' + lore: + - '&aDebe manejar una o dos explociones.' +primis_ice_village_taking_the_bait_reward: + name: '&bCaña Norteña' + lore: + - '&bEs una caña de pesca bien hecha.' +primis_ice_village_violet_boots: + name: 'Botas de Cuero de la Reina' + lore: + - '&dBotas de cuero con' + - '&dun tacón puntiagudo.' +primis_ice_village_violet_leggings: + name: '&dPantalones elegante de Violeta' + lore: + - '&dApretados y ligeramente vistos' + - '&dcon bonitas motivaciones florales.' +primis_ice_village_violet_whip: + name: '&dLatigo de Violeta' + lore: + - '&dEntrega castigo exquisito.' +primis_ice_village_wanna_build_a_snowman_reward_boots: + name: '&3Botas Heladas' + lore: + - '&3Son sólo botas heladas.' +primis_invaders_assassins_bow: + name: '&8Arco del asesino' + lore: + - '&aLa forma perfecta de darles' + - '&aun poco de su propia medicina' +primis_invaders_boots: + name: '&4Botas de Invasor' + lore: + - '&aEsto no huele nada bien.' +primis_invaders_bow: + name: '&8Arco del Invasor' + lore: + - '&aUna vez borrado el Sol.' +primis_invaders_captains_sword: + name: '&4Espada del Capitán Invasor' + lore: + - '&aCurvado y de aspecto mezquino.' +primis_invaders_chestplate: + name: '&4Pechera del Invasor' + lore: + - '&aOxidado, feo y maloliente. ¡Hermoso!' +primis_invaders_helmet: + name: '&4Casco del Invasor' + lore: + - '&aSupera una conmoción cerebral!' +primis_invaders_leggings: + name: '&4Pantalones del Invasor' + lore: + - '&aPodría usar algo de aceite.' +primis_invaders_sword: + name: '&4Espada del Invasor' + lore: + - '&aSuspiciosamente ensangrentado.' +primis_lucky_pickaxe: + name: '&6Pico de la suerte' + lore: + - '&eBrilla brillante, incluso en el subterráneo.' + - '&eVes LL engravado en el mango' +primis_monster_slaying_spear: + name: '&8Lanza Mata Monstruos' + lore: + - Convierte monstruos del mar en barbacoa. +primis_ogre_boots: + name: '&cBotas de Ogro' + lore: + - '&7Te mantendrán agradable' + - '&7y tostado.' +primis_ogre_chestplate: + name: '&cPechera de Ogro' + lore: + - '&7Caliente al tocar' +primis_ogre_helmet: + name: '&cCasco de Ogro' + lore: + - '&7Estarás sudando balas.' +primis_ogre_leggings: + name: '&cPantalones de Ogro' + lore: + - '&7Tragamonedas fundientes.' +primis_ogre_mines_lucky_pickaxe: + name: '&ePico de la suerte' + lore: + - '&aSuerte, pero sin valor.' +primis_ogre_mines_waterworks_chest_shield: + name: '&Puerta robusta' + lore: + - '&aEs una puerta.' +primis_old_shield: + name: '&8Escudo Viejo' + lore: + - '&eUna antigua reliquia de una más' + - '&eTiempos peligrosos. Han sido' + - '&7se puede mejorar, sin embargo...' +primis_pirate_boots: + name: '&4Botas de Pirata' + lore: + - '&aEstos tienen muchos' + - '&agujeros a ser útiles.' +primis_pirate_bow: + name: '&8Arco de pirata' + lore: + - '&aNo es un pedernal,' + - '&apero será suficiente!' +primis_pirate_chestplate: + name: '&4Pechera de pirata' + lore: + - '&aBásicamente una camiseta.' +primis_pirate_helmet: + name: '&4Casco de Pirata' + lore: + - '&aFalta un parche en el ojo.' +primis_pirate_leggings: + name: '&4Pantalones de Pirata' + lore: + - '&aSe siente como pantalones de océano!' +primis_pirate_sword: + name: '&4Espada de pirata' + lore: + - '&aCurvado y de aspecto malo.' +primis_pointis_groves_heirloom: + name: '&2Reliquia Valiosa' + lore: + - '&aEsta es la segunda de estas que has recuperado.' +primis_pointis_mille_chest_dirty_note: + name: Nota sucia + lore: + - '&fHubo una espada muy genial' + - '&f aquí pero ha desaparecido ahora.' +primis_pontis_beast_horn: + name: '&2Cuerno manchado de sangre' + lore: + - '&fEn una inspección más cercana, el cuerno no' + - '&festá cubierto de sangre pero parece ser' + - '&fque fué hecho de ella.' + - '&fLa sangre cristallizada es increíblemente filosa.' +primis_pontis_beast_scale: + name: '&2Escama tóxica de pescado' + lore: + - '&fLa escala es roca dura en el exterior.' + - '&fEl interior está cubierto por' + - '&ftoxicidad y acido.' +primis_pontis_beast_silk: + name: '&2Seda empapada al sol' + lore: + - '&fLa seda irradia luz y calor.' +primis_pontis_elf_drop_boots: + name: '&7Botas de Elfo' + lore: + - '&7Sientes energía extraña' + - '&7proveniente de la armadura.' +primis_pontis_elf_drop_chestplate: + name: '&7Peto Elfo' + lore: + - '&7Sientes energía extraña' + - '&7proveniente de la armadura.' +primis_pontis_elf_drop_crossbow: + name: '&7Arco Oscuro Elfo' + lore: + - '&7Los proyectiles especiales que el arco' + - '&7usa son filosos y contundentes.' +primis_pontis_elf_drop_helmet: + name: '&7Casco Elfo' + lore: + - '&7Sientes energía extraña' + - '&7proveniente de la armadura.' +primis_pontis_elf_drop_leggings: + name: '&7Pantalones Elfo' + lore: + - '&7Sientes energía extraña' + - '&7proveniente de la armadura.' +primis_pontis_fields_berry_charm: + name: '&dBaya Grande' + lore: + - '&dEl olor fresco que emite esta baya' + - '&dpuede ser olido a metros de distancia.' + - '&dEl olor parece tener un calmado' + - '&defecto sobre monstruos y bestias.' + - '&dEsto hace que sus ataques sean menos viables.' +primis_pontis_groves_brood_moher_drop_charm: + name: '&aTormenta de Rastreadores' + lore: + - '&aLa seda irradia una energía poderosa.' +primis_pontis_groves_nest_crawler_drop_shield: + name: '&7Señuelo de Magma' + lore: + - '&7Cuando se levanta el escudo' + - '&7atrae monstruos para que lo golpeen.' +primis_pontis_groves_spider_boots_reward: + name: '&1Botas de piernas de araña' + lore: + - '&1Botas hechas con piernas de araña y cuero.' +primis_pontis_groves_tree_climbing_elf_bandits_reward_leggings: + name: '&aPantalones de Perla Elfo' + lore: + - '&aPantalones protectores' + - '&aadornado con perlas.' +primis_pontis_mille_arena_knowledge: + name: '&2Conocimiento' + lore: + - '&aConocimiento importante.' +primis_pontis_mille_arena_reward_1: + name: '&4Escudo Tocado de Estrella' + lore: + - '&7Un escudo ornamentado con un motivo de cosmos.' +primis_pontis_mille_arena_reward_2: + name: '&4Pechera Tocados de Estrella' + lore: + - '&7Mil minúsculas estrellas se esparcirán por la pechera.' +primis_pontis_mille_arena_reward_3: + name: '&4Pantalones Tocados de Estrella' + lore: + - '&7Los pantalones brillan como las estrellas del cielo.' +primis_pontis_mille_cat_quest_reward_charm: + name: '&9Bendición de Gato' + lore: + - '&9Si lo sostienes todo' + - '&9el camino hasta tu oído, puedes' + - '&9escuchar un ligero purr.' +primis_pontis_mille_counselor_sword: + name: '&ePiedra de Habla-Lejana' + lore: + - '&aPuedes sentir una presencia proveniente de la piedra.' +primis_pontis_mille_fields_beasts_reward_chest: + name: '&eOrgullo de Cazadores' + lore: + - '&eAquellos que cazan no pueden ser la presa.' +primis_pontis_mille_fields_contest_berry: + name: '&dBaya de Concurso' + lore: + - '&dUna hermosa y muy grande baya.' + - '&dVerdaderamente una en un millón de especímenes.' +primis_pontis_mille_fields_do_it_yourself_reward_bow: + name: '&cArco de Cazadores' + lore: + - '&cUn arco finamente fabricado.' + - '&cFlechas disparadas de este' + - '&carco dañará a cualquier bestia.' +primis_pontis_mille_fields_first_aid: + name: '&2Equipo de primeros auxilios' + lore: + - '&fTodo lo que uno necesita" - "&fpara tratar lesiones graves.' +primis_pontis_mille_fields_rat_drop_helmet: + name: '&fGorra Emplumada de Rata' + lore: + - '&fHas conseguido hacer una' + - '&fgorra de tu presa.' + - '&fHabiendo extraído las presas' + - '&fcegadoras de la presa, has hecho' + - '&el trabajo en forma a tu favor.' +primis_pontis_mille_fields_rat_meat: + name: '&cCarne de Rata' + lore: + - Carne de rata cruda. No hay necesidad de cocinar. +primis_pontis_mille_fields_stolen_berries: + name: '&4Bayas robadas' + lore: + - '&fSon las bayas robadas' +primis_pontis_mille_fish_nets: + name: '&2Redes de Peces' + lore: + - '&aLa captura de peces ha sido fácil!' +primis_pontis_mille_fresh_rat: + name: '&fRata Fresca' + lore: + - Al gato le encantará esto. +primis_pontis_mille_mines_goblined_up_in_the_maze_reward_axe: + name: '&aHacha de Goblin Rúnica' + lore: + - '&aHay runas grabadas en el mango del hacha.' + - '&aAhora están bastante desvanecidos.' + - '&aParece que esta hacha estaba maldita en algún punto...' +primis_pontis_mille_mines_goblin_head: + name: '&2Plumas de Ave Goblin' + lore: + - '&aTan suave y espinoso.' +primis_pontis_mille_parkour_reward_boots: + name: '&4Botas de Árbol Diamante' + lore: + - '&7Botas hechas de corteza suave especial.' + - '&7Decorado con gemas.' +primis_pontis_mille_reward_boots: + name: '&4Botas de Pontis Mille' + lore: + - '&7Botas tradicionales de Pontis Mille' +primis_pontis_mille_reward_chest: + name: '&4Pechera de Pontis Mille' + lore: + - '&7Pechera tradicional de Pontis Mille' +primis_pontis_mille_reward_helmet: + name: '&4Casco de Pontis Mille' + lore: + - '&7Casco tradicional de Pontis Mille' +primis_pontis_mille_reward_leggings: + name: '&4Pantalones de Pontis Mille' + lore: + - '&7Pantalones tradicionales de Pontis Mille' +primis_pontis_mille_reward_shield: + name: '&4Escudo de Pontis Mille' + lore: + - '&7Escudo tradicional de Pontis Mille' +primis_pontis_mille_reward_sword: + name: '&4Katana de Pontis Mille' + lore: + - '&7Increíblemente afilado' +primis_pontis_mille_serious_sewage_reward_helmet: + name: '&2Casco de Caparazón de Tortuga' + lore: + - '&2Te hace querer comer algo de pizza.' +primis_pontis_mille_sewage_keys: + name: '&2Llave de Aguas Residuales' + lore: + - '&Un anillo de llave con muchas llaves en él.' +primis_pontis_mille_sewers_ninja_drop_chestplate: + name: '&7Pechera de Traje de Ninja' + lore: + - Ahora tú también eres un Ninja +primis_pontis_mille_sewers_ninja_drop_leggings: + name: '&7Pantalones de Traje de Ninja' + lore: + - Ahora tú también eres un Ninja +primis_pontis_mille_sewers_shredder_drop: + name: '&4Casco de Trituración' + lore: + - Lleno de pequeñas hojas de afeitar + - como puntos en el exterior. +primis_pontis_mille_slums_chest_sword: + name: '&4Katana apagada de Pontis Mille' + lore: + - '&7Increíblemente afilado' +primis_pontis_mille_to_lycan_or_not_to_lycan_reward: + name: '&7Pantalones de Pelaje' + lore: + - '&aDuro y ligero' + - '&aHecho de pelaje y piel.' +primis_pontis_mines_goblin_drop_boots: + name: '&7Botas de Goblin' + lore: + - '&7Parece que alguien tomó un lingote de hierro' + - '&7y lo golpeó en la forma correcta.' +primis_pontis_mines_goblin_drop_chestplate: + name: '&7Pechera de Goblin' + lore: + - '&7Parece que alguien tomó un lingote de hierro' + - '&7y lo golpeó en la forma correcta.' +primis_pontis_mines_goblin_drop_helmet: + name: '&8Casco de Goblin' + lore: + - '&7Parece que alguien tomó un lingote de hierro' + - '&7y lo golpeó en la forma correcta.' +primis_pontis_mines_goblin_drop_leggings: + name: '&8Pantalones de Goblin' + lore: + - '&7Parece que alguien tomó un lingote de hierro' + - '&7y lo golpeó en la forma correcta.' +primis_pontis_mines_goblin_drop_spear: + name: '&7Lanza de Goblin' + lore: + - '&7Una bonita y afilada piedra al final.' +primis_pontis_mines_goblin_drop_sword: + name: '&7Espada de Goblin' + lore: + - '&7Es solo un mazo de piedra con un mango.' +primis_pontis_redwoods_nasty_little_bandits_reward_boots: + name: '&2Botas del Bosque' + lore: + - '&2Las botas parecen estar hechas' + - '&2de corteza suave, hojas' + - '&2y savia de árbol cristalizada.' +primis_pontis_redwoods_spider_legs: + name: '&2Piernas de Araña' + lore: + - '&aSon solo piernas de araña...' +primis_pontis_redwoods_tobacco: + name: '&2Tabaco Premium' + lore: + - '&aHuele asombroso...' +primis_pontis_redwoods_watch: + name: '&2Reloj de Bolsillo Resistente' + lore: + - '&aSorpresivamente ligero y resistente.' +primis_pontis_redwoods_werewolf_drop_chestplate: + name: '&7Pechera de Pelaje' + lore: + - '&7Hecho de pelaje y piel duros.' + - '&7Ligero, pero muy duro.' +primis_roughspun_boots: + name: '&5Botas de tejido tosco' + lore: + - '&dUsado y avejentado, derrota' + - '&dno tener armadura en absoluto!' +primis_roughspun_chestplate: + name: '&5Pechera de tejido tosco' + lore: + - '&dUsado y avejentado, derrota' + - '&dno tener armadura en absoluto!' +primis_roughspun_helmet: + name: '&5Casco de tejido tosco' + lore: + - '&dUsado y avejentado, derrota' + - '&dno tener armadura en absoluto!' +primis_roughspun_leggings: + name: '&5Pantalones de tejido tosco' + lore: + - '&dUsado y avejentado, derrota' + - '&dno tener armadura en absoluto!' +primis_ruins_bow: + name: '&8Arco Arruinado' + lore: + - Un viejo arco. Puede que haya sido bueno en algún momento. +primis_ruins_diary_entry: + name: Página de diario + lore: + - '... Ahora lamento perseguir el tesoro en estas ruinas.' + - Ahora que he caído y me he roto las piernas, parece que + - como si estuviera condenado a morir bajo el tesoro que buscaba. + - '¡Ojalá hubiera prestado más atención durante la clase parkour!' +primis_ruin_relic_boots: + name: '&bBotas de ruina relicaria' + lore: + - '&6Se enterraron con las ruinas.' + - '&6Imbuido con poder antiguo.' +primis_ruin_relic_chestplate: + name: '&bPechera de Ruina Relicaria' + lore: + - '&6Se enterraron con las ruinas.' + - '&6Imbuido con poder antiguo.' +primis_ruin_relic_helmet: + name: '&bCasco de Ruina Relicaria' + lore: + - '&6Se enterraron con las ruinas.' + - '&6Imbuido con poder antiguo.' +primis_ruin_relic_leggings: + name: '&bPantalones de Ruina Relicaria' + lore: + - '&6Se enterraron con las ruinas.' + - '&6Imbuido con poder antiguo.' +primis_rusty_mail_boots: + name: '&3Botas de Malla Oxidadas' + lore: + - '&9Oxidado pero durable, derrota' + - '&9chatarras de cuero!' +primis_rusty_mail_chestplate: + name: '&3Pechera de Malla Oxidadas' + lore: + - '&9Oxidado pero durable, derrota' + - '&9chatarras de cuero!' +primis_rusty_mail_helmet: + name: 'Casco de Malla Bruto' + lore: + - '&9Oxidado pero durable, derrota' + - '&9chatarras de cuero!' +primis_rusty_mail_leggings: + name: '&3Pantalones de Malla Bruto' + lore: + - '&9Oxidado pero durable, derrota' + - '&9chatarras de cuero!' +primis_starter_boots: + name: '&4Botas de naufragio' + lore: + - '&aEstos restos de cuero apenas cuentan como armadura.' +primis_starter_chestplate: + name: '&4Pechera de naufragio' + lore: + - '&aEstos restos de cuero apenas cuentan como armadura.' +primis_starter_helmet: + name: '&4Casco de naufragio' + lore: + - '&aEstos restos de cuero apenas cuentan como armadura.' +primis_starter_leggings: + name: '&4Pantalones de naufragio' + lore: + - '&aEstos restos de cuero apenas cuentan como armadura.' +primis_starter_sword: + name: '&4Espada del Naufragio' + lore: + - '&aPosiblemente improvisado de la los restos de un barco!' +primis_storm_temple_drop_axe: + name: '&bHacha de Tormenta' + lore: + - '&bEl viento los repelerá.' +primis_storm_temple_drop_boots: + name: '&bBotas de Tormenta' + lore: + - '&bEl Templo de Tormenta' + - '&bno escatimó en gastos.' +primis_storm_temple_drop_charm: + name: '&bCollar de Tormenta' + lore: + - '&bEl poder de la tormenta.' +primis_storm_temple_drop_chestplate: + name: '&bPechera de Tormenta' + lore: + - '&bEl Templo de Tormenta' + - '&bno escatimó en gastos.' +primis_storm_temple_drop_helmet: + name: '&bCasco de Tormenta' + lore: + - '&bEl Templo de Tormenta' + - '&bno escatimó en gastos.' +primis_storm_temple_drop_leggings: + name: '&bPantalones de Tormenta' + lore: + - '&bEl Templo de Tormenta' + - '&bno escatimó en gastos.' +primis_terravilla_big_trouble_in_little_pub_reward_leggings: + name: '&eBendición de la Tierra' + lore: + - '&eParece pesado pero es' + - '&esorprendentemente ligero.' + - '&eEs claro que esos' + - '&epantalones tienen al menos unos' + - '&ecuantos siglos de antigüedad.' +primis_terravilla_drowning_terror_reward_charm: + name: '&aTalismán Acuático' + lore: + - '&aPescado.' +primis_terravilla_hog_on_my_porch_reward_helmet: + name: '&6Casco de Cerdo' + lore: + - '&6Hecho de un duro cuero de Razorback.' +primis_terravilla_perfect_sample: + name: '&eEjemplo Perfecto' + lore: + - '&eParece un pez...' + - '&ePero seguro de que no es...' +primis_terravilla_strike_the_earth_reward_sword: + name: '&5Divisor terrestre' + lore: + - '&5Has sacado esta espada de' + - '&5El cadáver de los Elementales de la Tierra.' + - '&5A diferencia de su gemelo tonto, este' + - '&5hoja está en excelente estado.' +primis_terravilla_taking_out_the_trash_reward_sword: + name: '&9Destruidor terrestre' + lore: + - '&9Parece antiguo y aburrido.' +primis_terravilla_two_legged_terror_growth: + name: '&eCrecimiento de terror con dos piernas' + lore: + - '&eGran crecimiento carnoso.' +primis_terravilla_two_legged_terror_sample: + name: '&eEjemplo de Terror con dos piernas' + lore: + - '&eEs una simple muestra.' +primis_wolf_hide_boots: + name: '&5Deslizadores de Piel de Lobo' + lore: + - '&dUsado y avejentado, derrota' + - '&dno tener armadura en absoluto!' +primis_wolf_hide_chestplate: + name: '&5Gambesón de Piel de Lobo' + lore: + - '&dUsado y avejentado, derrota' + - '&dno tener armadura en absoluto!' +primis_wolf_hide_helmet: + name: '&5Casco de Piel de Lobo' + lore: + - '&dUsado y avejentado, derrota' + - '&dno tener armadura en absoluto!' +primis_wolf_hide_leggings: + name: '&5Pantalón de Piel de Lobo' + lore: + - '&dUsado y avejentado, derrota' + - '&dno tener armadura en absoluto!' +pufferfish_drop_helmet: + name: '&bYelmo Humeante' + lore: + - '&bUna vez un pez, ahora un casco.' +rabbit_charm: + name: '&bTalismán de Conejo' + lore: + - '&aCon este talismán, casi que' + - '&acualquier lugar está a un salto de distancia,' + - '&aprepárate y empieza a saltar!' +rabbit_wolf_drop_chestplate: + name: '&6Peto cargado eléctricamente' + lore: + - '&6Mientras no te importe un' + - '&6borrado casual aquí y allá.' +rabbit_wolf_drop_leggings: + name: '&6Pantalones en Llama' + lore: + - '&6Just lightly scorched.' +regular_hoglin_drop_boots: + name: '&eHog Boots' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_chestplate: + name: '&eHog Armor' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_helmet: + name: '&eHog Hood' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +regular_hoglin_drop_leggings: + name: '&eHog Leggings' + lore: + - '&eMade out of durable' + - '&etalking-hog leather.' +rod_of_the_depths: + name: '&3Vara de las profundidades' + lore: + - '&3Quieres saber de dónde' + - '&3Obtuve esto? Siéntate muchacho,' + - '&3Tengo una historia para tí...' +rotting_diver_drop_hoe: + name: '&bDivers Hoe' + lore: + - '&bFound on the Rotting Divers corpse.' +salamander_charm: + name: '&bTalismán de Salamandra' + lore: + - '&aCasi tan caliente como el nuevo' + - '&¡Mezcla mix de lockyxD!' +salty_corpse_drop_helmet: + name: '&aStinky Helm' + lore: + - '&aYou''re not sure why' + - '&ayou decided to pull' + - '&athis off of the corpse.' +scorpion_charm: + name: '&bTalismán de Escorpión' + lore: + - '&a¡Vuela como una mariposa,' + - '&apica como una abeja,' + - '&aenvenena como patata!' +shulker_charm: + name: '&bTalismán de Shulker' + lore: + - '&aCreo que puedo volar' + - '&aCreo que puedo tocar el cielo' + - '&a¡Y vas a venir conmigo!' +skeleton_knight_drop_helmet: + name: '&fKnights Honor' + lore: + - '&fA knights helmet. Made to last.' +sky_archer_drop_bow: + name: '&aSky Bow' + lore: + - '&aGood for keeping phantoms at bay.' +slowpoke_charm: + name: '&bTalismán de Slowpoke' + lore: + - '&aSolo esperemos que se golpee' + - '&aa si mismo en su confusión...' +spider_knight_drop_helmet: + name: '&aSmall Helmet' + lore: + - '&aA decent helmet. Maybe, a bit tight.' +stacked_bones_drop_helmet: + name: '&6Skull' + lore: + - '&6Large enough to fit your' + - '&6head inside, so why not.' +summon_merchant_scroll: + name: '&6Pergamino de Invocación de Comerciante' + lore: + - '&a¿Necesitas vender algo?' + - '&aDale click derecho para activar' + - '&o bien grita ¡Oh, Tooddles!' +summon_wolf_scroll: + name: '&6Pergamino de Invocación de Lobo' + lore: + - '&aInvoca un buen chico' + - '&a¡Te ayudará atacando a mobs de élite!' + - '&a¡Asegúrate de acariciarle!' +super_mite_drop_charm: + name: '&dMite Pearl' + lore: + - '&dWas it worth it...' +air_ship_air_buccaneer_boots: + name: '&5Botas de Bucanero de Aire' + lore: + - '&dPerfecto para ataques aéreos!' +air_ship_air_buccaneer_chestplate: + name: '&5Pechera de Bucanero de Aire' + lore: + - '&dPerfecto para ataques aéreos!' +air_ship_air_buccaneer_helmet: + name: '&5Casco de Bucanero de Aire' + lore: + - '&dPerfecto para ataques aéreos!' +air_ship_air_buccaneer_leggings: + name: '&5Pantalón de Bucanero de Aire' + lore: + - '&dPerfecto para ataques aéreos!' +air_ship_air_pirates_boots: + name: '&5Botas de Pirata de Aire' + lore: + - '&dPerfecto para ataques aéreos!' +air_ship_air_pirates_chestplate: + name: '&5Pechera de Pirata de Aire' + lore: + - '&dPerfecto para ataques aéreos!' +air_ship_air_pirates_helmet: + name: '&5Casco de Pirata de Aire' + lore: + - '&dPerfecto para ataques aéreos!' +air_ship_air_pirates_leggings: + name: '&5Pantalón de Pirata de Aire' + lore: + - '&dPerfecto para ataques aéreos!' +air_ship_bowsmans_bow: + name: '&2Arco de Arquero' + lore: + - '&aSoltado por el difunto' + - '&aarquero de aeronave!' +air_ship_cannon_powder: + name: '&cPólvo de cañón' + lore: + - '&8Cómo más se supone que' + - '&8Enciendas la mecha?' +air_ship_daveys_digger: + name: '&4Cavador de Davey' + lore: + - '&cDavey no desea ser oprimido' + - '&cLos tontos mostrando su cavador.' +air_ship_quartermasters_whip: + name: '&fLátigo del Oficial de Intendencia' + lore: + - '&7El Oficial de Intendencia tiene un ' + - '&7Programa que mantener.' +air_ship_wayfinders_windlass: + name: '&3Torno Buscador de Caminos' + lore: + - '&bUsado para guiar naves' + - '&bsin nada más que las estrellas!' +pirate_ship_sea_feast: + name: '&6Fiesta del mar' + lore: + - '&6Una fiesta para los ojos' + - '&6y la barra de salud!' +pirate_ship_sea_ration: + name: '&eRación del mar' + lore: + - 'Una manzana al día' + - '&eMantiene el escorbuto lejos' + - '&cNota: no lo hace' +catacombs_tier_10_miniboss_boots: + name: '&9Botas de tejido de araña' + lore: + - '&5¡Tan ligero como el aire!' +catacombs_tier_10_miniboss_spider_eye: + name: '&7El ojo de Terragog' + lore: + - '&7Susurros de la nada alcanzan' + - '&7tus oídos mientras sostienes esto...' +catacombs_tier_15_boss_bone: + name: El Selector + lore: + - '&fTienes un hueso para elegir!' +catacombs_tier_15_boss_bow: + name: '&6El Agitador de Huesos' + lore: + - '&fEllos sentirán esto hasta' + - '&fSus huesos!' +catacombs_tier_15_boss_shovel: + name: '&8Cavador de Tumba' + lore: + - '&fEllos sentirán esto hasta' + - '&fSus huesos!' +catacombs_tier_15_mimic_boss_shield: + name: '&3Escudo del Templario perdido' + lore: + - Encontrado en un cofre misterioso en un + - cuarto secreto de las catacumbas antiguas... +colosseum_pit_breaker: + name: '&4Destrozador del Foso' + lore: + - '&4Veni' +colosseum_pit_filler: + name: '&4&lRellenador del Foso' + lore: + - '&4Vici' +colosseum_pit_maker: + name: '&4&lFabricante del Foso' + lore: + - '&4Vidi' +dark_cathedral_tier_75_sword: + name: '&0Espada Maldita' + lore: + - '&0&kChtulhu es el único Dios verdadero.' + - '&0&kEste mundo no es más que un cordero' + - '&0&ka la matanza' +darkspire_arzags_boots: + name: '&8Botas de guerra de Arzag' + lore: + - '&7¡Una vez utilizado por el poderoso Arzag!' +darkspire_arzags_chestplate: + name: '&8Peto de guerra de Arzag' + lore: + - '&7¡Una vez utilizado por el poderoso Arzag!' +darkspire_arzags_helmet: + name: '&8Casco de guerra de Arzag' + lore: + - '&7¡Una vez utilizado por el poderoso Arzag!' +darkspire_arzags_leggings: + name: '&8Pantalones de guerra de Arzag' + lore: + - '&7¡Una vez utilizado por el poderoso Arzag!' +darkspire_arzags_slicer: + name: '&8Cortador de Arzag' + lore: + - '&7¡Una vez utilizado por el poderoso Arzag!' +darkspire_crypt_keepers_boots: + name: '&4Botas del guardián de la cripta' + lore: + - '&cAntiguamente las botas de los' + - '&cGuardián de la cripta corrupto!' +darkspire_hellraisers_battle_armor: + name: '&4Armadura de batalla de Eerbix' + lore: + - '&cAnteriormente la batalla' + - '&carmadura del atroz' + - '&cEerbix El Caído!' +darkspire_maalkvs_bow: + name: '&4Arco de Maalkv' + lore: + - '&cAnteriormente el arco de' + - '&ctravieso Maalkv!' +darkspire_netherite_axe: + name: '&8Eviscerador del Vacío' + lore: + - '&8Fragmentos del vacío mismo fueron' + - '&8recogidos para formar la cabeza' + - '&8partida de esta arma antigua.' +darkspire_nicolas_ribcages_helmet: + name: '&4Casco de Nicolas Ribcage' + lore: + - '&cAnteriormente el casco del' + - '&cvil Nicolas Ribcage!' +darkspire_oroxaks_sword: + name: '&4Espada de Oroxak' + lore: + - '&cAnteriormente la espada del' + - '&ccodicioso Oroxak!' +darkspire_zalmurs_leggings: + name: '&4Pantalones de Zalmur' + lore: + - '&cAnteriormente los pantalones del' + - '&celoso Zalmur' + - '&cEl Asesino de Diablillos!' +the_feller: + name: '&2El Talador' + lore: + - '&aIncluso en tus sueños,' + - '&apuedes sentir el filo' + - '&adel hacha' +the_great_weaver_drop_charm: + name: '&cWeavers Silk' + lore: + - '&cGreat power is imbued into this silk.' +hallosseum_amazing_treat: + name: '&a¡Trato asombroso!' + lore: + - '&e¡Un snack increíble!' +hallosseum_axe_of_beheadings: + name: '&cHacha de las Decapitaciones' + lore: + - '&4Famosamente usado para decapitar a' + - '&4cierto jinete sin cabeza!' +hallosseum_incredible_treat: + name: '&aTrato Increíble!' + lore: + - '&e¡Un snack increíble!' +hallosseum_treat: + name: '&a¡Trato!' + lore: + - '&e¡Un delicioso snack!' +hallosseum_treat_v2: + name: '&a¡Trato!' + lore: + - '&e¡Un delicioso snack!' +the_hunter_drop_crossbow: + name: '&aHunter''s Friend' + lore: + - '&aLet the hunt begin.' +northpole_amazing_treat: + name: '&a¡Trato asombroso!' + lore: + - '&e¡Un snack increíble!' +northpole_coalbringer: + name: '&8Trae Carbón' + lore: + - '&cSea lo que toque' + - '&cComienza a derretirse en mi agarre.' + - '&cSoy demasiado!' +northpole_frostcaster: + name: '&bEscarchador' + lore: + - '&cSea lo que toque' + - '&cSe convierte en nieve en mi agarre!' + - '&cSoy demasiado' +northpole_incredible_treat: + name: '&aTrato Increíble!' + lore: + - '&e¡Un snack increíble!' +northpole_naughty_lister: + name: '&4El Travieso Lister' + lore: + - '&cToma nombres. ¡No lo pregunta dos veces!' + - '&cHas sido travieso este año?' +northpole_treat: + name: '&a¡Trato!' + lore: + - '&e¡Un delicioso snack!' +northpole_treat_v2: + name: '&a¡Trato!' + lore: + - '&e¡Un delicioso snack!' +the_phantom_drop_chestplate: + name: '&dPhantom Gambison' + lore: + - '&dYou would say it is made out of soft' + - '&dand comfy fibrous cloth, but a blade' + - '&dwould not recoil from striking cloth.' +pirate_ship_tier_15_boots: + name: Arenas piratas + lore: + - '¡Hace que quieras' + - ir a la playa! +pirate_ship_tier_15_bow: + name: '¡Arco corto de pirata' + lore: + - Perfecto para abordar fiestas! +pirate_ship_tier_15_chestplate: + name: Camisa pirata + lore: + - Sin zapatos, sin camisa + - '¡No hay problema!' +pirate_ship_tier_15_helmet: + name: Bandana pirata + lore: + - Sin zapatos, sin camisa + - '¡No hay problema!' +pirate_ship_tier_15_leggings: + name: Faja de Pirata + lore: + - '¡Esto podría usar un lavado!' +pirate_ship_tier_15_sword: + name: Pirata Marlinspike + lore: + - '¡Ruidoso y mortal!' +pirate_ship_tier_20_miniboss_axe: + name: '&5Tenderizador de Cookie' + lore: + - '&5Sentirás eso mañana!' +pirate_ship_tier_20_miniboss_chestplate: + name: '&5Delantal de Cookie' + lore: + - '&5Ha visto mejores días!' +pirate_ship_tier_25_boots: + name: '&aZapatos de pirata' + lore: + - '&aPerfecto para robar!' +pirate_ship_tier_25_bow: + name: '&aMosquete de pirata' + lore: + - '&aCuidado donde lo señalas!' +pirate_ship_tier_25_chestplate: + name: '&aVesto de pirata' + lore: + - '&aProbablemente obtenido ilegalmente!' +pirate_ship_tier_25_helmet: + name: '&aAretes de pirata' + lore: + - '&aVale suficiente para pagar' + - '&aUn funeral!' +pirate_ship_tier_25_leggings: + name: '&aPantalones de pirata' + lore: + - '&a¡Lleno de monedas de oro!' +pirate_ship_tier_25_miniboss_helmet: + name: '&5Parche de ojo de Helmsman' + lore: + - '&5¿! Cómo puedes ver mejor' + - '&5con esto puesto!?' +pirate_ship_tier_25_miniboss_trident: + name: '&5Tridente de Helmsman' + lore: + - '&5¡Fin puntiagudo hacia el enemigo!' +pirate_ship_tier_25_sword: + name: '&aAlfanje de pirata' + lore: + - '&a¡Verdaderamente pirata!' +pirate_ship_tier_30_miniboss_axe: + name: '&5Cuchilla de Crushy' + lore: + - '&5¡Retrocede!' +pirate_ship_tier_30_miniboss_shield: + name: '&5Hombro de Crushy' + lore: + - '&5Nunca salteó el día del hombro!' +pirate_ship_tier_35_boots: + name: '&4Botas de Pirata' + lore: + - '&9Perfecto para peleas de espada!' +pirate_ship_tier_35_bow: + name: '&9Cañón de mano pirata' + lore: + - '&9Explótalos lejos!' +pirate_ship_tier_35_chestplate: + name: '&9Correas de pirata' + lore: + - '&9Perfecto para robar!' +pirate_ship_tier_35_helmet: + name: '&9Parche de ojo de pirata' + lore: + - '&9No es perfecto para ver!' +pirate_ship_tier_35_leggings: + name: '&9Grebas de pirata' + lore: + - '&9Perfecto para robar!' +pirate_ship_tier_35_miniboss_boots: + name: '&9Botas de guardaespaldas' + lore: + - '&5Para aquellos que tienen algo que defender!' +pirate_ship_tier_35_miniboss_chestplate: + name: '&5Correas del guardaespaldas' + lore: + - '&5Para aquellos que tienen algo que defender!' +pirate_ship_tier_35_miniboss_crossbow: + name: '&5Cañón de mano del guardaespaldas' + lore: + - '&5Para aquellos que tienen algo que defender!' +pirate_ship_tier_35_miniboss_helmet: + name: '&5Parche de ojo del guardaespaldas' + lore: + - '&5Para aquellos que tienen algo que defender!' +pirate_ship_tier_35_miniboss_leggings: + name: '&5Grebas del guardaespaldas' + lore: + - '&5Para aquellos que tienen algo que defender!' +pirate_ship_tier_35_miniboss_sword: + name: '&5Alfanje del guardaespaldas' + lore: + - '&5¡Para los que tienen algo que defender!' +pirate_ship_tier_35_sword: + name: '&9Alfanje del pirata' + lore: + - '&9¡Verdaderamente pirata!' +pirate_ship_tier_40_miniboss_crossbow: + name: '&5El Trabuco' + lore: + - '&5Rociar y orar!' +pirate_ship_tier_40_miniboss_leggings: + name: '&5Los Zaggers' + lore: + - '&5¡Cuando piensen que estás pasando!' + - '&5aPara hacer zig, zag en ellos!' +pirate_ship_tier_45_boss_helmet: + name: '&5Parche de ojo del capitán' + lore: + - '&5No veo ningun problema!' +pirate_ship_tier_45_boss_sword: + name: '&5Cimitarra del Capitán' + lore: + - '&5En garde, ratas con escorbuto!' +the_ruins_boss_loot: + name: '&6Hacha de Thor' + lore: + - Solo el puro del corazón + - puede usar esta hacha. +sewer_drowned_kings_boots: + name: '&4Botas del Rey Ahogado' + lore: + - '&cAnteriormente las botas del' + - '&cDiabólico Rey Ahogado!' +sewer_drowned_kings_chestplate: + name: '&4Pechera del Rey Ahogado' + lore: + - '&cAnteriormente la pechera del' + - '&cDiabólico Rey Ahogado!' +sewer_drowned_kings_crown: + name: '&4Corona del Rey Ahogado' + lore: + - '&cAnteriormente la corona del' + - '&cDiabólico Rey Ahogado!' +sewer_drowned_kings_leggings: + name: '&4Pantalones del Rey Ahogado' + lore: + - '&cAnteriormente los pantalones del' + - '&cDiabólico Rey Ahogado!' +sewer_drowned_kings_trident: + name: '&4Tridente del Rey Ahogado' + lore: + - '&cAnteriormente el tridente del' + - '&cDiabólico Rey Ahogado!' +sewer_spelunkers_boots: + name: '&2Botas del espeleólogo de las alcantarillas' + lore: + - '&aLa alcantarilla emergente' + - '&a¡Botas esenciales del explorador!' +sewer_spelunkers_chestplate: + name: '&2Peto del espeleólogo de las alcantarillas' + lore: + - '&aLa alcantarilla emergente' + - '&a¡Pechera esencial del explorador!' +sewer_spelunkers_helmet: + name: '&2Casco del espeleólogo de las alcantarillas' + lore: + - '&aLa alcantarilla emergente' + - '&a¡Casco esencial del explorador!' +sewer_spelunkers_leggings: + name: '&2Pantalones del espeleólogo de las alcantarillas' + lore: + - '&aLa alcantarilla emergente' + - '&a¡Pantalones esenciales del explorador!' +sewer_spelunkers_sword: + name: '&2Espada del espeleólogo de las alcantarillas' + lore: + - '&aLa alcantarilla emergente' + - '&aEspada esencial del explorador!' +the_stinger: + name: '&eEl Aguijón' + lore: + - '&a¡Vuela como una mariposa,' + - '&apica como una abeja!' +tree_defender_drop_shield: + name: '&7Living Wood Shield' + lore: + - '&7This shield will' + - '&7slowly repair itself.' +unbind_scroll: + name: '&5Pergamino de Desvinculación' + lore: + - '&5¡Permite a los usuarios desvincular un' + - '&5objeto vinculado al alma en un yunque!' + - '&5¡Usalo Sabiamente!' +undead_farmer_drop_shovel: + name: '&8Manure Master' + lore: + - '&8Perfect for shoveling pig manure.' +unwanted_visitor_drop_bow: + name: '&1Frost Bow' + lore: + - '&9Makes you wanna chill' + - '&9and snipe from afar.' +vampire_manor_gargoyle_granulator: + name: '&8Granulador de Gárgolas' + lore: + - '&cLigeramente mezclado en ajo.' +vampire_manor_stake_your_claim: + name: '&4Reclama tu reclamo' + lore: + - '&cLigeramente mezclado en ajo.' +vampiric_charm: + name: '&bTalismán de Vampiro' + lore: + - '&aNadie puede recordar de donde' + - '&avino este talismán, aun así' + - '&anadie puede olvidar lo peligroso es...' +veterans_boots: + name: '&6Botas de Veterano' + lore: + - '&2Otorgado a aquellos que desafíen el' + - '&2¡Arena Liga de Madera!' +veterans_chestplate: + name: '&6Pechera de Veterano' + lore: + - '&2Otorgado a aquellos que desafíen el' + - '&2¡Arena Liga de Madera!' +veterans_helmet: + name: '&6Casco de Veterano' + lore: + - '&2Otorgado a aquellos que desafíen el' + - '&2¡Arena Liga de Madera!' +veterans_leggings: + name: '&6Pantalones de Veterano' + lore: + - '&2Otorgado a aquellos que desafíen el' + - '&2¡Arena Liga de Madera!' +veterans_sword: + name: '&6Espada de Veterano' + lore: + - '&2Otorgado a aquellos que desafíen el' + - '&2¡Arena Liga de Madera!' +vex_top_drop_boots: + name: '&bVexed Boots' + lore: + - '&bWith mighty boots' + - '&bcomes mighty strength.' +warlock_drop_chestplate: + name: '&dWarlock Robes' + lore: + - '&dOffers good protection from spells.' +warlock_drop_helmet: + name: '&dWarlock Hood' + lore: + - '&dOffers good protection from spells.' +water_pest_drop_shield: + name: '&bWater Logged Shield' + lore: + - '&bIt''s pretty sturdy actually.' +wendigo_drop_sword: + name: '&8Blade of Starving' + lore: + - '&8This blade will always' + - '&8hunger for more blood.' +werehare_drop_charm: + name: '&eWerehare Trophy' + lore: + - '&eLuck and health to' + - 'ðose who carry it.' +werewolf_bone: + name: '&6Hueso de hombre-lobo' + lore: + - '&aHabiendo matado el alfa,' + - '&aesto te hace temporalmente!' + - '&ael nuevo líder de los lobos' +wolfsbane: + name: '&7Perdición de los lobos' + lore: + - '&aHecho de los restos de' + - '&aUn hombre-lobo alfa, todos' + - '&alos lobos se acobardan al verlo.' +yeti_drop_leggings: + name: '&eFur Leggings' + lore: + - '&eNice and warm.' +yezhi_baba_drop_boots: + name: '&aWitches Robes' + lore: + - '&aThe smell should go' + - '&aaway eventually.' +zombie_kings_axe: + name: '&4Hacha del Rey Zombie' + lore: + - El hacha de aquel que los Zombies + - llaman a su rey. + - La sed de sangre es palpable. +airship_minidungeon: + name: '&6El Dirigible' + customInfo: + - '&f¡Una asombrosa aeronave llena de piratas no muertos!' + - '&6Créditos: MagmaGuy, 69OzCanOfBepis' + - '&6y Reino de Lotheridon' + playerInfo: |- + Dificultad: &6Medio + $bossCount bosses, desde nivel $lowestTier hasta $highestTier + &6¡Una aeronave llena de piratas no muertos, + &6solo para jugadores experimentados! + regionEnterMessage: '&8[EM] &c¡Entrando en una zona aérea hostil!' + regionLeaveMessage: '&8[EM] &c¡Saliendo de una zona aérea hostil!' +binder_of_worlds_lair: + name: '&5El unificador de mundos' + customInfo: + - '&5El desafío final. ¡Prepárate!' + - '&6Creditos: MagmaGuy y 69OzCanOfBepis' + playerInfo: |- + Dificultad: &6Pesadilla + Nivel $bossCount $highestTier boss final! + &5¡Esta es la pelea más dura en EliteMobs! + regionEnterMessage: '&8[EM] &5La realidad se desintegra a tu alrededor. Te enfrentas al desafío final. &4¡No estás preparado!' + regionLeaveMessage: '&8[EM] &5Has desentrañando los mundos. ¿Has encontrado lo que buscas? ¿Valió la pena?' +catacombs_lair: + name: '&8Las Catacumbas' + customInfo: + - '&f¡La mejor mazmorra inicial para los jugadores!' + - '&6Créditos: Realm of Lotheridon' + playerInfo: |- + Dificultad: &cDifícil + $bossCount bosses, desde el nivel $lowestTier hasta $highestTier + &2¡El mejor desafío para los jugadores principiantes! + regionEnterMessage: '&8[EM] &8Entrando en las Catacumbas. Ten cuidado con lo que habita abajo...' + regionLeaveMessage: '&8[EM] &8Has dejado las catacumbas. ¿Valió la pena?' +colosseum_lair: + name: '&6El Coliseo' + customInfo: + - '&fCon el primer verdadero boss mundial, la primera' + - '&fbatalla multifásica, primer jefe montado,' + - '&fprimer jefe camuflado... una lucha verdaderamente épica!' + - '&6Creditos: MagmaGuy Y Maldini' + playerInfo: |- + Dificultad: &cHard + $bossCount jefes, del nivel $lowestTier a $highestTier + &c¡Un verdadero desafío para grandes grupos de jugadores! + regionEnterMessage: '&8[EM] &6¡Campeones y desafiantes prepárense! &e ¡Muestra tu valor contra los enemigos más poderosos!' + regionLeaveMessage: '&8[EM] &6¡Adiós viajero! &e¡Vuelve pronto para mostrar tu poderío una vez más!' +dark_cathedral_lair: + name: '&8La Catedral Oscura' + customInfo: + - '&f¡La primera Guarida EliteMobs!' + - '&f¡Un clásico que todos los servidores necesitan!' + - '&6Creditos: MagmaGuy y 69OzCanOfBepis' + playerInfo: |- + Dificultad: &cDifícil + $bossCount nivel $highestTier ¡Gran Boss! + &cLa mini-mazmorra original, es un desafío para + &cun pequeño grupo de jugadores o para veteranos! + regionEnterMessage: '&8[EM] &8Bienvenido a la Catedral Oscura. &4La muerte espera dentro...' + regionLeaveMessage: '&8[EM] &8Saliendo de la Catedral Oscura. &4Esperamos su regreso...' +dark_spire_minidungeon: + name: '&8La Aguja Oscura' + customInfo: + - '&fEl primer contenido de alto nivel!' + - '&fHecho para aquellos que quieren un verdadero desafío!' + - '&6Creditos: 69OzCanOfBepis' + playerInfo: |- + Dificultad: &6Media + $bossCount jefes, del nivel $lowestTier a $highestTier + &c¡Un gran desafío para los jugadores avanzados! + regionEnterMessage: '&8[EM] &1Una invasión está en curso. &9¡Detengan la insurrección!' + regionLeaveMessage: '&8[EM] &1Has logrado contenerlos. &9Por ahora...' +fireworks_lair: + name: '&aFuegos artificiales' + customInfo: + - '&f¡El mapa del 4 de julio de 2021!' + - '&6Créditos: MagmaGuy' + playerInfo: |- + Dificultad: &cDificil + ¡$bossCount gran jefe de nivel $lowestTier! + &6¡Un encuentro lleno de explosiones! + regionEnterMessage: '&8[EM] &e¡Bienvenidos al espectáculo de fuegos artificiales!' + regionLeaveMessage: '&8[EM] &e¡Te has ido de la fiesta!' +frost_palace_sanctum: + name: Frost Palace + customInfo: + - '&fA 7 phase fight against' + - the queen of ice! + - '&6Credits: MagmaGuy, Delio' + playerInfo: 'Difficulty: &45-man hard content!' + regionEnterMessage: '&bYou are stepping into the Frost Palace! Stay frosty!' + regionLeaveMessage: '&bYou have left the Frost Palace!' +hallosseum_lair: + name: '&cHallosseum' + customInfo: + - '&f¡El espeluznante encuentro del Halloween de 2020!' + - '&6Creditos: MagmaGuy y 69OzCanOfBepis' + playerInfo: |- + Dificultad: &cDificil + ¡$bossCount gran jefe de nivel $lowestTier! + &6¡Un divertido desafío de Halloween! + regionEnterMessage: '&8[EM] &4¡Truco o trato! &8¡Tu alma es mía!' + regionLeaveMessage: '&8[EM] &4Has escapado con tu alma intacta.' +invasion_minidungeon: + name: '&2La Invasión' + customInfo: + - '&f¡La Minidungeon de Halloween!' + - '&6Creditos: MagmaGuy y 69OzCanOfBepis' + playerInfo: |- + Dificultad: &6Media + $bossCount aliens, desde el nivel $lowestTier al $highestTier + &6¡No te dejes abducir! + regionEnterMessage: '&8[EM] &7¡Invasión alienígena en progreso! ¡Derrota a la nave nodriza!' + regionLeaveMessage: '&8[EM] &7¡Has escapado los secuestros de alienígenas! Nadie te creerá jamás.' +north_pole_minidungeon: + name: '&9El Polo Norte' + customInfo: + - '&f¡La Mini-mazmorra de Navidad!' + - '&6Creditos: MagmaGuy y 69OzCanOfBepis' + playerInfo: |- + Dificultad: &6Medio + $bossCount bosses desde el nivel $lowestTier hasta $highestTier + &6¡La navidad en un globo de nieve! + regionEnterMessage: '&8[EM] &7¡Has llegado al Polo Norte! &f¿Has sido malo este año?' + regionLeaveMessage: '&8[EM] &7Vuelve y visita. &f¡Hay muchos dulces y golosinas para la próxima vez!' +oasis_adventure: + name: '&6El Oasis' + customInfo: + - '&f¡Una aventura masiva para principiantes!' + - '&6Creditos: 69OzCanOfBepis' + playerInfo: |- + Dificultad: &2Soleable + $bossCount jefes, del nivel $lowestTier a $highestTier + &6¡Una gran aventura para las personas que lo conocen a fondo! + regionEnterMessage: '&8[EM] &6¡Has llegado al Oasis!' + regionLeaveMessage: '&8[EM] &6¡Has salido del Oasis!' +pirate_ship_minidungeon: + name: '&6El Barco Pirata' + customInfo: + - '&f¡Una mini-mazmorra divertida y desafiante llena de' + - '&fbosses hechos para los jugadores que están empezando a ser buenos,' + - '&fen EliteMobs!' + - '&6Creditos: MagmaGuy Y Realm of Lotheridon' + playerInfo: |- + Dificultad: &6Medio + $bossCount bosses desde el nivel $lowestTier hasta $highestTier + &6¡Uno de los mejores cotos de caza para aventureros aspirantes! + regionEnterMessage: '&8[EM] &3¡Abordando el barco pirata! &b¡Saquea y saquea hasta la saciedad!' + regionLeaveMessage: '&8[EM] &3¡Jugador por la borda! &b¡Regresa cuando te puedas mantener en pie, marinero de agua dulce!' +primis_adventure: + name: '&7Primis' + customInfo: + - '&fA Tutorial Para Nuevos Jugadores!' + - '&6Créditos: 69OzCanOfBepis, MagmaGuy' + playerInfo: |- + Dificultad: &2Fácil + $bossCount jefes, desde nivel $lowestTier hasta $highestTier + &6A aventura tutorial para nuevos jugadores! + regionEnterMessage: '&8[EM] &6Primis espera, ¡golpea la tierra!' + regionLeaveMessage: '&8[EM] &6Has Abandonado Primis!' +sewers_minidungeon: + name: 'las Alcantarillas' + customInfo: + - '&f¡La mini-mazmorra más grande jamás creada!' + - '&6Creditos: MagmaGuy y 69OzCanOfBepis' + playerInfo: |- + Dificultad: &6Medio + $bossCount bosses de nivel $lowestTier hastaa $highestTier + &6¡Un complejo laberinto de mazmorras con secciones desafiantes! + regionEnterMessage: '&8[EM] &5Este lugar parece abandonado... &d¡Y sin embargo, algo acecha en las alcantarillas!' + regionLeaveMessage: '&8[EM] &5Te las arreglaste para mantenerte a flote. &dQuizás la próxima vez te ahogues.' +the_ruins: + name: '&6Las Ruinas' + customInfo: + - '&fUna pelea contra un mito de' + - '&fMitología nórdica, prepárate para un castigo!' + - '&6Créditos: 69OzCanOfBepis, MagmaGuy' + playerInfo: |- + Dificultad: &cDifícil + $bossCount nivel $lowestTier Jefe Grande! + &cUna pelea dura contra un Dios nórdico! + regionEnterMessage: '&8[EM] &3¡Aquellos que desafían los mitos deben estar preparados para su derrumbamiento!' + regionLeaveMessage: '&8[EM] &3¡Ahora sabes lo que se necesita para hacer una leyenda!' +vampire_manor: + name: '&cLa Mansión del Vampiro' + customInfo: + - '&f¡Prepárate para derramar sangre!' + - '&6Créditos: MagmaGuy, 69OzCanOfBepis' + playerInfo: |- + Dificultad: &6Media + $bossCount jefes, desde nivel $lowestTier a $highestTier + &6¡Una mansión mortal llena de criaturas sedientas de sangre! + &6¿Estás listo para enfrentarte a lo que persigue la noche? + regionEnterMessage: '&8[EM] &c¡¡Traspasando por tierras peligrosas!!' + regionLeaveMessage: '&8[EM] &c¡Ahora saliendo de la tierra embrujada!' +alpha_werewolf_p1: + name: '$eventBossLevel &7Vindicador Enfurecido' + deathMessages: + - '&e&l---------------------------------------------' + - '&4¡El lobo alfa ha sido sacrificado!' + - '&c&l 1er Dañador: ¡$damager1name &ccon $damager1damage daño!' + - '&6&l 2do Dañador: ¡$damager2name &6con $damager2damage daño!' + - '&e&l 3er Dañador: ¡$damager3name &econ $damager3damage de daño!' + - '&aAsesinos: $players' + - '&e&l---------------------------------------------' + locationMessage: '&7Vindicador enfurecido: ¡$distance bloques de distancia!' + spawnMessage: '&c¡Se escuchan los aullidos de un Hombre-Lobo Alfa!' + deathMessage: '&a¡El Hombre-Lobo Alfa ha sido detenido por $players!' + escapeMessage: '&4El alba acaba, el Lobo del Alfa desaparece sin dejar rastro!' +alpha_werewolf_p2: + name: '$eventBossLevel &7Hombre-Lobo Alfa' + deathMessages: + - '&e&l---------------------------------------------' + - '&4¡El lobo alfa ha sido sacrificado!' + - '&c&l 1er Dañador: ¡$damager1name &ccon $damager1damage daño!' + - '&6&l 2do Dañador: ¡$damager2name &6con $damager2damage daño!' + - '&e&l 3er Dañador: ¡$damager3name &econ $damager3damage de daño!' + - '&aAsesinos: $players' + - '&e&l---------------------------------------------' + locationMessage: '&7Lobo Alfa: ¡$distance bloques de distancia!' + spawnMessage: '&c¡Se escuchan los aullidos de un Hombre-Lobo Alfa!' + deathMessage: '&a¡El Hombre-Lobo Alfa ha sido detenido por $players!' + escapeMessage: '&4¡El alba acaba, el Lobo del Alfa desaparece sin dejar rastro!' +ancient_corpse: + name: '$eventBossLevel &eAncient Corpse' +animated_armor: + name: '$eventBossLevel &8Animated Armor' + locationMessage: '&cAnimated Armor: $distance blocks away!' + spawnMessage: '&cOh no! An Animated Armor has escape from it''s armor stand!' + deathMessage: '&aThe Animated Armor was stopped by $players!' + escapeMessage: '&4The Animated Armor is gone!' +arachnid_matriarch: + name: '$eventBossLevel &cArachnid Matriarch' + locationMessage: '&cArachnid Matriarch: $distance blocks away!' + spawnMessage: '&cA Matriarch has come to spread her brood across the land!' + deathMessage: '&aThe Matriarch and her brood were stopped by $players!' + escapeMessage: '&4The Matriarch has left!' +arachnid_matriarch_summon: + name: '$eventBossLevel &4Broodling' +armor_goblin: + name: '$eventBossLevel &3Goblin con Armadura' + deathMessages: + - '&e&l---------------------------------------------' + - '&e¡El Duende Con Armadura ha sido saqueado!' + - '&c&l 1er Dañador: ¡$damager1name &ccon $damager1damage daño!' + - '&6&l 2do Dañador: ¡$damager2name &6con $damager2damage daño!' + - '&e&l 3er Dañador: ¡$damager3name &econ $damager3damage de daño!' + - '&aAsesinos: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cDuende Con Armadura: ¡$distance bloques de distancia!' + spawnMessage: '&a¡Un Goblin Con Armadura ha sido avistado!' + deathMessage: '&a¡Un Duende con Armadura ha sido asesinado por $players!' + escapeMessage: '&4¡Un Duende Con Armadura ha escapado!' +baba_rhoga: + name: '$eventBossLevel &cBaba Rhoga' + locationMessage: '&cBaba Rhoga: $distance blocks away!' + spawnMessage: '&cA wicked hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +baba_rhoga_summon: + name: '$reinforcementLevel &4Baba Rhoga' +baba_yaga: + name: '$eventBossLevel &cBaba Yaga' + locationMessage: '&cBaba Yaga: $distance blocks away!' + spawnMessage: '&cA wicked hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +baba_yaga_summon: + name: '$reinforcementLevel &4Baba Yaga' +balloon_rider: + name: '$eventBossLevel &dBalloon Rider' + locationMessage: '&cBalloon Rider: $distance blocks away!' + spawnMessage: '&cA brave Balloon Rider has come to the Nether!' + deathMessage: '&aThe Balloon Rider has taken his last ride thanks to $players!' + escapeMessage: '&4The Balloon Rider has floated away!' +balloon_rider_mount: + name: '$eventBossLevel &5Ghastly Balloon' +balrog: + name: '&4Balrog $eventBossLevel' +banshee: + name: '$eventBossLevel &cBanshee' + locationMessage: '&cBanshee: $distance blocks away!' + spawnMessage: '&cA Banshee''s wail can be heard!' + deathMessage: '&aThe Banshee was silenced by $players!' + escapeMessage: '&4The Banshee has left!' +banshee_summon: + name: '$eventBossLevel &cGrief' +beast_master: + name: '$eventBossLevel &6Maestro de Bestias' + deathMessages: + - '&e&l---------------------------------------------' + - '&e¡El Maestro de Bestias ha sido atacado salvajemente!' + - '&c&l 1er Dañador: ¡$damager1name &ccon $damager1damage daño!' + - '&6&l 2do Dañador: ¡$damager2name &6con $damager2damage daño!' + - '&e&l 3er Dañador: ¡$damager3name &econ $damager3damage de daño!' + - '&aAsesinos: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cMaestro de Bestias: ¡$distance bloques de distancia!' + spawnMessage: '&c¡El Maestro de Bestias ha sido avistado!' + deathMessage: '&a¡El maestro de Bestias ha sido asesinado por $players!' + escapeMessage: '&4¡El Maestro de Bestias ha retornado a la naturaleza!' +beast_tamer: + name: '$eventBossLevel &eBeast Tamer' + locationMessage: '&cBeast Tamer: $distance blocks away!' + spawnMessage: '&c¡Un maestro de bestias vaga por el mundo!' + deathMessage: '&aThe Beast Tamer was stopped by $players!' + escapeMessage: '&4The Beast Tamer has left!' +beast_tamer_summon: + name: '$eventBossLevel &6Large Beast' +beast_tamer_summon_1: + name: '$eventBossLevel &6Beast' +beta_wolf: + name: '$reinforcementLevel &7Lobo Beta' +bigfoot: + name: '$eventBossLevel &fBigfoot' + locationMessage: '&cBigfoot: $distance blocks away!' + spawnMessage: '&cA mighty beast has appeared!' + deathMessage: '&aThe beast is no more thanks to $players!.' + escapeMessage: '&4The beast has escaped!' +big_bad_wolf: + name: '$eventBossLevel &fBig Bad Wolf' + locationMessage: '&cBig Bad Wolf: $distance blocks away!' + spawnMessage: '&cAnd he huffed and he puffed!' + deathMessage: '&aThe little piggies are now safe thanks to $players!' + escapeMessage: '&4The Big Bad Wolf has left!' +binder_of_worlds_phase_1_endermite_reinforcement: + name: '&5Corruptor de la Realidad $reinforcementLevel' +binder_of_worlds_phase_3_enderman_reinforcement: + name: '&5Asesino de la Realidad $reinforcementLevel' +binder_of_worlds_phase_3_ghast_reinforcement: + name: '&5Triturador de la Realidad $reinforcementLevel' +blayyze: + name: '&6Blayyze $eventBossLevel' + deathMessages: + - '&e&l---------------------------------------------' + - '&6¡El Blayyze ha sido repelido!' + - '&c&l 1er Dañador: ¡$damager1name &ccon $damager1damage daño!' + - '&6&l 2do Dañador: ¡$damager2name &6con $damager2damage daño!' + - '&e&l 3er Dañador: ¡$damager3name &econ $damager3damage de daño!' + - '&aAsesinos: $players' + - '&e&l---------------------------------------------' + locationMessage: '&6????: $distance bloques de distancia' + spawnMessage: '&cAlgo salió del cráter del meteorito...' + deathMessage: '&6$players completaron el primer contacto.' + escapeMessage: '&6Los aliens han sido llevados al area 51!' +bloated_jeffrey: + name: '$eventBossLevel &dBloated Jeffrey' + locationMessage: '&cBloated Jeffrey: $distance blocks away!' + spawnMessage: '&cIt''s Jeffrey! They are in the nether! Bring a bow!' + deathMessage: '&aBloated Jeffrey has been slain by $players!' + escapeMessage: '&4Jeffrey and his friends grew bored and they left!' +bloated_jeffrey_summon: + name: '$eventBossLevel &dJeffrey''s Friend' +bone_fiend: + name: '$eventBossLevel &7Bone Fiend' + locationMessage: '&cBone Fiend: $distance blocks away!' + spawnMessage: '&cA creature of bone and bone has appeared!' + deathMessage: '&aThe Bone Fiend was defeated by $players!' + escapeMessage: '&4The Bone Fiend found no bone and left!' +bone_fiend_mount: + name: '$eventBossLevel &8Bone Carrier' +changeling: + name: '$eventBossLevel &4Changeling' + locationMessage: '&cChangeling: $distance blocks away!' + spawnMessage: '&cA shape-shifter has entered this world.' + deathMessage: '&aThe Changeling was stopped by $players!' + escapeMessage: '&4The Changeling has escaped!' +changeling_p2: + name: '$eventBossLevel &4Changeling' +changeling_p3: + name: '$eventBossLevel &4Changeling' +changeling_p4: + name: '$eventBossLevel &4Changeling' +changeling_p5: + name: '$eventBossLevel &4Changeling' +changeling_p6: + name: '$eventBossLevel &4Changeling' +changeling_p7: + name: '$eventBossLevel &4Changeling' +charms_goblin: + name: '$eventBossLevel &2Duende de Encantamientos' + deathMessages: + - '&e&l---------------------------------------------' + - '&e¡El Duende de Encantamientos ha sido saqueado!' + - '&c&l 1er Dañador: ¡$damager1name &ccon $damager1damage daño!' + - '&6&l 2do Dañador: ¡$damager2name &6con $damager2damage daño!' + - '&e&l 3er Dañador: ¡$damager3name &econ $damager3damage de daño!' + - '&aAsesinos: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cDuende de Encantamientos: ¡Está a $distance bloques de distancia!' + spawnMessage: '&c¡Un Duende de Encantamientos ha sido avistado!' + deathMessage: '&a¡Un Goblin de Encantamientos ha sido asesinado por $players!' + escapeMessage: '&c¡Un Goblin de Encantamientos ha escapado!' +circus_ringmaster: + name: '$eventBossLevel &dRingmaster' + locationMessage: '&cCircus Ringmaster: $distance blocks away!' + spawnMessage: '&cA terrible circus is in town!' + deathMessage: '&a$players has stopped the RIngmasters reign of abuse!' + escapeMessage: '&4The circus has left town!' +circus_ringmaster_summon: + name: '$eventBossLevel &5Tortured Animal' +circus_ringmaster_summon_1: + name: '$eventBossLevel &5Abused Clown' +circus_ringmaster_summon_2: + name: '$eventBossLevel &5Mistreated Balloon' +coins_goblin: + name: '$eventBossLevel &eGoblin de Monedas' + deathMessages: + - '&e&l---------------------------------------------' + - '&e¡El Goblin de Monedas ha sido saqueado!' + - '&c&l 1er Dañador: ¡$damager1name &ccon $damager1damage daño!' + - '&6&l 2do Dañador: ¡$damager2name &6con $damager2damage daño!' + - '&e&l 3er Dañador: ¡$damager3name &econ $damager3damage de daño!' + - '&aAsesinos: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cGoblin de Monedas: ¡$distance bloques de distancia!' + spawnMessage: '&c¡Un Goblin de Monedas ha sido avistado!' + deathMessage: '&a¡Un Goblin de Monedas ha sido asesinado por $players!' + escapeMessage: '&4¡Un Goblin de Monedas ha escapado!' +craftenmine_stacked_bones: + name: '$eventBossLevel &eArmed Skull' + locationMessage: '&cDr. Craftenmine''s Stacked Bones: $distance blocks away!' + spawnMessage: '&cA horrible Dr. Craftenmine creation is out in the wild!' + deathMessage: '&aThe horrible Stacked-Bones creation was slain by $players!' + escapeMessage: '&4Dr. Craftenmines horrible creation has escaped!' +craftenmine_stacked_bones_ankle: + name: '$eventBossLevel &6Armed Ankle' +craftenmine_stacked_bones_backbone: + name: '$eventBossLevel &6Armed Backbone' +craftenmine_stacked_bones_femur: + name: '$eventBossLevel &6Armed Femur' +craftenmine_stacked_bones_spine: + name: '$eventBossLevel &6Armed Spine' +craftenmine_terror: + name: '$eventBossLevel &cLobotimized Ghast' + locationMessage: '&cDr. Craftenmine''s Terror: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine creation is on the loose!' + deathMessage: '&aThe Lobotimized Ghast was slain by $players!' + escapeMessage: '&4The Lobotimized Ghast has left!' +craftenmine_terror_mount: + name: '$eventBossLevel &dGhast Carrier' +creeperpede_1: + name: '$eventBossLevel &5Creeperpede Observer' + locationMessage: '&cCreeperpede: $distance blocks away!' + spawnMessage: '&cA Dr. Craftenmine experiment is on the loose!' + deathMessage: '&aThe Creeperpede was stopped in its tracks by $players!.' + escapeMessage: '&4AThe Dr. Craftenmine experiment has managed to escape!' +creeperpede_2: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_3: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_4: + name: '$eventBossLevel &5Creeperpede Rider' +creeperpede_5: + name: '$eventBossLevel &5Creeperpede Carrier' +crone: + name: '$eventBossLevel &aOld Crone' + locationMessage: '&cOld Crone: $distance blocks away!' + spawnMessage: '&cAn Old Crone has wandered into this world!' + deathMessage: '&aThe Crone was vanquished by $players!.' + escapeMessage: '&4The Old Crone has left this world on her broom!' +crone_summon: + name: '$eventBossLevel &fPet Spider' +divine_cinder: + name: '$eventBossLevel &cDivine Cinder' + locationMessage: '&cDivine Cinder: $distance blocks away!' + spawnMessage: '&cA divine blaze has appeared!' + deathMessage: '&aThe Divine Cinder was defeated by $players!' + escapeMessage: '&4The Divine Cinder has smoked away!' +ember: + name: '&cÁscua $reinforcementLevel' +enders_1: + name: '$eventBossLevel &dEnderlad' + locationMessage: '&cEnder Clique: $distance blocks away!' + spawnMessage: '&cA group of ender troublemakers have appeared.' + deathMessage: '&aThe Ender Clique was stopped by $players!' + escapeMessage: '&4The Ender Clique have left!' +enders_2: + name: '$eventBossLevel &dEnderchap' + locationMessage: '&cClique Member: $distance blocks away!' +enders_3: + name: '$eventBossLevel &dEnderdude' + locationMessage: '&cClique Member: $distance blocks away!' +ender_lapin: + name: '$eventBossLevel &aEnder Lapin' +endless_pursuer: + name: '$eventBossLevel &dEndless Pursuer' + locationMessage: '&cEndless Pursuer: $distance blocks away!' + spawnMessage: '&cIt will not stop chasing...' + deathMessage: '&aThe chase has stopped thanks to $players!' + escapeMessage: '&4The Pursuer has vanished!' +enraged_snowman: + name: '$eventBossLevel &1Enraged Snowman' + locationMessage: '&cEnraged Snowman: $distance blocks away!' + spawnMessage: '&cAn angry Snowman was sighted!' + deathMessage: '&aThe Enraged Snowman was put to rest by $players!' + escapeMessage: '&4The Enraged Snowman has vanished!' +evil_undead: + name: '$eventBossLevel &cEvil Undead' + locationMessage: '&cEvil Undead: $distance blocks away!' + spawnMessage: '&cAn Evil Undead has appeared!' + deathMessage: '&aThe Evil Undead was put to rest by $players!' + escapeMessage: '&4The Evil Undead has escaped!' +evil_undead_p2: + name: '$eventBossLevel &cEvil Undead' + locationMessage: '&cEvil Undead: $distance blocks away!' + spawnMessage: '&cAn Evil Undead has appeared!' + deathMessage: '&aThe Evil Undead was put to rest by $players!' + escapeMessage: '&4The Evil Undead has escaped!' +fallen_knight: + name: '$eventBossLevel &7Fallen Knight' + locationMessage: '&cFallen Knight: $distance blocks away!' + spawnMessage: '&cA Fallen Knight rises from their grave!' + deathMessage: '&aA Fallen Knight has fallen to $players!.' + escapeMessage: '&4The Fallen Knight goes back to slumber!' +fine_swine: + name: '$eventBossLevel &eFine Swine' +fine_swine_summon: + name: '$eventBossLevel &eMighty Protector' +firestarter: + name: '$eventBossLevel &6Firestarter' + locationMessage: '&cFirestarter: $distance blocks away!' + spawnMessage: '&cA wicked Firestarter has appeared!' + deathMessage: '&aThe Firestarter was slain by $players!' + escapeMessage: '&4The Firestarter has left!' +firestarter_mount: + name: '$eventBossLevel &6Spark' +fire_conjurer: + name: '$eventBossLevel &eFire Conjurer' + locationMessage: '&cFire Conjurer: $distance blocks away!' + spawnMessage: '&cA master of fire and flame walks this world!' + deathMessage: '&aThe Fire Conjurer was extinguished by $players!' + escapeMessage: '&4The Fire Conjurer has vanished!' +fire_conjurer_summon: + name: '$eventBossLevel &6Summoned Flame' +fire_fae: + name: '&cFae de Fuego $eventBossLevel' +foreign_visitor: + name: '$eventBossLevel &5Foreign Visitor' + locationMessage: '&cForeign Visitor: $distance blocks away!' + spawnMessage: '&cA visitor from a another dimension has arrived!' + deathMessage: '&a$players has made sure to let the visitor know that they are not welcome here.' + escapeMessage: '&4The visitor has gone back home!' +fox_king_cold: + name: '$eventBossLevel &1Fox King Cold' + locationMessage: '&cFox King Cold: $distance blocks away!' + spawnMessage: '&cA magical creature roams the world.' + deathMessage: '&aFox King Cold was defeated by $players!' + escapeMessage: '&4Fox King Cold has left this world.' +frost_palace_frost_queen_p0: + name: '$bossLevel &8Frost Queen' + locationMessage: '&9Frost Queen' + spawnMessage: '&9The wind howls. The Frost Queen rises up to the challenge.' + deathMessage: '&aThe Frost queen is no more, slain by $players!' +frost_palace_frost_queen_p1: + name: '$bossLevel &8Frost Queen phase 1' + locationMessage: '&9Frost Queen phase 1' +frost_palace_frost_queen_p2: + name: '$bossLevel &8Frost Queen phase 2' + locationMessage: '&9Frost Queen phase 2' +frost_palace_frost_queen_p3: + name: '$bossLevel &8Frost Queen phase 3' + locationMessage: '&9Frost Queen phase 3' +frost_palace_frost_queen_p4: + name: '$bossLevel &8Frost Queen phase 4' + locationMessage: '&9Frost Queen phase 4' +frost_palace_frost_queen_p5: + name: '$bossLevel &8Frost Queen phase 5' + locationMessage: '&9Frost Queen phase 5' +frost_palace_frost_queen_p6: + name: '$bossLevel &8Frost Queen phase 6' + locationMessage: '&9Frost Queen phase 6' +frost_palace_frost_queen_p7: + name: '$bossLevel &8Frost Queen phase 7' + deathMessages: + - '&e&l---------------------------------------------' + - '&eThe Frost Queen was thawed!' + - '&c&l 1st Damager: $damager1name &cwith $damager1damage damage!' + - '&6&l 2nd Damager: $damager2name &6with $damager2damage damage!' + - '&e&l 3rd Damager: $damager3name &ewith $damager3damage damage!' + - '&aSlayers: $players' + - '&e&l---------------------------------------------' + locationMessage: '&9Frost Queen phase 7' +frost_palace_reinforcement_1: + name: '$reinforcementLevel Spirit of Winter' +frost_palace_reinforcement_2: + name: '$reinforcementLevel Spirit of Spring' +frost_palace_reinforcement_3: + name: '$reinforcementLevel Spirit of Summer' +fulgora: + name: '$eventBossLevel &3Fulgora' + locationMessage: '&cFulgora: $distance blocks away!' + spawnMessage: '&cA mighty thunder goat has come!' + deathMessage: '&aFulgora was stopped by $players!' + escapeMessage: '&4Fulgora has left this place!' +gamma_werewolf: + name: '$reinforcementLevel &7Hombre-Lobo Gamma' +goblin_invader: + name: '$eventBossLevel &2Goblin Leader' + locationMessage: '&cGoblin Army: $distance blocks away!' + spawnMessage: '&cA Goblin Army has invaded this realm!' + deathMessage: '&aThe Goblin Army has been vanquished by $players!' + escapeMessage: '&4The Goblin Army is done with this realm!' +goblin_invader_summon_1: + name: '&2Goblin Warrior' +goblin_invader_summon_2: + name: '&2Goblin Fighter' +goblin_invader_summon_3: + name: '&2Goblin Trooper' +goblin_invader_summon_4: + name: '&2Goblin Reinforcements' +greedy_dwarf: + name: '$eventBossLevel &9Greedy Dwarf' + locationMessage: '&cGreedy Dwarf: $distance blocks away!' + spawnMessage: '&cCan you find the Greedy Dwarf digging somewhere underground?!' + deathMessage: '&aThe Greedy Dwarf was released of their curse by $players!' + escapeMessage: '&4The Greedy Dwarf had found their treasure and they left!' +gremlin_1: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + spawnMessage: '&cA Gremlin hoard has invaded this world!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_10: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_2: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_3: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_4: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_5: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_6: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_7: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_8: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +gremlin_9: + name: '$eventBossLevel &eGremlin' + locationMessage: '&cGremlin: $distance blocks away!' + escapeMessage: '&4The Gremlin hoard has disappeared!' +grunter: + name: '$eventBossLevel &aGrunter' + locationMessage: '&cGrunter: $distance blocks away!' + spawnMessage: '&cA mighty hog roams the lands.' + deathMessage: '&aGrunter was stopped by $players!' + escapeMessage: '&4Grunter has escaped!' +harmless_chicken: + name: '$eventBossLevel &fHarmless Chick' + locationMessage: '&cHarmless Chick: $distance blocks away!' + spawnMessage: '&cBwok!!! Cluck, Cluck! Bawk!' + deathMessage: '&aBaaaawk! Cluck...$players!' + escapeMessage: '&4Harmless Chicken has baaaaaawked away.' +harmless_chicken_summon: + name: '$eventBossLevel &fClucktector' +hog_rider: + name: '$eventBossLevel &6Hog Rider' + locationMessage: '&cHog Rider: $distance blocks away!' + spawnMessage: '&cA mighty Hog Rider has appeared!' + deathMessage: '&aThe Hog Rider and their Hog were vanquished by $players!' + escapeMessage: '&4The Hog Rider has vanished.' +hog_rider_mount: + name: '$eventBossLevel &eLoyal Hog' +hog_rider_p2: + name: '$eventBossLevel &6Hog Rider' + locationMessage: '&cHog Rider: $distance blocks away!' + deathMessage: '&aThe Hog Rider and their Hog were vanquished by $players!' + escapeMessage: '&4The Hog Rider has vanished.' +hog_rider_summon: + name: '$eventBossLevel &eLoyal Zob-Hog' +horde_champion: + name: '$eventBossLevel &cHorde Champion' + locationMessage: '&cUndead Horde Champion: $distance blocks away!' + spawnMessage: '&cAn undead horde approaches!' + deathMessage: '&aThe horde has been stopped by $players!.' + escapeMessage: '&4AThe undead horde has left!' +horrid_duplicator: + name: '$eventBossLevel &dHorrid Duplicator' + locationMessage: '&cHorrid Duplicator: $distance blocks away!' + spawnMessage: '&cAn endless foe has appeared!' + deathMessage: '&aThe Horrid Duplicator was slain by $players!' + escapeMessage: '&4The Horrid Duplicator has left!' +horrid_duplicator_summon: + name: '$eventBossLevel &dHorrid Duplicator' +horrid_duplicator_summon_1: + name: '$eventBossLevel &dHorrid Duplicator' +ice_fae: + name: '&bFae de Hielo $eventBossLevel' +imperial_bee_guard: + name: '$reinforcementLevel &eSoldado Abeja Imperial' +invasion_abducted_hoglin_leader: + name: '$normalLevel &8Hoglin Líder Secuestrado' +invasion_abducted_pillager_leader: + name: '$normalLevel &8Pillager Líder Secuestrado' +invasion_abducted_silverfish: + name: '$normalLevel &8Lepisma Secuestrado' +invasion_abducted_silverfish_leader: + name: '$normalLevel &8Lepisma secuestrado' +invasion_abducted_zombie: + name: '$normalLevel &8Zombie Secuestrado' +invasion_abducted_zombie_leader: + name: '$normalLevel &8Zombie Secuestrado' +invasion_abductor: + name: '$normalLevel &6Secuestrador' +invasion_abudcted_pillager: + name: '$normalLevel &8Pillager Secuestrado' +invasion_analytic_thin_man_1: + name: '$normalLevel &8Hombre Delgado Analítico' +invasion_analytic_thin_man_2: + name: '$normalLevel &8Hombre Delgado Analítico' +invasion_analytic_thin_man_3: + name: '$normalLevel &8Hombre Delgado Analítico' +invasion_analytic_thin_man_4: + name: '$normalLevel &8Hombre Delgado Analítico' +invasion_ballistic_construct: + name: '$minibossLevel &fConstrucción Balística' +invasion_convert: + name: '$normalLevel &6Convertir' +invasion_energy_construct: + name: '$minibossLevel &fConstrucción de Energía' +invasion_fire_construct: + name: '$minibossLevel &fConstrucción de Fuego' +invasion_genetically_modified_cow_phase_1: + name: '$minibossLevel &fVaca Genéticamente Modificada' +invasion_genetically_modified_cow_phase_2: + name: '$minibossLevel &fVaca Genéticamente Modificada' +invasion_gray_man_courthouse_phase_1: + name: '$minibossLevel &7Hombre Gris' +invasion_gray_man_courthouse_phase_2: + name: '$minibossLevel &7Hombre Gris' +invasion_green_man_hotel_phase_1: + name: '$bossLevel &2Hombre Verde' +invasion_green_man_hotel_phase_2: + name: '$bossLevel &2Hombre Verde' +invasion_green_man_hotel_phase_3: + name: '$bossLevel &2Hombre Verde' + deathMessage: '&4¡El &2Hombre Verde &4ha sido vencido por $players! ¡Este es el final de esta versión del mapa, el interior del OVNI está en la versión completa!' +invasion_green_man_spaceship_phase_1: + name: '$bossLevel &2Hombre Verde' +invasion_green_man_spaceship_phase_2: + name: '$bossLevel &2Hombre Verde' +invasion_green_man_spaceship_phase_3: + name: '$bossLevel &2Hombre Verde' +invasion_green_man_spaceship_phase_4: + name: '$bossLevel &2Hombre Verde' + deathMessages: + - '&e&l---------------------------------------------' + - '&2¡Ya no hay más amenaza alienígena!' + - '&c&l 1er Dañador: ¡$damager1name &ccon $damager1damage daño!' + - '&6&l 2do Dañador: ¡$damager2name &6con $damager2damage daño!' + - '&e&l 3er Dañador: ¡$damager3name &econ $damager3damage de daño!' + - '&aAsesinos: $players' + - '&e&l---------------------------------------------' +invasion_ice_construct: + name: '$minibossLevel &Contrucción de Hielo' +invasion_merman: + name: '$normalLevel &6Tritón' +invasion_merman_leader: + name: '$normalLevel &6Líder Tritón' +invasion_otherwordly_ember: + name: '$normalLevel &6Ascua de otro mundo' +invasion_psychic_apparition: + name: '$normalLevel &5Aparición Psíquica' +invasion_psychic_clone: + name: '$reinforcementLevel &6Clon Psíquico' +invasion_psychic_explosion: + name: '$reinforcementLevel &5Explosión Psíquica' +invasion_psychic_summon_gold_boots: + name: '$reinforcementLevel &5Aparición Psíquica' +invasion_psychic_summon_gold_pants: + name: '$reinforcementLevel &5Aparición Psíquica' +invasion_psychic_summon_leather_hat: + name: '$reinforcementLevel &5Aparición Psíquica' +invasion_shrieking_shulker: + name: '$normalLevel &8Shulker Aullante' +invasion_thin_man: + name: '$normalLevel &8Hombre Delgado' +killer_rabbit_of_caerbannog: + name: '$eventBossLevel &cConejo Asesino de Caerbannog' +kraken: + name: '$eventBossLevel &3Kraken' +krampus: + name: '$eventBossLevel &1Krampus' + locationMessage: '&cKrampus: $distance blocks away!' + spawnMessage: '&cKrampus has come to punish the naughty!' + deathMessage: '&aKrampus has been sent back to his realm to by $players!.' + escapeMessage: '&4There was nobody to punish!' +large_hopper: + name: '$eventBossLevel &dLarge Hopper' + locationMessage: '&cLarge Hopper: $distance blocks away!' + spawnMessage: '&cA large beast is hopping around!' + deathMessage: '&aThe Large Hopper was stopped by $players!' + escapeMessage: '&4The Large Hopper has jumped out of this world!' +large_hopper_mount: + name: '$eventBossLevel &aHopper' +lightning_fae: + name: '&eFae de Rayo $eventBossLevel' +living_shadow: + name: '$eventBossLevel &7Living Shadow' + locationMessage: '&cLiving Shadow: $distance blocks away!' + spawnMessage: '&cLiving Shadow has appeared! Do not look it in the yes!' + deathMessage: '&aLiving Shadow has been turned into Dead Shadow by $players!.' + escapeMessage: '&4The Living Shadow saw nothing so it left!' +meme_boss: + name: '&2The Maestro' +meme_boss_reinforcement: + name: '&cFan' +merman: + name: '$eventBossLevel &1Merman' + locationMessage: '&cMerman: $distance blocks away!' + spawnMessage: '&cA Merman swims the oceans!' + deathMessage: '&aThe Merman was slain by $players!' + escapeMessage: '&4The Merman has retreated.' +monster_of_the_deep: + name: '$eventBossLevel &bMonster of the Deep' + locationMessage: '&cMonster of the Deep: $distance blocks away!' + spawnMessage: '&cSomething terrible swims the oceans!' + deathMessage: '&aMonster of the Deep has been slain by $players!' + escapeMessage: '&4The oceans are once again safe!' +moon_spider: + name: '$eventBossLevel &fMoon Spider' + locationMessage: '&cMoon Spider: $distance blocks away!' + spawnMessage: '&cA powerful arachnid has been spotted!' + deathMessage: '&aThe Moon Spider was slain by $players!' + escapeMessage: '&4The Moon Spider has left!' +moon_spider_summon: + name: '&fSilk Mender' +necromancer: + name: '$eventBossLevel &7Necromancer' + locationMessage: '&cNecromancer: $distance blocks away!' + spawnMessage: '&cA powerful evil Necromancer has entered this world!' + deathMessage: '&aThe Necromancer is no more thanks to $players!' + escapeMessage: '&4The Necromancer has disappeared.' +necromancer_summon_1: + name: '$eventBossLevel &fFiery Bones' +necromancer_summon_2: + name: '$eventBossLevel &bChilled Bones' +necromancer_summon_3: + name: '$eventBossLevel &8Charred Bones' +necronomicon_skeleton: + name: '&7Esqueleto invocado $reinforcementLevel' +necronomicon_zombie: + name: '&7Zombi Convocado $reinforcementLevel' +netherite_golem: + name: '$eventBossLevel &8Netherite Golem' + locationMessage: '&cNetherite Golem: $distance blocks away!' + spawnMessage: '&cAn ancient golem has entered this world!' + deathMessage: '&aThe Netherite Golem was slain by $players!' + escapeMessage: '&4The Netherite Golem has left this world!' +nether_escapee: + name: '$eventBossLevel &6Nether Escapee' + locationMessage: '&cNether Escapee: $distance blocks away!' + spawnMessage: '&cA terrible foe has escaped the nether!' + deathMessage: '&aThe Nether Escapee was sent back to the nether by $players!' + escapeMessage: '&4The Nether Escapee has left this place!' +nether_hag: + name: '$eventBossLevel &4Nether Hag' + locationMessage: '&cNether Hag: $distance blocks away!' + spawnMessage: '&cAn evil hag walks the nether!' + deathMessage: '&aThe Nether Hag was slain by $players!' + escapeMessage: '&4The Nether Hag has vanished!' +nether_wasp: + name: '$eventBossLevel &6Nether Wasp' + locationMessage: '&cNether Wasp: $distance blocks away!' + spawnMessage: '&cTry not to get stung, a wasp roams the nether!' + deathMessage: '&aThe Nether Wasp was slain by $players!' + escapeMessage: '&4The Nether Wasp has decided to buzz off!' +nether_wasp_summon_1: + name: '$eventBossLevel &cHive Summoner' +nether_wasp_summon_2: + name: '$eventBossLevel &cHive Wasp' +nightwing: + name: '$eventBossLevel &cNightwing' + locationMessage: '&cNightwing: $distance blocks away!' + spawnMessage: '&cA bird of the night has appeared!' + deathMessage: '&aNightwing was stopped by $players!' + escapeMessage: '&4Nightwing has flown home.' +nightwing_summon: + name: '$eventBossLevel &cSmart Bomb' +nightwing_summon_1: + name: '$eventBossLevel &cSworn Protector' +night_crawler: + name: '$eventBossLevel &4Night Crawler' + locationMessage: '&cNight Crawler: $distance blocks away!' + spawnMessage: '&cSomething awful is crawling about!' + deathMessage: '&aThe Night Crawler has been slain by $players!' + escapeMessage: '&4The Night Crawler Undead has left!' +night_horder: + name: '$eventBossLevel &aNight Horder' + locationMessage: '&cNight Horder: $distance blocks away!' + spawnMessage: '&cA Night Horder has appeared! Slay him to loot his booty!' + deathMessage: '&aThe Night Horder has been plundered by $players!' + escapeMessage: '&4The Night Horder has escaped!' +oasis_10_old_bones: + name: '$normalLevel &fHuesos Antiguos' +oasis_10_surreptitious_scribe: + name: '$minibossLevel &7Escriba Surrepticioso' +oasis_12_entombed_tenant: + name: '$normalLevel &7Inquilino Enterrado' +oasis_12_entombed_tenant_p2: + name: '$normalLevel &7Inquilino Enterrado' +oasis_12_sinister_siren: + name: '$minibossLevel &5Sirena Siniestra' +oasis_14_gnarly_grimace: + name: '$normalLevel &8Gesticulador retorcido' +oasis_14_undead_drifter: + name: '$normalLevel &1No muerto Errante' +oasis_16_lesser_sentinel: + name: '$normalLevel &9Centinela menor' +oasis_16_magical_magus: + name: '$normalLevel &3Mago Mágico' +oasis_16_rancid_roamer: + name: '$normalLevel &8Vagabundo Rancio' +oasis_18_sly_sharpshooter: + name: '$normalLevel &eFrancotirador Astuto' +oasis_18_stout_thaumaturge: + name: '$normalLevel &5Taumaturgo robusto' +oasis_18_tricky_treasure_hoarder: + name: '$normalLevel &dAcaparador de Tesoro Engañoso' +oasis_20_scheming_scribe: + name: '$minibossLevel &7Escriba Intrigante' +oasis_20_septic_scribe: + name: '$minibossLevel &7Escriba Séptico' +oasis_20_vampiric_sorcerer: + name: '$bossLevel &cHechicero Vampírico' +oasis_20_wrapped_wraith: + name: '$normalLevel &8Espectro Envuelto' +oasis_20_wrapped_wraith_p2: + name: '$normalLevel &8Espectro Envuelto' +oasis_25_vampiric_warlock: + name: '$bossLevel &4Brujo Vampírico' +oasis_25_warlocks_spirit_summon: + name: '$reinforcementLevel &cEspíritu del Brujo' +oasis_26_adept_sentinel: + name: '$normalLevel &1Centinela Adepto' +oasis_26_grim_grovetender: + name: '$normalLevel &aGuardián Sombrío de la arboleda' +oasis_26_precarious_sniper: + name: '$normalLevel &3Francotirador Precario' +oasis_26_superior_sharpshooter: + name: '$normalLevel &3Francotirador Superior' +oasis_28_perilous_prophet: + name: '$normalLevel &3Profeta Peligroso' +oasis_28_treacherous_treasure_hoarder: + name: '$normalLevel &dAcaparador de Tesoro' +oasis_2_haunted_hauler: + name: '$normalLevel &9Transportista Embrujado' +oasis_30_forsaken_soul: + name: '$reinforcementLevel &0Alma Abandonada' +oasis_30_lost_soul: + name: '$normalLevel Alma Perdida' +oasis_30_parlous_preist: + name: '$minibossLevel &bSacerdote Alarmante' +oasis_30_seeker_of_the_staid: + name: '$normalLevel &cBuscador de la Calma' +oasis_30_wimpy_louse: + name: '$reinforcementLevel &8Piojo Repugnante' +oasis_32_loathing_louse: + name: '$normalLevel &8Piojo Repugnante' +oasis_32_skeletal_sniper: + name: '$normalLevel &9Francotirador Esquelético' +oasis_34_grizly_grimace: + name: '$normalLevel &8Gesticulador retorcido' +oasis_34_gruesome_grimace: + name: '$normalLevel &8Gesticulador Espantoso' +oasis_35_ice_eidolon: + name: '$reinforcementLevel &9Eidolón de Hielo' +oasis_35_light_of_darkness: + name: '$minibossLevel &9Luz de Oscuridad' +oasis_36_cruel_cultist: + name: '$normalLevel &3Cultista Cruel' +oasis_36_cultists_cretins: + name: '$reinforcementLevel &3Cultista Cruel' +oasis_36_cultists_cretins_drowned: + name: '$reinforcementLevel &3Cultista Cruel' +oasis_36_dexterous_sentinel: + name: '$normalLevel &9Centinela Habilidosa' +oasis_36_grudging_grovetender: + name: '$normalLevel &aCuidador de la Arboleda Regañadiente' +oasis_36_parlous_sniper: + name: '$normalLevel &3Francotirador Peligroso' +oasis_36_rueful_roamer: + name: '$normalLevel &8Vagabundo Triste' +oasis_36_spectral_magus: + name: '$normalLevel &3Mago Espectral' +oasis_38_poisonous_perch: + name: '$normalLevel &3Percha Venenosa' +oasis_38_traitorous_treasure_hoarder: + name: '$normalLevel &dAcaparador de Tesoro Traicionero' +oasis_40_chief_cultist: + name: '$minibossLevel &5Cultista Jefe' +oasis_40_louse_lord: + name: '$minibossLevel &8Lord Sabandija' +oasis_40_pharaohs_scribe: + name: '$minibossLevel &7Escriba de Faraón' +oasis_40_skeletal_stiff: + name: '$normalLevel &9Rígido Esquelético' +oasis_40_soaked_sacrifice: + name: '$reinforcementLevel &1Sacrificio Empapado' +oasis_40_solar_flare: + name: '$reinforcementLevel &eLlamarada Solar' +oasis_42_hexed_hauler: + name: '$normalLevel &9Transportista Hechizado' +oasis_42_skeletal_sharpshooter: + name: '$normalLevel &9Francotirador Esquelético' +oasis_42_tyranical_treasure_hoarder: + name: '$normalLevel &dAcaparador de Tesoro Tiránico' +oasis_42_tyranical_treasure_hoarder_phase_2: + name: '$normalLevel &dAcaparador de Tesoro Tiránico' +oasis_45_golden_cast_autonomation: + name: '$reinforcementLevel &6Autonomación de Reparto Dorado' +oasis_45_monumental_monstrosity: + name: '$bossLevel &bMonstruosidad Monumental' +oasis_45_monumental_monstrosity_phase_2: + name: '$bossLevel &bMonstruosidad Monumental' +oasis_45_monumental_monstrosity_phase_3: + name: '$bossLevel &6Monstruosidad Monumental' +oasis_45_monumental_monstrosity_phase_4: + name: '$bossLevel &bMonstruosidad Monumental' +oasis_45_oracle_of_knowledge: + name: '$minibossLevel &0Oráculo de Conocimiento' +oasis_45_shadow_of_knowledge_summon: + name: '$reinforcementLevel &8Sombra del Conocimiento' +oasis_45_the_beacon: + name: '$minibossLevel &6El faro' +oasis_45_the_beacon_phase_2: + name: '$minibossLevel &6El faro' +oasis_45_the_beacon_phase_3: + name: '$minibossLevel &6El faro' +oasis_45_the_beacon_phase_4: + name: '$minibossLevel &6El faro' +oasis_46_pharaohs_sentinel: + name: '$normalLevel &9Centinela del Faraón' +oasis_4_cursed_desert_dweller: + name: '$normalLevel &eViajero Maldito del Desierto' +oasis_4_grotesque_grimace: + name: '$normalLevel &8Gesticulador Grotesco' +oasis_4_swamp_rat: + name: '$normalLevel &6Rata de Pantano' +oasis_50_moneychanger_arrow: + name: '$minibossLevel &6Cambiador de dinero' +oasis_50_moneychanger_arrow_phase_2: + name: '$minibossLevel &6Cambiador de dinero' +oasis_50_moneychanger_blindness: + name: '$minibossLevel &6Cambiador de dinero' +oasis_50_moneychanger_blindness_phase_2: + name: '$minibossLevel &6Cambiador de dinero' +oasis_50_moneychanger_fire: + name: '$minibossLevel &6Cambiador de dinero' +oasis_50_moneychanger_fire_phase_2: + name: '$minibossLevel &6Cambiador de dinero' +oasis_50_moneychanger_freeze: + name: '$minibossLevel &6Cambiador de dinero' +oasis_50_moneychanger_freeze_phase_2: + name: '$minibossLevel &6Cambiador de dinero' +oasis_50_moneychanger_knockback: + name: '$minibossLevel &6Cambiador de dinero' +oasis_50_moneychanger_knockback_phase_2: + name: '$minibossLevel &6Cambiador de dinero' +oasis_50_moneychanger_poison: + name: '$minibossLevel &6Cambiador de dinero' +oasis_50_moneychanger_poison_phase_2: + name: '$minibossLevel &6Cambiador de dinero' +oasis_50_moneychanger_wither: + name: '$minibossLevel &6Cambiador de dinero' +oasis_50_moneychanger_wither_phase_2: + name: '$minibossLevel &6Cambiador de dinero' +oasis_50_pharaohs_royal_guard: + name: '$reinforcementLevel &8Guardia Real del Faraón' +oasis_50_the_foundry: + name: '$bossLevel &4La Fundidora' +oasis_50_the_foundry_phase_2: + name: '$bossLevel &4La Fundidora' +oasis_55_pharaoh_of_pestilence: + name: '$bossLevel &0Faraón de Pestilencia' +oasis_6_dry_bones: + name: '$normalLevel &fHuesos Secos' +oasis_6_rotten_roamer: + name: '$normalLevel &8Vagabundo Podrido' +oasis_8_mythical_magus: + name: '$normalLevel &3Mago Mítico' +oasis_8_tough_thaumaturge: + name: '$normalLevel &5Taumaturgo Resistente' +oasis_8_troublesome_treasure_hoarder: + name: '$normalLevel &dAcaparador de Tesoro problemático' +okami: + name: '$eventBossLevel &cOkami' + locationMessage: '&cOkami: $distance blocks away!' + spawnMessage: '&cA god has awakened!' + deathMessage: '&a$players has fought with a god and won!.' + escapeMessage: '&4Okami has left!' +okami_p2: + name: '$eventBossLevel &cOkami' +okami_p3: + name: '$eventBossLevel &cOkami' +omega_wolf: + name: '$reinforcementLevel &7Omega Lobo' +pillager_caravan_beast: + name: '$reinforcementLevel &cBestia de Caravana' +pillager_caravan_guard: + name: '$reinforcementLevel &cGuardia de Caravana' +pillager_caravan_leader: + name: '$eventBossLevel &cPillager Líder de la Caravana' + locationMessage: '&cCaravana Pillager: ¡$distance bloques de distancia!' + spawnMessage: '&c¡Una caravana Pillager ha sido avistada!' +primis_acolyte_brute: + name: '$normalLevel &bBruto acólito' +primis_acolyte_forest_brute: + name: '$normalLevel &bElfo Bandido Bruto' +primis_acolyte_forest_brute_with_watch: + name: '$normalLevel &bElfo Bandido Bruto' +primis_acolyte_forest_sharpshooter: + name: '$normalLevel &bElfo Bandido Explorador' +primis_acolyte_forest_summoner: + name: '$normalLevel &bElfo Bandido Invocador' +primis_acolyte_forest_summoner_heirloom_guardian: + name: '$normalLevel &bElfo Bandido Mago' +primis_acolyte_guard_1: + name: '$normalLevel &bGuardia acolito' + onDamagedMessages: + - '¡No puedes entrar!' + - '¡El mago no permitirá esto!' + - '¡Abandona este lugar!' + - '¡El mago protege este lugar!' + - '¡Tonterías!' + - '¡Fuera de aquí!' + deathMessage: '[Acolyte Guard] ¡Estás ciego a la verdad, el mago de la torre lo ve todo!' +primis_acolyte_guard_2: + name: '$normalLevel &bGuardia Acólito' + onDamagedMessages: + - '¡No puedes entrar!' + - '¡El mago no permitirá esto!' + - '¡Abandona este lugar!' + - '¡El mago protege este lugar!' + - '¡Tonterías!' + - '¡Fuera de aquí!' + deathMessage: '[Acolyte Guard] ¡No pasarás, el mago en la torre no lo permitirá!' +primis_acolyte_sharpshooter: + name: '$normalLevel &bExplorador Acólito' +primis_aggressive_llama: + name: '$normalLevel &6Llama Agresiva' +primis_angry_goat: + name: '$normalLevel &6Cabra Enojada' +primis_beta_feral_wolf: + name: '$reinforcementLevel &8Lobo Feral Beta' +primis_blood_temple_blood_golem: + name: '$normalLevel &cBlood Golem' +primis_blood_temple_charred_construct: + name: '$normalLevel &cCharred Construct' +primis_blood_temple_conjured_flame: + name: '$normalLevel &cConjured Flame' +primis_blood_temple_eradicator: + name: '$normalLevel &cEradicator' +primis_blood_temple_fire_conjurer: + name: '$normalLevel &cFire Conjurer' +primis_blood_temple_flame_elemental: + name: '$normalLevel &cFlame Elemental' +primis_catacomb_nemus_to_redwood_archer: + name: '$normalLevel &8Arquero de Catacumba' +primis_catacomb_nemus_to_redwood_golem: + name: '$normalLevel &bGolem De Catacumba' +primis_catacomb_nemus_to_redwood_necromancer: + name: '$bossLevel &4Nigromante de Catacumba' +primis_catacomb_nemus_to_redwood_necromancer_p1: + name: '$bossLevel &4Nigromante de Catacumba' +primis_catacomb_nemus_to_redwood_necromancer_p2: + name: '$bossLevel &4Nigromante de Catacumba' +primis_catacomb_nemus_to_redwood_soul_reinforcement: + name: '$reinforcementLevel &8Alma de Catacumba' +primis_catacomb_nemus_to_redwood_swordsman: + name: '$normalLevel &8Espadachín de Catacumba' +primis_catacomb_pontis_to_ice_archer: + name: '$normalLevel &8Arquero de Catacumba' +primis_catacomb_pontis_to_ice_golem: + name: '$normalLevel &bGolem De Catacumba' +primis_catacomb_pontis_to_ice_necromancer_p1: + name: '$bossLevel &4Nigromante de Catacumba' +primis_catacomb_pontis_to_ice_necromancer_p2: + name: '$bossLevel &4Nigromante de Catacumba' +primis_catacomb_pontis_to_ice_swordsman: + name: '$normalLevel &8Espadachín de Catacumba' +primis_catacomb_trio_archer: + name: '$normalLevel &8Catacomb Archer' +primis_catacomb_trio_golem: + name: '$normalLevel &bCatacomb Golem' +primis_catacomb_trio_necromancer_p1: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_necromancer_p2: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_necromancer_summon: + name: '$bossLevel &4Catacomb Necromancer' +primis_catacomb_trio_swordsman: + name: '$normalLevel &8Catacomb Swordsman' +primis_crazed_rabbit: + name: '$normalLevel &cConejo Enloquecido' +primis_crystaline_summoner_p1: + name: '$normalLevel &3Crystaline Summoner' +primis_crystaline_summoner_p2: + name: '&3Invocador Cristalino' +primis_earth_temple_golem: + name: '$normalLevel &fAnimated Clay' +primis_emerald_eater: + name: '$normalLevel &aEmerald Eater' +primis_farmstead_lighthouse_keeper: + name: '$bossLevel &6El Guardián del Faro' + questLore: + - Algo está muy mal con mi marido. + - Solía ser un marido y padre amoroso y cariñoso + - pero en los últimos tiempos se ha centrado en documentos que encontró en el sótano. + - Dijo que se trataba de una investigación importante, algo que podría cambiar el mundo. + - Debí haberle dicho que se detuviera cuando vi lo obsesionado que se estaba volviendo. + - Hizo... algo... en el faro - y + - Me temo que el faro también le ha hecho algo. + - Lo transformó en una especie de monstruo. Ya no nos reconoce, + - e incluso nos ha atacado cuando intentamos acercarnos a él. + - Por la noche, no podemos dormir debido a los sonidos de lamento + - viniendo del &dSótano del Faro&f. + - Está sufriendo y no tenemos el poder para ayudarlo. + - Sé que estoy preguntando por mucho, pero ¿crees que puedes ayudarnos? + questAcceptDialog: + - '&a[Amavit]&f Muchas gracias por aceptar nuestra solicitud. Espero con todo el corazón que tengas éxito.' + - '&7&oDebería ir al &dSótano del Faro &7&oy poner al &cGuardián del Faro&7&o fuera de su miseria.' + questCompleteMessage: + - '&a[Amavit]&f Lo he oído - así que está hecho? ¿Ha sufri- no, olvídalo, no quiero saberlo.' + - '&fParece que el faro ha empezado a emitir una luz extraña cuando tú... Te ocupaste del problema. Hemos de asegurarnos de que no se trata de un problema.' + - '&7&oParece que &aAmavit&7&o tiene otra tarea para mí. Debería hablar con ella.' +primis_feral_alpha_wolf: + name: '$normalLevel &8Lobo Feral Alfa' +primis_feral_wolf: + name: '$normalLevel &8Lobo Feral' +primis_feral_wolf_scout: + name: '$normalLevel &8Lobo Feral Explorador' +primis_gladius_admiral: + name: '$normalLevel &fAdmiral Invasor' +primis_gladius_assassin: + name: '$normalLevel &fAsesino Invasor' +primis_gladius_barkeep_p1: + name: '$minibossLevel &6El Barman' +primis_gladius_barkeep_p2: + name: '$minibossLevel &6El Barman' +primis_gladius_captain: + name: '$normalLevel &fCapitán Invasor' +primis_gladius_champion_p1: + name: '$bossLevel &6Campeón Caído Natus' +primis_gladius_champion_p2: + name: '$bossLevel &6Campeón Caído Natus' +primis_gladius_gatekeeper_p1: + name: '$minibossLevel &5El Portero' +primis_gladius_gatekeeper_p2: + name: '$minibossLevel &5El Portero' +primis_gladius_gatekeeper_pontis_p1: + name: '$minibossLevel &5El Portero' +primis_gladius_gatekeeper_pontis_p2: + name: '$minibossLevel &5El Portero' +primis_gladius_longbowman: + name: '$normalLevel &fInvasor Hombre de Arco Largo' +primis_gladius_mariner: + name: '$normalLevel &fMarino Invasor' +primis_gladius_mariner_quest: + name: '$normalLevel &fMarino Invasor' +primis_gladius_monk_p1: + name: '$minibossLevel &6El Monje' +primis_gladius_monk_p2: + name: '$minibossLevel &6El Monje' +primis_gladius_raider: + name: '$normalLevel &fInvasor Asaltante' +primis_gladius_swordsman: + name: '$normalLevel &fInvasor Espadachín' +primis_gladius_undead_buccaneer: + name: '$normalLevel &fBucanero No-Muerto' +primis_gladius_undead_captain: + name: '$minibossLevel &fCapitán No-Muerto' +primis_gladius_undead_swashbuckler: + name: '$normalLevel &fEspadachín Bravucón No-Muerto' +primis_gladius_underlord: + name: '$minibossLevel &0Subjefe' +primis_gladius_villager: + name: '$normalLevel &fAldeano No-Muerto' +primis_goblin_fowl_warrior: + name: '$minibossLevel &6Cursed Fowl Goblin' +primis_goblin_grunt: + name: '$normalLevel &6Goblin Grunt' +primis_goblin_king: + name: '$bossLevel &2Goblin King' +primis_goblin_piranah: + name: '$normalLevel &9Goblin Piranah' +primis_goblin_spearman: + name: '$normalLevel &6Goblin Spearman' +primis_goblin_warrior: + name: '$normalLevel &6Goblin Warrior' +primis_ice_mage: + name: '$minibossLevel &9Mago de Hielo' +primis_ice_mage_p2: + name: '$minibossLevel &bMago de Hielo' + deathMessage: '&8&oEscuchas el sonido de una pared de hielo que está cerca y se está agrietando y rompiendo...' +primis_ice_village_annoyed_goat: + name: '$normalLevel &bAnnoyed Goat' +primis_ice_village_bell_banger: + name: '$minibossLevel &6Undead' + questLore: + - '¿Ves eso? Ahí, mira esa campana' + - torre en el pueblo. + - Lo ves también, ¿verdad? El talador ahí + - golpeando su cabeza contra la campana. + - Estoy bastante seguro de que eso es lo que está sucediendo, + - a menos que mi visión me esté fallando. + - '¿Podrías ir a investigar e informarme' + - de lo que encuentras? + questAcceptDialog: + - '&a[Eleusium Festus]&f Qué está pasando...' + - '&7&oDebería ir a ver lo que sucede en el &d&oCampanario de la Aldea Helada&7&o.' + questCompleteMessage: + - '&a[Eleusium Festus]&f Has encontrado un no-muerto golpeando su cabeza en la campana...' + - Bueno, ahora lo he oído todo... +primis_ice_village_escaped_prisoner: + name: '$normalLevel &bPrisionero Escapado' +primis_ice_village_fallen_trial_warrior_summon: + name: '$reinforcementLevel &7Enslaved Soul' +primis_ice_village_frost_fur_ursus: + name: '$normalLevel &9Pelaje Helado Ursus' +primis_ice_village_frost_simulacrum: + name: '$normalLevel &3Frost Simulacrum' +primis_ice_village_ice_simulacrum: + name: '$reinforcementLevel &3Ice Simulacrum' +primis_ice_village_manifested_nightmare: + name: '$normalLevel &bManifested Nightmare' +primis_ice_village_meek_customer: + name: '$normalLevel &cCliente Manso' +primis_ice_village_naughty_customer: + name: '$normalLevel &cCliente Travieso' +primis_ice_village_screecher_bomb_summon: + name: '$reinforcementLevel &dScreecher Droppings' +primis_ice_village_sky_screecher: + name: '$normalLevel &bSky Screecher' +primis_ice_village_the_ice_aspect: + name: '$minibossLevel &9Ice Aspect' +primis_ice_village_the_ice_elemental: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_the_ice_elemental_p2: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_the_ice_elemental_p3: + name: '$bossLevel &9Ice Elemental' +primis_ice_village_trial_of_ice_minor_ice_elemental: + name: '$minibossLevel &bMinor Ice Elemental' +primis_ice_village_wolf_summon: + name: '$reinforcementLevel &cTamed Wolf' +primis_minor_ice_elemental: + name: '$bossLevel &1Elemental de Hielo Menor' +primis_minor_ice_elemental_p2: + name: '$bossLevel &1Elemental de Hielo Menor' +primis_mountain_pass_guardian_p1: + name: '$bossLevel &6El Guardián' +primis_mountain_pass_guardian_p2: + name: '$bossLevel &6El Guardián' +primis_mountain_pass_healer: + name: '$reinforcementLevel &fReparatron' +primis_nasty_worm: + name: '$normalLevel &fGusano Asqueroso' +primis_ogre_mines_mite: + name: '$normalLevel &fÁcaro de Mina' +primis_ogre_mines_ogre_archer: + name: '$minibossLevel &fOgro Arquero' +primis_ogre_mines_ogre_magi: + name: '$minibossLevel &fOgro Magi' +primis_ogre_mines_ogre_warrior: + name: '$minibossLevel &fOgro Guerrero' +primis_ogre_mines_undead_archer: + name: '$normalLevel &fArquero No-Muerto' +primis_ogre_mines_undead_swordsman: + name: '$normalLevel &fEspadachín No-Muerto' +primis_pontis_beast_cod: + name: '$minibossLevel &dBeast Cod Furiosa' +primis_pontis_beast_crawler: + name: '$minibossLevel &dCrawler Beast Megdun' +primis_pontis_beast_impaler: + name: '$minibossLevel &dImpaler Beast Uladzimir' +primis_pontis_counselor_guard_left_1: + name: '$normalLevel &4Guardia Consejero Corrupto' +primis_pontis_counselor_guard_left_2: + name: '$normalLevel &4Guardia Consejero Deformado' + deathMessage: '&5[Consejero Machiavelli]&f Así que ese tonto al fin debió averiguarlo...' +primis_pontis_counselor_guard_left_3: + name: '$normalLevel &4Experimento mejorado' + deathMessage: '&5[Consejero Machiavelli]&f Eres más fuerte de lo que pensaba.' +primis_pontis_counselor_guard_left_4: + name: '$normalLevel &4Abominación' + deathMessage: '&5[Consejero Machiavelli]&f ¡¡¡Mi magia de alma me protegerá!!!' +primis_pontis_counselor_guard_mid: + name: '$normalLevel &4Guardia Consejero Corrupto' + deathMessage: '&8[Consejero Machiavelli]&f ¡Veo que tenemos invitados!...' +primis_pontis_counselor_guard_right_1: + name: '$normalLevel &4Guardia Consejero Corrupto' +primis_pontis_counselor_guard_right_2: + name: '$normalLevel &4Guardia Consejero Deformado' +primis_pontis_counselor_guard_right_3: + name: '$normalLevel &4Experimento mejorado' +primis_pontis_counselor_guard_right_4: + name: '$normalLevel &4Abominación' +primis_pontis_counselor_twisted_copy: + name: '$reinforcementLevel &4Twisted Copy' +primis_pontis_mille_arena_air_elemental: + name: '$minibossLevel &fAir Elemental' +primis_pontis_mille_arena_human_wave_4: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_6: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_7: + name: '$normalLevel &4Human Warrior' +primis_pontis_mille_arena_human_wave_8: + name: '$normalLevel &4Dominated Human Warrior' +primis_pontis_mille_arena_human_worshiper: + name: '$normalLevel &4Elemental Worshiper' +primis_pontis_mille_arena_minor_air_elemental: + name: '$normalLevel &fMinor Air Elemental' +primis_pontis_mille_arena_minor_earth_elemental: + name: '$normalLevel &7Minor Earth Elemental' +primis_pontis_mille_arena_minor_fire_elemental: + name: '$normalLevel &eMinor Fire Elemental' +primis_pontis_mille_arena_minor_fire_elemental_prime: + name: '$normalLevel &eMinor Fire Elemental' +primis_pontis_mille_arena_minor_water_elemental: + name: '$normalLevel &bMinor Water Elemental' +primis_pontis_mille_arena_primal_air_wisp: + name: '$normalLevel &fPrimal Air Wisp' +primis_pontis_mille_arena_primal_air_wisp_2: + name: '$normalLevel &fPrimal Air Wisp' +primis_pontis_mille_arena_primal_earth_wisp: + name: '$normalLevel &7Primal Earth Wisp' +primis_pontis_mille_arena_primal_earth_wisp_2: + name: '$normalLevel &7Primal Earth Wisp' +primis_pontis_mille_arena_primal_fire_wisp: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_fire_wisp_2: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_fire_wisp_3: + name: '$normalLevel &ePrimal Fire Wisp' +primis_pontis_mille_arena_primal_water_wisp: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_water_wisp_2: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_water_wisp_3: + name: '$normalLevel &bPrimal Water Wisp' +primis_pontis_mille_arena_primal_wisp: + name: '$normalLevel &5Primal Wisp' +primis_pontis_mille_arena_water_elemental: + name: '$minibossLevel &1Water Elemental' +primis_pontis_mille_counselor_p1: + name: '$minibossLevel &fConsejero Machiavelli' +primis_pontis_mille_counselor_p2: + name: '$minibossLevel &fConsejero Machiavelli' +primis_pontis_mille_counselor_p3: + name: '$minibossLevel &fConsejero Machiavelli' +primis_pontis_mille_fields_babe_razorback: + name: '$normalLevel &2Babe Razorback' +primis_pontis_mille_fields_bird: + name: '$normalLevel &fFeathered Field Rat' +primis_pontis_mille_fields_bird_nightmare: + name: '$normalLevel &dRata Emplumada de Pesadilla' +primis_pontis_mille_fields_bubba: + name: '$minibossLevel &cBig ol'' Bubba' +primis_pontis_mille_fields_field_rat: + name: '$normalLevel &fField Rat' +primis_pontis_mille_fields_juvenile_razorback: + name: '$normalLevel &2Jabalí Juvenil' +primis_pontis_mille_fields_longhorn: + name: '$normalLevel &4Fields Longhorn' +primis_pontis_mille_fields_mature_razorback: + name: '$normalLevel &2Jabalí Maduro' +primis_pontis_mille_fields_shorthorn: + name: '$normalLevel &6Fields Shorthorn' +primis_pontis_mille_fields_two_legged_terror: + name: '$normalLevel &2Terror de Dos Piernas' +primis_pontis_mille_fields_well_fed_rat: + name: '$normalLevel &fRata Bien Alimentada' +primis_pontis_mille_rat: + name: '$normalLevel &fRat' +primis_quartz_elemental: + name: '$bossLevel &dElemental de Cuarzo' +primis_quartz_elemental_p2: + name: '$bossLevel &dElemental de Cuarzo' +primis_redwood_barracuda: + name: '$normalLevel &3Redwood Barracuda' +primis_redwood_fruity_hound: + name: '$normalLevel &2Sabueso Afrutado' +primis_redwood_rockhound: + name: '$normalLevel &7Redwood Rockhound' +primis_redwood_werewolf_grunt: + name: '$normalLevel &cRedwood Werewolf Grunt' +primis_redwood_werewolf_packleader: + name: '$normalLevel &4Redwood Werewolf Packleader' +primis_river_guardian: + name: '$normalLevel &5Guardián del Río' +primis_roofed_forest_cave_spider: + name: '$normalLevel &6Nest Crawler' +primis_roofed_forest_cave_spider_boss: + name: '$bossLevel &eBrood Mother' +primis_roofed_forest_spider: + name: '$normalLevel &6Forest Crawler' +primis_roofed_forest_spider_reinforcement: + name: '$reinforcementLevel &6Nest Brood' +primis_sea_monster: + name: '$bossLevel &dMonstruo del Océano' +primis_sewer_noxious_ninja: + name: '$normalLevel &2Ninja Nocivo' +primis_sewer_spore_spreader: + name: '$normalLevel &4Esparcidor de Esporas' +primis_sewer_the_shredder_p1: + name: '$bossLevel &5The Shredder' +primis_sewer_the_shredder_p2: + name: '$bossLevel &5The Shredder' +primis_storm_temple_axeman: + name: '$normalLevel &dStorm Temple Axeman' +primis_storm_temple_bowman: + name: '$normalLevel &dStorm Temple Bowman' +primis_storm_temple_kuzco: + name: '$normalLevel &6Kuzco' +primis_storm_temple_minor_storm_elemental: + name: '$normalLevel &5Minor Storm Elemental' +primis_storm_temple_storm_elemental: + name: '$bossLevel &1Elemental de Tormenta' +primis_storm_temple_storm_elemental_p2: + name: '$bossLevel &1Elemental de Tormenta' +primis_storm_temple_storm_elemental_p3: + name: '$bossLevel &1Elemental de Tormenta' +primis_storm_temple_summoner: + name: '$normalLevel &5Storm Temple Summoner' +primis_terravilla_alpha_razorback: + name: '$minibossLevel &2Alpha Razorback' +primis_terravilla_alpha_razorback_p2: + name: '$minibossLevel &2Alpha Razorback' +primis_terravilla_bar_brawler: + name: '$normalLevel &6Bar Brawler' + onDamagedMessages: + - That all ya got! + - I did not even feel that! + - Why...you! + - I will show you! + - Who the heck are you! + - TAKE THAT! +primis_terravilla_earth_elemental: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_earth_elemental_p2: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_earth_elemental_p3: + name: '$bossLevel &fEarth Elemental' +primis_terravilla_regular_fish: + name: '$normalLevel &bRegular Fish' +primis_terravilla_robber_gladiator: + name: '$normalLevel &bRobber Gladiator' +primis_terravilla_robber_slugger: + name: '$normalLevel &bSlugger' +primis_undead_archer: + name: '$normalLevel &fArquero No-Muerto' +primis_undead_climber: + name: '$normalLevel &0Trepador No-Muerto' +primis_undead_grappler: + name: '$normalLevel &3Agarrador No-Muerto' +primis_undead_guardian: + name: '$normalLevel &bGuardián No-Muerto' +primis_undead_swordsman: + name: '$normalLevel &0Espadachín no-muerto' +pufferfish: + name: '$eventBossLevel &3Pufferfish' + locationMessage: '&cPufferfish: $distance blocks away!' + spawnMessage: '&cA puffed fish is swimming in the oceans!' + deathMessage: '&aThe Pufferfish reign has been ended by $players!' + escapeMessage: '&4The Pufferfish has swam away!' +pufferfish_summon_1: + name: '$eventBossLevel &bPooferfish' +pufferfish_summon_2: + name: '$eventBossLevel &bPooperfish' +pufferfish_summon_3: + name: '$eventBossLevel &bPooderfish' +pufferfish_summon_4: + name: '$eventBossLevel &bPudderfish' +queen_bee: + name: '$eventBossLevel &6Reina Abeja' +rabbit_wolf_1: + name: '$eventBossLevel &cFlame Wolf' + locationMessage: '&cFlame: $distance blocks away!' + spawnMessage: '&cA powerful duo has come to this world!' + deathMessage: '&aThe Wolf and the Rabbit were stopped by $players!' + escapeMessage: '&4The Wolf and the Rabbit have left this place!' +rabbit_wolf_2: + name: '$eventBossLevel &cLightning Rabbit' + locationMessage: '&cLightning: $distance blocks away!' + deathMessage: '&aThe Wolf and the Rabbit were stopped by $players!' + escapeMessage: '&4The Wolf and the Rabbit have left this place!' +raug: + name: '&4Raug $reinforcementLevel' +regular_hoglin: + name: '$eventBossLevel &4Regular Hoglin' + locationMessage: '&cRegular Hoglin: $distance blocks away!' + spawnMessage: '&cA Regular Hoglin has arrived! Nothing special about this Hoglin!' + deathMessage: '&aRegular Hoglin was slain by $players!.' + escapeMessage: '&4The Regular Hoglin has left!' +rotting_diver: + name: '$eventBossLevel &bRotting Diver' + locationMessage: '&cRotting Diver: $distance blocks away!' + spawnMessage: '&cA foul corpse floats in the waters!' + deathMessage: '&aThe Rotting Diver was sent to the depths by $players!' + escapeMessage: '&4The Rotting Diver floated away!' +salty_corpse: + name: '$eventBossLevel &bSalty Corpse' + locationMessage: '&cSalty Corpse: $distance blocks away!' + spawnMessage: '&cSomething awful has floated up to the surface!' + deathMessage: '&aThe Salty Corpse was sent back to the depths by $players!' + escapeMessage: '&4The Salty Corpse has left!' +skeleton_knight: + name: '$eventBossLevel &fSkeleton Knight' + locationMessage: '&cSkeleton Knight: $distance blocks away!' + spawnMessage: '&cThe undead have sent a Skeleton Knight into the night!' + deathMessage: '&aThe Skeleton Knight was slain by $players!' + escapeMessage: '&4The Skeleton Knight had to retreat!' +sky_archer: + name: '$eventBossLevel &aSky Archer' + locationMessage: '&cSky Archer: $distance blocks away!' + spawnMessage: '&cA Sky Archer has entered this world! Bring your bow!' + deathMessage: '&aThe Sky Archer got sniped by $players!' + escapeMessage: '&4The Sky Archer has flown away!' +sky_archer_mount: + name: '$eventBossLevel &aSky Steed' +smallstack: + name: '$eventBossLevel &bSmallstack Top' + locationMessage: '&cSmallstack: $distance blocks away!' + spawnMessage: '&cA Smallstack is roaming the wilds!' + deathMessage: '&aThe Smallstack was unstacked by $players!' + escapeMessage: '&4The Smallstack has left!' +smallstack_1: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_2: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_3: + name: '$eventBossLevel &bSmallstack Middle' +smallstack_4: + name: '$eventBossLevel &bSmallstack Bottom' +smallstack_5: + name: '$eventBossLevel &bSmallstack Bottom' +smallstack_6: + name: '$eventBossLevel &bSmallstack Carrier' +snoopy: + name: '&fSnoopy &6{&4☠&6}' + onDamageMessages: + - '¡Woof!' + onDamagedMessages: + - '¡Woof!' + spawnMessage: '&a¡Se ha avistado un Snoopy extremadamente raro!' +sorcerer_supreme: + name: '$eventBossLevel &5Sorcerer Supreme' + locationMessage: '&cSorcerer Supreme: $distance blocks away!' + spawnMessage: '&cAn almighty Sorcerer has phased into this world!' + deathMessage: '&aThe Sorcerer Supreme was defeated by $players!' + escapeMessage: '&4The Sorcerer Supreme has left this world!' +sorcerer_supreme_summon: + name: '$eventBossLevel &5Eternal Servant' +spider_knight: + name: '$eventBossLevel &aDwarven Knight' + locationMessage: '&cDwarven Knight: $distance blocks away!' + spawnMessage: '&cA Knight has come to challenge the heroes of this place!' + deathMessage: '&aThe Knight was defeated by $players!' + escapeMessage: '&4The Knight has left this place!' +spider_knight_mount: + name: '$eventBossLevel &aFaithful Steed' +summonable_wolf: + name: '&fLobito $normalLevel' + onDamageMessages: + - '¡Woof!' + onDamagedMessages: + - '¡Woof!' +super_mite: + name: '$eventBossLevel &dSuper Mite' + locationMessage: '&cSuper Mite: $distance blocks away!' + spawnMessage: '&cA trouble maker appears!' + deathMessage: '&aThe mite could not handle a fight with $players!.' + escapeMessage: '&4The Super Mite left out of boredom!' +super_mite_summon: + name: '$eventBossLevel &dFriendmite' +suspicious_phantom: + name: '$eventBossLevel &eSuspicious Phantom' + locationMessage: '&cSuspicious Phantom: $distance blocks away!' + spawnMessage: '&cA Suspicious Phantom was sighted in the skies!' + deathMessage: '&aThe Phantom was put to bed by $players!' + escapeMessage: '&4The Suspicious Phantom has left!' +suspicious_phantom_summon: + name: '$eventBossLevel &cFlamer' +suspicious_phantom_summon_1: + name: '$eventBossLevel &cFireballer' +test_boss: + name: '$eventBossLevel &6Jefe de prueba' + deathMessages: + - '&e&l---------------------------------------------' + - '&e¡El Boss de Prueba ha sido depurado!' + - '&c&l 1er Dañador: ¡$damager1name &ccon $damager1damage daño!' + - '&6&l 2do Dañador: ¡$damager2name &6con $damager2damage daño!' + - '&e&l 3er Dañador: ¡$damager3name &econ $damager3damage de daño!' + - '&aAsesinos: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - '&c¡Te golpeé!' + onDamagedMessages: + - '&c¡Me han golpeado!' + locationMessage: '&2Boss de prueba: $distance' + spawnMessage: '&2¡Un boss de prueba ha sido invocado!' + deathMessage: '&2¡Un boss de prueba ha sido asesinado por &c$players!' + escapeMessage: '¡El boss de prueba ha escapado!' +airship_tier_45_knockback: + name: '$normalLevel &2Arco Arquero' +airship_tier_45_witherblind: + name: '$normalLevel &aArquero Nocivo' +airship_tier_50_powder_monkeys: + name: '$normalLevel &7Mono Polvo' +airship_tier_50_scourge: + name: '$normalLevel &8Bravucón Azotador' +airship_tier_60_mess_hall_mate: + name: '$normalLevel &bCompañero de Salón de Desorden' +airship_tier_65_boatswain_boss: + name: '$normalLevel &cJefe de Contramaestre' +airship_tier_65_bodyguard: + name: '$normalLevel &eGuardaespaldas Bucanero' +airship_tier_65_silverfish: + name: '$normalLevel &8Rata de la nave' +airship_tier_65_silverfish_reinforcement: + name: '$reinforcementLevel &8Ratón de Nave' +airship_tier_70_miniboss: + name: '$minibossLevel Quark el Oficial de Intendencia ' +airship_tier_70_miniboss_2: + name: '$minibossLevel &6Caldera Viviente' +airship_tier_70_miniboss_wayfinder: + name: '$minibossLevel &3Muelle Buscador de Caminos' +airship_tier_75_boss: + name: '$bossLevel &4Capitán Davey' + deathMessages: + - '&e&l---------------------------------------------' + - '&9El Capitán Davey fue enviado a su descanso! ... de nuevo.' + - '&c&l 1er Dañador: ¡$damager1name &ccon $damager1damage daño!' + - '&6&l 2do Dañador: ¡$damager2name &6con $damager2damage daño!' + - '&e&l 3er Dañador: ¡$damager3name &econ $damager3damage de daño!' + - '&aAsesinos: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Capitán Davey: $distance' + spawnMessage: '&4El Capitán Davey persigue los cielos una vez más!' + deathMessage: '¡$players &ahan hecho que el &4Capitán Davey &aevite su sufrimiento mortal!' + escapeMessage: '&6El Capitán Davey ha salido de caza otro día!' +binder_of_worlds_phase_1: + name: '$eventBossLevel &eEl Unificador de Mundos' + spawnMessage: '&5El Unificador de Mundos se aproxima!' +binder_of_worlds_phase_1_melee_miniboss: + name: '$reinforcementLevel &9Corruptor de la Realidad' +binder_of_worlds_phase_1_melee_reinforcement: + name: '$reinforcementLevel &8Desgastador de la Realidad' +binder_of_worlds_phase_1_parkour_reinforcement: + name: '$reinforcementLevel &8 Heraldo de la Realidad' +binder_of_worlds_phase_1_ranged_miniboss: + name: '$reinforcementLevel &3Arruinador de la Realidad' +binder_of_worlds_phase_1_ranged_reinforcement: + name: '$reinforcementLevel &6Arruinador de la Realidad' +binder_of_worlds_phase_1_status_miniboss: + name: '$reinforcementLevel &6Llave de la Realidad' +binder_of_worlds_phase_1_status_reinforcement: + name: '$reinforcementLevel &3Rompedor de la Realidad' +binder_of_worlds_phase_2: + name: '$eventBossLevel &eEl Unificador de Mundos' +binder_of_worlds_phase_3: + name: '$eventBossLevel &eEl Unificador de Mundos' +binder_of_worlds_phase_3_shulker_reinforcement: + name: '$reinforcementLevel &3Renderizado de Grietas de la Realidad' +binder_of_worlds_phase_4: + name: '$eventBossLevel &eEl Unificador de Mundos' + deathMessages: + - '&e&l---------------------------------------------' + - '&9El unificador está atado a este plano mortal ya no más!' + - '&c&l 1er Dañador: ¡$damager1name &ccon $damager1damage daño!' + - '&6&l 2do Dañador: ¡$damager2name &6con $damager2damage daño!' + - '&e&l 3er Dañador: ¡$damager3name &econ $damager3damage de daño!' + - '&aAsesinos: $players' + - '&e&l---------------------------------------------' +catacombs_tier_10_miniboss: + name: '$minibossLevel &7Terragog' +catacombs_tier_15_boss: + name: '$bossLevel &6El Rattler' + deathMessages: + - '&e&l---------------------------------------------' + - '&9El Rattler se ha marchado!' + - '&c&l 1er Dañador: ¡$damager1name &ccon $damager1damage daño!' + - '&6&l 2do Dañador: ¡$damager2name &6con $damager2damage daño!' + - '&e&l 3er Dañador: ¡$damager3name &econ $damager3damage de daño!' + - '&aAsesinos: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Sintiendo.. ¿batallas? + - '¡Muéstrame tu esqueleto!' + - '¡Estás huesado!' + - '¡Tu calcio es débil!' + onDamagedMessages: + - Lo sentí en mis huesos! + - '¡Tengo un hueso que elegir contigo!' + - Doot doot, Mr Esqueleto + - '¡Necesito calcio!' + locationMessage: 'El Rattler: ¡Está a $distance bloques de distancia!' + spawnMessage: '&6¡El Rattler se levanta!' + deathMessage: '&a¡El Rattler ha sido derrotado por $players!' +catacombs_tier_15_mimic_boss: + name: '$bossLevel &6El Olvidado' +catacombs_tier_15_reinforcement: + name: '$reinforcementLevel &eResucitado' +catacombs_tier_5_evoker_guard_2: + name: '$normalLevel &7Guardián de las Catacumbas' + onDamageMessages: + - '¡Prohibida la entrada!' + - '¡La entrada está prohibida!' +catacombs_tier_5_illusioner_guard_1: + name: '$normalLevel &7Guardián de las Catacumbas' + onDamageMessages: + - '¡Prohibida la entrada!' + - '¡La entrada está prohibida!' +colosseum_tier_70_boss_mount: + name: '$bossLevel &4Señor del Foso' + deathMessages: + - '&e&l---------------------------------------------' + - '&4¡Ya no es más El Señor del Pozo!' + - '&c&l 1er Dañador: ¡$damager1name &ccon $damager1damage daño!' + - '&6&l 2do Dañador: ¡$damager2name &6con $damager2damage daño!' + - '&e&l 3er Dañador: ¡$damager3name &econ $damager3damage de daño!' + - '&4Asesinos: $players' + - '&e&l---------------------------------------------' + deathMessage: '&2¡El Señor del Foso ha sido derrotado por $players!' +colosseum_tier_70_boss_p1: + name: '$bossLevel &cMaestro del Foso' + deathMessages: + - '&e&l---------------------------------------------' + - '&4El Maestro del Foso ha caído!' + - '&c&l 1er Dañador: ¡$damager1name &ccon $damager1damage daño!' + - '&6&l 2do Dañador: ¡$damager2name &6con $damager2damage daño!' + - '&e&l 3er Dañador: ¡$damager3name &econ $damager3damage de daño!' + - '&4Asesinos: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4El Maestro del Foso: ¡Está a $distance bloques de distancia!' + spawnMessage: '&4El Maestro del Foso carga en batalla una vez más!' + deathMessage: '&2¡El Maestro del Pozo ha sido asesinado por $players!' +colosseum_tier_70_boss_p2: + name: '$bossLevel &cMaestro del Foso' + deathMessages: + - '&e&l---------------------------------------------' + - '&4El Maestro del Foso ha caído!' + - '&c&l 1er Dañador: ¡$damager1name &ccon $damager1damage daño!' + - '&6&l 2do Dañador: ¡$damager2name &6con $damager2damage daño!' + - '&e&l 3er Dañador: ¡$damager3name &econ $damager3damage de daño!' + - '&4Asesinos: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4El Maestro del Foso: ¡Está a $distance bloques de distancia!' + deathMessage: '&2¡El Maestro del Pozo ha sido asesinado por $players!' +colosseum_tier_70_boss_reinforcements_p1: + name: '$reinforcementLevel &6Gladiator' +colosseum_tier_70_boss_reinforcements_p2: + name: '$reinforcementLevel &6Gladiador' +colosseum_tier_70_gladiator: + name: '$normalLevel &6Gladiador' +colosseum_tier_70_mount_reinforcements: + name: '$reinforcementLevel &cBestia del Foso' +dark_cathedral_tier_75_boss: + name: '$bossLevel &4Cultistas de Cthulhu' + deathMessages: + - '&e&l---------------------------------------------' + - '&4La Invocación ha sido Interrumpida!' + - '&c&l 1er Dañador: ¡$damager1name &ccon $damager1damage daño!' + - '&6&l 2do Dañador: ¡$damager2name &6con $damager2damage daño!' + - '&e&l 3er Dañador: ¡$damager3name &econ $damager3damage de daño!' + - '&4Asesinos: $players' + - '&e&l---------------------------------------------' + onDamageMessages: + - Tontos! + - Chtulhu R'lyeh! + - '¡Nadie puede derrotar a Chtulhu!' + - Mirar al abismo... + locationMessage: 'Cultistas de Cthulhu: $distance bloques de distancia' + spawnMessage: '&cUn Cultista Oscuro Convoca a Cthulhu!' + deathMessage: '&2La invocación ha sido frustrada por $players!' + escapeMessage: '&2El Cultista ha Completado la Invocación!' +dark_cathedral_tier_75_reinforcement: + name: '$reinforcementLevel Seguidor de Cthulhu' + onDamageMessages: + - Cthulhu R'lyeh + onDamagedMessages: + - Cthulhu R'lyeh +darkspire_level_100_berserker_brute: + name: '$normalLevel &7Berserker del Inframundo' +darkspire_level_100_berserker_reanimated: + name: '$normalLevel &fBerserker del Inframundo Reanimado' +darkspire_level_100_blacksmith_brute: + name: '$normalLevel &eMoldeador de oro' +darkspire_level_100_endermite: + name: '$normalLevel &5Voidcrawler' +darkspire_level_100_marksman_piglin: + name: '$normalLevel &9Arquero Tonto' +darkspire_level_100_sentry_brute: + name: '$normalLevel &3Centinela de la Guardia Oscura' +darkspire_level_100_summon_blaze: + name: '$reinforcementLevel &cEngendro Infernal' +darkspire_level_100_summon_evoker: + name: '$reinforcementLevel &cFalso Invocador Infernal' +darkspire_level_100_summon_ghast: + name: '$reinforcementLevel &7Maalkvvhar' +darkspire_level_100_summon_husk: + name: '$reinforcementLevel &cCorrompido de Oroxak' +darkspire_level_100_summon_ravager: + name: '$reinforcementLevel &cEl caído Eerbix' +darkspire_level_100_summon_skeleton: + name: '$reinforcementLevel &cCostillizo' +darkspire_level_110_berserker_reanimated: + name: '$normalLevel &7Berserker del Inframundo Reanimado' +darkspire_level_110_marksman_reanimated: + name: '$normalLevel &9Arquero Tonto Reanimado' +darkspire_level_110_necromancer_evoker: + name: '$normalLevel &8Cabalista del Corazón Oscuro' +darkspire_level_110_sentry_reanimated: + name: '$normalLevel &3Centinela de la Guardia Oscura Reanimado' +darkspire_level_110_stationary_stray: + name: '$normalLevel &6Vigilante Tallador' +darkspire_level_120_miniboss_evoker: + name: '$minibossLevel &4Portero Infernal' +darkspire_level_120_miniboss_illusioner: + name: '$minibossLevel &4Maalkv' +darkspire_level_120_miniboss_skeleton: + name: '$minibossLevel &4Guardián de la cripta' +darkspire_level_120_miniboss_stray: + name: '$minibossLevel &4Nicolas Ribcage' +darkspire_level_120_miniboss_vindicator: + name: '$minibossLevel &4Zalmur el Matadiablillos' +darkspire_level_120_miniboss_wither_skeleton: + name: '$minibossLevel &4Oroxak' +darkspire_level_120_summon_zoglin: + name: '$reinforcementLevel &cHorda de Arzags' +darkspire_level_130_miniboss_phase_brute: + name: '$bossLevel &4Bestia Arzag' + deathMessages: + - '&e&l---------------------------------------------' + - '&4La invasión de las bestias de Arzag ha sido detenida!' + - '&c&l 1er Dañador: ¡$damager1name &ccon $damager1damage daño!' + - '&6&l 2do Dañador: ¡$damager2name &6con $damager2damage daño!' + - '&e&l 3er Dañador: ¡$damager3name &econ $damager3damage de daño!' + - '&4Asesinos: $players' + - '&e&l---------------------------------------------' +darkspire_level_130_miniboss_zoglin: + name: '$bossLevel &4Bestia Arzag' + deathMessages: + - '&e&l---------------------------------------------' + - '&4La invasión de la bestia Arzag ha sido detenida!' + - '&c&l 1er Dañador: ¡$damager1name &ccon $damager1damage daño!' + - '&6&l 2do Dañador: ¡$damager2name &6con $damager2damage daño!' + - '&e&l 3er Dañador: ¡$damager3name &econ $damager3damage de daño!' + - '&4Asesinos: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Bestia Arzag: $distance bloques de distancia' + spawnMessage: '&4Bestia Arzag se prepara para la invasión!' + escapeMessage: '&cArzag la Bestia ha sido saqueada!' +darkspire_level_80_summon_blaze: + name: '$reinforcementLevel &dFalsa invocación Infernal' +fireworks_level_50_boss_phase_1: + name: '$eventBossLevel &cSparky' + spawnMessage: '&e¡Las chispas llenan el cielo!' +fireworks_level_50_boss_phase_2: + name: '$eventBossLevel &cSparky' +fireworks_level_50_boss_phase_3: + name: '$eventBossLevel &cSparky' + deathMessages: + - '&e&l---------------------------------------------' + - '&e¡Se acabó Sparky, se acabó la fiesta!' + - '&c&l 1er Dañador: ¡$damager1name &ccon $damager1damage daño!' + - '&6&l 2do Dañador: ¡$damager2name &6con $damager2damage daño!' + - '&e&l 3er Dañador: ¡$damager3name &econ $damager3damage de daño!' + - '&aAsesinos: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&6¡Sparky regresa para celebrar!' +fireworks_phase_2_reinforcement: + name: '$eventBossLevel &cBoomi' +fireworks_phase_3_reinforcement: + name: '$eventBossLevel &cPartygoer' +the_great_weaver: + name: '$eventBossLevel &cThe Great Weaver' + locationMessage: '&cThe Great Weaver: $distance blocks away!' + spawnMessage: '&cAwful creatures have appeared!' + deathMessage: '&aThe Great Weaver and it''s brood have been stopped by $players!' + escapeMessage: '&4The Great Weaver and it''s brood have vanished!' +the_great_weaver_summon: + name: '$eventBossLevel &4Brood Mother' +the_great_weaver_summon_1: + name: '$eventBossLevel &6Brood' +halloween_event_boss_mount: + name: '$minibossLevel Daredevil' +halloween_event_boss_p1: + name: '$bossLevel Dullahan' + locationMessage: '&4Dullahan: $distance bloques de distancia!' + spawnMessage: '&4¡No pierdas la cabeza ahora, el jinete sin cabeza camina sobre la tierra de nuevo!' + deathMessage: '&4El jinete sin cabeza fue vencido por $players!' + escapeMessage: '&4El jinete sin cabeza se ha ido, para atormentar los sueños de alguien mas!' +halloween_event_boss_p2: + name: '$bossLevel Dullahan' + deathMessages: + - '&e&l---------------------------------------------' + - '&4El jinete sin cabeza ha sido vencido!' + - '&c&l 1er Dañador: ¡$damager1name &ccon $damager1damage daño!' + - '&6&l 2do Dañador: ¡$damager2name &6con $damager2damage daño!' + - '&e&l 3er Dañador: ¡$damager3name &econ $damager3damage de daño!' + - '&4Asesinos: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Dullahan: $distance bloques de distancia!' + deathMessage: '&4El jinete sin cabeza fue vencido por $players!' + escapeMessage: '&4El jinete sin cabeza se ha ido, para atormentar los sueños de alguien mas!' +halloween_event_boss_reinforcement: + name: '$normalLevel Esqueleto Fantasmal' +the_hunter: + name: '$eventBossLevel &4The Hunter' + locationMessage: '&cThe Hunter: $distance blocks away!' + spawnMessage: '&cA Hunter is on the prowl!' + deathMessage: '&aThe Hunter was hunted to extinction by $players!' + escapeMessage: '&4The Hunter declares the hunt now over!' +the_hunter_mount: + name: '$eventBossLevel &fTamed Beast' +the_living_dead: + name: '$reinforcementLevel &6Muertos vivientes' +northpole_elf: + name: '$normalLevel &2Taller del Elfo' +northpole_elf_summon: + name: '$reinforcementLevel &aElfos de Santa' +northpole_jack_frost: + name: '$bossLevel &bJack Frost' +northpole_krampus: + name: '$bossLevel &5Krampus' +northpole_mrs_claus: + name: '$bossLevel &cMrs. Claus' +northpole_santa_claus: + name: '$bossLevel &4Santa Claus' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Alguien robó todos los regalos de Santa!' + - '&c&l 1er Dañador: ¡$damager1name &ccon $damager1damage daño!' + - '&6&l 2do Dañador: ¡$damager2name &6con $damager2damage daño!' + - '&e&l 3er Dañador: ¡$damager3name &econ $damager3damage de daño!' + - '&4Asesinos: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4Santa Claus: $distance bloques de distancia' + spawnMessage: '&4Santa Claus esta preparandose para Navidad!!' + escapeMessage: '&cSanta partió en su trineo!' +northpole_skeleton_summon: + name: '$reinforcementLevel &dAlma de las travesuras' +northpole_snowy_wraith: + name: '$reinforcementLevel &1Espectro Nevado' +the_phantom: + name: '$eventBossLevel &7The Phantom' + locationMessage: '&cThe Phantom: $distance blocks away!' + spawnMessage: '&cA Phantom roams in the dark!' + deathMessage: '&aThe Phantom and his evil troupe have been stopped by $players!' + escapeMessage: '&4The Phantom has left!' +the_phantom_summon_1: + name: '&fCave Spider' +the_phantom_summon_2: + name: '&fWItch' +the_phantom_summon_3: + name: '&fZombie' +the_phantom_summon_4: + name: '&fHusk' +the_phantom_summon_5: + name: '&fDrowned' +the_phantom_summon_6: + name: '&fSkeleton' +the_phantom_summon_7: + name: '&fStray' +the_phantom_summon_8: + name: '&fEnderman' +pirate_ship_tier_10: + name: '$normalLevel &cTripulante' + onDamageMessages: + - Yarr! + - Harr! + - Avast, amigo! + - Todos con las manos hoay! + - '¡Baile del Cáñamo!' + - Ye dungbie! + - Tiembla la madera! +pirate_ship_tier_15: + name: '$normalLevel &cMarinero' + onDamageMessages: + - Yarr! + - Harr! + - Avast, amigo! + - Todos con las manos hoay! + - '¡Baile del Cáñamo!' + - Ye dungbie! + - Tiembla la madera! +pirate_ship_tier_20_melee_1: + name: '$normalLevel &cCompañero Tripulante' + onDamageMessages: + - Yarr! + - Harr! + - Avast, amigo! + - Todos con las manos hoay! + - '¡Baile del Cáñamo!' + - Ye dungbie! + - Tiembla la madera! +pirate_ship_tier_20_melee_2: + name: '$normalLevel &ePatán Borracho' + onDamageMessages: + - Yarr! + - Harr! + - Avast, amigo! + - Todos con las manos hoay! + - '¡Baile del Cáñamo!' + - Ye dungbie! + - Tiembla la madera! +pirate_ship_tier_20_miniboss: + name: '$minibossLevel &dCocinero Cookie' + onDamageMessages: + - Kestas aciendo en mi cossssssxina! + - '¡Tengo capas!' + - Estas servido! + - Fuera de mi cocina! + deathMessage: '&2El Cocinero Cookie ha sido rebanado y cocinado por $players!' +pirate_ship_tier_20_ranged: + name: '$normalLevel &cCompañero Tripulante' + onDamageMessages: + - Yarr! + - Harr! + - Avast, amigo! + - Todos con las manos hoay! + - '¡Baile del Cáñamo!' + - Ye dungbie! + - Tiembla la madera! +pirate_ship_tier_25_miniboss_1: + name: '$miniboss &cCaronte el Timonel' + onDamageMessages: + - Tontos a la vistaaaa! + - '¡Un oponente digno en la proa!' + deathMessage: '&2Caronte el Timonel ha sido abatido por $players!' +pirate_ship_tier_30_melee: + name: '$normalLevel &cPirata' + onDamageMessages: + - Yarr! + - Harr! + - Avast, amigo! + - Todos con las manos hoay! + - '¡Baile del Cáñamo!' + - Ye dungbie! + - Tiembla la madera! +pirate_ship_tier_30_miniboss_1: + name: '$minibossLevel &7Crushy el Triturador' + onDamageMessages: + - Yarr! + - Harr! + - Avast, amigo! + - Todos con las manos hoay! + - '¡Baile del Cáñamo!' + - Ye dungbie! + - Tiembla la madera! + deathMessage: '&7Crushy el triturador ha sido aplastado por $players!' +pirate_ship_tier_30_ranged: + name: '$normalLevel &cPirata' + onDamageMessages: + - Yarr! + - Harr! + - Avast, amigo! + - Todos con las manos hoay! + - '¡Baile del Cáñamo!' + - Ye dungbie! + - Tiembla la madera! +pirate_ship_tier_35: + name: '$normalLevel &4Navegante Pirata' + onDamageMessages: + - Yarr! + - Harr! + - Avast, amigo! + - Todos con las manos hoay! + - '¡Baile del Cáñamo!' + - Ye dungbie! + - Tiembla la madera! +pirate_ship_tier_35_miniboss_1: + name: '$minibossLevel &cSegundo al Mando' + onDamageMessages: + - No tienes permiso para estar aquí! + - Acompañantes del Capitán, Apártense! +pirate_ship_tier_35_miniboss_2: + name: '$minibossLevel &cSegundo al Mando' + onDamageMessages: + - No esta permitido que estes aca! + - Acompañantes del Capitán, Apártense! +pirate_ship_tier_40_miniboss_1: + name: '$minibossLevel &4Primera Mano' + onDamageMessages: + - Yarr! + - Harr! + - Avast, amigo! + - Todos con las manos hoay! + - '¡Baile del Cáñamo!' + - Ye dungbie! + - Tiembla la madera! + deathMessage: '&6La primera mano del barco pirata ha sido degradado por $players!' +pirate_ship_tier_45_boss: + name: '$bossLevel &4Capitan Barba Negra' + onDamageMessages: + - '¡Fuera de mi nave!' + - Arrg, Marineros de agua dulce! + spawnMessage: '&4El Capitán Barba Negra lidera el Barco Pirata!' + deathMessage: '&2El Capitán Barba Negra ha sido rasurado por $players!' + escapeMessage: '&2El Capitán Barba Negra ha escapado con el botín!' +the_returned: + name: '&6El Retornado $reinforcementLevel' +ruins_boss_p1: + name: '$eventBossLevel &9Thor' + spawnMessage: '&6Relampagos descienden a la tierra desde el cielo!' +ruins_boss_p2: + name: '$eventBossLevel &9Thor' + deathMessages: + - '&e&l---------------------------------------------' + - '&4Thor fue enviado de regreso a Asgard!' + - '&c&l 1er Dañador: ¡$damager1name &ccon $damager1damage daño!' + - '&6&l 2do Dañador: ¡$damager2name &6con $damager2damage daño!' + - '&e&l 3er Dañador: ¡$damager3name &econ $damager3damage de daño!' + - '&aAsesinos: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&6Relampagos descienden a la tierra desde el cielo!' +ruins_boss_reinforcement: + name: '$eventBossLevel &7Fenrir' +sewer_tier_10: + name: '$normalLevel &fMirón' +sewer_tier_15: + name: '$normalLevel &2Rastreador' +sewer_tier_20_dry: + name: '$normalLevel &1Vagabundo Perdido' +sewer_tier_20_gravity_boss: + name: '$minibossLevel &1Spark' +sewer_tier_20_water: + name: '$normalLevel &1Contrabandista' + onDamageMessages: + - No deberias de estar aquí! + onDamagedMessages: + - Nadie deberia de permanecer parado cuando caminamos! +sewer_tier_20_water_boss: + name: '$minibossLevel &1Héroe Olvidado' +sewer_tier_20_wither_boss: + name: '$minibossLevel &2Cadáver Marchito' +sewer_tier_30_ice_boss: + name: '$minibossLevel &2Espectro de Hielo' +sewer_tier_30_invisibility_boss: + name: '$minibossLevel &2Arquero Sombío' +sewer_tier_30_melee: + name: '$normalLevel &5Bestia de Alcantarilla' +sewer_tier_30_ranged: + name: '$normalLevel &5Susurro Espiritual' + onDamageMessages: + - '¡Una maldición sobre ti!' + - '¡Una viruela para tu familia!' + - '¡Siente la íra de los espíritus!' + onDamagedMessages: + - '¡Me fastidias tanto!' + - '¡Espíritus, ¡protéjanme!' +sewer_tier_40: + name: '$normalLevel &6Espejísmo' + onDamageMessages: + - Tú victoria, una mentira + - Tus probabilidades, Siniestro + - Tu vida, la mía + onDamagedMessages: + - Este dolor, una ilusión + - Esta sangre, un espejismo + - Esta debilidad, una mentira +sewer_tier_40_darkness_boss: + name: '$minibossLevel &2El Maestro de las Sombras' +sewer_tier_40_darkness_boss_reinforcement: + name: '$reinforcementLevel &2Sombra' +sewer_tier_40_fire_boss: + name: '$minibossLevel &2El Maestro Parrillero' +sewer_tier_40_fire_boss_reinforcement: + name: '$reinforcementLevel &2Llama' +sewer_tier_40_poison_boss: + name: '$minibossLevel &2Jardinero Tóxico' + onDamageMessages: + - '¡Siente la ira de la naturaleza!' + onDamagedMessages: + - '¡A mí, esbirros!' +sewer_tier_40_poison_boss_reinforcement: + name: '$reinforcementLevel &2Jardinero Caído' +sewer_tier_5: + name: '$normalLevel &7Trabajador de las alcantarillas' + onDamageMessages: + - '¡Esta zona está restringida!' + - '¡No saltes a las cubas!' + - | + ¡Se supone que no debieras estar aquí! + onDamagedMessages: + - '¿Sabes lo que estás haciendo!?' + - '¡Inconsciente!' + - '¡No te atrevas!' +sewer_tier_50: + name: '$normalLevel &3Piraña de las Alcantarillas' +sewer_tier_50_lightning_boss: + name: '$minibossLevel &2Mjolnir' +sewer_tier_50_ravager_boss: + name: '$minibossLevel &2Monstruosidad de las Alcantarillas' +sewer_tier_50_spider_boss: + name: '$minibossLevel &2Trepador Ancestral' +sewer_tier_50_spider_boss_reinforcement: + name: '$reinforcementLevel &2Arañita' +sewer_tier_50_water_boss: + name: '$minibossLevel &2Rey Piraña' +sewer_tier_50_water_boss_reinforcement: + name: '$reinforcementLevel &2Príncipe Piraña' +sewer_tier_60: + name: '$normalLevel &4El Ahogado' +sewer_tier_70_boss: + name: '$bossLevel &4El Rey Ahogado' + deathMessages: + - '&e&l---------------------------------------------' + - '&4¡El Rey Ahogado ha sido asesinado!' + - '&c&l 1er Dañador: ¡$damager1name &ccon $damager1damage daño!' + - '&6&l 2do Dañador: ¡$damager2name &6con $damager2damage daño!' + - '&e&l 3er Dañador: ¡$damager3name &econ $damager3damage de daño!' + - '&4Asesinos: $players' + - '&e&l---------------------------------------------' + spawnMessage: '&cLas alcantarillas resuenan con el clamor de un rey que regresó...' + deathMessage: '&2¡El Rey Ahogado ha sido asesinado!' + escapeMessage: '&2Las alcantarillas se mantienen en silencio, por ahora...' +sewer_tier_70_boss_reinforcement: + name: '$reinforcementLevel &4El Ahogado' +totem_zombie_1: + name: '$eventBossLevel Cabeza Zombi' + deathMessages: + - '&e&l---------------------------------------------' + - '&4El Tótem Zombi ha sido asesinado!' + - '&c&l 1er Dañador: ¡$damager1name &ccon $damager1damage daño!' + - '&6&l 2do Dañador: ¡$damager2name &6con $damager2damage daño!' + - '&e&l 3er Dañador: ¡$damager3name &econ $damager3damage de daño!' + - '&aAsesinos: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cTótem Zombi: ¡$distance bloques de distancia!' + spawnMessage: '&cLa Abominación del Dr. Craftenmine ha sido vista!' + deathMessage: '&a¡La Abominación del Dr. Craftenmine ha sido eliminada por $players!' + escapeMessage: '&4La creación del Dr. Craftenmine ha escapado!' +totem_zombie_2: + name: '$eventBossLevel Tótem Zombi' +totem_zombie_3: + name: '$eventBossLevel Tótem Zombi' +totem_zombie_4: + name: '$eventBossLevel Tótem Zombi' +totem_zombie_5: + name: '$eventBossLevel Tótem Zombi' +totem_zombie_6: + name: '$eventBossLevel Tótem Zombi' +treasure_goblin: + name: '&eGoblin del Tesoro &f$eventBossLevel' + deathMessages: + - '&e&l---------------------------------------------' + - '&e¡El Goblin del Tesoro ha sido saqueado!' + - '&c&l 1er Dañador: ¡$damager1name &ccon $damager1damage daño!' + - '&6&l 2do Dañador: ¡$damager2name &6con $damager2damage daño!' + - '&e&l 3er Dañador: ¡$damager3name &econ $damager3damage de daño!' + - '&aAsesinos: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cGoblin del Tesoro: ¡$distance bloques de distancia!' + spawnMessage: '&a¡Un Goblin del Tesoro ha sido avistado!' + deathMessage: '&a¡Un Globin del Tesora ha sido asesinado por $players!' + escapeMessage: '&4¡Un Goblin del Tesoro ha escapado!' +tree_defender: + name: '$eventBossLevel &2Tree Defender' +undead_farmer: + name: '$eventBossLevel &aUndead Farmer' + locationMessage: '&cUndead Farmer: $distance blocks away!' + spawnMessage: '&cAn Undead Farmer walks the earth!' + deathMessage: '&aThe Undead Farmer''s career was ended by $players!' + escapeMessage: '&4The Undead Farmer has gone back to rest!' +undead_farmer_summon: + name: '$eventBossLevel &2Farmers Pride' +undead_farmer_summon_1: + name: '$eventBossLevel &2Failed Hog' +undead_horde_summon_1: + name: '$reinforcementLevel &aUndead Horde' +undead_horde_summon_2: + name: '$reinforcementLevel &dUndead Horde' +undead_horde_summon_3: + name: '$reinforcementLevel &eUndead Horde' +unwanted_visitor: + name: '$eventBossLevel &9Unwanted Visitor' + locationMessage: '&cUnwanted Visitor: $distance blocks away!' + spawnMessage: '&cAn Unwanted Visitor has come to the nether to warm up!' + deathMessage: '&aThe Visitor was slain by $players!' + escapeMessage: '&4The Visitor has gone back to his chilly domain!' +unwanted_visitor_summon: + name: '$eventBossLevel &bIce Clone' +vampire_boneman: + name: '$reinforcementLevel &7Arañita' +vampire_brute: + name: '$normalLevel &1Vampiro Bruto' +vampire_brute_coffin_breaker: + name: '$normalLevel &1Vampiro Bruto' +vampire_brute_gargoyle_rush_left: + name: '$normalLevel &3Vampiro Bruto' +vampire_brute_gargoyle_rush_left_phase_2: + name: '$normalLevel &3Vampiro Bruto' +vampire_brute_gargoyle_rush_right: + name: '$normalLevel &3Vampiro Bruto' +vampire_brute_gargoyle_rush_right_phase_2: + name: '$normalLevel &3Vampiro Bruto' +vampire_fledgling: + name: '$normalLevel &9Vampiro Joven' +vampire_fledgling_coffin_breaker: + name: '$normalLevel &9Vampiro Pichón' +vampire_fledgling_gargoyle_overlord: + name: '$normalLevel &9Vampiro Pichón' +vampire_gargoyle: + name: '$normalLevel &6Gargola Vampirica' +vampire_grunt: + name: '$normalLevel &1Gruñido de Vampiro' +vampire_grunt_coffin_breaker: + name: '$normalLevel &1Gruñido de Vampiro' +vampire_grunt_gargoyle_rush_left: + name: '$normalLevel &1Gruñido de Vampiro' +vampire_grunt_gargoyle_rush_left_phase_2: + name: '$normalLevel &1Gruñido de Vampiro' +vampire_grunt_gargoyle_rush_right: + name: '$normalLevel &1Gruñido de Vampiro' +vampire_grunt_gargoyle_rush_right_phase_2: + name: '$normalLevel &1Gruñido de Vampiro' +vampire_hound: + name: '$reinforcementLevel &bSabueso De Vampiro' +vampire_king: + name: '$bossLevel &4Rey vampiro' + deathMessages: + - '&e&l---------------------------------------------' + - '&4¡El Rey Vampiro ha sido asesinado!' + - '&c&l 1er Dañador: ¡$damager1name &ccon $damager1damage daño!' + - '&6&l 2do Dañador: ¡$damager2name &6con $damager2damage daño!' + - '&e&l 3er Dañador: ¡$damager3name &econ $damager3damage de daño!' + - '&4Asesinos: $players' + - '&e&l---------------------------------------------' + locationMessage: '&4El Rey Vampiro esta a: $distance bloques de ti.' + spawnMessage: '&cEl Rey Vampiro se va a su trono de vuelta...' + deathMessage: '&4¡El Rey Vampiro ha sido asesinado!' + escapeMessage: '&2La obscuridad huye, pero por cuánto tiempo...' +vampire_king_phase_2: + name: '$bossLevel &4Rey vampiro' +vampire_king_phase_3: + name: '$bossLevel &4Rey vampiro' +vampire_king_phase_4: + name: '$bossLevel &4Rey vampiro' +vampire_king_phase_5: + name: '$bossLevel &4Rey vampiro' +vampire_king_phase_6: + name: '$bossLevel &4Rey vampiro' +vampire_level_120_miniboss_evoker: + name: '$minibossLevel &4Espíritu del Infierno' +vampire_level_120_miniboss_skeleton: + name: '$minibossLevel &4Espíritu Guardián de la Cripta' +vampire_level_120_miniboss_stray: + name: '$minibossLevel &4Espiritu de Nicolas Ribcage' +vampire_level_120_miniboss_wither_skeleton: + name: '$minibossLevel &4Espíritu de Oroxak' +vampire_necromancer: + name: '$normalLevel &5Vampiro Hechicero Nigromante' +vampire_necromancer_dining_hall: + name: '$normalLevel &5Vampiro Hechicero Nigromante' +vampire_necromancer_entrance: + name: '$normalLevel &5Vampiro Hechicero Nigromante' +vampire_necromancer_foresight_pool: + name: '$normalLevel &5Vampiro Hechicero Nigromante' +vampire_necromancer_gargoyle_rush: + name: '$normalLevel &5Vampiro Hechicero Nigromante' +vampire_necromancer_gargoyle_rush_phase_2: + name: '$normalLevel &5Vampiro Hechicero Nigromante' +vampire_necromancer_left_bedroom: + name: '$normalLevel &5Vampiro Hechicero Nigromante' +vampire_necromancer_right_bedroom: + name: '$normalLevel &5Vampiro Hechicero Nigromante' +vampire_necromancer_supply_room: + name: '$normalLevel &5Vampiro Hechicero Nigromante' +vampire_necromancer_supreme_coffin_breaker: + name: '$minibossLevel &5Vampiro Hechicero Nigromante Supremo' +vampire_necromancer_supreme_coffin_breaker_phase_2: + name: '$minibossLevel &5Vampiro Hechicero Nigromante Supremo' +vampire_necromancer_supreme_coffin_breaker_phase_3: + name: '$minibossLevel &5Vampiro Hechicero Nigromante Supremo' +vampire_necromancer_supreme_coffin_breaker_phase_4: + name: '$minibossLevel &5Vampiro Hechicero Nigromante Supremo' +vampire_necromancer_supreme_coffin_breaker_phase_5: + name: '$minibossLevel &5Vampiro Hechicero Nigromante Supremo' +vampire_necromancer_supreme_gargoyle_overlord: + name: '$minibossLevel &5Vampiro Hechicero Nigromante Supremo' +vampire_necromancer_supreme_gargoyle_overlord_phase_2: + name: '$minibossLevel &5Vampiro Hechicero Nigromante Supremo' +vampire_necromancer_supreme_gargoyle_overlord_phase_3: + name: '$minibossLevel &2Señor de las Gargolas' +vampire_sentinel: + name: '$minibossLevel &eCentinela de Vampiros' +vampire_thrall: + name: '$reinforcementLevel &dEsclavo Vampirico' +vampire_wraith: + name: '$minibossLevel &8El Escurrido' +vampire_wraith_phase_2: + name: '$minibossLevel &8El Ahogado' +vampire_zombie: + name: '$normalLevel &aCascara Escurrida' +vex_top: + name: '$eventBossLevel &eVex Selfish Top' + locationMessage: '&cVex Troublemakers: $distance blocks away!' + spawnMessage: '&cA gang of Vex Troublemakers have appeared!' + deathMessage: '&aThe Vex Troublemakers were slain by $players!' + escapeMessage: '&4The Vex Troublemakers have decided to leave.' +vex_top_mount_1: + name: '$eventBossLevel &6Vex Bottom' +vex_top_mount_2: + name: '$eventBossLevel &6Vex Bottom' +vex_top_mount_3: + name: '$eventBossLevel &6Vex Bottom' +warlock: + name: '$eventBossLevel &dWarlock' + locationMessage: '&cWarlock: $distance blocks away!' + spawnMessage: '&cA demon riding Warlock has appeared!' + deathMessage: '&aThe Warlock was slain by $players!' + escapeMessage: '&4The Warlock ran away on his demon!' +warlock_mount: + name: '$eventBossLevel &dDemon' +wasp_queen: + name: '$eventBossLevel &aWasp Queen' + locationMessage: '&cWasp Queen: $distance blocks away!' + spawnMessage: '&cA wasp swarm has been sighted!' + deathMessage: '&aThe wasp swarm was eliminated by $players!' + escapeMessage: '&4The wasp swarm has flown away.' +wasp_queen_summon: + name: '$eventBossLevel &aWasp' +water_pest: + name: '$eventBossLevel &3Water Pest' + locationMessage: '&cWater Pest: $distance blocks away!' + spawnMessage: '&cAn annoying foe swims the waters!' + deathMessage: '&aThe Water Pest was slain by $players!' + escapeMessage: '&4The waters are clear of all Pests' +weapons_goblin: + name: '$eventBossLevel &cGoblin Armado' + deathMessages: + - '&e&l---------------------------------------------' + - '&eEl Goblin Armado ha sido desarmado!' + - '&c&l 1er Dañador: ¡$damager1name &ccon $damager1damage daño!' + - '&6&l 2do Dañador: ¡$damager2name &6con $damager2damage daño!' + - '&e&l 3er Dañador: ¡$damager3name &econ $damager3damage de daño!' + - '&aAsesinos: $players' + - '&e&l---------------------------------------------' + locationMessage: '&cGoblin Armado: $distance bloques de distancia!' + spawnMessage: '&cUn Goblin Armado ha sido avistado!' + deathMessage: '&aUn Goblin Armado ha sido asesinado por $players!' + escapeMessage: '&4El Goblin Armado ha escapado!' +wendigo: + name: '$eventBossLevel &7Wendigo' + locationMessage: '&cWendigo: $distance blocks away!' + spawnMessage: '&cSomething awful has appeared!' + deathMessage: '&aThe Wendigo has been slain $players!.' + escapeMessage: '&4The Wendigo has disappeared!' +wendigo_summon: + name: '$reinforcementLevel &aWindigo' +werehare: + name: '$eventBossLevel &5Alice' + locationMessage: '&cWerehare: $distance blocks away!' + spawnMessage: '&cA bloody roar can be heard! A werehare approaches!' + deathMessage: '&a$players! made sure to end the werehare''s reign!' + escapeMessage: '&4The werehare escaped!' +werehare_p2: + name: '$eventBossLevel &dWerehare' +wild_wolf: + name: '$reinforcementLevel &7Lobo Salvaje' +wood_league_wave_10_boss: + name: '$bossLevel &4Perro Malo' +wood_league_wave_10_reinforcement: + name: '$reinforcementLevel &cCachorro Malo' +wood_league_wave_11_melee: + name: '$normalLevel &4Zombi de la Arena' +wood_league_wave_11_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_12_melee: + name: '$normalLevel &4Zombi de la Arena' +wood_league_wave_12_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_13_melee: + name: '$normalLevel &4Zombi de la Arena' +wood_league_wave_13_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_14_melee: + name: '$normalLevel &4Zombi de la Arena' +wood_league_wave_14_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_15_miniboss: + name: '$bossLevel &4Mr. Oinkers' + onDamagedMessages: + - '¿¡Oink!?' +wood_league_wave_16_melee: + name: '$normalLevel Fan de Mr. Oinkers' +wood_league_wave_16_ranged: + name: '$normalLevel Fan de Mr. Oinkers' +wood_league_wave_17_melee: + name: '$normalLevel &4Zombi de la Arena' +wood_league_wave_17_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_18_melee: + name: '$normalLevel Entusiasta del Club de Esgrima' +wood_league_wave_19_ranged: + name: '$normalLevel Entusiasta del Club de Tiro con Arco' +wood_league_wave_1_melee: + name: '$normalLevel Arena Zombie' +wood_league_wave_1_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_20_boss: + name: '$bossLevel &2Zoltan' +wood_league_wave_21_melee: + name: '$normalLevel &4Zombi de la Arena' +wood_league_wave_21_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_22_melee: + name: '$normalLevel &4Zombi de la Arena' +wood_league_wave_22_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_23_melee: + name: '$normalLevel &4Zombi de la Arena' +wood_league_wave_23_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_24_melee: + name: '$normalLevel &4Zombi de la Arena' +wood_league_wave_24_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_25_miniboss: + name: '$minibossLevel &bAgdluak' +wood_league_wave_26_melee: + name: '$normalLevel &4Zombi de la Arena' +wood_league_wave_26_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_27_melee: + name: '$normalLevel &4Zombi de la Arena' +wood_league_wave_27_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_28_melee: + name: '$normalLevel &4Zombi de la Arena' +wood_league_wave_29_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_2_melee: + name: '$normalLevel Zombi de la Arena' +wood_league_wave_2_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_30_boss: + name: '$bossLevel &2Viper del Sur' +wood_league_wave_31_melee: + name: '$normalLevel &4Zombi de la Arena' +wood_league_wave_31_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_32_melee: + name: '$normalLevel &4Zombi de la Arena' +wood_league_wave_32_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_33_melee: + name: '$normalLevel &4Zombi de la Arena' +wood_league_wave_33_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_34_melee: + name: '$normalLevel &4Zombi de la Arena' +wood_league_wave_34_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_35_miniboss: + name: '$minibossLevel &6El Bufón' +wood_league_wave_36_melee: + name: '$normalLevel &4Zombi de la Arena' +wood_league_wave_36_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_37_melee: + name: '$normalLevel &4Zombi de la Arena' +wood_league_wave_37_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_38_melee: + name: '$normalLevel &4Espadachín de la Arena' +wood_league_wave_39_ranged: + name: '$normalLevel Arquero de la Arena' +wood_league_wave_3_melee: + name: '$normalLevel Zombi de la Arena' +wood_league_wave_3_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_40_boss: + name: '$bossLevel &cCrucio el Portador de Maldiciones' +wood_league_wave_41_melee: + name: '$normalLevel &4Zombi de la Arena' +wood_league_wave_41_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_42_healer: + name: '$normalLevel Curandero de la Arena' +wood_league_wave_42_melee: + name: '$normalLevel &4Zombi de la Arena' +wood_league_wave_42_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_43_healer: + name: '$normalLevel Curandero de la Arena' +wood_league_wave_43_melee: + name: '$normalLevel &4Zombi de la Arena' +wood_league_wave_43_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_44_healer: + name: '$normalLevel Curandero de la Arena' +wood_league_wave_44_melee: + name: '$normalLevel &4Zombi de la Arena' +wood_league_wave_44_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_45_miniboss: + name: '$minibossLevel &6Mil Hojas' +wood_league_wave_46_healer: + name: '$normalLevel Curandero de la Arena' +wood_league_wave_46_melee: + name: '$normalLevel &4Zombi de la Arena' +wood_league_wave_46_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_47_healer: + name: '$normalLevel Curandero de la Arena' +wood_league_wave_47_melee: + name: '$normalLevel &4Zombi de la Arena' +wood_league_wave_47_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_48_healer: + name: '$normalLevel Curandero de la Arena' +wood_league_wave_48_melee: + name: '$normalLevel &4Zombi de la Arena' +wood_league_wave_49_healer: + name: '$normalLevel Curandero de la Arena' +wood_league_wave_49_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_4_melee: + name: '$normalLevel Zombi de la Arena' +wood_league_wave_4_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_50_boss: + name: '$bossLevel &6El Campeón Úter' +wood_league_wave_50_boss_p2: + name: '$bossLevel &6El Campeón Úter' +wood_league_wave_50_boss_p3: + name: '$bossLevel &6El Campeón Úter' +wood_league_wave_50_reinforcement: + name: '$reinforcementLevel &6Seguidor de Úter' +wood_league_wave_5_miniboss: + name: '$minibossLevel &cVaca Extraña' + onDamagedMessages: + - '¡Woof!' +wood_league_wave_6_melee: + name: '$normalLevel Zombi de la Arena' +wood_league_wave_6_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_7_melee: + name: '$normalLevel Zombi de la Arena' +wood_league_wave_7_ranged: + name: '$normalLevel Ballestero de la Arena' +wood_league_wave_8_melee: + name: '$normalLevel Zombi de la Arena' +wood_league_wave_9_ranged: + name: '$normalLevel Ballestero de la Arena' +yeti: + name: '$eventBossLevel &bYeti' + locationMessage: '&cYeti: $distance blocks away!' + spawnMessage: '&cA mighty beast has appeared!' + deathMessage: '&aThe beast is no more thanks to $players!.' + escapeMessage: '&4The beast has escaped!' +yezhi_baba: + name: '$eventBossLevel &cYezhi Baba' + locationMessage: '&cYezhi Baba: $distance blocks away!' + spawnMessage: '&cA foul hag has emerged from her dwelling!' + deathMessage: '&a$players! has put the hag to rest, for now.' + escapeMessage: '&4AThe hag has left!' +yezhi_baba_summon: + name: '$reinforcementLevel &4Yezhi Baba' +zombie_friends_friend: + name: '&7Amigo Zombi $reinforcementLevel' +zombie_king: + name: '&4Rey Zombi $eventBossLevel' + locationMessage: '&cRey Zombie: ¡ $distance bloques de distancia!' + spawnMessage: '&4¡El Rey Zombie ha sido avistado!' + deathMessage: '&a¡El Rey Zombie ha sido asesinado por $players!' + escapeMessage: '&a¡El Rey Zombie ha escapado!' +zombie_parents_dad: + name: '&7Papá Zombi $reinforcementLevel' +zombie_parents_mom: + name: '&7Mamá Zombi $reinforcementLevel' +back_teleporter: + name: Hermes + role: + greetings: + - '¡Bienvenido al centro del gremio de aventureros!' + dialog: + - '¿Necesitas regresar?' + farewell: + - Buen viaje, amigo. + noPreviousLocationMessage: '&8[EliteMobs] &cNo se pudo enviarte de vuelta a tu ubicación anterior - no se encontró ninguna ubicación!' +barkeep: + name: Bartley + role: + greetings: + - Necesitas un trago? + - Quireres un trago? + - Sediento? + - Buenas, compañero. + dialog: + - Disfruta una de las especialidades de nuestra casa. + - Bebidas especiales, no las encontrarásn\nen ningún otro lugar. + - Un sorbo y seguirás volviendo\na por más. + farewell: + - Vuelve en cualquier momento + - '¡Bottoms up!' + - '¡Kampai!' + - '¡Salut!' + - '¡Brosd!' + - '¡Salud!' + - '¡À la vôtre !' + - '¡Prost!' + - '¡Santi!' + - '¡Salute!' + - '¡Saúde!' + - '¡Cheers!' + - 乾杯! +blacksmith: + name: Greg + role: + greetings: + - Bienvenido a nuestra tienda! + - '¡Vende tu mercancías aquí!' + - '¡Mercancías frescas, sólo para ti!' + - '¿Tienes algo para vender?' + - '¿Quieres comprar algo de bueno?' + - '¡Mercancías frescas todos los días!' + dialog: + - '¡Los mobs de alto nivel sueltan\nbotín de valores más altos!' + - '¡Los objetos con muchos \nencantamientos tienen un mayor valor!' + - '¡Los mobs de alto nivel \nsueltan mejor botín!' + - '¡Los mobs de nivel alto tienen \nmayor probabilidad de soltar botín!' + - + - + - '¡Algunos objetos tienen efectos de poción\nespeciales!' + - '¡Algunos objetos tienen efectos únicos!' + - '¡El encantamiento de \nCazador atrae a los mobs \nde élite a ti!' + - '¡Las armas especiales y las \narmaduras soltadas por los \nmobs de élite pueden ser vendidas aquí!' + - '¡Tener rangos más altos del gremio\nincrementarán la calidad del botín\nde los mobs de élite!' + farewell: + - '¡Gracias por su compra!' + - '¡Vuelve pronto!' + - '¡Regresa en cualquier momento!' + - '¡Recomienda esta tienda a tus amigos!' +combat_instructor: + name: Charles + role: + greetings: + - '¿Quieres aprender a combatir?' + - '¿Necesitas una lección de combate?' + - '¿Quieres saber más sobre el combate?' + - '¿Listo para luchar contra los mobs de élite?' + dialog: + - Los objetos que rodean a los mobs de élite\nmuestran los poderes que tienen. + - Cuanto más alto sea el nivel del \nmob de élite, \nmás poderes tendrá + - Cuanto más alto sea el \nnivel del mob de élite, mejor será\nel botín que suelte + - Los mobs de élite de mayores niveles\ntienen más probabilidades\nde soltar objetos especiales + - Los mobs de élite con flechas\nde flotantes disparan flechas a\n los jugadores cercanos + - Los mobs de élite con ojos de\nEnder flotantes te ciegan\ncuando te golpean + - Los mobs de élite con partículas de\nencantamiento flotantes te marean cuando\nte golpean + - Los mobs de élite con cubos de\nlava flotantes te queman\ncuando te golpean + - |- + Los Mobs de Élite con \nbolas de fuego + flotantes disparan bolas de fuego + a los jugadores cercanos + - Los mobs de élite con hielo compacto\n flotante te congelan\ncuando te golpean + - Los mobs de élite con elytras\nflotantes te hacen levitar\ncuando te golpean + - Los mobs de élite con esmeraldas\nflotantes te envenenan\ncuando te golpean + - Los mobs de élite con pistones\nflotantes te empujan\ncuando te golpean + - Losmobs de élite con totems\nflotantes te debilitan\ncuando te golpean + - Los mobs de élite con telarañas\nflotantes te atrapan\ncuando te golpean + - Los mobs de élite con calaveras de wither\nflotantes te dan el efecto de wither\ncuando te golpean + - Los mobs de élite con cofres\nflotantes sueltan botín extra\ncuando los matas + - Los mobs de élite con botas de\noro flotantes son más rápidos + - Los Mobs Élite con tocadiscos\nflotantes se burlan\nde tí en combate + - Los mobs de élite con paneles de\ncristal son invisibles + - Los mobs de élite con flechas \nespectrales flotantes son \ninmunesa las flechas + - Los mobs de élite con plumas\nflotantes son inmunes\nal daño de caída + - Los mobs de élite con llamas\nflotantes son inmunes\nal fuego + - Los mobs de élite con yunques\nflotantes son más pesados\nde lo normal + - Los mobs de élite con \nbloques de huesos flotantes \ndejan su cadáver al matarlos + - Los Mobs Élite con bloques de slime\nflotantes saltan más alto\nde lo normal + - Los mobs de élite con bolas de slime\nflotantes crean un vacío\nal morir + - Los mobs de élite con cuerdas\nflotantes te atraen\ncuando te golpean + - Los mobs de élite con huesos\nflotantes crean pilares de huesos\ndurante el combate + - Los mobs de élite con flechas encantadas\nflotantes disparan flechas rastreadoras\ndurante el combate + - Los mobs de élite con champiñones\nflotantes se vuelven gigantes\ncuando los golpeas + - Los mobs de élite con calaveras flotantes\nspawnean refuerzos cuando \nson golpeados + - Los mobs de élite con libros flotantes\nspawnean refuerzos hasta\nque mates al invocador + - Los mobs de élite con huevos flotantes\nspawnean refuerzos\ncuando son golpeados + - Los mobs de élite con fuegos artificiales\nflotantes spawnean al Team Rocket\ncuando son golpeados +enhancer_config: + name: Tim + role: + greetings: + - '¿Quiere'' mejorarrr tus objeto''?' + - '¿Tienes orbes de mejora?' + - '¡Obtén tus objeto'' mejorrrrados aquí!' + - '¡Ahoy!' + - '¿Te queda algo de chatarra hijo?' + dialog: + - '¡Tus objeto'' están fatal,\n consigue mejoras aquí!' + - '¡Mejora tus objeto'' aquí!' + - '¿Tienes un orrrbe de mejora?' + - '¡Esa espada se ve horrible,\nmejórala aquí!' + - '¿Necesitas una mejora?' + farewell: + - '¡No te avergüences a ti mismo ahí afuera!' + - '¡Vuelve cuando tengas más orbes!' + - '¡Ve a conseguir más orbes!' +frost_queen_teleporter: + name: Ishard the Frostbitten + role: + greetings: + - '' +guide_0: + name: Dux + role: + greetings: + - '¿Sabes sobre el Gremio de Aventureros?' + - '¿Ha estado en el Gremio de Aventureros?' + - '¿Has escuchado sobre el Gremio de Aventureros?' + - '¿Sabes acerca del Gremio del Aventurero?' + dialog: + - '¿Sabes sobre el Gremio de Aventureros?' + - '¿Ha estado en el Gremio de Aventureros?' + - '¿Has escuchado sobre el Gremio de Aventureros?' + - '¿Sabes acerca del Gremio del Aventurero?' + farewell: + - Vuelve en cualquier momento + - '¡Estaré aquí si me necesitas!' + - '¡Estaré cerca!' + - '¡Nos vemos luego!' +guide_1: + name: Casus + role: + greetings: + - '¿Necesita orientación?' + - Necesitas una pista + - '¿Estás perdido?' + - '¿Necesitas ayuda?' + dialog: + - '¡Sé todo acerca de\neste lugar!' + - '¿Quieres conocer a los demás \n miembros del Gremio de Aventureros?' + - '¿Necesitas aprender el camino por\neste lugar?' + farewell: + - Vuelve en cualquier momento + - '¡Estaré aquí si me necesitas!' + - '¡Estaré cerca!' + - '¡Nos vemos luego!' +guild_attendant: + name: Gillian + role: + greetings: + - Bienvenido al\nGremio de los Aventureros! + - '¡Bienvenido!' + dialog: + - '¡Comprueba el tablón para\nver las misiones activas!' + - '¡Puedes hablar conmigo para\ncambiar tu rango de gremio!' + - '¡Puedes vender objetos en la herrería\npor monedas!' + - '¡Puedes hablar con el maestro de la Arena\npara enfrentarte a la Arena!' + - '¡Puedes comprar equipamiento\nen la herrería!' + - '¡Puedes hablar con el maestro de combate\npara comprobar tu nivel de combate!' + - '¡Desbloquear nuevos niveles de gremio\nincrementa tu salud máxima!' + farewell: + - '¡Hasta pronto!' + - '¡Gracias por venir!' + - '¡Feliz caza!' +primis_69ozcanofbepis: + name: '&a69OzCanOfBepis' + role: '&2Creador de Mapas (Un graaaan gamer)' + dialog: + - '¡Espero que estés disfrutando del mapa!' + farewell: + - '¡Diviértete!' +primis_caeruleaum_fisherman: + name: '&3Piscis Nemesis' + role: '&b' + greetings: + - Hola!. + dialog: + - '¡Vaya! Casi me caigo del bote.' + - '¡Maldito monstruo marino!' + - Necesita más cebo. + farewell: + - '¡Más adelante!' + - '¡Buena suerte!' +primis_caeruleaum_fletcher: + name: '&6Ventus Artifex' + role: '&e' + greetings: + - Saludos. + dialog: + - Solía ser un aventurero como tú. + - Bienvenido, forastero + - '¿Necesitas algo?' + - |- + No eres de este lugar, + ¿verdad? + farewell: + - '¡Nos vemos!' + - '¡Vuelve pronto!' +primis_caeruleaum_forager: + name: '&5Venator Pabulatus' + role: '&d' + greetings: + - Hola, extraño. + dialog: + - Solía ser un aventurero como tú. + - Bienvenido, forastero + - '¿Necesitas algo?' + - |- + No eres de este lugar, + ¿verdad? + farewell: + - '¡Nos vemos!' + - '¡Vuelve pronto!' +primis_caeruleaum_hint_giver: + name: '&fVir Loquax' + role: '&fHombre Sabio' + greetings: + - '¡Holita!' + - '¡Hola!' + - '¡Es un placer verte!' + - Saludos! + dialog: + - + - + - + - + - '¡Las ruinas en el sudoeste son un lugar tan horrible!\n ¿Quién iría allí...' + - + - + - '¡He oído que un tipo desagradable de lobo\nse ha instalado en la cueva de lobo!' + farewell: + - '¡Adiós!' + - '¡Nos vemos luego!' + - '¡Venga a visitarme de nuevo!' + - '¡Adiós!' +primis_caeruleaum_injured_fisherman: + name: '&3Callidus Piscatus' + role: '&b' + greetings: + - Hola, viajero. + dialog: + - '¿Has capturado algún buen pescado últimamente?' + - Bienvenido, forastero + - '¿Necesitas algo?' + - |- + No eres de este lugar, + ¿verdad? + farewell: + - '¡Nos vemos!' + - '¡Vuelve pronto!' +primis_caeruleaum_jeeves: + name: Jeeves + role: + greetings: + - '¡Solamente viajando!' + dialog: + - Just here to sell\nto the shop-keep. + - I'm busy negotiating\nhere. + - Not right now,\ncome back later. + farewell: + - Uhuh... +primis_caeruleaum_leader: + name: '&4Jefe Piscis' + role: '&c' + greetings: + - '¡Bienvenido a la Aldea!' + dialog: + - |- + No preguntes qué puede hacer esta aldea por ti, + ¡pregunta qué puedes hacer tú por esta aldea! + - Bienvenido, forastero + - '¿Necesitas algo?' + - |- + No eres de este lugar, + ¿verdad? + farewell: + - '¡Adelante!' + - '¡Vuelve pronto!' +primis_caeruleaum_merchant: + name: Emptor + role: + greetings: + - '¿Tienes algo para vender?' + dialog: + - '¡Los bandidos robaron mis vienés!' + - No tengo nada que vender, estoy preocupado. + - '¡Compraré cualquier cosa que tengas!' + farewell: + - '¡Buen viaje!' +primis_captain: + name: '&4Capitán Squalus' + role: '&c' + greetings: + - '¡Así que por fin despiertas!' + - '¡Ha sido un viaje salvaje!' + - '¿Sigue vivo?' + - '¡No volvamos a hacerlo!' + dialog: + - '¡Tengo una tarea para ti!' + - '¡Necesito tu ayuda!' + - |- + ¡Que bien que estés aquí, + necesitamos ayuda! + farewell: + - '¡Adelante!' + - '¡No te olvides de mí!' + - '¡Vuelve pronto!' +primis_deli'o: + name: '&eDéli''O' + role: '&6Creador de Mapas (Gamer)' + dialog: + - '¡Espero que estés disfrutando del mapa!' + farewell: + - '¡Diviértete!' +primis_farmstead_son: + name: '&4Filius' + role: '&c' + greetings: + - '¿De donde te vas?' + - Parece que ha venido de muy lejos de aquí. + dialog: + - Vivimos tiempos peligrosos. + - '¿Has visto a mi padre?' + - Sin un faro, ¿cómo navegarán los barcos? + farewell: + - '¡Vigila tu espalda!' + - '¡Anda con cuidado!' +primis_farmstead_wife: + name: '&4Amavit' + role: '&c' + greetings: + - '¡No te he visto antes!' + - '¿Alguna noticia de Pontis Mille?' + dialog: + - '¿Has visto a mi marido?' + - '¡Necesito tu ayuda!' + - En qué tiempos peligrosos vivimos. + - '¡Algo anda mal!' + farewell: + - '¡Buen viaje!' + - Gracias! +primis_first_mate: + name: '&cIracundi' + role: '&c' + greetings: + - '¡Así que por fin despiertas!' + - '¡Ha sido un viaje salvaje!' + - '¿Sigue vivo?' + - '¡No volvamos a hacerlo!' + dialog: + - '¡Tengo una tarea para ti!' + - '¡Necesito tu ayuda!' + - |- + ¡Que bien que estés aquí, + necesitamos ayuda! + farewell: + - '¡Adelante!' + - '¡No te olvides de mí!' + - '¡Vuelve pronto!' +primis_frostcone: + name: '&bFrostCone' + role: '&9Creador de Mapas (Gamer)' + dialog: + - '¡Espero que estés disfrutando del mapa!' + - Es un pino cubierto de nieve. + - '¿Aún no se ha lanzado Primis?' + farewell: + - '¡Diviértete!' +primis_gladius_guard_1: + name: '&2Guardia de Ciudad' + role: '&a' + greetings: + - '¡Anda con cuidado!' + - '¿Refuerzos?' + - '¡Invasores malditos!' + - '¡Vigila tu espalda!' + - Tenga cuidado. +primis_gladius_guard_2: + name: '&2Guardia de Ciudad' + role: '&a' + greetings: + - '¡Anda con cuidado!' + - '¿Refuerzos?' + - '¡Invasores malditos!' + - '¡Vigila tu espalda!' + - Tenga cuidado. +primis_gladius_guard_3: + name: '&2Guardia de Ciudad' + role: '&a' + greetings: + - '¡Anda con cuidado!' + - '¿Refuerzos?' + - '¡Invasores malditos!' + - '¡Vigila tu espalda!' + - Tenga cuidado. +primis_gladius_guard_4: + name: '&2Guardia de Ciudad' + role: '&a' + greetings: + - '¡Anda con cuidado!' + - '¿Refuerzos?' + - '¡Invasores malditos!' + - '¡Vigila tu espalda!' + - Tenga cuidado. +primis_gladius_lord: + name: '&4General hasta' + role: '&c' + greetings: + - '¿Estás aquí para ayudar?' + - '¡Es una zona de guerra por ahí!' + dialog: + - '¡Ellos llegaron por la noche!' + - '¡Nunca los vimos venir!' + - '¿Dónde están nuestros refuerzos?' + farewell: + - '¡Vigila tu espalda!' + - '¡Anda con cuidado!' +primis_gladius_quartermaster: + name: '&6Cibus' + role: '&c' + greetings: + - '¿Estás aquí para ayudar?' + - '¡Es una zona de guerra por ahí!' + dialog: + - '¡Ellos llegaron por la noche!' + - '¡Nunca los vimos venir!' + - '¿Dónde están nuestros refuerzos?' + farewell: + - '¡Vigila tu espalda!' + - '¡Anda con cuidado!' +primis_gladius_strategist: + name: '&6Belli' + role: '&c' + greetings: + - '¿Estás aquí para ayudar?' + - '¡Es una zona de guerra por ahí!' + dialog: + - '¡Ellos llegaron por la noche!' + - '¡Nunca los vimos venir!' + - '¿Dónde están nuestros refuerzos?' + farewell: + - '¡Vigila tu espalda!' + - '¡Anda con cuidado!' +primis_groves_nemus_leader: + name: '&3Rey Nemian' + role: '&c' + dialog: + - '¿Qué te lleva hacia debajo del barranco?' + - '¿De donde eres?' + - |- + ¿Has probado nuestras + ricas bayas brillantes? + farewell: + - Hasta la próxima. +primis_ice_village_fisherman_boat: + name: '&3Theopropides Nero' + role: '&3' + greetings: + - '¡Día de pesca!' + dialog: + - Un día frío para la pesca. + - No están mordiendo. + - Sólo tiene que ser paciente. + farewell: + - '¡No caigas en\nel agua!' +primis_ice_village_friendly_villager: + name: '&3Luxuria Placida' + role: '&3' + greetings: + - '¡Hola!' + dialog: + - '¡La vejez no me ralentizará!' + - Estar en un buen estado\n de ánimo es importante. + - Esperando algo de \nnieve pronto. + farewell: + - '¡Adiós!' +primis_ice_village_generic_npc_1: + name: '&3Albertus Vitalis' + role: '&3' + greetings: + - '¿Cómo va eso?.' + dialog: + - '¡No hay nada como una buena cerveza!' + farewell: + - Adiós. +primis_ice_village_generic_npc_10: + name: '&3Trebatia Cornix' + role: '&3' + greetings: + - Muy bien. + dialog: + - Sí, lo entiendo. + - Ya veo... + - '¡Oh!' + farewell: + - Intentaré eso\nla próxima vez. +primis_ice_village_generic_npc_11: + name: '&3Albatia Laterano' + role: '&3' + greetings: + - '¿Visitando a Violet?' + dialog: + - No cause problemas. + farewell: + - Hasta luego extraño. +primis_ice_village_generic_npc_12: + name: '&3Hostilia Carantus' + role: '&3' + greetings: + - Hola. + dialog: + - Solo me estaba &nyendo + farewell: + - Adios. +primis_ice_village_generic_npc_13: + name: "&3Vagennia Sejanus\n" + role: '&3' + greetings: + - Hola. + dialog: + - '¿Qué te trae\na los muelles?' + farewell: + - Nos vemos. +primis_ice_village_generic_npc_14: + name: '&3Dinia Vettonius' + role: '&3' + greetings: + - Hola.. + dialog: + - Otro dia... + farewell: + - '...' +primis_ice_village_generic_npc_15: + name: '&3Sceledrus Marcallas' + role: '&3' + greetings: + - Hola.. + dialog: + - Otro dia... + farewell: + - '...' +primis_ice_village_generic_npc_16: + name: '&3Fridericus Castinus' + role: '&3' + greetings: + - Hola.. + dialog: + - Otro dia... + farewell: + - '...' +primis_ice_village_generic_npc_17: + name: '&3Cario Fimbria' + role: '&3' + greetings: + - Hola.. + dialog: + - Otro dia... + farewell: + - '...' +primis_ice_village_generic_npc_18: + name: '&3Piscatores Laevinus' + role: '&3' + greetings: + - Hola.. + dialog: + - Otro dia... + farewell: + - '...' +primis_ice_village_generic_npc_19: + name: '&3Monkerius Vitalis' + role: '&3' + greetings: + - '¿Has estado cazando?' + dialog: + - Hora de ir de caza. + farewell: + - La despedida. +primis_ice_village_generic_npc_2: + name: '&3Luxuria Tyranus' + role: '&3' + greetings: + - '¿Cómo va eso?.' + dialog: + - '¡Uno más!' + farewell: + - Adiós. +primis_ice_village_generic_npc_3: + name: '&3Aurelio Nigidius' + role: '&3' + greetings: + - Hola a todos. + dialog: + - '¡Qué vista!' + farewell: + - Adiós. +primis_ice_village_generic_npc_4: + name: '&3Lysidamus Paratus' + role: '&3' + greetings: + - '¿Saliste a caminar?' + dialog: + - No pude imaginar\nvivir en algún lugar\nsin nieve. + - Empezando a ponerse frío. + farewell: + - Hasta más tarde. +primis_ice_village_generic_npc_5: + name: '&3Simo Proceus' + role: '&3' + greetings: + - '¡Qué vista!' + dialog: + - Me encanta escalar. + - '¡Mira todos los peces!' + farewell: + - Claro que sí. +primis_ice_village_generic_npc_6: + name: '&3Dordalus Marullinus' + role: '&3' + greetings: + - '¡Bienvenido a la taberna!' + dialog: + - Tiempo para calentarme\nmis dedos. + - Bien y cálido. + farewell: + - No dejes que el\nfrío te agarre. +primis_ice_village_generic_npc_7: + name: '&3Tranio Silvanus' + role: '&3' + greetings: + - Aquí en alguna parte.. + dialog: + - '¿Dónde está?' + farewell: + - Estaba seguro de que\nlo dejé aquí. +primis_ice_village_generic_npc_8: + name: '&3Milonia Trebellius' + role: '&3' + greetings: + - '¡Bienvenido a\nnuestra Aldea!' + dialog: + - Tengo mucha hambre. + - Podría ir por un\npoco de salmón. + farewell: + - Hasta la Próxima. +primis_ice_village_generic_npc_9: + name: '&3Barria Brocchus' + role: '&3' + greetings: + - '¿Has oído...' + dialog: + - Ten esto en cuenta\nla próxima vez que gires\ntu espada. + - El escudo puede ser\nmás que una defensa. + farewell: + - '¿Entiendes?' +primis_ice_village_hunter: + name: '&3Alanus Isatis' + role: '&3' + greetings: + - '¡Hey!' + dialog: + - Esperando un buen\ndía mañana. + - Seguramente hay muchos Jabalíes\nafuera esta temporada. + farewell: + - Te estaré viendo. +primis_ice_village_imprisoned_husband: + name: '&3Eleusium Calenus' + role: '&3' + greetings: + - '.....' + dialog: + - Otro día en una jaula... + farewell: + - '.....' +primis_ice_village_jail_caretaker: + name: '&3Philolaches Triferus' + role: '&3' + greetings: + - Hey, tú. + dialog: + - '¿Qué más se necesita\narreglar?' + - Debería revisar\nen las jaulas. + farewell: + - Más tarde. +primis_ice_village_jail_guard: + name: '&3Eleusium Festus' + role: '&3' + greetings: + - Escalaste la\ntorre eh. + dialog: + - Todo parece en orden. + - Casi todo... + farewell: + - Cuídate. +primis_ice_village_jail_master: + name: '&3Romanus Superbus' + role: '&3' + greetings: + - Bienvenido. + dialog: + - No hagas el crimen si\nno puedes hacer el tiempo. + - El crimen no paga. + farewell: + - Hasta más tarde. +primis_ice_village_leader: + name: '&3Glaciares Princeps' + role: '&3' + greetings: + - Hey. + dialog: + - Darn Ice Elemental! + - Demasiados problemas... + - '¿Cómo se supone que debemos\ncompletar las pruebas ahora?' + farewell: + - Adiós. +primis_ice_village_lighthouse_keeper: + name: '&3Severinus Martius' + role: '&3' + greetings: + - Well met stranger. + dialog: + - Calm day today. + - Watch out for\nthe Ursus! + farewell: + - Take it easy. +primis_ice_village_missing_daughter: + name: '&3Cornelia Ennodius' + role: '&3' + greetings: + - Ayuda... + dialog: + - '¡Aléjate, ¡Aléjate,\nALÉJATE!' + - No son\nreales... + - Solamente no los\nmires, Cornelia. + farewell: + - Adiós. +primis_ice_village_prisoner: + name: '&3Adrius Calpornius' + role: '&3' + greetings: + - '¡Soy inocente!' + dialog: + - '¡¡¡Aquí no es donde\npertenezco!!!' + farewell: + - '¡Sáquenme de aquí!' +primis_ice_village_pubkeeper: + name: '&3Grania Cecilius' + role: '&3' + greetings: + - Welcome! + dialog: + - Coming right up! + - Try our black ale! + - Need a drink? + farewell: + - One coming up! +primis_ice_village_tower_squatter: + name: '&3Modestus Eulogius' + role: '&3' + greetings: + - '¡El ruido!' + dialog: + - '¡Demasiados chirridos!' + - Simplemente tratando de\ndisfrutar de la paz. + farewell: + - Adiós. +primis_ice_village_violet: + name: '&5Domina Violet' + role: '&d' + greetings: + - '¿Te pregunté\ntu opinión?' + dialog: + - Se siente bien\nsacarlo afuera. + - Ellos pagarán\nmientras yo recolecto. + farewell: + - No, eso es lo que pensé. +primis_ice_village_worried_father: + name: '&3Sparax Ennodius' + role: '&3' + greetings: + - Espero que ella esté bien... + dialog: + - Deja que nuestra chica esté\nsegura, por favor. + farewell: + - Adiós. +primis_ice_village_worried_mother: + name: '&3Sestia Ennodius' + role: '&3' + greetings: + - '¿Adónde se ha ido?' + dialog: + - Hmm, perdió la pista. + farewell: + - Adiós. +primis_ice_village_worried_wife: + name: '&3Titia Calenus' + role: '&3' + greetings: + - Hola! + dialog: + - Camas bonitas y limpias. + - '¿Me he perdido algo?' + - Otro cofre ordenado. + farewell: + - Adiós! +primis_magmaguy: + name: '&4Magmaguy' + role: '&cDesarrollador Principal (Non-gamer)' + dialog: + - '¡Espero que estés disfrutando del mapa!' + farewell: + - '¡Diviértete!' +primis_mountain_guide: + name: '&4Petrae' + role: '&c' + greetings: + - '¡Bienvenido a la Aldea!' + dialog: + - |- + No preguntes qué puede hacer esta aldea por ti, + ¡pregunta qué puedes hacer tú por esta aldea! + - Bienvenido, forastero + - '¿Necesitas algo?' + - |- + No eres de este lugar, + ¿verdad? + farewell: + - '¡Adelante!' + - '¡Vuelve pronto!' +primis_mountain_guide_2: + name: '&4Petrae' + role: '&c' + greetings: + - '¡Bienvenido a la Aldea!' + dialog: + - |- + No preguntes qué puede hacer esta aldea por ti, + ¡pregunta qué puedes hacer tú por esta aldea! + - Bienvenido, forastero + - '¿Necesitas algo?' + - |- + No eres de este lugar, + ¿verdad? + farewell: + - '¡Adelante!' + - '¡Vuelve pronto!' +primis_nemus_leader: + name: '&3Rey Nemian' + role: '&c' + dialog: + - '¿Qué te lleva hacia debajo del barranco?' + - '¿De donde eres?' + - |- + ¿Has probado nuestras + ricas bayas brillantes? + farewell: + - Hasta la próxima. +primis_ogre_mines_escaped_miner: + name: '&cFugit Fossores' + role: '&c' + greetings: + - '¡No puedo creer que lo halla hecho!' + - '¡Están en todas partes!' + - '¿Necesitas ayuda?' + dialog: + - '¡Tengo una tarea para ti!' + - '¡Necesito tu ayuda!' + farewell: + - '¡Adelante!' + - '¡Ten cuidado allí!' + - '¡Mantente a salvo!' +primis_ogre_mines_lone_miner: + name: '&cFortis Fossores' + role: '&c' + greetings: + - Porfin, ¡algo de ayuda! + - '¡No permitas que te vean!' + - Ayudame! + dialog: + - '¡Tengo una tarea para ti!' + - '¡Necesito tu ayuda!' + farewell: + - '¡Adelante!' + - '¡Vuelve a minar para mí!' + - '¡Mantente a salvo!' +primis_ogre_mines_old_miner: + name: '&cVetus Fossores' + role: '&c' + greetings: + - '¡Hola hijo!' + - '¡Te ves mirando un poco perdido!' + - '¿Qué te trae por aquí?' + dialog: + - '¡Tengo una tarea para ti!' + - '¡Necesito tu ayuda!' + farewell: + - '¡Adelante!' + - '¡Que no te piquen los ácaros de las minas!' + - '¡Mantente a salvo!' +primis_ogre_mines_panicked_miner: + name: '&cMetus' + role: '&c' + greetings: + - '¡La mina se ha sobrepasado!' + dialog: + - '¡Hay ogros en todas partes!' + - '¿Nos puedes ayudar?' + farewell: + - '¡Ten cuidado!' +primis_pontis_citizen_1: + name: '&7Agorastocles Gorgonius' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De qué viaje vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_10: + name: '&7Pardalisca Saunio' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_11: + name: '&7Sobersides Colias' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_12: + name: '&7Saturio Caepio' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_13: + name: '&7Chrysalus Trebonius' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_14: + name: '&7Toxilus Micon' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De qué viaje vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_15: + name: '&7Phronesium Viridio' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De qué viaje vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_16: + name: '&7Aurelio Zoilus' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De qué viaje vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_17: + name: '&7Diniarchus Nelius' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De qué viaje vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_18: + name: '&7Cleostrata Senopius' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_19: + name: '&7Georgius Sorio' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_2: + name: '&7Franciscus Crispian' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_20: + name: '&7Epidicus Silvanus' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_21: + name: '&7Pleusicles Marcellinus' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_22: + name: '&7Plesidippus Nerva' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_23: + name: '&7Plesidippus Megellus' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_24: + name: '&7Fridericus Achaicus' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_25: + name: '&7Curculio Zosimus' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_26: + name: '&7Demipho Sylvius' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_27: + name: '&7Peniculus Nemesius' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_28: + name: '&7Tyndarus Faustinius' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_29: + name: '&7Sulpicio Panthera' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_3: + name: '&7Tycho Sellic' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_30: + name: '&7Melaenis Gelasius' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_31: + name: '&7Tyndarus Columbanus' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_32: + name: '&7Antamonides Cerinthus' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_33: + name: '&7Lesbonicus Momus' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_34: + name: '&7Fridericus Saloninus' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_35: + name: '&7Anterastilis Fabricius' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_36: + name: '&7Tyndarus Augustalis' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_37: + name: '&7Modestus Aper' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_38: + name: '&7Henricus Crassus' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_39: + name: '&7Franciscus Tancinus' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_4: + name: '&7Advocati Micon' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_40: + name: '&7Phygia Aurelius' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_5: + name: '&7Advocati Micon' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_6: + name: '&7Messenio Rectus' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_7: + name: '&7Hadrius Donicus' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_8: + name: '&7Sulpicio Sejanus' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_citizen_9: + name: '&7Stasimus Mutilus' + role: '&8Residente de Pontis' + dialog: + - '¿Has estado en el observatorio?' + - '¿De dónde vienes?' + - No pareces de por aquí... + - Es un gran día hoy. + farewell: + - '¡Nos vemos!' + - '¡Adiós!' +primis_pontis_dockworker_1: + name: '&3Pontis Compañero de flota' + role: '&8Trabajador portuario' + dialog: + - '¡Hay muchos suministros por mover!' + - '¡Cuidado!' + - Pasando por delante. + farewell: + - '¡Nos vemos luego!' +primis_pontis_dockworker_10: + name: '&3Pontis Compañero de flota' + role: '&8Trabajador portuario' + dialog: + - '¡Hay muchos suministros por mover!' + - '¡Cuidado!' + - Pasando por delante. + farewell: + - '¡Nos vemos luego!' +primis_pontis_dockworker_2: + name: '&3Pontis Compañero de flota' + role: '&8Trabajador portuario' + dialog: + - '¡Hay muchos suministros por mover!' + - '¡Cuidado!' + - Pasando. + farewell: + - '¡Nos vemos luego!' +primis_pontis_dockworker_3: + name: '&3Pontis Compañero de flota' + role: '&8Trabajador portuario' + dialog: + - '¡Hay muchos suministros por mover!' + - '¡Cuidado!' + - Pasando. + farewell: + - '¡Nos vemos luego!' +primis_pontis_dockworker_4: + name: '&3Pontis Compañero de flota' + role: '&8Trabajador portuario' + dialog: + - '¡Hay muchos suministros por mover!' + - '¡Cuidado!' + - Pasando. + farewell: + - '¡Nos vemos luego!' +primis_pontis_dockworker_5: + name: '&3Pontis Compañero de flota' + role: '&8Trabajador portuario' + dialog: + - '¡Hay muchos suministros por mover!' + - '¡Cuidado!' + - Pasando. + farewell: + - '¡Nos vemos luego!' +primis_pontis_dockworker_6: + name: '&3Pontis Compañero de flota' + role: '&8Trabajador portuario' + dialog: + - '¡Hay muchos suministros por mover!' + - '¡Cuidado!' + - Pasando. + farewell: + - '¡Nos vemos luego!' +primis_pontis_dockworker_7: + name: '&3Pontis Compañero de flota' + role: '&8Trabajador portuario' + dialog: + - '¡Hay muchos suministros por mover!' + - '¡Cuidado!' + - Pasando. + farewell: + - '¡Nos vemos luego!' +primis_pontis_dockworker_8: + name: '&3Pontis Compañero de flota' + role: '&8Trabajador portuario' + dialog: + - '¡Hay muchos suministros por mover!' + - '¡Cuidado!' + - Pasando por delante. + farewell: + - '¡Nos vemos luego!' +primis_pontis_dockworker_9: + name: '&3Pontis Compañero de flota' + role: '&8Trabajador portuario' + dialog: + - '¡Hay muchos suministros por mover!' + - '¡Cuidado!' + - Pasando por delante. + farewell: + - '¡Nos vemos luego!' +primis_pontis_enhancer: + name: '&7Meliorem' + role: '&8' + greetings: + - '¿Necesitas una mejora?' + - '¿Tienes chatarra?' + - '¡Mejoremos!' + dialog: + - '¡Lo mejorare para chatarra!' + - '¡Tráeme chatarra!' + - '¡Mejora tu equipo para chatarra!' +primis_pontis_gardener_1: + name: '&eGorgines Asina' + role: '&8Jardinero' + dialog: + - '¿No son las flores bonitas?' + - '¡He aquí, mi obra maestra!' + - Las flores están floreciendo. + farewell: + - Por favor, no piséis las hermosas flores. + - '¡Cuídate!' +primis_pontis_gardener_2: + name: '&ePiscatores Orissus' + role: '&8Jardinero' + dialog: + - '¿No son las flores bonitas?' + - '¡He aquí, mi obra maestra!' + - Las flores están floreciendo. + farewell: + - Por favor, no piséis las hermosas flores. + - '¡Cuídate!' +primis_pontis_gardener_3: + name: '&eAlcesimus Abito' + role: '&8Jardinero' + dialog: + - '¿No son las flores bonitas?' + - '¡He aquí, mi obra maestra!' + - Las flores están floreciendo. + farewell: + - Por favor, no piséis las hermosas flores. + - '¡Cuídate!' +primis_pontis_gardener_4: + name: '&ePyrgopolynices Perpenna' + role: '&8Jardinero' + dialog: + - '¿No son las flores bonitas?' + - '¡He aquí, mi obra maestra!' + - Las flores están floreciendo. + farewell: + - Por favor, no piséis las hermosas flores. + - '¡Cuídate!' +primis_pontis_gardener_5: + name: '&eLemniselenis Gelasius' + role: '&8Jardinero' + dialog: + - '¿No son las flores bonitas?' + - '¡He aquí, mi obra maestra!' + - Las flores están floreciendo. + farewell: + - Por favor, no piséis las hermosas flores. + - '¡Cuídate!' +primis_pontis_gardener_6: + name: '&eLysimachus Sulinus' + role: '&8Jardinero' + dialog: + - '¿No son las flores bonitas?' + - '¡He aquí, mi obra maestra!' + - Las flores están floreciendo. + farewell: + - Por favor, no piséis las hermosas flores. + - '¡Cuídate!' +primis_pontis_gardener_7: + name: '&eStrobilus Farus' + role: '&8Jardinero' + dialog: + - '¿No son las flores bonitas?' + - '¡He aquí, mi obra maestra!' + - Las flores están floreciendo. + farewell: + - Por favor, no piséis las hermosas flores. + - '¡Cuídate!' +primis_pontis_groves_catacombs_npc: + name: '&7Inaequaliter Hyaena' + role: '&7' + greetings: + - Psssst! + dialog: + - '¡He oído que hay un gran tesoro\nque se puede tener!' + - '¡Algo maravilloso te espera\nsi ingresas!' + - Deberías aventurarte\nen este lugar... + - '¿Por qué no entrar?' + - Deberías ir adentro... + - No te preocupes, es\ncompletamente seguro. + - No hay peligro. ¡Lo juro! + - Echa un vistazo dentro. + - '¡Deberías echar un vistazo a\neste lugar!' + - Je je je je je... + - '¿Qué pasa si alguien\ndentro necesita ayuda?' + - '¡Ve adentro, ve adentro!' + - '¿No eres curioso?' + - Seguramente deberías\nechar un vistazo. + farewell: + - Je je je, ¡nos vemos! +primis_pontis_groves_generic_npc_1: + name: '&2Sycophanta Mucius' + role: '&2' + greetings: + - '¡Estoy bien!' + dialog: + - No te preocupes por mí. + - Mi hermano vendrá a rescatarme. + - No me comerán. + - Te aseguro que estaré muy bien. + farewell: + - '¡Nos veremos luego!' +primis_pontis_groves_generic_npc_10: + name: '&2Hostilia Metunus' + role: '&2' + greetings: + - Hola. + dialog: + - '¿También estás aburrido?' + - Ugh, tiene que haber algo que hacer. + - Tal vez debería preparar más bebidas. + farewell: + - Nos vemos! +primis_pontis_groves_generic_npc_11: + name: '&2Tortilia Getha' + role: '&2' + greetings: + - Hola. + dialog: + - Mi marido hace los mejores pasteles. + - '¿Quieres una rebanada?' + - '¡Tan delicioso y húmedo!' + farewell: + - '¡Adiós!' +primis_pontis_groves_generic_npc_12: + name: '&2Consentia Apellinus' + role: '&2' + greetings: + - Oh, hola. + dialog: + - '¡Ahí, tan bueno como nuevo!' + - Tengo que asegurarme de que la luz los mantiene lejos. + - Otro farol arreglado... + farewell: + - '¡No dejes que las arañas te muerdan!' +primis_pontis_groves_generic_npc_13: + name: '&2Novia Senecius' + role: '&2' + greetings: + - '¡Hola!' + dialog: + - Oh, no esperaba encontrar a alguien aquí. + - Solo tienes que ser rápido y no podrán alcanzarte. + - Las arañas no me detienen. + - Este es mi lugar favorito de descanso. + farewell: + - Mantente a salvo. +primis_pontis_groves_generic_npc_14: + name: '&2Maximia Priscus' + role: '&2' + greetings: + - Shhhh... + dialog: + - Pensé que podrías\nrobar de mis elfos... + - Voy a recuperar mis\nposesiones cuando\nse vayan a dormir. + - Logré llegar hasta aquí\ndando vueltas. + - Nunca me vieron\nvenir. + farewell: + - Mantenlo bajo. +primis_pontis_groves_generic_npc_15: + name: '&2Herennia Exsupereus' + role: '&2' + greetings: + - Hey, tú. + dialog: + - Acabo de despertar. + - Será un buen\ndía que pueda sentirlo. + farewell: + - Adiós adiós. +primis_pontis_groves_generic_npc_16: + name: '&2Atria Maursus' + role: '&2' + greetings: + - Saludos. + dialog: + - No está seguro de cómo el rey\nespera que haga\ntodo esto... + - Tanto trabajo.. + - Ocupado, ocupado, ocupado. + - Este papeleo\nno se hará a sí mismo. + farewell: + - Adiós adiós. +primis_pontis_groves_generic_npc_17: + name: '&2Felicius Esurpus' + role: '&2' + greetings: + - Saludos! + dialog: + - Si necesitas algo\nhabla con el rey. + - Lo siento, estoy ocupado. + - No hay tiempo para charlar,\nmis disculpas. + farewell: + - Adiós. +primis_pontis_groves_generic_npc_2: + name: '&2Sceledrus Fredisius' + role: '&2' + greetings: + - '¡Heya!' + dialog: + - En realidad estoy pescando insectos. + - Grandes insectos de agua caen de los árboles. + - Utilizo savia de árbol como cebo. + - '¡Los insectos de agua no pueden resistir el cebo!' + - En realidad son anfibios. + - Hay que capturarlos antes de que se dirijan a los árboles. + - Son muy sabrosos si los asas. + - '¡Esperando una buena captura!' + farewell: + - Hasta más tarde. +primis_pontis_groves_generic_npc_3: + name: '&2Felicius Surius' + role: '&2' + greetings: + - '¡Hola ahí!' + dialog: + - El océano es tan bonito. + - Podría estar aquí durante días. + - Las arañas son ciertamente molestas. + farewell: + - Adiós. +primis_pontis_groves_generic_npc_4: + name: '&2Periplectomenus Burcanius' + role: '&2' + greetings: + - '¡Bienvenido!' + dialog: + - Quedan muchas bayas resplandecientes. + - Espero que te guste mi pequeña granja. + - Tantos vinos a los que atender. + farewell: + - Nos vemos luego. +primis_pontis_groves_generic_npc_5: + name: '&2Stephanus Magnus' + role: '&2' + greetings: + - '¡Hola ahí!' + dialog: + - '¿Has echado un vistazo a la granja de bayas?' + - Hermoso tiempo para una caminata. + - No puede estar adentro de todo el tiempo. + farewell: + - Que tengas un buen día. +primis_pontis_groves_generic_npc_6: + name: '&2Abundantius Rogatus' + role: '&2' + greetings: + - '¡Hola!' + dialog: + - '¿Qué te trae a nuestro agujero encantador?' + - Siéntete libre de quedarte un rato. + farewell: + - Adiós. +primis_pontis_groves_generic_npc_7: + name: '&2Albanus Ivmarus' + role: '&2' + greetings: + - Tranquilo ahí... + dialog: + - '¿Qué? Sí, estoy bien.' + - No he tenido demasiados, no. + - Solo uno más... + - Una pinta más... + farewell: + - Hasta la Próxima. +primis_pontis_groves_generic_npc_8: + name: '&2Bacchis Aventinus' + role: '&2' + greetings: + - Buen día o tarde... + dialog: + - Estoy tan acogido en este momento. + - Solíamos salir más a menudo. + - Demasiados peligros afuera en estos días. + farewell: + - Salud. +primis_pontis_groves_generic_npc_9: + name: '&2Pasicompsa Getha' + role: '&2' + greetings: + - '¡Entra adentro, entra adentro!' + dialog: + - '¡Bienvenido al mejor agujero de la arboleda!' + - '¡Construí este agujero con mis propias manos!' + - '¡Espero que disfrutes tu estadía!' + farewell: + - '¡Vuelve pronto!' +primis_pontis_groves_hole_luxuria: + name: '&cLuxuria Gorgonius' + role: '&c' + greetings: + - '¡Hola ahí!' + - '¡Hola!' + dialog: + - La vida se trata de tomarlo con facilidad. + - '¿Por qué estresarse?' + farewell: + - '¡Visítanos de nuevo!' +primis_pontis_groves_hole_phygia: + name: '&cPhygia Gorgonius' + role: '&c' + greetings: + - '¡Bienvenido a mi hogar!' + - '¡Hola!' + dialog: + - '¡Tenemos que actuar!' + - Demasiados elfos en nuestro bosque. + farewell: + - '¡Visítanos de nuevo!' +primis_pontis_groves_lighthouse_generic_npc_1: + name: '&3Eleusium Martius' + role: '&3' + greetings: + - '¿Qué te trae por aquí?' + dialog: + - Tengo que asegurarme de que\nel faro esté funcionando. + - Me alegro de ver a alguien\nvenir a visitar. + farewell: + - Adiós. +primis_pontis_groves_lighthouse_generic_npc_2: + name: '&3Caelia Zoilus' + role: '&3' + greetings: + - Hey. + dialog: + - Espero que él\nestará bien. + - Mi turno para vigilar\nsobre la luz. + - Casi nos quedamos\nsin comida. + farewell: + - Adiós. +primis_pontis_groves_lighthouse_sick_man: + name: '&3Alanus Secundas' + role: '&c' + dialog: + - No me siento tan bien + - Espero recuperarme pronto. + - Bueno, me siento un poco mejor. + - Necesitamos más comida. + farewell: + - Hasta la Próxima. +primis_pontis_groves_parkour_npc_1: + name: '&3Posuere Hominem' + role: '&c' + dialog: + - '¿Listo para un desafío?' + - '¿Crees que tienes lo que necesita?' + - '¿Quieres ir a moverte?' + - '¿Eres un chico loco?' + - '¡Sin trampas!' + farewell: + - Nos vemos luego. +primis_pontis_groves_parkour_npc_2: + name: '&cIdoneitatem Hominem' + role: '&3' + dialog: + - '¡Eso fue impresionante!' + - Trata y bate mi récord de 1m 47s. + - '¡Sin trampas!' + farewell: + - Nos vemos luego. +primis_pontis_guard: + name: '&cGuardia de Pontis' + role: '&8' + greetings: + - '¿Quieres mejorar el equipamiento?' + dialog: + - '¿Perdido? Sigue los colores del puente.' + - '¡Cada camino de puente tiene al menos un color!' + - '¡Aléjate de los problemas!' + - '¡No cause ningún problema!' + - Pontis se construyó como un laberinto para defensa. + - '¡Los techos de los puentes muestran el color de ese camino!' +primis_pontis_guard_1: + name: '&cGuardia de Pontis' + role: '&8' + greetings: + - '¿Quieres mejorar el equipamiento?' + dialog: + - '¿Perdido? Sigue los colores del puente.' + - '¡Cada camino de puente tiene al menos un color!' + - '¡Aléjate de los problemas!' + - '¡No causes ningún problema!' + - Pontis se construyó como un laberinto para defensa. + - '¡Los techos de los puentes muestran el color de ese camino!' +primis_pontis_guard_2: + name: '&cGuardia de Pontis' + role: '&8' + greetings: + - '¡Hola!' + dialog: + - '¡De esta manera al shogun!' +primis_pontis_guard_rat: + name: '&cGuardia Élite de Pontis' + role: '&8' + greetings: + - '¡Malditas ratas!' + dialog: + - '¡¡¡Ratas sucias!!!' + - Hold still,\ndarn you! + - Stop dodging\nmy attacks! + - '¡Casi le doy a uno!' + - '¡Sólo muere!' + - '¿¡¿¡¿¡Por qué no te mueres!?!?!?' + - You can't dodge\nforever! + - '¡Siguiente ataque!' + - '¡Estás muerto!' + - How dare you\ndodge! + - '¡Casi!' +primis_pontis_guard_rat_at_wormhole: + name: '&cGuardia Élite de Pontis' + role: '&8' + greetings: + - '¿Qué está tomando\ntanto tiempo?' + dialog: + - Tenemos esto\nbajo control. + - '¡No te preocupes,\nel guardia élite\nestá en el castillo!' +primis_pontis_guard_shogun_1: + name: '&4Guardia Real' + role: '&8' + dialog: + - No te metas en problemas. + - No me hagas caso, solamente manteniendo la paz. + - Nada de negocios divertidos aquí. + - Tengo mi ojo en ti, aventurero. + - '¡Sin preguntas, y nadie sale lastimado!' + - No tengo tiempo para estar jugando. + farewell: + - Viajes seguros, aventurero. +primis_pontis_guard_shogun_1_cat_quest: + name: '&4Guardia Real' + role: '&8' + dialog: + - No te metas en problemas. + - No me hagas caso, solamente manteniendo la paz. + - Nada de negocios divertidos aquí. + - Tengo mi ojo en ti, aventurero. + - '¡Sin preguntas, y nadie sale lastimado!' + - No tengo tiempo para estar jugando. + farewell: + - Viajes seguros, aventurero. +primis_pontis_mille_arena_master_observatory: + name: Stella Hominis + role: + greetings: + - '¡Hola!' + dialog: + - Espero ver muchas estrellas. + - '¡Semejantes cuerpos celestiales!' + - El cosmos me llama. + - Posibilidades infinitas. + - El conocimiento antiguo... + - Tengo historias que contar. + - Si solo lo supieras... + farewell: + - Que las estrellas te bendigan. +primis_pontis_mille_concerned_shipmate: + name: '&3Delphium Calpurnius' + role: '&8' + dialog: + - Sigh. + - So much for my\nshipments... + farewell: + - Safe travels! +primis_pontis_mille_fields_camp_generic_npc_1: + name: '&cScribonia Ingenvinus' + role: '&c' + dialog: + - El arma\nmás peligrosa es el que está\nentre tus oídos. + - Tres flechas\nson todo lo que necesito. + farewell: + - '¡Te veo después!' +primis_pontis_mille_fields_camp_generic_npc_2: + name: '&cValador Lumus' + role: '&c' + dialog: + - He cazado en\nmuchos lugares. + - '¿Viajas\nmucho también?' + farewell: + - Que tu espada sea rápida. +primis_pontis_mille_fields_camp_generic_npc_3: + name: '&cPhygia Ahala' + role: '&c' + dialog: + - '¡Nada como una\nbuena cacería!' + farewell: + - Mantente a salvo. +primis_pontis_mille_fields_camp_generic_npc_4: + name: '&cAdrius Paterculus' + role: '&c' + dialog: + - '¡La caza llama!' + farewell: + - Muerte rápida. +primis_pontis_mille_fields_camp_generic_npc_5: + name: '&cCappadox Galerus' + role: '&c' + dialog: + - '¡Únete a nosotros, desconocido!' + farewell: + - Hasta más tarde. +primis_pontis_mille_fields_camp_generic_npc_6: + name: '&cSulpicio Rutilius' + role: '&c' + dialog: + - Espero que nuestro campamento\nte proporcione un respiro\nde la naturaleza. + farewell: + - Adiós. +primis_pontis_mille_fields_camp_generic_npc_7: + name: '&cAquarius Manus' + role: '&c' + dialog: + - No me hagas caso\nsólo estoy buscando un poco de agua. + - Hay agua azul clara hoy. + farewell: + - Adiós. +primis_pontis_mille_fields_camp_magmus: + name: '&cMagmus Hypnos' + role: '&4' + dialog: + - '¿Dónde está Volumnia?...' + - Espero que no esté en\nproblemas de nuevo. + - Necesito un buen descanso. + - Ojalá hubiera más\nhoras en el día. + - Habla conmigo cuando\nhayas encontrado a Volumnia. + - Tanto trabajo,\ntan poco tiempo. + - Otro día más de 17 horas. + - Me preocupo demasiado. + farewell: + - Nunca hay tiempo suficiente... +primis_pontis_mille_fields_farm_berry_npc: + name: '&9Dordalus Nasica' + role: '&e' + dialog: + - '¡Las bayas son tan sabrosas!' + - '¡Deberías comer\nmás bayas!' + - '¿Por qué\nrobarían mis bayas?...' + farewell: + - '¡Ya nos veremos!' +primis_pontis_mille_fields_farm_boy_npc: + name: '&9Planesium Victricius' + role: '&e' + dialog: + - Tantas ratas... + - Uf casi\nacabo aquí. + - Esta cosa más le vale que se mantenga. + - Cualquier levantamiento más y\nme quiebro. + - La vista desde aquí\nes muy agradable. + - '¡Bien, vuelvo a trabajar!' + farewell: + - '¡Prueba algunas de nuestras bayas!' +primis_pontis_mille_fields_farm_npc: + name: '&9Milonia Majus' + role: '&e' + dialog: + - '¡Aléjense, malditas ratas!' + - '¡Dejen de comer mis bienes!' + - Suspiro... + farewell: + - Hasta más tarde. +primis_pontis_mille_fields_farm_well_npc: + name: '&eVolumnia Zoilus' + role: '&c' + dialog: + - '¡Cuidado con su escupido!' + - Su saliva es tóxica. + - '¡Por favor, ayúdame!' + - Espero que nadie oiga\nsobre esto... + - '¡Estoy feliz de verte!' + farewell: + - '¿Cómo pude dejar que esto suceda?' +primis_pontis_mille_fields_windmill_npc_1: + name: '&eDinia Niraemius' + role: '&d' + dialog: + - '¡Un montón de trigo para procesar!' + - Sin harina no hay pan. + - '¿Te gusta el pan también?' + farewell: + - Nos vemos. +primis_pontis_mille_fields_windmill_npc_2: + name: '&eDaemones Maritialis' + role: '&d' + dialog: + - '¡Es tan agradable aquí afuera!' + - '¿Te gusta mi molino de viento?' + - Simplemente aquí en un descanso. + farewell: + - Nos vemos. +primis_pontis_mille_fields_windmill_npc_3: + name: '&eAdulescens Lupis' + role: '&d' + dialog: + - '¡Esperando un buen viento!' + - '¿Necesitas harina?' + - '¡Este es el mejor molino de viento de los alrededores!' + farewell: + - Salud. +primis_pontis_mille_general_bromia: + name: '&6Bromia Curio' + role: '&6General' + greetings: + - Viva! + dialog: + - '¡Es tiempo para la guerra!' + farewell: + - '¡Adiós!' +primis_pontis_mille_general_cylindrus: + name: '&eCylindrus Celatus' + role: '&eGeneral' + greetings: + - Viva! + dialog: + - '¡No hay tiempo suficiente!' + farewell: + - '¡Adiós!' +primis_pontis_mille_general_godefridus: + name: '&cGodefridus Novation' + role: '&c' + greetings: + - '¡Saludos!' + - Viva! + dialog: + - Alguien necesita dejar\nestos documentos. + - Tantas velas... + farewell: + - Nos vemos +primis_pontis_mille_general_rogerius: + name: '&eRogerius Olennius' + role: '&eGeneral' + greetings: + - Viva! + dialog: + - '¡Hay tanto que hacer!' + - Espero que esos 4 estén bien... + farewell: + - '¡Adiós!' +primis_pontis_mille_lighthouse_man: + name: '&3Hegio Remus' + role: '&c' + dialog: + - Es tan hermoso aquí arriba. + - La mejor vista... + farewell: + - Hasta la Próxima. + - '¡El sol se pone!' +primis_pontis_mille_major: + name: '&cFortes Bellator' + role: '&c' + greetings: + - '¡Hola, viajero!' + - Viva! + dialog: + - '¡Esos malditos Goblins!' + farewell: + - '¡Adiós!' +primis_pontis_mille_mew_meowzer: + name: '&aMew Meowzer' + role: '&d' + dialog: + - '¡Miaaauuuu!' + - Miau... + - Mriaaauuuuuuuu... + - Miauuu. + - '¡MIAU!' + farewell: + - '¡Prrrr miau!' +primis_pontis_mille_observatory_arena_turn_in: + name: Virgo Dexippus + role: + greetings: + - '¡Hola!' + dialog: + - Stella sabe mucho. + - Las estrellas tienen tanto que decir. + - La luz lo dice todo. + farewell: + - Que la Luna ilumine tu camino. +primis_pontis_mille_royal_guard_centurion: + name: '&4Guardia Real Centurión' + role: '&8' + dialog: + - '¡Sin holgazanear!' + - '¡Arma el campamento!' + - '¿Dónde están nuestros refuerzos?' + - '¿Cuántos han caído?' + - '¡Necesitamos reorganizarnos!' + farewell: + - Camina ligero y carga una espada grande. +primis_pontis_mille_scout_1: + name: '&cSyra Ursacius' + role: '&cExplorador Herido' + greetings: + - Viva! + dialog: + - Apenas puedo aguantar... + farewell: + - Adiós! +primis_pontis_mille_scout_2: + name: '&cSparax Auxilius' + role: '&cExplorador Herido' + greetings: + - Viva! + dialog: + - El dolor... + farewell: + - Adiós! +primis_pontis_mille_scout_leader: + name: '&cBlepharo Octavius' + role: '&cLíder de Exploradores' + greetings: + - Viva! + dialog: + - Fue demasiado... + farewell: + - Adiós! +primis_pontis_mille_shogun: + name: '&6Navita' + role: '&c' + greetings: + - '¿Sí?' + dialog: + - '¿Puedo ayudarte?' + farewell: + - Camina suavemente, y lleva un arma grande. +primis_pontis_mille_slums_generic_npc_1: + name: '&7Gallicles Rex' + role: '&7' + dialog: + - No es mucho más que nuestra\npequeña parte de la ciudad + farewell: + - Hasta más tarde. +primis_pontis_mille_slums_generic_npc_2: + name: '&7Gallicles Caelistis' + role: '&7' + dialog: + - Día por día... + farewell: + - '...' +primis_pontis_mille_slums_generic_npc_3: + name: '&7Nicodemus Frontinus' + role: '&7' + dialog: + - Agua fresca para\nla casa. + farewell: + - El pozo nos sirve\nbien +primis_pontis_mille_slums_generic_npc_4: + name: '&7Cocus Lucio' + role: '&7' + dialog: + - Espero que estés teniendo\nun gran día. + farewell: + - Disfruta tu estadía. +primis_pontis_mille_slums_generic_npc_5: + name: '&7Cornelia Florius' + role: '&7' + dialog: + - '¿Cuál debería\nobtener?...' + farewell: + - Tantas flores\nbonitas. +primis_pontis_mille_slums_generic_npc_6: + name: '&7Rutilia Placidus' + role: '&7' + dialog: + - Me encanta aquí. + - El olor al heno\nme hace feliz. + - Mi lugar favorito para\nrelajarme después de un día difícil. + farewell: + - '¡Nos veremos luego!' +primis_pontis_mille_slums_npc_1: + name: '&7Lena Lucan' + role: '&7' + dialog: + - Solo una rebanada de pan... + farewell: + - Me pregunto qué traerá el mañana. +primis_pontis_mille_slums_npc_2: + name: '&7Tranio Florens' + role: '&7' + dialog: + - Estoy bien hoy,\nde hecho. + farewell: + - La noche te salve. +primis_pontis_mille_slums_npc_3: + name: '&7Rufia Tertulus' + role: '&7' + dialog: + - Al menos algo\nbueno para\nlos niños. + - No hay mucho en\nel mercado... + - No puedo\npagar eso. + farewell: + - Hasta más tarde. +primis_pontis_mille_slums_npc_4: + name: '&7Fabia Praetextus' + role: '&7' + dialog: + - Simplemente cierro mis ojos\npor un segundo. + - Tengo que imaginar que\nestoy en un lugar mejor. + farewell: + - Adiós. +primis_pontis_mille_slums_npc_5: + name: '&7Augustina Verrucosis' + role: '&7' + dialog: + - Tantas bocas\npara alimentar. + - Tal vez alguna fruta\npara los pequeños. + farewell: + - Adiós. +primis_pontis_mines_guard_1: + name: '&cGuardia de Pontis' + role: '&c' + greetings: + - '¡¡¡AYUDA!!!' + dialog: + - '¡Por favor mátalos!' + - Estoy tan asustado. +primis_pontis_mines_guard_2: + name: '&cGuardia de Pontis' + role: '&c' + greetings: + - '¡¡¡ALGUIEN POR FAVOR!!!' + dialog: + - '¡No quiero morir!' + - Ya no puedo aguantar. +primis_pontis_mines_guard_3: + name: '&cGuardia de Pontis' + role: '&c' + greetings: + - '¡¡¡SÁLVAME!!!' + dialog: + - '¿Se han marchado?' + - '¡¡¡SÁCAME!!!' +primis_pontis_outpost_officer: + name: '&4NAME ME' + role: '&8' + dialog: + - I am unfinished! + - There is supposed\nto be an outpost\nhere. + farewell: + - Bye! +primis_pontis_redwoods_injured_lumberjack: + name: '&6Lyco Lupicinus' + role: '&6' + greetings: + - '¡Hola!' + dialog: + - '¡Maldita sierra!' + - Me volvió a obtener... + farewell: + - Nos vemos luego. +primis_pontis_redwoods_lumberjack: + name: '&6Ligna Crispian' + role: '&6' + greetings: + - Saludos! + dialog: + - Me encanta el aspecto de un árbol saludable. + - El árbol marrón realmente huele. + - |- + Estoy seguro de que vi a un lobo en dos piernas + merodeando alrededor de aquí por la noche. + farewell: + - Hasta la próxima. +primis_pontis_redwoods_lumberjack_generic_1: + name: '&6Mulier Proculus' + role: '&6' + greetings: + - '¡Hey-yo!' + dialog: + - Desearía que nos dejaran solos. + - Día perfecto para talar. + farewell: + - '¡Pino más tarde!' +primis_pontis_redwoods_lumberjack_generic_10: + name: '&6Piscatores Trenico' + role: '&6' + greetings: + - '¡Bienvenido!' + dialog: + - '¡Aléjense lobos!' + - '¡Déjenme solo, malditas pelotas de pelo!' + - '¡Hah! ¡Trata y alcánzame aquí arriba!' + farewell: + - '¡Adiós, adiós!' +primis_pontis_redwoods_lumberjack_generic_2: + name: '&6Alanus Hermina' + role: '&6' + greetings: + - Hola... + dialog: + - No tan ruidoso, mantenlo bajo. + - Estoy tomando un descanso extra. + - No les digas que estoy aquí. + - Talar es un trabajo duro... + farewell: + - Hasta más tarde +primis_pontis_redwoods_lumberjack_generic_3: + name: '&6Lena Triarius' + role: '&6' + greetings: + - '¿¡Qué hay de nuevo!?' + dialog: + - '¡Simplemente parado aquí vibrando!' + - Operar la sierra es un tanto divertido. + - Tengo que asegurarme de que no te lastimes. + farewell: + - '¡Te veo después!' +primis_pontis_redwoods_lumberjack_generic_4: + name: '&6Aquila Isatis' + role: '&6' + greetings: + - '¿¡Cómo te va!?' + dialog: + - '¡Malditos troncos!' + - '¡No, no de esa manera!' + - '¡¡¡Flota mejor!!!' + - Sí, así lo hará. + farewell: + - Nos vemos! +primis_pontis_redwoods_lumberjack_generic_5: + name: '&6Sulpicio Sidonius' + role: '&6' + greetings: + - '¡Hola!' + dialog: + - '¡Nada como un buen fuego!' + - Simplemente relajándome después de un día honesto de trabajo. + - '¡Únete a nosotros!' + farewell: + - '¡Adiós, amigo!' +primis_pontis_redwoods_lumberjack_generic_6: + name: '&6Strobilus Clemens' + role: '&6' + greetings: + - '¡Saludos!' + dialog: + - '¡Cortando como un castor!' + - El hacha más rápida en el oeste. + - '¡Ningún árbol es rival para mí!' + farewell: + - '¡Nos olemos después!' +primis_pontis_redwoods_lumberjack_generic_7: + name: '&6Candidus Nigellus' + role: '&6' + greetings: + - '¡Saludos!' + dialog: + - El hacha más rápida... ¡Mi parte inferior! + - No te tomes en serio sus divagaciones. + - El Sr. big-shot seguro tiene mucho que decir. + farewell: + - '¡Adiós!' +primis_pontis_redwoods_lumberjack_generic_8: + name: '&6Strobilus Clemens' + role: '&6' + greetings: + - '¡Estoy un poco ocupado!' + dialog: + - Tenemos que aumentar la producción... + - Si elevamos el coste... + - Necesito ordenar más hachas. + farewell: + - Uh... +primis_pontis_redwoods_lumberjack_generic_9: + name: '&6Martinus Lepontus' + role: '&6' + greetings: + - '¡Guau, hola!' + dialog: + - '¡Vas a caer, grandote!' + - '¡Te mostraré!' + - Mi hacha, tu corteza, deberían conocerse. + - Empieza con un buen corte. + farewell: + - Me asustó... +primis_pontis_redwoods_lumberlord: + name: '&6Magnus Castorea' + role: '&6' + greetings: + - '¡HOLA!' + dialog: + - Nada como la madera sana. + - |- + ¡Por cada árbol que cortamos, + plantamos uno nuevo! + - Troncos marrones grandes, sí. + farewell: + - '¡ADIÓS!' +primis_pontis_redwoods_reyn: + name: '&6Reynus Protectoris' + role: '&6' + greetings: + - '¡Estoy subiendo la temperatura!' + - '¡Hola!' + dialog: + - '¿Te gustan los troncos?' + - '¡Amo el olor de la madera!' + farewell: + - Nos vemos luego. + - '¡Adiós adiós!' +primis_pontis_scrapper: + name: '&7Fragmentum' + role: '&8' + greetings: + - '¿Tienes algo para desechar?' + - '¿Tienes basura?' + - '¿Necesitas desechar?' + dialog: + - '¡Voy a desechar todo lo que traigas!' + - '¿Necesitas chatarra?' + - '¿Quieres chatarra?' +primis_pontis_smelter: + name: '&7Orbis' + role: '&8' + greetings: + - '¿Quieres mejorar el equipamiento?' + dialog: + - '¿Necesitas orbes de mejora?' + - '¡Haré orbes de mejora para chatarra!' + - '¡Tráeme chatarra!' +primis_sewer_donatello: + name: '&5Donatello' + role: '&dDefensor de alcantarillado' + dialog: + - '¿Qué pasa?' + - '¿Cómo podrías encontrarnos aquí?' + - '¡Cuidado de el triturador!' + farewell: + - '¡Ya nos veremos!' +primis_sewer_leonardo: + name: '&1Leonardo' + role: '&dDefensor de alcantarillado' + dialog: + - '¿Qué pasa?' + - '¿Cómo podrías encontrarnos aquí?' + - '¡Cuidado de el triturador!' + farewell: + - '¡Ya nos veremos!' +primis_sewer_michelangelo: + name: '&6Micelángelo' + role: '&dDefensor de alcantarillado' + dialog: + - '¿Qué pasa?' + - '¿Cómo podrías encontrarnos aquí?' + - '¡Cuidado de el triturador!' + farewell: + - '¡Ya nos veremos!' +primis_sewer_raphael: + name: '&4Raphael' + role: '&dDefensor de alcantarillado' + dialog: + - '¿Qué pasa?' + - '¿Cómo podrías encontrarnos aquí?' + - '¡Cuidado de el triturador!' + farewell: + - '¡Ya nos veremos!' +primis_spa_attendee_1: + name: '&fNatsumi' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_2: + name: '&5Hanako' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_3: + name: '&3Tamika' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_4: + name: '&9Zaphra' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_5: + name: '&4Chie' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_6: + name: '&fKatashi' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_7: + name: '&dAkihiko' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_attendee_8: + name: '&6Sheranee' + role: '&7' + dialog: + - Do you like the hot spring? + - Just sit back and relax! + - Nya! + - Rawr... + - OwO + farewell: + - Have fun! +primis_spa_staff: + name: '&cAozora' + role: '&7' + dialog: + - Enjoy the hot spring! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_spa_staff_2: + name: '&6Rei' + role: '&7' + dialog: + - Enjoy the hot spring! + - Nya! + - uwu... + - OwO + farewell: + - Have fun! +primis_terravilla_annoyed_explorer: + name: '&6Dorippa Sarimarcus' + role: '&6' + greetings: + - How's it going. + dialog: + - Not again. + - Stuck once more. + farewell: + - Be seeing you. +primis_terravilla_explorer: + name: '&6Telestis Senna' + role: '&6' + greetings: + - How goes it. + dialog: + - Always so\nbusy. + - Need a bag? + farewell: + - Bye. +primis_terravilla_generic_npc_1: + name: '&6Stephanium Major' + role: '&6' + greetings: + - Welcome to Terravilla! + dialog: + - Watch out for the\nTwo Legged Terrors! + - Here to check out the ruins? + farewell: + - Bye. +primis_terravilla_generic_npc_10: + name: '&6Mallia Galvisius' + role: '&6' + greetings: + - Heyo! + dialog: + - I would rather be in\ndown in the ruins... + - Hog watching to\npass the time. + farewell: + - Laters. +primis_terravilla_generic_npc_11: + name: '&6Papiria Virginius' + role: '&6' + greetings: + - Ok then... + dialog: + - Hit him harder! + - Woah! Good one! + - Yeah! Mess him up! + farewell: + - Yep... +primis_terravilla_generic_npc_12: + name: '&6Umbria Maccalus' + role: '&6' + greetings: + - What! + dialog: + - Is a girl not\nallowed to be\non a rooftop. + - Just try and\nget me down! + farewell: + - Yeah, whatever... +primis_terravilla_generic_npc_2: + name: '&6Delphium Assanius' + role: '&6' + greetings: + - Leave me alone! + dialog: + - What are you\nlooking at. + farewell: + - Scram! +primis_terravilla_generic_npc_3: + name: '&6Stephanium Vopiscus' + role: '&6' + greetings: + - Leave me alone! + dialog: + - What are you\nlooking at. + farewell: + - Scram! +primis_terravilla_generic_npc_4: + name: '&6Simo Clericus' + role: '&6' + greetings: + - Hey! + dialog: + - Heard the hog is on\nthe lift again. + farewell: + - Bye. +primis_terravilla_generic_npc_5: + name: '&6Harpax Colias' + role: '&6' + greetings: + - Ello. + dialog: + - The bo...I mean the\nOverseer is upstairs. + farewell: + - Laters. +primis_terravilla_generic_npc_6: + name: '&6Sulpicio Epolonius' + role: '&6' + greetings: + - Hi there. + dialog: + - I hope the ruins\nopen up again soon. + - I miss artifact\nhunting. + farewell: + - Goodbye. +primis_terravilla_generic_npc_7: + name: '&6Baebia Lucan' + role: '&6' + greetings: + - '...' + dialog: + - Cringe... + farewell: + - '...' +primis_terravilla_generic_npc_8: + name: '&6Novia Longinus' + role: '&6' + greetings: + - '...' + dialog: + - Are you always\nstaring at people? + - How about some\nprivacy? + farewell: + - '...' +primis_terravilla_generic_npc_9: + name: '&6Septimia Baro' + role: '&6' + greetings: + - Oh, hey. + dialog: + - If it opens up again\nthen I gotta go\nget more of these. + - What is this skull\nnfrom hmm... + farewell: + - '...' +primis_terravilla_overseer: + name: '&6Lutum Princeps' + role: '&6' + greetings: + - Yes? + dialog: + - What is it\nnow... + - I need to check\nup on them. + - At least I\nam not bored. + farewell: + - Good luck. +primis_terravilla_researcher: + name: '&6Plautia Suilius' + role: '&6' + greetings: + - Hmm... + dialog: + - Maybe if... + - That can't be right + - Not sure... + farewell: + - Later... +primis_traveler_1: + name: '&6Lysidamus Nolus' + role: '&6' + greetings: + - '¡Hola, extraño!' + dialog: + - En mi camino de regreso del pueblo. + - '¿Yendo a la aldea?' + - Buena suerte en\ntus viajes. + farewell: + - Las carreteras te bendicen. +primis_traveler_2: + name: '&6Citro Gala' + role: '&6' + greetings: + - '¡Hola!' + dialog: + - En mi camino de\nregreso del pueblo. + - '¿Vienes de Pontis Mille o?' + - '¡Buena suerte!' + farewell: + - Las carreteras te bendicen. +primis_traveler_3: + name: '&6Bromia Culleolus' + role: '&6' + greetings: + - '¡Hola!' + dialog: + - '¿También vas\na la aldea?' + - He oído que es bastante\nfrío allí en\nla aldea. + - '¡Vaya! ¡Ya casi está!\nTengo que seguir.' + farewell: + - Las carreteras te bendicen. +primis_traveler_4: + name: '&6Demenis Nolus' + role: '&6' + greetings: + - '¡Hola, extraño!' + dialog: + - Es bueno ver a alguien\nmás en el camino. + - Casi llegué a la aldea. + - '¡Fiu!' + farewell: + - Las carreteras te bendicen. +primis_traveler_5: + name: '&6Callipho Classicius' + role: '&6' + greetings: + - '¡Heya!' + dialog: + - Necesito mejores zapatos. + - Pronto estaré\nen casa. + - '¡Es bueno volver a ver\nlos campos!' + farewell: + - '¡Viajes seguros!' +primis_traveler_6: + name: '&6Rodenus Palis' + role: '&6' + greetings: + - '¡Hola ahí!' + dialog: + - Estoy en mi camino de\nregreso del pueblo. + - Es bueno volver a\nver Pontis Mille. + - '¿Mi hermano está perdido nuevo?...' + - '¿Dónde está él?' + farewell: + - Hasta más tarde! +primis_traveler_7: + name: '&6Gorenus Palis' + role: '&6' + greetings: + - Hey... + dialog: + - '¿Me he perdido otra vez?' + - Esto no es Pontis Mille. + - '¿Dónde estoy?' + - Uhh, esto no\nparece el\ncamino correcto... + farewell: + - Adiós. +quest_giver: + name: Qel'Thuzad + role: + greetings: + - '¡Saludos, aventurero!\n¿Te apetece una misión?' + - '¡Tú! ¡Tengo una misión!' + - Sintiéndote... ¿aventurero? + dialog: + - '¡Completa las misiones del gremio\npara obtener recompensas geniales!' + - '¡Las misiones de nivel más alto tienen \nmejores recompensas!' + - '¡Las misiones de nivel más alto hacen que\ncaces mobs de nivel superior!' + - '¿Quieres un desafío más difícil?\n¡Aumenta el rango de tu gremio!' + - '¡Asegúrate de estar bien equipado\npara estas misiones!' + farewell: + - Buen viaje, amigo. + - '¡Feliz caza!' + - '¡Larga y próspera vida!' + - Vuelve con tu escudo,\n o sobre él. + - '¡Vida antes que la muerte!' + - '¡Fuerza antes que debilidad!' + - '¡El viaje vale más que el destino!' +refiner_config: + name: Ralph + role: + greetings: + - '¿Quieres mejorar tus chatarra?' + - '¿Tienes chatarra?' + - '¡Estoy buscando chatarra de bajo nivel!' + - Saludos, ¿Tiene' chatarra? + - '¡Yo reciclaré tu chatarra!' + dialog: + - '¿Necesitas mejorar tu chatarra?' + - '¡Mejorando la chatarra aquí!' + - '¡Mejora 10 de chatarra a un nivel superior!' + - '¡Haz que tu chatarra sea más útil!' + - '¿Tienes chatarra de bajo nivel?' + farewell: + - Regresa cuando tengas\nmás chatarra de bajo nivel + - '¡No te olvides de darle \nuso a esa chatarra!' + - '¡Que te revuelvas en chatarra!' +repairman_config: + name: Reggie + role: + greetings: + - '¡Repara tus objetos aquí!' + - '¡Estoy reparando objetos a cambio de chatarra!' + - '¡Transforma esa chatarra en durabilidad!' + - '¿Necesitas una reparación?' + - '¿Tienes algún objeto dañado?' + dialog: + - '¡Las mejores reparaciones de la zona!' + - '¡Tengo tu solución!' + - '¿Necesitas un arreglo?' + - '¡Yo repararé tus objetos!' + - '¿Necesitas reparar objetos élite?' + farewell: + - '¡No te olvides de hacer mantenimiento!' + - '¡Estaré aquí si me necesitas!' + - Llama, grita si me necesitas,\ny al instante yo estaré +santa: + name: '&4Santo Nick' + role: '&c' + greetings: + - '¡Ho ho ho!' + dialog: + - He perdido algunos regalos, \n¿Me puedes ayudar? + - Querido viajero, ¡tengo\nuna solicitud para ti! + - '¿Puedes ayudar a un anciano\nen su tiempo de necesidad?' + farewell: + - '¡Ho ho ho!' +scrapper_config: + name: Kelly + role: + greetings: + - '¿Quieres deshacerte de objetos?' + - '¿Necesitas reciclar objetos?' + - '¿Buscas hacer chatarra?' + - '¡Es un hora de la chatarra!' + - '¡Hora de hacer chatarra!' + dialog: + - '¡Ofertas basura!' + - '¡Obtén tu chatarra aquí!' + - '¡75% de probabilidades de funcionar!' + - No hay reembolsos. + - Reciclar, reutilizar, reducir! + farewell: + - Regresa cuando tengas\nmás para hacer chatarra + - '¡No te olvides de darle \nuso a esa chatarra!' + - '¡Feliz desguace!' +smelter: + name: Sam + role: + greetings: + - '¿Tienes chatarra?' + - '¿Tienes chatarra extra?' + - '¿¡Huelo chatarra en ti!?' + - Por favor, ¡necesito chatarra! + - '¡Alimentame con chatarra!' + dialog: + - '¡Haré que tu chatarra sea útil!' + - '¡Dame chatarra y te daré\norbes de mejora!' + - La chatarra es inútil, ¡dámela a mi! + farewell: + - Regresa cuando tengas\nmás chatarra que hacer + - '¡Al mejorador que te vas!' +special_blacksmith: + name: Grog + role: + greetings: + - '¿Necesitas algo?' + - '¿Conseguiste algo bueno?' + - No tenemos nada menos que lo mejor + - '¿Tienes algo que valga la pena vender?' + - Solo compramos equipos de élite. + dialog: + - Compramos barato y vendemos caro. + - Sin reembolsos. + - Absolutamente no hay reembolsos. + - No hay reembolsos. + - Sin arrepentimientos. + - Las compras de la tienda son definitivas. + farewell: + - Regresa cuando tengas\nmás para gastar + - No te mates,\nqueremos que nos traigas\nmás equipamiento. + - La próxima vez compra algo \nmás caro. + - No te olvides, no hay reembolsos. +test_npc: + name: Probar NPC + role: '¡Prueba!' + greetings: + - '¡Saludos de prueba!' + dialog: + - Test Dialog! + farewell: + - '¡Prueba de despedido!' +travelling_merchant: + name: Jeeves + role: + greetings: + - '¿Tienes algo para vender?' + - '¿Me llamaste?' + - '¿Eh?' + dialog: + - '¡Lo compraré a bajo costo!' + - '¿Tienes algo para mí?' + - '¡El tiempo es dinero!' + farewell: + - '¡Llámame de nuevo en cualquier momento!' + - '¿Eso fue todo?' + - '¡Buen viaje!' + - '¡No te mates!' + - '¡Buena caza!' +unbinder: + name: Ulfric + role: + greetings: + - Saludos. + - Bienvenido. + - Saludos, amigo. + - '¿Sí?' + - '¿Te puedo ayudar?' + dialog: + - Desvincularé tus objetos\npor un pergamino extremadamente raro. + - Soy el único calificado\npara desvincular tus bienes. + - '¿Tienes un pergamino de desvinculación?' + farewell: + - "Recuerda: Usa los pergaminos\nde desvinculación sabiamente." + - Buen viaje, amigo. +wood_league_arena_master: + name: Gladius + role: + greetings: + - Bienvenido a la \nArena! + dialog: + - '¿Preparado para enfrentarte a la arena?' + farewell: + - '¡Regresa con tu escudo, o con él!' +wood_league: + arenaName: Liga de Madera + arenaMessages: + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - wave=8:message=&8[Gladius] &fNo está mal, pero ¿y si todos los enemigos son enemigos &ccuerpo a cuerpo&f? + - wave=9:message=&8[Gladius] &fBien, bien, pero ¿y si en su lugar están todos &ca distancia&f? + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - wave=44:message=&8[Gladius] &fEsto claramente no funciona, déjame pensar en algo... + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +ag_welcome_quest_0: + customObjectives: + Objective1: + dialog: + - '&8[&aCasus&8]&f Welcome to the Adventurer''s Guild Hub, the hub for all things EliteMobs!' + - You can always get back here using &2/ag&f! + - Talk to me again for a quest! + name: '&2Encontrando el AG!' + questLore: + - + - + questAcceptDialog: + - '&8[Odigos]&f Bien, asegúrate de usar &2/ag &f o &2/adventursguild&f para ir al centro del gremio del aventurero!' + - '¡Asegúrate de hablar con Casus cuando estés allí!' +ag_welcome_quest_1: + customObjectives: + Objective3: + dialog: + - '&8[&aGreg&8]&f Want to buy or sell something? I''ve got a little of everything!' + Objective4: + dialog: + - '&8[&aCharles&8]&f Want to learn about fighting elites? Just talk to me!' + Objective1: + dialog: + - '&8[&aHermes&8]&f I take you back to where you were before! Just talk to me again!' + Objective2: + dialog: + - '&8[&aBartley&8]&f Need a stiff drink? My drinks pack an extra punch!' + Objective7: + dialog: + - '&8[&aQel''Thuzad&8]&f These Elite monsters, where do they keep coming from?' + - + - + - Just talk to me to get one! + Objective12: + dialog: + - '&8[&aGrog&8]&f Want to buy special items? I''ve got just the thing!' + Objective8: + dialog: + - '&8[&aRalph&8]&f Get more out of your scrap by upgrading it! Just talk to me at any time.' + Objective13: + dialog: + - '&8[&aUlfric&8]&f If you bring me a very special and rare item, I can unbind your Elite items.' + - + - + Objective5: + dialog: + - '&8[&aTim&8]&f Want to upgrade your Elite Items? Just get an upgrade orb from Sam over there!' + Objective10: + dialog: + - '&8[&aKelly&8]&f Got extra Elite items? Don''t know what to do with them? Give them to me, and I''ll turn them into scrap!' + - + - + Objective6: + dialog: + - '&8[&aGillian&8]&f ¿Buscas poder? ¿Deseas alcanzar nuevas alturas? ¡Háblame para desbloquear nuevos rangos de hermandad y alcanzar niveles de poder que nunca pensaste serían posibles!' + Objective11: + dialog: + - '&8[&aSam&8]&f Got extra scrap? I can refine that into Upgrade Orbs, which you can give to Tim to upgrade your Elite items with!' + Objective9: + dialog: + - '&8[&aReggie&8]&f Need your Elite items repaired? Just bring me some scrap, and I''ll make them as good as new!' + - + - + name: '&2Bienvenido al AG!' + questLore: + - '&a¡Conoce a los NPC del gremio de aventurero!' +primis_caeruleaum_a_can_of_worms: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis] &fPlease tell me you''re the one bringing the bait.' + name: '&2Una lata de gusanos' + questLore: + - Aquí, toma el cebo y vete. + - '¡Por favor, date prisa!' + questAcceptDialog: + - '&a[Callidus Piscatus]&f ¡Mi amigo está en un bote cerca del muelle!' + - '&7&oDebería apurarme para ir al barco.' + questCompleteMessage: + - '&a[Piscis Nemesis]&f ¿Has traído cebo? ¡Perfecto!' + - '¡El cebo debería atraerlo!' + - '&7&oDebería hablar con Nemesis.' +primis_caeruleaum_fishing: + name: '&2Cebo para Peces' + questLore: + - '¡Tenemos un gran problema!' + - + - + - + - + - '¡pero no puede hacer nada sin el cebo correcto!' + - '¡Te diré a dónde ir para obtener &eCebo de Pez &f, por favor ve a ayudar a mi amigo!' + - '¡Te prometo que te recompensaré!' + questAcceptDialog: + - '&a[Callidus Piscatus]&f ¡El tiempo es de la esencia! ¡Hay un montón de &cGusanos Grandes&f a la derecha cuando sales de la aldea!' + - Consigue 5 y vuelve aquí y los prepararé para su uso. + - '&7&oDebería ir a obtener un poco de Carnada de Pez.' + questCompleteMessage: + - '&a[Callidus Piscatus]&f ¿Has traído cebo? ¡Perfecto!' + - '¡Lo prepararé de inmediato!' + - '&7&oDebería hablar con &aCallidus &7&onuevamente y recoger el cebo preparado.' +primis_caeruleaum_fishing_2: + name: '&2Carnada de Monstruo' + questLore: + - '¡Eso hizo el truco! ¡Salta en el agujero del gusano, sostendré el barco!' + - '¡Vamos a mostrar a este monstruo la furia de un pescador!' + questAcceptDialog: + - '&a[Piscis Nemesis]&f ¡Entra aquí, sostendré el barco!' + - '¡No te olvides de poner ese &eCasco de buceo&f!' + - '&7&oDebo entrar en el agujero de gusano y derrotar al Monstruo Marino.' + questCompleteMessage: + - '&a[Piscis Nemesis]&f ¡Jaja! ¡Qué buen show!' + - '&fPor supuesto, yo tenía la situación bajo control todo este tiempo, pero seguro que ayudaste un poco!' + - '&f¡Aquí, puedes tener esto!' + - '&7&oEl monstruo está muerto y la orilla está segura. Parece un trabajo bien hecho.' +primis_caeruleaum_fletching: + name: '&2Cazador de Flechas' + questLore: + - '¿Tienes unos minutos para ayudar?' + - '¡Con todas las incursiones recientes, nos hemos encontrado fuera de las &eFlechas de Agarre&0!' + - Normalmente es mi trabajo obtenerlos, pero las cosas son un + - poco peligrosas ahora mismo para que yo vaya a aventurarme en las mazmorras. + - Si pudieras obtener esas &eFlechas de Agarre&f para mí, + - '¡Te enseñaré cómo usarlos!' + questAcceptDialog: + - '&a[Ventus Artifex]&f Por favor tráeme 10 &eFlechas de Agarre &fde las ruinas, justo más allá de la aldea.' + - Los &cEsqueletos No-Muertos&f y &cAhogados&f de la antigüedad suelen cargarlos. + - '&7&oDebería ir a matar a los &cEsqueletos&7&o y &cAhogados&7&o en las ruinas cercanas al pueblo para sus &eFlechas Aferradas&7&o.' + questCompleteMessage: + - '&a[Ventus Artifex]&f ¡Gran trabajo!' + - '&fLas &eFlechas Aferradas &fpueden ser usadas en &cBloques de objetivo &fpara llegar a lugares de difícil acceso.' + - Son una necesidad para la aspirante ventura en la ruina antigua. + - '¡Aquí tienes tu recompensa!' + - '¿Qué tal si ponemos a prueba tus conocimientos?' + - '&7&oParece que &aVentus Artifex&7&o tiene un reto para mí.' +primis_caeruleaum_fletching_2: + name: '&2Cazador de Escudos' + questLore: + - '¿Tienes las flechas? ¡Genial!' + - '¡Usa esas flechas con un arco para escalar la torre!' + questAcceptDialog: + - '&a[Ventus Artifex]&f ¡Usa las flechas que acabas de recibir para ir a las ruinas y disparar a los blancos con ellas!' + - + - + - + - + - '&7&oDebería ir a obtener el &eEscudo&7&o dentro de las ruinas, usando las &eFlechas de Agarre&7&o para disparar a los blancos dentro del edificio.' + questCompleteMessage: + - '&a[Ventus Artifex]&f ¡Sobresaliente!' + - '¡Realmente eres un verdadero cavador de ruinas!' + - '¡Aquí tienes tu recompensa!' + - '&7&oParece que Flechas de Agarre serán útiles en el futuro.' +primis_caeruleaum_foraging: + name: '&2Carnada de Lobo' + questLore: + - He oído que estabas buscando ayudar por aquí. + - '¡Hay una &dGuarida de Lobos&f cerca que' + - realmente me impide mi forraje para la aldea! + questAcceptDialog: + - '&a[Venator Pabulatus]&f Si puedes deshacerte de esos molestos &cLobos&f, te recompensaré genialmente!' + - Me estoy volviendo demasiado viejo para tratar con las cosas salvajes de estas tierras... + - '&7&oDebería ir a matar a los &cLobos&7&o en su guarida al Sureste de la aldea.' + questCompleteMessage: + - '&a[Venator Pabulatus]&f ¡Sabía que podía contar contigo!' + - '¡Gracias a todos por toda su ayuda!' + - Aquí está tu recompensa como he prometido. +primis_farmstead_lighthouse_keeper_2: + customObjectives: + Objective1: + dialog: + - "&a[Jeeves]&f &2Amavit&f sent you? What's this about a lighthouse? My, what a discovery!\n&fThis will revolutionize my job as a traveling merchant! Here, have these &eScrolls&f - just call me and I'll be there in a jiffy!\n&7&oSeems like &aJeeves&7&o has something for me. I should talk to him." + name: '&2Las Luces Misteriosas' + questLore: + - + - + - Mi padre &aJeeves&f fue a la cima para revisar, pero aún no ha regresado. + - + - + questAcceptDialog: + - '&a[Amavit]&f Gracias de nuevo, y buena suerte. Esperemos que no sea nada.' + - 'Debería ir a la &dCima del Faro&f, investigar el problema y luego informar al padre de &aAmavit&f &aJeeves&f en el Pueblo.' + questCompleteMessage: + - '&7&o¡Estos desplazamientos parecen muy útiles! Debería usar el &dFaro&7&o para volver a &dAlqueria&7&o y seguir moviéndose.' +primis_gladius_assassins: + name: '&5¿Quién apunta a los francotiradores?' + questLore: + - '¡Los techos de &dGladius&f están cubiertos de &cAsesinos&f!' + - Salir a las calles es una sentencia de muerte. ¡Tenemos que ocuparnos de estos francotiradores! + - + - + questAcceptDialog: + - '&a[Belli] ¡Hazte cargo esos &cAsesinos&f! ¡Recuerda usar las &eFlechas de Agarre&f!.' + - '&7&oDebería matar a esos &cAsesinos&7&o.' + questCompleteMessage: + - '&a[Belli]&f ¿Te has ocupado de esos &cAsesinos&f? ¡Bueno! ¡Ese es un dolor de cabeza tratado!' +primis_gladius_clear: + name: '&5Retomando las calles' + questLore: + - No necesito decirte que la ciudad está siendo invadida, ¿verdad? + - Estamos ofreciendo una recompensa a quienes están dispuestos a poner una abolladura en la cantidad de &cInvasores&f. + - '¿Estás preparado para ello?' + questAcceptDialog: + - '&a[Belli] &f¡Simplemente sal ahí y reduce sus números!' + - '&7&oSalgo ahí y despejo las calles de &dGladius&7&o.' + questCompleteMessage: + - '&a[Belli]&f Mira eso, ¡los Dioses han proporcionado un verdadero guerrero en nuestro tiempo de necesidad! Tengo un trabajo para una persona como tú.' + - '&7&oParece que &aBelli&7&o tiene un plan para mí. Debería ir a hablar con ella..' +primis_gladius_prayer: + name: '&5Salto de Fe' + questLore: + - No voy a azucararlo, ¡las cosas parecen francamente sombrías! + - Las paredes han caído, las calles están repletas + - con los &cNo-Muertos&f y acabo de quedarme sin bebidas. + - '¡En momentos como estos, la gente torna su esperanza en' + - algún tipo de intervención divina! + - Hay un &dCamino&f, iluminado por velas, que conduce a un + - '&dSantuario en las Montañas&f.' + - Los guerreros van por este camino y derrotan al &cMonje&f que protege + - el santuario para ser bendecido por el Dios de la guerra en combate. + - Puede que sea simplemente una superstición, pero ¿Lastimaría + - dar esperanza a la gente? + - El hecho de que hayas llegado hasta aquí demuestra que eres un corte superior + - el resto - suban a la montaña y derroten a los &cMonjes&f. + - Todos los guerreros se sentirán mejor sabiendo que están siendo velados. + questAcceptDialog: + - '&a[Belli] &f¡Ve al &dpiso superior&f y sigue las velas! ¡Cuidado de no caer, el camino es traicionero!' + - '&7&oDebería seguir el &dcamino de las velas&7&o y derrotar al &cMonje&7&o.' + questCompleteMessage: + - '&a[Belli]&f ¿Has completado la oración? Gracias, los soldados se sentirán aliviados al escucharlo.' +primis_gladius_ships: + name: '&5Una sensación de hundimiento' + questLore: + - '¿Los has visto? ¿Las decenas de barcos justo fuera' + - de &dGaldius&f? Ellos son los culpables de todo esto. + - Nunca esperamos una invasión del &dTemplo de Sangre&f, + - '¡Mucho menos uno hecho por armas de asedio montadas en barcos!' + - Debemos hacer algo al respecto. Matar al &cAlmirante&f + - y algunas de las fuerzas no nos devolverán lo que hemos perdido, + - pero seguro que nos hará sentir mejor. + questAcceptDialog: + - '&a[Belli] &fMata al &cAlmirante&f y algunas de las tropas en los barcos. ¡Ten cuidado con su superioridad de agua! Te recomiendo usar &eFlechas de Agarre&f para moverte por los barcos.' + - '&7&oDebería ir a matar al &cAlmirante&7&o y algunas de sus tropas en los barcos justo &dfuera de Gladius&7&o.' + questCompleteMessage: + - '&a[Belli]&f ¿El almirante ya no es más? ¡Por qué, ya me siento mejor!' +primis_gladius_sunken_ship: + name: '&5Barco Hundido' + questLore: + - Ahora que te encargaste de las &cFuerzas Marineras&f tengo + - otra tarea para ti. + - El &dBarco Hundido&f debería ser accesible ahora. + - Verás, hace algún tiempo que uno de nuestros barcos se hundió, + - desafortunadamente estaba llevando &eDocumentos Importantes&f. + - Necesito que llegues al &dbarco hundido&f y mates cualquier amenaza + - alrededor y recuperes los &eDocumentos&f. + - Vuelva a mí una después de que hayas completado la tarea. + questAcceptDialog: + - '&a[Belli] &fEncontrarás el barco en las aguas del sur-oeste. ¡Dales el infierno!' + - '&7&oDebería ir a recoger los &eDocumentos&7&o y matar los &cMarineros&7&o cerca del barco.' + questCompleteMessage: + - '&a[Belli]&f ¿Ya regresaste? ¡Excelente trabajo! Realmente necesitábamos esos &eDocumentos&f.' +primis_gladius_supplies_1: + name: '&cProblemas de suministro' + questLore: + - '¡Nos estamos quedando sin &eSuministros&f!' + - '¡&dGladius&f es una fortaleza equipada para durar un asedio largo' + - sin problemas, pero eso suponiendo que tenemos + - acceso al &dAlmacén&f! + - Desafortunadamente el &dAlmacén&f fue uno de los primeros lugares en caer, + - y ahora estamos lentamente muriendo de hambre! + - Si puedes despejar una ruta al &dAlmacén&f y obtener algunos &eSuministros&f + - eso ayudaría mucho a los esfuerzos de guerra! + questAcceptDialog: + - '&a[Cibus]&f ¡El &dAlmacén&f es difícil de pasar por delante! ¡Es el edificio extra grande con aspecto de almacén cerca de la parte donde cayó el muro! ¡Recoge algunos &eSuministros&f y ponlos de vuelta aquí!' + - '&7&oDebería ir al &dAlmacén&7&o y traer de vuelta &eSuministros&7&o.' + questCompleteMessage: + - '&a[Cibus]&f ¿Trajiste de vuelta los &eSuministros? ¡Fantástico! Mientras, llegué con la idea perfecta para las bebidas - ¡y debería ser algo que levante los espíritus de los soldados!' + - '&7&oParece que el &aCibus&7&o tiene un plan, debería hablar con él.' +primis_gladius_supplies_2: + name: '&cSuministrando más problemas' + questLore: + - Tenemos alimentos, pero ¿qué hay con las bebidas? + - Algunos dirían que es tontería emborracharse en el medio + - de una guerra, pero si no ahora ¿Cuándo? + - El &cCantinero&f al otro lado de la calle guardaba todas las cosas + - buenas en el &dSótano&f. + - '¡Creo que sabes a dónde voy con esto!' + - Ve al &dSótano&f de la taberna al otro lado de la calle y consigue + - las &eCosas Buenas&f. Si encuentras al &cCantinero&f, lo consideraría un + - favor personal si lo liberas de esta maldición de no-muerte. + - Estamos bastante seguros que él estaba en el &dSótano&f cuando la + - invasión sucedió así que lo más probable es que él aún esté ahí, + - aunque probablemente ya no sea él mismo. + - '¡Ten cuidado!' + questAcceptDialog: + - '&a[Cibus]&f La &dTaberna&f está justo al otro lado de la calle, es difícil de pasar de lado. ¡Solo ve al &dSótano&f y consigue las &eCosas buenas&f!' + - '&7&oDebería ir al &dSótano&7&o de la taberna y obtener "las &eCosas Buenas&7&o".' + questCompleteMessage: + - '&a[Cibus]&f ¿Has derrotado al &cCantinero&f? Te doy las gracias por liberar a mi viejo de esta maldita no-muerte. Venga, voy a tomar la primera bebida contigo.' +primis_ice_village_all_out_of_chains: + customObjectives: + Objective1: + dialog: + - '&a[Orbis]&f Oh, the Ice Village chain shipment. Yes, it is right in that chest over there.' + - Sorry for not sending it over, but we were quite busy and had no time. + - It's all paid for so feel free to just grab it. + name: '&2Todo por las cadenas' + questLore: + - Hey, usted vino de &dPontis Mille&f ¿verdad? + - '¿Cómo te gustaría ayudarnos?' + - Aquí en la cárcel tendemos a pasar por + - un montón de cadenas... + - Especialmente las cadenas que sostienen las jaulas. + - Se oxidan mucho y luego se rompen. Así + - es como uno de los prisioneros escapó. La cadena + - oxidada se rompió, la jaula cayó y él corrió. + - Pagamos por un + - '&eEnvío de cadenas nuevas&f, pero' + - aún no han llegado. Si pudieras ir a + - '&dPontis Mille&f y buscar nuestro' + - '&eEnvío de Cadenas&f' + - '¡Eso sería grandioso!' + questAcceptDialog: + - '&a[Philolaches Triferus]&f Ve a hablar con Orbis. Son los que hacen las cadenas.' + - '&7&oDebería ir a hablar con &a&oOrbis&7&o y traer de vuelta el &e&oEnvío de Cadenas&7&o.' + questCompleteMessage: + - '&a[Philolaches Triferus]&f ¡Esas son las cadenas! Gracias por conseguirlas, realmente las necesitábamos.' +primis_ice_village_catch_me_if_you_can: + name: '&2Atrápame si puedes' + questLore: + - '¡Qué oportuno! Estaba buscando a alguien para ir a capturar nuestro' + - '&cPrisionero Escapado&f.' + - + - + - + - + - + - + questAcceptDialog: + - '&a[Romanus Superbus]&f Debe estar en algún lugar en las montañas.' + - '&7&oDebería ir a encontrar el &c&oPrisionero Escapado&7&o y traerlo de vuelta a la prisión.' + questCompleteMessage: + - '&a[Romanus Superbus]&f Bueno, bueno, bueno, si no es nuestra escapada bella durmiente.' + - Buen trabajo. Un trabajo bien hecho merece un buen pago, aquí tienes. + - '&aRomanus&7 te da una bolsa pesada de monedas.' +primis_ice_village_get_them_off_my_back: + name: '&2¡Quítalos de mi espalda!' + questLore: + - Déjame decirte, estoy muy contento de que estés aquí para ayudar, ja ja. + - Nuestra misión aquí es cazar &cJabalíes&f y mantener su número bajo control. + - Tampoco se trata todo del control de la población. + - Nos proporcionan valioso cuero, colmillos y carne. + - No estoy seguro de si esta aldea estaría alrededor sin ellos. + - + - + - + - + - + - + - Solo necesitamos que elimines los &cJabalíes Bebés&f y los &c Jabalíes Juveniles&f. + - + - + - + - + - Significaría mucho para mí si pudieras recuperarlo. + questAcceptDialog: + - '&a[Alanus Isatis]&f Debes haber visto a los &cJabalíes&f en tu camino aquí así que asumo que sabes dónde encontrarlos.' + - '&7&oNecesito sacrificar la población de &c&oJabalíes&7&o y recuperar la &e&oDaga de Alanus&7&o.' + questCompleteMessage: + - '&a[Alanus Isatis]&f ¡Bien hecho amigo! Eso debería ayudar mucho.' + - + - + - La daga no es nada especial, pero era un regalo hecho a mano de mi difunto padre. + - '¡La próxima vez que tengas sed, las bebidas van por mi cuenta!' +primis_ice_village_gotta_keep_warm: + customObjectives: + Objective1: + dialog: + - '&a[Severinus Martius]&f Ha ha! That should keep me warm for another couple of weeks!' + - Hey friend, you heading for &dCaerullium Village&f by any chance? + name: '&2Gotta keep warm' + questLore: + - We deliver the &aLighthouse Keeper&f some + - of our strong stuff every couple of weeks. + - It keeps him warm during the colder days. + - It's a small gesture of thanks for all his + - hard work. Any chance you could help out + - and bring over the next batch? + questAcceptDialog: + - '&a[Grania Cecilius]&f You can find the lighthouse to the East. Thanks!' + - '&7&oI should go to the &d&oLighthouse&7&o and deliver these to the &a&oLighthouse Keeper&7&o.' + questCompleteMessage: + - '&a[Severinus Martius]&f If you''re heading over there then I would appreciate if you could deliver some of these to my good friend &aJeeves&f.' + - '&7&oSeems like the &a&oLighthouse Keeper&7&o has a quest for me.' +primis_ice_village_gotta_see_jeeves: + customObjectives: + Objective1: + dialog: + - '&a[Jeeves]&f Oh! A gift from my friend Severinus you say.' + - Well, thank you for bringing it over. Was nice seeing you again! + name: '&2Gotta see Jeeves' + questLore: + - Now, now it would be really rude of me to keep + - all of the good stuff to myself! + - If you would bother helping me out friend and + - delivering some of the good stuff + - to my friend &aJeeves&f at &dCaerullium Village&f. + - You can get there quickly by taking the + - '&9lighthouse portal&f.' + questAcceptDialog: + - '&a[Severinus Martius]&f The portal is all the way at the top.' + - '&7&oI should go to &d&oCaerullium Village&7&o and deliver some of the good stuff to &a&oJeeves&7&o.' + questCompleteMessage: + - '&a[Severinus Martius]&f Thank you for delivering some of the strong stuff to Jeeves. I know he likes a good drink here and there ha ha!' +primis_ice_village_living_nightmares: + customObjectives: + Objective1: + dialog: + - '&a[Cornelia Ennodius]&f Are they gone? I was so scared. My parents sent you? Thank goodness.' + - + - + - I couldn't escape. I, I...will be fine, I just need a minute... + name: '&2Pesadillas Vivientes' + questLore: + - Estaba siguiendo su rastro, aquí es donde termina. + - No estoy seguro de adónde habrá ido desde aquí. + - Me temo que podría haber ocurrido algo malo. + - Nuestra &aChica&f toma mucho de mí y mis poderes especiales. + - Excepto que los suyos son mucho más potentes, ella es capaz + - de hacer que las emociones poderosas se manifiesten en el mundo real. + - Nos estamos quedando sin tiempo, tenemos que encontrarla pronto. + questAcceptDialog: + - '&a[Sestia Ennodius]&f El rastro se enfrió aquí, ella no puede estar tan lejos...' + - '&7&oNecesito encontrar a la &a&oHija Perdida&7&o antes de que le suceda algo.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f ¡La has encontrado! Rápido, ¿dónde está?' + - '¡Gracias, extraño, voy a ir a ella de inmediato!' +primis_ice_village_make_them_go_ouch: + name: '&2Hazles hacer ouch' + questLore: + - '¡Tuve unos ''&cClientes&f'' traviesos' + - que vinieron a visitar hace unos días. + - Robaron la más valiosa + - de mis &ePosesiones&f. + - Necesitas encontrarlos y asegurarte de + - enseñarles una lección. + - Asegúrate de que sepan + - '&aViolet&f no se olvida de recoger.' + questAcceptDialog: + - '&a[Domina Violet]&f Fueron al este más allá de los &9Árboles&f.' + - '&7&oNecesito asegurarme de que los &c&oClientes&7&o sepan que no deben meterse con &a&oViolet&7&o. También necesito recuperar &e&oLa Propiedad de Violet&7&o.' + questCompleteMessage: + - '&a[Domina Violet]&f Espero que les hayas enseñado el valor del dolor.' + - + - +primis_ice_village_objection!: + customObjectives: + Objective3: + dialog: + - '&a[Glacies Princeps]&f What, absolutely not. I don''t know how he convinced you to come here and beg for his release.' + - + - + - He will never be released. Is that understood. + Objective1: + dialog: + - '&a[Romanus Superbus]&f Release him? Not guilty? Are you mad? You''re lucky I don''t throw you in a cage too for suggesting such nonsense.' + Objective2: + dialog: + - '&a[Luxuria Placidus]&f Who? Never heard of him.' + name: '&2¡Objeción!' + questLore: + - '¡Yo no pertenezco aquí! ¿Seguramente lo pueden ver?' + - '¡No he hecho nada malo! ¿Extraño, escucharías mi súplica?' + - '¿Ayudarías a esta pobre alma que ha sido atrapada' + - aquí en esta horrible jaula sin ser su culpa? + - '¡Debes ir a hablar con el' + - '&aMaestro de Cárcel&f o el ' + - '&aLíder de Aldea&f.' + - O cualquier otro + - '&aAldeano Amigable&f' + - quién estaría + - dispuesto a argumentar por + - mi liberación! + questAcceptDialog: + - '&a[Adrius Calpornius]&f ¡Habla con ellos! ¡Sácame!' + - '&7&oDebería ir a hablar con la gente de mi lista.' + questCompleteMessage: + - '&a[Adrius Calpornius]&f ¡¿QUÉ?! ¡¡¡MENTIRAS!!! Nunca le haría semejante cosa horrible a mi familia...' + - + - + - '&7Cualquier cordura que le quedara a este pobre hombre, se ha ido ahora...' +primis_ice_village_run_away_daughter: + customObjectives: + Objective1: + dialog: + - '&a[Sestia Ennodius]&f I could sense you coming.' + name: '&2Hija Escapada' + questLore: + - '¡Extraño! ¿Ayudarías a nuestra familia?' + - Nuestra &aHija&fha desaparecido. + - Ella ha sido dotada con poderes + - especiales justo como su &aMadre&f + - Temo que la noche anterior algo + - terrible haya pasado para + - hacer que huya en medio de + - la noche. + questAcceptDialog: + - '&a[Sparax Ennodius]&f Mi &aEsposa&f ya ha ido a buscarla.' + - Estoy seguro de que ella está en algún lugar fuera de la aldea. Ve a encontrarla y habla con ella. + - '&7&oDebería buscar a la &a&oMadre Preocupada&7&o.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f ¿Fuiste enviado por mi &aEsposo&f para ayudar con la búsqueda?' + - '&7&oDebería escuchar a la &a&oMadre Preocupada&7&o.' +primis_ice_village_silence: + name: '&2Hazles hacer ouch' + questLore: + - '¡Shhh! ¿Lo escuchas?' + - El chirrido molesto. + - '¡Ugh, ya no puedo aguantarlo!' + - Escucha, pagaré buena moneda + - si puedes encontrar la fuente + - de ese chirrido molesto + - y hacer que se detenga. + questAcceptDialog: + - '&a[Modestus Eulogius]&f Parece que viene de alguna parte de las colinas detrás de mí.' + - '&7&oDebería encontrar la fuente de todo el ruido y hacer que pare.' + questCompleteMessage: + - '&a[Modestus Eulogius]&f ¡Tanto yo como mis oídos te damos las gracias!' +primis_ice_village_taking_the_bait: + name: '&2Tomar el cebo' + questLore: + - Estos &cPeces&f, ¡¿qué está mal con ellos!? + - '¡He estado aquí pescando durante días ahora!' + - Ni siquiera una sola mordedura. ¡Si tan solo fuera más joven, se los demostraría! + - + - + - Y si no podemos atrapar a ninguno, bueno eso es un gran problema. + - Tendrás que bajar allí y golpearlos hasta dejarlos inconscientes. + questAcceptDialog: + - '&a[Theopropides Nero]&f ¡Has querido ayudar así que esta es tu oportunidad!' + - '&7&oDebería saltar al lago y matar 7 &c&oSalmones Fríos&7&o y recoger sus cuerpos.' + questCompleteMessage: + - '&a[Theopropides Nero]&f ¡Oh! ¡Míralos! ¡Semejantemente grandes!.' + - + - +primis_ice_village_treats_for_the_punished: + customObjectives: + Objective1: + dialog: + - '&a[Eleusium Calenus]&f My wife sent you? Oh, are those treats? My favorite too! She''s such a darling.' + - + - + - 'You tell her I am doing just fine and that I love her very much. ' + name: '&2Golosinas para los castigados' + questLore: + - Si no te importa, ¿podría pedirte que hicieras algo por mí? + - Mi querido &aEsposo&f ha sido encarcelado y sé que es duro vivir una jaula todo el día. + - Así que preparé algunas golosinas que yo iba a entregarle. + - + - + questAcceptDialog: + - '&a[Titia Calenus]&f Estará en una de las jaulas del medio.' + - No te olvides de decirle que lo amo. + - '&7&oDebería entregar estas golosinas al &a&oEsposo&7&o.' + questCompleteMessage: + - '&a[Titia Calenus]&f ¡Volviste tan rápido! Oh, ¿realmente dijo eso? Él es tan dulce.' +primis_ice_village_wanna_make_a_snowman: + name: '&2¿Quieres construir un muñeco de nieve?' + questLore: + - Los niños alrededor de la aldea han estado muy aburridos últimamente + - y he estado pensando. Hay estas + - '&cCriaturas Mágicas&f que habitan el bosque alrededor de esta' + - aldea. El pelaje de las criaturas crece &eCristales Mágicos de Hielo&e. + - Cuando infundes la nieve con estos &eCristales&f hace que la + - la nieve se mueva, se expanda y se contraiga. + - Y si construyes un muñeco de nieve con esta nieve infundida + - hace que parezca como si el muñeco de nieve estuviera vivo. + - '¡A los niños les encantaría! Así que, ¿quieres ayudar' + - a este anciano animar a algunos niños? + questAcceptDialog: + - '&a[Sparax Ennodius]&f Encontrarás a las &cCriaturas&f en cualquier bosque cerca de la aldea.' + - + - + - '&7&oDebería ir a matar suficientes &c&Ursus de Piel de Escarcha&7&o para recoger 15 &e&oCristales de Hielo&7&o.' + questCompleteMessage: + - '&a[Sestia Ennodius]&f ¿Has reunido suficientes cristales? ¡Maravilloso!' + - Puedo empezar a hacer el muñeco de nieve ahora, ¡no puedo esperar a que los niños lo vean! +primis_main_quest_: + name: '&2¡Goblins en las minas!' + questLore: + - Este día sigue empeorando. En primer lugar, nos emboscan los goblins. + - Luego nos retiramos, solo para encontrar que nuestro ejército se dividió. Algunos están muertos, muchos otros están desaparecidos. + - Lo peor de todo, tememos que hayamos despertado al Rey Goblin. + - Algunos, esperemos, lo lograron. Tenemos que establecer un campo y recuperarnos por ahora. + - Si te atreves a entrar en las minas, estás solo. + - Intentamos escabullirlos más allá de ellos, y no salió bien. + - La única forma de avanzar es a través del derramamiento de sangre. + questAcceptDialog: + - '&8[Centurion]&f¿Vas a adentrarte en las Minas Goblin? ¡Ten cuidado con el Rey Goblin!' + - '&8[Centurion]&fEsperamos que nuestro equipo de exploración haya pasado más allá de él. Reúnete con ellos si puedes.' + - '&8&oI debe aventurarse a través de las minas y derrotar al Rey Goblin.' + questCompleteMessage: + - '&8[Fiesta de exploración]&f¿Lo has conseguido? Casi me gustaría que no lo hubieses. No creerás lo que queda por delante.' + - '&8&oSonidos como el grupo de exploradores me dan malas noticias.' +primis_main_quest_1: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis] &fOh so you were in the ship that beached a few hours ago?' + - + - + - + - + - + - + - '&7&oI should report to the &aFirst Mate &7&oto see if I should help these people!' + name: '&2¡Náufrago!' + questLore: + - '¿Por fin estás despierto? ¡Bueno! Necesitamos tu ayuda.' + - El barco arrasó durante la tormenta de la noche pasada. + - '¡Vemos un &dFaro &fen la distancia, así que debe haber una aldea allí!' + - '¡Ve a hablar con el &aLíder de la Aldea &fy comprueba si pueden prestar algo de ayuda!' + - El &aPrimer Oficial &fse adelantó a ti, pero no ha regresado todavía. + - '¡Sigue sus instrucciones si lo ves!' + questAcceptDialog: + - '&a[Capitán Squalus]&f ¡Ve a la aldea cercana y ve si nos ayudarán!' + - '¡Ten cuidado en tu camino allí, no sabemos qué acecha alrededor de estas partes!' + - '&7&oDebería investigar la aldea cercana y hablar con su líder.' + questCompleteMessage: + - '&a[Primer compañero Iracundi]&f ¡Demonios! ¡No podemos coger un descanso hoy! ¡Ten, es claramente peligroso ir solo, toma esto!' + - '&7&oParece que el Primer Compañero Iracundi tiene una solicitud para mí...' +primis_main_quest_10: + customObjectives: + Objective2: + dialog: + - "&a[Shogun Navita] &f&dGladius&f calls for our aid?\n&7&oSeems like I should talk to the &aShogun&7&o." + name: '&5Cerrando la brecha' + questLore: + - Ya es hora de llamar a &dPontis Mille&f para recibir ayuda. + - Háganles saber lo que sucedió aquí y díganles que estamos cobrando a nuestro favor. + - + - + questAcceptDialog: + - '&a[General Hasta] &fViajes seguros, recuerda: Mata al &cgGuardián de la Puerta&f y asegúrate de que nuestra petición llegue a los oídos de &aShogun Navita&f..' + - '&7&oDebería matar al &cGuardián de la Puerta&7&o en el &dpuente&7&o y hacerme camino a &aShogun Navita&7&o en &dPontis Mille&7&o.' + questCompleteMessage: + - '&a[Shogun Navita]&f Verdaderamente las noticias que me traes son las más inquietantes, pero me temo que ya sospechábamos que algo... antinatural... estaba pasando.' + - '&7&oParece que &aShogun Navita&7&o quiere hablar conmigo.' +primis_main_quest_11: + customObjectives: + Objective1: + dialog: + - '&a[Major Fortes Bellator]&f Yes, traveler?' + name: '&2¡Enviando un mensaje!' + questLore: + - Las historias de tu viaje son muy sorprendentes. + - Que hayas llegado vivo hasta aquí no es nada menos que un milagro. + - Las fuerzas que invaden &dGladius&f son insuperables. + - '&dGladius&f eventualmente se derrumbará bajo su poder...' + - '¿Ayuda?... Ah, sí. Ve a ver a &aAlcalde Fortes Bellator&f.' + - Él podrá asistirte. + questAcceptDialog: + - '&a[Navita]&f ¡Puedes encontrar al &aAlcalde&f en la parte superior de esas escaleras justo por delante!' + - '&7&oDebería ir a hablar con el &aAlcalde&f y ver si puede ayudar.' + questCompleteMessage: + - '&a[Alcalde Fortes Bellator]&f ¿El &aShogun&f busca ayudar a &dGladius&f? ¡Pensé que nunca lo preguntaría! Pero primero, debemos prepararnos.' + - '&7&oParece que &aFortes Bellator&7&o tiene trabajo para mí.' +primis_main_quest_12: + customObjectives: + Objective1: + dialog: + - '&a[Centurion]&f Where are our reinforcements?' + name: '&2Camino de mina' + questLore: + - No puedo creer lo que le sucedió a &dGladius&f. Lo golpearon rápido, + - y lo golpearon donde más duele. + - Es nuestro deber jurado ayudar a nuestros aliados. Hemos fallado en nuestro + - deber, y le hemos fallado a nuestros aliados. + - El &cConsejero&f nos ordenó movilizar a nuestras tropas en varias + - zonas antes de la invasión. + - Verás, recientemente una tormenta inusual y devastadora fue detectada + - en el &dTemplo de Tormenta&f. + - La Guardia Real fue ordenada ir a silenciar la tormenta, y el &aShogun&f + - se niega a retrasar esa orden. + - Nuestros propios guardias están en otros lugares, y me temo que necesitaremos todo + - lo que tenemos para recuperar &dGladius&f. + - El camino al &dTemplo de Tormenta&f es traicionero, ya que requiere ir + - a través de las &dMinas Goblin&f. + - '¡Ayuda a nuestra guardia a limpiar las minas y hacer un camino al &dTemplo de Tormenta&f!' + questAcceptDialog: + - '&a[Fortes Bellator]&fAnda con cuidado, las &dMinas Goblin&f son un lugar peligroso. Quizás deberías ayudar a la guardia normal antes de asistir a la &aGuardia Real&f.' + - Las &dMinas&f están al norte de la ciudad. Hay escaleras que conducen a su entrada. + - '&7&oDebería ver en que más puedo ayudar a &aFortes Bellator&7&o, o dirigirme a la entrada de las &dMinas Goblin&7&o.' + questCompleteMessage: + - '&a[Centurion]&f¡Es muy bueno ver a alguien! ¿Te ha enviado &dPontis Mille&f?' + - '&7&oDebería escuchar lo que tiene que decir &aCenturion&7&o' +primis_main_quest_13: + name: '&2¡Goblins en las minas!' + questLore: + - Este día sigue empeorando. En primer lugar, nos emboscan los goblins. + - Luego nos retiramos, solo para encontrar que nuestro ejército se dividió. Algunos están muertos, muchos otros están desaparecidos. + - Lo peor de todo, tememos que hayamos despertado al &cRey Goblin&f. + - Algunos, esperemos, lo lograron. Tenemos que establecer un campo y recuperarnos por ahora. + - Si te atreves a entrar en las minas, estás solo. + - Intentamos escabullirlos más allá de ellos, y no salió bien. + - La única forma de avanzar es a través del derramamiento de sangre. + questAcceptDialog: + - '&a[Centurion]&f ¿Vas a adentrarte en las &dMinas Goblin&f? ¡Ten cuidado con el &cRey Goblin&f!' + - Esperamos que nuestro &aEquipo de Exploración&f haya pasado más allá de él. Reúnete con ellos si puedes. + - '&7&oDebería aventurarme a través de las &dMinas&7&o y derrotar al &cRey Goblin&7&o.' + questCompleteMessage: + - '&a[Equipo de Exploración]&f ¿Lo has conseguido? Casi me gustaría que no lo hubieses. No creerás lo que queda por delante.' + - '&7&oSuena como que el grupo de exploradores tiene malas noticias para mí.' +primis_main_quest_14: + name: '&2Final de la Tormenta' + questLore: + - Es difícil creer que lo hiciste a través de + - '&dMinas Goblin&f por tu cuenta.' + - Quizás con tu fortaleza puedas hacer frente al reto que nos espera adelante. + - Intentamos asaltar el &dTemplo de Tormenta&f, y llegamos a sus más profundos + - confines a un coste muy grande. + - Lo que encontramos ahí... Desafía el entendimiento. + - Puede ser difícil de creer, pero suena como si la tormenta + - misma se materializó como nuestro oponente. + - Ni siquiera sabemos si puede ser derrotado, temíamos que fuéramos enviados a nuestras muertes. + - + - + questAcceptDialog: + - '&a[Blepharo]&f Hemos debilitado sus fuerzas un poco, pero aun así, esta no es una tarea fácil.' + - La Tormenta no es un oponente ordinario. No la subestimes. + - '&7&oDebería ir al &dTemplo de Tormenta&f y matar a la &cTormenta&f.' + questCompleteMessage: + - '&a[Shogun Navita]&f ¡¿QUE TÚ QUÉ!?' + - '¿Derrotaste a la &cTormenta&f? ¡Me dijeron que era imposible! Quiero decir...' + - '... no sirve de nada esconderlo ahora. Sabía sobre la &cTormenta&f. Sabía de la invasión de &dGladius&f - incluso la facilité. Lo hice por mi gente - por &dPontis Mille&f.' + - '&cEl Consejero Machiavelli&f me convenció de que la &cTormenta&f era tan imparable como la naturaleza misma, y que la caída de &dGladius&f y &dPontis Mille&f era una inevitabilidad, que no podíamos retrasar a través del sacrificio.' + - + - + - '&8&oParece que &aShogun Navita&7&o tiene un problema del que quiere que me encargue.' +primis_main_quest_15: + name: '&2¡Reembolso de indemnizaciones!' + questLore: + - + - + - + - + - + - + - + - + - + - Nos compré tiempo. + - + - + - + - + - Nos guio a nuestra perdición, y se habría salido con la suya si no hubieras aparecido. + - Ahora hay esperanza. + - Te pido, por favor, desvíanos del &cConsejero&f traicionero. + - + - + - + - + - + - + - Deseo mandar un último mensaje a través de ellos. + questAcceptDialog: + - '&a[Shogun Navita]&f El &cConsejero Machiavelli&f se ha retirado a sus cuarteles en la ciudad baja por el mercado. Ten cuidado, ha acumulado seguidores devotos en su tiempo, y no caerá sin una lucha.' + - '&7&oEs hora de que el &cConsejero Machiavelli&f se enfrente a una justa retribución.' + questCompleteMessage: + - '&a[Shogun Navita]&f Así que está hecho.' + - '&dPontis Mille&f te debe una gran deuda, viajero. Una vez que terminemos de movilizar al ejército, estaremos listos para corregir nuestros errores y marchar a la ayuda de &dGladius&f.' + - '&7&a[Shogun Navita]&2 Te temíamos. Te entregamos a nuestros aliados. Dispersamos nuestros ejércitos. No más.' + - '¡&dPontis Mille&2 marcha a la guerra, y no caminaremos solos! Lamentarás el día que te cruzaste en nuestro camino.' + - '&7' + - '&7&oParece que el &aShogun&7&o tiene un plan. Debería hablar con él.' +primis_main_quest_16: + customObjectives: + Objective3: + dialog: + - '&a[Demenis Nolus]&f Heading to the village, eh. Just keep going East, follow the road and you should be there in no time!' + Objective4: + dialog: + - '&a[Callipho Classicius]&f Directions? Just head down this road that leads to the graveyards.' + Objective1: + dialog: + - '&a[Glacies]&f Welcome to our village traveler! Please tell me, what brings you here friend.' + Objective2: + dialog: + - '&a[Bromia Culleolus]&f Oh, the way to the village. Yes, just take this road that leads to the mountain.' + - Happy to help! + name: '&2La aldea de hielo espera' + questLore: + - Debemos enviar ayuda a &dGladius&f tan pronto como sea posible. + - Campeón, hay una aldea de guerreros poderosos al sur. + - Deberías viajar allí e informarles de que &dPontis Mille&f + - buscaría su ayuda para hacer retroceder a los invasores del &dTemplo de Sangre&f. + - Encuentra &aGlacies Princeps&f y cuéntale que te envié. + - Hay muchos viajeros en las carreteras, deberías pararte y pedirles por dirección. + questAcceptDialog: + - '&a[Shogun Navita]&f Será un viaje largo. Asegúrate de prepararte. Sigue las carreteras que conducen al sur.' + - '&7&oDebo ir y localizar la &d&oAldea de Hielo&7&o en el sur lejano.' + questCompleteMessage: + - '&a[Glacies Princeps]&f El Shogun te envió, ya veo, es bueno escuchar que &aNavita&f está de vuelta a su viejo yo.' + - + - + - Déjame contarte más... + - '&7&oDebería hablar con &a&oGlacies&7&o.' +primis_main_quest_17: + customObjectives: + Objective3: + dialog: + - '&a[Theopropides Nero]&f Help? Yes, please!' + Objective1: + dialog: + - '&a[Alanus Isatis]&f Here to help with the &cRazorbacks&f?' + Objective2: + dialog: + - '&a[Domina Violet]&f I hope you are here to help!' + name: '&2Ayudando al norte' + questLore: + - Antes de seguir discutiendo algo sobre + - el &dTemplo de Sangre&f. + - + - + - Si no se resuelven estos problemas, fallaría en mis deberes como líder de la aldea. + - No hay forma de que yo ignore la petición de mi propio pueblo y ponga a los demás en primer lugar. + - + - + - + - + - + - + - + - + - Ellos podrán decirte con más detalle qué es lo que hay que hacer. + questAcceptDialog: + - '&a[Glacies Princeps]&f Una vez que hayas terminado de ayudarlos. Vuelve a mí y podemos hablar.' + - '&7&oDebo ir a hablar con los aldeanos de mi lista y ayudarlos a resolver cualquier problema que puedan tener.' + questCompleteMessage: + - '&a[Romanus Superbus]&f ¡&2Glacies&f te envió, ya era hora! ¡Tenemos un prisionero suelto!' + - '&7&oDebería hablar con &a&oRomanus Superbus&7&o.' +primis_main_quest_18: + name: '&2La prueba de hielo' + questLore: + - Bueno, sin duda me has impresionado y a la mayoría de la aldea. + - + - + - los &cElementales de Hielo&f. + - + - + - + - + - '&cElementales Menores de Hielo&f en combate.' + - + - + - Si fallabas... entonces... tu energía y tu ser les pertenecían a los &cElementales de Hielo&f. + - + - + - Desde entonces + - + - + - Varios de nuestra gente se corrompieron y tuvimos que encarcelarlos por nuestra propia seguridad. + - + - + - + - + - Esclavos de los + - '&cElementales de Hielo&f.' + - Está claro que nuestras viejas tradiciones ya no existen. + - Debemos lidiar con los &cElementales de Hielo&f... + - Te pido que seas el último en + - emprender &9La Prueba de Hielo&f. Sube a la cima y enfréntate a los + - '&cElementales Menores de Hielo&f y libera las almas de aquellos que fallaron la prueba.' + questAcceptDialog: + - '&a[Glacies Princeps]&f Puedes encontrar el inicio del camino a la prueba en la casa de &aViolet&f.' + - Sigue los bloques de &9Amatista&f, te guiarán hasta la cima. + - '&7&oDebería seguir los &9&obloques de Amatista&7&o hasta la cima de la montaña y luego matar a los &c&oElementales de Hielo Menores&7&o.' + questCompleteMessage: + - '&a[Glacies Princeps]&f ¿Lo has hecho? Que sus almas descansen en paz ahora.' + - Hablemos de nuevo amigo. Queda más por hacer. + - '&7&oDebería hablar con &a&oGlacies&7&o.' +primis_main_quest_19: + name: '&2Cálmate' + questLore: + - Es hora de liberarnos de esta maldición. + - Nunca debimos hacernos dependientes del poder de un &cElemental&f. + - Corregiremos ese error aquí y ahora. + - Lo que has asesinado solamente fueron unos + - '&cElementales Hielo Menores&f, el' + - '&cIce Elemental&f rests in a temple right across from our village.' + - Era la principal fuente de nuestro poder... y estupidez. + - Go forth now and slay the &cIce Elemental&f. + questAcceptDialog: + - '&a[Glacies Princeps]&f You will find a path that leads into the temple at the summit of the village.' + - '&7&oI should go into the temple and slay the &c&oIce Elemental&7&o.' + questCompleteMessage: + - '&a[Glacies Princeps]&f I could feel the energies flowing out, all the way from here.' + - + - + - There is another settlement that might need your help, let's speak. + - '&7&oDebería escuchar lo que tiene que decir &a&oGlacies&7&o.' +primis_main_quest_2: + customObjectives: + Objective1: + dialog: + - '&a[Chief Piscis]&fYou''ll help us? Thank the seas! This was starting to feel like a sinking ship!' + name: '&2Extraños en necesidad...' + questLore: + - '¿Así que no solo no pueden ayudar, sino que quieren nuestra ayuda?, ¡Bah!' + - Bueno, no tenemos muchas opciones ahora, ¿verdad? + - '¡Ve, ayúdales y haz que nos ayuden!' + questAcceptDialog: + - '&a[Primer compañero Iracundi]&f Bien, ve a ayudar a los locales, ve qué información puedes recolectar y ve si puedes conseguir que nos ayuden a cambio. Estaré aquí, negociando cosas.' + - '¡Vuelve tan pronto como tengas algo!' + - '&7&oDebería hablar con el &aLíder de la Aldea&f para ver cómo ayudar a los locales.' + questCompleteMessage: + - '&a[Jefe Piscis]&f Todo el mundo en la aldea tiene un problema que se necesita tratar, y no soy una excepción. Mi petición es bastante difícil, así que tal vez quieras calentarte y conocer el lugar con algunos de los problemas de los demás aldeanos.' + - + - + - '&7&oDebería hablar con los locales y ver quién necesita ayuda, y volver al líder cuando me sienta preparado para continuar.' +primis_main_quest_20: + customObjectives: + Objective1: + dialog: + - '&a[Lutum Princeps]&f This better be important.' + name: '&2Terravilla' + questLore: + - Some time ago we received a request for aid from a + - a nearby settlement. Years ago a bunch + - of explorers settled on top of this ancient ruin. + - I think they call their little + - settlement &dTerravilla&f. Apparently there is a lot + - of treasure to be had there if you don't mind the risk. + - But I hear that stuff has gone wrong there and they asked + - us if we could spare any help to send their way. To be + - honest, you are the strongest warrior I have ever seen. + - You are the best help we could send. If you would like + - to go of course. + questAcceptDialog: + - '&a[Glacies Princeps]&f You will find &aTerravilla&f straight West of here.' + - + - + - Oh, I almost forgot. The person you want to talk to is &aOverseer Lutum&f. + - '&7&oI should go to &d&oTerravilla&7&o and talk to &a&oOverseer Lutum&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f Came all the way from the &dIce Village&f, eh. Good to see some help arrive.' + - + - + - + - + - '&7&oI should talk to &a&oLutum&7&o.' +primis_main_quest_21: + name: '&2Taking out the trash' + questLore: + - Many years ago some explorers came across this ruin and + - as they investigated it more closely they discovered a + - large underground maze-like structure. In this structure + - there were a lot of ancient artifacts and treasures. But + - also a lot of danger. Not like that stopped anyone from + - going down there. And as the word spread, more and more + - people came here to make their fortunes. Before you + - know it, it turned into a small settlement. Until lately + - everything was fine, but then awful things started + - happening. Before I tell you more, we should start by + - dealing with the simple problems first. A small band of + - '&cRobbers&f has found a foothold in the hills surrounding' + - '&dTerravilla&f. We need them gone. Also, feel free to assist' + - any villagers in &aTerravilla&f that might need help. + questAcceptDialog: + - '&a[Lutum Princeps]&f I am not sure where the &cRobbers&f are exactly. I just know that people have reported seeing them coming from the hills.' + - '&7&oI should deal with the &c&oRobbers&7&o and help any villagers in need if I have the time.' + questCompleteMessage: + - '&a[Lutum Princeps]&f Well that is one issue resolved. Onto the next!' + - Before we move on, I want you to have this blade. + - + - + - '&7&oI should hear out what &a&oLutum&7&o has planned next.' +primis_main_quest_22: + name: '&2Big trouble in little pub' + questLore: + - Before we get to the big problem underground, I would + - like you to do one last thing here in town. There has + - been huge trouble in our little pub. There are certain + - characters in town who keep going to the pub and causing + - a ruckus. Well I heard that this time all of them managed + - to gather at the pub at the same time. And of course now + - there is a huge brawl happening over there. This is a great + - opportunity for us to arrest all of them at once. Go to the + - pub and knock them all out. We will handle the rest. + questAcceptDialog: + - '&a[Lutum Princeps]&f The pub is at the ground level, right across. Don''t let them overwhelm you.' + - I will have a nice reward waiting here for you when you're back. + - '&7&oI need to go to the pub and deal with the &c&oBar Brawlers&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f I hear that the pub is a peaceful place again. Let''s discuss the real issue now.' + - '&7&oI need to talk to &a&oLutum&7&o.' +primis_main_quest_23: + name: '&2Strike the earth' + questLore: + - You see the real reason we asked for help is because of what happened + - at the ruins. There were always dangerous things down there, + - but nothing a seasoned adventurer or explorer could not handle. But then + - something awakened, these ancient constructs started rising out of the + - ground and the walls. Then these quakes started happening, it was weird, + - because you could only feel them if you were down in the ruins. So we shut + - everything down, nobody was allowed access to the ruins anymore. A few days + - ago I gathered some of my best men and sent them down there to find the source + - of it all. They barely made it back. They found an &cEarth Elemental&f high + - above the pillars, on top some sort of platform. It must have been there + - dormant all this time. No clue why it decided to wake up now... + - Your job would be to go down there, navigate through the maze and put the + - '&cEarth Elemental&f into a slumber it will never wake up from.' + questAcceptDialog: + - '&a[Lutum Princeps]&f You can get to the maze by walking down the spiral staircase in the middle of the ruins.' + - + - + - '&7&oI should enter the &d&oRuins Maze&7&o and slay the &c&oEarth Elemental&7&o.' + questCompleteMessage: + - '&a[Lutum Princeps]&f I cannot believe it, you''re back. In one piece too!' + - + - + - + - '&7&oI need to tell &a&oLutum&7&o about my quest and the &d&oBlood Temple&7&o.' +primis_main_quest_24: + customObjectives: + Objective1: + dialog: + - '&a[Navita]&f You have returned! I hope you have good tidings.' + name: '&2There and back again' + questLore: + - We had no idea what was going on... Yes, + - '&dTerravilla&f will be able to pledge some' + - of our forces to your cause. I wonder if the + - '&cEarth Elemental&f awakening had anything' + - to do with the &dBlood Temple&f. We will + - prepare our forces and wait for word from + - '&dPontis Mille&f.' + questAcceptDialog: + - '&a[Lutum Princeps]&f So you are heading off to &dPontis Mille&f, make sure to tell the &aShogun&f that &dTerravilla&f will be ready to assist.' + - '&7&oI should head to &d&oPontis Mille&7&o and speak with &a&oShogun Navita&7&o.' + questCompleteMessage: + - '&a[Navita]&f It is good to hear that the &dIce Village&f has decided to join our cause! But I did not expect that you would manage to convince &dTerravilla&f to pledge to our cause as well.' +primis_main_quest_25: + customObjectives: + Objective1: + dialog: + - '&a[Outpost Officer]&fFILLER TEXT!' + name: '&2To the outpost' + questLore: + - It is so good to see you again friend! + - While you were gone we were preparing our + - forces. We have made an &dOutpost&f + - between the &dBlood Temple&f and &dPontis Mille&f. + - You should go there and report to the + - '&aOutpost Officer&f. They will let you know' + - how we shall proceed with the assault on the + - '&dBlood Temple&f.' + questAcceptDialog: + - '&a[Navita]&f The outpost is to the South of the city. Not too long now, before the additional forces from &dTerravilla&f and the &dIce Village&f arrive.' + - '&7&oI should head to the &d&oOutpost&7&o and speak with the &a&oOutpost Officer&7&o.' + questCompleteMessage: + - '&a[Outpost Officer]&f I GOT NO IDEA WHAT TO SAY CAUSE I AM NOT DONE' +primis_main_quest_3: + name: '&c¡Campamento Bandido!' + questLore: + - '¡Recientemente se ha avistado un &dCampamento de Bandidos&f cercano' + - y están tratando de hundirnos! + - '¡Siguen asaltando nuestros suministros y secuestrando a nuestros aldeanos!' + - '¡Incluso tomaron la &eReliquia de mi Abuelo&f!' + - No sabemos lo que quieren, ¡pero necesitamos que desaparezcan! + - '¡Averigua lo que están haciendo, encárgate de ellos y tráeme' + - de vuelta la &eReliquia de mi Abuelo&f! + questAcceptDialog: + - '&a[Jefe Piscis]&f ¡El &dCampamento de Bandidos&f no está demasiado lejos si sigues la carretera!' + - + - + - '¡Oh, y asegúrate de traer de vuelta la &eReliquia de mi Abuelo&f!' + - '&7&oDebería ir al &dCampamento de Bandidos&7&o cercano y despejarlo.' + questCompleteMessage: + - '&a[Jefe Piscis]&f ¡Veo que estás de vuelta! ¿Traes buenas noticias?' + - '&7&oTu cuenta al &aJefe Piscis&7&o sobre el campamento y devuelve la &eReliquia&7&o.' + - + - + - + - + - '&7&oParece que el &aJefe Piscis&f está listo para decirme como salir de aquí.' +primis_main_quest_4: + customObjectives: + Objective1: + dialog: + - '&a[Petrae]&f ¿El &2Jefe Piscis&f te envió? Desafortunadamente, el pasaje está cerrado y el &cElemental&f lo protege...' + name: '&9¡Ruta de flor azul!' + questLore: + - Debemos informar nuestros hallazgos sobre el + - '¡&dCampamento Bandido&f a &dGladius&f!' + - '¡El paso de montaña está protegido por un antiguo,' + - poderoso &cGolem&f que debe evadirse a toda costa! + - '¡Sigue las &eFlores Azules&f a lo largo del camino,' + - te conducirán a un pasaje secreto + - a través de las montañas! + - '¡Un guía de montaña te estará esperando al final' + - del camino de &9Flores Azules &f! + questAcceptDialog: + - '&a[Jefe Piscis]&f ¡El paso de la montaña está protegido por un &cGolem&f extremadamente peligroso, que probablemente no podrás derrotar ahora mismo!' + - + - + - '&7&o¡Debería seguir el camino de &9&oFlores Azules &7&ohasta el &aGuía de Montaña&7&o!' + - '&7&oDebería asegurarme de terminar cualquier negocio que me quede antes de irme.' + - '&7&oConsejo: ¡Asegúrate de rastrear la misión para facilitar la búsqueda de tu destino!' + questCompleteMessage: + - '&a[Petrae]&f ¿Estás seguro de que quieres arriesgarlo? Puedo ayudarte...' + - '&7&oParece que &aPetrae&f tiene una solicitud para mí.' +primis_main_quest_5: + name: '&5El Elemental de Cristal' + questLore: + - '¿Necesitas pasar? Mal tiempo, mi amigo.' + - Un &cElemental de Cristal &fha invadido nuestro paso + - y lo ha cerrado. + - '¡Si realmente tienes que llegar a Gladius,' + - tendrás que derrotar a este &cElemental&f primero! + questAcceptDialog: + - '&a[Petrae]&f ¿Buscas derrotar al &cElemental de Cristal&f? ¡Solamente te puedo desear suerte en tu esfuerzo!' + - + - + - '&7&oParece que debo derrotar al &cElemental de Cristal&7&o.' + questCompleteMessage: + - '&a[Petrae]&f ¡Sobresaliente! ¡Te he visto derrotar al &cCristal Elemental&f!, ¡Claramente hay grandeza en tu futuro!' + - '¡Ahora que estamos en el otro lado, permítanme decirles el camino hacia &dGladius&f!' +primis_main_quest_6: + customObjectives: + Objective1: + dialog: + - '&a[Filius] &fYou made it through the mountain! You don''t see that every day.' + - + - + - '&7&oSeem like &aFilius&7&o can help me find the way to &dGladius&7&o.' + name: '&5La granja' + questLore: + - El camino a &dGladius&f debería ser fácil, pero con + - todas los disturbios que hemos estado viendo, sospecho que + - puede que no sea tan simple. + - Soy buen amigo del &aPropietario de la Granja&f + - por la carretera. Si le dices que te envié, estoy seguro + - que te dirá como llegar de forma segura a &dGladius&f y + - te dará buenas noticias sobre los alrededores. + - '¡Buena suerte en tus viajes y mantente a salvo!' + questAcceptDialog: + - '&a[Petrae]&f Solo dígale al &aPropietario de la Granja&f que te envié, aunque he oído que el &aPropietario&f no ha sido visto en un tiempo.' + - + - + - '¡Buen viaje!' + - '&7&oDeberia seguir el camino hacia la &dGranja&7&o y hablar con su &aPropietario&7&o.' + questCompleteMessage: + - '&a[Petrae]&f ¡Sobresaliente! ¡Te he visto derrotar al &cElemental de Cristal&f!, ¡Claramente hay grandeza en tu futuro!' + - '¡Ahora que estamos en el otro lado, permítanme decirles el camino hacia &dGladius&f!' + - '&7&oDebería hablar con &aFilius&7&o para aprender el camino a &dGladius&7&o, y posiblemente hablar con su &aMadre&7&o para ver cómo puedo ayudar.' +primis_main_quest_7: + customObjectives: + Objective4: + dialog: + - '&a[General Hasta] &fI can''t believe you made it past the enemies.' + - You are exactly the kind of help we need right now! + - '&7&oSeems like I should talk to &aGeneral Hasta&7&o.' + name: '&5La ruta a Gladius' + questLore: + - Recientemente el humo fue avistado sobre la fortaleza de &dGladius&f. + - No pudimos ir ahí y ver lo que está sucediendo + - porque un &dBarco&f está bloqueando el camino actualmente. + - Fuimos atacados por un puñado de criaturas con aspecto de no-muerto + - cuando nos acercamos al &dBarco&f, así que huimos. + - '¡Me temo que tendrás que forzar tu camino a través de este' + - '&dBarco&f para llegar a &dGladius&f. Estoy seguro de que te' + - recompensarán si ayudas a reducir el número de &cNo-muertos&f en ese barco! + questAcceptDialog: + - '&a[Filius] Ten cuidado en el camino, claramente algo ha ido mal en &dGladius&f.' + - + - + - '&7&oDebería ir por el camino a &dGladius&7&o y despejar a algunos &cNavegantes No-muertos&7&o en el camino ahí.' + questCompleteMessage: + - '&a[Lord Hasta]&f ¿Los enviaron como refuerzos de Pontis Mille?, ¿Dónde están los otros?, ¿Eres un mensajero?' + - '&7&oDebería hablar con &aLord Hasta&7&o.' +primis_main_quest_8: + name: '&5Recuperando Esperanza' + questLore: + - Nunca vimos venir esta invasión. + - Vinieron en la oscuridad de la noche, nos golpearon duro y rápido. + - Antes de saberlo, la mitad de la ciudad estaba invadida. + - La moral es baja. Todos aquí han perdido a alguien. + - A pesar de nuestro dolor de corazón, nuestros seres queridos desfilan + - por las calles en una burla a la vida misma. + - '¡Necesitamos unirnos y reforzar la moral,' + - o no veremos otro amanecer! + - De vuelta en mi &dmansión&f, en mi tesorería, yace un &eDocumento&f + - de máxima importancia. Es una promesa escrita con + - uno de los fundadores de &dPontis Mille&f para proporcionarnos con + - asistencia en un momento de extrema necesidad. Este es el momento. + - Recupera el &eDocumento&f, tráelo de vuelta a mí y + - Te prometo que serás bienvenido en &dPontis Mille&f con + - los brazos abiertos. Los soldados lucharán hasta el final + - si se les da esta pequeña esperanza. + questAcceptDialog: + - '&a[General Hasta] La nota está en mi &dMansión&f. Asegúrate de traerla de vuelta. Aquí mis hombres también tienen otras peticiones por los alrededores de la aldea en las que puedes ayudar, si puedes.' + - '&7&oDebería comprobar lo que necesitan los otros soldados y dirigirme a la &dMansión&7&o a la salida de la ciudad.' + questCompleteMessage: + - '&a[Lord Hasta]&f ¡Sobresaliente! ¿Recuperar este &eDocumento&f en medio de una guerra? ¡Si tuviéramos 10 más de ustedes, la ciudad nunca habría sido tomada en primer lugar!' + - Antes de irte, ¿crees que podrías hacerme un pequeño favorito personal? + - '&7&oParece que &aLord Hasta&7&o quiere hablar conmigo.' +primis_main_quest_9: + name: 'Campeón de &5Gladius' + questLore: + - Antes de ir a &dPontis Mille&f, tengo un + - favor personal que pedir. + - Nuestro &cCampeón&f fue visto por última vez luchando contra una horda de + - enemigos cerca de la &dEstatua&f. + - No hemos oído nada de él desde el comienzo de la + - invasión y en esta etapa tememos lo peor. + - Por favor, ve a ver cómo está. Si lo encuentras y se ha + - convertido en uno de esos no-muertos... por favor libéralo de su maldición. + questAcceptDialog: + - '&a[General Hasta] &fHaz tu camino a la &dEstatua, estoy seguro de que nuestro &cCampeón será fácil de encontrar.' + - '&7&oDebería ir a la &dEstatua e investigar lo que le pasó al &cCampeón de Gladius&7&o.' + questCompleteMessage: + - '&a[General Hasta]&f Así que ha sucedido lo peor, me aseguraré de que estas bestias paguen por matar a mi hijo.' + - 7&oParece que el &aGeneral Hasta&7&o tiene algunas palabras de despedida para mí. +primis_ogre_mines_clear: + name: '&2Problemas de tamaño Ogreen' + questLore: + - '¡Nuestro campamento minero fue invadido!' + - '¡Necesitamos ayuda!' + - '¡Realmente no sé qué pasó, pero tenemos que despejar' + - el campamento y hablar con el &aViejo Vetus&f! + questAcceptDialog: + - '&a[Metus]&f ¿Vas a ayudar? Por favor, date prisa, el campamento está justo más allá!' + - '&7&oDebería limpiar el campamento y hablar con el &aViejo Vetus&7&o.' + questCompleteMessage: + - '&a[Vetus Fossores]&f Has venido a ayudar? Fantástico, necesitamos ayuda ahora mismo!' + - '¡Aquí tienes algo para ayudarte a despejar el campamento!' +primis_ogre_mines_lost_bretheren: + customObjectives: + Objective1: + dialog: + - '&a[Fortis Fossores] &fWhat do you want? What, &aFugit&f sent you? What for? The mines were overrun? Hah, I didn''t even notice!' + - + - + - + name: '&5Bretheren Perdido' + questLore: + - '¡La mina fue invadida por &cOgros&7&o!' + - '¡En la confusión me separé de mi &aHermano&f en las &dMinas&f,' + - y temo por su seguridad! + - Es un hombre excéntrico, muy dedicado a la minería. + - '¡Ya sabrás si lo has visto!' + - Le ruego que vuelva a traerle aquí o, como mínimo, que me diga si está seguro. + - '¡Haré que valga la pena tu esfuerzo!' + questAcceptDialog: + - '&a[Fugit] &fPor favor, encuentra mi &aBrother&f y asegúrate de que esta bien!' + - '&7&oEncontraré al &aHermano de Fugit&7&o en las &dMinas&7&o invadidas por &cOgros&7&o.' + questCompleteMessage: + - '&a[Fugit Fossores]&f Mi &aHermano&f dijo qué? Ah, típico de él, demasiado enfocado en su trabajo para notar que todo el lugar fue ocupado!' + - Voy a tener una conversación seria con él la próxima vez que lo vea! + - + - +primis_ogre_mines_old_miner_quest: + name: '&2Pico de Suerte' + questLore: + - '¡Nosotros mismos tenemos un poco de pepinillo!' + - Mientras estábamos minando, nos encontramos con una misteriosa cueva llena de monstruos! + - '¡He dejado caer mi &ePico&f favorito mientras corría, necesito tu ayuda para conseguirlo!' + - Estoy seguro de que el &cOgro Magi&f lo ha recogido para sí mismo. + - '¡Obtén mi &ePico de la Suerte&f de vuelta de ese bruto!' + - Tengo algunas baratijas para ti cuando vuelvas. + questAcceptDialog: + - '&a[Vetus Fossores]&f Ese &cOgro&f no debería estar lejos! Puedes encontrarlo en la cueva a la derecha, antes de que la zona se derrumbe.' + - '¡Él debería tener el &ePico&f, los &cOgros&f aman las cosas brillantes después de todo!' + - '&7&oDebería derrotar al &cJefe Ogro&7&o.' + questCompleteMessage: + - '&a[Vetus Fossores]&f ¿Tienes mi pico de la suerte? ¡Excelente!' + - '¡Aquí tienes tu recompensa!' +primis_pontis_groves_acrobatics: + customObjectives: + Objective1: + dialog: + - '&a[Idoneitatem Hominem]&f Congratulations!' + name: '&2Acrobacias' + questLore: + - Así que crees que tienes lo que necesita. + - '¿Estás en forma suficiente, eres lo suficientemente rápido, ¿eres lo suficientemente fuerte?' + - Plataformas, vinos, alturas peligrosas. ¡Todo lo que podrías querer! + - '¡El desafío final está por delante!' + - OK, OK. Mi &aHermano&f y yo podríamos haber estado un poco aburridos e + - hicimos un curso completo de acrobacias. + - Hay que ir de plataforma en plataforma usando &9Wines&f y + - '&9Acrobatics&f llegar lo mas rapido al final.' + - + - + - Recibirás como recompensa un estupendo &eIteme&f. + questAcceptDialog: + - '&a[Posuere Hominem]&f Puedes encontrar el inicio del recorrido en &dEl final del túnel&f.' + - + - + - '¡No olvides hablar con mi &aHermano&f al final del recorrido para obtener la recompensa!' + - '&7&oI debe dirigirse al inicio del recorrido.' + questCompleteMessage: + - '&a[Idoneitatem Hominem]&f ¡Bien hecho! ¡Espero que no hayas hecho trampa! Intenta batir mi récord si puedes.' +primis_pontis_groves_caught in the web: + name: '&2Atrapado en la red' + questLore: + - Así que tienen un &dNido&f en algún lugar de la&dCueva&f. + - Eso explicaría por qué su número de habitantes se ha multiplicado. + - + - + - Sería genial si pudieras localizar el &dNido&f y limpiarlo. + - '¡Te haremos unas buenas &eBotas de Pata de Araña&f como recompensa!' + questAcceptDialog: + - '&a[Rey Nemian]&f Si hay un &dNido&f estoy seguro de que estaría &9Rodeado por Telarañas&f.' + - '&7&oDebería encontrar el &dNido de Araña&7&o y eliminarlo.' + questCompleteMessage: + - '&a[Rey Nemian]&f ¡Hah! ¡Sabía que podíamos contar contigo!' + - '¡Aquí están tus botas finas, bien merecidas!' +primis_pontis_groves_elf_stole_from_my_shelf: + name: '&2Elfo robó de mi estante' + questLore: + - El desastre ha golpeado nuestro pequeño agujero. + - No hace mucho tiempo que nuestra hermosa casa fue atacada por &cElfos Bandidos&f. + - Afortunadamente no estábamos en casa en ese momento así que nadie salió lastimado. + - Hemos conseguido reemplazar la mayoría de nuestras posesiones. + - Pero se llevaron mi &eReliquia Familiar&f que estaba en el estante. + - Si fueras tan amable de tratar de recuperarlo, estaría muy agradecido. + - Hago los mejores guisos, estaría encantado de compartir algunos con ustedes como recompensa. + questAcceptDialog: + - '&a[Luxuria Gorgonius]&f La &eReliquia Familiar&f es bastante valiosa. Estoy seguro de que la guardarían en &9algún lugar extra seguro&f.' + - '&7&oNecesito ir a recuperar la &eReliquia&7&o.' + questCompleteMessage: + - '&a[Luxuria Gorgonius]&f ¡Oh Dios mío! ¡Lo has encontrado!' + - No hay suficientes agradecimientos en el mundo por lo que acabas de hacer por mí. + - '&7&oEste guiso me debería mantener alimentado durante un tiempo.' +primis_pontis_groves_into_the_next_hole: + customObjectives: + Objective1: + dialog: + - '&a[Phygia Gorgonius]&f Time to kick those &cElves&f out for good!' + name: '&2En el siguiente agujero...' + questLore: + - Si estás disponible, hay mucho más trabajo que hacer por aquí. + - Tenemos algunos graves problemas de &cElfos&f, + - pero he asignado a &aPhygia&f para manejar esos problemas. + - Ve a hablar con &aPhygia Gorgonius&f en el agujero al lado de este. + - Ellos podrán decirte más y lo que hay que hacer. + questAcceptDialog: + - '&a[Rey Nemian]&f ¡El agujero justo al lado de este, no puedes perderlo!' + - '&7&oDebería ir a hablar con &aPhygia Gorgonius&7&o.' + questCompleteMessage: + - '&a[Phygia Gorgonius]&f Hablemos...' + - '&7&oDebería escuchar a &aPhygia Gorgonius&7&o.' +primis_pontis_groves_lighthouse_1: + customObjectives: + Objective1: + dialog: + - '&a[Alanus Secundas] &fHas the &dGrove&f sent you?' + name: '&2Alimentando a los enfermos' + questLore: + - Viajero, ¿te podría pedir un favor simple? + - + - + - Pero desde que comenzaron los problemas, no pudimos abandonar nuestra &dArboleda&f. + - '¿Serías tan amable de traer a la familia su último lote de comida?' + - Sería genial si pudieras apresurarte, ha pasado un tiempo desde la última entrega. + questAcceptDialog: + - '&a[Rey Nemian]&f Cuando salgas del agujero el &dFaro&f es directo y un poco a la izquierda.' + - '&7&oDebería ir al &dFaro&7&o.' + questCompleteMessage: + - '&a[Alanus Secundas]&f ¡Estoy muy agradecido! Estábamos empezando a quedarnos sin comida.' + - '¿Estás ocupado?' + - '&7&oParece que &aAlanus&7&o quiere hablar conmigo.' +primis_pontis_groves_lighthouse_2: + customObjectives: + Objective1: + dialog: + - '&8[Jeeves]&fOh, hello there again!' + - '&8[Jeeves]&f They do not need the food anymore? I was just about to go shopping.' + - '&8[Jeeves]&f So kind of you to come here and let me know.' + name: '&2No le preguntes a Jeeves' + questLore: + - Uh, antes de que vinieras. Jeeves, el Comerciante Ambulante se detuvo por aquí. + - Le preguntamos si podía ir a buscar algo de comida para nosotros. + - + - + - + - + questAcceptDialog: + - '&8[Alanus Secundas]&f Cuando salgas de la vivienda el &dFaro&f es directo y un poco a la izquierda.' + - '&8&oDebería ir al Faro.' + questCompleteMessage: + - '&8[Alanus]&f ¿Le hiciste saber? ¡Bien, bien!' + - '&8&oParece que Alanus está bien alimentado.' +primis_pontis_groves_population_control: + name: '&2¡Control de población!' + questLore: + - Oh estoy tan contento de que finalmente alguien ha llegado para ayudarnos. + - Tenemos un gran problema arácnido en nuestro pequeño bosque. + - Hay tantos arácnidos estos días que ni siquiera puedes + - dar un agradable paseo nocturno sin uno de los cabrones desagradables + - te salte desde las sombras. + - Está claro que el número de su población necesita una reducción seria. + - '¡Oh! Tráeme las piernas arácnidas que todavía están en buena condición.' + - Los utilizamos para fabricar grúas y agarradores pequeños. + questAcceptDialog: + - '&8[Rey Nemian]&f Los encontraras acechando bajo las sombras de los árboles.' + - '&8&oNecesito encontrar a los rastreadores del bosque y matarlos.' + questCompleteMessage: + - '&8[Rey Nemian]&f¡Es bueno verte regresar, y con muchas piernas!' + - '&8[Rey Nemian]&f¿Crees que su nido podría estar cerca? Hablemos más de esto' +primis_pontis_groves_tree_climbing_elf_bandits: + name: '&2¡Elfos Bandidos trepadores de árboles!' + questLore: + - + - + - '¡Como si las &cArañas&f no fueran suficientes,' + - ahora estos locos amantes de las sombras han decidido establecerse en nuestros árboles! + - + - + - + - + - Forzaron su camino con sus números superiores. + - '¡Bueno, tienen algo que les viene bien,' + - una mirada a ti y puedo decir que puedes manejar un par de gigantes de piedra! + - Estoy seguro de que algunos elfos no serán un problema para ti. + - + - + questAcceptDialog: + - '&a[Phygia Gorgonius]&f Estoy segura de que encontrarás un montón de ellos si encuentras algún lugar con sombra y solo miras hacia arriba, es difícil pasar de vista sus casas de árboles.' + - '&7&oDebería ir a encargarme de esos &cElfos&7&o antes de que &aPhygia&7&o se prenda fuego de la rabia.' + questCompleteMessage: + - '&a[Phygia Gorgonius]&f ¡Mi amigo! ¡JAJA! ¡Muy bueno verte de nuevo!' + - + - + - '&7&oLos elfos no volverán a molestar a &aPhygia&7&o jamás.' +primis_pontis_mille_fields_berry_crazed_wolf: + name: '&2Lobos enloquecidos por bayas' + questLore: + - Oh por Dios, no tengo idea de qué les pasa a estos &cSabuesos de Piedra&f. + - Ellos siguen entrando en la &dGranja de Bayas&f mientras estoy ausente o durmiendo. + - Uno pensaría que vienen aquí y se comen las bayas, ¡pero no! + - Cargan sus bocas con ellas y las transportan + - en algún lugar profundo en el bosque. + - '¡Quiero decir, son &cSabuesos&f! ¿Por qué están robando bayas?' + - Bueno supongo que no importa, tengo un favor que pedir. + - '¿Podrías limpiar el' + - '&9Área detrás de la granja de Bayas&f,' + - y traer de vuelta mis &eBayas Robadas&f?. + - Tengo muchas tartas que hacer y las bayas que robaron estaban maduras y preparadas. + questAcceptDialog: + - '&a[Dordalus Nasica]&f Solo vi a los &cSabuesos de Roca&f robar las bayas.' + - '&7&oDebería matar a los &c&oSabuesos de Secoya&7&o y recoger cualquier &e&oBaya Robada&7&o que dejen caer.' + questCompleteMessage: + - '&a[Dordalus Nasica]&f Oh mi, lo hiciste. ¿Puedo molestarte con un pequeño favor más?' + - '&7&o Parece que &d&oMilonia&7&o tiene más trabajo para mí.' +primis_pontis_mille_fields_camping_hunters: + customObjectives: + Objective1: + dialog: + - '&a[Scribonia Ingenvinus]&f Yes?' + name: '&2Cazadores de campamento' + questLore: + - Espero no estar molestándote. Pareces una persona que escucharía una súplica. + - No tenemos mucho que hacer aquí en los &dTugurios&f, + - a la mayoría de nosotros nos gusta vagar por los &dCampos&f para pasar el tiempo. + - Desafortunadamente, eso se detuvo después de que un montón + - de &cMonstruos&f comenzaron a deambular por los &dCampos&f. + - Escuchamos que algunos cazadores han hecho un &dCampamento&f cerca de los &dCampos&f. + - Si pudieras ir allí y hablar con ellos y pedirles que se ocupen de estos &cMonstruos&f... + questAcceptDialog: + - '&a[Augustina Verrucosis]&f Su &dCampamento&f debería estar en algún lugar al noroeste de aquí.' + - '&7&oNecesito dirigirme al &d&oCampamento de Cazadores&7&o.' + questCompleteMessage: + - '&a[Scribonia Ingenvinus]&f ¿Ayudar a los &dTugurios&f con su problema de &cMonstruos&f?' + - Hablemos más de ello. + - '&7&oDebería hablar con &a&oScribonia&7&o y escuchar lo que tiene que decir.' +primis_pontis_mille_fields_camp_hunter_three_times_hunter: + name: '&2Cazador tres veces cazador' + questLore: + - Así que encontraste &aVolumnia&f. Gracias a los grandes cazadores que ella está bien. + - Ya que has ayudado a &aVolumnia&f y has demostrado ser un alma bondadosa. + - '¿Qué tal un desafío amistoso? Estaría dispuesto a ofrecerte alguna' + - armadura de buena calidad en caso de que enfrentes el desafío y retornes victorioso. + - El desafío implica la cazar + - '&cTres Grandes Bestias&f esparcidas por Pontis.' + - La &cBestia Bacalao Furiosa&f que nada debajo de un puente donde se alzan dos montañas. + - '&cLa Bestia Reptadora Megdun&f que duerme encima de una arboleda cubierta por el sol.' + - Bailando entre dos picos occidentales encontrarás la + - '&cBestia Empaladora Uladzimir' + - + - + questAcceptDialog: + - '&a[Milonia Majus]&f Toma este dispositivo, te guiará aproximadamente a su ubicación.' + - '&7&oDebería ir y desafiar a las &c&oTres Grandes Bestias&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f Has vuelto. Y has traído los tres artículos que pedí como prueba.' + - + - + - Bueno, basta de mí, ¡aquí está tu recompensa como prometí! + - '&7Devuelves el dispositivo de rastreo de bestias.' + - '&a[Milonia Majus]&f casi se me había olvidado de esa cosa, ¡gracias!' + - '¡Hasta que nos encontremos de nuevo aventurero!' +primis_pontis_mille_fields_do_it_yourself: + name: '&2Hazlo tú mismo' + questLore: + - '¿Enfrentarse a los &cMonstruos&f? Bueno, puedo decirte que ya hemos estado haciendo eso.' + - Simplemente hay demasiados de ellos y no suficientes de nosotros. + - Empezamos a cazarlos tan pronto como hicimos nuestro &dCampamento&f aquí. + - Pero sus números simplemente no parecen estar bajando. + - Y eso no es ni siquiera lo peor. + - '¡Hemos descubierto una guarida y una gran &cBestia&f que viene con ella!' + - Bueno, ya que llegaste a nuestro &dCampamento&f en una sola pieza, + - Asumo que eres bastante capaz. + - '¿Qué tal si te unes a la caza? ¿Qué te dices?' + questAcceptDialog: + - '&a[Scribonia Ingenvinus]&f ¡Sabía que dirías que sí! Veo que ya estás bien equipado.' + - OK, esto es lo que quiero que hagas. + - + - + - Segundo, necesito que mates 5 &cCuernos-largos&f y 6 &cCuernos-cortos&f. + - '¿Comprendido? Bien. Repórtate a mí cuando hayas terminado.' + - '&7&oDebería matar al &c&oGran Viejo Bubba&7&o y matar a 5 &c&oCuernos-largos&7&o y 6 &c&oCuernos-cortos&7&o.' + questCompleteMessage: + - '&a[Scribonia Ingenvinus]&f Debo decir que estoy bastante impresionado.' + - Está claro que eres mucho más que 'capaz'. + - Gracias por la asistencia, podremos manejar el resto. + - Hasta que nos volvamos a encontrar, gran cazador. +primis_pontis_mille_fields_feeding_the_hungry: + customObjectives: + Objective3: + dialog: + - '&7You hand the over the bread and the flour.' + - '&a[Rufia Tertulus]&f I don''t know what to say. My children will be so happy!' + - '&7The woman bows to you in deep appreciation.' + Objective4: + dialog: + - '&a[Fabia Praetextus]&f I guess fantasies do come true sometimes. I am eternally grateful to you kind sir.' + Objective1: + dialog: + - '&a[Lena Lucan]&f Fresh bread! I cannot thank you enough!' + Objective2: + dialog: + - '&a[Tranio Florens]&f Wow! The day just keeps getting better!' + - Thank you for the flour kind soul. + name: '&2Alimentando a los hambrientos' + questLore: + - Puedo sentir un buen corazón latiendo en ese pecho tuyo. + - No todos son tan afortunados como tú y yo. + - Hay algunas pobres almas que viven en los &dTugurios de Pontis Mille&f. + - Desde hace un tiempo he estado trabajando + - sobretiempo para producir excedentes de pan y harina. + - '¿Te importaría llevarte estos sacos de trigo y estas pilas de pan?' + - '¿Luego viajar con ellos a los &dTugurios&f y repartirlos a los necesitados?' + - He estado haciendo esto por un tiempo ahora, pero me lastimé el pie izquierdo, + - así que no puedo caminar mucho en este momento. + questAcceptDialog: + - '&a[Daemones Maritialis]&f Desearía que hubiese más gente como tú en el mundo.' + - Los &dTugurios&f están justo al norte de aquí, puedes ver los edificios a la distancia. + - '&7&oDebería ir a los &dTugurios&7&o y repartir la comida a los necesitados.' + questCompleteMessage: + - '&a[Augustina Verrucosis]&f &2Daemones&f te envió aquí, ¿verdad?' + - + - + - Gracias, extraño, mi familia no olvidará esto. +primis_pontis_mille_fields_fruity_hound: + name: '&2Sabueso Afrutado' + questLore: + - Ya que usted es mi agente de recuperación de bayas NÚMERO UNO,, + - Tengo otra tarea para ti. + - Como puedes ver cultivamos algunas bayas muy grandes en nuestra + - pequeña &dGranja de Bayas&f aquí. + - Había una + - '&eBaya Específica&f Que estaba creciendo para un concurso.' + - Pero mientras caminaba hacia la &dGranja de Bayas&f vi un + - '&cSabueso Afrutado&f saltar al arbusto sosteniendo mi preciada baya.' + - Él lo cortó y se lo llevó. + - Sus mandíbulas sostenían la baya por el tallo de modo que + - todavía debería estar en una sola pieza, espero. + - Si vas a matar a la bestia y me traes de vuelta mi + - querida &eBaya de Concurso&f voy a tener una buena + - recompensa esperándote. + questAcceptDialog: + - '&a[Dordalus Nasica]&f Creo que vi al &cSabueso&f dirigirse a las &dSecoyas&f, al noroeste de la granja.' + - '&7&oDebería ir a matar a el &c&oSabueso Afrutado&7&o y ver si la &e&oBaya de Concurso&7&o todavía está en una pieza.' + questCompleteMessage: + - '&a[Dorsalis Nasica]&f ¡SÍ! ¡Ese es mi amor! Fino y entero, ¡ni siquiera un poco de saliva en él!' + - + - + - + - +primis_pontis_mille_fields_not_on_my_farm: + name: '&2¡No en mi granja!' + questLore: + - Últimamente todas estas &cRatas&f me han estado volviendo loco. + - '¡Siguen entrando en nuestra pequeña granja y comen todos nuestros bienes!' + - '¿Hay alguna posibilidad de que puedas ir y bajar un poco sus números?' + - Ten cuidado, hay muchos de ellos. + - Oh, casi me olvido de decírtelo. + - Si ves una &cRata Bien Alimentada&f grande, no te molestes con ella. + - Ha crecido tan grande y gordo que te llevaría días matarlo. + questAcceptDialog: + - '&a[Milonia Majus]&f Estoy seguro de que ya notaste que les gusta retorcerse alrededor del área del camino.' + - '&7&oDebería ir a matar a las &cRatas&7&o que andan por el camino que conduce a &dPontis Mille&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f ¡Muchas gracias! Podemos volver a hacer productos deliciosos ahora.' +primis_pontis_mille_fields_surprise_me_with_flour: + customObjectives: + Objective3: + dialog: + - '&a[Adulescens Lupis]&f I heard the farm was having &cRat&f problems. Three sacks of flour coming up, no problem!' + Objective1: + dialog: + - '&a[Dinia Niraemius]&f Flour? Sure, one sack of flour coming up!' + Objective2: + dialog: + - '&a[Daemones Maritialis]&f The farm needs more flour eh? Here ya go, two sacks!' + name: '&2Sorpréndeme con harina' + questLore: + - Wow, eres bastante útil. ¿Si pudiera molestarte con otra tarea? + - Las &cRatas&f han arruinado por completo nuestro stock actual de harina. + - Entonces necesitamos un lote completamente nuevo de harina. + - Los &dMolinos de Viento&f deberían tener un montón de ella. + - Ve a recoger la harina y déjala aquí conmigo. + - '¡Pagaré una buena moneda por este servicio!' + questAcceptDialog: + - '&a[Milonia Majus]&f Deberás recolectar la harina de los tres &dMolinos de Viento&f.' + - '&7&oNecesito visitar los tres &dMolinos de Viento&7&o y recoger la harina que producen.' + questCompleteMessage: + - '&a[Milonia Majus]&f ¡Esto debería durarnos bastante tiempo!' + - Esperemos que nuestra ficha de harina no sea demasiado grande, jeje. +primis_pontis_mille_fields_wellness: + name: '&2Bienestar' + questLore: + - '¡Me alegro de verte ahora mismo!' + - Malditas &cRatas de Pesadilla&f me tendieron una emboscada mientras bajaba por el pozo. + - Me lastimé el brazo y las piernas cuando me caí. + - Argh, todavía tengo algo de su saliva tóxica en mis ojos. + - Afortunadamente me las arreglé para arrastrarme camino a esta pequeña + - repisa antes de que pudiera acabar conmigo. + - Qué vergüenza, no estoy seguro de qué me duele más en este momento, mi cuerpo o mi orgullo. + - Tengo algunos + - '&eEquipos de Primeros Auxilios&f' + - en mi cofre en el &dCampamento de Cazadores&f. + - '¿Te importaría conseguirlo para mí? Ah, y asegúrate de no decírselo a nadie' + - ahí una palabra de lo que viste aquí. + - '...casi muero en un pozo...este es un capítulo de mi vida que tendré que borrar...' + questAcceptDialog: + - '&a[Volumnia Zoilus]&f El &dCampamento de Cazadores&f está directamente al sur, no puedes pasarlo por delante, busca tiendas de campaña.' + - '&7&oNecesito ir a recoger el &e&oEquipo de Primeros Auxilios&7&o para &a&oVolumnia&7&o en el &d&oCampamento de Cazadores&7&o.' + questCompleteMessage: + - '&a[Volumnia Zoilus]&f ¿Ya regresaste? Pásame el equipo.' + - No te preocupes por mí, me arreglaré en poco tiempo. + - '¡Gracias por todo! ¡Me salvaste la vida!, ¿sabes?' +primis_pontis_mille_field_check: + customObjectives: + Objective1: + dialog: + - '&a[Augustina Verrucosis]&f Oh, this is quite important! I will let the residents know.' + - Thank you for delivering these important documents. + name: '&2Comprobación de campo' + questLore: + - Si pudiera molestarte con algunas tareas de entrega. + - Tengo aquí algunos documentos importantes que deben ser entregados a los + - '&dTugurios&f y a las &dGranja de Campo&f.' + - El soldado que se suponía que vendría a buscarlos aún no ha llegado. + - Y este es un asunto urgente, no podemos darnos el lujo de esperar más. + - Desafortunadamente tengo órdenes estrictas de no dejar mi puesto. + - Si pudieras hacer esto por mí, nos ayudaría mucho. + questAcceptDialog: + - '&a[Godefridus Novation]&f ¿Lo harás? ¡Excelente!' + - Puedes seguir el &9Camino Amarillo&f para llegar a los tugurios. + - La &dGranja de Campo&f está justo más allá de los tugurios, simplemente sigue el camino. + - '¡Oh! ¡Y cuidado con las ratas de campo!' + - '&7&oDebería dirigirme a los &d&oTugurios&7&o y luego a la &d&oGranja de Campo&7&o.' + questCompleteMessage: + - '&a[Milonia Majus]&f ¿Documentos? Déjame verlos. Hmmm, parece oficial.' + - Gracias por venir hasta aquí para entregarlos. + - '&7&oParece que a &a&oMilonia&7&o podría usar mi ayuda con las ratas...' +primis_pontis_mille_fresh_rats_coming_up: + customObjectives: + Objective1: + dialog: + - '&a[Elite Guard]&f Plenty of rats inside.' + name: '&2Ratas frescas viniendo' + questLore: + - No hay comida para gatos, pero creo que puedo ayudarte + - a encontrar algo aún mejor... + - Escuché que un par de + - '&aGuardias&f han estado lidiando con' + - una infestación de ratas en las partes bajas de la ciudad. + - Ve ahí abajo y tal vez puedas conseguir algunas + - '&cRatas&f para tu amigo gatuno.' + questAcceptDialog: + - '&7&oDebería revisar la parte baja de la ciudad y ver si puedo encontrar a los &a&oGuardias de Élite&7&o.' + questCompleteMessage: + - '&a[Mew Meowzer]&f Miau. MIAU! Prrrrr.' + - '&7&oDebería dejar que el gato disfrute de su comida en paz.' + - '&7&oParece que ha dejado caer algo, hmm...' +primis_pontis_mille_hungry_friend: + customObjectives: + Objective3: + dialog: + - '&a[Melaenis Gelasius]&f Cat food? Where the heck did you manage to find a cat here...' + - No, I don't know where to get any cat food. + Objective4: + dialog: + - '&a[Sulpicio Panthera]&f I wish I could help, sorry.' + Objective1: + dialog: + - '&a[Royal Guard]&f Do I look like someone who keeps track of cat food?...' + Objective2: + dialog: + - '&a[Tyndarus Faustinius]&f Sorry, I have no idea.' + Objective5: + dialog: + - '&a[Tyndarus Columbanus]&f We used to have cat food around here somewhere, but heck knows what happened to it...' + name: '&2Amigo hambriento' + questLore: + - '&7&o¿Qué te pasa pequeñín?' + - '&a[Mew Meowzer]&f ¡Miau!' + - '&7&o ¿Tienes hambre? ¿El' + - '&7&opequeñín quiere algo de comida?' + - '&a[Mew Meowzer]&f ¡¡¡MREIAUUUU!!!' + - '&7&oVeamos si podemos' + - '&7&oconsiguirte algo de comida.' + questAcceptDialog: + - '&7&oDebería ver si alguien en la ciudad sabe dónde encontrar comida para gatos.' + questCompleteMessage: + - '&a[Modestus Aper]&f ¿Comida para gatos? No sé sobre eso. Pero...' + - '&7&oParece que &a&oModestus&7&o podría saber algo...' +primis_pontis_mille_late_delivery: + name: '&2Late delivery' + questLore: + - I ordered some &eFishing Nets&f from + - '&dGladius&f that haven''t arrived yet. I wonder' + - if something might have happened to the + - shipment. If you are willing, I would pay you + - a small fee if you could go see what + - happened to the shipment and get the + - '&eFishing Nets&f for me.' + questAcceptDialog: + - '&a[Delphium Calpurnius]&f Last I heard my shipment of &eFishing Nets&f was supposed to be heading for &dGladius&f.' + - '&7&oI need to go look around &d&oGladius&7&o for &a&oDelphium''s&7&o shipment of &e&oFishing Nets&7&o.' + questCompleteMessage: + - '&a[Delphium Calpurnius]&f Those are the &eFishing Nets&f! Thank you so much!' + - '&a[Delphium Calpurnius]&f I invested a lot of my savings into these! Not sure what I would have done if you hadn''t found them.' +primis_pontis_mille_let_them_know: + customObjectives: + Objective3: + dialog: + - So Fortes sent you? I see. + - Your help would be much appreciated, aid me and my forces will be ready. + Objective1: + dialog: + - So Fortes has decided to take action. + - Help me finish my task, and my forces will be ready. + Objective2: + dialog: + - So Fortes has decided to act. + - If you could assist me with this task, then my forces will be ready. + name: '&2¡Házselo saber!' + questLore: + - I am sorry that we cannot send aid to &dGladius&f right away. + - Ever since that new &cCounselor&f came, our ruler has not been himself. + - If you could reach out to the &aGenerals&f in the city and let them know + - that &dGladius&f needs help we might be able to to do something about it. + - Pero no antes de que nos ocupemos primero de los problemas existentes. + - + - + - Ve a hablar con ellos y luego vuelve para dejarme saber que recibieron el mensaje. + - Te recompensaré por tu tiempo. + questAcceptDialog: + - '&a[Fortes]&f Follow the &9orange path&f from the main room to find &aGeneral Bromia&f.' + - '&a[Fortes]&f At the end of the &9yellow path&f you will find the &aGeneral Rogerius&f.' + - '&a[Fortes]&f At the end of the &9shorter purple&f path you will find the &aGeneral Cylindrus&f.' + - '&7&oI need to talk to the three &a&oGenerals&7&o.' + questCompleteMessage: + - '&a[Fortes]&f You managed to contact them? Excellent!' + - '&a[Fortes]&f Here is your reward. Don''t spend it all in one place.' +primis_pontis_mille_lighthouse_1: + customObjectives: + Objective1: + dialog: + - '&8[Hegio Remus]&f Another letter? Thank you for bringing it to me.' + name: '&2Una entrega rápida' + questLore: + - Antes de ir a alguna parte, ¿podrías entregar esta carta por mí? + - Puedes encontrar al caballero al que debe ir en la parte superior del Faro. + - No te preocupes, el Faro está justo detrás de mí a través de esa puerta. + questAcceptDialog: + - '&8[Fortes]&f Gracias.' + - '&8&oDebería ir a hablar con el Farero de Pontis Mille.' + questCompleteMessage: + - '&8[Hegio Remus]&f Oye, ¿tienes un segundo?' + - '&8&oParece que Hegio Remus necesita que hable con él.' +primis_pontis_mille_lighthouse_2: + customObjectives: + Objective1: + dialog: + - '&a[Jeeves]&f Oh, we meet again. It''s good to see you.' + - You have something for me? Oh, wow...that is quite the shopping list. + - I will have the items sent back to &aHegio&f as soon as possible. + - Thank you for stopping by. Hope we meet again. + - '&7&oI should let &aHegio&7&o know I delivered the note.' + name: '&2Pregunta a Jeeves' + questLore: + - '¿Te importaría tomar el portal y entregarle una nota a mi buen amigo &aJeeves&f?.' + questAcceptDialog: + - '&a[Hegio]&f Amigo muy apreciado.' + - '&7&oDeberia ir a hablar con &aJeeves&f en &dVilla Caeruleaum&7&o.' + questCompleteMessage: + - '&a[Hegio]&f ¿Ya entregaste la nota? ¡Excelente!' + - Toma, puedes tomar un poco de este &eEstofado de conejo&f que guardo en mi bolsillo trasero. +primis_pontis_mille_mines_goblined_up_in_the_maze: + customObjectives: + Objective3: + dialog: + - '&a[Hurt Guard]&f Am so I happy to see you!' + Objective1: + dialog: + - '&a[Injured Guard]&f Thank the skies!' + Objective2: + dialog: + - '&a[Wounded Guard]&f Finally, the rescue is here!' + name: '&2Atrapado en el laberinto' + questLore: + - Si pudiera molestarte por un segundo. + - Dado que ya irás a las &dMinas&f, es + - sería genial si pudieses ayudarnos a resolver algunos problemas. + - Nos faltan tres &aGuardias&f que fueron enviados + - a las minas para cazar un &cDuende Maldito&f. + - Temo que les haya podido pasar algo. + - Se supone que este &cGoblin Maldito&f + - se esconde en una especie de &9Laberinto&f en las &dMinas&f. + - '¿Podrías localizar a los &aGuardias Desaparecidos&f y' + - tráeme pruebas de la muerte del &cGoblin&f?. + questAcceptDialog: + - '&a[Centurion]&fIntenta no perderte en el &9laberinto&f.' + - '¡Que la suerte esté de tu lado guerrero!' + - '&7&oDebería aventurarme a través de las &d&oMinas&7&o y localizar el &9&oLaberinto&7&o.' + questCompleteMessage: + - '&a[Centurion]&f Están vivos, excelente, enviaremos algunos soldados para sacarlos lo antes posible.' + - Veo que trajiste pruebas de la muerte del &cGoblin&f, bien hecho. + - '&7&oEsperemos que la gente se mantenga fuera del &9Laberinto&7&o en el futuro.' +primis_pontis_mille_serious_sewage: + customObjectives: + Objective3: + dialog: + - '&a[Michelangelo]&f Tell that old man everything is in order!' + Objective4: + dialog: + - '&a[Raphael]&f Tell Rogerius I am alive and doing fine!' + Objective1: + dialog: + - '&a[Donatello]&f You can tell the General I am doing just fine!' + Objective2: + dialog: + - '&a[Leonardo]&f The General should not worry, I am ok!' + name: '&2Aguas residuales serias' + questLore: + - Si estás a la altura de la tarea, entonces podría usar tu ayuda. + - + - + - + - + - Tienen un líder, creo que se hace llamar &cShreepper&f o algo así. + - Asegúrate de deshacerte de él, una serpiente sin cabeza no es una amenaza. + - Si pudieras ir allí y reducir el número de criaturas y los alborotadores + - entonces eso me permitiría asignar mis fuerzas a tareas más importantes... + - También habíamos enviado a &a4 Agentes&f ahí abajo, todavía no he escuchado de ellos. + - + - + - También parece que he perdido mis &eLlaves de Alcantarillado&f personales + - si pudieras recuperarlos también, eso sería genial. + questAcceptDialog: + - '&a[Rogerius]&fPuedes llegar a las &dCloacas&f yendo a la fuente y luego un poco al sureste.' + - + - + - '&7&oNecesito encontrar mi camino a las &dCloacas&7&o y completar las tareas.' + questCompleteMessage: + - '&a[Rogerius]&f ¿Has completado todo lo que te he pedido? Si tan solo tuviera 10 hombres más como tú...' +primis_pontis_mille_star_gazing: + customObjectives: + Objective1: + dialog: + - '&a[Virgo Dexippus]&f Yes, what is it?' + name: '&2Observando las estrellas' + questLore: + - Has hecho mucho por esta ciudad y su gente. + - Habiendo asistido a los tres &aGenerales&f y ayudado a las áreas alrededor de &dPontis Mille&f + - ha liberado una gran cantidad de nuestras fuerzas y recursos. + - Podríamos enviar nuestras fuerzas para ayudar a &dGladius&f ahora. + - Pero antes de actuar, hay una última cosa que me gustaría que hicieras. + - Deberías ir a hablar con los &aObservadores de Estrellas&f. + - Se trata de nuestra historia perdida y de los &cElementales&f. + - Los &aObservadores de Estrellas&f podrán contarte más una vez que hables con ellos. + - Toma esta nota sellada y muéstraselos. + questAcceptDialog: + - '&7[Fortes Bellator]&f Puedes encontrar a los &aObservadores de Estrellas&f en el &dObservatorio&f.' + - + - + - '&7&oDebería hablar con los &aObservadores de Estrellas&7&o en el &dObservatorio&7&o.' + questCompleteMessage: + - '&a[Virgo Dexippus]&f ¿Te ha enviado el &aAlcalde&f? Debe ser importante entonces.' + - '&7&oDebería hablar con &aVirgo&7&o.' +primis_pontis_mille_stay_a_while_and_listen: + name: '&2Quédate un rato y escucha' + questLore: + - Pásame la nota. Déjame ver... + - Se nos ha dado permiso para compartir información + - importante contigo acerca de nuestro pasado. + - Debiste haber hecho algo muy importante, + - esta información usualmente solo se comparte con los altos mandos. + - '&aStella&f compartirá contigo lo que hemos descubierto.' + questAcceptDialog: + - '&a[Virgo Dexippus]&f Habla con &aStella&f y &9Haz Clic en la Espada&f para empezar a escuchar.' + - '&7&oDebería hablar con &aStella&7&o y comenzar el &9Desafío de Arena&7&o.' + questCompleteMessage: + - '&a[Virgo Dexippus]&f No compartas esta información con nadie.' + - '&7&oEsa fue toda una historia.' +primis_pontis_mille_the_groves_call: + customObjectives: + Objective1: + dialog: + - '&a[King Nemian]&f &2General Bromia&a sent you?' + - Excellent, I knew we could count on him. + name: '&2¡Las arboledas llaman!' + questLore: + - Es nuestro deber proteger las &dArboledas&f de cualquier amenaza. + - '&aRey Nemian&f de las &dArboledas&f ha enviado una solicitud de ayuda.' + - Criaturas desagradables han llegado a la &dArboleda&f y otros + - invasores se están apoderando de los árboles. + - Si pudieras ir allí y solucionar esos problemas + - entonces mis fuerzas estarán libres para acudir en ayuda de &dGladius&f + questAcceptDialog: + - '&a[Bromia]&f Las &dArboledas&f están ubicadas al Norte de la ciudad.' + - Hay un camino a través de la montaña, debajo de las minas. + - '&7&oDebería hablar con el &aRey Nemian&7&o.' + questCompleteMessage: + - '&a[Rey Neiman]&f ¡Has llegado justo a tiempo!' +primis_pontis_mille_to_lycan_or_not_to_lycan: + name: '&2Licántropo o no licántropo' + questLore: + - No estoy seguro de cómo una sola persona puede lograr lo + - que un batallón entero no puede. + - Pero si el &aGeneral&f te ha enviado, entonces quién soy yo para quejarme. + - Hemos localizado su &dGuarida&f, pero la resistencia es demasiado fuerte. + - Simplemente no había manera de pasar. + - Pero si pudieras pelear tu camino hasta la &dGuarida&f y despejarlo + - entonces las &dSecoyas&f podrían estar a salvo una vez más. Bueno, más seguras al menos... + - Su &dGuarida&f se encuentra debajo de un &9Arbol de Secoya Corrupto&f. + - Debería ser fácil de detectar, se destaca entre los árboles sanos. + questAcceptDialog: + - '&a[Cylindrus]&f Ten cuidado...' + - '&7&oNecesito limpiar la &dGuarida de Hombres Lobo&7&o.' + questCompleteMessage: + - '&a[Magnus]&f ¡¡¡Por el gran hada del árbol, lo has conseguido!!!' + - Siéntete libre de descansar en nuestro campamento, siempre eres bienvenido aquí. +primis_pontis_mille_where_is_he_now: + customObjectives: + Objective1: + dialog: + - '&a[Gorenus Palis]&f My brother sent you looking for me?' + - Oh, I messed up again...I got real lost this time. + - I hope he isn't too mad. + - When you go back, please tell him I'm safe. + name: '&2Amigo hambriento' + questLore: + - Mi &aHermano&f y yo estábamos en camino + - de vuelta aquí desde la aldea. + - Durante nuestros viajes tuve que hacer un pequeño desvío, así que nos separamos. + - Se suponía que nos encontraríamos aquí. + - Pero no hay rastro de él desde hace bastante tiempo. + - Tiene una tendencia a perderse... realmente perderse. + - Estoy bastante preocupado por él. + - Estaría dispuesto a pagar una alta recompensa + - a cualquiera que pueda encontrarlo. + questAcceptDialog: + - '&a[Rodenus Palis]&f Muy amable de tu parte ofrecer tu ayuda.' + - Por favor, si lo encuentras, ven y dime dónde está inmediatamente. + - '&7&oNecesito ir a buscar al hermano de &a&oRodenus&7&o.' + questCompleteMessage: + - '&a[Rodenus Palis]&f ¿¡Qué!? ¿¡Cómo diablos terminó todo el camino hasta ahí!?' + - Suspiro, será mejor que me vaya ahora entonces... + - Gracias por toda tu ayuda. Aquí están las monedas como lo prometí. +primis_pontis_redwoods_big_brown_logs: + customObjectives: + Objective1: + dialog: + - '&a[Magnus]&f Who are you? Oh, you came from &dPontis Mille&f.' + name: '&2Troncos marrones grandes' + questLore: + - Podría dedicar mis fuerzas a ayudar a &dGladius&f, si pudieras ayudarnos + - a lidiar con la crisis de &cHombre-lobo&f en las &dSecoyas&f. + - Nuestras fuerzas han estado reteniendo a los &cHombres-lobo&f durante semanas ahora. + - Sería genial si pudieras ayudarnos. + - Ve a &dSecoyas&f y habla con &aMagnus Castorea&f. + - Ellos te harán saber lo que se debe hacer para poner fin a esta crisis. + questAcceptDialog: + - '&a[Cylindrus]&fSe puede llegar a las &dSecoyas&f dirigiéndote hacia el Norte.' + - Dirígete hacia el Norte hasta llegar a la &dParada de Tren&f, luego dirígete hacia el Oeste. + - '&7&oNecesito ir a las &dSecoyas&7&o y hablar con &aMagnus&7&o.' + questCompleteMessage: + - '&a[Magnus]&f ¿El general te ha enviado a ayudar?' + - Hmm... será mejor que seas bueno. +primis_pontis_redwoods_its_reyn_time: + name: '&2¡Es hora de Reyn!' + questLore: + - Mi &eReloj de Bolsillo&f se había caído al río cuando estaba cortando un árbol. + - Es un reloj especial verás. Lleno de aire y bastante robusto. + - Totalmente resiliente a los troncos pesados ​​que se dejan caer sobre él, sí. + - Vi a uno de esos asquerosos &cBandidos&f recogerlo y metérselo en el bolsillo. + - Estoy seguro de que los vi &9Llevando un Hacha&f. + - + - + - '¡Una buena recompensa para ti también cuando regreses!' + questAcceptDialog: + - '&8[Reynus]&f Puedes encontrar a los &cBandidos&f justo al otro lado del río.' + - '&7&oNecesito ir a matar al &cBandido&7&o correcto y recoger el &eReloj&7&o.' + questCompleteMessage: + - '&a[Reynus]&f ¡Me aseguraré de no volver a perderlo!' + - '¡Tu recompensa, mi buen señor!' +primis_pontis_redwoods_nasty_little_bandits: + name: '&2¡Pequeños bandidos asquerosos!' + questLore: + - Desde que estos malditos &cBandidos&f se asentaron al otro lado del río no ha habido paz. + - '¡Siguen arruinando los árboles, ayer atrapé a uno de ellos' + - tratando de prender fuego a uno de estos árboles gigantes! + - Y no hace mucho me persiguió una persona loca con un hacha, + - Estoy bastante seguro de que fue uno de los &cBandidos&f. + - Sin mencionar que siguen tratando de robar a cualquiera que + - tiene negocios con nosotros, buena gente aquí en el &dAserradero&f. + - Suficiente es suficiente. Estoy dispuesto a pagar una buena moneda para hacer que esta locura termine. + questAcceptDialog: + - '&a[Ligna Crispian]&f Los encontrarás al otro lado del río.' + - '&8&oDebería ir al &dCampamento de Bandidos&f y despejarlo.' + questCompleteMessage: + - '&a[Ligna Crispian]&f ¡Finalmente! Un poco de paz, ¡gracias!' +primis_pontis_redwoods_need_a_smoke: + name: '&2Necesita fumar' + questLore: + - Escuché que ayudaste al viejo bueno de &aReynus&f ahí. + - Bueno como puedes ver, me las arreglé para cortarme las piernas con esa maldita sierra de nuevo. + - Oh, no te preocupes por mí. Mis piernas se curarán de nuevo en poco tiempo. + - Verás, el problema es que no hay mucho que hacer mientras espero que mis piernas se curen. + - Esto me da ganas de comer un buen frailecillo. + - Traje conmigo algo de &eTabaco Premium&f para mi pipa, + - pero tenia que esconderlo por si esos &cBandidos&f le ponían las manos encima. + - '¡El problema es que olvidé por completo donde lo escondí!' + - Todo lo que recuerdo es enterrarlo &9Cerca de un Árbol&f. + - '¿Qué árbol? ¡¿Quién sabe?!' + - Escucha, te tengo un buen trato aquí. Encuentra mi tabaco y podrás tener + - todas mis &eManzanas Doradas&f. + questAcceptDialog: + - '&a[Lyco]&f Espero lo encuentres pronto.' + - '&7&oDebería ir a buscar el &eTabaco&7&o.' + questCompleteMessage: + - '&a[Lyco]&f ¡Lo encontraste! ¡JAJA! ¡Sabía que podía confiar en ti!' +primis_terravilla_bipedal_examination: + name: '&2Bipedal examination' + questLore: + - I have been studying the &cTwo Legged Terrors&f that roam + - around &dTerravilla&f. Did you know that their population + - used to be much larger just some years ago. In fact it was + - the reason why the first settlers decided to build + - '&dTerravilla&f on top of the ruins and not down on the ground.' + - For some reason their numbers have really decreased. I was + - trying to get some &eSamples&f but trying to kill any of them is + - far beyond my skill. But you look like the sort of type who + - can handle a &cTwo Legged Terror&f or two. Interested in + - helping me out? + questAcceptDialog: + - '&a[Plautia Suilius]&f Six &eSamples&f should do it. Return to me once you have collected the &eSamples&f.' + - '&7&oI need to slay 3 &c&oTwo Legged Terrors&7&o and collect their &e&oSamples&7&o.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Great! Let''s have a look.' + - '&7&oI should hear what &a&oPlautia Suilius&7&o has discovered.' +primis_terravilla_drowning_terror: + name: '&2Drowning terror' + questLore: + - My theory was correct. I dissected the growth and found + - an organism inside. After careful examination I have + - determined that the organism is of aquatic origin. And + - not only that, they are capable of hijacking the host's + - brain. Once ready to hatch they make the host go to the + - nearest water source and drown themselves. The organism + - can then freely hatch and swim away. Whatever is + - infecting the &cTwo Legged Terrors&f must be living in + - a nearby river. You should go there and collect a + - '&ePerfect Sample&f of whatever organism is causing this.' + - I do not know if this is something that can affect humans + - but just in case you should kill a few of the organisms + - to make sure. + questAcceptDialog: + - '&a[Plautia Suilius]&f Come back here once you have collected a &ePerfect Sample&f.' + - '&7&oI need to go to the nearby river and collect a &e&oPerfect Sample&7&o of whatever is causing the infections.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Wow it looks like a fish, but it''s internal organs are different.' + - It must infect other creatures by releasing these tiny worm like meat particles... + - Let me have a look at you. Hmm, you seem fine, no traces... + - + - + - + - + - + - '&7&oI should make sure to stay away from the river...' +primis_terravilla_hog_on_my_porch: + name: '&2Bipedal examination' + questLore: + - He is sitting on the darn lift again! + - I cannot believe it! You there! + - You look like you can handle a large beast. + - I will pay you good money if you can get rid + - of that &cAnnoying Large Hog&f that keeps sitting + - on the lift. How are we supposed to get goods + - up and down this way. + questAcceptDialog: + - '&a[Dorippa Sarimarcus]&f Get rid of that hog right down there, see it?' + - '&7&oI need to slay the &c&oAlpha Razorback&7&o.' + questCompleteMessage: + - '&a[Dorippa Sarimarcus]&f Finally! I can move on with my life now! Thank you!' +primis_terravilla_razorbag: + name: '&2Razorbag' + questLore: + - If you are looking for work I got some for ya. + - I design and make heavy duty bags that I sell + - here at my little shop. So I am in need of + - leather. Thankfully there are plenty of + - '&cRazorbacks&f around these parts. If you are' + - interested I would like to hire you to go hunt + - them for their leather. I would need a considerable + - amount of leather. So this won't be a quick job. + questAcceptDialog: + - '&a[Telestis Senna]&f You will mostly find them roaming around here and towards the fields area.' + - '&7&oI need to go hunt the &c&oMature Razorback&7&o.' + questCompleteMessage: + - '&a[Telestis Senna]&f Yep, that will do it. In pristine condition too! Here is your coin, as promised.' +primis_terravilla_terrifying: + name: '&2Terrifying' + questLore: + - Well that is concerning. The sample you brought shows + - that they are slowly being drained of their nutrients. + - My hypothesis is that there is most likely a parasite + - attached to them that is causing this. You should go + - out there again and see if you can find any large + - '&eGrowths&f on their bodies, and then cut them off' + - and bring them back here. + questAcceptDialog: + - '&a[Plautia Suilius]&f I would only need two &eGrowths&f no more than that.' + - '&7&oI need to slay &c&oTwo Legged Terrors&7&o and collect two &e&oGrowths&7&o.' + questCompleteMessage: + - '&a[Plautia Suilius]&f Excellent, these should do it.' + - '&7&oI should hear what &a&oPlautia Suilius&7&o has managed to find.' +test_quest: + name: Mata al Jefe de Prueba + questLore: + - '&cTermina el reinado del jefe de prueba del terror!' +xmas_quest_0: + name: '&2Encuentra los regalos perdidos!' + questLore: + - + - + - Le dejaré abrir uno de ellos a cambio! + questAcceptDialog: + - '&8[&cSanta Claus&8]&f ¡Gracias! ¡Te estaré esperando aquí!' + questCompleteMessage: + - '&8[&cSanta Claus&8]&f Muchas gracias por su ayuda! ¡Todavía hay algunos regalos perdidos, habla conmigo de nuevo si quieres ayudar más!'